Files
ddw3/asm/dw2003/exe/f14.s

90 lines
1.6 KiB
ArmAsm

.include "macros.s"
# `fn f14()`
.section section_f14
.global f14
f14:
addiu $sp, -0x18
sw $s0, 0x10($sp)
la_ $s0, D0x8005af50
sw $ra, 0x14($sp)
# If `D0x8005af50 != 0`, return `0`
lhu $v0, ($s0)
nop
bnez $v0, .Lexit
move_ $v0, $zr
lui $v1, %hi(I_STAT_PTR_ADDR)
lw $v1, %lo(I_STAT_PTR_ADDR)($v1)
lui $v0, %hi(I_MASK_PTR_ADDR)
lw $v0, %lo(I_MASK_PTR_ADDR)($v0)
I_STAT_PTR=$v1
I_MASK_PTR=$v0
# `*I_MASK_PTR = 0`
# `*I_STAT_PTR = *I_MASK_PTR`
lui $a1, 0x3333
sh $zr, (I_MASK_PTR)
lhu $v0, (I_MASK_PTR)
ori $a1, 0x3333
sh $v0, (I_STAT_PTR)
lui $v0, %hi(DPCR_PTR_ADDR)
lw $v0, %lo(DPCR_PTR_ADDR)($v0)
DPCR_PTR=$v0
# `*DPCR_PTR = 0x33333333`
move_ $a0, $s0
sw $a1, (DPCR_PTR)
jal F0x8002f0b8
li $a1, 0x41a
jal F0x8002f12c
addiu $a0, $s0, 0x38
# If `DPCR_PTR != NULL`, call `F0x8002ec88`
# TODO: Why would `DPCR_PTR_ADDR` ever be defined as null?
beqz DPCR_PTR, .0
nop
jal F0x8002ec88
nop
.0:
# SetCustomExitFromException(D0x8005af88)
# `D0x8005af88.sp = D0x8005bf68`
la_ $s0, (D0x8005af88 + 0x4)
addiu $a0, $s0, -0x4
addiu $v0, $s0, 0xfdc
jal SetCustomExitFromException
sw $v0, ($s0)
# `D0x8005af50 = 1`
# `D0x8005bfb8[1] = F0x8002f1ac()`.
# `D0x8005bfb8[5] = F0x8002f2cc()`.
# `CdRemove()`
li $v0, 0x1
jal F0x8002f1ac
sh $v0, -0x3c($s0)
lui $v1, %hi(D0x8005bfd8)
lw $v1, %lo(D0x8005bfd8)($v1)
jal F0x8002f2cc
sw $v0, 0x14($v1)
lui $a0, %hi(D0x8005bfd8)
lw $a0, %lo(D0x8005bfd8)($a0)
jal CdRemove
sw $v0, 0x4($a0)
# TODO: Why are exiting without entering?
jal ExitCriticalSection
addiu $s0, -0x3c
# Return `D0x8005af50`
move_ $v0, $s0
.Lexit:
lw $ra, 0x14($sp)
lw $s0, 0x10($sp)
jr $ra
addiu $sp, 0x18