diff options
Diffstat (limited to 'arm7/lib')
-rw-r--r-- | arm7/lib/include/OS_arena.h | 14 | ||||
-rw-r--r-- | arm7/lib/include/OS_init.h | 1 | ||||
-rw-r--r-- | arm7/lib/include/consts.h | 1 | ||||
-rw-r--r-- | arm7/lib/include/mmap.h | 26 | ||||
-rw-r--r-- | arm7/lib/src/OS_arena.c | 110 | ||||
-rw-r--r-- | arm7/lib/src/OS_init.c | 1 | ||||
-rw-r--r-- | arm7/lib/src/OS_system.c | 2 |
7 files changed, 152 insertions, 3 deletions
diff --git a/arm7/lib/include/OS_arena.h b/arm7/lib/include/OS_arena.h new file mode 100644 index 00000000..9227e539 --- /dev/null +++ b/arm7/lib/include/OS_arena.h @@ -0,0 +1,14 @@ +#ifndef POKEDIAMOND_ARM7_OS_ARENA_H +#define POKEDIAMOND_ARM7_OS_ARENA_H + +#include "nitro/OS_arena_shared.h" + +void OS_InitArena(void); +void* OS_GetArenaHi(OSArenaId id); +void* OS_GetArenaLo(OSArenaId id); +void* OS_GetInitArenaHi(OSArenaId id); +void* OS_GetInitArenaLo(OSArenaId id); +void OS_SetArenaHi(OSArenaId id, void* newHi); +void OS_SetArenaLo(OSArenaId id, void* newLo); + +#endif //POKEDIAMOND_ARM7_OS_ARENA_H diff --git a/arm7/lib/include/OS_init.h b/arm7/lib/include/OS_init.h index 50d5e3c4..9c9b1f93 100644 --- a/arm7/lib/include/OS_init.h +++ b/arm7/lib/include/OS_init.h @@ -3,6 +3,7 @@ #include "nitro/types.h" #include "OS_system.h" +#include "OS_arena.h" void OS_Init(void); diff --git a/arm7/lib/include/consts.h b/arm7/lib/include/consts.h index aaf8e429..dd297402 100644 --- a/arm7/lib/include/consts.h +++ b/arm7/lib/include/consts.h @@ -2,5 +2,6 @@ #define POKEDIAMOND_ARM7_CONSTS_H #include "nitro/consts_shared.h" +#include "mmap.h" #endif //POKEDIAMOND_ARM7_CONSTS_H diff --git a/arm7/lib/include/mmap.h b/arm7/lib/include/mmap.h new file mode 100644 index 00000000..24d15ad7 --- /dev/null +++ b/arm7/lib/include/mmap.h @@ -0,0 +1,26 @@ +#ifndef POKEDIAMOND_ARM7_MMAP_H +#define POKEDIAMOND_ARM7_MMAP_H + +#include "nitro/mmap_shared.h" + +#define HW_WRAM_END 0x03800000 +#define HW_PRV_WRAM 0x03800000 +#define HW_PRV_WRAM_END 0x03810000 + +#define HW_PRV_WRAM_SIZE (HW_PRV_WRAM_END-HW_PRV_WRAM) + +#define HW_SVC_STACK_SIZE 0x40 +#define HW_PRV_WRAM_SYSRV_SIZE 0x40 + +#define HW_MAIN_MEM_SUB_SIZE (HW_MAIN_MEM_SIZE - HW_MAIN_MEM_MAIN_SIZE - HW_MAIN_MEM_SHARED_SIZE) + +#define HW_MAIN_MEM_SUB (HW_MAIN_MEM_MAIN_END + 0x400000) +#define HW_MAIN_MEM_SUB_END (HW_MAIN_MEM_SUB + HW_MAIN_MEM_SUB_SIZE) + +#define HW_PRV_WRAM_IRQ_STACK_END (HW_PRV_WRAM_SVC_STACK) +#define HW_PRV_WRAM_SVC_STACK (HW_PRV_WRAM_SVC_STACK_END - HW_SVC_STACK_SIZE) +#define HW_PRV_WRAM_SVC_STACK_END (HW_PRV_WRAM_SYSRV) + +#define HW_PRV_WRAM_SYSRV (HW_PRV_WRAM + HW_PRV_WRAM_SIZE - HW_PRV_WRAM_SYSRV_SIZE) + +#endif //POKEDIAMOND_ARM7_MMAP_H diff --git a/arm7/lib/src/OS_arena.c b/arm7/lib/src/OS_arena.c new file mode 100644 index 00000000..516fc10b --- /dev/null +++ b/arm7/lib/src/OS_arena.c @@ -0,0 +1,110 @@ +#include "function_target.h" +#include "consts.h" +#include "OS_arena.h" + +static BOOL OSi_Initialized = FALSE; + +extern void SDK_SUBPRIV_ARENA_LO(void); +extern void SDK_WRAM_ARENA_LO(void); +extern void SDK_IRQ_STACKSIZE(void); +extern void SDK_SYS_STACKSIZE(void); + +ARM_FUNC void OS_InitArena(void) +{ + if (OSi_Initialized) + { + return; + } + OSi_Initialized = TRUE; + + OS_SetArenaHi(OS_ARENA_MAIN_SUBPRIV, OS_GetInitArenaHi(OS_ARENA_MAIN_SUBPRIV)); + OS_SetArenaLo(OS_ARENA_MAIN_SUBPRIV, OS_GetInitArenaLo(OS_ARENA_MAIN_SUBPRIV)); + + OS_SetArenaHi(OS_ARENA_WRAM_SUB, OS_GetInitArenaHi(OS_ARENA_WRAM_SUB)); + OS_SetArenaLo(OS_ARENA_WRAM_SUB, OS_GetInitArenaLo(OS_ARENA_WRAM_SUB)); + + OS_SetArenaHi(OS_ARENA_WRAM_SUBPRIV, OS_GetInitArenaHi(OS_ARENA_WRAM_SUBPRIV)); + OS_SetArenaLo(OS_ARENA_WRAM_SUBPRIV, OS_GetInitArenaLo(OS_ARENA_WRAM_SUBPRIV)); +} + +ARM_FUNC void* OS_GetArenaHi(OSArenaId id) +{ + return OSi_GetArenaInfo().hi[id]; +} + +ARM_FUNC void* OS_GetArenaLo(OSArenaId id) +{ + return OSi_GetArenaInfo().lo[id]; +} + +ARM_FUNC void* OS_GetInitArenaHi(OSArenaId id) +{ + switch (id) { + case OS_ARENA_MAIN_SUBPRIV: + return (void *)HW_MAIN_MEM_SUB_END; + case OS_ARENA_WRAM_SUB: + return (void *)HW_WRAM_END; + case OS_ARENA_WRAM_SUBPRIV: + { + u32 irqStackLo = (u32)HW_PRV_WRAM_IRQ_STACK_END - (s32)SDK_IRQ_STACKSIZE; + u32 sysStackLo = (u32)HW_PRV_WRAM; + + if ((u32)SDK_WRAM_ARENA_LO > (u32)HW_PRV_WRAM) + { + sysStackLo = (u32)SDK_WRAM_ARENA_LO; + } + + if (!(s32)SDK_SYS_STACKSIZE) + { + return (void *)sysStackLo; + } + else if ((s32)SDK_SYS_STACKSIZE < 0) + { + sysStackLo -= (s32)SDK_SYS_STACKSIZE; + } + else + { + sysStackLo = irqStackLo - (s32)SDK_SYS_STACKSIZE; + } + + return (void *)sysStackLo; + } + default: + return NULL; + } +} + +ARM_FUNC void* OS_GetInitArenaLo(OSArenaId id) { + switch (id) { + case OS_ARENA_MAIN_SUBPRIV: + return (void *)((u32)0x027fafcc); //todo SDK_SUBPRIV_ARENA_LO + case OS_ARENA_WRAM_SUB: + { + u32 wramSubLo = ((u32)SDK_WRAM_ARENA_LO); + if ((u32)HW_WRAM_END < (u32)wramSubLo) + { + wramSubLo = (u32)HW_WRAM_END; + } + return (void *)wramSubLo; + } + case OS_ARENA_WRAM_SUBPRIV: + { + u32 privWramLo = HW_PRV_WRAM; + if ((u32)SDK_WRAM_ARENA_LO > (u32)privWramLo) + { + privWramLo = (u32)SDK_WRAM_ARENA_LO; + } + return (void *)privWramLo; + } + default: + return NULL; + } +} + +ARM_FUNC void OS_SetArenaHi(OSArenaId id, void* newHi) { + OSi_GetArenaInfo().hi[id] = newHi; +} + +ARM_FUNC void OS_SetArenaLo(OSArenaId id, void* newLo) { + OSi_GetArenaInfo().lo[id] = newLo; +} diff --git a/arm7/lib/src/OS_init.c b/arm7/lib/src/OS_init.c index 082b3e70..f4972638 100644 --- a/arm7/lib/src/OS_init.c +++ b/arm7/lib/src/OS_init.c @@ -1,7 +1,6 @@ #include "function_target.h" #include "OS_init.h" -extern void OS_InitArena(void); extern void PXI_Init(void); extern void OS_InitLock(void); extern void OS_InitIrqTable(void); diff --git a/arm7/lib/src/OS_system.c b/arm7/lib/src/OS_system.c index 120eddbf..11417e91 100644 --- a/arm7/lib/src/OS_system.c +++ b/arm7/lib/src/OS_system.c @@ -1,8 +1,6 @@ #include "function_target.h" #include "OS_system.h" -#pragma optimize_for_size on - extern void FUN_037F8CB4(s32 count); ARM_FUNC asm OSIntrMode OS_EnableInterrupts(void) |