diff --git a/asm/non_matchings/code/audioMgr/func_800C3E40.s b/asm/non_matchings/code/audioMgr/func_800C3E40.s index 732bc010d1..71adeae4cd 100644 --- a/asm/non_matchings/code/audioMgr/func_800C3E40.s +++ b/asm/non_matchings/code/audioMgr/func_800C3E40.s @@ -1,3 +1,10 @@ +.rdata +glabel D_80144C80 + # EUC-JP: オーディオマネージャが OS_SC_PRE_NMI_MSG を受け取りました | Audio manager received OS_SC_PRE_NMI_MSG + .asciz "オーディオマネージャが OS_SC_PRE_NMI_MSG を受け取りました\n" + .balign 4 + +.text glabel func_800C3E40 /* B3AFE0 800C3E40 27BDFFE8 */ addiu $sp, $sp, -0x18 /* B3AFE4 800C3E44 AFA40018 */ sw $a0, 0x18($sp) diff --git a/asm/non_matchings/code/audioMgr/func_800C3E70.s b/asm/non_matchings/code/audioMgr/func_800C3E70.s index 3c79da9979..02c868c26e 100644 --- a/asm/non_matchings/code/audioMgr/func_800C3E70.s +++ b/asm/non_matchings/code/audioMgr/func_800C3E70.s @@ -1,3 +1,10 @@ +.rdata +glabel D_80144CBC + # EUC-JP: オーディオマネージャスレッド実行開始 | Start running audio manager thread + .asciz "オーディオマネージャスレッド実行開始\n" + .balign 4 + +.text glabel func_800C3E70 /* B3B010 800C3E70 27BDFFB8 */ addiu $sp, $sp, -0x48 /* B3B014 800C3E74 AFB50028 */ sw $s5, 0x28($sp) diff --git a/data/audioMgr.rodata.s b/data/audioMgr.rodata.s deleted file mode 100644 index 5ad5eba395..0000000000 --- a/data/audioMgr.rodata.s +++ /dev/null @@ -1,20 +0,0 @@ -.include "macro.inc" - -# assembler directives -.set noat # allow manual use of $at -.set noreorder # don't insert nops after branches -.set gp=64 # allow use of 64-bit general purposee registers - -.section .rodata - -.align 4 - -glabel D_80144C80 - .asciz "オーディオマネージャが OS_SC_PRE_NMI_MSG を受け取りました\n" - # EUC-JP: オーディオマネージャが OS_SC_PRE_NMI_MSG を受け取りました | Audio manager received OS_SC_PRE_NMI_MSG - .balign 4 - -glabel D_80144CBC - .asciz "オーディオマネージャスレッド実行開始\n" - # EUC-JP: オーディオマネージャスレッド実行開始 | Start running audio manager thread - .balign 4 diff --git a/include/functions.h b/include/functions.h index b5262044f6..db2646fe73 100644 --- a/include/functions.h +++ b/include/functions.h @@ -1495,12 +1495,13 @@ void THA_Init(TwoHeadArena* tha); void THA_Ct(TwoHeadArena* tha, void* ptr, u32 size); void THA_Dt(TwoHeadArena* tha); // ? func_800C3C20(?); -// ? func_800C3C80(?); -// ? func_800C3CB8(?); -// ? func_800C3E40(?); -// ? func_800C3FC4(?); -// ? func_800C3FEC(?); -// ? func_800C3E70(?); +void func_800C3C80(AudioMgr* audioMgr); +void func_800C3CB8(AudioMgr* audioMgr); +void func_800C3E40(AudioMgr* audioMgr); +void func_800C3FC4(AudioMgr* audioMgr); +void func_800C3E70(AudioMgr* audioMgr); +void func_800C3FC4(AudioMgr* audioMgr); +void func_800C3FEC(AudioMgr* audioMgr, void* stack, OSPri pri, OSId id, SchedContext* sched, IrqMgr* irqMgr); void TitleSetup_InitImpl(GameState* gameState); void TitleSetup_Destroy(GameState* gameState); void TitleSetup_Init(GameState* gameState); @@ -1934,7 +1935,7 @@ void FaultDrawer_SetDefault(); // ? func_800E2BE0(?); // ? func_800E2CE0(?); // ? func_800E2FEC(?); -// ? func_800E301C(?); +void func_800E301C(void* callback); // ? func_800E3034(?); // ? func_800E3094(?); // ? func_800E3400(?); @@ -2154,13 +2155,13 @@ void func_800F68BC(s8); void func_800F6964(u16); // ? func_800F6B68(?); // ? func_800F6BB8(?); -// ? func_800F6C14(?); +void func_800F6C14(); // ? func_800F6C34(?); // ? func_800F6D58(?); // ? func_800F6E7C(?); // ? func_800F6FB4(?); -// ? func_800F70F8(?); -// ? func_800F711C(?); +void func_800F70F8(); +void func_800F711C(); // ? func_800F7170(?); // ? func_800F71BC(?); void func_800F7260(u16); diff --git a/include/z64.h b/include/z64.h index dfa5d3376f..dafb47536c 100644 --- a/include/z64.h +++ b/include/z64.h @@ -19,6 +19,7 @@ #include #include #include +#include #define SCREEN_WIDTH 320 #define SCREEN_HEIGHT 240 @@ -1217,6 +1218,36 @@ typedef struct { /* 0x278 */ OSTime retraceTime; } IrqMgr; // size = 0x280 +// this is likely an existing struct (possibly for another manager), replace when that is found +typedef struct { + /* 0x0000 */ char unk_0[0x40]; + /* 0x0040 */ OSMesgQueue* unk_40; +} Sub_AudioMgr_70; // size >= 0x44 + +typedef struct { + /* 0x0000 */ IrqMgr* irqMgr; + /* 0x0004 */ SchedContext* sched; + /* 0x0008 */ OSMesg unk_8; + /* 0x000C */ char unk_C[0x04]; + /* 0x0010 */ s32 unk_10; + /* 0x0014 */ s32 unk_14; + /* 0x0018 */ char unk_18[0x40]; + /* 0x0058 */ OSMesgQueue* unk_58; + /* 0x005C */ UNK_PTR unk_5C; + /* 0x0060 */ char unk_60[0x10]; + /* 0x0070 */ Sub_AudioMgr_70* unk_70; + /* 0x0074 */ OSMesgQueue unk_74; + /* 0x008C */ OSMesg unk_8C; + /* 0x0090 */ OSMesgQueue unk_90; + /* 0x00A8 */ OSMesg unk_A8; + /* 0x00AC */ OSMesgQueue unk_AC; + /* 0x00C4 */ OSMesg unk_C4; + /* 0x00C8 */ OSMesgQueue unk_C8; + /* 0x00E0 */ OSMesg unk_E0; + /* 0x00E4 */ char unk_E4[0x04]; + /* 0x00E8 */ OSThread unk_E8; +} AudioMgr; // size = 0x298 + struct ArenaNode; typedef struct Arena { diff --git a/spec b/spec index da12c066a4..f9542c933f 100644 --- a/spec +++ b/spec @@ -420,7 +420,7 @@ beginseg include "build/asm/code_800C3C20.o" include "build/data/code_800C3C20.data.o" include "build/src/code/audioMgr.o" - include "build/data/audioMgr.rodata.o" + //include "build/data/audioMgr.rodata.o" include "build/src/code/title_setup.o" include "build/asm/game.o" include "build/data/game.data.o" diff --git a/src/code/audioMgr.c b/src/code/audioMgr.c index 2372355de2..e3eb88db0a 100644 --- a/src/code/audioMgr.c +++ b/src/code/audioMgr.c @@ -1,16 +1,92 @@ #include #include +#include #pragma GLOBAL_ASM("asm/non_matchings/code/audioMgr/pad_800C3C70.s") -#pragma GLOBAL_ASM("asm/non_matchings/code/audioMgr/func_800C3C80.s") +//#pragma GLOBAL_ASM("asm/non_matchings/code/audioMgr/func_800C3C80.s") +void func_800C3C80(AudioMgr* audioMgr) { + Sub_AudioMgr_70* sub_70; + sub_70 = audioMgr->unk_70; + if (audioMgr->unk_70->unk_40 != NULL) { + osSendMesg(sub_70->unk_40, NULL, OS_MESG_BLOCK); + } +} + +// references un-decompiled data in sched .bss #pragma GLOBAL_ASM("asm/non_matchings/code/audioMgr/func_800C3CB8.s") -#pragma GLOBAL_ASM("asm/non_matchings/code/audioMgr/func_800C3E40.s") +//#pragma GLOBAL_ASM("asm/non_matchings/code/audioMgr/func_800C3E40.s") +void func_800C3E40(AudioMgr* audioMgr) { + // Audio manager received OS_SC_PRE_NMI_MSG + osSyncPrintf("オーディオマネージャが OS_SC_PRE_NMI_MSG を受け取りました\n"); + func_800F6C14(); +} +#ifdef NON_MATCHING +// minor regalloc (branches involving *msg swapped, s5 is unused but should be) +void func_800C3E70(AudioMgr* audioMgr) { + OSMesgQueue* queue1; + IrqMgrClient irqClient; + s16* msg; + + msg = NULL; + // Start running audio manager thread + osSyncPrintf("オーディオマネージャスレッド実行開始\n"); + func_800F70F8(); + func_800E301C(DmaMgr_DmaCallback0); + func_800F711C(); + osSendMesg(&audioMgr->unk_C8, NULL, OS_MESG_BLOCK); + queue1 = &audioMgr->unk_74; + IrqMgr_AddClient(audioMgr->irqMgr, &irqClient, queue1); + + while (true) { + osRecvMesg(queue1, (OSMesg*)&msg, OS_MESG_BLOCK); + if (*msg != 1) { + if (*msg != OS_SC_PRE_NMI_MSG) { + continue; + } + } else { + func_800C3CB8(audioMgr); + if (audioMgr->unk_74.validCount == 0) { + continue; + } else { + do { + osRecvMesg(queue1, (OSMesg*)&msg, OS_MESG_BLOCK); + if (*msg != 1 && *msg == OS_SC_PRE_NMI_MSG) { + func_800C3E40(audioMgr); + } + } while (audioMgr->unk_74.validCount != 0); + } + continue; + } + func_800C3E40(audioMgr); + } +} +#else #pragma GLOBAL_ASM("asm/non_matchings/code/audioMgr/func_800C3E70.s") +#endif -#pragma GLOBAL_ASM("asm/non_matchings/code/audioMgr/func_800C3FC4.s") +//#pragma GLOBAL_ASM("asm/non_matchings/code/audioMgr/func_800C3FC4.s") +void func_800C3FC4(AudioMgr* audioMgr) { + osRecvMesg(&audioMgr->unk_C8, NULL, OS_MESG_BLOCK); +} -#pragma GLOBAL_ASM("asm/non_matchings/code/audioMgr/func_800C3FEC.s") +//#pragma GLOBAL_ASM("asm/non_matchings/code/audioMgr/func_800C3FEC.s") +void func_800C3FEC(AudioMgr* audioMgr, void* stack, OSPri pri, OSId id, SchedContext* sched, IrqMgr* irqMgr) { + bzero(audioMgr, sizeof(AudioMgr)); + + audioMgr->sched = sched; + audioMgr->irqMgr = irqMgr; + audioMgr->unk_70 = NULL; + + osCreateMesgQueue(&audioMgr->unk_AC, &audioMgr->unk_C4, 1); + osCreateMesgQueue(&audioMgr->unk_74, &audioMgr->unk_8C, 8); + osCreateMesgQueue(&audioMgr->unk_C8, &audioMgr->unk_E0, 1); + + osSendMesg(&audioMgr->unk_AC, NULL, OS_MESG_BLOCK); + + osCreateThread(&audioMgr->unk_E8, id, func_800C3E70, audioMgr, stack, pri); + osStartThread(&audioMgr->unk_E8); +} diff --git a/src/code/main.c b/src/code/main.c index 5e2b9a89e9..93e16f48e4 100644 --- a/src/code/main.c +++ b/src/code/main.c @@ -23,7 +23,7 @@ StackEntry sSchedStackInfo; StackEntry sAudioStackInfo; StackEntry sPadMgrStackInfo; StackEntry sIrqMgrStackInfo; -u8 gAudioMgr[0x298]; // type should be AudioMgr +AudioMgr gAudioMgr; OSMesgQueue sSiIntMsgQ; OSMesg sSiIntMsgBuf[1];