You've already forked Microtransactions64
mirror of
https://github.com/Print-and-Panic/Microtransactions64.git
synced 2026-01-21 10:17:19 -08:00
674 lines
13 KiB
ArmAsm
Executable File
674 lines
13 KiB
ArmAsm
Executable File
/*------------------------------------------------------------------------------
|
|
* PROPACK Unpack Source Code - Sony PSX, Method 2
|
|
*
|
|
* Copyright (c) 1991-95 Rob Northen Computing, U.K. All Rights Reserved.
|
|
*
|
|
* Conversion from 68000 by Chris Kirby, Iguana Entertainment Limited.
|
|
* Converted to compile with SGI as, 9/13/96 Biscuit
|
|
* Beware the commentless void.........
|
|
*
|
|
* File: rnc2.s
|
|
*
|
|
* Date: 16.03.95
|
|
*------------------------------------------------------------------------------*/
|
|
|
|
#define header_len 18
|
|
#define crc_poly 0xa001
|
|
|
|
#define r0 $0
|
|
#define r4 $4
|
|
#define r5 $5
|
|
|
|
#define input $3
|
|
#define input_hi $4
|
|
#define output $5
|
|
#define output_hi $6
|
|
#define len $8
|
|
#define pos $9
|
|
#define bitbuf $10
|
|
#define xsp $11
|
|
#define temp $12
|
|
#define xd0 $13
|
|
#define xa0 $14
|
|
#define ext $15
|
|
#define xd1 $16
|
|
#define xa1 $17
|
|
#define temp2 $18
|
|
#define postop $19
|
|
#define ra $31
|
|
#define retval $2
|
|
|
|
.text
|
|
.set noreorder
|
|
.option pic0
|
|
|
|
.globl Propack_UnpackM2
|
|
.ent Propack_UnpackM2 2
|
|
Propack_UnpackM2:
|
|
|
|
.frame $sp, 0, $31
|
|
|
|
sub $sp, $sp, 72
|
|
sw $4, 0($sp)
|
|
sw $5, 4($sp)
|
|
sw $6, 8($sp)
|
|
sw $7, 12($sp)
|
|
sw $8, 16($sp)
|
|
sw $9, 20($sp)
|
|
sw $10, 24($sp)
|
|
sw $11, 28($sp)
|
|
sw $12, 32($sp)
|
|
sw $13, 36($sp)
|
|
sw $14, 40($sp)
|
|
sw $15, 44($sp)
|
|
sw $16, 48($sp)
|
|
sw $17, 52($sp)
|
|
sw $18, 56($sp)
|
|
sw $19, 60($sp)
|
|
sw $31, 64($sp)
|
|
la temp, __PPUnpack
|
|
nop
|
|
jalr temp
|
|
nop
|
|
|
|
lw $4, 0($sp)
|
|
lw $5, 4($sp)
|
|
lw $6, 8($sp)
|
|
lw $7, 12($sp)
|
|
lw $8, 16($sp)
|
|
lw $9, 20($sp)
|
|
lw $10, 24($sp)
|
|
lw $11, 28($sp)
|
|
lw $12, 32($sp)
|
|
lw $13, 36($sp)
|
|
lw $14, 40($sp)
|
|
lw $15, 44($sp)
|
|
lw $16, 48($sp)
|
|
lw $17, 52($sp)
|
|
lw $18, 56($sp)
|
|
lw $19, 60($sp)
|
|
lw $31, 64($sp)
|
|
|
|
add $sp, $sp, 72
|
|
jr ra
|
|
|
|
__PPUnpack:
|
|
/* addi r4,r4,9 - what the hell was this for?*/
|
|
move xa0,r4 /* source */
|
|
move xa1,r5 /* dest */
|
|
li xd0,0
|
|
|
|
la xsp,mystack
|
|
#if 0
|
|
lbu temp,0(xa0)
|
|
nop
|
|
seq xa0,temp, "R"
|
|
beq xa0,0, RNC_Error
|
|
|
|
lbu temp,1(xa0)
|
|
nop
|
|
seq xa0,temp, "N"
|
|
beq xa0,0, RNC_Error
|
|
|
|
lbu temp,2(xa0)
|
|
nop
|
|
seq xa0,temp, "C"
|
|
beq xa0,0, RNC_Error
|
|
|
|
lbu temp,3(xa0)
|
|
nop
|
|
seq xa0, temp, 2
|
|
beq xa0, 0, RNC_BadFormat
|
|
#endif
|
|
|
|
|
|
addiu xa0,xa0,4
|
|
lbu xd0,0(xa0)
|
|
lbu temp,1(xa0)
|
|
lbu temp2,2(xa0)
|
|
lbu ext,3(xa0)
|
|
sll xd0,xd0,24
|
|
sll temp,temp,16
|
|
sll temp2,temp2,8
|
|
or xd0,xd0,temp
|
|
or xd0,xd0,temp2
|
|
or xd0,xd0,ext
|
|
|
|
addiu xa0,xa0,4
|
|
|
|
sw xd0,0(xsp)
|
|
move input,xa0
|
|
addi input,input,header_len-8
|
|
|
|
move output,xa1
|
|
move output_hi,output
|
|
addu output_hi,output_hi,xd0
|
|
|
|
lbu xd0,0(xa0)
|
|
lbu temp,1(xa0)
|
|
lbu temp2,2(xa0)
|
|
lbu ext,3(xa0)
|
|
sll xd0,xd0,24
|
|
sll temp,temp,16
|
|
sll temp2,temp2,8
|
|
or xd0,xd0,temp
|
|
or xd0,xd0,temp2
|
|
or xd0,xd0,ext
|
|
|
|
|
|
addu xa0,xa0,4
|
|
|
|
move input_hi,input
|
|
add input_hi,input_hi,xd0
|
|
|
|
sub xsp,xsp,2
|
|
sh r0,0(xsp)
|
|
|
|
|
|
unpack7:
|
|
lui bitbuf,0xffff
|
|
ori bitbuf,0xff00
|
|
|
|
li ext,1
|
|
|
|
lbu bitbuf,0(input)
|
|
addi input,input,1
|
|
addu bitbuf,bitbuf,bitbuf
|
|
addu bitbuf,bitbuf,ext
|
|
addu bitbuf,bitbuf,bitbuf
|
|
srl ext,bitbuf,8
|
|
|
|
j xloop
|
|
andi ext,ext,1
|
|
|
|
RNC_Error:
|
|
li retval, -1 /* Error Bad Header */
|
|
j ra
|
|
nop
|
|
|
|
RNC_BadFormat:
|
|
li retval, -2 /* Error Unknown format */
|
|
j ra
|
|
nop
|
|
|
|
fetch0:
|
|
lbu bitbuf,0(input)
|
|
addi input,input,1
|
|
addu bitbuf,bitbuf,bitbuf
|
|
addu bitbuf,bitbuf,ext
|
|
srl ext,bitbuf,8
|
|
j back0
|
|
andi ext,ext,1
|
|
fetch1:
|
|
lbu bitbuf,0(input)
|
|
addi input,input,1
|
|
addu bitbuf,bitbuf,bitbuf
|
|
addu bitbuf,bitbuf,ext
|
|
srl ext,bitbuf,8
|
|
j back1
|
|
andi ext,ext,1
|
|
fetch2:
|
|
lbu bitbuf,0(input)
|
|
addi input,input,1
|
|
addu bitbuf,bitbuf,bitbuf
|
|
addu bitbuf,bitbuf,ext
|
|
srl ext,bitbuf,8
|
|
j back2
|
|
andi ext,ext,1
|
|
fetch3:
|
|
lbu bitbuf,0(input)
|
|
addi input,input,1
|
|
addu bitbuf,bitbuf,bitbuf
|
|
addu bitbuf,bitbuf,ext
|
|
srl ext,bitbuf,8
|
|
j back3
|
|
andi ext,ext,1
|
|
fetch4:
|
|
lbu bitbuf,0(input)
|
|
addi input,input,1
|
|
addu bitbuf,bitbuf,bitbuf
|
|
addu bitbuf,bitbuf,ext
|
|
srl ext,bitbuf,8
|
|
j back4
|
|
andi ext,ext,1
|
|
fetch5:
|
|
lbu bitbuf,0(input)
|
|
addi input,input,1
|
|
addu bitbuf,bitbuf,bitbuf
|
|
addu bitbuf,bitbuf,ext
|
|
srl ext,bitbuf,8
|
|
j back5
|
|
andi ext,ext,1
|
|
fetch6:
|
|
lbu bitbuf,0(input)
|
|
addi input,input,1
|
|
addu bitbuf,bitbuf,bitbuf
|
|
addu bitbuf,bitbuf,ext
|
|
srl ext,bitbuf,8
|
|
j back6
|
|
andi ext,ext,1
|
|
fetch7:
|
|
lbu bitbuf,0(input)
|
|
addi input,input,1
|
|
addu bitbuf,bitbuf,bitbuf
|
|
addu bitbuf,bitbuf,ext
|
|
srl ext,bitbuf,8
|
|
j back7
|
|
andi ext,ext,1
|
|
|
|
|
|
raw:
|
|
li len,3
|
|
|
|
x4bits:
|
|
addu bitbuf,bitbuf,bitbuf
|
|
srl ext,bitbuf,8
|
|
andi ext,ext,1
|
|
andi bitbuf,bitbuf,0xff
|
|
beq r0,bitbuf,fetch0
|
|
nop
|
|
|
|
|
|
back0:
|
|
addu pos,pos,pos
|
|
addu pos,pos,ext
|
|
srl ext,pos,16
|
|
andi ext,ext,1
|
|
|
|
sub len,len,1
|
|
bgez len,x4bits
|
|
nop
|
|
addi pos,pos,2
|
|
|
|
getrawrep2:
|
|
lbu temp,0(input)
|
|
lbu temp2,1(input)
|
|
sb temp,0(output)
|
|
sb temp2,1(output)
|
|
|
|
lbu temp,2(input)
|
|
lbu temp2,3(input)
|
|
sb temp,2(output)
|
|
sb temp2,3(output)
|
|
|
|
|
|
|
|
addiu input,input,4
|
|
sub pos,pos,1
|
|
|
|
bgez pos,getrawrep2
|
|
addi output,output,4
|
|
|
|
j xloop
|
|
nop
|
|
|
|
getlen:
|
|
addu bitbuf,bitbuf,bitbuf
|
|
srl ext,bitbuf,8
|
|
andi ext,ext,1
|
|
andi bitbuf,bitbuf,0xff
|
|
beq r0,bitbuf,fetch1
|
|
nop
|
|
back1:
|
|
addu len,len,len
|
|
addu len,len,ext
|
|
|
|
addu bitbuf,bitbuf,bitbuf
|
|
|
|
srl ext,bitbuf,8
|
|
andi ext,ext,1
|
|
andi bitbuf,bitbuf,0xff
|
|
beq r0,bitbuf,fetch2
|
|
nop
|
|
|
|
|
|
back2:
|
|
beq r0,ext,copy
|
|
nop
|
|
sub len,len,1
|
|
add bitbuf,bitbuf,bitbuf
|
|
srl ext,bitbuf,8
|
|
andi ext,ext,1
|
|
andi bitbuf,bitbuf,0xff
|
|
beq r0,bitbuf,fetch3
|
|
nop
|
|
|
|
back3:
|
|
addu len,len,len
|
|
addu len,len,ext
|
|
srl ext,len,16
|
|
andi ext,ext,1
|
|
|
|
sub temp,len,9
|
|
beq r0,temp,raw
|
|
nop
|
|
|
|
|
|
copy:
|
|
addu bitbuf,bitbuf,bitbuf
|
|
srl ext,bitbuf,8
|
|
andi ext,ext,1
|
|
andi bitbuf,bitbuf,0xff
|
|
beq r0,bitbuf,fetch4
|
|
nop
|
|
|
|
|
|
back4:
|
|
beq r0,ext,bytedisp2
|
|
nop
|
|
addu bitbuf,bitbuf,bitbuf
|
|
srl ext,bitbuf,8
|
|
andi ext,ext,1
|
|
andi bitbuf,bitbuf,0xff
|
|
beq r0,bitbuf,fetch5
|
|
nop
|
|
|
|
back5:
|
|
addu pos,pos,pos
|
|
addu pos,pos,ext
|
|
|
|
addu bitbuf,bitbuf,bitbuf
|
|
srl ext,bitbuf,8
|
|
andi ext,ext,1
|
|
andi bitbuf,bitbuf,0xff
|
|
beq r0,bitbuf,fetch6
|
|
nop
|
|
|
|
back6:
|
|
bne r0,ext,bigdisp
|
|
nop
|
|
bne r0,pos,bytedisp
|
|
nop
|
|
addi pos,pos,1
|
|
|
|
another:
|
|
addu bitbuf,bitbuf,bitbuf
|
|
srl ext,bitbuf,8
|
|
andi ext,ext,1
|
|
andi bitbuf,bitbuf,0xff
|
|
beq r0,bitbuf,fetch7
|
|
nop
|
|
|
|
back7:
|
|
addu pos,pos,pos
|
|
addu pos,pos,ext
|
|
srl ext,pos,16
|
|
andi ext,ext,1
|
|
|
|
bytedisp:
|
|
sll temp,pos,8
|
|
andi temp,temp,0xff00
|
|
srl pos,pos,8
|
|
or pos,pos,temp
|
|
|
|
|
|
bytedisp2:
|
|
andi postop,pos,0xff00
|
|
|
|
lbu pos,0(input)
|
|
|
|
addiu input,input,1
|
|
or pos,pos,postop
|
|
move xa0,output
|
|
sub xa0,xa0,pos
|
|
sub xa0,xa0,1
|
|
andi ext,len,1
|
|
srl len,len,1
|
|
beq r0,ext,bytedisp3
|
|
nop
|
|
|
|
lbu temp,0(xa0)
|
|
addi xa0,xa0,1
|
|
sb temp,0(output)
|
|
addi output,output,1
|
|
|
|
|
|
bytedisp3:
|
|
sub len,len,1
|
|
bne r0,pos,bytedisp5
|
|
nop
|
|
|
|
andi postop,pos,0xff00
|
|
lbu pos,0(xa0)
|
|
nop
|
|
or pos,pos,postop
|
|
bytedisp4:
|
|
sb pos,0(output)
|
|
sub len,len,1
|
|
sb pos,1(output)
|
|
|
|
bgez len,bytedisp4
|
|
addi output,output,2
|
|
|
|
j xloop
|
|
nop
|
|
bytedisp5:
|
|
lbu temp2,1(xa0)
|
|
lbu temp,0(xa0)
|
|
sb temp2,1(output)
|
|
sb temp,0(output)
|
|
|
|
addi xa0,xa0,2
|
|
|
|
sub len,len,1
|
|
bgez len,bytedisp5
|
|
addi output,output,2
|
|
|
|
j xloop
|
|
nop
|
|
|
|
|
|
getbits:
|
|
lbu bitbuf,0(input)
|
|
addi input,input,1
|
|
addu bitbuf,bitbuf,bitbuf
|
|
addu bitbuf,bitbuf,ext
|
|
srl ext,bitbuf,8
|
|
andi ext,ext,1
|
|
bne r0,ext,string
|
|
nop
|
|
|
|
xbyte:
|
|
lbu temp,0(input)
|
|
addi input,input,1
|
|
sb temp,0(output)
|
|
addi output,output,1
|
|
|
|
|
|
xloop:
|
|
addu bitbuf,bitbuf,bitbuf
|
|
srl ext,bitbuf,8
|
|
andi ext,ext,1
|
|
bne r0,ext,chkz
|
|
nop
|
|
|
|
lbu temp,0(input)
|
|
addi input,input,1
|
|
sb temp,0(output)
|
|
addi output,output,1
|
|
|
|
addu bitbuf,bitbuf,bitbuf
|
|
srl ext,bitbuf,8
|
|
andi ext,ext,1
|
|
beq r0,ext,xbyte
|
|
nop
|
|
chkz:
|
|
andi bitbuf,bitbuf,0xff
|
|
beq r0,bitbuf,getbits
|
|
nop
|
|
|
|
|
|
string:
|
|
li len,2
|
|
li pos,0
|
|
|
|
addu bitbuf,bitbuf,bitbuf
|
|
srl ext,bitbuf,8
|
|
andi ext,ext,1
|
|
andi bitbuf,bitbuf,0xff
|
|
beq r0,bitbuf,fetch8
|
|
nop
|
|
|
|
|
|
back8:
|
|
beq r0,ext,getlen
|
|
nop
|
|
|
|
smalls:
|
|
addu bitbuf,bitbuf,bitbuf
|
|
srl ext,bitbuf,8
|
|
andi ext,ext,1
|
|
|
|
andi bitbuf,bitbuf,0xff
|
|
beq r0,bitbuf,fetch9
|
|
nop
|
|
|
|
back9:
|
|
|
|
beq r0,ext,bytedisp2
|
|
nop
|
|
addi len,len,1
|
|
add bitbuf,bitbuf,bitbuf
|
|
srl ext,bitbuf,8
|
|
andi ext,ext,1
|
|
|
|
andi bitbuf,bitbuf,0xff
|
|
beq r0,bitbuf,fetch10
|
|
nop
|
|
|
|
back10:
|
|
beq r0,ext,copy
|
|
nop
|
|
|
|
lbu len,0(input)
|
|
addi input,input,1
|
|
nop
|
|
beq r0,len,overnout
|
|
addi len,len,8
|
|
j copy
|
|
nop
|
|
|
|
bigdisp:
|
|
addu bitbuf,bitbuf,bitbuf
|
|
srl ext,bitbuf,8
|
|
andi ext,ext,1
|
|
|
|
andi bitbuf,bitbuf,0xff
|
|
beq r0,bitbuf,fetch11
|
|
nop
|
|
|
|
back11:
|
|
addu pos,pos,pos
|
|
addu pos,pos,ext
|
|
srl ext,pos,16
|
|
andi ext,ext,1
|
|
ori pos,pos,4
|
|
|
|
addu bitbuf,bitbuf,bitbuf
|
|
srl ext,bitbuf,8
|
|
andi ext,ext,1
|
|
|
|
andi bitbuf,bitbuf,0xff
|
|
beq r0,bitbuf,fetch12
|
|
nop
|
|
|
|
back12:
|
|
bne r0,ext,bytedisp
|
|
nop
|
|
j another
|
|
nop
|
|
|
|
fetch8:
|
|
lbu bitbuf,0(input)
|
|
addi input,input,1
|
|
addu bitbuf,bitbuf,bitbuf
|
|
addu bitbuf,bitbuf,ext
|
|
srl ext,bitbuf,8
|
|
j back8
|
|
andi ext,ext,1
|
|
fetch9:
|
|
lbu bitbuf,0(input)
|
|
addi input,input,1
|
|
addu bitbuf,bitbuf,bitbuf
|
|
addu bitbuf,bitbuf,ext
|
|
srl ext,bitbuf,8
|
|
j back9
|
|
andi ext,ext,1
|
|
fetch10:
|
|
lbu bitbuf,0(input)
|
|
addi input,input,1
|
|
addu bitbuf,bitbuf,bitbuf
|
|
addu bitbuf,bitbuf,ext
|
|
srl ext,bitbuf,8
|
|
j back10
|
|
andi ext,ext,1
|
|
fetch11:
|
|
lbu bitbuf,0(input)
|
|
addi input,input,1
|
|
addu bitbuf,bitbuf,bitbuf
|
|
addu bitbuf,bitbuf,ext
|
|
srl ext,bitbuf,8
|
|
j back11
|
|
andi ext,ext,1
|
|
fetch12:
|
|
lbu bitbuf,0(input)
|
|
addi input,input,1
|
|
addu bitbuf,bitbuf,bitbuf
|
|
addu bitbuf,bitbuf,ext
|
|
srl ext,bitbuf,8
|
|
j back12
|
|
andi ext,ext,1
|
|
|
|
overnout:
|
|
addu bitbuf,bitbuf,bitbuf
|
|
srl ext,bitbuf,8
|
|
andi ext,ext,1
|
|
andi bitbuf,bitbuf,0xff
|
|
bne r0,bitbuf,check4end
|
|
nop
|
|
|
|
lbu bitbuf,0(input)
|
|
addi input,input,1
|
|
addu bitbuf,bitbuf,bitbuf
|
|
addu bitbuf,bitbuf,ext
|
|
srl ext,bitbuf,8
|
|
andi ext,ext,1
|
|
|
|
check4end:
|
|
bne r0,ext,xloop
|
|
nop
|
|
|
|
lhu xd0,0(xsp)
|
|
addi xsp,xsp,2
|
|
beq r0,xd0,unpack9
|
|
nop
|
|
|
|
unpack8:
|
|
lh xd1,0(xsp)
|
|
addi xsp,xsp,2
|
|
sb xd1,0(output)
|
|
addi output,output,1
|
|
sub xd0,xd0,1
|
|
bne r0,xd0,unpack8
|
|
nop
|
|
|
|
unpack9:
|
|
j unpack11
|
|
nop
|
|
unpack10:
|
|
sw xd1,0(xsp)
|
|
|
|
unpack11:
|
|
li retval,0
|
|
jr ra
|
|
nop
|
|
|
|
.data
|
|
.align 4
|
|
|
|
.word 0,0,0,0,0,0,0,0,0,0,0,0
|
|
mystack:
|
|
.word 0
|
|
|
|
.end
|