diff options
author | red031000 <rubenru09@aol.com> | 2020-09-19 14:22:50 +0100 |
---|---|---|
committer | red031000 <rubenru09@aol.com> | 2020-09-19 14:22:50 +0100 |
commit | abad1ad02bc4933142219b8f463ffbd69052299a (patch) | |
tree | 7cd00e1979454d9e114eb93c74ea668d78624d55 | |
parent | c4eb9dae7fa44d5e1b961be07d7771cc5ed78c89 (diff) |
arm7 OS_context
-rw-r--r-- | arm7/asm/OS_context.s | 65 | ||||
-rw-r--r-- | arm7/lib/include/OS_context.h | 6 | ||||
-rw-r--r-- | arm7/lib/src/OS_context.c | 79 | ||||
-rw-r--r-- | arm9/lib/include/OS_context.h | 10 |
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 |