pokediamond/asm/FUN_020C9C0C.s
2020-04-19 17:10:58 +03:00

13767 lines
246 KiB
ArmAsm

.include "asm/macros.inc"
.include "global.inc"
.text
arm_func_start OS_WaitIrq
OS_WaitIrq:
stmdb sp!, {r4-r6,lr}
mov r5, r0
mov r4, r1
bl OS_DisableInterrupts
cmp r5, #0x0
beq _020C9C3C
ldr r1, _020C9C80 ; =0x027E0000
mvn r2, r4
add r1, r1, #0x3000
ldr r3, [r1, #0xff8]
and r2, r3, r2
str r2, [r1, #0xff8]
_020C9C3C:
bl OS_RestoreInterrupts
ldr r1, _020C9C80 ; =0x027E0000
add r0, r1, #0x3000
ldr r0, [r0, #0xff8]
ands r0, r4, r0
ldmneia sp!, {r4-r6,lr}
bxne lr
ldr r0, _020C9C84 ; =0x00003FF8
add r6, r1, r0
ldr r5, _020C9C88 ; =0x027E0060
_020C9C64:
mov r0, r5
bl OS_SleepThread
ldr r0, [r6, #0x0]
ands r0, r4, r0
beq _020C9C64
ldmia sp!, {r4-r6,lr}
bx lr
.balign 4
_020C9C80: .word 0x027E0000
_020C9C84: .word 0x00003FF8
_020C9C88: .word 0x027E0060
arm_func_start OSi_IrqTimer3
OSi_IrqTimer3: ; 0x020C9C8C
ldr ip, _020C9C98 ; =OSi_IrqCallback
mov r0, #0x7
bx r12
.balign 4
_020C9C98: .word OSi_IrqCallback
arm_func_start OSi_IrqTimer2
OSi_IrqTimer2: ; 0x020C9C9C
ldr ip, _020C9CA8 ; =OSi_IrqCallback
mov r0, #0x6
bx r12
.balign 4
_020C9CA8: .word OSi_IrqCallback
arm_func_start OSi_IrqTimer1
OSi_IrqTimer1: ; 0x020C9CAC
ldr ip, _020C9CB8 ; =OSi_IrqCallback
mov r0, #0x5
bx r12
.balign 4
_020C9CB8: .word OSi_IrqCallback
arm_func_start OSi_IrqTimer0
OSi_IrqTimer0: ; 0x020C9CBC
ldr ip, _020C9CC8 ; =OSi_IrqCallback
mov r0, #0x4
bx r12
.balign 4
_020C9CC8: .word OSi_IrqCallback
arm_func_start OSi_IrqDma3
OSi_IrqDma3: ; 0x020C9CCC
ldr ip, _020C9CD8 ; =OSi_IrqCallback
mov r0, #0x3
bx r12
.balign 4
_020C9CD8: .word OSi_IrqCallback
arm_func_start OSi_IrqDma2
OSi_IrqDma2: ; 0x020C9CDC
ldr ip, _020C9CE8 ; =OSi_IrqCallback
mov r0, #0x2
bx r12
.balign 4
_020C9CE8: .word OSi_IrqCallback
arm_func_start OSi_IrqDma1
OSi_IrqDma1: ; 0x020C9CEC
ldr ip, _020C9CF8 ; =OSi_IrqCallback
mov r0, #0x1
bx r12
.balign 4
_020C9CF8: .word OSi_IrqCallback
arm_func_start OSi_IrqDma0
OSi_IrqDma0: ; 0x020C9CFC
ldr ip, _020C9D08 ; =OSi_IrqCallback
mov r0, #0x0
bx r12
.balign 4
_020C9D08: .word OSi_IrqCallback
arm_func_start OSi_IrqCallback
OSi_IrqCallback: ; 0x020C9D0C
stmdb sp!, {r4-r5,lr}
sub sp, sp, #0x4
mov r1, #0xc
mul r4, r0, r1
ldr r2, _020C9D94 ; =0x021D341C
ldr r3, _020C9D98 ; =0x02106818
mov r0, r0, lsl #0x1
ldr r1, [r2, r4]
ldrh r3, [r3, r0]
mov r5, #0x1
mov r0, #0x0
str r0, [r2, r4]
cmp r1, #0x0
mov r5, r5, lsl r3
beq _020C9D54
ldr r0, _020C9D9C ; =0x021D3424
ldr r0, [r0, r4]
blx r1
_020C9D54:
ldr r0, _020C9DA0 ; =0x027E0000
ldr r1, _020C9DA4 ; =0x021D3420
add r0, r0, #0x3000
ldr r2, [r0, #0xff8]
orr r2, r2, r5
str r2, [r0, #0xff8]
ldr r0, [r1, r4]
cmp r0, #0x0
addne sp, sp, #0x4
ldmneia sp!, {r4-r5,lr}
bxne lr
mov r0, r5
bl OS_DisableIrqMask
add sp, sp, #0x4
ldmia sp!, {r4-r5,lr}
bx lr
.balign 4
_020C9D94: .word 0x021D341C
_020C9D98: .word 0x02106818
_020C9D9C: .word 0x021D3424
_020C9DA0: .word 0x027E0000
_020C9DA4: .word 0x021D3420
arm_func_start OS_IrqDummy
OS_IrqDummy: ; 0x020C9DA8
bx lr
arm_func_start OS_SetIrqStackChecker
OS_SetIrqStackChecker: ; 0x020C9DAC
ldr ip, _020C9DD0 ; =0x027E0000
ldr r3, _020C9DD4 ; =0xFDDB597D
add r0, r12, #0x3000
ldr r2, _020C9DD8 ; =0x7BF9DD5B
ldr r1, _020C9DDC ; =0x00000400
str r3, [r0, #0xf7c]
add r0, r12, #0x3f80
str r2, [r0, -r1]
bx lr
.balign 4
_020C9DD0: .word 0x027E0000
_020C9DD4: .word 0xFDDB597D
_020C9DD8: .word 0x7BF9DD5B
_020C9DDC: .word 0x00000400
arm_func_start OS_ResetRequestIrqMask
OS_ResetRequestIrqMask: ; 0x020C9DE0
ldr ip, _020C9E0C ; =0x04000208
mov r1, #0x0
ldrh r3, [r12, #0x0]
ldr r2, _020C9E10 ; =0x04000214
strh r1, [r12, #0x0]
ldr r1, [r2, #0x0]
str r0, [r2, #0x0]
ldrh r0, [r12, #0x0]
mov r0, r1
strh r3, [r12, #0x0]
bx lr
.balign 4
_020C9E0C: .word 0x04000208
_020C9E10: .word 0x04000214
arm_func_start OS_DisableIrqMask
OS_DisableIrqMask: ; 0x020C9E14
stmdb sp!, {lr}
sub sp, sp, #0x4
ldr lr, _020C9E54 ; =0x04000208
mov r3, #0x0
ldrh r12, [lr, #0x0]
ldr r2, _020C9E58 ; =0x04000210
mvn r1, r0
strh r3, [lr, #0x0]
ldr r0, [r2, #0x0]
and r1, r0, r1
str r1, [r2, #0x0]
ldrh r1, [lr, #0x0]
strh r12, [lr, #0x0]
add sp, sp, #0x4
ldmia sp!, {lr}
bx lr
.balign 4
_020C9E54: .word 0x04000208
_020C9E58: .word 0x04000210
arm_func_start OS_EnableIrqMask
OS_EnableIrqMask: ; 0x020C9E5C
ldr ip, _020C9E8C ; =0x04000208
mov r1, #0x0
ldrh r3, [r12, #0x0]
ldr r2, _020C9E90 ; =0x04000210
strh r1, [r12, #0x0]
ldr r1, [r2, #0x0]
orr r0, r1, r0
str r0, [r2, #0x0]
ldrh r0, [r12, #0x0]
mov r0, r1
strh r3, [r12, #0x0]
bx lr
.balign 4
_020C9E8C: .word 0x04000208
_020C9E90: .word 0x04000210
arm_func_start OS_SetIrqMask
OS_SetIrqMask: ; 0x020C9E94
ldr ip, _020C9EC0 ; =0x04000208
mov r1, #0x0
ldrh r3, [r12, #0x0]
ldr r2, _020C9EC4 ; =0x04000210
strh r1, [r12, #0x0]
ldr r1, [r2, #0x0]
str r0, [r2, #0x0]
ldrh r0, [r12, #0x0]
mov r0, r1
strh r3, [r12, #0x0]
bx lr
.balign 4
_020C9EC0: .word 0x04000208
_020C9EC4: .word 0x04000210
arm_func_start OSi_EnterTimerCallback
OSi_EnterTimerCallback: ; 0x020C9EC8
stmdb sp!, {r4,lr}
mov r3, #0xc
mul r4, r0, r3
ldr ip, _020C9F08 ; =0x021D344C
add r0, r0, #0x3
mov r3, #0x1
mov r0, r3, lsl r0
ldr r3, _020C9F0C ; =0x021D3454
str r1, [r12, r4]
str r2, [r3, r4]
bl OS_EnableIrqMask
ldr r0, _020C9F10 ; =0x021D3450
mov r1, #0x1
str r1, [r0, r4]
ldmia sp!, {r4,lr}
bx lr
.balign 4
_020C9F08: .word 0x021D344C
_020C9F0C: .word 0x021D3454
_020C9F10: .word 0x021D3450
arm_func_start OSi_EnterDmaCallback
OSi_EnterDmaCallback: ; 0x020C9F14
stmdb sp!, {r4-r6,lr}
mov r3, #0xc
mul r6, r0, r3
ldr ip, _020C9F54 ; =0x021D341C
add r4, r0, #0x8
mov r5, #0x1
mov r0, r5, lsl r4
ldr r3, _020C9F58 ; =0x021D3424
str r1, [r12, r6]
str r2, [r3, r6]
bl OS_EnableIrqMask
and r1, r0, r5, lsl r4
ldr r0, _020C9F5C ; =0x021D3420
str r1, [r0, r6]
ldmia sp!, {r4-r6,lr}
bx lr
.balign 4
_020C9F54: .word 0x021D341C
_020C9F58: .word 0x021D3424
_020C9F5C: .word 0x021D3420
arm_func_start OS_GetIrqFunction
OS_GetIrqFunction: ; 0x020C9F60
ldr r2, _020C9FE4 ; =0x027E0000
mov r3, #0x0
_020C9F68:
ands r1, r0, #0x1
beq _020C9FC8
cmp r3, #0x8
blt _020C9F98
cmp r3, #0xb
bgt _020C9F98
sub r1, r3, #0x8
mov r0, #0xc
mul r2, r1, r0
ldr r0, _020C9FE8 ; =0x021D341C
ldr r0, [r0, r2]
bx lr
_020C9F98:
cmp r3, #0x3
blt _020C9FC0
cmp r3, #0x6
bgt _020C9FC0
add r1, r3, #0x1
mov r0, #0xc
mul r2, r1, r0
ldr r0, _020C9FE8 ; =0x021D341C
ldr r0, [r0, r2]
bx lr
_020C9FC0:
ldr r0, [r2, #0x0]
bx lr
_020C9FC8:
add r3, r3, #0x1
cmp r3, #0x16
mov r0, r0, lsr #0x1
add r2, r2, #0x4
blt _020C9F68
mov r0, #0x0
bx lr
.balign 4
_020C9FE4: .word 0x027E0000
_020C9FE8: .word 0x021D341C
arm_func_start OS_SetIrqFunction
OS_SetIrqFunction: ; 0x020C9FEC
stmdb sp!, {r4-r8,lr}
mov r8, #0x0
ldr lr, _020CA074 ; =0x027E0000
ldr r5, _020CA078 ; =0x021D341C
mov r6, r8
mov r12, r8
mov r3, #0x1
mov r2, #0xc
_020CA00C:
ands r4, r0, #0x1
beq _020CA05C
mov r7, r6
cmp r8, #0x8
blt _020CA030
cmp r8, #0xb
suble r4, r8, #0x8
mlale r7, r4, r2, r5
ble _020CA04C
_020CA030:
cmp r8, #0x3
blt _020CA048
cmp r8, #0x6
addle r4, r8, #0x1
mlale r7, r4, r2, r5
ble _020CA04C
_020CA048:
str r1, [lr, r8, lsl #0x2]
_020CA04C:
cmp r7, #0x0
strne r1, [r7, #0x0]
strne r12, [r7, #0x8]
strne r3, [r7, #0x4]
_020CA05C:
add r8, r8, #0x1
cmp r8, #0x16
mov r0, r0, lsr #0x1
blt _020CA00C
ldmia sp!, {r4-r8,lr}
bx lr
.balign 4
_020CA074: .word 0x027E0000
_020CA078: .word 0x021D341C
arm_func_start OS_InitIrqTable
OS_InitIrqTable: ; 0x020CA07C
ldr r0, _020CA090 ; =0x027E0060
mov r1, #0x0
str r1, [r0, #0x4]
str r1, [r0, #0x0]
bx lr
.balign 4
_020CA090: .word 0x027E0060
arm_func_start OS_UnlockCartridge
OS_UnlockCartridge: ; 0x020CA094
ldr r1, _020CA09C ; =OS_UnlockCartridge2
bx r1
.balign 4
_020CA09C: .word OS_UnlockCartridge2
arm_func_start OS_GetLockID
OS_GetLockID: ; 0x020CA0A0
ldr r3, _020CA0F0 ; =0x027FFFB0
ldr r1, [r3, #0x0]
clz r2, r1
cmp r2, #0x20
movne r0, #0x40
bne _020CA0D4
add r3, r3, #0x4
ldr r1, [r3, #0x0]
clz r2, r1
cmp r2, #0x20
ldr r0, _020CA0F4 ; =0xFFFFFFFD
bxeq lr
mov r0, #0x60
_020CA0D4:
add r0, r0, r2
mov r1, #0x80000000
mov r1, r1, lsr r2
ldr r2, [r3, #0x0]
bic r2, r2, r1
str r2, [r3, #0x0]
bx lr
.balign 4
_020CA0F0: .word 0x027FFFB0
_020CA0F4: .word 0xFFFFFFFD
arm_func_start OS_ReleaseLockID
OS_ReleaseLockID: ; 0x020CA0F8
ldr r3, _020CA124 ; =0x027FFFB0
cmp r0, #0x60
addpl r3, r3, #0x4
subpl r0, r0, #0x60
submi r0, r0, #0x40
mov r1, #0x80000000
mov r1, r1, lsr r0
ldr r2, [r3, #0x0]
orr r2, r2, r1
str r2, [r3, #0x0]
bx lr
.balign 4
_020CA124: .word 0x027FFFB0
arm_func_start OS_ReadOwnerOfLockWord
OS_ReadOwnerOfLockWord: ; 0x020CA128
ldrh r0, [r0, #0x4]
bx lr
arm_func_start OSi_FreeCardBus
OSi_FreeCardBus: ; 0x020CA130
ldr r1, _020CA144 ; =0x04000204
ldrh r0, [r1, #0x0]
orr r0, r0, #0x800
strh r0, [r1, #0x0]
bx lr
.balign 4
_020CA144: .word 0x04000204
arm_func_start OSi_AllocateCardBus
OSi_AllocateCardBus: ; 0x020CA148
ldr r1, _020CA15C ; =0x04000204
ldrh r0, [r1, #0x0]
bic r0, r0, #0x800
strh r0, [r1, #0x0]
bx lr
.balign 4
_020CA15C: .word 0x04000204
arm_func_start OS_UnlockCard
OS_UnlockCard: ; 0x020CA160
ldr ip, _020CA170 ; =OS_UnlockByWord
ldr r1, _020CA174 ; =0x027FFFE0
ldr r2, _020CA178 ; =OSi_FreeCardBus
bx r12
.balign 4
_020CA170: .word OS_UnlockByWord
_020CA174: .word 0x027FFFE0
_020CA178: .word OSi_FreeCardBus
arm_func_start OS_TryLockCard
OS_TryLockCard: ; 0x020CA17C
ldr ip, _020CA18C ; =OS_TryLockByWord
ldr r1, _020CA190 ; =0x027FFFE0
ldr r2, _020CA194 ; =OSi_AllocateCardBus
bx r12
.balign 4
_020CA18C: .word OS_TryLockByWord
_020CA190: .word 0x027FFFE0
_020CA194: .word OSi_AllocateCardBus
arm_func_start OSi_FreeCartridgeBus
OSi_FreeCartridgeBus: ; 0x020CA198
ldr r1, _020CA1AC ; =0x04000204
ldrh r0, [r1, #0x0]
orr r0, r0, #0x80
strh r0, [r1, #0x0]
bx lr
.balign 4
_020CA1AC: .word 0x04000204
arm_func_start OSi_AllocateCartridgeBus
OSi_AllocateCartridgeBus: ; 0x020CA1B0
ldr r1, _020CA1C4 ; =0x04000204
ldrh r0, [r1, #0x0]
bic r0, r0, #0x80
strh r0, [r1, #0x0]
bx lr
.balign 4
_020CA1C4: .word 0x04000204
arm_func_start OS_TryLockCartridge
OS_TryLockCartridge: ; 0x020CA1C8
ldr ip, _020CA1DC ; =OSi_DoTryLockByWord
ldr r1, _020CA1E0 ; =0x027FFFE8
ldr r2, _020CA1E4 ; =OSi_AllocateCartridgeBus
mov r3, #0x1
bx r12
.balign 4
_020CA1DC: .word OSi_DoTryLockByWord
_020CA1E0: .word 0x027FFFE8
_020CA1E4: .word OSi_AllocateCartridgeBus
arm_func_start OS_UnlockCartridge2
OS_UnlockCartridge2: ; 0x020CA1E8
ldr ip, _020CA1FC ; =FUN_020CA2B8
ldr r1, _020CA200 ; =0x027FFFE8
ldr r2, _020CA204 ; =OSi_FreeCartridgeBus
mov r3, #0x1
bx r12
.balign 4
_020CA1FC: .word FUN_020CA2B8
_020CA200: .word 0x027FFFE8
_020CA204: .word OSi_FreeCartridgeBus
arm_func_start OS_LockCartridge
OS_LockCartridge: ; 0x020CA208
ldr ip, _020CA21C ; =FUN_020CA358
ldr r1, _020CA220 ; =0x027FFFE8
ldr r2, _020CA224 ; =OSi_AllocateCartridgeBus
mov r3, #0x1
bx r12
.balign 4
_020CA21C: .word FUN_020CA358
_020CA220: .word 0x027FFFE8
_020CA224: .word OSi_AllocateCartridgeBus
arm_func_start OSi_DoTryLockByWord
OSi_DoTryLockByWord:
stmdb sp!, {r4-r9,lr}
sub sp, sp, #0x4
movs r6, r3
mov r9, r0
mov r8, r1
mov r7, r2
beq _020CA250
bl OS_DisableInterrupts_IrqAndFiq
mov r5, r0
b _020CA258
_020CA250:
bl OS_DisableInterrupts
mov r5, r0
_020CA258:
mov r0, r9
mov r1, r8
bl MI_SwapWord
movs r4, r0
bne _020CA27C
cmp r7, #0x0
beq _020CA278
blx r7
_020CA278:
strh r9, [r8, #0x4]
_020CA27C:
cmp r6, #0x0
beq _020CA290
mov r0, r5
bl OS_RestoreInterrupts_IrqAndFiq
b _020CA298
_020CA290:
mov r0, r5
bl OS_RestoreInterrupts
_020CA298:
mov r0, r4
add sp, sp, #0x4
ldmia sp!, {r4-r9,lr}
bx lr
arm_func_start OS_UnlockByWord
OS_UnlockByWord: ; 0x020CA2A8
ldr ip, _020CA2B4 ; =FUN_020CA2B8
mov r3, #0x0
bx r12
.balign 4
_020CA2B4: .word FUN_020CA2B8
arm_func_start FUN_020CA2B8
FUN_020CA2B8: ; 0x020CA2B8
stmdb sp!, {r4-r7,lr}
sub sp, sp, #0x4
mov r7, r1
ldrh r1, [r7, #0x4]
mov r6, r2
mov r5, r3
cmp r0, r1
addne sp, sp, #0x4
mvnne r0, #0x1
ldmneia sp!, {r4-r7,lr}
bxne lr
cmp r5, #0x0
beq _020CA2F8
bl OS_DisableInterrupts_IrqAndFiq
mov r4, r0
b _020CA300
_020CA2F8:
bl OS_DisableInterrupts
mov r4, r0
_020CA300:
mov r0, #0x0
strh r0, [r7, #0x4]
cmp r6, #0x0
beq _020CA314
blx r6
_020CA314:
mov r0, #0x0
str r0, [r7, #0x0]
cmp r5, #0x0
beq _020CA330
mov r0, r4
bl OS_RestoreInterrupts_IrqAndFiq
b _020CA338
_020CA330:
mov r0, r4
bl OS_RestoreInterrupts
_020CA338:
mov r0, #0x0
add sp, sp, #0x4
ldmia sp!, {r4-r7,lr}
bx lr
arm_func_start OS_TryLockByWord
OS_TryLockByWord: ; 0x020CA348
ldr ip, _020CA354 ; =FUN_020CA358
mov r3, #0x0
bx r12
.balign 4
_020CA354: .word FUN_020CA358
arm_func_start FUN_020CA358
FUN_020CA358: ; 0x020CA358
stmdb sp!, {r4-r8,lr}
mov r8, r0
mov r7, r1
mov r6, r2
mov r5, r3
bl OSi_DoTryLockByWord
cmp r0, #0x0
ldmleia sp!, {r4-r8,lr}
bxle lr
mov r4, #0x400
_020CA380:
mov r0, r4
blx FUN_020005F2
mov r0, r8
mov r1, r7
mov r2, r6
mov r3, r5
bl OSi_DoTryLockByWord
cmp r0, #0x0
bgt _020CA380
ldmia sp!, {r4-r8,lr}
bx lr
arm_func_start OS_InitLock
OS_InitLock: ; 0x020CA3AC
stmdb sp!, {r4-r5,lr}
sub sp, sp, #0x4
ldr r0, _020CA484 ; =0x021D347C
ldr r1, [r0, #0x0]
cmp r1, #0x0
addne sp, sp, #0x4
ldmneia sp!, {r4-r5,lr}
bxne lr
mov r2, #0x1
ldr r1, _020CA488 ; =0x027FFFF0
str r2, [r0, #0x0]
mov r2, #0x0
mov r0, #0x7e
str r2, [r1, #0x0]
bl OS_TryLockByWord
ldr r5, _020CA488 ; =0x027FFFF0
ldrh r0, [r5, #0x6]
cmp r0, #0x0
beq _020CA410
mov r4, #0x400
_020CA3FC:
mov r0, r4
blx FUN_020005F2
ldrh r0, [r5, #0x6]
cmp r0, #0x0
bne _020CA3FC
_020CA410:
ldr r2, _020CA48C ; =0x027FFFB0
mvn r12, #0x0
mov r0, #0x10000
ldr r3, _020CA490 ; =0x027FFFB4
ldr r1, _020CA494 ; =0x027FFFC0
str r12, [r2, #0x0]
rsb r12, r0, #0x0
mov r0, #0x0
mov r2, #0x28
str r12, [r3, #0x0]
bl MIi_CpuClear32
ldr ip, _020CA498 ; =0x04000204
ldr r1, _020CA488 ; =0x027FFFF0
ldrh r3, [r12, #0x0]
mov r0, #0x7e
mov r2, #0x0
orr r3, r3, #0x800
strh r3, [r12, #0x0]
ldrh r3, [r12, #0x0]
orr r3, r3, #0x80
strh r3, [r12, #0x0]
bl OS_UnlockByWord
ldr r1, _020CA488 ; =0x027FFFF0
mov r0, #0x7f
mov r2, #0x0
bl OS_TryLockByWord
add sp, sp, #0x4
ldmia sp!, {r4-r5,lr}
bx lr
.balign 4
_020CA484: .word 0x021D347C
_020CA488: .word 0x027FFFF0
_020CA48C: .word 0x027FFFB0
_020CA490: .word 0x027FFFB4
_020CA494: .word 0x027FFFC0
_020CA498: .word 0x04000204
arm_func_start OS_VSNPrintf
OS_VSNPrintf: ; 0x020CA49C
stmdb sp!, {r4-r11,lr}
sub sp, sp, #0x64
mov r9, r2
str r1, [sp, #0x54]
str r0, [sp, #0x5c]
str r0, [sp, #0x58]
ldrsb r0, [r9, #0x0]
str r1, [sp, #0x0]
mov r11, r3
cmp r0, #0x0
beq _020CAD18
mov r0, #0xa
str r0, [sp, #0xc]
mov r0, #0x0
str r0, [sp, #0x4]
mov r0, #0x20
str r0, [sp, #0x1c]
mov r0, #0x30
str r0, [sp, #0x20]
mvn r0, #0x0
str r0, [sp, #0x8]
mov r0, #0x57
str r0, [sp, #0x10]
mov r0, #0x8
str r0, [sp, #0x14]
mov r0, #0x37
str r0, [sp, #0x18]
mov r0, #0x10
str r0, [sp, #0x24]
mov r0, #0x1
str r0, [sp, #0x28]
mov r0, #0x2b
str r0, [sp, #0x34]
mov r0, #0x2d
str r0, [sp, #0x30]
mov r0, #0x2
str r0, [sp, #0x2c]
_020CA530:
ldrsb r1, [r9, #0x0]
and r0, r1, #0xff
eor r0, r0, #0x20
sub r0, r0, #0xa1
cmp r0, #0x3c
bhs _020CA56C
add r0, sp, #0x54
bl string_put_char
ldrsb r1, [r9, #0x1]!
cmp r1, #0x0
beq _020CAD0C
add r0, sp, #0x54
add r9, r9, #0x1
bl string_put_char
b _020CAD0C
_020CA56C:
cmp r1, #0x25
beq _020CA584
add r0, sp, #0x54
add r9, r9, #0x1
bl string_put_char
b _020CAD0C
_020CA584:
ldr r6, [sp, #0x4]
ldr r5, [sp, #0x8]
ldr r2, [sp, #0xc]
ldr r0, [sp, #0x10]
mov r10, r6
mov r3, r9
_020CA59C:
ldrsb r4, [r9, #0x1]!
cmp r4, #0x20
bgt _020CA5B4
cmp r4, #0x20
beq _020CA5F4
b _020CA60C
_020CA5B4:
cmp r4, #0x30
bgt _020CA60C
cmp r4, #0x2b
blt _020CA60C
cmp r4, #0x2b
beq _020CA5E0
cmp r4, #0x2d
beq _020CA5FC
cmp r4, #0x30
beq _020CA604
b _020CA60C
_020CA5E0:
ldrsb r1, [r9, #-0x1]
cmp r1, #0x20
bne _020CA60C
orr r6, r6, #0x2
b _020CA59C
_020CA5F4:
orr r6, r6, #0x1
b _020CA59C
_020CA5FC:
orr r6, r6, #0x8
b _020CA59C
_020CA604:
orr r6, r6, #0x10
b _020CA59C
_020CA60C:
cmp r4, #0x2a
bne _020CA640
add r11, r11, #0x4
ldr r10, [r11, #-0x4]
add r9, r9, #0x1
cmp r10, #0x0
rsblt r10, r10, #0x0
orrlt r6, r6, #0x8
b _020CA654
_020CA630:
ldrsb r4, [r9], #0x1
mov r1, #0xa
mla r1, r10, r1, r4
sub r10, r1, #0x30
_020CA640:
ldrsb r1, [r9, #0x0]
cmp r1, #0x30
blt _020CA654
cmp r1, #0x39
ble _020CA630
_020CA654:
ldrsb r1, [r9, #0x0]
cmp r1, #0x2e
bne _020CA6AC
ldrsb r1, [r9, #0x1]!
ldr r5, [sp, #0x4]
cmp r1, #0x2a
bne _020CA698
add r11, r11, #0x4
ldr r5, [r11, #-0x4]
add r9, r9, #0x1
cmp r5, #0x0
ldrlt r5, [sp, #0x8]
b _020CA6AC
_020CA688:
ldrsb r4, [r9], #0x1
mov r1, #0xa
mla r1, r5, r1, r4
sub r5, r1, #0x30
_020CA698:
ldrsb r1, [r9, #0x0]
cmp r1, #0x30
blt _020CA6AC
cmp r1, #0x39
ble _020CA688
_020CA6AC:
ldrsb r1, [r9, #0x0]
cmp r1, #0x68
beq _020CA6C4
cmp r1, #0x6c
beq _020CA6DC
b _020CA6F0
_020CA6C4:
ldrsb r1, [r9, #0x1]!
cmp r1, #0x68
orrne r6, r6, #0x40
addeq r9, r9, #0x1
orreq r6, r6, #0x100
b _020CA6F0
_020CA6DC:
ldrsb r1, [r9, #0x1]!
cmp r1, #0x6c
orrne r6, r6, #0x20
addeq r9, r9, #0x1
orreq r6, r6, #0x80
_020CA6F0:
ldrsb r1, [r9, #0x0]
cmp r1, #0x69
bgt _020CA740
cmp r1, #0x63
blt _020CA720
cmp r1, #0x63
beq _020CA7B4
cmp r1, #0x64
beq _020CA96C
cmp r1, #0x69
beq _020CA96C
b _020CA950
_020CA720:
cmp r1, #0x25
bgt _020CA734
cmp r1, #0x25
beq _020CA934
b _020CA950
_020CA734:
cmp r1, #0x58
beq _020CA7A0
b _020CA950
_020CA740:
cmp r1, #0x6e
bgt _020CA754
cmp r1, #0x6e
beq _020CA8DC
b _020CA950
_020CA754:
sub r1, r1, #0x6f
cmp r1, #0x9
addls pc, pc, r1, lsl #0x2
b _020CA950
_020CA764:
b _020CA78C
b _020CA7A8
b _020CA950
b _020CA950
b _020CA828
b _020CA950
b _020CA798
b _020CA950
b _020CA950
b _020CA964
_020CA78C:
ldr r2, [sp, #0x14]
orr r6, r6, #0x1000
b _020CA96C
_020CA798:
orr r6, r6, #0x1000
b _020CA96C
_020CA7A0:
ldr r0, [sp, #0x18]
b _020CA964
_020CA7A8:
orr r6, r6, #0x4
ldr r5, [sp, #0x14]
b _020CA964
_020CA7B4:
cmp r5, #0x0
bge _020CA950
ands r0, r6, #0x8
add r11, r11, #0x4
ldr r4, [r11, #-0x4]
beq _020CA7F0
mov r0, r4, lsl #0x18
mov r1, r0, asr #0x18
add r0, sp, #0x54
bl string_put_char
ldr r1, [sp, #0x1c]
sub r2, r10, #0x1
add r0, sp, #0x54
bl string_fill_char
b _020CA820
_020CA7F0:
ands r0, r6, #0x10
ldrne r0, [sp, #0x20]
sub r2, r10, #0x1
ldreq r0, [sp, #0x1c]
mov r0, r0, lsl #0x18
mov r1, r0, asr #0x18
add r0, sp, #0x54
bl string_fill_char
mov r0, r4, lsl #0x18
mov r1, r0, asr #0x18
add r0, sp, #0x54
bl string_put_char
_020CA820:
add r9, r9, #0x1
b _020CAD0C
_020CA828:
add fp, fp, #0x4
cmp r5, #0x0
ldr r7, [sp, #0x4]
ldr r4, [fp, #-0x4]
bge _020CA860
ldrsb r0, [r4]
cmp r0, #0x0
beq _020CA874
_020CA848:
add r7, r7, #0x1
ldrsb r0, [r4, r7]
cmp r0, #0x0
bne _020CA848
b _020CA874
_020CA85C:
add r7, r7, #0x1
_020CA860:
cmp r7, r5
bge _020CA874
ldrsb r0, [r4, r7]
cmp r0, #0x0
bne _020CA85C
_020CA874:
ands r0, r6, #0x8
sub sl, sl, r7
beq _020CA8A4
mov r1, r4
mov r2, r7
add r0, sp, #0x54
bl string_put_string
ldr r1, [sp, #0x1C]
mov r2, sl
add r0, sp, #0x54
bl string_fill_char
b _020CA8D4
_020CA8A4:
ands r0, r6, #0x10
ldrne r0, [sp, #0x20]
mov r2, sl
ldreq r0, [sp, #0x1C]
mov r0, r0, lsl #0x18
mov r1, r0, asr #0x18
add r0, sp, #0x54
bl string_fill_char
mov r1, r4
mov r2, r7
add r0, sp, #0x54
bl string_put_string
_020CA8D4:
add r9, r9, #0x1
b _020CAD0C
_020CA8DC:
ands r0, r6, #0x100
ldr r1, [sp, #0x58]
ldr r0, [sp, #0x5c]
sub r2, r1, r0
bne _020CA92C
ands r0, r6, #0x40
addne r11, r11, #0x4
ldrne r0, [r11, #-0x4]
strneh r2, [r0, #0x0]
bne _020CA92C
ands r0, r6, #0x80
addeq r11, r11, #0x4
ldreq r0, [r11, #-0x4]
streq r2, [r0, #0x0]
beq _020CA92C
add r11, r11, #0x4
ldr r0, [r11, #-0x4]
mov r1, r2, asr #0x1f
str r2, [r0, #0x0]
str r1, [r0, #0x4]
_020CA92C:
add r9, r9, #0x1
b _020CAD0C
_020CA934:
add r0, r3, #0x1
cmp r0, r9
bne _020CA950
add r0, sp, #0x54
add r9, r9, #0x1
bl string_put_char
b _020CAD0C
_020CA950:
add r0, sp, #0x54
mov r1, r3
sub r2, r9, r3
bl string_put_string
b _020CAD0C
_020CA964:
ldr r2, [sp, #0x24]
orr r6, r6, #0x1000
_020CA96C:
ands r1, r6, #0x8
bicne r6, r6, #0x10
cmp r5, #0x0
bicge r6, r6, #0x10
ldrlt r5, [sp, #0x28]
ldr r7, [sp, #0x4]
ands r1, r6, #0x1000
beq _020CAA20
ands r1, r6, #0x100
addne r11, r11, #0x4
ldrneb r4, [r11, #-0x4]
movne r1, #0x0
bne _020CA9D0
ands r1, r6, #0x40
addne r11, r11, #0x4
ldrneh r4, [r11, #-0x4]
movne r1, #0x0
bne _020CA9D0
ands r1, r6, #0x80
addne r11, r11, #0x8
ldrne r1, [r11, #-0x4]
ldrne r4, [r11, #-0x8]
addeq r11, r11, #0x4
ldreq r4, [r11, #-0x4]
moveq r1, #0x0
_020CA9D0:
bic r6, r6, #0x3
ands r3, r6, #0x4
beq _020CAAD8
cmp r2, #0x10
bne _020CAA0C
mov r3, #0x0
cmp r1, r3
cmpeq r4, r3
beq _020CAAD8
ldr r3, [sp, #0x20]
ldr r7, [sp, #0x2c]
strb r3, [sp, #0x39]
add r3, r0, #0x21
strb r3, [sp, #0x38]
b _020CAAD8
_020CAA0C:
cmp r2, #0x8
ldreq r3, [sp, #0x20]
ldreq r7, [sp, #0x28]
streqb r3, [sp, #0x38]
b _020CAAD8
_020CAA20:
ands r1, r6, #0x100
addne r11, r11, #0x4
ldrnesb r4, [r11, #-0x4]
movne r1, r4, asr #0x1f
bne _020CAA64
ands r1, r6, #0x40
addne r11, r11, #0x4
ldrnesh r4, [r11, #-0x4]
movne r1, r4, asr #0x1f
bne _020CAA64
ands r1, r6, #0x80
addne r11, r11, #0x8
ldrne r4, [r11, #-0x8]
ldrne r1, [r11, #-0x4]
addeq r11, r11, #0x4
ldreq r4, [r11, #-0x4]
moveq r1, r4, asr #0x1f
_020CAA64:
mov r3, #0x0
and r8, r3, #0x0
cmp r8, r3
and r8, r1, #0x80000000
cmpeq r8, r3
beq _020CAAA0
ldr r7, [sp, #0x30]
mvn r4, r4
strb r7, [sp, #0x38]
mvn r7, r1
mov r1, #0x1
adds r4, r4, r1
adc r1, r7, r3
ldr r7, [sp, #0x28]
b _020CAAD8
_020CAAA0:
cmp r1, r3
cmpeq r4, r3
bne _020CAAB4
cmp r5, #0x0
beq _020CAAD8
_020CAAB4:
ands r3, r6, #0x2
ldrne r3, [sp, #0x34]
ldrne r7, [sp, #0x28]
strneb r3, [sp, #0x38]
bne _020CAAD8
ands r3, r6, #0x1
ldrne r3, [sp, #0x1c]
ldrne r7, [sp, #0x28]
strneb r3, [sp, #0x38]
_020CAAD8:
cmp r2, #0x8
ldr r8, [sp, #0x4]
beq _020CAAF8
cmp r2, #0xa
beq _020CAB40
cmp r2, #0x10
beq _020CABDC
b _020CAC28
_020CAAF8:
mov r0, #0x0
cmp r1, r0
cmpeq r4, r0
beq _020CAC28
_020CAB08:
and r0, r4, #0x7
add r3, r0, #0x30
add r0, sp, #0x3a
strb r3, [r0, r8]
mov r4, r4, lsr #0x3
mov r2, #0x0
mov r0, r1, lsr #0x3
orr r4, r4, r1, lsl #0x1d
cmp r0, r2
cmpeq r4, r2
mov r1, r0
add r8, r8, #0x1
bne _020CAB08
b _020CAC28
_020CAB40:
mov r0, #0x0
cmp r0, r0
cmpeq r1, r0
bne _020CAB8C
cmp r4, #0x0
beq _020CAC28
_020CAB58:
ldr r0, _020CAD60 ; =0xCCCCCCCD
umull r1, r0, r4, r0
movs r0, r0, lsr #0x3
mov r1, #0xa
mul r1, r0, r1
sub r1, r4, r1
mov r4, r0
add r1, r1, #0x30
add r0, sp, #0x3a
strb r1, [r0, r8]
add r8, r8, #0x1
bne _020CAB58
b _020CAC28
_020CAB8C:
cmp r1, r0
cmpeq r4, r0
beq _020CAC28
_020CAB98:
ldr r2, [sp, #0xc]
ldr r3, [sp, #0x4]
mov r0, r4
bl _ll_udiv
mov r3, #0xa
umull r3, r12, r0, r3
subs r3, r4, r3
mov r2, #0x0
add r4, r3, #0x30
add r3, sp, #0x3a
strb r4, [r3, r8]
cmp r1, r2
cmpeq r0, r2
mov r4, r0
add r8, r8, #0x1
bne _020CAB98
b _020CAC28
_020CABDC:
mov r2, #0x0
cmp r1, r2
cmpeq r4, r2
beq _020CAC28
_020CABEC:
and r3, r4, #0xf
cmp r3, #0xa
mov r4, r4, lsr #0x4
addlt r3, r3, #0x30
mov r2, r1, lsr #0x4
orr r4, r4, r1, lsl #0x1c
mov r1, r2
addge r3, r3, r0
add r2, sp, #0x3a
strb r3, [r2, r8]
mov r2, #0x0
cmp r1, r2
add r8, r8, #0x1
cmpeq r4, r2
bne _020CABEC
_020CAC28:
cmp r7, #0x0
ble _020CAC4C
ldrsb r0, [sp, #0x38]
cmp r0, #0x30
ldreq r1, [sp, #0x20]
addeq r0, sp, #0x3a
streqb r1, [r0, r8]
ldreq r7, [sp, #0x4]
addeq r8, r8, #0x1
_020CAC4C:
sub r5, r5, r8
ands r0, r6, #0x10
beq _020CAC68
sub r0, r10, r8
sub r0, r0, r7
cmp r5, r0
movlt r5, r0
_020CAC68:
cmp r5, #0x0
subgt r10, r10, r5
add r0, r7, r8
ands r6, r6, #0x8
sub r10, r10, r0
bne _020CAC90
ldr r1, [sp, #0x1c]
add r0, sp, #0x54
mov r2, r10
bl string_fill_char
_020CAC90:
cmp r7, #0x0
ble _020CACB8
add r0, sp, #0x38
add r4, r0, r7
_020CACA0:
ldrsb r1, [r4, #-0x1]!
sub r7, r7, #0x1
add r0, sp, #0x54
bl string_put_char
_020CACB0:
cmp r7, #0x0
bgt _020CACA0
_020CACB8:
ldr r1, [sp, #0x20]
mov r2, r5
add r0, sp, #0x54
bl string_fill_char
_020CACC8:
cmp r8, #0x0
ble _020CACF0
add r0, sp, #0x3A
add r4, r0, r8
_020CACD8:
ldrsb r1, [r4, #-0x1]!
sub r8, r8, #0x1
add r0, sp, #0x54
bl string_put_char
cmp r8, #0x0
bgt _020CACD8
_020CACF0:
cmp r6, #0x0
beq _020CAD08
ldr r1, [sp, #0x1C]
mov r2, sl
add r0, sp, #0x54
bl string_fill_char
_020CAD08:
add r9, r9, #0x1
_020CAD0C:
ldrsb r0, [r9, #0x0]
cmp r0, #0x0
bne _020CA530
_020CAD18:
ldr r0, [sp, #0x54]
cmp r0, #0x0
ldrne r0, [sp, #0x58]
movne r1, #0x0
strneb r1, [r0, #0x0]
bne _020CAD48
ldr r0, [sp, #0x0]
cmp r0, #0x0
ldrne r1, [sp, #0x5c]
movne r2, #0x0
addne r0, r1, r0
strneb r2, [r0, #-0x1]
_020CAD48:
ldr r1, [sp, #0x58]
ldr r0, [sp, #0x5c]
sub r0, r1, r0
add sp, sp, #0x64
ldmia sp!, {r4-r11,lr}
bx lr
.balign 4
_020CAD60: .word 0xCCCCCCCD
arm_func_start OS_SNPrintf
OS_SNPrintf: ; 0x020CAD64
stmdb sp!, {r0-r3}
stmdb sp!, {lr}
sub sp, sp, #0x4
add r3, sp, #0x10
bic r3, r3, #0x3
ldr r2, [sp, #0x10]
add r3, r3, #0x4
bl OS_VSNPrintf
add sp, sp, #0x4
ldmia sp!, {lr}
add sp, sp, #0x10
bx lr
arm_func_start OS_VSPrintf
OS_VSPrintf: ; 0x020CAD94
ldr ip, _020CADA8 ; =OS_VSNPrintf
mov r3, r2
mov r2, r1
mvn r1, #0x80000000
bx r12
.balign 4
_020CADA8: .word OS_VSNPrintf
arm_func_start OS_SPrintf
OS_SPrintf: ; 0x020CADAC
stmdb sp!, {r0-r3}
stmdb sp!, {lr}
sub sp, sp, #0x4
add r2, sp, #0xc
bic r2, r2, #0x3
ldr r1, [sp, #0xc]
add r2, r2, #0x4
bl OS_VSPrintf
add sp, sp, #0x4
ldmia sp!, {lr}
add sp, sp, #0x10
bx lr
arm_func_start string_put_string
string_put_string: ; 0x020CADDC
stmdb sp!, {r4,lr}
cmp r2, #0x0
ldmleia sp!, {r4,lr}
bxle lr
ldr lr, [r0, #0x0]
mov r4, #0x0
cmp lr, r2
movhi lr, r2
cmp lr, #0x0
bls _020CAE1C
_020CAE04:
ldrsb r12, [r1, r4]
ldr r3, [r0, #0x4]
strb r12, [r3, r4]
add r4, r4, #0x1
cmp r4, lr
blo _020CAE04
_020CAE1C:
ldr r1, [r0, #0x0]
sub r1, r1, lr
str r1, [r0, #0x0]
ldr r1, [r0, #0x4]
add r1, r1, r2
str r1, [r0, #0x4]
ldmia sp!, {r4,lr}
bx lr
arm_func_start string_fill_char
string_fill_char:
stmdb sp!, {lr}
sub sp, sp, #0x4
cmp r2, #0x0
addle sp, sp, #0x4
ldmleia sp!, {lr}
bxle lr
ldr r12, [r0, #0x0]
mov lr, #0x0
cmp r12, r2
movhi r12, r2
cmp r12, #0x0
bls _020CAE80
_020CAE6C:
ldr r3, [r0, #0x4]
strb r1, [r3, lr]
add lr, lr, #0x1
cmp lr, r12
blo _020CAE6C
_020CAE80:
ldr r1, [r0, #0x0]
sub r1, r1, r12
str r1, [r0, #0x0]
ldr r1, [r0, #0x4]
add r1, r1, r2
str r1, [r0, #0x4]
add sp, sp, #0x4
ldmia sp!, {lr}
bx lr
arm_func_start string_put_char
string_put_char:
ldr r2, [r0, #0x0]
cmp r2, #0x0
ldrne r2, [r0, #0x4]
strneb r1, [r2, #0x0]
ldrne r1, [r0, #0x0]
subne r1, r1, #0x1
strne r1, [r0, #0x0]
ldr r1, [r0, #0x4]
add r1, r1, #0x1
str r1, [r0, #0x4]
bx lr
arm_func_start FUN_020CAED0
FUN_020CAED0: ; 0x020CAED0
ldr r0, _020CAEDC ; =0x021D3494
ldr r0, [r0, #0x0]
bx lr
.balign 4
_020CAEDC: .word 0x021D3494
arm_func_start OS_SetThreadDestructor
OS_SetThreadDestructor:
str r1, [r0, #0xb4]
bx lr
arm_func_start OS_EnableScheduler
OS_EnableScheduler: ; 0x020CAEE8
stmdb sp!, {r4,lr}
bl OS_DisableInterrupts
ldr r1, _020CAF1C ; =0x021D3484
mov r4, #0x0
ldr r3, [r1, #0x0]
cmp r3, #0x0
subne r2, r3, #0x1
movne r4, r3
strne r2, [r1, #0x0]
bl OS_RestoreInterrupts
mov r0, r4
ldmia sp!, {r4,lr}
bx lr
.balign 4
_020CAF1C: .word 0x021D3484
arm_func_start OS_DisableScheduler
OS_DisableScheduler: ; 0x020CAF20
stmdb sp!, {r4,lr}
bl OS_DisableInterrupts
ldr r2, _020CAF54 ; =0x021D3484
mvn r1, #0x0
ldr r3, [r2, #0x0]
cmp r3, r1
addcc r1, r3, #0x1
movcc r4, r3
strcc r1, [r2, #0x0]
bl OS_RestoreInterrupts
mov r0, r4
ldmia sp!, {r4,lr}
bx lr
.balign 4
_020CAF54: .word 0x021D3484
arm_func_start OSi_IdleThreadProc
OSi_IdleThreadProc: ; 0x020CAF58
stmdb sp!, {lr}
sub sp, sp, #0x4
bl OS_EnableInterrupts
_020CAF64:
bl OS_Halt
b _020CAF64
arm_func_start OS_SetSwitchThreadCallback
OS_SetSwitchThreadCallback: ; 0x020CAF6C
stmdb sp!, {r4-r5,lr}
sub sp, sp, #0x4
mov r5, r0
bl OS_DisableInterrupts
ldr r1, _020CAF9C ; =0x021D3498
ldr r4, [r1, #0xc]
str r5, [r1, #0xc]
bl OS_RestoreInterrupts
mov r0, r4
add sp, sp, #0x4
ldmia sp!, {r4-r5,lr}
bx lr
.balign 4
_020CAF9C: .word 0x021D3498
arm_func_start OSi_SleepAlarmCallback
OSi_SleepAlarmCallback: ; 0x020CAFA0
ldr r2, [r0, #0x0]
mov r1, #0x0
str r1, [r0, #0x0]
ldr ip, _020CAFBC ; =OS_WakeupThreadDirect
mov r0, r2
str r1, [r2, #0xb0]
bx r12
.balign 4
_020CAFBC: .word OS_WakeupThreadDirect
arm_func_start OS_Sleep
OS_Sleep: ; 0x020CAFC0
stmdb sp!, {r4-r5,lr}
sub sp, sp, #0x34
mov r4, r0
add r0, sp, #0x8
bl OS_CreateAlarm
ldr r0, _020CB060 ; =0x021D3490
ldr r0, [r0, #0x0]
ldr r0, [r0, #0x0]
str r0, [sp, #0x4]
bl OS_DisableInterrupts
ldr r1, _020CB064 ; =0x000082EA
mov r2, #0x0
umull r5, r3, r4, r1
mla r3, r4, r2, r3
mla r3, r2, r1, r3
mov r1, r5, lsr #0x6
mov r4, r0
ldr r5, [sp, #0x4]
add r0, sp, #0x8
add r2, sp, #0x4
str r0, [r5, #0xb0]
str r2, [sp, #0x0]
mov r2, r3, lsr #0x6
orr r1, r1, r3, lsl #0x1a
ldr r3, _020CB068 ; =OSi_SleepAlarmCallback
bl OS_SetAlarm
ldr r0, [sp, #0x4]
cmp r0, #0x0
beq _020CB04C
mov r5, #0x0
_020CB038:
mov r0, r5
bl OS_SleepThread
ldr r0, [sp, #0x4]
cmp r0, #0x0
bne _020CB038
_020CB04C:
mov r0, r4
bl OS_RestoreInterrupts
add sp, sp, #0x34
ldmia sp!, {r4-r5,lr}
bx lr
.balign 4
_020CB060: .word 0x021D3490
_020CB064: .word 0x000082EA
_020CB068: .word OSi_SleepAlarmCallback
arm_func_start OS_GetThreadPriority
OS_GetThreadPriority: ; 0x020CB06C
ldr r0, [r0, #0x70]
bx lr
arm_func_start OS_SetThreadPriority
OS_SetThreadPriority: ; 0x020CB074
stmdb sp!, {r4-r8,lr}
ldr r2, _020CB120 ; =0x021D3498
mov r6, r0
mov r5, r1
ldr r8, [r2, #0x8]
mov r7, #0x0
bl OS_DisableInterrupts
mov r4, r0
b _020CB0A0
_020CB098:
mov r7, r8
ldr r8, [r8, #0x68]
_020CB0A0:
cmp r8, #0x0
beq _020CB0B0
cmp r8, r6
bne _020CB098
_020CB0B0:
cmp r8, #0x0
beq _020CB0C4
ldr r0, _020CB124 ; =0x021D34A8
cmp r8, r0
bne _020CB0D8
_020CB0C4:
mov r0, r4
bl OS_RestoreInterrupts
_020CB0CC:
mov r0, #0x0
ldmia sp!, {r4-r8,lr}
bx lr
_020CB0D8:
ldr r0, [r8, #0x70]
cmp r0, r5
beq _020CB10C
cmp r7, #0x0
ldreq r1, [r6, #0x68]
ldreq r0, _020CB120 ; =0x021D3498
streq r1, [r0, #0x8]
ldrne r0, [r6, #0x68]
strne r0, [r7, #0x68]
mov r0, r6
str r5, [r6, #0x70]
bl OSi_InsertThreadToList
bl OSi_RescheduleThread
_020CB10C:
mov r0, r4
bl OS_RestoreInterrupts
mov r0, #0x1
ldmia sp!, {r4-r8,lr}
bx lr
.balign 4
_020CB120: .word 0x021D3498
_020CB124: .word 0x021D34A8
arm_func_start OS_YieldThread
OS_YieldThread: ; 0x020CB128
stmdb sp!, {r4-r8,lr}
ldr r0, _020CB1E0 ; =0x021D3498
mov r7, #0x0
mov r6, r7
mov r5, r7
ldr r8, [r0, #0x4]
bl OS_DisableInterrupts
ldr r1, _020CB1E0 ; =0x021D3498
mov r4, r0
ldr r2, [r1, #0x8]
mov r0, r7
cmp r2, #0x0
beq _020CB188
ldr r1, [r8, #0x70]
_020CB160:
cmp r2, r8
moveq r7, r0
ldr r0, [r2, #0x70]
cmp r1, r0
moveq r6, r2
mov r0, r2
ldr r2, [r2, #0x68]
addeq r5, r5, #0x1
cmp r2, #0x0
bne _020CB160
_020CB188:
cmp r5, #0x1
ble _020CB198
cmp r6, r8
bne _020CB1A8
_020CB198:
mov r0, r4
bl OS_RestoreInterrupts
ldmia sp!, {r4-r8,lr}
bx lr
_020CB1A8:
cmp r7, #0x0
ldreq r1, [r8, #0x68]
ldreq r0, _020CB1E0 ; =0x021D3498
streq r1, [r0, #0x8]
ldrne r0, [r8, #0x68]
strne r0, [r7, #0x68]
ldr r0, [r6, #0x68]
str r0, [r8, #0x68]
str r8, [r6, #0x68]
bl OSi_RescheduleThread
mov r0, r4
bl OS_RestoreInterrupts
ldmia sp!, {r4-r8,lr}
bx lr
.balign 4
_020CB1E0: .word 0x021D3498
arm_func_start OS_RescheduleThread
OS_RescheduleThread: ; 0x020CB1E4
stmdb sp!, {r4,lr}
bl OS_DisableInterrupts
mov r4, r0
bl OSi_RescheduleThread
mov r0, r4
bl OS_RestoreInterrupts
ldmia sp!, {r4,lr}
bx lr
arm_func_start OS_SelectThread
OS_SelectThread: ; 0x020CB204
ldr r0, _020CB22C ; =0x021D3498
ldr r0, [r0, #0x8]
b _020CB214
_020CB210:
ldr r0, [r0, #0x68]
_020CB214:
cmp r0, #0x0
bxeq lr
ldr r1, [r0, #0x64]
cmp r1, #0x1
bne _020CB210
bx lr
.balign 4
_020CB22C: .word 0x021D3498
arm_func_start OS_WakeupThreadDirect
OS_WakeupThreadDirect: ; 0x020CB230
stmdb sp!, {r4-r5,lr}
sub sp, sp, #0x4
mov r5, r0
bl OS_DisableInterrupts
mov r1, #0x1
mov r4, r0
str r1, [r5, #0x64]
bl OSi_RescheduleThread
mov r0, r4
bl OS_RestoreInterrupts
add sp, sp, #0x4
ldmia sp!, {r4-r5,lr}
bx lr
arm_func_start OS_WakeupThread
OS_WakeupThread: ; 0x020CB264
stmdb sp!, {r4-r7,lr}
sub sp, sp, #0x4
mov r5, r0
bl OS_DisableInterrupts
ldr r1, [r5, #0x0]
mov r4, r0
cmp r1, #0x0
beq _020CB2D0
cmp r1, #0x0
beq _020CB2BC
mov r7, #0x1
mov r6, #0x0
_020CB294:
mov r0, r5
bl OSi_RemoveLinkFromQueue
str r7, [r0, #0x64]
str r6, [r0, #0x78]
str r6, [r0, #0x80]
ldr r1, [r0, #0x80]
str r1, [r0, #0x7c]
ldr r0, [r5, #0x0]
cmp r0, #0x0
bne _020CB294
_020CB2BC:
mov r0, #0x0
str r0, [r5, #0x4]
ldr r0, [r5, #0x4]
str r0, [r5, #0x0]
bl OSi_RescheduleThread
_020CB2D0:
mov r0, r4
bl OS_RestoreInterrupts
add sp, sp, #0x4
ldmia sp!, {r4-r7,lr}
bx lr
arm_func_start OS_SleepThread
OS_SleepThread:
stmdb sp!, {r4-r6,lr}
mov r6, r0
bl OS_DisableInterrupts
ldr r1, _020CB334 ; =0x021D3490
mov r5, r0
ldr r0, [r1, #0x0]
cmp r6, #0x0
ldr r4, [r0, #0x0]
beq _020CB318
mov r0, r6
mov r1, r4
str r6, [r4, #0x78]
bl OSi_InsertLinkToQueue
_020CB318:
mov r0, #0x0
str r0, [r4, #0x64]
bl OSi_RescheduleThread
mov r0, r5
bl OS_RestoreInterrupts
ldmia sp!, {r4-r6,lr}
bx lr
.balign 4
_020CB334: .word 0x021D3490
arm_func_start OS_IsThreadTerminated
OS_IsThreadTerminated: ; 0x020CB338
ldr r0, [r0, #0x64]
cmp r0, #0x2
moveq r0, #0x1
movne r0, #0x0
bx lr
arm_func_start OS_JoinThread
OS_JoinThread: ; 0x020CB34C
stmdb sp!, {r4-r5,lr}
sub sp, sp, #0x4
mov r5, r0
bl OS_DisableInterrupts
ldr r1, [r5, #0x64]
mov r4, r0
cmp r1, #0x2
beq _020CB374
add r0, r5, #0x9c
bl OS_SleepThread
_020CB374:
mov r0, r4
bl OS_RestoreInterrupts
add sp, sp, #0x4
ldmia sp!, {r4-r5,lr}
bx lr
arm_func_start OSi_CancelThreadAlarmForSleep
OSi_CancelThreadAlarmForSleep: ; 0x020CB388
stmdb sp!, {lr}
sub sp, sp, #0x4
ldr r0, [r0, #0xb0]
cmp r0, #0x0
addeq sp, sp, #0x4
ldmeqia sp!, {lr}
bxeq lr
bl OS_CancelAlarm
add sp, sp, #0x4
ldmia sp!, {lr}
bx lr
arm_func_start OS_DestroyThread
OS_DestroyThread: ; 0x020CB3B4
stmdb sp!, {r4-r5,lr}
sub sp, sp, #0x4
mov r5, r0
bl OS_DisableInterrupts
ldr r1, _020CB438 ; =0x021D3498
mov r4, r0
ldr r0, [r1, #0x4]
cmp r0, r5
bne _020CB3DC
bl OSi_ExitThread_Destroy
_020CB3DC:
bl OS_DisableScheduler
mov r0, r5
bl OSi_UnlockAllMutex
mov r0, r5
bl OSi_CancelThreadAlarmForSleep
ldr r0, [r5, #0x78]
cmp r0, #0x0
beq _020CB404
mov r1, r5
bl OSi_RemoveSpecifiedLinkFromQueue
_020CB404:
mov r0, r5
bl OSi_RemoveThreadFromList
mov r1, #0x2
add r0, r5, #0x9c
str r1, [r5, #0x64]
bl OS_WakeupThread
bl OS_EnableScheduler
mov r0, r4
bl OS_RestoreInterrupts
bl OS_RescheduleThread
add sp, sp, #0x4
ldmia sp!, {r4-r5,lr}
bx lr
.balign 4
_020CB438: .word 0x021D3498
arm_func_start OSi_ExitThread_Destroy
OSi_ExitThread_Destroy: ; 0x020CB43C
stmdb sp!, {r4,lr}
ldr r0, _020CB498 ; =0x021D3490
ldr r0, [r0, #0x0]
ldr r4, [r0, #0x0]
bl OS_DisableScheduler
mov r0, r4
bl OSi_UnlockAllMutex
ldr r0, [r4, #0x78]
cmp r0, #0x0
beq _020CB46C
mov r1, r4
bl OSi_RemoveSpecifiedLinkFromQueue
_020CB46C:
mov r0, r4
bl OSi_RemoveThreadFromList
mov r1, #0x2
add r0, r4, #0x9c
str r1, [r4, #0x64]
bl OS_WakeupThread
bl OS_EnableScheduler
bl OS_RescheduleThread
bl OS_Terminate
ldmia sp!, {r4,lr}
bx lr
.balign 4
_020CB498: .word 0x021D3490
arm_func_start OSi_ExitThread_Destroy2
OSi_ExitThread_Destroy2: ; 0x020CB49C
stmdb sp!, {lr}
sub sp, sp, #0x4
ldr r1, _020CB4DC ; =0x021D3490
ldr r1, [r1, #0x0]
ldr r3, [r1, #0x0]
ldr r2, [r3, #0xb4]
cmp r2, #0x0
beq _020CB4CC
mov r1, #0x0
str r1, [r3, #0xb4]
blx r2
bl OS_DisableInterrupts
_020CB4CC:
bl OSi_ExitThread_Destroy
add sp, sp, #0x4
ldmia sp!, {lr}
bx lr
.balign 4
_020CB4DC: .word 0x021D3490
arm_func_start OSi_ExitThread_ArgSpecified
OSi_ExitThread_ArgSpecified: ; 0x020CB4E0
stmdb sp!, {r4-r5,lr}
sub sp, sp, #0x4
ldr r2, _020CB548 ; =0x021D3480
mov r5, r0
ldr r2, [r2, #0x0]
mov r4, r1
cmp r2, #0x0
beq _020CB534
ldr r1, _020CB54C ; =OSi_ExitThread_Destroy2
bl OS_InitContext
str r4, [r5, #0x4]
ldr r1, [r5, #0x0]
mov r0, r5
orr r1, r1, #0x80
str r1, [r5, #0x0]
mov r1, #0x1
str r1, [r5, #0x64]
bl OS_LoadContext
add sp, sp, #0x4
ldmia sp!, {r4-r5,lr}
bx lr
_020CB534:
mov r0, r4
bl OSi_ExitThread_Destroy2
add sp, sp, #0x4
ldmia sp!, {r4-r5,lr}
bx lr
.balign 4
_020CB548: .word 0x021D3480
_020CB54C: .word OSi_ExitThread_Destroy2
arm_func_start OS_ExitThread
OS_ExitThread: ; 0x020CB550
stmdb sp!, {lr}
sub sp, sp, #0x4
bl OS_DisableInterrupts
ldr r0, _020CB578 ; =0x021D3498
mov r1, #0x0
ldr r0, [r0, #0x4]
bl OSi_ExitThread_ArgSpecified
add sp, sp, #0x4
ldmia sp!, {lr}
bx lr
.balign 4
_020CB578: .word 0x021D3498
arm_func_start OS_CreateThread
OS_CreateThread: ; 0x020CB57C
stmdb sp!, {r4-r8,lr}
mov r8, r0
mov r5, r1
mov r7, r2
mov r6, r3
bl OS_DisableInterrupts
mov r4, r0
bl OSi_GetUnusedThreadId
ldr r2, [sp, #0x1c]
mov r1, #0x0
str r2, [r8, #0x70]
str r0, [r8, #0x6c]
str r1, [r8, #0x64]
str r1, [r8, #0x74]
mov r0, r8
bl OSi_InsertThreadToList
mov r1, r5
str r6, [r8, #0x94]
ldr r0, [sp, #0x18]
mov r12, #0x0
sub r5, r6, r0
sub r2, r6, #0x4
str r5, [r8, #0x90]
str r12, [r8, #0x98]
ldr r3, _020CB678 ; =0xFDDB597D
ldr r0, [r8, #0x94]
ldr r6, _020CB67C ; =0x7BF9DD5B
str r3, [r0, #-0x4]
ldr r3, [r8, #0x90]
mov r0, r8
str r6, [r3, #0x0]
str r12, [r8, #0xa0]
ldr r3, [r8, #0xa0]
str r3, [r8, #0x9c]
bl OS_InitContext
str r7, [r8, #0x4]
add r1, r5, #0x4
ldr r2, _020CB680 ; =OS_ExitThread
mov r0, #0x0
str r2, [r8, #0x3c]
ldr r2, [sp, #0x18]
sub r2, r2, #0x8
bl MIi_CpuClear32
mov r1, #0x0
str r1, [r8, #0x84]
str r1, [r8, #0x88]
str r1, [r8, #0x8c]
mov r0, r8
bl OS_SetThreadDestructor
_020CB640:
mov r0, #0x0
str r0, [r8, #0x78]
str r0, [r8, #0x80]
ldr r2, [r8, #0x80]
add r1, r8, #0xA4
str r2, [r8, #0x7C]
mov r2, #0xC
bl MIi_CpuClear32
mov r0, r4
mov r1, #0x0
str r1, [r8, #0xB0]
bl OS_RestoreInterrupts
ldmia sp!, {r4-r8, lr}
bx lr
_020CB678: .word 0xFDDB597D
_020CB67C: .word 0x7BF9DD5B
_020CB680: .word OS_ExitThread
arm_func_start OS_InitThread
OS_InitThread: ; 0x020CB684
stmdb sp!, {r4-r6,lr}
sub sp, sp, #0x8
ldr r3, _020CB7A4 ; =0x021D3494
ldr r0, [r3, #0x0]
cmp r0, #0x0
addne sp, sp, #0x8
ldmneia sp!, {r4-r6,lr}
bxne lr
ldr ip, _020CB7A8 ; =0x00000000
ldr r1, _020CB7AC ; =0x021D3568
mov lr, #0x0
ldr r0, _020CB7B0 ; =0x021D3498
mov r6, #0x1
mov r4, #0x10
str r1, [r0, #0x8]
str r1, [r0, #0x4]
cmp r12, #0x0
ldrle r0, _020CB7B4 ; =0x027E0080
str r4, [r1, #0x70]
suble r4, r0, r12
str lr, [r1, #0x6c]
str r6, [r1, #0x64]
str lr, [r1, #0x68]
str lr, [r1, #0x74]
ldrgt r1, _020CB7B8 ; =0x027E0000
ldrgt r0, _020CB7BC ; =0x00000400
addgt r1, r1, #0x3f80
subgt r0, r1, r0
subgt r4, r0, r12
ldr r1, _020CB7B8 ; =0x027E0000
ldr r5, _020CB7C0 ; =0x021D349C
ldr r2, _020CB7C4 ; =0x021D3490
ldr r0, _020CB7BC ; =0x00000400
str r5, [r2, #0x0]
ldr r2, _020CB7AC ; =0x021D3568
add r1, r1, #0x3f80
str r6, [r3, #0x0]
sub r3, r1, r0
mov r0, #0x0
ldr r1, _020CB7C8 ; =0xFDDB597D
str r3, [r2, #0x94]
str r4, [r2, #0x90]
str r0, [r2, #0x98]
str r1, [r3, #-0x4]
ldr r3, [r2, #0x90]
ldr ip, _020CB7CC ; =0x7BF9DD5B
ldr r1, _020CB7B0 ; =0x021D3498
str r12, [r3, #0x0]
ldr r3, _020CB7D0 ; =0x027FFFA0
str r0, [r2, #0xa0]
str r0, [r2, #0x9c]
strh r0, [r1, #0x0]
strh r0, [r1, #0x2]
str r1, [r3, #0x0]
bl OS_SetSwitchThreadCallback
mov r2, #0xc8
str r2, [sp, #0x0]
mov r12, #0x1f
ldr r0, _020CB7D4 ; =0x021D34A8
ldr r1, _020CB7D8 ; =OSi_IdleThreadProc
ldr r3, _020CB7DC ; =0x021D36F0
mov r2, #0x0
str r12, [sp, #0x4]
bl OS_CreateThread
ldr r0, _020CB7D4 ; =0x021D34A8
mov r2, #0x20
mov r1, #0x1
str r2, [r0, #0x70]
str r1, [r0, #0x64]
add sp, sp, #0x8
ldmia sp!, {r4-r6,lr}
bx lr
.balign 4
_020CB7A4: .word 0x021D3494
_020CB7A8: .word 0x00000000
_020CB7AC: .word 0x021D3568
_020CB7B0: .word 0x021D3498
_020CB7B4: .word 0x027E0080
_020CB7B8: .word 0x027E0000
_020CB7BC: .word 0x00000400
_020CB7C0: .word 0x021D349C
_020CB7C4: .word 0x021D3490
_020CB7C8: .word 0xFDDB597D
_020CB7CC: .word 0x7BF9DD5B
_020CB7D0: .word 0x027FFFA0
_020CB7D4: .word 0x021D34A8
_020CB7D8: .word OSi_IdleThreadProc
_020CB7DC: .word 0x021D36F0
arm_func_start OSi_RescheduleThread
OSi_RescheduleThread: ; 0x020CB7E0
stmdb sp!, {r4-r6,lr}
ldr r0, _020CB8BC ; =0x021D3484
ldr r0, [r0, #0x0]
cmp r0, #0x0
ldmneia sp!, {r4-r6,lr}
bxne lr
ldr r4, _020CB8C0 ; =0x021D3498
ldrh r0, [r4, #0x2]
cmp r0, #0x0
bne _020CB814
bl OS_GetProcMode
cmp r0, #0x12
bne _020CB824
_020CB814:
mov r0, #0x1
strh r0, [r4, #0x0]
ldmia sp!, {r4-r6,lr}
bx lr
_020CB824:
ldr r0, _020CB8C4 ; =0x021D3490
ldr r0, [r0, #0x0]
ldr r6, [r0, #0x0]
bl OS_SelectThread
mov r5, r0
cmp r6, r5
ldmeqia sp!, {r4-r6,lr}
bxeq lr
cmp r5, #0x0
ldmeqia sp!, {r4-r6,lr}
bxeq lr
ldr r0, [r6, #0x64]
cmp r0, #0x2
beq _020CB870
mov r0, r6
bl OS_SaveContext
_020CB864:
cmp r0, #0x0
ldmneia sp!, {r4-r6,lr}
bxne lr
_020CB870:
ldr r0, _020CB8C8 ; =0x021D348C
ldr r2, [r0, #0x0]
cmp r2, #0x0
beq _020CB88C
mov r0, r6
mov r1, r5
blx r2
_020CB88C:
ldr r2, [r4, #0xc]
cmp r2, #0x0
beq _020CB8A4
mov r0, r6
mov r1, r5
blx r2
_020CB8A4:
ldr r1, _020CB8C0 ; =0x021D3498
mov r0, r5
str r5, [r1, #0x4]
bl OS_LoadContext
ldmia sp!, {r4-r6,lr}
bx lr
.balign 4
_020CB8BC: .word 0x021D3484
_020CB8C0: .word 0x021D3498
_020CB8C4: .word 0x021D3490
_020CB8C8: .word 0x021D348C
arm_func_start OSi_RemoveThreadFromList
OSi_RemoveThreadFromList: ; 0x020CB8CC
ldr r1, _020CB910 ; =0x021D3498
mov r2, #0x0
ldr r1, [r1, #0x8]
b _020CB8E4
_020CB8DC:
mov r2, r1
ldr r1, [r1, #0x68]
_020CB8E4:
cmp r1, #0x0
beq _020CB8F4
cmp r1, r0
bne _020CB8DC
_020CB8F4:
cmp r2, #0x0
ldreq r1, [r0, #0x68]
ldreq r0, _020CB910 ; =0x021D3498
streq r1, [r0, #0x8]
ldrne r0, [r0, #0x68]
strne r0, [r2, #0x68]
bx lr
.balign 4
_020CB910: .word 0x021D3498
arm_func_start OSi_InsertThreadToList
OSi_InsertThreadToList: ; 0x020CB914
stmdb sp!, {lr}
sub sp, sp, #0x4
ldr r1, _020CB978 ; =0x021D3498
mov r12, #0x0
ldr r3, [r1, #0x8]
mov lr, r3
b _020CB938
_020CB930:
mov r12, lr
ldr lr, [lr, #0x68]
_020CB938:
cmp lr, #0x0
beq _020CB950
ldr r2, [lr, #0x70]
ldr r1, [r0, #0x70]
cmp r2, r1
blo _020CB930
_020CB950:
cmp r12, #0x0
ldreq r1, _020CB978 ; =0x021D3498
streq r3, [r0, #0x68]
streq r0, [r1, #0x8]
ldrne r1, [r12, #0x68]
strne r1, [r0, #0x68]
strne r0, [r12, #0x68]
add sp, sp, #0x4
ldmia sp!, {lr}
bx lr
.balign 4
_020CB978: .word 0x021D3498
arm_func_start OSi_RemoveMutexLinkFromQueue
OSi_RemoveMutexLinkFromQueue: ; 0x020CB97C
ldr r2, [r0, #0x0]
cmp r2, #0x0
beq _020CB9A4
ldr r1, [r2, #0x10]
str r1, [r0, #0x0]
cmp r1, #0x0
movne r0, #0x0
strne r0, [r1, #0x14]
moveq r1, #0x0
streq r1, [r0, #0x4]
_020CB9A4:
mov r0, r2
bx lr
arm_func_start OSi_RemoveSpecifiedLinkFromQueue
OSi_RemoveSpecifiedLinkFromQueue: ; 0x020CB9AC
ldr r2, [r0, #0x0]
mov r12, r2
cmp r2, #0x0
beq _020CB9F8
_020CB9BC:
cmp r12, r1
ldr r3, [r12, #0x80]
bne _020CB9EC
cmp r2, r12
ldr r2, [r12, #0x7c]
streq r3, [r0, #0x0]
strne r3, [r2, #0x80]
ldr r1, [r0, #0x4]
cmp r1, r12
streq r2, [r0, #0x4]
strne r2, [r3, #0x7c]
b _020CB9F8
_020CB9EC:
mov r12, r3
cmp r3, #0x0
bne _020CB9BC
_020CB9F8:
mov r0, r12
bx lr
arm_func_start OSi_RemoveLinkFromQueue
OSi_RemoveLinkFromQueue: ; 0x020CBA00
ldr r2, [r0, #0x0]
cmp r2, #0x0
beq _020CBA2C
ldr r1, [r2, #0x80]
str r1, [r0, #0x0]
cmp r1, #0x0
movne r0, #0x0
strne r0, [r1, #0x7c]
moveq r1, #0x0
streq r1, [r0, #0x4]
streq r1, [r2, #0x78]
_020CBA2C:
mov r0, r2
bx lr
arm_func_start OSi_InsertLinkToQueue
OSi_InsertLinkToQueue:
ldr r12, [r0, #0x0]
b _020CBA48
_020CBA3C:
cmp r12, r1
bxeq lr
ldr r12, [r12, #0x80]
_020CBA48:
cmp r12, #0x0
beq _020CBA60
ldr r3, [r12, #0x70]
ldr r2, [r1, #0x70]
cmp r3, r2
bls _020CBA3C
_020CBA60:
cmp r12, #0x0
bne _020CBA8C
ldr r2, [r0, #0x4]
cmp r2, #0x0
streq r1, [r0, #0x0]
strne r1, [r2, #0x80]
str r2, [r1, #0x7c]
mov r2, #0x0
str r2, [r1, #0x80]
str r1, [r0, #0x4]
bx lr
_020CBA8C:
ldr r2, [r12, #0x7c]
cmp r2, #0x0
streq r1, [r0, #0x0]
strne r1, [r2, #0x80]
str r2, [r1, #0x7c]
str r12, [r1, #0x80]
str r1, [r12, #0x7c]
bx lr
arm_func_start OSi_GetUnusedThreadId
OSi_GetUnusedThreadId: ; 0x020CBAAC
ldr r1, _020CBAC0 ; =0x021D3488
ldr r0, [r1, #0x0]
add r0, r0, #0x1
str r0, [r1, #0x0]
bx lr
.balign 4
_020CBAC0: .word 0x021D3488
arm_func_start OS_InitContext
OS_InitContext: ; 0x020CBAC4
add r1, r1, #0x4
str r1, [r0, #0x40]
str r2, [r0, #0x44]
sub r2, r2, #0x40
tst r2, #0x4
subne r2, r2, #0x4
str r2, [r0, #0x38]
ands r1, r1, #0x1
movne r1, #0x3f
moveq r1, #0x1f
str r1, [r0, #0x0]
mov r1, #0x0
str r1, [r0, #0x4]
str r1, [r0, #0x8]
str r1, [r0, #0xc]
str r1, [r0, #0x10]
str r1, [r0, #0x14]
str r1, [r0, #0x18]
str r1, [r0, #0x1c]
str r1, [r0, #0x20]
str r1, [r0, #0x24]
str r1, [r0, #0x28]
str r1, [r0, #0x2c]
str r1, [r0, #0x30]
str r1, [r0, #0x34]
str r1, [r0, #0x3c]
bx lr
arm_func_start OS_SaveContext
OS_SaveContext:
stmdb sp!, {r0,lr}
add r0, r0, #0x48
ldr r1, _020CBB78 ; =CP_SaveContext
blx r1
ldmia sp!, {r0,lr}
add r1, r0, #0x0
mrs r2, cpsr
str r2, [r1], #0x4
mov r0, #0xd3
msr cpsr_c, r0
str sp, [r1, #0x40]
msr cpsr_c, r2
mov r0, #0x1
stmia r1, {r0-lr}
add r0, pc, #0x8 ; =_020CBB78
str r0, [r1, #0x3c]
mov r0, #0x0
bx lr
.balign 4
_020CBB78: .word CP_SaveContext
arm_func_start OS_LoadContext
OS_LoadContext: ; 0x020CBB7C
stmdb sp!, {r0,lr}
add r0, r0, #0x48
ldr r1, _020CBBBC ; =CP_RestoreContext
blx r1
ldmia sp!, {r0,lr}
mrs r1, cpsr
bic r1, r1, #0x1f
orr r1, r1, #0xd3
msr cpsr_c, r1
ldr r1, [r0], #0x4
msr spsr_fsxc, r1
ldr sp, [r0, #0x40]
ldr lr, [r0, #0x3c]
ldmia r0, {r0-lr}^
mov r0, r0
subs pc, lr, #0x4
.balign 4
_020CBBBC: .word CP_RestoreContext
arm_func_start OS_GetConsoleType
OS_GetConsoleType: ; 0x020CBBC0
ldr r0, _020CBBD0 ; =0x82000001
ldr r1, _020CBBD4 ; =0x02106828
str r0, [r1, #0x0]
bx lr
.balign 4
_020CBBD0: .word 0x82000001
_020CBBD4: .word 0x02106828
arm_func_start OS_IsRunOnEmulator
OS_IsRunOnEmulator:
mov r0, #0x0
bx lr
arm_func_start OS_ReadMessage
OS_ReadMessage: ; 0x020CBBE0
stmdb sp!, {r4-r8,lr}
mov r6, r0
mov r5, r1
mov r7, r2
bl OS_DisableInterrupts
ldr r1, [r6, #0x1c]
mov r4, r0
cmp r1, #0x0
bne _020CBC3C
and r8, r7, #0x1
add r7, r6, #0x8
_020CBC0C:
cmp r8, #0x0
bne _020CBC28
mov r0, r4
bl OS_RestoreInterrupts
_020CBC1C:
mov r0, #0x0
ldmia sp!, {r4-r8,lr}
bx lr
_020CBC28:
mov r0, r7
bl OS_SleepThread
ldr r0, [r6, #0x1c]
cmp r0, #0x0
beq _020CBC0C
_020CBC3C:
cmp r5, #0x0
ldrne r1, [r6, #0x10]
ldrne r0, [r6, #0x18]
ldrne r0, [r1, r0, lsl #0x2]
strne r0, [r5, #0x0]
mov r0, r4
bl OS_RestoreInterrupts
mov r0, #0x1
ldmia sp!, {r4-r8,lr}
bx lr
arm_func_start OS_JamMessage
OS_JamMessage: ; 0x020CBC64
stmdb sp!, {r4-r7,lr}
sub sp, sp, #0x4
mov r6, r0
mov r5, r1
mov r7, r2
bl OS_DisableInterrupts
ldr r1, [r6, #0x14]
ldr r2, [r6, #0x1c]
mov r4, r0
cmp r1, r2
bgt _020CBCCC
and r7, r7, #0x1
_020CBC94:
cmp r7, #0x0
bne _020CBCB4
mov r0, r4
bl OS_RestoreInterrupts
add sp, sp, #0x4
mov r0, #0x0
ldmia sp!, {r4-r7,lr}
bx lr
_020CBCB4:
mov r0, r6
bl OS_SleepThread
ldr r1, [r6, #0x14]
ldr r0, [r6, #0x1c]
cmp r1, r0
ble _020CBC94
_020CBCCC:
ldr r0, [r6, #0x18]
add r0, r0, r1
sub r0, r0, #0x1
bl _s32_div_f
str r1, [r6, #0x18]
ldr r2, [r6, #0x10]
ldr r1, [r6, #0x18]
add r0, r6, #0x8
str r5, [r2, r1, lsl #0x2]
ldr r1, [r6, #0x1c]
add r1, r1, #0x1
str r1, [r6, #0x1c]
bl OS_WakeupThread
mov r0, r4
bl OS_RestoreInterrupts
mov r0, #0x1
add sp, sp, #0x4
ldmia sp!, {r4-r7,lr}
bx lr
arm_func_start OS_ReceiveMessage
OS_ReceiveMessage: ; 0x020CBD18
stmdb sp!, {r4-r8,lr}
mov r6, r0
mov r5, r1
mov r7, r2
bl OS_DisableInterrupts
ldr r1, [r6, #0x1c]
mov r4, r0
cmp r1, #0x0
bne _020CBD74
and r8, r7, #0x1
add r7, r6, #0x8
_020CBD44:
cmp r8, #0x0
bne _020CBD60
mov r0, r4
bl OS_RestoreInterrupts
_020CBD54:
mov r0, #0x0
ldmia sp!, {r4-r8,lr}
bx lr
_020CBD60:
mov r0, r7
bl OS_SleepThread
ldr r0, [r6, #0x1c]
cmp r0, #0x0
beq _020CBD44
_020CBD74:
cmp r5, #0x0
ldrne r1, [r6, #0x10]
ldrne r0, [r6, #0x18]
ldrne r0, [r1, r0, lsl #0x2]
strne r0, [r5, #0x0]
ldr r0, [r6, #0x18]
ldr r1, [r6, #0x14]
add r0, r0, #0x1
bl _s32_div_f
str r1, [r6, #0x18]
ldr r1, [r6, #0x1c]
mov r0, r6
sub r1, r1, #0x1
str r1, [r6, #0x1c]
bl OS_WakeupThread
mov r0, r4
bl OS_RestoreInterrupts
mov r0, #0x1
ldmia sp!, {r4-r8,lr}
bx lr
arm_func_start OS_SendMessage
OS_SendMessage: ; 0x020CBDC4
stmdb sp!, {r4-r7,lr}
sub sp, sp, #0x4
mov r6, r0
mov r5, r1
mov r7, r2
bl OS_DisableInterrupts
ldr r2, [r6, #0x1c]
ldr r1, [r6, #0x14]
mov r4, r0
cmp r1, r2
bgt _020CBE2C
and r7, r7, #0x1
_020CBDF4:
cmp r7, #0x0
bne _020CBE14
mov r0, r4
bl OS_RestoreInterrupts
add sp, sp, #0x4
mov r0, #0x0
ldmia sp!, {r4-r7,lr}
bx lr
_020CBE14:
mov r0, r6
bl OS_SleepThread
ldr r2, [r6, #0x1c]
ldr r1, [r6, #0x14]
cmp r1, r2
ble _020CBDF4
_020CBE2C:
ldr r0, [r6, #0x18]
add r0, r0, r2
bl _s32_div_f
ldr r2, [r6, #0x10]
add r0, r6, #0x8
str r5, [r2, r1, lsl #0x2]
ldr r1, [r6, #0x1c]
add r1, r1, #0x1
str r1, [r6, #0x1c]
bl OS_WakeupThread
mov r0, r4
bl OS_RestoreInterrupts
mov r0, #0x1
add sp, sp, #0x4
ldmia sp!, {r4-r7,lr}
bx lr
arm_func_start OS_InitMessageQueue
OS_InitMessageQueue: ; 0x020CBE6C
mov r12, #0x0
str r12, [r0, #0x4]
ldr r3, [r0, #0x4]
str r3, [r0, #0x0]
str r12, [r0, #0xc]
ldr r3, [r0, #0xc]
str r3, [r0, #0x8]
str r1, [r0, #0x10]
str r2, [r0, #0x14]
str r12, [r0, #0x18]
str r12, [r0, #0x1c]
bx lr
arm_func_start OSi_DequeueItem
OSi_DequeueItem: ; 0x020CBE9C
ldr r2, [r1, #0x10]
ldr r1, [r1, #0x14]
cmp r2, #0x0
streq r1, [r0, #0x8c]
strne r1, [r2, #0x14]
cmp r1, #0x0
streq r2, [r0, #0x88]
strne r2, [r1, #0x10]
bx lr
arm_func_start OSi_EnqueueTail
OSi_EnqueueTail: ; 0x020CBEC0
ldr r2, [r0, #0x8c]
cmp r2, #0x0
streq r1, [r0, #0x88]
strne r1, [r2, #0x10]
str r2, [r1, #0x14]
mov r2, #0x0
str r2, [r1, #0x10]
str r1, [r0, #0x8c]
bx lr
arm_func_start OS_TryLockMutex
OS_TryLockMutex: ; 0x020CBEE4
stmdb sp!, {r4-r6,lr}
mov r5, r0
bl OS_DisableInterrupts
ldr r2, [r5, #0x8]
ldr r1, _020CBF54 ; =0x021D3498
mov r4, r0
cmp r2, #0x0
ldr r0, [r1, #0x4]
bne _020CBF28
str r0, [r5, #0x8]
ldr r2, [r5, #0xc]
mov r1, r5
add r2, r2, #0x1
str r2, [r5, #0xc]
bl OSi_EnqueueTail
mov r6, #0x1
b _020CBF40
_020CBF28:
cmp r2, r0
ldreq r0, [r5, #0xc]
moveq r6, #0x1
addeq r0, r0, #0x1
streq r0, [r5, #0xc]
movne r6, #0x0
_020CBF40:
mov r0, r4
bl OS_RestoreInterrupts
mov r0, r6
ldmia sp!, {r4-r6,lr}
bx lr
.balign 4
_020CBF54: .word 0x021D3498
arm_func_start OSi_UnlockAllMutex
OSi_UnlockAllMutex: ; 0x020CBF58
stmdb sp!, {r4-r6,lr}
mov r6, r0
ldr r0, [r6, #0x88]
cmp r0, #0x0
ldmeqia sp!, {r4-r6,lr}
bxeq lr
add r5, r6, #0x88
mov r4, #0x0
_020CBF78:
mov r0, r5
bl OSi_RemoveMutexLinkFromQueue
str r4, [r0, #0xc]
str r4, [r0, #0x8]
bl OS_WakeupThread
ldr r0, [r6, #0x88]
cmp r0, #0x0
bne _020CBF78
ldmia sp!, {r4-r6,lr}
bx lr
arm_func_start OS_UnlockMutex
OS_UnlockMutex: ; 0x020CBFA0
stmdb sp!, {r4-r5,lr}
sub sp, sp, #0x4
mov r5, r0
bl OS_DisableInterrupts
ldr r1, _020CC00C ; =0x021D3498
mov r4, r0
ldr r0, [r1, #0x4]
ldr r1, [r5, #0x8]
cmp r1, r0
bne _020CBFF8
ldr r1, [r5, #0xc]
sub r1, r1, #0x1
str r1, [r5, #0xc]
ldr r1, [r5, #0xc]
cmp r1, #0x0
bne _020CBFF8
mov r1, r5
bl OSi_DequeueItem
mov r1, #0x0
mov r0, r5
str r1, [r5, #0x8]
bl OS_WakeupThread
_020CBFF8:
mov r0, r4
bl OS_RestoreInterrupts
add sp, sp, #0x4
ldmia sp!, {r4-r5,lr}
bx lr
.balign 4
_020CC00C: .word 0x021D3498
arm_func_start OS_LockMutex
OS_LockMutex: ; 0x020CC010
stmdb sp!, {r4-r7,lr}
sub sp, sp, #0x4
mov r5, r0
bl OS_DisableInterrupts
ldr r1, _020CC098 ; =0x021D3498
mov r4, r0
ldr r7, [r1, #0x4]
mov r6, #0x0
_020CC030:
ldr r0, [r5, #0x8]
cmp r0, #0x0
bne _020CC05C
str r7, [r5, #0x8]
ldr r1, [r5, #0xc]
mov r0, r7
add r2, r1, #0x1
mov r1, r5
str r2, [r5, #0xc]
bl OSi_EnqueueTail
b _020CC084
_020CC05C:
cmp r0, r7
ldreq r0, [r5, #0xc]
addeq r0, r0, #0x1
streq r0, [r5, #0xc]
beq _020CC084
mov r0, r5
str r5, [r7, #0x84]
bl OS_SleepThread
str r6, [r7, #0x84]
b _020CC030
_020CC084:
mov r0, r4
bl OS_RestoreInterrupts
add sp, sp, #0x4
ldmia sp!, {r4-r7,lr}
bx lr
.balign 4
_020CC098: .word 0x021D3498
arm_func_start OS_InitMutex
OS_InitMutex: ; 0x020CC09C
mov r2, #0x0
str r2, [r0, #0x4]
ldr r1, [r0, #0x4]
str r1, [r0, #0x0]
str r2, [r0, #0x8]
str r2, [r0, #0xc]
bx lr
arm_func_start DC_InvalidateAll
DC_InvalidateAll: ; 0x020CC0B8
mov r0, #0x0
mcr p15, 0x0, r0, c7, c6, 0x0
bx lr
arm_func_start DC_StoreAll
DC_StoreAll: ; 0x020CC0C4
mov r1, #0x0
_020CC0C8:
mov r0, #0x0
_020CC0CC:
orr r2, r1, r0
mcr p15, 0x0, r2, c7, c10, 0x2
add r0, r0, #0x20
cmp r0, #0x400
blt _020CC0CC
add r1, r1, #0x40000000
cmp r1, #0x0
bne _020CC0C8
bx lr
arm_func_start DC_FlushAll
DC_FlushAll: ; 0x020CC0F0
mov r12, #0x0
mov r1, #0x0
_020CC0F8:
mov r0, #0x0
_020CC0FC:
orr r2, r1, r0
mcr p15, 0x0, r12, c7, c10, 0x4
mcr p15, 0x0, r2, c7, c14, 0x2
add r0, r0, #0x20
cmp r0, #0x400
blt _020CC0FC
add r1, r1, #0x40000000
cmp r1, #0x0
bne _020CC0F8
bx lr
arm_func_start DC_InvalidateRange
DC_InvalidateRange: ; 0x020CC124
add r1, r1, r0
bic r0, r0, #0x1f
_020CC12C:
mcr p15, 0x0, r0, c7, c6, 0x1
add r0, r0, #0x20
cmp r0, r1
blt _020CC12C
bx lr
arm_func_start DC_StoreRange
DC_StoreRange: ; 0x020CC140
add r1, r1, r0
bic r0, r0, #0x1f
_020CC148:
mcr p15, 0x0, r0, c7, c10, 0x1
add r0, r0, #0x20
cmp r0, r1
blt _020CC148
bx lr
arm_func_start DC_FlushRange
DC_FlushRange: ; 0x020CC15C
mov r12, #0x0
add r1, r1, r0
bic r0, r0, #0x1f
_020CC168:
mcr p15, 0x0, r12, c7, c10, 0x4
mcr p15, 0x0, r0, c7, c14, 0x1
add r0, r0, #0x20
cmp r0, r1
blt _020CC168
bx lr
arm_func_start DC_WaitWriteBufferEmpty
DC_WaitWriteBufferEmpty: ; 0x020CC180
mov r0, #0x0
mcr p15, 0x0, r0, c7, c10, 0x4
bx lr
arm_func_start IC_InvalidateAll
IC_InvalidateAll: ; 0x020CC18C
mov r0, #0x0
mcr p15, 0x0, r0, c7, c5, 0x0
bx lr
arm_func_start IC_InvalidateRange
IC_InvalidateRange:
add r1, r1, r0
bic r0, r0, #0x1f
_020CC1A0:
mcr p15, 0x0, r0, c7, c5, 0x1
add r0, r0, #0x20
cmp r0, r1
blt _020CC1A0
bx lr
arm_func_start OS_Init
OS_Init: ; 0x020CC1B4
stmdb sp!, {lr}
sub sp, sp, #0x4
bl OS_InitArena
bl PXI_Init
bl OS_InitLock
bl OS_InitArenaEx
bl OS_InitIrqTable
bl OS_SetIrqStackChecker
bl OS_InitException
bl MI_Init
bl OS_InitVAlarm
bl OSi_InitVramExclusive
bl OS_InitThread
bl OS_InitReset
bl CTRDG_Init
bl CARD_Init
bl PM_Init
add sp, sp, #0x4
ldmia sp!, {lr}
bx lr
arm_func_start OS_AllocFromArenaHi
OS_AllocFromArenaHi: ; 0x020CC204
stmdb sp!, {r4-r6,lr}
mov r4, r0
mov r6, r1
mov r5, r2
bl OS_GetArenaHi
_020CC218:
cmp r0, #0x0
moveq r0, #0x0
ldmeqia sp!, {r4-r6,lr}
bxeq lr
sub r1, r5, #0x1
mvn r2, r1
and r0, r0, r2
sub r1, r0, r6
mov r0, r4
and r5, r1, r2
bl OS_GetArenaLo
cmp r5, r0
movcc r0, #0x0
ldmccia sp!, {r4-r6, lr}
bxcc lr
mov r0, r4
mov r1, r5
bl OS_SetArenaHi
mov r0, r5
ldmia sp!, {r4-r6,lr}
bx lr
arm_func_start OS_AllocFromArenaLo
OS_AllocFromArenaLo: ; 0x020CC26C
stmdb sp!, {r4-r7,lr}
sub sp, sp, #0x4
mov r7, r0
mov r6, r1
mov r5, r2
bl OS_GetArenaLo
_020CC284:
cmp r0, #0x0
addeq sp, sp, #0x4
moveq r0, #0x0
ldmeqia sp!, {r4-r7, lr}
bxeq lr
add r0, r0, r5
sub r1, r5, #0x1
mvn r2, r1
sub r0, r0, #0x1
and r4, r2, r0
add r0, r4, r6
add r0, r0, r5
sub r1, r0, #0x1
mov r0, r7
and r5, r2, r1
bl OS_GetArenaHi
cmp r5, r0
addhi sp, sp, #0x4
movhi r0, #0x0
ldmhiia sp!, {r4-r7, lr}
bxhi lr
mov r0, r7
mov r1, r5
bl OS_SetArenaLo
mov r0, r4
add sp, sp, #0x4
ldmia sp!, {r4-r7, lr}
bx lr
arm_func_start OS_SetArenaLo
OS_SetArenaLo: ; 0x020CC2F4
mov r0, r0, lsl #0x2
add r0, r0, #0x2700000
add r0, r0, #0xff000
str r1, [r0, #0xda0]
bx lr
arm_func_start OS_SetArenaHi
OS_SetArenaHi:
mov r0, r0, lsl #0x2
add r0, r0, #0x2700000
add r0, r0, #0xff000
str r1, [r0, #0xdc4]
bx lr
arm_func_start OS_GetInitArenaLo
OS_GetInitArenaLo: ; 0x020CC31C
stmdb sp!, {lr}
sub sp, sp, #0x4
cmp r0, #0x6
addls pc, pc, r0, lsl #0x2
b _020CC3DC
_020CC330:
b _020CC34C
b _020CC3DC
b _020CC35C
b _020CC39C
b _020CC3AC
b _020CC3BC
b _020CC3CC
_020CC34C:
add sp, sp, #0x4
ldr r0, _020CC3EC ; =0x0225FFA0
ldmfd sp!, {lr}
bx lr
_020CC35C:
ldr r0, _020CC3F0 ; =0x021D36F4
ldr r0, [r0]
cmp r0, #0x0
beq _020CC37C
bl OS_GetConsoleType
and r0, r0, #0x3
cmp r0, #0x1
bne _020CC38C
_020CC37C:
add sp, sp, #0x4
mov r0, #0x0
ldmfd sp!, {lr}
bx lr
_020CC38C:
add sp, sp, #0x4
ldr r0, _020CC3F4 ; =0x023E0000
ldmfd sp!, {lr}
bx lr
_020CC39C:
add sp, sp, #0x4
ldr r0, _020CC3F8 ; =0x01FF8720
ldmfd sp!, {lr}
bx lr
_020CC3AC:
add sp, sp, #0x4
ldr r0, _020CC3FC ; =0x027E0080
ldmfd sp!, {lr}
bx lr
_020CC3BC:
add sp, sp, #0x4
ldr r0, _020CC400 ; =0x027FF000
ldmfd sp!, {lr}
bx lr
_020CC3CC:
add sp, sp, #0x4
ldr r0, _020CC404 ; =0x037F8000
ldmfd sp!, {lr}
bx lr
_020CC3DC:
mov r0, #0x0
add sp, sp, #0x4
ldmia sp!, {lr}
bx lr
_020CC3EC: .word 0x0225FFA0
_020CC3F0: .word 0x021D36F4
_020CC3F4: .word 0x023E0000
_020CC3F8: .word 0x01FF8720
_020CC3FC: .word 0x027E0080
_020CC400: .word 0x027FF000
_020CC404: .word 0x037F8000
arm_func_start OS_GetInitArenaHi
OS_GetInitArenaHi: ; 0x020CC408
stmdb sp!, {lr}
sub sp, sp, #0x4
cmp r0, #0x6
addls pc, pc, r0, lsl #0x2
b _020CC508
_020CC41C:
b _020CC438
b _020CC508
b _020CC448
b _020CC488
b _020CC498
b _020CC4E8
b _020CC4F8
_020CC438:
add sp, sp, #0x4
ldr r0, _020CC518 ; =0x023E0000
ldmfd sp!, {lr}
bx lr
_020CC448:
ldr r0, _020CC51C ; =0x021D36F4
ldr r0, [r0]
cmp r0, #0x0
beq _020CC468
bl OS_GetConsoleType
and r0, r0, #0x3
cmp r0, #0x1
bne _020CC478
_020CC468:
add sp, sp, #0x4
mov r0, #0x0
ldmfd sp!, {lr}
bx lr
_020CC478:
add sp, sp, #0x4
mov r0, #0x2700000
ldmfd sp!, {lr}
bx lr
_020CC488:
add sp, sp, #0x4
mov r0, #0x2000000
ldmfd sp!, {lr}
bx lr
_020CC498:
ldr r0, _020CC520 ; =0x027E0000
ldr r1, _020CC524 ; =0x00000000
ldr r2, _020CC528 ; =0x00000400
add r3, r0, #0x3f80
cmp r1, #0x0
sub r2, r3, r2
bne _020CC4CC
ldr r1, _020CC52C ; =0x027E0080
add sp, sp, #0x4
cmp r0, r1
movcc r0, r1
ldmfd sp!, {lr}
bx lr
_020CC4CC:
cmp r1, #0x0
ldrlt r0, _020CC52C ; =0x027E0080
add sp, sp, #0x4
sublt r0, r0, r1
subge r0, r2, r1
ldmfd sp!, {lr}
bx lr
_020CC4E8:
add sp, sp, #0x4
ldr r0, _020CC530 ; =0x027FF680
ldmfd sp!, {lr}
bx lr
_020CC4F8:
add sp, sp, #0x4
ldr r0, _020CC534 ; =0x037F8000
ldmfd sp!, {lr}
bx lr
_020CC508:
mov r0, #0x0
add sp, sp, #0x4
ldmia sp!, {lr}
bx lr
_020CC518: .word 0x023E0000
_020CC51C: .word 0x021D36F4
_020CC520: .word 0x027E0000
_020CC524: .word 0x00000000
_020CC528: .word 0x00000400
_020CC52C: .word 0x027E0080
_020CC530: .word 0x027FF680
_020CC534: .word 0x037F8000
arm_func_start OS_GetArenaLo
OS_GetArenaLo:
mov r0, r0, lsl #0x2
add r0, r0, #0x2700000
add r0, r0, #0xff000
ldr r0, [r0, #0xda0]
bx lr
arm_func_start OS_GetArenaHi
OS_GetArenaHi:
mov r0, r0, lsl #0x2
add r0, r0, #0x2700000
add r0, r0, #0xff000
ldr r0, [r0, #0xdc4]
bx lr
arm_func_start OS_InitArenaEx
OS_InitArenaEx: ; 0x020CC560
stmdb sp!, {lr}
sub sp, sp, #0x4
mov r0, #0x2
bl OS_GetInitArenaHi
mov r1, r0
mov r0, #0x2
bl OS_SetArenaHi
mov r0, #0x2
bl OS_GetInitArenaLo
mov r1, r0
mov r0, #0x2
bl OS_SetArenaLo
ldr r0, _020CC5D4 ; =0x021D36F4
ldr r0, [r0, #0x0]
cmp r0, #0x0
beq _020CC5B8
bl OS_GetConsoleType
and r0, r0, #0x3
cmp r0, #0x1
addne sp, sp, #0x4
ldmneia sp!, {lr}
bxne lr
_020CC5B8:
ldr r0, _020CC5D8 ; =0x0200002B
bl OS_SetProtectionRegion1
ldr r0, _020CC5DC ; =0x023E0021
bl OS_SetProtectionRegion2
add sp, sp, #0x4
ldmia sp!, {lr}
bx lr
.balign 4
_020CC5D4: .word 0x021D36F4
_020CC5D8: .word 0x0200002B
_020CC5DC: .word 0x023E0021
arm_func_start OS_InitArena
OS_InitArena: ; 0x020CC5E0
stmdb sp!, {lr}
sub sp, sp, #0x4
ldr r1, _020CC6F4 ; =0x021D36F0
ldr r0, [r1, #0x0]
cmp r0, #0x0
addne sp, sp, #0x4
ldmneia sp!, {lr}
bxne lr
mov r2, #0x1
mov r0, #0x0
str r2, [r1, #0x0]
bl OS_GetInitArenaHi
mov r1, r0
mov r0, #0x0
bl OS_SetArenaHi
_020CC61C:
mov r0, #0x0
bl OS_GetInitArenaLo
mov r1, r0
mov r0, #0x0
bl OS_SetArenaLo
mov r0, #0x2
mov r1, #0x0
bl OS_SetArenaLo
mov r0, #0x2
mov r1, #0x0
bl OS_SetArenaHi
mov r0, #0x3
bl OS_GetInitArenaHi
mov r1, r0
mov r0, #0x3
bl OS_SetArenaHi
mov r0, #0x3
bl OS_GetInitArenaLo
mov r1, r0
mov r0, #0x3
bl OS_SetArenaLo
mov r0, #0x4
bl OS_GetInitArenaHi
mov r1, r0
mov r0, #0x4
bl OS_SetArenaHi
mov r0, #0x4
bl OS_GetInitArenaLo
mov r1, r0
mov r0, #0x4
bl OS_SetArenaLo
mov r0, #0x5
bl OS_GetInitArenaHi
mov r1, r0
mov r0, #0x5
bl OS_SetArenaHi
mov r0, #0x5
bl OS_GetInitArenaLo
mov r1, r0
mov r0, #0x5
bl OS_SetArenaLo
mov r0, #0x6
bl OS_GetInitArenaHi
mov r1, r0
mov r0, #0x6
bl OS_SetArenaHi
mov r0, #0x6
bl OS_GetInitArenaLo
mov r1, r0
mov r0, #0x6
bl OS_SetArenaLo
add sp, sp, #0x4
ldmfd sp!, {lr}
bx lr
_020CC6F4: .word 0x021D36F0
arm_func_start OS_FreeToHeap
OS_FreeToHeap: ; 0x020CC6F8
stmdb sp!, {r4-r7,lr}
sub sp, sp, #0x4
mov r7, r0
mov r5, r1
mov r4, r2
bl OS_DisableInterrupts
ldr r1, _020CC768 ; =0x021D36F8
mov r6, r0
ldr r0, [r1, r7, lsl #0x2]
cmp r5, #0x0
ldrlt r5, [r0, #0x0]
ldr r1, [r0, #0x10]
mov r0, #0xc
mla r7, r5, r0, r1
sub r4, r4, #0x20
ldr r0, [r7, #0x8]
mov r1, r4
bl DLExtract
str r0, [r7, #0x8]
ldr r0, [r7, #0x4]
mov r1, r4
bl DLInsert
str r0, [r7, #0x4]
mov r0, r6
bl OS_RestoreInterrupts
add sp, sp, #0x4
ldmia sp!, {r4-r7,lr}
bx lr
.balign 4
_020CC768: .word 0x021D36F8
arm_func_start OS_AllocFromHeap
OS_AllocFromHeap: ; 0x020CC76C
stmdb sp!, {r4-r7,lr}
sub sp, sp, #0x4
mov r6, r0
mov r5, r1
mov r7, r2
bl OS_DisableInterrupts
ldr r1, _020CC894 ; =0x021D36F8
mov r4, r0
ldr r1, [r1, r6, lsl #0x2]
cmp r1, #0x0
bne _020CC7AC
bl OS_RestoreInterrupts
add sp, sp, #0x4
mov r0, #0x0
ldmia sp!, {r4-r7,lr}
bx lr
_020CC7AC:
cmp r5, #0x0
ldrlt r5, [r1, #0x0]
ldr r1, [r1, #0x10]
mov r0, #0xc
mla r6, r5, r0, r1
ldr r0, [r6, #0x4]
add r1, r7, #0x20
add r1, r1, #0x1f
mov r5, r0
cmp r0, #0x0
bic r7, r1, #0x1f
beq _020CC7F4
_020CC7DC:
ldr r1, [r5, #0x8]
cmp r7, r1
ble _020CC7F4
ldr r5, [r5, #0x4]
cmp r5, #0x0
bne _020CC7DC
_020CC7F4:
cmp r5, #0x0
bne _020CC814
mov r0, r4
bl OS_RestoreInterrupts
add sp, sp, #0x4
mov r0, #0x0
ldmia sp!, {r4-r7,lr}
bx lr
_020CC814:
ldr r1, [r5, #0x8]
sub r1, r1, r7
cmp r1, #0x40
bhs _020CC834
mov r1, r5
bl DLExtract
str r0, [r6, #0x4]
b _020CC86C
_020CC834:
str r7, [r5, #0x8]
add r2, r5, r7
str r1, [r2, #0x8]
ldr r0, [r5, #0x0]
str r0, [r5, r7]
ldr r0, [r5, #0x4]
str r0, [r2, #0x4]
ldr r0, [r2, #0x4]
cmp r0, #0x0
strne r2, [r0, #0x0]
ldr r0, [r2, #0x0]
cmp r0, #0x0
strne r2, [r0, #0x4]
streq r2, [r6, #0x4]
_020CC86C:
ldr r0, [r6, #0x8]
mov r1, r5
bl DLAddFront
str r0, [r6, #0x8]
mov r0, r4
bl OS_RestoreInterrupts
add r0, r5, #0x20
add sp, sp, #0x4
ldmia sp!, {r4-r7,lr}
bx lr
.balign 4
_020CC894: .word 0x021D36F8
arm_func_start DLInsert
DLInsert: ; 0x020CC898
stmdb sp!, {lr}
sub sp, sp, #0x4
mov r12, r0
cmp r0, #0x0
mov lr, #0x0
beq _020CC8C8
_020CC8B0:
cmp r1, r12
bls _020CC8C8
mov lr, r12
ldr r12, [r12, #0x4]
cmp r12, #0x0
bne _020CC8B0
_020CC8C8:
str r12, [r1, #0x4]
str lr, [r1, #0x0]
cmp r12, #0x0
beq _020CC908
str r1, [r12, #0x0]
ldr r3, [r1, #0x8]
add r2, r1, r3
cmp r2, r12
bne _020CC908
ldr r2, [r12, #0x8]
add r2, r3, r2
str r2, [r1, #0x8]
ldr r12, [r12, #0x4]
str r12, [r1, #0x4]
cmp r12, #0x0
strne r1, [r12, #0x0]
_020CC908:
cmp lr, #0x0
beq _020CC950
str r1, [lr, #0x4]
ldr r2, [lr, #0x8]
add r3, lr, r2
cmp r3, r1
addne sp, sp, #0x4
ldmneia sp!, {lr}
bxne lr
ldr r1, [r1, #0x8]
add sp, sp, #0x4
add r1, r2, r1
str r1, [lr, #0x8]
str r12, [lr, #0x4]
cmp r12, #0x0
strne lr, [r12, #0x0]
ldmia sp!, {lr}
bx lr
_020CC950:
mov r0, r1
add sp, sp, #0x4
ldmia sp!, {lr}
bx lr
arm_func_start DLExtract
DLExtract: ; 0x020CC960
ldr r3, [r1, #0x4]
cmp r3, #0x0
ldrne r2, [r1, #0x0]
strne r2, [r3, #0x0]
ldr r2, [r1, #0x0]
cmp r2, #0x0
ldreq r0, [r1, #0x4]
ldrne r1, [r1, #0x4]
strne r1, [r2, #0x4]
bx lr
arm_func_start DLAddFront
DLAddFront: ; 0x020CC988
str r0, [r1, #0x4]
mov r2, #0x0
str r2, [r1, #0x0]
cmp r0, #0x0
strne r1, [r0, #0x0]
mov r0, r1
bx lr
arm_func_start OS_GetDTCMAddress
OS_GetDTCMAddress: ; 0x020CC9A4
mrc p15, 0x0, r0, c9, c1, 0x0
ldr r1, _020CC9B4 ; =0xFFFFF000
and r0, r0, r1
bx lr
.balign 4
_020CC9B4: .word 0xFFFFF000
arm_func_start OS_EnableProtectionUnit
OS_EnableProtectionUnit: ; 0x020CC9B8
mrc p15, 0x0, r0, c1, c0, 0x0
orr r0, r0, #0x1
mcr p15, 0x0, r0, c1, c0, 0x0
bx lr
arm_func_start OS_DisableProtectionUnit
OS_DisableProtectionUnit: ; 0x020CC9C8
mrc p15, 0x0, r0, c1, c0, 0x0
bic r0, r0, #0x1
mcr p15, 0x0, r0, c1, c0, 0x0
bx lr
arm_func_start OS_SetDPermissionsForProtectionRegion
OS_SetDPermissionsForProtectionRegion: ; 0x020CC9D8
mrc p15, 0x0, r2, c5, c0, 0x2
bic r2, r2, r0
orr r2, r2, r1
mcr p15, 0x0, r2, c5, c0, 0x2
bx lr
arm_func_start OS_SetProtectionRegion1
OS_SetProtectionRegion1: ; 0x020CC9EC
mcr p15, 0x0, r0, c6, c1, 0x0
bx lr
arm_func_start OS_SetProtectionRegion2
OS_SetProtectionRegion2: ; 0x020CC9F4
mcr p15, 0x0, r0, c6, c2, 0x0
bx lr
arm_func_start OSi_ExceptionHandler
OSi_ExceptionHandler: ; 0x020CC9FC
ldr ip, _020CCA68 ; =0x021D3724
ldr r12, [r12, #0x0]
cmp r12, #0x0
movne lr, pc
bxne r12
ldr ip, _020CCA6C ; =0x02000000
stmdb r12!, {r0-r3,sp-lr}
and r0, sp, #0x1
mov sp, r12
mrs r1, cpsr
and r1, r1, #0x1f
teq r1, #0x17
bne _020CCA38
bl OSi_GetAndDisplayContext
b _020CCA44
_020CCA38:
teq r1, #0x1b
bne _020CCA44
bl OSi_GetAndDisplayContext
_020CCA44:
ldr ip, _020CCA68 ; =0x021D3724
ldr r12, [r12, #0x0]
cmp r12, #0x0
_020CCA50:
beq _020CCA50
_020CCA54:
mov r0, r0
b _020CCA54
_020CCA5C:
ldmia sp!, {r0-r3,ip,lr}
mov sp, ip
bx lr
_020CCA68: .word 0x021D3724
_020CCA6C: .word 0x02000000
arm_func_start OSi_GetAndDisplayContext
OSi_GetAndDisplayContext: ; 0x020CCA70
stmdb sp!, {r0,lr}
bl OSi_SetExContext
bl OSi_DisplayExContext
ldmia sp!, {r0,lr}
bx lr
arm_func_start OSi_SetExContext
OSi_SetExContext: ; 0x020CCA84
ldr r1, _020CCB10 ; =0x021D3728
mrs r2, cpsr
str r2, [r1, #0x74]
str r0, [r1, #0x6c]
ldr r0, [r12, #0x0]
str r0, [r1, #0x4]
ldr r0, [r12, #0x4]
str r0, [r1, #0x8]
ldr r0, [r12, #0x8]
str r0, [r1, #0xc]
ldr r0, [r12, #0xc]
str r0, [r1, #0x10]
ldr r2, [r12, #0x10]
bic r2, r2, #0x1
add r0, r1, #0x14
stmia r0, {r4-r11}
str r12, [r1, #0x70]
ldr r0, [r2, #0x0]
str r0, [r1, #0x64]
ldr r3, [r2, #0x4]
str r3, [r1, #0x0]
ldr r0, [r2, #0x8]
str r0, [r1, #0x34]
ldr r0, [r2, #0xc]
str r0, [r1, #0x40]
mrs r0, cpsr
orr r3, r3, #0x80
bic r3, r3, #0x20
msr cpsr_fsxc, r3
str sp, [r1, #0x38]
str lr, [r1, #0x3c]
mrs r2, spsr
str r2, [r1, #0x7c]
msr cpsr_fsxc, r0
bx lr
.balign 4
_020CCB10: .word 0x021D3728
arm_func_start OSi_DisplayExContext
OSi_DisplayExContext: ; 0x020CCB14
stmdb sp!, {lr}
sub sp, sp, #0x4
ldr r0, _020CCB70 ; =0x021D371C
ldr r0, [r0, #0x0]
cmp r0, #0x0
addeq sp, sp, #0x4
ldmeqia sp!, {lr}
bxeq lr
mov r0, sp
ldr r1, _020CCB74 ; =0x0000009F
msr cpsr_fsxc, r1
mov sp, r0
bl OS_EnableProtectionUnit
ldr r1, _020CCB78 ; =0x021D3720
ldr r0, _020CCB70 ; =0x021D371C
ldr r1, [r1, #0x0]
ldr r2, [r0, #0x0]
ldr r0, _020CCB7C ; =0x021D3728
blx r2
bl OS_DisableProtectionUnit
add sp, sp, #0x4
ldmia sp!, {lr}
bx lr
.balign 4
_020CCB70: .word 0x021D371C
_020CCB74: .word 0x0000009F
_020CCB78: .word 0x021D3720
_020CCB7C: .word 0x021D3728
arm_func_start OS_InitException
OS_InitException: ; 0x020CCB80
ldr r0, _020CCBDC ; =0x027FFD9C
ldr r1, [r0, #0x0]
cmp r1, #0x2600000
blo _020CCBA0
cmp r1, #0x2800000
ldrlo r0, _020CCBE0 ; =0x021D3724
strcc r1, [r0, #0x0]
blo _020CCBAC
_020CCBA0:
ldr r0, _020CCBE0 ; =0x021D3724
mov r1, #0x0
str r1, [r0, #0x0]
_020CCBAC:
ldr r0, _020CCBE0 ; =0x021D3724
ldr r0, [r0, #0x0]
cmp r0, #0x0
ldreq r2, _020CCBE4 ; =OSi_ExceptionHandler
ldreq r1, _020CCBDC ; =0x027FFD9C
ldreq r0, _020CCBE8 ; =0x027E3000
streq r2, [r1, #0x0]
streq r2, [r0, #0xfdc]
ldr r0, _020CCBEC ; =0x021D371C
mov r1, #0x0
str r1, [r0, #0x0]
bx lr
.balign 4
_020CCBDC: .word 0x027FFD9C
_020CCBE0: .word 0x021D3724
_020CCBE4: .word OSi_ExceptionHandler
_020CCBE8: .word 0x027E3000
_020CCBEC: .word 0x021D371C
arm_func_start OSi_SetTimerReserved
OSi_SetTimerReserved: ; 0x020CCBF0
ldr r1, _020CCC08 ; =0x021D37A8
mov r2, #0x1
ldrh r3, [r1, #0x0]
orr r0, r3, r2, lsl r0
strh r0, [r1, #0x0]
bx lr
.balign 4
_020CCC08: .word 0x021D37A8
arm_func_start OS_GetTickLo
OS_GetTickLo: ; 0x020CCC0C
ldr r0, _020CCC18 ; =0x04000100
ldrh r0, [r0, #0x0]
bx lr
.balign 4
_020CCC18: .word 0x04000100
arm_func_start OS_GetTick
OS_GetTick: ; 0x020CCC1C
stmdb sp!, {lr}
sub sp, sp, #0xc
bl OS_DisableInterrupts
ldr r1, _020CCCBC ; =0x04000100
ldr r3, _020CCCC0 ; =0x021D37B4
ldrh r12, [r1, #0x0]
ldr r2, _020CCCC4 ; =0x0000FFFF
mvn r1, #0x0
strh r12, [sp, #0x0]
ldr r12, [r3, #0x0]
ldr r3, [r3, #0x4]
and r1, r12, r1
and r2, r3, r2
str r1, [sp, #0x4]
ldr r1, _020CCCC8 ; =0x04000214
str r2, [sp, #0x8]
ldr r1, [r1, #0x0]
ands r1, r1, #0x8
beq _020CCC90
ldrh r1, [sp, #0x0]
ands r1, r1, #0x8000
bne _020CCC90
ldr r3, [sp, #0x4]
mov r1, #0x1
ldr r2, [sp, #0x8]
adds r3, r3, r1
adc r1, r2, #0x0
str r3, [sp, #0x4]
str r1, [sp, #0x8]
_020CCC90:
bl OS_RestoreInterrupts
ldr r2, [sp, #0x4]
ldr r1, [sp, #0x8]
ldrh r0, [sp, #0x0]
mov r1, r1, lsl #0x10
orr r1, r1, r2, lsr #0x10
orr r1, r1, r0, asr #0x1f
orr r0, r0, r2, lsl #0x10
add sp, sp, #0xc
ldmia sp!, {lr}
bx lr
.balign 4
_020CCCBC: .word 0x04000100
_020CCCC0: .word 0x021D37B4
_020CCCC4: .word 0x0000FFFF
_020CCCC8: .word 0x04000214
arm_func_start OSi_CountUpTick
OSi_CountUpTick: ; 0x020CCCCC
stmdb sp!, {lr}
sub sp, sp, #0x4
ldr r2, _020CCD40 ; =0x021D37B4
ldr r1, _020CCD44 ; =0x021D37B0
ldr r12, [r2, #0x0]
mov r0, #0x1
ldr r3, [r2, #0x4]
adds r12, r12, r0
ldr r0, [r1, #0x0]
adc r3, r3, #0x0
str r12, [r2, #0x0]
str r3, [r2, #0x4]
cmp r0, #0x0
mov r3, #0x0
beq _020CCD24
ldr r2, _020CCD48 ; =0x04000102
ldr r0, _020CCD4C ; =0x04000100
strh r3, [r2, #0x0]
strh r3, [r0, #0x0]
mov r0, #0xc1
strh r0, [r2, #0x0]
str r3, [r1, #0x0]
_020CCD24:
mov r0, #0x0
ldr r1, _020CCD50 ; =OSi_CountUpTick
mov r2, r0
bl OSi_EnterTimerCallback
add sp, sp, #0x4
ldmia sp!, {lr}
bx lr
.balign 4
_020CCD40: .word 0x021D37B4
_020CCD44: .word 0x021D37B0
_020CCD48: .word 0x04000102
_020CCD4C: .word 0x04000100
_020CCD50: .word OSi_CountUpTick
arm_func_start OS_IsTickAvailable
OS_IsTickAvailable: ; 0x020CCD54
ldr r0, _020CCD60 ; =0x021D37AC
ldrh r0, [r0, #0x0]
bx lr
.balign 4
_020CCD60: .word 0x021D37AC
arm_func_start OS_InitTick
OS_InitTick: ; 0x020CCD64
stmdb sp!, {lr}
sub sp, sp, #0x4
ldr r1, _020CCDE8 ; =0x021D37AC
ldrh r0, [r1, #0x0]
cmp r0, #0x0
addne sp, sp, #0x4
ldmneia sp!, {lr}
bxne lr
mov r2, #0x1
mov r0, #0x0
strh r2, [r1, #0x0]
bl OSi_SetTimerReserved
ldr r0, _020CCDEC ; =0x021D37B4
mov r2, #0x0
str r2, [r0, #0x0]
ldr r3, _020CCDF0 ; =0x04000102
str r2, [r0, #0x4]
ldr r0, _020CCDF4 ; =0x04000100
strh r2, [r3, #0x0]
ldr r1, _020CCDF8 ; =OSi_CountUpTick
strh r2, [r0, #0x0]
mov r2, #0xc1
mov r0, #0x8
strh r2, [r3, #0x0]
bl OS_SetIrqFunction
mov r0, #0x8
bl OS_EnableIrqMask
ldr r0, _020CCDFC ; =0x021D37B0
mov r1, #0x0
str r1, [r0, #0x0]
add sp, sp, #0x4
ldmia sp!, {lr}
bx lr
.balign 4
_020CCDE8: .word 0x021D37AC
_020CCDEC: .word 0x021D37B4
_020CCDF0: .word 0x04000102
_020CCDF4: .word 0x04000100
_020CCDF8: .word OSi_CountUpTick
_020CCDFC: .word 0x021D37B0
arm_func_start OSi_AlarmHandler
OSi_AlarmHandler: ; 0x020CCE00
stmdb sp!, {r0,lr}
bl OSi_ArrangeTimer
ldmia sp!, {r0,lr}
bx lr
arm_func_start OSi_ArrangeTimer
OSi_ArrangeTimer: ; 0x020CCE10
stmdb sp!, {r4-r5,lr}
sub sp, sp, #0x4
ldr r1, _020CCF1C ; =0x04000106
mov r2, #0x0
mov r0, #0x10
strh r2, [r1, #0x0]
bl OS_DisableIrqMask
ldr r0, _020CCF20 ; =0x027E0000
add r0, r0, #0x3000
ldr r1, [r0, #0xff8]
orr r1, r1, #0x10
str r1, [r0, #0xff8]
bl OS_GetTick
ldr r2, _020CCF24 ; =0x021D37C0
ldr r4, [r2, #0x0]
cmp r4, #0x0
addeq sp, sp, #0x4
ldmeqia sp!, {r4-r5,lr}
bxeq lr
ldr r3, [r4, #0x10]
ldr r12, [r4, #0xc]
cmp r1, r3
cmpeq r0, r12
bhs _020CCE84
mov r0, r4
bl OSi_SetTimer
add sp, sp, #0x4
ldmia sp!, {r4-r5,lr}
bx lr
_020CCE84:
ldr r1, [r4, #0x18]
cmp r1, #0x0
moveq r0, #0x0
streq r0, [r2, #0x4]
str r1, [r2, #0x0]
movne r0, #0x0
strne r0, [r1, #0x14]
ldr r2, [r4, #0x1c]
ldr r1, [r4, #0x20]
mov r0, #0x0
cmp r1, r0
ldr r5, [r4, #0x0]
cmpeq r2, r0
streq r0, [r4, #0x0]
cmp r5, #0x0
beq _020CCECC
ldr r0, [r4, #0x4]
blx r5
_020CCECC:
ldr r2, [r4, #0x1c]
ldr r0, [r4, #0x20]
mov r1, #0x0
cmp r0, r1
cmpeq r2, r1
beq _020CCEF4
mov r0, r4
mov r2, r1
str r5, [r4, #0x0]
bl OSi_InsertAlarm
_020CCEF4:
ldr r0, _020CCF24 ; =0x021D37C0
ldr r0, [r0, #0x0]
cmp r0, #0x0
addeq sp, sp, #0x4
ldmeqia sp!, {r4-r5,lr}
bxeq lr
bl OSi_SetTimer
add sp, sp, #0x4
ldmia sp!, {r4-r5,lr}
bx lr
.balign 4
_020CCF1C: .word 0x04000106
_020CCF20: .word 0x027E0000
_020CCF24: .word 0x021D37C0
arm_func_start OS_CancelAlarm
OS_CancelAlarm: ; 0x020CCF28
stmdb sp!, {r4-r5,lr}
sub sp, sp, #0x4
mov r5, r0
bl OS_DisableInterrupts
ldr r1, [r5, #0x0]
mov r4, r0
cmp r1, #0x0
bne _020CCF58
bl OS_RestoreInterrupts
add sp, sp, #0x4
ldmia sp!, {r4-r5,lr}
bx lr
_020CCF58:
ldr r0, [r5, #0x18]
cmp r0, #0x0
ldreq r2, [r5, #0x14]
ldreq r1, _020CCFBC ; =0x021D37C0
streq r2, [r1, #0x4]
ldrne r1, [r5, #0x14]
strne r1, [r0, #0x14]
ldr r1, [r5, #0x14]
cmp r1, #0x0
strne r0, [r1, #0x18]
bne _020CCF98
ldr r1, _020CCFBC ; =0x021D37C0
cmp r0, #0x0
str r0, [r1, #0x0]
beq _020CCF98
bl OSi_SetTimer
_020CCF98:
mov r1, #0x0
str r1, [r5, #0x0]
str r1, [r5, #0x1c]
mov r0, r4
str r1, [r5, #0x20]
bl OS_RestoreInterrupts
add sp, sp, #0x4
ldmia sp!, {r4-r5,lr}
bx lr
.balign 4
_020CCFBC: .word 0x021D37C0
arm_func_start OS_SetAlarm
OS_SetAlarm: ; 0x020CCFC0
stmdb sp!, {r4-r7,lr}
sub sp, sp, #0x4
movs r6, r0
mov r5, r1
mov r4, r2
mov r7, r3
beq _020CCFE8
ldr r0, [r6, #0x0]
cmp r0, #0x0
beq _020CCFEC
_020CCFE8:
bl OS_Terminate
_020CCFEC:
bl OS_DisableInterrupts
mov r1, #0x0
str r1, [r6, #0x1c]
str r1, [r6, #0x20]
str r7, [r6, #0x0]
ldr r1, [sp, #0x18]
mov r7, r0
str r1, [r6, #0x4]
bl OS_GetTick
adds r3, r5, r0
adc r2, r4, r1
mov r0, r6
mov r1, r3
bl OSi_InsertAlarm
mov r0, r7
bl OS_RestoreInterrupts
add sp, sp, #0x4
ldmia sp!, {r4-r7,lr}
bx lr
arm_func_start OSi_InsertAlarm
OSi_InsertAlarm: ; 0x020CD038
stmdb sp!, {r4-r8,lr}
mov r8, r0
ldr r4, [r8, #0x1c]
ldr r3, [r8, #0x20]
mov r0, #0x0
cmp r3, r0
mov r7, r1
mov r6, r2
cmpeq r4, r0
beq _020CD0B4
bl OS_GetTick
ldr r6, [r8, #0x28]
ldr r7, [r8, #0x24]
cmp r6, r1
cmpeq r7, r0
bhs _020CD0B4
ldr r5, [r8, #0x1c]
ldr r4, [r8, #0x20]
subs r0, r0, r7
mov r2, r5
mov r3, r4
sbc r1, r1, r6
bl _ll_udiv
mov r2, #0x1
adds r2, r0, r2
adc r0, r1, #0x0
umull r3, r1, r5, r2
mla r1, r5, r0, r1
mla r1, r4, r2, r1
adds r7, r7, r3
adc r6, r6, r1
_020CD0B4:
str r7, [r8, #0xc]
ldr r0, _020CD174 ; =0x021D37C0
str r6, [r8, #0x10]
ldr r4, [r0, #0x0]
cmp r4, #0x0
beq _020CD134
mov r1, #0x0
_020CD0D0:
ldr r2, [r4, #0xc]
ldr r0, [r4, #0x10]
subs r3, r7, r2
sbc r2, r6, r0
subs r0, r3, r1
sbcs r0, r2, r1
bge _020CD128
ldr r0, [r4, #0x14]
str r0, [r8, #0x14]
str r8, [r4, #0x14]
str r4, [r8, #0x18]
ldr r0, [r8, #0x14]
cmp r0, #0x0
strne r8, [r0, #0x18]
ldmneia sp!, {r4-r8,lr}
bxne lr
ldr r1, _020CD174 ; =0x021D37C0
mov r0, r8
str r8, [r1, #0x0]
bl OSi_SetTimer
ldmia sp!, {r4-r8,lr}
bx lr
_020CD128:
ldr r4, [r4, #0x18]
cmp r4, #0x0
bne _020CD0D0
_020CD134:
ldr r1, _020CD174 ; =0x021D37C0
mov r0, #0x0
str r0, [r8, #0x18]
ldr r0, [r1, #0x4]
str r8, [r1, #0x4]
str r0, [r8, #0x14]
cmp r0, #0x0
strne r8, [r0, #0x18]
ldmneia sp!, {r4-r8,lr}
bxne lr
mov r0, r8
str r8, [r1, #0x4]
str r8, [r1, #0x0]
bl OSi_SetTimer
ldmia sp!, {r4-r8,lr}
bx lr
.balign 4
_020CD174: .word 0x021D37C0
arm_func_start OS_CreateAlarm
OS_CreateAlarm: ; 0x020CD178
mov r1, #0x0
str r1, [r0, #0x0]
str r1, [r0, #0x8]
bx lr
arm_func_start OS_IsAlarmAvailable
OS_IsAlarmAvailable: ; 0x020CD188
ldr r0, _020CD194 ; =0x021D37BC
ldrh r0, [r0, #0x0]
bx lr
.balign 4
_020CD194: .word 0x021D37BC
arm_func_start OS_InitAlarm
OS_InitAlarm: ; 0x020CD198
stmdb sp!, {lr}
sub sp, sp, #0x4
ldr r1, _020CD1E8 ; =0x021D37BC
ldrh r0, [r1, #0x0]
cmp r0, #0x0
addne sp, sp, #0x4
ldmneia sp!, {lr}
bxne lr
mov r0, #0x1
strh r0, [r1, #0x0]
bl OSi_SetTimerReserved
ldr r1, _020CD1EC ; =0x021D37C0
mov r2, #0x0
mov r0, #0x10
str r2, [r1, #0x0]
str r2, [r1, #0x4]
bl OS_DisableIrqMask
add sp, sp, #0x4
ldmia sp!, {lr}
bx lr
.balign 4
_020CD1E8: .word 0x021D37BC
_020CD1EC: .word 0x021D37C0
arm_func_start OSi_SetTimer
OSi_SetTimer: ; 0x020CD1F0
stmdb sp!, {r4-r5,lr}
sub sp, sp, #0x4
mov r4, r0
bl OS_GetTick
ldr r3, _020CD27C ; =0x04000106
mov r2, #0x0
strh r2, [r3, #0x0]
ldr r12, [r4, #0xc]
ldr r3, [r4, #0x10]
subs r5, r12, r0
sbc r4, r3, r1
ldr r1, _020CD280 ; =OSi_AlarmHandler
mov r0, #0x1
bl OSi_EnterTimerCallback
mov r2, #0x0
subs r0, r5, r2
sbcs r0, r4, r2
ldrlt r2, _020CD284 ; =0x0000FFFE
blt _020CD254
mov r0, #0x10000
subs r0, r5, r0
sbcs r0, r4, r2
mvnlt r0, r5
movlt r0, r0, lsl #0x10
movlt r2, r0, lsr #0x10
_020CD254:
ldr r0, _020CD288 ; =0x04000104
ldr r1, _020CD27C ; =0x04000106
strh r2, [r0, #0x0]
mov r2, #0xc1
mov r0, #0x10
strh r2, [r1, #0x0]
bl OS_EnableIrqMask
add sp, sp, #0x4
ldmia sp!, {r4-r5,lr}
bx lr
.balign 4
_020CD27C: .word 0x04000106
_020CD280: .word OSi_AlarmHandler
_020CD284: .word 0x0000FFFE
_020CD288: .word 0x04000104
arm_func_start OS_InitVAlarm
OS_InitVAlarm: ; 0x020CD28C
stmdb sp!, {lr}
sub sp, sp, #0x4
ldr r2, _020CD2EC ; =0x021D37C8
ldrh r0, [r2, #0x0]
cmp r0, #0x0
addne sp, sp, #0x4
ldmneia sp!, {lr}
bxne lr
ldr r1, _020CD2F0 ; =0x021D37D4
mov r3, #0x0
mov r12, #0x1
mov r0, #0x4
strh r12, [r2, #0x0]
str r3, [r1, #0x0]
str r3, [r1, #0x4]
bl OS_DisableIrqMask
ldr r1, _020CD2F4 ; =0x021D37D0
mov r2, #0x0
ldr r0, _020CD2F8 ; =0x021D37CC
str r2, [r1, #0x0]
str r2, [r0, #0x0]
add sp, sp, #0x4
ldmia sp!, {lr}
bx lr
.balign 4
_020CD2EC: .word 0x021D37C8
_020CD2F0: .word 0x021D37D4
_020CD2F4: .word 0x021D37D0
_020CD2F8: .word 0x021D37CC
arm_func_start OS_EnableInterrupts
OS_EnableInterrupts: ; 0x020CD2FC
mrs r0, cpsr
bic r1, r0, #0x80
msr cpsr_c, r1
and r0, r0, #0x80
bx lr
arm_func_start OS_DisableInterrupts
OS_DisableInterrupts:
mrs r0, cpsr
orr r1, r0, #0x80
msr cpsr_c, r1
and r0, r0, #0x80
bx lr
arm_func_start OS_RestoreInterrupts
OS_RestoreInterrupts:
mrs r1, cpsr
bic r2, r1, #0x80
orr r2, r2, r0
msr cpsr_c, r2
and r0, r1, #0x80
bx lr
arm_func_start OS_DisableInterrupts_IrqAndFiq
OS_DisableInterrupts_IrqAndFiq: ; 0x020CD33C
mrs r0, cpsr
orr r1, r0, #0xc0
msr cpsr_c, r1
and r0, r0, #0xc0
bx lr
arm_func_start OS_RestoreInterrupts_IrqAndFiq
OS_RestoreInterrupts_IrqAndFiq: ; 0x020CD350
mrs r1, cpsr
bic r2, r1, #0xc0
orr r2, r2, r0
msr cpsr_c, r2
and r0, r1, #0xc0
bx lr
arm_func_start OS_GetCpsrIrq
OS_GetCpsrIrq: ; 0x020CD368
mrs r0, cpsr
and r0, r0, #0x80
bx lr
arm_func_start OS_GetProcMode
OS_GetProcMode: ; 0x020CD374
mrs r0, cpsr
and r0, r0, #0x1f
bx lr
_020CD380:
subs r0, r0, #0x4
bhs _020CD380
bx lr
arm_func_start OS_WaitVBlankIntr
OS_WaitVBlankIntr: ; 0x020CD38C
stmdb sp!, {lr}
sub sp, sp, #0x4
mov r0, #0x1
blx FUN_020005F2
mov r0, #0x1
mov r1, r0
bl OS_WaitIrq
add sp, sp, #0x4
ldmia sp!, {lr}
bx lr
arm_func_start OS_ResetSystem
OS_ResetSystem: ; 0x020CD3B4
stmdb sp!, {r4,lr}
ldr r1, _020CD42C ; =0x027FFC40
mov r4, r0
ldrh r0, [r1, #0x0]
cmp r0, #0x2
bne _020CD3D0
bl OS_Terminate
_020CD3D0:
bl OS_GetLockID
mov r0, r0, lsl #0x10
mov r0, r0, lsr #0x10
bl CARD_LockRom
_020CD3E0:
mov r0, #0x0
bl MI_StopDma
mov r0, #0x1
bl MI_StopDma
mov r0, #0x2
bl MI_StopDma
mov r0, #0x3
bl MI_StopDma
mov r0, #0x40000
bl OS_SetIrqMask
mvn r0, #0x0
bl OS_ResetRequestIrqMask
ldr r1, _020CD430
mov r0, #0x10
str r4, [r1]
bl OSi_SendToPxi
bl FUN_01FF84A4
ldmia sp!, {r4, lr}
bx lr
_020CD42C: .word 0x027FFC40
_020CD430: .word 0x027FFC20
arm_func_start OSi_SendToPxi
OSi_SendToPxi: ; 0x020CD434
stmdb sp!, {r4-r6,lr}
mov r6, r0, lsl #0x8
mov r5, #0xc
mov r4, #0x0
_020CD444:
mov r0, r5
mov r1, r6
mov r2, r4
bl PXI_SendWordByFifo
_020CD454:
cmp r0, #0x0
bne _020CD444
ldmia sp!, {r4-r6, lr}
bx lr
arm_func_start OSi_CommonCallback
OSi_CommonCallback: ; 0x020CD464
stmdb sp!, {lr}
sub sp, sp, #0x4
and r0, r1, #0x7f00
mov r0, r0, lsl #0x8
mov r0, r0, lsr #0x10
cmp r0, #0x10
ldreq r0, _020CD4A4 ; =0x021D37E0
moveq r1, #0x1
streqh r1, [r0, #0x0]
addeq sp, sp, #0x4
ldmeqia sp!, {lr}
bxeq lr
bl OS_Terminate
add sp, sp, #0x4
ldmia sp!, {lr}
bx lr
.balign 4
_020CD4A4: .word 0x021D37E0
arm_func_start OS_InitReset
OS_InitReset: ; 0x020CD4A8
stmdb sp!, {r4-r5,lr}
sub sp, sp, #0x4
ldr r0, _020CD508 ; =0x021D37DC
ldrh r1, [r0, #0x0]
cmp r1, #0x0
addne sp, sp, #0x4
ldmneia sp!, {r4-r5,lr}
bxne lr
mov r1, #0x1
strh r1, [r0, #0x0]
bl PXI_Init
mov r5, #0xc
mov r4, #0x1
_020CD4DC:
mov r0, r5
mov r1, r4
bl PXI_IsCallbackReady
_020CD4E8:
cmp r0, #0x0
beq _020CD4DC
ldr r1, _020CD50C
mov r0, #0xC
bl PXI_SetFifoRecvCallback
add sp, sp, #0x4
ldmia sp!, {r4-r5, lr}
bx lr
_020CD508: .word 0x021D37DC
_020CD50C: .word 0x020CD464
arm_func_start OS_GetOwnerRtcOffset
OS_GetOwnerRtcOffset: ; 0x020CD510
ldr r1, _020CD520 ; =0x027FFC80
ldr r0, [r1, #0x68]
ldr r1, [r1, #0x6c]
bx lr
.balign 4
_020CD520: .word 0x027FFC80
arm_func_start OS_GetOwnerInfo
OS_GetOwnerInfo: ; 0x020CD524
stmdb sp!, {r4,lr}
ldr ip, _020CD59C ; =0x027FFC80
mov r4, r0
ldrh r2, [r12, #0x64]
add r0, r12, #0x6
add r1, r4, #0x4
mov r2, r2, lsl #0x1d
mov r2, r2, lsr #0x1d
strb r2, [r4, #0x0]
ldrb r3, [r12, #0x2]
mov r2, #0x14
mov r3, r3, lsl #0x1c
mov r3, r3, lsr #0x1c
strb r3, [r4, #0x1]
ldrb r3, [r12, #0x3]
strb r3, [r4, #0x2]
ldrb r3, [r12, #0x4]
strb r3, [r4, #0x3]
ldrb r3, [r12, #0x1a]
strh r3, [r4, #0x18]
ldrb r3, [r12, #0x50]
strh r3, [r4, #0x4e]
bl MIi_CpuCopy16
ldr r0, _020CD59C ; =0x027FFC80
add r1, r4, #0x1a
add r0, r0, #0x1c
mov r2, #0x34
bl MIi_CpuCopy16
ldmia sp!, {r4,lr}
bx lr
.balign 4
_020CD59C: .word 0x027FFC80
arm_func_start OS_GetMacAddress
OS_GetMacAddress: ; 0x020CD5A0
ldr ip, _020CD5B4 ; =MI_CpuCopy8
mov r1, r0
ldr r0, _020CD5B8 ; =0x027FFCF4
mov r2, #0x6
bx r12
.balign 4
_020CD5B4: .word MI_CpuCopy8
_020CD5B8: .word 0x027FFCF4
arm_func_start OsCountZeroBits
OsCountZeroBits: ; 0x020CD5BC
clz r0, r0
bx lr
arm_func_start OSi_UnlockVram
OSi_UnlockVram: ; 0x020CD5C4
stmdb sp!, {r4-r10,lr}
mov r5, r0
mov r10, r1
bl OS_DisableInterrupts
ldr r4, _020CD640 ; =0x021D37E4
ldr r1, _020CD644 ; =0x000001FF
ldr r2, [r4, #0x0]
mov r8, r0
and r0, r5, r2
and r9, r0, r1
ldr r6, _020CD648 ; =0x021D37E8
mov r7, #0x1
mov r5, #0x0
_020CD5F8:
mov r0, r9
bl OsCountZeroBits
rsbs r2, r0, #0x1f
bmi _020CD630
mov r1, r2, lsl #0x1
ldrh r0, [r6, r1]
mvn r2, r7, lsl r2
cmp r10, r0
ldreq r0, [r4, #0x0]
and r9, r9, r2
andeq r0, r0, r2
streqh r5, [r6, r1]
streq r0, [r4, #0x0]
b _020CD5F8
_020CD630:
mov r0, r8
bl OS_RestoreInterrupts
ldmia sp!, {r4-r10,lr}
bx lr
.balign 4
_020CD640: .word 0x021D37E4
_020CD644: .word 0x000001FF
_020CD648: .word 0x021D37E8
arm_func_start OSi_TryLockVram
OSi_TryLockVram: ; 0x020CD64C
stmdb sp!, {r4-r9,lr}
sub sp, sp, #0x4
mov r6, r0
mov r8, r1
bl OS_DisableInterrupts
ldr r1, _020CD714 ; =0x021D37E4
mov r7, r0
ldr r0, [r1, #0x0]
and r5, r6, r0
ldr sb, _020CD718 ; =0x021D37E8
mov r4, #0x1
_020CD678:
mov r0, r5
bl OsCountZeroBits
rsbs r1, r0, #0x1f
bmi _020CD6B8
mov r0, r1, lsl #0x1
ldrh r0, [r9, r0]
mvn r1, r4, lsl r1
cmp r8, r0
and r5, r5, r1
beq _020CD678
mov r0, r7
bl OS_RestoreInterrupts
add sp, sp, #0x4
mov r0, #0x0
ldmia sp!, {r4-r9,lr}
bx lr
_020CD6B8:
ldr r0, _020CD71C ; =0x000001FF
and r6, r6, r0
ldr r4, _020CD718 ; =0x021D37E8
ldr sb, _020CD714 ; =0x021D37E4
mov r5, #0x1
_020CD6CC:
mov r0, r6
bl OsCountZeroBits
rsbs r1, r0, #0x1f
bmi _020CD6FC
ldr r0, [r9, #0x0]
mvn r2, r5, lsl r1
orr r0, r0, r5, lsl r1
mov r1, r1, lsl #0x1
strh r8, [r4, r1]
str r0, [r9, #0x0]
and r6, r6, r2
b _020CD6CC
_020CD6FC:
mov r0, r7
bl OS_RestoreInterrupts
mov r0, #0x1
add sp, sp, #0x4
ldmia sp!, {r4-r9,lr}
bx lr
.balign 4
_020CD714: .word 0x021D37E4
_020CD718: .word 0x021D37E8
_020CD71C: .word 0x000001FF
arm_func_start OSi_InitVramExclusive
OSi_InitVramExclusive: ; 0x020CD720
ldr r0, _020CD74C ; =0x021D37E4
mov r3, #0x0
str r3, [r0, #0x0]
ldr r0, _020CD750 ; =0x021D37E8
mov r2, r3
_020CD734:
mov r1, r3, lsl #0x1
add r3, r3, #0x1
strh r2, [r0, r1]
cmp r3, #0x9
blt _020CD734
bx lr
.balign 4
_020CD74C: .word 0x021D37E4
_020CD750: .word 0x021D37E8
arm_func_start OS_GetLowEntropyData
OS_GetLowEntropyData: ; 0x020CD754
stmdb sp!, {r4-r7,lr}
sub sp, sp, #0x4
ldr r1, _020CD82C ; =0x04000006
ldr r2, _020CD830 ; =0x027FFC00
ldrh r7, [r1, #0x0]
add r4, r2, #0x80
mov r6, r0
add r5, r4, #0x74
bl OS_GetTickLo
orr r0, r0, r7, lsl #0x10
str r0, [r6, #0x0]
ldr r1, _020CD834 ; =0x021D37B4
ldr r0, _020CD830 ; =0x027FFC00
ldr r3, [r1, #0x0]
ldrh r5, [r5, #0x4]
ldr r2, [r1, #0x4]
ldr r2, _020CD838 ; =0x04000600
eor r3, r3, r5, lsl #0x10
str r3, [r6, #0x4]
ldr r3, [r1, #0x0]
ldr r3, [r1, #0x4]
ldr r1, [r4, #0x74]
ldr r4, [r0, #0x3c]
eor r1, r3, r1
eor r1, r4, r1
str r1, [r6, #0x8]
ldr r3, [r6, #0x8]
ldr r2, [r2, #0x0]
add r1, r0, #0x300
eor r2, r3, r2
str r2, [r6, #0x8]
ldr r2, [r0, #0x1e8]
ldr r3, _020CD83C ; =0x04000130
str r2, [r6, #0xc]
ldr r4, [r0, #0x1ec]
ldr r2, _020CD840 ; =0x027FFFA8
str r4, [r6, #0x10]
ldrh r4, [r1, #0x94]
ldr r0, [r0, #0x390]
eor r0, r0, r4, lsl #0x10
str r0, [r6, #0x14]
ldrh r4, [r1, #0xaa]
ldrh r0, [r1, #0xac]
orr r0, r0, r4, lsl #0x10
str r0, [r6, #0x18]
ldrh r3, [r3, #0x0]
ldrh r0, [r2, #0x0]
ldrh r1, [r1, #0x98]
orr r0, r3, r0
orr r0, r0, r1, lsl #0x10
str r0, [r6, #0x1c]
add sp, sp, #0x4
ldmia sp!, {r4-r7,lr}
bx lr
.balign 4
_020CD82C: .word 0x04000006
_020CD830: .word 0x027FFC00
_020CD834: .word 0x021D37B4
_020CD838: .word 0x04000600
_020CD83C: .word 0x04000130
_020CD840: .word 0x027FFFA8
arm_func_start OS_Halt
OS_Halt: ; 0x020CD844
mov r0, #0x0
mcr p15, 0x0, r0, c7, c0, 0x4
bx lr
arm_func_start OS_Terminate
OS_Terminate: ; 0x020CD850
stmdb sp!, {lr}
sub sp, sp, #0x4
_020CD858:
bl OS_DisableInterrupts
bl OS_Halt
b _020CD858
arm_func_start MI_SetWramBank
MI_SetWramBank:
ldr r1, _020CD870 ; =0x04000247
strb r0, [r1, #0x0]
bx lr
.balign 4
_020CD870: .word 0x04000247
arm_func_start MIi_CheckDma0SourceAddress
MIi_CheckDma0SourceAddress:
stmdb sp!, {lr}
sub sp, sp, #0x4
cmp r0, #0x0
addne sp, sp, #0x4
ldmneia sp!, {lr}
bxne lr
cmp r3, #0x0
and r0, r1, #0xff000000
beq _020CD8A4
cmp r3, #0x800000
subeq r1, r1, r2
b _020CD8A8
_020CD8A4:
add r1, r1, r2
_020CD8A8:
cmp r0, #0x4000000
beq _020CD8D4
cmp r0, #0x8000000
bhs _020CD8D4
and r0, r1, #0xff000000
cmp r0, #0x4000000
beq _020CD8D4
cmp r0, #0x8000000
addcc sp, sp, #0x4
ldmccia sp!, {lr}
bxcc lr
_020CD8D4:
bl OS_Terminate
add sp, sp, #0x4
ldmia sp!, {lr}
bx lr
arm_func_start MIi_CheckAnotherAutoDMA
MIi_CheckAnotherAutoDMA: ; 0x020CD8E4
stmdb sp!, {r4-r7,lr}
sub sp, sp, #0x4
ldr r4, _020CD994 ; =0x040000B8
mov r7, r0
mov r6, r1
mov r5, #0x0
_020CD8FC:
cmp r5, r7
beq _020CD978
ldr r1, [r4, #0x0]
ands r0, r1, #0x80000000
beq _020CD978
and r0, r1, #0x38000000
cmp r0, r6
beq _020CD978
cmp r0, #0x8000000
bne _020CD92C
cmp r6, #0x10000000
beq _020CD978
_020CD92C:
cmp r0, #0x10000000
bne _020CD93C
cmp r6, #0x8000000
beq _020CD978
_020CD93C:
cmp r0, #0x18000000
beq _020CD974
cmp r0, #0x20000000
beq _020CD974
cmp r0, #0x28000000
beq _020CD974
cmp r0, #0x30000000
beq _020CD974
cmp r0, #0x38000000
beq _020CD974
cmp r0, #0x8000000
beq _020CD974
cmp r0, #0x10000000
bne _020CD978
_020CD974:
bl OS_Terminate
_020CD978:
add r5, r5, #0x1
cmp r5, #0x3
add r4, r4, #0xc
blt _020CD8FC
add sp, sp, #0x4
ldmia sp!, {r4-r7,lr}
bx lr
.balign 4
_020CD994: .word 0x040000B8
arm_func_start MI_StopDma
MI_StopDma: ; 0x020CD998
stmdb sp!, {r4,lr}
mov r4, r0
bl OS_DisableInterrupts
mov r1, #0x6
mul r1, r4, r1
add r1, r1, #0x5
mov r1, r1, lsl #0x1
add r1, r1, #0x4000000
ldrh r2, [r1, #0xb0]
cmp r4, #0x0
bic r2, r2, #0x3a00
strh r2, [r1, #0xb0]
ldrh r2, [r1, #0xb0]
bic r2, r2, #0x8000
strh r2, [r1, #0xb0]
ldrh r2, [r1, #0xb0]
ldrh r1, [r1, #0xb0]
bne _020CDA08
mov r1, #0xc
mul r12, r4, r1
ldr r1, _020CDA14 ; =0x040000B0
add r2, r12, #0x4000000
mov r3, #0x0
str r3, [r2, #0xb0]
add r2, r12, r1
ldr r1, _020CDA18 ; =0x81400001
str r3, [r2, #0x4]
str r1, [r2, #0x8]
_020CDA08:
bl OS_RestoreInterrupts
ldmia sp!, {r4,lr}
bx lr
.balign 4
_020CDA14: .word 0x040000B0
_020CDA18: .word 0x81400001
arm_func_start MI_WaitDma
MI_WaitDma:
stmdb sp!, {r4,lr}
mov r4, r0
bl OS_DisableInterrupts
mov r1, #0x3
mul r2, r4, r1
ldr r1, _020CDA84 ; =0x040000B0
add r2, r2, #0x2
add r2, r1, r2, lsl #0x2
_020CDA3C:
ldr r1, [r2, #0x0]
ands r1, r1, #0x80000000
bne _020CDA3C
cmp r4, #0x0
bne _020CDA78
mov r1, #0xc
mul r12, r4, r1
ldr r1, _020CDA84 ; =0x040000B0
add r2, r12, #0x4000000
mov r3, #0x0
str r3, [r2, #0xb0]
add r2, r12, r1
ldr r1, _020CDA88 ; =0x81400001
str r3, [r2, #0x4]
str r1, [r2, #0x8]
_020CDA78:
bl OS_RestoreInterrupts
ldmia sp!, {r4,lr}
bx lr
.balign 4
_020CDA84: .word 0x040000B0
_020CDA88: .word 0x81400001
arm_func_start MI_DmaCopy32Async
MI_DmaCopy32Async: ; 0x020CDA8C
stmdb sp!, {r4-r8,lr}
mov r5, r3
mov r6, r2
mov r2, r5
mov r3, #0x0
mov r8, r0
mov r7, r1
ldr r4, [sp, #0x18]
bl MIi_CheckDma0SourceAddress
_020CDAB0:
cmp r5, #0x0
bne _020CDAD4
cmp r4, #0x0
ldmeqia sp!, {r4-r8, lr}
bxeq lr
ldr r0, [sp, #0x1C]
blx r4
ldmia sp!, {r4-r8, lr}
bx lr
_020CDAD4:
mov r0, r8
bl MI_WaitDma
cmp r4, #0x0
beq _020CDB14
ldr r2, [sp, #0x1C]
mov r0, r8
mov r1, r4
bl OSi_EnterDmaCallback
mov r3, r5, lsr #0x2
mov r0, r8
mov r1, r7
mov r2, r6
orr r3, r3, #0xc4000000
bl FUN_01FF85F0
ldmia sp!, {r4-r8, lr}
bx lr
_020CDB14:
mov r3, r5, lsr #0x2
mov r0, r8
mov r1, r7
mov r2, r6
orr r3, r3, #0x84000000
bl FUN_01FF85F0
ldmia sp!, {r4-r8, lr}
bx lr
arm_func_start MI_DmaFill32Async
MI_DmaFill32Async: ; 0x020CDB34
stmdb sp!, {r4-r8,lr}
movs r4, r3
mov r7, r0
mov r6, r1
mov r5, r2
ldr r8, [sp, #0x18]
bne _020CDB6C
cmp r8, #0x0
ldmeqia sp!, {r4-r8,lr}
bxeq lr
ldr r0, [sp, #0x1c]
blx r8
ldmia sp!, {r4-r8,lr}
bx lr
_020CDB6C:
bl MI_WaitDma
_020CDB70:
cmp r8, #0x0
beq _020CDBC8
ldr r2, [sp, #0x1C]
mov r0, r7
mov r1, r8
bl OSi_EnterDmaCallback
bl OS_DisableInterrupts
mov r3, r4, lsr #2
ldr r1, _20CDC08
mov r2, r7, lsl #2
add r2, r2, #0x4000000
str r5, [r2, #0xE0]
mov r4, r0
add r1, r1, r7, lsl #0x2
mov r0, r7
mov r2, r6
orr r3, r3, #0xc5000000
bl FUN_01FF8544
mov r0, r4
bl OS_RestoreInterrupts
ldmia sp!, {r4-r8,lr}
bx lr
_020CDBC8:
bl OS_DisableInterrupts
ldr r1, _20CDC08
mov r2, r7, lsl #0x2
mov r3, r4, lsr #0x2
mov r4, r0
add ip, r2, #0x4000000
mov r0, r7
mov r2, r6
add r1, r1, r7, lsl #0x2
orr r3, r3, #0x85000000
str r5, [ip, #0xE0]
bl FUN_01FF8544
mov r0, r4
bl OS_RestoreInterrupts
ldmia sp!, {r4-r8,lr}
bx lr
_20CDC08: .word 0x040000E0
arm_func_start MI_DmaCopy16
MI_DmaCopy16: ; 0x020CDC0C
stmdb sp!, {r4-r8,lr}
movs r5, r3
mov r8, r0
mov r7, r1
mov r6, r2
ldmeqia sp!, {r4-r8,lr}
bxeq lr
mov r2, r5
mov r3, #0x0
bl MIi_CheckDma0SourceAddress
mov r0, #0x3
mul r1, r8, r0
ldr r0, _020CDC80 ; =0x040000B0
add r1, r1, #0x2
add r4, r0, r1, lsl #0x2
_020CDC48:
ldr r0, [r4, #0x0]
ands r0, r0, #0x80000000
bne _020CDC48
mov r3, r5, lsr #0x1
mov r0, r8
mov r1, r7
mov r2, r6
orr r3, r3, #0x80000000
bl FUN_01FF857C
_020CDC6C:
ldr r0, [r4]
ands r0, r0, #0x80000000
bne _020CDC6C
ldmia sp!, {r4-r8,lr}
bx lr
_020CDC80: .word 0x040000B0
arm_func_start MI_DmaCopy32
MI_DmaCopy32: ; 0x020CDC84
stmdb sp!, {r4-r8,lr}
mov r5, r3
mov r6, r2
mov r2, r5
mov r3, #0x0
mov r8, r0
mov r7, r1
bl MIi_CheckDma0SourceAddress
_020CDCA4:
cmp r5, #0x0
ldmeqia sp!, {r4-r8,lr}
bxeq lr
mov r0, #0x3
mul r1, r8, r0
ldr r0, _020CDCFC
add r1, r1, #0x2
add r4, r0, r1, lsl #0x2
_020CDCC4:
ldr r0, [r4]
ands r0, r0, #0x80000000
bne _020CDCC4
mov r3, r5, lsr #0x2
mov r0, r8
mov r1, r7
mov r2, r6
orr r3, r3, #0x84000000
bl FUN_01FF857C
_020CDCE8:
ldr r0, [r4]
ands r0, r0, #0x80000000
bne _020CDCE8
ldmia sp!, {r4-r8,lr}
bx lr
_020CDCFC: .word 0x040000B0
arm_func_start MI_DmaFill32
MI_DmaFill32: ; 0x020CDD00
stmdb sp!, {r4-r8,lr}
movs r4, r3
mov r8, r0
mov r7, r1
mov r6, r2
ldmeqia sp!, {r4-r8,lr}
bxeq lr
mov r0, #0x3
mul r1, r8, r0
ldr r0, _020CDD88 ; =0x040000B0
add r1, r1, #0x2
add r5, r0, r1, lsl #0x2
_020CDD30:
ldr r0, [r5, #0x0]
ands r0, r0, #0x80000000
bne _020CDD30
bl OS_DisableInterrupts
ldr r1, _020CDD8C ; =0x040000E0
mov r2, r8, lsl #0x2
mov r3, r4, lsr #0x2
mov r4, r0
add r12, r2, #0x4000000
mov r0, r8
mov r2, r7
add r1, r1, r8, lsl #0x2
orr r3, r3, #0x85000000
str r6, [r12, #0xe0]
bl FUN_01FF84E4
mov r0, r4
bl OS_RestoreInterrupts
_020CDD74:
ldr r0, [r5]
ands r0, r0, #0x80000000
bne _020CDD74
ldmia sp!, {r4-r8,lr}
bx lr
_020CDD88: .word 0x040000B0
_020CDD8C: .word 0x040000E0
arm_func_start MI_HBlankDmaCopy16
MI_HBlankDmaCopy16: ; 0x020CDD90
stmdb sp!, {r4-r7,lr}
sub sp, sp, #0x4
mov r6, r1
mov r7, r0
mov r4, r3
mov r1, #0x10000000
mov r5, r2
bl MIi_CheckAnotherAutoDMA
mov r0, r7
mov r1, r6
mov r2, r4
mov r3, #0x0
bl MIi_CheckDma0SourceAddress
_020CDDC4:
cmp r4, #0x0
addeq sp, sp, #0x4
ldmeqia sp!, {r4-r7, lr}
bxeq lr
mov r0, r7
bl MI_WaitDma
ldr r3, _020CDE00
mov r0, r7
mov r1, r6
mov r2, r5
orr r3, r3, r4, lsr #0x1
bl FUN_01FF85F0
add sp, sp, #0x4
ldmia sp!, {r4-r7,lr}
bx lr
_020CDE00: .word 0x92600000
arm_func_start MI_HBlankDmaCopy32
MI_HBlankDmaCopy32: ; 0x020CDE04
stmdb sp!, {r4-r7,lr}
sub sp, sp, #0x4
mov r6, r1
mov r7, r0
mov r4, r3
mov r1, #0x10000000
mov r5, r2
bl MIi_CheckAnotherAutoDMA
mov r0, r7
mov r1, r6
mov r2, r4
mov r3, #0x0
bl MIi_CheckDma0SourceAddress
_020CDE38:
cmp r4, #0x0
addeq sp, sp, #0x4
ldmeqia sp!, {r4-r7,lr}
bxeq lr
mov r0, r7
bl MI_WaitDma
ldr r3, _020CDE74
mov r0, r7
mov r1, r6
mov r2, r5
orr r3, r3, r4, lsr #0x2
bl FUN_01FF85F0
add sp, sp, #0x4
ldmia sp!, {r4-r7,lr}
bx lr
_020CDE74: .word 0x96600000
arm_func_start MIi_DMAFastCallback
MIi_DMAFastCallback: ; 0x020CDE78
stmdb sp!, {lr}
sub sp, sp, #0x4
ldr r0, _020CDEB4 ; =0x021D37FC
mov r2, #0x0
ldr r1, [r0, #0x10]
str r2, [r0, #0x0]
cmp r1, #0x0
addeq sp, sp, #0x4
ldr r0, [r0, #0x14]
ldmeqia sp!, {lr}
bxeq lr
blx r1
add sp, sp, #0x4
ldmia sp!, {lr}
bx lr
.balign 4
_020CDEB4: .word 0x021D37FC
arm_func_start MI_SendGXCommandAsyncFast
MI_SendGXCommandAsyncFast: ; 0x020CDEB8
stmdb sp!, {r4-r6,lr}
movs r4, r2
mov r6, r0
mov r5, r1
bne _020CDEE8
cmp r3, #0x0
ldmeqia sp!, {r4-r6,lr}
bxeq lr
ldr r0, [sp, #0x10]
blx r3
ldmia sp!, {r4-r6,lr}
bx lr
_020CDEE8:
ldr r2, _020CDF6C ; =0x021D37FC
ldr r0, [r2, #0x0]
cmp r0, #0x0
bne _020CDEE8
ldr r12, [sp, #0x10]
mov lr, #0x1
mov r0, r6
mov r1, #0x38000000
str lr, [r2, #0x0]
str r6, [r2, #0x4]
str r3, [r2, #0x10]
str r12, [r2, #0x14]
bl MIi_CheckAnotherAutoDMA
mov r0, r6
mov r1, r5
mov r2, r4
mov r3, #0x0
bl MIi_CheckDma0SourceAddress
mov r0, r6
bl MI_WaitDma
mov r0, r6
ldr r1, _020CDF70 ; =MIi_DMAFastCallback
mov r2, #0x0
bl OSi_EnterDmaCallback
mov r0, r6
mov r1, r5
ldr r2, _020CDF74 ; =0x04000400
mov r3, #0x3c00000
rsb r3, r3, #0x0
orr r3, r3, r4, lsr #0x2
bl FUN_01FF85F0
ldmia sp!, {r4-r6,lr}
bx lr
.balign 4
_020CDF6C: .word 0x021D37FC
_020CDF70: .word MIi_DMAFastCallback
_020CDF74: .word 0x04000400
arm_func_start MIi_DMACallback
MIi_DMACallback: ; 0x020CDF78
stmdb sp!, {lr}
sub sp, sp, #0x4
mov r0, #0x200000
bl OS_DisableIrqMask
ldr r2, _020CDFE4 ; =0x04000600
ldr r0, _020CDFE8 ; =0x021D37FC
ldr r1, [r2, #0x0]
ldr r3, [r0, #0x18]
bic r1, r1, #0xc0000000
orr r1, r1, r3, lsl #0x1e
str r1, [r2, #0x0]
ldr r1, [r0, #0x1c]
mov r0, #0x200000
bl OS_SetIrqFunction
ldr r0, _020CDFE8 ; =0x021D37FC
mov r2, #0x0
ldr r1, [r0, #0x10]
str r2, [r0, #0x0]
cmp r1, #0x0
addeq sp, sp, #0x4
ldr r0, [r0, #0x14]
ldmeqia sp!, {lr}
bxeq lr
blx r1
add sp, sp, #0x4
ldmia sp!, {lr}
bx lr
.balign 4
_020CDFE4: .word 0x04000600
_020CDFE8: .word 0x021D37FC
arm_func_start MIi_FIFOCallback
MIi_FIFOCallback: ; 0x020CDFEC
stmdb sp!, {r4-r5,lr}
sub sp, sp, #0x4
ldr r0, _020CE0A4 ; =0x021D37FC
ldr r4, [r0, #0xc]
cmp r4, #0x0
addeq sp, sp, #0x4
ldmeqia sp!, {r4-r5,lr}
bxeq lr
ldr r0, _020CE0A4 ; =0x021D37FC
cmp r4, #0x1d8
ldr r5, [r0, #0x8]
movcs r4, #0x1d8
ldr r2, [r0, #0xc]
add r1, r5, r4
subs r2, r2, r4
str r2, [r0, #0xc]
str r1, [r0, #0x8]
bne _020CE078
ldr r0, [r0, #0x4]
ldr r1, _020CE0A8 ; =MIi_DMACallback
mov r2, #0x0
bl OSi_EnterDmaCallback
mov r0, #0x3bc00000
rsb r3, r0, #0x0
ldr r1, _020CE0A4 ; =0x021D37FC
ldr r2, _020CE0AC ; =0x04000400
ldr r0, [r1, #0x4]
mov r1, r5
orr r3, r3, r4, lsr #0x2
bl FUN_01FF85F0
mov r0, #0x200000
bl OS_ResetRequestIrqMask
add sp, sp, #0x4
ldmia sp!, {r4-r5,lr}
bx lr
_020CE078:
ldr r3, _020CE0B0 ; =0x84400000
ldr r0, [r0, #0x4]
ldr r2, _020CE0AC ; =0x04000400
mov r1, r5
orr r3, r3, r4, lsr #0x2
bl FUN_01FF85F0
mov r0, #0x200000
bl OS_ResetRequestIrqMask
add sp, sp, #0x4
ldmia sp!, {r4-r5,lr}
bx lr
.balign 4
_020CE0A4: .word 0x021D37FC
_020CE0A8: .word MIi_DMACallback
_020CE0AC: .word 0x04000400
_020CE0B0: .word 0x84400000
arm_func_start MI_SendGXCommandAsync
MI_SendGXCommandAsync: ; 0x020CE0B4
stmdb sp!, {r4-r5,lr}
sub sp, sp, #0x4
mov r4, r0
cmp r2, #0x0
bne _020CE0EC
cmp r3, #0x0
addeq sp, sp, #0x4
ldmeqia sp!, {r4-r5,lr}
bxeq lr
ldr r0, [sp, #0x10]
blx r3
add sp, sp, #0x4
ldmia sp!, {r4-r5,lr}
bx lr
_020CE0EC:
ldr r0, _020CE1BC ; =0x021D37FC
ldr r0, [r0, #0x0]
cmp r0, #0x0
bne _020CE0EC
ldr r5, _020CE1C0 ; =0x04000600
_020CE100:
ldr r0, [r5, #0x0]
and r0, r0, #0x7000000
mov r0, r0, lsr #0x18
ands r0, r0, #0x2
beq _020CE100
ldr ip, _020CE1BC ; =0x021D37FC
ldr lr, [sp, #0x10]
str r3, [r12, #0x10]
mov r5, #0x1
mov r0, r4
mov r3, #0x0
str r5, [r12, #0x0]
str r4, [r12, #0x4]
str r1, [r12, #0x8]
str r2, [r12, #0xc]
str lr, [r12, #0x14]
bl MIi_CheckDma0SourceAddress
mov r0, r4
bl MI_WaitDma
bl OS_DisableInterrupts
ldr r1, _020CE1C0 ; =0x04000600
mov r4, r0
ldr r0, [r1, #0x0]
ldr r1, _020CE1BC ; =0x021D37FC
and r0, r0, #0xc0000000
mov r2, r0, lsr #0x1e
mov r0, #0x200000
str r2, [r1, #0x18]
bl OS_GetIrqFunction
ldr r1, _020CE1BC ; =0x021D37FC
ldr r2, _020CE1C0 ; =0x04000600
str r0, [r1, #0x1c]
ldr r0, [r2, #0x0]
ldr r1, _020CE1C4 ; =MIi_FIFOCallback
bic r0, r0, #0xc0000000
orr r3, r0, #0x40000000
mov r0, #0x200000
str r3, [r2, #0x0]
bl OS_SetIrqFunction
mov r0, #0x200000
bl OS_EnableIrqMask
bl MIi_FIFOCallback
mov r0, r4
bl OS_RestoreInterrupts
add sp, sp, #0x4
ldmia sp!, {r4-r5,lr}
bx lr
.balign 4
_020CE1BC: .word 0x021D37FC
_020CE1C0: .word 0x04000600
_020CE1C4: .word MIi_FIFOCallback
arm_func_start MIi_CpuClear16
MIi_CpuClear16: ; 0x020CE1C8
mov r3, #0x0
_020CE1CC:
cmp r3, r2
strlth r0, [r1, r3]
addlt r3, r3, #0x2
blt _020CE1CC
bx lr
arm_func_start MIi_CpuCopy16
MIi_CpuCopy16: ; 0x020CE1E0
mov r12, #0x0
_020CE1E4:
cmp r12, r2
ldrlth r3, [r0, r12]
strlth r3, [r1, r12]
addlt r12, r12, #0x2
blt _020CE1E4
bx lr
arm_func_start MIi_CpuClear32
MIi_CpuClear32: ; 0x020CE1FC
add r12, r1, r2
_020CE200:
cmp r1, r12
stmltia r1!, {r0}
blt _020CE200
bx lr
arm_func_start MIi_CpuCopy32
MIi_CpuCopy32: ; 0x020CE210
add r12, r1, r2
_020CE214:
cmp r1, r12
ldmltia r0!, {r2}
stmltia r1!, {r2}
blt _020CE214
bx lr
arm_func_start MIi_CpuSend32
MIi_CpuSend32: ; 0x020CE228
add r12, r0, r2
_020CE22C:
cmp r0, r12
ldmltia r0!, {r2}
strlt r2, [r1, #0x0]
blt _020CE22C
bx lr
arm_func_start MIi_CpuClearFast
MIi_CpuClearFast: ; 0x020CE240
stmdb sp!, {r4-r9}
add r9, r1, r2
mov r12, r2, lsr #0x5
add r12, r1, r12, lsl #0x5
mov r2, r0
mov r3, r2
mov r4, r2
mov r5, r2
mov r6, r2
mov r7, r2
mov r8, r2
_020CE26C:
cmp r1, r12
stmltia r1!, {r0,r2-r8}
blt _020CE26C
_020CE278:
cmp r1, r9
stmltia r1!, {r0}
blt _020CE278
ldmia sp!, {r4-r9}
bx lr
arm_func_start MIi_CpuCopyFast
MIi_CpuCopyFast: ; 0x020CE28C
stmdb sp!, {r4-r10}
add r10, r1, r2
mov r12, r2, lsr #0x5
add r12, r1, r12, lsl #0x5
_020CE29C:
cmp r1, r12
ldmltia r0!, {r2-r9}
stmltia r1!, {r2-r9}
blt _020CE29C
_020CE2AC:
cmp r1, r10
ldmltia r0!, {r2}
stmltia r1!, {r2}
blt _020CE2AC
ldmia sp!, {r4-r10}
bx lr
arm_func_start FUN_020CE2C4
FUN_020CE2C4:
ldmia r0!, {r2, r3, ip}
stmia r1!, {r2, r3, ip}
ldmia r0!, {r2, r3, ip}
stmia r1!, {r2, r3, ip}
ldmia r0!, {r2, r3}
stmia r1!, {r2, r3}
bx lr
arm_func_start MI_Copy36B
MI_Copy36B: ; 0x020CE2E0
ldmia r0!, {r2-r3,r12}
stmia r1!, {r2-r3,r12}
ldmia r0!, {r2-r3,r12}
stmia r1!, {r2-r3,r12}
ldmia r0!, {r2-r3,r12}
stmia r1!, {r2-r3,r12}
bx lr
arm_func_start MI_Copy48B
MI_Copy48B: ; 0x020CE2FC
ldmia r0!, {r2-r3,r12}
stmia r1!, {r2-r3,r12}
ldmia r0!, {r2-r3,r12}
stmia r1!, {r2-r3,r12}
ldmia r0!, {r2-r3,r12}
stmia r1!, {r2-r3,r12}
ldmia r0!, {r2-r3,r12}
stmia r1!, {r2-r3,r12}
bx lr
arm_func_start MI_Copy64B
MI_Copy64B: ; 0x020CE320
ldmia r0!, {r2-r3,r12}
stmia r1!, {r2-r3,r12}
ldmia r0!, {r2-r3,r12}
stmia r1!, {r2-r3,r12}
ldmia r0!, {r2-r3,r12}
stmia r1!, {r2-r3,r12}
ldmia r0!, {r2-r3,r12}
stmia r1!, {r2-r3,r12}
ldmia r0, {r0,r2-r3,r12}
stmia r1!, {r0,r2-r3,r12}
bx lr
arm_func_start MI_CpuFill8
MI_CpuFill8: ; 0x020CE34C
cmp r2, #0x0
bxeq lr
tst r0, #0x1
beq _020CE378
ldrh r12, [r0, #-0x1]
and r12, r12, #0xff
orr r3, r12, r1, lsl #0x8
strh r3, [r0, #-0x1]
add r0, r0, #0x1
subs r2, r2, #0x1
bxeq lr
_020CE378:
cmp r2, #0x2
blo _020CE3C0
orr r1, r1, r1, lsl #0x8
tst r0, #0x2
beq _020CE398
strh r1, [r0], #0x2
subs r2, r2, #0x2
bxeq lr
_020CE398:
orr r1, r1, r1, lsl #0x10
bics r3, r2, #0x3
beq _020CE3B8
sub r2, r2, r3
add r12, r3, r0
_020CE3AC:
str r1, [r0], #0x4
cmp r0, r12
blo _020CE3AC
_020CE3B8:
tst r2, #0x2
strneh r1, [r0], #0x2
_020CE3C0:
tst r2, #0x1
bxeq lr
ldrh r3, [r0, #0x0]
and r3, r3, #0xff00
and r1, r1, #0xff
orr r1, r1, r3
strh r1, [r0, #0x0]
bx lr
arm_func_start MI_CpuCopy8
MI_CpuCopy8:
cmp r2, #0x0
bxeq lr
tst r1, #0x1
beq _020CE420
ldrh r12, [r1, #-0x1]
and r12, r12, #0xff
tst r0, #0x1
ldrneh r3, [r0, #-0x1]
movne r3, r3, lsr #0x8
ldreqh r3, [r0, #0x0]
orr r3, r12, r3, lsl #0x8
strh r3, [r1, #-0x1]
add r0, r0, #0x1
add r1, r1, #0x1
subs r2, r2, #0x1
bxeq lr
_020CE420:
eor r12, r1, r0
tst r12, #0x1
beq _020CE474
bic r0, r0, #0x1
ldrh r12, [r0], #0x2
mov r3, r12, lsr #0x8
subs r2, r2, #0x2
blo _020CE458
_020CE440:
ldrh r12, [r0], #0x2
orr r12, r3, r12, lsl #0x8
strh r12, [r1], #0x2
mov r3, r12, lsr #0x10
subs r2, r2, #0x2
bhs _020CE440
_020CE458:
tst r2, #0x1
bxeq lr
ldrh r12, [r1, #0x0]
and r12, r12, #0xff00
orr r12, r12, r3
strh r12, [r1, #0x0]
bx lr
_020CE474:
tst r12, #0x2
beq _020CE4A0
bics r3, r2, #0x1
beq _020CE4EC
sub r2, r2, r3
add r12, r3, r1
_020CE48C:
ldrh r3, [r0], #0x2
strh r3, [r1], #0x2
cmp r1, r12
blo _020CE48C
b _020CE4EC
_020CE4A0:
cmp r2, #0x2
blo _020CE4EC
tst r1, #0x2
beq _020CE4C0
ldrh r3, [r0], #0x2
strh r3, [r1], #0x2
subs r2, r2, #0x2
bxeq lr
_020CE4C0:
bics r3, r2, #0x3
beq _020CE4E0
sub r2, r2, r3
add r12, r3, r1
_020CE4D0:
ldr r3, [r0], #0x4
str r3, [r1], #0x4
cmp r1, r12
blo _020CE4D0
_020CE4E0:
tst r2, #0x2
ldrneh r3, [r0], #0x2
strneh r3, [r1], #0x2
_020CE4EC:
tst r2, #0x1
bxeq lr
ldrh r2, [r1, #0x0]
ldrh r0, [r0, #0x0]
and r2, r2, #0xff00
and r0, r0, #0xff
orr r0, r2, r0
strh r0, [r1, #0x0]
bx lr
thumb_func_start MI_Zero36B
MI_Zero36B: ; 0x020CE510
mov r1, #0x0
mov r2, #0x0
mov r3, #0x0
stmia r0!, {r1-r3}
stmia r0!, {r1-r3}
stmia r0!, {r1-r3}
bx lr
arm_func_start MI_SwapWord
MI_SwapWord: ; 0x020CE520
swp r0, r0, [r1]
bx lr
arm_func_start MI_UncompressLZ8
MI_UncompressLZ8: ; 0x020CE528
stmdb sp!, {r4-r6,lr}
ldr r5, [r0], #0x4
mov r2, r5, lsr #0x8
_020CE534:
cmp r2, #0x0
ble _020CE5B4
ldrb lr, [r0], #0x1
mov r4, #0x8
_020CE544:
subs r4, r4, #0x1
blt _020CE534
tst lr, #0x80
bne _020CE568
ldrb r6, [r0], #0x1
.word 0xE1416096
add r1, r1, #0x1
sub r2, r2, #0x1
b _020CE5A4
_020CE568:
ldrb r5, [r0, #0x0]
mov r6, #0x3
add r3, r6, r5, asr #0x4
ldrb r6, [r0], #0x1
and r5, r6, #0xf
mov r12, r5, lsl #0x8
ldrb r6, [r0], #0x1
orr r5, r6, r12
add r12, r5, #0x1
sub r2, r2, r3
_020CE590:
ldrb r5, [r1, -r12]
.word 0xE1415095
add r1, r1, #0x1
subs r3, r3, #0x1
bgt _020CE590
_020CE5A4:
cmp r2, #0x0
movgt lr, lr, lsl #0x1
bgt _020CE544
b _020CE534
_020CE5B4:
ldmia sp!, {r4-r6,lr}
bx lr
arm_func_start MIi_CardDmaCopy32
MIi_CardDmaCopy32: ; 0x020CE5BC
stmdb sp!, {r4-r7,lr}
sub sp, sp, #0x4
mov r5, r1
mov r6, r0
mov r7, r3
mvn r1, #0x0
mov r4, r2
bl MIi_CheckAnotherAutoDMA
mov r0, r6
mov r1, r5
mov r2, r7
mov r3, #0x1000000
bl MIi_CheckDma0SourceAddress
_020CE5F0:
cmp r7, #0x0
addeq sp, sp, #0x4
ldmeqia sp!, {r4-r7, lr}
bxeq lr
mov r0, #0x3
mul r1, r6, r0
ldr r0, _020CE640
add r1, r1, #0x2
add r1, r0, r1, lsl #0x2
_020CE614:
ldr r0, [r1]
ands r0, r0, #0x80000000
bne _020CE614
ldr r3, _020CE644
mov r0, r6
mov r1, r5
mov r2, r4
bl FUN_01FF85F0
add sp, sp, #0x4
ldmia sp!, {r4-r7, lr}
bx lr
_020CE640: .word 0x040000B0
_020CE644: .word 0xAf000001
arm_func_start MI_Init
MI_Init: ; 0x020CE648
stmdb sp!, {lr}
sub sp, sp, #0x4
mov r0, #0x3
bl MI_SetWramBank
mov r0, #0x0
bl MI_StopDma
add sp, sp, #0x4
ldmfd sp!, {lr}
bx lr
arm_func_start PushCommand_impl
PushCommand_impl: ; 0x020CE66C
stmdb sp!, {r4-r7,lr}
sub sp, sp, #0x4
mov r7, r0
mov r0, #0x1
mov r6, r1
mov r5, r2
mov r4, r3
bl SND_AllocCommand
_020CE68C:
cmp r0, #0x0
addeq sp, sp, #0x4
ldmeqia sp!, {r4-r7, lr}
bxeq lr
str r7, [r0, #0x4]
str r6, [r0, #0x8]
str r5, [r0, #0xc]
ldr r1, [sp, #0x18]
str r4, [r0, #0x10]
str r1, [r0, #0x14]
bl SND_PushCommand
add sp, sp, #0x4
ldmia sp!, {r4-r7, lr}
bx lr
arm_func_start SNDi_SetTrackParam
SNDi_SetTrackParam: ; 0x020CE6C4
stmdb sp!, {lr}
sub sp, sp, #0x4
ldr r12, [sp, #0x8]
mov lr, r2
str r3, [sp, #0x0]
mov r2, r1
orr r1, r0, r12, lsl #0x18
mov r3, lr
mov r0, #0x7
bl PushCommand_impl
add sp, sp, #0x4
ldmia sp!, {lr}
bx lr
arm_func_start FUN_020CE6F8
FUN_020CE6F8: ; 0x020CE6F8
stmdb sp!, {lr}
sub sp, sp, #0x4
mov lr, r1
mov r12, r2
str r3, [sp, #0x0]
mov r1, r0
mov r2, lr
mov r3, r12
mov r0, #0x6
bl PushCommand_impl
add sp, sp, #0x4
ldmia sp!, {lr}
bx lr
arm_func_start SND_ResetMasterPan
SND_ResetMasterPan: ; 0x020CE72C
stmdb sp!, {lr}
sub sp, sp, #0x4
mov r2, #0x0
mov r3, r2
mov r0, #0x18
mvn r1, #0x0
str r2, [sp, #0x0]
bl PushCommand_impl
add sp, sp, #0x4
ldmia sp!, {lr}
bx lr
arm_func_start SND_SetMasterPan
SND_SetMasterPan: ; 0x020CE758
stmdb sp!, {lr}
sub sp, sp, #0x4
mov r2, #0x0
mov r1, r0
mov r3, r2
mov r0, #0x18
str r2, [sp, #0x0]
bl PushCommand_impl
add sp, sp, #0x4
ldmia sp!, {lr}
bx lr
arm_func_start SND_SetOutputSelector
SND_SetOutputSelector: ; 0x020CE784
stmdb sp!, {lr}
sub sp, sp, #0x4
mov lr, r1
mov r12, r2
str r3, [sp, #0x0]
mov r1, r0
mov r2, lr
mov r3, r12
mov r0, #0x19
bl PushCommand_impl
add sp, sp, #0x4
ldmia sp!, {lr}
bx lr
arm_func_start SND_InvalidateWaveData
SND_InvalidateWaveData: ; 0x020CE7B8
stmdb sp!, {lr}
sub sp, sp, #0x4
mov r2, r1
mov r3, #0x0
mov r1, r0
mov r0, #0x20
str r3, [sp, #0x0]
bl PushCommand_impl
add sp, sp, #0x4
ldmia sp!, {lr}
bx lr
arm_func_start SND_InvalidateBankData
SND_InvalidateBankData: ; 0x020CE7E4
stmdb sp!, {lr}
sub sp, sp, #0x4
mov r2, r1
mov r3, #0x0
mov r1, r0
mov r0, #0x1f
str r3, [sp, #0x0]
bl PushCommand_impl
add sp, sp, #0x4
ldmia sp!, {lr}
bx lr
arm_func_start SND_InvalidateSeqData
SND_InvalidateSeqData: ; 0x020CE810
stmdb sp!, {lr}
sub sp, sp, #0x4
mov r2, r1
mov r3, #0x0
mov r1, r0
mov r0, #0x1e
str r3, [sp, #0x0]
bl PushCommand_impl
add sp, sp, #0x4
ldmia sp!, {lr}
bx lr
arm_func_start SND_SetupChannelPcm
SND_SetupChannelPcm: ; 0x020CE83C
stmdb sp!, {r4-r5,lr}
sub sp, sp, #0x4
ldr r12, [sp, #0x18]
mov r3, r3, lsl #0x1a
orr r4, r3, r1, lsl #0x18
ldr r5, [sp, #0x24]
mov r3, r12, lsl #0x18
ldr r1, [sp, #0x1c]
ldr r12, [sp, #0x10]
orr r4, r4, r5, lsl #0x10
orr r4, r12, r4
ldr lr, [sp, #0x20]
orr r3, r3, r1, lsl #0x16
ldr r12, [sp, #0x14]
orr r1, r0, lr, lsl #0x10
orr r3, r12, r3
mov r0, #0xe
str r4, [sp, #0x0]
bl PushCommand_impl
add sp, sp, #0x4
ldmia sp!, {r4-r5,lr}
bx lr
arm_func_start SND_SetChannelPan
SND_SetChannelPan: ; 0x020CE894
stmdb sp!, {lr}
sub sp, sp, #0x4
mov r2, r1
mov r3, #0x0
mov r1, r0
mov r0, #0x15
str r3, [sp, #0x0]
bl PushCommand_impl
add sp, sp, #0x4
ldmia sp!, {lr}
bx lr
arm_func_start SND_SetChannelVolume
SND_SetChannelVolume: ; 0x020CE8C0
stmdb sp!, {lr}
sub sp, sp, #0x4
mov lr, r1
mov r3, r2
mov r12, #0x0
mov r1, r0
mov r2, lr
mov r0, #0x14
str r12, [sp, #0x0]
bl PushCommand_impl
add sp, sp, #0x4
ldmia sp!, {lr}
bx lr
arm_func_start SND_SetChannelTimer
SND_SetChannelTimer: ; 0x020CE8F4
stmdb sp!, {lr}
sub sp, sp, #0x4
mov r2, r1
mov r3, #0x0
mov r1, r0
mov r0, #0x13
str r3, [sp, #0x0]
bl PushCommand_impl
add sp, sp, #0x4
ldmia sp!, {lr}
bx lr
arm_func_start SND_UnlockChannel
SND_UnlockChannel: ; 0x020CE920
stmdb sp!, {lr}
sub sp, sp, #0x4
mov r2, r1
mov r3, #0x0
mov r1, r0
mov r0, #0x1b
str r3, [sp, #0x0]
bl PushCommand_impl
add sp, sp, #0x4
ldmia sp!, {lr}
bx lr
arm_func_start SND_LockChannel
SND_LockChannel: ; 0x020CE94C
stmdb sp!, {lr}
sub sp, sp, #0x4
mov r2, r1
mov r3, #0x0
mov r1, r0
mov r0, #0x1a
str r3, [sp, #0x0]
bl PushCommand_impl
add sp, sp, #0x4
ldmia sp!, {lr}
bx lr
arm_func_start SND_SetupAlarm
SND_SetupAlarm: ; 0x020CE978
stmdb sp!, {r4-r6,lr}
sub sp, sp, #0x8
mov r4, r2
mov r5, r1
ldr r2, [sp, #0x18]
mov r6, r0
mov r1, r3
bl SNDi_SetAlarmHandler
_020CE998:
str r0, [sp]
mov r1, r6
mov r2, r5
mov r3, r4
mov r0, #0x12
bl PushCommand_impl
add sp, sp, #0x8
ldmia sp!, {r4-r6, lr}
bx lr
arm_func_start SND_SetupCapture
SND_SetupCapture: ; 0x020CE9BC
stmdb sp!, {lr}
sub sp, sp, #0x4
mov r0, r0, lsl #0x1f
orr r0, r0, r1, lsl #0x1e
ldr r12, [sp, #0x8]
mov r1, r2
orr r0, r0, r12, lsl #0x1d
ldr r2, [sp, #0xc]
mov lr, #0x0
orr r0, r0, r2, lsl #0x1c
ldr r12, [sp, #0x10]
mov r2, r3
orr r3, r0, r12, lsl #0x1b
mov r0, #0x11
str lr, [sp, #0x0]
bl PushCommand_impl
add sp, sp, #0x4
ldmia sp!, {lr}
bx lr
arm_func_start SND_StopTimer
SND_StopTimer: ; 0x020CEA08
stmdb sp!, {r4-r9,lr}
sub sp, sp, #0x4
mov r7, r2
mov r9, r0
mov r8, r1
mov r6, r3
mov r4, r7
mov r5, #0x0
b _020CEA44
_020CEA2C:
ands r0, r4, #0x1
beq _020CEA3C
mov r0, r5
bl SNDi_IncAlarmId
_020CEA3C:
add r5, r5, #0x1
mov r4, r4, lsr #0x1
_020CEA44:
cmp r5, #0x8
bge _020CEA54
cmp r4, #0x0
bne _020CEA2C
_020CEA54:
mov r1, r9
mov r2, r8
mov r3, r7
mov r0, #0xd
str r6, [sp, #0x0]
bl PushCommand_impl
add sp, sp, #0x4
ldmia sp!, {r4-r9,lr}
bx lr
arm_func_start SND_StartTimer
SND_StartTimer: ; 0x020CEA78
stmdb sp!, {lr}
sub sp, sp, #0x4
mov lr, r1
mov r12, r2
str r3, [sp, #0x0]
mov r1, r0
mov r2, lr
mov r3, r12
mov r0, #0xc
bl PushCommand_impl
add sp, sp, #0x4
ldmia sp!, {lr}
bx lr
arm_func_start SND_SetTrackAllocatableChannel
SND_SetTrackAllocatableChannel: ; 0x020CEAAC
stmdb sp!, {lr}
sub sp, sp, #0x4
mov lr, r1
mov r3, r2
mov r12, #0x0
mov r1, r0
mov r2, lr
mov r0, #0x9
str r12, [sp, #0x0]
bl PushCommand_impl
add sp, sp, #0x4
ldmia sp!, {lr}
bx lr
arm_func_start SND_SetTrackPan
SND_SetTrackPan: ; 0x020CEAE0
stmdb sp!, {lr}
sub sp, sp, #0x4
mov r3, r2
mov r12, #0x1
mov r2, #0x9
str r12, [sp, #0x0]
bl SNDi_SetTrackParam
add sp, sp, #0x4
ldmia sp!, {lr}
bx lr
arm_func_start SND_SetTrackPitch
SND_SetTrackPitch: ; 0x020CEB08
stmdb sp!, {lr}
sub sp, sp, #0x4
mov r3, r2
mov r12, #0x2
mov r2, #0xc
str r12, [sp, #0x0]
bl SNDi_SetTrackParam
add sp, sp, #0x4
ldmia sp!, {lr}
bx lr
arm_func_start SND_SetPlayerChannelPriority
SND_SetPlayerChannelPriority: ; 0x020CEB30
ldr ip, _020CEB44 ; =FUN_020CE6F8
mov r2, r1
mov r1, #0x4
mov r3, #0x1
bx r12
.balign 4
_020CEB44: .word FUN_020CE6F8
arm_func_start SND_SetPlayerVolume
SND_SetPlayerVolume: ; 0x020CEB48
ldr ip, _020CEB5C ; =FUN_020CE6F8
mov r2, r1
mov r1, #0x6
mov r3, #0x2
bx r12
.balign 4
_020CEB5C: .word FUN_020CE6F8
arm_func_start SND_PauseSeq
SND_PauseSeq: ; 0x020CEB60
stmdb sp!, {lr}
sub sp, sp, #0x4
mov r2, r1
mov r3, #0x0
mov r1, r0
mov r0, #0x4
str r3, [sp, #0x0]
bl PushCommand_impl
add sp, sp, #0x4
ldmia sp!, {lr}
bx lr
arm_func_start SND_StartPreparedSeq
SND_StartPreparedSeq: ; 0x020CEB8C
stmdb sp!, {lr}
sub sp, sp, #0x4
mov r2, #0x0
mov r1, r0
mov r3, r2
mov r0, #0x3
str r2, [sp, #0x0]
bl PushCommand_impl
add sp, sp, #0x4
ldmia sp!, {lr}
bx lr
arm_func_start SND_PrepareSeq
SND_PrepareSeq: ; 0x020CEBB8
stmdb sp!, {lr}
sub sp, sp, #0x4
mov lr, r1
mov r12, r2
str r3, [sp, #0x0]
mov r1, r0
mov r2, lr
mov r3, r12
mov r0, #0x2
bl PushCommand_impl
add sp, sp, #0x4
ldmia sp!, {lr}
bx lr
arm_func_start SND_StopSeq
SND_StopSeq: ; 0x020CEBEC
stmdb sp!, {lr}
sub sp, sp, #0x4
mov r2, #0x0
mov r1, r0
mov r3, r2
mov r0, #0x1
str r2, [sp, #0x0]
bl PushCommand_impl
add sp, sp, #0x4
ldmia sp!, {lr}
bx lr
arm_func_start SNDi_UnlockMutex
SNDi_UnlockMutex: ; 0x020CEC18
ldr ip, _020CEC24 ; =OS_UnlockMutex
ldr r0, _020CEC28 ; =0x021D3820
bx r12
.balign 4
_020CEC24: .word OS_UnlockMutex
_020CEC28: .word 0x021D3820
arm_func_start SNDi_LockMutex
SNDi_LockMutex: ; 0x020CEC2C
ldr ip, _020CEC38 ; =OS_LockMutex
ldr r0, _020CEC3C ; =0x021D3820
bx r12
.balign 4
_020CEC38: .word OS_LockMutex
_020CEC3C: .word 0x021D3820
arm_func_start SND_Init
SND_Init: ; 0x020CEC40
stmdb sp!, {lr}
sub sp, sp, #0x4
ldr r1, _020CEC84 ; =0x021D381C
ldr r0, [r1, #0x0]
cmp r0, #0x0
addne sp, sp, #0x4
ldmneia sp!, {lr}
bxne lr
ldr r0, _020CEC88 ; =0x021D3820
mov r2, #0x1
str r2, [r1, #0x0]
bl OS_InitMutex
bl SND_CommandInit
bl SND_AlarmInit
add sp, sp, #0x4
ldmia sp!, {lr}
bx lr
.balign 4
_020CEC84: .word 0x021D381C
_020CEC88: .word 0x021D3820
arm_func_start IsCommandAvailable
IsCommandAvailable:
stmdb sp!, {r4,lr}
bl OS_IsRunOnEmulator
_020CEC94:
cmp r0, #0x0
moveq r0, #0x1
ldmeqia sp!, {r4, lr}
bxeq lr
bl OS_DisableInterrupts
ldr r1, _020CECD0
mov r2, #0x10
str r2, [r1]
ldr r4, [r1]
bl OS_RestoreInterrupts
cmp r4, #0x0
movne r0, #0x1
moveq r0, #0x0
ldmia sp!, {r4, lr}
bx lr
_020CECD0: .word 0x04FFF200
arm_func_start AllocCommand
AllocCommand: ; 0x020CECD4
stmdb sp!, {r4,lr}
bl OS_DisableInterrupts
ldr r1, _020CED24 ; =0x021D3838
ldr r4, [r1, #0x0]
cmp r4, #0x0
bne _020CECFC
bl OS_RestoreInterrupts
_020CECF0:
mov r0, #0x0
ldmia sp!, {r4, lr}
bx lr
_020CECFC:
ldr r2, [r4, #0x0]
str r2, [r1, #0x0]
cmp r2, #0x0
ldreq r1, _020CED28 ; =0x021D3848
moveq r2, #0x0
streq r2, [r1, #0x0]
bl OS_RestoreInterrupts
mov r0, r4
ldmia sp!, {r4,lr}
bx lr
.balign 4
_020CED24: .word 0x021D3838
_020CED28: .word 0x021D3848
arm_func_start RequestCommandProc
RequestCommandProc: ; 0x020CED2C
stmdb sp!, {r4-r5,lr}
sub sp, sp, #0x4
mov r5, #0x7
mov r4, #0x0
_020CED3C:
mov r0, r5
mov r1, r4
mov r2, r4
bl PXI_SendWordByFifo
_020CED4C:
cmp r0, #0
blt _020CED3C
add sp, sp, #0x4
ldmia sp!, {r4-r5,lr}
bx lr
arm_func_start InitPXI
InitPXI: ; 0x020CED60
stmdb sp!, {r4-r6,lr}
ldr r1, _020CEDC8 ; =PxiFifoCallback
mov r0, #0x7
bl PXI_SetFifoRecvCallback
bl IsCommandAvailable
_020CED74:
cmp r0, #0x0
ldmeqia sp!, {r4-r6, lr}
bxeq lr
mov r0, #0x7
mov r1, #0x1
bl PXI_IsCallbackReady
cmp r0, #0x0
ldmneia sp!, {r4-r6, lr}
bxne lr
mov r6, #0x64
mov r5, #0x7
mov r4, #0x1
_020CEDA4:
mov r0, r6
bl OS_SpinWait
mov r0, r5
mov r1, r4
bl PXI_IsCallbackReady
cmp r0, #0x0
beq _020CEDA4
ldmia sp!, {r4-r6, lr}
bx lr
_020CEDC8: .word PxiFifoCallback
arm_func_start PxiFifoCallback
PxiFifoCallback: ; 0x020CEDCC
stmdb sp!, {r4-r5,lr}
sub sp, sp, #0x4
mov r5, r1
bl OS_DisableInterrupts
mov r4, r0
mov r0, r5
bl SNDi_CallAlarmHandler
mov r0, r4
bl OS_RestoreInterrupts
add sp, sp, #0x4
ldmia sp!, {r4-r5,lr}
bx lr
arm_func_start SND_CountWaitingCommand
SND_CountWaitingCommand: ; 0x020CEDFC
stmdb sp!, {r4,lr}
bl SND_CountFreeCommand
mov r4, r0
bl SND_CountReservedCommand
rsb r1, r4, #0x100
sub r0, r1, r0
ldmia sp!, {r4,lr}
bx lr
arm_func_start SND_CountReservedCommand
SND_CountReservedCommand: ; 0x020CEE1C
stmdb sp!, {r4,lr}
bl OS_DisableInterrupts
ldr r1, _020CEE58 ; =0x021D3840
mov r4, #0x0
ldr r1, [r1, #0x0]
cmp r1, #0x0
beq _020CEE48
_020CEE38:
ldr r1, [r1, #0x0]
add r4, r4, #0x1
cmp r1, #0x0
bne _020CEE38
_020CEE48:
bl OS_RestoreInterrupts
mov r0, r4
ldmia sp!, {r4,lr}
bx lr
.balign 4
_020CEE58: .word 0x021D3840
arm_func_start SND_CountFreeCommand
SND_CountFreeCommand: ; 0x020CEE5C
stmdb sp!, {r4,lr}
bl OS_DisableInterrupts
ldr r1, _020CEE98 ; =0x021D3838
mov r4, #0x0
ldr r1, [r1, #0x0]
cmp r1, #0x0
beq _020CEE88
_020CEE78:
ldr r1, [r1, #0x0]
add r4, r4, #0x1
cmp r1, #0x0
bne _020CEE78
_020CEE88:
bl OS_RestoreInterrupts
mov r0, r4
ldmia sp!, {r4,lr}
bx lr
.balign 4
_020CEE98: .word 0x021D3838
arm_func_start SND_IsFinishedCommandTag
SND_IsFinishedCommandTag:
stmdb sp!, {r4,lr}
mov r4, r0
bl OS_DisableInterrupts
ldr r1, _020CEEEC ; =0x021D383C
ldr r1, [r1, #0x0]
cmp r4, r1
bls _020CEECC
sub r1, r4, r1
cmp r1, #0x80000000
movcc r4, #0x0
movcs r4, #0x1
b _020CEEDC
_020CEECC:
sub r1, r1, r4
cmp r1, #0x80000000
movcc r4, #0x1
movcs r4, #0x0
_020CEEDC:
bl OS_RestoreInterrupts
mov r0, r4
ldmia sp!, {r4,lr}
bx lr
.balign 4
_020CEEEC: .word 0x021D383C
arm_func_start SND_GetCurrentCommandTag
SND_GetCurrentCommandTag: ; 0x020CEEF0
stmdb sp!, {r4,lr}
bl OS_DisableInterrupts
ldr r1, _020CEF24 ; =0x021D3840
ldr r1, [r1, #0x0]
cmp r1, #0x0
ldreq r1, _020CEF28 ; =0x021D383C
ldreq r4, [r1, #0x0]
ldrne r1, _020CEF2C ; =0x021D3858
ldrne r4, [r1, #0x0]
bl OS_RestoreInterrupts
mov r0, r4
ldmia sp!, {r4,lr}
bx lr
.balign 4
_020CEF24: .word 0x021D3840
_020CEF28: .word 0x021D383C
_020CEF2C: .word 0x021D3858
arm_func_start SND_WaitForCommandProc
SND_WaitForCommandProc: ; 0x020CEF30
stmdb sp!, {r4-r5,lr}
sub sp, sp, #0x4
mov r5, r0
bl SND_IsFinishedCommandTag
_020CEF40:
cmp r0, #0x0
addne sp, sp, #0x4
ldmneia sp!, {r4-r5, lr}
bxne lr
mov r4, #0x0
_020CEF54:
mov r0, r4
bl SND_RecvCommandReply
cmp r0, #0x0
bne _020CEF54
mov r0, r5
bl SND_IsFinishedCommandTag
cmp r0, #0x0
addne sp, sp, #0x4
ldmneia sp!, {r4-r5, lr}
bxne lr
bl RequestCommandProc
mov r0, r5
bl SND_IsFinishedCommandTag
cmp r0, #0x0
addne sp, sp, #0x4
ldmneia sp!, {r4-r5, lr}
bxne lr
mov r4, #0x1
_020CEF9C:
mov r0, r4
bl SND_RecvCommandReply
mov r0, r5
bl SND_IsFinishedCommandTag
cmp r0, #0x0
beq _020CEF9C
add sp, sp, #0x4
ldmia sp!, {r4-r5, lr}
bx lr
arm_func_start SND_FlushCommand
SND_FlushCommand: ; 0x020CEFC0
stmdb sp!, {r4-r9,lr}
sub sp, sp, #0x4
mov r5, r0
bl OS_DisableInterrupts
ldr r1, _020CF164 ; =0x021D3840
mov r4, r0
ldr r1, [r1, #0x0]
cmp r1, #0x0
bne _020CEFF8
bl OS_RestoreInterrupts
add sp, sp, #0x4
mov r0, #0x1
ldmia sp!, {r4-r9,lr}
bx lr
_020CEFF8:
ldr r1, _020CF168 ; =0x021D3854
ldr r1, [r1, #0x0]
cmp r1, #0x8
blt _020CF03C
ands r1, r5, #0x1
bne _020CF024
bl OS_RestoreInterrupts
add sp, sp, #0x4
mov r0, #0x0
ldmia sp!, {r4-r9,lr}
bx lr
_020CF024:
mov r0, #0x1
bl SND_RecvCommandReply
ldr r0, _020CF168 ; =0x021D3854
ldr r0, [r0, #0x0]
cmp r0, #0x8
bge _020CF024
_020CF03C:
ldr r0, _020CF16C ; =0x021D3B00
mov r1, #0x1800
bl DC_FlushRange
ldr r1, _020CF164 ; =0x021D3840
mov r0, #0x7
ldr r1, [r1, #0x0]
mov r2, #0x0
bl PXI_SendWordByFifo
_020CF05C:
cmp r0, #0x0
bge _020CF0E0
ands r0, r5, #0x1
bne _020CF084
mov r0, r4
bl OS_RestoreInterrupts
add sp, sp, #0x4
mov r0, #0x0
ldmia sp!, {r4-r9, lr}
bx lr
_020CF084:
ldr r1, _020CF164
mov r0, #0x7
ldr r1, [r1]
mov r2, #0x0
bl PXI_SendWordByFifo
cmp r0, #0x0
bge _020CF0E0
ldr r6, _020CF164
mov r9, #0x64
mov r8, #0x7
mov r7, #0x0
_020CF0B0:
mov r0, r4
bl OS_RestoreInterrupts
mov r0, r9
bl OS_SpinWait
bl OS_DisableInterrupts
mov r4, r0
mov r0, r8
ldr r1, [r6]
mov r2, r7
bl PXI_SendWordByFifo
cmp r0, #0x0
blt _020CF0B0
_020CF0E0:
ands r0, r5, #0x2
beq _020CF0EC
bl RequestCommandProc
_020CF0EC:
ldr r0, _020CF170
ldr r1, _020CF164
ldr r3, [r0]
ldr r5, [r1]
add r1, r3, #0x1
ldr r2, _020CF174
str r1, [r0]
str r5, [r2, r3, lsl #2]
cmp r1, #0x8
movgt r1, #0x0
ldr r2, _020CF168
strgt r1, [r0]
ldr r1, _020CF178
ldr r3, [r2]
ldr r0, [r1]
add ip, r3, #0x1
add r6, r0, #0x1
ldr r5, _020CF164
mov lr, #0x0
ldr r3, _020CF17C
mov r0, r4
str lr, [r5]
str lr, [r3]
str ip, [r2]
str r6, [r1]
bl OS_RestoreInterrupts
mov r0, #0x1
add sp, sp, #0x4
ldmia sp!, {r4-r9, lr}
bx lr
_020CF164: .word 0x021D3840
_020CF168: .word 0x021D3854
_020CF16C: .word 0x021D3B00
_020CF170: .word 0x021D3850
_020CF174: .word 0x021D385C
_020CF178: .word 0x021D3858
_020CF17C: .word 0x021D3844
arm_func_start SND_PushCommand
SND_PushCommand: ; 0x020CF180
stmdb sp!, {r4,lr}
mov r4, r0
bl OS_DisableInterrupts
ldr r2, _020CF1C0 ; =0x021D3844
ldr r1, [r2, #0x0]
cmp r1, #0x0
ldreq r1, _020CF1C4 ; =0x021D3840
streq r4, [r2, #0x0]
streq r4, [r1, #0x0]
strne r4, [r1, #0x0]
strne r4, [r2, #0x0]
mov r1, #0x0
str r1, [r4, #0x0]
bl OS_RestoreInterrupts
ldmia sp!, {r4,lr}
bx lr
.balign 4
_020CF1C0: .word 0x021D3844
_020CF1C4: .word 0x021D3840
arm_func_start SND_AllocCommand
SND_AllocCommand:
stmdb sp!, {r4,lr}
mov r4, r0
bl IsCommandAvailable
_020CF1D4:
cmp r0, #0x0
moveq r0, #0x0
ldmeqia sp!, {r4,lr}
bxeq lr
bl AllocCommand
cmp r0, #0x0
ldmneia sp!, {r4,lr}
bxne lr
ands r0, r4, #0x1
moveq r0, #0x0
ldmeqia sp!, {r4,lr}
bxeq lr
bl SND_CountWaitingCommand
cmp r0, #0x0
ble _020CF238
mov r4, #0x0
_020CF214:
mov r0, r4
bl SND_RecvCommandReply
cmp r0, #0x0
bne _020CF214
bl AllocCommand
cmp r0, #0x0
beq _020CF240
ldmia sp!, {r4,lr}
bx lr
_020CF238:
mov r0, #0x1
bl SND_FlushCommand
_020CF240:
bl RequestCommandProc
mov r4, #0x1
_020CF248:
mov r0, r4
bl SND_RecvCommandReply
bl AllocCommand
cmp r0, #0x0
beq _020CF248
ldmia sp!, {r4,lr}
bx lr
arm_func_start SND_RecvCommandReply
SND_RecvCommandReply: ; 0x020CF264
stmdb sp!, {r4-r6,lr}
mov r4, r0
bl OS_DisableInterrupts
mov r5, r0
ands r0, r4, #0x1
beq _020CF2C0
bl SNDi_GetFinishedCommandTag
ldr r4, _020CF380 ; =0x021D383C
ldr r1, [r4, #0x0]
cmp r1, r0
bne _020CF2E8
mov r6, #0x64
_020CF294:
mov r0, r5
bl OS_RestoreInterrupts
mov r0, r6
bl OS_SpinWait
bl OS_DisableInterrupts
mov r5, r0
bl SNDi_GetFinishedCommandTag
ldr r1, [r4, #0x0]
cmp r1, r0
beq _020CF294
b _020CF2E8
_020CF2C0:
bl SNDi_GetFinishedCommandTag
ldr r1, _020CF380 ; =0x021D383C
ldr r1, [r1, #0x0]
cmp r1, r0
bne _020CF2E8
mov r0, r5
bl OS_RestoreInterrupts
_020CF2DC:
mov r0, #0x0
ldmia sp!, {r4-r6, lr}
bx lr
_020CF2E8:
ldr r0, _020CF384 ; =0x021D384C
ldr r2, _020CF388 ; =0x021D385C
ldr r3, [r0, #0x0]
add r1, r3, #0x1
ldr r4, [r2, r3, lsl #0x2]
str r1, [r0, #0x0]
cmp r1, #0x8
movgt r1, #0x0
strgt r1, [r0, #0x0]
ldr r0, [r4, #0x0]
mov r1, r4
cmp r0, #0x0
beq _020CF32C
_020CF31C:
ldr r1, [r1, #0x0]
ldr r0, [r1, #0x0]
cmp r0, #0x0
bne _020CF31C
_020CF32C:
ldr r0, _020CF38C ; =0x021D3848
ldr r3, _020CF390 ; =0x021D3854
ldr r0, [r0, #0x0]
ldr r2, _020CF380 ; =0x021D383C
cmp r0, #0x0
strne r4, [r0, #0x0]
ldreq r0, _020CF394 ; =0x021D3838
ldr lr, [r3, #0x0]
streq r4, [r0, #0x0]
ldr ip, _020CF38C ; =0x021D3848
sub r6, lr, #0x1
ldr r0, [r2, #0x0]
str r1, [r12, #0x0]
add lr, r0, #0x1
mov r0, r5
str r6, [r3, #0x0]
str lr, [r2, #0x0]
bl OS_RestoreInterrupts
mov r0, r4
ldmia sp!, {r4-r6,lr}
bx lr
.balign 4
_020CF380: .word 0x021D383C
_020CF384: .word 0x021D384C
_020CF388: .word 0x021D385C
_020CF38C: .word 0x021D3848
_020CF390: .word 0x021D3854
_020CF394: .word 0x021D3838
arm_func_start SND_CommandInit
SND_CommandInit: ; 0x020CF398
stmdb sp!, {r4-r11,lr}
sub sp, sp, #0x4
bl InitPXI
ldr r3, _020CF478 ; =0x021D3B00
ldr r0, _020CF47C ; =0x021D3838
mov r4, #0x0
str r3, [r0, #0x0]
mov r1, r3
mov r0, #0x18
_020CF3BC:
add r4, r4, #0x1
mla r2, r4, r0, r1
cmp r4, #0xff
str r2, [r3], #0x18
blt _020CF3BC
ldr r7, _020CF480 ; =0x021D4B00
mov r10, #0x0
ldr r5, _020CF484 ; =0x021D3840
ldr r4, _020CF488 ; =0x021D3844
ldr lr, _020CF48C ; =0x021D3854
ldr ip, _020CF490 ; =0x021D384C
ldr r3, _020CF494 ; =0x021D3850
ldr r1, _020CF498 ; =0x021D383C
ldr sb, _020CF49C ; =0x021D52E8
ldr r6, _020CF4A0 ; =0x021D3848
ldr r2, _020CF4A4 ; =0x021D3858
mov r8, #0x1
ldr r0, _020CF4A8 ; =0x021D3880
ldr fp, _020CF4AC ; =0x021D5360
str r9, [r6, #0x0]
str r10, [r7, #0x7e8]
str r10, [r5, #0x0]
str r10, [r4, #0x0]
str r10, [lr, #0x0]
str r10, [r12, #0x0]
str r10, [r3, #0x0]
str r8, [r2, #0x0]
str r10, [r1, #0x0]
str r0, [r11, #0x0]
bl SNDi_InitSharedWork
mov r0, r8
bl SND_AllocCommand
_020CF43C:
cmp r0, #0x0
addeq sp, sp, #0x4
ldmeqia sp!, {r4-r11, lr}
bxeq lr
mov r2, #0x1D
mov r1, fp
str r2, [r0, #0x4]
ldr r1, [r1]
str r1, [r0, #0x8]
bl SND_PushCommand
mov r0, r8
bl SND_FlushCommand
add sp, sp, #0x4
ldmia sp!, {r4-r11, lr}
bx lr
_020CF478: .word 0x021D3B00
_020CF47C: .word 0x021D3838
_020CF480: .word 0x021D4B00
_020CF484: .word 0x021D3840
_020CF488: .word 0x021D3844
_020CF48C: .word 0x021D3854
_020CF490: .word 0x021D384C
_020CF494: .word 0x021D3850
_020CF498: .word 0x021D383C
_020CF49C: .word 0x021D52E8
_020CF4A0: .word 0x021D3848
_020CF4A4: .word 0x021D3858
_020CF4A8: .word 0x021D3880
_020CF4AC: .word 0x021D5360
arm_func_start SNDi_CallAlarmHandler
SNDi_CallAlarmHandler: ; 0x020CF4B0
stmdb sp!, {lr}
sub sp, sp, #0x4
ldr r3, _020CF50C ; =0x021D5300
and r2, r0, #0xff
mov r1, #0xc
mla r3, r2, r1, r3
mov r1, r0, asr #0x8
ldrb r0, [r3, #0x8]
and r1, r1, #0xff
cmp r1, r0
addne sp, sp, #0x4
ldmneia sp!, {lr}
bxne lr
ldr r1, [r3, #0x0]
cmp r1, #0x0
addeq sp, sp, #0x4
ldmeqia sp!, {lr}
bxeq lr
ldr r0, [r3, #0x4]
blx r1
add sp, sp, #0x4
ldmia sp!, {lr}
bx lr
.balign 4
_020CF50C: .word 0x021D5300
arm_func_start SNDi_SetAlarmHandler
SNDi_SetAlarmHandler:
mov r3, #0xc
mul r3, r0, r3
ldr r0, _020CF53C ; =0x021D5300
str r1, [r0, r3]
add r1, r0, r3
str r2, [r1, #0x4]
ldrb r0, [r1, #0x8]
add r0, r0, #0x1
strb r0, [r1, #0x8]
ldrb r0, [r1, #0x8]
bx lr
.balign 4
_020CF53C: .word 0x021D5300
arm_func_start SNDi_IncAlarmId
SNDi_IncAlarmId: ; 0x020CF540
ldr r2, _020CF55C ; =0x021D5300
mov r1, #0xc
mla r1, r0, r1, r2
ldrb r0, [r1, #0x8]
add r0, r0, #0x1
strb r0, [r1, #0x8]
bx lr
.balign 4
_020CF55C: .word 0x021D5300
arm_func_start SND_AlarmInit
SND_AlarmInit: ; 0x020CF560
ldr r1, _020CF58C ; =0x021D5300
mov r2, #0x0
mov r0, r2
_020CF56C:
str r0, [r1, #0x0]
str r0, [r1, #0x4]
add r2, r2, #0x1
strb r0, [r1, #0x8]
cmp r2, #0x8
add r1, r1, #0xc
blt _020CF56C
bx lr
.balign 4
_020CF58C: .word 0x021D5300
arm_func_start SNDi_InitSharedWork
SNDi_InitSharedWork: ; 0x020CF590
stmdb sp!, {r4,lr}
mov r4, #0x0
str r4, [r0, #0x4]
strh r4, [r0, #0x8]
strh r4, [r0, #0xa]
mov r12, r0
str r4, [r0, #0x0]
mov r3, r4
mvn r2, #0x0
_020CF5B4:
mov lr, r3
str r3, [r12, #0x40]
_020CF5BC:
add r1, r12, lr, lsl #0x1
add lr, lr, #0x1
strh r2, [r1, #0x20]
cmp lr, #0x10
blt _020CF5BC
add r4, r4, #0x1
cmp r4, #0x10
add r12, r12, #0x24
blt _020CF5B4
mov r3, #0x0
mvn r2, #0x0
_020CF5E8:
add r1, r0, r3, lsl #0x1
add r1, r1, #0x200
add r3, r3, #0x1
strh r2, [r1, #0x60]
cmp r3, #0x10
blt _020CF5E8
mov r1, #0x280
bl DC_FlushRange
ldmia sp!, {r4,lr}
bx lr
arm_func_start SNDi_GetFinishedCommandTag
SNDi_GetFinishedCommandTag: ; 0x020CF610
stmdb sp!, {lr}
sub sp, sp, #0x4
ldr r0, _020CF640 ; =0x021D5360
mov r1, #0x4
ldr r0, [r0, #0x0]
bl DC_InvalidateRange
ldr r0, _020CF640 ; =0x021D5360
ldr r0, [r0, #0x0]
ldr r0, [r0, #0x0]
add sp, sp, #0x4
ldmia sp!, {lr}
bx lr
.balign 4
_020CF640: .word 0x021D5360
arm_func_start SND_GetPlayerTickCounter
SND_GetPlayerTickCounter: ; 0x020CF644
stmdb sp!, {r4,lr}
mov r1, #0x24
mul r4, r0, r1
ldr r0, _020CF680 ; =0x021D5360
mov r1, #0x4
ldr r0, [r0, #0x0]
add r0, r0, #0x40
add r0, r0, r4
bl DC_InvalidateRange
ldr r0, _020CF680 ; =0x021D5360
ldr r0, [r0, #0x0]
add r0, r0, r4
ldr r0, [r0, #0x40]
ldmia sp!, {r4,lr}
bx lr
.balign 4
_020CF680: .word 0x021D5360
arm_func_start SND_GetChannelStatus
SND_GetChannelStatus: ; 0x020CF684
stmdb sp!, {lr}
sub sp, sp, #0x4
ldr r0, _020CF6B8 ; =0x021D5360
mov r1, #0x2
ldr r0, [r0, #0x0]
add r0, r0, #0x8
bl DC_InvalidateRange
ldr r0, _020CF6B8 ; =0x021D5360
ldr r0, [r0, #0x0]
ldrh r0, [r0, #0x8]
add sp, sp, #0x4
ldmia sp!, {lr}
bx lr
.balign 4
_020CF6B8: .word 0x021D5360
arm_func_start SND_GetPlayerStatus
SND_GetPlayerStatus: ; 0x020CF6BC
stmdb sp!, {lr}
sub sp, sp, #0x4
ldr r0, _020CF6F0 ; =0x021D5360
mov r1, #0x4
ldr r0, [r0, #0x0]
add r0, r0, #0x4
bl DC_InvalidateRange
ldr r0, _020CF6F0 ; =0x021D5360
ldr r0, [r0, #0x0]
ldr r0, [r0, #0x4]
add sp, sp, #0x4
ldmia sp!, {lr}
bx lr
.balign 4
_020CF6F0: .word 0x021D5360
arm_func_start SND_CalcChannelVolume
SND_CalcChannelVolume: ; 0x020CF6F4
ldr r1, _020CF75C ; =0xFFFFFD2D
cmp r0, r1
movlt r0, r1
blt _020CF70C
cmp r0, #0x0
movgt r0, #0x0
_020CF70C:
ldr r1, _020CF760 ; =0x000002D3
ldr r2, _020CF764 ; =0x02103CAC
add r3, r0, r1
mvn r1, #0xef
cmp r0, r1
ldrb r2, [r2, r3]
movlt r0, #0x3
blt _020CF74C
mvn r1, #0x77
cmp r0, r1
movlt r0, #0x2
blt _020CF74C
mvn r1, #0x3b
cmp r0, r1
movlt r0, #0x1
movge r0, #0x0
_020CF74C:
orr r0, r2, r0, lsl #0x8
mov r0, r0, lsl #0x10
mov r0, r0, lsr #0x10
bx lr
.balign 4
_020CF75C: .word 0xFFFFFD2D
_020CF760: .word 0x000002D3
_020CF764: .word 0x02103CAC
arm_func_start SND_GetWaveDataAddress
SND_GetWaveDataAddress: ; 0x020CF768
stmdb sp!, {r4-r5,lr}
sub sp, sp, #0x4
mov r5, r0
mov r4, r1
bl SNDi_LockMutex
add r0, r5, r4, lsl #0x2
ldr r4, [r0, #0x3c]
cmp r4, #0x0
beq _020CF798
cmp r4, #0x2000000
addcc r4, r5, r4
b _020CF79C
_020CF798:
mov r4, #0x0
_020CF79C:
bl SNDi_UnlockMutex
mov r0, r4
add sp, sp, #0x4
ldmia sp!, {r4-r5,lr}
bx lr
arm_func_start SND_SetWaveDataAddress
SND_SetWaveDataAddress: ; 0x020CF7B0
stmdb sp!, {r4-r6,lr}
mov r6, r0
mov r5, r1
mov r4, r2
bl SNDi_LockMutex
add r0, r6, #0x3c
add r2, r6, r5, lsl #0x2
add r0, r0, r5, lsl #0x2
mov r1, #0x4
str r4, [r2, #0x3c]
bl DC_StoreRange
bl SNDi_UnlockMutex
ldmia sp!, {r4-r6,lr}
bx lr
arm_func_start SND_GetWaveDataCount
SND_GetWaveDataCount: ; 0x020CF7E8
ldr r0, [r0, #0x38]
bx lr
arm_func_start SND_GetNextInstData
SND_GetNextInstData: ; 0x020CF7F0
stmdb sp!, {r4-r5,lr}
sub sp, sp, #0x4
ldr r4, [r2, #0x0]
ldr r3, [r0, #0x38]
cmp r4, r3
bhs _020CF9B8
mov r12, #0x0
_020CF80C:
add r3, r0, r4, lsl #0x2
ldr r4, [r3, #0x3c]
strb r4, [r1, #0x0]
ldrb r3, [r1, #0x0]
cmp r3, #0x10
bgt _020CF850
cmp r3, #0x10
bge _020CF8A8
cmp r3, #0x5
addls pc, pc, r3, lsl #0x2
b _020CF998
_020CF838:
b _020CF998
b _020CF85C
b _020CF85C
b _020CF85C
b _020CF85C
b _020CF85C
_020CF850:
cmp r3, #0x11
beq _020CF924
b _020CF998
_020CF85C:
mov r3, r4, lsr #0x8
add r5, r0, r4, lsr #0x8
ldrh r4, [r0, r3]
ldrh r3, [r5, #0x2]
add sp, sp, #0x4
mov r0, #0x1
strh r4, [r1, #0x2]
strh r3, [r1, #0x4]
ldrh r4, [r5, #0x4]
ldrh r3, [r5, #0x6]
strh r4, [r1, #0x6]
strh r3, [r1, #0x8]
ldrh r3, [r5, #0x8]
strh r3, [r1, #0xA]
ldr r1, [r2]
add r1, r1, #0x1
str r1, [r2]
ldmia sp!, {r4-r5,lr}
bx lr
_020CF8A8:
add r5, r0, r4, lsr #0x8
b _020CF904
_020CF8B0:
mov r0, #0xc
mla r12, lr, r0, r5
ldrh r4, [r12, #0x2]
ldrh r3, [r12, #0x4]
add sp, sp, #0x4
mov r0, #0x1
strh r4, [r1, #0x0]
strh r3, [r1, #0x2]
ldrh r4, [r12, #0x6]
ldrh r3, [r12, #0x8]
strh r4, [r1, #0x4]
strh r3, [r1, #0x6]
ldrh r4, [r12, #0xa]
ldrh r3, [r12, #0xc]
strh r4, [r1, #0x8]
strh r3, [r1, #0xa]
ldr r1, [r2, #0x4]
add r1, r1, #0x1
str r1, [r2, #0x4]
ldmia sp!, {r4-r5,lr}
bx lr
_020CF904:
ldrb r4, [r5, #0x1]
ldrb r3, [r5, #0x0]
ldr lr, [r2, #0x4]
sub r3, r4, r3
add r3, r3, #0x1
cmp lr, r3
blo _020CF8B0
b _020CF998
_020CF924:
add r4, r0, r4, lsr #0x8
b _020CF98C
_020CF92C:
ldrb lr, [r4, r3]
cmp lr, #0x0
beq _020CF998
mov r0, #0xc
mla lr, r3, r0, r4
ldrh r12, [lr, #0x8]
ldrh r3, [lr, #0xa]
add sp, sp, #0x4
mov r0, #0x1
strh r12, [r1, #0x0]
strh r3, [r1, #0x2]
ldrh r12, [lr, #0xc]
ldrh r3, [lr, #0xe]
strh r12, [r1, #0x4]
strh r3, [r1, #0x6]
ldrh r12, [lr, #0x10]
ldrh r3, [lr, #0x12]
strh r12, [r1, #0x8]
strh r3, [r1, #0xa]
ldr r1, [r2, #0x4]
add r1, r1, #0x1
str r1, [r2, #0x4]
ldmia sp!, {r4-r5,lr}
bx lr
_020CF98C:
ldr r3, [r2, #0x4]
cmp r3, #0x8
blo _020CF92C
_020CF998:
ldr r3, [r2, #0x0]
add r3, r3, #0x1
str r3, [r2, #0x0]
str r12, [r2, #0x4]
ldr r4, [r2, #0x0]
ldr r3, [r0, #0x38]
cmp r4, r3
blo _020CF80C
_020CF9B8:
mov r0, #0x0
add sp, sp, #0x4
ldmia sp!, {r4-r5,lr}
bx lr
arm_func_start SND_GetFirstInstDataPos
SND_GetFirstInstDataPos: ; 0x020CF9C8
sub sp, sp, #0x8
mov r1, #0x0
str r1, [sp, #0x0]
str r1, [sp, #0x4]
str r1, [r0, #0x0]
str r1, [r0, #0x4]
add sp, sp, #0x8
bx lr
arm_func_start SND_DestroyWaveArc
SND_DestroyWaveArc: ; 0x020CF9E8
stmdb sp!, {r4-r6,lr}
mov r4, r0
bl SNDi_LockMutex
ldr r0, [r4, #0x18]
cmp r0, #0x0
beq _020CFA28
mov r5, #0x0
mov r4, #0x8
_020CFA08:
ldr r6, [r0, #0x4]
mov r1, r4
str r5, [r0, #0x0]
str r5, [r0, #0x4]
bl DC_StoreRange
mov r0, r6
cmp r6, #0x0
bne _020CFA08
_020CFA28:
bl SNDi_UnlockMutex
ldmia sp!, {r4-r6,lr}
bx lr
arm_func_start SND_DestroyBank
SND_DestroyBank: ; 0x020CFA34
stmdb sp!, {r4-r8,lr}
mov r7, r0
bl SNDi_LockMutex
add r5, r7, #0x18
mov r6, #0x0
mov r8, #0x8
mov r4, #0x3c
_020CFA50:
add r1, r7, r6, lsl #0x3
ldr r0, [r1, #0x18]
cmp r0, #0x0
beq _020CFAB8
ldr r3, [r0, #0x18]
cmp r5, r3
bne _020CFA80
ldr r2, [r1, #0x1c]
mov r1, r4
str r2, [r0, #0x18]
bl DC_StoreRange
b _020CFAB8
_020CFA80:
cmp r3, #0x0
beq _020CFAA0
_020CFA88:
ldr r0, [r3, #0x4]
cmp r5, r0
beq _020CFAA0
mov r3, r0
cmp r0, #0x0
bne _020CFA88
_020CFAA0:
add r0, r7, r6, lsl #0x3
ldr r2, [r0, #0x1c]
mov r0, r3
mov r1, r8
str r2, [r3, #0x4]
bl DC_StoreRange
_020CFAB8:
add r6, r6, #0x1
cmp r6, #0x4
add r5, r5, #0x8
blt _020CFA50
bl SNDi_UnlockMutex
ldmia sp!, {r4-r8,lr}
bx lr
arm_func_start SND_AssignWaveArc
SND_AssignWaveArc: ; 0x020CFAD4
stmdb sp!, {r4-r6,lr}
mov r6, r0
mov r5, r1
mov r4, r2
bl SNDi_LockMutex
add r3, r6, r5, lsl #0x3
ldr r2, [r3, #0x18]
mov r12, r5, lsl #0x3
cmp r2, #0x0
beq _020CFB70
cmp r4, r2
bne _020CFB10
bl SNDi_UnlockMutex
ldmia sp!, {r4-r6,lr}
bx lr
_020CFB10:
add r1, r6, #0x18
ldr r0, [r2, #0x18]
add r12, r1, r12
cmp r12, r0
bne _020CFB3C
ldr r0, [r3, #0x1c]
mov r1, #0x3c
str r0, [r2, #0x18]
ldr r0, [r3, #0x18]
bl DC_StoreRange
b _020CFB70
_020CFB3C:
cmp r0, #0x0
beq _020CFB5C
_020CFB44:
ldr r1, [r0, #0x4]
cmp r12, r1
beq _020CFB5C
mov r0, r1
cmp r1, #0x0
bne _020CFB44
_020CFB5C:
add r1, r6, r5, lsl #0x3
ldr r2, [r1, #0x1c]
mov r1, #0x8
str r2, [r0, #0x4]
bl DC_StoreRange
_020CFB70:
add r0, r6, #0x18
ldr r1, [r4, #0x18]
add r0, r0, r5, lsl #0x3
str r0, [r4, #0x18]
add r0, r6, r5, lsl #0x3
str r1, [r0, #0x1c]
str r4, [r0, #0x18]
bl SNDi_UnlockMutex
mov r0, r6
mov r1, #0x3c
bl DC_StoreRange
mov r0, r4
mov r1, #0x3c
bl DC_StoreRange
ldmia sp!, {r4-r6,lr}
bx lr
arm_func_start PXI_Init
PXI_Init: ; 0x020CFBB0
ldr ip, _020CFBB8 ; =PXI_InitFifo
bx r12
.balign 4
_020CFBB8: .word PXI_InitFifo
arm_func_start PXIi_HandlerRecvFifoNotEmpty
PXIi_HandlerRecvFifoNotEmpty: ; 0x020CFBBC
stmdb sp!, {r4-r10,lr}
sub sp, sp, #0x8
ldr sl, _020CFCD4 ; =0x04000184
ldr r5, _020CFCD8 ; =0x021D5368
ldr r4, _020CFCDC ; =0x04000188
mov r7, #0x4100000
mov r6, #0x0
mvn r8, #0x3
mvn r9, #0x2
_020CFBE0:
ldrh r0, [r10, #0x0]
ands r0, r0, #0x4000
ldrneh r0, [r10, #0x0]
movne r1, r9
orrne r0, r0, #0xc000
strneh r0, [r10, #0x0]
bne _020CFC28
bl OS_DisableInterrupts
ldrh r1, [r10, #0x0]
ands r1, r1, #0x100
beq _020CFC18
bl OS_RestoreInterrupts
mov r1, r8
b _020CFC28
_020CFC18:
ldr r1, [r7, #0x0]
str r1, [sp, #0x0]
bl OS_RestoreInterrupts
mov r1, r6
_020CFC28:
cmp r1, r8
addeq sp, sp, #0x8
ldmeqia sp!, {r4-r10,lr}
bxeq lr
mvn r0, #0x2
cmp r1, r0
beq _020CFBE0
ldr r1, [sp, #0x0]
mov r0, r1, lsl #0x1b
movs r0, r0, lsr #0x1b
beq _020CFBE0
ldr r3, [r5, r0, lsl #0x2]
cmp r3, #0x0
beq _020CFC74
mov r2, r1, lsl #0x1a
mov r1, r1, lsr #0x6
mov r2, r2, lsr #0x1f
blx r3
b _020CFBE0
_020CFC74:
mov r0, r1, lsl #0x1a
movs r0, r0, lsr #0x1f
bne _020CFBE0
orr r0, r1, #0x20
str r0, [sp, #0x0]
ldrh r0, [r10, #0x0]
ands r0, r0, #0x4000
ldrneh r0, [r10, #0x0]
orrne r0, r0, #0xc000
strneh r0, [r10, #0x0]
bne _020CFBE0
bl OS_DisableInterrupts
ldrh r1, [r10, #0x0]
ands r1, r1, #0x2
beq _020CFCB8
bl OS_RestoreInterrupts
b _020CFBE0
_020CFCB8:
ldr r1, [sp, #0x0]
str r1, [r4, #0x0]
bl OS_RestoreInterrupts
b _020CFBE0
_020CFCC8:
add sp, sp, #0x8
ldmia sp!, {r4-r10, lr}
bx lr
_020CFCD4: .word 0x04000184
_020CFCD8: .word 0x021D5368
_020CFCDC: .word 0x04000188
arm_func_start PXI_SendWordByFifo
PXI_SendWordByFifo:
stmdb sp!, {lr}
sub sp, sp, #0x4
ldr r3, [sp, #0x0]
and r0, r0, #0x1f
bic r3, r3, #0x1f
orr r12, r3, r0
bic r3, r12, #0x20
and r0, r2, #0x1
orr r3, r3, r0, lsl #0x5
str r12, [sp, #0x0]
and r2, r3, #0x3f
bic r0, r1, #0xfc000000
orr r0, r2, r0, lsl #0x6
str r3, [sp, #0x0]
ldr r2, _020CFD8C ; =0x04000184
str r0, [sp, #0x0]
ldrh r0, [r2, #0x0]
ands r0, r0, #0x4000
ldrneh r1, [r2, #0x0]
addne sp, sp, #0x4
mvnne r0, #0x0
orrne r1, r1, #0xc000
strneh r1, [r2, #0x0]
ldmneia sp!, {lr}
bxne lr
bl OS_DisableInterrupts
ldr r1, _020CFD8C ; =0x04000184
ldrh r1, [r1, #0x0]
ands r1, r1, #0x2
beq _020CFD6C
bl OS_RestoreInterrupts
add sp, sp, #0x4
mvn r0, #0x1
ldmia sp!, {lr}
bx lr
_020CFD6C:
ldr r2, [sp, #0x0]
ldr r1, _020CFD90 ; =0x04000188
str r2, [r1, #0x0]
bl OS_RestoreInterrupts
_020CFD7C:
mov r0, #0x0
add sp, sp, #0x4
ldmfd sp!, {lr}
bx lr
_020CFD8C: .word 0x04000184
_020CFD90: .word 0x04000188
arm_func_start PXI_IsCallbackReady
PXI_IsCallbackReady:
ldr r2, _020CFDB8 ; =0x027FFC00
mov r3, #0x1
add r1, r2, r1, lsl #0x2
mov r2, r3, lsl r0
ldr r0, [r1, #0x388]
ands r0, r2, r0
moveq r3, #0x0
mov r0, r3
bx lr
.balign 4
_020CFDB8: .word 0x027FFC00
arm_func_start PXI_SetFifoRecvCallback
PXI_SetFifoRecvCallback: ; 0x020CFDBC
stmdb sp!, {r4-r5,lr}
sub sp, sp, #0x4
mov r4, r0
mov r5, r1
bl OS_DisableInterrupts
ldr r1, _020CFE20 ; =0x021D5368
cmp r5, #0x0
str r5, [r1, r4, lsl #0x2]
beq _020CFDF8
ldr r3, _020CFE24 ; =0x027FFC00
mov r1, #0x1
ldr r2, [r3, #0x388]
orr r1, r2, r1, lsl r4
str r1, [r3, #0x388]
b _020CFE10
_020CFDF8:
ldr r3, _020CFE24 ; =0x027FFC00
mov r1, #0x1
mvn r1, r1, lsl r4
ldr r2, [r3, #0x388]
and r1, r2, r1
str r1, [r3, #0x388]
_020CFE10:
bl OS_RestoreInterrupts
add sp, sp, #0x4
ldmia sp!, {r4-r5,lr}
bx lr
.balign 4
_020CFE20: .word 0x021D5368
_020CFE24: .word 0x027FFC00
arm_func_start PXI_InitFifo
PXI_InitFifo: ; 0x020CFE28
stmdb sp!, {r4-r5,lr}
sub sp, sp, #0x4
bl OS_DisableInterrupts
ldr r1, _020CFF18 ; =0x021D5364
mov r4, r0
ldrh r0, [r1, #0x0]
cmp r0, #0x0
bne _020CFF04
mov r2, #0x1
ldr r0, _020CFF1C ; =0x027FFC00
strh r2, [r1, #0x0]
mov r2, #0x0
str r2, [r0, #0x388]
ldr r0, _020CFF20 ; =0x021D5368
mov r1, r2
_020CFE64:
str r1, [r0, r2, lsl #0x2]
add r2, r2, #0x1
cmp r2, #0x20
blt _020CFE64
ldr r2, _020CFF24 ; =0x0000C408
ldr r1, _020CFF28 ; =0x04000184
mov r0, #0x40000
strh r2, [r1, #0x0]
bl OS_ResetRequestIrqMask
ldr r1, _020CFF2C ; =PXIi_HandlerRecvFifoNotEmpty
mov r0, #0x40000
bl OS_SetIrqFunction
mov r0, #0x40000
bl OS_EnableIrqMask
mov r12, #0x0
ldr r3, _020CFF30 ; =0x04000180
mov r1, r12
mov r2, #0x3e8
_020CFEAC:
ldrh r0, [r3, #0x0]
ands lr, r0, #0xf
mov r0, lr, lsl #0x8
strh r0, [r3, #0x0]
bne _020CFEC8
cmp r12, #0x4
bgt _020CFF04
_020CFEC8:
ldrh r0, [r3, #0x0]
mov r5, r2
and r0, r0, #0xf
cmp r0, lr
bne _020CFEFC
_020CFEDC:
cmp r5, #0x0
movle r12, r1
ble _020CFEFC
ldrh r0, [r3, #0x0]
sub r5, r5, #0x1
and r0, r0, #0xf
cmp r0, lr
beq _020CFEDC
_020CFEFC:
add r12, r12, #0x1
b _020CFEAC
_020CFF04:
mov r0, r4
bl OS_RestoreInterrupts
add sp, sp, #0x4
ldmia sp!, {r4-r5,lr}
bx lr
.balign 4
_020CFF18: .word 0x021D5364
_020CFF1C: .word 0x027FFC00
_020CFF20: .word 0x021D5368
_020CFF24: .word 0x0000C408
_020CFF28: .word 0x04000184
_020CFF2C: .word PXIi_HandlerRecvFifoNotEmpty
_020CFF30: .word 0x04000180
arm_func_start FSi_TranslateCommand
FSi_TranslateCommand:
stmdb sp!, {r4-r8,lr}
mov r8, r0
ldr r0, [r8, #0xc]
mov r7, r1
mov r1, #0x1
ldr r5, [r8, #0x8]
mov r4, r1, lsl r7
ands r0, r0, #0x4
moveq r1, #0x0
cmp r1, #0x0
ldrne r0, [r5, #0x1c]
orrne r0, r0, #0x200
strne r0, [r5, #0x1c]
ldreq r0, [r5, #0x1c]
orreq r0, r0, #0x100
streq r0, [r5, #0x1c]
ldr r0, [r5, #0x58]
ands r0, r0, r4
beq _020CFFE4
ldr r2, [r5, #0x54]
mov r0, r8
mov r1, r7
blx r2
mov r6, r0
cmp r6, #0x8
addls pc, pc, r6, lsl #0x2
b _020CFFE8
_020CFFA0:
b _020CFFC4
b _020CFFC4
b _020CFFE8
b _020CFFE8
b _020CFFC4
b _020CFFE8
b _020CFFE8
b _020CFFE8
b _020CFFCC
_020CFFC4:
str r6, [r8, #0x14]
b _020CFFE8
_020CFFCC:
ldr r1, [r5, #0x58]
mvn r0, r4
and r0, r1, r0
str r0, [r5, #0x58]
mov r6, #0x7
b _020CFFE8
_020CFFE4:
mov r6, #0x7
_020CFFE8:
cmp r6, #0x7
bne _020D0004
ldr r1, _020D00AC ; =0x02103F80
mov r0, r8
ldr r1, [r1, r7, lsl #0x2]
blx r1
mov r6, r0
_020D0004:
cmp r6, #0x6
bne _020D0060
ldr r0, [r8, #0xc]
ands r0, r0, #0x4
movne r0, #0x1
moveq r0, #0x0
cmp r0, #0x0
beq _020D00A0
bl OS_DisableInterrupts
ldr r1, [r5, #0x1c]
mov r4, r0
ands r0, r1, #0x200
beq _020D0050
add r6, r5, #0xc
_020D003C:
mov r0, r6
bl OS_SleepThread
ldr r0, [r5, #0x1c]
ands r0, r0, #0x200
bne _020D003C
_020D0050:
mov r0, r4
ldr r6, [r8, #0x14]
bl OS_RestoreInterrupts
b _020D00A0
_020D0060:
ldr r0, [r8, #0xc]
ands r0, r0, #0x4
movne r0, #0x1
moveq r0, #0x0
cmp r0, #0x0
ldrne r0, [r5, #0x1c]
bicne r0, r0, #0x200
strne r0, [r5, #0x1c]
strne r6, [r8, #0x14]
bne _020D00A0
ldr r1, [r5, #0x1c]
mov r0, r8
bic r2, r1, #0x100
mov r1, r6
str r2, [r5, #0x1c]
bl FSi_ReleaseCommand
_020D00A0:
mov r0, r6
ldmia sp!, {r4-r8,lr}
bx lr
.balign 4
_020D00AC: .word 0x02103F80
arm_func_start FSi_ReleaseCommand
FSi_ReleaseCommand:
stmdb sp!, {r4-r6,lr}
mov r6, r0
mov r5, r1
bl OS_DisableInterrupts
ldr r1, [r6, #0x0]
mov r4, r0
ldr r0, [r6, #0x4]
cmp r1, #0x0
strne r0, [r1, #0x4]
cmp r0, #0x0
strne r1, [r0, #0x0]
mov r0, #0x0
str r0, [r6, #0x0]
ldr r1, [r6, #0x0]
add r0, r6, #0x18
str r1, [r6, #0x4]
ldr r1, [r6, #0xc]
bic r1, r1, #0x4f
str r1, [r6, #0xc]
str r5, [r6, #0x14]
bl OS_WakeupThread
mov r0, r4
bl OS_RestoreInterrupts
ldmia sp!, {r4-r6,lr}
bx lr
arm_func_start FSi_CloseFileCommand
FSi_CloseFileCommand: ; 0x020D0114
mov r0, #0x0
bx lr
arm_func_start FSi_OpenFileDirectCommand
FSi_OpenFileDirectCommand: ; 0x020D011C
ldr r1, [r0, #0x30]
str r1, [r0, #0x24]
ldr r1, [r0, #0x30]
str r1, [r0, #0x2c]
ldr r1, [r0, #0x34]
str r1, [r0, #0x28]
ldr r1, [r0, #0x38]
str r1, [r0, #0x20]
mov r0, #0x0
bx lr
arm_func_start FSi_OpenFileFastCommand
FSi_OpenFileFastCommand: ; 0x020D0144
stmdb sp!, {r4-r5,lr}
sub sp, sp, #0x14
mov r5, r0
ldr r1, [r5, #0x8]
ldr r4, [r5, #0x34]
ldr r0, [r1, #0x30]
mov r2, r4, lsl #0x3
cmp r2, r0
addcs sp, sp, #0x14
movcs r0, #0x1
ldmcsia sp!, {r4-r5,lr}
bxcs lr
str r1, [sp, #0x8]
ldr r1, [r1, #0x2c]
add r0, sp, #0x8
add r3, r1, r2
add r1, sp, #0x0
mov r2, #0x8
str r3, [sp, #0xc]
bl FSi_ReadTable
_020D0194:
cmp r0, #0
addne sp, sp, #0x14
ldmneia sp!, {r4-r5,lr}
bxne lr
ldr r1, [sp]
mov r0, r5
str r1, [r5, #0x30]
ldr r2, [sp, #0x4]
mov r1, #7
str r2, [r5, #0x34]
str r4, [r5, #0x38]
bl FSi_TranslateCommand
add sp, sp, #0x14
ldmia sp!, {r4-r5,lr}
bx lr
arm_func_start FSi_GetPathCommand
FSi_GetPathCommand: ; 0x020D01D0
stmdb sp!, {r4-r11,lr}
sub sp, sp, #0xe4
mov r4, r0
ldr r1, [r4, #0x8]
add r0, sp, #0x98
add r11, r4, #0x30
str r1, [sp, #0x0]
bl FS_InitFile
ldr r0, [r4, #0x8]
str r0, [sp, #0xa0]
ldr r0, [r4, #0xc]
ands r0, r0, #0x20
movne r0, #0x1
moveq r0, #0x0
cmp r0, #0x0
ldrneh r5, [r4, #0x24]
movne r4, #0x10000
bne _020D02BC
ldrh r0, [r11, #0x8]
ldr r4, [r4, #0x20]
cmp r0, #0x0
ldrneh r5, [r11, #0xa]
bne _020D02BC
mov r10, #0x0
mov r9, r10
mov r5, #0x10000
add r8, sp, #0x98
mov r6, #0x3
mov r7, #0x1
_020D0244:
mov r0, r8
mov r1, r10
bl FSi_SeekDirDirect
add r2, sp, #0x4
cmp r10, #0x0
mov r0, r8
mov r1, r6
ldreq r9, [sp, #0xc4]
str r2, [sp, #0xc8]
str r7, [sp, #0xcc]
bl FSi_TranslateCommand
_020D0270:
cmp r0, #0x0
bne _020D02A8
_020D0278:
ldr r0, [sp, #0x10]
cmp r0, #0x0
bne _020D0294
ldr r0, [sp, #0x8]
cmp r0, r4
ldreqh r5, [sp, #0xbc]
beq _020D02A8
_020D0294:
mov r0, r8
mov r1, r6
bl FSi_TranslateCommand
cmp r0, #0x0
beq _020D0278
_020D02A8:
cmp r5, #0x10000
bne _020D02BC
add sl, sl, #0x1
cmp sl, r9
bcc _020D0244
_020D02BC:
cmp r5, #0x10000
moveq r0, #0x0
streqh r0, [r11, #0x8]
addeq sp, sp, #0xe4
moveq r0, #0x1
ldmeqia sp!, {r4-r11,lr}
bxeq lr
ldrh r0, [r11, #0x8]
cmp r0, #0x0
bne _020D03B8
ldr r0, [sp, #0x0]
mov r1, #0x0
ldr r0, [r0, #0x0]
cmp r0, #0xff
addls r9, r1, #0x1
bls _020D0308
cmp r0, #0xff00
addls r9, r1, #0x2
addhi r9, r1, #0x3
_020D0308:
cmp r4, #0x10000
ldrne r0, [sp, #0x14]
add r9, r9, #0x2
addne r9, r9, r0
mov r10, r5
cmp r5, #0x0
beq _020D03AC
add r0, sp, #0x98
mov r1, r5
bl FSi_SeekDirDirect
add r8, sp, #0x98
mov r6, #0x3
mov r7, #0x1
_020D033C:
ldr r1, [sp, #0xc4]
mov r0, r8
bl FSi_SeekDirDirect
add r2, sp, #0x4
mov r0, r8
mov r1, r6
str r2, [sp, #0xc8]
str r7, [sp, #0xcc]
bl FSi_TranslateCommand
_020D0360:
cmp r0, #0x0
bne _020D03A0
_020D0368:
ldr r0, [sp, #0x10]
cmp r0, #0x0
beq _020D038C
ldrh r0, [sp, #0x8]
cmp r0, sl
ldreq r0, [sp, #0x14]
addeq r0, r0, #0x1
addeq r9, r9, r0
beq _020D03A0
_020D038C:
mov r0, r8
mov r1, r6
bl FSi_TranslateCommand
cmp r0, #0x0
beq _020D0368
_020D03A0:
ldrh sl, [sp, #0xbc]
cmp sl, #0x0
bne _020D033C
_020D03AC:
add r0, r9, #0x1
strh r0, [r11, #0x8]
strh r5, [r11, #0xa]
_020D03B8:
ldr r7, [r11, #0x0]
cmp r7, #0x0
addeq sp, sp, #0xe4
moveq r0, #0x0
ldmeqia sp!, {r4-r11,lr}
bxeq lr
ldrh r6, [r11, #0x8]
ldr r0, [r11, #0x4]
cmp r0, r6
addcc sp, sp, #0xe4
movcc r0, #0x1
ldmccia sp!, {r4-r11,lr}
bxcc lr
ldr r0, [sp, #0x0]
mov r9, #0x0
ldr r0, [r0, #0x0]
cmp r0, #0xff
movls r8, #0x1
bls _020D0410
cmp r0, #0xff00
movls r8, #0x2
movhi r8, #0x3
_020D0410:
ldr r0, [sp, #0x0]
mov r1, r7
mov r2, r8
bl MI_CpuCopy8
add r1, r9, r8
ldr r0, _020D058C ; =0x0210682C
add r1, r7, r1
mov r2, #0x2
bl MI_CpuCopy8
add r0, sp, #0x98
mov r1, r5
bl FSi_SeekDirDirect
cmp r4, #0x10000
beq _020D04C4
add r3, sp, #0x4
mov r2, #0x0
add r0, sp, #0x98
mov r1, #0x3
str r3, [sp, #0xc8]
str r2, [sp, #0xcc]
bl FSi_TranslateCommand
_020D0464:
cmp r0, #0x0
bne _020D04A0
add r9, sp, #0x98
mov r8, #0x3
_020D0474:
ldr r0, [sp, #0x10]
cmp r0, #0x0
bne _020D048C
ldr r0, [sp, #0x8]
cmp r0, r4
beq _020D04A0
_020D048C:
mov r0, r9
mov r1, r8
bl FSi_TranslateCommand
cmp r0, #0x0
beq _020D0474
_020D04A0:
ldr r0, [sp, #0x14]
add r1, r7, r6
add r4, r0, #0x1
add r0, sp, #0x18
mov r2, r4
sub r1, r1, r4
bl MI_CpuCopy8
sub r6, r6, r4
b _020D04D4
_020D04C4:
add r0, r7, r6
mov r1, #0x0
strb r1, [r0, #-0x1]
sub r6, r6, #0x1
_020D04D4:
cmp r5, #0x0
beq _020D057C
add r10, sp, #0x98
add r11, sp, #0x4
mov r4, #0x3
mov r9, #0x0
mov r8, #0x2f
_020D04F0:
ldr r1, [sp, #0xc4]
mov r0, r10
bl FSi_SeekDirDirect
add r2, r7, r6
mov r0, r10
mov r1, r4
str r11, [sp, #0xc8]
str r9, [sp, #0xcc]
strb r8, [r2, #-0x1]
sub r6, r6, #0x1
bl FSi_TranslateCommand
_020D051C:
cmp r0, #0x0
bne _020D0570
_020D0524:
ldr r0, [sp, #0x10]
cmp r0, #0x0
beq _020D055C
ldrh r0, [sp, #0x8]
cmp r0, r5
bne _020D055C
ldr r5, [sp, #0x14]
add r1, r7, r6
add r0, sp, #0x18
mov r2, r5
sub r1, r1, r5
bl MI_CpuCopy8
sub r6, r6, r5
b _020D0570
_020D055C:
mov r0, sl
mov r1, r4
bl FSi_TranslateCommand
cmp r0, #0x0
beq _020D0524
_020D0570:
ldrh r5, [sp, #0xbc]
cmp r5, #0x0
bne _020D04F0
_020D057C:
mov r0, #0x0
add sp, sp, #0xe4
ldmia sp!, {r4-r11,lr}
bx lr
.balign 4
_020D058C: .word 0x0210682C
arm_func_start FSi_FindPathCommand
FSi_FindPathCommand: ; 0x020D0590
stmdb sp!, {r4-r11,lr}
sub sp, sp, #0x9c
mov r10, r0
ldr r2, [r10, #0x40]
ldr r9, [r10, #0x3c]
mov r1, #0x2
str r2, [sp, #0x0]
bl FSi_TranslateCommand
ldrb r1, [r9, #0x0]
cmp r1, #0x0
beq _020D0780
mov r0, #0x2
add r11, sp, #0x1c
mov r4, #0x3
mov r5, #0x1
mov r6, #0x0
str r0, [sp, #0x4]
_020D05D4:
mov r7, r6
b _020D05E0
_020D05DC:
add r7, r7, #0x1
_020D05E0:
ldrb r8, [r9, r7]
mov r0, r6
cmp r8, #0x0
beq _020D0600
cmp r8, #0x2f
beq _020D0600
cmp r8, #0x5c
movne r0, r5
_020D0600:
cmp r0, #0x0
bne _020D05DC
cmp r8, #0x0
bne _020D061C
ldr r0, [sp, #0x0]
cmp r0, #0x0
beq _020D0620
_020D061C:
mov r8, r5
_020D0620:
cmp r7, #0x0
addeq sp, sp, #0x9c
moveq r0, #0x1
ldmeqia sp!, {r4-r11,lr}
bxeq lr
cmp r1, #0x2e
bne _020D068C
cmp r7, #0x1
addeq r9, r9, #0x1
beq _020D0764
ldrb r0, [r9, #0x1]
cmp r7, #0x2
moveq r1, r5
movne r1, r6
cmp r0, #0x2e
moveq r0, r5
movne r0, r6
ands r0, r1, r0
beq _020D068C
ldrh r0, [r10, #0x24]
cmp r0, #0x0
beq _020D0684
ldr r1, [r10, #0x2c]
mov r0, r10
bl FSi_SeekDirDirect
_020D0684:
add r9, r9, #0x2
b _020D0764
_020D068C:
cmp r7, #0x7f
addgt sp, sp, #0x9c
movgt r0, #0x1
ldmgtia sp!, {r4-r11,lr}
bxgt lr
add r0, sp, #0x8
str r0, [r10, #0x30]
str r6, [r10, #0x34]
_020D06AC:
mov r0, r10
mov r1, r4
bl FSi_TranslateCommand
_020D06B8:
cmp r0, #0x0
addne sp, sp, #0x9c
movne r0, #0x1
ldmneia sp!, {r4-r11,lr}
bxne lr
ldr r0, [sp, #0x14]
cmp r8, r0
bne _020D06AC
ldr r0, [sp, #0x18]
cmp r7, r0
bne _020D06AC
mov r0, r9
mov r1, fp
mov r2, r7
bl FSi_StrNICmp
cmp r0, #0x0
bne _020D06AC
cmp r8, #0x0
beq _020D0728
add r0, sp, #0x8
add r3, sl, #0x30
ldmia r0, {r0, r1, r2}
stmia r3, {r0, r1, r2}
ldr r1, [sp, #0x4]
mov r0, sl
add r9, r9, r7
bl FSi_TranslateCommand
b _020D0764
_020D0728:
ldr r0, [sp]
cmp r0, #0x0
addne sp, sp, #0x9c
movne r0, #0x1
ldmneia sp!, {r4-r11,lr}
bxne lr
ldr r3, [sl, #0x44]
ldr r2, [sp, #0x8]
ldr r1, [sp, #0xC]
add sp, sp, #0x9c
str r2, [r3]
str r1, [r3, #0x4]
mov r0, #0x0
ldmia sp!, {r4-r11,lr}
bx lr
_020D0764:
ldrb r0, [r9, #0x0]
cmp r0, #0x0
movne r0, r5
moveq r0, r6
ldrb r1, [r9, r0]!
cmp r1, #0x0
bne _020D05D4
_020D0780:
ldr r0, [sp, #0x0]
cmp r0, #0x0
moveq r0, #0x1
addne r0, r10, #0x20
ldrne r3, [r10, #0x44]
ldmneia r0, {r0-r2}
stmneia r3, {r0-r2}
movne r0, #0x0
add sp, sp, #0x9c
ldmia sp!, {r4-r11,lr}
bx lr
arm_func_start FSi_ReadDirCommand
FSi_ReadDirCommand: ; 0x020D07AC
stmdb sp!, {r4-r5,lr}
sub sp, sp, #0xc
mov r5, r0
ldr r4, [r5, #0x30]
ldr r1, [r5, #0x8]
add r0, sp, #0x4
str r1, [sp, #0x4]
ldr r3, [r5, #0x28]
add r1, sp, #0x0
mov r2, #0x1
str r3, [sp, #0x8]
bl FSi_ReadTable
_020D07DC:
cmp r0, #0x0
addne sp, sp, #0xC
ldmneia sp!, {r4-r5,lr}
bxne lr
ldrb r1, [sp]
and r2, r1, #0x7F
mov r1, r1, asr #0x7
str r2, [r4, #0x10]
and r1, r1, #0x1
str r1, [r4, #0xC]
ldr r2, [r4, #0x10]
cmp r2, #0x0
addeq sp, sp, #0xC
moveq r0, #0x1
ldmeqia sp!, {r4-r5,lr}
bxeq lr
ldr r1, [r5, #0x34]
cmp r1, #0x0
bne _020D0858
add r0, sp, #0x4
add r1, r4, #0x14
bl FSi_ReadTable
cmp r0, #0x0
addne sp, sp, #0xC
ldmneia sp!, {r4-r5,lr}
bxne lr
ldr r1, [r4, #0x10]
mov r2, #0x0
add r1, r4, r1
strb r2, [r1, #0x14]
b _020D0864
_020D0858:
ldr r1, [sp, #0x8]
add r1, r1, r2
str r1, [sp, #0x8]
_020D0864:
ldr r1, [r4, #0xC]
cmp r1, #0x0
beq _020D08B8
add r0, sp, #0x4
add r1, sp, #0x2
mov r2, #0x2
bl FSi_ReadTable
cmp r0, #0x0
addne sp, sp, #0xC
ldmneia sp!, {r4-r5,lr}
bxne lr
ldr r2, [r5, #0x8]
ldr r1, _020D08E8
str r2, [r4]
ldrh r3, [sp, #0x2]
mov r2, #0x0
and r1, r3, r1
strh r1, [r4, #0x4]
strh r2, [r4, #0x6]
str r2, [r4, #0x8]
b _020D08D4
_020D08B8:
ldr r1, [r5, #0x8]
str r1, [r4]
ldrh r1, [r5, #0x26]
str r1, [r4, #0x4]
ldrh r1, [r5, #0x26]
add r1, r1, #0x1
strh r1, [r5, #0x26]
_020D08D4:
ldr r1, [sp, #0x8]
str r1, [r5, #0x28]
add sp, sp, #0xC
ldmia sp!, {r4-r5,lr}
bx lr
_020D08E8: .word 0x00000FFF
arm_func_start FSi_SeekDirCommand
FSi_SeekDirCommand: ; 0x020D08EC
stmdb sp!, {r4-r6,lr}
sub sp, sp, #0x10
mov r6, r0
ldr r5, [r6, #0x8]
add r4, r6, #0x30
str r5, [sp, #0x8]
ldrh r1, [r4, #0x4]
ldr r2, [r5, #0x34]
add r0, sp, #0x8
add r3, r2, r1, lsl #0x3
add r1, sp, #0x0
mov r2, #0x8
str r3, [sp, #0xc]
bl FSi_ReadTable
movs r3, r0
bne _020D0978
add r12, r6, #0x20
ldmia r4, {r0-r2}
stmia r12, {r0-r2}
ldrh r0, [r4, #0x6]
cmp r0, #0x0
bne _020D0968
ldr r0, [r4, #0x8]
cmp r0, #0x0
bne _020D0968
ldrh r0, [sp, #0x4]
strh r0, [r6, #0x26]
ldr r1, [r5, #0x34]
ldr r0, [sp, #0x0]
add r0, r1, r0
str r0, [r6, #0x28]
_020D0968:
ldrh r1, [sp, #0x6]
ldr r0, _020D0988 ; =0x00000FFF
and r0, r1, r0
str r0, [r6, #0x2c]
_020D0978:
mov r0, r3
add sp, sp, #0x10
ldmia sp!, {r4-r6,lr}
bx lr
.balign 4
_020D0988: .word 0x00000FFF
arm_func_start FSi_WriteFileCommand
FSi_WriteFileCommand: ; 0x020D098C
stmdb sp!, {lr}
sub sp, sp, #0x4
ldr r2, [r0, #0x2c]
ldr r3, [r0, #0x38]
ldr lr, [r0, #0x8]
ldr r1, [r0, #0x30]
add r12, r2, r3
str r12, [r0, #0x2c]
ldr r12, [lr, #0x4c]
mov r0, lr
blx r12
add sp, sp, #0x4
ldmia sp!, {lr}
bx lr
arm_func_start FSi_ReadFileCommand
FSi_ReadFileCommand: ; 0x020D09C4
stmdb sp!, {lr}
sub sp, sp, #0x4
ldr r2, [r0, #0x2c]
ldr r3, [r0, #0x38]
ldr lr, [r0, #0x8]
ldr r1, [r0, #0x30]
add r12, r2, r3
str r12, [r0, #0x2c]
ldr r12, [lr, #0x48]
mov r0, lr
blx r12
add sp, sp, #0x4
ldmia sp!, {lr}
bx lr
arm_func_start FSi_SeekDirDirect
FSi_SeekDirDirect: ; 0x020D09FC
ldr r3, [r0, #0xc]
mov r2, #0x0
orr r3, r3, #0x4
str r3, [r0, #0xc]
ldr r3, [r0, #0x8]
ldr ip, _020D0A2C ; =FSi_TranslateCommand
str r3, [r0, #0x30]
str r2, [r0, #0x38]
strh r2, [r0, #0x36]
strh r1, [r0, #0x34]
mov r1, #0x2
bx r12
.balign 4
_020D0A2C: .word FSi_TranslateCommand
arm_func_start FSi_ReadTable
FSi_ReadTable:
stmdb sp!, {r4-r8,lr}
mov r7, r0
ldr r5, [r7, #0x0]
mov r6, r2
ldr r2, [r5, #0x1c]
mov r0, r5
orr r2, r2, #0x200
str r2, [r5, #0x1c]
ldr r2, [r7, #0x4]
ldr r4, [r5, #0x50]
mov r3, r6
blx r4
cmp r0, #0x0
beq _020D0A7C
cmp r0, #0x1
beq _020D0A7C
cmp r0, #0x6
beq _020D0A8C
b _020D0AC8
_020D0A7C:
ldr r1, [r5, #0x1c]
bic r1, r1, #0x200
str r1, [r5, #0x1c]
b _020D0AC8
_020D0A8C:
bl OS_DisableInterrupts
ldr r1, [r5, #0x1c]
mov r4, r0
ands r0, r1, #0x200
beq _020D0AB8
add r8, r5, #0xc
_020D0AA4:
mov r0, r8
bl OS_SleepThread
ldr r0, [r5, #0x1c]
ands r0, r0, #0x200
bne _020D0AA4
_020D0AB8:
mov r0, r4
bl OS_RestoreInterrupts
ldr r0, [r5, #0x24]
ldr r0, [r0, #0x14]
_020D0AC8:
ldr r1, [r7, #0x4]
add r1, r1, r6
str r1, [r7, #0x4]
ldmia sp!, {r4-r8,lr}
bx lr
arm_func_start FSi_StrNICmp
FSi_StrNICmp: ; 0x020D0ADC
stmdb sp!, {lr}
sub sp, sp, #0x4
cmp r2, #0x0
mov lr, #0x0
bls _020D0B30
_020D0AF0:
ldrb r12, [r0, lr]
ldrb r3, [r1, lr]
sub r12, r12, #0x41
cmp r12, #0x19
sub r3, r3, #0x41
addls r12, r12, #0x20
cmp r3, #0x19
addls r3, r3, #0x20
cmp r12, r3
addne sp, sp, #0x4
subne r0, r12, r3
ldmneia sp!, {lr}
bxne lr
add lr, lr, #0x1
cmp lr, r2
blo _020D0AF0
_020D0B30:
mov r0, #0x0
add sp, sp, #0x4
ldmia sp!, {lr}
bx lr
arm_func_start FS_NotifyArchiveAsyncEnd
FS_NotifyArchiveAsyncEnd: ; 0x020D0B40
stmdb sp!, {r4-r6,lr}
mov r4, r0
ldr r0, [r4, #0x1c]
mov r6, r1
ands r0, r0, #0x100
beq _020D0B8C
ldr r2, [r4, #0x1c]
ldr r0, [r4, #0x24]
bic r2, r2, #0x100
str r2, [r4, #0x1c]
bl FSi_ReleaseCommand
mov r0, r4
bl FSi_NextCommand
_020D0B74:
cmp r0, #0x0
ldmeqia sp!, {r4-r6,lr}
bxeq lr
bl FSi_ExecuteAsyncCommand
ldmia sp!, {r4-r6,lr}
bx lr
_020D0B8C:
ldr r5, [r4, #0x24]
bl OS_DisableInterrupts
str r6, [r5, #0x14]
ldr r1, [r4, #0x1c]
mov r5, r0
bic r1, r1, #0x200
add r0, r4, #0xc
str r1, [r4, #0x1c]
bl OS_WakeupThread
mov r0, r5
bl OS_RestoreInterrupts
ldmia sp!, {r4-r6,lr}
bx lr
arm_func_start FS_SetArchiveProc
FS_SetArchiveProc: ; 0x020D0BC0
cmp r2, #0x0
moveq r1, #0x0
beq _020D0BD4
cmp r1, #0x0
moveq r2, #0x0
_020D0BD4:
str r1, [r0, #0x54]
str r2, [r0, #0x58]
bx lr
arm_func_start FS_ResumeArchive
FS_ResumeArchive:
stmdb sp!, {r4-r7,lr}
sub sp, sp, #0x4
mov r4, r0
mov r6, #0x0
bl OS_DisableInterrupts
ldr r1, [r4, #0x1c]
mov r5, r0
ands r0, r1, #0x8
movne r0, #0x1
moveq r0, r6
cmp r0, #0x0
moveq r7, #0x1
movne r7, #0x0
cmp r7, #0x0
bne _020D0C34
ldr r1, [r4, #0x1c]
mov r0, r4
bic r1, r1, #0x8
str r1, [r4, #0x1c]
bl FSi_NextCommand
mov r6, r0
_020D0C34:
mov r0, r5
bl OS_RestoreInterrupts
_020D0C3C:
cmp r6, #0x0
beq _020D0C4C
mov r0, r6
bl FSi_ExecuteAsyncCommand
_020D0C4C:
mov r0, r7
add sp, sp, #0x4
ldmia sp!, {r4-r7, lr}
bx lr
arm_func_start FS_SuspendArchive
FS_SuspendArchive: ; 0x020D0C5C
stmdb sp!, {r4-r7,lr}
sub sp, sp, #0x4
mov r6, r0
bl OS_DisableInterrupts
ldr r1, [r6, #0x1c]
mov r4, r0
ands r0, r1, #0x8
movne r0, #0x1
moveq r0, #0x0
cmp r0, #0x0
moveq r5, #0x1
movne r5, #0x0
cmp r5, #0x0
beq _020D0CD4
ldr r0, [r6, #0x1c]
ands r0, r0, #0x10
beq _020D0CC8
ldr r0, [r6, #0x1c]
orr r0, r0, #0x40
str r0, [r6, #0x1c]
add r7, r6, #0x14
_020D0CB0:
mov r0, r7
bl OS_SleepThread
ldr r0, [r6, #0x1c]
ands r0, r0, #0x40
bne _020D0CB0
b _020D0CD4
_020D0CC8:
ldr r0, [r6, #0x1c]
orr r0, r0, #0x8
str r0, [r6, #0x1c]
_020D0CD4:
mov r0, r4
bl OS_RestoreInterrupts
mov r0, r5
add sp, sp, #0x4
ldmia sp!, {r4-r7,lr}
bx lr
arm_func_start FS_UnloadArchiveTables
FS_UnloadArchiveTables: ; 0x020D0CEC
stmdb sp!, {r4-r5,lr}
sub sp, sp, #0x4
mov r5, r0
ldr r0, [r5, #0x1c]
mov r4, #0x0
ands r0, r0, #0x2
movne r0, #0x1
moveq r0, r4
cmp r0, #0x0
beq _020D0D74
mov r0, r5
bl FS_SuspendArchive
ldr r1, [r5, #0x1c]
ands r1, r1, #0x4
movne r1, #0x1
moveq r1, #0x0
cmp r1, #0x0
beq _020D0D64
ldr r2, [r5, #0x1c]
mov r1, #0x0
bic r2, r2, #0x4
str r2, [r5, #0x1c]
ldr r4, [r5, #0x44]
str r1, [r5, #0x44]
ldr r1, [r5, #0x3c]
str r1, [r5, #0x2c]
ldr r1, [r5, #0x40]
str r1, [r5, #0x34]
ldr r1, [r5, #0x48]
str r1, [r5, #0x50]
_020D0D64:
cmp r0, #0x0
beq _020D0D74
mov r0, r5
bl FS_ResumeArchive
_020D0D74:
mov r0, r4
add sp, sp, #0x4
ldmia sp!, {r4-r5,lr}
bx lr
arm_func_start FUN_020D0D84
FUN_020D0D84: ; 0x020D0D84
stmdb sp!, {r4-r7,lr}
sub sp, sp, #0x4c
mov r7, r0
ldr r3, [r7, #0x30]
ldr r0, [r7, #0x38]
mov r6, r1
add r0, r3, r0
add r0, r0, #0x20
add r0, r0, #0x1f
bic r5, r0, #0x1f
cmp r5, r2
bhi _020D0E9C
add r1, r6, #0x1f
add r0, sp, #0x4
bic r4, r1, #0x1f
bl FS_InitFile
ldr r2, [r7, #0x2c]
mvn r0, #0x0
str r0, [sp, #0x0]
ldr r3, [r7, #0x30]
add r0, sp, #0x4
mov r1, r7
add r3, r2, r3
bl FS_OpenFileDirect
_020D0DE4:
cmp r0, #0x0
beq _020D0E1C
ldr r2, [r7, #0x30]
add r0, sp, #0x4
mov r1, r4
bl FS_ReadFile
cmp r0, #0x0
bge _020D0E14
ldr r2, [r7, #0x30]
mov r0, r4
mov r1, #0x0
bl MI_CpuFill8
_020D0E14:
add r0, sp, #0x4
bl FS_CloseFile
_020D0E1C:
str r4, [r7, #0x2C]
ldr ip, [r7, #0x30]
ldr r2, [r7, #0x34]
mvn r0, #0x0
str r0, [sp]
ldr r3, [r7, #0x38]
add r0, sp, #0x4
mov r1, r7
add r3, r2, r3
add r4, r4, ip
bl FS_OpenFileDirect
cmp r0, #0x0
beq _020D0E80
ldr r2, [r7, #0x38]
add r0, sp, #0x4
mov r1, r4
bl FS_ReadFile
cmp r0, #0x0
bge _020D0E78
ldr r2, [r7, #0x38]
mov r0, r4
mov r1, #0x0
bl MI_CpuFill8
_020D0E78:
add r0, sp, #0x4
bl FS_CloseFile
_020D0E80:
str r4, [r7, #0x34]
ldr r0, _020D0EAC
str r6, [r7, #0x44]
str r0, [r7, #0x50]
ldr r0, [r7, #0x1C]
orr r0, r0, #0x4
str r0, [r7, #0x1C]
_020D0E9C:
mov r0, r5
add sp, sp, #0x4C
ldmia sp!, {r4-r7,lr}
bx lr
_020D0EAC:
.word FSi_ReadMemoryCore
arm_func_start FUN_020D0EB0
FUN_020D0EB0: ; 0x020D0EB0
stmdb sp!, {r4-r8,lr}
mov r5, r0
bl OS_DisableInterrupts
ldr r1, [r5, #0x1c]
mov r4, r0
ands r0, r1, #0x2
movne r0, #0x1
moveq r0, #0x0
cmp r0, #0x0
beq _020D0F64
mov r0, r5
ldr r1, [r5, #0x1c]
bl FS_SuspendArchive
ldr r1, [r5, #0x1c]
mov r7, r0
orr r0, r1, #0x80
str r0, [r5, #0x1c]
ldr r0, [r5, #0x24]
cmp r0, #0x0
beq _020D0F1C
mov r6, #0x3
_020D0F04:
ldr r8, [r0, #0x4]
mov r1, r6
bl FSi_ReleaseCommand
mov r0, r8
cmp r8, #0x0
bne _020D0F04
_020D0F1C:
mov r0, #0x0
str r0, [r5, #0x24]
cmp r7, #0x0
beq _020D0F34
mov r0, r5
bl FS_ResumeArchive
_020D0F34:
mov r0, #0x0
str r0, [r5, #0x28]
str r0, [r5, #0x2c]
str r0, [r5, #0x30]
str r0, [r5, #0x34]
str r0, [r5, #0x38]
str r0, [r5, #0x40]
ldr r0, [r5, #0x40]
str r0, [r5, #0x3c]
ldr r0, [r5, #0x1c]
bic r0, r0, #0xa2
str r0, [r5, #0x1c]
_020D0F64:
mov r0, r4
bl OS_RestoreInterrupts
mov r0, #0x1
ldmia sp!, {r4-r8,lr}
bx lr
arm_func_start FS_LoadArchive
FS_LoadArchive: ; 0x020D0F78
str r1, [r0, #0x28]
str r3, [r0, #0x30]
str r2, [r0, #0x3c]
ldr r1, [r0, #0x3c]
ldr r2, [sp, #0x4]
str r1, [r0, #0x2c]
str r2, [r0, #0x38]
ldr r1, [sp, #0x0]
ldr r2, [sp, #0x8]
str r1, [r0, #0x40]
ldr r1, [r0, #0x40]
cmp r2, #0x0
str r1, [r0, #0x34]
ldreq r2, _020D0FE8 ; =FSi_ReadMemCallback
ldr r1, [sp, #0xc]
str r2, [r0, #0x48]
cmp r1, #0x0
ldreq r1, _020D0FEC ; =FSi_WriteMemCallback
str r1, [r0, #0x4c]
ldr r2, [r0, #0x48]
mov r1, #0x0
str r2, [r0, #0x50]
str r1, [r0, #0x44]
ldr r1, [r0, #0x1c]
orr r1, r1, #0x2
str r1, [r0, #0x1c]
mov r0, #0x1
bx lr
.balign 4
_020D0FE8: .word FSi_ReadMemCallback
_020D0FEC: .word FSi_WriteMemCallback
arm_func_start FUN_020D0FF0
FUN_020D0FF0: ; 0x020D0FF0
stmdb sp!, {r4,lr}
mov r4, r0
ldr r0, [r4, #0x0]
cmp r0, #0x0
ldmeqia sp!, {r4,lr}
bxeq lr
bl OS_DisableInterrupts
ldr r2, [r4, #0x4]
mov r3, #0x0
cmp r2, #0x0
ldrne r1, [r4, #0x8]
strne r1, [r2, #0x8]
ldr r2, [r4, #0x8]
cmp r2, #0x0
ldrne r1, [r4, #0x4]
strne r1, [r2, #0x4]
str r3, [r4, #0x0]
str r3, [r4, #0x8]
ldr r1, [r4, #0x8]
ldr r2, _020D1080 ; =0x021D53EC
str r1, [r4, #0x4]
ldr r1, [r4, #0x1c]
bic r1, r1, #0x1
str r1, [r4, #0x1c]
ldr r1, [r2, #0x0]
cmp r1, r4
bne _020D1074
ldr r1, _020D1084 ; =0x021D53E8
str r3, [r2, #0x8]
ldr r1, [r1, #0x0]
strh r3, [r2, #0x6]
str r1, [r2, #0x0]
strh r3, [r2, #0x4]
_020D1074:
bl OS_RestoreInterrupts
ldmia sp!, {r4,lr}
bx lr
.balign 4
_020D1080: .word 0x021D53EC
_020D1084: .word 0x021D53E8
arm_func_start FS_RegisterArchiveName
FS_RegisterArchiveName: ; 0x020D1088
stmdb sp!, {r4-r8,lr}
mov r6, r1
mov r5, r2
mov r7, r0
mov r8, #0x0
bl OS_DisableInterrupts
mov r4, r0
mov r0, r6
mov r1, r5
bl FS_FindArchive
_020D10B0:
cmp r0, #0x0
bne _020D112C
ldr r1, _020D1140
ldr r2, [r1]
cmp r2, #0x0
bne _020D10E8
ldr r0, _020D1144
mov r2, r8
str r7, [r1]
str r7, [r0]
str r2, [r0, #0x8]
strh r2, [r0, #0x6]
strh r2, [r0, #0x4]
b _020D110C
_020D10E8:
ldr r0, [r2, #0x4]
cmp r0, #0x0
beq _020D1104
_020D10F4:
mov r2, r0
ldr r0, [r0, #0x4]
cmp r0, #0x0
bne _020D10F4
_020D1104:
str r7, [r2, #0x4]
str r2, [r7, #0x8]
_020D110C:
mov r0, r6
mov r1, r5
bl FSi_GetPackedName
str r0, [r7]
ldr r0, [r7, #0x1C]
mov r8, #0x1
orr r0, r0, #0x1
str r0, [r7, #0x1C]
_020D112C:
mov r0, r4
bl OS_RestoreInterrupts
mov r0, r8
ldmia sp!, {r4-r8,lr}
bx lr
_020D1140: .word 0x021D53E8
_020D1144: .word 0x021D53EC
arm_func_start FS_FindArchive
FS_FindArchive:
stmdb sp!, {r4-r5,lr}
sub sp, sp, #0x4
bl FSi_GetPackedName
mov r5, r0
bl OS_DisableInterrupts
ldr r1, _020D1194 ; =0x021D53E8
ldr r4, [r1, #0x0]
b _020D116C
_020D1168:
ldr r4, [r4, #0x4]
_020D116C:
cmp r4, #0x0
beq _020D1180
ldr r1, [r4, #0x0]
cmp r1, r5
bne _020D1168
_020D1180:
bl OS_RestoreInterrupts
mov r0, r4
add sp, sp, #0x4
ldmia sp!, {r4-r5,lr}
bx lr
.balign 4
_020D1194: .word 0x021D53E8
arm_func_start FS_InitArchive
FS_InitArchive: ; 0x020D1198
stmdb sp!, {r4,lr}
mov r1, #0x0
mov r2, #0x5c
mov r4, r0
bl MI_CpuFill8
mov r1, #0x0
str r1, [r4, #0x10]
ldr r0, [r4, #0x10]
str r0, [r4, #0xc]
str r1, [r4, #0x18]
ldr r0, [r4, #0x18]
str r0, [r4, #0x14]
ldmia sp!, {r4,lr}
bx lr
arm_func_start FSi_SendCommand
FSi_SendCommand:
stmdb sp!, {r4-r7,lr}
sub sp, sp, #0x4
mov r7, r0
ldr r6, [r7, #0x8]
mov r2, #0x1
str r1, [r7, #0x10]
mov r0, #0x2
str r0, [r7, #0x14]
ldr r0, [r7, #0xc]
mov r5, r2, lsl r1
orr r0, r0, #0x1
str r0, [r7, #0xc]
bl OS_DisableInterrupts
ldr r1, [r6, #0x1c]
mov r4, r0
ands r0, r1, #0x80
beq _020D1238
mov r0, r7
mov r1, #0x3
bl FSi_ReleaseCommand
mov r0, r4
bl OS_RestoreInterrupts
add sp, sp, #0x4
mov r0, #0x0
ldmia sp!, {r4-r7,lr}
bx lr
_020D1238:
ands r0, r5, #0x1fc
ldrne r0, [r7, #0xc]
add r2, r6, #0x20
orrne r0, r0, #0x4
strne r0, [r7, #0xc]
ldr r1, [r7, #0x0]
ldr r0, [r7, #0x4]
cmp r1, #0x0
strne r0, [r1, #0x4]
cmp r0, #0x0
strne r1, [r0, #0x0]
ldr r0, [r2, #0x4]
cmp r0, #0x0
beq _020D1280
_020D1270:
mov r2, r0
ldr r0, [r0, #0x4]
cmp r0, #0x0
bne _020D1270
_020D1280:
str r7, [r2, #0x4]
str r2, [r7, #0x0]
mov r1, #0x0
str r1, [r7, #0x4]
ldr r0, [r6, #0x1c]
ands r0, r0, #0x8
movne r1, #0x1
cmp r1, #0x0
bne _020D132C
ldr r0, [r6, #0x1c]
ands r0, r0, #0x10
bne _020D132C
ldr r1, [r6, #0x1c]
mov r0, r4
orr r1, r1, #0x10
str r1, [r6, #0x1c]
bl OS_RestoreInterrupts
ldr r0, [r6, #0x58]
ands r0, r0, #0x200
beq _020D12E0
ldr r2, [r6, #0x54]
mov r0, r7
mov r1, #0x9
blx r2
_020D12E0:
bl OS_DisableInterrupts
ldr r1, [r7, #0xc]
orr r1, r1, #0x40
str r1, [r7, #0xc]
ldr r1, [r7, #0xc]
ands r1, r1, #0x4
movne r1, #0x1
moveq r1, #0x0
cmp r1, #0x0
bne _020D1324
bl OS_RestoreInterrupts
mov r0, r7
bl FSi_ExecuteAsyncCommand
add sp, sp, #0x4
mov r0, #0x1
ldmia sp!, {r4-r7,lr}
bx lr
_020D1324:
bl OS_RestoreInterrupts
b _020D1378
_020D132C:
ldr r0, [r7, #0xc]
ands r0, r0, #0x4
movne r0, #0x1
moveq r0, #0x0
cmp r0, #0x0
bne _020D135C
mov r0, r4
bl OS_RestoreInterrupts
add sp, sp, #0x4
mov r0, #0x1
ldmia sp!, {r4-r7,lr}
bx lr
_020D135C:
add r0, r7, #0x18
bl OS_SleepThread
ldr r0, [r7, #0xc]
ands r0, r0, #0x40
beq _020D135C
mov r0, r4
bl OS_RestoreInterrupts
_020D1378:
mov r0, r7
bl FSi_ExecuteSyncCommand
add sp, sp, #0x4
ldmia sp!, {r4-r7,lr}
bx lr
arm_func_start FSi_ExecuteSyncCommand
FSi_ExecuteSyncCommand: ; 0x020D138C
stmdb sp!, {r4,lr}
mov r4, r0
ldr r1, [r4, #0x10]
bl FSi_TranslateCommand
mov r1, r0
mov r0, r4
bl FSi_ReleaseCommand
ldr r0, [r4, #0x8]
bl FSi_NextCommand
_020D13B0:
cmp r0, #0x0
beq _020D13BC
bl FSi_ExecuteAsyncCommand
_020D13BC:
ldr r0, [r4, #0x14]
cmp r0, #0x0
moveq r0, #0x1
movne r0, #0x0
ldmia sp!, {r4,lr}
bx lr
arm_func_start FSi_ExecuteAsyncCommand
FSi_ExecuteAsyncCommand: ; 0x020D13D4
stmdb sp!, {r4-r8,lr}
movs r6, r0
ldr r5, [r6, #0x8]
ldmeqia sp!, {r4-r8,lr}
bxeq lr
mov r7, #0x0
mov r8, #0x1
_020D13F0:
bl OS_DisableInterrupts
ldr r1, [r6, #0xc]
mov r4, r0
orr r0, r1, #0x40
str r0, [r6, #0xc]
ldr r0, [r6, #0xc]
ands r0, r0, #0x4
movne r0, r8
moveq r0, r7
cmp r0, #0x0
beq _020D1434
add r0, r6, #0x18
bl OS_WakeupThread
mov r0, r4
bl OS_RestoreInterrupts
ldmia sp!, {r4-r8,lr}
bx lr
_020D1434:
ldr r1, [r6, #0xc]
mov r0, r4
orr r1, r1, #0x8
str r1, [r6, #0xc]
bl OS_RestoreInterrupts
ldr r1, [r6, #0x10]
mov r0, r6
bl FSi_TranslateCommand
cmp r0, #0x6
ldmeqia sp!, {r4-r8,lr}
bxeq lr
mov r0, r5
bl FSi_NextCommand
movs r6, r0
bne _020D13F0
ldmia sp!, {r4-r8,lr}
bx lr
arm_func_start FSi_NextCommand
FSi_NextCommand:
stmdb sp!, {r4-r9,lr}
sub sp, sp, #0x4c
mov r6, r0
bl OS_DisableInterrupts
ldr r1, [r6, #0x1c]
mov r5, r0
ands r0, r1, #0x20
beq _020D1500
ldr r0, [r6, #0x1c]
bic r0, r0, #0x20
str r0, [r6, #0x1c]
ldr r0, [r6, #0x24]
cmp r0, #0x0
beq _020D1500
mov r8, #0x0
mov r9, #0x1
mov r7, #0x3
_020D14BC:
ldr r1, [r0, #0xc]
ldr r4, [r0, #0x4]
ands r1, r1, #0x2
movne r1, r9
moveq r1, r8
cmp r1, #0x0
beq _020D14F4
ldr r1, [r6, #0x24]
cmp r1, r0
mov r1, r7
streq r4, [r6, #0x24]
bl FSi_ReleaseCommand
_020D14EC:
cmp r4, #0x0
ldreq r4, [r6, #0x24]
_020D14F4:
mov r0, r4
cmp r4, #0x0
bne _020D14BC
_020D1500:
ldr r0, [r6, #0x1c]
ands r0, r0, #0x40
bne _020D15EC
ldr r0, [r6, #0x1c]
ands r0, r0, #0x8
movne r0, #0x1
moveq r0, #0x0
cmp r0, #0x0
bne _020D15EC
ldr r4, [r6, #0x24]
cmp r4, #0x0
beq _020D15EC
ldr r0, [r6, #0x1c]
ands r0, r0, #0x10
movne r0, #0x1
moveq r0, #0x0
cmp r0, #0x0
moveq r7, #0x1
movne r7, #0x0
cmp r7, #0x0
ldrne r0, [r6, #0x1c]
orrne r0, r0, #0x10
strne r0, [r6, #0x1c]
mov r0, r5
bl OS_RestoreInterrupts
_020D1564:
cmp r7, #0x0
beq _020D1588
ldr r0, [r6, #0x58]
ands r0, r0, #0x200
beq _020D1588
ldr r2, [r6, #0x54]
mov r0, r4
mov r1, #0x9
blx r2
_020D1588:
bl OS_DisableInterrupts
ldr r1, [r4, #0xC]
mov r5, r0
orr r0, r1, #0x40
str r0, [r4, #0xC]
ldr r0, [r4, #0xC]
ands r0, r0, #0x4
movne r0, #0x1
moveq r0, #0x0
cmp r0, #0x0
beq _020D15D4
add r0, r4, #0x18
bl OS_WakeupThread
mov r0, r5
bl OS_RestoreInterrupts
add sp, sp, #0x4c
mov r0, #0x0
ldmia sp!, {r4-r9, lr}
bx lr
_020D15D4:
mov r0, r5
bl OS_RestoreInterrupts
add sp, sp, #0x4c
mov r0, r4
ldmia sp!, {r4-r9, lr}
bx lr
_020D15EC:
ldr r0, [r6, #0x1c]
ands r0, r0, #0x10
beq _020D162C
ldr r0, [r6, #0x1c]
bic r0, r0, #0x10
str r0, [r6, #0x1c]
ldr r0, [r6, #0x58]
ands r0, r0, #0x400
beq _020D162C
add r0, sp, #0x0
bl FS_InitFile
str r6, [sp, #0x8]
ldr r2, [r6, #0x54]
add r0, sp, #0x0
mov r1, #0xa
blx r2
_020D162C:
ldr r0, [r6, #0x1c]
ands r0, r0, #0x40
beq _020D1658
ldr r1, [r6, #0x1c]
add r0, r6, #0x14
bic r1, r1, #0x40
str r1, [r6, #0x1c]
ldr r1, [r6, #0x1c]
orr r1, r1, #0x8
str r1, [r6, #0x1c]
bl OS_WakeupThread
_020D1658:
mov r0, r5
bl OS_RestoreInterrupts
_020D1660:
mov r0, #0x0
add sp, sp, #0x4c
ldmia sp!, {r4-r9, lr}
bx lr
arm_func_start FSi_ReadMemoryCore
FSi_ReadMemoryCore: ; 0x020D1670
stmdb sp!, {lr}
sub sp, sp, #0x4
mov r0, r2
mov r2, r3
bl MI_CpuCopy8
_020D1684:
mov r0, #0x0
add sp, sp, #0x4
ldmfd sp!, {lr}
bx lr
arm_func_start FSi_WriteMemCallback
FSi_WriteMemCallback: ; 0x020D1694
stmdb sp!, {lr}
sub sp, sp, #0x4
ldr r12, [r0, #0x28]
mov r0, r1
add r1, r12, r2
mov r2, r3
bl MI_CpuCopy8
_020D16B0:
mov r0, #0x0
add sp, sp, #0x4
ldmfd sp!, {lr}
bx lr
arm_func_start FSi_ReadMemCallback
FSi_ReadMemCallback: ; 0x020D16C0
stmdb sp!, {lr}
sub sp, sp, #0x4
ldr r0, [r0, #0x28]
add r0, r0, r2
mov r2, r3
bl MI_CpuCopy8
_020D16D8:
mov r0, #0x0
add sp, sp, #0x4
ldmfd sp!, {lr}
bx lr
arm_func_start FSi_GetPackedName
FSi_GetPackedName: ; 0x020D16E8
stmdb sp!, {lr}
sub sp, sp, #0x4
cmp r1, #0x3
mov lr, #0x0
bgt _020D173C
mov r12, lr
cmp r1, #0x0
ble _020D173C
mov r3, lr
_020D170C:
ldrb r2, [r0, r12]
cmp r2, #0x0
beq _020D173C
sub r2, r2, #0x41
cmp r2, #0x19
addls r2, r2, #0x61
addhi r2, r2, #0x41
add r12, r12, #0x1
orr lr, lr, r2, lsl r3
cmp r12, r1
add r3, r3, #0x8
blt _020D170C
_020D173C:
mov r0, lr
add sp, sp, #0x4
ldmia sp!, {lr}
bx lr
arm_func_start FS_ChangeDir
FS_ChangeDir: ; 0x020D174C
stmdb sp!, {r4,lr}
sub sp, sp, #0x58
mov r4, r0
add r0, sp, #0xc
bl FS_InitFile
add r0, sp, #0xc
add r3, sp, #0x0
mov r1, r4
mov r2, #0x0
bl FSi_FindPath
_020D1774:
cmp r0, #0x0
moveq r0, #0x0
addne r0, sp, #0x0
ldrne r3, _020D179C
ldmneia r0, {r0, r1, r2}
stmneia r3, {r0, r1, r2}
movne r0, #0x1
add sp, sp, #0x58
ldmia sp!, {r4, lr}
bx lr
_020D179C: .word 0x021D53EC
arm_func_start FS_SeekFile
FS_SeekFile: ; 0x020D17A0
cmp r2, #0x0
beq _020D17BC
cmp r2, #0x1
beq _020D17C8
cmp r2, #0x2
beq _020D17D4
b _020D17E0
_020D17BC:
ldr r2, [r0, #0x24]
add r1, r1, r2
b _020D17E8
_020D17C8:
ldr r2, [r0, #0x2c]
add r1, r1, r2
b _020D17E8
_020D17D4:
ldr r2, [r0, #0x28]
add r1, r1, r2
b _020D17E8
_020D17E0:
mov r0, #0x0
bx lr
_020D17E8:
ldr r2, [r0, #0x24]
cmp r1, r2
movlt r1, r2
ldr r2, [r0, #0x28]
cmp r1, r2
movgt r1, r2
str r1, [r0, #0x2c]
mov r0, #0x1
bx lr
arm_func_start FS_ReadFile
FS_ReadFile: ; 0x020D180C
ldr ip, _020D1818 ; =FUN_020D1AAC
mov r3, #0x0
bx r12
.balign 4
_020D1818: .word FUN_020D1AAC
arm_func_start FS_ReadFileAsync
FS_ReadFileAsync: ; 0x020D181C
ldr ip, _020D1828 ; =FUN_020D1AAC
mov r3, #0x1
bx r12
.balign 4
_020D1828: .word FUN_020D1AAC
arm_func_start FS_WaitAsync
FS_WaitAsync: ; 0x020D182C
stmdb sp!, {r4-r7,lr}
sub sp, sp, #0x4
mov r6, r0
mov r5, #0x0
bl OS_DisableInterrupts
ldr r1, [r6, #0xc]
mov r4, r0
ands r0, r1, #0x1
movne r0, #0x1
moveq r0, r5
cmp r0, #0x0
beq _020D18BC
ldr r0, [r6, #0xc]
ands r0, r0, #0x44
moveq r5, #0x1
movne r5, #0x0
cmp r5, #0x0
beq _020D189C
ldr r0, [r6, #0xc]
orr r0, r0, #0x4
str r0, [r6, #0xc]
add r7, r6, #0x18
_020D1884:
mov r0, r7
bl OS_SleepThread
ldr r0, [r6, #0xc]
ands r0, r0, #0x40
beq _020D1884
b _020D18BC
_020D189C:
add r0, r6, #0x18
bl OS_SleepThread
ldr r0, [r6, #0xc]
ands r0, r0, #0x1
movne r0, #0x1
moveq r0, #0x0
cmp r0, #0x0
bne _020D189C
_020D18BC:
mov r0, r4
bl OS_RestoreInterrupts
_020D18C4:
cmp r5, #0x0
beq _020D18E0
mov r0, r6
bl FSi_ExecuteSyncCommand
add sp, sp, #4
ldmia sp!, {r4-r7,lr}
bx lr
_020D18E0:
ldr r0, [r6, #0x14]
cmp r0, #0x0
moveq r0, #0x1
movne r0, #0x0
add sp, sp, #0x4
ldmia sp!, {r4-r7,lr}
bx lr
arm_func_start FS_CloseFile
FS_CloseFile: ; 0x020D18FC
stmdb sp!, {r4,lr}
mov r1, #0x8
mov r4, r0
bl FSi_SendCommand
_020D190C:
cmp r0, #0x0
moveq r0, #0x0
ldmeqia sp!, {r4,lr}
bxeq lr
mov r0, #0x0
str r0, [r4, #0x8]
mov r0, #0xE
str r0, [r4, #0x10]
ldr r1, [r4, #0xC]
mov r0, #0x1
bic r1, r1, #0x30
str r1, [r4, #0xC]
ldmia sp!, {r4,lr}
bx lr
arm_func_start FS_OpenFile
FS_OpenFile: ; 0x020D1944
stmdb sp!, {r4,lr}
sub sp, sp, #0x8
mov r4, r0
add r0, sp, #0x0
bl FS_ConvertPathToFileID
_020D1958:
cmp r0, #0x0
beq _020D1984
add r1, sp, #0x0
mov r0, r4
ldmia r1, {r1, r2}
bl FS_OpenFileFast
cmp r0, #0x0
addne sp, sp, #0x8
movne r0, #0x1
ldmneia sp!, {r4, lr}
bxne lr
_020D1984:
mov r0, #0x0
add sp, sp, #0x8
ldmia sp!, {r4, lr}
bx lr
arm_func_start FS_OpenFileFast
FS_OpenFileFast:
stmdb sp!, {r0-r3}
stmdb sp!, {r4,lr}
ldr r1, [sp, #0xc]
mov r4, r0
cmp r1, #0x0
moveq r0, #0x0
ldmeqia sp!, {r4,lr}
addeq sp, sp, #0x10
bxeq lr
str r1, [r4, #0x8]
ldr r3, [sp, #0xc]
ldr r2, [sp, #0x10]
mov r1, #0x6
str r3, [r4, #0x30]
str r2, [r4, #0x34]
bl FSi_SendCommand
_020D19D4:
cmp r0, #0x0
moveq r0, #0x0
ldmeqia sp!, {r4, lr}
addeq sp, sp, #0x10
bxeq lr
ldr r1, [r4, #0xC]
mov r0, #0x1
orr r1, r1, #0x10
str r1, [r4, #0xC]
ldr r1, [r4, #0xC]
bic r1, r1, #0x20
str r1, [r4, #0xC]
ldmia sp!, {r4, lr}
add sp, sp, #0x10
bx lr
arm_func_start FS_OpenFileDirect
FS_OpenFileDirect:
stmdb sp!, {r4,lr}
mov r4, r0
str r1, [r4, #0x8]
ldr r12, [sp, #0x8]
mov r1, #0x7
str r12, [r4, #0x38]
str r2, [r4, #0x30]
str r3, [r4, #0x34]
bl FSi_SendCommand
_020D1A34:
cmp r0, #0x0
moveq r0, #0x0
ldmeqia sp!, {r4, lr}
bxeq lr
ldr r1, [r4, #0xC]
mov r0, #0x1
orr r1, r1, #0x10
str r1, [r4, #0xC]
ldr r1, [r4, #0xC]
bic r1, r1, #0x20
str r1, [r4, #0xC]
ldmia sp!, {r4, lr}
bx lr
arm_func_start FS_ConvertPathToFileID
FS_ConvertPathToFileID:
stmdb sp!, {r4-r5,lr}
sub sp, sp, #0x4c
mov r5, r0
add r0, sp, #0x0
mov r4, r1
bl FS_InitFile
_020D1A80:
add r0, sp, #0x0
mov r1, r4
mov r2, r5
mov r3, #0x0
bl FSi_FindPath
cmp r0, #0x0
movne r0, #0x1
moveq r0, #0x0
add sp, sp, #0x4C
ldmia sp!, {r4-r5, lr}
bx lr
arm_func_start FUN_020D1AAC
FUN_020D1AAC: ; 0x020D1AAC
stmdb sp!, {r4-r7,lr}
sub sp, sp, #0x4
mov r7, r0
ldr r4, [r7, #0x2c]
ldr r0, [r7, #0x28]
mov r6, r2
str r1, [r7, #0x30]
sub r0, r0, r4
cmp r6, r0
movgt r6, r0
cmp r6, #0x0
movlt r6, #0x0
str r2, [r7, #0x34]
mov r5, r3
str r6, [r7, #0x38]
cmp r5, #0x0
ldreq r0, [r7, #0xc]
mov r1, #0x0
orreq r0, r0, #0x4
streq r0, [r7, #0xc]
mov r0, r7
bl FSi_SendCommand
_020D1B04:
cmp r5, #0x0
bne _020D1B24
mov r0, r7
bl FS_WaitAsync
cmp r0, #0x0
ldrne r0, [r7, #0x2C]
subne r6, r0, r4
mvneq r6, #0x0
_020D1B24:
mov r0, r6
add sp, sp, #0x4
ldmia sp!, {r4-r7, lr}
bx lr
arm_func_start FSi_FindPath
FSi_FindPath:
stmdb sp!, {r4-r8,lr}
sub sp, sp, #0x10
mov r7, r1
ldrb r1, [r7, #0x0]
mov r8, r0
mov r6, r2
mov r5, r3
cmp r1, #0x2f
beq _020D1B60
cmp r1, #0x5c
bne _020D1B84
_020D1B60:
ldr r0, _020D1C90 ; =0x021D53EC
mov r1, #0x0
ldr r0, [r0, #0x0]
strh r1, [sp, #0x4]
str r0, [sp, #0x0]
str r1, [sp, #0x8]
strh r1, [sp, #0x6]
add r7, r7, #0x1
b _020D1C40
_020D1B84:
ldr r0, _020D1C90 ; =0x021D53EC
add r3, sp, #0x0
ldmia r0, {r0-r2}
stmia r3, {r0-r2}
mov r4, #0x0
_020D1B98:
ldrb r0, [r7, r4]
cmp r0, #0x0
beq _020D1C40
cmp r0, #0x2f
beq _020D1C40
cmp r0, #0x5c
beq _020D1C40
cmp r0, #0x3a
bne _020D1C34
mov r0, r7
mov r1, r4
bl FS_FindArchive
_020D1BC8:
cmp r0, #0x0
addeq sp, sp, #0x10
moveq r0, #0x0
ldmeqia sp!, {r4-r8,lr}
bxeq lr
ldr r1, [r0, #0x1C]
ands r1, r1, #0x2
movne r1, #0x1
moveq r1, #0x0
cmp r1, #0x0
addeq sp, sp, #0x10
moveq r0, #0x0
ldmeqia sp!, {r4-r8,lr}
bxeq lr
mov r1, #0x0
str r0, [sp]
str r1, [sp, #0x8]
strh r1, [sp, #0x6]
strh r1, [sp, #0x4]
add r0, r4, #0x1
ldrb r0, [r7, r0]!
cmp r0, #0x2f
beq _020D1C2C
cmp r0, #0x5c
bne _020D1C40
_020D1C2C:
add r7, r7, #0x1
b _020D1C40
_020D1C34:
add r4, r4, #0x1
cmp r4, #0x3
ble _020D1B98
_020D1C40:
ldr r1, [sp, #0x0]
add r0, sp, #0x0
str r1, [r8, #0x8]
str r7, [r8, #0x3c]
add r3, r8, #0x30
ldmia r0, {r0-r2}
stmia r3, {r0-r2}
cmp r5, #0x0
movne r0, #0x1
strne r0, [r8, #0x40]
strne r5, [r8, #0x44]
moveq r0, #0x0
streq r0, [r8, #0x40]
mov r0, r8
mov r1, #0x4
streq r6, [r8, #0x44]
bl FSi_SendCommand
add sp, sp, #0x10
ldmia sp!, {r4-r8,lr}
bx lr
.balign 4
_020D1C90: .word 0x021D53EC
arm_func_start FS_InitFile
FS_InitFile:
mov r3, #0x0
str r3, [r0, #0x0]
ldr r2, [r0, #0x0]
mov r1, #0xe
str r2, [r0, #0x4]
str r3, [r0, #0x1c]
ldr r2, [r0, #0x1c]
str r2, [r0, #0x18]
str r3, [r0, #0x8]
str r1, [r0, #0x10]
str r3, [r0, #0xc]
bx lr
arm_func_start FS_IsAvailable
FS_IsAvailable: ; 0x020D1CC4
ldr r0, _020D1CD0 ; =0x021D53F8
ldr r0, [r0, #0x0]
bx lr
.balign 4
_020D1CD0: .word 0x021D53F8
arm_func_start FS_Init
FS_Init: ; 0x020D1CD4
stmdb sp!, {lr}
sub sp, sp, #0x4
ldr r1, _020D1D0C ; =0x021D53F8
ldr r2, [r1, #0x0]
cmp r2, #0x0
addne sp, sp, #0x4
ldmneia sp!, {lr}
bxne lr
mov r2, #0x1
str r2, [r1, #0x0]
bl FSi_InitRom
add sp, sp, #0x4
ldmia sp!, {lr}
bx lr
.balign 4
_020D1D0C: .word 0x021D53F8
arm_func_start FS_TryLoadTable
FS_TryLoadTable: ; 0x020D1D10
ldr ip, _020D1D28 ; =FUN_020D0D84
mov r3, r0
mov r2, r1
ldr r0, _020D1D2C ; =0x021D5414
mov r1, r3
bx r12
.balign 4
_020D1D28: .word FUN_020D0D84
_020D1D2C: .word 0x021D5414
arm_func_start FS_SetDefaultDMA
FS_SetDefaultDMA: ; 0x020D1D30
stmdb sp!, {r4-r6,lr}
mov r6, r0
bl OS_DisableInterrupts
mov r5, r0
ldr r1, _020D1D7C ; =0x021D5400
ldr r0, _020D1D80 ; =0x021D5414
ldr r4, [r1, #0x0]
bl FS_SuspendArchive
ldr r1, _020D1D7C ; =0x021D5400
cmp r0, #0x0
str r6, [r1, #0x0]
beq _020D1D68
ldr r0, _020D1D80 ; =0x021D5414
bl FS_ResumeArchive
_020D1D68:
mov r0, r5
bl OS_RestoreInterrupts
mov r0, r4
ldmia sp!, {r4-r6,lr}
bx lr
.balign 4
_020D1D7C: .word 0x021D5400
_020D1D80: .word 0x021D5414
arm_func_start FSi_InitRom
FSi_InitRom: ; 0x020D1D84
stmdb sp!, {r4-r5,lr}
sub sp, sp, #0x14
ldr r1, _020D1EE8 ; =0x021D5400
str r0, [r1, #0x0]
bl OS_GetLockID
ldr r3, _020D1EEC ; =0x021D53FC
ldr r2, _020D1EF0 ; =0x021D5404
mov r12, #0x0
ldr r1, _020D1EF4 ; =0x021D540C
str r0, [r3, #0x0]
str r12, [r2, #0x0]
str r12, [r2, #0x4]
str r12, [r1, #0x0]
str r12, [r1, #0x4]
bl CARD_Init
ldr r0, _020D1EF8 ; =0x021D5414
bl FS_InitArchive
ldr r0, _020D1EF8 ; =0x021D5414
ldr r1, _020D1EFC ; =0x02106830
mov r2, #0x3
bl FS_RegisterArchiveName
ldr r0, _020D1F00 ; =0x027FFC40
ldrh r0, [r0, #0x0]
cmp r0, #0x2
bne _020D1E4C
ldr ip, _020D1EF0 ; =0x021D5404
mvn r2, #0x0
ldr r3, _020D1EF4 ; =0x021D540C
mov lr, #0x0
ldr r0, _020D1EF8 ; =0x021D5414
ldr r1, _020D1F04 ; =FSi_EmptyArchiveProc
str r2, [r12, #0x0]
str lr, [r12, #0x4]
str r2, [r3, #0x0]
str lr, [r3, #0x4]
bl FS_SetArchiveProc
mov r1, #0x0
str r1, [sp, #0x0]
ldr r0, _020D1F08 ; =FSi_ReadDummyCallback
str r1, [sp, #0x4]
str r0, [sp, #0x8]
ldr ip, _020D1F0C ; =FSi_WriteDummyCallback
ldr r0, _020D1EF8 ; =0x021D5414
mov r2, r1
mov r3, r1
str r12, [sp, #0xc]
bl FS_LoadArchive
add sp, sp, #0x14
ldmia sp!, {r4-r5,lr}
bx lr
_020D1E4C:
ldr r5, _020D1F10 ; =0x027FFE40
ldr r0, _020D1EF8 ; =0x021D5414
ldr r1, _020D1F14 ; =FSi_RomArchiveProc
ldr r2, _020D1F18 ; =0x00000602
ldr r4, _020D1F1C ; =0x027FFE48
bl FS_SetArchiveProc
ldr r1, [r5, #0x0]
mvn r0, #0x0
cmp r1, r0
addeq sp, sp, #0x14
ldmeqia sp!, {r4-r5,lr}
bxeq lr
cmp r1, #0x0
addeq sp, sp, #0x14
ldmeqia sp!, {r4-r5,lr}
bxeq lr
ldr r2, [r4, #0x0]
cmp r2, r0
addeq sp, sp, #0x14
ldmeqia sp!, {r4-r5,lr}
bxeq lr
cmp r2, #0x0
addeq sp, sp, #0x14
ldmeqia sp!, {r4-r5,lr}
bxeq lr
str r1, [sp, #0x0]
ldr r0, [r5, #0x4]
ldr r1, _020D1F20 ; =FSi_ReadRomCallback
str r0, [sp, #0x4]
ldr r0, _020D1F0C ; =FSi_WriteDummyCallback
str r1, [sp, #0x8]
str r0, [sp, #0xc]
ldr r3, [r4, #0x4]
ldr r0, _020D1EF8 ; =0x021D5414
mov r1, #0x0
bl FS_LoadArchive
add sp, sp, #0x14
ldmia sp!, {r4-r5,lr}
bx lr
.balign 4
_020D1EE8: .word 0x021D5400
_020D1EEC: .word 0x021D53FC
_020D1EF0: .word 0x021D5404
_020D1EF4: .word 0x021D540C
_020D1EF8: .word 0x021D5414
_020D1EFC: .word 0x02106830
_020D1F00: .word 0x027FFC40
_020D1F04: .word FSi_EmptyArchiveProc
_020D1F08: .word FSi_ReadDummyCallback
_020D1F0C: .word FSi_WriteDummyCallback
_020D1F10: .word 0x027FFE40
_020D1F14: .word FSi_RomArchiveProc
_020D1F18: .word 0x00000602
_020D1F1C: .word 0x027FFE48
_020D1F20: .word FSi_ReadRomCallback
arm_func_start FSi_EmptyArchiveProc
FSi_EmptyArchiveProc: ; 0x020D1F24
mov r0, #0x4
bx lr
arm_func_start FSi_ReadDummyCallback
FSi_ReadDummyCallback: ; 0x020D1F2C
mov r0, #0x1
bx lr
arm_func_start FSi_RomArchiveProc
FSi_RomArchiveProc: ; 0x020D1F34
stmdb sp!, {lr}
sub sp, sp, #0x4
cmp r1, #0x1
beq _020D1FA0
cmp r1, #0x9
beq _020D1F58
cmp r1, #0xa
beq _020D1F7C
b _020D1FB0
_020D1F58:
ldr r0, _020D1FC0 ; =0x021D53FC
ldr r0, [r0, #0x0]
mov r0, r0, lsl #0x10
mov r0, r0, lsr #0x10
bl CARD_LockRom
add sp, sp, #0x4
mov r0, #0x0
ldmia sp!, {lr}
bx lr
_020D1F7C:
ldr r0, _020D1FC0 ; =0x021D53FC
ldr r0, [r0, #0x0]
mov r0, r0, lsl #0x10
mov r0, r0, lsr #0x10
bl CARD_UnlockRom
add sp, sp, #0x4
mov r0, #0x0
ldmia sp!, {lr}
bx lr
_020D1FA0:
add sp, sp, #0x4
mov r0, #0x4
ldmia sp!, {lr}
bx lr
_020D1FB0:
mov r0, #0x8
add sp, sp, #0x4
ldmia sp!, {lr}
bx lr
.balign 4
_020D1FC0: .word 0x021D53FC
arm_func_start FSi_WriteDummyCallback
FSi_WriteDummyCallback: ; 0x020D1FC4
mov r0, #0x1
bx lr
arm_func_start FSi_ReadRomCallback
FSi_ReadRomCallback: ; 0x020D1FCC
stmdb sp!, {lr}
sub sp, sp, #0xc
ldr ip, _020D2010 ; =FSi_OnRomReadDone
mov lr, r1
str r12, [sp, #0x0]
str r0, [sp, #0x4]
mov r1, #0x1
ldr r0, _020D2014 ; =0x021D5400
str r1, [sp, #0x8]
mov r1, r2
ldr r0, [r0, #0x0]
mov r2, lr
bl CARDi_ReadRom
mov r0, #0x6
add sp, sp, #0xc
ldmia sp!, {lr}
bx lr
.balign 4
_020D2010: .word FSi_OnRomReadDone
_020D2014: .word 0x021D5400
arm_func_start FSi_OnRomReadDone
FSi_OnRomReadDone: ; 0x020D2018
stmdb sp!, {r4,lr}
mov r4, r0
bl CARD_IsPulledOut
_020D2024:
cmp r0, #0x0
movne r1, #0x5
moveq r1, #0x0
mov r0, r4
bl FS_NotifyArchiveAsyncEnd
ldmia sp!, {r4,lr}
bx lr
arm_func_start FS_UnloadOverlay
FS_UnloadOverlay: ; 0x020D2040
stmdb sp!, {lr}
sub sp, sp, #0x2c
mov r3, r0
mov r2, r1
add r0, sp, #0x0
mov r1, r3
bl FS_LoadOverlayInfo
_020D205C:
cmp r0, #0x0
beq _020D2074
add r0, sp, #0x0
bl FS_UnloadOverlayImage
cmp r0, #0x0
bne _020D2084
_020D2074:
add sp, sp, #0x2c
mov r0, #0x0
ldmfd sp!, {lr}
bx lr
_020D2084:
mov r0, #0x1
add sp, sp, #0x2c
ldmfd sp!, {lr}
bx lr
arm_func_start FS_LoadOverlay
FS_LoadOverlay: ; 0x020D2094
stmdb sp!, {lr}
sub sp, sp, #0x2c
mov r3, r0
mov r2, r1
add r0, sp, #0x0
mov r1, r3
bl FS_LoadOverlayInfo
_020D20B0:
cmp r0, #0x0
beq _020D20C8
add r0, sp, #0x0
bl FS_LoadOverlayImage
cmp r0, #0x0
bne _020D20D8
_020D20C8:
add sp, sp, #0x2c
mov r0, #0x0
ldmfd sp!, {lr}
bx lr
_020D20D8:
add r0, sp, #0x0
bl FS_StartOverlay
mov r0, #0x1
add sp, sp, #0x2c
ldmfd sp!, {lr}
bx lr
arm_func_start FS_UnloadOverlayImage
FS_UnloadOverlayImage: ; 0x020D20F0
stmdb sp!, {lr}
sub sp, sp, #0x4
bl FS_EndOverlay
mov r0, #0x1
add sp, sp, #0x4
ldmia sp!, {lr}
bx lr
arm_func_start FS_EndOverlay
FS_EndOverlay: ; 0x020D210C
stmdb sp!, {r4-r11,lr}
sub sp, sp, #0x4
ldr r8, _020D220C ; =0x021D74C8
mov r11, r0
mov r9, #0x0
_020D2120:
ldr r1, [r11, #0x8]
ldr r0, [r11, #0xc]
ldr r5, [r11, #0x4]
add r0, r1, r0
mov r7, r9
mov r6, r9
add r4, r5, r0
bl OS_DisableInterrupts
ldr lr, [r8, #0x0]
mov r10, r9
mov r12, lr
cmp lr, #0x0
beq _020D21C4
_020D2154:
ldr r2, [r12, #0x8]
ldr r3, [r12, #0x0]
cmp r2, #0x0
ldr r1, [r12, #0x4]
bne _020D2178
cmp r1, r5
blo _020D2178
cmp r1, r4
blo _020D2188
_020D2178:
cmp r2, r5
blo _020D21B4
cmp r2, r4
bhs _020D21B4
_020D2188:
cmp r6, #0x0
strne r12, [r6, #0x0]
moveq r7, r12
cmp lr, r12
streq r3, [r8, #0x0]
moveq lr, r3
str r9, [r12, #0x0]
cmp r10, #0x0
mov r6, r12
strne r3, [r10, #0x0]
b _020D21B8
_020D21B4:
mov r10, r12
_020D21B8:
mov r12, r3
cmp r3, #0x0
bne _020D2154
_020D21C4:
bl OS_RestoreInterrupts
_020D21C8:
cmp r7, #0x0
addeq sp, sp, #0x4
ldmeqia sp!, {r4-r11, lr}
bxeq lr
_020D21D8:
ldr r1, [r7, #0x4]
ldr r4, [r7]
cmp r1, #0x0
beq _020D21F0
ldr r0, [r7, #0x8]
blx r1
_020D21F0:
mov r7, r4
cmp r4, #0x0
bne _020D21D8
b _020D2120
add sp, sp, #0x4
ldmia sp!, {r4-r11, lr}
bx lr
_020D220C: .word 0x021D74C8
arm_func_start FS_StartOverlay
FS_StartOverlay: ; 0x020D2210
stmdb sp!, {r4-r6,lr}
mov r5, r0
bl FSi_GetOverlayBinarySize
ldr r1, _020D2300 ; =0x027FFC40
mov r4, r0
ldrh r0, [r1, #0x0]
cmp r0, #0x2
bne _020D22A4
ldrb r1, [r5, #0x1f]
mov r0, #0x0
ands r1, r1, #0x2
beq _020D2280
ldr r1, _020D2304 ; =0x02106F84
ldr r3, _020D2308 ; =0x02106F84
ldr r2, _020D230C ; =0x66666667
sub r12, r1, r3
smull r1, lr, r2, r12
mov lr, lr, asr #0x3
mov r1, r12, lsr #0x1f
ldr r2, [r5, #0x0]
add lr, r1, lr
cmp r2, lr
bhs _020D2280
mov r0, #0x14
mla r0, r2, r0, r3
ldr r1, [r5, #0x4]
mov r2, r4
bl FSi_CompareDigest
_020D2280:
cmp r0, #0x0
bne _020D22A4
ldr r0, [r5, #0x4]
mov r2, r4
mov r1, #0x0
bl MI_CpuFill8
bl OS_Terminate
ldmia sp!, {r4-r6,lr}
bx lr
_020D22A4:
ldrb r0, [r5, #0x1f]
ands r0, r0, #0x1
beq _020D22BC
ldr r0, [r5, #0x4]
add r0, r0, r4
bl MIi_UncompressBackward
_020D22BC:
ldr r0, [r5, #0x4]
ldr r1, [r5, #0x8]
bl DC_FlushRange
ldr r6, [r5, #0x10]
ldr r4, [r5, #0x14]
cmp r6, r4
ldmcsia sp!, {r4-r6,lr}
bxcs lr
_020D22DC:
ldr r0, [r6, #0x0]
cmp r0, #0x0
beq _020D22EC
blx r0
_020D22EC:
add r6, r6, #0x4
cmp r6, r4
blo _020D22DC
ldmia sp!, {r4-r6,lr}
bx lr
.balign 4
_020D2300: .word 0x027FFC40
_020D2304: .word 0x02106F84
_020D2308: .word 0x02106F84
_020D230C: .word 0x66666667
arm_func_start FSi_CompareDigest
FSi_CompareDigest:
stmdb sp!, {r4-r6,lr}
sub sp, sp, #0x58
mov r4, r0
mov r6, r1
mov r5, r2
add r0, sp, #0x4
mov r1, #0x0
mov r2, #0x14
bl MI_CpuFill8
ldr r0, _020D23AC ; =0x02106834
ldr r1, _020D23B0 ; =0x02106838
ldr r0, [r0, #0x0]
ldr r2, [r1, #0x0]
add r1, sp, #0x18
bl MI_CpuCopy8
ldr r3, _020D23B0 ; =0x02106838
mov r1, r6
ldr r12, [r3, #0x0]
mov r2, r5
add r0, sp, #0x4
add r3, sp, #0x18
str r12, [sp, #0x0]
bl MATH_CalcHMACSHA1
add r2, sp, #0x4
mov r3, #0x0
_020D2374:
ldr r1, [r2, #0x0]
ldr r0, [r4, r3]
cmp r1, r0
bne _020D2394
add r3, r3, #0x4
cmp r3, #0x14
add r2, r2, #0x4
blo _020D2374
_020D2394:
cmp r3, #0x14
moveq r0, #0x1
movne r0, #0x0
add sp, sp, #0x58
ldmia sp!, {r4-r6,lr}
bx lr
.balign 4
_020D23AC: .word 0x02106834
_020D23B0: .word 0x02106838
arm_func_start FS_LoadOverlayImage
FS_LoadOverlayImage: ; 0x020D23B4
stmdb sp!, {r4-r5,lr}
sub sp, sp, #0x54
mov r5, r0
add r0, sp, #0x8
bl FS_InitFile
_020D23C8:
add r0, sp, #0x0
mov r1, r5
bl FS_GetOverlayFileID
add r1, sp, #0x0
add r0, sp, #0x8
ldmia r1, {r1, r2}
bl FS_OpenFileFast
cmp r0, #0x0
addeq sp, sp, #0x54
moveq r0, #0x0
ldmeqia sp!, {r4-r5, lr}
bxeq lr
mov r0, r5
bl FSi_GetOverlayBinarySize
mov r4, r0
mov r0, r5
bl FS_ClearOverlayImage
ldr r1, [r5, #0x4]
add r0, sp, #0x8
mov r2, r4
bl FS_ReadFile
cmp r4, r0
beq _020D243C
add r0, sp, #0x8
bl FS_CloseFile
add sp, sp, #0x54
mov r0, #0x0
ldmia sp!, {r4-r5, lr}
bx lr
_020D243C:
add r0, sp, #0x8
bl FS_CloseFile
mov r0, #0x1
add sp, sp, #0x54
ldmia sp!, {r4-r5, lr}
bx lr
arm_func_start FS_LoadOverlayImageAsync
FS_LoadOverlayImageAsync: ; 0x020D2454
stmdb sp!, {r4-r6,lr}
sub sp, sp, #0x8
mov r5, r1
mov r6, r0
mov r0, r5
bl FS_InitFile
_020D246C:
add r0, sp, #0x0
mov r1, r6
bl FS_GetOverlayFileID
add r1, sp, #0x0
mov r0, r5
ldmia r1, {r1, r2}
bl FS_OpenFileFast
cmp r0, #0x0
addeq sp, sp, #0x8
moveq r0, #0x0
ldmeqia sp!, {r4-r6, lr}
bxeq lr
mov r0, r6
bl FSi_GetOverlayBinarySize
mov r4, r0
mov r0, r6
bl FS_ClearOverlayImage
ldr r1, [r6, #0x4]
mov r0, r5
mov r2, r4
bl FS_ReadFileAsync
cmp r4, r0
addeq sp, sp, #0x8
moveq r0, #0x1
ldmeqia sp!, {r4-r6, lr}
bxeq lr
mov r0, r5
bl FS_CloseFile
mov r0, #0x0
add sp, sp, #0x8
ldmia sp!, {r4-r6, lr}
bx lr
arm_func_start FS_LoadOverlayInfo
FS_LoadOverlayInfo:
stmdb sp!, {r4-r5,lr}
sub sp, sp, #0x64
movs r4, r1
mov r5, r0
ldreq r0, _020D25EC ; =0x021D5404
ldrne r0, _020D25F0 ; =0x021D540C
ldr r3, [r0, #0x0]
cmp r3, #0x0
beq _020D25A8
ldr r0, [r0, #0x4]
mov r2, r2, lsl #0x5
cmp r2, r0
addcs sp, sp, #0x64
movcs r0, #0x0
ldmcsia sp!, {r4-r5,lr}
bxcs lr
add r0, r3, r2
mov r1, r5
mov r2, #0x20
bl MI_CpuCopy8
add r0, sp, #0x18
str r4, [r5, #0x20]
bl FS_InitFile
add r0, sp, #0x10
mov r1, r5
bl FS_GetOverlayFileID
add r1, sp, #0x10
add r0, sp, #0x18
ldmia r1, {r1-r2}
bl FS_OpenFileFast
_020D2564:
cmp r0, #0x0
addeq sp, sp, #0x64
moveq r0, #0x0
ldmeqia sp!, {r4-r5,lr}
bxeq lr
ldr r1, [sp, #0x3c]
add r0, sp, #0x18
str r1, [r5, #0x24]
ldr r2, [sp, #0x40]
ldr r1, [sp, #0x3c]
sub r1, r2, r1
str r1, [r5, #0x28]
bl FS_CloseFile
add sp, sp, #0x64
mov r0, #0x1
ldmia sp!, {r4-r5,lr}
bx lr
_020D25A8:
ldr r1, _020D25F4 ; =0x027FFE50
ldr ip, _020D25F8 ; =0x027FFE58
ldr r0, [r1, #0x0]
ldr r3, _020D25FC ; =0x021D5414
str r0, [sp, #0x0]
ldr r1, [r1, #0x4]
mov r0, r5
str r1, [sp, #0x4]
ldr r5, [r12, #0x0]
mov r1, r4
str r5, [sp, #0x8]
ldr r4, [r12, #0x4]
str r4, [sp, #0xc]
bl FSi_LoadOverlayInfoCore
add sp, sp, #0x64
ldmia sp!, {r4-r5,lr}
bx lr
.balign 4
_020D25EC: .word 0x021D5404
_020D25F0: .word 0x021D540C
_020D25F4: .word 0x027FFE50
_020D25F8: .word 0x027FFE58
_020D25FC: .word 0x021D5414
arm_func_start FSi_LoadOverlayInfoCore
FSi_LoadOverlayInfoCore: ; 0x020D2600
stmdb sp!, {r4-r9,lr}
sub sp, sp, #0x54
movs r9, r1
ldreq r5, [sp, #0x74]
ldreq r6, [sp, #0x70]
ldrne r5, [sp, #0x7c]
ldrne r6, [sp, #0x78]
mov r7, r2, lsl #0x5
cmp r7, r5
mov r4, r0
mov r8, r3
addcs sp, sp, #0x54
movcs r0, #0x0
ldmcsia sp!, {r4-r9,lr}
bxcs lr
add r0, sp, #0xc
bl FS_InitFile
mvn r12, #0x0
add r0, sp, #0xc
mov r1, r8
add r2, r6, r7
add r3, r6, r5
str r12, [sp, #0x0]
bl FS_OpenFileDirect
_020D2660:
cmp r0, #0
addeq sp, sp, #0x54
moveq r0, #0
ldmeqia sp!, {r4-r9, lr}
bxeq lr
add r0, sp, #12
mov r1, r4
mov r2, #32
bl FS_ReadFile
cmp r0, #32
beq _020D26A4
add r0, sp, #12
bl FS_CloseFile
add sp, sp, #0x54
mov r0, #0x0
ldmia sp!, {r4-r9, lr}
bx lr
_020D26A4:
add r0, sp, #0xC
bl FS_CloseFile
add r0, sp, #0x4
mov r1, r4
str r9, [r4, #0x20]
bl FS_GetOverlayFileID
add r1, sp, #0x4
add r0, sp, #0xC
ldmia r1, {r1, r2}
bl FS_OpenFileFast
cmp r0, #0x0
addeq sp, sp, #0x54
moveq r0, #0x0
ldmeqia sp!, {r4-r9, lr}
bxeq lr
ldr r1, [sp, #0x30]
add r0, sp, #0xC
str r1, [r4, #0x24]
ldr r2, [sp, #0x34]
ldr r1, [sp, #0x30]
sub r1, r2, r1
str r1, [r4, #0x28]
bl FS_CloseFile
mov r0, #0x1
add sp, sp, #0x54
ldmia sp!, {r4-r9, lr}
bx lr
arm_func_start FS_GetOverlayFileID
FS_GetOverlayFileID: ; 0x020D2710
sub sp, sp, #0x8
ldr r2, _020D2734 ; =0x021D5414
str r2, [sp, #0x0]
ldr r1, [r1, #0x18]
str r1, [sp, #0x4]
str r2, [r0, #0x0]
str r1, [r0, #0x4]
add sp, sp, #0x8
bx lr
.balign 4
_020D2734: .word 0x021D5414
arm_func_start FS_ClearOverlayImage
FS_ClearOverlayImage: ; 0x020D2738
stmdb sp!, {r4-r6,lr}
ldr r5, [r0, #0x8]
ldr r1, [r0, #0xc]
ldr r6, [r0, #0x4]
add r4, r5, r1
mov r0, r6
mov r1, r4
bl IC_InvalidateRange
mov r0, r6
mov r1, r4
bl DC_InvalidateRange
add r0, r6, r5
sub r2, r4, r5
mov r1, #0x0
bl MI_CpuFill8
ldmia sp!, {r4-r6,lr}
bx lr
arm_func_start FSi_GetOverlayBinarySize
FSi_GetOverlayBinarySize: ; 0x020D277C
ldrb r1, [r0, #0x1f]
ands r1, r1, #0x1
ldrne r0, [r0, #0x1c]
movne r0, r0, lsl #0x8
movne r0, r0, lsr #0x8
ldreq r0, [r0, #0x8]
bx lr
arm_func_start ProcessBlock
ProcessBlock: ; 0x020D2798
stmdb sp!, {r4-r11,lr}
sub sp, sp, #0x4
add r3, r0, #0x18
ldr r5, [r0, #0x0]
ldr r4, [r0, #0x4]
ldr lr, [r0, #0x8]
ldr r12, [r0, #0xc]
ldr r2, _020D2B78 ; =0x02106900
mov r8, r3
mov r7, #0x0
_020D27C0:
mvn r1, r4
and r6, r4, lr
and r1, r1, r12
orr r1, r6, r1
ldr r6, [r8, #0x0]
add r1, r5, r1
ldr r5, [r2, #0x0]
add r1, r6, r1
add r5, r5, r1
mov r1, r5, lsl #0x7
orr r1, r1, r5, lsr #0x19
add r5, r4, r1
mvn r1, r5
and r6, r5, r4
and r1, r1, lr
orr r1, r6, r1
ldr r6, [r8, #0x4]
add r1, r12, r1
ldr r9, [r2, #0x4]
add r1, r6, r1
add r6, r9, r1
mov r1, r6, lsl #0xc
orr r1, r1, r6, lsr #0x14
add r12, r5, r1
mvn r1, r12
and r6, r12, r5
and r1, r1, r4
orr r6, r6, r1
add r1, r8, #0xc
ldr r9, [r8, #0x8]
add r6, lr, r6
add r6, r9, r6
ldr r9, [r2, #0x8]
ldr r1, [r1, #0x0]
add r10, r9, r6
add r6, r2, #0xc
ldr r6, [r6, #0x0]
mov r9, r10, lsl #0x11
orr r9, r9, r10, lsr #0xf
add lr, r12, r9
add r2, r2, #0x10
add r8, r8, #0x10
and r10, lr, r12
mvn r9, lr
and r9, r9, r5
orr r9, r10, r9
add r4, r4, r9
add r1, r1, r4
add r4, r6, r1
mov r1, r4, lsl #0x16
orr r1, r1, r4, lsr #0xa
add r4, lr, r1
add r7, r7, #0x1
cmp r7, #0x4
blt _020D27C0
ldr r6, _020D2B7C ; =0x02106840
mov r1, #0x0
_020D28A4:
mvn r7, r12
ldr r9, [r6, #0x0]
and r8, r4, r12
and r7, lr, r7
orr r7, r8, r7
ldr r8, [r3, r9, lsl #0x2]
add r5, r5, r7
ldr r7, [r2, #0x0]
add r5, r8, r5
add r7, r7, r5
mov r5, r7, lsl #0x5
orr r5, r5, r7, lsr #0x1b
add r5, r4, r5
mvn r8, lr
ldr r7, [r6, #0x4]
and r9, r5, lr
and r8, r4, r8
orr r10, r9, r8
mvn r8, r4
ldr r9, [r6, #0x8]
ldr r11, [r3, r7, lsl #0x2]
add r7, r12, r10
add r10, r11, r7
add r7, r6, #0xc
ldr r9, [r3, r9, lsl #0x2]
and r8, r5, r8
ldr r7, [r7, #0x0]
ldr r11, [r2, #0x4]
ldr r7, [r3, r7, lsl #0x2]
add r11, r11, r10
mov r10, r11, lsl #0x9
orr r10, r10, r11, lsr #0x17
add r12, r5, r10
ldr r10, [r2, #0x8]
and r11, r12, r4
orr r8, r11, r8
add r8, lr, r8
add r8, r9, r8
add r10, r10, r8
add r8, r2, #0xc
ldr r8, [r8, #0x0]
mov r9, r10, lsl #0xe
orr r9, r9, r10, lsr #0x12
add lr, r12, r9
add r2, r2, #0x10
add r6, r6, #0x10
and r10, lr, r5
mvn r9, r5
and r9, r12, r9
orr r9, r10, r9
add r4, r4, r9
add r4, r7, r4
add r7, r8, r4
mov r4, r7, lsl #0x14
orr r4, r4, r7, lsr #0xc
add r4, lr, r4
add r1, r1, #0x1
cmp r1, #0x4
blt _020D28A4
mov r7, #0x0
_020D2994:
ldr r8, [r6, #0x0]
eor r1, r4, lr
eor r1, r12, r1
add r1, r5, r1
ldr r8, [r3, r8, lsl #0x2]
ldr r5, [r2, #0x0]
add r1, r8, r1
add r5, r5, r1
mov r1, r5, lsl #0x4
orr r1, r1, r5, lsr #0x1c
add r5, r4, r1
ldr r8, [r6, #0x4]
eor r1, r5, r4
eor r1, lr, r1
ldr r8, [r3, r8, lsl #0x2]
add r1, r12, r1
ldr r9, [r6, #0x8]
ldr r10, [r2, #0x4]
add r1, r8, r1
add r8, r10, r1
mov r1, r8, lsl #0xb
orr r1, r1, r8, lsr #0x15
add r12, r5, r1
eor r8, r12, r5
eor r8, r4, r8
ldr r9, [r3, r9, lsl #0x2]
add r8, lr, r8
add r9, r9, r8
ldr r10, [r2, #0x8]
add r1, r2, #0xc
ldr r8, [r6, #0xc]
add r10, r10, r9
ldr r9, [r3, r8, lsl #0x2]
mov r8, r10, lsl #0x10
orr r8, r8, r10, lsr #0x10
add lr, r12, r8
eor r8, lr, r12
eor r8, r5, r8
add r4, r4, r8
add r7, r7, #0x1
ldr r1, [r1, #0x0]
add r4, r9, r4
add r4, r1, r4
mov r1, r4, lsl #0x17
orr r1, r1, r4, lsr #0x9
add r2, r2, #0x10
add r6, r6, #0x10
add r4, lr, r1
cmp r7, #0x4
blt _020D2994
mov r10, #0x0
_020D2A60:
mvn r1, r12
ldr r7, [r6, #0x0]
orr r1, r4, r1
eor r1, lr, r1
ldr r7, [r3, r7, lsl #0x2]
add r1, r5, r1
ldr r5, [r2, #0x0]
add r1, r7, r1
add r5, r5, r1
mov r1, r5, lsl #0x6
orr r1, r1, r5, lsr #0x1a
add r5, r4, r1
mvn r1, lr
ldr r7, [r6, #0x4]
orr r1, r5, r1
eor r1, r4, r1
ldr r8, [r6, #0x8]
ldr r7, [r3, r7, lsl #0x2]
add r1, r12, r1
ldr r9, [r2, #0x4]
add r1, r7, r1
add r9, r9, r1
mov r7, r9, lsl #0xa
add r1, r6, #0xc
orr r9, r7, r9, lsr #0x16
ldr r1, [r1, #0x0]
add r7, r2, #0xc
add r12, r5, r9
ldr r8, [r3, r8, lsl #0x2]
ldr r7, [r7, #0x0]
ldr r1, [r3, r1, lsl #0x2]
ldr r9, [r2, #0x8]
mvn r11, r4
orr r11, r12, r11
eor r11, r5, r11
add r11, lr, r11
add r8, r8, r11
add r9, r9, r8
mov r8, r9, lsl #0xf
orr r8, r8, r9, lsr #0x11
add lr, r12, r8
add r2, r2, #0x10
add r6, r6, #0x10
mvn r8, r5
orr r8, lr, r8
eor r8, r12, r8
add r4, r4, r8
add r1, r1, r4
add r4, r7, r1
mov r1, r4, lsl #0x15
orr r1, r1, r4, lsr #0xb
add r4, lr, r1
add r10, r10, #0x1
cmp r10, #0x4
blt _020D2A60
ldr r1, [r0, #0x0]
add r1, r1, r5
str r1, [r0, #0x0]
ldr r1, [r0, #0x4]
add r1, r1, r4
str r1, [r0, #0x4]
ldr r1, [r0, #0x8]
add r1, r1, lr
str r1, [r0, #0x8]
ldr r1, [r0, #0xc]
add r1, r1, r12
str r1, [r0, #0xc]
add sp, sp, #0x4
ldmia sp!, {r4-r11,lr}
bx lr
.balign 4
_020D2B78: .word 0x02106900
_020D2B7C: .word 0x02106840
arm_func_start MATH_MD5GetHash
MATH_MD5GetHash: ; 0x020D2B80
stmdb sp!, {r4-r7,lr}
sub sp, sp, #0x4
mov r6, r1
ldr r1, [r6, #0x14]
ldr r3, [r6, #0x10]
mov r7, r0
mov r4, r1, lsl #0x3
ldr r1, _020D2C40 ; =0x0210683C
mov r0, r6
mov r2, #0x1
orr r4, r4, r3, lsr #0x1d
mov r5, r3, lsl #0x3
bl MATH_MD5Update
ldr r0, [r6, #0x10]
mov r1, #0x0
and r3, r0, #0x3f
rsb r2, r3, #0x40
cmp r2, #0x8
bhs _020D2BE8
add r0, r6, #0x18
add r0, r0, r3
bl MI_CpuFill8
mov r0, r6
bl ProcessBlock
mov r3, #0x0
mov r2, #0x40
_020D2BE8:
cmp r2, #0x8
bls _020D2C04
add r0, r6, #0x18
add r0, r0, r3
sub r2, r2, #0x8
mov r1, #0x0
bl MI_CpuFill8
_020D2C04:
str r5, [r6, #0x50]
mov r0, r6
str r4, [r6, #0x54]
bl ProcessBlock
mov r0, r6
mov r1, r7
mov r2, #0x10
bl MI_CpuCopy8
mov r0, r6
mov r1, #0x0
mov r2, #0x58
bl MI_CpuFill8
add sp, sp, #0x4
ldmia sp!, {r4-r7,lr}
bx lr
.balign 4
_020D2C40: .word 0x0210683C
arm_func_start MATH_MD5Update
MATH_MD5Update: ; 0x020D2C44
stmdb sp!, {r4-r9,lr}
sub sp, sp, #0x4
mov r8, r0
add r12, r8, #0x10
ldr r4, [r8, #0x10]
mov r6, r2
and r3, r4, #0x3f
ldr r0, [r12, #0x4]
adds r4, r4, r6
str r4, [r8, #0x10]
adc r0, r0, #0x0
rsb r5, r3, #0x40
mov r7, r1
str r0, [r12, #0x4]
cmp r5, r6
bls _020D2CB0
cmp r6, #0x0
addeq sp, sp, #0x4
ldmeqia sp!, {r4-r9,lr}
bxeq lr
add r1, r8, #0x18
mov r0, r7
add r1, r1, r3
bl MI_CpuCopy8
add sp, sp, #0x4
ldmia sp!, {r4-r9,lr}
bx lr
_020D2CB0:
add r1, r8, #0x18
mov r0, r7
mov r2, r5
add r1, r1, r3
bl MI_CpuCopy8
mov r0, r8
bl ProcessBlock
sub r6, r6, r5
mov r4, r6, lsr #0x6
cmp r4, #0x0
add r9, r7, r5
ble _020D2D10
add r7, r8, #0x18
mov r5, #0x40
_020D2CE8:
mov r0, r9
mov r1, r7
mov r2, r5
bl MI_CpuCopy8
mov r0, r8
add r9, r9, #0x40
bl ProcessBlock
sub r4, r4, #0x1
cmp r4, #0x0
bgt _020D2CE8
_020D2D10:
ands r2, r6, #0x3f
addeq sp, sp, #0x4
ldmeqia sp!, {r4-r9,lr}
bxeq lr
mov r0, r9
add r1, r8, #0x18
bl MI_CpuCopy8
add sp, sp, #0x4
ldmia sp!, {r4-r9,lr}
bx lr
arm_func_start MATH_MD5Init
MATH_MD5Init: ; 0x020D2D38
ldr r2, _020D2D68 ; =0x67452301
ldr r1, _020D2D6C ; =0xEFCDAB89
str r2, [r0, #0x0]
ldr r2, _020D2D70 ; =0x98BADCFE
str r1, [r0, #0x4]
ldr r1, _020D2D74 ; =0x10325476
str r2, [r0, #0x8]
str r1, [r0, #0xc]
mov r1, #0x0
str r1, [r0, #0x10]
str r1, [r0, #0x14]
bx lr
.balign 4
_020D2D68: .word 0x67452301
_020D2D6C: .word 0xEFCDAB89
_020D2D70: .word 0x98BADCFE
_020D2D74: .word 0x10325476
arm_func_start MATH_CalcHMACSHA1
MATH_CalcHMACSHA1: ; 0x020D2D78
stmdb sp!, {r4-r8,lr}
sub sp, sp, #0xa0
ldr lr, _020D2E00 ; =0x02106A04
add r12, sp, #0x1c
mov r8, r0
mov r7, r1
mov r6, r2
mov r5, r3
mov r4, r12
ldmia lr!, {r0-r3}
stmia r12!, {r0-r3}
ldmia lr, {r0-r2}
stmia r12, {r0-r2}
add lr, sp, #0x38
add r12, sp, #0x8
str lr, [sp, #0x24]
ldr lr, _020D2E04 ; =MATH_SHA1Init
str r12, [sp, #0x28]
ldr ip, _020D2E08 ; =MATH_SHA1Update
str lr, [sp, #0x2c]
ldr lr, _020D2E0C ; =MATH_SHA1GetHash
str r12, [sp, #0x30]
ldr r12, [sp, #0xb8]
str lr, [sp, #0x34]
str r12, [sp, #0x0]
mov r3, r5
mov r0, r8
mov r1, r7
mov r2, r6
str r4, [sp, #0x4]
bl MATHi_CalcHMAC
add sp, sp, #0xa0
ldmia sp!, {r4-r8,lr}
bx lr
.balign 4
_020D2E00: .word 0x02106A04
_020D2E04: .word MATH_SHA1Init
_020D2E08: .word MATH_SHA1Update
_020D2E0C: .word MATH_SHA1GetHash
arm_func_start MATH_SHA1GetHash
MATH_SHA1GetHash: ; 0x020D2E10
stmdb sp!, {r0-r3}
stmdb sp!, {r4-r6,lr}
ldr r0, [sp, #0x10]
mov r6, r1
ldr r3, [r0, #0x1c]
add r5, r0, #0x20
ands r1, r3, #0x3
mov r0, r3, asr #0x2
moveq r1, #0x0
streq r1, [r5, r0, lsl #0x2]
ldr r2, [sp, #0x10]
mov r1, #0x80
add r4, r2, #0x20
strb r1, [r4, r3]
add r3, r3, #0x1
ands r1, r3, #0x3
beq _020D2E68
mov r2, #0x0
_020D2E58:
strb r2, [r4, r3]
add r3, r3, #0x1
ands r1, r3, #0x3
bne _020D2E58
_020D2E68:
ldr r1, [sp, #0x10]
add r0, r0, #0x1
ldr r1, [r1, #0x1c]
cmp r1, #0x38
blt _020D2EB4
cmp r0, #0x10
bge _020D2E98
mov r1, #0x0
_020D2E88:
str r1, [r5, r0, lsl #0x2]
add r0, r0, #0x1
cmp r0, #0x10
blt _020D2E88
_020D2E98:
ldr r1, _020D3008 ; =0x02106A00
ldr r0, [sp, #0x10]
ldr r3, [r1, #0x0]
mov r1, r5
mov r2, #0x40
blx r3
mov r0, #0x0
_020D2EB4:
cmp r0, #0xe
bge _020D2ED0
mov r1, #0x0
_020D2EC0:
str r1, [r5, r0, lsl #0x2]
add r0, r0, #0x1
cmp r0, #0xe
blt _020D2EC0
_020D2ED0:
ldr r0, [sp, #0x10]
mov r1, r5
ldr r2, [r0, #0x14]
ldr r3, _020D3008 ; =0x02106A00
strb r2, [r4, #0x3f]
mov r0, r2, lsr #0x8
strb r0, [r4, #0x3e]
mov r0, r2, lsr #0x10
strb r0, [r4, #0x3d]
mov r0, r2, lsr #0x18
strb r0, [r4, #0x3c]
ldr r0, [sp, #0x10]
mov r2, #0x40
ldr r5, [r0, #0x18]
strb r5, [r4, #0x3b]
mov r0, r5, lsr #0x8
strb r0, [r4, #0x3a]
mov r0, r5, lsr #0x10
strb r0, [r4, #0x39]
mov r0, r5, lsr #0x18
strb r0, [r4, #0x38]
ldr r0, [sp, #0x10]
ldr r3, [r3, #0x0]
blx r3
ldr r0, [sp, #0x10]
add r1, sp, #0x10
ldr r3, [r0, #0x0]
mov r0, #0x0
mov r2, r3, lsr #0x18
strb r2, [r6, #0x0]
mov r2, r3, lsr #0x10
strb r2, [r6, #0x1]
mov r2, r3, lsr #0x8
strb r2, [r6, #0x2]
strb r3, [r6, #0x3]
ldr r3, [sp, #0x10]
mov r2, #0x4
ldr r4, [r3, #0x4]
mov r3, r4, lsr #0x18
strb r3, [r6, #0x4]
mov r3, r4, lsr #0x10
strb r3, [r6, #0x5]
mov r3, r4, lsr #0x8
strb r3, [r6, #0x6]
strb r4, [r6, #0x7]
ldr r3, [sp, #0x10]
ldr r4, [r3, #0x8]
mov r3, r4, lsr #0x18
strb r3, [r6, #0x8]
mov r3, r4, lsr #0x10
strb r3, [r6, #0x9]
mov r3, r4, lsr #0x8
strb r3, [r6, #0xa]
strb r4, [r6, #0xb]
ldr r3, [sp, #0x10]
ldr r4, [r3, #0xc]
mov r3, r4, lsr #0x18
strb r3, [r6, #0xc]
mov r3, r4, lsr #0x10
strb r3, [r6, #0xd]
mov r3, r4, lsr #0x8
strb r3, [r6, #0xe]
strb r4, [r6, #0xf]
ldr r3, [sp, #0x10]
ldr r4, [r3, #0x10]
mov r3, r4, lsr #0x18
strb r3, [r6, #0x10]
mov r3, r4, lsr #0x10
strb r3, [r6, #0x11]
mov r3, r4, lsr #0x8
strb r3, [r6, #0x12]
strb r4, [r6, #0x13]
ldr r3, [sp, #0x10]
str r0, [r3, #0x1c]
bl MIi_CpuClear32
ldmia sp!, {r4-r6,lr}
add sp, sp, #0x10
bx lr
.balign 4
_020D3008: .word 0x02106A00
arm_func_start MATH_SHA1Update
MATH_SHA1Update: ; 0x020D300C
stmdb sp!, {r4-r8,lr}
mov r8, r0
movs r6, r2
mov r7, r1
add r5, r8, #0x20
ldmeqia sp!, {r4-r8,lr}
bxeq lr
ldr r0, [r8, #0x14]
add r1, r0, r6, lsl #0x3
cmp r1, r0
ldrcc r0, [r8, #0x18]
addcc r0, r0, #0x1
strcc r0, [r8, #0x18]
ldr r0, [r8, #0x18]
add r0, r0, r6, lsr #0x1d
str r0, [r8, #0x18]
str r1, [r8, #0x14]
ldr r1, [r8, #0x1c]
cmp r1, #0x0
beq _020D30CC
add r0, r1, r6
cmp r0, #0x40
blo _020D30A8
rsb r4, r1, #0x40
mov r0, r7
mov r2, r4
add r1, r5, r1
bl MI_CpuCopy8
ldr r1, _020D3164 ; =0x02106A00
mov r0, r8
ldr r3, [r1, #0x0]
mov r1, r5
mov r2, #0x40
sub r6, r6, r4
add r7, r7, r4
blx r3
mov r0, #0x0
str r0, [r8, #0x1c]
b _020D30CC
_020D30A8:
mov r0, r7
mov r2, r6
add r1, r5, r1
bl MI_CpuCopy8
ldr r0, [r8, #0x1c]
add r0, r0, r6
str r0, [r8, #0x1c]
ldmia sp!, {r4-r8,lr}
bx lr
_020D30CC:
cmp r6, #0x40
blo _020D313C
bic r4, r6, #0x3f
sub r6, r6, r4
ands r0, r7, #0x3
bne _020D3104
ldr r1, _020D3164 ; =0x02106A00
mov r0, r8
ldr r3, [r1, #0x0]
mov r1, r7
mov r2, r4
blx r3
add r7, r7, r4
b _020D313C
_020D3104:
mov r0, r7
mov r1, r5
mov r2, #0x40
bl MI_CpuCopy8
ldr r1, _020D3164 ; =0x02106A00
mov r0, r8
ldr r3, [r1, #0x0]
mov r1, r5
mov r2, #0x40
add r7, r7, #0x40
blx r3
sub r4, r4, #0x40
cmp r4, #0x0
bgt _020D3104
_020D313C:
str r6, [r8, #0x1c]
cmp r6, #0x0
ldmeqia sp!, {r4-r8,lr}
bxeq lr
mov r0, r7
mov r1, r5
mov r2, r6
bl MI_CpuCopy8
ldmia sp!, {r4-r8,lr}
bx lr
.balign 4
_020D3164: .word 0x02106A00
arm_func_start MATH_SHA1Init
MATH_SHA1Init: ; 0x020D3168
ldr r1, _020D31A4 ; =0x67452301
ldr r2, _020D31A8 ; =0xEFCDAB89
str r1, [r0, #0x0]
ldr r1, _020D31AC ; =0x98BADCFE
str r2, [r0, #0x4]
ldr r2, _020D31B0 ; =0x10325476
str r1, [r0, #0x8]
ldr r1, _020D31B4 ; =0xC3D2E1F0
str r2, [r0, #0xc]
str r1, [r0, #0x10]
mov r1, #0x0
str r1, [r0, #0x14]
str r1, [r0, #0x18]
str r1, [r0, #0x1c]
bx lr
.balign 4
_020D31A4: .word 0x67452301
_020D31A8: .word 0xEFCDAB89
_020D31AC: .word 0x98BADCFE
_020D31B0: .word 0x10325476
_020D31B4: .word 0xC3D2E1F0
arm_func_start MATHi_CalcHMAC
MATHi_CalcHMAC: ; 0x020D31B8
stmdb sp!, {r4-r9,lr}
sub sp, sp, #0xc4
ldr r5, [sp, #0xe0]
ldr r4, [sp, #0xe4]
movs r9, r0
mov r8, r1
mov r7, r2
mov r6, r3
addeq sp, sp, #0xc4
ldmeqia sp!, {r4-r9,lr}
bxeq lr
cmp r8, #0x0
addeq sp, sp, #0xc4
ldmeqia sp!, {r4-r9,lr}
bxeq lr
cmp r7, #0x0
addeq sp, sp, #0xc4
ldmeqia sp!, {r4-r9,lr}
bxeq lr
cmp r6, #0x0
addeq sp, sp, #0xc4
ldmeqia sp!, {r4-r9,lr}
bxeq lr
cmp r5, #0x0
addeq sp, sp, #0xc4
ldmeqia sp!, {r4-r9,lr}
bxeq lr
cmp r4, #0x0
addeq sp, sp, #0xc4
ldmeqia sp!, {r4-r9,lr}
bxeq lr
ldr r0, [r4, #0x4]
cmp r5, r0
ble _020D3278
ldr r0, [r4, #0x8]
ldr r1, [r4, #0x10]
blx r1
ldr r0, [r4, #0x8]
ldr r3, [r4, #0x14]
mov r1, r6
mov r2, r5
blx r3
ldr r0, [r4, #0x8]
ldr r2, [r4, #0x18]
add r1, sp, #0x0
blx r2
ldr r5, [r4, #0x0]
add r6, sp, #0x0
_020D3278:
cmp r5, #0x0
mov r0, #0x0
ble _020D32A0
add r2, sp, #0x40
_020D3288:
ldrb r1, [r6, r0]
add r0, r0, #0x1
cmp r0, r5
eor r1, r1, #0x36
strb r1, [r2], #0x1
blt _020D3288
_020D32A0:
ldr r1, [r4, #0x4]
cmp r0, r1
bge _020D32CC
add r1, sp, #0x40
add r3, r1, r0
mov r2, #0x36
_020D32B8:
strb r2, [r3], #0x1
ldr r1, [r4, #0x4]
add r0, r0, #0x1
cmp r0, r1
blt _020D32B8
_020D32CC:
ldr r0, [r4, #0x8]
ldr r1, [r4, #0x10]
blx r1
ldr r0, [r4, #0x8]
ldr r2, [r4, #0x4]
ldr r3, [r4, #0x14]
add r1, sp, #0x40
blx r3
ldr r0, [r4, #0x8]
ldr r3, [r4, #0x14]
mov r1, r8
mov r2, r7
blx r3
ldr r0, [r4, #0x8]
ldr r1, [r4, #0xc]
ldr r2, [r4, #0x18]
blx r2
cmp r5, #0x0
mov r2, #0x0
ble _020D3338
add r1, sp, #0x80
_020D3320:
ldrb r0, [r6, r2]
add r2, r2, #0x1
cmp r2, r5
eor r0, r0, #0x5c
strb r0, [r1], #0x1
blt _020D3320
_020D3338:
ldr r0, [r4, #0x4]
cmp r2, r0
bge _020D3364
add r0, sp, #0x80
add r3, r0, r2
mov r1, #0x5c
_020D3350:
strb r1, [r3], #0x1
ldr r0, [r4, #0x4]
add r2, r2, #0x1
cmp r2, r0
blt _020D3350
_020D3364:
ldr r0, [r4, #0x8]
ldr r1, [r4, #0x10]
blx r1
ldr r0, [r4, #0x8]
ldr r2, [r4, #0x4]
ldr r3, [r4, #0x14]
add r1, sp, #0x80
blx r3
ldr r0, [r4, #0x8]
ldr r1, [r4, #0xc]
ldr r2, [r4, #0x0]
ldr r3, [r4, #0x14]
blx r3
ldr r0, [r4, #0x8]
ldr r2, [r4, #0x18]
mov r1, r9
blx r2
add sp, sp, #0xc4
ldmia sp!, {r4-r9,lr}
bx lr
.balign 4
_020D33B4: .word 0x00FF00FF
_020D33B8: .word 0x5A827999
_020D33BC: .word 0x6ED9EBA1
_020D33C0: .word 0x8F1BBCDC
_020D33C4: .word 0xCA62C1D6
arm_func_start MATHi_SHA1ProcessBlock
MATHi_SHA1ProcessBlock: ; 0x020D33C8
stmdb sp!, {r4-r12,lr}
ldmia r0, {r3,r9-r12}
sub sp, sp, #0x84
str r2, [sp, #0x80]
_020D33D8:
ldr r8, _020D33B8 ; =0x5A827999
ldr r7, _020D33B4 ; =0x00FF00FF
mov r6, sp
mov r5, #0x0
_020D33E8:
ldr r4, [r1], #0x4
add r2, r8, r12
add r2, r2, r3, ror #0x1B
and lr, r4, r7
and r4, r7, r4, ror #0x18
orr r4, r4, lr, ror #0x8
str r4, [r6, #0x40]
str r4, [r6], #0x4
add r2, r2, r4
eor r4, r10, r11
and r4, r4, r9
eor r4, r4, r11
add r2, r2, r4
mov r9, r9, ror #0x2
mov r12, r11
mov r11, r10
mov r10, r9
mov r9, r3
mov r3, r2
add r5, r5, #0x4
cmp r5, #0x40
blt _020D33E8
mov r7, #0x0
mov r6, sp
_020D3448:
ldr r2, [r6, #0x0]
ldr r5, [r6, #0x8]
ldr r4, [r6, #0x20]
ldr lr, [r6, #0x34]
eor r2, r2, r5
eor r4, r4, lr
eor r2, r2, r4
mov r2, r2, ror #0x1F
str r2, [r6, #0x40]
str r2, [r6], #0x4
add r2, r2, r12
add r2, r2, r8
add r2, r2, r3, ror #0x1B
eor r4, r10, r11
and r4, r4, r9
eor r4, r4, r11
add r2, r2, r4
mov r9, r9, ror #0x2
mov r12, r11
mov r11, r10
mov r10, r9
mov r9, r3
mov r3, r2
add r7, r7, #0x4
cmp r7, #0x10
blt _020D3448
ldr r8, _020D33BC ; =0x6ED9EBA1
mov r7, #0x0
_020D34B8:
ldr r2, [r6, #0x0]
ldr r4, [r6, #0x8]
ldr lr, [r6, #0x20]
ldr r5, [r6, #0x34]
eor r2, r2, r4
eor lr, lr, r5
eor r2, r2, lr
mov r2, r2, ror #0x1F
str r2, [r6, #0x40]
str r2, [r6], #0x4
add r2, r2, r12
add r2, r2, r8
add r2, r2, r3, ror #0x1B
eor lr, r9, r10
eor lr, lr, r11
add r2, r2, lr
mov r9, r9, ror #0x2
mov r12, r11
mov r11, r10
mov r10, r9
mov r9, r3
mov r3, r2
add r7, r7, #0x1
cmp r7, #0xc
moveq r6, sp
cmp r7, #0x14
blt _020D34B8
ldr r8, _020D33C0 ; =0x8F1BBCDC
mov r7, #0x0
_020D352C:
ldr r2, [r6, #0x0]
ldr lr, [r6, #0x8]
ldr r5, [r6, #0x20]
ldr r4, [r6, #0x34]
eor r2, r2, lr
eor r5, r5, r4
eor r2, r2, r5
mov r2, r2, ror #0x1F
str r2, [r6, #0x40]
str r2, [r6], #0x4
add r2, r2, r12
add r2, r2, r8
add r2, r2, r3, ror #0x1B
orr r5, r9, r10
and r5, r5, r11
and r4, r9, r10
orr r5, r5, r4
add r2, r2, r5
mov r9, r9, ror #0x2
mov r12, r11
mov r11, r10
mov r10, r9
mov r9, r3
mov r3, r2
add r7, r7, #0x1
cmp r7, #0x8
moveq r6, sp
cmp r7, #0x14
blt _020D352C
ldr r8, _020D33C4 ; =0xCA62C1D6
mov r7, #0x0
_020D35A8:
ldr r2, [r6, #0x0]
ldr r5, [r6, #0x8]
ldr r4, [r6, #0x20]
ldr lr, [r6, #0x34]
eor r2, r2, r5
eor r4, r4, lr
eor r2, r2, r4
mov r2, r2, ror #0x1F
str r2, [r6, #0x40]
str r2, [r6], #0x4
add r2, r2, r12
add r2, r2, r8
add r2, r2, r3, ror #0x1B
eor r4, r9, r10
eor r4, r4, r11
add r2, r2, r4
mov r9, r9, ror #0x2
mov r12, r11
mov r11, r10
mov r10, r9
mov r9, r3
mov r3, r2
add r7, r7, #0x1
cmp r7, #0x4
moveq r6, sp
cmp r7, #0x14
blt _020D35A8
ldmia r0, {r2,r4,r6-r7,lr}
add r3, r3, r2
add r9, r9, r4
add r10, r10, r6
add r11, r11, r7
add r12, r12, lr
stmia r0, {r3,r9-r12}
ldr lr, [sp, #0x80]
subs lr, lr, #0x40
str lr, [sp, #0x80]
bgt _020D33D8
add sp, sp, #0x84
ldmia sp!, {r4-r12,pc}
arm_func_start CP_SaveContext
CP_SaveContext: ; 0x020D3648
ldr r1, _020D3684 ; =0x04000290
stmdb sp!, {r4}
ldmia r1, {r2-r4,r12}
stmia r0!, {r2-r4,r12}
ldrh r12, [r1, #-0x10]
add r1, r1, #0x28
ldmia r1, {r2-r3}
stmia r0!, {r2-r3}
and r12, r12, #0x3
ldrh r2, [r1, #-0x8]
strh r12, [r0, #0x0]
and r2, r2, #0x1
strh r2, [r0, #0x2]
ldmia sp!, {r4}
bx lr
.balign 4
_020D3684: .word 0x04000290
arm_func_start CP_RestoreContext
CP_RestoreContext: ; 0x020D3688
stmdb sp!, {r4}
ldr r1, _020D36C0 ; =0x04000290
ldmia r0, {r2-r4,r12}
stmia r1, {r2-r4,r12}
ldrh r2, [r0, #0x18]
ldrh r3, [r0, #0x1a]
strh r2, [r1, #-0x10]
strh r3, [r1, #0x20]
add r0, r0, #0x10
add r1, r1, #0x28
ldmia r0, {r2-r3}
stmia r1, {r2-r3}
ldmia sp!, {r4}
bx lr
.balign 4
_020D36C0: .word 0x04000290
arm_func_start TP_CheckError
TP_CheckError: ; 0x020D36C4
ldr r1, _020D36D4 ; =0x021D5474
ldrh r1, [r1, #0x34]
and r0, r1, r0
bx lr
.balign 4
_020D36D4: .word 0x021D5474
arm_func_start TP_WaitBusy
TP_WaitBusy: ; 0x020D36D8
ldr r1, _020D36EC ; =0x021D5474
_020D36DC:
ldrh r2, [r1, #0x36]
ands r2, r2, r0
bne _020D36DC
bx lr
.balign 4
_020D36EC: .word 0x021D5474
arm_func_start TP_GetCalibratedPoint
TP_GetCalibratedPoint: ; 0x020D36F0
stmdb sp!, {r4-r6,lr}
ldr r2, _020D3818 ; =0x021D5474
ldrh r2, [r2, #0x30]
cmp r2, #0x0
bne _020D372C
ldrh r3, [r1, #0x0]
ldrh r2, [r1, #0x2]
strh r3, [r0, #0x0]
strh r2, [r0, #0x2]
ldrh r2, [r1, #0x4]
ldrh r1, [r1, #0x6]
strh r2, [r0, #0x4]
strh r1, [r0, #0x6]
ldmia sp!, {r4-r6,lr}
bx lr
_020D372C:
ldrh r3, [r1, #0x4]
ldr r2, _020D381C ; =0x021D548C
strh r3, [r0, #0x4]
ldrh r3, [r1, #0x6]
strh r3, [r0, #0x6]
ldrh r3, [r1, #0x4]
cmp r3, #0x0
moveq r1, #0x0
streqh r1, [r0, #0x0]
streqh r1, [r0, #0x2]
ldmeqia sp!, {r4-r6,lr}
bxeq lr
ldrh r4, [r1, #0x0]
ldr r3, [r2, #0x0]
ldr lr, [r2, #0x8]
mov r12, r4, lsl #0x2
mov r4, r12, asr #0x1f
subs r12, r12, r3
sbc r3, r4, r3, asr #0x1f
umull r6, r5, lr, r12
mla r5, lr, r3, r5
mov r3, lr, asr #0x1f
mla r5, r3, r12, r5
mov r3, r6, lsr #0x16
orr r3, r3, r5, lsl #0xa
strh r3, [r0, #0x0]
ldrsh r3, [r0, #0x0]
cmp r3, #0x0
movlt r3, #0x0
strlth r3, [r0, #0x0]
blt _020D37B4
cmp r3, #0xff
movgt r3, #0xff
strgth r3, [r0, #0x0]
_020D37B4:
ldrh r3, [r1, #0x2]
ldr r1, [r2, #0xc]
ldr r12, [r2, #0x14]
mov r3, r3, lsl #0x2
mov r2, r3, asr #0x1f
subs r3, r3, r1
sbc r1, r2, r1, asr #0x1f
umull r4, lr, r12, r3
mla lr, r12, r1, lr
mov r1, r12, asr #0x1f
mla lr, r1, r3, lr
mov r1, r4, lsr #0x16
orr r1, r1, lr, lsl #0xa
strh r1, [r0, #0x2]
ldrsh r1, [r0, #0x2]
cmp r1, #0x0
movlt r1, #0x0
strlth r1, [r0, #0x2]
ldmltia sp!, {r4-r6,lr}
bxlt lr
cmp r1, #0xbf
movgt r1, #0xbf
strgth r1, [r0, #0x2]
ldmia sp!, {r4-r6,lr}
bx lr
.balign 4
_020D3818: .word 0x021D5474
_020D381C: .word 0x021D548C
arm_func_start TP_CalcCalibrateParam
TP_CalcCalibrateParam:
stmdb sp!, {r4-r11,lr}
sub sp, sp, #0x4
mov r6, r1
mov r7, r0
mov r5, r2
mov r4, r3
cmp r6, #0x1000
bhs _020D3860
cmp r5, #0x1000
bhs _020D3860
ldrh r8, [sp, #0x2c]
cmp r8, #0x1000
bhs _020D3860
ldrh r3, [sp, #0x30]
cmp r3, #0x1000
blo _020D3870
_020D3860:
add sp, sp, #0x4
mov r0, #0x1
ldmia sp!, {r4-r11,lr}
bx lr
_020D3870:
cmp r4, #0x100
bhs _020D389C
ldrh r2, [sp, #0x34]
cmp r2, #0x100
bhs _020D389C
ldrh r1, [sp, #0x28]
cmp r1, #0xc0
bhs _020D389C
ldrh r0, [sp, #0x38]
cmp r0, #0xc0
blo _020D38AC
_020D389C:
add sp, sp, #0x4
mov r0, #0x1
ldmia sp!, {r4-r11,lr}
bx lr
_020D38AC:
cmp r4, r2
beq _020D38CC
cmp r1, r0
beq _020D38CC
cmp r6, r8
beq _020D38CC
cmp r5, r3
bne _020D38DC
_020D38CC:
add sp, sp, #0x4
mov r0, #0x1
ldmia sp!, {r4-r11,lr}
bx lr
_020D38DC:
bl OS_DisableInterrupts
ldrh r1, [sp, #0x2c]
ldr r3, _020D3A80 ; =0x04000280
ldr fp, _020D3A84 ; =0x04000290
str r1, [sp, #0x0]
ldr r2, [sp, #0x0]
ldrh r1, [sp, #0x34]
sub r9, r6, r2
mov r2, #0x0
mov r12, r9, lsl #0x8
strh r2, [r3, #0x0]
str r12, [r11, #0x0]
ldrh r8, [sp, #0x30]
ldrh r10, [sp, #0x38]
ldrh r9, [sp, #0x28]
ldr fp, _020D3A88 ; =0x04000298
sub r12, r4, r1
str r12, [r11, #0x0]
str r2, [r11, #0x4]
sub r11, r5, r8
sub r2, r9, r10
_020D3930:
ldrh r12, [r3, #0x0]
ands r12, r12, #0x8000
bne _020D3930
ldr ip, _020D3A8C ; =0x040002A0
mov r11, r11, lsl #0x8
ldr lr, [r12, #0x0]
mov r12, #0x0
strh r12, [r3, #0x0]
ldr r3, _020D3A84 ; =0x04000290
cmp lr, #0x8000
str r11, [r3, #0x0]
ldr r3, _020D3A88 ; =0x04000298
str r2, [r3, #0x0]
mov r2, r3
str r12, [r2, #0x4]
bge _020D3980
mov r2, #0x8000
rsb r2, r2, #0x0
cmp lr, r2
bge _020D3994
_020D3980:
bl OS_RestoreInterrupts
add sp, sp, #0x4
mov r0, #0x1
ldmia sp!, {r4-r11,lr}
bx lr
_020D3994:
strh lr, [r7, #0x4]
ldrsh r11, [r7, #0x4]
add r3, r4, r1
ldr r1, [sp, #0x0]
add r4, r6, r1
mul r1, r11, r3
mov r3, r4, lsl #0x8
sub r1, r3, r1
mov r1, r1, lsl #0x9
mov r1, r1, asr #0x10
cmp r1, #0x8000
bge _020D39CC
cmp r1, r2
bge _020D39E0
_020D39CC:
bl OS_RestoreInterrupts
add sp, sp, #0x4
mov r0, #0x1
ldmia sp!, {r4-r11,lr}
bx lr
_020D39E0:
ldr r2, _020D3A80 ; =0x04000280
strh r1, [r7, #0x0]
_020D39E8:
ldrh r1, [r2, #0x0]
ands r1, r1, #0x8000
bne _020D39E8
ldr r1, _020D3A8C ; =0x040002A0
ldr r4, [r1, #0x0]
bl OS_RestoreInterrupts
cmp r4, #0x8000
bge _020D3A18
mov r0, #0x8000
rsb r1, r0, #0x0
cmp r4, r1
bge _020D3A28
_020D3A18:
add sp, sp, #0x4
mov r0, #0x1
ldmia sp!, {r4-r11,lr}
bx lr
_020D3A28:
strh r4, [r7, #0x6]
ldrsh r2, [r7, #0x6]
add r0, r9, r10
add r3, r5, r8
mul r0, r2, r0
mov r2, r3, lsl #0x8
sub r0, r2, r0
mov r0, r0, lsl #0x9
mov r0, r0, asr #0x10
cmp r0, #0x8000
bge _020D3A5C
cmp r0, r1
bge _020D3A6C
_020D3A5C:
add sp, sp, #0x4
mov r0, #0x1
ldmia sp!, {r4-r11,lr}
bx lr
_020D3A6C:
strh r0, [r7, #0x2]
mov r0, #0x0
add sp, sp, #0x4
ldmia sp!, {r4-r11,lr}
bx lr
.balign 4
_020D3A80: .word 0x04000280
_020D3A84: .word 0x04000290
_020D3A88: .word 0x04000298
_020D3A8C: .word 0x040002A0
arm_func_start TP_GetLatestIndexInAuto
TP_GetLatestIndexInAuto: ; 0x020D3A90
ldr r0, _020D3A9C ; =0x021D5474
ldrh r0, [r0, #0xc]
bx lr
.balign 4
_020D3A9C: .word 0x021D5474
arm_func_start TP_GetLatestRawPointInAuto
TP_GetLatestRawPointInAuto: ; 0x020D3AA0
stmdb sp!, {r4-r5,lr}
sub sp, sp, #0x4
mov r1, #0x3
ldr lr, _020D3C10 ; =0x021D5474
strh r1, [r0, #0x6]
ldrh r1, [lr, #0xe]
ldrh r3, [lr, #0xc]
cmp r1, #0x1
beq _020D3AD0
ldrh r1, [lr, #0x14]
cmp r1, #0x1
bne _020D3B0C
_020D3AD0:
ldr r1, _020D3C10 ; =0x021D5474
mov r2, r3, lsl #0x3
ldr r1, [r1, #0x10]
add sp, sp, #0x4
add r3, r1, r3, lsl #0x3
ldrh r2, [r1, r2]
ldrh r1, [r3, #0x2]
strh r2, [r0, #0x0]
strh r1, [r0, #0x2]
ldrh r2, [r3, #0x4]
ldrh r1, [r3, #0x6]
strh r2, [r0, #0x4]
strh r1, [r0, #0x6]
ldmia sp!, {r4-r5,lr}
bx lr
_020D3B0C:
add r1, r0, #0x6
mov r12, #0x0
b _020D3BE0
_020D3B18:
subs r5, r3, r12
ldr r2, [lr, #0x10]
addmi r5, r5, r4
add r2, r2, r5, lsl #0x3
ldrh r4, [r2, #0x4]
cmp r4, #0x0
bne _020D3B60
ldrh r3, [r2, #0x0]
ldrh r1, [r2, #0x2]
add sp, sp, #0x4
strh r3, [r0, #0x0]
strh r1, [r0, #0x2]
ldrh r3, [r2, #0x4]
ldrh r1, [r2, #0x6]
strh r3, [r0, #0x4]
strh r1, [r0, #0x6]
ldmia sp!, {r4-r5,lr}
bx lr
_020D3B60:
ldrh r4, [r0, #0x6]
ands r4, r4, #0x1
beq _020D3B90
ldrh r4, [r2, #0x6]
ands r4, r4, #0x1
bne _020D3B90
ldrh r4, [r2, #0x0]
cmp r12, #0x0
strh r4, [r0, #0x0]
ldrneh r4, [r1, #0x0]
bicne r4, r4, #0x1
strneh r4, [r1, #0x0]
_020D3B90:
ldrh r4, [r0, #0x6]
ands r4, r4, #0x2
beq _020D3BC0
ldrh r4, [r2, #0x6]
ands r4, r4, #0x2
bne _020D3BC0
ldrh r2, [r2, #0x2]
cmp r12, #0x0
strh r2, [r0, #0x2]
ldrneh r2, [r1, #0x0]
bicne r2, r2, #0x2
strneh r2, [r1, #0x0]
_020D3BC0:
ldrh r2, [r0, #0x6]
cmp r2, #0x0
moveq r1, #0x1
streqh r1, [r0, #0x4]
addeq sp, sp, #0x4
ldmeqia sp!, {r4-r5,lr}
bxeq lr
add r12, r12, #0x1
_020D3BE0:
ldrh r2, [lr, #0xe]
cmp r12, r2
bge _020D3BFC
ldrh r4, [lr, #0x14]
sub r2, r4, #0x1
cmp r12, r2
blt _020D3B18
_020D3BFC:
mov r1, #0x1
strh r1, [r0, #0x4]
add sp, sp, #0x4
ldmia sp!, {r4-r5,lr}
bx lr
.balign 4
_020D3C10: .word 0x021D5474
arm_func_start TP_RequestAutoSamplingStopAsync
TP_RequestAutoSamplingStopAsync: ; 0x020D3C14
stmdb sp!, {r4,lr}
bl OS_DisableInterrupts
mov r4, r0
ldr r1, _020D3CB0 ; =0x03000200
mov r0, #0x6
mov r2, #0x0
bl PXI_SendWordByFifo
_020D3C30:
cmp r0, #0x0
movge r0, #0x1
movlt r0, #0x0
cmp r0, #0x0
bne _020D3C84
mov r0, r4
bl OS_RestoreInterrupts
ldr r0, _020D3CB4
ldrh r1, [r0, #0x34]
ldr r3, [r0]
orr r1, r1, #0x4
strh r1, [r0, #0x34]
cmp r3, #0x0
ldmeqia sp!, {r4, lr}
bxeq lr
mov r0, #0x2
mov r1, #0x4
mov r2, #0x0
blx r3
ldmia sp!, {r4, lr}
bx lr
_020D3C84:
ldr r1, _020D3CB4
mov r0, r4
ldrh r2, [r1, #0x36]
orr r2, r2, #0x4
strh r2, [r1, #0x36]
ldrh r2, [r1, #0x34]
bic r2, r2, #0x4
strh r2, [r1, #0x34]
bl OS_RestoreInterrupts
ldmia sp!, {r4, lr}
bx lr
_020D3CB0: .word 0x03000200
_020D3CB4: .word 0x021D5474
arm_func_start TP_RequestAutoSamplingStartAsync
TP_RequestAutoSamplingStartAsync: ; 0x020D3CB8
stmdb sp!, {r4-r6,lr}
ldr r4, _020D3DC0 ; =0x021D5474
mov r5, r1
mov r12, #0x0
mov r6, r0
str r2, [r4, #0x10]
strh r12, [r4, #0xc]
strh r5, [r4, #0xe]
strh r3, [r4, #0x14]
cmp r3, #0x0
bls _020D3D00
mov r1, r12
_020D3CE8:
ldr r0, [r4, #0x10]
add r0, r0, r12, lsl #0x3
add r12, r12, #0x1
strh r1, [r0, #0x4]
cmp r12, r3
blo _020D3CE8
_020D3D00:
bl OS_DisableInterrupts
mov r4, r0
ldr r0, _020D3DC4 ; =0x02000100
and r1, r5, #0xff
orr r1, r1, r0
mov r0, #0x6
mov r2, #0x0
bl PXI_SendWordByFifo
_020D3D20:
cmp r0, #0x0
movlt r0, #0x0
blt _020D3D4C
ldr r1, _020D3DC8
mov r0, #0x6
orr r1, r6, r1
mov r2, #0x0
bl PXI_SendWordByFifo
cmp r0, #0x0
movlt r0, #0x0
movge r0, #0x1
_020D3D4C:
ands r0, r0, #0xFF
bne _020D3D94
mov r0, r4
bl OS_RestoreInterrupts
ldr r0, _020D3DC0
ldrh r1, [r0, #0x34]
ldr r3, [r0]
orr r1, r1, #0x2
strh r1, [r0, #0x34]
cmp r3, #0x0
ldmeqia sp!, {r4-r6, lr}
bxeq lr
mov r0, #0x1
mov r1, #0x4
mov r2, #0x0
blx r3
ldmia sp!, {r4-r6, lr}
bx lr
_020D3D94:
ldr r1, _020D3DC0
mov r0, r4
ldrh r2, [r1, #0x36]
orr r2, r2, #0x2
strh r2, [r1, #0x36]
ldrh r2, [r1, #0x34]
bic r2, r2, #0x2
strh r2, [r1, #0x34]
bl OS_RestoreInterrupts
ldmia sp!, {r4-r6, lr}
bx lr
_020D3DC0: .word 0x021D5474
_020D3DC4: .word 0x02000100
_020D3DC8: .word 0x01010000
arm_func_start TP_WaitRawResult
TP_WaitRawResult: ; 0x020D3DCC
stmdb sp!, {r4,lr}
mov r4, r0
mov r0, #0x1
bl TP_WaitBusy
ldr r1, _020D3E20 ; =0x021D5474
ldrh r0, [r1, #0x34]
ands r0, r0, #0x1
movne r0, #0x1
ldmneia sp!, {r4,lr}
bxne lr
ldrh r3, [r1, #0x4]
ldrh r2, [r1, #0x6]
mov r0, #0x0
strh r3, [r4, #0x0]
strh r2, [r4, #0x2]
ldrh r2, [r1, #0x8]
ldrh r1, [r1, #0xa]
strh r2, [r4, #0x4]
strh r1, [r4, #0x6]
ldmia sp!, {r4,lr}
bx lr
.balign 4
_020D3E20: .word 0x021D5474
arm_func_start TP_RequestSamplingAsync
TP_RequestSamplingAsync: ; 0x020D3E24
stmdb sp!, {r4,lr}
bl OS_DisableInterrupts
mov r4, r0
mov r0, #0x6
mov r1, #0x3000000
mov r2, #0x0
bl PXI_SendWordByFifo
_020D3E40:
cmp r0, #0x0
movge r0, #0x1
movlt r0, #0x0
cmp r0, #0x0
bne _020D3E94
mov r0, r4
bl OS_RestoreInterrupts
ldr r0, _20D3EC0
ldrh r1, [r0, #0x34]
ldr r3, [r0]
orr r1, r1, #0x1
strh r1, [r0, #0x34]
cmp r3, #0x0
ldmeqia sp!, {r4, lr}
bxeq lr
mov r0, #0x0
mov r2, r0
mov r1, #0x4
blx r3
ldmia sp!, {r4, lr}
bx lr
_020D3E94:
ldr r1, _20D3EC0
mov r0, r4
ldrh r2, [r1, #0x36]
orr r2, r2, #0x1
strh r2, [r1, #0x36]
ldrh r2, [r1, #0x34]
bic r2, r2, #0x1
strh r2, [r1, #0x34]
bl OS_RestoreInterrupts
ldmia sp!, {r4, lr}
bx lr
_20D3EC0: .word 0x021D5474
arm_func_start TP_SetCalibrateParam
TP_SetCalibrateParam: ; 0x020D3EC4
stmdb sp!, {r4-r5,lr}
sub sp, sp, #0x4
movs r4, r0
ldreq r0, _020D3FF8 ; =0x021D5474
moveq r1, #0x0
streqh r1, [r0, #0x30]
addeq sp, sp, #0x4
ldmeqia sp!, {r4-r5,lr}
bxeq lr
bl OS_DisableInterrupts
ldrsh lr, [r4, #0x4]
cmp lr, #0x0
beq _020D3F50
ldr r5, _020D3FFC ; =0x04000280
mov r12, #0x0
ldr r2, _020D4000 ; =0x04000290
strh r12, [r5, #0x0]
mov r3, #0x10000000
ldr r1, _020D4004 ; =0x04000298
str r3, [r2, #0x0]
str lr, [r1, #0x0]
str r12, [r1, #0x4]
ldrsh r2, [r4, #0x0]
ldr r1, _020D3FF8 ; =0x021D5474
str r2, [r1, #0x18]
ldrsh r2, [r4, #0x4]
str r2, [r1, #0x1c]
_020D3F30:
ldrh r1, [r5, #0x0]
ands r1, r1, #0x8000
bne _020D3F30
ldr r2, _020D4008 ; =0x040002A0
ldr r1, _020D3FF8 ; =0x021D5474
ldr r2, [r2, #0x0]
str r2, [r1, #0x20]
b _020D3F64
_020D3F50:
ldr r1, _020D3FF8 ; =0x021D5474
mov r2, #0x0
str r2, [r1, #0x18]
str r2, [r1, #0x1c]
str r2, [r1, #0x20]
_020D3F64:
ldrsh r5, [r4, #0x6]
cmp r5, #0x0
beq _020D3FC8
ldr ip, _020D3FFC ; =0x04000280
mov lr, #0x0
ldr r2, _020D4000 ; =0x04000290
strh lr, [r12, #0x0]
mov r3, #0x10000000
ldr r1, _020D4004 ; =0x04000298
str r3, [r2, #0x0]
str r5, [r1, #0x0]
str lr, [r1, #0x4]
ldrsh r2, [r4, #0x2]
ldr r1, _020D3FF8 ; =0x021D5474
str r2, [r1, #0x24]
ldrsh r2, [r4, #0x6]
str r2, [r1, #0x28]
_020D3FA8:
ldrh r1, [r12, #0x0]
ands r1, r1, #0x8000
bne _020D3FA8
ldr r2, _020D4008 ; =0x040002A0
ldr r1, _020D3FF8 ; =0x021D5474
ldr r2, [r2, #0x0]
str r2, [r1, #0x2c]
b _020D3FDC
_020D3FC8:
ldr r1, _020D3FF8 ; =0x021D5474
mov r2, #0x0
str r2, [r1, #0x24]
str r2, [r1, #0x28]
str r2, [r1, #0x2c]
_020D3FDC:
bl OS_RestoreInterrupts
ldr r0, _020D3FF8 ; =0x021D5474
mov r1, #0x1
strh r1, [r0, #0x30]
add sp, sp, #0x4
ldmia sp!, {r4-r5,lr}
bx lr
.balign 4
_020D3FF8: .word 0x021D5474
_020D3FFC: .word 0x04000280
_020D4000: .word 0x04000290
_020D4004: .word 0x04000298
_020D4008: .word 0x040002A0
arm_func_start TP_GetUserInfo
TP_GetUserInfo: ; 0x020D400C
stmdb sp!, {r4-r6,lr}
sub sp, sp, #0x18
ldr ip, _020D40B4 ; =0x027FFC80
mov r4, r0
ldrh r1, [r12, #0x58]
ldrh r2, [r12, #0x5a]
ldrb r3, [r12, #0x5c]
cmp r1, #0x0
ldrb lr, [r12, #0x5d]
ldrh r6, [r12, #0x5e]
ldrh r5, [r12, #0x60]
ldrb r0, [r12, #0x62]
ldrb r12, [r12, #0x63]
bne _020D405C
cmp r6, #0x0
bne _020D405C
cmp r2, #0x0
bne _020D405C
cmp r5, #0x0
beq _020D4080
_020D405C:
str lr, [sp, #0x0]
str r6, [sp, #0x4]
str r5, [sp, #0x8]
str r0, [sp, #0xc]
mov r0, r4
str r12, [sp, #0x10]
bl TP_CalcCalibrateParam
_020D4078:
cmp r0, #0
beq _020D40A4
_020D4080:
mov r0, #0x0
strh r0, [r4, #0x0]
strh r0, [r4, #0x2]
strh r0, [r4, #0x4]
strh r0, [r4, #0x6]
add sp, sp, #0x18
mov r0, #0x1
ldmia sp!, {r4-r6,lr}
bx lr
_020D40A4:
mov r0, #0x1
add sp, sp, #0x18
ldmia sp!, {r4-r6,lr}
bx lr
_020D40B4: .word 0x027FFC80
arm_func_start TP_Init
TP_Init: ; 0x020D40B8
stmdb sp!, {r4-r5,lr}
sub sp, sp, #0x4
ldr r0, _020D413C ; =0x021D5470
ldrh r1, [r0, #0x0]
cmp r1, #0x0
addne sp, sp, #0x4
ldmneia sp!, {r4-r5,lr}
bxne lr
mov r1, #0x1
strh r1, [r0, #0x0]
bl PXI_Init
ldr r0, _020D4140 ; =0x021D5474
mov r1, #0x0
strh r1, [r0, #0x32]
strh r1, [r0, #0x36]
strh r1, [r0, #0xc]
str r1, [r0, #0x0]
str r1, [r0, #0x10]
strh r1, [r0, #0x30]
strh r1, [r0, #0x34]
mov r5, #0x6
mov r4, #0x1
_020D4110:
mov r0, r5
mov r1, r4
bl PXI_IsCallbackReady
_020D411C:
cmp r0, #0x0
beq _020D4110
ldr r1, _020D4144
mov r0, #0x6
bl PXI_SetFifoRecvCallback
add sp, sp, #0x4
ldmia sp!, {r4-r5,lr}
bx lr
_020D413C: .word 0x021D5470
_020D4140: .word 0x021D5474
_020D4144: .word FUN_020D4148
arm_func_start FUN_020D4148
FUN_020D4148: ; 0x020D4148
stmdb sp!, {r4,lr}
sub sp, sp, #0x8
mov r0, r1, lsl #0x10
mov r3, r0, lsr #0x10
and r0, r3, #0x7f00
mov r0, r0, lsl #0x8
cmp r2, #0x0
mov r0, r0, lsr #0x10
beq _020D41AC
ldr r1, _020D43FC ; =0x021D5474
mov r2, #0x1
ldrh r4, [r1, #0x34]
ldr r3, [r1, #0x0]
orr r2, r4, r2, lsl r0
cmp r3, #0x0
strh r2, [r1, #0x34]
addeq sp, sp, #0x8
ldmeqia sp!, {r4,lr}
bxeq lr
mov r1, #0x4
mov r2, #0x0
blx r3
add sp, sp, #0x8
ldmia sp!, {r4,lr}
bx lr
_020D41AC:
cmp r0, #0x10
bne _020D427C
ldr r1, _020D43FC ; =0x021D5474
ldrh r3, [r1, #0xc]
ldrh r2, [r1, #0x14]
add r3, r3, #0x1
strh r3, [r1, #0xc]
ldrh r3, [r1, #0xc]
cmp r3, r2
movcs r2, #0x0
strcsh r2, [r1, #0xc]
ldr r1, _020D4400 ; =0x027FFFAA
ldr r2, _020D43FC ; =0x021D5474
ldrh r3, [r1, #0x0]
ldr r1, _020D4404 ; =0x027FFFAC
ldrh r12, [r2, #0xc]
strh r3, [sp, #0x0]
ldrh r1, [r1, #0x0]
ldr r4, [r2, #0x10]
mov lr, r12, lsl #0x3
strh r1, [sp, #0x2]
ldr r3, [sp, #0x0]
add r1, r4, r12, lsl #0x3
mov r3, r3, lsl #0x14
mov r3, r3, lsr #0x14
strh r3, [r4, lr]
ldr r3, [sp, #0x0]
mov r3, r3, lsl #0x8
mov r3, r3, lsr #0x14
strh r3, [r1, #0x2]
ldr r3, [sp, #0x0]
mov r3, r3, lsl #0x7
mov r3, r3, lsr #0x1f
and r3, r3, #0xff
strh r3, [r1, #0x4]
ldr r3, [sp, #0x0]
mov r3, r3, lsl #0x5
mov r3, r3, lsr #0x1e
and r3, r3, #0xff
strh r3, [r1, #0x6]
ldr r3, [r2, #0x0]
cmp r3, #0x0
addeq sp, sp, #0x8
ldmeqia sp!, {r4,lr}
bxeq lr
ldrh r2, [r2, #0xc]
mov r1, #0x0
and r2, r2, #0xff
blx r3
add sp, sp, #0x8
ldmia sp!, {r4,lr}
bx lr
_020D427C:
ands r1, r1, #0x1000000
addeq sp, sp, #0x8
ldmeqia sp!, {r4,lr}
bxeq lr
and r1, r3, #0xff
cmp r1, #0x4
addls pc, pc, r1, lsl #0x2
b _020D43EC
_020D429C:
b _020D42B0
b _020D43EC
b _020D4390
b _020D4398
b _020D4388
_020D42B0:
cmp r0, #0x0
beq _020D42D4
cmp r0, #0x1
beq _020D4338
cmp r0, #0x2
ldreq r1, _020D43FC
moveq r2, #0x0
streqh r2, [r1, #0x32]
b _020D4344
_020D42D4:
ldr r1, _020D4400
ldr r3, _020D4404
ldrh ip, [r1]
ldr r1, _020D43FC
mov r2, #0x0
strh ip, [sp, #0x4]
ldrh r3, [r3]
strh r3, [sp, #0x6]
ldr ip, [sp, #0x4]
strh r2, [r1, #0x32]
mov r3, ip, lsl #0x7
mov r2, ip, lsl #0x5
mov lr, ip, lsl #0x14
mov ip, ip, lsl #0x8
mov r3, r3, lsr #0x1F
mov r2, r2, lsr #0x1E
mov lr, lr, lsr #0x14
mov ip, ip, lsr #0x14
and r3, r3, #0xFF
and r2, r2, #0xFF
strh lr, [r1, #0x4]
strh ip, [r1, #0x6]
strh r3, [r1, #0x8]
strh r2, [r1, #0xA]
b _020D4344
_020D4338:
ldr r1, _020D43FC
mov r2, #0x2
strh r2, [r1, #0x32]
_020D4344:
ldr r1, _020D43FC
mov r2, #0x1
ldrh ip, [r1, #0x36]
mvn r2, r2, lsl r0
ldr r3, [r1]
and r2, ip, r2
cmp r3, #0x0
strh r2, [r1, #0x36]
addeq sp, sp, #0x8
ldmeqia sp!, {r4, lr}
bxeq lr
mov r1, #0x0
mov r2, r1
blx r3
add sp, sp, #0x8
ldmia sp!, {r4, lr}
bx lr
_020D4388:
mov r4, #0x3
b _020D439C
_020D4390:
mov r4, #0x1
b _020D439C
_020D4398:
mov r4, #0x2
_020D439C:
ldr r1, _020D43FC
mov lr, #0x1
ldrh ip, [r1, #0x34]
ldr r3, [r1]
mvn r2, lr, lsl r0
orr ip, ip, lr, lsl r0
strh ip, [r1, #0x34]
ldrh ip, [r1, #0x36]
cmp r3, #0x0
addeq sp, sp, #0x8
and r2, ip, r2
strh r2, [r1, #0x36]
ldmeqia sp!, {r4, lr}
bxeq lr
and r1, r4, #0xff
mov r2, #0x0
blx r3
add sp, sp, #0x8
ldmia sp!, {r4, lr}
bx lr
_020D43EC:
bl OS_Terminate
add sp, sp, #0x8
ldmia sp!, {r4,lr}
bx lr
.balign 4
_020D43FC: .word 0x021D5474
_020D4400: .word 0x027FFFAA
_020D4404: .word 0x027FFFAC
arm_func_start MicWaitBusy
MicWaitBusy: ; 0x020D4408
ldr ip, _020D441C ; =0x021D54B0
_020D440C:
ldr r0, [r12, #0x0]
cmp r0, #0x1
beq _020D440C
bx lr
.balign 4
_020D441C: .word 0x021D54B0
arm_func_start MicGetResultCallback
MicGetResultCallback: ; 0x020D4420
ldr r1, _020D442C ; =0x021D54B0
str r0, [r1, #0xc]
bx lr
.balign 4
_020D442C: .word 0x021D54B0
arm_func_start MicStopAutoSampling
MicStopAutoSampling:
stmdb sp!, {lr}
sub sp, sp, #0x4
ldr r1, _020D4460 ; =0x03004200
mov r0, #0x9
mov r2, #0x0
bl PXI_SendWordByFifo
_020D4448:
cmp r0, #0x0
movge r0, #0x1
movlt r0, #0x0
add sp, sp, #4
ldmfd sp!, {lr}
bx lr
_020D4460: .word 0x03004200
arm_func_start MicStartAutoSampling
MicStartAutoSampling: ; 0x020D4464
stmdb sp!, {r4-r6,lr}
ldr ip, _020D4584 ; =0x02004100
mov r6, r0
mov r5, r1
mov r4, r2
orr r1, r3, r12
mov r0, #0x9
mov r2, #0x0
bl PXI_SendWordByFifo
_020D4488:
cmp r0, #0x0
movlt r0, #0x0
ldmltia sp!, {r4-r6, lr}
bxlt lr
mov r0, r6, lsr #0x10
orr r1, r0, #0x10000
mov r0, #0x9
mov r2, #0x0
bl PXI_SendWordByFifo
cmp r0, #0x0
movlt r0, #0x0
ldmltia sp!, {r4-r6, lr}
bxlt lr
ldr r1, _020D4588
mov r0, #0x9
and r1, r6, r1
orr r1, r1, #0x20000
mov r2, #0x0
bl PXI_SendWordByFifo
cmp r0, #0x0
movlt r0, #0x0
ldmltia sp!, {r4-r6, lr}
bxlt lr
mov r0, r5, lsr #0x10
orr r1, r0, #0x30000
mov r0, #0x9
mov r2, #0x0
bl PXI_SendWordByFifo
cmp r0, #0x0
movlt r0, #0x0
ldmltia sp!, {r4-r6, lr}
bxlt lr
ldr r1, _020D4588
mov r0, #0x9
and r1, r5, r1
orr r1, r1, #0x40000
mov r2, #0x0
bl PXI_SendWordByFifo
cmp r0, #0x0
movlt r0, #0x0
ldmltia sp!, {r4-r6, lr}
bxlt lr
mov r0, r4, lsr #0x10
orr r1, r0, #0x50000
mov r0, #0x9
mov r2, #0x0
bl PXI_SendWordByFifo
cmp r0, #0x0
movlt r0, #0x0
ldmltia sp!, {r4-r6, lr}
bxlt lr
ldr r0, _020D4588
ldr r1, _020D458C
and r0, r4, r0
orr r1, r0, r1
mov r0, #0x9
mov r2, #0x0
bl PXI_SendWordByFifo
cmp r0, #0x0
movge r0, #0x1
movlt r0, #0x0
ldmia sp!, {r4-r6, lr}
bx lr
_020D4584: .word 0x02004100
_020D4588: .word 0x0000FFFF
_020D458C: .word 0x01060000
arm_func_start MicDoSampling
MicDoSampling: ; 0x020D4590
stmdb sp!, {lr}
sub sp, sp, #0x4
ldr r1, _020D45C4 ; =0x03004000
mov r2, #0x0
orr r1, r0, r1
mov r0, #0x9
bl PXI_SendWordByFifo
_020D45AC:
cmp r0, #0x0
movge r0, #0x1
movlt r0, #0x0
add sp, sp, #0x4
ldmfd sp!, {lr}
bx lr
_020D45C4: .word 0x03004000
arm_func_start MicCommonCallback
MicCommonCallback: ; 0x020D45C8
stmdb sp!, {r4,lr}
mov r4, r1
cmp r2, #0x0
beq _020D4610
ldr r0, _020D4700 ; =0x021D54B0
ldr r2, _020D4700 ; =0x021D54B0
ldr r1, [r0, #0x0]
ldr r12, [r2, #0x4]
cmp r1, #0x0
movne r1, #0x0
strne r1, [r0, #0x0]
cmp r12, #0x0
beq _020D4610
ldr r1, [r2, #0x8]
mov r3, #0x0
mov r0, #0x6
str r3, [r2, #0x4]
blx r12
_020D4610:
and r0, r4, #0xff
mov r1, r0, lsl #0x10
and r2, r4, #0x7f00
mov r0, r2, lsl #0x8
mov r1, r1, lsr #0x10
cmp r1, #0x4
mov r2, r0, lsr #0x10
addls pc, pc, r1, lsl #0x2
b _020D4670
_020D4634:
b _020D4648
b _020D4650
b _020D4658
b _020D4660
b _020D4668
_020D4648:
mov r0, #0x0
b _020D4674
_020D4650:
mov r0, #0x4
b _020D4674
_020D4658:
mov r0, #0x2
b _020D4674
_020D4660:
mov r0, #0x5
b _020D4674
_020D4668:
mov r0, #0x1
b _020D4674
_020D4670:
mov r0, #0x6
_020D4674:
cmp r2, #0x51
bne _020D46A0
ldr r1, _020D4700 ; =0x021D54B0
ldr r2, [r1, #0x10]
cmp r2, #0x0
ldmeqia sp!, {r4,lr}
bxeq lr
ldr r1, [r1, #0x14]
blx r2
ldmia sp!, {r4,lr}
bx lr
_020D46A0:
cmp r2, #0x40
bne _020D46C0
ldr r1, _020D4700 ; =0x021D54B0
ldr r2, [r1, #0x18]
cmp r2, #0x0
ldrne r1, _020D4704 ; =0x027FFF94
ldrneh r1, [r1, #0x0]
strneh r1, [r2, #0x0]
_020D46C0:
ldr r1, _020D4700 ; =0x021D54B0
ldr r2, [r1, #0x0]
cmp r2, #0x0
movne r2, #0x0
strne r2, [r1, #0x0]
ldr r2, _020D4700 ; =0x021D54B0
ldr r4, [r2, #0x4]
cmp r4, #0x0
ldmeqia sp!, {r4,lr}
bxeq lr
ldr r1, [r2, #0x8]
mov r3, #0x0
str r3, [r2, #0x4]
blx r4
ldmia sp!, {r4,lr}
bx lr
.balign 4
_020D4700: .word 0x021D54B0
_020D4704: .word 0x027FFF94
arm_func_start MIC_GetLastSamplingAddress
MIC_GetLastSamplingAddress: ; 0x020D4708
ldr r0, _020D4714 ; =0x027FFF90
ldr r0, [r0, #0x0]
bx lr
.balign 4
_020D4714: .word 0x027FFF90
arm_func_start MIC_StopAutoSampling
MIC_StopAutoSampling: ; 0x020D4718
stmdb sp!, {lr}
sub sp, sp, #0x4
ldr r0, _020D4754 ; =MicGetResultCallback
mov r1, #0x0
bl MIC_StopAutoSamplingAsync
ldr r1, _020D4758 ; =0x021D54B0
cmp r0, #0x0
str r0, [r1, #0xc]
bne _020D4740
bl MicWaitBusy
_020D4740:
ldr r0, _020D4758 ; =0x021D54B0
ldr r0, [r0, #0xc]
add sp, sp, #0x4
ldmia sp!, {lr}
bx lr
.balign 4
_020D4754: .word MicGetResultCallback
_020D4758: .word 0x021D54B0
arm_func_start MIC_StopAutoSamplingAsync
MIC_StopAutoSamplingAsync: ; 0x020D475C
stmdb sp!, {r4-r5,lr}
sub sp, sp, #0x4
mov r5, r0
mov r4, r1
bl OS_DisableInterrupts
ldr r1, _020D47C8 ; =0x021D54B0
ldr r2, [r1, #0x0]
cmp r2, #0x0
beq _020D4794
bl OS_RestoreInterrupts
add sp, sp, #0x4
mov r0, #0x1
ldmia sp!, {r4-r5,lr}
bx lr
_020D4794:
mov r2, #0x1
str r2, [r1, #0x0]
bl OS_RestoreInterrupts
ldr r0, _020D47C8 ; =0x021D54B0
str r5, [r0, #0x4]
str r4, [r0, #0x8]
bl MicStopAutoSampling
_020D47B0:
cmp r0, #0x0
movne r0, #0x0
moveq r0, #0x3
add sp, sp, #0x4
ldmia sp!, {r4-r5, lr}
bx lr
_020D47C8: .word 0x021D54B0
arm_func_start MIC_StartAutoSampling
MIC_StartAutoSampling: ; 0x020D47CC
stmdb sp!, {lr}
sub sp, sp, #0x4
ldr r1, _020D4808 ; =MicGetResultCallback
mov r2, #0x0
bl MIC_StartAutoSamplingAsync
ldr r1, _020D480C ; =0x021D54B0
cmp r0, #0x0
str r0, [r1, #0xc]
bne _020D47F4
bl MicWaitBusy
_020D47F4:
ldr r0, _020D480C ; =0x021D54B0
ldr r0, [r0, #0xc]
add sp, sp, #0x4
ldmia sp!, {lr}
bx lr
.balign 4
_020D4808: .word MicGetResultCallback
_020D480C: .word 0x021D54B0
arm_func_start MIC_StartAutoSamplingAsync
MIC_StartAutoSamplingAsync: ; 0x020D4810
stmdb sp!, {r4-r7,lr}
sub sp, sp, #0x4
mov r7, r0
ldr r0, [r7, #0x4]
mov r6, r1
ands r0, r0, #0x1f
mov r5, r2
addne sp, sp, #0x4
movne r0, #0x2
ldmneia sp!, {r4-r7,lr}
bxne lr
ldr r1, [r7, #0x8]
ands r0, r1, #0x1f
addne sp, sp, #0x4
movne r0, #0x2
ldmneia sp!, {r4-r7,lr}
bxne lr
cmp r1, #0x0
addeq sp, sp, #0x4
moveq r0, #0x2
ldmeqia sp!, {r4-r7,lr}
bxeq lr
ldr r0, [r7, #0xc]
cmp r0, #0x400
addcc sp, sp, #0x4
movcc r0, #0x2
ldmccia sp!, {r4-r7,lr}
bxcc lr
ldr r0, [r7, #0x0]
cmp r0, #0x5
addls pc, pc, r0, lsl #0x2
b _020D48D8
_020D4890:
b _020D48A8
b _020D48B0
b _020D48B8
b _020D48C0
b _020D48C8
b _020D48D0
_020D48A8:
mov r1, #0x0
b _020D48E8
_020D48B0:
mov r1, #0x1
b _020D48E8
_020D48B8:
mov r1, #0x2
b _020D48E8
_020D48C0:
mov r1, #0x3
b _020D48E8
_020D48C8:
mov r1, #0x5
b _020D48E8
_020D48D0:
mov r1, #0x7
b _020D48E8
_020D48D8:
add sp, sp, #0x4
mov r0, #0x2
ldmia sp!, {r4-r7,lr}
bx lr
_020D48E8:
ldr r0, [r7, #0x10]
cmp r0, #0x0
orrne r0, r1, #0x10
andne r0, r0, #0xff
andeq r0, r1, #0xff
and r4, r0, #0xff
bl OS_DisableInterrupts
ldr r1, _020D497C
ldr r2, [r1]
cmp r2, #0x0
beq _020D4928
bl OS_RestoreInterrupts
add sp, sp, #0x4
mov r0, #0x1
ldmia sp!, {r4-r7,lr}
bx lr
_020D4928:
mov r2, #0x1
str r2, [r1]
bl OS_RestoreInterrupts
ldr r0, _020D497C
mov r3, r4
str r6, [r0, #0x4]
str r5, [r0, #0x8]
ldr r1, [r7, #0x14]
str r1, [r0, #0x10]
ldr r1, [r7, #0x18]
str r1, [r0, #0x14]
ldr r0, [r7, #0x4]
ldr r1, [r7, #0x8]
ldr r2, [r7, #0xC]
bl MicStartAutoSampling
cmp r0, #0x0
movne r0, #0x0
moveq r0, #0x3
add sp, sp, #0x4
ldmia sp!, {r4-r7,lr}
bx lr
_020D497C: .word 0x021D54B0
arm_func_start MIC_DoSamplingAsync
MIC_DoSamplingAsync: ; 0x020D4980
stmdb sp!, {r4-r7,lr}
sub sp, sp, #0x4
cmp r0, #0x6
mov r7, r1
mov r6, r2
mov r5, r3
addge sp, sp, #0x4
movge r0, #0x2
ldmgeia sp!, {r4-r7,lr}
bxge lr
cmp r0, #0x3
addls pc, pc, r0, lsl #0x2
b _020D49E4
_020D49B4:
b _020D49C4
b _020D49CC
b _020D49D4
b _020D49DC
_020D49C4:
mov r4, #0x0
b _020D49F4
_020D49CC:
mov r4, #0x1
b _020D49F4
_020D49D4:
mov r4, #0x2
b _020D49F4
_020D49DC:
mov r4, #0x3
b _020D49F4
_020D49E4:
add sp, sp, #0x4
mov r0, #0x2
ldmia sp!, {r4-r7,lr}
bx lr
_020D49F4:
bl OS_DisableInterrupts
ldr r1, _020D4A58
ldr r2, [r1]
cmp r2, #0x0
beq _020D4A1C
bl OS_RestoreInterrupts
add sp, sp, #0x4
mov r0, #0x1
ldmia sp!, {r4-r7,lr}
bx lr
_020D4A1C:
mov r2, #0x1
str r2, [r1]
bl OS_RestoreInterrupts
ldr r1, _020D4A58
mov r0, r4
str r6, [r1, #0x4]
str r5, [r1, #0x8]
str r7, [r1, #0x18]
bl MicDoSampling
cmp r0, #0x0
movne r0, #0x0
moveq r0, #0x3
add sp, sp, #0x4
ldmia sp!, {r4-r7,lr}
bx lr
_020D4A58: .word 0x021D54B0
arm_func_start MIC_Init
MIC_Init: ; 0x020D4A5C
stmdb sp!, {r4-r5,lr}
sub sp, sp, #0x4
ldr r1, _020D4AD8 ; =0x021D54AC
ldrh r0, [r1, #0x0]
cmp r0, #0x0
addne sp, sp, #0x4
ldmneia sp!, {r4-r5,lr}
bxne lr
ldr r0, _020D4ADC ; =0x021D54B0
mov r2, #0x0
mov r3, #0x1
strh r3, [r1, #0x0]
str r2, [r0, #0x0]
str r2, [r0, #0x4]
bl PXI_Init
mov r5, #0x9
mov r4, #0x1
_020D4AA0:
mov r0, r5
mov r1, r4
bl PXI_IsCallbackReady
_020D4AAC:
cmp r0, #0x0
beq _020D4AA0
ldr r2, _020D4AE0
mov r3, #0x0
ldr r1, _020D4AE4
mov r0, #0x9
str r3, [r2]
bl PXI_SetFifoRecvCallback
add sp, sp, #0x4
ldmia sp!, {r4-r5, lr}
bx lr
_020D4AD8: .word 0x021D54AC
_020D4ADC: .word 0x021D54B0
_020D4AE0: .word 0x027FFF90
_020D4AE4: .word MicCommonCallback
arm_func_start PM_DeletePostSleepCallback
PM_DeletePostSleepCallback: ; 0x020D4AE8
ldr ip, _020D4AF8 ; =0x020D4B78
mov r1, r0
ldr r0, _020D4AFC ; =0x021D54E0
bx r12
.balign 4
_020D4AF8: .word 0x020D4B78
_020D4AFC: .word 0x021D54E0
arm_func_start PM_DeletePreSleepCallback
PM_DeletePreSleepCallback: ; 0x020D4B00
ldr ip, _020D4B10 ; =0x020D4B78
mov r1, r0
ldr r0, _020D4B14 ; =0x021D54D8
bx r12
.balign 4
_020D4B10: .word 0x020D4B78
_020D4B14: .word 0x021D54D8
arm_func_start PM_AppendPostSleepCallback
PM_AppendPostSleepCallback: ; 0x020D4B18
ldr ip, _020D4B28 ; =FUN_020D4BC4
mov r1, r0
ldr r0, _020D4B2C ; =0x021D54E0
bx r12
.balign 4
_020D4B28: .word FUN_020D4BC4
_020D4B2C: .word 0x021D54E0
arm_func_start PM_PrependPreSleepCallback
PM_PrependPreSleepCallback: ; 0x020D4B30
ldr ip, _020D4B40 ; =FUN_020D4C0C
mov r1, r0
ldr r0, _020D4B44 ; =0x021D54D8
bx r12
.balign 4
_020D4B40: .word FUN_020D4C0C
_020D4B44: .word 0x021D54D8
arm_func_start PMi_ExecuteList
PMi_ExecuteList: ; 0x020D4B48
stmdb sp!, {r4,lr}
movs r4, r0
ldmeqia sp!, {r4,lr}
bxeq lr
_020D4B58:
ldr r0, [r4, #0x4]
ldr r1, [r4, #0x0]
blx r1
ldr r4, [r4, #0x8]
cmp r4, #0x0
bne _020D4B58
ldmia sp!, {r4,lr}
bx lr
arm_func_start FUN_020D4B78
FUN_020D4B78:
cmp r0, #0x0
bxeq lr
ldr r3, [r0]
mov r2, r3
cmp r3, #0x0
bxeq lr
_020D4B90:
cmp r3, r1
bne _020D4BB0
cmp r3, r2
ldreq r1, [r3, #0x8]
streq r1, [r0]
ldrne r0, [r3, #0x8]
strne r0, [r2, #0x8]
bx lr
_020D4BB0:
mov r2, r3
ldr r3, [r3, #0x8]
cmp r3, #0x0
bne _020D4B90
bx lr
arm_func_start FUN_020D4BC4
FUN_020D4BC4: ; 0x020D4BC4
cmp r0, #0x0
bxeq lr
ldr r2, [r0, #0x0]
cmp r2, #0x0
moveq r2, #0x0
streq r2, [r1, #0x8]
streq r1, [r0, #0x0]
bxeq lr
ldr r0, [r2, #0x8]
cmp r0, #0x0
beq _020D4C00
_020D4BF0:
mov r2, r0
ldr r0, [r0, #0x8]
cmp r0, #0x0
bne _020D4BF0
_020D4C00:
str r0, [r1, #0x8]
str r1, [r2, #0x8]
bx lr
arm_func_start FUN_020D4C0C
FUN_020D4C0C: ; 0x020D4C0C
cmp r0, #0x0
ldrne r2, [r0, #0x0]
strne r2, [r1, #0x8]
strne r1, [r0, #0x0]
bx lr
arm_func_start PM_GetLEDPattern
PM_GetLEDPattern: ; 0x020D4C20
stmdb sp!, {lr}
sub sp, sp, #0x4
ldr r1, _020D4C58 ; =0x020D587C
add r2, sp, #0x0
bl PM_GetLEDPatternAsync
_020D4C34:
cmp r0, #0x0
addne sp, sp, #0x4
ldmnefd sp!, {lr}
bxne lr
bl PMi_WaitBusy
ldr r0, [sp]
add sp, sp, #0x4
ldmfd sp!, {lr}
bx lr
_020D4C58: .word 0x020D587C
arm_func_start PM_GetLEDPatternAsync
PM_GetLEDPatternAsync:
stmdb sp!, {r4-r6,lr}
mov r6, r0
mov r5, r1
mov r4, r2
bl PMi_Lock
_020D4C70:
cmp r0, #0x0
moveq r0, #0x1
ldmeqia sp!, {r4-r6,lr}
bxeq lr
ldr r1, _020D4CA4
ldr r0, _020D4CA8
str r5, [r1, #0x4]
str r4, [r1, #0x8]
str r6, [r1, #0xC]
bl PMi_SendPxiData
mov r0, #0x0
ldmia sp!, {r4-r6,lr}
bx lr
_020D4CA4: .word 0x021D54E4
_020D4CA8: .word 0x03006700
arm_func_start PMi_SendLEDPatternCommand
PMi_SendLEDPatternCommand: ; 0x020D4CAC
stmdb sp!, {lr}
sub sp, sp, #0x4
ldr r1, _020D4CE4 ; =0x020D587C
add r2, sp, #0x0
bl PMi_SendLEDPatternCommandAsync
_020D4CC0:
cmp r0, #0x0
addne sp, sp, #0x4
ldmnefd sp!, {lr}
bxne lr
bl PMi_WaitBusy
ldr r0, [sp]
add sp, sp, #0x4
ldmfd sp!, {lr}
bx lr
_020D4CE4: .word 0x020D587C
arm_func_start PMi_SendLEDPatternCommandAsync
PMi_SendLEDPatternCommandAsync:
stmdb sp!, {r4-r6,lr}
mov r6, r0
mov r5, r1
mov r4, r2
bl PMi_Lock
_020D4CFC:
cmp r0, #0x0
moveq r0, #0x1
ldmeqia sp!, {r4-r6,lr}
bxeq lr
ldr r0, _020D4D34
ldr r1, _020D4D38
and r2, r6, #0xff
orr r0, r2, r0
str r5, [r1, #0x4]
str r4, [r1, #0x8]
bl PMi_SendPxiData
mov r0, #0x0
ldmia sp!, {r4-r6,lr}
bx lr
_020D4D34: .word 0x03006600
_020D4D38: .word 0x021D54E4
arm_func_start PM_GetLCDPower
PM_GetLCDPower: ; 0x020D4D3C
ldr r0, _020D4D54 ; =0x04000304
ldrh r0, [r0, #0x0]
ands r0, r0, #0x1
movne r0, #0x1
moveq r0, #0x0
bx lr
.balign 4
_020D4D54: .word 0x04000304
arm_func_start PM_SetLCDPower
PM_SetLCDPower: ; 0x020D4D58
ldr ip, _020D4D74 ; =PMi_SetLCDPower
mov r1, #0x0
cmp r0, #0x1
movne r0, #0x0
mov r2, r1
mov r3, #0x1
bx r12
.balign 4
_020D4D74: .word PMi_SetLCDPower
arm_func_start PMi_SetLCDPower
PMi_SetLCDPower: ; 0x020D4D78
stmdb sp!, {lr}
sub sp, sp, #0x4
cmp r0, #0x0
beq _020D4E00
cmp r0, #0x1
bne _020D4E4C
cmp r2, #0x0
bne _020D4DC0
ldr r2, _020D4E5C ; =0x027FFC3C
ldr r0, _020D4E60 ; =0x021D54DC
ldr r2, [r2, #0x0]
ldr r0, [r0, #0x0]
sub r0, r2, r0
cmp r0, #0x7
addls sp, sp, #0x4
movls r0, #0x0
ldmlsia sp!, {lr}
bxls lr
_020D4DC0:
cmp r1, #0x0
beq _020D4DEC
cmp r3, #0x0
beq _020D4DDC
mov r0, r1
bl PMi_SetLED
b _020D4DEC
_020D4DDC:
mov r0, r1
mov r1, #0x0
mov r2, r1
bl PMi_SetLEDAsync
_020D4DEC:
ldr r1, _020D4E64 ; =0x04000304
ldrh r0, [r1, #0x0]
orr r0, r0, #0x1
strh r0, [r1, #0x0]
b _020D4E4C
_020D4E00:
ldr lr, _020D4E64 ; =0x04000304
ldr r2, _020D4E5C ; =0x027FFC3C
ldrh r12, [lr, #0x0]
ldr r0, _020D4E60 ; =0x021D54DC
cmp r1, #0x0
bic r12, r12, #0x1
strh r12, [lr, #0x0]
ldr r2, [r2, #0x0]
str r2, [r0, #0x0]
beq _020D4E4C
cmp r3, #0x0
beq _020D4E3C
mov r0, r1
bl PMi_SetLED
b _020D4E4C
_020D4E3C:
mov r0, r1
mov r1, #0x0
mov r2, r1
bl PMi_SetLEDAsync
_020D4E4C:
mov r0, #0x1
add sp, sp, #0x4
ldmia sp!, {lr}
bx lr
.balign 4
_020D4E5C: .word 0x027FFC3C
_020D4E60: .word 0x021D54DC
_020D4E64: .word 0x04000304
arm_func_start PM_GoSleepMode
PM_GoSleepMode: ; 0x020D4E68
stmdb sp!, {r4-r11,lr}
sub sp, sp, #0x1c
ldr r3, _020D5084 ; =0x021D54D8
mov r10, r0
ldr r0, [r3, #0x0]
mov r9, r1
mov r11, r2
mov r8, #0x0
bl PMi_ExecuteList
ldr r1, _020D5088 ; =0x04000208
mov r0, r8
ldrh r4, [r1, #0x0]
strh r0, [r1, #0x0]
bl OS_DisableInterrupts
_020D4EA0:
str r0, [sp]
ldr r0, _020D508C
bl OS_DisableIrqMask
str r0, [sp, #0x4]
mov r0, #0x40000
bl OS_SetIrqMask
ldr r0, [sp]
bl OS_RestoreInterrupts
ldr r2, _020D5088
mov r1, #0x1
ldrh r0, [r2]
ands r0, sl, #0x8
strh r1, [r2]
beq _020D4EE8
ldr r0, _020D5090
ldrh r0, [r0]
cmp r0, #0x2
biceq sl, sl, #0x8
_020D4EE8:
ands r0, sl, #0x10
beq _020D4EFC
bl CTRDG_IsExisting
cmp r0, #0x0
biceq sl, sl, #0x10
_020D4EFC:
ldr r0, _020D5094
mov r1, #0x4000000
ldr r7, [r1]
ldr r6, [r0]
bl PM_GetLCDPower
str r0, [sp, #0x8]
add r0, sp, #0xC
add r1, sp, #0x10
bl PM_GetBackLight
mov r0, #0x2
mov r1, #0x0
bl FUN_020D526C
ldr r2, _020D5098
ldr r0, [r2]
str r0, [sp, #0x14]
_020D4F38:
ldr r1, [r2]
ldr r0, [sp, #0x14]
cmp r0, r1
beq _020D4F38
ldr r0, [r2]
mov r2, #0x4000000
str r0, [sp, #0x14]
ldr r0, [r2]
ldr r1, _020D5094
bic r0, r0, #0x30000
str r0, [r2]
ldr r0, [r1]
bic r0, r0, #0x10000
str r0, [r1]
ldr r2, _020D5098
_020D4F74:
ldr r1, [r2]
ldr r0, [sp, #0x14]
cmp r0, r1
beq _020D4F74
ldr r0, [r2]
str r0, [sp, #0x14]
ldr r2, _020D5098
_020D4F90:
ldr r1, [r2]
ldr r0, [sp, #0x14]
cmp r0, r1
beq _020D4F90
ldr r0, [sp, #0xC]
ldr r1, [sp, #0x10]
orr r0, sl, r0, lsl #0x5
orr r0, r0, r1, lsl #0x6
mov r0, r0, lsl #0x10
mov r5, r0, lsr #0x10
orr r0, r9, fp
mov r0, r0, lsl #0x10
mov r9, r0, lsr #0x10
_020D4FC4:
mov r0, r5
mov r1, r9
bl PMi_SendSleepStart
cmp r0, #0x0
bne _020D4FC4
bl OS_Halt
ldr r0, _020D509C
bl OS_SpinWait
ands r0, sl, #0x8
beq _020D4FFC
ldr r0, _020D50A0
ldr r0, [r0]
ands r0, r0, #0x100000
movne r8, #0x1
_020D4FFC:
cmp r8, #0x0
bne _020D5040
ldr r0, [sp, #0x8]
cmp r0, #0x1
bne _020D5028
mov r0, #0x1
mov r1, r0
mov r2, r0
mov r3, #0x0
bl PMi_SetLCDPower
b _020D5030
_020D5028:
mov r0, #0x1
bl PMi_SetLED
_020D5030:
mov r1, #0x4000000
ldr r0, _020D5094
str r7, [r1]
str r6, [r0]
_020D5040:
bl OS_DisableInterrupts
ldr r0, [sp, #0x4]
bl OS_SetIrqMask
ldr r0, [sp]
bl OS_RestoreInterrupts
ldr r1, _020D5088
cmp r8, #0x0
ldrh r0, [r1]
strh r4, [r1]
beq _020D506C
bl FUN_020D5180
_020D506C:
ldr r0, _020D50A4
ldr r0, [r0]
bl PMi_ExecuteList
add sp, sp, #0x1C
ldmia sp!, {r4-r11, lr}
bx lr
_020D5084: .word 0x021D54D8
_020D5088: .word 0x04000208
_020D508C: .word 0x003FFFFF
_020D5090: .word 0x027FFC40
_020D5094: .word 0x04001000
_020D5098: .word 0x027FFC3C
_020D509C: .word 0x00996A00
_020D50A0: .word 0x04000214
_020D50A4: .word 0x021D54E0
arm_func_start PMi_SendPxiData
PMi_SendPxiData: ; 0x020D50A8
stmdb sp!, {r4-r6,lr}
mov r6, r0
mov r5, #0x8
mov r4, #0x0
_020D50B8:
mov r0, r5
mov r1, r6
mov r2, r4
bl PXI_SendWordByFifo
_020D50C8:
cmp r0, #0
bne _020D50B8
ldmia sp!, {r4-r6, lr}
bx lr
arm_func_start PM_GetBackLight
PM_GetBackLight: ; 0x020D50D8
stmdb sp!, {r4-r5,lr}
sub sp, sp, #0x4
mov r4, r1
mov r5, r0
add r1, sp, #0x0
mov r0, #0x0
bl PMi_ReadRegister
_020D50F4:
cmp r0, #0x0
addne sp, sp, #0x4
ldmneia sp!, {r4-r5,lr}
bxne lr
cmp r5, #0x0
beq _020D5120
ldrh r1, [sp]
ands r1, r1, #0x8
movne r1, #0x1
moveq r1, #0x0
str r1, [r5]
_020D5120:
cmp r4, #0x0
addeq sp, sp, #0x4
ldmeqia sp!, {r4-r5,lr}
bxeq lr
ldrh r1, [sp]
ands r1, r1, #0x4
movne r1, #0x1
moveq r1, #0x0
str r1, [r4]
add sp, sp, #0x4
ldmia sp!, {r4-r5,lr}
bx lr