Decompile most of AudioMgr

This commit is contained in:
Thar0 2020-03-31 22:56:02 +01:00
parent 51c85fe660
commit 9ee04cf092
8 changed files with 138 additions and 36 deletions

View File

@ -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 glabel func_800C3E40
/* B3AFE0 800C3E40 27BDFFE8 */ addiu $sp, $sp, -0x18 /* B3AFE0 800C3E40 27BDFFE8 */ addiu $sp, $sp, -0x18
/* B3AFE4 800C3E44 AFA40018 */ sw $a0, 0x18($sp) /* B3AFE4 800C3E44 AFA40018 */ sw $a0, 0x18($sp)

View File

@ -1,3 +1,10 @@
.rdata
glabel D_80144CBC
# EUC-JP: | Start running audio manager thread
.asciz "\n"
.balign 4
.text
glabel func_800C3E70 glabel func_800C3E70
/* B3B010 800C3E70 27BDFFB8 */ addiu $sp, $sp, -0x48 /* B3B010 800C3E70 27BDFFB8 */ addiu $sp, $sp, -0x48
/* B3B014 800C3E74 AFB50028 */ sw $s5, 0x28($sp) /* B3B014 800C3E74 AFB50028 */ sw $s5, 0x28($sp)

View File

@ -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

View File

@ -1495,12 +1495,13 @@ void THA_Init(TwoHeadArena* tha);
void THA_Ct(TwoHeadArena* tha, void* ptr, u32 size); void THA_Ct(TwoHeadArena* tha, void* ptr, u32 size);
void THA_Dt(TwoHeadArena* tha); void THA_Dt(TwoHeadArena* tha);
// ? func_800C3C20(?); // ? func_800C3C20(?);
// ? func_800C3C80(?); void func_800C3C80(AudioMgr* audioMgr);
// ? func_800C3CB8(?); void func_800C3CB8(AudioMgr* audioMgr);
// ? func_800C3E40(?); void func_800C3E40(AudioMgr* audioMgr);
// ? func_800C3FC4(?); void func_800C3FC4(AudioMgr* audioMgr);
// ? func_800C3FEC(?); void func_800C3E70(AudioMgr* audioMgr);
// ? func_800C3E70(?); 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_InitImpl(GameState* gameState);
void TitleSetup_Destroy(GameState* gameState); void TitleSetup_Destroy(GameState* gameState);
void TitleSetup_Init(GameState* gameState); void TitleSetup_Init(GameState* gameState);
@ -1934,7 +1935,7 @@ void FaultDrawer_SetDefault();
// ? func_800E2BE0(?); // ? func_800E2BE0(?);
// ? func_800E2CE0(?); // ? func_800E2CE0(?);
// ? func_800E2FEC(?); // ? func_800E2FEC(?);
// ? func_800E301C(?); void func_800E301C(void* callback);
// ? func_800E3034(?); // ? func_800E3034(?);
// ? func_800E3094(?); // ? func_800E3094(?);
// ? func_800E3400(?); // ? func_800E3400(?);
@ -2154,13 +2155,13 @@ void func_800F68BC(s8);
void func_800F6964(u16); void func_800F6964(u16);
// ? func_800F6B68(?); // ? func_800F6B68(?);
// ? func_800F6BB8(?); // ? func_800F6BB8(?);
// ? func_800F6C14(?); void func_800F6C14();
// ? func_800F6C34(?); // ? func_800F6C34(?);
// ? func_800F6D58(?); // ? func_800F6D58(?);
// ? func_800F6E7C(?); // ? func_800F6E7C(?);
// ? func_800F6FB4(?); // ? func_800F6FB4(?);
// ? func_800F70F8(?); void func_800F70F8();
// ? func_800F711C(?); void func_800F711C();
// ? func_800F7170(?); // ? func_800F7170(?);
// ? func_800F71BC(?); // ? func_800F71BC(?);
void func_800F7260(u16); void func_800F7260(u16);

View File

@ -19,6 +19,7 @@
#include <ichain.h> #include <ichain.h>
#include <stdarg.h> #include <stdarg.h>
#include <regs.h> #include <regs.h>
#include <sched.h>
#define SCREEN_WIDTH 320 #define SCREEN_WIDTH 320
#define SCREEN_HEIGHT 240 #define SCREEN_HEIGHT 240
@ -1217,6 +1218,36 @@ typedef struct {
/* 0x278 */ OSTime retraceTime; /* 0x278 */ OSTime retraceTime;
} IrqMgr; // size = 0x280 } 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; struct ArenaNode;
typedef struct Arena { typedef struct Arena {

2
spec
View File

@ -420,7 +420,7 @@ beginseg
include "build/asm/code_800C3C20.o" include "build/asm/code_800C3C20.o"
include "build/data/code_800C3C20.data.o" include "build/data/code_800C3C20.data.o"
include "build/src/code/audioMgr.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/src/code/title_setup.o"
include "build/asm/game.o" include "build/asm/game.o"
include "build/data/game.data.o" include "build/data/game.data.o"

View File

@ -1,16 +1,92 @@
#include <ultra64.h> #include <ultra64.h>
#include <global.h> #include <global.h>
#include <sched.h>
#pragma GLOBAL_ASM("asm/non_matchings/code/audioMgr/pad_800C3C70.s") #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_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") #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);
}

View File

@ -23,7 +23,7 @@ StackEntry sSchedStackInfo;
StackEntry sAudioStackInfo; StackEntry sAudioStackInfo;
StackEntry sPadMgrStackInfo; StackEntry sPadMgrStackInfo;
StackEntry sIrqMgrStackInfo; StackEntry sIrqMgrStackInfo;
u8 gAudioMgr[0x298]; // type should be AudioMgr AudioMgr gAudioMgr;
OSMesgQueue sSiIntMsgQ; OSMesgQueue sSiIntMsgQ;
OSMesg sSiIntMsgBuf[1]; OSMesg sSiIntMsgBuf[1];