summaryrefslogtreecommitdiff
path: root/arm9/asm/OS_mutex.s
diff options
context:
space:
mode:
Diffstat (limited to 'arm9/asm/OS_mutex.s')
-rw-r--r--arm9/asm/OS_mutex.s170
1 files changed, 170 insertions, 0 deletions
diff --git a/arm9/asm/OS_mutex.s b/arm9/asm/OS_mutex.s
new file mode 100644
index 00000000..0970a10d
--- /dev/null
+++ b/arm9/asm/OS_mutex.s
@@ -0,0 +1,170 @@
+ .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