Rename some scheduler symbols and message queues

This commit is contained in:
Ryan Dwyer 2023-04-24 20:13:33 +10:00
parent 8e131f3aa4
commit 63c57f9075
18 changed files with 122 additions and 78 deletions

View File

@ -83,7 +83,7 @@ typedef struct OSScTask_s {
typedef struct SCClient_s {
struct SCClient_s *next; /* next client in the list */
OSMesgQueue *msgQ; /* where to send the frame msg */
s32 is8mb;
s32 is30fps;
} OSScClient;
typedef struct {
@ -106,7 +106,7 @@ typedef struct {
} OSSched;
void osCreateScheduler(OSSched *s, OSThread *thread, u8 mode, u32 numFields);
void osScAddClient(OSSched *s, OSScClient *c, OSMesgQueue *msgQ, int is8mb);
void osScAddClient(OSSched *s, OSScClient *c, OSMesgQueue *msgQ, s32 is30fps);
void osScRemoveClient(OSSched *s, OSScClient *c);
OSMesgQueue *osScGetCmdQ(OSSched *s);

View File

@ -1880,7 +1880,7 @@ void casingCreateForHand(s32 handnum, f32 ground, Mtxf *mtx)
}
sp5c = ((s32)((random() >> 24) * magic) >> 10) + magic;
f0 = (random() % sp5c) / PALUP(781250.0f);
f0 = (random() % sp5c) / PALUP((f32) (OS_CPU_COUNTER / 60));
newyspeed = casing->speed.y - f0 * 0.2777778f;
@ -1937,7 +1937,7 @@ void casingCreateForHand(s32 handnum, f32 ground, Mtxf *mtx)
}
sp4c = ((s32) ((random() >> 24) * magic) >> 10) + magic;
f0 = (random() % sp4c) / PALUP(781250.0f);
f0 = (random() % sp4c) / PALUP((f32) (OS_CPU_COUNTER / 60));
newyspeed = casing->speed.y - f0 * 0.2777778f;

View File

@ -5,7 +5,7 @@
#include "types.h"
extern OSThread g_MainThread;
extern OSMesgQueue g_SchedMesgQueue;
extern OSMesgQueue g_MainMesgQueue;
extern OSSched g_Sched;
extern OSViMode var8008dcc0[2];
extern OSViMode *var8008dd60[2];
@ -18,7 +18,7 @@ extern OSPiHandle CartRomHandle;
extern OSPiHandle LeoDiskHandle;
extern OSTimer var80090ab0;
extern OSMesgQueue g_GbpakMesgQueue;
extern OSMesg var80090ae8;
extern OSMesg g_GbpakMesg;
extern u8 g_Is4Mb;
extern u32 g_VmNumTlbMisses;
extern u32 g_VmNumPageMisses;

View File

@ -24,7 +24,7 @@ void joy00014238(void);
void joyDebugJoy(void);
s32 joyStartReadData(OSMesgQueue *mq);
void joyReadData(void);
void joysTick(void);
void joysHandleRetrace(void);
void joy00014810(bool value);
s32 joyGetNumSamples(void);
s32 joyGetStickXOnSample(s32 samplenum, s8 contpadnum);

View File

@ -5,7 +5,7 @@
#include "types.h"
void schedSetCrashEnable2(s32 enable);
void schedAppendTasks(OSSched *sc, OSScTask *t);
void schedSubmitTask(OSSched *sc, OSScTask *t);
void __scHandleRetrace(OSSched *sc);
void __scHandleRSP(OSSched *sc);
void __scHandleRDP(OSSched *sc);

View File

@ -26,7 +26,7 @@ bool snd0000fbc4(s16 arg0);
bool seqPlay(struct seqinstance *seq, s32 tracknum);
u16 seqGetVolume(struct seqinstance *seq);
void seqSetVolume(struct seqinstance *seq, u16 volume);
void snd0000fe18(void);
void sndHandleRetrace(void);
void snd0000fe20(void);
void snd0000fe50(void);
void sndTick(void);

