mirror of
https://github.com/zeldaret/oot.git
synced 2025-08-14 19:10:25 +00:00
First proper commit.
This commit is contained in:
parent
be78236d36
commit
087f561f77
14086 changed files with 1200489 additions and 1 deletions
97
src/libultra_boot_O1/timerintr.c
Normal file
97
src/libultra_boot_O1/timerintr.c
Normal file
|
@ -0,0 +1,97 @@
|
|||
#include <global.h>
|
||||
|
||||
OSTimer __osBaseTimer;
|
||||
OSTime __osCurrentTime;
|
||||
u32 __osBaseCounter;
|
||||
u32 __osViIntrCount;
|
||||
u32 __osTimerCounter;
|
||||
OSTimer* __osTimerList = &__osBaseTimer;
|
||||
|
||||
void __osTimerServicesInit()
|
||||
{
|
||||
__osCurrentTime = 0;
|
||||
__osBaseCounter = 0;
|
||||
__osViIntrCount = 0;
|
||||
__osTimerList->prev = __osTimerList;
|
||||
__osTimerList->next = __osTimerList->prev;
|
||||
__osTimerList->value = 0;
|
||||
__osTimerList->interval = __osTimerList->value;
|
||||
__osTimerList->mq = NULL;
|
||||
__osTimerList->msg = NULL;
|
||||
}
|
||||
|
||||
void __osTimerInterrupt()
|
||||
{
|
||||
OSTimer *sp24;
|
||||
u32 sp20;
|
||||
u32 sp1c;
|
||||
if (__osTimerList->next == __osTimerList) {
|
||||
return;
|
||||
}
|
||||
while (1) {
|
||||
sp24 = __osTimerList->next;
|
||||
if (sp24 == __osTimerList) {
|
||||
__osSetCompare(0);
|
||||
__osTimerCounter = 0;
|
||||
break;
|
||||
}
|
||||
sp20 = osGetCount();
|
||||
sp1c = sp20 - __osTimerCounter;
|
||||
__osTimerCounter = sp20;
|
||||
if (sp1c < sp24->value) {
|
||||
sp24->value -= sp1c;
|
||||
__osSetTimerIntr(sp24->value);
|
||||
return;
|
||||
} else {
|
||||
sp24->prev->next = sp24->next;
|
||||
sp24->next->prev = sp24->prev;
|
||||
sp24->next = NULL;
|
||||
sp24->prev = NULL;
|
||||
if (sp24->mq != NULL) {
|
||||
osSendMesg(sp24->mq, sp24->msg, OS_MESG_NOBLOCK);
|
||||
}
|
||||
if (sp24->interval != 0) {
|
||||
sp24->value = sp24->interval;
|
||||
__osInsertTimer(sp24);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
void __osSetTimerIntr(OSTime tim)
|
||||
{
|
||||
OSTime NewTime;
|
||||
u32 savedMask;
|
||||
|
||||
if (tim < 468)
|
||||
tim = 468;
|
||||
|
||||
savedMask = __osDisableInt();
|
||||
|
||||
__osTimerCounter = osGetCount();
|
||||
NewTime = tim + __osTimerCounter;
|
||||
__osSetCompare((u32)NewTime);
|
||||
__osRestoreInt(savedMask);
|
||||
}
|
||||
|
||||
OSTime __osInsertTimer(OSTimer *a0)
|
||||
{
|
||||
OSTimer *sp34;
|
||||
u64 sp28;
|
||||
s32 intDisabled;
|
||||
intDisabled = __osDisableInt();
|
||||
for (sp34 = __osTimerList->next, sp28 = a0->value; sp34 != __osTimerList && sp28 > sp34->value;
|
||||
sp28 -= sp34->value, sp34 = sp34->next) {
|
||||
;
|
||||
}
|
||||
a0->value = sp28;
|
||||
if (sp34 != __osTimerList) {
|
||||
sp34->value -= sp28;
|
||||
}
|
||||
a0->next = sp34;
|
||||
a0->prev = sp34->prev;
|
||||
sp34->prev->next = a0;
|
||||
sp34->prev = a0;
|
||||
__osRestoreInt(intDisabled);
|
||||
return sp28;
|
||||
}
|
Loading…
Add table
Add a link
Reference in a new issue