summaryrefslogtreecommitdiff
path: root/src/code
diff options
context:
space:
mode:
authorkrimtonz <33664508+krimtonz@users.noreply.github.com>2020-05-26 10:39:27 -0500
committerGitHub <noreply@github.com>2020-05-26 11:39:27 -0400
commitd48792870c592435a800d5b2b975ce05df231814 (patch)
treef0de92eb2698735fc8012ae266b6e68ea9425117 /src/code
parent3175f5c988030056bf53f7f46cb57b03ec5c359a (diff)
Decompiles sched.c (#145)
* decompile sched.c * rename Game_AllocEnd to Game_Alloc in z_effect_soft_sprite.c * pr updates
Diffstat (limited to 'src/code')
-rw-r--r--src/code/audioMgr.c2
-rw-r--r--src/code/game.c2
-rw-r--r--src/code/graph.c16
-rw-r--r--src/code/main.c2
-rw-r--r--src/code/sched.c489
-rw-r--r--src/code/speed_meter.c15
-rw-r--r--src/code/sys_matrix.c2
-rw-r--r--src/code/z_construct.c8
-rw-r--r--src/code/z_effect_soft_sprite.c2
-rw-r--r--src/code/z_jpeg.c2
-rw-r--r--src/code/z_kaleido_manager.c2
-rw-r--r--src/code/z_map_exp.c2
-rw-r--r--src/code/z_map_mark.c2
-rw-r--r--src/code/z_msgevent.c2
-rw-r--r--src/code/z_play.c4
-rw-r--r--src/code/z_room.c2
-rw-r--r--src/code/z_sample.c2
-rw-r--r--src/code/z_scene.c2
18 files changed, 485 insertions, 73 deletions
diff --git a/src/code/audioMgr.c b/src/code/audioMgr.c
index e87813503..cdec774cb 100644
--- a/src/code/audioMgr.c
+++ b/src/code/audioMgr.c
@@ -26,7 +26,7 @@ void AudioMgr_HandleRetrace(AudioMgr* audioMgr) {
audioMgr->unk_5C = NULL;
osSendMesg(&audioMgr->sched->cmdQ, &audioMgr->unk_8, OS_MESG_BLOCK);
- func_800C95F8(audioMgr->sched);
+ Sched_SendEntryMsg(audioMgr->sched);
}
D_8016A550 = osGetTime();
if (SREG(20) >= 2) {
diff --git a/src/code/game.c b/src/code/game.c
index 7bbfb965a..7a29a081a 100644
--- a/src/code/game.c
+++ b/src/code/game.c
@@ -496,7 +496,7 @@ u32 GameState_IsRunning(GameState* gameState) {
return gameState->running;
}
-void* GameState_AllocEnd(GameState* gameState, size_t size, char* file, s32 line) {
+void* GameState_Alloc(GameState* gameState, size_t size, char* file, s32 line) {
void* ret;
if (THA_IsCrash(&gameState->tha)) {
diff --git a/src/code/graph.c b/src/code/graph.c
index e8c5a6393..eab22cd5c 100644
--- a/src/code/graph.c
+++ b/src/code/graph.c
@@ -244,7 +244,7 @@ void Graph_TaskSet00(GraphicsContext* gfxCtx) {
cfb = sGraphCfbInfos + sGraphCfbInfoIdx++;
cfb->fb1 = gfxCtx->curFrameBuffer;
- cfb->swapbuffer = gfxCtx->curFrameBuffer;
+ cfb->swapBuffer = gfxCtx->curFrameBuffer;
cfb->viMode = gfxCtx->viMode;
cfb->features = gfxCtx->viFeatures;
cfb->xScale = gfxCtx->xScale;
@@ -257,7 +257,7 @@ void Graph_TaskSet00(GraphicsContext* gfxCtx) {
gfxCtx->schedMsgQ = &gSchedContext.cmdQ;
osSendMesg(&gSchedContext.cmdQ, scTask, OS_MESG_BLOCK);
- func_800C95F8(&gSchedContext); // osScKickEntryMsg
+ Sched_SendEntryMsg(&gSchedContext); // osScKickEntryMsg
}
#else
u32 D_8012D260 = 0;
@@ -374,12 +374,12 @@ void Graph_Update(GraphicsContext* gfxCtx, GameState* gameState) {
func_800F3054();
time = osGetTime();
- D_8016A538 = D_8016A568;
- D_8016A530 = D_8016A560;
- D_8016A540 = D_8016A580;
- D_8016A568 = 0;
- D_8016A560 = 0;
- D_8016A580 = 0;
+ D_8016A538 = gRSPGFXTotalTime;
+ D_8016A530 = gRSPAudioTotalTime;
+ D_8016A540 = gRDPTotalTime;
+ gRSPGFXTotalTime = 0;
+ gRSPAudioTotalTime = 0;
+ gRDPTotalTime = 0;
if (sGraphUpdateTime != 0) {
D_8016A548 = time - sGraphUpdateTime;
diff --git a/src/code/main.c b/src/code/main.c
index 3b4abac43..6e0862287 100644
--- a/src/code/main.c
+++ b/src/code/main.c
@@ -79,7 +79,7 @@ void Main(void* arg0) {
osSyncPrintf("タスクスケジューラの初期化\n"); // Initialize the task scheduler
StackCheck_Init(&sSchedStackInfo, sSchedStack, sSchedStack + sizeof(sSchedStack), 0, 0x100, "sched");
- func_800C9874(&gSchedContext, &sAudioStack, 0xf, D_80013960, 1, &gIrqMgr);
+ Sched_Init(&gSchedContext, &sAudioStack, 0xf, D_80013960, 1, &gIrqMgr);
IrqMgr_AddClient(&gIrqMgr, &irqClient, &irqMgrMsgQ);
diff --git a/src/code/sched.c b/src/code/sched.c
index a22b60ad2..ee91cfe6a 100644
--- a/src/code/sched.c
+++ b/src/code/sched.c
@@ -1,9 +1,59 @@
#include <ultra64.h>
#include <global.h>
-#pragma GLOBAL_ASM("asm/non_matchings/code/sched/func_800C82A0.s")
+#define RSP_DONE_MSG 667
+#define RDP_DONE_MSG 668
+#define ENTRY_MSG 670
-void func_800C84E4(SchedContext* sc, UNK_TYPE arg1) {
+// data
+volatile s32 sLogScheduler = false;
+
+// bss
+OSTime sRSPGFXStartTime;
+OSTime sRSPAudioStartTime;
+OSTime sRSPOtherStartTime;
+OSTime sRDPStartTime;
+
+void Sched_SwapFrameBuffer(CfbInfo* cfbInfo) {
+ u16 width;
+ LogUtils_CheckValidPointer("cfbinfo->swapbuffer", cfbInfo->swapBuffer, "../sched.c", 340);
+ if (cfbInfo->swapBuffer != NULL) {
+ osViSwapBuffer(cfbInfo->swapBuffer);
+ cfbInfo->updateRate2 = cfbInfo->updateRate;
+ if (sLogScheduler) {
+ osSyncPrintf("osViSwapBuffer %08x %08x %08x\n", osViGetCurrentFramebuffer(), osViGetNextFramebuffer(),
+ (cfbInfo != NULL ? cfbInfo->swapBuffer : NULL));
+ }
+ width = cfbInfo->viMode != NULL ? cfbInfo->viMode->comRegs.width : gScreenWidth;
+ Fault_SetFB(cfbInfo->swapBuffer, width, 0x10);
+ if (HREG(80) == 0xD && HREG(95) != 0xD) {
+ HREG(81) = 0;
+ HREG(82) = 0;
+ HREG(83) = 1;
+ HREG(84) = 0;
+ HREG(85) = 1;
+ HREG(86) = 0;
+ HREG(87) = 0;
+ HREG(88) = 0;
+ HREG(89) = 0;
+ HREG(90) = 0;
+ HREG(91) = 0;
+ HREG(92) = 0;
+ HREG(93) = 0;
+ HREG(94) = 0;
+ HREG(95) = 0xD;
+ }
+ if (HREG(80) == 0xD && HREG(81) == 2) {
+ osViSetSpecialFeatures(HREG(82) != 0 ? 1 : 2);
+ osViSetSpecialFeatures(HREG(83) != 0 ? 0x40 : 0x80);
+ osViSetSpecialFeatures(HREG(84) != 0 ? 0x4 : 0x8);
+ osViSetSpecialFeatures(HREG(85) != 0 ? 0x10 : 0x20);
+ }
+ }
+ cfbInfo->unk_10 = 0;
+}
+
+void func_800C84E4(SchedContext* sc, CfbInfo* cfbInfo) {
if (sc->unk_24C != 0) {
sc->unk_24C = 0;
@@ -12,67 +62,189 @@ void func_800C84E4(SchedContext* sc, UNK_TYPE arg1) {
}
}
- func_800C82A0(arg1);
+ Sched_SwapFrameBuffer(cfbInfo);
}
-#pragma GLOBAL_ASM("asm/non_matchings/code/sched/func_800C8534.s")
+void Sched_HandleReset(SchedContext* sc) {
+ OSTime now;
+ if (sc->curRSPTask != NULL) {
+ now = osGetTime();
+ if (sc->curRSPTask->framebuffer == NULL) {
+ LOG_TIME("(((u64)(now - audio_rsp_start_time)*(1000000LL/15625LL))/((62500000LL*3/4)/15625LL))",
+ OS_CYCLES_TO_USEC(now - sRSPAudioStartTime), "../sched.c", 421);
+ } else if (OS_CYCLES_TO_USEC(now - sRSPGFXStartTime) > 1000000 ||
+ OS_CYCLES_TO_USEC(now - sRDPStartTime) > 1000000) {
+ func_800FBFD8();
+ if (sc->curRSPTask != NULL) {
+ LOG_TIME("(((u64)(now - graph_rsp_start_time)*(1000000LL/15625LL))/((62500000LL*3/4)/15625LL))",
+ OS_CYCLES_TO_USEC(now - sRSPGFXStartTime), "../sched.c", 427);
+ osSendMesg(&sc->interruptQ, RSP_DONE_MSG, OS_MESG_NOBLOCK);
+ }
+ if (sc->curRDPTask != NULL) {
+ LOG_TIME("(((u64)(now - rdp_start_time)*(1000000LL/15625LL))/((62500000LL*3/4)/15625LL))",
+ OS_CYCLES_TO_USEC(now - sRDPStartTime), "../sched.c", 431);
+ osSendMesg(&sc->interruptQ, RDP_DONE_MSG, 0);
+ }
+ }
+ }
+}
-void func_800C87CC(SchedContext* sc) {
+void Sched_HandleStart(SchedContext* sc) {
ViConfig_UpdateVi(1);
}
-#pragma GLOBAL_ASM("asm/non_matchings/code/sched/func_800C87F0.s")
+void Sched_QueueTask(SchedContext* sc, OSScTask* task) {
+ s32 type = task->list.t.type;
+ if (!((type == M_AUDTASK) || (type == M_GFXTASK) || (type == M_NJPEGTASK) || (type == M_NULTASK))) {
+ __assert("(type == M_AUDTASK) || (type == M_GFXTASK) || (type == M_NJPEGTASK) || (type == M_NULTASK)",
+ "../sched.c", 463);
+ }
+
+ if (type == M_AUDTASK) {
+ if (sLogScheduler) {
+ // You have entered an audio task
+ osSyncPrintf("オーディオタスクをエントリしました\n");
+ }
+ if (sc->audioListTail != NULL) {
+ sc->audioListTail->next = task;
+ } else {
+ sc->audioListHead = task;
+ }
+ sc->audioListTail = task;
+ sc->doAudio = 1;
+ } else {
+ if (sLogScheduler) {
+ // Entered graph task
+ osSyncPrintf("グラフタスクをエントリしました\n");
+ }
+
+ if (sc->gfxListTail != NULL) {
+ sc->gfxListTail->next = task;
+ } else {
+ sc->gfxListHead = task;
+ }
+ sc->gfxListTail = task;
+ }
+ task->next = NULL;
+ task->state = task->flags & (OS_SC_NEEDS_RDP | OS_SC_NEEDS_RSP);
+}
-void func_800C8910(SchedContext* sc) {
- if (!(sc->curRSPTask->state & 0x10)) {
+void Sched_Yield(SchedContext* sc) {
+ if (!(sc->curRSPTask->state & OS_SC_YIELD)) {
if (sc->curRSPTask->list.t.type == M_AUDTASK) {
__assert("sc->curRSPTask->list.t.type != M_AUDTASK", "../sched.c", 496);
}
- sc->curRSPTask->state |= 0x10;
+ sc->curRSPTask->state |= OS_SC_YIELD;
osSpTaskYield();
- if (D_8012D290 != 0) {
+ if (sLogScheduler) {
osSyncPrintf("%08d:osSpTaskYield\n", (u32)(OS_CYCLES_TO_USEC(osGetTime())));
}
}
}
-#pragma GLOBAL_ASM("asm/non_matchings/code/sched/func_800C89D4.s")
+OSScTask* func_800C89D4(SchedContext* sc, OSScTask* task) {
+ if (task == NULL) {
+ return NULL;
+ }
+
+ if (sc->pendingSwapBuf1 != NULL) {
+ if (0) {
+ __assert("sc->pending_swapbuffer1", "../sched.c", UNK_LINE);
+ }
+ return NULL;
+ }
+
+ if (sc->pendingSwapBuf2 != NULL) {
+ if (0) {
+ __assert("sc->pending_swapbuffer2", "../sched.c", UNK_LINE);
+ }
+ return NULL;
+ }
+
+ if ((sc->pendingSwapBuf2 != NULL ? sc->pendingSwapBuf2->swapBuffer : NULL) == task->framebuffer->fb1) {
+ return NULL;
+ }
+
+ if ((sc->pendingSwapBuf1 != NULL ? sc->pendingSwapBuf1->swapBuffer : NULL) == task->framebuffer->fb1) {
+ return NULL;
+ }
+
+ if (osViGetCurrentFramebuffer() == (u32*)task->framebuffer->fb1) {
+ return NULL;
+ }
-#pragma GLOBAL_ASM("asm/non_matchings/code/sched/func_800C8A94.s")
+ return task;
+}
+
+#ifdef NON_MATCHING
+// regalloc
+s32 Sched_Schedule(SchedContext* sc, OSScTask** sp, OSScTask** dp, s32 state) {
+ s32 ret = state;
+ OSScTask* gfxTask = sc->gfxListHead;
+ OSScTask* audioTask = sc->audioListHead;
-typedef struct {
- /* 0x00 */ char unk_00[0x04];
- /* 0x00 */ u32 unk_04;
- /* 0x00 */ u32 unk_08;
- /* 0x0C */ UNK_TYPE unk_0C;
- /* 0x10 */ char unk_10[0x40];
- /* 0x50 */ OSMesgQueue* msgQ;
- /* 0x54 */ OSMesg msg;
-} struct_800C8C40;
+ if (sc->doAudio && ret & OS_SC_SP) {
+ *sp = audioTask;
+ ret &= ~OS_SC_SP;
+ sc->doAudio = 0;
+ sc->audioListHead = sc->audioListHead->next;
+ if (sc->audioListHead == NULL) {
+ sc->audioListTail = NULL;
+ }
+ } else {
+ if (gfxTask != NULL) {
+ if (gfxTask->state & OS_SC_YIELDED || !(sc->gfxListHead->flags & OS_SC_NEEDS_RDP)) {
+ if (ret & OS_SC_SP) {
+ *sp = gfxTask;
+ ret &= ~OS_SC_SP;
+ sc->gfxListHead = sc->gfxListHead->next;
+ if (sc->gfxListHead == NULL) {
+ sc->gfxListTail = NULL;
+ }
+ }
+ } else {
+ if (ret == (OS_SC_SP | OS_SC_DP)) {
+ if (sc->gfxListHead->framebuffer == NULL || func_800C89D4(sc, gfxTask) != NULL) {
+ *sp = *dp = gfxTask;
+ ret &= ~(OS_SC_SP | OS_SC_DP);
+ sc->gfxListHead = sc->gfxListHead->next;
+ if (sc->gfxListHead == NULL) {
+ sc->gfxListTail = NULL;
+ }
+ }
+ }
+ }
+ }
+ }
+ return ret;
+}
+#else
+#pragma GLOBAL_ASM("asm/non_matchings/code/sched/Sched_Schedule.s")
+#endif
-void func_800C8BC4(SchedContext* sc, struct_800C8C40* arg1) {
- if (sc->pendingSwapBuf1 == 0) {
- sc->pendingSwapBuf1 = arg1->unk_0C;
+void func_800C8BC4(SchedContext* sc, OSScTask* task) {
+ if (sc->pendingSwapBuf1 == NULL) {
+ sc->pendingSwapBuf1 = task->framebuffer;
LogUtils_CheckValidPointer("sc->pending_swapbuffer1", sc->pendingSwapBuf1, "../sched.c", 618);
- if ((sc->unk_240 == NULL) || (sc->unk_240->unk_12 < 1)) {
- func_800C84E4(sc, arg1->unk_0C);
+ if ((sc->curBuf == NULL) || (sc->curBuf->updateRate2 < 1)) {
+ func_800C84E4(sc, task->framebuffer);
}
}
}
-u32 func_800C8C40(SchedContext* sc, struct_800C8C40* arg1) {
- if (!(arg1->unk_04 & 3)) {
- if (arg1->msgQ != NULL) {
- osSendMesg(arg1->msgQ, arg1->msg, OS_MESG_BLOCK);
+u32 Sched_IsComplete(SchedContext* sc, OSScTask* task) {
+ if (!(task->state & (OS_SC_DP | OS_SC_SP))) {
+ if (task->msgQ != NULL) {
+ osSendMesg(task->msgQ, task->msg, OS_MESG_BLOCK);
}
- if (arg1->unk_08 & 0x40) {
- func_800C8BC4(sc, arg1);
+ if (task->flags & OS_SC_SWAPBUFFER) {
+ func_800C8BC4(sc, task);
}
return 1;
@@ -81,34 +253,259 @@ u32 func_800C8C40(SchedContext* sc, struct_800C8C40* arg1) {
return 0;
}
-#pragma GLOBAL_ASM("asm/non_matchings/code/sched/func_800C8CB8.s")
+void Sched_RunTask(SchedContext* sc, OSScTask* spTask, OSScTask* dpTask) {
+
+ if (sc->curRSPTask != NULL) {
+ __assert("sc->curRSPTask == NULL", "../sched.c", 663);
+ }
+ if (spTask != NULL) {
+ if (spTask->list.t.type == 0) {
+ if (spTask->flags & OS_SC_NEEDS_RSP) {
+ spTask->state &= ~OS_SC_SP;
+ sc->curRSPTask = NULL;
+ }
+ if (spTask->flags & OS_SC_NEEDS_RDP) {
+ spTask->state &= ~OS_SC_DP;
+ sc->curRDPTask = NULL;
+ }
+ Sched_IsComplete(sc, spTask);
+ return;
+ }
+ spTask->state &= ~(OS_SC_YIELD | OS_SC_YIELDED);
+ osWritebackDCacheAll();
+ osSpTaskLoad(&spTask->list);
+
+ if (spTask->list.t.type == M_AUDTASK) {
+ sRSPAudioStartTime = osGetTime();
+ } else if (spTask->list.t.type == M_GFXTASK) {
+ sRSPGFXStartTime = osGetTime();
+ } else {
+ sRSPOtherStartTime = osGetTime();
+ }
+
+ osSpTaskStartGo(&spTask->list);
+ if (sLogScheduler) {
+ osSyncPrintf(
+ "%08d:osSpTaskStartGo(%08x) %s\n", (u32)OS_CYCLES_TO_USEC(osGetTime()), &spTask->list,
+ (spTask->list.t.type == M_AUDTASK ? "AUDIO" : (spTask->list.t.type == M_GFXTASK ? "GRAPH" : "OTHER")));
+ }
+ sc->curRSPTask = spTask;
+ if (spTask == dpTask && sc->curRDPTask == NULL) {
+ sc->curRDPTask = dpTask;
+ sRDPStartTime = sRSPGFXStartTime;
+ }
+ }
+}
+
+void Sched_HandleEntry(SchedContext* sc) {
+ OSScTask* nextRSP;
+ OSScTask* nextRDP;
+ u32 state;
+ OSMesg msg;
+
+ nextRSP = NULL;
+ nextRDP = NULL;
+ msg = NULL;
+ while (osRecvMesg(&sc->cmdQ, &msg, OS_MESG_NOBLOCK) != -1) {
+ Sched_QueueTask(sc, msg);
+ }
+
+ if (sc->doAudio != 0 && sc->curRSPTask != NULL) {
+ if (sLogScheduler) {
+ osSyncPrintf("[YIELD B]");
+ }
+ Sched_Yield(sc);
+ return;
+ }
+ state = ((sc->curRSPTask == 0) * 2) | (sc->curRDPTask == 0);
+ if (Sched_Schedule(sc, &nextRSP, &nextRDP, state) != state) {
+ Sched_RunTask(sc, nextRSP, nextRDP);
+ }
+ if (sLogScheduler) {
+ osSyncPrintf("EN sc:%08x sp:%08x dp:%08x state:%x\n", sc, nextRSP, nextRDP, state);
+ }
+}
+
+void Sched_HandleRetrace(SchedContext* sc) {
+ if (sLogScheduler) {
+ osSyncPrintf("%08d:scHandleRetrace %08x\n", (u32)OS_CYCLES_TO_USEC(osGetTime()), osViGetCurrentFramebuffer());
+ }
+ ViConfig_UpdateBlack();
+ sc->retraceCnt++;
+ if (osViGetCurrentFramebuffer() == (u32*)(sc->pendingSwapBuf1 != NULL ? sc->pendingSwapBuf1->swapBuffer : NULL)) {
+ if (sc->curBuf != NULL) {
+ sc->curBuf->unk_10 = 0;
+ }
+
+ if (sc->pendingSwapBuf1 != NULL) {
+ sc->pendingSwapBuf1->unk_10 = 0;
+ }
+ sc->curBuf = sc->pendingSwapBuf1;
+ sc->pendingSwapBuf1 = sc->pendingSwapBuf2;
+ sc->pendingSwapBuf2 = NULL;
+ }
+ if (sc->curBuf != NULL) {
+ if (sc->curBuf->updateRate2 > 0) {
+ sc->curBuf->updateRate2--;
+ }
+
+ if ((sc->curBuf->updateRate2 <= 0) && (sc->pendingSwapBuf1 != NULL)) {
+ func_800C84E4(sc, sc->pendingSwapBuf1);
+ }
+ }
+ if (sLogScheduler) {
+ osSyncPrintf("%08x %08x %08x %d\n", osViGetCurrentFramebuffer(), osViGetNextFramebuffer(),
+ sc->pendingSwapBuf1 != NULL ? sc->pendingSwapBuf1->swapBuffer : NULL,
+ sc->curBuf != NULL ? sc->curBuf->updateRate2 : 0);
+ }
+ Sched_HandleEntry(sc);
+}
+
+void Sched_HandleRSPDone(SchedContext* sc) {
+ OSScTask* curRSPTask;
+ OSScTask* nextRSP;
+ OSScTask* nextRDP;
+ s32 state;
+
+ nextRSP = NULL;
+ nextRDP = NULL;
+ if (sc->curRSPTask == NULL) {
+ __assert("sc->curRSPTask", "../sched.c", 819);
+ }
+
+ if (sc->curRSPTask->list.t.type == M_AUDTASK) {
+ gRSPAudioTotalTime += osGetTime() - sRSPAudioStartTime;
+ } else if (sc->curRSPTask->list.t.type == M_GFXTASK) {
+ gRSPGFXTotalTime += osGetTime() - sRSPGFXStartTime;
+ } else {
+ gRSPOtherTotalTime += osGetTime() - sRSPOtherStartTime;
+ }
-#pragma GLOBAL_ASM("asm/non_matchings/code/sched/func_800C8EDC.s")
+ curRSPTask = sc->curRSPTask;
+ sc->curRSPTask = NULL;
+ if (sLogScheduler) {
+ osSyncPrintf("RSP DONE %d %d", curRSPTask->state & 0x10, osSpTaskYielded(&curRSPTask->list));
+ }
+ if (curRSPTask->state & OS_SC_YIELD && osSpTaskYielded(&curRSPTask->list)) {
+ if (sLogScheduler) {
+ osSyncPrintf("[YIELDED]\n");
+ }
+ curRSPTask->state |= OS_SC_YIELDED;
+ curRSPTask->next = sc->gfxListHead;
+ sc->gfxListHead = curRSPTask;
+ if (sc->gfxListTail == NULL) {
+ sc->gfxListTail = curRSPTask;
+ }
+ } else {
+ if (sLogScheduler) {
+ osSyncPrintf("[NOT YIELDED]\n");
+ }
+ curRSPTask->state &= ~OS_SC_SP;
+ Sched_IsComplete(sc, curRSPTask);
+ }
+ state = ((sc->curRSPTask == NULL) << 1) | (sc->curRDPTask == NULL);
+ if (Sched_Schedule(sc, &nextRSP, &nextRDP, state) != state) {
+ Sched_RunTask(sc, nextRSP, nextRDP);
+ }
+ if (sLogScheduler) {
+ osSyncPrintf("SP sc:%08x sp:%08x dp:%08x state:%x\n", sc, nextRSP, nextRDP, state);
+ }
+}
-#pragma GLOBAL_ASM("asm/non_matchings/code/sched/func_800C9018.s")
+void Sched_HandleRDPDone(SchedContext* sc) {
+ OSScTask* curTask;
+ OSScTask* nextRSP;
+ OSScTask* nextRDP;
+ s32 state;
-#pragma GLOBAL_ASM("asm/non_matchings/code/sched/func_800C91BC.s")
+ nextRSP = NULL;
+ nextRDP = NULL;
-#pragma GLOBAL_ASM("asm/non_matchings/code/sched/func_800C94B4.s")
+ gRDPTotalTime = osGetTime() - sRDPStartTime;
+ if (sc->curRDPTask == NULL) {
+ __assert("sc->curRDPTask", "../sched.c", 878);
+ }
+ if (sc->curRDPTask->list.t.type != M_GFXTASK) {
+ __assert("sc->curRDPTask->list.t.type == M_GFXTASK", "../sched.c", 879);
+ }
+ curTask = sc->curRDPTask;
+ sc->curRDPTask = NULL;
+ curTask->state &= ~OS_SC_DP;
+ Sched_IsComplete(sc, curTask);
+ state = ((sc->curRSPTask == NULL) << 1) | (sc->curRDPTask == NULL);
+ if (Sched_Schedule(sc, &nextRSP, &nextRDP, state) != state) {
+ Sched_RunTask(sc, nextRSP, nextRDP);
+ }
+ if (sLogScheduler) {
+ osSyncPrintf("DP sc:%08x sp:%08x dp:%08x state:%x\n", sc, nextRSP, nextRDP, state);
+ }
+}
-void func_800C95F8(OSMesgQueue* mq) {
- if (D_8012D290 != 0) {
+void Sched_SendEntryMsg(OSMesgQueue* mq) {
+ if (sLogScheduler) {
osSyncPrintf("osScKickEntryMsg\n");
}
- osSendMesg(mq, 670, OS_MESG_BLOCK);
+ osSendMesg(mq, ENTRY_MSG, OS_MESG_BLOCK);
}
-#pragma GLOBAL_ASM("asm/non_matchings/code/sched/func_800C9644.s")
+void Sched_ThreadEntry(void* arg) {
+ void* msg;
+ SchedContext* sc = (SchedContext*)arg;
+
+ msg = NULL;
+ while (1) {
+ if (sLogScheduler) {
+ // %08d: standby
+ osSyncPrintf("%08d:待機中\n", (u32)OS_CYCLES_TO_USEC(osGetTime()));
+ }
+
+ osRecvMesg(&sc->interruptQ, &msg, OS_MESG_BLOCK);
+
+ switch ((s32)msg) {
+ case ENTRY_MSG:
+ if (sLogScheduler) {
+ osSyncPrintf("%08d:ENTRY_MSG\n", (u32)OS_CYCLES_TO_USEC(osGetTime()));
+ }
+ Sched_HandleEntry(sc);
+ continue;
+ case RSP_DONE_MSG:
+ if (sLogScheduler) {
+ osSyncPrintf("%08d:RSP_DONE_MSG\n", (u32)OS_CYCLES_TO_USEC(osGetTime()));
+ }
+ Sched_HandleRSPDone(sc);
+ continue;
+ case RDP_DONE_MSG:
+ if (sLogScheduler) {
+ osSyncPrintf("%08d:RDP_DONE_MSG\n", (u32)OS_CYCLES_TO_USEC(osGetTime()));
+ }
+ Sched_HandleRDPDone(sc);
+ continue;
+ default:
+ break;
+ }
+ switch (((OSScMsg*)msg)->type) {
+ case 1:
+ Sched_HandleRetrace(sc);
+ continue;
+ case 4:
+ Sched_HandleReset(sc);
+ continue;
+ case 3:
+ Sched_HandleStart(sc);
+ continue;
+ }
+ }
+}
-void func_800C9874(SchedContext* sc, void* stack, OSPri priority, UNK_TYPE arg3, UNK_TYPE arg4, UNK_TYPE arg5) {
+void Sched_Init(SchedContext* sc, void* stack, OSPri priority, UNK_TYPE arg3, UNK_TYPE arg4, IrqMgr* irqMgr) {
bzero(sc, sizeof(SchedContext));
sc->unk_24C = 1;
osCreateMesgQueue(&sc->interruptQ, sc->intBuf, 8);
osCreateMesgQueue(&sc->cmdQ, sc->cmdMsgBuf, 8);
- osSetEventMesg(4, &sc->interruptQ, 667);
- osSetEventMesg(9, &sc->interruptQ, 668);
- IrqMgr_AddClient(arg5, &sc->unk_250, sc);
- osCreateThread(&sc->thread, 5, func_800C9644, sc, stack, priority);
+ osSetEventMesg(OS_EVENT_SP, &sc->interruptQ, RSP_DONE_MSG);
+ osSetEventMesg(OS_EVENT_DP, &sc->interruptQ, RDP_DONE_MSG);
+ IrqMgr_AddClient(irqMgr, &sc->irqClient, &sc->interruptQ);
+ osCreateThread(&sc->thread, 5, Sched_ThreadEntry, sc, stack, priority);
osStartThread(&sc->thread);
}
diff --git a/src/code/speed_meter.c b/src/code/speed_meter.c
index 35790bbf1..0e04fa954 100644
--- a/src/code/speed_meter.c
+++ b/src/code/speed_meter.c
@@ -2,6 +2,21 @@
#include <global.h>
#include <vt.h>
+volatile OSTime D_8016A520;
+volatile OSTime D_8016A528;
+volatile OSTime D_8016A530;
+volatile OSTime D_8016A538;
+volatile OSTime D_8016A540;
+volatile OSTime D_8016A548;
+volatile OSTime D_8016A550;
+volatile OSTime D_8016A558;
+volatile OSTime gRSPAudioTotalTime;
+volatile OSTime gRSPGFXTotalTime;
+volatile OSTime gRSPOtherTotalTime;
+volatile OSTime D_8016A578;
+volatile OSTime gRDPTotalTime;
+SpeedMeterTimeEntry* gSpeedMeterTimeEntryPtr;
+
SpeedMeterTimeEntry sSpeedMeterTimeEntryArray[] = {
{ &D_8016A520, 0, 0, GPACK_RGBA5551(0xFF, 0x00, 0x00, 1) },
{ &D_8016A528, 0, 2, GPACK_RGBA5551(0xFF, 0xFF, 0x00, 1) },
diff --git a/src/code/sys_matrix.c b/src/code/sys_matrix.c
index 487e1a841..46a2944c8 100644
--- a/src/code/sys_matrix.c
+++ b/src/code/sys_matrix.c
@@ -21,7 +21,7 @@ MtxF* sMatrixStack; // "Matrix_stack"
MtxF* sCurrentMatrix; // "Matrix_now"
void Matrix_Init(GameState* gameState) {
- sCurrentMatrix = GameState_AllocEnd(gameState, 20 * sizeof(MtxF), "../sys_matrix.c", 153);
+ sCurrentMatrix = GameState_Alloc(gameState, 20 * sizeof(MtxF), "../sys_matrix.c", 153);
sMatrixStack = sCurrentMatrix;
}
diff --git a/src/code/z_construct.c b/src/code/z_construct.c
index 8d8d73faf..e1aefde9b 100644
--- a/src/code/z_construct.c
+++ b/src/code/z_construct.c
@@ -40,7 +40,7 @@ void func_801109B0(GlobalContext* globalCtx) {
// Translates to: "Permanent PARAMETER Segment = %x"
osSyncPrintf("常駐PARAMETERセグメント=%x\n", parameterSize);
- interfaceCtx->parameterSegment = GameState_AllocEnd(&globalCtx->state, parameterSize, "../z_construct.c", 159);
+ interfaceCtx->parameterSegment = GameState_Alloc(&globalCtx->state, parameterSize, "../z_construct.c", 159);
osSyncPrintf("parameter->parameterSegment=%x", interfaceCtx->parameterSegment);
@@ -50,7 +50,7 @@ void func_801109B0(GlobalContext* globalCtx) {
DmaMgr_SendRequest1(interfaceCtx->parameterSegment, parameterStart, parameterSize, "../z_construct.c", 162);
- interfaceCtx->do_actionSegment = GameState_AllocEnd(&globalCtx->state, 0x480, "../z_construct.c", 166);
+ interfaceCtx->do_actionSegment = GameState_Alloc(&globalCtx->state, 0x480, "../z_construct.c", 166);
// Translates to: "DO Action Texture Initialization"
osSyncPrintf("DOアクション テクスチャ初期=%x\n", 0x480);
@@ -84,7 +84,7 @@ void func_801109B0(GlobalContext* globalCtx) {
DmaMgr_SendRequest1((void*)((u32)interfaceCtx->do_actionSegment + 0x300), do_actionStart + do_actionOffset, 0x180,
"../z_construct.c", 178);
- interfaceCtx->icon_itemSegment = GameState_AllocEnd(&globalCtx->state, 0x4000, "../z_construct.c", 190);
+ interfaceCtx->icon_itemSegment = GameState_Alloc(&globalCtx->state, 0x4000, "../z_construct.c", 190);
// Translates to: "Icon Item Texture Initialization = %x"
osSyncPrintf("アイコンアイテム テクスチャ初期=%x\n", 0x4000);
@@ -201,7 +201,7 @@ void func_80110F68(GlobalContext* globalCtx) {
View_Init(&msgCtx->view, globalCtx->state.gfxCtx);
- msgCtx->textboxSegment = GameState_AllocEnd(&globalCtx->state, 0x2200, "../z_construct.c", 349);
+ msgCtx->textboxSegment = GameState_Alloc(&globalCtx->state, 0x2200, "../z_construct.c", 349);
osSyncPrintf("message->fukidashiSegment=%x\n", msgCtx->textboxSegment);
diff --git a/src/code/z_effect_soft_sprite.c b/src/code/z_effect_soft_sprite.c
index bc9afa476..8c99bb380 100644
--- a/src/code/z_effect_soft_sprite.c
+++ b/src/code/z_effect_soft_sprite.c
@@ -16,7 +16,7 @@ void EffectSs_InitInfo(GlobalContext* globalCtx, s32 tableSize) {
}
sEffectSsInfo.table =
- GameState_AllocEnd(&globalCtx->state, tableSize * sizeof(EffectSs), "../z_effect_soft_sprite.c", 289);
+ GameState_Alloc(&globalCtx->state, tableSize * sizeof(EffectSs), "../z_effect_soft_sprite.c", 289);
if (sEffectSsInfo.table == NULL) {
__assert("EffectSS2Info.data_table != NULL", "../z_effect_soft_sprite.c", 290);
}
diff --git a/src/code/z_jpeg.c b/src/code/z_jpeg.c
index 070cdadf7..609d1412f 100644
--- a/src/code/z_jpeg.c
+++ b/src/code/z_jpeg.c
@@ -60,7 +60,7 @@ u32 Jpeg_SendTask(JpegContext* ctx) {
ctx->scTask.list.t = sJpegTask;
osSendMesg(&gSchedContext.cmdQ, (OSMesg)&ctx->scTask, OS_MESG_BLOCK);
- func_800C95F8(&gSchedContext); // osScKickEntryMsg
+ Sched_SendEntryMsg(&gSchedContext); // osScKickEntryMsg
osRecvMesg(&ctx->mq, NULL, OS_MESG_BLOCK);
}
diff --git a/src/code/z_kaleido_manager.c b/src/code/z_kaleido_manager.c
index 4095e6a6a..5fb9316e3 100644
--- a/src/code/z_kaleido_manager.c
+++ b/src/code/z_kaleido_manager.c
@@ -53,7 +53,7 @@ void KaleidoManager_Init(GlobalContext* globalCtx) {
osSyncPrintf(VT_FGCOL(GREEN));
osSyncPrintf("KaleidoArea の最大サイズは %d バイトを確保します\n", largestOvl);
osSyncPrintf(VT_RST);
- sKaleidoAreaPtr = GameState_AllocEnd(&globalCtx->state, largestOvl, "../z_kaleido_manager.c", 150);
+ sKaleidoAreaPtr = GameState_Alloc(&globalCtx->state, largestOvl, "../z_kaleido_manager.c", 150);
LogUtils_CheckNullPointer("KaleidoArea_allocp", sKaleidoAreaPtr, "../z_kaleido_manager.c", 151);
osSyncPrintf(VT_FGCOL(GREEN));
osSyncPrintf("KaleidoArea %08x - %08x\n", sKaleidoAreaPtr, (u32)sKaleidoAreaPtr + largestOvl);
diff --git a/src/code/z_map_exp.c b/src/code/z_map_exp.c
index aea0719ba..690553acf 100644
--- a/src/code/z_map_exp.c
+++ b/src/code/z_map_exp.c
@@ -232,7 +232,7 @@ void Map_Init(GlobalContext* globalCtx) {
interfaceCtx->unk_258 = -1;
interfaceCtx->unk_25A = -1;
- interfaceCtx->mapSegment = GameState_AllocEnd(&globalCtx->state, 0x1000, "../z_map_exp.c", 457);
+ interfaceCtx->mapSegment = GameState_Alloc(&globalCtx->state, 0x1000, "../z_map_exp.c", 457);
// Translates to "MAP TEXTURE INITIALIZATION scene_data_ID=%d mapSegment=%x"
osSyncPrintf("\n\n\nMAP テクスチャ初期化 scene_data_ID=%d\nmapSegment=%x\n\n", globalCtx->sceneNum,
interfaceCtx->mapSegment, globalCtx);
diff --git a/src/code/z_map_mark.c b/src/code/z_map_mark.c
index deeeefaf7..510731fc6 100644
--- a/src/code/z_map_mark.c
+++ b/src/code/z_map_mark.c
@@ -57,7 +57,7 @@ void MapMark_Init(GlobalContext* globalCtx) {
MapMarkDataOverlay* overlay = &sMapMarkDataOvl;
u32 overlaySize = (u32)overlay->vramEnd - (u32)overlay->vramStart;
- overlay->loadedRamAddr = GameState_AllocEnd(&globalCtx->state, overlaySize, "../z_map_mark.c", 235);
+ overlay->loadedRamAddr = GameState_Alloc(&globalCtx->state, overlaySize, "../z_map_mark.c", 235);
LogUtils_CheckNullPointer("dlftbl->allocp", overlay->loadedRamAddr, "../z_map_mark.c", 236);
Overlay_Load(overlay->vromStart, overlay->vromEnd, overlay->vramStart, overlay->vramEnd, overlay->loadedRamAddr);
diff --git a/src/code/z_msgevent.c b/src/code/z_msgevent.c
index c0fb5c897..3a0f3f417 100644
--- a/src/code/z_msgevent.c
+++ b/src/code/z_msgevent.c
@@ -16,6 +16,6 @@ void MsgEvent_SendNullTask() {
task.list.t.type = M_NULTASK;
osCreateMesgQueue(task.msgQ, &msg, 1);
osSendMesg(&gSchedContext.cmdQ, &task, OS_MESG_BLOCK);
- func_800C95F8(&gSchedContext); // osScKickEntryMsg
+ Sched_SendEntryMsg(&gSchedContext); // osScKickEntryMsg
osRecvMesg(&queue, NULL, OS_MESG_BLOCK);
}
diff --git a/src/code/z_play.c b/src/code/z_play.c
index 2f1411a92..fcb0ae136 100644
--- a/src/code/z_play.c
+++ b/src/code/z_play.c
@@ -371,7 +371,7 @@ void Gameplay_Init(GlobalContext* globalCtx) {
osSyncPrintf("ZELDA ALLOC SIZE=%x\n", THA_GetSize(&globalCtx->state.tha));
zAllocSize = THA_GetSize(&globalCtx->state.tha);
- zAlloc = GameState_AllocEnd(&globalCtx->state, zAllocSize, "../z_play.c", 2918);
+ zAlloc = GameState_Alloc(&globalCtx->state, zAllocSize, "../z_play.c", 2918);
zAllocAligned = (void*)(((u32)zAlloc + 8) & ~0xF);
ZeldaArena_Init(zAllocAligned, zAllocSize - (u32)zAllocAligned + (u32)zAlloc);
osSyncPrintf("ゼルダヒープ %08x-%08x\n", zAllocAligned,
@@ -1457,7 +1457,7 @@ void* Gameplay_LoadFile(GlobalContext* globalCtx, RomFile* file) {
void* allocp;
size = file->vromEnd - file->vromStart;
- allocp = GameState_AllocEnd(&globalCtx->state, size, "../z_play.c", 4692);
+ allocp = GameState_Alloc(&globalCtx->state, size, "../z_play.c", 4692);
DmaMgr_SendRequest1(allocp, file->vromStart, size, "../z_play.c", 4694);
return allocp;
diff --git a/src/code/z_room.c b/src/code/z_room.c
index 90ca8ce64..f77216da6 100644
--- a/src/code/z_room.c
+++ b/src/code/z_room.c
@@ -566,7 +566,7 @@ u32 func_80096FE8(GlobalContext* globalCtx, RoomContext* roomCtx) {
osSyncPrintf(VT_FGCOL(YELLOW));
// Translates to: "ROOM BUFFER SIZE=%08x(%5.1fK)"
osSyncPrintf("部屋バッファサイズ=%08x(%5.1fK)\n", maxRoomSize, (f64)(maxRoomSize * 0.0009765625f));
- roomCtx->bufPtrs[0] = GameState_AllocEnd(&globalCtx->state, maxRoomSize, "../z_room.c", 946);
+ roomCtx->bufPtrs[0] = GameState_Alloc(&globalCtx->state, maxRoomSize, "../z_room.c", 946);
// Translates to: "ROOM BUFFER INITIAL POINTER=%08x"
osSyncPrintf("部屋バッファ開始ポインタ=%08x\n", roomCtx->bufPtrs[0]);
roomCtx->bufPtrs[1] = (void*)((s32)roomCtx->bufPtrs[0] + maxRoomSize);
diff --git a/src/code/z_sample.c b/src/code/z_sample.c
index 74e7639f2..4997f7bbe 100644
--- a/src/code/z_sample.c
+++ b/src/code/z_sample.c
@@ -82,7 +82,7 @@ void Sample_SetupView(SampleContext* this) {
void Sample_LoadTitleStatic(SampleContext* this) {
u32 size = _title_staticSegmentRomEnd - _title_staticSegmentRomStart;
- this->staticSegment = GameState_AllocEnd(&this->state, size, "../z_sample.c", 163);
+ this->staticSegment = GameState_Alloc(&this->state, size, "../z_sample.c", 163);
DmaMgr_SendRequest1(this->staticSegment, _title_staticSegmentRomStart, size, "../z_sample.c", 164);
}
diff --git a/src/code/z_scene.c b/src/code/z_scene.c
index 3c2825ca3..23ad42dbd 100644
--- a/src/code/z_scene.c
+++ b/src/code/z_scene.c
@@ -72,7 +72,7 @@ void Object_InitBank(GlobalContext* globalCtx, ObjectContext* objectCtx) {
osSyncPrintf(VT_RST);
objectCtx->spaceStart = objectCtx->status[0].segment =
- GameState_AllocEnd(&globalCtx->state, spaceSize, "../z_scene.c", 219);
+ GameState_Alloc(&globalCtx->state, spaceSize, "../z_scene.c", 219);
objectCtx->spaceEnd = (void*)((s32)objectCtx->spaceStart + spaceSize);
objectCtx->mainKeepIndex = Object_Spawn(objectCtx, OBJECT_GAMEPLAY_KEEP);