diff options
Diffstat (limited to 'arm7/asm/OS_thread.s')
-rw-r--r-- | arm7/asm/OS_thread.s | 767 |
1 files changed, 767 insertions, 0 deletions
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 |