summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--arm7/arm7.lsf5
-rw-r--r--arm7/asm/OS_arena.s149
-rw-r--r--arm7/asm/OS_context.s65
-rw-r--r--arm7/asm/OS_init.s21
-rw-r--r--arm7/asm/OS_message.s147
-rw-r--r--arm7/asm/OS_mutex.s131
-rw-r--r--arm7/asm/dtcm.s493
-rw-r--r--arm7/global.inc2
8 files changed, 520 insertions, 493 deletions
diff --git a/arm7/arm7.lsf b/arm7/arm7.lsf
index 0f1a6724..3be0b734 100644
--- a/arm7/arm7.lsf
+++ b/arm7/arm7.lsf
@@ -20,6 +20,11 @@ Autoload WRAM
Object OS_interrupt.o
Object OS_spinLock.o
Object OS_thread.o
+ Object OS_context.o
+ Object OS_message.o
+ Object OS_mutex.o
+ Object OS_init.o
+ Object OS_arena.o
Object dtcm.o
Object libsyscall.o
Object dtcm2.o
diff --git a/arm7/asm/OS_arena.s b/arm7/asm/OS_arena.s
new file mode 100644
index 00000000..3b444cdd
--- /dev/null
+++ b/arm7/asm/OS_arena.s
@@ -0,0 +1,149 @@
+ .include "asm/macros.inc"
+ .include "global.inc"
+
+ .text
+
+ arm_func_start OS_SetArenaLo
+OS_SetArenaLo: ; 0x037F9BBC
+ mov r0, r0, lsl #2
+ add r0, r0, #40894464 ; 0x2700000
+ add r0, r0, #1044480 ; 0xff000
+ str r1, [r0, #3488] ; 0xda0
+ bx lr
+
+ arm_func_start OS_SetArenaHi
+OS_SetArenaHi: ; 0x037F9BD0
+ mov r0, r0, lsl #2
+ add r0, r0, #40894464 ; 0x2700000
+ add r0, r0, #1044480 ; 0xff000
+ str r1, [r0, #3524] ; 0xdc4
+ bx lr
+
+ arm_func_start OS_GetInitArenaLo
+OS_GetInitArenaLo: ; 0x037F9BE4
+ cmp r0, #1
+ beq _037F9C00
+ cmp r0, #7
+ beq _037F9C08
+ cmp r0, #8
+ beq _037F9C18
+ b _037F9C2C
+_037F9C00:
+ ldr r0, _037F9C34 ; =0x027FAFCC
+ bx lr
+_037F9C08:
+ ldr r0, _037F9C38 ; =0x0380B92C
+ cmp r0, #58720256 ; 0x03800000
+ movhi r0, #58720256 ; 0x03800000
+ bx lr
+_037F9C18:
+ mov r0, #58720256 ; 0x03800000
+ ldr r1, _037F9C38 ; =0x0380B92C
+ cmp r1, #58720256 ; 0x03800000
+ movhi r0, r1
+ bx lr
+_037F9C2C:
+ mov r0, #0
+ bx lr
+_037F9C34: .word 0x027FAFCC
+_037F9C38: .word 0x0380B92C
+
+ arm_func_start OS_GetInitArenaHi
+OS_GetInitArenaHi: ; 0x037F9C3C
+ cmp r0, #1
+ beq _037F9C58
+ cmp r0, #7
+ beq _037F9C60
+ cmp r0, #8
+ beq _037F9C68
+ b _037F9CA0
+_037F9C58:
+ ldr r0, _037F9CA8 ; =0x027FF000
+ bx lr
+_037F9C60:
+ mov r0, #58720256 ; 0x03800000
+ bx lr
+_037F9C68:
+ ldr r1, _037F9CAC ; =0x00000400
+ ldr r0, _037F9CB0 ; =0x0380FF80
+ sub r2, r0, r1
+ mov r0, #58720256 ; 0x03800000
+ ldr r1, _037F9CB4 ; =0x0380B92C
+ cmp r1, #58720256 ; 0x03800000
+ movhi r0, r1
+ ldr r1, _037F9CB8 ; =0x00000400
+ cmp r1, #0
+ bxeq lr
+ cmp r1, #0
+ sublt r0, r0, r1
+ subge r0, r2, r1
+ bx lr
+_037F9CA0:
+ mov r0, #0
+ bx lr
+_037F9CA8: .word 0x027FF000
+_037F9CAC: .word 0x00000400
+_037F9CB0: .word 0x0380FF80
+_037F9CB4: .word 0x0380B92C
+_037F9CB8: .word 0x00000400
+
+ arm_func_start OS_GetArenaLo
+OS_GetArenaLo: ; 0x037F9CBC
+ mov r0, r0, lsl #2
+ add r0, r0, #40894464 ; 0x2700000
+ add r0, r0, #1044480 ; 0xff000
+ ldr r0, [r0, #3488] ; 0xda0
+ bx lr
+
+ arm_func_start OS_GetArenaHi
+OS_GetArenaHi: ; 0x037F9CD0
+ mov r0, r0, lsl #2
+ add r0, r0, #40894464 ; 0x2700000
+ add r0, r0, #1044480 ; 0xff000
+ ldr r0, [r0, #3524] ; 0xdc4
+ bx lr
+
+ arm_func_start OS_InitArena
+OS_InitArena: ; 0x037F9CE4
+ stmfd sp!, {lr}
+ sub sp, sp, #4
+ ldr r1, _037F9D84 ; =_038078F4
+ ldr r0, [r1]
+ cmp r0, #0
+ bne _037F9D78
+ mov r0, #1
+ str r0, [r1]
+ bl OS_GetInitArenaHi
+ mov r1, r0
+ mov r0, #1
+ bl OS_SetArenaHi
+ mov r0, #1
+ bl OS_GetInitArenaLo
+ mov r1, r0
+ mov r0, #1
+ bl OS_SetArenaLo
+ mov r0, #7
+ bl OS_GetInitArenaHi
+ mov r1, r0
+ mov r0, #7
+ bl OS_SetArenaHi
+ mov r0, #7
+ bl OS_GetInitArenaLo
+ mov r1, r0
+ mov r0, #7
+ bl OS_SetArenaLo
+ mov r0, #8
+ bl OS_GetInitArenaHi
+ mov r1, r0
+ mov r0, #8
+ bl OS_SetArenaHi
+ mov r0, #8
+ bl OS_GetInitArenaLo
+ mov r1, r0
+ mov r0, #8
+ bl OS_SetArenaLo
+_037F9D78:
+ add sp, sp, #4
+ ldmia sp!, {lr}
+ bx lr
+_037F9D84: .word _038078F4
diff --git a/arm7/asm/OS_context.s b/arm7/asm/OS_context.s
new file mode 100644
index 00000000..21479b1f
--- /dev/null
+++ b/arm7/asm/OS_context.s
@@ -0,0 +1,65 @@
+ .include "asm/macros.inc"
+ .include "global.inc"
+
+ .text
+
+ arm_func_start OS_InitContext
+OS_InitContext: ; 0x037F9740
+ add r1, r1, #4
+ str r1, [r0, #64] ; 0x40
+ str r2, [r0, #68] ; 0x44
+ sub r2, r2, #64 ; 0x40
+ tst r2, #4
+ subne r2, r2, #4
+ str r2, [r0, #56] ; 0x38
+ ands r1, r1, #1
+ movne r1, #63 ; 0x3f
+ moveq r1, #31
+ str r1, [r0]
+ mov r1, #0
+ str r1, [r0, #4]
+ str r1, [r0, #8]
+ str r1, [r0, #12]
+ str r1, [r0, #16]
+ str r1, [r0, #20]
+ str r1, [r0, #24]
+ str r1, [r0, #28]
+ str r1, [r0, #32]
+ str r1, [r0, #36] ; 0x24
+ str r1, [r0, #40] ; 0x28
+ str r1, [r0, #44] ; 0x2c
+ str r1, [r0, #48] ; 0x30
+ str r1, [r0, #52] ; 0x34
+ str r1, [r0, #60] ; 0x3c
+ bx lr
+
+ arm_func_start OS_SaveContext
+OS_SaveContext: ; 0x037F97AC
+ add r1, r0, #0
+ mrs r2, CPSR
+ str r2, [r1], #4
+ mov r0, #211 ; 0xd3
+ msr CPSR_c, r0
+ str sp, [r1, #64] ; 0x40
+ msr CPSR_c, r2
+ mov r0, #1
+ stmia r1, {r0, r1, r2, r3, r4, r5, r6, r7, r8, r9, sl, fp, ip, sp, lr}
+ adr r0, _037F97E0
+ str r0, [r1, #60] ; 0x3c
+ mov r0, #0
+ bx lr
+
+ arm_func_start OS_LoadContext
+OS_LoadContext: ; 0x037F97E0
+_037F97E0: ; needed because otherwise it breaks
+ mrs r1, CPSR
+ bic r1, r1, #31
+ orr r1, r1, #211 ; 0xd3
+ msr CPSR_c, r1
+ ldr r1, [r0], #4
+ msr SPSR_fsxc, r1
+ ldr sp, [r0, #64] ; 0x40
+ ldr lr, [r0, #60] ; 0x3c
+ ldmia r0, {r0, r1, r2, r3, r4, r5, r6, r7, r8, r9, sl, fp, ip, sp, lr}^
+ nop ; (mov r0, r0)
+ subs pc, lr, #4
diff --git a/arm7/asm/OS_init.s b/arm7/asm/OS_init.s
new file mode 100644
index 00000000..d0e471bb
--- /dev/null
+++ b/arm7/asm/OS_init.s
@@ -0,0 +1,21 @@
+ .include "asm/macros.inc"
+ .include "global.inc"
+
+ .text
+
+ arm_func_start OS_Init
+OS_Init: ; 0x037F9B84
+ stmfd sp!, {lr}
+ sub sp, sp, #4
+ bl OS_InitArena
+ bl PXI_Init
+ bl OS_InitLock
+ bl OS_InitIrqTable
+ bl OS_InitTick
+ bl OS_InitAlarm
+ bl OS_InitThread
+ bl OS_InitReset
+ bl CTRDG_Init
+ add sp, sp, #4
+ ldmia sp!, {lr}
+ bx lr
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
diff --git a/arm7/asm/OS_mutex.s b/arm7/asm/OS_mutex.s
new file mode 100644
index 00000000..981842b8
--- /dev/null
+++ b/arm7/asm/OS_mutex.s
@@ -0,0 +1,131 @@
+ .include "asm/macros.inc"
+ .include "global.inc"
+
+ .text
+
+ arm_func_start OSi_DequeueItem
+OSi_DequeueItem: ; 0x037F99E8
+ ldr r2, [r1, #16]
+ ldr r1, [r1, #20]
+ cmp r2, #0
+ streq r1, [r0, #112] ; 0x70
+ strne r1, [r2, #20]
+ cmp r1, #0
+ streq r2, [r0, #108] ; 0x6c
+ strne r2, [r1, #16]
+ bx lr
+
+ arm_func_start OSi_EnqueueTail
+OSi_EnqueueTail: ; 0x037F9A0C
+ ldr r2, [r0, #112] ; 0x70
+ cmp r2, #0
+ streq r1, [r0, #108] ; 0x6c
+ strne r1, [r2, #16]
+ str r2, [r1, #20]
+ mov r2, #0
+ str r2, [r1, #16]
+ str r1, [r0, #112] ; 0x70
+ bx lr
+
+ arm_func_start OSi_UnlockAllMutex
+OSi_UnlockAllMutex: ; 0x037F9A30
+ stmdb sp!, {r4, r5, r6, lr}
+ mov r6, r0
+ add r5, r6, #108 ; 0x6c
+ mov r4, #0
+ b _037F9A58
+_037F9A44:
+ mov r0, r5
+ bl OSi_RemoveMutexLinkFromQueue
+ str r4, [r0, #12]
+ str r4, [r0, #8]
+ bl OS_WakeupThread
+_037F9A58:
+ ldr r0, [r6, #108] ; 0x6c
+ cmp r0, #0
+ bne _037F9A44
+ ldmia sp!, {r4, r5, r6, lr}
+ bx lr
+
+ arm_func_start OS_UnlockMutex
+OS_UnlockMutex: ; 0x037F9A6C
+ stmdb sp!, {r4, r5, lr}
+ sub sp, sp, #4
+ mov r5, r0
+ bl OS_DisableInterrupts
+ mov r4, r0
+ ldr r0, _037F9AD8 ; =OSi_ThreadInfo
+ ldr r0, [r0, #4]
+ ldr r1, [r5, #8]
+ cmp r1, r0
+ bne _037F9AC4
+ ldr r1, [r5, #12]
+ sub r1, r1, #1
+ str r1, [r5, #12]
+ ldr r1, [r5, #12]
+ cmp r1, #0
+ bne _037F9AC4
+ mov r1, r5
+ bl OSi_DequeueItem
+ mov r0, #0
+ str r0, [r5, #8]
+ mov r0, r5
+ bl OS_WakeupThread
+_037F9AC4:
+ mov r0, r4
+ bl OS_RestoreInterrupts
+ add sp, sp, #4
+ ldmia sp!, {r4, r5, lr}
+ bx lr
+_037F9AD8: .word OSi_ThreadInfo
+
+ arm_func_start OS_LockMutex
+OS_LockMutex: ; 0x037F9ADC
+ stmdb sp!, {r4, r5, r6, r7, lr}
+ sub sp, sp, #4
+ mov r5, r0
+ bl OS_DisableInterrupts
+ mov r4, r0
+ ldr r0, _037F9B64 ; =OSi_ThreadInfo
+ ldr r7, [r0, #4]
+ mov r6, #0
+_037F9AFC:
+ ldr r0, [r5, #8]
+ cmp r0, #0
+ bne _037F9B28
+ str r7, [r5, #8]
+ ldr r0, [r5, #12]
+ add r0, r0, #1
+ str r0, [r5, #12]
+ mov r0, r7
+ mov r1, r5
+ bl OSi_EnqueueTail
+ b _037F9B50
+_037F9B28:
+ cmp r0, r7
+ ldreq r0, [r5, #12]
+ addeq r0, r0, #1
+ streq r0, [r5, #12]
+ beq _037F9B50
+ str r5, [r7, #104] ; 0x68
+ mov r0, r5
+ bl OS_SleepThread
+ str r6, [r7, #104] ; 0x68
+ b _037F9AFC
+_037F9B50:
+ mov r0, r4
+ bl OS_RestoreInterrupts
+ add sp, sp, #4
+ ldmia sp!, {r4, r5, r6, r7, lr}
+ bx lr
+_037F9B64: .word OSi_ThreadInfo
+
+ arm_func_start OS_InitMutex
+OS_InitMutex: ; 0x037F9B68
+ mov r2, #0
+ str r2, [r0, #4]
+ ldr r1, [r0, #4]
+ str r1, [r0]
+ str r2, [r0, #8]
+ str r2, [r0, #12]
+ bx lr
diff --git a/arm7/asm/dtcm.s b/arm7/asm/dtcm.s
index 8f636027..a7b69b3e 100644
--- a/arm7/asm/dtcm.s
+++ b/arm7/asm/dtcm.s
@@ -2,499 +2,6 @@
.include "global.inc"
.section .text
- arm_func_start OS_InitContext
-OS_InitContext: ; 0x037F9740
- add r1, r1, #4
- str r1, [r0, #64] ; 0x40
- str r2, [r0, #68] ; 0x44
- sub r2, r2, #64 ; 0x40
- tst r2, #4
- subne r2, r2, #4
- str r2, [r0, #56] ; 0x38
- ands r1, r1, #1
- movne r1, #63 ; 0x3f
- moveq r1, #31
- str r1, [r0]
- mov r1, #0
- str r1, [r0, #4]
- str r1, [r0, #8]
- str r1, [r0, #12]
- str r1, [r0, #16]
- str r1, [r0, #20]
- str r1, [r0, #24]
- str r1, [r0, #28]
- str r1, [r0, #32]
- str r1, [r0, #36] ; 0x24
- str r1, [r0, #40] ; 0x28
- str r1, [r0, #44] ; 0x2c
- str r1, [r0, #48] ; 0x30
- str r1, [r0, #52] ; 0x34
- str r1, [r0, #60] ; 0x3c
- bx lr
-
- arm_func_start OS_SaveContext
-OS_SaveContext: ; 0x037F97AC
- add r1, r0, #0
- mrs r2, CPSR
- str r2, [r1], #4
- mov r0, #211 ; 0xd3
- msr CPSR_c, r0
- str sp, [r1, #64] ; 0x40
- msr CPSR_c, r2
- mov r0, #1
- stmia r1, {r0, r1, r2, r3, r4, r5, r6, r7, r8, r9, sl, fp, ip, sp, lr}
- adr r0, _037F97E0
- str r0, [r1, #60] ; 0x3c
- mov r0, #0
- bx lr
-
- arm_func_start OS_LoadContext
-OS_LoadContext: ; 0x037F97E0
-_037F97E0: ; needed because otherwise it breaks
- mrs r1, CPSR
- bic r1, r1, #31
- orr r1, r1, #211 ; 0xd3
- msr CPSR_c, r1
- ldr r1, [r0], #4
- msr SPSR_fsxc, r1
- ldr sp, [r0, #64] ; 0x40
- ldr lr, [r0, #60] ; 0x3c
- ldmia r0, {r0, r1, r2, r3, r4, r5, r6, r7, r8, r9, sl, fp, ip, sp, lr}^
- nop ; (mov r0, r0)
- subs pc, lr, #4
-
- 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
-
- arm_func_start OSi_DequeueItem
-OSi_DequeueItem: ; 0x037F99E8
- ldr r2, [r1, #16]
- ldr r1, [r1, #20]
- cmp r2, #0
- streq r1, [r0, #112] ; 0x70
- strne r1, [r2, #20]
- cmp r1, #0
- streq r2, [r0, #108] ; 0x6c
- strne r2, [r1, #16]
- bx lr
-
- arm_func_start OSi_EnqueueTail
-OSi_EnqueueTail: ; 0x037F9A0C
- ldr r2, [r0, #112] ; 0x70
- cmp r2, #0
- streq r1, [r0, #108] ; 0x6c
- strne r1, [r2, #16]
- str r2, [r1, #20]
- mov r2, #0
- str r2, [r1, #16]
- str r1, [r0, #112] ; 0x70
- bx lr
-
- arm_func_start OSi_UnlockAllMutex
-OSi_UnlockAllMutex: ; 0x037F9A30
- stmdb sp!, {r4, r5, r6, lr}
- mov r6, r0
- add r5, r6, #108 ; 0x6c
- mov r4, #0
- b _037F9A58
-_037F9A44:
- mov r0, r5
- bl OSi_RemoveMutexLinkFromQueue
- str r4, [r0, #12]
- str r4, [r0, #8]
- bl OS_WakeupThread
-_037F9A58:
- ldr r0, [r6, #108] ; 0x6c
- cmp r0, #0
- bne _037F9A44
- ldmia sp!, {r4, r5, r6, lr}
- bx lr
-
- arm_func_start OS_UnlockMutex
-OS_UnlockMutex: ; 0x037F9A6C
- stmdb sp!, {r4, r5, lr}
- sub sp, sp, #4
- mov r5, r0
- bl OS_DisableInterrupts
- mov r4, r0
- ldr r0, _037F9AD8 ; =OSi_ThreadInfo
- ldr r0, [r0, #4]
- ldr r1, [r5, #8]
- cmp r1, r0
- bne _037F9AC4
- ldr r1, [r5, #12]
- sub r1, r1, #1
- str r1, [r5, #12]
- ldr r1, [r5, #12]
- cmp r1, #0
- bne _037F9AC4
- mov r1, r5
- bl OSi_DequeueItem
- mov r0, #0
- str r0, [r5, #8]
- mov r0, r5
- bl OS_WakeupThread
-_037F9AC4:
- mov r0, r4
- bl OS_RestoreInterrupts
- add sp, sp, #4
- ldmia sp!, {r4, r5, lr}
- bx lr
-_037F9AD8: .word OSi_ThreadInfo
-
- arm_func_start OS_LockMutex
-OS_LockMutex: ; 0x037F9ADC
- stmdb sp!, {r4, r5, r6, r7, lr}
- sub sp, sp, #4
- mov r5, r0
- bl OS_DisableInterrupts
- mov r4, r0
- ldr r0, _037F9B64 ; =OSi_ThreadInfo
- ldr r7, [r0, #4]
- mov r6, #0
-_037F9AFC:
- ldr r0, [r5, #8]
- cmp r0, #0
- bne _037F9B28
- str r7, [r5, #8]
- ldr r0, [r5, #12]
- add r0, r0, #1
- str r0, [r5, #12]
- mov r0, r7
- mov r1, r5
- bl OSi_EnqueueTail
- b _037F9B50
-_037F9B28:
- cmp r0, r7
- ldreq r0, [r5, #12]
- addeq r0, r0, #1
- streq r0, [r5, #12]
- beq _037F9B50
- str r5, [r7, #104] ; 0x68
- mov r0, r5
- bl OS_SleepThread
- str r6, [r7, #104] ; 0x68
- b _037F9AFC
-_037F9B50:
- mov r0, r4
- bl OS_RestoreInterrupts
- add sp, sp, #4
- ldmia sp!, {r4, r5, r6, r7, lr}
- bx lr
-_037F9B64: .word OSi_ThreadInfo
-
- arm_func_start OS_InitMutex
-OS_InitMutex: ; 0x037F9B68
- mov r2, #0
- str r2, [r0, #4]
- ldr r1, [r0, #4]
- str r1, [r0]
- str r2, [r0, #8]
- str r2, [r0, #12]
- bx lr
-
- arm_func_start OS_Init
-OS_Init: ; 0x037F9B84
- stmfd sp!, {lr}
- sub sp, sp, #4
- bl OS_InitArena
- bl PXI_Init
- bl OS_InitLock
- bl OS_InitIrqTable
- bl OS_InitTick
- bl OS_InitAlarm
- bl OS_InitThread
- bl OS_InitReset
- bl CTRDG_Init
- add sp, sp, #4
- ldmia sp!, {lr}
- bx lr
-
- arm_func_start OS_SetArenaLo
-OS_SetArenaLo: ; 0x037F9BBC
- mov r0, r0, lsl #2
- add r0, r0, #40894464 ; 0x2700000
- add r0, r0, #1044480 ; 0xff000
- str r1, [r0, #3488] ; 0xda0
- bx lr
-
- arm_func_start OS_SetArenaHi
-OS_SetArenaHi: ; 0x037F9BD0
- mov r0, r0, lsl #2
- add r0, r0, #40894464 ; 0x2700000
- add r0, r0, #1044480 ; 0xff000
- str r1, [r0, #3524] ; 0xdc4
- bx lr
-
- arm_func_start OS_GetInitArenaLo
-OS_GetInitArenaLo: ; 0x037F9BE4
- cmp r0, #1
- beq _037F9C00
- cmp r0, #7
- beq _037F9C08
- cmp r0, #8
- beq _037F9C18
- b _037F9C2C
-_037F9C00:
- ldr r0, _037F9C34 ; =0x027FAFCC
- bx lr
-_037F9C08:
- ldr r0, _037F9C38 ; =0x0380B92C
- cmp r0, #58720256 ; 0x03800000
- movhi r0, #58720256 ; 0x03800000
- bx lr
-_037F9C18:
- mov r0, #58720256 ; 0x03800000
- ldr r1, _037F9C38 ; =0x0380B92C
- cmp r1, #58720256 ; 0x03800000
- movhi r0, r1
- bx lr
-_037F9C2C:
- mov r0, #0
- bx lr
-_037F9C34: .word 0x027FAFCC
-_037F9C38: .word 0x0380B92C
-
- arm_func_start OS_GetInitArenaHi
-OS_GetInitArenaHi: ; 0x037F9C3C
- cmp r0, #1
- beq _037F9C58
- cmp r0, #7
- beq _037F9C60
- cmp r0, #8
- beq _037F9C68
- b _037F9CA0
-_037F9C58:
- ldr r0, _037F9CA8 ; =0x027FF000
- bx lr
-_037F9C60:
- mov r0, #58720256 ; 0x03800000
- bx lr
-_037F9C68:
- ldr r1, _037F9CAC ; =0x00000400
- ldr r0, _037F9CB0 ; =0x0380FF80
- sub r2, r0, r1
- mov r0, #58720256 ; 0x03800000
- ldr r1, _037F9CB4 ; =0x0380B92C
- cmp r1, #58720256 ; 0x03800000
- movhi r0, r1
- ldr r1, _037F9CB8 ; =0x00000400
- cmp r1, #0
- bxeq lr
- cmp r1, #0
- sublt r0, r0, r1
- subge r0, r2, r1
- bx lr
-_037F9CA0:
- mov r0, #0
- bx lr
-_037F9CA8: .word 0x027FF000
-_037F9CAC: .word 0x00000400
-_037F9CB0: .word 0x0380FF80
-_037F9CB4: .word 0x0380B92C
-_037F9CB8: .word 0x00000400
-
- arm_func_start OS_GetArenaLo
-OS_GetArenaLo: ; 0x037F9CBC
- mov r0, r0, lsl #2
- add r0, r0, #40894464 ; 0x2700000
- add r0, r0, #1044480 ; 0xff000
- ldr r0, [r0, #3488] ; 0xda0
- bx lr
-
- arm_func_start OS_GetArenaHi
-OS_GetArenaHi: ; 0x037F9CD0
- mov r0, r0, lsl #2
- add r0, r0, #40894464 ; 0x2700000
- add r0, r0, #1044480 ; 0xff000
- ldr r0, [r0, #3524] ; 0xdc4
- bx lr
-
- arm_func_start OS_InitArena
-OS_InitArena: ; 0x037F9CE4
- stmfd sp!, {lr}
- sub sp, sp, #4
- ldr r1, _037F9D84 ; =_038078F4
- ldr r0, [r1]
- cmp r0, #0
- bne _037F9D78
- mov r0, #1
- str r0, [r1]
- bl OS_GetInitArenaHi
- mov r1, r0
- mov r0, #1
- bl OS_SetArenaHi
- mov r0, #1
- bl OS_GetInitArenaLo
- mov r1, r0
- mov r0, #1
- bl OS_SetArenaLo
- mov r0, #7
- bl OS_GetInitArenaHi
- mov r1, r0
- mov r0, #7
- bl OS_SetArenaHi
- mov r0, #7
- bl OS_GetInitArenaLo
- mov r1, r0
- mov r0, #7
- bl OS_SetArenaLo
- mov r0, #8
- bl OS_GetInitArenaHi
- mov r1, r0
- mov r0, #8
- bl OS_SetArenaHi
- mov r0, #8
- bl OS_GetInitArenaLo
- mov r1, r0
- mov r0, #8
- bl OS_SetArenaLo
-_037F9D78:
- add sp, sp, #4
- ldmia sp!, {lr}
- bx lr
-_037F9D84: .word _038078F4
-
arm_func_start OS_CheckHeap
OS_CheckHeap: ; 0x037F9D88
stmdb sp!, {r4, r5, r6, r7, r8, lr}
diff --git a/arm7/global.inc b/arm7/global.inc
index e14b3ae6..8ef993bc 100644
--- a/arm7/global.inc
+++ b/arm7/global.inc
@@ -40,9 +40,11 @@
.extern OS_GetProcMode
.extern OS_Init
.extern OS_InitAlloc
+.extern OS_InitArena
.extern OS_InitContext
.extern OS_InitIrqTable
.extern OS_InitLock
+.extern OS_InitReset
.extern OS_InitThread
.extern OS_IsResetOccurred
.extern OS_LoadContext