Files
Microtransactions64/asm/rnc2.s
2021-01-25 22:21:15 -05:00

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