mirror of
https://github.com/pret/pokediamond.git
synced 2026-08-09 04:06:10 -05:00
810 lines
16 KiB
ArmAsm
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
|