mirror of
https://gitlab.com/ryandwyer/perfect-dark
synced 2026-06-27 18:02:49 -04:00
126 lines
2.4 KiB
C
126 lines
2.4 KiB
C
#include <os_internal.h>
|
|
#include <rcp.h>
|
|
#include "viint.h"
|
|
#include "../os/osint.h"
|
|
|
|
OSDevMgr __osViDevMgr = {0};
|
|
u32 var8005cefc = 0;
|
|
|
|
OSThread viThread;
|
|
char viThreadStack[512];
|
|
OSMesgQueue viEventQueue;
|
|
OSMesg viEventBuf[5];
|
|
u32 var8009025c;
|
|
OSIoMesg viRetraceMsg;
|
|
OSIoMesg viCounterMsg;
|
|
|
|
void viMgrMain(void *args);
|
|
|
|
void osCreateViManager(OSPri pri)
|
|
{
|
|
u32 savedMask;
|
|
OSPri oldPri;
|
|
OSPri myPri;
|
|
|
|
if (__osViDevMgr.active == 0) {
|
|
__osTimerServicesInit();
|
|
var8005cefc = 0;
|
|
osCreateMesgQueue(&viEventQueue, viEventBuf, 5);
|
|
|
|
viRetraceMsg.hdr.type = OS_MESG_TYPE_VRETRACE;
|
|
viRetraceMsg.hdr.pri = OS_MESG_PRI_NORMAL;
|
|
viRetraceMsg.hdr.retQueue = NULL;
|
|
viCounterMsg.hdr.type = OS_MESG_TYPE_COUNTER;
|
|
viCounterMsg.hdr.pri = OS_MESG_PRI_NORMAL;
|
|
viCounterMsg.hdr.retQueue = NULL;
|
|
|
|
osSetEventMesg(OS_EVENT_VI, &viEventQueue, &viRetraceMsg);
|
|
osSetEventMesg(OS_EVENT_COUNTER, &viEventQueue, &viCounterMsg);
|
|
|
|
oldPri = -1;
|
|
myPri = osGetThreadPri(NULL);
|
|
|
|
if (myPri < pri) {
|
|
oldPri = myPri;
|
|
osSetThreadPri(NULL, pri);
|
|
}
|
|
|
|
savedMask = __osDisableInt();
|
|
|
|
__osViDevMgr.active = 1;
|
|
__osViDevMgr.thread = &viThread;
|
|
__osViDevMgr.cmdQueue = &viEventQueue;
|
|
__osViDevMgr.evtQueue = &viEventQueue;
|
|
__osViDevMgr.acsQueue = NULL;
|
|
__osViDevMgr.dma = NULL;
|
|
__osViDevMgr.edma = NULL;
|
|
|
|
osCreateThread(&viThread, 0, viMgrMain, &__osViDevMgr, &viThreadStack[512], pri);
|
|
__osViInit();
|
|
osStartThread(&viThread);
|
|
__osRestoreInt(savedMask);
|
|
|
|
if (oldPri != -1) {
|
|
osSetThreadPri(0, oldPri);
|
|
}
|
|
}
|
|
}
|
|
|
|
void viMgrMain(void *args)
|
|
{
|
|
__OSViContext *vc;
|
|
OSDevMgr *dm;
|
|
OSIoMesg *mb;
|
|
static u16 retrace;
|
|
s32 first;
|
|
u32 count;
|
|
|
|
mb = NULL;
|
|
first = 0;
|
|
vc = __osViGetCurrentContext();
|
|
retrace = vc->retraceCount;
|
|
|
|
if (retrace == 0) {
|
|
retrace = 1;
|
|
}
|
|
|
|
dm = (OSDevMgr *)args;
|
|
|
|
while (TRUE) {
|
|
osRecvMesg(dm->evtQueue, (OSMesg) &mb, OS_MESG_BLOCK);
|
|
|
|
switch (mb->hdr.type) {
|
|
case OS_MESG_TYPE_VRETRACE:
|
|
__osViSwapContext();
|
|
retrace--;
|
|
|
|
if (retrace == 0) {
|
|
vc = __osViGetCurrentContext();
|
|
|
|
if (vc->msgq != NULL) {
|
|
osSendMesg(vc->msgq, vc->msg, OS_MESG_NOBLOCK);
|
|
}
|
|
|
|
retrace = vc->retraceCount;
|
|
}
|
|
|
|
__osViIntrCount++;
|
|
|
|
if (first) {
|
|
count = osGetCount();
|
|
__osCurrentTime = count;
|
|
first = 0;
|
|
}
|
|
|
|
count = __osBaseCounter;
|
|
__osBaseCounter = osGetCount();
|
|
count = __osBaseCounter - count;
|
|
__osCurrentTime = __osCurrentTime + count;
|
|
break;
|
|
case OS_MESG_TYPE_COUNTER:
|
|
__osTimerInterrupt();
|
|
break;
|
|
}
|
|
}
|
|
}
|