Files
pokediamond/arm9/asm/OS_mutex.s
2020-04-29 02:41:21 +01:00

171 lines
3.0 KiB
ArmAsm

.include "asm/macros.inc"
.include "global.inc"
.text
arm_func_start OSi_DequeueItem
OSi_DequeueItem: ; 0x020CBE9C
ldr r2, [r1, #0x10]
ldr r1, [r1, #0x14]
cmp r2, #0x0
streq r1, [r0, #0x8c]
strne r1, [r2, #0x14]
cmp r1, #0x0
streq r2, [r0, #0x88]
strne r2, [r1, #0x10]
bx lr
arm_func_start OSi_EnqueueTail
OSi_EnqueueTail: ; 0x020CBEC0
ldr r2, [r0, #0x8c]
cmp r2, #0x0
streq r1, [r0, #0x88]
strne r1, [r2, #0x10]
str r2, [r1, #0x14]
mov r2, #0x0
str r2, [r1, #0x10]
str r1, [r0, #0x8c]
bx lr
arm_func_start OS_TryLockMutex
OS_TryLockMutex: ; 0x020CBEE4
stmdb sp!, {r4-r6,lr}
mov r5, r0
bl OS_DisableInterrupts
ldr r2, [r5, #0x8]
ldr r1, _020CBF54 ; =OSi_ThreadInfo
mov r4, r0
cmp r2, #0x0
ldr r0, [r1, #0x4]
bne _020CBF28
str r0, [r5, #0x8]
ldr r2, [r5, #0xc]
mov r1, r5
add r2, r2, #0x1
str r2, [r5, #0xc]
bl OSi_EnqueueTail
mov r6, #0x1
b _020CBF40
_020CBF28:
cmp r2, r0
ldreq r0, [r5, #0xc]
moveq r6, #0x1
addeq r0, r0, #0x1
streq r0, [r5, #0xc]
movne r6, #0x0
_020CBF40:
mov r0, r4
bl OS_RestoreInterrupts
mov r0, r6
ldmia sp!, {r4-r6,lr}
bx lr
.balign 4
_020CBF54: .word OSi_ThreadInfo
arm_func_start OSi_UnlockAllMutex
OSi_UnlockAllMutex: ; 0x020CBF58
stmdb sp!, {r4-r6,lr}
mov r6, r0
ldr r0, [r6, #0x88]
cmp r0, #0x0
ldmeqia sp!, {r4-r6,lr}
bxeq lr
add r5, r6, #0x88
mov r4, #0x0
_020CBF78:
mov r0, r5
bl OSi_RemoveMutexLinkFromQueue
str r4, [r0, #0xc]
str r4, [r0, #0x8]
bl OS_WakeupThread
ldr r0, [r6, #0x88]
cmp r0, #0x0
bne _020CBF78
ldmia sp!, {r4-r6,lr}
bx lr
arm_func_start OS_UnlockMutex
OS_UnlockMutex: ; 0x020CBFA0
stmdb sp!, {r4-r5,lr}
sub sp, sp, #0x4
mov r5, r0
bl OS_DisableInterrupts
ldr r1, _020CC00C ; =OSi_ThreadInfo
mov r4, r0
ldr r0, [r1, #0x4]
ldr r1, [r5, #0x8]
cmp r1, r0
bne _020CBFF8
ldr r1, [r5, #0xc]
sub r1, r1, #0x1
str r1, [r5, #0xc]
ldr r1, [r5, #0xc]
cmp r1, #0x0
bne _020CBFF8
mov r1, r5
bl OSi_DequeueItem
mov r1, #0x0
mov r0, r5
str r1, [r5, #0x8]
bl OS_WakeupThread
_020CBFF8:
mov r0, r4
bl OS_RestoreInterrupts
add sp, sp, #0x4
ldmia sp!, {r4-r5,lr}
bx lr
.balign 4
_020CC00C: .word OSi_ThreadInfo
arm_func_start OS_LockMutex
OS_LockMutex: ; 0x020CC010
stmdb sp!, {r4-r7,lr}
sub sp, sp, #0x4
mov r5, r0
bl OS_DisableInterrupts
ldr r1, _020CC098 ; =OSi_ThreadInfo
mov r4, r0
ldr r7, [r1, #0x4]
mov r6, #0x0
_020CC030:
ldr r0, [r5, #0x8]
cmp r0, #0x0
bne _020CC05C
str r7, [r5, #0x8]
ldr r1, [r5, #0xc]
mov r0, r7
add r2, r1, #0x1
mov r1, r5
str r2, [r5, #0xc]
bl OSi_EnqueueTail
b _020CC084
_020CC05C:
cmp r0, r7
ldreq r0, [r5, #0xc]
addeq r0, r0, #0x1
streq r0, [r5, #0xc]
beq _020CC084
mov r0, r5
str r5, [r7, #0x84]
bl OS_SleepThread
str r6, [r7, #0x84]
b _020CC030
_020CC084:
mov r0, r4
bl OS_RestoreInterrupts
add sp, sp, #0x4
ldmia sp!, {r4-r7,lr}
bx lr
.balign 4
_020CC098: .word OSi_ThreadInfo
arm_func_start OS_InitMutex
OS_InitMutex: ; 0x020CC09C
mov r2, #0x0
str r2, [r0, #0x4]
ldr r1, [r0, #0x4]
str r1, [r0, #0x0]
str r2, [r0, #0x8]
str r2, [r0, #0xc]
bx lr