psxsdk/libmeidogte/compmatrixlv.s

101 lines
2.1 KiB
ArmAsm

.set noreorder
.include "gtereg.h"
.include "inline_s.h"
.set MATRIX_r11r12, 0
.set MATRIX_r13r21, 4
.set MATRIX_r22r23, 8
.set MATRIX_r31r32, 12
.set MATRIX_r33, 16
.set MATRIX_trx, 20
.set MATRIX_try, 24
.set MATRIX_trz, 28
.global CompMatrixLV
.type CompMatrixLV, @function
CompMatrixLV:
# Load matrix v0 to GTE
lw $t0, MATRIX_r11r12($a0)
lw $t1, MATRIX_r13r21($a0)
ctc2 $t0, C2_R11R12
ctc2 $t1, C2_R13R21
lw $t0, MATRIX_r22r23($a0)
lw $t1, MATRIX_r31r32($a0)
lhu $t2, MATRIX_r33($a0)
ctc2 $t0, C2_R22R23
lw $t0, MATRIX_trx($a0)
ctc2 $t1, C2_R31R32
lw $t1, MATRIX_try($a0)
ctc2 $t2, C2_R33
lw $t2, MATRIX_trz($a0)
ctc2 $t0, C2_TRX
ctc2 $t1, C2_TRY
ctc2 $t2, C2_TRZ
lw $t0, MATRIX_trx($a1)
lw $t1, MATRIX_try($a1)
mtc2 $t0, C2_IR1
lw $t0, MATRIX_trz($a1)
mtc2 $t1, C2_IR2
mtc2 $t0, C2_IR3
nMVMVA(1, 0, 3, 0, 0)
swc2 C2_IR1, MATRIX_trx($a2)
swc2 C2_IR2, MATRIX_try($a2)
swc2 C2_IR3, MATRIX_trz($a2)
lhu $t1, 2*(0+(3*1))($a1) # Load values for first
lhu $t0, 2*(0+(3*0))($a1) # R11 R21 R31
sll $t1, 16
or $t0, $t1
lhu $t1, 2*(0+(3*2))($a1)
mtc2 $t0, C2_VXY0
mtc2 $t1, C2_VZ0
lhu $t1, 2*(1+(3*1))($a1) # Load values for second
lhu $t0, 2*(1+(3*0))($a1) # R12 R22 R32
MVMVA(1, 0, 0, 3, 0) # First multiply
sll $t1, 16
or $t0, $t1
lhu $t1, 2*(1+(3*2))($a1)
mtc2 $t0, C2_VXY0
mtc2 $t1, C2_VZ0
mfc2 $t0, C2_IR1 # Store results of first
mfc2 $t1, C2_IR2
sh $t0, 2*(0+(3*0))($a2)
mfc2 $t0, C2_IR3
sh $t1, 2*(0+(3*1))($a2)
sh $t0, 2*(0+(3*2))($a2)
lhu $t1, 2*(2+(3*1))($a1) # Load values for third
lhu $t0, 2*(2+(3*0))($a1) # R13 R23 R33
MVMVA(1, 0, 0, 3, 0) # Second multiply
sll $t1, 16
or $t0, $t1
lhu $t1, 2*(2+(3*2))($a1)
mtc2 $t0, C2_VXY0
mtc2 $t1, C2_VZ0
mfc2 $t0, C2_IR1 # Store results of second
mfc2 $t1, C2_IR2
sh $t0, 2*(1+(3*0))($a2)
mfc2 $t0, C2_IR3
sh $t1, 2*(1+(3*1))($a2)
sh $t0, 2*(1+(3*2))($a2)
MVMVA(1, 0, 0, 3, 0) # Third multiply
mfc2 $t0, C2_IR1 # Store results of third
mfc2 $t1, C2_IR2
sh $t0, 2*(2+(3*0))($a2)
mfc2 $t0, C2_IR3
sh $t1, 2*(2+(3*1))($a2)
sh $t0, 2*(2+(3*2))($a2)
jr $ra
move $v0, $a2