summaryrefslogtreecommitdiff
path: root/arm7
diff options
context:
space:
mode:
authorred031000 <rubenru09@aol.com>2020-06-14 21:47:39 +0100
committerred031000 <rubenru09@aol.com>2020-06-14 21:48:42 +0100
commitc734347a8fed09aff1aacaad89eb7db831a00a3c (patch)
treebf1df18b2414e6c94b5d1f46f2b5765923e94897 /arm7
parent30c442497e7e2d8eb5cb6b318b0888dcb64f5977 (diff)
arm7 OS_interrupt
Diffstat (limited to 'arm7')
-rw-r--r--arm7/asm/OS_interrupt.s173
-rw-r--r--arm7/asm/OS_irqHandler.s38
-rw-r--r--arm7/asm/OS_irqTable.s54
-rw-r--r--arm7/lib/include/OS_context.h16
-rw-r--r--arm7/lib/include/OS_init.h3
-rw-r--r--arm7/lib/include/OS_interrupt.h17
-rw-r--r--arm7/lib/include/OS_thread.h7
-rw-r--r--arm7/lib/include/consts.h1
-rw-r--r--arm7/lib/include/mmap.h1
-rw-r--r--arm7/lib/include/registers.h6
-rw-r--r--arm7/lib/src/OS_init.c2
-rw-r--r--arm7/lib/src/OS_interrupt.c106
12 files changed, 211 insertions, 213 deletions
diff --git a/arm7/asm/OS_interrupt.s b/arm7/asm/OS_interrupt.s
deleted file mode 100644
index 0a999637..00000000
--- a/arm7/asm/OS_interrupt.s
+++ /dev/null
@@ -1,173 +0,0 @@
- .include "asm/macros.inc"
- .include "global.inc"
-
- .section .bss
-
- .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 OS_ResetRequestIrqMask
-OS_ResetRequestIrqMask: ; 0x037F8824
- ldr ip, _037F8850 ; =0x04000208
- ldrh r3, [ip]
- mov r1, #0
- strh r1, [ip]
- ldr r2, _037F8854 ; =0x04000214
- ldr r1, [r2]
- str r0, [r2]
- ldrh r0, [ip]
- strh r3, [ip]
- mov r0, r1
- bx lr
-_037F8850: .word 0x04000208
-_037F8854: .word 0x04000214
-
- arm_func_start OS_DisableIrqMask
-OS_DisableIrqMask: ; 0x037F8858
- ldr ip, _037F888C ; =0x04000208
- ldrh r3, [ip]
- mov r1, #0
- strh r1, [ip]
- ldr r2, _037F8890 ; =0x04000210
- ldr r1, [r2]
- mvn r0, r0
- and r0, r1, r0
- str r0, [r2]
- ldrh r0, [ip]
- strh r3, [ip]
- mov r0, r1
- bx lr
-_037F888C: .word 0x04000208
-_037F8890: .word 0x04000210
-
- arm_func_start OS_EnableIrqMask
-OS_EnableIrqMask: ; 0x037F8894
- ldr ip, _037F88C4 ; =0x04000208
- ldrh r3, [ip]
- mov r1, #0
- strh r1, [ip]
- ldr r2, _037F88C8 ; =0x04000210
- ldr r1, [r2]
- orr r0, r1, r0
- str r0, [r2]
- ldrh r0, [ip]
- strh r3, [ip]
- mov r0, r1
- bx lr
-_037F88C4: .word 0x04000208
-_037F88C8: .word 0x04000210
-
- arm_func_start OS_SetIrqMask
-OS_SetIrqMask: ; 0x037F88CC
- ldr ip, _037F88F8 ; =0x04000208
- ldrh r3, [ip]
- mov r1, #0
- strh r1, [ip]
- ldr r2, _037F88FC ; =0x04000210
- ldr r1, [r2]
- str r0, [r2]
- ldrh r0, [ip]
- strh r3, [ip]
- mov r0, r1
- bx lr
-_037F88F8: .word 0x04000208
-_037F88FC: .word 0x04000210
-
- arm_func_start OSi_EnterTimerCallback
-OSi_EnterTimerCallback: ; 0x037F8900
- stmdb sp!, {r4, lr}
- mov r3, #12
- mul r4, r0, r3
- ldr r3, _037F8940 ; =_03807744
- str r1, [r3, r4]
- ldr r1, _037F8944 ; =_0380774C
- str r2, [r1, r4]
- mov r1, #1
- add r0, r0, #3
- mov r0, r1, lsl r0
- bl OS_EnableIrqMask
- mov r1, #1
- ldr r0, _037F8948 ; =_03807748
- str r1, [r0, r4]
- ldmia sp!, {r4, lr}
- bx lr
-_037F8940: .word _03807744
-_037F8944: .word _0380774C
-_037F8948: .word _03807748
-
- arm_func_start OS_SetIrqFunction
-OS_SetIrqFunction: ; 0x037F894C
- stmdb sp!, {r4, r5, r6, r7, r8, r9, lr}
- sub sp, sp, #4
- mov r9, #0
- mov r7, r9
- ldr lr, _037F89E8 ; =OS_IRQTable
- ldr r4, _037F89EC ; =_03807774
- ldr r6, _037F89F0 ; =OSi_IrqCallbackInfo
- mov ip, r9
- mov r3, #1
- mov r2, #12
-_037F8974:
- ands r5, r0, #1
- beq _037F89CC
- mov r8, r7
- cmp r9, #8
- blt _037F8998
- cmp r9, #11
- suble r5, r9, #8
- mlale r8, r5, r2, r6
- ble _037F89BC
-_037F8998:
- cmp r9, #3
- blt _037F89B0
- cmp r9, #6
- addle r5, r9, #1
- mlale r8, r5, r2, r6
- ble _037F89BC
-_037F89B0:
- cmp r9, #0
- moveq r8, r4
- strne r1, [lr, r9, lsl #2]
-_037F89BC:
- cmp r8, #0
- strne r1, [r8]
- strne ip, [r8, #8]
- strne r3, [r8, #4]
-_037F89CC:
- mov r0, r0, lsr #1
- add r9, r9, #1
- cmp r9, #25
- blt _037F8974
- add sp, sp, #4
- ldmia sp!, {r4, r5, r6, r7, r8, r9, lr}
- bx lr
-_037F89E8: .word OS_IRQTable
-_037F89EC: .word _03807774
-_037F89F0: .word OSi_IrqCallbackInfo
-
- arm_func_start OS_InitIrqTable
-OS_InitIrqTable: ; 0x037F89F4
- mov r1, #0
- ldr r0, _037F8A10 ; =OSi_IrqThreadQueue
- str r1, [r0, #4]
- str r1, [r0]
- ldr r0, _037F8A14 ; =0x027FFC3C
- str r1, [r0]
- bx lr
-_037F8A10: .word OSi_IrqThreadQueue
-_037F8A14: .word 0x027FFC3C
diff --git a/arm7/asm/OS_irqHandler.s b/arm7/asm/OS_irqHandler.s
index 6c3ffc5a..b05113f1 100644
--- a/arm7/asm/OS_irqHandler.s
+++ b/arm7/asm/OS_irqHandler.s
@@ -1,44 +1,6 @@
.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 .text
arm_func_start OS_IrqHandler
diff --git a/arm7/asm/OS_irqTable.s b/arm7/asm/OS_irqTable.s
index a61e448f..36a550fe 100644
--- a/arm7/asm/OS_irqTable.s
+++ b/arm7/asm/OS_irqTable.s
@@ -1,6 +1,44 @@
.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
@@ -19,6 +57,22 @@ _03807718: ;0x03807718
_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
diff --git a/arm7/lib/include/OS_context.h b/arm7/lib/include/OS_context.h
new file mode 100644
index 00000000..7819e29c
--- /dev/null
+++ b/arm7/lib/include/OS_context.h
@@ -0,0 +1,16 @@
+#ifndef POKEDIAMOND_ARM7_OS_CONTEXT_H
+#define POKEDIAMOND_ARM7_OS_CONTEXT_H
+
+#include "nitro/types.h"
+
+typedef struct OSContext
+{
+ u32 cpsr;
+ u32 r[13];
+ u32 sp;
+ u32 lr;
+ u32 pc_plus4;
+ u32 sp_svc;
+} OSContext;
+
+#endif //POKEDIAMOND_ARM7_OS_CONTEXT_H
diff --git a/arm7/lib/include/OS_init.h b/arm7/lib/include/OS_init.h
index c4e1ca37..03d64ae1 100644
--- a/arm7/lib/include/OS_init.h
+++ b/arm7/lib/include/OS_init.h
@@ -7,6 +7,9 @@
#include "OS_alloc.h"
#include "OS_reset.h"
#include "OS_terminate_proc.h"
+#include "OS_spinLock.h"
+#include "OS_context.h"
+#include "OS_interrupt.h"
void OS_Init(void);
diff --git a/arm7/lib/include/OS_interrupt.h b/arm7/lib/include/OS_interrupt.h
index afcb9b5f..fb869483 100644
--- a/arm7/lib/include/OS_interrupt.h
+++ b/arm7/lib/include/OS_interrupt.h
@@ -2,5 +2,22 @@
#define POKEDIAMOND_ARM7_OS_INTERRUPT_H
#include "nitro/OS_interrupt_shared.h"
+#include "consts.h"
+
+extern OSIrqFunction OS_IRQTable[];
+extern OSIrqCallbackInfo OSi_IrqCallbackInfo[9];
+
+static inline void OSi_SetVBlankCount(u32 count)
+{
+ *(u32 *)HW_VBLANK_COUNT_BUF = count;
+}
+
+void OS_InitIrqTable(void);
+void OS_SetIrqFunction(OSIrqMask intrBit, OSIrqFunction function);
+void OSi_EnterTimerCallback(u32 timerNo, void (*callback) (void *), void *arg);
+OSIrqMask OS_SetIrqMask(OSIrqMask mask);
+OSIrqMask OS_EnableIrqMask(OSIrqMask mask);
+OSIrqMask OS_DisableIrqMask(OSIrqMask mask);
+OSIrqMask OS_ResetRequestIrqMask(OSIrqMask mask);
#endif //POKEDIAMOND_ARM7_OS_INTERRUPT_H
diff --git a/arm7/lib/include/OS_thread.h b/arm7/lib/include/OS_thread.h
new file mode 100644
index 00000000..04e4fdcb
--- /dev/null
+++ b/arm7/lib/include/OS_thread.h
@@ -0,0 +1,7 @@
+#ifndef POKEDIAMOND_ARM7_OS_THREAD_H
+#define POKEDIAMOND_ARM7_OS_THREAD_H
+
+#include "OS_context.h"
+#include "nitro/OS_thread_shared.h"
+
+#endif //POKEDIAMOND_ARM7_OS_THREAD_H
diff --git a/arm7/lib/include/consts.h b/arm7/lib/include/consts.h
index dd297402..966b5a4b 100644
--- a/arm7/lib/include/consts.h
+++ b/arm7/lib/include/consts.h
@@ -3,5 +3,6 @@
#include "nitro/consts_shared.h"
#include "mmap.h"
+#include "registers.h"
#endif //POKEDIAMOND_ARM7_CONSTS_H
diff --git a/arm7/lib/include/mmap.h b/arm7/lib/include/mmap.h
index 064938e2..1b403dc5 100644
--- a/arm7/lib/include/mmap.h
+++ b/arm7/lib/include/mmap.h
@@ -23,6 +23,7 @@
#define HW_PRV_WRAM_SYSRV (HW_PRV_WRAM + HW_PRV_WRAM_SIZE - HW_PRV_WRAM_SYSRV_SIZE)
+#define HW_VBLANK_COUNT_BUF (HW_MAIN_MEM + 0x007ffc3c)
#define HW_LOCK_ID_FLAG_SUB (HW_MAIN_MEM + 0x007fffb8)
#endif //POKEDIAMOND_ARM7_MMAP_H
diff --git a/arm7/lib/include/registers.h b/arm7/lib/include/registers.h
new file mode 100644
index 00000000..4ef8bdfb
--- /dev/null
+++ b/arm7/lib/include/registers.h
@@ -0,0 +1,6 @@
+#ifndef POKEDIAMOND_ARM7_REGISTERS_H
+#define POKEDIAMOND_ARM7_REGISTERS_H
+
+#include "nitro/registers_shared.h"
+
+#endif //POKEDIAMOND_ARM7_REGISTERS_H
diff --git a/arm7/lib/src/OS_init.c b/arm7/lib/src/OS_init.c
index 583bb75e..271d067b 100644
--- a/arm7/lib/src/OS_init.c
+++ b/arm7/lib/src/OS_init.c
@@ -2,8 +2,6 @@
#include "OS_init.h"
extern void PXI_Init(void);
-extern void OS_InitLock(void);
-extern void OS_InitIrqTable(void);
extern void OS_InitTick(void);
extern void OS_InitAlarm(void);
extern void OS_InitThread(void);
diff --git a/arm7/lib/src/OS_interrupt.c b/arm7/lib/src/OS_interrupt.c
new file mode 100644
index 00000000..e9fc3347
--- /dev/null
+++ b/arm7/lib/src/OS_interrupt.c
@@ -0,0 +1,106 @@
+#include "function_target.h"
+#include "consts.h"
+#include "OS_interrupt.h"
+#include "OS_thread.h"
+
+extern OSThreadQueue OSi_IrqThreadQueue;
+
+ARM_FUNC void OS_InitIrqTable(void)
+{
+ OS_InitThreadQueue(&OSi_IrqThreadQueue);
+
+ OSi_SetVBlankCount(0);
+}
+
+ARM_FUNC void OS_SetIrqFunction(OSIrqMask intrBit, OSIrqFunction function)
+{
+ s32 i;
+ OSIrqCallbackInfo *info;
+
+ for (i = 0; i < 25; i++)
+ {
+ if (intrBit & 1)
+ {
+ info = NULL;
+
+ if (8 <= i && i <= 11)
+ {
+ info = &OSi_IrqCallbackInfo[i - 8];
+ }
+ else if (3 <= i && i <= 6)
+ {
+ info = &OSi_IrqCallbackInfo[i - 3 + 4];
+ }
+ else if (0 == i)
+ {
+ info = &OSi_IrqCallbackInfo[8];
+ }
+ else
+ {
+ OS_IRQTable[i] = function;
+ }
+
+ if (info)
+ {
+ info->func = (void (*)(void *))function;
+ info->arg = 0;
+ info->enable = TRUE;
+ }
+ }
+ intrBit >>= 1;
+ }
+}
+
+ARM_FUNC void OSi_EnterTimerCallback(u32 timerNo, void (*callback) (void *), void *arg)
+{
+ OSIrqMask mask = 1UL << (timerNo + 3);
+ OSi_IrqCallbackInfo[timerNo + 4].func = callback;
+ OSi_IrqCallbackInfo[timerNo + 4].arg = arg;
+
+ (void)OS_EnableIrqMask(mask);
+ OSi_IrqCallbackInfo[timerNo + 4].enable = TRUE;
+}
+
+ARM_FUNC OSIrqMask OS_SetIrqMask(OSIrqMask mask)
+{
+ u16 regIme = reg_OS_IME;
+ reg_OS_IME = 0;
+ OSIrqMask regIe = reg_OS_IE;
+ reg_OS_IE = mask;
+ u16 unused = reg_OS_IME; //needed because otherwise it doesn't match
+ reg_OS_IME = regIme;
+ return regIe;
+}
+
+ARM_FUNC OSIrqMask OS_EnableIrqMask(OSIrqMask mask)
+{
+ u16 regIme = reg_OS_IME;
+ reg_OS_IME = 0;
+ OSIrqMask regIe = reg_OS_IE;
+ reg_OS_IE = regIe | mask;
+ u16 unused = reg_OS_IME;
+ reg_OS_IME = regIme;
+ return regIe;
+}
+
+ARM_FUNC OSIrqMask OS_DisableIrqMask(OSIrqMask mask)
+{
+ u16 regIme = reg_OS_IME;
+ reg_OS_IME = 0;
+ OSIrqMask regIe = reg_OS_IE;
+ reg_OS_IE = regIe & ~mask;
+ u16 unused = reg_OS_IME;
+ reg_OS_IME = regIme;
+ return regIe;
+}
+
+ARM_FUNC OSIrqMask OS_ResetRequestIrqMask(OSIrqMask mask)
+{
+ u16 regIme = reg_OS_IME;
+ reg_OS_IME = 0;
+ OSIrqMask regIf = reg_OS_IF;
+ reg_OS_IF = mask;
+ u16 unused = reg_OS_IME;
+ reg_OS_IME = regIme;
+ return regIf;
+}