sm64/lib/src/osTimer.c
2021-10-14 15:25:30 -04:00

91 lines
2.3 KiB
C

#include "libultra_internal.h"
OSTimer __osBaseTimer;
OSTimer *__osTimerList = &__osBaseTimer;
OSTime __osCurrentTime;
u32 __osBaseCounter;
u32 __osViIntrCount;
u32 __osTimerCounter;
void __osTimerServicesInit(void) {
__osCurrentTime = 0;
__osBaseCounter = 0;
__osViIntrCount = 0;
__osTimerList->prev = __osTimerList;
__osTimerList->next = __osTimerList->prev;
__osTimerList->remaining = 0;
__osTimerList->interval = __osTimerList->remaining;
__osTimerList->mq = NULL;
__osTimerList->msg = NULL;
}
void __osTimerInterrupt(void) {
OSTimer *t;
u32 count;
u32 elapsedCycles;
if (__osTimerList->next == __osTimerList) {
return;
}
while (TRUE) {
t = __osTimerList->next;
if (t == __osTimerList) {
__osSetCompare(0);
__osTimerCounter = 0;
break;
}
count = osGetCount();
elapsedCycles = count - __osTimerCounter;
__osTimerCounter = count;
if (elapsedCycles < t->remaining) {
t->remaining -= elapsedCycles;
__osSetTimerIntr(t->remaining);
return;
} else {
t->prev->next = t->next;
t->next->prev = t->prev;
t->next = NULL;
t->prev = NULL;
if (t->mq != NULL) {
osSendMesg(t->mq, t->msg, OS_MESG_NOBLOCK);
}
if (t->interval != 0) {
t->remaining = t->interval;
__osInsertTimer(t);
}
}
}
}
void __osSetTimerIntr(OSTime time) {
OSTime newTime;
s32 savedMask = __osDisableInt();
__osTimerCounter = osGetCount();
newTime = time + __osTimerCounter;
__osSetCompare(newTime);
__osRestoreInt(savedMask);
}
OSTime __osInsertTimer(OSTimer *t) {
OSTimer *timep;
OSTime time;
s32 savedMask;
savedMask = __osDisableInt();
for (timep = __osTimerList->next, time = t->remaining; timep != __osTimerList && time > timep->remaining;
time -= timep->remaining, timep = timep->next) {
;
}
t->remaining = time;
if (timep != __osTimerList) {
timep->remaining -= time;
}
t->next = timep;
t->prev = timep->prev;
timep->prev->next = t;
timep->prev = t;
__osRestoreInt(savedMask);
return time;
}