diff options
-rw-r--r-- | include/nitro/mmap.h | 4 | ||||
-rw-r--r-- | include/nitro/os_alloc.c | 79 |
2 files changed, 76 insertions, 7 deletions
diff --git a/include/nitro/mmap.h b/include/nitro/mmap.h index cbf54451..79f0bae5 100644 --- a/include/nitro/mmap.h +++ b/include/nitro/mmap.h @@ -20,11 +20,15 @@ #define HW_ROM_HEADER_BUF (HW_MAIN_MEM + 0x007ffe00) // ROM registration area data buffer #define HW_RED_RESERVED (HW_MAIN_MEM + 0x007ff800) // Some kind of reserved data for shared memory #define HW_MAIN_MEM_MAIN_END (HW_MAIN_MEM + HW_MAIN_MEM_MAIN_SIZE) +#define HW_MAIN_MEM_EX_END (HW_MAIN_MEM + HW_MAIN_MEM_EX_SIZE) +#define HW_MAIN_MEM_SHARED (HW_MAIN_MEM_EX_END - HW_MAIN_MEM_SHARED_SIZE) #define OSi_MAIN_ARENA_HI_DEFAULT (HW_MAIN_MEM_MAIN_END) #define OSi_MAINEX_ARENA_HI_DEFAULT (HW_MAIN_MEM + HW_MAIN_MEM_DEBUGGER_OFFSET) #define HW_ITCM_ARENA_HI_DEFAULT (HW_ITCM + HW_ITCM_SIZE) #define HW_SHARED_ARENA_HI_DEFAULT (HW_RED_RESERVED - HW_CARD_ROM_HEADER_SIZE - HW_DOWNLOAD_PARAMETER_SIZE) +#define HW_SHARED_ARENA_LO_DEFAULT (HW_MAIN_MEM_SHARED) #define OSi_WRAM_MAIN_ARENA_HI_DEFAULT (HW_WRAM) +#define OSi_WRAM_MAIN_ARENA_LO_DEFAULT (HW_WRAM) #endif
\ No newline at end of file diff --git a/include/nitro/os_alloc.c b/include/nitro/os_alloc.c index b6749f27..e6a77d15 100644 --- a/include/nitro/os_alloc.c +++ b/include/nitro/os_alloc.c @@ -9,6 +9,10 @@ extern BOOL OSi_MainExArenaEnabled; extern BOOL OSi_Initialized; // TODO: located at 0x021d36f0 +extern u32 SDK_MAIN_ARENA_LO; // TODO: technically this should be defined in the lcf +extern u32 SDK_SECTION_ARENA_EX_START; // TODO: technically this should be defined in the lcf +extern u32 SDK_SECTION_ARENA_ITCM_START; // TODO: technically this should be defined in the lcf +extern u32 SDK_SECTION_ARENA_DTCM_START; // TODO: technically this should be defined in the lcf extern u32 OS_GetConsoleType(); extern Cell* DLInsert(Cell* list, Cell* cell); extern Cell* DLAddFront(Cell* list, Cell* cell); @@ -195,27 +199,88 @@ void OS_SetArenaHi(OSArenaId id, void* newHi) { #ifdef MATCH_ASM asm void* OS_GetInitArenaLo(OSArenaId id) { - // TODO: idk how to do switch case stuff properly in asm + stmdb sp!, {lr} + sub sp, sp, #0x4 + cmp r0, #0x6 + addls pc, pc, r0, lsl #0x2 + b _020CC3DC +_020CC330: + b _020CC34C + b _020CC3DC + b _020CC35C + b _020CC39C + b _020CC3AC + b _020CC3BC + b _020CC3CC +_020CC34C: + add sp, sp, #0x4 + ldr r0, =SDK_MAIN_ARENA_LO + ldmfd sp!, {lr} + bx lr +_020CC35C: + ldr r0, =OSi_MainExArenaEnabled + ldr r0, [r0] + cmp r0, #0x0 + beq _020CC37C + bl OS_GetConsoleType + and r0, r0, #0x3 + cmp r0, #0x1 + bne _020CC38C +_020CC37C: + add sp, sp, #0x4 + mov r0, #0x0 + ldmfd sp!, {lr} + bx lr +_020CC38C: + add sp, sp, #0x4 + ldr r0, =SDK_SECTION_ARENA_EX_START + ldmfd sp!, {lr} + bx lr +_020CC39C: + add sp, sp, #0x4 + ldr r0, =SDK_SECTION_ARENA_ITCM_START + ldmfd sp!, {lr} + bx lr +_020CC3AC: + add sp, sp, #0x4 + ldr r0, =SDK_SECTION_ARENA_DTCM_START + ldmfd sp!, {lr} + bx lr +_020CC3BC: + add sp, sp, #0x4 + ldr r0, =HW_SHARED_ARENA_LO_DEFAULT + ldmfd sp!, {lr} + bx lr +_020CC3CC: + add sp, sp, #0x4 + ldr r0, =OSi_WRAM_MAIN_ARENA_LO_DEFAULT + ldmfd sp!, {lr} + bx lr +_020CC3DC: + mov r0, #0x0 + add sp, sp, #0x4 + ldmia sp!, {lr} + bx lr } #else void* OS_GetInitArenaLo(OSArenaId id) { switch (id) { case OS_ARENA_MAIN: - return (void *)0x0225ffa0; + return (void *)SDK_MAIN_ARENA_LO; case OS_ARENA_MAINEX: if (!OSi_MainExArenaEnabled || (OS_GetConsoleType() & OS_CONSOLE_SIZE_MASK) == OS_CONSOLE_SIZE_4MB) { return NULL; } else { - return (void *)0x023e0000; + return (void *)SDK_SECTION_ARENA_EX_START; } case OS_ARENA_ITCM: - return (void *)0x01ff8720; + return (void *)SDK_SECTION_ARENA_ITCM_START; case OS_ARENA_DTCM: - return (void *)0x027e0080; + return (void *)SDK_SECTION_ARENA_DTCM_START; case OS_ARENA_SHARED: - return (void *)0x027ff000; + return (void *)HW_SHARED_ARENA_LO_DEFAULT; case OS_ARENA_WRAM_MAIN: - return (void *)0x037f8000; + return (void *)OSi_WRAM_MAIN_ARENA_LO_DEFAULT; default: return NULL; } |