summaryrefslogtreecommitdiff
path: root/arm9
diff options
context:
space:
mode:
Diffstat (limited to 'arm9')
-rw-r--r--arm9/Makefile2
-rw-r--r--arm9/asm/OS_init.s27
-rw-r--r--arm9/asm/OS_system.s77
-rw-r--r--arm9/lib/include/OS_init.h (renamed from arm9/lib/include/OS.h)6
-rw-r--r--arm9/lib/include/OS_system.h13
-rw-r--r--arm9/lib/include/consts.h8
-rw-r--r--arm9/lib/include/nitro.h2
-rw-r--r--arm9/lib/src/OS_init.c38
-rw-r--r--arm9/lib/src/OS_system.c71
9 files changed, 128 insertions, 116 deletions
diff --git a/arm9/Makefile b/arm9/Makefile
index d84513a4..30a6f10f 100644
--- a/arm9/Makefile
+++ b/arm9/Makefile
@@ -88,7 +88,7 @@ OBJCOPY := $(CROSS)objcopy
# ./tools/mwccarm/2.0/base/mwasmarm.exe -proc arm5te asm/arm9_thumb.s -o arm9.o
ASFLAGS = -proc arm5te -i ..
-CFLAGS = -O4,p -proc arm946e -fp soft -lang c99 -Cpp_exceptions off -ir ../include -ir ../include-mw -interworking
+CFLAGS = -O4,p -proc arm946e -fp soft -lang c99 -Cpp_exceptions off -ir ../include -ir ../include-mw -ir lib/include -interworking
LDFLAGS = -map -nodead -w off -proc v5te -interworking -map -symtab -m _start
####################### Other Tools #########################
diff --git a/arm9/asm/OS_init.s b/arm9/asm/OS_init.s
deleted file mode 100644
index 8ee35fe0..00000000
--- a/arm9/asm/OS_init.s
+++ /dev/null
@@ -1,27 +0,0 @@
- .include "asm/macros.inc"
- .include "global.inc"
-
- .text
-
- arm_func_start OS_Init
-OS_Init: ; 0x020CC1B4
- stmdb sp!, {lr}
- sub sp, sp, #0x4
- bl OS_InitArena
- bl PXI_Init
- bl OS_InitLock
- bl OS_InitArenaEx
- bl OS_InitIrqTable
- bl OS_SetIrqStackChecker
- bl OS_InitException
- bl MI_Init
- bl OS_InitVAlarm
- bl OSi_InitVramExclusive
- bl OS_InitThread
- bl OS_InitReset
- bl CTRDG_Init
- bl CARD_Init
- bl PM_Init
- add sp, sp, #0x4
- ldmia sp!, {lr}
- bx lr
diff --git a/arm9/asm/OS_system.s b/arm9/asm/OS_system.s
deleted file mode 100644
index 3801b8e7..00000000
--- a/arm9/asm/OS_system.s
+++ /dev/null
@@ -1,77 +0,0 @@
- .include "asm/macros.inc"
- .include "global.inc"
-
- .text
-
- arm_func_start OS_EnableInterrupts
-OS_EnableInterrupts: ; 0x020CD2FC
- mrs r0, cpsr
- bic r1, r0, #0x80
- msr cpsr_c, r1
- and r0, r0, #0x80
- bx lr
-
- arm_func_start OS_DisableInterrupts
-OS_DisableInterrupts:
- mrs r0, cpsr
- orr r1, r0, #0x80
- msr cpsr_c, r1
- and r0, r0, #0x80
- bx lr
-
- arm_func_start OS_RestoreInterrupts
-OS_RestoreInterrupts:
- mrs r1, cpsr
- bic r2, r1, #0x80
- orr r2, r2, r0
- msr cpsr_c, r2
- and r0, r1, #0x80
- bx lr
-
- arm_func_start OS_DisableInterrupts_IrqAndFiq
-OS_DisableInterrupts_IrqAndFiq: ; 0x020CD33C
- mrs r0, cpsr
- orr r1, r0, #0xc0
- msr cpsr_c, r1
- and r0, r0, #0xc0
- bx lr
-
- arm_func_start OS_RestoreInterrupts_IrqAndFiq
-OS_RestoreInterrupts_IrqAndFiq: ; 0x020CD350
- mrs r1, cpsr
- bic r2, r1, #0xc0
- orr r2, r2, r0
- msr cpsr_c, r2
- and r0, r1, #0xc0
- bx lr
-
- arm_func_start OS_GetCpsrIrq
-OS_GetCpsrIrq: ; 0x020CD368
- mrs r0, cpsr
- and r0, r0, #0x80
- bx lr
-
- arm_func_start OS_GetProcMode
-OS_GetProcMode: ; 0x020CD374
- mrs r0, cpsr
- and r0, r0, #0x1f
- bx lr
-
- arm_func_start OS_SpinWait
-OS_SpinWait:
- subs r0, r0, #0x4
- bhs OS_SpinWait
- bx lr
-
- arm_func_start OS_WaitVBlankIntr
-OS_WaitVBlankIntr: ; 0x020CD38C
- stmdb sp!, {lr}
- sub sp, sp, #0x4
- mov r0, #0x1
- blx SVC_WaitByLoop
- mov r0, #0x1
- mov r1, r0
- bl OS_WaitIrq
- add sp, sp, #0x4
- ldmia sp!, {lr}
- bx lr
diff --git a/arm9/lib/include/OS.h b/arm9/lib/include/OS_init.h
index b152dfb8..c556253a 100644
--- a/arm9/lib/include/OS.h
+++ b/arm9/lib/include/OS_init.h
@@ -2,8 +2,8 @@
// Created by mart on 4/12/20.
//
-#ifndef POKEDIAMOND_OS_H
-#define POKEDIAMOND_OS_H
+#ifndef POKEDIAMOND_OS_INIT_H
+#define POKEDIAMOND_OS_INIT_H
#include "types.h"
#include "consts.h"
@@ -14,4 +14,4 @@
void OS_Init();
-#endif //POKEDIAMOND_OS_H
+#endif //POKEDIAMOND_OS_INIT_H
diff --git a/arm9/lib/include/OS_system.h b/arm9/lib/include/OS_system.h
index c7f121bd..20228cbf 100644
--- a/arm9/lib/include/OS_system.h
+++ b/arm9/lib/include/OS_system.h
@@ -17,17 +17,22 @@ typedef enum {
OS_PROCMODE_SYS=31
} OSProcMode;
+#pragma enumsalwaysint on
typedef enum {
- OS_INTRMODE_DISABLE = HW_PSR_IRQ_DISABLE,
+ OS_INTRMODE_DISABLE_IRQ = HW_PSR_DISABLE_IRQ,
+ OS_INTRMODE_DISABLE_FIQ = HW_PSR_DISABLE_FIQ,
OS_INTRMODE_ENABLE = 0
} OSIntrMode;
+#pragma enumsalwaysint reset
OSIntrMode OS_EnableInterrupts();
OSIntrMode OS_DisableInterrupts();
-OSIntrMode OS_RestoreInterrupts(OSIntrMode state);
+OSIntrMode OS_RestoreInterrupts(register OSIntrMode state);
OSIntrMode OS_DisableInterrupts_IrqAndFiq();
-OSIntrMode OS_RestoreInterrupts_IrqAndFiq(OSIntrMode state);
+OSIntrMode OS_RestoreInterrupts_IrqAndFiq(register OSIntrMode state);
+OSIntrMode OS_GetCpsrIrq();
OSProcMode OS_GetProcMode();
-
+void OS_SpinWait();
+void OS_WaitVBlankIntr();
#endif //POKEDIAMOND_OS_SYSTEM_H
diff --git a/arm9/lib/include/consts.h b/arm9/lib/include/consts.h
index 6fc71be2..930f9af5 100644
--- a/arm9/lib/include/consts.h
+++ b/arm9/lib/include/consts.h
@@ -9,9 +9,9 @@
#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 HW_PSR_DISABLE_FIQ 0x40 // Disable FIQ
+#define HW_PSR_DISABLE_IRQ 0x80 // Disable IRQ
+#define HW_PSR_DISABLE_IRQ_FIQ 0xc0 // Disable FIQ and IRQ
#define HW_C6_PR_4KB 0x16
#define HW_C6_PR_8KB 0x18
@@ -42,4 +42,6 @@
#define OSi_TRUNC(n, a) (((u32) (n)) & ~((a) - 1))
#define OSi_ROUND(n, a) (((u32) (n) + (a) - 1) & ~((a) - 1))
+#define OS_IE_V_BLANK (1UL << 0)
+
#endif //POKEDIAMOND_CONSTS_H
diff --git a/arm9/lib/include/nitro.h b/arm9/lib/include/nitro.h
index 8d875653..f7397fb0 100644
--- a/arm9/lib/include/nitro.h
+++ b/arm9/lib/include/nitro.h
@@ -8,7 +8,7 @@ extern "C" {
// Include all nitro files
#include "types.h"
#include "consts.h"
-#include "OS.h"
+#include "OS_init.h"
#include "mmap.h"
#ifdef __cplusplus
diff --git a/arm9/lib/src/OS_init.c b/arm9/lib/src/OS_init.c
new file mode 100644
index 00000000..90b01ffa
--- /dev/null
+++ b/arm9/lib/src/OS_init.c
@@ -0,0 +1,38 @@
+//
+// Created by mart on 4/12/20.
+//
+
+#include "function_target.h"
+#include "OS_init.h"
+
+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();
+
+ARM_FUNC 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();
+}
diff --git a/arm9/lib/src/OS_system.c b/arm9/lib/src/OS_system.c
new file mode 100644
index 00000000..5e891ad9
--- /dev/null
+++ b/arm9/lib/src/OS_system.c
@@ -0,0 +1,71 @@
+//
+// Created by mart on 4/23/20.
+//
+
+#include "function_target.h"
+#include "OS_system.h"
+
+ARM_FUNC asm OSIntrMode OS_EnableInterrupts() {
+ mrs r0, cpsr
+ bic r1, r0, #HW_PSR_DISABLE_IRQ
+ msr cpsr_c, r1
+ and r0, r0, #HW_PSR_DISABLE_IRQ
+ bx lr
+}
+
+ARM_FUNC asm OSIntrMode OS_DisableInterrupts() {
+ mrs r0, cpsr
+ orr r1, r0, #HW_PSR_DISABLE_IRQ
+ msr cpsr_c, r1
+ and r0, r0, #HW_PSR_DISABLE_IRQ
+ bx lr
+}
+
+ARM_FUNC asm OSIntrMode OS_RestoreInterrupts(register OSIntrMode state) {
+ mrs r1, cpsr
+ bic r2, r1, #HW_PSR_DISABLE_IRQ
+ orr r2, r2, r0
+ msr cpsr_c, r2
+ and r0, r1, #HW_PSR_DISABLE_IRQ
+ bx lr
+}
+
+ARM_FUNC asm OSIntrMode OS_DisableInterrupts_IrqAndFiq() {
+ mrs r0, cpsr
+ orr r1, r0, #HW_PSR_DISABLE_IRQ_FIQ
+ msr cpsr_c, r1
+ and r0, r0, #HW_PSR_DISABLE_IRQ_FIQ
+ bx lr
+}
+
+ARM_FUNC asm OSIntrMode OS_RestoreInterrupts_IrqAndFiq(register OSIntrMode state) {
+ mrs r1, cpsr
+ bic r2, r1, #HW_PSR_DISABLE_IRQ_FIQ
+ orr r2, r2, r0
+ msr cpsr_c, r2
+ and r0, r1, #HW_PSR_DISABLE_IRQ_FIQ
+ bx lr
+}
+
+ARM_FUNC asm OSIntrMode OS_GetCpsrIrq() {
+ mrs r0, cpsr
+ and r0, r0, #HW_PSR_DISABLE_IRQ
+ bx lr
+}
+
+ARM_FUNC asm OSProcMode OS_GetProcMode() {
+ mrs r0, cpsr
+ and r0, r0, #HW_PSR_CPU_MODE_MASK
+ bx lr
+}
+
+ARM_FUNC asm void OS_SpinWait() {
+ subs r0, r0, #0x4
+ bhs OS_SpinWait
+ bx lr
+}
+
+ARM_FUNC void OS_WaitVBlankIntr() {
+ SVC_WaitByLoop(0x1);
+ OS_WaitIrq(TRUE, OS_IE_V_BLANK);
+}