From 72ffb45b6856eef85b2c6db830cf2bd18f7c8a00 Mon Sep 17 00:00:00 2001 From: PikalaxALT Date: Fri, 24 Sep 2021 19:29:39 -0400 Subject: [PATCH] os_alarm --- asm/overlay_13_thumb_1.s | 2 +- common.mk | 4 +- global.inc | 4 +- lib/NitroDWC/asm/overlay_13_arm_2.s | 2 +- lib/NitroSDK/src/os/os_alarm.c | 182 ++++++++++ lib/NitroSDK/src/{ => os}/os_alloc.c | 0 lib/NitroSDK/src/{ => os}/os_arena.c | 0 lib/NitroSDK/src/{ => os}/os_cache.c | 0 lib/NitroSDK/src/{ => os}/os_context.c | 0 lib/NitroSDK/src/{ => os}/os_emulator.c | 0 lib/NitroSDK/src/{ => os}/os_exception.c | 0 lib/NitroSDK/src/{ => os}/os_init.c | 0 lib/NitroSDK/src/{ => os}/os_interrupt.c | 0 lib/NitroSDK/src/{ => os}/os_irqHandler.c | 0 lib/NitroSDK/src/{ => os}/os_irqTable.c | 0 lib/NitroSDK/src/{ => os}/os_message.c | 0 lib/NitroSDK/src/{ => os}/os_mutex.c | 0 lib/NitroSDK/src/{ => os}/os_printf.c | 0 .../src/{ => os}/os_protectionRegion.c | 0 lib/NitroSDK/src/{ => os}/os_protectionUnit.c | 0 lib/NitroSDK/src/{ => os}/os_spinLock.c | 0 lib/NitroSDK/src/{ => os}/os_tcm.c | 0 lib/NitroSDK/src/{ => os}/os_thread.c | 0 lib/NitroSDK/src/{ => os}/os_tick.c | 0 lib/NitroSDK/src/{ => os}/os_timer.c | 0 lib/asm/nitro.s | 320 +----------------- lib/asm/sdk.s | 4 +- lib/include/nitro/os.h | 2 + lib/include/nitro/os/alarm.h | 7 + lib/include/nitro/os/printf.h | 3 + main.lsf | 1 + 31 files changed, 208 insertions(+), 323 deletions(-) create mode 100644 lib/NitroSDK/src/os/os_alarm.c rename lib/NitroSDK/src/{ => os}/os_alloc.c (100%) rename lib/NitroSDK/src/{ => os}/os_arena.c (100%) rename lib/NitroSDK/src/{ => os}/os_cache.c (100%) rename lib/NitroSDK/src/{ => os}/os_context.c (100%) rename lib/NitroSDK/src/{ => os}/os_emulator.c (100%) rename lib/NitroSDK/src/{ => os}/os_exception.c (100%) rename lib/NitroSDK/src/{ => os}/os_init.c (100%) rename lib/NitroSDK/src/{ => os}/os_interrupt.c (100%) rename lib/NitroSDK/src/{ => os}/os_irqHandler.c (100%) rename lib/NitroSDK/src/{ => os}/os_irqTable.c (100%) rename lib/NitroSDK/src/{ => os}/os_message.c (100%) rename lib/NitroSDK/src/{ => os}/os_mutex.c (100%) rename lib/NitroSDK/src/{ => os}/os_printf.c (100%) rename lib/NitroSDK/src/{ => os}/os_protectionRegion.c (100%) rename lib/NitroSDK/src/{ => os}/os_protectionUnit.c (100%) rename lib/NitroSDK/src/{ => os}/os_spinLock.c (100%) rename lib/NitroSDK/src/{ => os}/os_tcm.c (100%) rename lib/NitroSDK/src/{ => os}/os_thread.c (100%) rename lib/NitroSDK/src/{ => os}/os_tick.c (100%) rename lib/NitroSDK/src/{ => os}/os_timer.c (100%) diff --git a/asm/overlay_13_thumb_1.s b/asm/overlay_13_thumb_1.s index 8f80828fc..11e9770c5 100644 --- a/asm/overlay_13_thumb_1.s +++ b/asm/overlay_13_thumb_1.s @@ -26,7 +26,7 @@ _0221BA0C: blt _0221BA0C bl sub_02034D8C bl OS_InitTick - bl sub_020D365C + bl OS_InitAlarm bl OS_DisableInterrupts add r5, r0, #0 mov r0, #2 diff --git a/common.mk b/common.mk index e5317ce18..f816fc504 100644 --- a/common.mk +++ b/common.mk @@ -52,10 +52,12 @@ NATIVE_TOOLS := \ TOOLDIRS := $(foreach tool,$(NATIVE_TOOLS),$(dir $(tool))) # Directories +NITROSDK_SRC_SUBDIRS := os + LIB_SUBDIRS := cw NitroSDK NitroSystem NitroDWC NitroWiFi libCPS libVCT SRC_SUBDIR := src ASM_SUBDIR := asm -LIB_SRC_SUBDIR := lib/src $(LIB_SUBDIRS:%=lib/%/src) +LIB_SRC_SUBDIR := lib/src $(LIB_SUBDIRS:%=lib/%/src) $(NITROSDK_SRC_SUBDIRS:%=lib/NitroSDK/src/%) LIB_ASM_SUBDIR := lib/asm $(LIB_SUBDIRS:%=lib/%/asm) ALL_SUBDIRS := $(SRC_SUBDIR) $(ASM_SUBDIR) $(LIB_SRC_SUBDIR) $(LIB_ASM_SUBDIR) diff --git a/global.inc b/global.inc index ebcfd02f1..911de3524 100644 --- a/global.inc +++ b/global.inc @@ -29248,8 +29248,8 @@ .public OS_GetTick .public OS_GetTickLo .public OS_SetTick -.public sub_020D365C -.public sub_020D369C +.public OS_InitAlarm +.public OS_IsAlarmAvailable .public OS_CreateAlarm .public OS_SetAlarm .public OS_CancelAlarm diff --git a/lib/NitroDWC/asm/overlay_13_arm_2.s b/lib/NitroDWC/asm/overlay_13_arm_2.s index e3c0cb46a..844249ec8 100644 --- a/lib/NitroDWC/asm/overlay_13_arm_2.s +++ b/lib/NitroDWC/asm/overlay_13_arm_2.s @@ -5252,7 +5252,7 @@ ov13_0222B558: ; 0x0222B558 bne _0222B590 bl OS_Terminate _0222B590: - bl sub_020D369C + bl OS_IsAlarmAvailable cmp r0, #0 bne _0222B5A0 bl OS_Terminate diff --git a/lib/NitroSDK/src/os/os_alarm.c b/lib/NitroSDK/src/os/os_alarm.c new file mode 100644 index 000000000..d2f2f16ab --- /dev/null +++ b/lib/NitroSDK/src/os/os_alarm.c @@ -0,0 +1,182 @@ +#include + +void OSi_AlarmHandler(void *arg); +void OSi_ArrangeTimer(void); + +#define OSi_ALARM_TIMER OS_TIMER_1 +#define OSi_ALARM_TIMERCONTROL ((1 << REG_OS_TM1CNT_H_E_SHIFT) | (1 << REG_OS_TM1CNT_H_I_SHIFT) | OS_TIMER_PRESCALER_64) +#define OSi_ALARM_IE_TIMER OS_IE_TIMER1 + +u16 OSi_UseAlarm = 0; +struct OSiAlarmQueue OSi_AlarmQueue; + +void OSi_SetTimer(OSAlarm *alarm) { + s64 delta; + OSTick tick = OS_GetTick(); + u16 timerCount; + + OS_SetTimerControl(OSi_ALARM_TIMER, 0); + delta = alarm->fire - tick; + OSi_EnterTimerCallback(OSi_ALARM_TIMER, OSi_AlarmHandler, NULL); + if (delta < 0) { + timerCount = (u16)~1; + } else if (delta < 0x10000) { + timerCount = (u16)~delta; + } else { + timerCount = 0; + } + OS_SetTimerCount(OSi_ALARM_TIMER, timerCount); + OS_SetTimerControl(OSi_ALARM_TIMER, OSi_ALARM_TIMERCONTROL); + OS_EnableIrqMask(OSi_ALARM_IE_TIMER); +} + +void OS_InitAlarm(void) { + if (OSi_UseAlarm) { + return; + } + OSi_UseAlarm = 1; + OSi_SetTimerReserved(OSi_ALARM_TIMER); + OSi_AlarmQueue.head = NULL; + OSi_AlarmQueue.tail = NULL; + OS_DisableIrqMask(OSi_ALARM_IE_TIMER); +} + +BOOL OS_IsAlarmAvailable(void) { + return OSi_UseAlarm; +} + +void OS_CreateAlarm(OSAlarm *alarm) { + alarm->handler = NULL; + alarm->tag = 0; +} + +void OSi_InsertAlarm(OSAlarm *alarm, OSTick fire) { + OSAlarm *prev; + OSAlarm *next; + + if (alarm->period > 0) { + OSTick tick = OS_GetTick(); + fire = alarm->start; + if (alarm->start < tick) { + fire += alarm->period * ((tick - alarm->start) / alarm->period + 1); + } + } + alarm->fire = fire; + for (next = OSi_AlarmQueue.head; next; next = next->next) { + if ((s64)(fire - next->fire) >= 0) { // cast required to match + continue; + } + alarm->prev = next->prev; + next->prev = alarm; + alarm->next = next; + prev = alarm->prev; + if (prev) { + prev->next = alarm; + } else { + OSi_AlarmQueue.head = alarm; + OSi_SetTimer(alarm); + } + return; + } + alarm->next = NULL; + prev = OSi_AlarmQueue.tail; + OSi_AlarmQueue.tail = alarm; + alarm->prev = prev; + if (prev) { + prev->next = alarm; + } else { + OSi_AlarmQueue.head = OSi_AlarmQueue.tail = alarm; // why set .tail twice? + OSi_SetTimer(alarm); + } +} + +void OS_SetAlarm(OSAlarm *alarm, OSTick tick, OSAlarmHandler handler, void *arg) { + OSIntrMode enabled; + + if (alarm == NULL || alarm->handler != NULL) { + OS_Panic(""); + } + + enabled = OS_DisableInterrupts(); + alarm->period = 0; + alarm->handler = handler; + alarm->arg = arg; + OSi_InsertAlarm(alarm, tick + OS_GetTick()); + OS_RestoreInterrupts(enabled); +} + +void OS_CancelAlarm(OSAlarm *alarm) { + OSAlarm *next; + OSIntrMode enabled; + + enabled = OS_DisableInterrupts(); + if (alarm->handler == NULL) { + OS_RestoreInterrupts(enabled); + return; + } + next = alarm->next; + if (next == NULL) { + OSi_AlarmQueue.tail = alarm->prev; + } else { + next->prev = alarm->prev; + } + if (alarm->prev != NULL) { + alarm->prev->next = next; + } else { + OSi_AlarmQueue.head = next; + if (next != NULL) { + OSi_SetTimer(next); + } + } + alarm->handler = NULL; + alarm->period = 0; + OS_RestoreInterrupts(enabled); +} + +asm void OSi_AlarmHandler(void *arg) { + stmdb sp!, {r0, lr} + bl OSi_ArrangeTimer + ldmia sp!, {r0, lr} + bx lr +} + +void OSi_ArrangeTimer(void) { + OSTick tick; + OSAlarm *alarm; + OSAlarm *next; + OSAlarmHandler handler; + + OS_SetTimerControl(OSi_ALARM_TIMER, 0); + OS_DisableIrqMask(OSi_ALARM_IE_TIMER); + OS_SetIrqCheckFlag(OSi_ALARM_IE_TIMER); + tick = OS_GetTick(); + alarm = OSi_AlarmQueue.head; + if (alarm == NULL) { + return; + } + if (tick < alarm->fire) { + OSi_SetTimer(alarm); + return; + } + next = alarm->next; + OSi_AlarmQueue.head = next; + if (next == NULL) { + OSi_AlarmQueue.tail = NULL; + } else { + next->prev = NULL; + } + handler = alarm->handler; + if (alarm->period == 0) { + alarm->handler = NULL; + } + if (handler) { + handler(alarm->arg); + } + if (alarm->period > 0) { + alarm->handler = handler; + OSi_InsertAlarm(alarm, 0); + } + if (OSi_AlarmQueue.head) { + OSi_SetTimer(OSi_AlarmQueue.head); + } +} diff --git a/lib/NitroSDK/src/os_alloc.c b/lib/NitroSDK/src/os/os_alloc.c similarity index 100% rename from lib/NitroSDK/src/os_alloc.c rename to lib/NitroSDK/src/os/os_alloc.c diff --git a/lib/NitroSDK/src/os_arena.c b/lib/NitroSDK/src/os/os_arena.c similarity index 100% rename from lib/NitroSDK/src/os_arena.c rename to lib/NitroSDK/src/os/os_arena.c diff --git a/lib/NitroSDK/src/os_cache.c b/lib/NitroSDK/src/os/os_cache.c similarity index 100% rename from lib/NitroSDK/src/os_cache.c rename to lib/NitroSDK/src/os/os_cache.c diff --git a/lib/NitroSDK/src/os_context.c b/lib/NitroSDK/src/os/os_context.c similarity index 100% rename from lib/NitroSDK/src/os_context.c rename to lib/NitroSDK/src/os/os_context.c diff --git a/lib/NitroSDK/src/os_emulator.c b/lib/NitroSDK/src/os/os_emulator.c similarity index 100% rename from lib/NitroSDK/src/os_emulator.c rename to lib/NitroSDK/src/os/os_emulator.c diff --git a/lib/NitroSDK/src/os_exception.c b/lib/NitroSDK/src/os/os_exception.c similarity index 100% rename from lib/NitroSDK/src/os_exception.c rename to lib/NitroSDK/src/os/os_exception.c diff --git a/lib/NitroSDK/src/os_init.c b/lib/NitroSDK/src/os/os_init.c similarity index 100% rename from lib/NitroSDK/src/os_init.c rename to lib/NitroSDK/src/os/os_init.c diff --git a/lib/NitroSDK/src/os_interrupt.c b/lib/NitroSDK/src/os/os_interrupt.c similarity index 100% rename from lib/NitroSDK/src/os_interrupt.c rename to lib/NitroSDK/src/os/os_interrupt.c diff --git a/lib/NitroSDK/src/os_irqHandler.c b/lib/NitroSDK/src/os/os_irqHandler.c similarity index 100% rename from lib/NitroSDK/src/os_irqHandler.c rename to lib/NitroSDK/src/os/os_irqHandler.c diff --git a/lib/NitroSDK/src/os_irqTable.c b/lib/NitroSDK/src/os/os_irqTable.c similarity index 100% rename from lib/NitroSDK/src/os_irqTable.c rename to lib/NitroSDK/src/os/os_irqTable.c diff --git a/lib/NitroSDK/src/os_message.c b/lib/NitroSDK/src/os/os_message.c similarity index 100% rename from lib/NitroSDK/src/os_message.c rename to lib/NitroSDK/src/os/os_message.c diff --git a/lib/NitroSDK/src/os_mutex.c b/lib/NitroSDK/src/os/os_mutex.c similarity index 100% rename from lib/NitroSDK/src/os_mutex.c rename to lib/NitroSDK/src/os/os_mutex.c diff --git a/lib/NitroSDK/src/os_printf.c b/lib/NitroSDK/src/os/os_printf.c similarity index 100% rename from lib/NitroSDK/src/os_printf.c rename to lib/NitroSDK/src/os/os_printf.c diff --git a/lib/NitroSDK/src/os_protectionRegion.c b/lib/NitroSDK/src/os/os_protectionRegion.c similarity index 100% rename from lib/NitroSDK/src/os_protectionRegion.c rename to lib/NitroSDK/src/os/os_protectionRegion.c diff --git a/lib/NitroSDK/src/os_protectionUnit.c b/lib/NitroSDK/src/os/os_protectionUnit.c similarity index 100% rename from lib/NitroSDK/src/os_protectionUnit.c rename to lib/NitroSDK/src/os/os_protectionUnit.c diff --git a/lib/NitroSDK/src/os_spinLock.c b/lib/NitroSDK/src/os/os_spinLock.c similarity index 100% rename from lib/NitroSDK/src/os_spinLock.c rename to lib/NitroSDK/src/os/os_spinLock.c diff --git a/lib/NitroSDK/src/os_tcm.c b/lib/NitroSDK/src/os/os_tcm.c similarity index 100% rename from lib/NitroSDK/src/os_tcm.c rename to lib/NitroSDK/src/os/os_tcm.c diff --git a/lib/NitroSDK/src/os_thread.c b/lib/NitroSDK/src/os/os_thread.c similarity index 100% rename from lib/NitroSDK/src/os_thread.c rename to lib/NitroSDK/src/os/os_thread.c diff --git a/lib/NitroSDK/src/os_tick.c b/lib/NitroSDK/src/os/os_tick.c similarity index 100% rename from lib/NitroSDK/src/os_tick.c rename to lib/NitroSDK/src/os/os_tick.c diff --git a/lib/NitroSDK/src/os_timer.c b/lib/NitroSDK/src/os/os_timer.c similarity index 100% rename from lib/NitroSDK/src/os_timer.c rename to lib/NitroSDK/src/os/os_timer.c diff --git a/lib/asm/nitro.s b/lib/asm/nitro.s index d12e37ee7..cb8ef2afe 100644 --- a/lib/asm/nitro.s +++ b/lib/asm/nitro.s @@ -70,326 +70,14 @@ .public OS_DisableProtectionUnit .public OS_SetDPermissionsForProtectionRegion .public OSi_SetTimerReserved + .public OSi_SetTimer + .public OSi_InsertAlarm -_021E19E4: - .space 0x39AC +_021E19F0: + .space 0x39A0 .text - arm_func_start sub_020D35D0 -sub_020D35D0: ; 0x020D35D0 - stmdb sp!, {r3, r4, r5, lr} - mov r4, r0 - bl OS_GetTick - ldr r3, _020D364C ; =0x04000106 - mov r2, #0 - strh r2, [r3] - ldr ip, [r4, #0xc] - ldr r3, [r4, #0x10] - subs r5, ip, r0 - sbc r4, r3, r1 - ldr r1, _020D3650 ; =sub_020D38DC - mov r0, #1 - bl OSi_EnterTimerCallback - subs r0, r5, #0 - mov r3, #0 - sbcs r0, r4, #0 - ldrlt r3, _020D3654 ; =0x0000FFFE - blt _020D3630 - subs r0, r5, #0x10000 - sbcs r0, r4, r3 - bge _020D3630 - mvn r0, r5 - mov r0, r0, lsl #0x10 - mov r3, r0, lsr #0x10 -_020D3630: - ldr r2, _020D3658 ; =0x04000104 - mov r1, #0xc1 - strh r3, [r2] - mov r0, #0x10 - strh r1, [r2, #2] - bl OS_EnableIrqMask - ldmia sp!, {r3, r4, r5, pc} - .align 2, 0 -_020D364C: .word 0x04000106 -_020D3650: .word sub_020D38DC -_020D3654: .word 0x0000FFFE -_020D3658: .word 0x04000104 - arm_func_end sub_020D35D0 - - arm_func_start sub_020D365C -sub_020D365C: ; 0x020D365C - stmdb sp!, {r3, lr} - ldr r1, _020D3698 ; =0x021E19E4 - ldrh r0, [r1] - cmp r0, #0 - ldmneia sp!, {r3, pc} - mov r0, #1 - strh r0, [r1] - bl OSi_SetTimerReserved - ldr r1, _020D3698 ; =0x021E19E4 - mov r2, #0 - str r2, [r1, #4] - mov r0, #0x10 - str r2, [r1, #8] - bl OS_DisableIrqMask - ldmia sp!, {r3, pc} - .align 2, 0 -_020D3698: .word 0x021E19E4 - arm_func_end sub_020D365C - - arm_func_start sub_020D369C -sub_020D369C: ; 0x020D369C - ldr r0, _020D36A8 ; =0x021E19E4 - ldrh r0, [r0] - bx lr - .align 2, 0 -_020D36A8: .word 0x021E19E4 - arm_func_end sub_020D369C - - arm_func_start OS_CreateAlarm -OS_CreateAlarm: ; 0x020D36AC - mov r1, #0 - str r1, [r0] - str r1, [r0, #8] - bx lr - arm_func_end OS_CreateAlarm - - arm_func_start sub_020D36BC -sub_020D36BC: ; 0x020D36BC - stmdb sp!, {r4, r5, r6, r7, r8, lr} - mov r8, r0 - ldr r0, [r8, #0x20] - ldr r3, [r8, #0x1c] - cmp r0, #0 - mov r7, r1 - mov r6, r2 - cmpeq r3, #0 - beq _020D3730 - bl OS_GetTick - ldr r6, [r8, #0x28] - ldr r7, [r8, #0x24] - cmp r6, r1 - cmpeq r7, r0 - bhs _020D3730 - ldr r5, [r8, #0x1c] - ldr r4, [r8, #0x20] - subs r0, r0, r7 - mov r2, r5 - mov r3, r4 - sbc r1, r1, r6 - bl _ll_udiv - adds r2, r0, #1 - adc r0, r1, #0 - umull r3, r1, r5, r2 - mla r1, r5, r0, r1 - mla r1, r4, r2, r1 - adds r7, r7, r3 - adc r6, r6, r1 -_020D3730: - str r7, [r8, #0xc] - ldr r0, _020D37E4 ; =0x021E19E4 - str r6, [r8, #0x10] - ldr r5, [r0, #4] - cmp r5, #0 - beq _020D37AC - mov r2, #0 - mov r1, r2 -_020D3750: - ldr r3, [r5, #0xc] - ldr r0, [r5, #0x10] - subs r4, r7, r3 - sbc r3, r6, r0 - subs r0, r4, r1 - sbcs r0, r3, r2 - bge _020D37A0 - ldr r0, [r5, #0x14] - str r0, [r8, #0x14] - str r8, [r5, #0x14] - str r5, [r8, #0x18] - ldr r0, [r8, #0x14] - cmp r0, #0 - strne r8, [r0, #0x18] - ldmneia sp!, {r4, r5, r6, r7, r8, pc} - ldr r1, _020D37E4 ; =0x021E19E4 - mov r0, r8 - str r8, [r1, #4] - bl sub_020D35D0 - ldmia sp!, {r4, r5, r6, r7, r8, pc} -_020D37A0: - ldr r5, [r5, #0x18] - cmp r5, #0 - bne _020D3750 -_020D37AC: - ldr r1, _020D37E4 ; =0x021E19E4 - mov r0, #0 - str r0, [r8, #0x18] - ldr r0, [r1, #8] - str r8, [r1, #8] - str r0, [r8, #0x14] - cmp r0, #0 - strne r8, [r0, #0x18] - ldmneia sp!, {r4, r5, r6, r7, r8, pc} - str r8, [r1, #8] - mov r0, r8 - str r8, [r1, #4] - bl sub_020D35D0 - ldmia sp!, {r4, r5, r6, r7, r8, pc} - .align 2, 0 -_020D37E4: .word 0x021E19E4 - arm_func_end sub_020D36BC - - arm_func_start OS_SetAlarm -OS_SetAlarm: ; 0x020D37E8 - stmdb sp!, {r3, r4, r5, r6, r7, lr} - movs r6, r0 - mov r5, r1 - mov r4, r2 - mov r7, r3 - beq _020D380C - ldr r0, [r6] - cmp r0, #0 - beq _020D3810 -_020D380C: - bl OS_Terminate -_020D3810: - bl OS_DisableInterrupts - mov r1, #0 - str r1, [r6, #0x1c] - str r1, [r6, #0x20] - str r7, [r6] - ldr r1, [sp, #0x18] - mov r7, r0 - str r1, [r6, #4] - bl OS_GetTick - adds r3, r5, r0 - adc r2, r4, r1 - mov r0, r6 - mov r1, r3 - bl sub_020D36BC - mov r0, r7 - bl OS_RestoreInterrupts - ldmia sp!, {r3, r4, r5, r6, r7, pc} - arm_func_end OS_SetAlarm - - arm_func_start OS_CancelAlarm -OS_CancelAlarm: ; 0x020D3854 - stmdb sp!, {r3, r4, r5, lr} - mov r5, r0 - bl OS_DisableInterrupts - ldr r1, [r5] - mov r4, r0 - cmp r1, #0 - bne _020D3878 - bl OS_RestoreInterrupts - ldmia sp!, {r3, r4, r5, pc} -_020D3878: - ldr r0, [r5, #0x18] - cmp r0, #0 - ldrne r1, [r5, #0x14] - strne r1, [r0, #0x14] - bne _020D3898 - ldr r2, [r5, #0x14] - ldr r1, _020D38D8 ; =0x021E19E4 - str r2, [r1, #8] -_020D3898: - ldr r1, [r5, #0x14] - cmp r1, #0 - strne r0, [r1, #0x18] - bne _020D38BC - ldr r1, _020D38D8 ; =0x021E19E4 - cmp r0, #0 - str r0, [r1, #4] - beq _020D38BC - bl sub_020D35D0 -_020D38BC: - mov r1, #0 - str r1, [r5] - str r1, [r5, #0x1c] - mov r0, r4 - str r1, [r5, #0x20] - bl OS_RestoreInterrupts - ldmia sp!, {r3, r4, r5, pc} - .align 2, 0 -_020D38D8: .word 0x021E19E4 - arm_func_end OS_CancelAlarm - - arm_func_start sub_020D38DC -sub_020D38DC: ; 0x020D38DC - stmdb sp!, {r0, lr} - bl sub_020D38EC - ldmia sp!, {r0, lr} - bx lr - arm_func_end sub_020D38DC - - arm_func_start sub_020D38EC -sub_020D38EC: ; 0x020D38EC - stmdb sp!, {r3, r4, r5, lr} - ldr r1, _020D39D0 ; =0x04000106 - mov r2, #0 - mov r0, #0x10 - strh r2, [r1] - bl OS_DisableIrqMask - ldr r0, _020D39D4 ; =OS_IRQTable - add r0, r0, #0x3000 - ldr r1, [r0, #0xff8] - orr r1, r1, #0x10 - str r1, [r0, #0xff8] - bl OS_GetTick - ldr r2, _020D39D8 ; =0x021E19E4 - ldr r4, [r2, #4] - cmp r4, #0 - ldmeqia sp!, {r3, r4, r5, pc} - ldr r3, [r4, #0x10] - ldr ip, [r4, #0xc] - cmp r1, r3 - cmpeq r0, ip - bhs _020D394C - mov r0, r4 - bl sub_020D35D0 - ldmia sp!, {r3, r4, r5, pc} -_020D394C: - ldr r1, [r4, #0x18] - mov r0, #0 - str r1, [r2, #4] - cmp r1, #0 - streq r0, [r2, #8] - strne r0, [r1, #0x14] - ldr r0, [r4, #0x20] - ldr r1, [r4, #0x1c] - cmp r0, #0 - ldr r5, [r4] - mov r0, #0 - cmpeq r1, #0 - streq r0, [r4] - cmp r5, #0 - beq _020D3990 - ldr r0, [r4, #4] - blx r5 -_020D3990: - ldr r0, [r4, #0x20] - ldr r1, [r4, #0x1c] - cmp r0, #0 - cmpeq r1, #0 - mov r1, #0 - beq _020D39B8 - mov r0, r4 - mov r2, r1 - str r5, [r4] - bl sub_020D36BC -_020D39B8: - ldr r0, _020D39D8 ; =0x021E19E4 - ldr r0, [r0, #4] - cmp r0, #0 - ldmeqia sp!, {r3, r4, r5, pc} - bl sub_020D35D0 - ldmia sp!, {r3, r4, r5, pc} - .align 2, 0 -_020D39D0: .word 0x04000106 -_020D39D4: .word OS_IRQTable -_020D39D8: .word 0x021E19E4 - arm_func_end sub_020D38EC - arm_func_start OS_InitVAlarm OS_InitVAlarm: ; 0x020D39DC stmdb sp!, {r3, lr} diff --git a/lib/asm/sdk.s b/lib/asm/sdk.s index fe8132e4d..2bf488296 100644 --- a/lib/asm/sdk.s +++ b/lib/asm/sdk.s @@ -25268,10 +25268,10 @@ _020AD8BC: bne _020AD930 bl OS_InitTick _020AD930: - bl sub_020D369C + bl OS_IsAlarmAvailable cmp r0, #0 bne _020AD940 - bl sub_020D365C + bl OS_InitAlarm _020AD940: ldr r0, _020AD964 ; =0x021D5FEC ldr r0, [r0] diff --git a/lib/include/nitro/os.h b/lib/include/nitro/os.h index 60175325c..1a49e80df 100644 --- a/lib/include/nitro/os.h +++ b/lib/include/nitro/os.h @@ -18,5 +18,7 @@ #include #include #include +#include +#include #endif //NITRO_OS_H_ diff --git a/lib/include/nitro/os/alarm.h b/lib/include/nitro/os/alarm.h index cf91577d0..dc341bf7d 100644 --- a/lib/include/nitro/os/alarm.h +++ b/lib/include/nitro/os/alarm.h @@ -8,4 +8,11 @@ #include #endif +struct OSiAlarmQueue +{ + OSAlarm *head; + OSAlarm *tail; +}; +struct OSiAlarmQueue *OSi_GetAlarmQueue(void); + #endif //NITRO_OS_ALARM_H diff --git a/lib/include/nitro/os/printf.h b/lib/include/nitro/os/printf.h index 7f8ccf9a6..2d38a48d5 100644 --- a/lib/include/nitro/os/printf.h +++ b/lib/include/nitro/os/printf.h @@ -9,4 +9,7 @@ int OS_SNPrintf(char * dest, u32 len, const char * format, ...); int OS_VSPrintf(char * dest, const char * format, va_list va); int OS_VSNPrintf(char * dest, u32 len, const char * format, va_list va); +void OS_Terminate(); +#define OS_Panic(...) OS_Terminate() + #endif //NITRO_OS_PRINTF_H_ diff --git a/main.lsf b/main.lsf index 0b0603b79..0124ed3e0 100644 --- a/main.lsf +++ b/main.lsf @@ -269,6 +269,7 @@ Static main Object os_exception.o Object os_timer.o Object os_tick.o + Object os_alarm.o Object nitro.o Object msl.o }