summaryrefslogtreecommitdiff
path: root/arm7/lib
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/lib
parentc58dec395fd3233bc329b4380841228370b1fb1c (diff)
parent3aeabb3efb6e7b40de1350550ddf0e347f51908b (diff)
Merge branch 'master' of github.com:pret/pokediamond into pikalax_work
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/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
6 files changed, 164 insertions, 13 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/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;