diff options
Diffstat (limited to 'arm9/lib/src')
-rw-r--r-- | arm9/lib/src/OS_init.c | 1 | ||||
-rw-r--r-- | arm9/lib/src/OS_interrupt.c | 69 | ||||
-rw-r--r-- | arm9/lib/src/OS_reset.c | 2 |
3 files changed, 70 insertions, 2 deletions
diff --git a/arm9/lib/src/OS_init.c b/arm9/lib/src/OS_init.c index e2658421..7467c672 100644 --- a/arm9/lib/src/OS_init.c +++ b/arm9/lib/src/OS_init.c @@ -7,7 +7,6 @@ extern void PXI_Init(); extern void OS_InitLock(); -extern void OS_InitIrqTable(); extern void OS_SetIrqStackChecker(); extern void OS_InitException(); extern void MI_Init(); diff --git a/arm9/lib/src/OS_interrupt.c b/arm9/lib/src/OS_interrupt.c new file mode 100644 index 00000000..ff27a3ad --- /dev/null +++ b/arm9/lib/src/OS_interrupt.c @@ -0,0 +1,69 @@ +// +// Created by red031000 on 2020-05-07. +// + +#include "consts.h" +#include "function_target.h" +#include "OS_interrupt.h" +#include "OS_thread.h" + +#pragma optimize_for_size on + +extern OSThreadQueue OSi_IrqThreadQueue; + +ARM_FUNC void OS_InitIrqTable() { + OS_InitThreadQueue(&OSi_IrqThreadQueue); +} + +ARM_FUNC void OS_SetIrqFunction(OSIrqMask intrBit, OSIrqFunction function) { + s32 i; + OSIrqCallbackInfo *info; + + for (i = 0; i < 0x16; 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 { + OS_IRQTable[i] = function; + } + + if (info) { + info->func = (void (*)(void *))function; + info->arg = 0; + info->enable = TRUE; + } + } + intrBit >>= 1; + } +} + +ARM_FUNC OSIrqFunction OS_GetIrqFunction(OSIrqMask intrBit) { + s32 i = 0; + OSIrqFunction *funcPtr = &OS_IRQTable[0]; + + do { + if (intrBit & 1) + { + if (8 <= i && i <= 11) { + i = i - 8; + return (void (*)(void))OSi_IrqCallbackInfo[i].func; + } + else if (3 <= i && i <= 6) { + i++; + return (void (*)(void))OSi_IrqCallbackInfo[i].func; + } + + return *funcPtr; + } + intrBit >>= 1; + funcPtr++; + i++; + } while (i < 0x16); + return 0; +}
\ No newline at end of file diff --git a/arm9/lib/src/OS_reset.c b/arm9/lib/src/OS_reset.c index bec2da22..28d815a9 100644 --- a/arm9/lib/src/OS_reset.c +++ b/arm9/lib/src/OS_reset.c @@ -18,7 +18,7 @@ extern u32 OS_GetLockID(); extern void MI_StopDma(u32 dma); extern void OS_SetIrqMask(u32 mask); extern void OS_ResetRequestIrqMask(u32 mask); -extern void OSi_DoResetSystem(); +extern void OSi_DoResetSystem(); //in itcm, should technically be in this file ARM_FUNC void OS_InitReset() { if (OSi_IsInitReset) { |