diff options
author | PikalaxALT <pikalaxalt@gmail.com> | 2020-07-28 12:21:45 -0400 |
---|---|---|
committer | PikalaxALT <pikalaxalt@gmail.com> | 2020-07-28 12:21:45 -0400 |
commit | 22c2ecce6e0f920b9bdc0b6e9ca40d0f426b84b8 (patch) | |
tree | abde28c36ffc10b95e36075d8ebd35dc501f9d8f /arm7/lib/src | |
parent | c58dec395fd3233bc329b4380841228370b1fb1c (diff) | |
parent | 3aeabb3efb6e7b40de1350550ddf0e347f51908b (diff) |
Merge branch 'master' of github.com:pret/pokediamond into pikalax_work
Diffstat (limited to 'arm7/lib/src')
-rw-r--r-- | arm7/lib/src/OS_irqTable.c | 125 | ||||
-rw-r--r-- | arm7/lib/src/OS_thread.c | 12 |
2 files changed, 137 insertions, 0 deletions
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; |