summaryrefslogtreecommitdiff
path: root/arm7/lib
diff options
context:
space:
mode:
Diffstat (limited to 'arm7/lib')
-rw-r--r--arm7/lib/include/OS_init.h1
-rw-r--r--arm7/lib/include/OS_irqTable.h24
-rw-r--r--arm7/lib/include/mmap.h4
-rw-r--r--arm7/lib/src/OS_irqTable.c125
4 files changed, 152 insertions, 2 deletions
diff --git a/arm7/lib/include/OS_init.h b/arm7/lib/include/OS_init.h
index 6b70d2d8..b4836234 100644
--- a/arm7/lib/include/OS_init.h
+++ b/arm7/lib/include/OS_init.h
@@ -11,6 +11,7 @@
#include "OS_spinLock.h"
#include "OS_context.h"
#include "OS_interrupt.h"
+#include "OS_irqTable.h"
#include "OS_timer.h"
#include "OS_tick.h"
diff --git a/arm7/lib/include/OS_irqTable.h b/arm7/lib/include/OS_irqTable.h
new file mode 100644
index 00000000..523b96ae
--- /dev/null
+++ b/arm7/lib/include/OS_irqTable.h
@@ -0,0 +1,24 @@
+#ifndef POKEDIAMOND_ARM7_OS_IRQTABLE_H
+#define POKEDIAMOND_ARM7_OS_IRQTABLE_H
+
+#include "consts.h"
+#include "OS_interrupt.h"
+
+void OS_IrqDummy(void);
+void OSi_IrqCallback(s32 index);
+void OSi_IrqDma0(void);
+void OSi_IrqDma1(void);
+void OSi_IrqDma2(void);
+void OSi_IrqDma3(void);
+void OSi_IrqTimer0(void);
+void OSi_IrqTimer1(void);
+void OSi_IrqTimer2(void);
+void OSi_IrqTimer3(void);
+void OSi_IrqVBlank(void);
+
+static inline void OS_SetIrqCheckFlag(OSIrqMask intr)
+{
+ *(vu32 *)HW_INTR_CHECK_BUF |= (u32)intr;
+}
+
+#endif //POKEDIAMOND_ARM7_OS_IRQTABLE_H
diff --git a/arm7/lib/include/mmap.h b/arm7/lib/include/mmap.h
index f43b4bc4..12558eeb 100644
--- a/arm7/lib/include/mmap.h
+++ b/arm7/lib/include/mmap.h
@@ -9,7 +9,6 @@
#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)
@@ -23,8 +22,9 @@
#define HW_PRV_WRAM_SYSRV (HW_PRV_WRAM + HW_PRV_WRAM_SIZE - HW_PRV_WRAM_SYSRV_SIZE)
+#define HW_INTR_CHECK_BUF (HW_PRV_WRAM_SYSRV + 0x38)
+
#define HW_VBLANK_COUNT_BUF (HW_MAIN_MEM + 0x007ffc3c)
-#define HW_BUTTON_XY_BUF (HW_MAIN_MEM + 0x007FFFA8)
#define HW_LOCK_ID_FLAG_SUB (HW_MAIN_MEM + 0x007fffb8)
#endif //POKEDIAMOND_ARM7_MMAP_H
diff --git a/arm7/lib/src/OS_irqTable.c b/arm7/lib/src/OS_irqTable.c
new file mode 100644
index 00000000..91c08b2e
--- /dev/null
+++ b/arm7/lib/src/OS_irqTable.c
@@ -0,0 +1,125 @@
+#include "nitro/types.h"
+#include "function_target.h"
+#include "OS_irqTable.h"
+
+OSIrqFunction OS_IRQTable[25] = {
+ OSi_IrqVBlank,
+ OS_IrqDummy,
+ OS_IrqDummy,
+ OSi_IrqTimer0,
+ OSi_IrqTimer1,
+ OSi_IrqTimer2,
+ OSi_IrqTimer3,
+ OS_IrqDummy,
+ OSi_IrqDma0,
+ OSi_IrqDma1,
+ OSi_IrqDma2,
+ OSi_IrqDma3,
+ OS_IrqDummy,
+ OS_IrqDummy,
+ OS_IrqDummy,
+ OS_IrqDummy,
+ OS_IrqDummy,
+ OS_IrqDummy,
+ OS_IrqDummy,
+ OS_IrqDummy,
+ OS_IrqDummy,
+ OS_IrqDummy,
+ OS_IrqDummy,
+ OS_IrqDummy,
+ OS_IrqDummy
+};
+
+OSIrqCallbackInfo OSi_IrqCallbackInfo[9] = {
+ {NULL, 0, 0},
+ {NULL, 0, 0},
+ {NULL, 0, 0},
+ {NULL, 0, 0},
+ {NULL, 0, 0},
+ {NULL, 0, 0},
+ {NULL, 0, 0},
+ {NULL, 0, 0},
+ {NULL, 0, 0}
+};
+
+static u16 OSi_IrqCallbackInfoIndex[9] = {
+ 8, 9, 10, 11, 3, 4, 5, 6, 0
+};
+
+ARM_FUNC void OS_IrqDummy(void)
+{
+ //do nothing
+}
+
+ARM_FUNC void OSi_IrqCallback(s32 index)
+{
+ OSIrqMask imask = (1UL << OSi_IrqCallbackInfoIndex[index]);
+ void (*callback) (void *) = OSi_IrqCallbackInfo[index].func;
+
+ OSi_IrqCallbackInfo[index].func = NULL;
+
+ if (callback)
+ {
+ (callback)(OSi_IrqCallbackInfo[index].arg);
+ }
+
+ OS_SetIrqCheckFlag(imask);
+
+ if (!OSi_IrqCallbackInfo[index].enable)
+ {
+ (void)OS_DisableIrqMask(imask);
+ }
+}
+
+ARM_FUNC void OSi_IrqDma0(void)
+{
+ OSi_IrqCallback(0);
+}
+
+ARM_FUNC void OSi_IrqDma1(void)
+{
+ OSi_IrqCallback(1);
+}
+
+ARM_FUNC void OSi_IrqDma2(void)
+{
+ OSi_IrqCallback(2);
+}
+ARM_FUNC void OSi_IrqDma3(void)
+{
+ OSi_IrqCallback(3);
+}
+
+ARM_FUNC void OSi_IrqTimer0(void)
+{
+ OSi_IrqCallback(4);
+}
+
+ARM_FUNC void OSi_IrqTimer1(void)
+{
+ OSi_IrqCallback(5);
+}
+
+ARM_FUNC void OSi_IrqTimer2(void)
+{
+ OSi_IrqCallback(6);
+}
+
+ARM_FUNC void OSi_IrqTimer3(void)
+{
+ OSi_IrqCallback(7);
+}
+
+ARM_FUNC void OSi_IrqVBlank(void)
+{
+ void (*callback) (void) = (void (*)(void))OSi_IrqCallbackInfo[8].func;
+
+ (*(u32 *)HW_VBLANK_COUNT_BUF)++;
+
+ if (callback)
+ {
+ (callback)();
+ }
+
+ OS_SetIrqCheckFlag(1UL << 0);
+}