Files
pokediamond/asm/OS_arm9.s
T
2020-04-25 11:41:41 -04:00

4757 lines
87 KiB
ArmAsm

.include "asm/macros.inc"
.include "global.inc"
.section .dtcm
.balign 16, 0
.global OS_IRQTable
OS_IRQTable: ; 027E0000 ;10b6a0
.word OS_IrqDummy ; 020c9da8
.word OS_IrqDummy ; 020c9da8
.word OS_IrqDummy ; 020c9da8
.word OSi_IrqTimer0 ; 020c9cbc
.word OSi_IrqTimer1 ; 020c9cac
.word OSi_IrqTimer2 ; 020c9c9c
.word OSi_IrqTimer3 ; 020c9c8c
.word OS_IrqDummy ; 020c9da8
.word OSi_IrqDma0 ; 020c9cfc
.word OSi_IrqDma1 ; 020c9cec
.word OSi_IrqDma2 ; 020c9cdc
.word OSi_IrqDma3 ; 020c9ccc
.word OS_IrqDummy ; 020c9da8
.word OS_IrqDummy ; 020c9da8
.word OS_IrqDummy ; 020c9da8
.word OS_IrqDummy ; 020c9da8
.word OS_IrqDummy ; 020c9da8
.word OS_IrqDummy ; 020c9da8
.word OS_IrqDummy ; 020c9da8
.word OS_IrqDummy ; 020c9da8
.word OS_IrqDummy ; 020c9da8
.word OS_IrqDummy ; 020c9da8
.balign 16, 0
OSi_IrqThreadQueue: ; 027E0060
.section .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 SDK_MAIN_ARENA_LO
_020CC3F0: .word OSi_MainExArenaEnabled
_020CC3F4: .word SDK_SECTION_ARENA_EX_START
_020CC3F8: .word SDK_SECTION_ARENA_ITCM_START
_020CC3FC: .word SDK_SECTION_ARENA_DTCM_START
_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
arm_func_start OS_SpinWait
OS_SpinWait:
subs r0, r0, #0x4
bhs OS_SpinWait
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 OSi_DoResetSystem
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