summaryrefslogtreecommitdiff
path: root/arm7/asm/OS_message.s
diff options
context:
space:
mode:
Diffstat (limited to 'arm7/asm/OS_message.s')
-rw-r--r--arm7/asm/OS_message.s147
1 files changed, 147 insertions, 0 deletions
diff --git a/arm7/asm/OS_message.s b/arm7/asm/OS_message.s
new file mode 100644
index 00000000..ade175de
--- /dev/null
+++ b/arm7/asm/OS_message.s
@@ -0,0 +1,147 @@
+ .include "asm/macros.inc"
+ .include "global.inc"
+
+ .text
+
+ arm_func_start OS_ReadMessage
+OS_ReadMessage: ; 0x037F980C
+ stmdb sp!, {r4, r5, r6, r7, r8, lr}
+ mov r6, r0
+ mov r5, r1
+ mov r7, r2
+ bl OS_DisableInterrupts
+ mov r4, r0
+ and r8, r7, #1
+ add r7, r6, #8
+ b _037F9850
+_037F9830:
+ cmp r8, #0
+ bne _037F9848
+ mov r0, r4
+ bl OS_RestoreInterrupts
+ mov r0, #0
+ b _037F987C
+_037F9848:
+ mov r0, r7
+ bl OS_SleepThread
+_037F9850:
+ ldr r0, [r6, #28]
+ cmp r0, #0
+ beq _037F9830
+ cmp r5, #0
+ ldrne r1, [r6, #16]
+ ldrne r0, [r6, #24]
+ ldrne r0, [r1, r0, lsl #2]
+ strne r0, [r5]
+ mov r0, r4
+ bl OS_RestoreInterrupts
+ mov r0, #1
+_037F987C:
+ ldmia sp!, {r4, r5, r6, r7, r8, lr}
+ bx lr
+
+ arm_func_start OS_ReceiveMessage
+OS_ReceiveMessage: ; 0x037F9884
+ stmdb sp!, {r4, r5, r6, r7, r8, lr}
+ mov r6, r0
+ mov r5, r1
+ mov r7, r2
+ bl OS_DisableInterrupts
+ mov r4, r0
+ and r8, r7, #1
+ add r7, r6, #8
+ b _037F98C8
+_037F98A8:
+ cmp r8, #0
+ bne _037F98C0
+ mov r0, r4
+ bl OS_RestoreInterrupts
+ mov r0, #0
+ b _037F991C
+_037F98C0:
+ mov r0, r7
+ bl OS_SleepThread
+_037F98C8:
+ ldr r0, [r6, #28]
+ cmp r0, #0
+ beq _037F98A8
+ cmp r5, #0
+ ldrne r1, [r6, #16]
+ ldrne r0, [r6, #24]
+ ldrne r0, [r1, r0, lsl #2]
+ strne r0, [r5]
+ ldr r0, [r6, #24]
+ add r0, r0, #1
+ ldr r1, [r6, #20]
+ bl _s32_div_f
+ str r1, [r6, #24]
+ ldr r0, [r6, #28]
+ sub r0, r0, #1
+ str r0, [r6, #28]
+ mov r0, r6
+ bl OS_WakeupThread
+ mov r0, r4
+ bl OS_RestoreInterrupts
+ mov r0, #1
+_037F991C:
+ ldmia sp!, {r4, r5, r6, r7, r8, lr}
+ bx lr
+
+ arm_func_start OS_SendMessage
+OS_SendMessage: ; 0x037F9924
+ stmdb sp!, {r4, r5, r6, r7, lr}
+ sub sp, sp, #4
+ mov r6, r0
+ mov r5, r1
+ mov r7, r2
+ bl OS_DisableInterrupts
+ mov r4, r0
+ and r7, r7, #1
+ b _037F9968
+_037F9948:
+ cmp r7, #0
+ bne _037F9960
+ mov r0, r4
+ bl OS_RestoreInterrupts
+ mov r0, #0
+ b _037F99AC
+_037F9960:
+ mov r0, r6
+ bl OS_SleepThread
+_037F9968:
+ ldr r2, [r6, #28]
+ ldr r1, [r6, #20]
+ cmp r1, r2
+ ble _037F9948
+ ldr r0, [r6, #24]
+ add r0, r0, r2
+ bl _s32_div_f
+ ldr r0, [r6, #16]
+ str r5, [r0, r1, lsl #2]
+ ldr r0, [r6, #28]
+ add r0, r0, #1
+ str r0, [r6, #28]
+ add r0, r6, #8
+ bl OS_WakeupThread
+ mov r0, r4
+ bl OS_RestoreInterrupts
+ mov r0, #1
+_037F99AC:
+ add sp, sp, #4
+ ldmia sp!, {r4, r5, r6, r7, lr}
+ bx lr
+
+ arm_func_start OS_InitMessageQueue
+OS_InitMessageQueue: ; 0x037F99B8
+ mov ip, #0
+ str ip, [r0, #4]
+ ldr r3, [r0, #4]
+ str r3, [r0]
+ str ip, [r0, #12]
+ ldr r3, [r0, #12]
+ str r3, [r0, #8]
+ str r1, [r0, #16]
+ str r2, [r0, #20]
+ str ip, [r0, #24]
+ str ip, [r0, #28]
+ bx lr