mirror of
https://github.com/n64decomp/sm64.git
synced 2024-11-12 04:15:02 -05:00
91 lines
2.3 KiB
C
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;
|
|
}
|