mirror of
https://github.com/pret/pmd-sky.git
synced 2026-08-05 18:59:55 -05:00
930 lines
18 KiB
ArmAsm
930 lines
18 KiB
ArmAsm
.include "asm/macros.inc"
|
|
.include "include/os_thread.inc"
|
|
|
|
.text
|
|
|
|
arm_func_start IncrementThreadCount
|
|
IncrementThreadCount: ; 0x02079150
|
|
ldr r1, _02079164 ; =THREAD_INFO_STRUCT
|
|
ldr r0, [r1, #0x20]
|
|
add r0, r0, #1
|
|
str r0, [r1, #0x20]
|
|
bx lr
|
|
.align 2, 0
|
|
_02079164: .word THREAD_INFO_STRUCT
|
|
arm_func_end IncrementThreadCount
|
|
|
|
arm_func_start OSi_InsertLinkToQueue
|
|
OSi_InsertLinkToQueue: ; 0x02079168
|
|
ldr ip, [r0]
|
|
b _0207917C
|
|
_02079170:
|
|
cmp ip, r1
|
|
bxeq lr
|
|
ldr ip, [ip, #0x80]
|
|
_0207917C:
|
|
cmp ip, #0
|
|
beq _02079194
|
|
ldr r3, [ip, #0x70]
|
|
ldr r2, [r1, #0x70]
|
|
cmp r3, r2
|
|
bls _02079170
|
|
_02079194:
|
|
cmp ip, #0
|
|
bne _020791C0
|
|
ldr r2, [r0, #4]
|
|
cmp r2, #0
|
|
streq r1, [r0]
|
|
strne r1, [r2, #0x80]
|
|
str r2, [r1, #0x7c]
|
|
mov r2, #0
|
|
str r2, [r1, #0x80]
|
|
str r1, [r0, #4]
|
|
bx lr
|
|
_020791C0:
|
|
ldr r2, [ip, #0x7c]
|
|
cmp r2, #0
|
|
streq r1, [r0]
|
|
strne r1, [r2, #0x80]
|
|
str r2, [r1, #0x7c]
|
|
str ip, [r1, #0x80]
|
|
str r1, [ip, #0x7c]
|
|
bx lr
|
|
arm_func_end OSi_InsertLinkToQueue
|
|
|
|
arm_func_start OSi_RemoveLinkFromQueue
|
|
OSi_RemoveLinkFromQueue: ; 0x020791E0
|
|
ldr r2, [r0]
|
|
cmp r2, #0
|
|
beq _0207920C
|
|
ldr r1, [r2, #0x80]
|
|
str r1, [r0]
|
|
cmp r1, #0
|
|
movne r0, #0
|
|
strne r0, [r1, #0x7c]
|
|
moveq r1, #0
|
|
streq r1, [r0, #4]
|
|
streq r1, [r2, #0x78]
|
|
_0207920C:
|
|
mov r0, r2
|
|
bx lr
|
|
arm_func_end OSi_RemoveLinkFromQueue
|
|
|
|
arm_func_start OSi_RemoveSpecifiedLinkFromQueue
|
|
OSi_RemoveSpecifiedLinkFromQueue: ; 0x02079214
|
|
ldr ip, [r0]
|
|
mov r2, ip
|
|
cmp ip, #0
|
|
beq _02079260
|
|
_02079224:
|
|
cmp r2, r1
|
|
ldr r3, [r2, #0x80]
|
|
bne _02079254
|
|
cmp ip, r2
|
|
ldr ip, [r2, #0x7c]
|
|
streq r3, [r0]
|
|
strne r3, [ip, #0x80]
|
|
ldr r1, [r0, #4]
|
|
cmp r1, r2
|
|
streq ip, [r0, #4]
|
|
strne ip, [r3, #0x7c]
|
|
b _02079260
|
|
_02079254:
|
|
mov r2, r3
|
|
cmp r3, #0
|
|
bne _02079224
|
|
_02079260:
|
|
mov r0, r2
|
|
bx lr
|
|
arm_func_end OSi_RemoveSpecifiedLinkFromQueue
|
|
|
|
arm_func_start OSi_RemoveMutexLinkFromQueue
|
|
OSi_RemoveMutexLinkFromQueue: ; 0x02079268
|
|
ldr r2, [r0]
|
|
cmp r2, #0
|
|
beq _02079290
|
|
ldr r1, [r2, #0x10]
|
|
str r1, [r0]
|
|
cmp r1, #0
|
|
movne r0, #0
|
|
strne r0, [r1, #0x14]
|
|
moveq r1, #0
|
|
streq r1, [r0, #4]
|
|
_02079290:
|
|
mov r0, r2
|
|
bx lr
|
|
arm_func_end OSi_RemoveMutexLinkFromQueue
|
|
|
|
arm_func_start InsertThreadIntoList
|
|
InsertThreadIntoList: ; 0x02079298
|
|
stmdb sp!, {r3, lr}
|
|
ldr r1, _020792F4 ; =THREAD_INFO_STRUCT
|
|
mov ip, #0
|
|
ldr lr, [r1, #0x2c]
|
|
mov r3, lr
|
|
b _020792B8
|
|
_020792B0:
|
|
mov ip, r3
|
|
ldr r3, [r3, #0x68]
|
|
_020792B8:
|
|
cmp r3, #0
|
|
beq _020792D0
|
|
ldr r2, [r3, #0x70]
|
|
ldr r1, [r0, #0x70]
|
|
cmp r2, r1
|
|
blo _020792B0
|
|
_020792D0:
|
|
cmp ip, #0
|
|
ldrne r1, [ip, #0x68]
|
|
strne r1, [r0, #0x68]
|
|
strne r0, [ip, #0x68]
|
|
ldmneia sp!, {r3, pc}
|
|
ldr r1, _020792F4 ; =THREAD_INFO_STRUCT
|
|
str lr, [r0, #0x68]
|
|
str r0, [r1, #0x2c]
|
|
ldmia sp!, {r3, pc}
|
|
.align 2, 0
|
|
_020792F4: .word THREAD_INFO_STRUCT
|
|
arm_func_end InsertThreadIntoList
|
|
|
|
arm_func_start OSi_RemoveThreadFromList
|
|
OSi_RemoveThreadFromList: ; 0x020792F8
|
|
ldr r1, _0207933C ; =THREAD_INFO_STRUCT
|
|
mov r2, #0
|
|
ldr r1, [r1, #0x2c]
|
|
b _02079310
|
|
_02079308:
|
|
mov r2, r1
|
|
ldr r1, [r1, #0x68]
|
|
_02079310:
|
|
cmp r1, #0
|
|
cmpne r1, r0
|
|
bne _02079308
|
|
cmp r2, #0
|
|
ldrne r0, [r0, #0x68]
|
|
strne r0, [r2, #0x68]
|
|
bxne lr
|
|
ldr r1, [r0, #0x68]
|
|
ldr r0, _0207933C ; =THREAD_INFO_STRUCT
|
|
str r1, [r0, #0x2c]
|
|
bx lr
|
|
.align 2, 0
|
|
_0207933C: .word THREAD_INFO_STRUCT
|
|
arm_func_end OSi_RemoveThreadFromList
|
|
|
|
arm_func_start OS_RescheduleThread
|
|
OS_RescheduleThread: ; 0x02079340
|
|
stmdb sp!, {r4, r5, r6, lr}
|
|
ldr r0, _02079400 ; =THREAD_INFO_STRUCT
|
|
ldr r1, [r0, #4]
|
|
cmp r1, #0
|
|
ldmneia sp!, {r4, r5, r6, pc}
|
|
ldrh r0, [r0, #0x26]
|
|
ldr r4, _02079404 ; =OSi_ThreadInfo
|
|
cmp r0, #0
|
|
bne _02079370
|
|
bl GetProcessorMode
|
|
cmp r0, #0x12
|
|
bne _0207937C
|
|
_02079370:
|
|
mov r0, #1
|
|
strh r0, [r4]
|
|
ldmia sp!, {r4, r5, r6, pc}
|
|
_0207937C:
|
|
ldr r0, _02079400 ; =THREAD_INFO_STRUCT
|
|
ldr r0, [r0, #8]
|
|
ldr r6, [r0]
|
|
bl OS_SelectThread
|
|
mov r5, r0
|
|
cmp r6, r5
|
|
cmpne r5, #0
|
|
ldmeqia sp!, {r4, r5, r6, pc}
|
|
ldr r0, [r6, #0x64]
|
|
cmp r0, #2
|
|
beq _020793B8
|
|
mov r0, r6
|
|
bl OS_SaveContext
|
|
cmp r0, #0
|
|
ldmneia sp!, {r4, r5, r6, pc}
|
|
_020793B8:
|
|
ldr r0, _02079400 ; =THREAD_INFO_STRUCT
|
|
ldr r2, [r0]
|
|
cmp r2, #0
|
|
beq _020793D4
|
|
mov r0, r6
|
|
mov r1, r5
|
|
blx r2
|
|
_020793D4:
|
|
ldr r2, [r4, #0xc]
|
|
cmp r2, #0
|
|
beq _020793EC
|
|
mov r0, r6
|
|
mov r1, r5
|
|
blx r2
|
|
_020793EC:
|
|
ldr r1, _02079400 ; =THREAD_INFO_STRUCT
|
|
mov r0, r5
|
|
str r5, [r1, #0x28]
|
|
bl OS_LoadContext
|
|
ldmia sp!, {r4, r5, r6, pc}
|
|
.align 2, 0
|
|
_02079400: .word THREAD_INFO_STRUCT
|
|
_02079404: .word OSi_ThreadInfo
|
|
arm_func_end OS_RescheduleThread
|
|
|
|
arm_func_start OS_InitThread
|
|
OS_InitThread: ; 0x02079408
|
|
stmdb sp!, {r3, lr}
|
|
sub sp, sp, #8
|
|
ldr r0, _02079518 ; =THREAD_INFO_STRUCT
|
|
ldr r1, [r0, #0xc]
|
|
cmp r1, #0
|
|
addne sp, sp, #8
|
|
ldmneia sp!, {r3, pc}
|
|
mov r2, #1
|
|
ldr r1, _0207951C ; =_022B9670
|
|
str r2, [r0, #0xc]
|
|
str r1, [r0, #8]
|
|
mov r1, #0x10
|
|
str r1, [r0, #0x164]
|
|
mov r3, #0
|
|
str r3, [r0, #0x160]
|
|
str r2, [r0, #0x158]
|
|
str r3, [r0, #0x15c]
|
|
ldr r2, _02079520 ; =0x00000000
|
|
ldr r1, _02079524 ; =_022B973C
|
|
str r3, [r0, #0x168]
|
|
str r1, [r0, #0x2c]
|
|
str r1, [r0, #0x28]
|
|
cmp r2, #0
|
|
ldrle r0, _02079528 ; =SDK_SECTION_ARENA_DTCM_START
|
|
ble _0207947C
|
|
ldr r1, _0207952C ; =OS_IRQTable
|
|
ldr r0, _02079530 ; =0x00000800
|
|
add r1, r1, #0x3f80
|
|
sub r0, r1, r0
|
|
_0207947C:
|
|
ldr r1, _0207952C ; =OS_IRQTable
|
|
sub ip, r0, r2
|
|
add r2, r1, #0x3f80
|
|
ldr r0, _02079530 ; =0x00000800
|
|
ldr r1, _02079518 ; =THREAD_INFO_STRUCT
|
|
sub r3, r2, r0
|
|
str r3, [r1, #0x188]
|
|
str ip, [r1, #0x184]
|
|
mov r0, #0
|
|
ldr r2, _02079534 ; =0xFDDB597D
|
|
str r0, [r1, #0x18c]
|
|
str r2, [r3, #-4]
|
|
ldr r2, [r1, #0x184]
|
|
ldr ip, _02079538 ; =0x7BF9DD5B
|
|
ldr r3, _0207953C ; =OSi_ThreadInfo
|
|
str ip, [r2]
|
|
str r0, [r1, #0x194]
|
|
str r0, [r1, #0x190]
|
|
strh r0, [r1, #0x24]
|
|
ldr r2, _02079540 ; =0x027FFFA0
|
|
strh r0, [r1, #0x26]
|
|
str r3, [r2]
|
|
bl OS_SetSwitchThreadCallback
|
|
mov r2, #0xc8
|
|
str r2, [sp]
|
|
mov ip, #0x1f
|
|
ldr r0, _02079544 ; =_022B967C
|
|
ldr r1, _02079548 ; =_02079C04
|
|
ldr r3, _0207954C ; =OSi_Initialized
|
|
mov r2, #0
|
|
str ip, [sp, #4]
|
|
bl OS_CreateThread
|
|
ldr r0, _02079518 ; =THREAD_INFO_STRUCT
|
|
mov r1, #0x20
|
|
str r1, [r0, #0xa4]
|
|
mov r1, #1
|
|
str r1, [r0, #0x98]
|
|
add sp, sp, #8
|
|
ldmia sp!, {r3, pc}
|
|
.align 2, 0
|
|
_02079518: .word THREAD_INFO_STRUCT
|
|
_0207951C: .word _022B9670
|
|
_02079520: .word 0x00000000
|
|
_02079524: .word _022B973C
|
|
_02079528: .word SDK_SECTION_ARENA_DTCM_START
|
|
_0207952C: .word OS_IRQTable
|
|
_02079530: .word 0x00000800
|
|
_02079534: .word 0xFDDB597D
|
|
_02079538: .word 0x7BF9DD5B
|
|
_0207953C: .word OSi_ThreadInfo
|
|
_02079540: .word 0x027FFFA0
|
|
_02079544: .word _022B967C
|
|
_02079548: .word OSi_IdleThreadProc
|
|
_0207954C: .word OSi_Initialized
|
|
arm_func_end OS_InitThread
|
|
|
|
arm_func_start OS_IsThreadAvailable
|
|
OS_IsThreadAvailable: ; 0x02079550
|
|
ldr r0, _0207955C ; =OSi_IsThreadInitialized
|
|
ldr r0, [r0]
|
|
bx lr
|
|
.align 2, 0
|
|
_0207955C: .word OSi_IsThreadInitialized
|
|
arm_func_end OS_IsThreadAvailable
|
|
|
|
arm_func_start OS_CreateThread
|
|
OS_CreateThread: ; 0x02079560
|
|
stmdb sp!, {r4, r5, r6, r7, r8, lr}
|
|
mov r8, r0
|
|
mov r5, r1
|
|
mov r7, r2
|
|
mov r6, r3
|
|
bl EnableIrqFlag
|
|
mov r4, r0
|
|
bl IncrementThreadCount
|
|
ldr r2, [sp, #0x1c]
|
|
mov r1, #0
|
|
str r2, [r8, #0x70]
|
|
str r0, [r8, #0x6c]
|
|
str r1, [r8, #0x64]
|
|
mov r0, r8
|
|
str r1, [r8, #0x74]
|
|
bl InsertThreadIntoList
|
|
ldr r0, [sp, #0x18]
|
|
mov r1, r5
|
|
str r6, [r8, #0x94]
|
|
sub r5, r6, r0
|
|
sub r2, r6, #4
|
|
mov ip, #0
|
|
str r5, [r8, #0x90]
|
|
str ip, [r8, #0x98]
|
|
ldr r6, _02079650 ; =0xFDDB597D
|
|
ldr r0, [r8, #0x94]
|
|
ldr r3, _02079654 ; =0x7BF9DD5B
|
|
str r6, [r0, #-4]
|
|
ldr r0, [r8, #0x90]
|
|
str r3, [r0]
|
|
str ip, [r8, #0xa0]
|
|
mov r0, r8
|
|
str ip, [r8, #0x9c]
|
|
bl OS_InitContext
|
|
ldr r2, _02079658 ; =OS_ExitThread
|
|
str r7, [r8, #4]
|
|
str r2, [r8, #0x3c]
|
|
ldr r2, [sp, #0x18]
|
|
add r1, r5, #4
|
|
mov r0, #0
|
|
sub r2, r2, #8
|
|
bl MTi_CpuClear32
|
|
mov r1, #0
|
|
str r1, [r8, #0x84]
|
|
str r1, [r8, #0x88]
|
|
mov r0, r8
|
|
str r1, [r8, #0x8c]
|
|
bl OS_SetThreadDestructor
|
|
mov r0, #0
|
|
str r0, [r8, #0x78]
|
|
str r0, [r8, #0x80]
|
|
add r1, r8, #0xa4
|
|
mov r2, #0xc
|
|
str r0, [r8, #0x7c]
|
|
bl MTi_CpuClear32
|
|
mov r1, #0
|
|
mov r0, r4
|
|
str r1, [r8, #0xb0]
|
|
bl SetIrqFlag
|
|
ldmia sp!, {r4, r5, r6, r7, r8, pc}
|
|
.align 2, 0
|
|
_02079650: .word 0xFDDB597D
|
|
_02079654: .word 0x7BF9DD5B
|
|
_02079658: .word OS_ExitThread
|
|
arm_func_end OS_CreateThread
|
|
|
|
arm_func_start OS_ExitThread
|
|
OS_ExitThread: ; 0x0207965C
|
|
stmdb sp!, {r3, lr}
|
|
bl EnableIrqFlag
|
|
ldr r0, _02079678 ; =THREAD_INFO_STRUCT
|
|
mov r1, #0
|
|
ldr r0, [r0, #0x28]
|
|
bl OSi_ExitThread_ArgSpecified
|
|
ldmia sp!, {r3, pc}
|
|
.align 2, 0
|
|
_02079678: .word THREAD_INFO_STRUCT
|
|
arm_func_end OS_ExitThread
|
|
|
|
arm_func_start OSi_ExitThread_ArgSpecified
|
|
OSi_ExitThread_ArgSpecified: ; 0x0207967C
|
|
stmdb sp!, {r3, r4, r5, lr}
|
|
ldr r2, _020796D0 ; =THREAD_INFO_STRUCT
|
|
mov r5, r0
|
|
ldr r2, [r2, #0x1c]
|
|
mov r4, r1
|
|
cmp r2, #0
|
|
beq _020796C4
|
|
ldr r1, _020796D4 ; =OSi_ExitThread
|
|
bl OS_InitContext
|
|
str r4, [r5, #4]
|
|
ldr r1, [r5]
|
|
mov r0, r5
|
|
orr r1, r1, #0x80
|
|
str r1, [r5]
|
|
mov r1, #1
|
|
str r1, [r5, #0x64]
|
|
bl OS_LoadContext
|
|
ldmia sp!, {r3, r4, r5, pc}
|
|
_020796C4:
|
|
mov r0, r4
|
|
bl OSi_ExitThread
|
|
ldmia sp!, {r3, r4, r5, pc}
|
|
.align 2, 0
|
|
_020796D0: .word THREAD_INFO_STRUCT
|
|
_020796D4: .word OSi_ExitThread
|
|
arm_func_end OSi_ExitThread_ArgSpecified
|
|
|
|
arm_func_start OSi_ExitThread
|
|
OSi_ExitThread: ; 0x020796D8
|
|
stmdb sp!, {r3, lr}
|
|
ldr r1, _0207970C ; =THREAD_INFO_STRUCT
|
|
ldr r1, [r1, #8]
|
|
ldr r3, [r1]
|
|
ldr r2, [r3, #0xb4]
|
|
cmp r2, #0
|
|
beq _02079704
|
|
mov r1, #0
|
|
str r1, [r3, #0xb4]
|
|
blx r2
|
|
bl EnableIrqFlag
|
|
_02079704:
|
|
bl OSi_ExitThread_Destroy
|
|
ldmia sp!, {r3, pc}
|
|
.align 2, 0
|
|
_0207970C: .word THREAD_INFO_STRUCT
|
|
arm_func_end OSi_ExitThread
|
|
|
|
arm_func_start OSi_ExitThread_Destroy
|
|
OSi_ExitThread_Destroy: ; 0x02079710
|
|
stmdb sp!, {r4, lr}
|
|
ldr r0, _02079768 ; =THREAD_INFO_STRUCT
|
|
ldr r0, [r0, #8]
|
|
ldr r4, [r0]
|
|
bl OS_DisableScheduler
|
|
mov r0, r4
|
|
bl OSi_UnlockAllMutex
|
|
ldr r0, [r4, #0x78]
|
|
cmp r0, #0
|
|
beq _02079740
|
|
mov r1, r4
|
|
bl OSi_RemoveSpecifiedLinkFromQueue
|
|
_02079740:
|
|
mov r0, r4
|
|
bl OSi_RemoveThreadFromList
|
|
mov r1, #2
|
|
add r0, r4, #0x9c
|
|
str r1, [r4, #0x64]
|
|
bl OS_WakeupThread
|
|
bl OS_EnableScheduler
|
|
bl sub_02079990
|
|
bl WaitForever2
|
|
ldmia sp!, {r4, pc}
|
|
.align 2, 0
|
|
_02079768: .word THREAD_INFO_STRUCT
|
|
arm_func_end OSi_ExitThread_Destroy
|
|
|
|
arm_func_start OS_DestroyThread
|
|
OS_DestroyThread: ; 0x0207976C
|
|
stmdb sp!, {r3, r4, r5, lr}
|
|
mov r5, r0
|
|
bl EnableIrqFlag
|
|
ldr r1, _020797E4 ; =THREAD_INFO_STRUCT
|
|
mov r4, r0
|
|
ldr r0, [r1, #0x28]
|
|
cmp r0, r5
|
|
bne _02079790
|
|
bl OSi_ExitThread_Destroy
|
|
_02079790:
|
|
bl OS_DisableScheduler
|
|
mov r0, r5
|
|
bl OSi_UnlockAllMutex
|
|
mov r0, r5
|
|
bl OSi_CancelThreadAlarmForSleep
|
|
ldr r0, [r5, #0x78]
|
|
cmp r0, #0
|
|
beq _020797B8
|
|
mov r1, r5
|
|
bl OSi_RemoveSpecifiedLinkFromQueue
|
|
_020797B8:
|
|
mov r0, r5
|
|
bl OSi_RemoveThreadFromList
|
|
mov r1, #2
|
|
add r0, r5, #0x9c
|
|
str r1, [r5, #0x64]
|
|
bl OS_WakeupThread
|
|
bl OS_EnableScheduler
|
|
mov r0, r4
|
|
bl SetIrqFlag
|
|
bl sub_02079990
|
|
ldmia sp!, {r3, r4, r5, pc}
|
|
.align 2, 0
|
|
_020797E4: .word THREAD_INFO_STRUCT
|
|
arm_func_end OS_DestroyThread
|
|
|
|
arm_func_start OSi_CancelThreadAlarmForSleep
|
|
OSi_CancelThreadAlarmForSleep: ; 0x020797E8
|
|
stmdb sp!, {r3, lr}
|
|
ldr r0, [r0, #0xb0]
|
|
cmp r0, #0
|
|
ldmeqia sp!, {r3, pc}
|
|
bl OS_CancelAlarm
|
|
ldmia sp!, {r3, pc}
|
|
arm_func_end OSi_CancelThreadAlarmForSleep
|
|
|
|
arm_func_start OS_JoinThread
|
|
OS_JoinThread: ; 0x02079800
|
|
stmdb sp!, {r3, r4, r5, lr}
|
|
mov r5, r0
|
|
bl EnableIrqFlag
|
|
ldr r1, [r5, #0x64]
|
|
mov r4, r0
|
|
cmp r1, #2
|
|
beq _02079824
|
|
add r0, r5, #0x9c
|
|
bl OS_SleepThread
|
|
_02079824:
|
|
mov r0, r4
|
|
bl SetIrqFlag
|
|
ldmia sp!, {r3, r4, r5, pc}
|
|
arm_func_end OS_JoinThread
|
|
|
|
arm_func_start OS_IsThreadTerminated
|
|
OS_IsThreadTerminated: ; 0x02079830
|
|
ldr r0, [r0, #0x64]
|
|
cmp r0, #2
|
|
moveq r0, #1
|
|
movne r0, #0
|
|
bx lr
|
|
arm_func_end OS_IsThreadTerminated
|
|
|
|
arm_func_start OS_SleepThreadDirect
|
|
OS_SleepThreadDirect: ; 0x02079844
|
|
stmdb sp!, {r4, r5, r6, lr}
|
|
mov r5, r1
|
|
mov r6, r0
|
|
bl EnableIrqFlag
|
|
mov r4, r0
|
|
cmp r5, #0
|
|
beq _02079870
|
|
mov r0, r5
|
|
mov r1, r6
|
|
str r5, [r6, #0x78]
|
|
bl OSi_InsertLinkToQueue
|
|
_02079870:
|
|
mov r0, #0
|
|
str r0, [r6, #0x64]
|
|
bl OS_RescheduleThread
|
|
mov r0, r4
|
|
bl SetIrqFlag
|
|
ldmia sp!, {r4, r5, r6, pc}
|
|
arm_func_end OS_SleepThreadDirect
|
|
|
|
arm_func_start OS_SleepThread
|
|
OS_SleepThread: ; 0x02079888
|
|
stmdb sp!, {r4, r5, r6, lr}
|
|
mov r6, r0
|
|
bl EnableIrqFlag
|
|
ldr r1, _020798D4 ; =THREAD_INFO_STRUCT
|
|
mov r4, r0
|
|
ldr r0, [r1, #8]
|
|
cmp r6, #0
|
|
ldr r5, [r0]
|
|
beq _020798BC
|
|
mov r0, r6
|
|
mov r1, r5
|
|
str r6, [r5, #0x78]
|
|
bl OSi_InsertLinkToQueue
|
|
_020798BC:
|
|
mov r0, #0
|
|
str r0, [r5, #0x64]
|
|
bl OS_RescheduleThread
|
|
mov r0, r4
|
|
bl SetIrqFlag
|
|
ldmia sp!, {r4, r5, r6, pc}
|
|
.align 2, 0
|
|
_020798D4: .word THREAD_INFO_STRUCT
|
|
arm_func_end OS_SleepThread
|
|
|
|
arm_func_start OS_WakeupThread
|
|
OS_WakeupThread: ; 0x020798D8
|
|
stmdb sp!, {r3, r4, r5, r6, r7, lr}
|
|
mov r7, r0
|
|
bl EnableIrqFlag
|
|
ldr r1, [r7]
|
|
mov r6, r0
|
|
cmp r1, #0
|
|
beq _02079934
|
|
beq _02079924
|
|
mov r5, #1
|
|
mov r4, #0
|
|
_02079900:
|
|
mov r0, r7
|
|
bl OSi_RemoveLinkFromQueue
|
|
str r5, [r0, #0x64]
|
|
str r4, [r0, #0x78]
|
|
str r4, [r0, #0x80]
|
|
str r4, [r0, #0x7c]
|
|
ldr r0, [r7]
|
|
cmp r0, #0
|
|
bne _02079900
|
|
_02079924:
|
|
mov r0, #0
|
|
str r0, [r7, #4]
|
|
str r0, [r7]
|
|
bl OS_RescheduleThread
|
|
_02079934:
|
|
mov r0, r6
|
|
bl SetIrqFlag
|
|
ldmia sp!, {r3, r4, r5, r6, r7, pc}
|
|
arm_func_end OS_WakeupThread
|
|
|
|
arm_func_start OS_WakeupThreadDirect
|
|
OS_WakeupThreadDirect: ; 0x02079940
|
|
stmdb sp!, {r3, r4, r5, lr}
|
|
mov r5, r0
|
|
bl EnableIrqFlag
|
|
mov r1, #1
|
|
mov r4, r0
|
|
str r1, [r5, #0x64]
|
|
bl OS_RescheduleThread
|
|
mov r0, r4
|
|
bl SetIrqFlag
|
|
ldmia sp!, {r3, r4, r5, pc}
|
|
arm_func_end OS_WakeupThreadDirect
|
|
|
|
arm_func_start OS_SelectThread
|
|
OS_SelectThread: ; 0x02079968
|
|
ldr r0, _0207998C ; =THREAD_INFO_STRUCT
|
|
ldr r0, [r0, #0x2c]
|
|
b _02079978
|
|
_02079974:
|
|
ldr r0, [r0, #0x68]
|
|
_02079978:
|
|
cmp r0, #0
|
|
ldrne r1, [r0, #0x64]
|
|
cmpne r1, #1
|
|
bne _02079974
|
|
bx lr
|
|
.align 2, 0
|
|
_0207998C: .word THREAD_INFO_STRUCT
|
|
arm_func_end OS_SelectThread
|
|
|
|
arm_func_start sub_02079990
|
|
sub_02079990: ; 0x02079990
|
|
stmdb sp!, {r4, lr}
|
|
bl EnableIrqFlag
|
|
mov r4, r0
|
|
bl OS_RescheduleThread
|
|
mov r0, r4
|
|
bl SetIrqFlag
|
|
ldmia sp!, {r4, pc}
|
|
arm_func_end sub_02079990
|
|
|
|
arm_func_start OS_YieldThread
|
|
OS_YieldThread: ; 0x020799AC
|
|
stmdb sp!, {r4, r5, r6, r7, r8, lr}
|
|
ldr r0, _02079A60 ; =THREAD_INFO_STRUCT
|
|
mov r4, #0
|
|
mov r5, r4
|
|
mov r6, r4
|
|
ldr r8, [r0, #0x28]
|
|
bl EnableIrqFlag
|
|
ldr r1, _02079A60 ; =THREAD_INFO_STRUCT
|
|
mov r7, r0
|
|
ldr r1, [r1, #0x2c]
|
|
mov r0, r4
|
|
cmp r1, #0
|
|
beq _02079A0C
|
|
ldr r2, [r8, #0x70]
|
|
_020799E4:
|
|
cmp r1, r8
|
|
moveq r4, r0
|
|
ldr r0, [r1, #0x70]
|
|
cmp r2, r0
|
|
moveq r5, r1
|
|
mov r0, r1
|
|
ldr r1, [r1, #0x68]
|
|
addeq r6, r6, #1
|
|
cmp r1, #0
|
|
bne _020799E4
|
|
_02079A0C:
|
|
cmp r6, #1
|
|
ble _02079A1C
|
|
cmp r5, r8
|
|
bne _02079A28
|
|
_02079A1C:
|
|
mov r0, r7
|
|
bl SetIrqFlag
|
|
ldmia sp!, {r4, r5, r6, r7, r8, pc}
|
|
_02079A28:
|
|
cmp r4, #0
|
|
ldrne r0, [r8, #0x68]
|
|
strne r0, [r4, #0x68]
|
|
bne _02079A44
|
|
ldr r1, [r8, #0x68]
|
|
ldr r0, _02079A60 ; =THREAD_INFO_STRUCT
|
|
str r1, [r0, #0x2c]
|
|
_02079A44:
|
|
ldr r0, [r5, #0x68]
|
|
str r0, [r8, #0x68]
|
|
str r8, [r5, #0x68]
|
|
bl OS_RescheduleThread
|
|
mov r0, r7
|
|
bl SetIrqFlag
|
|
ldmia sp!, {r4, r5, r6, r7, r8, pc}
|
|
.align 2, 0
|
|
_02079A60: .word THREAD_INFO_STRUCT
|
|
arm_func_end OS_YieldThread
|
|
|
|
arm_func_start OS_SetThreadPriority
|
|
OS_SetThreadPriority: ; 0x02079A64
|
|
stmdb sp!, {r4, r5, r6, r7, r8, lr}
|
|
ldr r2, _02079B04 ; =THREAD_INFO_STRUCT
|
|
mov r7, r0
|
|
mov r6, r1
|
|
ldr r8, [r2, #0x2c]
|
|
mov r4, #0
|
|
bl EnableIrqFlag
|
|
mov r5, r0
|
|
b _02079A90
|
|
_02079A88:
|
|
mov r4, r8
|
|
ldr r8, [r8, #0x68]
|
|
_02079A90:
|
|
cmp r8, #0
|
|
cmpne r8, r7
|
|
bne _02079A88
|
|
cmp r8, #0
|
|
ldrne r0, _02079B08 ; =_022B967C
|
|
cmpne r8, r0
|
|
bne _02079ABC
|
|
mov r0, r5
|
|
bl SetIrqFlag
|
|
mov r0, #0
|
|
ldmia sp!, {r4, r5, r6, r7, r8, pc}
|
|
_02079ABC:
|
|
ldr r0, [r8, #0x70]
|
|
cmp r0, r6
|
|
beq _02079AF4
|
|
cmp r4, #0
|
|
ldrne r0, [r7, #0x68]
|
|
strne r0, [r4, #0x68]
|
|
bne _02079AE4
|
|
ldr r1, [r7, #0x68]
|
|
ldr r0, _02079B04 ; =THREAD_INFO_STRUCT
|
|
str r1, [r0, #0x2c]
|
|
_02079AE4:
|
|
mov r0, r7
|
|
str r6, [r7, #0x70]
|
|
bl InsertThreadIntoList
|
|
bl OS_RescheduleThread
|
|
_02079AF4:
|
|
mov r0, r5
|
|
bl SetIrqFlag
|
|
mov r0, #1
|
|
ldmia sp!, {r4, r5, r6, r7, r8, pc}
|
|
.align 2, 0
|
|
_02079B04: .word THREAD_INFO_STRUCT
|
|
_02079B08: .word _022B967C
|
|
arm_func_end OS_SetThreadPriority
|
|
|
|
arm_func_start OS_GetThreadPriority
|
|
OS_GetThreadPriority: ; 0x02079B0C
|
|
ldr r0, [r0, #0x70]
|
|
bx lr
|
|
arm_func_end OS_GetThreadPriority
|
|
|
|
arm_func_start OS_Sleep
|
|
OS_Sleep: ; 0x02079B14
|
|
stmdb sp!, {r4, r5, lr}
|
|
sub sp, sp, #0x34
|
|
mov r4, r0
|
|
add r0, sp, #8
|
|
bl OS_CreateAlarm
|
|
ldr r0, _02079BB0 ; =THREAD_INFO_STRUCT
|
|
ldr r0, [r0, #8]
|
|
ldr r0, [r0]
|
|
str r0, [sp, #4]
|
|
bl EnableIrqFlag
|
|
ldr r1, _02079BB4 ; =0x000082EA
|
|
mov r2, #0
|
|
umull r5, r3, r4, r1
|
|
mla r3, r4, r2, r3
|
|
mla r3, r2, r1, r3
|
|
mov r1, r5, lsr #6
|
|
mov r4, r0
|
|
ldr r5, [sp, #4]
|
|
add r0, sp, #8
|
|
add r2, sp, #4
|
|
str r0, [r5, #0xb0]
|
|
str r2, [sp]
|
|
mov r2, r3, lsr #6
|
|
orr r1, r1, r3, lsl #26
|
|
ldr r3, _02079BB8 ; =OSi_SleepAlarmCallback
|
|
bl OS_SetAlarm
|
|
ldr r0, [sp, #4]
|
|
cmp r0, #0
|
|
beq _02079BA0
|
|
mov r5, #0
|
|
_02079B8C:
|
|
mov r0, r5
|
|
bl OS_SleepThread
|
|
ldr r0, [sp, #4]
|
|
cmp r0, #0
|
|
bne _02079B8C
|
|
_02079BA0:
|
|
mov r0, r4
|
|
bl SetIrqFlag
|
|
add sp, sp, #0x34
|
|
ldmia sp!, {r4, r5, pc}
|
|
.align 2, 0
|
|
_02079BB0: .word THREAD_INFO_STRUCT
|
|
_02079BB4: .word 0x000082EA
|
|
_02079BB8: .word OSi_SleepAlarmCallback
|
|
arm_func_end OS_Sleep
|
|
|
|
arm_func_start OSi_SleepAlarmCallback
|
|
OSi_SleepAlarmCallback: ; 0x02079BBC
|
|
ldr r2, [r0]
|
|
mov r1, #0
|
|
str r1, [r0]
|
|
ldr ip, _02079BD8 ; =OS_WakeupThreadDirect
|
|
mov r0, r2
|
|
str r1, [r2, #0xb0]
|
|
bx ip
|
|
.align 2, 0
|
|
_02079BD8: .word OS_WakeupThreadDirect
|
|
arm_func_end OSi_SleepAlarmCallback
|
|
|
|
arm_func_start OS_SetSwitchThreadCallback
|
|
OS_SetSwitchThreadCallback: ; 0x02079BDC
|
|
stmdb sp!, {r3, r4, r5, lr}
|
|
mov r5, r0
|
|
bl EnableIrqFlag
|
|
ldr r1, _02079C00 ; =THREAD_INFO_STRUCT
|
|
ldr r4, [r1, #0x30]
|
|
str r5, [r1, #0x30]
|
|
bl SetIrqFlag
|
|
mov r0, r4
|
|
ldmia sp!, {r3, r4, r5, pc}
|
|
.align 2, 0
|
|
_02079C00: .word THREAD_INFO_STRUCT
|
|
arm_func_end OS_SetSwitchThreadCallback
|
|
|
|
arm_func_start OSi_IdleThreadProc
|
|
OSi_IdleThreadProc: ; 0x02079C04
|
|
stmdb sp!, {r3, lr}
|
|
bl ClearIrqFlag
|
|
_02079C0C:
|
|
bl WaitForInterrupt
|
|
b _02079C0C
|
|
arm_func_end OSi_IdleThreadProc
|
|
|
|
arm_func_start OS_DisableScheduler
|
|
OS_DisableScheduler: ; 0x02079C14
|
|
stmdb sp!, {r4, lr}
|
|
bl EnableIrqFlag
|
|
ldr r2, _02079C44 ; =THREAD_INFO_STRUCT
|
|
mvn r1, #0
|
|
ldr r3, [r2, #4]
|
|
cmp r3, r1
|
|
addlo r1, r3, #1
|
|
movlo r4, r3
|
|
strlo r1, [r2, #4]
|
|
bl SetIrqFlag
|
|
mov r0, r4
|
|
ldmia sp!, {r4, pc}
|
|
.align 2, 0
|
|
_02079C44: .word THREAD_INFO_STRUCT
|
|
arm_func_end OS_DisableScheduler
|
|
|
|
arm_func_start OS_EnableScheduler
|
|
OS_EnableScheduler: ; 0x02079C48
|
|
stmdb sp!, {r4, lr}
|
|
bl EnableIrqFlag
|
|
ldr r1, _02079C78 ; =THREAD_INFO_STRUCT
|
|
mov r4, #0
|
|
ldr r3, [r1, #4]
|
|
cmp r3, #0
|
|
subne r2, r3, #1
|
|
movne r4, r3
|
|
strne r2, [r1, #4]
|
|
bl SetIrqFlag
|
|
mov r0, r4
|
|
ldmia sp!, {r4, pc}
|
|
.align 2, 0
|
|
_02079C78: .word THREAD_INFO_STRUCT
|
|
arm_func_end OS_EnableScheduler
|
|
|
|
arm_func_start OS_SetThreadDestructor
|
|
OS_SetThreadDestructor: ; 0x02079C7C
|
|
str r1, [r0, #0xb4]
|
|
bx lr
|
|
arm_func_end OS_SetThreadDestructor
|
|
|