This commit is contained in:
PikalaxALT 2021-09-24 19:29:39 -04:00
parent 138adb2033
commit 72ffb45b68
31 changed files with 208 additions and 323 deletions

View File

@ -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

View File

@ -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)

View File

@ -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

View File

@ -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

View File

@ -0,0 +1,182 @@
#include <nitro.h>
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);
}
}

View File

@ -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}

View File

@ -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]

View File

@ -18,5 +18,7 @@
#include <nitro/os/emulator.h>
#include <nitro/os/protectionRegion.h>
#include <nitro/os/protectionUnit.h>
#include <nitro/os/tick.h>
#include <nitro/os/alarm.h>
#endif //NITRO_OS_H_

View File

@ -8,4 +8,11 @@
#include <nitro/os/ARM7/alarm.h>
#endif
struct OSiAlarmQueue
{
OSAlarm *head;
OSAlarm *tail;
};
struct OSiAlarmQueue *OSi_GetAlarmQueue(void);
#endif //NITRO_OS_ALARM_H

View File

@ -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_

View File

@ -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
}