Files
perfect-dark/src/lib/ultra/io/vimgr.c
T
2021-10-14 17:52:32 +10:00

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