summaryrefslogtreecommitdiff
path: root/arm7
diff options
context:
space:
mode:
authorPikalaxALT <pikalaxalt@gmail.com>2020-07-28 12:21:45 -0400
committerPikalaxALT <pikalaxalt@gmail.com>2020-07-28 12:21:45 -0400
commit22c2ecce6e0f920b9bdc0b6e9ca40d0f426b84b8 (patch)
treeabde28c36ffc10b95e36075d8ebd35dc501f9d8f /arm7
parentc58dec395fd3233bc329b4380841228370b1fb1c (diff)
parent3aeabb3efb6e7b40de1350550ddf0e347f51908b (diff)
Merge branch 'master' of github.com:pret/pokediamond into pikalax_work
Diffstat (limited to 'arm7')
-rw-r--r--arm7/asm/OS_irqHandler.s8
-rw-r--r--arm7/asm/OS_irqTable.s204
-rw-r--r--arm7/asm/itcm.s10
-rw-r--r--arm7/lib/include/OS_init.h1
-rw-r--r--arm7/lib/include/OS_irqTable.h24
-rw-r--r--arm7/lib/include/OS_thread.h11
-rw-r--r--arm7/lib/include/mmap.h4
-rw-r--r--arm7/lib/src/OS_irqTable.c125
-rw-r--r--arm7/lib/src/OS_thread.c12
9 files changed, 176 insertions, 223 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/asm/itcm.s b/arm7/asm/itcm.s
index 48ed9199..ac320e6c 100644
--- a/arm7/asm/itcm.s
+++ b/arm7/asm/itcm.s
@@ -20,10 +20,10 @@ _027E0014:
cmp r1, #100663296 ; 0x6000000
bne _027E00AC
ldr r3, _027E00CC ; =0x027E00DC
- ldr r0, _027E00D0 ; =0x0380A3F4
+ ldr r0, _027E00D0 ; =_0380A3F4
str r3, [r0]
add r2, r5, r4
- ldr r0, _027E00D4 ; =0x0380A3FC
+ ldr r0, _027E00D4 ; =_0380A3FC
str r2, [r0]
ldr r1, _027E00D8 ; =0x027FAFCC
add r0, r3, r2
@@ -31,7 +31,7 @@ _027E0014:
beq _027E0060
bl OS_Terminate
_027E0060:
- ldr r0, _027E00D0 ; =0x0380A3F4
+ ldr r0, _027E00D0 ; =_0380A3F4
ldr r3, [r0]
mov r2, #0
mov r1, r5, lsr #2
@@ -66,6 +66,6 @@ _027E00C0: .word 0x023801B0
_027E00C4: .word 0x023A92F8
_027E00C8: .word 0x023A931C
_027E00CC: .word 0x027E00DC
-_027E00D0: .word 0x0380A3F4
-_027E00D4: .word 0x0380A3FC
+_027E00D0: .word _0380A3F4
+_027E00D4: .word _0380A3FC
_027E00D8: .word 0x027FAFCC
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/OS_thread.h b/arm7/lib/include/OS_thread.h
index b1d3a01b..701acc94 100644
--- a/arm7/lib/include/OS_thread.h
+++ b/arm7/lib/include/OS_thread.h
@@ -4,20 +4,10 @@
#include "OS_context.h"
#include "nitro/OS_thread_shared.h"
-static s32 OSi_GetUnusedThreadId(void);
-static void OSi_InsertLinkToQueue(OSThreadQueue *queue, OSThread *thread);
-static OSThread *OSi_RemoveLinkFromQueue(OSThreadQueue *queue);
-static OSThread *OSi_RemoveSpecifiedLinkFromQueue(OSThreadQueue *queue, OSThread *thread);
OSMutex *OSi_RemoveMutexLinkFromQueue(OSMutexQueue *queue);
-static void OSi_InsertThreadToList(OSThread *thread);
-static void OSi_RemoveThreadFromList(OSThread *thread);
-static void OSi_RescheduleThread(void);
void OS_InitThread(void);
void OS_CreateThread(OSThread *thread, void (*func) (void *), void *arg, void *stack, u32 stackSize, u32 prio);
void OS_ExitThread(void);
-static void OSi_ExitThread_ArgSpecified(OSThread *thread, void *arg);
-static void OSi_ExitThread(void *arg);
-static void OSi_ExitThread_Destroy(void);
void OS_JoinThread(OSThread *thread);
BOOL OS_IsThreadTerminated(const OSThread *thread);
void OS_SleepThread(OSThreadQueue *queue);
@@ -27,7 +17,6 @@ OSThread *OS_SelectThread(void);
void OS_RescheduleThread(void);
BOOL OS_SetThreadPriority(OSThread *thread, u32 prio);
void OS_Sleep(u32 msec);
-static void OSi_SleepAlarmCallback(void *arg);
OSSwitchThreadCallback OS_SetSwitchThreadCallback(OSSwitchThreadCallback callback);
u32 OS_DisableScheduler(void);
u32 OS_EnableScheduler(void);
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/arm7/lib/src/OS_thread.c b/arm7/lib/src/OS_thread.c
index be3f611d..6db0b4f7 100644
--- a/arm7/lib/src/OS_thread.c
+++ b/arm7/lib/src/OS_thread.c
@@ -29,6 +29,18 @@ static s32 OSi_ThreadIdCount = 0;
OSThread OSi_LauncherThread;
OSThread OSi_IdleThread;
+static s32 OSi_GetUnusedThreadId(void);
+static void OSi_InsertLinkToQueue(OSThreadQueue *queue, OSThread *thread);
+static OSThread *OSi_RemoveLinkFromQueue(OSThreadQueue *queue);
+static OSThread *OSi_RemoveSpecifiedLinkFromQueue(OSThreadQueue *queue, OSThread *thread);
+static void OSi_InsertThreadToList(OSThread *thread);
+static void OSi_RemoveThreadFromList(OSThread *thread);
+static void OSi_RescheduleThread(void);
+static void OSi_ExitThread_ArgSpecified(OSThread *thread, void *arg);
+static void OSi_ExitThread(void *arg);
+static void OSi_ExitThread_Destroy(void);
+static void OSi_SleepAlarmCallback(void *arg);
+
ARM_FUNC static s32 OSi_GetUnusedThreadId(void)
{
return ++OSi_ThreadIdCount;