summaryrefslogtreecommitdiff
path: root/arm7/asm/OS_context.s
diff options
context:
space:
mode:
authorred031000 <rubenru09@aol.com>2020-06-01 18:54:43 +0100
committerred031000 <rubenru09@aol.com>2020-06-01 18:54:43 +0100
commit65a29a0733b1139728d0adc20c75c1f6e9799727 (patch)
tree7dabdc0fdfba68d421402d43cf4e9936fdff3322 /arm7/asm/OS_context.s
parent1cc951b5c1369ee182602e60089d0e0476f4c9ab (diff)
more splits of ARM7
Diffstat (limited to 'arm7/asm/OS_context.s')
-rw-r--r--arm7/asm/OS_context.s65
1 files changed, 65 insertions, 0 deletions
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