.include "asm/macros.inc" .include "global.inc" .extern isInitialized .section .dtcm .balign 16, 0 .global OS_IRQTable OS_IRQTable: ; 027E0000 ;10b6a0 .word OS_IrqDummy .word OS_IrqDummy .word OS_IrqDummy .word OSi_IrqTimer0 .word OSi_IrqTimer1 .word OSi_IrqTimer2 .word OSi_IrqTimer3 .word OS_IrqDummy .word OSi_IrqDma0 .word OSi_IrqDma1 .word OSi_IrqDma2 .word OSi_IrqDma3 .word OS_IrqDummy .word OS_IrqDummy .word OS_IrqDummy .word OS_IrqDummy .word OS_IrqDummy .word OS_IrqDummy .word OS_IrqDummy .word OS_IrqDummy .word OS_IrqDummy .word OS_IrqDummy .balign 16, 0 .global OSi_IrqThreadQueue 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 ; =OSi_IrqCallbackInfo 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 OSi_IrqCallbackInfo _020C9D98: .word OSi_IrqCallbackInfoIndex _020C9D9C: .word OSi_IrqCallbackInfo + 8 _020C9DA0: .word SDK_AUTOLOAD_DTCM_START _020C9DA4: .word OSi_IrqCallbackInfo + 4 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 OSi_IrqCallbackInfo+0x30 _020C9F0C: .word OSi_IrqCallbackInfo+0x38 _020C9F10: .word OSi_IrqCallbackInfo+0x34 arm_func_start OSi_EnterDmaCallback OSi_EnterDmaCallback: ; 0x020C9F14 stmdb sp!, {r4-r6,lr} mov r3, #0xc mul r6, r0, r3 ldr ip, _020C9F54 ; =OSi_IrqCallbackInfo 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 OSi_IrqCallbackInfo _020C9F58: .word OSi_IrqCallbackInfo + 8 _020C9F5C: .word OSi_IrqCallbackInfo + 4 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 ; =OSi_IrqCallbackInfo 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 ; =OSi_IrqCallbackInfo 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 OSi_IrqCallbackInfo arm_func_start OS_SetIrqFunction OS_SetIrqFunction: ; 0x020C9FEC stmdb sp!, {r4-r8,lr} mov r8, #0x0 ldr lr, _020CA074 ; =0x027E0000 ldr r5, _020CA078 ; =OSi_IrqCallbackInfo 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 OSi_IrqCallbackInfo 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 SVC_WaitByLoop 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 ; =isInitialized 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 SVC_WaitByLoop 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 isInitialized _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 OS_IsThreadAvailable OS_IsThreadAvailable: ; 0x020CAED0 ldr r0, _020CAEDC ; =OSi_IsThreadInitialized ldr r0, [r0, #0x0] bx lr .balign 4 _020CAEDC: .word OSi_IsThreadInitialized 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 ; =OSi_RescheduleCount 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 OSi_RescheduleCount arm_func_start OS_DisableScheduler OS_DisableScheduler: ; 0x020CAF20 stmdb sp!, {r4,lr} bl OS_DisableInterrupts ldr r2, _020CAF54 ; =OSi_RescheduleCount 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 OSi_RescheduleCount 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 ; =OSi_ThreadInfo 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 OSi_ThreadInfo 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 ; =OSi_CurrentThreadPtr 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 OSi_CurrentThreadPtr _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 ; =OSi_ThreadInfo 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 ; =OSi_IdleThread 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 ; =OSi_ThreadInfo 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 OSi_ThreadInfo _020CB124: .word OSi_IdleThread arm_func_start OS_YieldThread OS_YieldThread: ; 0x020CB128 stmdb sp!, {r4-r8,lr} ldr r0, _020CB1E0 ; =OSi_ThreadInfo mov r7, #0x0 mov r6, r7 mov r5, r7 ldr r8, [r0, #0x4] bl OS_DisableInterrupts ldr r1, _020CB1E0 ; =OSi_ThreadInfo 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 ; =OSi_ThreadInfo 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 OSi_ThreadInfo 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 ; =OSi_ThreadInfo 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 OSi_ThreadInfo 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 ; =OSi_CurrentThreadPtr 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 OSi_CurrentThreadPtr 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 ; =OSi_ThreadInfo 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 OSi_ThreadInfo arm_func_start OSi_ExitThread_Destroy OSi_ExitThread_Destroy: ; 0x020CB43C stmdb sp!, {r4,lr} ldr r0, _020CB498 ; =OSi_CurrentThreadPtr 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 OSi_CurrentThreadPtr arm_func_start OSi_ExitThread_Destroy2 OSi_ExitThread_Destroy2: ; 0x020CB49C stmdb sp!, {lr} sub sp, sp, #0x4 ldr r1, _020CB4DC ; =OSi_CurrentThreadPtr 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 OSi_CurrentThreadPtr arm_func_start OSi_ExitThread_ArgSpecified OSi_ExitThread_ArgSpecified: ; 0x020CB4E0 stmdb sp!, {r4-r5,lr} sub sp, sp, #0x4 ldr r2, _020CB548 ; =OSi_StackForDestructor 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 OSi_StackForDestructor _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 ; =OSi_ThreadInfo mov r1, #0x0 ldr r0, [r0, #0x4] bl OSi_ExitThread_ArgSpecified add sp, sp, #0x4 ldmia sp!, {lr} bx lr .balign 4 _020CB578: .word OSi_ThreadInfo 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 ; =OSi_IsThreadInitialized 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 ; =OSi_ThreadInfo 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 ; =OSi_CurrentThreadPtr 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 ; =OSi_ThreadInfo 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 ; =OSi_IdleThread ldr r1, _020CB7D8 ; =OSi_IdleThreadProc ldr r3, _020CB7DC ; =OSi_Initialized mov r2, #0x0 str r12, [sp, #0x4] bl OS_CreateThread ldr r0, _020CB7D4 ; =OSi_IdleThread 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 OSi_IsThreadInitialized _020CB7A8: .word SDK_SYS_STACKSIZE _020CB7AC: .word OSi_LauncherThread _020CB7B0: .word OSi_ThreadInfo _020CB7B4: .word SDK_SECTION_ARENA_DTCM_START _020CB7B8: .word SDK_AUTOLOAD_DTCM_START _020CB7BC: .word SDK_IRQ_STACKSIZE _020CB7C0: .word OSi_ThreadInfo+4 _020CB7C4: .word OSi_CurrentThreadPtr _020CB7C8: .word 0xFDDB597D _020CB7CC: .word 0x7BF9DD5B _020CB7D0: .word 0x027FFFA0 _020CB7D4: .word OSi_IdleThread _020CB7D8: .word OSi_IdleThreadProc _020CB7DC: .word OSi_IdleThreadStack+0xc8 arm_func_start OSi_RescheduleThread OSi_RescheduleThread: ; 0x020CB7E0 stmdb sp!, {r4-r6,lr} ldr r0, _020CB8BC ; =OSi_RescheduleCount ldr r0, [r0, #0x0] cmp r0, #0x0 ldmneia sp!, {r4-r6,lr} bxne lr ldr r4, _020CB8C0 ; =OSi_ThreadInfo 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 ; =OSi_CurrentThreadPtr 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 ; =OSi_ThreadInfo mov r0, r5 str r5, [r1, #0x4] bl OS_LoadContext ldmia sp!, {r4-r6,lr} bx lr .balign 4 _020CB8BC: .word OSi_RescheduleCount _020CB8C0: .word OSi_ThreadInfo _020CB8C4: .word OSi_CurrentThreadPtr _020CB8C8: .word OSi_SystemCallbackInSwitchThread arm_func_start OSi_RemoveThreadFromList OSi_RemoveThreadFromList: ; 0x020CB8CC ldr r1, _020CB910 ; =OSi_ThreadInfo 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 ; =OSi_ThreadInfo streq r1, [r0, #0x8] ldrne r0, [r0, #0x68] strne r0, [r2, #0x68] bx lr .balign 4 _020CB910: .word OSi_ThreadInfo arm_func_start OSi_InsertThreadToList OSi_InsertThreadToList: ; 0x020CB914 stmdb sp!, {lr} sub sp, sp, #0x4 ldr r1, _020CB978 ; =OSi_ThreadInfo 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 ; =OSi_ThreadInfo 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 OSi_ThreadInfo 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 ; =OSi_ThreadIdCount ldr r0, [r1, #0x0] add r0, r0, #0x1 str r0, [r1, #0x0] bx lr .balign 4 _020CBAC0: .word OSi_ThreadIdCount 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 ; =OSi_ThreadInfo 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 OSi_ThreadInfo 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 ; =OSi_ThreadInfo 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 OSi_ThreadInfo 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 ; =OSi_ThreadInfo 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 OSi_ThreadInfo 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 ; =OSi_MainExArenaEnabled 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 ; =OSi_MainExArenaEnabled 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 OSi_MainExArenaEnabled _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 ; =OSi_MainExArenaEnabled 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 OSi_MainExArenaEnabled _020CC5D8: .word 0x0200002B _020CC5DC: .word 0x023E0021 arm_func_start OS_InitArena OS_InitArena: ; 0x020CC5E0 stmdb sp!, {lr} sub sp, sp, #0x4 ldr r1, _020CC6F4 ; =OSi_Initialized 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 OSi_Initialized 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 ; =OSi_HeapInfo 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 OSi_HeapInfo 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 ; =OSi_HeapInfo 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 OSi_HeapInfo 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 ; =OSi_DebuggerHandler 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 ; =OSi_DebuggerHandler 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 OSi_DebuggerHandler _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 ; =OSi_ExContext 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 OSi_ExContext arm_func_start OSi_DisplayExContext OSi_DisplayExContext: ; 0x020CCB14 stmdb sp!, {lr} sub sp, sp, #0x4 ldr r0, _020CCB70 ; =OSi_UserExceptionHandler 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 ; =OSi_UserExceptionHandlerArg ldr r0, _020CCB70 ; =OSi_UserExceptionHandler ldr r1, [r1, #0x0] ldr r2, [r0, #0x0] ldr r0, _020CCB7C ; =OSi_ExContext blx r2 bl OS_DisableProtectionUnit add sp, sp, #0x4 ldmia sp!, {lr} bx lr .balign 4 _020CCB70: .word OSi_UserExceptionHandler _020CCB74: .word 0x0000009F _020CCB78: .word OSi_UserExceptionHandlerArg _020CCB7C: .word OSi_ExContext 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 ; =OSi_DebuggerHandler strcc r1, [r0, #0x0] blo _020CCBAC _020CCBA0: ldr r0, _020CCBE0 ; =OSi_DebuggerHandler mov r1, #0x0 str r1, [r0, #0x0] _020CCBAC: ldr r0, _020CCBE0 ; =OSi_DebuggerHandler 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 ; =OSi_UserExceptionHandler mov r1, #0x0 str r1, [r0, #0x0] bx lr .balign 4 _020CCBDC: .word 0x027FFD9C _020CCBE0: .word OSi_DebuggerHandler _020CCBE4: .word OSi_ExceptionHandler _020CCBE8: .word 0x027E3000 _020CCBEC: .word OSi_UserExceptionHandler arm_func_start OSi_SetTimerReserved OSi_SetTimerReserved: ; 0x020CCBF0 ldr r1, _020CCC08 ; =OSi_TimerReserved mov r2, #0x1 ldrh r3, [r1, #0x0] orr r0, r3, r2, lsl r0 strh r0, [r1, #0x0] bx lr .balign 4 _020CCC08: .word OSi_TimerReserved 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 ; =OSi_TickCounter 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 OSi_TickCounter _020CCCC4: .word 0x0000FFFF _020CCCC8: .word 0x04000214 arm_func_start OSi_CountUpTick OSi_CountUpTick: ; 0x020CCCCC stmdb sp!, {lr} sub sp, sp, #0x4 ldr r2, _020CCD40 ; =OSi_TickCounter ldr r1, _020CCD44 ; =OSi_NeedResetTimer 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 OSi_TickCounter _020CCD44: .word OSi_NeedResetTimer _020CCD48: .word 0x04000102 _020CCD4C: .word 0x04000100 _020CCD50: .word OSi_CountUpTick arm_func_start OS_IsTickAvailable OS_IsTickAvailable: ; 0x020CCD54 ldr r0, _020CCD60 ; =OSi_UseTick ldrh r0, [r0, #0x0] bx lr .balign 4 _020CCD60: .word OSi_UseTick arm_func_start OS_InitTick OS_InitTick: ; 0x020CCD64 stmdb sp!, {lr} sub sp, sp, #0x4 ldr r1, _020CCDE8 ; =OSi_UseTick 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 ; =OSi_TickCounter 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 ; =OSi_NeedResetTimer mov r1, #0x0 str r1, [r0, #0x0] add sp, sp, #0x4 ldmia sp!, {lr} bx lr .balign 4 _020CCDE8: .word OSi_UseTick _020CCDEC: .word OSi_TickCounter _020CCDF0: .word 0x04000102 _020CCDF4: .word 0x04000100 _020CCDF8: .word OSi_CountUpTick _020CCDFC: .word OSi_NeedResetTimer 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 ; =OSi_AlarmQueue 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 ; =OSi_AlarmQueue 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 OSi_AlarmQueue 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 ; =OSi_AlarmQueue 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 ; =OSi_AlarmQueue 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 OSi_AlarmQueue 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 ; =OSi_AlarmQueue 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 ; =OSi_AlarmQueue 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 ; =OSi_AlarmQueue 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 OSi_AlarmQueue 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 ; =OSi_UseAlarm ldrh r0, [r0, #0x0] bx lr .balign 4 _020CD194: .word OSi_UseAlarm arm_func_start OS_InitAlarm OS_InitAlarm: ; 0x020CD198 stmdb sp!, {lr} sub sp, sp, #0x4 ldr r1, _020CD1E8 ; =OSi_UseAlarm 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 ; =OSi_AlarmQueue 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 OSi_UseAlarm _020CD1EC: .word OSi_AlarmQueue 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 ; =OSi_UseVAlarm ldrh r0, [r2, #0x0] cmp r0, #0x0 addne sp, sp, #0x4 ldmneia sp!, {lr} bxne lr ldr r1, _020CD2F0 ; =OSi_VAlarmQueue 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 ; =OSi_VFrameCount mov r2, #0x0 ldr r0, _020CD2F8 ; =OSi_PreviousVCount str r2, [r1, #0x0] str r2, [r0, #0x0] add sp, sp, #0x4 ldmia sp!, {lr} bx lr .balign 4 _020CD2EC: .word OSi_UseVAlarm _020CD2F0: .word OSi_VAlarmQueue _020CD2F4: .word OSi_VFrameCount _020CD2F8: .word OSi_PreviousVCount 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 SVC_WaitByLoop 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: ; OSi_CommonCallback 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 ; =OSi_IsResetOccurred 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 OSi_IsResetOccurred 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 OSi_IsInitReset _020CD50C: .word OSi_CommonCallback 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 ; =OSi_vramExclusive ldr r1, _020CD644 ; =0x000001FF ldr r2, [r4, #0x0] mov r8, r0 and r0, r5, r2 and r9, r0, r1 ldr r6, _020CD648 ; =OSi_vramLockId 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 OSi_vramExclusive _020CD644: .word 0x000001FF _020CD648: .word OSi_vramLockId 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 ; =OSi_vramExclusive mov r7, r0 ldr r0, [r1, #0x0] and r5, r6, r0 ldr sb, _020CD718 ; =OSi_vramLockId 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 ; =OSi_vramLockId ldr sb, _020CD714 ; =OSi_vramExclusive 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 OSi_vramExclusive _020CD718: .word OSi_vramLockId _020CD71C: .word 0x000001FF arm_func_start OSi_InitVramExclusive OSi_InitVramExclusive: ; 0x020CD720 ldr r0, _020CD74C ; =OSi_vramExclusive mov r3, #0x0 str r3, [r0, #0x0] ldr r0, _020CD750 ; =OSi_vramLockId 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 OSi_vramExclusive _020CD750: .word OSi_vramLockId 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 ; =OSi_TickCounter 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 OSi_TickCounter _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