summaryrefslogtreecommitdiff
path: root/src/code
diff options
context:
space:
mode:
Diffstat (limited to 'src/code')
-rw-r--r--src/code/audio.c8
-rw-r--r--src/code/audioMgr.c173
-rw-r--r--src/code/m_submenu.c2
-rw-r--r--src/code/main.c59
4 files changed, 237 insertions, 5 deletions
diff --git a/src/code/audio.c b/src/code/audio.c
index 0b0cb9f..71f9bbb 100644
--- a/src/code/audio.c
+++ b/src/code/audio.c
@@ -48,8 +48,8 @@ void sAdo_GameFrame(void) {
Na_GameFrame();
}
-void func_800D19BC_jp(void) {
- func_800F8984_jp();
+void* func_800D19BC_jp(void) {
+ return func_800F8984_jp();
}
void func_800D19DC_jp(void) {
@@ -262,8 +262,8 @@ void sAdo_Tenki(u8 mode) {
Na_Tenki(mode);
}
-void func_800D213C_jp(void) {
- func_800EBF6C_jp();
+void func_800D213C_jp(DmaHandler handler) {
+ func_800EBF6C_jp(handler);
}
void sAdos_KishaStatusTrg(u8 state) {
diff --git a/src/code/audioMgr.c b/src/code/audioMgr.c
new file mode 100644
index 0000000..cc69885
--- /dev/null
+++ b/src/code/audioMgr.c
@@ -0,0 +1,173 @@
+#include "audioMgr.h"
+#include "irqmgr.h"
+#include "code_variables.h"
+#include "attributes.h"
+#include "segment_symbols.h"
+#include "audio.h"
+#include "m_debug.h"
+#include "6FB340.h"
+#include "libc64/malloc.h"
+#include "getcurrentms.h"
+#include "libc64/sleep.h"
+#include "macros.h"
+
+Audiomgr* audiomgr_class_p;
+Audiomgr audiomgr_class;
+s32 B_80144FB8_jp;
+
+void func_800D2590_jp(void) {
+ AudioTask* task = audiomgr_class_p->rspTask;
+
+ if (audiomgr_class_p->rspTask->taskQueue != NULL) {
+ osSendMesg(task->taskQueue, NULL, OS_MESG_BLOCK);
+ }
+}
+
+void func_800D25D0_jp(void) {
+ AudioTask* rspTask;
+ OSTimer timer;
+ OSMesg msg;
+
+ if (audiomgr_class_p->unk_28B == 0) {
+ if (SREG(20) == 1) {
+ audiomgr_class_p->rspTask = NULL;
+ }
+ while (!MQ_IS_EMPTY(&audiomgr_class_p->cmdQueue)) {
+ osRecvMesg(&audiomgr_class_p->cmdQueue, NULL, OS_MESG_NOBLOCK);
+ }
+
+ if (audiomgr_class_p->rspTask != NULL) {
+ audiomgr_class_p->audioTask.next = NULL;
+ audiomgr_class_p->audioTask.flags = OS_SC_NEEDS_RSP;
+ audiomgr_class_p->audioTask.framebuffer = NULL;
+
+ audiomgr_class_p->audioTask.list = audiomgr_class_p->rspTask->task;
+ audiomgr_class_p->audioTask.msgQ = &audiomgr_class_p->cmdQueue;
+
+ audiomgr_class_p->audioTask.msg = NULL;
+ osSendMesg(&B_80145DB8_jp, &audiomgr_class_p->audioTask, OS_MESG_BLOCK);
+ func_800D85EC_jp();
+ }
+ if (SREG(20) >= 2) {
+ rspTask = NULL;
+ } else {
+ audiomgr_class.unk_28A = 5;
+ rspTask = func_800D19BC_jp();
+ audiomgr_class.unk_28A = 6;
+ }
+ audiomgr_class.unk_28A = 7;
+ if (audiomgr_class_p->rspTask != NULL) {
+ while (true) {
+ osSetTimer(&timer, OS_USEC_TO_CYCLES(20000), 0, &audiomgr_class_p->cmdQueue, (OSMesg)666);
+ osRecvMesg(&audiomgr_class_p->cmdQueue, (OSMesg*)&msg, OS_MESG_BLOCK);
+ osStopTimer(&timer);
+ if ((msg == (OSMesg)666) && (msg == (OSMesg)666)) {
+ osSyncPrintf("AUDIO SP TIMEOUT2 %08x %08x\n", audiomgr_class_p->rspTask,
+ &audiomgr_class_p->rspTask->task);
+ B_80144FB8_jp++;
+ func_800D8618_jp();
+ osSyncPrintf("AUDIO CANSEL&RETRY %d\n", B_80144FB8_jp);
+ } else {
+ break;
+ }
+ }
+ func_800D2590_jp();
+ }
+ audiomgr_class.unk_28A = 8;
+ audiomgr_class_p->rspTask = rspTask;
+
+ if ((SREG(20) >= 2) && (rspTask == NULL)) {
+ audiomgr_class_p->unk_28B = 1;
+ }
+ }
+}
+
+void func_800D287C_jp(void) {
+ func_800D19DC_jp();
+}
+
+void audiomgr_proc(UNUSED void* arg) {
+ IrqmgrClient irq;
+ s16* msg = NULL;
+ s32 exit;
+ UNUSED s32 pad;
+
+ func_800F88E8_jp(malloc(0x47A00), (void*)0x47A00, SEGMENT_ROM_START(segment_027130),
+ SEGMENT_ROM_END(segment_027130), SEGMENT_ROM_START(segment_13D9A0));
+ osSendMesg(&audiomgr_class_p->lockQueue, NULL, OS_MESG_BLOCK);
+ func_800D213C_jp(DmaMgr_AudioDmaHandler);
+ irqmgr_AddClient(&irq, &audiomgr_class_p->interruptQueue);
+
+ exit = false;
+
+ while (!exit) {
+ B_80145FFC_jp = GetCurrentMilliseconds();
+ audiomgr_class.unk_28A = 2;
+ osRecvMesg(&audiomgr_class_p->interruptQueue, (OSMesg*)&msg, OS_MESG_BLOCK);
+ switch (*msg) {
+ case OS_SC_RETRACE_MSG:
+ audiomgr_class.unk_28A = 3;
+ if (ResetStatus < 2) {
+ func_800D25D0_jp();
+ }
+ audiomgr_class.unk_28A = 4;
+ while (!MQ_IS_EMPTY(&audiomgr_class_p->interruptQueue)) {
+ osRecvMesg(&audiomgr_class_p->interruptQueue, (OSMesg*)&msg, OS_MESG_BLOCK);
+ switch (*msg) {
+ case OS_SC_RETRACE_MSG:
+ break;
+
+ case OS_SC_PRE_NMI_MSG:
+ func_800D287C_jp();
+ break;
+
+ case OS_SC_RDP_DONE_MSG:
+ exit = true;
+ break;
+ }
+ }
+ break;
+ case OS_SC_PRE_NMI_MSG:
+ func_800D287C_jp();
+ break;
+ case OS_SC_RDP_DONE_MSG:
+ exit = true;
+ break;
+ }
+ }
+ irqmgr_RemoveClient(&irq);
+}
+
+void func_800D2AA0_jp(void) {
+ osRecvMesg(&audiomgr_class_p->lockQueue, NULL, OS_MESG_BLOCK);
+}
+
+void func_800D2AD0_jp(void* stack, OSPri pri, OSId id) {
+ Audiomgr* mgr = audiomgr_class_p = &audiomgr_class;
+
+ bzero(mgr, sizeof(Audiomgr));
+ audiomgr_class_p->rspTask = NULL;
+
+ osCreateMesgQueue(&audiomgr_class_p->cmdQueue, audiomgr_class_p->cmdMsgBuf,
+ ARRAY_COUNT(audiomgr_class_p->cmdMsgBuf));
+ osCreateMesgQueue(&audiomgr_class_p->interruptQueue, audiomgr_class_p->interruptMsgBuf,
+ ARRAY_COUNT(audiomgr_class_p->interruptMsgBuf));
+ osCreateMesgQueue(&audiomgr_class_p->lockQueue, audiomgr_class_p->lockMsgBuf,
+ ARRAY_COUNT(audiomgr_class_p->lockMsgBuf));
+
+ osCreateThread(&audiomgr_class_p->thread, id, audiomgr_proc, NULL, stack, pri);
+ osStartThread(&audiomgr_class_p->thread);
+}
+
+void func_800D2B94_jp(void) {
+ SREG(20) = 2;
+
+ while (audiomgr_class.unk_28B == 0) {
+ usleep(1000);
+ }
+}
+
+void func_800D2BEC_jp(void) {
+ SREG(20) = 0;
+ audiomgr_class.unk_28B = 0;
+}
diff --git a/src/code/m_submenu.c b/src/code/m_submenu.c
index 3da3788..2860ab1 100644
--- a/src/code/m_submenu.c
+++ b/src/code/m_submenu.c
@@ -185,7 +185,7 @@ void func_800C47B4_jp(UNUSED void* arg0, UNUSED void* arg1) {
size_t ovlSize;
void* temp_a2; // sp20
- temp_v0 = gFaultMgr.faultedThread;
+ temp_v0 = fault_class.faultedThread;
var_t0 = (temp_v0 != NULL) ? temp_v0->context.pc : 0;
var_t1 = (temp_v0 != NULL) ? temp_v0->context.ra : 0;
diff --git a/src/code/main.c b/src/code/main.c
new file mode 100644
index 0000000..3dd5e37
--- /dev/null
+++ b/src/code/main.c
@@ -0,0 +1,59 @@
+#include "main.h"
+#include "zurumode.h"
+#include "fault.h"
+#include "code_variables.h"
+#include "macros.h"
+#include "game.h"
+#include "audioMgr.h"
+#include "graph.h"
+#include "m_debug.h"
+#include "getcurrentms.h"
+
+void func_800D64E0_jp(void) {
+ u32 baseTime;
+ u32 graphTime;
+ u32 audioTime;
+ u32 graphReg;
+ u32 audioReg;
+ u8 unk9C;
+ u8 unk9D;
+
+ if ((zurumode_flag != 0) && (fault_class.msgId == 0) && (D_8010F3E8_jp != 0)) {
+
+ baseTime = GetCurrentMilliseconds();
+
+ graphTime = (B_80145FF8_jp != 0) ? (baseTime - B_80145FF8_jp) : 0;
+ audioTime = (B_80145FFC_jp != 0) ? (baseTime - B_80145FFC_jp) : 0;
+
+ if (SREG(31) != 0) {
+ graphReg = SREG(31) < graphTime;
+ audioReg = SREG(31) < audioTime;
+ } else {
+ graphReg = (graphTime >= 3001);
+ audioReg = (audioTime >= 3001);
+ }
+
+ if ((graphReg != 0) || (audioReg != 0)) {
+ FaultDrawer_SetDrawerFB(osViGetCurrentFramebuffer(), SCREEN_WIDTH, SCREEN_HEIGHT);
+ FaultDrawer_SetForeColor(65535);
+ FaultDrawer_SetBackColor(32769);
+ FaultDrawer_SetCharPad(0, 0);
+ if (graphReg != 0) {
+ unk9D = (game_class_p != NULL) ? game_class_p->unk_9D : 0;
+
+ unk9C = (game_class_p != NULL) ? game_class_p->unk_9C : 0;
+
+ FaultDrawer_DrawText(24, 16, "GRAPH INF.LOOP %2d %3d %3d %6lu", B_80145370_jp, unk9D, unk9C, graphTime);
+ fault_DrawStackTrace(&graphThread, 0x20, 0x1A, 0xA);
+ }
+ if (audioReg != 0) {
+ FaultDrawer_DrawText(24, 126, "AUDIO INF.LOOP %2d %3d %6lu", audiomgr_class.unk_28A, D_80113854_jp,
+ audioTime);
+ fault_DrawStackTrace(&audiomgr_class.thread, 0x20, 0x88, 0xA);
+ }
+ FaultDrawer_WritebackFBDCache();
+ }
+ }
+}
+
+#pragma GLOBAL_ASM("asm/jp/nonmatchings/code/main/func_800D66D0_jp.s")