View File

@ -9,7 +9,7 @@ void viConfigureForCopyright(u16 *fb);
void viConfigureForLegal(void);
void viReset(s32 stagenum);
void viBlack(bool black);
void vi00009ed4(void);
void viHandleRetrace(void);
void viUpdateMode(void);
void viShake(f32 intensity);
void viSetMode(s32 mode);

View File

@ -31,7 +31,7 @@ u32 var800915bc;
u32 var800915c0;
u32 var800915c4;
AMAudioMgr g_AudioManager;
OSScClient var800918d0;
OSScClient g_AudioSchedClient;
u32 var800918dc;
u32 g_AmgrFreqPerTick;
u32 var800918e4;
@ -182,9 +182,12 @@ void amgrMain(void *arg)
static u32 var8005d514 = 1;
#if PAL
osScAddClient(&g_Sched, &var800918d0, &g_AudioManager.audioFrameMsgQ, true);
// Receive retrace events every second retrace
osScAddClient(&g_Sched, &g_AudioSchedClient, &g_AudioManager.audioFrameMsgQ, true);
#else
osScAddClient(&g_Sched, &var800918d0, &g_AudioManager.audioFrameMsgQ, !IS4MB());
// 8MB - Receive retrace events every second retrace
// 4MB - Receive retrace events every retrace due to smaller command buffer
osScAddClient(&g_Sched, &g_AudioSchedClient, &g_AudioManager.audioFrameMsgQ, !IS4MB());
#endif
while (!done) {
@ -246,7 +249,7 @@ void amgrHandleFrameMsg(AudioInfo *info, AudioInfo *previnfo)
extern u8 aspDataStart;
if (g_AmgrCurrentCmdList) {
schedAppendTasks(&g_Sched, g_AmgrCurrentCmdList);
schedSubmitTask(&g_Sched, g_AmgrCurrentCmdList);
}
admaBeginFrame();

View File

@ -22,12 +22,12 @@ OSThread g_RmonThread;
OSThread g_IdleThread;
OSThread g_MainThread;
OSThread g_SchedThread;
OSMesgQueue g_SchedMesgQueue;
OSMesg var8008db48[32];
OSMesgQueue g_MainMesgQueue;
OSMesg g_MainMesgBuf[32];
OSMesgQueue *g_SchedCmdQ;
u32 var8008dbcc;
OSSched g_Sched;
OSScClient var8008dca8;
OSScClient g_MainSchedClient;
#if VERSION >= VERSION_NTSC_1_0
u32 g_OsMemSize;
#else
@ -254,7 +254,7 @@ void bootCreateRmonThread(void)
void bootCreateSchedThread(void)
{
osCreateMesgQueue(&g_SchedMesgQueue, var8008db48, ARRAYCOUNT(var8008db48));
osCreateMesgQueue(&g_MainMesgQueue, g_MainMesgBuf, ARRAYCOUNT(g_MainMesgBuf));
if (osTvType == OS_TV_MPAL) {
osCreateScheduler(&g_Sched, &g_SchedThread, OS_VI_MPAL_LAN1, 1);
@ -262,7 +262,7 @@ void bootCreateSchedThread(void)
osCreateScheduler(&g_Sched, &g_SchedThread, OS_VI_NTSC_LAN1, 1);
}
osScAddClient(&g_Sched, &var8008dca8, &g_SchedMesgQueue, 0);
osScAddClient(&g_Sched, &g_MainSchedClient, &g_MainMesgQueue, false);
g_SchedCmdQ = osScGetCmdQ(&g_Sched);
}

View File

@ -34,14 +34,14 @@
struct joydata g_JoyData[2];
s32 g_JoyDisableCooldown[4];
OSMesgQueue g_PiMesgQueue;
OSMesg var80099e90[10];
OSMesg var80099eb8[2];
OSMesg g_PiMesgBuf[10];
OSMesg g_JoyStopCyclicPollingMesgBuf[1];
OSMesgQueue g_JoyStopCyclicPollingMesgQueue;
OSMesg var80099ed8[2];
OSMesg g_JoyStopCyclicPollingDoneMesgBuf[1];
OSMesgQueue g_JoyStopCyclicPollingDoneMesgQueue;
OSMesg var80099ef8[2];
OSMesg g_JoyStartCyclicPollingMesgBuf[1];
OSMesgQueue g_JoyStartCyclicPollingMesgQueue;
OSMesg var80099f18[2];
OSMesg g_JoyStartCyclicPollingDoneMesgBuf[1];
OSMesgQueue g_JoyStartCyclicPollingDoneMesgQueue;
OSContStatus var80099f38[4];
#if VERSION >= VERSION_NTSC_1_0
@ -279,11 +279,11 @@ void joyInit(void)
s32 i;
s32 j;
osCreateMesgQueue(&g_JoyStopCyclicPollingMesgQueue, var80099eb8, 1);
osCreateMesgQueue(&g_JoyStopCyclicPollingDoneMesgQueue, var80099ed8, 1);
osCreateMesgQueue(&g_JoyStartCyclicPollingMesgQueue, var80099ef8, 1);
osCreateMesgQueue(&g_JoyStartCyclicPollingDoneMesgQueue, var80099f18, 1);
osCreateMesgQueue(&g_PiMesgQueue, var80099e90, ARRAYCOUNT(var80099e90));
osCreateMesgQueue(&g_JoyStopCyclicPollingMesgQueue, g_JoyStopCyclicPollingMesgBuf, ARRAYCOUNT(g_JoyStopCyclicPollingMesgBuf));
osCreateMesgQueue(&g_JoyStopCyclicPollingDoneMesgQueue, g_JoyStopCyclicPollingDoneMesgBuf, ARRAYCOUNT(g_JoyStopCyclicPollingDoneMesgBuf));
osCreateMesgQueue(&g_JoyStartCyclicPollingMesgQueue, g_JoyStartCyclicPollingMesgBuf, ARRAYCOUNT(g_JoyStartCyclicPollingMesgBuf));
osCreateMesgQueue(&g_JoyStartCyclicPollingDoneMesgQueue, g_JoyStartCyclicPollingDoneMesgBuf, ARRAYCOUNT(g_JoyStartCyclicPollingDoneMesgBuf));
osCreateMesgQueue(&g_PiMesgQueue, g_PiMesgBuf, ARRAYCOUNT(g_PiMesgBuf));
osSetEventMesg(OS_EVENT_SI, &g_PiMesgQueue, NULL);
@ -601,7 +601,7 @@ void joyReadData(void)
g_JoyData[0].nextsecondlast = (g_JoyData[0].nextlast + 19) % 20;
}
void joysTick(void)
void joysHandleRetrace(void)
{
OSMesg msg;
s8 i;
@ -984,7 +984,7 @@ void joyDestroy(void)
{
s32 i;
osCreateMesgQueue(&g_PiMesgQueue, var80099e90, ARRAYCOUNT(var80099e90));
osCreateMesgQueue(&g_PiMesgQueue, g_PiMesgBuf, ARRAYCOUNT(g_PiMesgBuf));
osSetEventMesg(OS_EVENT_SI, &g_PiMesgQueue, 0);
for (i = 0; i < 4; i++) {

View File

@ -345,7 +345,7 @@ void mainInit(void)
// Wait a bit, reset the controllers and wait a bit more
for (i = 0; i < 4; i++) {
osSetTimer(&timer, 781250 * 6, 0, &queue, &msg);
osSetTimer(&timer, OS_CPU_COUNTER / 60 * 6, 0, &queue, &msg);
osRecvMesg(&queue, &msg, OS_MESG_BLOCK);
if (i == 1) {
@ -485,18 +485,18 @@ void mainInit(void)
g_RdpOutBufferStart = texture;
g_RdpOutBufferEnd = texture + 0x400; // 0x800 bytes, because texture is u16
while (osRecvMesg(&g_SchedMesgQueue, &receivedmsg, OS_MESG_NOBLOCK) == 0) {
while (osRecvMesg(&g_MainMesgQueue, &receivedmsg, OS_MESG_NOBLOCK) == 0) {
// empty
}
j = 0;
while (j < 6) {
osRecvMesg(&g_SchedMesgQueue, &receivedmsg, OS_MESG_BLOCK);
osRecvMesg(&g_MainMesgQueue, &receivedmsg, OS_MESG_BLOCK);
i = (s32) &scdonemsg;
if (*(s16 *) receivedmsg == 1) {
if (*(s16 *) receivedmsg == OS_SC_RETRACE_MSG) {
viUpdateMode();
rdpCreateTask(var8005dcc8, var8005dcf0, 0, (void *) i);
j++;
@ -612,18 +612,18 @@ void mainInit(void)
g_RdpOutBufferStart = texture;
g_RdpOutBufferEnd = texture + 0x400; // 0x800 bytes, because texture is u16
while (osRecvMesg(&g_SchedMesgQueue, &receivedmsg, OS_MESG_NOBLOCK) == 0) {
while (osRecvMesg(&g_MainMesgQueue, &receivedmsg, OS_MESG_NOBLOCK) == 0) {
if (i);
}
i = 0;
while (i < 6) {
osRecvMesg(&g_SchedMesgQueue, &receivedmsg, OS_MESG_BLOCK);
osRecvMesg(&g_MainMesgQueue, &receivedmsg, OS_MESG_BLOCK);
j = (s32) &scdonemsg;
if (*(s16 *) receivedmsg == 1) {
if (*(s16 *) receivedmsg == OS_SC_RETRACE_MSG) {
viUpdateMode();
rdpCreateTask(var8005dcc8, var8005dcf0, 0, (void *) j);
i++;
@ -919,9 +919,9 @@ glabel mainInit
/* dd8c: 0c00273c */ jal viConfigureForCopyright
/* dd90: 02202025 */ or $a0,$s1,$zero
/* dd94: 3c018006 */ lui $at,%hi(g_RdpOutBufferStart)
/* dd98: 3c118009 */ lui $s1,%hi(g_SchedMesgQueue)
/* dd98: 3c118009 */ lui $s1,%hi(g_MainMesgQueue)
/* dd9c: ac321554 */ sw $s2,%lo(g_RdpOutBufferStart)($at)
/* dda0: 26310160 */ addiu $s1,$s1,%lo(g_SchedMesgQueue)
/* dda0: 26310160 */ addiu $s1,$s1,%lo(g_MainMesgQueue)
/* dda4: 3c018006 */ lui $at,%hi(g_RdpOutBufferEnd)
/* dda8: 264c0800 */ addiu $t4,$s2,0x800
/* ddac: ac2c1550 */ sw $t4,%lo(g_RdpOutBufferEnd)($at)
@ -1346,14 +1346,14 @@ void mainLoop(void)
frametimeCalculate();
profileReset();
while (osRecvMesg(&g_SchedMesgQueue, &msg, OS_MESG_NOBLOCK) != -1) {
while (osRecvMesg(&g_MainMesgQueue, &msg, OS_MESG_NOBLOCK) != -1) {
// empty
}
while (g_MainChangeToStageNum < 0 || g_MainNumGfxTasks != 0) {
s32 cycles;
osRecvMesg(&g_SchedMesgQueue, &msg, OS_MESG_BLOCK);
osRecvMesg(&g_MainMesgQueue, &msg, OS_MESG_BLOCK);
#if VERSION < VERSION_NTSC_1_0
bootCheckStackOverflow();

View File

@ -99,12 +99,12 @@ void rdpCreateTask(Gfx *gdlstart, Gfx *gdlend, u32 arg2, void *msg)
sctask->next = NULL;
sctask->flags = OS_SC_NEEDS_RSP | OS_SC_NEEDS_RDP | OS_SC_LAST_TASK | OS_SC_SWAPBUFFER;
sctask->msgQ = &g_SchedMesgQueue;
sctask->msgQ = &g_MainMesgQueue;
sctask->msg = msg;
sctask->framebuffer = g_RdpCurTask->framebuffer;
osWritebackDCacheAll();
schedAppendTasks(&g_Sched, sctask);
schedSubmitTask(&g_Sched, sctask);
// Swap g_RdpCurTask
g_RdpCurTask = (struct rdptask *)((uintptr_t) g_RdpCurTask ^ (uintptr_t) &g_RdpTaskA ^ (uintptr_t) &g_RdpTaskB);

View File

@ -177,14 +177,14 @@ void osCreateScheduler(OSSched *sc, OSThread *thread, u8 mode, u32 numFields)
osStartThread(sc->thread);
}
void osScAddClient(OSSched *sc, OSScClient *c, OSMesgQueue *msgQ, int is8mb)
void osScAddClient(OSSched *sc, OSScClient *c, OSMesgQueue *msgQ, bool is30fps)
{
OSIntMask mask;
mask = osSetIntMask(1);
c->msgQ = msgQ;
c->is8mb = is8mb;
c->is30fps = is30fps;
c->next = sc->clientList;
sc->clientList = c;
@ -243,18 +243,29 @@ void __scMain(void *arg)
switch ((int) msg) {
case VIDEO_MSG:
/**
* The freeze bit is set when a VI swap is pending, and unset here
* when the swap is completed. It prevents the scheduler from
* executing another graphics task during a VI swap.
*/
if (osViGetCurrentFramebuffer() == osViGetNextFramebuffer()) {
osDpSetStatus(DPC_STATUS_FLUSH);
osDpSetStatus(DPC_CLR_FREEZE);
}
__scHandleRetrace(sc);
__scHandleTasks(sc);
break;
case RSP_DONE_MSG:
__scHandleRSP(sc);
break;
case RDP_DONE_MSG:
osDpSetStatus(DPC_STATUS_START_GCLK);
/**
* The RDP has completed a graphics task. Set the freeze bit so the
* scheduler doesn't executing another task until the swap is done.
*/
osDpSetStatus(DPC_SET_FREEZE);
__scHandleRDP(sc);
__scHandleTasks(sc);
break;
@ -262,7 +273,16 @@ void __scMain(void *arg)
}
}
void schedAppendTasks(OSSched *sc, OSScTask *t)
/**
* Nintendo's sheduler accepts tasks on a "command" message queue.
* This isn't used here.
*
* In PD, the main and audio threads submit tasks by calling this function
* instead. It temporarily increases the calling thread's priority above the
* scheduler, adds the task to the linked list directly and attempts to execute
* it. This is faster than the queue method because it avoids switching threads.
*/
void schedSubmitTask(OSSched *sc, OSScTask *t)
{
s32 state;
OSScTask *sp = 0;
@ -274,6 +294,13 @@ void schedAppendTasks(OSSched *sc, OSScTask *t)
__scAppendList(sc, t);
if (sc->doAudio && sc->curRSPTask) {
/**
* Preempt the running gfx task. Note: if the RSP
* component of the graphics task has finished, but the
* RDP component is still running, we can start an audio
* task which will freeze the RDP (and save the RDP cmd
* FIFO) while the audio RSP code is running.
*/
__scYield(sc);
} else {
state = ((sc->curRSPTask == 0) << 1) | (sc->curRDPTask == 0);
@ -317,11 +344,11 @@ void __scHandleRetrace(OSSched *sc)
#endif
if (!g_Resetting) {
vi00009ed4();
viHandleRetrace();
}
joysTick();
snd0000fe18();
joysHandleRetrace();
sndHandleRetrace();
schedRenderCrashPeriodically(sc->frameCount);
}
@ -341,20 +368,16 @@ void __scHandleTasks(OSSched *sc)
profileTick();
/**
* Read the task command queue and schedule tasks
* This is default scheduler code. In PD, clients pass tasks to the
* scheduler using schedSubmitTask. Nothing writes to the cmdQ in PD
* so the condition in this loop never passes.
*/
while (osRecvMesg(&sc->cmdQ, (OSMesg*)&rspTask, OS_MESG_NOBLOCK) != -1) {
__scAppendList(sc, rspTask);
}
if (sc->doAudio && sc->curRSPTask) {
/**
* Preempt the running gfx task. Note: if the RSP
* component of the graphics task has finished, but the
* RDP component is still running, we can start an audio
* task which will freeze the RDP (and save the RDP cmd
* FIFO) while the audio RSP code is running.
*/
// This is unreachable because no tasks are submitted above
__scYield(sc);
} else {
state = ((sc->curRSPTask == 0) << 1) | (sc->curRDPTask == 0);
@ -370,7 +393,7 @@ void __scHandleTasks(OSSched *sc)
* build the list in overrun case)
*/
for (client = sc->clientList; client != 0; client = client->next) {
if ((*((s32*)client + 2) == 0) || ((sc->frameCount & 1) == 0)) {
if (!client->is30fps || (sc->frameCount & 1) == 0) {
osSendMesg(client->msgQ, (OSMesg) &sc->retraceMsg, OS_MESG_NOBLOCK);
}
}
@ -575,6 +598,9 @@ void __scHandleRDP(OSSched *sc)
/**
* __scTaskReady checks to see if the graphics task is able to run
* based on the current state of the RCP.
*
* PD adds the freeze bit check to avoid executing graphics tasks on the RDP
* when there is already a VI swap pending.
*/
OSScTask *__scTaskReady(OSScTask *t)
{
@ -602,7 +628,7 @@ OSScTask *__scTaskReady(OSScTask *t)
s32 __scTaskComplete(OSSched *sc, OSScTask *t)
{
if ((t->state & OS_SC_RCP_MASK) == 0) {
if (t->list.t.type == 1
if (t->list.t.type == M_GFXTASK
&& (t->flags & OS_SC_SWAPBUFFER)
&& (t->flags & OS_SC_LAST_TASK)) {
if (g_SchedIsFirstTask) {
@ -619,7 +645,7 @@ s32 __scTaskComplete(OSSched *sc, OSScTask *t)
|| var8008dd60[1 - var8005ce74]->fldRegs[1].yScale != var8008dcc0[1 - var8005ce74].fldRegs[1].yScale
|| var8008dd60[1 - var8005ce74]->fldRegs[0].origin != var8008dcc0[1 - var8005ce74].fldRegs[0].origin
|| var8008dd60[1 - var8005ce74]->fldRegs[1].origin != var8008dcc0[1 - var8005ce74].fldRegs[1].origin) {
s32 mask = osSetIntMask(0x80401);
s32 mask = osSetIntMask(OS_IM_VI);
*var8008dd60[1 - var8005ce74] = var8008dcc0[1 - var8005ce74];
@ -681,6 +707,13 @@ void __scAppendList(OSSched *sc, OSScTask *t)
t->state = t->flags & OS_SC_RCP_MASK;
}
/**
* Execute a task on the RCP.
*
* Audio tasks use the RSP only, while graphics tasks use both the RSP and RDP.
* Graphics tasks commonly finish the RSP work before the RDP work, in which
* case the RSP can be given an audio task while the graphics task is completing.
*/
void __scExec(OSSched *sc, OSScTask *sp, OSScTask *dp)
{
if (sp) {
@ -688,8 +721,9 @@ void __scExec(OSSched *sc, OSScTask *sp, OSScTask *dp)
osWritebackDCacheAll();
}
// Clear RDP timing counters for graphics tasks, unless they're being resumed
if (sp->list.t.type != M_AUDTASK && (sp->state & OS_SC_YIELD) == 0) {
osDpSetStatus(DPC_STATUS_CMD_BUSY | DPC_STATUS_CBUF_READY | DPC_STATUS_DMA_BUSY | DPC_STATUS_END_VALID);
osDpSetStatus(DPC_CLR_TMEM_CTR | DPC_CLR_PIPE_CTR | DPC_CLR_CMD_CTR | DPC_CLR_CLOCK_CTR);
}
if (sp->list.t.type == M_AUDTASK) {
@ -723,6 +757,13 @@ bool schedIsCurTaskAudio(OSSched *sc)
}
#endif
/**
* Tell the RSP to pause the currently executing graphics task.
* The RSP will pause it shortly and __scHandleRSP will be called.
*
* Graphics tasks are yielded so an audio task can take priority.
* The graphics task is resumed afterwards.
*/
void __scYield(OSSched *sc)
{
if (sc->curRSPTask->list.t.type == M_GFXTASK) {

View File

@ -1679,7 +1679,7 @@ void seqSetVolume(struct seqinstance *seq, u16 volume)
}
}
void snd0000fe18(void)
void sndHandleRetrace(void)
{
// empty
}

View File

@ -34,9 +34,9 @@ s32 osContInit(OSMesgQueue *mq, u8 *bitpattern, OSContStatus *data)
__osContInitialized = TRUE;
t = osGetTime();
if (t < 23437500) {
if (t < OS_CPU_COUNTER / 2) {
osCreateMesgQueue(&timerMesgQueue, &dummy, 1);
osSetTimer(&mytimer, 23437500 - t, 0, &timerMesgQueue, &dummy);
osSetTimer(&mytimer, OS_CPU_COUNTER / 2 - t, 0, &timerMesgQueue, &dummy);
osRecvMesg(&timerMesgQueue, &dummy, OS_MESG_BLOCK);
}

View File

@ -4,7 +4,7 @@
OSTimer var80090ab0;
OSMesgQueue g_GbpakMesgQueue;
OSMesg var80090ae8;
OSMesg g_GbpakMesg;
s32 osGbpakInit(OSMesgQueue *queue, OSPfs *pfs, int channel)
{
@ -76,17 +76,17 @@ s32 osGbpakInit(OSMesgQueue *queue, OSPfs *pfs, int channel)
return ret;
}
osCreateMesgQueue(&g_GbpakMesgQueue, &var80090ae8, 1);
osSetTimer(&var80090ab0, 937500, 0, &g_GbpakMesgQueue, &var80090ae8);
osCreateMesgQueue(&g_GbpakMesgQueue, &g_GbpakMesg, 1);
osSetTimer(&var80090ab0, OS_CPU_COUNTER / 50, 0, &g_GbpakMesgQueue, &g_GbpakMesg);
osRecvMesg(&g_GbpakMesgQueue, 0, OS_MESG_BLOCK);
pfs->queue = queue;
pfs->status = 0x10;
pfs->status = PFS_GBPAK_INITIALIZED;
pfs->channel = channel;
pfs->activebank = 0x84;
pfs->banks = 0xff;
pfs->version = 0xff;
pfs->dir_size = 0xff;
pfs->activebank = 132;
pfs->banks = 255;
pfs->version = 255;
pfs->dir_size = 255;
return 0;
}

View File

@ -4,7 +4,7 @@
extern OSTimer var80090ab0;
extern OSMesgQueue g_GbpakMesgQueue;
extern OSMesg var80090ae8;
extern OSMesg g_GbpakMesg;
s32 osGbpakPower(OSPfs *pfs, s32 flag)
{
@ -31,7 +31,7 @@ s32 osGbpakPower(OSPfs *pfs, s32 flag)
}
if (flag != OS_GBPAK_POWER_OFF) {
osSetTimer(&var80090ab0, 937500, 0, &g_GbpakMesgQueue, &var80090ae8);
osSetTimer(&var80090ab0, OS_CPU_COUNTER / 50, 0, &g_GbpakMesgQueue, &g_GbpakMesg);
osRecvMesg(&g_GbpakMesgQueue, NULL, OS_MESG_BLOCK);
}

View File

@ -258,7 +258,7 @@ void viBlack(bool black)
g_ViUnblackTimer = black;
}
void vi00009ed4(void)
void viHandleRetrace(void)
{
s32 prevmask;
s32 offset;