556 lines
11 KiB
ArmAsm
556 lines
11 KiB
ArmAsm
#include "asm_helper.h"
|
|
#include "macros.inc"
|
|
.set noat
|
|
.set noreorder
|
|
|
|
.data
|
|
|
|
glabel var8005ef10
|
|
.float 65536
|
|
.float 65536
|
|
|
|
.text
|
|
|
|
glabel mtx4LoadIdentity
|
|
lui $at, 0x3f80
|
|
mtc1 $at, $f0
|
|
sw $zero, 0x4($a0)
|
|
sw $zero, 0x8($a0)
|
|
sw $zero, 0xc($a0)
|
|
sw $zero, 0x10($a0)
|
|
sw $zero, 0x18($a0)
|
|
sw $zero, 0x1c($a0)
|
|
sw $zero, 0x20($a0)
|
|
sw $zero, 0x24($a0)
|
|
sw $zero, 0x2c($a0)
|
|
sw $zero, 0x30($a0)
|
|
sw $zero, 0x34($a0)
|
|
sw $zero, 0x38($a0)
|
|
swc1 $f0, 0x0($a0)
|
|
swc1 $f0, 0x14($a0)
|
|
swc1 $f0, 0x28($a0)
|
|
jr $ra
|
|
swc1 $f0, 0x3c($a0)
|
|
|
|
glabel mtx4MultMtx4InPlace
|
|
add $a2, $a1, $zero
|
|
|
|
glabel mtx4MultMtx4
|
|
mfc1 $t1, $f20
|
|
mfc1 $t2, $f21
|
|
mfc1 $t3, $f22
|
|
mfc1 $t4, $f23
|
|
mfc1 $t5, $f24
|
|
addiu $t0, $zero, 0x4
|
|
lwc1 $f0, 0x0($a1)
|
|
lwc1 $f1, 0x4($a1)
|
|
lwc1 $f2, 0x8($a1)
|
|
lwc1 $f3, 0xc($a1)
|
|
lwc1 $f4, 0x10($a1)
|
|
lwc1 $f5, 0x14($a1)
|
|
lwc1 $f6, 0x18($a1)
|
|
lwc1 $f7, 0x1c($a1)
|
|
lwc1 $f8, 0x20($a1)
|
|
lwc1 $f9, 0x24($a1)
|
|
lwc1 $f10, 0x28($a1)
|
|
lwc1 $f11, 0x2c($a1)
|
|
lwc1 $f12, 0x30($a1)
|
|
lwc1 $f13, 0x34($a1)
|
|
lwc1 $f14, 0x38($a1)
|
|
lwc1 $f15, 0x3c($a1)
|
|
.L00015a58:
|
|
lwc1 $f16, 0x0($a0)
|
|
mul.s $f20, $f16, $f0
|
|
lwc1 $f17, 0x10($a0)
|
|
lwc1 $f18, 0x20($a0)
|
|
mul.s $f21, $f17, $f1
|
|
lwc1 $f19, 0x30($a0)
|
|
mul.s $f22, $f18, $f2
|
|
add.s $f20, $f20, $f21
|
|
mul.s $f21, $f19, $f3
|
|
add.s $f20, $f20, $f22
|
|
mul.s $f22, $f16, $f4
|
|
add.s $f20, $f20, $f21
|
|
mul.s $f21, $f17, $f5
|
|
swc1 $f20, 0x0($a2)
|
|
mul.s $f20, $f18, $f6
|
|
add.s $f22, $f22, $f21
|
|
mul.s $f21, $f19, $f7
|
|
addiu $a2, $a2, 0x4
|
|
mul.s $f23, $f16, $f8
|
|
add.s $f22, $f22, $f20
|
|
mul.s $f20, $f17, $f9
|
|
add.s $f22, $f22, $f21
|
|
mul.s $f21, $f18, $f10
|
|
swc1 $f22, 0xc($a2)
|
|
mul.s $f24, $f19, $f11
|
|
add.s $f23, $f23, $f20
|
|
mul.s $f22, $f16, $f12
|
|
add.s $f23, $f23, $f21
|
|
mul.s $f21, $f17, $f13
|
|
add.s $f23, $f23, $f24
|
|
mul.s $f24, $f18, $f14
|
|
swc1 $f23, 0x1c($a2)
|
|
mul.s $f23, $f19, $f15
|
|
add.s $f22, $f22, $f21
|
|
addiu $t0, $t0, -1
|
|
add.s $f22, $f22, $f24
|
|
addiu $a0, $a0, 0x4
|
|
add.s $f22, $f22, $f23
|
|
bnez $t0, .L00015a58
|
|
swc1 $f22, 0x2c($a2)
|
|
mtc1 $t1, $f20
|
|
mtc1 $t2, $f21
|
|
mtc1 $t3, $f22
|
|
mtc1 $t4, $f23
|
|
jr $ra
|
|
mtc1 $t5, $f24
|
|
|
|
glabel mtx4RotateVecInPlace
|
|
add $a2, $a1, $zero
|
|
|
|
glabel mtx4RotateVec
|
|
lwc1 $f0, 0x0($a1)
|
|
lwc1 $f1, 0x4($a1)
|
|
lwc1 $f2, 0x8($a1)
|
|
addiu $t0, $zero, 0x3
|
|
lwc1 $f3, 0x0($a0)
|
|
.L00015b28:
|
|
lwc1 $f4, 0x10($a0)
|
|
mul.s $f6, $f3, $f0
|
|
lwc1 $f5, 0x20($a0)
|
|
mul.s $f7, $f4, $f1
|
|
addiu $a0, $a0, 0x4
|
|
add.s $f9, $f6, $f7
|
|
mul.s $f8, $f5, $f2
|
|
addiu $a2, $a2, 0x4
|
|
add.s $f16, $f9, $f8
|
|
addiu $t0, $t0, -1
|
|
swc1 $f16, -0x4($a2)
|
|
bnez $t0, .L00015b28
|
|
lwc1 $f3, 0x0($a0)
|
|
jr $ra
|
|
nop
|
|
|
|
glabel mtx4TransformVecInPlace
|
|
add $a2, $a1, $zero
|
|
|
|
glabel mtx4TransformVec
|
|
lwc1 $f0, 0x0($a1)
|
|
lwc1 $f1, 0x4($a1)
|
|
lwc1 $f2, 0x8($a1)
|
|
addiu $t0, $zero, 0x3
|
|
lwc1 $f3, 0x0($a0)
|
|
.L00015b7c:
|
|
lwc1 $f4, 0x10($a0)
|
|
mul.s $f6, $f3, $f0
|
|
lwc1 $f5, 0x20($a0)
|
|
mul.s $f7, $f4, $f1
|
|
addiu $a0, $a0, 0x4
|
|
add.s $f9, $f6, $f7
|
|
mul.s $f8, $f5, $f2
|
|
addiu $a2, $a2, 0x4
|
|
add.s $f16, $f9, $f8
|
|
addiu $t0, $t0, -1
|
|
swc1 $f16, -0x4($a2)
|
|
bnez $t0, .L00015b7c
|
|
lwc1 $f3, 0x0($a0)
|
|
lwc1 $f0, -0xc($a2)
|
|
lwc1 $f1, -0x8($a2)
|
|
lwc1 $f3, 0x24($a0)
|
|
lwc1 $f4, 0x28($a0)
|
|
lwc1 $f5, 0x2c($a0)
|
|
add.s $f0, $f0, $f3
|
|
add.s $f1, $f1, $f4
|
|
add.s $f2, $f16, $f5
|
|
swc1 $f0, -0xc($a2)
|
|
swc1 $f1, -0x8($a2)
|
|
jr $ra
|
|
swc1 $f2, -0x4($a2)
|
|
|
|
glabel mtx00015be0
|
|
add $a2, $a1, $zero
|
|
|
|
glabel mtx00015be4
|
|
mfc1 $t1, $f20
|
|
mfc1 $t2, $f21
|
|
mfc1 $t3, $f22
|
|
mfc1 $t4, $f23
|
|
lwc1 $f0, 0x0($a1)
|
|
lwc1 $f1, 0x4($a1)
|
|
lwc1 $f2, 0x8($a1)
|
|
lwc1 $f3, 0x10($a1)
|
|
lwc1 $f4, 0x14($a1)
|
|
lwc1 $f5, 0x18($a1)
|
|
lwc1 $f6, 0x20($a1)
|
|
lwc1 $f7, 0x24($a1)
|
|
lwc1 $f8, 0x28($a1)
|
|
lwc1 $f9, 0x30($a1)
|
|
lwc1 $f10, 0x34($a1)
|
|
lwc1 $f11, 0x38($a1)
|
|
addiu $t0, $zero, 0x3
|
|
.L00015c28:
|
|
lwc1 $f12, 0x0($a0)
|
|
addiu $a0, $a0, 0x4
|
|
mul.s $f16, $f12, $f0
|
|
lwc1 $f13, 0xc($a0)
|
|
lwc1 $f14, 0x1c($a0)
|
|
mul.s $f17, $f13, $f1
|
|
lwc1 $f15, 0x2c($a0)
|
|
mul.s $f18, $f14, $f2
|
|
add.s $f19, $f16, $f17
|
|
mul.s $f20, $f12, $f3
|
|
add.s $f19, $f19, $f18
|
|
mul.s $f21, $f13, $f4
|
|
swc1 $f19, 0x0($a2)
|
|
mul.s $f22, $f14, $f5
|
|
add.s $f23, $f20, $f21
|
|
mul.s $f16, $f12, $f6
|
|
add.s $f23, $f23, $f22
|
|
mul.s $f17, $f13, $f7
|
|
swc1 $f23, 0x10($a2)
|
|
mul.s $f18, $f14, $f8
|
|
add.s $f19, $f16, $f17
|
|
mul.s $f20, $f12, $f9
|
|
add.s $f19, $f19, $f18
|
|
mul.s $f21, $f13, $f10
|
|
swc1 $f19, 0x20($a2)
|
|
mul.s $f22, $f14, $f11
|
|
add.s $f20, $f20, $f21
|
|
add.s $f22, $f22, $f15
|
|
addiu $t0, $t0, -1
|
|
add.s $f22, $f20, $f22
|
|
addiu $a2, $a2, 0x4
|
|
bnez $t0, .L00015c28
|
|
swc1 $f22, 0x2c($a2)
|
|
lui $at, 0x3f80
|
|
mtc1 $at, $f0
|
|
sw $zero, 0x0($a2)
|
|
sw $zero, 0x10($a2)
|
|
sw $zero, 0x20($a2)
|
|
swc1 $f0, 0x30($a2)
|
|
mtc1 $t1, $f20
|
|
mtc1 $t2, $f21
|
|
mtc1 $t3, $f22
|
|
jr $ra
|
|
mtc1 $t4, $f23
|
|
|
|
glabel mtx3Copy
|
|
addiu $t0, $zero, 0x2
|
|
.L00015cdc:
|
|
lw $t1, 0x0($a0)
|
|
lw $t2, 0x4($a0)
|
|
lw $t3, 0x8($a0)
|
|
lw $t4, 0xc($a0)
|
|
sw $t1, 0x0($a1)
|
|
sw $t2, 0x4($a1)
|
|
sw $t3, 0x8($a1)
|
|
sw $t4, 0xc($a1)
|
|
addiu $t0, $t0, -1
|
|
addiu $a0, $a0, 0x10
|
|
bnez $t0, .L00015cdc
|
|
addiu $a1, $a1, 0x10
|
|
lw $t0, 0x0($a0)
|
|
jr $ra
|
|
sw $t0, 0x0($a1)
|
|
|
|
glabel mtx4Copy
|
|
addiu $t0, $zero, 0x4
|
|
.L00015d1c:
|
|
lw $t1, 0x0($a0)
|
|
lw $t2, 0x4($a0)
|
|
lw $t3, 0x8($a0)
|
|
lw $t4, 0xc($a0)
|
|
sw $t1, 0x0($a1)
|
|
sw $t2, 0x4($a1)
|
|
sw $t3, 0x8($a1)
|
|
sw $t4, 0xc($a1)
|
|
addiu $t0, $t0, -1
|
|
addiu $a0, $a0, 0x10
|
|
bnez $t0, .L00015d1c
|
|
addiu $a1, $a1, 0x10
|
|
jr $ra
|
|
nop
|
|
|
|
glabel mtx3ToMtx4
|
|
addiu $t0, $zero, 0x3
|
|
lui $at, 0x3f80
|
|
mtc1 $at, $f4
|
|
.L00015d60:
|
|
lw $t1, 0x0($a0)
|
|
lw $t2, 0x4($a0)
|
|
lw $t3, 0x8($a0)
|
|
sw $t1, 0x0($a1)
|
|
sw $t2, 0x4($a1)
|
|
sw $t3, 0x8($a1)
|
|
sw $zero, 0xc($a1)
|
|
addiu $t0, $t0, -1
|
|
addiu $a1, $a1, 0x10
|
|
bnez $t0, .L00015d60
|
|
addiu $a0, $a0, 0xc
|
|
sw $zero, 0x0($a1)
|
|
sw $zero, 0x4($a1)
|
|
sw $zero, 0x8($a1)
|
|
jr $ra
|
|
swc1 $f4, 0xc($a1)
|
|
|
|
glabel mtx4ToMtx3
|
|
addiu $t0, $zero, 0x3
|
|
.L00015da4:
|
|
lw $t1, 0x0($a0)
|
|
lw $t2, 0x4($a0)
|
|
lw $t3, 0x8($a0)
|
|
sw $t1, 0x0($a1)
|
|
sw $t2, 0x4($a1)
|
|
sw $t3, 0x8($a1)
|
|
addiu $t0, $t0, -1
|
|
addiu $a0, $a0, 0x10
|
|
bnez $t0, .L00015da4
|
|
addiu $a1, $a1, 0xc
|
|
jr $ra
|
|
nop
|
|
|
|
glabel mtx4SetTranslation
|
|
lw $t0, 0x0($a0)
|
|
lw $t1, 0x4($a0)
|
|
lw $t2, 0x8($a0)
|
|
sw $t0, 0x30($a1)
|
|
sw $t1, 0x34($a1)
|
|
jr $ra
|
|
sw $t2, 0x38($a1)
|
|
|
|
glabel mtx00015df0
|
|
lwc1 $f4, 0x0($a1)
|
|
lwc1 $f6, 0x4($a1)
|
|
mul.s $f8, $f4, $f12
|
|
lwc1 $f10, 0x8($a1)
|
|
mul.s $f4, $f6, $f12
|
|
lwc1 $f6, 0xc($a1)
|
|
mul.s $f10, $f10, $f12
|
|
swc1 $f8, 0x0($a1)
|
|
mul.s $f6, $f6, $f12
|
|
swc1 $f4, 0x4($a1)
|
|
swc1 $f10, 0x8($a1)
|
|
jr $ra
|
|
swc1 $f6, 0xc($a1)
|
|
|
|
glabel mtx00015e24
|
|
lwc1 $f4, 0x0($a1)
|
|
lwc1 $f6, 0x4($a1)
|
|
mul.s $f8, $f4, $f12
|
|
lwc1 $f10, 0x8($a1)
|
|
mul.s $f4, $f6, $f12
|
|
swc1 $f8, 0x0($a1)
|
|
mul.s $f10, $f10, $f12
|
|
swc1 $f4, 0x4($a1)
|
|
jr $ra
|
|
swc1 $f10, 0x8($a1)
|
|
|
|
glabel mtx00015e4c
|
|
lwc1 $f4, 0x10($a1)
|
|
lwc1 $f6, 0x14($a1)
|
|
mul.s $f8, $f4, $f12
|
|
lwc1 $f10, 0x18($a1)
|
|
mul.s $f4, $f6, $f12
|
|
lwc1 $f6, 0x1c($a1)
|
|
mul.s $f10, $f10, $f12
|
|
swc1 $f8, 0x10($a1)
|
|
mul.s $f6, $f6, $f12
|
|
swc1 $f4, 0x14($a1)
|
|
swc1 $f10, 0x18($a1)
|
|
jr $ra
|
|
swc1 $f6, 0x1c($a1)
|
|
|
|
glabel mtx00015e80
|
|
lwc1 $f4, 0x10($a1)
|
|
lwc1 $f6, 0x14($a1)
|
|
mul.s $f8, $f4, $f12
|
|
lwc1 $f10, 0x18($a1)
|
|
mul.s $f4, $f6, $f12
|
|
swc1 $f8, 0x10($a1)
|
|
mul.s $f10, $f10, $f12
|
|
swc1 $f4, 0x14($a1)
|
|
jr $ra
|
|
swc1 $f10, 0x18($a1)
|
|
|
|
glabel mtx00015ea8
|
|
lwc1 $f4, 0x20($a1)
|
|
lwc1 $f6, 0x24($a1)
|
|
mul.s $f8, $f4, $f12
|
|
lwc1 $f10, 0x28($a1)
|
|
mul.s $f4, $f6, $f12
|
|
lwc1 $f6, 0x2c($a1)
|
|
mul.s $f10, $f10, $f12
|
|
swc1 $f8, 0x20($a1)
|
|
mul.s $f6, $f6, $f12
|
|
swc1 $f4, 0x24($a1)
|
|
swc1 $f10, 0x28($a1)
|
|
jr $ra
|
|
swc1 $f6, 0x2c($a1)
|
|
|
|
glabel mtx00015edc
|
|
lwc1 $f4, 0x20($a1)
|
|
lwc1 $f6, 0x24($a1)
|
|
mul.s $f8, $f4, $f12
|
|
lwc1 $f10, 0x28($a1)
|
|
mul.s $f4, $f6, $f12
|
|
swc1 $f8, 0x20($a1)
|
|
mul.s $f10, $f10, $f12
|
|
swc1 $f4, 0x24($a1)
|
|
jr $ra
|
|
swc1 $f10, 0x28($a1)
|
|
|
|
glabel mtx00015f04
|
|
addiu $t0, $zero, 0x3
|
|
.L00015f08:
|
|
lwc1 $f4, 0x0($a1)
|
|
lwc1 $f6, 0x4($a1)
|
|
mul.s $f4, $f4, $f12
|
|
lwc1 $f8, 0x8($a1)
|
|
mul.s $f6, $f6, $f12
|
|
lwc1 $f10, 0xc($a1)
|
|
mul.s $f8, $f8, $f12
|
|
addiu $a1, $a1, 0x10
|
|
mul.s $f10, $f10, $f12
|
|
addiu $t0, $t0, -1
|
|
swc1 $f4, -0x10($a1)
|
|
swc1 $f6, -0xc($a1)
|
|
swc1 $f8, -0x8($a1)
|
|
bnez $t0, .L00015f08
|
|
swc1 $f10, -0x4($a1)
|
|
jr $ra
|
|
nop
|
|
|
|
glabel mtx00015f4c
|
|
addiu $t0, $zero, 0x3
|
|
.L00015f50:
|
|
lwc1 $f4, 0x0($a1)
|
|
lwc1 $f6, 0x4($a1)
|
|
mul.s $f4, $f4, $f12
|
|
lwc1 $f8, 0x8($a1)
|
|
mul.s $f6, $f6, $f12
|
|
addiu $a1, $a1, 0x10
|
|
mul.s $f8, $f8, $f12
|
|
addiu $t0, $t0, -1
|
|
swc1 $f4, -0x10($a1)
|
|
swc1 $f6, -0xc($a1)
|
|
bnez $t0, .L00015f50
|
|
swc1 $f8, -0x8($a1)
|
|
jr $ra
|
|
nop
|
|
|
|
glabel mtx00015f88
|
|
addiu $t0, $zero, 0x3
|
|
.L00015f8c:
|
|
lwc1 $f4, 0x0($a1)
|
|
lwc1 $f6, 0x10($a1)
|
|
mul.s $f4, $f4, $f12
|
|
lwc1 $f8, 0x20($a1)
|
|
mul.s $f6, $f6, $f12
|
|
lwc1 $f10, 0x30($a1)
|
|
mul.s $f8, $f8, $f12
|
|
addiu $a1, $a1, 0x4
|
|
mul.s $f10, $f10, $f12
|
|
addiu $t0, $t0, -1
|
|
swc1 $f4, -0x4($a1)
|
|
swc1 $f6, 0xc($a1)
|
|
swc1 $f8, 0x1c($a1)
|
|
bnez $t0, .L00015f8c
|
|
swc1 $f10, 0x2c($a1)
|
|
jr $ra
|
|
nop
|
|
|
|
/**
|
|
* Wait for the PI to be idle, then read the osRomBase variable, obfuscate its
|
|
* value and return it.
|
|
*
|
|
* The returned value is (osRomBase | 0xb764b4fd) ^ 0x0764bea1.
|
|
*
|
|
* The source of this is definitely ASM:
|
|
* - Minimal use of temporary registers
|
|
* - The load of a1 for osRecvMesg and osSendMesg should be li, not addiu
|
|
* - The load of a2 for osRecvMesg and osSendMesg use lui instead of li
|
|
*/
|
|
glabel mtxGetObfuscatedRomBase
|
|
addiu $sp, $sp, -0x20
|
|
sw $ra, 0x14($sp)
|
|
lui $a0, %hi(__osPiAccessQueue)
|
|
addiu $a0, $a0, %lo(__osPiAccessQueue)
|
|
addiu $a1, $zero, 0
|
|
jal osRecvMesg
|
|
lui $a2, 1
|
|
lui $a0, 0xa45f
|
|
ori $a0, $a0, 0xffff
|
|
addiu $a0, $a0, 0x11
|
|
.L00015ff8:
|
|
lw $t0, 0x0($a0)
|
|
andi $t0, $t0, 3
|
|
bnez $t0, .L00015ff8
|
|
nop
|
|
lui $a1, %hi(osRomBase)
|
|
lw $a1, %lo(osRomBase)($a1)
|
|
lui $a0, 0xb764
|
|
ori $a0, $a0, 0xb4fd
|
|
or $a0, $a0, $a1
|
|
lui $a1, 0x764
|
|
ori $a1, $a1, 0xbea1
|
|
xor $a0, $a0, $a1
|
|
lw $v0, 0x0($a0)
|
|
sw $v0, 0x18($sp)
|
|
lui $a0, %hi(__osPiAccessQueue)
|
|
addiu $a0, $a0, %lo(__osPiAccessQueue)
|
|
addiu $a1, $zero, 0
|
|
jal osSendMesg
|
|
lui $a2, 0
|
|
lw $v0, 0x18($sp)
|
|
lw $ra, 0x14($sp)
|
|
jr $ra
|
|
addiu $sp, $sp, 0x20
|
|
|
|
glabel mtx00016054
|
|
lui $t2, %hi(var8005ef10)
|
|
addiu $t2, $t2, %lo(var8005ef10)
|
|
addiu $t0, $zero, 0x4
|
|
lui $t1, 0xffff
|
|
lwc1 $f0, 0x0($t2)
|
|
lwc1 $f2, 0x4($t2)
|
|
.L0001606c:
|
|
lwc1 $f4, 0x0($a0)
|
|
lwc1 $f6, 0x4($a0)
|
|
mul.s $f4, $f4, $f0
|
|
lwc1 $f8, 0x8($a0)
|
|
mul.s $f6, $f6, $f0
|
|
lwc1 $f10, 0xc($a0)
|
|
trunc.w.s $f4, $f4
|
|
mul.s $f8, $f8, $f0
|
|
mfc1 $t2, $f4
|
|
trunc.w.s $f6, $f6
|
|
mul.s $f10, $f10, $f2
|
|
mfc1 $t3, $f6
|
|
trunc.w.s $f8, $f8
|
|
and $t4, $t2, $t1
|
|
srl $t5, $t3, 0x10
|
|
trunc.w.s $f10, $f10
|
|
or $t4, $t4, $t5
|
|
mfc1 $t5, $f8
|
|
sll $t2, $t2, 0x10
|
|
andi $t3, $t3, 0xffff
|
|
mfc1 $t6, $f10
|
|
or $t2, $t2, $t3
|
|
and $t7, $t5, $t1
|
|
sll $t5, $t5, 0x10
|
|
srl $t8, $t6, 0x10
|
|
andi $t6, $t6, 0xffff
|
|
or $t7, $t7, $t8
|
|
or $t5, $t5, $t6
|
|
addiu $a0, $a0, 0x10
|
|
sw $t4, 0x0($a1)
|
|
sw $t7, 0x4($a1)
|
|
sw $t2, 0x20($a1)
|
|
sw $t5, 0x24($a1)
|
|
addiu $t0, $t0, -1
|
|
bnez $t0, .L0001606c
|
|
addiu $a1, $a1, 0x8
|
|
jr $ra
|
|
nop
|