summaryrefslogtreecommitdiff
path: root/include/nitro/os.c
diff options
context:
space:
mode:
Diffstat (limited to 'include/nitro/os.c')
-rw-r--r--include/nitro/os.c223
1 files changed, 30 insertions, 193 deletions
diff --git a/include/nitro/os.c b/include/nitro/os.c
index 3ecffb34..2531a636 100644
--- a/include/nitro/os.c
+++ b/include/nitro/os.c
@@ -3,199 +3,36 @@
//
#include "os.h"
-#include "consts.h"
-OSProcMode OS_GetProcMode() {
- __asm {
- mrs r0, cpsr
- and r0, r0, #HW_PSR_CPU_MODE_MASK
- bx lr
- }
+extern void PXI_Init();
+extern void OS_InitLock();
+extern void OS_InitIrqTable();
+extern void OS_SetIrqStackChecker();
+extern void OS_InitException();
+extern void MI_Init();
+extern void OS_InitVAlarm();
+extern void OSi_InitVramExclusive();
+extern void OS_InitThread();
+extern void OS_InitReset();
+extern void CTRDG_Init();
+extern void CARD_Init();
+extern void PM_Init();
+
+void OS_Init(void) {
+ OS_InitArena();
+ PXI_Init();
+ OS_InitLock();
+ OS_InitArenaEx();
+ OS_InitIrqTable();
+ OS_SetIrqStackChecker();
+ OS_InitException();
+ MI_Init();
+ OS_InitVAlarm();
+ OSi_InitVramExclusive();
+ OS_InitThread();
+ OS_InitReset();
+ CTRDG_Init();
+ CARD_Init();
+ PM_Init();
}
-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
-}