diff --git a/include/PR/sched.h b/include/PR/sched.h index 166a81b73..a3ce0e627 100644 --- a/include/PR/sched.h +++ b/include/PR/sched.h @@ -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); diff --git a/src/game/gunfx.c b/src/game/gunfx.c index c79ca59e6..920b81799 100644 --- a/src/game/gunfx.c +++ b/src/game/gunfx.c @@ -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; diff --git a/src/include/bss.h b/src/include/bss.h index 3b5193478..a7c6d7217 100644 --- a/src/include/bss.h +++ b/src/include/bss.h @@ -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; diff --git a/src/include/lib/joy.h b/src/include/lib/joy.h index 8afe1da75..6ec3748da 100644 --- a/src/include/lib/joy.h +++ b/src/include/lib/joy.h @@ -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); diff --git a/src/include/lib/sched.h b/src/include/lib/sched.h index 8fe290e25..b81898a57 100644 --- a/src/include/lib/sched.h +++ b/src/include/lib/sched.h @@ -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); diff --git a/src/include/lib/snd.h b/src/include/lib/snd.h index c751e1aa6..a2e6d2194 100644 --- a/src/include/lib/snd.h +++ b/src/include/lib/snd.h @@ -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); diff --git a/src/include/lib/vi.h b/src/include/lib/vi.h index 2b5372e76..0dfb2b71d 100644 --- a/src/include/lib/vi.h +++ b/src/include/lib/vi.h @@ -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); diff --git a/src/lib/audiomgr.c b/src/lib/audiomgr.c index c9da2ef09..382ee38e0 100644 --- a/src/lib/audiomgr.c +++ b/src/lib/audiomgr.c @@ -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(); diff --git a/src/lib/boot.c b/src/lib/boot.c index e66d95f7e..8f8ef6a9d 100644 --- a/src/lib/boot.c +++ b/src/lib/boot.c @@ -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); } diff --git a/src/lib/joy.c b/src/lib/joy.c index 03d30ce67..75521ecf3 100644 --- a/src/lib/joy.c +++ b/src/lib/joy.c @@ -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++) { diff --git a/src/lib/main.c b/src/lib/main.c index 4bafc03dc..2d7b4b60e 100644 --- a/src/lib/main.c +++ b/src/lib/main.c @@ -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(); diff --git a/src/lib/rdp.c b/src/lib/rdp.c index 59db11fde..d4587d66b 100644 --- a/src/lib/rdp.c +++ b/src/lib/rdp.c @@ -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); diff --git a/src/lib/sched.c b/src/lib/sched.c index c089cd2c4..e0feac2a4 100644 --- a/src/lib/sched.c +++ b/src/lib/sched.c @@ -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) { diff --git a/src/lib/snd.c b/src/lib/snd.c index b8674bc34..12e77e21c 100644 --- a/src/lib/snd.c +++ b/src/lib/snd.c @@ -1679,7 +1679,7 @@ void seqSetVolume(struct seqinstance *seq, u16 volume) } } -void snd0000fe18(void) +void sndHandleRetrace(void) { // empty } diff --git a/src/lib/ultra/io/controller.c b/src/lib/ultra/io/controller.c index 73b36b25d..157d6edbf 100644 --- a/src/lib/ultra/io/controller.c +++ b/src/lib/ultra/io/controller.c @@ -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); } diff --git a/src/lib/ultra/io/gbpakinit.c b/src/lib/ultra/io/gbpakinit.c index 454ad8ef2..94b783f16 100644 --- a/src/lib/ultra/io/gbpakinit.c +++ b/src/lib/ultra/io/gbpakinit.c @@ -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; } diff --git a/src/lib/ultra/io/gbpakpower.c b/src/lib/ultra/io/gbpakpower.c index 3fdddac08..055a2dd11 100644 --- a/src/lib/ultra/io/gbpakpower.c +++ b/src/lib/ultra/io/gbpakpower.c @@ -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); } diff --git a/src/lib/vi.c b/src/lib/vi.c index cb121c28d..fc8a1543b 100644 --- a/src/lib/vi.c +++ b/src/lib/vi.c @@ -258,7 +258,7 @@ void viBlack(bool black) g_ViUnblackTimer = black; } -void vi00009ed4(void) +void viHandleRetrace(void) { s32 prevmask; s32 offset;