From 04cc631dab3ced789439df3bd05f42296b194f7e Mon Sep 17 00:00:00 2001 From: Prakxo <87568477+Prakxo@users.noreply.github.com> Date: Tue, 12 Dec 2023 15:27:09 +0100 Subject: Audiomgr OK (#126) * audiomgr work * audiomgr OK * format * remove comment * review --- src/code/audio.c | 8 +-- src/code/audioMgr.c | 173 +++++++++++++++++++++++++++++++++++++++++++++++++++ src/code/m_submenu.c | 2 +- src/code/main.c | 59 ++++++++++++++++++ 4 files changed, 237 insertions(+), 5 deletions(-) create mode 100644 src/code/audioMgr.c create mode 100644 src/code/main.c (limited to 'src/code') 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") -- cgit v1.2.3