summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorred031000 <rubenru09@aol.com>2020-09-19 14:22:50 +0100
committerred031000 <rubenru09@aol.com>2020-09-19 14:22:50 +0100
commitabad1ad02bc4933142219b8f463ffbd69052299a (patch)
tree7cd00e1979454d9e114eb93c74ea668d78624d55
parentc4eb9dae7fa44d5e1b961be07d7771cc5ed78c89 (diff)
arm7 OS_context
-rw-r--r--arm7/asm/OS_context.s65
-rw-r--r--arm7/lib/include/OS_context.h6
-rw-r--r--arm7/lib/src/OS_context.c79
-rw-r--r--arm9/lib/include/OS_context.h10
4 files changed, 87 insertions, 73 deletions
diff --git a/arm7/asm/OS_context.s b/arm7/asm/OS_context.s
deleted file mode 100644
index 21479b1f..00000000
--- a/arm7/asm/OS_context.s
+++ /dev/null
@@ -1,65 +0,0 @@
- .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/lib/include/OS_context.h b/arm7/lib/include/OS_context.h
index b01ccb8b..6b18ebd5 100644
--- a/arm7/lib/include/OS_context.h
+++ b/arm7/lib/include/OS_context.h
@@ -13,8 +13,8 @@ typedef struct OSContext
u32 sp_svc;
} OSContext;
-extern u32 OS_SaveContext(OSContext *context);
-extern void OS_LoadContext(OSContext *context);
-extern void OS_InitContext(OSContext *context, u32 func, u32 stack);
+void OS_InitContext(register OSContext *context, register u32 newpc, register u32 newsp);
+BOOL OS_SaveContext(register OSContext *context);
+void OS_LoadContext(register OSContext *context);
#endif //POKEDIAMOND_ARM7_OS_CONTEXT_H
diff --git a/arm7/lib/src/OS_context.c b/arm7/lib/src/OS_context.c
new file mode 100644
index 00000000..99a25bb1
--- /dev/null
+++ b/arm7/lib/src/OS_context.c
@@ -0,0 +1,79 @@
+#include "OS_context.h"
+#include "consts.h"
+#include "function_target.h"
+
+ARM_FUNC asm void OS_InitContext(register OSContext *context, register u32 newpc, register u32 newsp)
+{
+ add newpc, newpc, #4
+ str newpc, [context, #0x40]
+
+ str newsp, [context, #0x44]
+ sub newsp, newsp, #HW_SVC_STACK_SIZE
+
+ tst newsp, #4
+ subne newsp, newsp, #4
+ str newsp, [context, #0x38]
+
+ ands r1, newpc, #1
+ movne r1, #0x3f
+ moveq r1, #0x1f
+ str r1, [context]
+
+ mov r1, #0
+ str r1, [context, #0x4]
+ str r1, [context, #0x8]
+ str r1, [context, #0xc]
+ str r1, [context, #0x10]
+ str r1, [context, #0x14]
+ str r1, [context, #0x18]
+ str r1, [context, #0x1c]
+ str r1, [context, #0x20]
+ str r1, [context, #0x24]
+ str r1, [context, #0x28]
+ str r1, [context, #0x2c]
+ str r1, [context, #0x30]
+ str r1, [context, #0x34]
+ str r1, [context, #0x3c]
+
+ bx lr
+}
+
+ARM_FUNC asm BOOL OS_SaveContext(register OSContext *context)
+{
+ add r1, r0, #0
+
+ mrs r2, cpsr
+ str r2, [r1], #0x4
+
+ mov r0, #0xd3
+ msr cpsr_c, r0
+ str sp, [r1, #0x40]
+ msr cpsr_c, r2
+
+ mov r0, #1
+ stmia r1, {r0-r14}
+ add r0, pc, #8
+ str r0, [r1, #0x3c]
+
+ mov r0, #0
+ bx lr
+}
+
+ARM_FUNC asm void OS_LoadContext(register OSContext* context)
+{
+ mrs r1, cpsr
+ bic r1, r1, #HW_PSR_CPU_MODE_MASK
+ orr r1, r1, #0xd3
+ msr cpsr_c, r1
+
+ ldr r1, [r0], #0x4
+ msr spsr_fsxc, r1
+
+ ldr sp, [r0, #0x40]
+
+ ldr lr, [r0, #0x3c]
+ ldmia r0, {r0-r14}^
+ nop
+
+ subs pc, lr, #4
+}
diff --git a/arm9/lib/include/OS_context.h b/arm9/lib/include/OS_context.h
index 7c25ce2e..d3e24673 100644
--- a/arm9/lib/include/OS_context.h
+++ b/arm9/lib/include/OS_context.h
@@ -1,5 +1,5 @@
-#ifndef POKEDIAMOND_OS_CONTEXT_H
-#define POKEDIAMOND_OS_CONTEXT_H
+#ifndef POKEDIAMOND_ARM9_OS_CONTEXT_H
+#define POKEDIAMOND_ARM9_OS_CONTEXT_H
#include "nitro/types.h"
#include "CP_context.h"
@@ -16,7 +16,7 @@ typedef struct OSContext
} OSContext;
void OS_InitContext(register OSContext *context, register u32 newpc, register u32 newsp);
-BOOL OS_SaveContext(OSContext *context);
-void OS_LoadContext(OSContext *context);
+BOOL OS_SaveContext(register OSContext *context);
+void OS_LoadContext(register OSContext *context);
-#endif //POKEDIAMOND_OS_CONTEXT_H
+#endif //POKEDIAMOND_ARM9_OS_CONTEXT_H