diff options
-rw-r--r-- | arm7/arm7.lsf | 6 | ||||
-rw-r--r-- | arm7/asm/OS_interrupt.s | 155 | ||||
-rw-r--r-- | arm7/asm/OS_irqHandler.s | 111 | ||||
-rw-r--r-- | arm7/asm/OS_irqTable.s | 132 | ||||
-rw-r--r-- | arm7/asm/OS_spinLock.s | 272 | ||||
-rw-r--r-- | arm7/asm/OS_thread.s | 767 | ||||
-rw-r--r-- | arm7/asm/dtcm.s | 1803 | ||||
-rw-r--r-- | arm7/asm/main.s | 391 | ||||
-rw-r--r-- | arm7/global.inc | 33 |
9 files changed, 1867 insertions, 1803 deletions
diff --git a/arm7/arm7.lsf b/arm7/arm7.lsf index 9ab7cc9a..0f1a6724 100644 --- a/arm7/arm7.lsf +++ b/arm7/arm7.lsf @@ -14,6 +14,12 @@ Autoload MAIN Autoload WRAM { Address 0x037F8000 + Object main.o + Object OS_irqHandler.o + Object OS_irqTable.o + Object OS_interrupt.o + Object OS_spinLock.o + Object OS_thread.o Object dtcm.o Object libsyscall.o Object dtcm2.o diff --git a/arm7/asm/OS_interrupt.s b/arm7/asm/OS_interrupt.s new file mode 100644 index 00000000..48fc9d1b --- /dev/null +++ b/arm7/asm/OS_interrupt.s @@ -0,0 +1,155 @@ + .include "asm/macros.inc" + .include "global.inc" + + .text + + arm_func_start OS_ResetRequestIrqMask +OS_ResetRequestIrqMask: ; 0x037F8824 + ldr ip, _037F8850 ; =0x04000208 + ldrh r3, [ip] + mov r1, #0 + strh r1, [ip] + ldr r2, _037F8854 ; =0x04000214 + ldr r1, [r2] + str r0, [r2] + ldrh r0, [ip] + strh r3, [ip] + mov r0, r1 + bx lr +_037F8850: .word 0x04000208 +_037F8854: .word 0x04000214 + + arm_func_start OS_DisableIrqMask +OS_DisableIrqMask: ; 0x037F8858 + ldr ip, _037F888C ; =0x04000208 + ldrh r3, [ip] + mov r1, #0 + strh r1, [ip] + ldr r2, _037F8890 ; =0x04000210 + ldr r1, [r2] + mvn r0, r0 + and r0, r1, r0 + str r0, [r2] + ldrh r0, [ip] + strh r3, [ip] + mov r0, r1 + bx lr +_037F888C: .word 0x04000208 +_037F8890: .word 0x04000210 + + arm_func_start OS_EnableIrqMask +OS_EnableIrqMask: ; 0x037F8894 + ldr ip, _037F88C4 ; =0x04000208 + ldrh r3, [ip] + mov r1, #0 + strh r1, [ip] + ldr r2, _037F88C8 ; =0x04000210 + ldr r1, [r2] + orr r0, r1, r0 + str r0, [r2] + ldrh r0, [ip] + strh r3, [ip] + mov r0, r1 + bx lr +_037F88C4: .word 0x04000208 +_037F88C8: .word 0x04000210 + + arm_func_start OS_SetIrqMask +OS_SetIrqMask: ; 0x037F88CC + ldr ip, _037F88F8 ; =0x04000208 + ldrh r3, [ip] + mov r1, #0 + strh r1, [ip] + ldr r2, _037F88FC ; =0x04000210 + ldr r1, [r2] + str r0, [r2] + ldrh r0, [ip] + strh r3, [ip] + mov r0, r1 + bx lr +_037F88F8: .word 0x04000208 +_037F88FC: .word 0x04000210 + + arm_func_start OSi_EnterTimerCallback +OSi_EnterTimerCallback: ; 0x037F8900 + stmdb sp!, {r4, lr} + mov r3, #12 + mul r4, r0, r3 + ldr r3, _037F8940 ; =_03807744 + str r1, [r3, r4] + ldr r1, _037F8944 ; =_0380774C + str r2, [r1, r4] + mov r1, #1 + add r0, r0, #3 + mov r0, r1, lsl r0 + bl OS_EnableIrqMask + mov r1, #1 + ldr r0, _037F8948 ; =_03807748 + str r1, [r0, r4] + ldmia sp!, {r4, lr} + bx lr +_037F8940: .word _03807744 +_037F8944: .word _0380774C +_037F8948: .word _03807748 + + arm_func_start OS_SetIrqFunction +OS_SetIrqFunction: ; 0x037F894C + stmdb sp!, {r4, r5, r6, r7, r8, r9, lr} + sub sp, sp, #4 + mov r9, #0 + mov r7, r9 + ldr lr, _037F89E8 ; =OS_IRQTable + ldr r4, _037F89EC ; =_03807774 + ldr r6, _037F89F0 ; =OSi_IrqCallbackInfo + mov ip, r9 + mov r3, #1 + mov r2, #12 +_037F8974: + ands r5, r0, #1 + beq _037F89CC + mov r8, r7 + cmp r9, #8 + blt _037F8998 + cmp r9, #11 + suble r5, r9, #8 + mlale r8, r5, r2, r6 + ble _037F89BC +_037F8998: + cmp r9, #3 + blt _037F89B0 + cmp r9, #6 + addle r5, r9, #1 + mlale r8, r5, r2, r6 + ble _037F89BC +_037F89B0: + cmp r9, #0 + moveq r8, r4 + strne r1, [lr, r9, lsl #2] +_037F89BC: + cmp r8, #0 + strne r1, [r8] + strne ip, [r8, #8] + strne r3, [r8, #4] +_037F89CC: + mov r0, r0, lsr #1 + add r9, r9, #1 + cmp r9, #25 + blt _037F8974 + add sp, sp, #4 + ldmia sp!, {r4, r5, r6, r7, r8, r9, lr} + bx lr +_037F89E8: .word OS_IRQTable +_037F89EC: .word _03807774 +_037F89F0: .word OSi_IrqCallbackInfo + + arm_func_start OS_InitIrqTable +OS_InitIrqTable: ; 0x037F89F4 + mov r1, #0 + ldr r0, _037F8A10 ; =OSi_IrqThreadQueue + str r1, [r0, #4] + str r1, [r0] + ldr r0, _037F8A14 ; =0x027FFC3C + str r1, [r0] + bx lr +_037F8A10: .word OSi_IrqThreadQueue +_037F8A14: .word 0x027FFC3C diff --git a/arm7/asm/OS_irqHandler.s b/arm7/asm/OS_irqHandler.s new file mode 100644 index 00000000..ed96fdae --- /dev/null +++ b/arm7/asm/OS_irqHandler.s @@ -0,0 +1,111 @@ + .include "asm/macros.inc" + .include "global.inc" + + .text + + arm_func_start OS_IrqHandler +OS_IrqHandler: ; 0x037F853C + stmfd sp!, {lr} + mov ip, #67108864 ; 0x4000000 + add ip, ip, #528 ; 0x210 + ldr r1, [ip, #-8] + cmp r1, #0 + ldmeqfd sp!, {pc} + ldmia ip, {r1, r2} + ands r1, r1, r2 + ldmeqfd sp!, {pc} + mov r3, #1 + mov r0, #0 +_037F8568: + ands r2, r1, r3, lsl r0 + addeq r0, r0, #1 + beq _037F8568 + str r2, [ip, #4] + ldr r1, _037F8588 ; =OS_IRQTable + ldr r0, [r1, r0, lsl #2] + ldr lr, _037F858C ; =OS_IrqHandler_ThreadSwitch + bx r0 +_037F8588: .word OS_IRQTable +_037F858C: .word OS_IrqHandler_ThreadSwitch + + arm_func_start OS_IrqHandler_ThreadSwitch +OS_IrqHandler_ThreadSwitch: + ldr ip, _037F86AC ; =OSi_IrqThreadQueue + mov r3, #0 + ldr ip, [ip] + mov r2, #1 + cmp ip, #0 + beq _037F85E0 +_037F85A8: + str r2, [ip, #72] ; 0x48 + str r3, [ip, #92] ; 0x5c + str r3, [ip, #96] ; 0x60 + ldr r0, [ip, #100] ; 0x64 + str r3, [ip, #100] ; 0x64 + mov ip, r0 + cmp ip, #0 + bne _037F85A8 + ldr ip, _037F86AC ; =OSi_IrqThreadQueue + str r3, [ip] + str r3, [ip, #4] + ldr ip, _037F86B0 ; =OSi_ThreadInfo + mov r1, #1 + strh r1, [ip] +_037F85E0: + ldr ip, _037F86B0 ; =OSi_ThreadInfo + ldrh r1, [ip] + cmp r1, #0 + ldreq pc, [sp], #4 ; (ldreq pc, [sp], #4) + mov r1, #0 + strh r1, [ip] + mov r3, #210 ; 0xd2 + msr CPSR_c, r3 + add r2, ip, #8 + ldr r1, [r2] +_037F8608: + cmp r1, #0 + ldrneh r0, [r1, #72] ; 0x48 + cmpne r0, #1 + ldrne r1, [r1, #76] ; 0x4c + bne _037F8608 + cmp r1, #0 + bne _037F8630 +_037F8624: + mov r3, #146 ; 0x92 + msr CPSR_c, r3 + ldr pc, [sp], #4 +_037F8630: + ldr r0, [ip, #4] + cmp r1, r0 + beq _037F8624 + ldr r3, [ip, #12] + cmp r3, #0 + beq _037F8658 + stmdb sp!, {r0, r1, ip} + mov lr, pc + bx r3 + ldmia sp!, {r0, r1, ip} +_037F8658: + str r1, [ip, #4] + mrs r2, SPSR + str r2, [r0, #0]! + ldmib sp!, {r2, r3} + stmib r0!, {r2, r3} + ldmib sp!, {r2, r3, ip, lr} + stmib r0!, {r2, r3, r4, r5, r6, r7, r8, r9, sl, fp, ip, sp, lr}^ + stmib r0!, {lr} + mov r3, #211 ; 0xd3 + msr CPSR_c, r3 + stmib r0!, {sp} + ldr sp, [r1, #68] ; 0x44 + mov r3, #210 ; 0xd2 + msr CPSR_c, r3 + ldr r2, [r1, #0]! + msr SPSR_fc, r2 + ldr lr, [r1, #64] ; 0x40 + ldmib r1!, {r0, r1, r2, r3, r4, r5, r6, r7, r8, r9, sl, fp, ip, sp, lr}^ + nop ; (mov r0, r0) + stmda sp!, {r0, r1, r2, r3, ip, lr} + ldmia sp!, {pc} +_037F86AC: .word OSi_IrqThreadQueue +_037F86B0: .word OSi_ThreadInfo diff --git a/arm7/asm/OS_irqTable.s b/arm7/asm/OS_irqTable.s new file mode 100644 index 00000000..56eea302 --- /dev/null +++ b/arm7/asm/OS_irqTable.s @@ -0,0 +1,132 @@ + .include "asm/macros.inc" + .include "global.inc" + + .text + + arm_func_start OSi_IrqVBlank +OSi_IrqVBlank: ; 0x037F86B4 + stmfd sp!, {lr} + sub sp, sp, #4 + ldr r0, _037F8700 ; =OSi_IrqCallbackInfo + ldr r2, [r0, #96] ; 0x60 + ldr r1, _037F8704 ; =0x027FFC3C + ldr r0, [r1] + add r0, r0, #1 + str r0, [r1] + cmp r2, #0 + beq _037F86E4 + mov lr, pc + bx r2 +_037F86E4: + ldr r1, _037F8708 ; =0x0380FFF8 + ldr r0, [r1] + orr r0, r0, #1 + str r0, [r1] + add sp, sp, #4 + ldmia sp!, {lr} + bx lr +_037F8700: .word OSi_IrqCallbackInfo +_037F8704: .word 0x027FFC3C +_037F8708: .word 0x0380FFF8 + + arm_func_start OSi_IrqTimer3 +OSi_IrqTimer3: ; 0x037F870C + mov r0, #7 + ldr ip, _037F8718 ; =OSi_IrqCallback + bx ip +_037F8718: .word OSi_IrqCallback + + arm_func_start OSi_IrqTimer2 +OSi_IrqTimer2: ; 0x037F871C + mov r0, #6 + ldr ip, _037F8728 ; =OSi_IrqCallback + bx ip +_037F8728: .word OSi_IrqCallback + + arm_func_start OSi_IrqTimer1 +OSi_IrqTimer1: ; 0x037F872C + mov r0, #5 + ldr ip, _037F8738 ; =OSi_IrqCallback + bx ip +_037F8738: .word OSi_IrqCallback + + arm_func_start OSi_IrqTimer0 +OSi_IrqTimer0: ; 0x037F873C + mov r0, #4 + ldr ip, _037F8748 ; =OSi_IrqCallback + bx ip +_037F8748: .word OSi_IrqCallback + + arm_func_start OSi_IrqDma3 +OSi_IrqDma3: ; 0x037F874C + mov r0, #3 + ldr ip, _037F8758 ; =OSi_IrqCallback + bx ip +_037F8758: .word OSi_IrqCallback + + arm_func_start OSi_IrqDma2 +OSi_IrqDma2: ; 0x037F875C + mov r0, #2 + ldr ip, _037F8768 ; =OSi_IrqCallback + bx ip +_037F8768: .word OSi_IrqCallback + + arm_func_start OSi_IrqDma1 +OSi_IrqDma1: ; 0x037F876C + mov r0, #1 + ldr ip, _037F8778 ; =OSi_IrqCallback + bx ip +_037F8778: .word OSi_IrqCallback + + arm_func_start OSi_IrqDma0 +OSi_IrqDma0: ; 0x037F877C + mov r0, #0 + ldr ip, _037F8788 ; =OSi_IrqCallback + bx ip +_037F8788: .word OSi_IrqCallback + + arm_func_start OSi_IrqCallback +OSi_IrqCallback: ; 0x037F878C + stmdb sp!, {r4, r5, lr} + sub sp, sp, #4 + mov r3, #1 + mov r2, r0, lsl #1 + ldr r1, _037F880C ; =_038075E4 + ldrh r1, [r1, r2] + mov r5, r3, lsl r1 + mov r1, #12 + mul r4, r0, r1 + ldr r2, _037F8810 ; =OSi_IrqCallbackInfo + ldr r1, [r2, r4] + mov r0, #0 + str r0, [r2, r4] + cmp r1, #0 + beq _037F87D8 + ldr r0, _037F8814 ; =_0380771C + ldr r0, [r0, r4] + mov lr, pc + bx r1 +_037F87D8: + ldr r1, _037F8818 ; =0x0380FFF8 + ldr r0, [r1] + orr r0, r0, r5 + str r0, [r1] + ldr r0, _037F881C ; =_03807718 + ldr r0, [r0, r4] + cmp r0, #0 + bne _037F8800 + mov r0, r5 + bl OS_DisableIrqMask +_037F8800: + add sp, sp, #4 + ldmia sp!, {r4, r5, lr} + bx lr +_037F880C: .word _038075E4 +_037F8810: .word OSi_IrqCallbackInfo +_037F8814: .word _0380771C +_037F8818: .word 0x0380FFF8 +_037F881C: .word _03807718 + + arm_func_start OS_IrqDummy +OS_IrqDummy: ; 0x037F8820 + bx lr diff --git a/arm7/asm/OS_spinLock.s b/arm7/asm/OS_spinLock.s new file mode 100644 index 00000000..04f4683b --- /dev/null +++ b/arm7/asm/OS_spinLock.s @@ -0,0 +1,272 @@ + .include "asm/macros.inc" + .include "global.inc" + + .text + + arm_func_start OS_UnLockCartridge +OS_UnLockCartridge: ; 0x037F8A18 + ldr r1, _037F8A20 ; =OS_UnlockCartridge + bx r1 +_037F8A20: .word OS_UnlockCartridge + + arm_func_start OS_GetLockID +OS_GetLockID: ; 0x037F8A24 + ldr r3, _037F8AB4 ; =0x027FFFB8 + ldr r1, [r3] + mov r2, #0 + mov r0, #-2147483648 ; 0x80000000 +_037F8A34: + tst r1, r0 + bne _037F8A50 + add r2, r2, #1 + cmp r2, #32 + beq _037F8A50 + mov r0, r0, lsr #1 + b _037F8A34 +_037F8A50: + cmp r2, #32 + movne r0, #128 ; 0x80 + bne _037F8A98 + add r3, r3, #4 + ldr r1, [r3] + mov r2, #0 + mov r0, #-2147483648 ; 0x80000000 +_037F8A6C: + tst r1, r0 + bne _037F8A88 + add r2, r2, #1 + cmp r2, #32 + beq _037F8A88 + mov r0, r0, lsr #1 + b _037F8A6C +_037F8A88: + cmp r2, #32 + ldr r0, _037F8AB8 ; =0xFFFFFFFD + bxeq lr + mov r0, #160 ; 0xa0 +_037F8A98: + add r0, r0, r2 + mov r1, #-2147483648 ; 0x80000000 + mov r1, r1, lsr r2 + ldr r2, [r3] + bic r2, r2, r1 + str r2, [r3] + bx lr +_037F8AB4: .word 0x027FFFB8 +_037F8AB8: .word 0xFFFFFFFD + + arm_func_start OS_ReleaseLockID +OS_ReleaseLockID: ; 0x037F8ABC + ldr r3, _037F8AE8 ; =0x027FFFB8 + cmp r0, #160 ; 0xa0 + addpl r3, r3, #4 + subpl r0, r0, #160 ; 0xa0 + submi r0, r0, #128 ; 0x80 + mov r1, #-2147483648 ; 0x80000000 + mov r1, r1, lsr r0 + ldr r2, [r3] + orr r2, r2, r1 + str r2, [r3] + bx lr +_037F8AE8: .word 0x027FFFB8 + + arm_func_start OS_ReadOwnerOfLockWord +OS_ReadOwnerOfLockWord: ; 0x037F8AEC + ldrh r0, [r0, #4] + bx lr + + arm_func_start OSi_FreeCartridgeBus +OSi_FreeCartridgeBus: ;0x037F8AF4 + bx lr + + arm_func_start OSi_AllocateCartridgeBus +OSi_AllocateCartridgeBus: ;0x037F8AF8 + bx lr + + arm_func_start OS_TryLockCartridge +OS_TryLockCartridge: ; 0x037F8AFC + ldr r1, _037F8B10 ; =0x027FFFE8 + ldr r2, _037F8B14 ; =OSi_AllocateCartridgeBus + mov r3, #1 + ldr ip, _037F8B18 ; =OSi_DoTryLockByWord + bx ip +_037F8B10: .word 0x027FFFE8 +_037F8B14: .word OSi_AllocateCartridgeBus +_037F8B18: .word OSi_DoTryLockByWord + + arm_func_start OS_UnlockCartridge +OS_UnlockCartridge: ; 0x037F8B1C + ldr r1, _037F8B30 ; =0x027FFFE8 + ldr r2, _037F8B34 ; =OSi_FreeCartridgeBus + mov r3, #1 + ldr ip, _037F8B38 ; =OSi_DoUnlockByWord + bx ip +_037F8B30: .word 0x027FFFE8 +_037F8B34: .word OSi_FreeCartridgeBus +_037F8B38: .word OSi_DoUnlockByWord + + arm_func_start OS_LockCartridge +OS_LockCartridge: ; 0x037F8B3C + ldr r1, _037F8B50 ; =0x027FFFE8 + ldr r2, _037F8B54 ; =OSi_AllocateCartridgeBus + mov r3, #1 + ldr ip, _037F8B58 ; =OSi_DoLockByWord + bx ip +_037F8B50: .word 0x027FFFE8 +_037F8B54: .word OSi_AllocateCartridgeBus +_037F8B58: .word OSi_DoLockByWord + + arm_func_start OSi_DoTryLockByWord +OSi_DoTryLockByWord: ; 0x037F8B5C + stmdb sp!, {r4, r5, r6, r7, r8, r9, lr} + sub sp, sp, #4 + mov r9, r0 + mov r8, r1 + mov r7, r2 + movs r6, r3 + beq _037F8B84 + bl OS_DisableInterrupts_IrqAndFiq + mov r5, r0 + b _037F8B8C +_037F8B84: + bl OS_DisableInterrupts + mov r5, r0 +_037F8B8C: + mov r0, r9 + mov r1, r8 + bl MI_SwapWord + movs r4, r0 + bne _037F8BB4 + cmp r7, #0 + beq _037F8BB0 + mov lr, pc + bx r7 +_037F8BB0: + strh r9, [r8, #4] +_037F8BB4: + cmp r6, #0 + beq _037F8BC8 + mov r0, r5 + bl OS_RestoreInterrupts_IrqAndFiq + b _037F8BD0 +_037F8BC8: + mov r0, r5 + bl OS_RestoreInterrupts +_037F8BD0: + mov r0, r4 + add sp, sp, #4 + ldmia sp!, {r4, r5, r6, r7, r8, r9, lr} + bx lr + + arm_func_start OSi_DoUnlockByWord +OSi_DoUnlockByWord: ; 0x037F8BE0 + stmdb sp!, {r4, r5, r6, r7, lr} + sub sp, sp, #4 + mov r7, r1 + mov r6, r2 + mov r5, r3 + ldrh r1, [r7, #4] + cmp r0, r1 + mvnne r0, #1 + bne _037F8C60 + cmp r5, #0 + beq _037F8C18 + bl OS_DisableInterrupts_IrqAndFiq + mov r4, r0 + b _037F8C20 +_037F8C18: + bl OS_DisableInterrupts + mov r4, r0 +_037F8C20: + mov r0, #0 + strh r0, [r7, #4] + cmp r6, #0 + beq _037F8C38 + mov lr, pc + bx r6 +_037F8C38: + mov r0, #0 + str r0, [r7] + cmp r5, #0 + beq _037F8C54 + mov r0, r4 + bl OS_RestoreInterrupts_IrqAndFiq + b _037F8C5C +_037F8C54: + mov r0, r4 + bl OS_RestoreInterrupts +_037F8C5C: + mov r0, #0 +_037F8C60: + add sp, sp, #4 + ldmia sp!, {r4, r5, r6, r7, lr} + bx lr + + arm_func_start OSi_DoLockByWord +OSi_DoLockByWord: ; 0x037F8C6C + stmdb sp!, {r4, r5, r6, r7, r8, lr} + mov r8, r0 + mov r7, r1 + mov r6, r2 + mov r5, r3 + mov r4, #1024 ; 0x400 + b _037F8C90 +_037F8C88: + mov r0, r4 + bl FUN_037F8CB4 +_037F8C90: + mov r0, r8 + mov r1, r7 + mov r2, r6 + mov r3, r5 + bl OSi_DoTryLockByWord + cmp r0, #0 + bgt _037F8C88 + ldmia sp!, {r4, r5, r6, r7, r8, lr} + bx lr + + arm_func_start FUN_037F8CB4 +FUN_037F8CB4: ; 0x037F8CB4 ;part of the above func? + ldr ip, _037F8CBC ; =SVC_WaitByLoop + bx ip +_037F8CBC: .word SVC_WaitByLoop + + arm_func_start OS_InitLock +OS_InitLock: ; 0x037F8CC0 + stmdb sp!, {r4, r5, lr} + sub sp, sp, #4 + ldr r0, _037F8D38 ; =_03807780 + ldr r1, [r0] + cmp r1, #0 + bne _037F8D2C + mov r1, #1 + str r1, [r0] + mov r0, #0 + ldr r4, _037F8D3C ; =0x027FFFF0 + strh r0, [r4, #6] + mov r5, #1024 ; 0x400 + b _037F8CFC +_037F8CF4: + mov r0, r5 + bl FUN_037F8CB4 +_037F8CFC: + ldrh r0, [r4, #4] + cmp r0, #127 ; 0x7f + bne _037F8CF4 + mvn r1, #0 + ldr r0, _037F8D40 ; =0x027FFFB8 + str r1, [r0] + mov r0, #65536 ; 0x10000 + rsb r1, r0, #0 + ldr r0, _037F8D44 ; =0x027FFFBC + str r1, [r0] + mov r0, #191 ; 0xbf + strh r0, [r4, #6] +_037F8D2C: + add sp, sp, #4 + ldmia sp!, {r4, r5, lr} + bx lr +_037F8D38: .word _03807780 +_037F8D3C: .word 0x027FFFF0 +_037F8D40: .word 0x027FFFB8 +_037F8D44: .word 0x027FFFBC diff --git a/arm7/asm/OS_thread.s b/arm7/asm/OS_thread.s new file mode 100644 index 00000000..832e6606 --- /dev/null +++ b/arm7/asm/OS_thread.s @@ -0,0 +1,767 @@ + .include "asm/macros.inc" + .include "global.inc" + + .text + + arm_func_start OS_SetThreadDestructor +OS_SetThreadDestructor: ; 0x037F8D48 + str r1, [r0, #152] ; 0x98 + bx lr + + arm_func_start OS_EnableScheduler +OS_EnableScheduler: ; 0x037F8D50 + stmdb sp!, {r4, lr} + bl OS_DisableInterrupts + mov r4, #0 + ldr r1, _037F8D84 ; =OSi_RescheduleCount + ldr r3, [r1] + cmp r3, #0 + subne r2, r3, #1 + strne r2, [r1] + movne r4, r3 + bl OS_RestoreInterrupts + mov r0, r4 + ldmia sp!, {r4, lr} + bx lr +_037F8D84: .word OSi_RescheduleCount + + arm_func_start OS_DisableScheduler +OS_DisableScheduler: ; 0x037F8D88 + stmdb sp!, {r4, lr} + bl OS_DisableInterrupts + ldr r2, _037F8DBC ; =OSi_RescheduleCount + ldr r3, [r2] + mvn r1, #0 + cmp r3, r1 + addcc r1, r3, #1 + strcc r1, [r2] + movcc r4, r3 + bl OS_RestoreInterrupts + mov r0, r4 + ldmia sp!, {r4, lr} + bx lr +_037F8DBC: .word OSi_RescheduleCount + + arm_func_start OS_SetSwitchThreadCallback +OS_SetSwitchThreadCallback: ; 0x037F8DC0 + stmdb sp!, {r4, r5, lr} + sub sp, sp, #4 + mov r5, r0 + bl OS_DisableInterrupts + ldr r1, _037F8DF0 ; =OSi_ThreadInfo + ldr r4, [r1, #12] + str r5, [r1, #12] + bl OS_RestoreInterrupts + mov r0, r4 + add sp, sp, #4 + ldmia sp!, {r4, r5, lr} + bx lr +_037F8DF0: .word OSi_ThreadInfo +_037F8DF4: + ldr r2, [r0] + mov r1, #0 + str r1, [r0] + str r1, [r2, #148] ; 0x94 + mov r0, r2 + ldr ip, _037F8E10 ; =OS_WakeupThreadDirect + bx ip +_037F8E10: .word OS_WakeupThreadDirect + + arm_func_start OS_Sleep +OS_Sleep: ; 0x037F8E14 + stmdb sp!, {r4, r5, lr} + sub sp, sp, #52 ; 0x34 + mov r5, r0 + add r0, sp, #8 + bl OS_CreateAlarm + ldr r0, _037F8EAC ; =OSi_CurrentThreadPtr + ldr r0, [r0] + ldr r0, [r0] + str r0, [sp, #4] + bl OS_DisableInterrupts + mov r4, r0 + add r0, sp, #8 + ldr r1, [sp, #4] + str r0, [r1, #148] ; 0x94 + add r1, sp, #4 + str r1, [sp] + mov r2, #0 + ldr r1, _037F8EB0 ; =0x000082EA + umull ip, r3, r5, r1 + mla r3, r5, r2, r3 + mla r3, r2, r1, r3 + mov r2, r3, lsr #6 + mov r1, ip, lsr #6 + orr r1, r1, r3, lsl #26 + ldr r3, _037F8EB4 ; =_037F8DF4 + bl OS_SetAlarm + mov r5, #0 + b _037F8E8C +_037F8E84: + mov r0, r5 + bl OS_SleepThread +_037F8E8C: + ldr r0, [sp, #4] + cmp r0, #0 + bne _037F8E84 + mov r0, r4 + bl OS_RestoreInterrupts + add sp, sp, #52 ; 0x34 + ldmia sp!, {r4, r5, lr} + bx lr +_037F8EAC: .word OSi_CurrentThreadPtr +_037F8EB0: .word 0x000082EA +_037F8EB4: .word _037F8DF4 + + arm_func_start OS_SetThreadPriority +OS_SetThreadPriority: ; 0x037F8EB8 + stmdb sp!, {r4, r5, r6, r7, r8, lr} + mov r6, r0 + mov r5, r1 + ldr r0, _037F8F60 ; =OSi_ThreadInfo + ldr r8, [r0, #8] + mov r7, #0 + bl OS_DisableInterrupts + mov r4, r0 + b _037F8EE4 +_037F8EDC: + mov r7, r8 + ldr r8, [r8, #76] ; 0x4c +_037F8EE4: + cmp r8, #0 + beq _037F8EF4 + cmp r8, r6 + bne _037F8EDC +_037F8EF4: + cmp r8, #0 + beq _037F8F08 + ldr r0, _037F8F64 ; =OSi_IdleThread + cmp r8, r0 + bne _037F8F18 +_037F8F08: + mov r0, r4 + bl OS_RestoreInterrupts + mov r0, #0 + b _037F8F58 +_037F8F18: + ldr r0, [r8, #84] ; 0x54 + cmp r0, r5 + beq _037F8F4C + cmp r7, #0 + ldreq r1, [r6, #76] ; 0x4c + ldreq r0, _037F8F60 ; =OSi_ThreadInfo + streq r1, [r0, #8] + ldrne r0, [r6, #76] ; 0x4c + strne r0, [r7, #76] ; 0x4c + str r5, [r6, #84] ; 0x54 + mov r0, r6 + bl OSi_InsertThreadToList + bl OSi_RescheduleThread +_037F8F4C: + mov r0, r4 + bl OS_RestoreInterrupts + mov r0, #1 +_037F8F58: + ldmia sp!, {r4, r5, r6, r7, r8, lr} + bx lr +_037F8F60: .word OSi_ThreadInfo +_037F8F64: .word OSi_IdleThread + + arm_func_start OS_RescheduleThread +OS_RescheduleThread: ; 0x037F8F68 + 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: ; 0x037F8F88 + ldr r0, _037F8FB0 ; =OSi_ThreadInfo + ldr r0, [r0, #8] + b _037F8F98 +_037F8F94: + ldr r0, [r0, #76] ; 0x4c +_037F8F98: + cmp r0, #0 + bxeq lr + ldr r1, [r0, #72] ; 0x48 + cmp r1, #1 + bne _037F8F94 + bx lr +_037F8FB0: .word OSi_ThreadInfo + + arm_func_start OS_WakeupThreadDirect +OS_WakeupThreadDirect: ; 0x037F8FB4 + stmdb sp!, {r4, r5, lr} + sub sp, sp, #4 + mov r5, r0 + bl OS_DisableInterrupts + mov r4, r0 + mov r0, #1 + str r0, [r5, #72] ; 0x48 + bl OSi_RescheduleThread + mov r0, r4 + bl OS_RestoreInterrupts + add sp, sp, #4 + ldmia sp!, {r4, r5, lr} + bx lr + + arm_func_start OS_WakeupThread +OS_WakeupThread: ; 0x037F8FE8 + stmdb sp!, {r4, r5, r6, r7, lr} + sub sp, sp, #4 + mov r5, r0 + bl OS_DisableInterrupts + mov r4, r0 + ldr r0, [r5] + cmp r0, #0 + beq _037F9050 + mov r7, #1 + mov r6, #0 + b _037F9030 +_037F9014: + mov r0, r5 + bl OSi_RemoveLinkFromQueue + str r7, [r0, #72] ; 0x48 + str r6, [r0, #92] ; 0x5c + str r6, [r0, #100] ; 0x64 + ldr r1, [r0, #100] ; 0x64 + str r1, [r0, #96] ; 0x60 +_037F9030: + ldr r0, [r5] + cmp r0, #0 + bne _037F9014 + mov r0, #0 + str r0, [r5, #4] + ldr r0, [r5, #4] + str r0, [r5] + bl OSi_RescheduleThread +_037F9050: + mov r0, r4 + bl OS_RestoreInterrupts + add sp, sp, #4 + ldmia sp!, {r4, r5, r6, r7, lr} + bx lr + + arm_func_start OS_SleepThread +OS_SleepThread: ; 0x037F9064 + stmdb sp!, {r4, r5, r6, lr} + mov r6, r0 + bl OS_DisableInterrupts + mov r5, r0 + ldr r0, _037F90B4 ; =OSi_CurrentThreadPtr + ldr r0, [r0] + ldr r4, [r0] + cmp r6, #0 + beq _037F9098 + str r6, [r4, #92] ; 0x5c + mov r0, r6 + mov r1, r4 + bl OSi_InsertLinkToQueue +_037F9098: + mov r0, #0 + str r0, [r4, #72] ; 0x48 + bl OSi_RescheduleThread + mov r0, r5 + bl OS_RestoreInterrupts + ldmia sp!, {r4, r5, r6, lr} + bx lr +_037F90B4: .word OSi_CurrentThreadPtr + + arm_func_start OS_IsThreadTerminated +OS_IsThreadTerminated: ; 0x037F90B8 + ldr r0, [r0, #72] ; 0x48 + cmp r0, #2 + moveq r0, #1 + movne r0, #0 + bx lr + + arm_func_start OS_JoinThread +OS_JoinThread: ; 0x037F90CC + stmdb sp!, {r4, r5, lr} + sub sp, sp, #4 + mov r5, r0 + bl OS_DisableInterrupts + mov r4, r0 + ldr r0, [r5, #72] ; 0x48 + cmp r0, #2 + beq _037F90F4 + add r0, r5, #128 ; 0x80 + bl OS_SleepThread +_037F90F4: + mov r0, r4 + bl OS_RestoreInterrupts + add sp, sp, #4 + ldmia sp!, {r4, r5, lr} + bx lr + + arm_func_start OSi_ExitThread_Destroy +OSi_ExitThread_Destroy: ; 0x037F9108 + stmdb sp!, {r4, lr} + ldr r0, _037F9164 ; =OSi_CurrentThreadPtr + ldr r0, [r0] + ldr r4, [r0] + bl OS_DisableScheduler + mov r0, r4 + bl OSi_UnlockAllMutex + ldr r0, [r4, #92] ; 0x5c + cmp r0, #0 + beq _037F9138 + mov r1, r4 + bl OSi_RemoveSpecifiedLinkFromQueue +_037F9138: + mov r0, r4 + bl OSi_RemoveThreadFromList + mov r0, #2 + str r0, [r4, #72] ; 0x48 + add r0, r4, #128 ; 0x80 + bl OS_WakeupThread + bl OS_EnableScheduler + bl OS_RescheduleThread + bl FUN_037FB1F0 + ldmia sp!, {r4, lr} + bx lr +_037F9164: .word OSi_CurrentThreadPtr + + arm_func_start OSi_ExitThread +OSi_ExitThread: ; 0x037F9168 + stmfd sp!, {lr} + sub sp, sp, #4 + ldr r1, _037F91AC ; =OSi_CurrentThreadPtr + ldr r1, [r1] + ldr r3, [r1] + ldr r2, [r3, #152] ; 0x98 + cmp r2, #0 + beq _037F919C + mov r1, #0 + str r1, [r3, #152] ; 0x98 + mov lr, pc + bx r2 + bl OS_DisableInterrupts +_037F919C: + bl OSi_ExitThread_Destroy + add sp, sp, #4 + ldmia sp!, {lr} + bx lr +_037F91AC: .word OSi_CurrentThreadPtr + + arm_func_start OSi_ExitThread_ArgSpecified +OSi_ExitThread_ArgSpecified: ; 0x037F91B0 + stmdb sp!, {r4, r5, lr} + sub sp, sp, #4 + mov r5, r0 + mov r4, r1 + ldr r1, _037F9210 ; =OSi_StackForDestructor + ldr r2, [r1] + cmp r2, #0 + beq _037F91FC + ldr r1, _037F9214 ; =OSi_ExitThread + bl OS_InitContext + str r4, [r5, #4] + ldr r0, [r5] + orr r0, r0, #128 ; 0x80 + str r0, [r5] + mov r0, #1 + str r0, [r5, #72] ; 0x48 + mov r0, r5 + bl OS_LoadContext + b _037F9204 +_037F91FC: + mov r0, r4 + bl OSi_ExitThread +_037F9204: + add sp, sp, #4 + ldmia sp!, {r4, r5, lr} + bx lr +_037F9210: .word OSi_StackForDestructor +_037F9214: .word OSi_ExitThread + + arm_func_start OS_ExitThread +OS_ExitThread: ; 0x037F9218 + stmfd sp!, {lr} + sub sp, sp, #4 + bl OS_DisableInterrupts + ldr r0, _037F9240 ; =OSi_ThreadInfo + ldr r0, [r0, #4] + mov r1, #0 + bl OSi_ExitThread_ArgSpecified + add sp, sp, #4 + ldmia sp!, {lr} + bx lr +_037F9240: .word OSi_ThreadInfo + + arm_func_start OS_CreateThread +OS_CreateThread: ; 0x037F9244 + stmdb sp!, {r4, r5, r6, r7, r8, r9, lr} + sub sp, sp, #4 + mov r9, r0 + mov r8, r1 + mov r7, r2 + mov r6, r3 + bl OS_DisableInterrupts + mov r4, r0 + bl OSi_GetUnusedThreadId + ldr r1, [sp, #36] ; 0x24 + str r1, [r9, #84] ; 0x54 + str r0, [r9, #80] ; 0x50 + mov r0, #0 + str r0, [r9, #72] ; 0x48 + str r0, [r9, #88] ; 0x58 + mov r0, r9 + bl OSi_InsertThreadToList + str r6, [r9, #120] ; 0x78 + ldr r0, [sp, #32] + sub r5, r6, r0 + str r5, [r9, #116] ; 0x74 + mov r2, #0 + str r2, [r9, #124] ; 0x7c + ldr r1, _037F9348 ; =0xD73BFDF7 + ldr r0, [r9, #120] ; 0x78 + str r1, [r0, #-4] + ldr r1, _037F934C ; =0xFBDD37BB + ldr r0, [r9, #116] ; 0x74 + str r1, [r0] + str r2, [r9, #132] ; 0x84 + ldr r0, [r9, #132] ; 0x84 + str r0, [r9, #128] ; 0x80 + mov r0, r9 + mov r1, r8 + sub r2, r6, #4 + bl OS_InitContext + str r7, [r9, #4] + ldr r0, _037F9350 ; =OS_ExitThread + str r0, [r9, #60] ; 0x3c + mov r0, #0 + add r1, r5, #4 + ldr r2, [sp, #32] + sub r2, r2, #8 + bl MIi_CpuClear32 + mov r1, #0 + str r1, [r9, #104] ; 0x68 + str r1, [r9, #108] ; 0x6c + str r1, [r9, #112] ; 0x70 + mov r0, r9 + bl OS_SetThreadDestructor + mov r0, #0 + str r0, [r9, #92] ; 0x5c + str r0, [r9, #100] ; 0x64 + ldr r1, [r9, #100] ; 0x64 + str r1, [r9, #96] ; 0x60 + add r1, r9, #136 ; 0x88 + mov r2, #12 + bl MIi_CpuClear32 + mov r0, #0 + str r0, [r9, #148] ; 0x94 + mov r0, r4 + bl OS_RestoreInterrupts + add sp, sp, #4 + ldmia sp!, {r4, r5, r6, r7, r8, r9, lr} + bx lr +_037F9348: .word 0xD73BFDF7 +_037F934C: .word 0xFBDD37BB +_037F9350: .word OS_ExitThread + + arm_func_start OS_InitThread +OS_InitThread: ; 0x037F9354 + stmfd sp!, {lr} + sub sp, sp, #4 + ldr r0, _037F942C ; =OSi_IsThreadInitialized + ldr r1, [r0] + cmp r1, #0 + bne _037F9420 + mov r2, #1 + str r2, [r0] + ldr r1, _037F9430 ; =_038077A0 + ldr r0, _037F9434 ; =OSi_CurrentThreadPtr + str r1, [r0] + mov r0, #16 + ldr r1, _037F9438 ; =OSi_LauncherThread + str r0, [r1, #84] ; 0x54 + mov r0, #0 + str r0, [r1, #80] ; 0x50 + str r2, [r1, #72] ; 0x48 + str r0, [r1, #76] ; 0x4c + str r0, [r1, #88] ; 0x58 + ldr r0, _037F943C ; =OSi_ThreadInfo + str r1, [r0, #8] + str r1, [r0, #4] + ldr r2, _037F9440 ; =0x00000400 + cmp r2, #0 + ldrle r0, _037F9444 ; =FUN_037F8000 + suble r2, r0, r2 + ldrgt r1, _037F9448 ; =0x00000400 + ldrgt r0, _037F944C ; =0x0380FF80 + subgt r0, r0, r1 + subgt r2, r0, r2 + ldr r1, _037F9448 ; =0x00000400 + ldr r0, _037F944C ; =0x0380FF80 + sub r3, r0, r1 + ldr r1, _037F9438 ; =OSi_LauncherThread + str r3, [r1, #120] ; 0x78 + str r2, [r1, #116] ; 0x74 + mov r0, #0 + str r0, [r1, #124] ; 0x7c + ldr r2, _037F9450 ; =0xD73BFDF7 + str r2, [r3, #-4] + ldr r3, _037F9454 ; =0xFBDD37BB + ldr r2, [r1, #116] ; 0x74 + str r3, [r2] + str r0, [r1, #132] ; 0x84 + str r0, [r1, #128] ; 0x80 + ldr r1, _037F943C ; =OSi_ThreadInfo + strh r0, [r1] + strh r0, [r1, #2] + ldr r2, _037F9458 ; =0x027FFFA4 + str r1, [r2] + bl OS_SetSwitchThreadCallback +_037F9420: + add sp, sp, #4 + ldmia sp!, {lr} + bx lr +_037F942C: .word OSi_IsThreadInitialized +_037F9430: .word _038077A0 +_037F9434: .word OSi_CurrentThreadPtr +_037F9438: .word OSi_LauncherThread +_037F943C: .word OSi_ThreadInfo +_037F9440: .word 0x00000400 +_037F9444: .word FUN_037F8000 +_037F9448: .word 0x00000400 +_037F944C: .word 0x0380FF80 +_037F9450: .word 0xD73BFDF7 +_037F9454: .word 0xFBDD37BB +_037F9458: .word 0x027FFFA4 + + arm_func_start OSi_RescheduleThread +OSi_RescheduleThread: ; 0x037F945C + stmdb sp!, {r4, r5, r6, lr} + ldr r0, _037F952C ; =OSi_RescheduleCount + ldr r0, [r0] + cmp r0, #0 + bne _037F9524 + ldr r4, _037F9530 ; =OSi_ThreadInfo + ldrh r0, [r4, #2] + cmp r0, #0 + bne _037F948C + bl OS_GetProcMode + cmp r0, #18 + bne _037F9498 +_037F948C: + mov r0, #1 + strh r0, [r4] + b _037F9524 +_037F9498: + ldr r0, _037F9534 ; =OSi_CurrentThreadPtr + ldr r0, [r0] + ldr r6, [r0] + bl OS_SelectThread + mov r5, r0 + cmp r6, r5 + beq _037F9524 + cmp r5, #0 + beq _037F9524 + ldr r0, [r6, #72] ; 0x48 + cmp r0, #2 + beq _037F94D8 + mov r0, r6 + bl OS_SaveContext + cmp r0, #0 + bne _037F9524 +_037F94D8: + ldr r0, _037F9538 ; =OSi_SystemCallbackInSwitchThread + ldr r2, [r0] + cmp r2, #0 + beq _037F94F8 + mov r0, r6 + mov r1, r5 + mov lr, pc + bx r2 +_037F94F8: + ldr r2, [r4, #12] + cmp r2, #0 + beq _037F9514 + mov r0, r6 + mov r1, r5 + mov lr, pc + bx r2 +_037F9514: + ldr r0, _037F9530 ; =OSi_ThreadInfo + str r5, [r0, #4] + mov r0, r5 + bl OS_LoadContext +_037F9524: + ldmia sp!, {r4, r5, r6, lr} + bx lr +_037F952C: .word OSi_RescheduleCount +_037F9530: .word OSi_ThreadInfo +_037F9534: .word OSi_CurrentThreadPtr +_037F9538: .word OSi_SystemCallbackInSwitchThread + + arm_func_start OSi_RemoveThreadFromList +OSi_RemoveThreadFromList: ; 0x037F953C + ldr r1, _037F9580 ; =OSi_ThreadInfo + ldr r2, [r1, #8] + mov r1, #0 + b _037F9554 +_037F954C: + mov r1, r2 + ldr r2, [r2, #76] ; 0x4c +_037F9554: + cmp r2, #0 + beq _037F9564 + cmp r2, r0 + bne _037F954C +_037F9564: + cmp r1, #0 + ldreq r1, [r0, #76] ; 0x4c + ldreq r0, _037F9580 ; =OSi_ThreadInfo + streq r1, [r0, #8] + ldrne r0, [r0, #76] ; 0x4c + strne r0, [r1, #76] ; 0x4c + bx lr +_037F9580: .word OSi_ThreadInfo + + arm_func_start OSi_InsertThreadToList +OSi_InsertThreadToList: ; 0x037F9584 + stmfd sp!, {lr} + sub sp, sp, #4 + ldr r1, _037F95E8 ; =OSi_ThreadInfo + ldr r3, [r1, #8] + mov lr, r3 + mov ip, #0 + b _037F95A8 +_037F95A0: + mov ip, lr + ldr lr, [lr, #76] ; 0x4c +_037F95A8: + cmp lr, #0 + beq _037F95C0 + ldr r2, [lr, #84] ; 0x54 + ldr r1, [r0, #84] ; 0x54 + cmp r2, r1 + bcc _037F95A0 +_037F95C0: + cmp ip, #0 + streq r3, [r0, #76] ; 0x4c + ldreq r1, _037F95E8 ; =OSi_ThreadInfo + streq r0, [r1, #8] + ldrne r1, [ip, #76] ; 0x4c + strne r1, [r0, #76] ; 0x4c + strne r0, [ip, #76] ; 0x4c + add sp, sp, #4 + ldmia sp!, {lr} + bx lr +_037F95E8: .word OSi_ThreadInfo + + arm_func_start OSi_RemoveMutexLinkFromQueue +OSi_RemoveMutexLinkFromQueue: ; 0x037F95EC + ldr r2, [r0] + cmp r2, #0 + beq _037F9614 + ldr r1, [r2, #16] + str r1, [r0] + cmp r1, #0 + movne r0, #0 + strne r0, [r1, #20] + moveq r1, #0 + streq r1, [r0, #4] +_037F9614: + mov r0, r2 + bx lr + + arm_func_start OSi_RemoveSpecifiedLinkFromQueue +OSi_RemoveSpecifiedLinkFromQueue: ; 0x037F961C + stmfd sp!, {lr} + sub sp, sp, #4 + ldr r2, [r0] + mov lr, r2 + b _037F9664 +_037F9630: + ldr ip, [lr, #100] ; 0x64 + cmp lr, r1 + bne _037F9660 + ldr r3, [lr, #96] ; 0x60 + cmp r2, lr + streq ip, [r0] + strne ip, [r3, #100] ; 0x64 + ldr r1, [r0, #4] + cmp r1, lr + streq r3, [r0, #4] + strne r3, [ip, #96] ; 0x60 + b _037F966C +_037F9660: + mov lr, ip +_037F9664: + cmp lr, #0 + bne _037F9630 +_037F966C: + mov r0, lr + add sp, sp, #4 + ldmia sp!, {lr} + bx lr + + arm_func_start OSi_RemoveLinkFromQueue +OSi_RemoveLinkFromQueue: ; 0x037F967C + ldr r2, [r0] + cmp r2, #0 + beq _037F96A8 + ldr r1, [r2, #100] ; 0x64 + str r1, [r0] + cmp r1, #0 + movne r0, #0 + strne r0, [r1, #96] ; 0x60 + moveq r1, #0 + streq r1, [r0, #4] + streq r1, [r2, #92] ; 0x5c +_037F96A8: + mov r0, r2 + bx lr + + arm_func_start OSi_InsertLinkToQueue +OSi_InsertLinkToQueue: ; 0x037F96B0 + ldr ip, [r0] + b _037F96C4 +_037F96B8: + cmp ip, r1 + bxeq lr + ldr ip, [ip, #100] ; 0x64 +_037F96C4: + cmp ip, #0 + beq _037F96DC + ldr r3, [ip, #84] ; 0x54 + ldr r2, [r1, #84] ; 0x54 + cmp r3, r2 + bls _037F96B8 +_037F96DC: + cmp ip, #0 + bne _037F9708 + ldr r2, [r0, #4] + cmp r2, #0 + streq r1, [r0] + strne r1, [r2, #100] ; 0x64 + str r2, [r1, #96] ; 0x60 + mov r2, #0 + str r2, [r1, #100] ; 0x64 + str r1, [r0, #4] + bx lr +_037F9708: + ldr r2, [ip, #96] ; 0x60 + cmp r2, #0 + streq r1, [r0] + strne r1, [r2, #100] ; 0x64 + str r2, [r1, #96] ; 0x60 + str ip, [r1, #100] ; 0x64 + str r1, [ip, #96] ; 0x60 + bx lr + + arm_func_start OSi_GetUnusedThreadId +OSi_GetUnusedThreadId: ; 0x037F9728 + ldr r1, _037F973C ; =_0380778C + ldr r0, [r1] + add r0, r0, #1 + str r0, [r1] + bx lr +_037F973C: .word _0380778C diff --git a/arm7/asm/dtcm.s b/arm7/asm/dtcm.s index b639598d..0c61ac2f 100644 --- a/arm7/asm/dtcm.s +++ b/arm7/asm/dtcm.s @@ -2,1809 +2,6 @@ .include "global.inc" .section .text - arm_func_start FUN_037F8000 -FUN_037F8000: ; 0x037F8000 - stmfd sp!, {lr} - sub sp, sp, #4 - ldr r0, _037F8028 ; =PMi_Initialized - ldr r0, [r0] - cmp r0, #0 - beq _037F801C - bl PM_SelfBlinkProc -_037F801C: - add sp, sp, #4 - ldmia sp!, {lr} - bx lr -_037F8028: .word PMi_Initialized - - arm_func_start FUN_037F802C -FUN_037F802C: ; 0x037F802C - stmdb sp!, {r4, r5, r6, r7, r8, r9, sl, fp, lr} - sub sp, sp, #4 - mov sl, r0 - mov r8, #0 - bl FUN_037F81E8 - cmp r0, #0 - beq _037F80F8 - bl FUN_037F81C4 - mov r7, r0 - mov r9, r8 - mov r4, #1 - mov fp, #138 ; 0x8a - mov r5, #112 ; 0x70 -_037F8060: - add r6, sl, r9, lsl #8 - ldr r0, _037F81B4 ; =0x0000FFFF - mov r1, r6 - mov r2, r5 - bl FUN_037F81B8 - mov r2, r6 - ldrh r1, [r2, #114] ; 0x72 - cmp r0, r1 - bne _037F80E0 - ldrh r0, [r2, #112] ; 0x70 - cmp r0, #128 ; 0x80 - bcs _037F80E0 - ldr r0, _037F81B4 ; =0x0000FFFF - add r1, r6, #116 ; 0x74 - mov r2, fp - bl FUN_037F81B8 - mov r3, r6 - ldrh r1, [r3, #254] ; 0xfe - cmp r0, r1 - bne _037F80E0 - ldrh r2, [r3, #118] ; 0x76 - ldrb r0, [r3, #117] ; 0x75 - mov r1, r4, lsl r0 - ands r1, r1, r2 - beq _037F80E0 - ands r1, r7, r2 - ldrneh r1, [r6, #100] ; 0x64 - bicne r1, r1, #7 - andne r0, r0, #7 - orrne r0, r1, r0 - strneh r0, [r6, #100] ; 0x64 - orr r8, r8, r4, lsl r9 -_037F80E0: - add r0, r9, #1 - mov r0, r0, lsl #16 - mov r9, r0, lsr #16 - cmp r9, #2 - bcc _037F8060 - b _037F8158 -_037F80F8: - bl FUN_037F81C4 - cmp r0, #0 - movne r0, #3 - bne _037F81A8 - mov r7, r8 - mov r4, #1 - ldr r6, _037F81B4 ; =0x0000FFFF - mov r5, #112 ; 0x70 -_037F8118: - mov r0, r6 - add r1, sl, r7, lsl #8 - mov r2, r5 - bl FUN_037F81B8 - add r2, sl, r7, lsl #8 - ldrh r1, [r2, #114] ; 0x72 - cmp r0, r1 - bne _037F8144 - ldrh r0, [r2, #112] ; 0x70 - cmp r0, #128 ; 0x80 - orrcc r8, r8, r4, lsl r7 -_037F8144: - add r0, r7, #1 - mov r0, r0, lsl #16 - mov r7, r0, lsr #16 - cmp r7, #2 - bcc _037F8118 -_037F8158: - cmp r8, #1 - beq _037F8174 - cmp r8, #2 - beq _037F8174 - cmp r8, #3 - beq _037F817C - b _037F81A4 -_037F8174: - mov r0, r8 - b _037F81A8 -_037F817C: - ldrh r0, [sl, #112] ; 0x70 - add r0, r0, #1 - and r0, r0, #127 ; 0x7f - and r1, r0, #255 ; 0xff - add r0, sl, #256 ; 0x100 - ldrh r0, [r0, #112] ; 0x70 - cmp r1, r0 - moveq r0, #2 - movne r0, #1 - b _037F81A8 -_037F81A4: - mov r0, #0 -_037F81A8: - add sp, sp, #4 - ldmia sp!, {r4, r5, r6, r7, r8, r9, sl, fp, lr} - bx lr -_037F81B4: .word 0x0000FFFF - - arm_func_start FUN_037F81B8 -FUN_037F81B8: ; 0x037F81B8 - ldr ip, _037F81C0 ; =SVC_GetCRC16 - bx ip -_037F81C0: .word SVC_GetCRC16 - - arm_func_start FUN_037F81C4 -FUN_037F81C4: ; 0x037F81C4 - mov r0, #0 - ldr r1, _037F81E4 ; =0x027FFE1D - ldrb r1, [r1] - cmp r1, #128 ; 0x80 - orreq r0, r0, #64 ; 0x40 - moveq r0, r0, lsl #16 - moveq r0, r0, lsr #16 - bx lr -_037F81E4: .word 0x027FFE1D - - arm_func_start FUN_037F81E8 -FUN_037F81E8: ; 0x037F81E8 - stmfd sp!, {lr} - sub sp, sp, #4 - mov r0, #29 - mov r1, #1 - add r2, sp, #0 - bl NVRAM_ReadDataBytes - ldrb r0, [sp] - cmp r0, #255 ; 0xff - moveq r0, #0 - beq _037F821C - ands r0, r0, #64 ; 0x40 - movne r0, #1 - moveq r0, #0 -_037F821C: - add sp, sp, #4 - ldmia sp!, {lr} - bx lr - - arm_func_start FUN_037F8228 -FUN_037F8228: ; 0x037F8228 - stmdb sp!, {r4, lr} - sub sp, sp, #528 ; 0x210 - mov r0, #32 - mov r1, #2 - add r2, sp, #4 - bl NVRAM_ReadDataBytes - ldr r0, [sp, #4] - mov r0, r0, lsl #3 - str r0, [sp, #4] - mov r1, #256 ; 0x100 - add r2, sp, #16 - bl NVRAM_ReadDataBytes - ldr r0, [sp, #4] - add r0, r0, #256 ; 0x100 - mov r1, #256 ; 0x100 - add r2, sp, #272 ; 0x110 - bl NVRAM_ReadDataBytes - add r0, sp, #16 - bl FUN_037F802C - cmp r0, #3 - blt _037F8290 - mvn r0, #0 - ldr r1, _037F83A4 ; =0x027FFC80 - mov r2, #116 ; 0x74 - bl MIi_CpuClear32 - b _037F834C -_037F8290: - cmp r0, #0 - beq _037F833C - mov r2, r0, lsl #8 - ldr r1, _037F83A8 ; =0xFFFFFF2A - add r1, sp, r1 - ldrb r1, [r1, r0, lsl #8] - cmp r1, #10 - bcs _037F82DC - mov ip, #10 - mov r3, #0 - add r1, sp, #16 - add r2, r1, r2 - b _037F82D0 -_037F82C4: - add r1, r2, ip, lsl #1 - strh r3, [r1, #-252] ; 0xffffff04 - sub ip, ip, #1 -_037F82D0: - ldrb r1, [r2, #-230] ; 0xffffff1a - cmp ip, r1 - bgt _037F82C4 -_037F82DC: - mov r2, r0, lsl #8 - ldr r1, _037F83AC ; =0xFFFFFF60 - add r1, sp, r1 - ldrb r1, [r1, r0, lsl #8] - cmp r1, #26 - bcs _037F8320 - mov ip, #26 - mov r3, #0 - add r1, sp, #16 - add r2, r1, r2 - b _037F8314 -_037F8308: - add r1, r2, ip, lsl #1 - strh r3, [r1, #-230] ; 0xffffff1a - sub ip, ip, #1 -_037F8314: - ldrb r1, [r2, #-176] ; 0xffffff50 - cmp ip, r1 - bgt _037F8308 -_037F8320: - add r1, sp, #16 - sub r0, r0, #1 - add r0, r1, r0, lsl #8 - ldr r1, _037F83A4 ; =0x027FFC80 - mov r2, #116 ; 0x74 - bl MIi_CpuCopy32 - b _037F834C -_037F833C: - mov r0, #0 - ldr r1, _037F83A4 ; =0x027FFC80 - mov r2, #116 ; 0x74 - bl MIi_CpuClear32 -_037F834C: - mov r0, #54 ; 0x36 - mov r1, #6 - add r2, sp, #8 - bl NVRAM_ReadDataBytes - ldr r0, _037F83A4 ; =0x027FFC80 - add r4, r0, #116 ; 0x74 - add r0, sp, #8 - mov r1, r4 - mov r2, #6 - bl MI_CpuCopy8 - mov r0, #60 ; 0x3c - mov r1, #2 - add r2, sp, #0 - bl NVRAM_ReadDataBytes - ldrh r0, [sp] - mov r0, r0, lsl #15 - mov r0, r0, lsr #16 - bl WMSP_GetAllowedChannel - strh r0, [r4, #6] - add sp, sp, #528 ; 0x210 - ldmia sp!, {r4, lr} - bx lr -_037F83A4: .word 0x027FFC80 -_037F83A8: .word 0xFFFFFF2A -_037F83AC: .word 0xFFFFFF60 - - arm_func_start FUN_037F83B0 -FUN_037F83B0: ; 0x037F83B0 - stmdb sp!, {r4, lr} - mov r0, #8 - bl OS_GetArenaHi - mov r4, r0 - mov r0, #8 - bl OS_GetArenaLo - mov r1, r0 - mov r0, #8 - mov r2, r4 - mov r3, #1 - bl OS_InitAlloc - mov r4, r0 - mov r0, #8 - bl OS_GetArenaHi - mov r2, r0 - mov r0, r4 - mov r1, #0 - sub r2, r2, r4 - bl MI_CpuFill8 - mov r0, #8 - mov r1, r4 - bl OS_SetArenaLo - mov r0, #8 - bl OS_GetArenaHi - mov r4, r0 - mov r0, #8 - bl OS_GetArenaLo - mov r1, r0 - mov r0, #8 - mov r2, r4 - bl OS_CreateHeap - movs r4, r0 - bpl _037F8438 - bl FUN_037FB1F0 -_037F8438: - mov r0, #8 - mov r1, r4 - bl OS_SetCurrentHeap - mov r0, #8 - mov r1, r4 - bl OS_CheckHeap - cmp r0, #8448 ; 0x2100 - bcs _037F845C - bl FUN_037FB1F0 -_037F845C: - mov r0, r4 - ldmia sp!, {r4, lr} - bx lr - - arm_func_start NitroSpMain -NitroSpMain: ; 0x037F8468 - stmdb sp!, {r4, lr} - bl WVR_ShelterExtWram - bl OS_Init - bl OS_InitThread - bl FUN_037F8228 - bl PXI_Init - bl FUN_037F83B0 - mov r4, r0 - mov r0, #6 - bl SND_Init - bl PAD_InitXYButton - mov r0, #1 - ldr r1, _037F8524 ; =FUN_037F8000 - bl OS_SetIrqFunction - mov r0, #1 - bl OS_EnableIrqMask - ldr r1, _037F8528 ; =0x04000004 - ldrh r0, [r1] - ldrh r0, [r1] - orr r0, r0, #8 - strh r0, [r1] - ldr r1, _037F852C ; =0x04000208 - ldrh r0, [r1] - mov r0, #1 - strh r0, [r1] - bl OS_EnableInterrupts - mvn r0, #0 - bl FS_Init - mov r0, #15 - bl CARD_SetThreadPriority - mov r0, #12 - bl RTC_Init - mov r0, r4 - bl WVR_Init - mov r0, #2 - bl SPI_Init - mov r4, #0 -_037F84FC: - bl FUN_037F8530 - bl OS_IsResetOccurred - cmp r0, #0 - beq _037F8518 - mov r0, r4 - bl CTRDG_VibPulseEdgeUpdate - bl OS_ResetSystem -_037F8518: - bl CTRDG_CheckPullOut_Polling - bl CARD_CheckPullOut_Polling - b _037F84FC -_037F8524: .word FUN_037F8000 -_037F8528: .word 0x04000004 -_037F852C: .word 0x04000208 - - arm_func_start FUN_037F8530 -FUN_037F8530: ; 0x037F8530 - ldr ip, _037F8538 ; =SVC_Halt - bx ip -_037F8538: .word SVC_Halt - - arm_func_start OS_IrqHandler -OS_IrqHandler: ; 0x037F853C - stmfd sp!, {lr} - mov ip, #67108864 ; 0x4000000 - add ip, ip, #528 ; 0x210 - ldr r1, [ip, #-8] - cmp r1, #0 - ldmeqfd sp!, {pc} - ldmia ip, {r1, r2} - ands r1, r1, r2 - ldmeqfd sp!, {pc} - mov r3, #1 - mov r0, #0 -_037F8568: - ands r2, r1, r3, lsl r0 - addeq r0, r0, #1 - beq _037F8568 - str r2, [ip, #4] - ldr r1, _037F8588 ; =OS_IRQTable - ldr r0, [r1, r0, lsl #2] - ldr lr, _037F858C ; =OS_IrqHandler_ThreadSwitch - bx r0 -_037F8588: .word OS_IRQTable -_037F858C: .word OS_IrqHandler_ThreadSwitch - - arm_func_start OS_IrqHandler_ThreadSwitch -OS_IrqHandler_ThreadSwitch: - ldr ip, _037F86AC ; =OSi_IrqThreadQueue - mov r3, #0 - ldr ip, [ip] - mov r2, #1 - cmp ip, #0 - beq _037F85E0 -_037F85A8: - str r2, [ip, #72] ; 0x48 - str r3, [ip, #92] ; 0x5c - str r3, [ip, #96] ; 0x60 - ldr r0, [ip, #100] ; 0x64 - str r3, [ip, #100] ; 0x64 - mov ip, r0 - cmp ip, #0 - bne _037F85A8 - ldr ip, _037F86AC ; =OSi_IrqThreadQueue - str r3, [ip] - str r3, [ip, #4] - ldr ip, _037F86B0 ; =OSi_ThreadInfo - mov r1, #1 - strh r1, [ip] -_037F85E0: - ldr ip, _037F86B0 ; =OSi_ThreadInfo - ldrh r1, [ip] - cmp r1, #0 - ldreq pc, [sp], #4 ; (ldreq pc, [sp], #4) - mov r1, #0 - strh r1, [ip] - mov r3, #210 ; 0xd2 - msr CPSR_c, r3 - add r2, ip, #8 - ldr r1, [r2] -_037F8608: - cmp r1, #0 - ldrneh r0, [r1, #72] ; 0x48 - cmpne r0, #1 - ldrne r1, [r1, #76] ; 0x4c - bne _037F8608 - cmp r1, #0 - bne _037F8630 -_037F8624: - mov r3, #146 ; 0x92 - msr CPSR_c, r3 - ldr pc, [sp], #4 -_037F8630: - ldr r0, [ip, #4] - cmp r1, r0 - beq _037F8624 - ldr r3, [ip, #12] - cmp r3, #0 - beq _037F8658 - - arm_func_start FUN_037F8648 -FUN_037F8648: ; 0x037F8648 - stmdb sp!, {r0, r1, ip} - mov lr, pc - bx r3 - ldmia sp!, {r0, r1, ip} -_037F8658: - str r1, [ip, #4] - mrs r2, SPSR - str r2, [r0, #0]! - ldmib sp!, {r2, r3} - stmib r0!, {r2, r3} - ldmib sp!, {r2, r3, ip, lr} - stmib r0!, {r2, r3, r4, r5, r6, r7, r8, r9, sl, fp, ip, sp, lr}^ - stmib r0!, {lr} - mov r3, #211 ; 0xd3 - msr CPSR_c, r3 - stmib r0!, {sp} - ldr sp, [r1, #68] ; 0x44 - mov r3, #210 ; 0xd2 - msr CPSR_c, r3 - ldr r2, [r1, #0]! - msr SPSR_fc, r2 - ldr lr, [r1, #64] ; 0x40 - ldmib r1!, {r0, r1, r2, r3, r4, r5, r6, r7, r8, r9, sl, fp, ip, sp, lr}^ - nop ; (mov r0, r0) - stmda sp!, {r0, r1, r2, r3, ip, lr} - ldmia sp!, {pc} -_037F86AC: .word OSi_IrqThreadQueue -_037F86B0: .word OSi_ThreadInfo - - arm_func_start OSi_IrqVBlank -OSi_IrqVBlank: ; 0x037F86B4 - stmfd sp!, {lr} - sub sp, sp, #4 - ldr r0, _037F8700 ; =OSi_IrqCallbackInfo - ldr r2, [r0, #96] ; 0x60 - ldr r1, _037F8704 ; =0x027FFC3C - ldr r0, [r1] - add r0, r0, #1 - str r0, [r1] - cmp r2, #0 - beq _037F86E4 - mov lr, pc - bx r2 -_037F86E4: - ldr r1, _037F8708 ; =0x0380FFF8 - ldr r0, [r1] - orr r0, r0, #1 - str r0, [r1] - add sp, sp, #4 - ldmia sp!, {lr} - bx lr -_037F8700: .word OSi_IrqCallbackInfo -_037F8704: .word 0x027FFC3C -_037F8708: .word 0x0380FFF8 - - arm_func_start OSi_IrqTimer3 -OSi_IrqTimer3: ; 0x037F870C - mov r0, #7 - ldr ip, _037F8718 ; =OSi_IrqCallback - bx ip -_037F8718: .word OSi_IrqCallback - - arm_func_start OSi_IrqTimer2 -OSi_IrqTimer2: ; 0x037F871C - mov r0, #6 - ldr ip, _037F8728 ; =OSi_IrqCallback - bx ip -_037F8728: .word OSi_IrqCallback - - arm_func_start OSi_IrqTimer1 -OSi_IrqTimer1: ; 0x037F872C - mov r0, #5 - ldr ip, _037F8738 ; =OSi_IrqCallback - bx ip -_037F8738: .word OSi_IrqCallback - - arm_func_start OSi_IrqTimer0 -OSi_IrqTimer0: ; 0x037F873C - mov r0, #4 - ldr ip, _037F8748 ; =OSi_IrqCallback - bx ip -_037F8748: .word OSi_IrqCallback - - arm_func_start OSi_IrqDma3 -OSi_IrqDma3: ; 0x037F874C - mov r0, #3 - ldr ip, _037F8758 ; =OSi_IrqCallback - bx ip -_037F8758: .word OSi_IrqCallback - - arm_func_start OSi_IrqDma2 -OSi_IrqDma2: ; 0x037F875C - mov r0, #2 - ldr ip, _037F8768 ; =OSi_IrqCallback - bx ip -_037F8768: .word OSi_IrqCallback - - arm_func_start OSi_IrqDma1 -OSi_IrqDma1: ; 0x037F876C - mov r0, #1 - ldr ip, _037F8778 ; =OSi_IrqCallback - bx ip -_037F8778: .word OSi_IrqCallback - - arm_func_start OSi_IrqDma0 -OSi_IrqDma0: ; 0x037F877C - mov r0, #0 - ldr ip, _037F8788 ; =OSi_IrqCallback - bx ip -_037F8788: .word OSi_IrqCallback - - arm_func_start OSi_IrqCallback -OSi_IrqCallback: ; 0x037F878C - stmdb sp!, {r4, r5, lr} - sub sp, sp, #4 - mov r3, #1 - mov r2, r0, lsl #1 - ldr r1, _037F880C ; =_038075E4 - ldrh r1, [r1, r2] - mov r5, r3, lsl r1 - mov r1, #12 - mul r4, r0, r1 - ldr r2, _037F8810 ; =OSi_IrqCallbackInfo - ldr r1, [r2, r4] - mov r0, #0 - str r0, [r2, r4] - cmp r1, #0 - beq _037F87D8 - ldr r0, _037F8814 ; =_0380771C - ldr r0, [r0, r4] - mov lr, pc - bx r1 -_037F87D8: - ldr r1, _037F8818 ; =0x0380FFF8 - ldr r0, [r1] - orr r0, r0, r5 - str r0, [r1] - ldr r0, _037F881C ; =_03807718 - ldr r0, [r0, r4] - cmp r0, #0 - bne _037F8800 - mov r0, r5 - bl OS_DisableIrqMask -_037F8800: - add sp, sp, #4 - ldmia sp!, {r4, r5, lr} - bx lr -_037F880C: .word _038075E4 -_037F8810: .word OSi_IrqCallbackInfo -_037F8814: .word _0380771C -_037F8818: .word 0x0380FFF8 -_037F881C: .word _03807718 - - arm_func_start OS_IrqDummy -OS_IrqDummy: ; 0x037F8820 - bx lr - - arm_func_start OS_ResetRequestIrqMask -OS_ResetRequestIrqMask: ; 0x037F8824 - ldr ip, _037F8850 ; =0x04000208 - ldrh r3, [ip] - mov r1, #0 - strh r1, [ip] - ldr r2, _037F8854 ; =0x04000214 - ldr r1, [r2] - str r0, [r2] - ldrh r0, [ip] - strh r3, [ip] - mov r0, r1 - bx lr -_037F8850: .word 0x04000208 -_037F8854: .word 0x04000214 - - arm_func_start OS_DisableIrqMask -OS_DisableIrqMask: ; 0x037F8858 - ldr ip, _037F888C ; =0x04000208 - ldrh r3, [ip] - mov r1, #0 - strh r1, [ip] - ldr r2, _037F8890 ; =0x04000210 - ldr r1, [r2] - mvn r0, r0 - and r0, r1, r0 - str r0, [r2] - ldrh r0, [ip] - strh r3, [ip] - mov r0, r1 - bx lr -_037F888C: .word 0x04000208 -_037F8890: .word 0x04000210 - - arm_func_start OS_EnableIrqMask -OS_EnableIrqMask: ; 0x037F8894 - ldr ip, _037F88C4 ; =0x04000208 - ldrh r3, [ip] - mov r1, #0 - strh r1, [ip] - ldr r2, _037F88C8 ; =0x04000210 - ldr r1, [r2] - orr r0, r1, r0 - str r0, [r2] - ldrh r0, [ip] - strh r3, [ip] - mov r0, r1 - bx lr -_037F88C4: .word 0x04000208 -_037F88C8: .word 0x04000210 - - arm_func_start OS_SetIrqMask -OS_SetIrqMask: ; 0x037F88CC - ldr ip, _037F88F8 ; =0x04000208 - ldrh r3, [ip] - mov r1, #0 - strh r1, [ip] - ldr r2, _037F88FC ; =0x04000210 - ldr r1, [r2] - str r0, [r2] - ldrh r0, [ip] - strh r3, [ip] - mov r0, r1 - bx lr -_037F88F8: .word 0x04000208 -_037F88FC: .word 0x04000210 - - arm_func_start OSi_EnterTimerCallback -OSi_EnterTimerCallback: ; 0x037F8900 - stmdb sp!, {r4, lr} - mov r3, #12 - mul r4, r0, r3 - ldr r3, _037F8940 ; =_03807744 - str r1, [r3, r4] - ldr r1, _037F8944 ; =_0380774C - str r2, [r1, r4] - mov r1, #1 - add r0, r0, #3 - mov r0, r1, lsl r0 - bl OS_EnableIrqMask - mov r1, #1 - ldr r0, _037F8948 ; =_03807748 - str r1, [r0, r4] - ldmia sp!, {r4, lr} - bx lr -_037F8940: .word _03807744 -_037F8944: .word _0380774C -_037F8948: .word _03807748 - - arm_func_start OS_SetIrqFunction -OS_SetIrqFunction: ; 0x037F894C - stmdb sp!, {r4, r5, r6, r7, r8, r9, lr} - sub sp, sp, #4 - mov r9, #0 - mov r7, r9 - ldr lr, _037F89E8 ; =OS_IRQTable - ldr r4, _037F89EC ; =_03807774 - ldr r6, _037F89F0 ; =OSi_IrqCallbackInfo - mov ip, r9 - mov r3, #1 - mov r2, #12 -_037F8974: - ands r5, r0, #1 - beq _037F89CC - mov r8, r7 - cmp r9, #8 - blt _037F8998 - cmp r9, #11 - suble r5, r9, #8 - mlale r8, r5, r2, r6 - ble _037F89BC -_037F8998: - cmp r9, #3 - blt _037F89B0 - cmp r9, #6 - addle r5, r9, #1 - mlale r8, r5, r2, r6 - ble _037F89BC -_037F89B0: - cmp r9, #0 - moveq r8, r4 - strne r1, [lr, r9, lsl #2] -_037F89BC: - cmp r8, #0 - strne r1, [r8] - strne ip, [r8, #8] - strne r3, [r8, #4] -_037F89CC: - mov r0, r0, lsr #1 - add r9, r9, #1 - cmp r9, #25 - blt _037F8974 - add sp, sp, #4 - ldmia sp!, {r4, r5, r6, r7, r8, r9, lr} - bx lr -_037F89E8: .word OS_IRQTable -_037F89EC: .word _03807774 -_037F89F0: .word OSi_IrqCallbackInfo - - arm_func_start OS_InitIrqTable -OS_InitIrqTable: ; 0x037F89F4 - mov r1, #0 - ldr r0, _037F8A10 ; =OSi_IrqThreadQueue - str r1, [r0, #4] - str r1, [r0] - ldr r0, _037F8A14 ; =0x027FFC3C - str r1, [r0] - bx lr -_037F8A10: .word OSi_IrqThreadQueue -_037F8A14: .word 0x027FFC3C - - arm_func_start OS_UnLockCartridge -OS_UnLockCartridge: ; 0x037F8A18 - ldr r1, _037F8A20 ; =OS_UnlockCartridge - bx r1 -_037F8A20: .word OS_UnlockCartridge - - arm_func_start OS_GetLockID -OS_GetLockID: ; 0x037F8A24 - ldr r3, _037F8AB4 ; =0x027FFFB8 - ldr r1, [r3] - mov r2, #0 - mov r0, #-2147483648 ; 0x80000000 -_037F8A34: - tst r1, r0 - bne _037F8A50 - add r2, r2, #1 - cmp r2, #32 - beq _037F8A50 - mov r0, r0, lsr #1 - b _037F8A34 -_037F8A50: - cmp r2, #32 - movne r0, #128 ; 0x80 - bne _037F8A98 - add r3, r3, #4 - ldr r1, [r3] - mov r2, #0 - mov r0, #-2147483648 ; 0x80000000 -_037F8A6C: - tst r1, r0 - bne _037F8A88 - add r2, r2, #1 - cmp r2, #32 - beq _037F8A88 - mov r0, r0, lsr #1 - b _037F8A6C -_037F8A88: - cmp r2, #32 - ldr r0, _037F8AB8 ; =0xFFFFFFFD - bxeq lr - mov r0, #160 ; 0xa0 -_037F8A98: - add r0, r0, r2 - mov r1, #-2147483648 ; 0x80000000 - mov r1, r1, lsr r2 - ldr r2, [r3] - bic r2, r2, r1 - str r2, [r3] - bx lr -_037F8AB4: .word 0x027FFFB8 -_037F8AB8: .word 0xFFFFFFFD - - arm_func_start OS_ReleaseLockID -OS_ReleaseLockID: ; 0x037F8ABC - ldr r3, _037F8AE8 ; =0x027FFFB8 - cmp r0, #160 ; 0xa0 - addpl r3, r3, #4 - subpl r0, r0, #160 ; 0xa0 - submi r0, r0, #128 ; 0x80 - mov r1, #-2147483648 ; 0x80000000 - mov r1, r1, lsr r0 - ldr r2, [r3] - orr r2, r2, r1 - str r2, [r3] - bx lr -_037F8AE8: .word 0x027FFFB8 - - arm_func_start OS_ReadOwnerOfLockWord -OS_ReadOwnerOfLockWord: ; 0x037F8AEC - ldrh r0, [r0, #4] - bx lr -_037F8AF4: - bx lr -_037F8AF8: - bx lr - - arm_func_start OS_TryLockCartridge -OS_TryLockCartridge: ; 0x037F8AFC - ldr r1, _037F8B10 ; =0x027FFFE8 - ldr r2, _037F8B14 ; =_037F8AF8 - mov r3, #1 - ldr ip, _037F8B18 ; =FUN_037F8B5C - bx ip -_037F8B10: .word 0x027FFFE8 -_037F8B14: .word _037F8AF8 -_037F8B18: .word FUN_037F8B5C - - arm_func_start OS_UnlockCartridge -OS_UnlockCartridge: ; 0x037F8B1C - ldr r1, _037F8B30 ; =0x027FFFE8 - ldr r2, _037F8B34 ; =_037F8AF4 - mov r3, #1 - ldr ip, _037F8B38 ; =FUN_037F8BE0 - bx ip -_037F8B30: .word 0x027FFFE8 -_037F8B34: .word _037F8AF4 -_037F8B38: .word FUN_037F8BE0 - - arm_func_start OS_LockCartridge -OS_LockCartridge: ; 0x037F8B3C - ldr r1, _037F8B50 ; =0x027FFFE8 - ldr r2, _037F8B54 ; =_037F8AF8 - mov r3, #1 - ldr ip, _037F8B58 ; =FUN_037F8C6C - bx ip -_037F8B50: .word 0x027FFFE8 -_037F8B54: .word _037F8AF8 -_037F8B58: .word FUN_037F8C6C - - arm_func_start FUN_037F8B5C -FUN_037F8B5C: ; 0x037F8B5C - stmdb sp!, {r4, r5, r6, r7, r8, r9, lr} - sub sp, sp, #4 - mov r9, r0 - mov r8, r1 - mov r7, r2 - movs r6, r3 - beq _037F8B84 - bl OS_DisableInterrupts_IrqAndFiq - mov r5, r0 - b _037F8B8C -_037F8B84: - bl OS_DisableInterrupts - mov r5, r0 -_037F8B8C: - mov r0, r9 - mov r1, r8 - bl MI_SwapWord - movs r4, r0 - bne _037F8BB4 - cmp r7, #0 - beq _037F8BB0 - mov lr, pc - bx r7 -_037F8BB0: - strh r9, [r8, #4] -_037F8BB4: - cmp r6, #0 - beq _037F8BC8 - mov r0, r5 - bl OS_RestoreInterrupts_IrqAndFiq - b _037F8BD0 -_037F8BC8: - mov r0, r5 - bl OS_RestoreInterrupts -_037F8BD0: - mov r0, r4 - add sp, sp, #4 - ldmia sp!, {r4, r5, r6, r7, r8, r9, lr} - bx lr - - arm_func_start FUN_037F8BE0 -FUN_037F8BE0: ; 0x037F8BE0 - stmdb sp!, {r4, r5, r6, r7, lr} - sub sp, sp, #4 - mov r7, r1 - mov r6, r2 - mov r5, r3 - ldrh r1, [r7, #4] - cmp r0, r1 - mvnne r0, #1 - bne _037F8C60 - cmp r5, #0 - beq _037F8C18 - bl OS_DisableInterrupts_IrqAndFiq - mov r4, r0 - b _037F8C20 -_037F8C18: - bl OS_DisableInterrupts - mov r4, r0 -_037F8C20: - mov r0, #0 - strh r0, [r7, #4] - cmp r6, #0 - beq _037F8C38 - mov lr, pc - bx r6 -_037F8C38: - mov r0, #0 - str r0, [r7] - cmp r5, #0 - beq _037F8C54 - mov r0, r4 - bl OS_RestoreInterrupts_IrqAndFiq - b _037F8C5C -_037F8C54: - mov r0, r4 - bl OS_RestoreInterrupts -_037F8C5C: - mov r0, #0 -_037F8C60: - add sp, sp, #4 - ldmia sp!, {r4, r5, r6, r7, lr} - bx lr - - arm_func_start FUN_037F8C6C -FUN_037F8C6C: ; 0x037F8C6C - stmdb sp!, {r4, r5, r6, r7, r8, lr} - mov r8, r0 - mov r7, r1 - mov r6, r2 - mov r5, r3 - mov r4, #1024 ; 0x400 - b _037F8C90 -_037F8C88: - mov r0, r4 - bl FUN_037F8CB4 -_037F8C90: - mov r0, r8 - mov r1, r7 - mov r2, r6 - mov r3, r5 - bl FUN_037F8B5C - cmp r0, #0 - bgt _037F8C88 - ldmia sp!, {r4, r5, r6, r7, r8, lr} - bx lr - - arm_func_start FUN_037F8CB4 -FUN_037F8CB4: ; 0x037F8CB4 - ldr ip, _037F8CBC ; =SVC_WaitByLoop - bx ip -_037F8CBC: .word SVC_WaitByLoop - - arm_func_start OS_InitLock -OS_InitLock: ; 0x037F8CC0 - stmdb sp!, {r4, r5, lr} - sub sp, sp, #4 - ldr r0, _037F8D38 ; =_03807780 - ldr r1, [r0] - cmp r1, #0 - bne _037F8D2C - mov r1, #1 - str r1, [r0] - mov r0, #0 - ldr r4, _037F8D3C ; =0x027FFFF0 - strh r0, [r4, #6] - mov r5, #1024 ; 0x400 - b _037F8CFC -_037F8CF4: - mov r0, r5 - bl FUN_037F8CB4 -_037F8CFC: - ldrh r0, [r4, #4] - cmp r0, #127 ; 0x7f - bne _037F8CF4 - mvn r1, #0 - ldr r0, _037F8D40 ; =0x027FFFB8 - str r1, [r0] - mov r0, #65536 ; 0x10000 - rsb r1, r0, #0 - ldr r0, _037F8D44 ; =0x027FFFBC - str r1, [r0] - mov r0, #191 ; 0xbf - strh r0, [r4, #6] -_037F8D2C: - add sp, sp, #4 - ldmia sp!, {r4, r5, lr} - bx lr -_037F8D38: .word _03807780 -_037F8D3C: .word 0x027FFFF0 -_037F8D40: .word 0x027FFFB8 -_037F8D44: .word 0x027FFFBC - - arm_func_start OS_SetThreadDestructor -OS_SetThreadDestructor: ; 0x037F8D48 - str r1, [r0, #152] ; 0x98 - bx lr - - arm_func_start OS_EnableScheduler -OS_EnableScheduler: ; 0x037F8D50 - stmdb sp!, {r4, lr} - bl OS_DisableInterrupts - mov r4, #0 - ldr r1, _037F8D84 ; =OSi_RescheduleCount - ldr r3, [r1] - cmp r3, #0 - subne r2, r3, #1 - strne r2, [r1] - movne r4, r3 - bl OS_RestoreInterrupts - mov r0, r4 - ldmia sp!, {r4, lr} - bx lr -_037F8D84: .word OSi_RescheduleCount - - arm_func_start OS_DisableScheduler -OS_DisableScheduler: ; 0x037F8D88 - stmdb sp!, {r4, lr} - bl OS_DisableInterrupts - ldr r2, _037F8DBC ; =OSi_RescheduleCount - ldr r3, [r2] - mvn r1, #0 - cmp r3, r1 - addcc r1, r3, #1 - strcc r1, [r2] - movcc r4, r3 - bl OS_RestoreInterrupts - mov r0, r4 - ldmia sp!, {r4, lr} - bx lr -_037F8DBC: .word OSi_RescheduleCount - - arm_func_start OS_SetSwitchThreadCallback -OS_SetSwitchThreadCallback: ; 0x037F8DC0 - stmdb sp!, {r4, r5, lr} - sub sp, sp, #4 - mov r5, r0 - bl OS_DisableInterrupts - ldr r1, _037F8DF0 ; =OSi_ThreadInfo - ldr r4, [r1, #12] - str r5, [r1, #12] - bl OS_RestoreInterrupts - mov r0, r4 - add sp, sp, #4 - ldmia sp!, {r4, r5, lr} - bx lr -_037F8DF0: .word OSi_ThreadInfo -_037F8DF4: - ldr r2, [r0] - mov r1, #0 - str r1, [r0] - str r1, [r2, #148] ; 0x94 - mov r0, r2 - ldr ip, _037F8E10 ; =OS_WakeupThreadDirect - bx ip -_037F8E10: .word OS_WakeupThreadDirect - - arm_func_start OS_Sleep -OS_Sleep: ; 0x037F8E14 - stmdb sp!, {r4, r5, lr} - sub sp, sp, #52 ; 0x34 - mov r5, r0 - add r0, sp, #8 - bl OS_CreateAlarm - ldr r0, _037F8EAC ; =OSi_CurrentThreadPtr - ldr r0, [r0] - ldr r0, [r0] - str r0, [sp, #4] - bl OS_DisableInterrupts - mov r4, r0 - add r0, sp, #8 - ldr r1, [sp, #4] - str r0, [r1, #148] ; 0x94 - add r1, sp, #4 - str r1, [sp] - mov r2, #0 - ldr r1, _037F8EB0 ; =0x000082EA - umull ip, r3, r5, r1 - mla r3, r5, r2, r3 - mla r3, r2, r1, r3 - mov r2, r3, lsr #6 - mov r1, ip, lsr #6 - orr r1, r1, r3, lsl #26 - ldr r3, _037F8EB4 ; =_037F8DF4 - bl OS_SetAlarm - mov r5, #0 - b _037F8E8C -_037F8E84: - mov r0, r5 - bl OS_SleepThread -_037F8E8C: - ldr r0, [sp, #4] - cmp r0, #0 - bne _037F8E84 - mov r0, r4 - bl OS_RestoreInterrupts - add sp, sp, #52 ; 0x34 - ldmia sp!, {r4, r5, lr} - bx lr -_037F8EAC: .word OSi_CurrentThreadPtr -_037F8EB0: .word 0x000082EA -_037F8EB4: .word _037F8DF4 - - arm_func_start OS_SetThreadPriority -OS_SetThreadPriority: ; 0x037F8EB8 - stmdb sp!, {r4, r5, r6, r7, r8, lr} - mov r6, r0 - mov r5, r1 - ldr r0, _037F8F60 ; =OSi_ThreadInfo - ldr r8, [r0, #8] - mov r7, #0 - bl OS_DisableInterrupts - mov r4, r0 - b _037F8EE4 -_037F8EDC: - mov r7, r8 - ldr r8, [r8, #76] ; 0x4c -_037F8EE4: - cmp r8, #0 - beq _037F8EF4 - cmp r8, r6 - bne _037F8EDC -_037F8EF4: - cmp r8, #0 - beq _037F8F08 - ldr r0, _037F8F64 ; =OSi_IdleThread - cmp r8, r0 - bne _037F8F18 -_037F8F08: - mov r0, r4 - bl OS_RestoreInterrupts - mov r0, #0 - b _037F8F58 -_037F8F18: - ldr r0, [r8, #84] ; 0x54 - cmp r0, r5 - beq _037F8F4C - cmp r7, #0 - ldreq r1, [r6, #76] ; 0x4c - ldreq r0, _037F8F60 ; =OSi_ThreadInfo - streq r1, [r0, #8] - ldrne r0, [r6, #76] ; 0x4c - strne r0, [r7, #76] ; 0x4c - str r5, [r6, #84] ; 0x54 - mov r0, r6 - bl FUN_037F9584 - bl FUN_037F945C -_037F8F4C: - mov r0, r4 - bl OS_RestoreInterrupts - mov r0, #1 -_037F8F58: - ldmia sp!, {r4, r5, r6, r7, r8, lr} - bx lr -_037F8F60: .word OSi_ThreadInfo -_037F8F64: .word OSi_IdleThread - - arm_func_start OS_RescheduleThread -OS_RescheduleThread: ; 0x037F8F68 - stmdb sp!, {r4, lr} - bl OS_DisableInterrupts - mov r4, r0 - bl FUN_037F945C - mov r0, r4 - bl OS_RestoreInterrupts - ldmia sp!, {r4, lr} - bx lr - - arm_func_start OS_SelectThread -OS_SelectThread: ; 0x037F8F88 - ldr r0, _037F8FB0 ; =OSi_ThreadInfo - ldr r0, [r0, #8] - b _037F8F98 -_037F8F94: - ldr r0, [r0, #76] ; 0x4c -_037F8F98: - cmp r0, #0 - bxeq lr - ldr r1, [r0, #72] ; 0x48 - cmp r1, #1 - bne _037F8F94 - bx lr -_037F8FB0: .word OSi_ThreadInfo - - arm_func_start OS_WakeupThreadDirect -OS_WakeupThreadDirect: ; 0x037F8FB4 - stmdb sp!, {r4, r5, lr} - sub sp, sp, #4 - mov r5, r0 - bl OS_DisableInterrupts - mov r4, r0 - mov r0, #1 - str r0, [r5, #72] ; 0x48 - bl FUN_037F945C - mov r0, r4 - bl OS_RestoreInterrupts - add sp, sp, #4 - ldmia sp!, {r4, r5, lr} - bx lr - - arm_func_start OS_WakeupThread -OS_WakeupThread: ; 0x037F8FE8 - stmdb sp!, {r4, r5, r6, r7, lr} - sub sp, sp, #4 - mov r5, r0 - bl OS_DisableInterrupts - mov r4, r0 - ldr r0, [r5] - cmp r0, #0 - beq _037F9050 - mov r7, #1 - mov r6, #0 - b _037F9030 -_037F9014: - mov r0, r5 - bl FUN_037F967C - str r7, [r0, #72] ; 0x48 - str r6, [r0, #92] ; 0x5c - str r6, [r0, #100] ; 0x64 - ldr r1, [r0, #100] ; 0x64 - str r1, [r0, #96] ; 0x60 -_037F9030: - ldr r0, [r5] - cmp r0, #0 - bne _037F9014 - mov r0, #0 - str r0, [r5, #4] - ldr r0, [r5, #4] - str r0, [r5] - bl FUN_037F945C -_037F9050: - mov r0, r4 - bl OS_RestoreInterrupts - add sp, sp, #4 - ldmia sp!, {r4, r5, r6, r7, lr} - bx lr - - arm_func_start OS_SleepThread -OS_SleepThread: ; 0x037F9064 - stmdb sp!, {r4, r5, r6, lr} - mov r6, r0 - bl OS_DisableInterrupts - mov r5, r0 - ldr r0, _037F90B4 ; =OSi_CurrentThreadPtr - ldr r0, [r0] - ldr r4, [r0] - cmp r6, #0 - beq _037F9098 - str r6, [r4, #92] ; 0x5c - mov r0, r6 - mov r1, r4 - bl FUN_037F96B0 -_037F9098: - mov r0, #0 - str r0, [r4, #72] ; 0x48 - bl FUN_037F945C - mov r0, r5 - bl OS_RestoreInterrupts - ldmia sp!, {r4, r5, r6, lr} - bx lr -_037F90B4: .word OSi_CurrentThreadPtr - - arm_func_start OS_IsThreadTerminated -OS_IsThreadTerminated: ; 0x037F90B8 - ldr r0, [r0, #72] ; 0x48 - cmp r0, #2 - moveq r0, #1 - movne r0, #0 - bx lr - - arm_func_start OS_JoinThread -OS_JoinThread: ; 0x037F90CC - stmdb sp!, {r4, r5, lr} - sub sp, sp, #4 - mov r5, r0 - bl OS_DisableInterrupts - mov r4, r0 - ldr r0, [r5, #72] ; 0x48 - cmp r0, #2 - beq _037F90F4 - add r0, r5, #128 ; 0x80 - bl OS_SleepThread -_037F90F4: - mov r0, r4 - bl OS_RestoreInterrupts - add sp, sp, #4 - ldmia sp!, {r4, r5, lr} - bx lr - - arm_func_start FUN_037F9108 -FUN_037F9108: ; 0x037F9108 - stmdb sp!, {r4, lr} - ldr r0, _037F9164 ; =OSi_CurrentThreadPtr - ldr r0, [r0] - ldr r4, [r0] - bl OS_DisableScheduler - mov r0, r4 - bl OSi_UnlockAllMutex - ldr r0, [r4, #92] ; 0x5c - cmp r0, #0 - beq _037F9138 - mov r1, r4 - bl FUN_037F961C -_037F9138: - mov r0, r4 - bl FUN_037F953C - mov r0, #2 - str r0, [r4, #72] ; 0x48 - add r0, r4, #128 ; 0x80 - bl OS_WakeupThread - bl OS_EnableScheduler - bl OS_RescheduleThread - bl FUN_037FB1F0 - ldmia sp!, {r4, lr} - bx lr -_037F9164: .word OSi_CurrentThreadPtr - - arm_func_start FUN_037F9168 -FUN_037F9168: ; 0x037F9168 - stmfd sp!, {lr} - sub sp, sp, #4 - ldr r1, _037F91AC ; =OSi_CurrentThreadPtr - ldr r1, [r1] - ldr r3, [r1] - ldr r2, [r3, #152] ; 0x98 - cmp r2, #0 - beq _037F919C - mov r1, #0 - str r1, [r3, #152] ; 0x98 - mov lr, pc - bx r2 - bl OS_DisableInterrupts -_037F919C: - bl FUN_037F9108 - add sp, sp, #4 - ldmia sp!, {lr} - bx lr -_037F91AC: .word OSi_CurrentThreadPtr - - arm_func_start FUN_037F91B0 -FUN_037F91B0: ; 0x037F91B0 - stmdb sp!, {r4, r5, lr} - sub sp, sp, #4 - mov r5, r0 - mov r4, r1 - ldr r1, _037F9210 ; =OSi_StackForDestructor - ldr r2, [r1] - cmp r2, #0 - beq _037F91FC - ldr r1, _037F9214 ; =FUN_037F9168 - bl OS_InitContext - str r4, [r5, #4] - ldr r0, [r5] - orr r0, r0, #128 ; 0x80 - str r0, [r5] - mov r0, #1 - str r0, [r5, #72] ; 0x48 - mov r0, r5 - bl OS_LoadContext - b _037F9204 -_037F91FC: - mov r0, r4 - bl FUN_037F9168 -_037F9204: - add sp, sp, #4 - ldmia sp!, {r4, r5, lr} - bx lr -_037F9210: .word OSi_StackForDestructor -_037F9214: .word FUN_037F9168 - - arm_func_start OS_ExitThread -OS_ExitThread: ; 0x037F9218 - stmfd sp!, {lr} - sub sp, sp, #4 - bl OS_DisableInterrupts - ldr r0, _037F9240 ; =OSi_ThreadInfo - ldr r0, [r0, #4] - mov r1, #0 - bl FUN_037F91B0 - add sp, sp, #4 - ldmia sp!, {lr} - bx lr -_037F9240: .word OSi_ThreadInfo - - arm_func_start OS_CreateThread -OS_CreateThread: ; 0x037F9244 - stmdb sp!, {r4, r5, r6, r7, r8, r9, lr} - sub sp, sp, #4 - mov r9, r0 - mov r8, r1 - mov r7, r2 - mov r6, r3 - bl OS_DisableInterrupts - mov r4, r0 - bl FUN_037F9728 - ldr r1, [sp, #36] ; 0x24 - str r1, [r9, #84] ; 0x54 - str r0, [r9, #80] ; 0x50 - mov r0, #0 - str r0, [r9, #72] ; 0x48 - str r0, [r9, #88] ; 0x58 - mov r0, r9 - bl FUN_037F9584 - str r6, [r9, #120] ; 0x78 - ldr r0, [sp, #32] - sub r5, r6, r0 - str r5, [r9, #116] ; 0x74 - mov r2, #0 - str r2, [r9, #124] ; 0x7c - ldr r1, _037F9348 ; =0xD73BFDF7 - ldr r0, [r9, #120] ; 0x78 - str r1, [r0, #-4] - ldr r1, _037F934C ; =0xFBDD37BB - ldr r0, [r9, #116] ; 0x74 - str r1, [r0] - str r2, [r9, #132] ; 0x84 - ldr r0, [r9, #132] ; 0x84 - str r0, [r9, #128] ; 0x80 - mov r0, r9 - mov r1, r8 - sub r2, r6, #4 - bl OS_InitContext - str r7, [r9, #4] - ldr r0, _037F9350 ; =OS_ExitThread - str r0, [r9, #60] ; 0x3c - mov r0, #0 - add r1, r5, #4 - ldr r2, [sp, #32] - sub r2, r2, #8 - bl MIi_CpuClear32 - mov r1, #0 - str r1, [r9, #104] ; 0x68 - str r1, [r9, #108] ; 0x6c - str r1, [r9, #112] ; 0x70 - mov r0, r9 - bl OS_SetThreadDestructor - mov r0, #0 - str r0, [r9, #92] ; 0x5c - str r0, [r9, #100] ; 0x64 - ldr r1, [r9, #100] ; 0x64 - str r1, [r9, #96] ; 0x60 - add r1, r9, #136 ; 0x88 - mov r2, #12 - bl MIi_CpuClear32 - mov r0, #0 - str r0, [r9, #148] ; 0x94 - mov r0, r4 - bl OS_RestoreInterrupts - add sp, sp, #4 - ldmia sp!, {r4, r5, r6, r7, r8, r9, lr} - bx lr -_037F9348: .word 0xD73BFDF7 -_037F934C: .word 0xFBDD37BB -_037F9350: .word OS_ExitThread - - arm_func_start OS_InitThread -OS_InitThread: ; 0x037F9354 - stmfd sp!, {lr} - sub sp, sp, #4 - ldr r0, _037F942C ; =OSi_IsThreadInitialized - ldr r1, [r0] - cmp r1, #0 - bne _037F9420 - mov r2, #1 - str r2, [r0] - ldr r1, _037F9430 ; =_038077A0 - ldr r0, _037F9434 ; =OSi_CurrentThreadPtr - str r1, [r0] - mov r0, #16 - ldr r1, _037F9438 ; =OSi_LauncherThread - str r0, [r1, #84] ; 0x54 - mov r0, #0 - str r0, [r1, #80] ; 0x50 - str r2, [r1, #72] ; 0x48 - str r0, [r1, #76] ; 0x4c - str r0, [r1, #88] ; 0x58 - ldr r0, _037F943C ; =OSi_ThreadInfo - str r1, [r0, #8] - str r1, [r0, #4] - ldr r2, _037F9440 ; =0x00000400 - cmp r2, #0 - ldrle r0, _037F9444 ; =FUN_037F8000 - suble r2, r0, r2 - ldrgt r1, _037F9448 ; =0x00000400 - ldrgt r0, _037F944C ; =0x0380FF80 - subgt r0, r0, r1 - subgt r2, r0, r2 - ldr r1, _037F9448 ; =0x00000400 - ldr r0, _037F944C ; =0x0380FF80 - sub r3, r0, r1 - ldr r1, _037F9438 ; =OSi_LauncherThread - str r3, [r1, #120] ; 0x78 - str r2, [r1, #116] ; 0x74 - mov r0, #0 - str r0, [r1, #124] ; 0x7c - ldr r2, _037F9450 ; =0xD73BFDF7 - str r2, [r3, #-4] - ldr r3, _037F9454 ; =0xFBDD37BB - ldr r2, [r1, #116] ; 0x74 - str r3, [r2] - str r0, [r1, #132] ; 0x84 - str r0, [r1, #128] ; 0x80 - ldr r1, _037F943C ; =OSi_ThreadInfo - strh r0, [r1] - strh r0, [r1, #2] - ldr r2, _037F9458 ; =0x027FFFA4 - str r1, [r2] - bl OS_SetSwitchThreadCallback -_037F9420: - add sp, sp, #4 - ldmia sp!, {lr} - bx lr -_037F942C: .word OSi_IsThreadInitialized -_037F9430: .word _038077A0 -_037F9434: .word OSi_CurrentThreadPtr -_037F9438: .word OSi_LauncherThread -_037F943C: .word OSi_ThreadInfo -_037F9440: .word 0x00000400 -_037F9444: .word FUN_037F8000 -_037F9448: .word 0x00000400 -_037F944C: .word 0x0380FF80 -_037F9450: .word 0xD73BFDF7 -_037F9454: .word 0xFBDD37BB -_037F9458: .word 0x027FFFA4 - - arm_func_start FUN_037F945C -FUN_037F945C: ; 0x037F945C - stmdb sp!, {r4, r5, r6, lr} - ldr r0, _037F952C ; =OSi_RescheduleCount - ldr r0, [r0] - cmp r0, #0 - bne _037F9524 - ldr r4, _037F9530 ; =OSi_ThreadInfo - ldrh r0, [r4, #2] - cmp r0, #0 - bne _037F948C - bl OS_GetProcMode - cmp r0, #18 - bne _037F9498 -_037F948C: - mov r0, #1 - strh r0, [r4] - b _037F9524 -_037F9498: - ldr r0, _037F9534 ; =OSi_CurrentThreadPtr - ldr r0, [r0] - ldr r6, [r0] - bl OS_SelectThread - mov r5, r0 - cmp r6, r5 - beq _037F9524 - cmp r5, #0 - beq _037F9524 - ldr r0, [r6, #72] ; 0x48 - cmp r0, #2 - beq _037F94D8 - mov r0, r6 - bl OS_SaveContext - cmp r0, #0 - bne _037F9524 -_037F94D8: - ldr r0, _037F9538 ; =OSi_SystemCallbackInSwitchThread - ldr r2, [r0] - cmp r2, #0 - beq _037F94F8 - mov r0, r6 - mov r1, r5 - mov lr, pc - bx r2 -_037F94F8: - ldr r2, [r4, #12] - cmp r2, #0 - beq _037F9514 - mov r0, r6 - mov r1, r5 - mov lr, pc - bx r2 -_037F9514: - ldr r0, _037F9530 ; =OSi_ThreadInfo - str r5, [r0, #4] - mov r0, r5 - bl OS_LoadContext -_037F9524: - ldmia sp!, {r4, r5, r6, lr} - bx lr -_037F952C: .word OSi_RescheduleCount -_037F9530: .word OSi_ThreadInfo -_037F9534: .word OSi_CurrentThreadPtr -_037F9538: .word OSi_SystemCallbackInSwitchThread - - arm_func_start FUN_037F953C -FUN_037F953C: ; 0x037F953C - ldr r1, _037F9580 ; =OSi_ThreadInfo - ldr r2, [r1, #8] - mov r1, #0 - b _037F9554 -_037F954C: - mov r1, r2 - ldr r2, [r2, #76] ; 0x4c -_037F9554: - cmp r2, #0 - beq _037F9564 - cmp r2, r0 - bne _037F954C -_037F9564: - cmp r1, #0 - ldreq r1, [r0, #76] ; 0x4c - ldreq r0, _037F9580 ; =OSi_ThreadInfo - streq r1, [r0, #8] - ldrne r0, [r0, #76] ; 0x4c - strne r0, [r1, #76] ; 0x4c - bx lr -_037F9580: .word OSi_ThreadInfo - - arm_func_start FUN_037F9584 -FUN_037F9584: ; 0x037F9584 - stmfd sp!, {lr} - sub sp, sp, #4 - ldr r1, _037F95E8 ; =OSi_ThreadInfo - ldr r3, [r1, #8] - mov lr, r3 - mov ip, #0 - b _037F95A8 -_037F95A0: - mov ip, lr - ldr lr, [lr, #76] ; 0x4c -_037F95A8: - cmp lr, #0 - beq _037F95C0 - ldr r2, [lr, #84] ; 0x54 - ldr r1, [r0, #84] ; 0x54 - cmp r2, r1 - bcc _037F95A0 -_037F95C0: - cmp ip, #0 - streq r3, [r0, #76] ; 0x4c - ldreq r1, _037F95E8 ; =OSi_ThreadInfo - streq r0, [r1, #8] - ldrne r1, [ip, #76] ; 0x4c - strne r1, [r0, #76] ; 0x4c - strne r0, [ip, #76] ; 0x4c - add sp, sp, #4 - ldmia sp!, {lr} - bx lr -_037F95E8: .word OSi_ThreadInfo - - arm_func_start OSi_RemoveMutexLinkFromQueue -OSi_RemoveMutexLinkFromQueue: ; 0x037F95EC - ldr r2, [r0] - cmp r2, #0 - beq _037F9614 - ldr r1, [r2, #16] - str r1, [r0] - cmp r1, #0 - movne r0, #0 - strne r0, [r1, #20] - moveq r1, #0 - streq r1, [r0, #4] -_037F9614: - mov r0, r2 - bx lr - - arm_func_start FUN_037F961C -FUN_037F961C: ; 0x037F961C - stmfd sp!, {lr} - sub sp, sp, #4 - ldr r2, [r0] - mov lr, r2 - b _037F9664 -_037F9630: - ldr ip, [lr, #100] ; 0x64 - cmp lr, r1 - bne _037F9660 - ldr r3, [lr, #96] ; 0x60 - cmp r2, lr - streq ip, [r0] - strne ip, [r3, #100] ; 0x64 - ldr r1, [r0, #4] - cmp r1, lr - streq r3, [r0, #4] - strne r3, [ip, #96] ; 0x60 - b _037F966C -_037F9660: - mov lr, ip -_037F9664: - cmp lr, #0 - bne _037F9630 -_037F966C: - mov r0, lr - add sp, sp, #4 - ldmia sp!, {lr} - bx lr - - arm_func_start FUN_037F967C -FUN_037F967C: ; 0x037F967C - ldr r2, [r0] - cmp r2, #0 - beq _037F96A8 - ldr r1, [r2, #100] ; 0x64 - str r1, [r0] - cmp r1, #0 - movne r0, #0 - strne r0, [r1, #96] ; 0x60 - moveq r1, #0 - streq r1, [r0, #4] - streq r1, [r2, #92] ; 0x5c -_037F96A8: - mov r0, r2 - bx lr - - arm_func_start FUN_037F96B0 -FUN_037F96B0: ; 0x037F96B0 - ldr ip, [r0] - b _037F96C4 -_037F96B8: - cmp ip, r1 - bxeq lr - ldr ip, [ip, #100] ; 0x64 -_037F96C4: - cmp ip, #0 - beq _037F96DC - ldr r3, [ip, #84] ; 0x54 - ldr r2, [r1, #84] ; 0x54 - cmp r3, r2 - bls _037F96B8 -_037F96DC: - cmp ip, #0 - bne _037F9708 - ldr r2, [r0, #4] - cmp r2, #0 - streq r1, [r0] - strne r1, [r2, #100] ; 0x64 - str r2, [r1, #96] ; 0x60 - mov r2, #0 - str r2, [r1, #100] ; 0x64 - str r1, [r0, #4] - bx lr -_037F9708: - ldr r2, [ip, #96] ; 0x60 - cmp r2, #0 - streq r1, [r0] - strne r1, [r2, #100] ; 0x64 - str r2, [r1, #96] ; 0x60 - str ip, [r1, #100] ; 0x64 - str r1, [ip, #96] ; 0x60 - bx lr - - arm_func_start FUN_037F9728 -FUN_037F9728: ; 0x037F9728 - ldr r1, _037F973C ; =_0380778C - ldr r0, [r1] - add r0, r0, #1 - str r0, [r1] - bx lr -_037F973C: .word _0380778C - arm_func_start OS_InitContext OS_InitContext: ; 0x037F9740 add r1, r1, #4 diff --git a/arm7/asm/main.s b/arm7/asm/main.s new file mode 100644 index 00000000..c12d04f6 --- /dev/null +++ b/arm7/asm/main.s @@ -0,0 +1,391 @@ + .include "asm/macros.inc" + .include "global.inc" + + .text + + arm_func_start FUN_037F8000 +FUN_037F8000: ; 0x037F8000 + stmfd sp!, {lr} + sub sp, sp, #4 + ldr r0, _037F8028 ; =PMi_Initialized + ldr r0, [r0] + cmp r0, #0 + beq _037F801C + bl PM_SelfBlinkProc +_037F801C: + add sp, sp, #4 + ldmia sp!, {lr} + bx lr +_037F8028: .word PMi_Initialized + + arm_func_start FUN_037F802C +FUN_037F802C: ; 0x037F802C + stmdb sp!, {r4, r5, r6, r7, r8, r9, sl, fp, lr} + sub sp, sp, #4 + mov sl, r0 + mov r8, #0 + bl FUN_037F81E8 + cmp r0, #0 + beq _037F80F8 + bl FUN_037F81C4 + mov r7, r0 + mov r9, r8 + mov r4, #1 + mov fp, #138 ; 0x8a + mov r5, #112 ; 0x70 +_037F8060: + add r6, sl, r9, lsl #8 + ldr r0, _037F81B4 ; =0x0000FFFF + mov r1, r6 + mov r2, r5 + bl FUN_037F81B8 + mov r2, r6 + ldrh r1, [r2, #114] ; 0x72 + cmp r0, r1 + bne _037F80E0 + ldrh r0, [r2, #112] ; 0x70 + cmp r0, #128 ; 0x80 + bcs _037F80E0 + ldr r0, _037F81B4 ; =0x0000FFFF + add r1, r6, #116 ; 0x74 + mov r2, fp + bl FUN_037F81B8 + mov r3, r6 + ldrh r1, [r3, #254] ; 0xfe + cmp r0, r1 + bne _037F80E0 + ldrh r2, [r3, #118] ; 0x76 + ldrb r0, [r3, #117] ; 0x75 + mov r1, r4, lsl r0 + ands r1, r1, r2 + beq _037F80E0 + ands r1, r7, r2 + ldrneh r1, [r6, #100] ; 0x64 + bicne r1, r1, #7 + andne r0, r0, #7 + orrne r0, r1, r0 + strneh r0, [r6, #100] ; 0x64 + orr r8, r8, r4, lsl r9 +_037F80E0: + add r0, r9, #1 + mov r0, r0, lsl #16 + mov r9, r0, lsr #16 + cmp r9, #2 + bcc _037F8060 + b _037F8158 +_037F80F8: + bl FUN_037F81C4 + cmp r0, #0 + movne r0, #3 + bne _037F81A8 + mov r7, r8 + mov r4, #1 + ldr r6, _037F81B4 ; =0x0000FFFF + mov r5, #112 ; 0x70 +_037F8118: + mov r0, r6 + add r1, sl, r7, lsl #8 + mov r2, r5 + bl FUN_037F81B8 + add r2, sl, r7, lsl #8 + ldrh r1, [r2, #114] ; 0x72 + cmp r0, r1 + bne _037F8144 + ldrh r0, [r2, #112] ; 0x70 + cmp r0, #128 ; 0x80 + orrcc r8, r8, r4, lsl r7 +_037F8144: + add r0, r7, #1 + mov r0, r0, lsl #16 + mov r7, r0, lsr #16 + cmp r7, #2 + bcc _037F8118 +_037F8158: + cmp r8, #1 + beq _037F8174 + cmp r8, #2 + beq _037F8174 + cmp r8, #3 + beq _037F817C + b _037F81A4 +_037F8174: + mov r0, r8 + b _037F81A8 +_037F817C: + ldrh r0, [sl, #112] ; 0x70 + add r0, r0, #1 + and r0, r0, #127 ; 0x7f + and r1, r0, #255 ; 0xff + add r0, sl, #256 ; 0x100 + ldrh r0, [r0, #112] ; 0x70 + cmp r1, r0 + moveq r0, #2 + movne r0, #1 + b _037F81A8 +_037F81A4: + mov r0, #0 +_037F81A8: + add sp, sp, #4 + ldmia sp!, {r4, r5, r6, r7, r8, r9, sl, fp, lr} + bx lr +_037F81B4: .word 0x0000FFFF + + arm_func_start FUN_037F81B8 +FUN_037F81B8: ; 0x037F81B8 + ldr ip, _037F81C0 ; =SVC_GetCRC16 + bx ip +_037F81C0: .word SVC_GetCRC16 + + arm_func_start FUN_037F81C4 +FUN_037F81C4: ; 0x037F81C4 + mov r0, #0 + ldr r1, _037F81E4 ; =0x027FFE1D + ldrb r1, [r1] + cmp r1, #128 ; 0x80 + orreq r0, r0, #64 ; 0x40 + moveq r0, r0, lsl #16 + moveq r0, r0, lsr #16 + bx lr +_037F81E4: .word 0x027FFE1D + + arm_func_start FUN_037F81E8 +FUN_037F81E8: ; 0x037F81E8 + stmfd sp!, {lr} + sub sp, sp, #4 + mov r0, #29 + mov r1, #1 + add r2, sp, #0 + bl NVRAM_ReadDataBytes + ldrb r0, [sp] + cmp r0, #255 ; 0xff + moveq r0, #0 + beq _037F821C + ands r0, r0, #64 ; 0x40 + movne r0, #1 + moveq r0, #0 +_037F821C: + add sp, sp, #4 + ldmia sp!, {lr} + bx lr + + arm_func_start FUN_037F8228 +FUN_037F8228: ; 0x037F8228 + stmdb sp!, {r4, lr} + sub sp, sp, #528 ; 0x210 + mov r0, #32 + mov r1, #2 + add r2, sp, #4 + bl NVRAM_ReadDataBytes + ldr r0, [sp, #4] + mov r0, r0, lsl #3 + str r0, [sp, #4] + mov r1, #256 ; 0x100 + add r2, sp, #16 + bl NVRAM_ReadDataBytes + ldr r0, [sp, #4] + add r0, r0, #256 ; 0x100 + mov r1, #256 ; 0x100 + add r2, sp, #272 ; 0x110 + bl NVRAM_ReadDataBytes + add r0, sp, #16 + bl FUN_037F802C + cmp r0, #3 + blt _037F8290 + mvn r0, #0 + ldr r1, _037F83A4 ; =0x027FFC80 + mov r2, #116 ; 0x74 + bl MIi_CpuClear32 + b _037F834C +_037F8290: + cmp r0, #0 + beq _037F833C + mov r2, r0, lsl #8 + ldr r1, _037F83A8 ; =0xFFFFFF2A + add r1, sp, r1 + ldrb r1, [r1, r0, lsl #8] + cmp r1, #10 + bcs _037F82DC + mov ip, #10 + mov r3, #0 + add r1, sp, #16 + add r2, r1, r2 + b _037F82D0 +_037F82C4: + add r1, r2, ip, lsl #1 + strh r3, [r1, #-252] ; 0xffffff04 + sub ip, ip, #1 +_037F82D0: + ldrb r1, [r2, #-230] ; 0xffffff1a + cmp ip, r1 + bgt _037F82C4 +_037F82DC: + mov r2, r0, lsl #8 + ldr r1, _037F83AC ; =0xFFFFFF60 + add r1, sp, r1 + ldrb r1, [r1, r0, lsl #8] + cmp r1, #26 + bcs _037F8320 + mov ip, #26 + mov r3, #0 + add r1, sp, #16 + add r2, r1, r2 + b _037F8314 +_037F8308: + add r1, r2, ip, lsl #1 + strh r3, [r1, #-230] ; 0xffffff1a + sub ip, ip, #1 +_037F8314: + ldrb r1, [r2, #-176] ; 0xffffff50 + cmp ip, r1 + bgt _037F8308 +_037F8320: + add r1, sp, #16 + sub r0, r0, #1 + add r0, r1, r0, lsl #8 + ldr r1, _037F83A4 ; =0x027FFC80 + mov r2, #116 ; 0x74 + bl MIi_CpuCopy32 + b _037F834C +_037F833C: + mov r0, #0 + ldr r1, _037F83A4 ; =0x027FFC80 + mov r2, #116 ; 0x74 + bl MIi_CpuClear32 +_037F834C: + mov r0, #54 ; 0x36 + mov r1, #6 + add r2, sp, #8 + bl NVRAM_ReadDataBytes + ldr r0, _037F83A4 ; =0x027FFC80 + add r4, r0, #116 ; 0x74 + add r0, sp, #8 + mov r1, r4 + mov r2, #6 + bl MI_CpuCopy8 + mov r0, #60 ; 0x3c + mov r1, #2 + add r2, sp, #0 + bl NVRAM_ReadDataBytes + ldrh r0, [sp] + mov r0, r0, lsl #15 + mov r0, r0, lsr #16 + bl WMSP_GetAllowedChannel + strh r0, [r4, #6] + add sp, sp, #528 ; 0x210 + ldmia sp!, {r4, lr} + bx lr +_037F83A4: .word 0x027FFC80 +_037F83A8: .word 0xFFFFFF2A +_037F83AC: .word 0xFFFFFF60 + + arm_func_start FUN_037F83B0 +FUN_037F83B0: ; 0x037F83B0 + stmdb sp!, {r4, lr} + mov r0, #8 + bl OS_GetArenaHi + mov r4, r0 + mov r0, #8 + bl OS_GetArenaLo + mov r1, r0 + mov r0, #8 + mov r2, r4 + mov r3, #1 + bl OS_InitAlloc + mov r4, r0 + mov r0, #8 + bl OS_GetArenaHi + mov r2, r0 + mov r0, r4 + mov r1, #0 + sub r2, r2, r4 + bl MI_CpuFill8 + mov r0, #8 + mov r1, r4 + bl OS_SetArenaLo + mov r0, #8 + bl OS_GetArenaHi + mov r4, r0 + mov r0, #8 + bl OS_GetArenaLo + mov r1, r0 + mov r0, #8 + mov r2, r4 + bl OS_CreateHeap + movs r4, r0 + bpl _037F8438 + bl FUN_037FB1F0 +_037F8438: + mov r0, #8 + mov r1, r4 + bl OS_SetCurrentHeap + mov r0, #8 + mov r1, r4 + bl OS_CheckHeap + cmp r0, #8448 ; 0x2100 + bcs _037F845C + bl FUN_037FB1F0 +_037F845C: + mov r0, r4 + ldmia sp!, {r4, lr} + bx lr + + arm_func_start NitroSpMain +NitroSpMain: ; 0x037F8468 + stmdb sp!, {r4, lr} + bl WVR_ShelterExtWram + bl OS_Init + bl OS_InitThread + bl FUN_037F8228 + bl PXI_Init + bl FUN_037F83B0 + mov r4, r0 + mov r0, #6 + bl SND_Init + bl PAD_InitXYButton + mov r0, #1 + ldr r1, _037F8524 ; =FUN_037F8000 + bl OS_SetIrqFunction + mov r0, #1 + bl OS_EnableIrqMask + ldr r1, _037F8528 ; =0x04000004 + ldrh r0, [r1] + ldrh r0, [r1] + orr r0, r0, #8 + strh r0, [r1] + ldr r1, _037F852C ; =0x04000208 + ldrh r0, [r1] + mov r0, #1 + strh r0, [r1] + bl OS_EnableInterrupts + mvn r0, #0 + bl FS_Init + mov r0, #15 + bl CARD_SetThreadPriority + mov r0, #12 + bl RTC_Init + mov r0, r4 + bl WVR_Init + mov r0, #2 + bl SPI_Init + mov r4, #0 +_037F84FC: + bl FUN_037F8530 + bl OS_IsResetOccurred + cmp r0, #0 + beq _037F8518 + mov r0, r4 + bl CTRDG_VibPulseEdgeUpdate + bl OS_ResetSystem +_037F8518: + bl CTRDG_CheckPullOut_Polling + bl CARD_CheckPullOut_Polling + b _037F84FC +_037F8524: .word FUN_037F8000 +_037F8528: .word 0x04000004 +_037F852C: .word 0x04000208 + + arm_func_start FUN_037F8530 +FUN_037F8530: ; 0x037F8530 + ldr ip, _037F8538 ; =SVC_Halt + bx ip +_037F8538: .word SVC_Halt diff --git a/arm7/global.inc b/arm7/global.inc index f80ee571..e14b3ae6 100644 --- a/arm7/global.inc +++ b/arm7/global.inc @@ -15,6 +15,7 @@ ; .dtcm
.extern OS_IrqHandler_ThreadSwitch
+.extern OSi_EnterTimerCallback
.extern OSi_IrqVBlank
.extern OSi_IrqTimer3
.extern OSi_IrqTimer2
@@ -24,9 +25,33 @@ .extern OSi_IrqDma2
.extern OSi_IrqDma1
.extern OSi_IrqDma0
+.extern OSi_RemoveMutexLinkFromQueue
+.extern OSi_UnlockAllMutex
.extern OS_IrqDummy
+.extern OS_CheckHeap
+.extern OS_CreateHeap
+.extern OS_CreateHeap
+.extern OS_DisableInterrupts_IrqAndFiq
.extern OS_DisableIrqMask
+.extern OS_EnableInterrupts
.extern OS_EnableIrqMask
+.extern OS_GetArenaHi
+.extern OS_GetArenaLo
+.extern OS_GetProcMode
+.extern OS_Init
+.extern OS_InitAlloc
+.extern OS_InitContext
+.extern OS_InitIrqTable
+.extern OS_InitLock
+.extern OS_InitThread
+.extern OS_IsResetOccurred
+.extern OS_LoadContext
+.extern OS_ResetRequestIrqMask
+.extern OS_ResetSystem
+.extern OS_RestoreInterrupts_IrqAndFiq
+.extern OS_SaveContext
+.extern OS_SetArenaLo
+.extern OS_SetCurrentHeap
.extern OS_SetIrqMask
.extern OS_SetIrqFunction
.extern OS_UnLockCartridge
@@ -36,6 +61,8 @@ .extern OS_TryLockCartridge
.extern OS_UnlockCartridge
.extern OS_LockCartridge
+.extern FUN_037F8000
+.extern FUN_037F8530
.extern FUN_037F8CB4
.extern OS_Sleep
.extern OS_WakeupThreadDirect
@@ -69,6 +96,7 @@ .extern MIi_CpuClearFast
.extern MIi_CpuCopyFast
.extern MI_CpuFill8
+.extern MI_SwapWord
.extern PXI_Init
.extern PXI_SendWordByFifo
.extern PXI_SetFifoRecvCallback
@@ -76,6 +104,7 @@ .extern EXIi_SetBitRcnt0L
.extern SND_EndSleep
.extern SND_BeginSleep
+.extern SND_Init
.extern SPI_Init
.extern PMi_ResetControl
.extern PMi_SetControl
@@ -177,6 +206,8 @@ .extern sMasterPan
.extern _03807660
.extern cardi_rom_header_addr
+.extern CARD_CheckPullOut_Polling
+.extern CARD_SetThreadPriority
.extern _03807668
.extern _0380766C
.extern PMi_LEDStatus
@@ -218,6 +249,7 @@ .extern _03807954
.extern _03807958
.extern _0380795C
+.extern PAD_InitXYButton
.extern PADi_XYButtonAvailable
.extern _038079E0
.extern sSurroundDecay
@@ -295,6 +327,7 @@ .extern _0380A4A4
.extern _0380AA64
.extern _0380B064
+.extern FS_Init
; .ext
.extern WMSP_GetIndicateThread
|