summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorred031000 <rubenru09@aol.com>2020-07-27 21:09:56 +0100
committerred031000 <rubenru09@aol.com>2020-07-27 21:10:05 +0100
commit2202000c6869dbaad3b8fde381b6facfb3e651bb (patch)
tree944e7253f20550ae77719608b91d21f54eab6091
parentd9ea992246a6d29133fc5accb03cfb8dcc4665f6 (diff)
arm7 OS_irqTable
-rw-r--r--arm7/asm/OS_irqHandler.s8
-rw-r--r--arm7/asm/OS_irqTable.s204
-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
-rw-r--r--arm9/lib/include/OS_irqTable.h6
-rw-r--r--arm9/lib/include/mmap.h3
-rw-r--r--include/nitro/mmap_shared.h4
9 files changed, 166 insertions, 213 deletions
diff --git a/arm7/asm/OS_irqHandler.s b/arm7/asm/OS_irqHandler.s
index b05113f1..8639392c 100644
--- a/arm7/asm/OS_irqHandler.s
+++ b/arm7/asm/OS_irqHandler.s
@@ -1,7 +1,13 @@
.include "asm/macros.inc"
.include "global.inc"
- .section .text
+ .section .bss
+
+ .global OSi_IrqThreadQueue
+OSi_IrqThreadQueue: ;0x0380770C
+ .space 0x03807714 - 0x0380770C
+
+ .section .text
arm_func_start OS_IrqHandler
OS_IrqHandler: ; 0x037F853C
diff --git a/arm7/asm/OS_irqTable.s b/arm7/asm/OS_irqTable.s
deleted file mode 100644
index 36a550fe..00000000
--- a/arm7/asm/OS_irqTable.s
+++ /dev/null
@@ -1,204 +0,0 @@
- .include "asm/macros.inc"
- .include "global.inc"
-
- .section .data
-
- .global _038075E4
-_038075E4:
- .word 0x00090008
- .word 0x000B000A
- .word 0x00040003
- .word 0x00060005
- .word 0x00000000
-
- .global OS_IRQTable
-OS_IRQTable:
- .word OSi_IrqVBlank
- .word OS_IrqDummy
- .word OS_IrqDummy
- .word OSi_IrqTimer0
- .word OSi_IrqTimer1
- .word OSi_IrqTimer2
- .word OSi_IrqTimer3
- .word OS_IrqDummy
- .word OSi_IrqDma0
- .word OSi_IrqDma1
- .word OSi_IrqDma2
- .word OSi_IrqDma3
- .word OS_IrqDummy
- .word OS_IrqDummy
- .word OS_IrqDummy
- .word OS_IrqDummy
- .word OS_IrqDummy
- .word OS_IrqDummy
- .word OS_IrqDummy
- .word OS_IrqDummy
- .word OS_IrqDummy
- .word OS_IrqDummy
- .word OS_IrqDummy
- .word OS_IrqDummy
- .word OS_IrqDummy
-
- .section .bss
-
- .global OSi_IrqThreadQueue
-OSi_IrqThreadQueue: ;0x0380770C
- .space 0x03807714 - 0x0380770C
-
- .global OSi_IrqCallbackInfo
-OSi_IrqCallbackInfo: ;0x03807714
- .space 0x03807718 - 0x03807714
-
- .global _03807718
-_03807718: ;0x03807718
- .space 0x0380771C - 0x03807718
-
- .global _0380771C
-_0380771C: ;0x0380771C
- .space 0x03807744 - 0x0380771C
-
- .global _03807744
-_03807744: ;0x03807744
- .space 0x03807748 - 0x03807744
-
- .global _03807748
-_03807748: ;0x03807748
- .space 0x0380774C - 0x03807748
-
- .global _0380774C
-_0380774C: ;0x0380774C
- .space 0x03807774 - 0x0380774C
-
- .global _03807774
-_03807774: ;0x03807774
- .space 0x03807780 - 0x03807774
-
- .section .text
-
- arm_func_start OSi_IrqVBlank
-OSi_IrqVBlank: ; 0x037F86B4
- stmfd sp!, {lr}
- sub sp, sp, #4
- ldr r0, _037F8700 ; =OSi_IrqCallbackInfo
- ldr r2, [r0, #96] ; 0x60
- ldr r1, _037F8704 ; =0x027FFC3C
- ldr r0, [r1]
- add r0, r0, #1
- str r0, [r1]
- cmp r2, #0
- beq _037F86E4
- mov lr, pc
- bx r2
-_037F86E4:
- ldr r1, _037F8708 ; =0x0380FFF8
- ldr r0, [r1]
- orr r0, r0, #1
- str r0, [r1]
- add sp, sp, #4
- ldmia sp!, {lr}
- bx lr
-_037F8700: .word OSi_IrqCallbackInfo
-_037F8704: .word 0x027FFC3C
-_037F8708: .word 0x0380FFF8
-
- arm_func_start OSi_IrqTimer3
-OSi_IrqTimer3: ; 0x037F870C
- mov r0, #7
- ldr ip, _037F8718 ; =OSi_IrqCallback
- bx ip
-_037F8718: .word OSi_IrqCallback
-
- arm_func_start OSi_IrqTimer2
-OSi_IrqTimer2: ; 0x037F871C
- mov r0, #6
- ldr ip, _037F8728 ; =OSi_IrqCallback
- bx ip
-_037F8728: .word OSi_IrqCallback
-
- arm_func_start OSi_IrqTimer1
-OSi_IrqTimer1: ; 0x037F872C
- mov r0, #5
- ldr ip, _037F8738 ; =OSi_IrqCallback
- bx ip
-_037F8738: .word OSi_IrqCallback
-
- arm_func_start OSi_IrqTimer0
-OSi_IrqTimer0: ; 0x037F873C
- mov r0, #4
- ldr ip, _037F8748 ; =OSi_IrqCallback
- bx ip
-_037F8748: .word OSi_IrqCallback
-
- arm_func_start OSi_IrqDma3
-OSi_IrqDma3: ; 0x037F874C
- mov r0, #3
- ldr ip, _037F8758 ; =OSi_IrqCallback
- bx ip
-_037F8758: .word OSi_IrqCallback
-
- arm_func_start OSi_IrqDma2
-OSi_IrqDma2: ; 0x037F875C
- mov r0, #2
- ldr ip, _037F8768 ; =OSi_IrqCallback
- bx ip
-_037F8768: .word OSi_IrqCallback
-
- arm_func_start OSi_IrqDma1
-OSi_IrqDma1: ; 0x037F876C
- mov r0, #1
- ldr ip, _037F8778 ; =OSi_IrqCallback
- bx ip
-_037F8778: .word OSi_IrqCallback
-
- arm_func_start OSi_IrqDma0
-OSi_IrqDma0: ; 0x037F877C
- mov r0, #0
- ldr ip, _037F8788 ; =OSi_IrqCallback
- bx ip
-_037F8788: .word OSi_IrqCallback
-
- arm_func_start OSi_IrqCallback
-OSi_IrqCallback: ; 0x037F878C
- stmdb sp!, {r4, r5, lr}
- sub sp, sp, #4
- mov r3, #1
- mov r2, r0, lsl #1
- ldr r1, _037F880C ; =_038075E4
- ldrh r1, [r1, r2]
- mov r5, r3, lsl r1
- mov r1, #12
- mul r4, r0, r1
- ldr r2, _037F8810 ; =OSi_IrqCallbackInfo
- ldr r1, [r2, r4]
- mov r0, #0
- str r0, [r2, r4]
- cmp r1, #0
- beq _037F87D8
- ldr r0, _037F8814 ; =_0380771C
- ldr r0, [r0, r4]
- mov lr, pc
- bx r1
-_037F87D8:
- ldr r1, _037F8818 ; =0x0380FFF8
- ldr r0, [r1]
- orr r0, r0, r5
- str r0, [r1]
- ldr r0, _037F881C ; =_03807718
- ldr r0, [r0, r4]
- cmp r0, #0
- bne _037F8800
- mov r0, r5
- bl OS_DisableIrqMask
-_037F8800:
- add sp, sp, #4
- ldmia sp!, {r4, r5, lr}
- bx lr
-_037F880C: .word _038075E4
-_037F8810: .word OSi_IrqCallbackInfo
-_037F8814: .word _0380771C
-_037F8818: .word 0x0380FFF8
-_037F881C: .word _03807718
-
- arm_func_start OS_IrqDummy
-OS_IrqDummy: ; 0x037F8820
- bx lr
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);
+}
diff --git a/arm9/lib/include/OS_irqTable.h b/arm9/lib/include/OS_irqTable.h
index 8cd7b7b3..10165a11 100644
--- a/arm9/lib/include/OS_irqTable.h
+++ b/arm9/lib/include/OS_irqTable.h
@@ -1,5 +1,5 @@
-#ifndef POKEDIAMOND_OS_IRQTABLE_H
-#define POKEDIAMOND_OS_IRQTABLE_H
+#ifndef POKEDIAMOND_ARM9_OS_IRQTABLE_H
+#define POKEDIAMOND_ARM9_OS_IRQTABLE_H
#include "consts.h"
#include "OS_interrupt.h"
@@ -20,4 +20,4 @@ static inline void OS_SetIrqCheckFlag(OSIrqMask intr)
*(vu32 *)HW_INTR_CHECK_BUF |= (u32)intr;
}
-#endif //POKEDIAMOND_OS_IRQTABLE_H
+#endif //POKEDIAMOND_ARM9_OS_IRQTABLE_H
diff --git a/arm9/lib/include/mmap.h b/arm9/lib/include/mmap.h
index 143b609b..8b30ffc8 100644
--- a/arm9/lib/include/mmap.h
+++ b/arm9/lib/include/mmap.h
@@ -32,7 +32,6 @@ extern u32 SDK_AUTOLOAD_DTCM_START[];
#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 HW_DTCM_SVC_STACK_END (HW_DTCM + 0x00003fc0)
-#define HW_SVC_STACK_SIZE 0x00000040
#define HW_DTCM_SVC_STACK (HW_DTCM_SVC_STACK_END - HW_SVC_STACK_SIZE)
#define HW_DTCM_IRQ_STACK_END (HW_DTCM_SVC_STACK)
@@ -49,8 +48,6 @@ extern u32 SDK_AUTOLOAD_DTCM_START[];
#define HW_SHARED_LOCK_BUF (HW_MAIN_MEM + 0x007fffc0)
#define HW_CARD_LOCK_BUF (HW_MAIN_MEM + 0x007fffe0)
-#define HW_BUTTON_XY_BUF (HW_MAIN_MEM + 0x007fffa8)
-
#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)
diff --git a/include/nitro/mmap_shared.h b/include/nitro/mmap_shared.h
index 60c0c1cb..d99044da 100644
--- a/include/nitro/mmap_shared.h
+++ b/include/nitro/mmap_shared.h
@@ -27,4 +27,8 @@
#define HW_INIT_LOCK_BUF (HW_MAIN_MEM + 0x007ffff0)
#define HW_MAIN_MEM_MAIN_END (HW_MAIN_MEM + HW_MAIN_MEM_MAIN_SIZE)
+#define HW_SVC_STACK_SIZE 0x00000040
+
+#define HW_BUTTON_XY_BUF (HW_MAIN_MEM + 0x007FFFA8)
+
#endif //POKEDIAMOND_MMAP_SHARED_H