diff options
author | Martmists <martmists@gmail.com> | 2020-04-16 16:13:01 +0200 |
---|---|---|
committer | Martmists <martmists@gmail.com> | 2020-04-16 16:13:01 +0200 |
commit | dcdf58739922de3b3bbc828f46e36b83f53c52a0 (patch) | |
tree | 187dcb00d800622d099ae3cbcd49f82227654c77 | |
parent | 346db6f14cfe889573d57ca494b96e8258ca84b4 (diff) |
Add more OS functions
-rw-r--r-- | arm7/.gitkeep | 0 | ||||
-rw-r--r-- | arm9/.gitkeep | 0 | ||||
-rw-r--r-- | nitro/consts.h | 20 | ||||
-rw-r--r-- | nitro/mmap.h | 12 | ||||
-rw-r--r-- | nitro/nitro.h | 2 | ||||
-rw-r--r-- | nitro/os.c | 196 | ||||
-rw-r--r-- | nitro/os.h | 61 | ||||
-rw-r--r-- | nitro/os_asm.h | 12 | ||||
-rw-r--r-- | nitro/os_asm.s | 7 | ||||
-rw-r--r-- | nitro/types.h | 10 |
10 files changed, 288 insertions, 32 deletions
diff --git a/arm7/.gitkeep b/arm7/.gitkeep new file mode 100644 index 00000000..e69de29b --- /dev/null +++ b/arm7/.gitkeep diff --git a/arm9/.gitkeep b/arm9/.gitkeep new file mode 100644 index 00000000..e69de29b --- /dev/null +++ b/arm9/.gitkeep diff --git a/nitro/consts.h b/nitro/consts.h new file mode 100644 index 00000000..3592500a --- /dev/null +++ b/nitro/consts.h @@ -0,0 +1,20 @@ +// +// Created by mart on 4/15/20. +// + +#ifndef POKEDIAMOND_CONSTS_H +#define POKEDIAMOND_CONSTS_H + +#include "mmap.h" + +#define HW_PSR_CPU_MODE_MASK 0x1f // CPU mode + +#define HW_PSR_FIQ_DISABLE 0x40 // Disable FIQ +#define HW_PSR_IRQ_DISABLE 0x80 // Disable IRQ +#define HW_PSR_IRQ_FIQ_DISABLE 0xc0 // Disable FIQ and IRQ + +#define OSi_GetArenaInfo() (*(OSArenaInfo*)HW_ARENA_INFO_BUF) +#define OSi_TRUNC(n, a) (((u32) (n)) & ~((a) - 1)) +#define OSi_ROUND(n, a) (((u32) (n) + (a) - 1) & ~((a) - 1)) + +#endif //POKEDIAMOND_CONSTS_H diff --git a/nitro/mmap.h b/nitro/mmap.h new file mode 100644 index 00000000..4c781d5f --- /dev/null +++ b/nitro/mmap.h @@ -0,0 +1,12 @@ +#ifndef NITRO_MMAP_H +#define NITRO_MMAP_H + +#define HW_MAIN_MEM 0x02000000 +#define HW_MAIN_MEM_SIZE 0x00400000 +#define HW_MAIN_MEM_EX_SIZE 0x00800000 + +#define HW_ARENA_INFO_BUF (HW_MAIN_MEM + 0x007ffda0) // Arena data structure +#define HW_ROM_HEADER_BUF (HW_MAIN_MEM + 0x007ffe00) // ROM registration area data buffer + + +#endif
\ No newline at end of file diff --git a/nitro/nitro.h b/nitro/nitro.h index 70ad9a18..8cf603f5 100644 --- a/nitro/nitro.h +++ b/nitro/nitro.h @@ -7,7 +7,9 @@ extern "C" { // Include all nitro files #include "types.h" +#include "consts.h" #include "os.h" +#include "mmap.h" #ifdef __cplusplus }; @@ -3,7 +3,199 @@ // #include "os.h" +#include "consts.h" -asm void OS_GetProcMode() { +OSProcMode OS_GetProcMode() { + __asm { + mrs r0, cpsr + and r0, r0, #HW_PSR_CPU_MODE_MASK + bx lr + } +} -}
\ No newline at end of file +OSIntrMode OS_DisableInterrupts() { + __asm { + mrs r0, cpsr + orr r1, r0, #HW_PSR_IRQ_DISABLE + msr cpsr_c, r1 + and r0, r0, #HW_PSR_IRQ_DISABLE + bx lr + } +} + +OSIntrMode OS_RestoreInterrupts(OSIntrMode state) { + __asm { + mrs r1, cpsr + bic r2, r1, #HW_PSR_IRQ_DISABLE + orr r2, r2, r0 + msr cpsr_c, r2 + and r0, r1, #HW_PSR_IRQ_DISABLE + bx lr + } +} + +void* OS_AllocFromArenaLo(OSArenaId id, u32 size, u32 align) { +#ifdef MATCH_ASM + __asm { + stmdb sp!,{ r4 r5 r6 r7 lr } + sub sp,sp,#0x4 + mov r7,r0 + mov r6,r1 + mov r5,r2 + bl OS_GetArenaLo + cmp r0,#0x0 + addeq sp,sp,#0x4 + moveq r0,#0x0 + ldmeqia sp!,{ r4 r5 r6 r7 lr } + bxeq lr + add r0,r0,r5 + sub r1,r5,#0x1 + mvn r2,r1 + sub r0,r0,#0x1 + and r4,r2,r0 + add r0,r4,r6 + add r0,r0,r5 + sub r1,r0,#0x1 + mov r0,r7 + and r5,r2,r1 + bl OS_GetArenaHi + cmp r5,r0 + addhi sp,sp,#0x4 + movhi r0,#0x0 + ldmhiia sp!,{ r4 r5 r6 r7 lr } + bxhi lr + mov r0,r7 + mov r1,r5 + bl OS_SetArenaLo + mov r0,r4 + add sp,sp,#0x4 + ldmia sp!,{ r4 r5 r6 r7 lr } + bx lr + } +#else + void* ptr; + u8* arenaLo; + ptr = OS_GetArenaLo(id); + if (!ptr) { + return NULL; + } + arenaLo = ptr = (void *)OSi_ROUND(ptr, align); + arenaLo += size; + arenaLo = (u8 *)OSi_ROUND(arenaLo, align); + if (arenaLo > (u8*)OS_GetArenaHi(id)) { + return NULL; + } + OS_SetArenaLo(id, arenaLo); + + return ptr; +#endif +} + +void* OS_AllocFromArenaHi(OSArenaId id, u32 size, u32 align) { +#ifdef MATCH_ASM + __asm { + stmdb sp!,{ r4 r5 r6 lr } + mov r4,r0 + mov r6,r1 + mov r5,r2 + bl OS_GetArenaHi + cmp r0,#0x0 + moveq r0,#0x0 + ldmeqia sp!,{ r4 r5 r6 lr } + bxeq lr + sub r1,r5,#0x1 + mvn r2,r1 + and r0,r0,r2 + sub r1,r0,r6 + mov r0,r4 + and r5,r1,r2 + bl OS_GetArenaLo + cmp r5,r0 + movcc r0,#0x0 + ldmccia sp!,{ r4 r5 r6 lr } + bxcc lr + mov r0,r4 + mov r1,r5 + bl OS_SetArenaHi + mov r0,r5 + ldmia sp!,{ r4 r5 r6 lr } + bx lr + }; +#else + void* ptr; + u8* arenaHi; + + arenaHi = OS_GetArenaHi(id); + if (!arenaHi) { + return NULL; + } + + arenaHi = (u8 *)OSi_TRUNC(arenaHi, align); + arenaHi -= size; + arenaHi = ptr = (void *)OSi_TRUNC(arenaHi, align); + + if (arenaHi < (u8*)OS_GetArenaLo(id)) { + return NULL; + } + + OS_SetArenaHi(id, arenaHi); + + return ptr; +#endif +} + +void OS_SetArenaHi(OSArenaId id, void *newHi) { +#ifdef MATCH_ASM + __asm { + mov r0,r0, lsl #0x2 + add r0,r0,#0x2700000 + add r0,r0,#0xff000 + str r1,[r0,#0xdc4] + bx lr + } +#else + OSi_GetArenaInfo().lo[id] = newHi; +#endif +} + +void OS_SetArenaLo(OSArenaId id, void *newLo) { +#ifdef MATCH_ASM + __asm { + mov r0,r0, lsl #0x2 + add r0,r0,#0x2700000 + add r0,r0,#0xff000 + str r1,[r0,#0xda0] + bx lr + } +#else + OSi_GetArenaInfo().lo[id] = newLo; +#endif +} + +void* OS_GetArenaHi(OSArenaId id) { +#ifdef MATCH_ASM + __asm { + mov r0,r0, lsl #0x2 + add r0,r0,#0x2700000 + add r0,r0,#0xff000 + ldr r0,[r0,#0xdc4] + bx lr + } +#else + return OSi_GetArenaInfo().hi[id]; +#endif +} + +void* OS_GetArenaLo(OSArenaId id) { +#ifdef MATCH_ASM + __asm { + mov r0,r0, lsl #0x2 + add r0,r0,#0x2700000 + add r0,r0,#0xff000 + ldr r0,[r0,#0xda0] + bx lr + } +#else + return OSi_GetArenaInfo().lo[id]; +#endif +} @@ -5,6 +5,65 @@ #ifndef POKEDIAMOND_OS_H #define POKEDIAMOND_OS_H -#include "os_asm.h" +#include "types.h" +#include "consts.h" + +typedef enum { + OS_PROCMODE_USER=16, + OS_PROCMODE_FIQ=17, + OS_PROCMODE_IRQ=18, + OS_PROCMODE_SVC=19, + OS_PROCMODE_ABORT=23, + OS_PROCMODE_UNDEF=27, + OS_PROCMODE_SYS=31 +} OSProcMode; + +typedef enum { + OS_ARENA_MAIN = 0, + OS_ARENA_MAIN_SUBPRIV = 1, + OS_ARENA_MAINEX = 2, + OS_ARENA_ITCM = 3, + OS_ARENA_DTCM = 4, + OS_ARENA_SHARED = 5, + OS_ARENA_WRAM_MAIN = 6, + OS_ARENA_WRAM_SUB = 7, + OS_ARENA_WRAM_SUBPRIV = 8, + OS_ARENA_MAX = 9 +} OSArenaId; + +typedef enum { + OS_INTRMODE_IRQ_DISABLE = HW_PSR_IRQ_DISABLE, + OS_INTRMODE_IRQ_ENABLE = 0 +} OSIntrMode_Irq; + +typedef enum { + OS_INTRMODE_FIQ_DISABLE = HW_PSR_FIQ_DISABLE, + OS_INTRMODE_FIQ_ENABLE = 0 +} OSIntrMode_Fiq; + +typedef union { + OSIntrMode_Fiq mode_fiq; + OSIntrMode_Irq mode_irq; +} OSIntrMode; + +typedef struct { + void *lo[OS_ARENA_MAX]; + void *hi[OS_ARENA_MAX]; + u16 initialized; + u8 padding[2]; +} OSArenaInfo; + +OSProcMode OS_GetProcMode(); +OSIntrMode OS_DisableInterrupts(); +OSIntrMode OS_RestoreInterrupts(register OSIntrMode state); + +void* OS_AllocFromArenaLo(OSArenaId id, u32 size, u32 align); +void* OS_AllocFromArenaHi(OSArenaId id, u32 size, u32 align); + +void OS_SetArenaHi(OSArenaId id, void *newHi); +void OS_SetArenaLo(OSArenaId id, void *newLo); + +void* OS_GetArenaHi(OSArenaId id); +void* OS_GetArenaLo(OSArenaId id); #endif //POKEDIAMOND_OS_H diff --git a/nitro/os_asm.h b/nitro/os_asm.h deleted file mode 100644 index 43c93385..00000000 --- a/nitro/os_asm.h +++ /dev/null @@ -1,12 +0,0 @@ -// -// Created by mart on 4/12/20. -// - -#ifndef POKEDIAMOND_OS_ASM_H -#define POKEDIAMOND_OS_ASM_H - -#include "types.h" - -OSProcMode OS_GetProcMode(); - -#endif //POKEDIAMOND_OS_ASM_H diff --git a/nitro/os_asm.s b/nitro/os_asm.s deleted file mode 100644 index 86d7603c..00000000 --- a/nitro/os_asm.s +++ /dev/null @@ -1,7 +0,0 @@ - -# TODO: make this syntax look correct in CLion -# Potentially switch to AT&T syntax? -OS_GetProcMode: - mrs r0, cpsr - and r0, r0, #0x80 - bx lr diff --git a/nitro/types.h b/nitro/types.h index d702de23..5ad2c75e 100644 --- a/nitro/types.h +++ b/nitro/types.h @@ -37,14 +37,4 @@ typedef int BOOL; #endif // __cplusplus #endif -typedef enum { - OS_PROCMODE_USER=16, - OS_PROCMODE_FIQ=17, - OS_PROCMODE_IRQ=18, - OS_PROCMODE_SVC=19, - OS_PROCMODE_ABORT=23, - OS_PROCMODE_UNDEF=27, - OS_PROCMODE_SYS=31 -} OSProcMode; - #endif //POKEDIAMOND_NITRO_TYPES_H |