pokediamond/arm7/asm/OS_thread.s
2020-06-09 02:15:17 +01:00

810 lines
16 KiB
ArmAsm

.include "asm/macros.inc"
.include "global.inc"
.section .bss
.global OSi_StackForDestructor
OSi_StackForDestructor: ;0x03807784
.space 0x03807788 - 0x03807784
.global OSi_RescheduleCount
OSi_RescheduleCount: ;0x03807788
.space 0x0380778C - 0x03807788
.global _0380778C
_0380778C: ;0x0380778C
.space 0x03807790 - 0x0380778C
.global OSi_SystemCallbackInSwitchThread
OSi_SystemCallbackInSwitchThread: ;0x03807790
.space 0x03807794 - 0x03807790
.global OSi_CurrentThreadPtr
OSi_CurrentThreadPtr: ;0x03807794
.space 0x03807798 - 0x03807794
.global OSi_IsThreadInitialized
OSi_IsThreadInitialized: ;0x03807798
.space 0x0380779C - 0x03807798
.global OSi_ThreadInfo
OSi_ThreadInfo: ;0x0380779C
.space 0x038077A0 - 0x0380779C
.global _038077A0
_038077A0: ;0x038077A0
.space 0x038077AC - 0x038077A0
.global OSi_IdleThread
OSi_IdleThread: ;0x038077AC
.space 0x03807850 - 0x038077AC
.global OSi_LauncherThread
OSi_LauncherThread: ;0x03807850
.space 0x038078F4 - 0x03807850
.section .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 OS_Terminate
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