From 206b3e76a0b3942ed3b98f59e860c31ef4faed13 Mon Sep 17 00:00:00 2001 From: dbalatoni13 Date: Thu, 7 Nov 2024 16:52:22 +0100 Subject: [PATCH 01/29] Created private msm headers and decomped a bit of msmsys.c --- include/msm/msmfio.h | 19 ++ include/msm/msmmem.h | 6 +- include/msm/msmmus.h | 10 + include/msm/msmse.h | 10 + include/msm/msmstream.h | 12 ++ src/msm/msmfio.c | 52 +++-- src/msm/msmmem.c | 6 +- src/msm/msmsys.c | 442 ++++++++++++++++++++++++++++++++++++++++ 8 files changed, 524 insertions(+), 33 deletions(-) create mode 100644 include/msm/msmfio.h create mode 100644 include/msm/msmmus.h create mode 100644 include/msm/msmse.h create mode 100644 include/msm/msmstream.h create mode 100644 src/msm/msmsys.c diff --git a/include/msm/msmfio.h b/include/msm/msmfio.h new file mode 100644 index 00000000..2335134f --- /dev/null +++ b/include/msm/msmfio.h @@ -0,0 +1,19 @@ +#ifndef MSMFIO_H +#define MSMFIO_H + +#include "dolphin.h" +#include "dolphin/types.h" +#include "game/msm.h" + +struct msmFio { + MSM_OPEN open; + MSM_READ read; + MSM_CLOSE close; +}; + +BOOL msmFioClose(DVDFileInfo *fileInfo); +BOOL msmFioRead(DVDFileInfo *fileInfo, void *addr, s32 length, s32 offset); +BOOL msmFioOpen(s32 entrynum, DVDFileInfo *fileInfo); +void msmFioInit(MSM_OPEN open, MSM_READ read, MSM_CLOSE close); + +#endif diff --git a/include/msm/msmmem.h b/include/msm/msmmem.h index ca14b0c9..1acc500a 100644 --- a/include/msm/msmmem.h +++ b/include/msm/msmmem.h @@ -3,8 +3,8 @@ #include "dolphin/types.h" -void msmMemFree(void*); -void* msmMemAlloc(s32); -void msmMemInit(void*, u32); +void msmMemFree(void *); +void *msmMemAlloc(u32); +void msmMemInit(void *, u32); #endif diff --git a/include/msm/msmmus.h b/include/msm/msmmus.h new file mode 100644 index 00000000..8d3554fc --- /dev/null +++ b/include/msm/msmmus.h @@ -0,0 +1,10 @@ +#ifndef MSMMUS_H +#define MSMMUS_H + +#include "dolphin.h" +#include "dolphin/types.h" + +s32 msmMusInit(s32 *, DVDFileInfo *); +void msmMusPeriodicProc(void); + +#endif diff --git a/include/msm/msmse.h b/include/msm/msmse.h new file mode 100644 index 00000000..10242362 --- /dev/null +++ b/include/msm/msmse.h @@ -0,0 +1,10 @@ +#ifndef MSMSE_H +#define MSMSE_H + +#include "dolphin.h" +#include "dolphin/types.h" + +s32 msmSeInit(s32 *, DVDFileInfo *); +void msmSePeriodicProc(void); + +#endif diff --git a/include/msm/msmstream.h b/include/msm/msmstream.h new file mode 100644 index 00000000..c21347b0 --- /dev/null +++ b/include/msm/msmstream.h @@ -0,0 +1,12 @@ +#ifndef MSMSTREAM_H +#define MSMSTREAM_H + +#include "dolphin/types.h" + +void msmStreamPeriodicProc(void); +void msmStreamSetOutputMode(s8); +void msmStreamAmemFree(void); +s32 msmStreamAmemAlloc(void); +s32 msmStreamInit(char *); + +#endif diff --git a/src/msm/msmfio.c b/src/msm/msmfio.c index 581cb3a1..00adc985 100644 --- a/src/msm/msmfio.c +++ b/src/msm/msmfio.c @@ -1,43 +1,41 @@ -#include "dolphin.h" - -struct msmFio { - BOOL (*open)(s32, DVDFileInfo *); - BOOL (*read)(DVDFileInfo *, void *, s32, s32, s32); - BOOL (*close)(DVDFileInfo *); -}; +#include "msm/msmfio.h" +#include "game/msm.h" static struct msmFio fio; BOOL msmFioClose(DVDFileInfo *fileInfo) { - return fio.close(fileInfo); + return fio.close(fileInfo); } BOOL msmFioRead(DVDFileInfo *fileInfo, void *addr, s32 length, s32 offset) { - return fio.read(fileInfo, addr, length, offset, 2); + return fio.read(fileInfo, addr, length, offset, 2); } BOOL msmFioOpen(s32 entrynum, DVDFileInfo *fileInfo) { - return fio.open(entrynum, fileInfo); + return fio.open(entrynum, fileInfo); } -void msmFioInit(void *open, void *read, void *close) +void msmFioInit(MSM_OPEN open, MSM_READ read, MSM_CLOSE close) { - if(open) { - fio.open = open; - } else { - fio.open = DVDFastOpen; - } - if(read) { - fio.read = read; - } else { - fio.read = DVDReadPrio; - } - if(close) { - fio.close = close; - } else { - fio.close = DVDClose; - } -} \ No newline at end of file + if (open) { + fio.open = open; + } + else { + fio.open = DVDFastOpen; + } + if (read) { + fio.read = read; + } + else { + fio.read = DVDReadPrio; + } + if (close) { + fio.close = close; + } + else { + fio.close = DVDClose; + } +} diff --git a/src/msm/msmmem.c b/src/msm/msmmem.c index b89434a0..e8d52a88 100644 --- a/src/msm/msmmem.c +++ b/src/msm/msmmem.c @@ -53,7 +53,7 @@ void msmMemFree(void* arg0) { } } -void* msmMemAlloc(s32 arg0) { +void* msmMemAlloc(u32 arg0) { unkMemStruct* memC; s32 temp_r0; u32 var_r5; @@ -87,7 +87,7 @@ void* msmMemAlloc(s32 arg0) { if (var_r5 != 0) { var_r5 -= 0x20; } - temp_r5 = (void*)((u32)var_r8->unk10 + var_r5); + temp_r5 = (void*)((u32)var_r8->unk10 + (var_r5)); temp_r9 = var_r8->next; if ((mem.unk0 > temp_r5) || ((void*)((u32)mem.unk0 + (u32)mem.unk4) <= temp_r5)) { return NULL; @@ -133,4 +133,4 @@ void msmMemInit(void* arg0, u32 arg1) { temp_r7->prev = NULL; temp_r7->next = NULL; mem.unk8 = &mem.unkC; -} \ No newline at end of file +} diff --git a/src/msm/msmsys.c b/src/msm/msmsys.c new file mode 100644 index 00000000..9c9aedda --- /dev/null +++ b/src/msm/msmsys.c @@ -0,0 +1,442 @@ +#include "dolphin.h" +#include "dolphin/ai.h" +#include "msm/msmfio.h" +#include "msm/msmmem.h" +#include "msm/msmmus.h" +#include "msm/msmse.h" +#include "msm/msmstream.h" +#include "musyx/musyx.h" + +#include "game/msm.h" // TODO remove, only for decomp + +typedef struct _unkSubStruct { + s8 unk0; + union { + f32 unk4f[9]; + s32 unk4s[9]; + }; +} unkSubStruct; + +typedef struct _unkSubStruct2 { + char unk[0x3C]; + s32 unk3C; + s32 unk40; + s32 unk44; + s32 unk48; + s32 unk4C; + s32 unk50; + s32 unk54; + s32 unk58; + s32 unk5C; + char unk60[0x30]; + s32 unk90; + s32 unk94; + s32 unk98; + char unk9C[0xA0]; + u8 unk13C; + f32 unk140; + f32 unk144; + f32 unk148; + f32 unk14C; + f32 unk150; + char unk154[0x70]; + u8 unk1C4; + f32 unk1C8; + f32 unk1CC; + f32 unk1D0; + f32 unk1D4; + f32 unk1D8; + f32 unk1DC; +} unkSubStruct2; // sizeof unk1E0 + +typedef struct _unkSubStruct3 { + char unk[0x4]; + s32 unk4; + char unk8[0x8]; + s32 unk10; // offset + u32 unk14; // length + s32 unk18; // offset + u32 unk1C; // length + char unk20[0x18]; + s32 unk38; + char unk3C[4]; + s32 unk40; + char unk44[0x1C]; +} unkSubStruct3; // sizeof 0x60 + +typedef struct _unkStruct2 { + char *unk0; + s32 unk4; + void *unk8; + void *unkC; + void *unk10; + u32 unk14; + void *unk18; +} unkStruct2; + +typedef struct _unkStruct3 { + s32 unk0; + s32 unk4; + s32 unk8; +} unkStruct3; + +typedef struct _unkStruct4 { + SND_GROUPID unk0; + s32 unk4; + s32 unk8; + s32 unkC; + s32 unk10; +} unkStruct4; + +typedef struct _sndInitData { + s8 unk0; + s8 unk1; + s8 unk2; + char unk3[0xB]; + s8 unkE; + s8 unkF; + u32 unk10; + s32 unk14; + char unk18[0x11]; + s8 unk29[10]; // size unknown +} sndInitData; + +typedef struct _sysData { + s32 unk0; + s8 unk4; + s8 unk5; + s8 unk6; + s8 unk7; + s32 unk8; + unkSubStruct3 *unkC; + sndInitData *unk10; + unkSubStruct *unk14; + s8 unk18; + s8 unk19; + s8 unk1A; + s8 unk1B; + unkSubStruct2 unk1C; // userA + unkSubStruct2 unk1FC; // userB + char unk3DC[0x8]; + s32 unk3E4; + s32 unk3E8; + s32 unk3EC; + s32 unk3F0; + s8 unk3F4; + unkStruct3 *unk3F8; + char unk3FC[0xF0]; + s32 unk4EC; + BOOL unk4F0; + AIDCallback unk4F4; + s32 unk4F8; +} sysData; + +static sysData sys; + +void msmSysServer(void) +{ + if (sndIsInstalled() == 1) { + if (--sys.unk4F8 == 0) { + sys.unk4F8 = 3; + msmMusPeriodicProc(); + msmSePeriodicProc(); + msmStreamPeriodicProc(); + } + } + sys.unk4F4(); +} + +s32 msmSysSetAuxParam(s32 arg0, s32 arg1) +{ + SND_AUX_CALLBACK sp24; + SND_AUX_CALLBACK sp20; + void **var_r26; + s32 var_r23; + unkSubStruct2 *temp_r3; + sysData *var_r25; + sysData *var_r27; + unkSubStruct *temp_r5; + u32 var_r0; + u8 temp_r5_2; + unkSubStruct *temp_r4_2; + + if ((sys.unk18 != -2) && (arg0 >= 0)) { + sys.unk18 = arg0; + } + if ((sys.unk19 != -2) && (arg1 >= 0)) { + temp_r5->unk0 = arg1; + } + if ((sys.unk18 < 0) && (temp_r5->unk0 < 0)) { + return 0; + } + var_r27 = &sys; + var_r25 = &sys; + var_r26 = &sp20; + + // the for loop first sets sp20 and then sp24 + for (var_r23 = 0; var_r23 < 2; var_r23++, var_r27++, var_r26++, var_r25++) { + if (var_r27->unk18 < 0) { + *var_r26 = NULL; + continue; + } + temp_r4_2 = &sys.unk14[var_r27->unk18]; + temp_r3 = &var_r25->unk1C; + switch (temp_r4_2->unk0) { + case 0: + *var_r26 = &sndAuxCallbackReverbHI; + temp_r3->unk1C4 = temp_r4_2->unk4s[0]; + temp_r3->unk1C8 = temp_r4_2->unk4f[1]; + temp_r3->unk1CC = temp_r4_2->unk4f[2]; + temp_r3->unk1D0 = temp_r4_2->unk4f[3]; + temp_r3->unk1D4 = temp_r4_2->unk4f[4]; + temp_r3->unk1D8 = temp_r4_2->unk4f[5]; + temp_r3->unk1DC = temp_r4_2->unk4f[6]; + // var_r0 = sndAuxCallbackPrepareReverbHI(); + break; + case 1: + *var_r26 = &sndAuxCallbackReverbSTD; + temp_r3->unk13C = temp_r4_2->unk4s[0]; + temp_r3->unk140 = temp_r4_2->unk4f[1]; + temp_r3->unk144 = temp_r4_2->unk4f[2]; + temp_r3->unk148 = temp_r4_2->unk4f[3]; + temp_r3->unk14C = temp_r4_2->unk4f[4]; + temp_r3->unk150 = temp_r4_2->unk4f[5]; + // var_r0 = sndAuxCallbackPrepareReverbSTD(); + break; + case 2: + *var_r26 = &sndAuxCallbackChorus; + temp_r3->unk90 = temp_r4_2->unk4s[0]; + temp_r3->unk94 = temp_r4_2->unk4s[1]; + temp_r3->unk98 = temp_r4_2->unk4s[2]; + // var_r0 = sndAuxCallbackPrepareChorus(); + break; + case 3: + *var_r26 = &sndAuxCallbackDelay; + temp_r3->unk3C = temp_r4_2->unk4s[0]; + temp_r3->unk48 = temp_r4_2->unk4s[3]; + temp_r3->unk54 = temp_r4_2->unk4s[6]; + temp_r3->unk40 = temp_r4_2->unk4s[1]; + temp_r3->unk4C = temp_r4_2->unk4s[4]; + temp_r3->unk58 = temp_r4_2->unk4s[7]; + temp_r3->unk44 = temp_r4_2->unk4s[2]; + temp_r3->unk50 = temp_r4_2->unk4s[5]; + temp_r3->unk5C = temp_r4_2->unk4s[8]; + // var_r0 = sndAuxCallbackPrepareDelay(); + break; + } + if (var_r0 == 0) { + return 1; + } + } + sndSetAuxProcessingCallbacks(0, sp20, &sys.unk1C, 0xFF, 0, sp24, &sys.unk1FC, 0xFF, 0); + return 0; +} + +s8 msmSysLoadBaseGroup(void *arg0) +{ + DVDFileInfo spC; + sysData *var_r30; + s32 var_r28; + unkStruct3 *temp_r27; + unkStruct4 *temp_r25; + + if (msmFioOpen(sys.unk0, &spC) != 1) { + return -1; + } + var_r30 = &sys; + for (var_r28 = 0; var_r28 < sys.unk3F4; var_r30 = (sysData *)((s32)var_r30 + 4), var_r28++, sys.unk8 += temp_r25->unk10) { + temp_r27 = var_r30->unk3F8; + temp_r25 = (unkStruct4 *)(sys.unk3EC + (sys.unk10->unk29[var_r28] << 5)); + if (msmFioRead(&spC, temp_r27, temp_r25->unk8, temp_r25->unk4 + sys.unkC->unk38) < 0) { + msmFioClose(&spC); + return -2; + } + if (msmFioRead(&spC, arg0, temp_r25->unk10, temp_r25->unkC + sys.unkC->unk40) < 0) { + msmFioClose(&spC); + return -2; + } + if (sndPushGroup((void *)(temp_r27->unk4 + (s32)temp_r27), temp_r25->unk0, arg0, (void *)(temp_r27->unk8 + (s32)temp_r27), + (void *)(temp_r27->unk0 + (s32)temp_r27)) + == 0U) { + msmFioClose(&spC); + return -0x20; + } + } + msmFioClose(&spC); + return 0; +} + +s32 msmSysGroupInit(DVDFileInfo *arg0); + +void msmSysIrqDisable(void) +{ + if (sys.unk4EC++ == 0) { + sys.unk4F0 = OSDisableInterrupts(); + } +} + +void msmSysIrqEnable(void) +{ + if (sys.unk4EC != 0) { + if (--sys.unk4EC == 0) { + OSRestoreInterrupts(sys.unk4F0); + } + } +} + +void msmSysRegularProc(void); + +s32 msmSysGetOutputMode(void) +{ + return sys.unk4; +} + +s32 msmSysGetSampSize(BOOL baseGrp) +{ + if (baseGrp != 0) { + return sys.unk3E8; + } + return sys.unk3E4; +} + +void msmSysCheckInit(void) +{ + sndIsInstalled(); +} + +s32 msmSysInit(MSM_INIT *init, MSM_ARAM *aram) +{ + s32 var_r26; + s32 temp_r3; + void *temp_r3_8; + + SND_HOOKS sp4C = { msmMemAlloc, msmMemFree }; + DVDFileInfo sp10; + if (sndIsInstalled() == 1) { + return -0x24; + } + var_r26 = 0; // retErr + sys.unk4EC = 0; + msmMemInit(init->heap, init->heapSize); + msmFioInit(init->open, init->read, init->close); + sys.unk0 = DVDConvertPathToEntrynum(init->msmPath); + if (sys.unk0 < 0) { + return -1; + } + if (msmFioOpen(sys.unk0, &sp10) != 1) { + return -1; + } + if ((sys.unkC = msmMemAlloc(0x60)) == NULL) { + msmFioClose(&sp10); + return -0xA; + } + if (msmFioRead(&sp10, sys.unkC, 0x60, 0) < 0) { + msmFioClose(&sp10); + return -2; + } + if (sys.unkC->unk4 != 2) { + msmFioClose(&sp10); + return -0x79; + } + if ((sys.unk10 = msmMemAlloc(sys.unkC->unk14)) == NULL) { + msmFioClose(&sp10); + return -0xA; + } + if (msmFioRead(&sp10, sys.unk10, sys.unkC->unk14, sys.unkC->unk10) < 0) { + msmFioClose(&sp10); + return -2; + } + if (aram != NULL) { + if (aram->skipARInit == 0) { + ARInit(aram->stackIndex, aram->aramEnd); + ARQInit(); + aram = (MSM_ARAM *)ARAlloc(sys.unk10->unk14); + if ((u32)aram != ARGetBaseAddress()) { + msmFioClose(&sp10); + return -0x14; + } + sys.unk7 = 0; + } + else { + if ((sys.unk10->unk14 + ARGetBaseAddress()) > aram->aramEnd) { + msmFioClose(&sp10); + return -0x14; + } + ARInit(NULL, 0); + ARQInit(); + sys.unk7 = 1; + } + } + var_r26 = msmSysGroupInit(&sp10); + if (var_r26 != 0) { + msmFioClose(&sp10); + return var_r26; + } + var_r26 = msmMusInit(&sys.unk0, &sp10); + if (var_r26 != 0) { + msmFioClose(&sp10); + return var_r26; + } + var_r26 = msmSeInit(&sys.unk0, &sp10); + if (var_r26 != 0) { + msmFioClose(&sp10); + return var_r26; + } + sys.unk18 = sys.unk10->unkE == -2 ? -2 : -1; + sys.unk19 = sys.unk10->unkF == -2 ? -2 : -1; + if ((s32)sys.unkC->unk1C == 0) { + var_r26 = 0; + } + else { + if ((sys.unk14 = msmMemAlloc(sys.unkC->unk1C)) == NULL) { + var_r26 = -0xA; + } + else { + if (msmFioRead(&sp10, sys.unk14, sys.unkC->unk1C, sys.unkC->unk18) < 0) { + var_r26 = -2; + } + else { + var_r26 = 0; + } + } + } + if (var_r26 != 0) { + msmFioClose(&sp10); + return var_r26; + } + msmFioClose(&sp10); + temp_r3 = msmStreamInit(init->pdtPath); + if (temp_r3 < 0) { + return temp_r3; + } + AIInit(NULL); + sndSetHooks(&sp4C); + if (sndInit(sys.unk10->unk0, sys.unk10->unk1, sys.unk10->unk2, 1, 0, sys.unk10->unk14) != 0) { + return -0x1E; + } + sys.unk4F4 = AIRegisterDMACallback(msmSysServer); + sys.unk4F8 = 1; + var_r26 = msmStreamAmemAlloc(); + if (var_r26 < 0) { + sndQuit(); + return var_r26; + } + sys.unk8 = var_r26 + 0x500; + if ((s32)sys.unk10->unk10 != 0) { + temp_r3_8 = msmMemAlloc(sys.unk10->unk10 + 0x100); + if (temp_r3_8 == NULL) { + msmStreamAmemFree(); + sndQuit(); + return -0xA; + } + msmMemFree(temp_r3_8); + } + if (msmSysSetAuxParam(sys.unk10->unkE, sys.unk10->unkF) != 0) { + msmStreamAmemFree(); + sndQuit(); + return -0x1F; + } + msmSysSetOutputMode(OSGetSoundMode() == 0 ? SND_OUTPUTMODE_MONO : SND_OUTPUTMODE_STEREO); + sndVolume(0x7F, 0, 0xFF); + return 0; +} From ce70fc74af048861ba16ed10de6787a72a5d3fd3 Mon Sep 17 00:00:00 2001 From: gamemasterplc Date: Sat, 9 Nov 2024 15:49:29 -0600 Subject: [PATCH 02/29] Properly fix sqrtf constants --- configure.py | 6 +++--- include/math.h | 24 +++++++++++++----------- include/rel_sqrt_consts.h | 3 --- src/REL/_minigameDLL/_minigameDLL.c | 2 +- src/REL/board_executor.c | 2 +- src/REL/bootDll/main.c | 1 - src/REL/m437Dll/main.c | 2 +- src/REL/m446Dll/main.c | 2 +- src/REL/m447dll/main.c | 2 +- src/REL/modeltestDll/main.c | 3 +-- src/REL/mstory4Dll/main.c | 2 +- src/REL/option/scene.c | 2 +- src/REL/present/init.c | 2 +- src/REL/safDll/main.c | 2 +- src/REL/selmenuDll/main.c | 2 +- src/REL/staffDll/main.c | 2 +- src/REL/subchrselDll/main.c | 2 +- 17 files changed, 29 insertions(+), 32 deletions(-) diff --git a/configure.py b/configure.py index 933a7b2b..339a9dfe 100644 --- a/configure.py +++ b/configure.py @@ -1089,7 +1089,7 @@ config.libs = [ "m435Dll", # Darts of Doom objects={ Object(NonMatching, "REL/m435Dll/main.c"), - Object(Matching, "REL/m435Dll/sequence.c"), + Object(NonMatching, "REL/m435Dll/sequence.c"), }, ), Rel( @@ -1103,7 +1103,7 @@ config.libs = [ "m437Dll", # Balloon of Doom objects={ Object(NonMatching, "REL/m437Dll/main.c"), - Object(Matching, "REL/m437Dll/sequence.c"), + Object(NonMatching, "REL/m437Dll/sequence.c"), }, ), Rel( @@ -1230,7 +1230,7 @@ config.libs = [ "m456Dll", # Take a Breather objects={ Object(NonMatching, "REL/m456Dll/main.c"), - Object(Matching, "REL/m456Dll/stage.c"), + Object(NonMatching, "REL/m456Dll/stage.c"), }, ), Rel( diff --git a/include/math.h b/include/math.h index 8549b25f..389629df 100644 --- a/include/math.h +++ b/include/math.h @@ -10,17 +10,19 @@ #ifdef __MWERKS__ extern inline float sqrtf(float x) { - volatile float y; - if(x > 0.0f) - { - double guess = __frsqrte((double)x); // returns an approximation to - guess = 0.5*guess*(3.0 - guess*guess*x); // now have 12 sig bits - guess = 0.5*guess*(3.0 - guess*guess*x); // now have 24 sig bits - guess = 0.5*guess*(3.0 - guess*guess*x); // now have 32 sig bits - y=(float)(x*guess); - return y; - } - return x; + static const double _half = .5; + static const double _three = 3.0; + volatile float y; + if (x > 0.0f) + { + double guess = __frsqrte((double)x); // returns an approximation to + guess = _half*guess*(_three - guess*guess*x); // now have 12 sig bits + guess = _half*guess*(_three - guess*guess*x); // now have 24 sig bits + guess = _half*guess*(_three - guess*guess*x); // now have 32 sig bits + y = (float)(x*guess); + return y ; + } + return x; } #else float sqrtf(float x); diff --git a/include/rel_sqrt_consts.h b/include/rel_sqrt_consts.h index 23ae61cd..fd06a9e9 100644 --- a/include/rel_sqrt_consts.h +++ b/include/rel_sqrt_consts.h @@ -1,8 +1,5 @@ #ifndef _REL_SQRT_CONSTS #define _REL_SQRT_CONSTS -const double __fakeHalf = 0.5; -const double __fakeThree = 3.0; - #endif diff --git a/src/REL/_minigameDLL/_minigameDLL.c b/src/REL/_minigameDLL/_minigameDLL.c index d252a50b..1b4730ee 100644 --- a/src/REL/_minigameDLL/_minigameDLL.c +++ b/src/REL/_minigameDLL/_minigameDLL.c @@ -1,6 +1,6 @@ #include "REL/executor.h" #include "dolphin/os.h" -#include "rel_sqrt_consts.h" +#include "math.h" void ObjectSetup(void) { OSReport("minigame dll setup\n"); diff --git a/src/REL/board_executor.c b/src/REL/board_executor.c index 04e59a3a..3d838c77 100644 --- a/src/REL/board_executor.c +++ b/src/REL/board_executor.c @@ -1,5 +1,5 @@ #include "REL/board_executor.h" -#include "rel_sqrt_consts.h" +#include "math.h" static void ObjectSetup(void) { BoardObjectSetup(BoardCreate, BoardDestroy); diff --git a/src/REL/bootDll/main.c b/src/REL/bootDll/main.c index ce1d563d..b525067a 100644 --- a/src/REL/bootDll/main.c +++ b/src/REL/bootDll/main.c @@ -15,7 +15,6 @@ #include "game/wipe.h" #include "math.h" -#include "rel_sqrt_consts.h" #include "data_num/title.h" diff --git a/src/REL/m437Dll/main.c b/src/REL/m437Dll/main.c index 54af13d9..7b67a481 100755 --- a/src/REL/m437Dll/main.c +++ b/src/REL/m437Dll/main.c @@ -16,7 +16,7 @@ #include "game/wipe.h" #include "dolphin.h" -#include "rel_sqrt_consts.h" +#include "math.h" #include "string.h" typedef struct { diff --git a/src/REL/m446Dll/main.c b/src/REL/m446Dll/main.c index 1988e32d..b73f19e3 100644 --- a/src/REL/m446Dll/main.c +++ b/src/REL/m446Dll/main.c @@ -1,5 +1,5 @@ #include "REL/m446Dll.h" -#include "rel_sqrt_consts.h" +#include "math.h" #include "game/audio.h" #include "game/frand.h" diff --git a/src/REL/m447dll/main.c b/src/REL/m447dll/main.c index a8389fa0..eeb86fd4 100755 --- a/src/REL/m447dll/main.c +++ b/src/REL/m447dll/main.c @@ -11,7 +11,7 @@ #include "game/window.h" #include "game/wipe.h" -#include "rel_sqrt_consts.h" +#include "math.h" typedef struct { /* 0x00 */ s16 unk00; diff --git a/src/REL/modeltestDll/main.c b/src/REL/modeltestDll/main.c index 91b89102..a871df64 100644 --- a/src/REL/modeltestDll/main.c +++ b/src/REL/modeltestDll/main.c @@ -14,6 +14,7 @@ #include "math.h" #include "REL/modeltestDll.h" +#include "math.h" // -------------------------------------------------------------------------- // @@ -28,8 +29,6 @@ s32 lbl_1_data_0[8] = { DATA_MAKE_NUM(DATADIR_MARIOMOT, 0x04), }; -const f64 unk_rodata_0 = 0.5; -const f64 unk_rodata_8 = 3.0; omObjData *lbl_1_bss_9A4; omObjData *lbl_1_bss_9A0; diff --git a/src/REL/mstory4Dll/main.c b/src/REL/mstory4Dll/main.c index ab56c8a5..1bb809d0 100644 --- a/src/REL/mstory4Dll/main.c +++ b/src/REL/mstory4Dll/main.c @@ -8,7 +8,7 @@ #include "game/gamework_data.h" #include "game/flag.h" #include "game/chrman.h" -#include "rel_sqrt_consts.h" +#include "math.h" #include "REL/executor.h" #include "game/board/main.h" diff --git a/src/REL/option/scene.c b/src/REL/option/scene.c index 0edd9959..4eeb4d2b 100755 --- a/src/REL/option/scene.c +++ b/src/REL/option/scene.c @@ -12,7 +12,7 @@ #include "game/sprite.h" #include "game/wipe.h" -#include "rel_sqrt_consts.h" +#include "math.h" typedef struct { /* 0x00 */ s16 id; diff --git a/src/REL/present/init.c b/src/REL/present/init.c index 71813938..2b2d57a5 100644 --- a/src/REL/present/init.c +++ b/src/REL/present/init.c @@ -5,7 +5,7 @@ #include "game/pad.h" #include "game/process.h" #include "game/wipe.h" -#include "rel_sqrt_consts.h" +#include "math.h" #include "REL/present.h" diff --git a/src/REL/safDll/main.c b/src/REL/safDll/main.c index 6b58f683..dfb34d70 100644 --- a/src/REL/safDll/main.c +++ b/src/REL/safDll/main.c @@ -3,7 +3,7 @@ #include "game/gamework_data.h" #include "game/printfunc.h" #include "game/pad.h" -#include "rel_sqrt_consts.h" +#include "math.h" s32 lbl_1_data_0 = 100; s32 lbl_1_bss_0[192]; diff --git a/src/REL/selmenuDll/main.c b/src/REL/selmenuDll/main.c index fda7916f..ad413ed8 100644 --- a/src/REL/selmenuDll/main.c +++ b/src/REL/selmenuDll/main.c @@ -14,8 +14,8 @@ #include "game/pad.h" #include "game/printfunc.h" #include "game/wipe.h" +#include "math.h" -#include "rel_sqrt_consts.h" // MSM Definitions static s8 *msmSeGetIndexPtr(s16 datano); diff --git a/src/REL/staffDll/main.c b/src/REL/staffDll/main.c index 28f1fbc4..0580c6a1 100644 --- a/src/REL/staffDll/main.c +++ b/src/REL/staffDll/main.c @@ -9,7 +9,7 @@ #include "game/window.h" #include "game/wipe.h" -#include "rel_sqrt_consts.h" +#include "math.h" typedef struct StaffData { /* 0x00 */ u32 unk_00; diff --git a/src/REL/subchrselDll/main.c b/src/REL/subchrselDll/main.c index 71911750..7c16e272 100644 --- a/src/REL/subchrselDll/main.c +++ b/src/REL/subchrselDll/main.c @@ -5,7 +5,7 @@ #include "game/pad.h" #include "game/wipe.h" -#include "rel_sqrt_consts.h" +#include "math.h" static void SubchrMain(void); From c59fd4d490a2ea2269fc88e2b61b45b7b935ff8f Mon Sep 17 00:00:00 2001 From: dbalatoni13 Date: Sun, 10 Nov 2024 06:53:40 +0100 Subject: [PATCH 03/29] Found new inlines --- src/REL/m443Dll/main.c | 1 - src/REL/m450Dll/main.c | 54 ++++++++---------------------------------- src/REL/m461Dll/main.c | 20 ++++------------ 3 files changed, 15 insertions(+), 60 deletions(-) diff --git a/src/REL/m443Dll/main.c b/src/REL/m443Dll/main.c index d149d47d..b7c1cb01 100644 --- a/src/REL/m443Dll/main.c +++ b/src/REL/m443Dll/main.c @@ -806,7 +806,6 @@ void fn_1_3770(omObjData *arg0) s32 var_r30; s32 var_r29; M443DllCameraStruct *var_r28; - omObjData *var_r27; s32 var_r26; u32 var_r25; s32 var_r24; diff --git a/src/REL/m450Dll/main.c b/src/REL/m450Dll/main.c index d52324b8..8bd49c19 100644 --- a/src/REL/m450Dll/main.c +++ b/src/REL/m450Dll/main.c @@ -930,7 +930,7 @@ void fn_1_2C1C(WorkPlayerOld *player, omObjData *obj, s32 arg2, s32 arg3, s32 *a player->unk_10 = NULL; player->unk_50 = NULL; player->unk_64 = 0; - player->unk_68 = 0; + player->unk_68 = NULL; player->unk_38 = 0; player->unk_3C = 0; player->unk_44 = arg5; @@ -978,7 +978,7 @@ void fn_1_2DC8(WorkPlayerOld *player, s32 count, Vec *data) void fn_1_2DD4(WorkPlayerOld *player) { omSetTra(player->unk_00, player->unk_6C.x, player->unk_6C.y, player->unk_6C.z); - omSetRot(player->unk_00, 0, player->unk_9C, 0); + omSetRot(player->unk_00, 0.0f, player->unk_9C, 0.0f); } void fn_1_2E34(WorkPlayerOld *player) @@ -1123,12 +1123,7 @@ void fn_1_3CE0(WorkPlayerOld *player, s32 *state, u32 *motAttr) } if (player->unk_14[3] >= 0 && (player->unk_28 & 0x100)) { - player->unk_38 = 1; - player->unk_84.y = 26.766666f; - player->unk_A4 = 1; - if (player->unk_3C & 0x2) { - player->unk_3C &= ~0x2; - } + fn_1_2BD0(player, 26.766666f, 1.0f); *motAttr = HU3D_MOTATTR_NONE; *state = 3; } @@ -1181,12 +1176,7 @@ void fn_1_3ECC(WorkPlayerOld *player, s32 *state, u32 *motAttr) void fn_1_3F84(WorkPlayerOld *player, s32 *state, u32 *motAttr) { if (Hu3DMotionShiftIDGet(player->unk_00->model[0]) < 0 && Hu3DMotionEndCheck(player->unk_00->model[0])) { - player->unk_38 = 1; - player->unk_84.y = 0; - player->unk_A4 = 0; - if (player->unk_3C & 0x2) { - player->unk_3C &= ~0x2; - } + fn_1_2BD0(player, 0.0f, 0.0f); } } @@ -1352,12 +1342,8 @@ void fn_1_40C0(WorkPlayerOld *player) player->unk_3C |= 0x800; } else { - player->unk_38 = 1; - player->unk_84.y = 0.0f; - player->unk_A4 = 0.0f; - if ((player->unk_3C & 2) != 0) { - player->unk_3C &= ~2; - } + fn_1_2BD0(player, 0.0f, 0.0f); + motAttr = HU3D_MOTATTR_NONE; state = 3; } @@ -6582,12 +6568,7 @@ s32 fn_1_1C898(UnkM450Struct5 *var_r31, omObjData *var_r30) HuAudCharVoicePlay(var_r31->unk_11C, 0x123); var_r31->unk_FC |= 0x10; var_r31->unk_00.unk_3C |= 0x210; - var_r31->unk_00.unk_38 = 1; - var_r31->unk_00.unk_84.y = 48.179996f; - var_r31->unk_00.unk_A4 = 0.0f; - if (var_r31->unk_00.unk_3C & 2) { - var_r31->unk_00.unk_3C &= ~0x2; - } + fn_1_2BD0(&var_r31->unk_00, 48.179996f, 0.0f); Hu3DMotionShiftSet(var_r30->model[0], var_r30->motion[8], 0.0f, 8.0f, 0); if (fn_1_125C0(0, 1) <= 0) { var_r31->unk_FC |= 0x80000; @@ -6599,12 +6580,7 @@ s32 fn_1_1C898(UnkM450Struct5 *var_r31, omObjData *var_r30) HuAudCharVoicePlay(var_r31->unk_11C, 0x123); var_r31->unk_FC |= 0x100; var_r31->unk_00.unk_3C |= 0x210; - var_r31->unk_00.unk_38 = 1; - var_r31->unk_00.unk_84.y = 0.0f; - var_r31->unk_00.unk_A4 = 0.0f; - if (var_r31->unk_00.unk_3C & 2) { - var_r31->unk_00.unk_3C &= ~0x2; - } + fn_1_2BD0(&var_r31->unk_00, 0.0f, 0.0f); if (fn_1_125C0(0, 1) <= 0) { var_r31->unk_FC |= 0x80000; } @@ -6715,12 +6691,7 @@ void fn_1_1E150(omObjData *var_r29) HuAudCharVoicePlay(var_r31->unk_11C, 0x123); var_r31->unk_FC |= 0x800000; var_r31->unk_118 = 0x7EB; - var_r31->unk_00.unk_38 = 1; - var_r31->unk_00.unk_84.y = 53.533333f; - var_r31->unk_00.unk_A4 = 0.0f; - if (var_r31->unk_00.unk_3C & 2) { - var_r31->unk_00.unk_3C &= ~0x2; - } + fn_1_2BD0(&var_r31->unk_00, 53.533333f, 0.0f); Hu3DMotionSet(var_r29->model[0], var_r29->motion[8]); Hu3DModelAttrReset(var_r29->model[0], HU3D_ATTR_DISPOFF); fn_1_125C0(0, 0); @@ -7129,12 +7100,7 @@ void fn_1_20170(omObjData *var_r30) var_r29->unk_00.unk_A8 = MapPos( var_r29->unk_00.unk_6C.x, var_r29->unk_00.unk_6C.y, var_r29->unk_00.unk_6C.z, var_r29->unk_00.unk_C0, &var_r29->unk_00.unk_AC); if (var_r29->unk_00.unk_A8 > var_r29->unk_00.unk_6C.y) { - var_r31->unk_00.unk_38 = 1; - var_r31->unk_00.unk_84.y = 53.533333f; - var_r31->unk_00.unk_A4 = 0.0f; - if (var_r31->unk_00.unk_3C & 2) { - var_r31->unk_00.unk_3C &= ~2; - } + fn_1_2BD0(&var_r31->unk_00, 53.533333f, 0.0f); } var_f31 = var_r29->unk_00.unk_6C.x; var_f30 = var_r29->unk_00.unk_6C.z; diff --git a/src/REL/m461Dll/main.c b/src/REL/m461Dll/main.c index b5b0bfd0..5b0ae287 100644 --- a/src/REL/m461Dll/main.c +++ b/src/REL/m461Dll/main.c @@ -702,7 +702,7 @@ void fn_1_2DC8(WorkPlayerOld *player, s32 count, Vec *data) void fn_1_2DD4(WorkPlayerOld *player) { omSetTra(player->unk0, player->unk6C.x, player->unk6C.y, player->unk6C.z); - omSetRot(player->unk0, 0, player->unk9C, 0); + omSetRot(player->unk0, 0.0f, player->unk9C, 0.0f); } void fn_1_2E34(WorkPlayerOld *player) @@ -840,12 +840,7 @@ void fn_1_3C74(WorkPlayerOld *player, s32 *state, u32 *motAttr) } if(player->unk14[3] >= 0 && (player->unk28 & 0x100)) { - player->unk38 = 1; - player->unk84.y = 26.766666f; - player->unkA4 = 1; - if(player->unk3C & 0x2) { - player->unk3C &= ~0x2; - } + fn_1_2BD0(player, 26.766666f, 1.0f); *motAttr = HU3D_MOTATTR_NONE; *state = 3; } @@ -868,7 +863,7 @@ void fn_1_3D4C(WorkPlayerOld *player, s32 *state, u32 *motAttr) player->unk84.y += -2.4333334f; if(player->unk14[5] >= 0 && (player->unk28 & 0x140)) { player->unk38 = 3; - player->unk84.y = 0; + player->unk84.y = 0.0f; player->unk3C &= ~0x3; player->unk3C |= 0x4; *motAttr = HU3D_MOTATTR_NONE; @@ -895,12 +890,7 @@ void fn_1_3E60(WorkPlayerOld *player, s32 *state, u32 *motAttr) void fn_1_3F18(WorkPlayerOld *player, s32 *state, u32 *motAttr) { if(Hu3DMotionShiftIDGet(player->unk0->model[0]) < 0 && Hu3DMotionEndCheck(player->unk0->model[0])) { - player->unk38 = 1; - player->unk84.y = 0; - player->unkA4 = 0; - if(player->unk3C & 0x2) { - player->unk3C &= ~0x2; - } + fn_1_2BD0(player, 0.0f, 0.0f); } } @@ -2329,4 +2319,4 @@ void fn_1_D70C(omObjData *obj) CharModelKill(lbl_1_data_0[GWPlayerCfg[i].character]); } omOvlReturnEx(1, 1); -} \ No newline at end of file +} From 7cda6af48aaa724ea3edb449fe170d11b2e5a699 Mon Sep 17 00:00:00 2001 From: dbalatoni13 Date: Sun, 10 Nov 2024 06:53:52 +0100 Subject: [PATCH 04/29] Finished m432Dll --- config/GMPE01_00/rels/m432Dll/symbols.txt | 375 +-- configure.py | 2 +- include/REL/m432data.h | 1235 ++++++++ src/REL/m432Dll/main.c | 3307 ++++++++++++++++++++- 4 files changed, 4725 insertions(+), 194 deletions(-) create mode 100644 include/REL/m432data.h diff --git a/config/GMPE01_00/rels/m432Dll/symbols.txt b/config/GMPE01_00/rels/m432Dll/symbols.txt index 75ff4704..4926357c 100644 --- a/config/GMPE01_00/rels/m432Dll/symbols.txt +++ b/config/GMPE01_00/rels/m432Dll/symbols.txt @@ -101,138 +101,138 @@ fn_1_128C8 = .text:0x000128C8; // type:function size:0x5E0 fn_1_12EA8 = .text:0x00012EA8; // type:function size:0x300 fn_1_131A8 = .text:0x000131A8; // type:function size:0x2178 fn_1_15320 = .text:0x00015320; // type:function size:0x9C -fn_1_153BC = .text:0x000153BC; // type:function size:0xDA0 +ObjectSetup = .text:0x000153BC; // type:function size:0xDA0 fn_1_1615C = .text:0x0001615C; // type:function size:0x104 _ctors = .ctors:0x00000000; // type:label scope:global data:4byte _dtors = .dtors:0x00000000; // type:label scope:global data:4byte -lbl_1_rodata_10 = .rodata:0x00000010; // type:object size:0x4 data:float -lbl_1_rodata_14 = .rodata:0x00000014; // type:object size:0x4 data:float -lbl_1_rodata_18 = .rodata:0x00000018; // type:object size:0x8 data:double -lbl_1_rodata_20 = .rodata:0x00000020; // type:object size:0x4 data:float -lbl_1_rodata_24 = .rodata:0x00000024; // type:object size:0x4 data:float -lbl_1_rodata_28 = .rodata:0x00000028; // type:object size:0x8 data:double -lbl_1_rodata_30 = .rodata:0x00000030; // type:object size:0x8 data:double -lbl_1_rodata_38 = .rodata:0x00000038; // type:object size:0x8 data:double -lbl_1_rodata_40 = .rodata:0x00000040; // type:object size:0x8 data:double -lbl_1_rodata_48 = .rodata:0x00000048; // type:object size:0x4 data:float -lbl_1_rodata_4C = .rodata:0x0000004C; // type:object size:0x4 data:float -lbl_1_rodata_50 = .rodata:0x00000050; // type:object size:0x4 data:float -lbl_1_rodata_54 = .rodata:0x00000054; // type:object size:0x4 data:float -lbl_1_rodata_58 = .rodata:0x00000058; // type:object size:0x4 data:float -lbl_1_rodata_5C = .rodata:0x0000005C; // type:object size:0x4 data:float -lbl_1_rodata_60 = .rodata:0x00000060; // type:object size:0x4 data:float -lbl_1_rodata_64 = .rodata:0x00000064; // type:object size:0x4 data:float -lbl_1_rodata_68 = .rodata:0x00000068; // type:object size:0x8 data:double -lbl_1_rodata_70 = .rodata:0x00000070; // type:object size:0x4 data:float -lbl_1_rodata_74 = .rodata:0x00000074; // type:object size:0x4 data:float -lbl_1_rodata_78 = .rodata:0x00000078; // type:object size:0x4 data:float -lbl_1_rodata_80 = .rodata:0x00000080; // type:object size:0x8 data:double -lbl_1_rodata_88 = .rodata:0x00000088; // type:object size:0x8 data:double -lbl_1_rodata_90 = .rodata:0x00000090; // type:object size:0x4 data:float -lbl_1_rodata_94 = .rodata:0x00000094; // type:object size:0x4 data:float -lbl_1_rodata_98 = .rodata:0x00000098; // type:object size:0x4 data:float -lbl_1_rodata_9C = .rodata:0x0000009C; // type:object size:0x4 data:float -lbl_1_rodata_A0 = .rodata:0x000000A0; // type:object size:0x4 data:float -lbl_1_rodata_A4 = .rodata:0x000000A4; // type:object size:0x4 data:float -lbl_1_rodata_A8 = .rodata:0x000000A8; // type:object size:0x4 data:float -lbl_1_rodata_AC = .rodata:0x000000AC; // type:object size:0x4 data:float -lbl_1_rodata_B0 = .rodata:0x000000B0; // type:object size:0x4 data:float -lbl_1_rodata_B4 = .rodata:0x000000B4; // type:object size:0x4 data:float -lbl_1_rodata_B8 = .rodata:0x000000B8; // type:object size:0x4 data:float -lbl_1_rodata_BC = .rodata:0x000000BC; // type:object size:0x4 data:float -lbl_1_rodata_C0 = .rodata:0x000000C0; // type:object size:0x4 data:float -lbl_1_rodata_C4 = .rodata:0x000000C4; // type:object size:0x4 data:float -lbl_1_rodata_C8 = .rodata:0x000000C8; // type:object size:0x4 data:float -lbl_1_rodata_CC = .rodata:0x000000CC; // type:object size:0x4 data:float -lbl_1_rodata_D0 = .rodata:0x000000D0; // type:object size:0x4 data:float -lbl_1_rodata_D4 = .rodata:0x000000D4; // type:object size:0x4 data:float -lbl_1_rodata_D8 = .rodata:0x000000D8; // type:object size:0x4 data:float -lbl_1_rodata_DC = .rodata:0x000000DC; // type:object size:0x4 data:float -lbl_1_rodata_E0 = .rodata:0x000000E0; // type:object size:0x4 data:float -lbl_1_rodata_E4 = .rodata:0x000000E4; // type:object size:0x4 data:float -lbl_1_rodata_E8 = .rodata:0x000000E8; // type:object size:0x4 data:float -lbl_1_rodata_EC = .rodata:0x000000EC; // type:object size:0x4 data:float -lbl_1_rodata_F0 = .rodata:0x000000F0; // type:object size:0x4 data:float -lbl_1_rodata_F4 = .rodata:0x000000F4; // type:object size:0x4 data:float -lbl_1_rodata_F8 = .rodata:0x000000F8; // type:object size:0x4 data:float -lbl_1_rodata_FC = .rodata:0x000000FC; // type:object size:0x4 data:float -lbl_1_rodata_100 = .rodata:0x00000100; // type:object size:0x4 data:float -lbl_1_rodata_104 = .rodata:0x00000104; // type:object size:0x4 data:float -lbl_1_rodata_108 = .rodata:0x00000108; // type:object size:0x4 data:float -lbl_1_rodata_10C = .rodata:0x0000010C; // type:object size:0x4 data:float -lbl_1_rodata_110 = .rodata:0x00000110; // type:object size:0x4 data:float -lbl_1_rodata_114 = .rodata:0x00000114; // type:object size:0x4 data:float -lbl_1_rodata_118 = .rodata:0x00000118; // type:object size:0x4 data:float -lbl_1_rodata_11C = .rodata:0x0000011C; // type:object size:0x4 data:float -lbl_1_rodata_120 = .rodata:0x00000120; // type:object size:0x4 data:float -lbl_1_rodata_124 = .rodata:0x00000124; // type:object size:0x4 data:float -lbl_1_rodata_128 = .rodata:0x00000128; // type:object size:0x4 data:float -lbl_1_rodata_12C = .rodata:0x0000012C; // type:object size:0x4 data:float -lbl_1_rodata_130 = .rodata:0x00000130; // type:object size:0x4 data:float -lbl_1_rodata_134 = .rodata:0x00000134; // type:object size:0x4 data:float -lbl_1_rodata_138 = .rodata:0x00000138; // type:object size:0x4 data:float -lbl_1_rodata_13C = .rodata:0x0000013C; // type:object size:0x4 data:float -lbl_1_rodata_140 = .rodata:0x00000140; // type:object size:0x4 data:float -lbl_1_rodata_144 = .rodata:0x00000144; // type:object size:0x4 data:float -lbl_1_rodata_148 = .rodata:0x00000148; // type:object size:0x4 data:float -lbl_1_rodata_14C = .rodata:0x0000014C; // type:object size:0x4 data:float -lbl_1_rodata_150 = .rodata:0x00000150; // type:object size:0x4 data:float -lbl_1_rodata_154 = .rodata:0x00000154; // type:object size:0x4 data:float -lbl_1_rodata_158 = .rodata:0x00000158; // type:object size:0x4 data:float -lbl_1_rodata_15C = .rodata:0x0000015C; // type:object size:0x4 data:float -lbl_1_rodata_160 = .rodata:0x00000160; // type:object size:0x4 data:float -lbl_1_rodata_164 = .rodata:0x00000164; // type:object size:0x4 data:float -lbl_1_rodata_168 = .rodata:0x00000168; // type:object size:0x4 data:float -lbl_1_rodata_16C = .rodata:0x0000016C; // type:object size:0x4 data:float -lbl_1_rodata_170 = .rodata:0x00000170; // type:object size:0x4 data:float -lbl_1_rodata_174 = .rodata:0x00000174; // type:object size:0x4 data:float -lbl_1_rodata_178 = .rodata:0x00000178; // type:object size:0x4 data:float -lbl_1_rodata_17C = .rodata:0x0000017C; // type:object size:0x4 data:float -lbl_1_rodata_180 = .rodata:0x00000180; // type:object size:0x4 data:float -lbl_1_rodata_184 = .rodata:0x00000184; // type:object size:0x4 data:float -lbl_1_rodata_188 = .rodata:0x00000188; // type:object size:0x4 data:float -lbl_1_rodata_18C = .rodata:0x0000018C; // type:object size:0x4 data:float -lbl_1_rodata_190 = .rodata:0x00000190; // type:object size:0x4 data:float -lbl_1_rodata_194 = .rodata:0x00000194; // type:object size:0x4 data:float -lbl_1_rodata_198 = .rodata:0x00000198; // type:object size:0x4 data:float -lbl_1_rodata_19C = .rodata:0x0000019C; // type:object size:0x4 data:float -lbl_1_rodata_1A0 = .rodata:0x000001A0; // type:object size:0x4 data:float -lbl_1_rodata_1A4 = .rodata:0x000001A4; // type:object size:0x4 data:float -lbl_1_rodata_1A8 = .rodata:0x000001A8; // type:object size:0x4 data:float -lbl_1_rodata_1AC = .rodata:0x000001AC; // type:object size:0x4 data:float -lbl_1_rodata_1B0 = .rodata:0x000001B0; // type:object size:0x4 data:float -lbl_1_rodata_1B4 = .rodata:0x000001B4; // type:object size:0x4 data:float -lbl_1_rodata_1B8 = .rodata:0x000001B8; // type:object size:0x8 data:double -lbl_1_rodata_1C0 = .rodata:0x000001C0; // type:object size:0x4 data:float -lbl_1_rodata_1C4 = .rodata:0x000001C4; // type:object size:0x4 data:float -lbl_1_rodata_1C8 = .rodata:0x000001C8; // type:object size:0x4 data:float -lbl_1_rodata_1CC = .rodata:0x000001CC; // type:object size:0x4 data:float -lbl_1_rodata_1D0 = .rodata:0x000001D0; // type:object size:0x4 data:float -lbl_1_rodata_1D4 = .rodata:0x000001D4; // type:object size:0x4 data:float -lbl_1_rodata_1D8 = .rodata:0x000001D8; // type:object size:0x4 data:float -lbl_1_rodata_1DC = .rodata:0x000001DC; // type:object size:0x4 data:float -lbl_1_rodata_1E0 = .rodata:0x000001E0; // type:object size:0x4 data:float -lbl_1_rodata_1E4 = .rodata:0x000001E4; // type:object size:0x4 data:float -lbl_1_rodata_1E8 = .rodata:0x000001E8; // type:object size:0x4 data:float -lbl_1_rodata_1EC = .rodata:0x000001EC; // type:object size:0x4 data:float -lbl_1_rodata_1F0 = .rodata:0x000001F0; // type:object size:0x4 data:float -lbl_1_rodata_1F4 = .rodata:0x000001F4; // type:object size:0x4 data:float -lbl_1_rodata_1F8 = .rodata:0x000001F8; // type:object size:0x4 data:float -lbl_1_rodata_1FC = .rodata:0x000001FC; // type:object size:0x4 data:float -lbl_1_rodata_200 = .rodata:0x00000200; // type:object size:0x4 data:float -lbl_1_rodata_204 = .rodata:0x00000204; // type:object size:0x4 data:float -lbl_1_rodata_208 = .rodata:0x00000208; // type:object size:0x8 data:double -lbl_1_rodata_210 = .rodata:0x00000210; // type:object size:0x8 data:double -lbl_1_rodata_218 = .rodata:0x00000218; // type:object size:0x4 data:float -lbl_1_rodata_220 = .rodata:0x00000220; // type:object size:0x8 data:double -lbl_1_rodata_228 = .rodata:0x00000228; // type:object size:0x4 data:float -lbl_1_rodata_22C = .rodata:0x0000022C; // type:object size:0x4 data:float -lbl_1_rodata_230 = .rodata:0x00000230; // type:object size:0x4 data:float +lbl_1_rodata_10 = .rodata:0x00000010; // type:object size:0x4 scope:local data:float +lbl_1_rodata_14 = .rodata:0x00000014; // type:object size:0x4 scope:local data:float +lbl_1_rodata_18 = .rodata:0x00000018; // type:object size:0x8 scope:local data:double +lbl_1_rodata_20 = .rodata:0x00000020; // type:object size:0x4 scope:local data:float +lbl_1_rodata_24 = .rodata:0x00000024; // type:object size:0x4 scope:local data:float +lbl_1_rodata_28 = .rodata:0x00000028; // type:object size:0x8 scope:local data:double +lbl_1_rodata_30 = .rodata:0x00000030; // type:object size:0x8 scope:local data:double +lbl_1_rodata_38 = .rodata:0x00000038; // type:object size:0x8 scope:local data:double +lbl_1_rodata_40 = .rodata:0x00000040; // type:object size:0x8 scope:local data:double +lbl_1_rodata_48 = .rodata:0x00000048; // type:object size:0x4 scope:local data:float +lbl_1_rodata_4C = .rodata:0x0000004C; // type:object size:0x4 scope:local data:float +lbl_1_rodata_50 = .rodata:0x00000050; // type:object size:0x4 scope:local data:float +lbl_1_rodata_54 = .rodata:0x00000054; // type:object size:0x4 scope:local data:float +lbl_1_rodata_58 = .rodata:0x00000058; // type:object size:0x4 scope:local data:float +lbl_1_rodata_5C = .rodata:0x0000005C; // type:object size:0x4 scope:local data:float +lbl_1_rodata_60 = .rodata:0x00000060; // type:object size:0x4 scope:local data:float +lbl_1_rodata_64 = .rodata:0x00000064; // type:object size:0x4 scope:local data:float +lbl_1_rodata_68 = .rodata:0x00000068; // type:object size:0x8 scope:local data:double +lbl_1_rodata_70 = .rodata:0x00000070; // type:object size:0x4 scope:local data:float +lbl_1_rodata_74 = .rodata:0x00000074; // type:object size:0x4 scope:local data:float +lbl_1_rodata_78 = .rodata:0x00000078; // type:object size:0x4 scope:local data:float +lbl_1_rodata_80 = .rodata:0x00000080; // type:object size:0x8 scope:local data:double +lbl_1_rodata_88 = .rodata:0x00000088; // type:object size:0x8 scope:local data:double +lbl_1_rodata_90 = .rodata:0x00000090; // type:object size:0x4 scope:local data:float +lbl_1_rodata_94 = .rodata:0x00000094; // type:object size:0x4 scope:local data:float +lbl_1_rodata_98 = .rodata:0x00000098; // type:object size:0x4 scope:local data:float +lbl_1_rodata_9C = .rodata:0x0000009C; // type:object size:0x4 scope:local data:float +lbl_1_rodata_A0 = .rodata:0x000000A0; // type:object size:0x4 scope:local data:float +lbl_1_rodata_A4 = .rodata:0x000000A4; // type:object size:0x4 scope:local data:float +lbl_1_rodata_A8 = .rodata:0x000000A8; // type:object size:0x4 scope:local data:float +lbl_1_rodata_AC = .rodata:0x000000AC; // type:object size:0x4 scope:local data:float +lbl_1_rodata_B0 = .rodata:0x000000B0; // type:object size:0x4 scope:local data:float +lbl_1_rodata_B4 = .rodata:0x000000B4; // type:object size:0x4 scope:local data:float +lbl_1_rodata_B8 = .rodata:0x000000B8; // type:object size:0x4 scope:local data:float +lbl_1_rodata_BC = .rodata:0x000000BC; // type:object size:0x4 scope:local data:float +lbl_1_rodata_C0 = .rodata:0x000000C0; // type:object size:0x4 scope:local data:float +lbl_1_rodata_C4 = .rodata:0x000000C4; // type:object size:0x4 scope:local data:float +lbl_1_rodata_C8 = .rodata:0x000000C8; // type:object size:0x4 scope:local data:float +lbl_1_rodata_CC = .rodata:0x000000CC; // type:object size:0x4 scope:local data:float +lbl_1_rodata_D0 = .rodata:0x000000D0; // type:object size:0x4 scope:local data:float +lbl_1_rodata_D4 = .rodata:0x000000D4; // type:object size:0x4 scope:local data:float +lbl_1_rodata_D8 = .rodata:0x000000D8; // type:object size:0x4 scope:local data:float +lbl_1_rodata_DC = .rodata:0x000000DC; // type:object size:0x4 scope:local data:float +lbl_1_rodata_E0 = .rodata:0x000000E0; // type:object size:0x4 scope:local data:float +lbl_1_rodata_E4 = .rodata:0x000000E4; // type:object size:0x4 scope:local data:float +lbl_1_rodata_E8 = .rodata:0x000000E8; // type:object size:0x4 scope:local data:float +lbl_1_rodata_EC = .rodata:0x000000EC; // type:object size:0x4 scope:local data:float +lbl_1_rodata_F0 = .rodata:0x000000F0; // type:object size:0x4 scope:local data:float +lbl_1_rodata_F4 = .rodata:0x000000F4; // type:object size:0x4 scope:local data:float +lbl_1_rodata_F8 = .rodata:0x000000F8; // type:object size:0x4 scope:local data:float +lbl_1_rodata_FC = .rodata:0x000000FC; // type:object size:0x4 scope:local data:float +lbl_1_rodata_100 = .rodata:0x00000100; // type:object size:0x4 scope:local data:float +lbl_1_rodata_104 = .rodata:0x00000104; // type:object size:0x4 scope:local data:float +lbl_1_rodata_108 = .rodata:0x00000108; // type:object size:0x4 scope:local data:float +lbl_1_rodata_10C = .rodata:0x0000010C; // type:object size:0x4 scope:local data:float +lbl_1_rodata_110 = .rodata:0x00000110; // type:object size:0x4 scope:local data:float +lbl_1_rodata_114 = .rodata:0x00000114; // type:object size:0x4 scope:local data:float +lbl_1_rodata_118 = .rodata:0x00000118; // type:object size:0x4 scope:local data:float +lbl_1_rodata_11C = .rodata:0x0000011C; // type:object size:0x4 scope:local data:float +lbl_1_rodata_120 = .rodata:0x00000120; // type:object size:0x4 scope:local data:float +lbl_1_rodata_124 = .rodata:0x00000124; // type:object size:0x4 scope:local data:float +lbl_1_rodata_128 = .rodata:0x00000128; // type:object size:0x4 scope:local data:float +lbl_1_rodata_12C = .rodata:0x0000012C; // type:object size:0x4 scope:local data:float +lbl_1_rodata_130 = .rodata:0x00000130; // type:object size:0x4 scope:local data:float +lbl_1_rodata_134 = .rodata:0x00000134; // type:object size:0x4 scope:local data:float +lbl_1_rodata_138 = .rodata:0x00000138; // type:object size:0x4 scope:local data:float +lbl_1_rodata_13C = .rodata:0x0000013C; // type:object size:0x4 scope:local data:float +lbl_1_rodata_140 = .rodata:0x00000140; // type:object size:0x4 scope:local data:float +lbl_1_rodata_144 = .rodata:0x00000144; // type:object size:0x4 scope:local data:float +lbl_1_rodata_148 = .rodata:0x00000148; // type:object size:0x4 scope:local data:float +lbl_1_rodata_14C = .rodata:0x0000014C; // type:object size:0x4 scope:local data:float +lbl_1_rodata_150 = .rodata:0x00000150; // type:object size:0x4 scope:local data:float +lbl_1_rodata_154 = .rodata:0x00000154; // type:object size:0x4 scope:local data:float +lbl_1_rodata_158 = .rodata:0x00000158; // type:object size:0x4 scope:local data:float +lbl_1_rodata_15C = .rodata:0x0000015C; // type:object size:0x4 scope:local data:float +lbl_1_rodata_160 = .rodata:0x00000160; // type:object size:0x4 scope:local data:float +lbl_1_rodata_164 = .rodata:0x00000164; // type:object size:0x4 scope:local data:float +lbl_1_rodata_168 = .rodata:0x00000168; // type:object size:0x4 scope:local data:float +lbl_1_rodata_16C = .rodata:0x0000016C; // type:object size:0x4 scope:local data:float +lbl_1_rodata_170 = .rodata:0x00000170; // type:object size:0x4 scope:local data:float +lbl_1_rodata_174 = .rodata:0x00000174; // type:object size:0x4 scope:local data:float +lbl_1_rodata_178 = .rodata:0x00000178; // type:object size:0x4 scope:local data:float +lbl_1_rodata_17C = .rodata:0x0000017C; // type:object size:0x4 scope:local data:float +lbl_1_rodata_180 = .rodata:0x00000180; // type:object size:0x4 scope:local data:float +lbl_1_rodata_184 = .rodata:0x00000184; // type:object size:0x4 scope:local data:float +lbl_1_rodata_188 = .rodata:0x00000188; // type:object size:0x4 scope:local data:float +lbl_1_rodata_18C = .rodata:0x0000018C; // type:object size:0x4 scope:local data:float +lbl_1_rodata_190 = .rodata:0x00000190; // type:object size:0x4 scope:local data:float +lbl_1_rodata_194 = .rodata:0x00000194; // type:object size:0x4 scope:local data:float +lbl_1_rodata_198 = .rodata:0x00000198; // type:object size:0x4 scope:local data:float +lbl_1_rodata_19C = .rodata:0x0000019C; // type:object size:0x4 scope:local data:float +lbl_1_rodata_1A0 = .rodata:0x000001A0; // type:object size:0x4 scope:local data:float +lbl_1_rodata_1A4 = .rodata:0x000001A4; // type:object size:0x4 scope:local data:float +lbl_1_rodata_1A8 = .rodata:0x000001A8; // type:object size:0x4 scope:local data:float +lbl_1_rodata_1AC = .rodata:0x000001AC; // type:object size:0x4 scope:local data:float +lbl_1_rodata_1B0 = .rodata:0x000001B0; // type:object size:0x4 scope:local data:float +lbl_1_rodata_1B4 = .rodata:0x000001B4; // type:object size:0x4 scope:local data:float +lbl_1_rodata_1B8 = .rodata:0x000001B8; // type:object size:0x8 scope:local data:double +lbl_1_rodata_1C0 = .rodata:0x000001C0; // type:object size:0x4 scope:local data:float +lbl_1_rodata_1C4 = .rodata:0x000001C4; // type:object size:0x4 scope:local data:float +lbl_1_rodata_1C8 = .rodata:0x000001C8; // type:object size:0x4 scope:local data:float +lbl_1_rodata_1CC = .rodata:0x000001CC; // type:object size:0x4 scope:local data:float +lbl_1_rodata_1D0 = .rodata:0x000001D0; // type:object size:0x4 scope:local data:float +lbl_1_rodata_1D4 = .rodata:0x000001D4; // type:object size:0x4 scope:local data:float +lbl_1_rodata_1D8 = .rodata:0x000001D8; // type:object size:0x4 scope:local data:float +lbl_1_rodata_1DC = .rodata:0x000001DC; // type:object size:0x4 scope:local data:float +lbl_1_rodata_1E0 = .rodata:0x000001E0; // type:object size:0x4 scope:local data:float +lbl_1_rodata_1E4 = .rodata:0x000001E4; // type:object size:0x4 scope:local data:float +lbl_1_rodata_1E8 = .rodata:0x000001E8; // type:object size:0x4 scope:local data:float +lbl_1_rodata_1EC = .rodata:0x000001EC; // type:object size:0x4 scope:local data:float +lbl_1_rodata_1F0 = .rodata:0x000001F0; // type:object size:0x4 scope:local data:float +lbl_1_rodata_1F4 = .rodata:0x000001F4; // type:object size:0x4 scope:local data:float +lbl_1_rodata_1F8 = .rodata:0x000001F8; // type:object size:0x4 scope:local data:float +lbl_1_rodata_1FC = .rodata:0x000001FC; // type:object size:0x4 scope:local data:float +lbl_1_rodata_200 = .rodata:0x00000200; // type:object size:0x4 scope:local data:float +lbl_1_rodata_204 = .rodata:0x00000204; // type:object size:0x4 scope:local data:float +lbl_1_rodata_208 = .rodata:0x00000208; // type:object size:0x8 scope:local data:double +lbl_1_rodata_210 = .rodata:0x00000210; // type:object size:0x8 scope:local data:double +lbl_1_rodata_218 = .rodata:0x00000218; // type:object size:0x4 scope:local data:float +lbl_1_rodata_220 = .rodata:0x00000220; // type:object size:0x8 scope:local data:double +lbl_1_rodata_228 = .rodata:0x00000228; // type:object size:0x4 scope:local data:float +lbl_1_rodata_22C = .rodata:0x0000022C; // type:object size:0x4 scope:local data:float +lbl_1_rodata_230 = .rodata:0x00000230; // type:object size:0x4 scope:local data:float lbl_1_data_0 = .data:0x00000000; // type:object size:0x10 lbl_1_data_10 = .data:0x00000010; // type:object size:0x20 lbl_1_data_30 = .data:0x00000030; // type:object size:0x28 lbl_1_data_58 = .data:0x00000058; // type:object size:0x28 -lbl_1_data_80 = .data:0x00000080; // type:object size:0x1F data:string +lbl_1_data_80 = .data:0x00000080; // type:object size:0x1F scope:local data:string lbl_1_data_A0 = .data:0x000000A0; // type:object size:0x8 lbl_1_data_A8 = .data:0x000000A8; // type:object size:0x20 data:float lbl_1_data_C8 = .data:0x000000C8; // type:object size:0xC @@ -250,81 +250,81 @@ lbl_1_data_2F4 = .data:0x000002F4; // type:object size:0x24 lbl_1_data_318 = .data:0x00000318; // type:object size:0x3C lbl_1_data_354 = .data:0x00000354; // type:object size:0x18 lbl_1_data_36C = .data:0x0000036C; // type:object size:0x18 -lbl_1_data_384 = .data:0x00000384; // type:object size:0xB data:string -lbl_1_data_38F = .data:0x0000038F; // type:object size:0xB data:string -lbl_1_data_39A = .data:0x0000039A; // type:object size:0xB data:string -lbl_1_data_3A5 = .data:0x000003A5; // type:object size:0xB data:string -lbl_1_data_3B0 = .data:0x000003B0; // type:object size:0xB data:string -lbl_1_data_3BB = .data:0x000003BB; // type:object size:0xB data:string -lbl_1_data_3C6 = .data:0x000003C6; // type:object size:0xB data:string -lbl_1_data_3D1 = .data:0x000003D1; // type:object size:0xB data:string +lbl_1_data_384 = .data:0x00000384; // type:object size:0xB scope:local data:string +lbl_1_data_38F = .data:0x0000038F; // type:object size:0xB scope:local data:string +lbl_1_data_39A = .data:0x0000039A; // type:object size:0xB scope:local data:string +lbl_1_data_3A5 = .data:0x000003A5; // type:object size:0xB scope:local data:string +lbl_1_data_3B0 = .data:0x000003B0; // type:object size:0xB scope:local data:string +lbl_1_data_3BB = .data:0x000003BB; // type:object size:0xB scope:local data:string +lbl_1_data_3C6 = .data:0x000003C6; // type:object size:0xB scope:local data:string +lbl_1_data_3D1 = .data:0x000003D1; // type:object size:0xB scope:local data:string lbl_1_data_3DC = .data:0x000003DC; // type:object size:0x20 -lbl_1_data_3FC = .data:0x000003FC; // type:object size:0xB data:string -lbl_1_data_407 = .data:0x00000407; // type:object size:0xB data:string -lbl_1_data_412 = .data:0x00000412; // type:object size:0xB data:string -lbl_1_data_41D = .data:0x0000041D; // type:object size:0xB data:string -lbl_1_data_428 = .data:0x00000428; // type:object size:0xB data:string -lbl_1_data_433 = .data:0x00000433; // type:object size:0xD +lbl_1_data_3FC = .data:0x000003FC; // type:object size:0xB scope:local data:string +lbl_1_data_407 = .data:0x00000407; // type:object size:0xB scope:local data:string +lbl_1_data_412 = .data:0x00000412; // type:object size:0xB scope:local data:string +lbl_1_data_41D = .data:0x0000041D; // type:object size:0xB scope:local data:string +lbl_1_data_428 = .data:0x00000428; // type:object size:0xB scope:local data:string +lbl_1_data_433 = .data:0x00000433; // type:object size:0xD scope:local data:string lbl_1_data_440 = .data:0x00000440; // type:object size:0x18 data:4byte -lbl_1_data_458 = .data:0x00000458; // type:object size:0xB data:string -lbl_1_data_463 = .data:0x00000463; // type:object size:0xB data:string -lbl_1_data_46E = .data:0x0000046E; // type:object size:0xB data:string -lbl_1_data_479 = .data:0x00000479; // type:object size:0xB data:string -lbl_1_data_484 = .data:0x00000484; // type:object size:0xB data:string -lbl_1_data_48F = .data:0x0000048F; // type:object size:0xB data:string -lbl_1_data_49A = .data:0x0000049A; // type:object size:0xB data:string -lbl_1_data_4A5 = .data:0x000004A5; // type:object size:0xB data:string -lbl_1_data_4B0 = .data:0x000004B0; // type:object size:0xB data:string -lbl_1_data_4BB = .data:0x000004BB; // type:object size:0xD +lbl_1_data_458 = .data:0x00000458; // type:object size:0xB scope:local data:string +lbl_1_data_463 = .data:0x00000463; // type:object size:0xB scope:local data:string +lbl_1_data_46E = .data:0x0000046E; // type:object size:0xB scope:local data:string +lbl_1_data_479 = .data:0x00000479; // type:object size:0xB scope:local data:string +lbl_1_data_484 = .data:0x00000484; // type:object size:0xB scope:local data:string +lbl_1_data_48F = .data:0x0000048F; // type:object size:0xB scope:local data:string +lbl_1_data_49A = .data:0x0000049A; // type:object size:0xB scope:local data:string +lbl_1_data_4A5 = .data:0x000004A5; // type:object size:0xB scope:local data:string +lbl_1_data_4B0 = .data:0x000004B0; // type:object size:0xB scope:local data:string +lbl_1_data_4BB = .data:0x000004BB; // type:object size:0xD scope:local data:string lbl_1_data_4C8 = .data:0x000004C8; // type:object size:0x28 data:4byte -lbl_1_data_4F0 = .data:0x000004F0; // type:object size:0x14 -lbl_1_data_504 = .data:0x00000504; // type:object size:0x24 +lbl_1_data_4F0 = .data:0x000004F0; // type:object size:0x14 data:byte +lbl_1_data_504 = .data:0x00000504; // type:object size:0x24 data:byte lbl_1_data_528 = .data:0x00000528; // type:object size:0x8 -lbl_1_data_530 = .data:0x00000530; // type:object size:0xB data:string -lbl_1_data_53B = .data:0x0000053B; // type:object size:0xB data:string -lbl_1_data_546 = .data:0x00000546; // type:object size:0xB data:string -lbl_1_data_551 = .data:0x00000551; // type:object size:0xB data:string -lbl_1_data_55C = .data:0x0000055C; // type:object size:0xB data:string -lbl_1_data_567 = .data:0x00000567; // type:object size:0xB data:string -lbl_1_data_572 = .data:0x00000572; // type:object size:0xB data:string -lbl_1_data_57D = .data:0x0000057D; // type:object size:0xB data:string -lbl_1_data_588 = .data:0x00000588; // type:object size:0xB data:string -lbl_1_data_593 = .data:0x00000593; // type:object size:0xB data:string -lbl_1_data_59E = .data:0x0000059E; // type:object size:0xB data:string -lbl_1_data_5A9 = .data:0x000005A9; // type:object size:0xB data:string -lbl_1_data_5B4 = .data:0x000005B4; // type:object size:0xB data:string -lbl_1_data_5BF = .data:0x000005BF; // type:object size:0xB data:string -lbl_1_data_5CA = .data:0x000005CA; // type:object size:0xB data:string -lbl_1_data_5D5 = .data:0x000005D5; // type:object size:0xB data:string -lbl_1_data_5E0 = .data:0x000005E0; // type:object size:0xB data:string +lbl_1_data_530 = .data:0x00000530; // type:object size:0xB scope:local data:string +lbl_1_data_53B = .data:0x0000053B; // type:object size:0xB scope:local data:string +lbl_1_data_546 = .data:0x00000546; // type:object size:0xB scope:local data:string +lbl_1_data_551 = .data:0x00000551; // type:object size:0xB scope:local data:string +lbl_1_data_55C = .data:0x0000055C; // type:object size:0xB scope:local data:string +lbl_1_data_567 = .data:0x00000567; // type:object size:0xB scope:local data:string +lbl_1_data_572 = .data:0x00000572; // type:object size:0xB scope:local data:string +lbl_1_data_57D = .data:0x0000057D; // type:object size:0xB scope:local data:string +lbl_1_data_588 = .data:0x00000588; // type:object size:0xB scope:local data:string +lbl_1_data_593 = .data:0x00000593; // type:object size:0xB scope:local data:string +lbl_1_data_59E = .data:0x0000059E; // type:object size:0xB scope:local data:string +lbl_1_data_5A9 = .data:0x000005A9; // type:object size:0xB scope:local data:string +lbl_1_data_5B4 = .data:0x000005B4; // type:object size:0xB scope:local data:string +lbl_1_data_5BF = .data:0x000005BF; // type:object size:0xB scope:local data:string +lbl_1_data_5CA = .data:0x000005CA; // type:object size:0xB scope:local data:string +lbl_1_data_5D5 = .data:0x000005D5; // type:object size:0xB scope:local data:string +lbl_1_data_5E0 = .data:0x000005E0; // type:object size:0xB scope:local data:string lbl_1_data_5EC = .data:0x000005EC; // type:object size:0x8B8 -lbl_1_data_EA4 = .data:0x00000EA4; // type:object size:0xB data:string -lbl_1_data_EAF = .data:0x00000EAF; // type:object size:0xB data:string -lbl_1_data_EBA = .data:0x00000EBA; // type:object size:0xB data:string -lbl_1_data_EC5 = .data:0x00000EC5; // type:object size:0xB data:string -lbl_1_data_ED0 = .data:0x00000ED0; // type:object size:0xC +lbl_1_data_EA4 = .data:0x00000EA4; // type:object size:0xB scope:local data:string +lbl_1_data_EAF = .data:0x00000EAF; // type:object size:0xB scope:local data:string +lbl_1_data_EBA = .data:0x00000EBA; // type:object size:0xB scope:local data:string +lbl_1_data_EC5 = .data:0x00000EC5; // type:object size:0xB scope:local data:string +lbl_1_data_ED0 = .data:0x00000ED0; // type:object size:0xC scope:local data:string lbl_1_data_EDC = .data:0x00000EDC; // type:object size:0x8B8 lbl_1_data_1794 = .data:0x00001794; // type:object size:0x20 lbl_1_data_17B4 = .data:0x000017B4; // type:object size:0x20 lbl_1_data_17D4 = .data:0x000017D4; // type:object size:0x20 data:float lbl_1_data_17F4 = .data:0x000017F4; // type:object size:0x20 lbl_1_data_1814 = .data:0x00001814; // type:object size:0x50 -lbl_1_data_1864 = .data:0x00001864; // type:object size:0x11 data:string -lbl_1_data_1875 = .data:0x00001875; // type:object size:0x11 data:string -lbl_1_data_1886 = .data:0x00001886; // type:object size:0x11 data:string -lbl_1_data_1897 = .data:0x00001897; // type:object size:0x18 data:string -lbl_1_data_18AF = .data:0x000018AF; // type:object size:0xB data:string -lbl_1_data_18BA = .data:0x000018BA; // type:object size:0x18 data:string -lbl_1_data_18D2 = .data:0x000018D2; // type:object size:0xC data:string -lbl_1_data_18DE = .data:0x000018DE; // type:object size:0x6 data:string -lbl_1_data_18E4 = .data:0x000018E4; // type:object size:0x21 data:string -lbl_1_data_1905 = .data:0x00001905; // type:object size:0x1F +lbl_1_data_1864 = .data:0x00001864; // type:object size:0x11 scope:local data:string +lbl_1_data_1875 = .data:0x00001875; // type:object size:0x11 scope:local data:string +lbl_1_data_1886 = .data:0x00001886; // type:object size:0x11 scope:local data:string +lbl_1_data_1897 = .data:0x00001897; // type:object size:0x18 scope:local data:string +lbl_1_data_18AF = .data:0x000018AF; // type:object size:0xB scope:local data:string +lbl_1_data_18BA = .data:0x000018BA; // type:object size:0x18 scope:local data:string +lbl_1_data_18D2 = .data:0x000018D2; // type:object size:0xC scope:local data:string +lbl_1_data_18DE = .data:0x000018DE; // type:object size:0x6 scope:local data:string +lbl_1_data_18E4 = .data:0x000018E4; // type:object size:0x21 scope:local data:string +lbl_1_data_1905 = .data:0x00001905; // type:object size:0x1F scope:local data:string jumptable_1_data_1924 = .data:0x00001924; // type:object size:0x1C scope:local jumptable_1_data_1940 = .data:0x00001940; // type:object size:0x44 scope:local -lbl_1_data_1984 = .data:0x00001984; // type:object size:0xB data:string -lbl_1_data_198F = .data:0x0000198F; // type:object size:0x1D +lbl_1_data_1984 = .data:0x00001984; // type:object size:0xB scope:local data:string +lbl_1_data_198F = .data:0x0000198F; // type:object size:0x1D scope:local data:string jumptable_1_data_19AC = .data:0x000019AC; // type:object size:0x28 scope:local -lbl_1_data_19D4 = .data:0x000019D4; // type:object size:0x24 data:string +lbl_1_data_19D4 = .data:0x000019D4; // type:object size:0x24 scope:local data:string lbl_1_bss_0 = .bss:0x00000000; // type:object size:0x3F0 data:float lbl_1_bss_3F0 = .bss:0x000003F0; // type:object size:0x4 data:float lbl_1_bss_3F4 = .bss:0x000003F4; // type:object size:0x4 data:4byte @@ -333,7 +333,8 @@ lbl_1_bss_3FC = .bss:0x000003FC; // type:object size:0x4 data:4byte lbl_1_bss_400 = .bss:0x00000400; // type:object size:0x2 data:2byte lbl_1_bss_402 = .bss:0x00000402; // type:object size:0x2 data:2byte lbl_1_bss_404 = .bss:0x00000404; // type:object size:0x2 data:2byte -lbl_1_bss_408 = .bss:0x00000408; // type:object size:0x8 data:4byte +lbl_1_bss_408 = .bss:0x00000408; // type:object size:0x4 data:4byte +lbl_1_bss_40C = .bss:0x0000040C; // type:object size:0x4 data:4byte lbl_1_bss_410 = .bss:0x00000410; // type:object size:0x4 data:4byte lbl_1_bss_414 = .bss:0x00000414; // type:object size:0x4 data:4byte lbl_1_bss_418 = .bss:0x00000418; // type:object size:0x4 data:4byte diff --git a/configure.py b/configure.py index 339a9dfe..56ea295c 100644 --- a/configure.py +++ b/configure.py @@ -1065,7 +1065,7 @@ config.libs = [ Rel( "m432Dll", # Dungeon Duos objects={ - Object(NonMatching, "REL/m432Dll/main.c"), + Object(Matching, "REL/m432Dll/main.c"), }, ), Rel( diff --git a/include/REL/m432data.h b/include/REL/m432data.h new file mode 100644 index 00000000..1152d0c7 --- /dev/null +++ b/include/REL/m432data.h @@ -0,0 +1,1235 @@ +#ifndef M432DATA_H +#define M432DATA_H + +#include "datadir_enum.h" +#include "dolphin.h" +#include "game/hsfanim.h" + +typedef struct UnkM432DllBss0SubStruct { + char *unk_00; + char *unk_04; + s32 unk_08; + u32 unk_0C[2]; + u32 unk_14; + float unk_18; + float unk_1C; + Vec unk_20; + Vec unk_2C; + float unk_38; + float unk_3C; + s16 unk_40; + s32 unk_44; +} UnkM432DllBss0SubStruct; /* size = 0x48 */ + +typedef struct UnkM432DllData1794Struct { + float unk_00; + float unk_04; + float unk_08; + float unk_0C; + float unk_10; + float unk_14; + s32 unk_18; + s32 unk_1C; +} UnkM432DllData1794Struct; /* size = 0x20 */ + +s32 lbl_1_data_A0[2] = { 1, 2 }; +float lbl_1_data_A8[8] = { 0.0f, 0.0f, 318.0f, 480.0f, 322.0f, 0.0f, 318.0f, 480.0f }; +Vec lbl_1_data_C8 = { 0.0f, 1.0f, 0.0f }; +Vec lbl_1_data_D4 = { 0.0f, 3000.0f, 1000.0f }; +Vec lbl_1_data_E0 = { 0.0f, -3.0f, -1.0f }; +GXColor lbl_1_data_EC = { 0xFF, 0xFF, 0xFF, 0xFF }; +Vec lbl_1_data_F0 = { 0.0f, 5000.0f, 100.0f }; +Vec lbl_1_data_FC = { 0.0f, 0.0f, 0.0f }; + +s32 lbl_1_data_108[8][0xB] = { + { + DATA_MAKE_NUM(DATADIR_MARIOMOT, 0x00), + DATA_MAKE_NUM(DATADIR_MARIOMOT, 0x02), + DATA_MAKE_NUM(DATADIR_MARIOMOT, 0x03), + DATA_MAKE_NUM(DATADIR_MARIOMOT, 0x73), + DATA_MAKE_NUM(DATADIR_MARIOMOT, 0x74), + DATA_MAKE_NUM(DATADIR_MARIOMOT, 0x6A), + DATA_MAKE_NUM(DATADIR_MARIOMOT, 0x5B), + DATA_MAKE_NUM(DATADIR_MARIOMOT, 0x1D), + DATA_MAKE_NUM(DATADIR_MARIOMOT, 0x38), + DATA_MAKE_NUM(DATADIR_MARIOMOT, 0x6C), + DATA_MAKE_NUM(DATADIR_MARIOMOT, 0x72), + }, + { + DATA_MAKE_NUM(DATADIR_LUIGIMOT, 0x00), + DATA_MAKE_NUM(DATADIR_LUIGIMOT, 0x02), + DATA_MAKE_NUM(DATADIR_LUIGIMOT, 0x03), + DATA_MAKE_NUM(DATADIR_LUIGIMOT, 0x73), + DATA_MAKE_NUM(DATADIR_LUIGIMOT, 0x74), + DATA_MAKE_NUM(DATADIR_LUIGIMOT, 0x6A), + DATA_MAKE_NUM(DATADIR_LUIGIMOT, 0x5B), + DATA_MAKE_NUM(DATADIR_LUIGIMOT, 0x1D), + DATA_MAKE_NUM(DATADIR_LUIGIMOT, 0x38), + DATA_MAKE_NUM(DATADIR_LUIGIMOT, 0x6C), + DATA_MAKE_NUM(DATADIR_LUIGIMOT, 0x72), + }, + { + DATA_MAKE_NUM(DATADIR_PEACHMOT, 0x00), + DATA_MAKE_NUM(DATADIR_PEACHMOT, 0x02), + DATA_MAKE_NUM(DATADIR_PEACHMOT, 0x03), + DATA_MAKE_NUM(DATADIR_PEACHMOT, 0x73), + DATA_MAKE_NUM(DATADIR_PEACHMOT, 0x74), + DATA_MAKE_NUM(DATADIR_PEACHMOT, 0x6A), + DATA_MAKE_NUM(DATADIR_PEACHMOT, 0x5B), + DATA_MAKE_NUM(DATADIR_PEACHMOT, 0x1D), + DATA_MAKE_NUM(DATADIR_PEACHMOT, 0x38), + DATA_MAKE_NUM(DATADIR_PEACHMOT, 0x6C), + DATA_MAKE_NUM(DATADIR_PEACHMOT, 0x72), + }, + { + DATA_MAKE_NUM(DATADIR_YOSHIMOT, 0x00), + DATA_MAKE_NUM(DATADIR_YOSHIMOT, 0x02), + DATA_MAKE_NUM(DATADIR_YOSHIMOT, 0x03), + DATA_MAKE_NUM(DATADIR_YOSHIMOT, 0x73), + DATA_MAKE_NUM(DATADIR_YOSHIMOT, 0x74), + DATA_MAKE_NUM(DATADIR_YOSHIMOT, 0x6A), + DATA_MAKE_NUM(DATADIR_YOSHIMOT, 0x5B), + DATA_MAKE_NUM(DATADIR_YOSHIMOT, 0x1D), + DATA_MAKE_NUM(DATADIR_YOSHIMOT, 0x38), + DATA_MAKE_NUM(DATADIR_YOSHIMOT, 0x6C), + DATA_MAKE_NUM(DATADIR_YOSHIMOT, 0x72), + }, + { + DATA_MAKE_NUM(DATADIR_WARIOMOT, 0x00), + DATA_MAKE_NUM(DATADIR_WARIOMOT, 0x02), + DATA_MAKE_NUM(DATADIR_WARIOMOT, 0x03), + DATA_MAKE_NUM(DATADIR_WARIOMOT, 0x73), + DATA_MAKE_NUM(DATADIR_WARIOMOT, 0x74), + DATA_MAKE_NUM(DATADIR_WARIOMOT, 0x6A), + DATA_MAKE_NUM(DATADIR_WARIOMOT, 0x5B), + DATA_MAKE_NUM(DATADIR_WARIOMOT, 0x1D), + DATA_MAKE_NUM(DATADIR_WARIOMOT, 0x38), + DATA_MAKE_NUM(DATADIR_WARIOMOT, 0x6C), + DATA_MAKE_NUM(DATADIR_WARIOMOT, 0x72), + }, + { + DATA_MAKE_NUM(DATADIR_DONKEYMOT, 0x00), + DATA_MAKE_NUM(DATADIR_DONKEYMOT, 0x02), + DATA_MAKE_NUM(DATADIR_DONKEYMOT, 0x03), + DATA_MAKE_NUM(DATADIR_DONKEYMOT, 0x73), + DATA_MAKE_NUM(DATADIR_DONKEYMOT, 0x74), + DATA_MAKE_NUM(DATADIR_DONKEYMOT, 0x6A), + DATA_MAKE_NUM(DATADIR_DONKEYMOT, 0x5B), + DATA_MAKE_NUM(DATADIR_DONKEYMOT, 0x1D), + DATA_MAKE_NUM(DATADIR_DONKEYMOT, 0x38), + DATA_MAKE_NUM(DATADIR_DONKEYMOT, 0x6C), + DATA_MAKE_NUM(DATADIR_DONKEYMOT, 0x72), + }, + { + DATA_MAKE_NUM(DATADIR_DAISYMOT, 0x00), + DATA_MAKE_NUM(DATADIR_DAISYMOT, 0x02), + DATA_MAKE_NUM(DATADIR_DAISYMOT, 0x03), + DATA_MAKE_NUM(DATADIR_DAISYMOT, 0x73), + DATA_MAKE_NUM(DATADIR_DAISYMOT, 0x74), + DATA_MAKE_NUM(DATADIR_DAISYMOT, 0x6A), + DATA_MAKE_NUM(DATADIR_DAISYMOT, 0x5B), + DATA_MAKE_NUM(DATADIR_DAISYMOT, 0x1D), + DATA_MAKE_NUM(DATADIR_DAISYMOT, 0x38), + DATA_MAKE_NUM(DATADIR_DAISYMOT, 0x6C), + DATA_MAKE_NUM(DATADIR_DAISYMOT, 0x72), + }, + { + DATA_MAKE_NUM(DATADIR_WALUIGIMOT, 0x00), + DATA_MAKE_NUM(DATADIR_WALUIGIMOT, 0x02), + DATA_MAKE_NUM(DATADIR_WALUIGIMOT, 0x03), + DATA_MAKE_NUM(DATADIR_WALUIGIMOT, 0x73), + DATA_MAKE_NUM(DATADIR_WALUIGIMOT, 0x74), + DATA_MAKE_NUM(DATADIR_WALUIGIMOT, 0x6A), + DATA_MAKE_NUM(DATADIR_WALUIGIMOT, 0x5B), + DATA_MAKE_NUM(DATADIR_WALUIGIMOT, 0x1D), + DATA_MAKE_NUM(DATADIR_WALUIGIMOT, 0x38), + DATA_MAKE_NUM(DATADIR_WALUIGIMOT, 0x6C), + DATA_MAKE_NUM(DATADIR_WALUIGIMOT, 0x72), + }, +}; + +s32 lbl_1_data_268[8] = { 0, 1, 2, 3, 4, -1, -1, -1 }; + +s32 lbl_1_data_288[9] = { + DATA_MAKE_NUM(DATADIR_M432, 0x1F), + DATA_MAKE_NUM(DATADIR_M432, 0x20), + DATA_MAKE_NUM(DATADIR_M432, 0x21), + DATA_MAKE_NUM(DATADIR_M432, 0x22), + DATA_MAKE_NUM(DATADIR_M432, 0x23), + DATA_MAKE_NUM(DATADIR_M432, 0x24), + DATA_MAKE_NUM(DATADIR_M432, 0x25), + DATA_MAKE_NUM(DATADIR_M432, 0x26), + DATA_MAKE_NUM(DATADIR_M432, 0x27), +}; + +s32 lbl_1_data_2AC[9] = { 0, 8, -0x10, 4, 0, -4, -1, 0, 0 }; +s32 lbl_1_data_2D0[9] = { 0, 8, -0x10, 8, 0, -4, -1, 0, 0 }; +s32 lbl_1_data_2F4[9] = { 0, 8, -0x10, 7, 0, -4, -1, 0, 0 }; +s32 lbl_1_data_318[0xF] = { 1, 0, -0x10, 5, -0x18, -5, 2, 0, -5, 6, 0x18, -5, -1, 0, 0 }; +Vec lbl_1_data_354[2] = { { -1200.0f, 0.0f, 0.0f }, { -400.0f, 0.0f, 0.0f } }; +Vec lbl_1_data_36C[2] = { { 400.0f, 0.0f, 0.0f }, { 1200.0f, 0.0f, 0.0f } }; + +char *lbl_1_data_3DC[8] = { + "m432_00-o0", + "m432_00-o1", + "m432_00-o2", + "m432_00-o3", + "m432_00-o4", + "m432_00-o5", + "m432_00-o6", + "m432_00-o7", +}; + +char *lbl_1_data_440[6] = { + "m432_00-p0", + "m432_00-p1", + "m432_00-p2", + "m432_00-p3", + "m432_00-p4", + "m432_00-q0", +}; + +char *lbl_1_data_4C8[0xA] = { + "m432_00-r0", + "m432_00-r1", + "m432_00-r2", + "m432_00-r5", + "m432_00-r4", + "m432_00-r3", + "m432_00-r6", + "m432_00-r7", + "m432_00-r8", + "m432_00-s0", +}; + +u8 lbl_1_data_4F0[0x14] = { + 0, + 0, + 0, + 1, + 0xFF, + 0xFF, + 0xFF, + 0xFF, + 0xFF, + 0xFF, + 0xFF, + 0xFF, + 0xFF, + 0xFF, + 0xFF, + 0xFF, + 0, + 0, + 0, + 3, +}; + +u8 lbl_1_data_504[0x24] = { + 0, + 0, + 0, + 4, + 0, + 0, + 0, + 5, + 0, + 0, + 0, + 8, + 0xFF, + 0xFF, + 0xFF, + 0xFF, + 0, + 0, + 0, + 6, + 0, + 0, + 0, + 7, + 0xFF, + 0xFF, + 0xFF, + 0xFF, + 0xFF, + 0xFF, + 0xFF, + 0xFF, + 0xFF, + 0xFF, + 0xFF, + 0xFF, +}; + +s32 lbl_1_data_528[2] = { DATA_MAKE_NUM(DATADIR_M432, 0x05), DATA_MAKE_NUM(DATADIR_M432, 0x06) }; + +UnkM432DllBss0SubStruct lbl_1_data_5EC[0x1F] = { + { + "m432_00-i0", + NULL, + -1, + { 0, 0 }, + 0, + 0.0f, + 0.0f, + { 0.0f, 0.0f, 0.0f }, + { 0.0f, 0.0f, 0.0f }, + 0.0f, + 0.0f, + 0, + 0, + }, + { + "m432_00-b0", + "m432_00-a0", + 4, + { DATA_MAKE_NUM(DATADIR_M432, 0x0C), DATA_MAKE_NUM(DATADIR_M432, 0x0D) }, + 1, + 0.0f, + 0.0f, + { 0.0f, 0.0f, 0.0f }, + { 0.0f, 0.0f, 0.0f }, + 0.0f, + 0.0f, + 0, + 0, + }, + { + "m432_00-a1", + NULL, + 5, + { DATA_MAKE_NUM(DATADIR_M432, 0x0A), DATA_MAKE_NUM(DATADIR_M432, 0x0B) }, + 0x100, + 90.0f, + 150.0f, + { 0.0f, 0.0f, 0.0f }, + { 0.0f, 0.0f, 0.0f }, + 0.0f, + 0.0f, + 0, + 0, + }, + { + "m432_00-b2", + "m432_00-a2", + 6, + { DATA_MAKE_NUM(DATADIR_M432, 0x0C), DATA_MAKE_NUM(DATADIR_M432, 0x0D) }, + 1, + 0.0f, + 0.0f, + { 0.0f, 0.0f, 0.0f }, + { 0.0f, 0.0f, 0.0f }, + 0.0f, + 0.0f, + 0, + 0, + }, + { + "m432_00-a3", + NULL, + 7, + { DATA_MAKE_NUM(DATADIR_M432, 0x0A), DATA_MAKE_NUM(DATADIR_M432, 0x0B) }, + 0x100, + 90.0f, + 150.0f, + { 0.0f, 0.0f, 0.0f }, + { 0.0f, 0.0f, 0.0f }, + 0.0f, + 0.0f, + 0, + 0, + }, + { + "m432_00-c0", + NULL, + 0x10, + { DATA_MAKE_NUM(DATADIR_M432, 0x0E), DATA_MAKE_NUM(DATADIR_M432, 0x0F) }, + 0x400, + 90.0f, + 150.0f, + { 0.0f, 0.0f, 0.0f }, + { 0.0f, 0.0f, 0.0f }, + 0.0f, + 0.0f, + 0, + 0, + }, + { + "m432_00-c1", + NULL, + 0x11, + { DATA_MAKE_NUM(DATADIR_M432, 0x0E), DATA_MAKE_NUM(DATADIR_M432, 0x0F) }, + 0x400, + -90.0f, + 150.0f, + { 0.0f, 0.0f, 0.0f }, + { 0.0f, 0.0f, 0.0f }, + 0.0f, + 0.0f, + 0, + 0, + }, + { + "m432_00-d0", + NULL, + 0x14, + { DATA_MAKE_NUM(DATADIR_M432, 0x10), DATA_MAKE_NUM(DATADIR_M432, 0x11) }, + 0, + 0.0f, + 0.0f, + { 0.0f, 0.0f, 0.0f }, + { 0.0f, 0.0f, 0.0f }, + 0.0f, + 0.0f, + 0, + 0, + }, + { + "m432_00-c2", + NULL, + 0x12, + { DATA_MAKE_NUM(DATADIR_M432, 0x0E), DATA_MAKE_NUM(DATADIR_M432, 0x0F) }, + 0x200, + 90.0f, + 150.0f, + { 0.0f, 0.0f, 0.0f }, + { 0.0f, 0.0f, 0.0f }, + 0.0f, + 0.0f, + 0, + 0, + }, + { + "m432_00-c3", + NULL, + 0x13, + { DATA_MAKE_NUM(DATADIR_M432, 0x0E), DATA_MAKE_NUM(DATADIR_M432, 0x0F) }, + 0x200, + -90.0f, + 150.0f, + { 0.0f, 0.0f, 0.0f }, + { 0.0f, 0.0f, 0.0f }, + 0.0f, + 0.0f, + 0, + 0, + }, + { + "m432_00-d1", + NULL, + 0x15, + { DATA_MAKE_NUM(DATADIR_M432, 0x12), DATA_MAKE_NUM(DATADIR_M432, 0x13) }, + 0, + 0.0f, + 0.0f, + { 0.0f, 0.0f, 0.0f }, + { 0.0f, 0.0f, 0.0f }, + 0.0f, + 0.0f, + 0, + 0, + }, + { + "m432_00-p0", + "m432_00-q0", + -1, + { 0, 0 }, + 2, + 0.0f, + 0.0f, + { 0.0f, 0.0f, 0.0f }, + { 0.0f, 0.0f, 0.0f }, + 0.0f, + 0.0f, + 0, + 0, + }, + { + "m432_00-p1", + "m432_00-q0", + -1, + { 0, 0 }, + 2, + 0.0f, + 1.0f, + { 0.0f, 0.0f, 0.0f }, + { 0.0f, 0.0f, 0.0f }, + 0.0f, + 0.0f, + 0, + 0, + }, + { + "m432_00-p2", + "m432_00-q0", + -1, + { 0, 0 }, + 2, + 0.0f, + 2.0f, + { 0.0f, 0.0f, 0.0f }, + { 0.0f, 0.0f, 0.0f }, + 0.0f, + 0.0f, + 0, + 0, + }, + { + "m432_00-p3", + "m432_00-q0", + -1, + { 0, 0 }, + 2, + 0.0f, + 3.0f, + { 0.0f, 0.0f, 0.0f }, + { 0.0f, 0.0f, 0.0f }, + 0.0f, + 0.0f, + 0, + 0, + }, + { + "m432_00-p4", + "m432_00-q0", + -1, + { 0, 0 }, + 2, + 0.0f, + 4.0f, + { 0.0f, 0.0f, 0.0f }, + { 0.0f, 0.0f, 0.0f }, + 0.0f, + 0.0f, + 0, + 0, + }, + { + "m432_00-q0", + NULL, + -1, + { 0, 0 }, + 8, + 0.0f, + 0.0f, + { 0.0f, 0.0f, 0.0f }, + { 0.0f, 0.0f, 0.0f }, + 0.0f, + 0.0f, + 0, + 0, + }, + { + "m432_00-r0", + "m432_00-s0", + -1, + { 0, 0 }, + 4, + 0.0f, + 0.0f, + { 0.0f, 0.0f, 0.0f }, + { 0.0f, 0.0f, 0.0f }, + 0.0f, + 0.0f, + 0, + 0, + }, + { + "m432_00-r1", + "m432_00-s0", + -1, + { 0, 0 }, + 4, + 0.0f, + 1.0f, + { 0.0f, 0.0f, 0.0f }, + { 0.0f, 0.0f, 0.0f }, + 0.0f, + 0.0f, + 0, + 0, + }, + { + "m432_00-r2", + "m432_00-s0", + -1, + { 0, 0 }, + 4, + 0.0f, + 2.0f, + { 0.0f, 0.0f, 0.0f }, + { 0.0f, 0.0f, 0.0f }, + 0.0f, + 0.0f, + 0, + 0, + }, + { + "m432_00-r5", + "m432_00-s0", + -1, + { 0, 0 }, + 4, + 0.0f, + 3.0f, + { 0.0f, 0.0f, 0.0f }, + { 0.0f, 0.0f, 0.0f }, + 0.0f, + 0.0f, + 0, + 0, + }, + { + "m432_00-r4", + "m432_00-s0", + -1, + { 0, 0 }, + 4, + 0.0f, + 4.0f, + { 0.0f, 0.0f, 0.0f }, + { 0.0f, 0.0f, 0.0f }, + 0.0f, + 0.0f, + 0, + 0, + }, + { + "m432_00-r3", + "m432_00-s0", + -1, + { 0, 0 }, + 4, + 0.0f, + 5.0f, + { 0.0f, 0.0f, 0.0f }, + { 0.0f, 0.0f, 0.0f }, + 0.0f, + 0.0f, + 0, + 0, + }, + { + "m432_00-r6", + "m432_00-s0", + -1, + { 0, 0 }, + 4, + 0.0f, + 6.0f, + { 0.0f, 0.0f, 0.0f }, + { 0.0f, 0.0f, 0.0f }, + 0.0f, + 0.0f, + 0, + 0, + }, + { + "m432_00-r7", + "m432_00-s0", + -1, + { 0, 0 }, + 4, + 0.0f, + 7.0f, + { 0.0f, 0.0f, 0.0f }, + { 0.0f, 0.0f, 0.0f }, + 0.0f, + 0.0f, + 0, + 0, + }, + { + "m432_00-r8", + "m432_00-s0", + -1, + { 0, 0 }, + 4, + 0.0f, + 8.0f, + { 0.0f, 0.0f, 0.0f }, + { 0.0f, 0.0f, 0.0f }, + 0.0f, + 0.0f, + 0, + 0, + }, + { + "m432_00-s0", + NULL, + -1, + { 0, 0 }, + 0x10, + 0.0f, + 0.0f, + { 0.0f, 0.0f, 0.0f }, + { 0.0f, 0.0f, 0.0f }, + 0.0f, + 0.0f, + 0, + 0, + }, + { + "m432_00-e0", + NULL, + 8, + { DATA_MAKE_NUM(DATADIR_M432, 0x14), DATA_MAKE_NUM(DATADIR_M432, 0x15) }, + 0x800, + 180.0f, + 120.0f, + { 0.0f, 0.0f, 0.0f }, + { 0.0f, 0.0f, 0.0f }, + 0.0f, + 0.0f, + 0, + 0, + }, + { + "m432_00-j0", + NULL, + 9, + { DATA_MAKE_NUM(DATADIR_M432, 0x18), DATA_MAKE_NUM(DATADIR_M432, 0x19) }, + 0, + 0.0f, + 0.0f, + { 0.0f, 0.0f, 0.0f }, + { 0.0f, 0.0f, 0.0f }, + 0.0f, + 0.0f, + 0, + 0, + }, + { + "m432_00-h0", + NULL, + 0x16, + { DATA_MAKE_NUM(DATADIR_M432, 0x16), DATA_MAKE_NUM(DATADIR_M432, 0x17) }, + 0, + 0.0f, + 0.0f, + { 0.0f, 0.0f, 0.0f }, + { 0.0f, 0.0f, 0.0f }, + 0.0f, + 0.0f, + 0, + 0, + }, + { + "m432_00-t0", + NULL, + 0x17, + { DATA_MAKE_NUM(DATADIR_M432, 0x1C), DATA_MAKE_NUM(DATADIR_M432, 0x1D) }, + 0, + 0.0f, + 0.0f, + { 0.0f, 0.0f, 0.0f }, + { 0.0f, 0.0f, 0.0f }, + 0.0f, + 0.0f, + 0, + 0, + }, +}; + +UnkM432DllBss0SubStruct lbl_1_data_EDC[0x1F] = { + { + "m432_00-i1", + NULL, + -1, + { 0, 0 }, + 0, + 0.0f, + 0.0f, + { 0.0f, 0.0f, 0.0f }, + { 0.0f, 0.0f, 0.0f }, + 0.0f, + 0.0f, + 0, + 0, + }, + { + "m432_00-a0", + NULL, + 0xA, + { DATA_MAKE_NUM(DATADIR_M432, 0x0A), DATA_MAKE_NUM(DATADIR_M432, 0x0B) }, + 0x100, + -90.0f, + 150.0f, + { 0.0f, 0.0f, 0.0f }, + { 0.0f, 0.0f, 0.0f }, + 0.0f, + 0.0f, + 0, + 0, + }, + { + "m432_00-b1", + "m432_00-a1", + 0xB, + { DATA_MAKE_NUM(DATADIR_M432, 0x0C), DATA_MAKE_NUM(DATADIR_M432, 0x0D) }, + 1, + 0.0f, + 0.0f, + { 0.0f, 0.0f, 0.0f }, + { 0.0f, 0.0f, 0.0f }, + 0.0f, + 0.0f, + 0, + 0, + }, + { + "m432_00-a2", + NULL, + 0xC, + { DATA_MAKE_NUM(DATADIR_M432, 0x0A), DATA_MAKE_NUM(DATADIR_M432, 0x0B) }, + 0x100, + -90.0f, + 150.0f, + { 0.0f, 0.0f, 0.0f }, + { 0.0f, 0.0f, 0.0f }, + 0.0f, + 0.0f, + 0, + 0, + }, + { + "m432_00-b3", + "m432_00-a3", + 0xD, + { DATA_MAKE_NUM(DATADIR_M432, 0x0C), DATA_MAKE_NUM(DATADIR_M432, 0x0D) }, + 1, + 0.0f, + 0.0f, + { 0.0f, 0.0f, 0.0f }, + { 0.0f, 0.0f, 0.0f }, + 0.0f, + 0.0f, + 0, + 0, + }, + { + "m432_00-c0", + NULL, + 0x10, + { 0, 0 }, + 0x400, + 90.0f, + 150.0f, + { 0.0f, 0.0f, 0.0f }, + { 0.0f, 0.0f, 0.0f }, + 0.0f, + 0.0f, + 0, + 0, + }, + { + "m432_00-c1", + NULL, + 0x11, + { 0, 0 }, + 0x400, + -90.0f, + 150.0f, + { 0.0f, 0.0f, 0.0f }, + { 0.0f, 0.0f, 0.0f }, + 0.0f, + 0.0f, + 0, + 0, + }, + { + "m432_00-d0", + NULL, + 0x14, + { 0, 0 }, + 0, + 0.0f, + 0.0f, + { 0.0f, 0.0f, 0.0f }, + { 0.0f, 0.0f, 0.0f }, + 0.0f, + 0.0f, + 0, + 0, + }, + { + "m432_00-c2", + NULL, + 0x12, + { 0, 0 }, + 0x200, + 90.0f, + 150.0f, + { 0.0f, 0.0f, 0.0f }, + { 0.0f, 0.0f, 0.0f }, + 0.0f, + 0.0f, + 0, + 0, + }, + { + "m432_00-c3", + NULL, + 0x13, + { 0, 0 }, + 0x200, + -90.0f, + 150.0f, + { 0.0f, 0.0f, 0.0f }, + { 0.0f, 0.0f, 0.0f }, + 0.0f, + 0.0f, + 0, + 0, + }, + { + "m432_00-d1", + NULL, + 0x15, + { 0, 0 }, + 0, + 0.0f, + 0.0f, + { 0.0f, 0.0f, 0.0f }, + { 0.0f, 0.0f, 0.0f }, + 0.0f, + 0.0f, + 0, + 0, + }, + { + "m432_00-p0", + "m432_00-q0", + -1, + { 0, 0 }, + 2, + 0.0f, + 0.0f, + { 0.0f, 0.0f, 0.0f }, + { 0.0f, 0.0f, 0.0f }, + 0.0f, + 0.0f, + 0, + 0, + }, + { + "m432_00-p1", + "m432_00-q0", + -1, + { 0, 0 }, + 2, + 0.0f, + 1.0f, + { 0.0f, 0.0f, 0.0f }, + { 0.0f, 0.0f, 0.0f }, + 0.0f, + 0.0f, + 0, + 0, + }, + { + "m432_00-p2", + "m432_00-q0", + -1, + { 0, 0 }, + 2, + 0.0f, + 2.0f, + { 0.0f, 0.0f, 0.0f }, + { 0.0f, 0.0f, 0.0f }, + 0.0f, + 0.0f, + 0, + 0, + }, + { + "m432_00-p3", + "m432_00-q0", + -1, + { 0, 0 }, + 2, + 0.0f, + 3.0f, + { 0.0f, 0.0f, 0.0f }, + { 0.0f, 0.0f, 0.0f }, + 0.0f, + 0.0f, + 0, + 0, + }, + { + "m432_00-p4", + "m432_00-q0", + -1, + { 0, 0 }, + 2, + 0.0f, + 4.0f, + { 0.0f, 0.0f, 0.0f }, + { 0.0f, 0.0f, 0.0f }, + 0.0f, + 0.0f, + 0, + 0, + }, + { + "m432_00-q0", + NULL, + -1, + { 0, 0 }, + 8, + 0.0f, + 0.0f, + { 0.0f, 0.0f, 0.0f }, + { 0.0f, 0.0f, 0.0f }, + 0.0f, + 0.0f, + 0, + 0, + }, + { + "m432_00-r0", + "m432_00-s0", + -1, + { 0, 0 }, + 4, + 0.0f, + 0.0f, + { 0.0f, 0.0f, 0.0f }, + { 0.0f, 0.0f, 0.0f }, + 0.0f, + 0.0f, + 0, + 0, + }, + { + "m432_00-r1", + "m432_00-s0", + -1, + { 0, 0 }, + 4, + 0.0f, + 1.0f, + { 0.0f, 0.0f, 0.0f }, + { 0.0f, 0.0f, 0.0f }, + 0.0f, + 0.0f, + 0, + 0, + }, + { + "m432_00-r2", + "m432_00-s0", + -1, + { 0, 0 }, + 4, + 0.0f, + 2.0f, + { 0.0f, 0.0f, 0.0f }, + { 0.0f, 0.0f, 0.0f }, + 0.0f, + 0.0f, + 0, + 0, + }, + { + "m432_00-r5", + "m432_00-s0", + -1, + { 0, 0 }, + 4, + 0.0f, + 3.0f, + { 0.0f, 0.0f, 0.0f }, + { 0.0f, 0.0f, 0.0f }, + 0.0f, + 0.0f, + 0, + 0, + }, + { + "m432_00-r4", + "m432_00-s0", + -1, + { 0, 0 }, + 4, + 0.0f, + 4.0f, + { 0.0f, 0.0f, 0.0f }, + { 0.0f, 0.0f, 0.0f }, + 0.0f, + 0.0f, + 0, + 0, + }, + { + "m432_00-r3", + "m432_00-s0", + -1, + { 0, 0 }, + 4, + 0.0f, + 5.0f, + { 0.0f, 0.0f, 0.0f }, + { 0.0f, 0.0f, 0.0f }, + 0.0f, + 0.0f, + 0, + 0, + }, + { + "m432_00-r6", + "m432_00-s0", + -1, + { 0, 0 }, + 4, + 0.0f, + 6.0f, + { 0.0f, 0.0f, 0.0f }, + { 0.0f, 0.0f, 0.0f }, + 0.0f, + 0.0f, + 0, + 0, + }, + { + "m432_00-r7", + "m432_00-s0", + -1, + { 0, 0 }, + 4, + 0.0f, + 7.0f, + { 0.0f, 0.0f, 0.0f }, + { 0.0f, 0.0f, 0.0f }, + 0.0f, + 0.0f, + 0, + 0, + }, + { + "m432_00-r8", + "m432_00-s0", + -1, + { 0, 0 }, + 4, + 0.0f, + 8.0f, + { 0.0f, 0.0f, 0.0f }, + { 0.0f, 0.0f, 0.0f }, + 0.0f, + 0.0f, + 0, + 0, + }, + { + "m432_00-s0", + NULL, + -1, + { 0, 0 }, + 0x10, + 0.0f, + 0.0f, + { 0.0f, 0.0f, 0.0f }, + { 0.0f, 0.0f, 0.0f }, + 0.0f, + 0.0f, + 0, + 0, + }, + { + "m432_00-e1", + NULL, + 0xE, + { DATA_MAKE_NUM(DATADIR_M432, 0x14), DATA_MAKE_NUM(DATADIR_M432, 0x15) }, + 0x800, + 180.0f, + 120.0f, + { 0.0f, 0.0f, 0.0f }, + { 0.0f, 0.0f, 0.0f }, + 0.0f, + 0.0f, + 0, + 0, + }, + { + "m432_00-k0", + NULL, + 0xF, + { DATA_MAKE_NUM(DATADIR_M432, 0x1A), DATA_MAKE_NUM(DATADIR_M432, 0x1B) }, + 0, + 0.0f, + 0.0f, + { 0.0f, 0.0f, 0.0f }, + { 0.0f, 0.0f, 0.0f }, + 0.0f, + 0.0f, + 0, + 0, + }, + { + "m432_00-h0", + NULL, + 0x16, + { 0, 0 }, + 0, + 0.0f, + 0.0f, + { 0.0f, 0.0f, 0.0f }, + { 0.0f, 0.0f, 0.0f }, + 0.0f, + 0.0f, + 0, + 0, + }, + { + "m432_00-t0", + NULL, + 0x17, + { 0, 0 }, + 0, + 0.0f, + 0.0f, + { 0.0f, 0.0f, 0.0f }, + { 0.0f, 0.0f, 0.0f }, + 0.0f, + 0.0f, + 0, + 0, + }, +}; + +UnkM432DllData1794Struct lbl_1_data_1794 = { 6300.0f, 0.7f, 10.0f, 0.4f, 1.0f, 0, 2, 6 }; +UnkM432DllData1794Struct lbl_1_data_17B4 = { 5700.0f, 0.8f, 8.0f, 0.6f, 1.0f, 0, 4, 5 }; +UnkM432DllData1794Struct lbl_1_data_17D4 = { 5100.0f, 0.9f, 6.0f, 0.8f, 1.0f, 0, 6, 4 }; +UnkM432DllData1794Struct lbl_1_data_17F4 = { 4500.0f, 1.0f, 4.0f, 1.0f, 1.0f, 0, 8, 3 }; +HsfanimStruct00 lbl_1_data_1814 = { + 0x1E, + { 0, 0 }, + 1.0f, + 50.0f, + 360.0f, + { 0.0f, 0.1f, 0.0f }, + 1.0f, + 1.0f, + 30.0f, + 1.1f, + 4, + { + { 0xF0, 0xD0, 0xB0, 0xFF }, + { 0xE0, 0xC0, 0xA0, 0xFF }, + { 0xD0, 0xB0, 0x90, 0xFF }, + { 0xC0, 0xA0, 0x80, 0xFF }, + }, + { + { 0xF0, 0xD0, 0xB0, 0 }, + { 0xE0, 0xC0, 0xA0, 0 }, + { 0xD0, 0xB0, 0x90, 0 }, + { 0xC0, 0xA0, 0x80, 0 }, + }, +}; + +#endif diff --git a/src/REL/m432Dll/main.c b/src/REL/m432Dll/main.c index 117d8d64..18d7f523 100644 --- a/src/REL/m432Dll/main.c +++ b/src/REL/m432Dll/main.c @@ -1,11 +1,14 @@ #include "REL/executor.h" +#include "dolphin/types.h" #include "game/chrman.h" #include "game/frand.h" +#include "game/memory.h" #include "game/minigame_seq.h" #include "game/object.h" #include "game/objsub.h" #include "game/wipe.h" +#include "game/gamework.h" #include "game/gamework_data.h" #include "game/mapspace.h" @@ -21,7 +24,15 @@ #include "game/sprite.h" #include "ext_math.h" -#include "rel_sqrt_consts.h" + +#include "string.h" + +#ifndef __MWERKS__ +#include "game/audio.h" +#include "game/hsfex.h" + +void HuSysVWaitSet(s16 vcount); +#endif #undef ABS #define ABS(x) ((0 > (x)) ? -(x) : (x)) @@ -56,7 +67,7 @@ Vec lbl_1_bss_590; Vec lbl_1_bss_584; u32 lbl_1_bss_580; s32 lbl_1_bss_57C; -u32 lbl_1_bss_578; +u32 lbl_1_bss_578; // TODO maybe array? s16 lbl_1_bss_576; s16 lbl_1_bss_574; s32 lbl_1_bss_570; @@ -403,9 +414,9 @@ void fn_1_1D70(s16 arg0, char *arg1, Vec *arg2, Mtx arg3) var_r30 = &Hu3DData[arg0]; Hu3DModelObjMtxGet(arg0, arg1, spC); - PSMTXConcat(var_r30->unk_F0, spC, spC); + MTXConcat(var_r30->unk_F0, spC, spC); if (NULL != arg3) { - PSMTXCopy(spC, arg3); + MTXCopy(spC, arg3); } arg2->x = spC[0][3]; arg2->y = spC[1][3]; @@ -433,7 +444,7 @@ float fn_1_1E20(float arg0, float arg1, float arg2) void fn_1_1F24(s32 arg0) { - lbl_1_bss_570 = HuAudSeqPlay((s32)arg0); + lbl_1_bss_570 = HuAudSeqPlay(arg0); } void fn_1_1F58(s32 arg0) @@ -477,4 +488,3288 @@ void fn_1_1FC4(Vec *arg0, float *arg1, s32 arg2, s32 arg3) } } VECAdd((Vec *)&arg0, &sp18, (Vec *)&arg0); -} \ No newline at end of file +} + +s16 lbl_1_data_0[8] = { 0, 1, 2, 3, 4, 5, 6, 7 }; +s32 lbl_1_data_10[8] = { 0, 1, 2, 3, 4, 5, 6, 7 }; +float lbl_1_data_30[0xA] = { 70.0f, 70.0f, 70.0f, 70.0f, 70.0f, 70.0f, 70.0f, 70.0f, 70.0f, 100.0f }; +float lbl_1_data_58[0xA] = { + 150.0f, + 170.0f, + 190.0f, + 170.0f, + 160.0f, + 150.0f, + 180.0f, + 200.0f, + 150.0f, + 200.0f, +}; + +// these are copied from m461Dll/main.c +typedef void (*PlayerOldHook)(omObjData *obj); +typedef Vec *(*PlayerOldPosHook)(omObjData *obj); + +typedef struct work_playerold { + omObjData *unk_00; + PlayerOldHook unk_04; + PlayerOldPosHook unk_08; + PlayerOldHook unk_0C; + PlayerOldHook unk_10; + s32 *unk_14; + s32 unk_18; + s32 unk_1C; + s32 unk_20; + s32 unk_24; + s32 unk_28; + s32 unk_2C; + s32 unk_30; + s32 unk_34; + s32 unk_38; + s32 unk_3C; + s32 unk_40; + s32 unk_44; + s32 unk_48; + s32 unk_4C; + Vec *unk_50; + Vec unk_54; + float unk_60; + s32 unk_64; + Vec *unk_68; + Vec unk_6C; + Vec unk_78; + Vec unk_84; + Vec unk_90; + float unk_9C; + float unk_A0; + float unk_A4; + float unk_A8; + Vec unk_AC; + float unk_B8; + float unk_BC; + float unk_C0; +} WorkPlayerOld; + +typedef WorkPlayerOld *(*PlayerOldFind)(int no); + +PlayerOldFind lbl_1_bss_424; +float lbl_1_bss_420; + +void fn_1_23B4(WorkPlayerOld *player) +{ + s32 i; + for (i = 0; i < 8; i++) { + if (player->unk_44 == player->unk_14[i]) { + player->unk_40 = lbl_1_data_10[i]; + return; + } + } + player->unk_40 = -1; +} + +void fn_1_2418(float *minDist, s32 *state, s32 stateNew, Vec *posA, float aYOfs, Vec *posB, float bYOfs) +{ + Vec pointA = *posA; + Vec pointB = *posB; + float dist; + pointA.y += aYOfs; + pointB.y += bYOfs; + dist = VECDistance(&pointA, &pointB); + if (*minDist > dist) { + *minDist = dist; + *state = stateNew; + } +} + +void fn_1_24F8(WorkPlayerOld *player1, WorkPlayerOld *player2, float *minDist, s32 *state) +{ + *minDist = 10 * (player1->unk_BC + player2->unk_BC); + fn_1_2418(minDist, state, 0, &player1->unk_6C, player1->unk_BC, &player2->unk_6C, player2->unk_BC); + fn_1_2418(minDist, state, 1, &player1->unk_6C, player1->unk_C0 - player1->unk_BC, &player2->unk_6C, player2->unk_C0 - player2->unk_BC); + fn_1_2418(minDist, state, 2, &player1->unk_6C, player1->unk_BC, &player2->unk_6C, player2->unk_C0 - player2->unk_BC); + fn_1_2418(minDist, state, 3, &player1->unk_6C, player1->unk_C0 - player1->unk_BC, &player2->unk_6C, player2->unk_BC); +} + +s32 fn_1_2824(WorkPlayerOld *player, WorkPlayerOld *player2) +{ + Vec dir; + Vec dir2; + float dist; + + player->unk_3C |= 0x1; + player->unk_90.x = player->unk_20 / 4.0f; + player->unk_90.z = -(float)player->unk_24 / 4.0f; + if (player->unk_90.x != 0.0f || player->unk_90.z != 0.0f) { + return; + } + VECSubtract(&player->unk_6C, &player2->unk_6C, &dir); + dist = VECMagXZ(&dir); + if (0.0f == dist) { + dir.x = 0; + dir.z = -1; + } + else { + dir.x /= dist; + dir.z /= dist; + } + VECSubtract(&player->unk_6C, &player->unk_78, &dir2); + dist = VECMagXZ(&dir2); + if (5 > dist) { + dist = 5; + } + player->unk_90.x = dir.x * dist; + player->unk_90.z = dir.z * dist; +} + +void fn_1_2BD0(WorkPlayerOld *player, float arg1, float arg2) +{ + player->unk_38 = 1; + player->unk_84.y = arg1; + player->unk_A4 = arg2; + if (player->unk_3C & 0x2) { + player->unk_3C &= ~0x2; + } +} + +void fn_1_2C00(PlayerOldFind find, float yDist) +{ + lbl_1_bss_424 = find; + lbl_1_bss_420 = yDist; +} + +void fn_1_2C1C(WorkPlayerOld *player, omObjData *obj, s32 arg2, s32 arg3, s32 *arg4, s32 arg5, Vec *pos, float arg7) +{ + player->unk_00 = obj; + player->unk_18 = arg2; + player->unk_1C = arg3; + player->unk_14 = arg4; + player->unk_04 = NULL; + player->unk_08 = NULL; + player->unk_0C = NULL; + player->unk_10 = NULL; + player->unk_50 = NULL; + player->unk_64 = 0; + player->unk_68 = 0; + player->unk_38 = 0; + player->unk_3C = 0; + player->unk_44 = arg5; + player->unk_48 = 0; + player->unk_4C = 0; + fn_1_23B4(player); + player->unk_9C = arg7; + player->unk_6C = *pos; + player->unk_78 = *pos; + player->unk_84.x = 0; + player->unk_84.y = 0; + player->unk_84.z = 0; + player->unk_B8 = 1; + player->unk_A8 = 0; + player->unk_BC = lbl_1_data_30[player->unk_1C]; + player->unk_C0 = lbl_1_data_58[player->unk_1C]; +} + +void fn_1_2DA8(WorkPlayerOld *player, PlayerOldHook func) +{ + player->unk_04 = func; +} + +void fn_1_2DB0(WorkPlayerOld *player, PlayerOldPosHook func) +{ + player->unk_08 = func; +} + +void fn_1_2DB8(WorkPlayerOld *player, PlayerOldHook func) +{ + player->unk_0C = func; +} + +void fn_1_2DC0(WorkPlayerOld *player, PlayerOldHook func) +{ + player->unk_10 = func; +} + +void fn_1_2DC8(WorkPlayerOld *player, s32 count, Vec *data) +{ + player->unk_64 = count; + player->unk_68 = data; +} + +void fn_1_2DD4(WorkPlayerOld *player) +{ + omSetTra(player->unk_00, player->unk_6C.x, player->unk_6C.y, player->unk_6C.z); + omSetRot(player->unk_00, 0.0f, player->unk_9C, 0.0f); +} + +void fn_1_2E34(WorkPlayerOld *player) +{ + BOOL addTime; + s32 i; + player->unk_3C &= ~0x100; + if (player->unk_3C & 0x8) { + return; + } + if (NULL == lbl_1_bss_424) { + return; + } + addTime = FALSE; + for (i = 0; i < 4; i++) { + WorkPlayerOld *player2 = lbl_1_bss_424(i); + BOOL fixPos; + float minDist; + s32 state; + if (player == player2) { + continue; + } + if (player2->unk_3C & 0x8) { + continue; + } + fixPos = FALSE; + fn_1_24F8(player, player2, &minDist, &state); + if (minDist < player->unk_BC + player2->unk_BC) { + if (state < 2) { + fixPos = TRUE; + if (player->unk_38 == 1) { + fn_1_2824(player, player2); + } + } + else { + if (state == 2 && player->unk_38 == 1) { + fn_1_2824(player, player2); + player->unk_3C |= 0x100; + player->unk_A4 = 0; + if (!(player2->unk_3C & 0x100)) { + player->unk_84.y = 26.766666f; + } + } + if (state == 3) { + fixPos = TRUE; + if (player->unk_38 == 1) { + if (0.0f < player->unk_84.y) { + player->unk_84.y = 0.0f; + } + player->unk_A4 = 0; + } + } + } + } + if (fixPos) { + Vec dir; + addTime = TRUE; + VECSubtract(&player->unk_6C, &player2->unk_6C, &dir); + if (0.0f == minDist) { + dir.x = 0; + dir.z = -1; + } + else { + dir.x /= minDist; + dir.z /= minDist; + } + player->unk_6C.x = player2->unk_6C.x + (dir.x * (player->unk_BC + player2->unk_BC)); + player->unk_6C.z = player2->unk_6C.z + (dir.z * (player->unk_BC + player2->unk_BC)); + } + } + if (addTime) { + player->unk_4C++; + } + else { + player->unk_4C = 0; + } +} + +float fn_1_39C4(WorkPlayerOld *player, float arg2) +{ + Vec *pos; + s32 i; + AddX = 0.0f; + AddZ = 0.0f; + MapWall(player->unk_BC, player->unk_6C.x, arg2 + player->unk_BC, player->unk_6C.z); + player->unk_6C.x += AddX; + player->unk_6C.z += AddZ; + if (NULL != player->unk_68) { + for (pos = player->unk_68, i = 0; i < player->unk_64; i++, pos += 2) { + int num = 0; + if (pos[0].x == pos[1].x || pos[0].x > player->unk_6C.x || pos[1].x < player->unk_6C.x) { + num++; + } + if (pos[0].y == pos[1].y || pos[0].y > player->unk_6C.y || pos[1].y < player->unk_6C.y) { + num++; + } + if (pos[0].z == pos[1].z || pos[0].z > player->unk_6C.z || pos[1].z < player->unk_6C.z) { + num++; + } + if (num == 3) { + if (pos[0].x != pos[1].x) { + if (pos[0].x > player->unk_6C.x) { + player->unk_6C.x = pos[0].x + player->unk_BC; + } + if (pos[1].x < player->unk_6C.x) { + player->unk_6C.x = pos[1].x - player->unk_BC; + } + } + if (pos[0].y != pos[1].y) { + if (pos[0].y > player->unk_6C.y) { + player->unk_6C.y = pos[0].y; + } + if (pos[1].y < player->unk_6C.y) { + player->unk_6C.y = pos[1].y; + } + } + if (pos[0].z != pos[1].z) { + if (pos[0].z > player->unk_6C.z) { + player->unk_6C.z = pos[0].z + player->unk_BC; + } + if (pos[1].z < player->unk_6C.z) { + player->unk_6C.z = pos[1].z - player->unk_BC; + } + } + } + } + } + return ABS(AddX) + ABS(AddZ); +} + +void fn_1_3CE0(WorkPlayerOld *player, s32 *state, u32 *motAttr) +{ + *motAttr = HU3D_MOTATTR_LOOP; + *state = 0; + if (0.5f <= player->unk_A0) { + if (7.0f <= player->unk_A0) { + *state = 2; + } + else { + *state = 1; + } + } + + if (player->unk_14[3] >= 0 && (player->unk_28 & 0x100)) { + fn_1_2BD0(player, 26.766666f, 1); + *motAttr = HU3D_MOTATTR_NONE; + *state = 3; + } +} + +void fn_1_3DB8(WorkPlayerOld *player, s32 *state, u32 *motAttr) +{ + if (0.0f < player->unk_A4) { + if (player->unk_2C & 0x100) { + player->unk_A4++; + if (4.0f < player->unk_A4) { + player->unk_A4 = 0; + } + else { + player->unk_84.y += 3.65f; + } + } + else { + player->unk_A4 = 0; + } + } + player->unk_84.y += -2.4333334f; + if (player->unk_14[5] >= 0 && (player->unk_28 & 0x140)) { + player->unk_38 = 3; + player->unk_84.y = 0; + player->unk_3C &= ~0x3; + player->unk_3C |= 0x4; + *motAttr = HU3D_MOTATTR_NONE; + *state = 5; + } +} + +void fn_1_3ECC(WorkPlayerOld *player, s32 *state, u32 *motAttr) +{ + if ((player->unk_3C & 0x1000) || Hu3DMotionEndCheck(player->unk_00->model[0])) { + player->unk_3C &= ~0x3; + if (player->unk_40 == 6) { + player->unk_38 = 4; + *motAttr = HU3D_MOTATTR_NONE; + *state = 7; + } + else { + player->unk_38 = 0; + *motAttr = HU3D_MOTATTR_LOOP; + *state = 0; + } + } +} + +void fn_1_3F84(WorkPlayerOld *player, s32 *state, u32 *motAttr) +{ + if (Hu3DMotionShiftIDGet(player->unk_00->model[0]) < 0 && Hu3DMotionEndCheck(player->unk_00->model[0])) { + fn_1_2BD0(player, 0.0f, 0.0f); + } +} + +void fn_1_4024(WorkPlayerOld *player, s32 *state, u32 *motAttr) +{ + if (Hu3DMotionShiftIDGet(player->unk_00->model[0]) < 0 && Hu3DMotionEndCheck(player->unk_00->model[0])) { + player->unk_3C &= ~0x4; + player->unk_38 = 0; + *motAttr = HU3D_MOTATTR_LOOP; + *state = 0; + } +} + +void fn_1_40C0(WorkPlayerOld *player) +{ + u32 motAttr = HU3D_MOTATTR_NONE; + s32 state = -1; + float temp_f28; + float temp_f23; + float temp_f22; + Vec *pos; + BOOL temp_r27; + if (player->unk_3C & 0x1) { + player->unk_84.x = player->unk_90.x; + player->unk_84.z = player->unk_90.z; + } + else { + player->unk_84.x = player->unk_20 / 4.0f; + player->unk_84.z = -(float)player->unk_24 / 4.0f; + if (player->unk_38 == 1 && 0.0f == player->unk_84.x && 0.0f == player->unk_84.z) { + player->unk_84.x = 0.98f * (player->unk_6C.x - player->unk_78.x); + player->unk_84.z = 0.98f * (player->unk_6C.z - player->unk_78.z); + } + if (player->unk_3C & 0x14) { + player->unk_84.x = 0; + player->unk_84.z = 0; + player->unk_28 = 0; + } + } + player->unk_78 = player->unk_6C; + player->unk_A0 = VECMagXZ(&player->unk_84); + if (0.5f <= player->unk_A0) { + if (10.0f <= player->unk_A0) { + player->unk_84.x /= player->unk_A0; + player->unk_84.z /= player->unk_A0; + player->unk_A0 = 10; + player->unk_84.x = 10 * player->unk_84.x; + player->unk_84.z = 10 * player->unk_84.z; + } + } + else { + player->unk_84.x = 0; + player->unk_84.z = 0; + player->unk_A0 = 0; + } + player->unk_84.x *= player->unk_B8; + player->unk_84.z *= player->unk_B8; + player->unk_A0 *= player->unk_B8; + if (player->unk_3C & 0x800) { + player->unk_28 |= 0x100; + player->unk_2C |= 0x100; + if (player->unk_38 == 1) { + if (0.0f == player->unk_A4) { + player->unk_3C &= ~0x800; + } + } + } + switch (player->unk_38) { + case 0: + fn_1_3CE0(player, &state, &motAttr); + break; + + case 1: + fn_1_3DB8(player, &state, &motAttr); + break; + + case 2: + fn_1_3ECC(player, &state, &motAttr); + break; + + case 3: + fn_1_3F84(player, &state, &motAttr); + break; + + case 4: + fn_1_4024(player, &state, &motAttr); + break; + + default: + OSReport("*** player action error(%d)!!\n", player->unk_38); + break; + } + if (player->unk_3C & 0x2000) { + player->unk_84.y = 0; + } + temp_f28 = 0; + if (50.0f < ABS(player->unk_84.y)) { + player->unk_84.y = 50.0f * ((0.0f > player->unk_84.y) ? -1 : 1); + } + if (player->unk_3C & 0x2) { + Mtx rotMtx; + MTXRotDeg(rotMtx, 'y', player->unk_50[2].x - player->unk_60); + MTXMultVec(rotMtx, &player->unk_54, &player->unk_54); + VECAdd(&player->unk_54, &player->unk_50[0], &player->unk_6C); + player->unk_9C += player->unk_50[2].x - player->unk_60; + } + temp_f22 = player->unk_6C.y; + VECAdd(&player->unk_6C, &player->unk_84, &player->unk_6C); + if ((player->unk_3C & 0x1) == 0 && (0.0f != player->unk_84.x || 0.0f != player->unk_84.z)) { + player->unk_9C = fn_1_1E20(player->unk_9C, atan2d(player->unk_84.x, player->unk_84.z), 0.4f * player->unk_B8); + } + temp_f28 += fn_1_39C4(player, temp_f22); + if (nMap == 0) { + player->unk_A8 = lbl_1_bss_420; + } + else { + player->unk_A8 = MapPos(player->unk_6C.x, player->unk_6C.y, player->unk_6C.z, player->unk_C0, &player->unk_AC); + } + temp_r27 = FALSE; + if (NULL != player->unk_08) { + pos = player->unk_08(player->unk_00); + if (NULL != pos) { + if (player->unk_A8 < pos[1].y) { + temp_r27 = TRUE; + player->unk_50 = pos; + player->unk_A8 = pos[1].y; + } + } + } + if (!temp_r27 && (player->unk_3C & 0x2)) { + player->unk_3C &= ~0x2; + } + if (player->unk_38 == 1 && player->unk_A8 >= player->unk_6C.y) { + player->unk_38 = 2; + player->unk_3C &= ~0x3; + player->unk_6C.y = player->unk_A8; + player->unk_84.y = 0; + motAttr = HU3D_MOTATTR_NONE; + state = 4; + if (player->unk_40 == 5) { + state = 6; + if (NULL != player->unk_10) { + player->unk_10(player->unk_00); + } + if (player->unk_18 < 4) { + omVibrate(player->unk_18, 12, 4, 2); + } + } + if (player->unk_3C & 0x200) { + state = -1; + if (NULL != player->unk_0C) { + player->unk_0C(player->unk_00); + } + } + if (temp_r27) { + player->unk_3C |= 0x2; + } + } + temp_f23 = player->unk_6C.y - player->unk_A8; + if (player->unk_38 == 0 && 10.0f < temp_f23) { + if ((player->unk_3C & 0x2000) == 0) { + if ((player->unk_3C & 0x400) != 0) { + player->unk_3C |= 0x800; + } + else { + fn_1_2BD0(player, 0.0f, 0.0f); + motAttr = HU3D_MOTATTR_NONE; + state = 3; + } + } + } + else if (temp_r27) { + if (!(player->unk_3C & 0x2)) { + player->unk_6C.y = player->unk_A8; + player->unk_3C |= 0x2; + } + } + fn_1_2E34(player); + if (NULL != player->unk_04) { + player->unk_04(player->unk_00); + } + temp_f28 += fn_1_39C4(player, player->unk_6C.y); + if (player->unk_3C & 0x2) { + player->unk_60 = player->unk_50[2].x; + VECSubtract(&player->unk_6C, &player->unk_50[0], &player->unk_54); + } + if (0.0f != temp_f28) { + player->unk_48++; + } + else { + player->unk_48 = 0; + } + if (state >= 0 && player->unk_40 != state) { + player->unk_40 = state; + player->unk_44 = player->unk_14[player->unk_40]; + if (player->unk_44 >= 0 && !(player->unk_3C & 0x20)) { + Hu3DMotionShiftSet(player->unk_00->model[0], player->unk_00->motion[player->unk_44], 0, 8, motAttr); + } + } +} + +void fn_1_4ED8(WorkPlayerOld *player, s32 motNo) +{ + s32 i; + player->unk_44 = motNo; + player->unk_38 = 0; + player->unk_3C &= 0x1400; + player->unk_78 = player->unk_6C; + player->unk_84.x = 0; + player->unk_84.y = 0; + player->unk_84.z = 0; + fn_1_23B4(player); + if (player->unk_40 == 3) { + Hu3DModelAttrReset(player->unk_00->model[0], HU3D_MOTATTR_LOOP | HU3D_MOTATTR_PAUSE); + Hu3DMotionSet(player->unk_00->model[0], player->unk_00->motion[player->unk_44]); + Hu3DMotionTimeSet(player->unk_00->model[0], Hu3DMotionMaxTimeGet(player->unk_00->model[0]) - 1); + } + else if (player->unk_40 == 5) { + player->unk_38 = 3; + player->unk_3C |= 0x4; + Hu3DModelAttrReset(player->unk_00->model[0], HU3D_MOTATTR_LOOP | HU3D_MOTATTR_PAUSE); + Hu3DMotionSet(player->unk_00->model[0], player->unk_00->motion[player->unk_44]); + Hu3DMotionTimeSet(player->unk_00->model[0], Hu3DMotionMaxTimeGet(player->unk_00->model[0]) - 1); + } + else { + Hu3DModelAttrReset(player->unk_00->model[0], HU3D_MOTATTR_PAUSE); + Hu3DMotionShiftSet(player->unk_00->model[0], player->unk_00->motion[player->unk_44], 0, 8, HU3D_MOTATTR_LOOP); + } +} + +void fn_1_5128(WorkPlayerOld *player, s32 attr) +{ + player->unk_3C |= attr; +} + +void fn_1_5138(WorkPlayerOld *player, s32 attr) +{ + player->unk_3C &= ~attr; +} + +#include "REL/m432data.h" + +typedef struct UnkBss0Struct { + /* 0x000 */ omObjData *unk_00; + /* 0x004 */ omObjData *unk_04; + /* 0x008 */ omObjData *unk_08; + /* 0x00C */ omObjData *unk_0C; + /* 0x010 */ UnkM432DllBss0SubStruct *unk_10[2]; + /* 0x018 */ s32 unk_18; + /* 0x01C */ Vec unk_1C; + /* 0x028 */ Vec unk_28; + /* 0x034 */ Vec unk_34; + /* 0x040 */ Vec unk_40; + /* 0x04C */ Vec unk_4C; + /* 0x058 */ Vec unk_58; + /* 0x064 */ float unk_64; + /* 0x068 */ float unk_68; + /* 0x06C */ float unk_6C; + /* 0x070 */ float unk_70; + /* 0x074 */ float unk_74; + /* 0x078 */ float unk_78; + /* 0x07C */ float unk_7C; + /* 0x080 */ float unk_80; + /* 0x084 */ float unk_84; + /* 0x088 */ Vec unk_88[4][3]; + /* 0x118 */ Vec unk_118; + /* 0x124 */ float unk_124; + /* 0x128 */ float unk_128; + /* 0x12C */ float unk_12C; + /* 0x130 */ Vec unk_130[8]; + /* 0x190 */ Vec unk_190; + /* 0x19C */ Vec unk_19C; + /* 0x1A8 */ Vec unk_1A8; + /* 0x1B4 */ s32 unk_1B4; + /* 0x1B8 */ s32 unk_1B8; + /* 0x1BC */ s32 unk_1BC; + /* 0x1C0 */ Vec unk_1C0; + /* 0x1CC */ s32 unk_1CC; + /* 0x1D0 */ s32 unk_1D0; + /* 0x1D4 */ float unk_1D4; + /* 0x1D8 */ s32 unk_1D8; + /* 0x1DC */ float unk_1DC; + /* 0x1E0 */ float unk_1E0; + /* 0x1E4 */ float unk_1E4; + /* 0x1E8 */ float unk_1E8; + /* 0x1EC */ float unk_1EC; + /* 0x1F0 */ float unk_1F0[2]; +} UnkBss0Struct; /* size = 0x1F8 */ + +typedef struct UnkM432DllStruct { + WorkPlayerOld unk_00; + s32 *unk_C4; + UnkM432DllBss0SubStruct *unk_C8; + UnkM432DllData1794Struct *unk_CC; + UnkM432DllBss0SubStruct *unk_D0; + s32 unk_D4[10]; + s32 unk_FC; + s32 unk_100; + float unk_104; + float unk_108; + float unk_10C; + float unk_110; + float unk_114; + s32 unk_118[9]; + Vec unk_13C; + float unk_148; + float unk_14C; + float unk_150; + float unk_154; + float unk_158; + float unk_15C; + float unk_160; + float unk_164; + s32 unk_168; + s32 unk_16C; + s32 unk_170; + s32 unk_174; + s32 unk_178; + s32 unk_17C; + s32 unk_180; + s32 unk_184; + s32 unk_188; + s32 unk_18C; + s32 unk_190; + s32 unk_194; +} UnkM432DllStruct; + +typedef struct UnkM432DllStruct2 { + Vec unk_00; + float unk_0C; + float unk_10; + float unk_14; + float unk_18; +} UnkM432DllStruct2; /* size = 0x1C */ + +void fn_1_10250(omObjData *object); +void fn_1_153BC(void); +void fn_1_1615C(omObjData *object); +void fn_1_6F28(UnkBss0Struct *arg0); +void fn_1_93BC(UnkM432DllStruct *arg0); + +omObjData *lbl_1_bss_41C; +omObjData **lbl_1_bss_418; +omObjData *lbl_1_bss_414; +// data UnkM432DllStruct +omObjData **lbl_1_bss_410; +s32 lbl_1_bss_40C; +AnimData *lbl_1_bss_408; +s16 lbl_1_bss_404; +s16 lbl_1_bss_402; +s16 lbl_1_bss_400; +s32 lbl_1_bss_3FC; +s32 lbl_1_bss_3F8; +s32 lbl_1_bss_3F4; +float lbl_1_bss_3F0; +UnkBss0Struct lbl_1_bss_0[2]; + +void fn_1_5148(UnkM432DllStruct *arg0) +{ + s32 var_r31; + + arg0->unk_D0 = 0; + arg0->unk_FC = 0; + arg0->unk_100 = 0; + arg0->unk_10C = 0.0f; + for (var_r31 = 0; var_r31 < 0xA; var_r31++) { + arg0->unk_D4[var_r31] = -1; + } +} + +UnkM432DllStruct *fn_1_51A8(s32 arg0) +{ + s32 var_r31; + UnkM432DllStruct *var_r30; + + for (var_r31 = 0; var_r31 < 4; var_r31++) { + var_r30 = lbl_1_bss_410[var_r31]->data; + if (arg0 == var_r30->unk_184) { + return var_r30; + } + } + return NULL; +} + +UnkM432DllBss0SubStruct *fn_1_5208(s32 arg0, UnkM432DllBss0SubStruct *arg1) +{ + UnkM432DllBss0SubStruct *var_r31; + s32 var_r30; + s32 var_r29; + + for (var_r30 = 0; var_r30 < 2; var_r30++) { + var_r31 = lbl_1_bss_0[arg0].unk_10[var_r30]; + for (var_r29 = 0; var_r29 < 0x1F; var_r29++, var_r31++) { + if (strcmp(arg1->unk_04, var_r31->unk_00) == 0) { + return var_r31; + } + } + } + return NULL; +} + +inline void fn_1_52B8_inline(Vec *arg0, float arg8, float arg9, float argA) +{ + arg0->x = arg8; + arg0->y = arg9; + arg0->z = argA; +} + +void fn_1_52B8(UnkM432DllBss0SubStruct *arg0, Vec *arg1) +{ + Mtx sp8; + + fn_1_52B8_inline(arg1, 0.0f, 0.0f, arg0->unk_1C); + MTXRotRad(sp8, 0x79, 0.017453292f * arg0->unk_18); + MTXMultVec(sp8, arg1, arg1); + VECAdd(&arg0->unk_2C, arg1, arg1); +} + +void fn_1_5364(s32 arg0, omObjData *object) +{ + if (lbl_1_bss_0[arg0].unk_1D8 >= 0) { + lbl_1_bss_0[arg0].unk_1DC -= 0.016666668f; + if (0.0f >= lbl_1_bss_0[arg0].unk_1DC) { + HuAudFXStop(lbl_1_bss_0[arg0].unk_1D8); + lbl_1_bss_0[arg0].unk_1D8 = -1; + } + else { + HuAudFXPitchSet(lbl_1_bss_0[arg0].unk_1D8, (s32)(8191.0f * lbl_1_bss_0[arg0].unk_1DC)); + HuAudFXVolSet(lbl_1_bss_0[arg0].unk_1D8, (s32)(127.0f * lbl_1_bss_0[arg0].unk_1DC)); + } + } + lbl_1_bss_0[arg0].unk_88[0][2].x = lbl_1_bss_0[arg0].unk_80; + lbl_1_bss_0[arg0].unk_88[1][2].x = lbl_1_bss_0[arg0].unk_80; + Hu3DModelRotSet(object->model[20], 0.0f, lbl_1_bss_0[arg0].unk_80, 0.0f); + fn_1_1D18(object->model[20], "m432_13-player2A", &lbl_1_bss_0[arg0].unk_88[0][1]); + fn_1_1D18(object->model[20], "m432_13-player2B", &lbl_1_bss_0[arg0].unk_88[1][1]); + lbl_1_bss_0[arg0].unk_88[2][2].x = lbl_1_bss_0[arg0].unk_84; + lbl_1_bss_0[arg0].unk_88[3][2].x = lbl_1_bss_0[arg0].unk_84; + Hu3DModelRotSet(object->model[21], 0.0f, lbl_1_bss_0[arg0].unk_84, 0.0f); + fn_1_1D18(object->model[21], "m432_13-player2C", &lbl_1_bss_0[arg0].unk_88[2][1]); + fn_1_1D18(object->model[21], "m432_13-player2C", &lbl_1_bss_0[arg0].unk_88[3][1]); +} + +void fn_1_576C(s32 arg0, omObjData *arg1) +{ + float var_f31 = lbl_1_bss_0[arg0].unk_124 * (Hu3DMotionMaxTimeGet(arg1->model[22]) / 1000.0f); + lbl_1_bss_0[arg0].unk_128 += 0.02f * (var_f31 - lbl_1_bss_0[arg0].unk_128); + Hu3DMotionTimeSet(arg1->model[22], lbl_1_bss_0[arg0].unk_128); +} + +void fn_1_5848(UnkM432DllStruct *var_r28, UnkM432DllBss0SubStruct *var_r31) +{ + s32 sp20; + float var_f31; + float var_f30; + float var_f29; + float var_f28; + + s32 var_r30; + s32 var_r27; + UnkM432DllStruct *var_r26; + UnkM432DllBss0SubStruct *var_r25; + UnkBss0Struct *var_r24; + s32 var_r21; + s32 var_r20; + char **var_r19; + u8 *var_r18; + + var_r20 = var_r31->unk_1C; + var_r26 = fn_1_51A8(var_r28->unk_184 ^ 1); + var_r24 = &lbl_1_bss_0[var_r28->unk_184 >> 1]; + sp20 = var_r24->unk_1B8; + var_r27 = 6; + var_r18 = lbl_1_data_4F0; + var_r19 = lbl_1_data_440; + if ((var_r31->unk_14 & 4) != 0) { + sp20 = var_r24->unk_1BC; + var_r27 = 0xA; + var_r18 = lbl_1_data_504; + var_r19 = lbl_1_data_4C8; + } + var_r30 = frandmod(var_r27 - 1); + for (var_r21 = 0; var_r21 < (var_r27 - 1); var_r21++) { + var_r30 = (var_r30 + 1) % (var_r27 - 1); + if ((var_r20 != var_r30) && (sp20 != var_r30) && (var_r30 != var_r18[var_r20])) { + var_r31->unk_04 = var_r19[var_r30]; + var_r25 = fn_1_5208(var_r28->unk_184 >> 1, var_r31); + var_f31 = var_r26->unk_00.unk_6C.x - var_r25->unk_2C.x; + var_f30 = var_r26->unk_00.unk_6C.z - var_r25->unk_2C.z; + if (200.0f < sqrtf((var_f31 * var_f31) + (var_f30 * var_f30))) { + break; + } + } + } + (void)var_r31; + (void)var_r31; + (void)var_r31; +} + +void fn_1_5BAC(UnkM432DllStruct *arg0, omObjData *object, UnkM432DllBss0SubStruct *arg2, UnkM432DllBss0SubStruct *arg3) +{ + Vec sp14; + Vec sp8; + float var_f31; + + var_f31 = arg2->unk_20.y; + if (25.0f <= arg3->unk_38) { + var_f31 -= 400.0f; + } + else { + var_f31 -= 8.0f * arg3->unk_38; + } + if ((arg2->unk_20.y == var_f31) && (0.0f > arg2->unk_2C.y) && (-1.0f < arg2->unk_2C.y)) { + arg2->unk_2C.y = 0.0f; + HuAudFXPlay(0x699); + } + arg2->unk_2C.y += 0.25f * (var_f31 - arg2->unk_2C.y); + if ((arg2->unk_40 < 0) && ((arg2->unk_20.y - 200.0f) > arg2->unk_2C.y)) { + fn_1_52B8_inline(&sp8, arg2->unk_2C.x - 80.0f, arg2->unk_20.y, arg2->unk_2C.z); + fn_1_52B8_inline(&sp14, 80.0f + arg2->unk_2C.x, arg2->unk_20.y, arg2->unk_2C.z); + fn_1_174(lbl_1_bss_404, &lbl_1_data_1814, 4, 4, 2, &sp8, 0); + HuAudFXPlay(0x69A); + } + Hu3DModelPosSet(object->model[arg2->unk_08], arg2->unk_2C.x, arg2->unk_2C.y, arg2->unk_2C.z); + if ((arg2->unk_20.y - 399.0f) > arg2->unk_2C.y) { + arg0->unk_17C++; + arg2->unk_14 = 0; + } +} + +void fn_1_5F2C(UnkM432DllStruct *arg0, UnkM432DllBss0SubStruct *arg1) +{ + float var_f31; + float var_f30; + UnkBss0Struct *var_r28; + s32 var_r25; + s32 var_r22; + char *var_r24; + + if ((arg0->unk_180 == 0x7D3) && !(arg1->unk_2C.y <= arg0->unk_00.unk_6C.y)) { + var_r28 = &lbl_1_bss_0[arg0->unk_184 >> 1]; + var_f31 = arg0->unk_00.unk_6C.x - arg1->unk_2C.x; + var_f30 = arg0->unk_00.unk_6C.z - arg1->unk_2C.z; + if (sqrtf((var_f31 * var_f31) + (var_f30 * var_f30)) < 100.0f) { + arg0->unk_00.unk_3C |= 0x18; + arg0->unk_180 = 0x7D7; + arg0->unk_C4 = NULL; + var_r22 = arg1->unk_1C; + var_r25 = var_r28->unk_1B8; + var_r24 = lbl_1_data_440[5]; + if (arg1->unk_14 & 4) { + var_r25 = var_r28->unk_1BC; + var_r24 = lbl_1_data_4C8[9]; + } + if (var_r22 == var_r25) { + arg1->unk_04 = var_r24; + } + else { + fn_1_5848(arg0, arg1); + } + arg0->unk_C8 = fn_1_5208(arg0->unk_184 >> 1, arg1); + arg0->unk_D4[arg0->unk_FC] = arg1->unk_44 - arg0->unk_17C; + arg0->unk_FC = (arg0->unk_FC + 1) % 10; + } + } +} + +void fn_1_623C(UnkBss0Struct *arg0, s32 arg1, UnkM432DllStruct *arg2, UnkM432DllStruct *arg3) +{ + UnkM432DllBss0SubStruct *sp3C; + float var_f29; + float var_f28; + float var_f27; + float var_f23; + UnkM432DllBss0SubStruct *var_r31; + UnkM432DllStruct *var_r29; + omObjData *var_r28; + s32 var_r26; + s32 var_r19; + + var_f29 = 0.0f; + var_f28 = 0.0f; + var_f27 = 0.0f; + var_r28 = arg0->unk_04; + for (var_r26 = 0; var_r26 < 2; var_r26++) { + var_r29 = fn_1_51A8((var_r26 + (arg1 * 2))); + for (var_r31 = arg0->unk_10[var_r26], var_r19 = 0; var_r19 < 0x1F; var_r19++, var_r31++) { + if (var_r31->unk_14 & 0x600) { + if (1.0f < var_r31->unk_3C) { + var_r31->unk_3C = 1.0f; + } + var_r31->unk_38 = var_r31->unk_38 + var_r31->unk_3C; + var_r31->unk_3C = var_r31->unk_3C - 0.05f; + if (0.0f > var_r31->unk_3C) { + var_r31->unk_3C = 0.0f; + } + if (var_r31->unk_14 & 0x400) { + var_f29 += var_r31->unk_38; + } + if (var_r31->unk_14 & 0x200) { + var_f28 += var_r31->unk_38; + } + } + if (var_r31->unk_14 & 0x800) { + var_f27 += var_r31->unk_38; + } + if (NULL != var_r31->unk_04) { + sp3C = fn_1_5208(arg1, var_r31); + switch (var_r31->unk_14) { + case 3: + break; + case 1: + fn_1_5BAC(var_r29, var_r28, var_r31, sp3C); + break; + case 2: + case 4: + fn_1_5F2C(var_r29, var_r31); + break; + } + } + } + } + arg0->unk_80 = 80.0f + -var_f29; + arg0->unk_84 = 160.0f + -var_f28; + fn_1_5364(arg1, var_r28); + arg0->unk_124 = var_f27; + if (1000.0f <= arg0->unk_124) { + arg0->unk_124 = 1000.0f; + } + var_f23 = lbl_1_bss_0[arg1].unk_124 * (Hu3DMotionMaxTimeGet(var_r28->model[22]) / 1000.0f); + lbl_1_bss_0[arg1].unk_128 += 0.02f * (var_f23 - lbl_1_bss_0[arg1].unk_128); + Hu3DMotionTimeSet(var_r28->model[22], lbl_1_bss_0[arg1].unk_128); + if ((lbl_1_bss_3FC < 0) && (1000.0f <= arg0->unk_124)) { + lbl_1_bss_3FC = arg2->unk_184 & 2; + arg2->unk_17C += 4; + arg3->unk_17C += 4; + } +} + +void fn_1_6D34(UnkBss0Struct *arg0, UnkM432DllStruct *arg1, Vec *arg2) +{ + float var_f31; + float var_f30; + float var_f28; + float var_f27; + s32 var_r31; + + var_f27 = 100000.0f; + for (var_r31 = 0; var_r31 < 8; var_r31++) { + var_f31 = arg1->unk_00.unk_6C.x - arg0->unk_130[var_r31].x; + var_f30 = arg1->unk_00.unk_6C.z - arg0->unk_130[var_r31].z; + var_f28 = sqrtf((var_f31 * var_f31) + (var_f30 * var_f30)); + if (var_f27 > var_f28) { + var_f27 = var_f28; + *arg2 = arg0->unk_130[var_r31]; + } + } +} + +void fn_1_6F28(UnkBss0Struct *arg0) +{ + float var_f31; + float var_f30; + float var_f26; + float var_f23; + + UnkM432DllStruct *var_r30 = arg0->unk_08->data; + + if (arg0->unk_1B4 < 0) { + fn_1_6D34(arg0, var_r30, &arg0->unk_190); + var_r30->unk_00.unk_3C |= 8; + var_r30->unk_180 = 0x7D9; + arg0->unk_190.y = 3000.0f; + arg0->unk_19C = arg0->unk_190; + arg0->unk_1B4 = 0; + Hu3DModelRotSet(arg0->unk_04->model[25], 0.0f, 0.0f, 0.0f); + Hu3DModelAttrReset(arg0->unk_04->model[25], HU3D_ATTR_DISPOFF); + } + switch (arg0->unk_1B4) { + case 0: + fn_1_40C0(&var_r30->unk_00); + var_f23 = var_r30->unk_00.unk_6C.y - arg0->unk_19C.y; + arg0->unk_190.y += 0.03f * var_f23; + if (50.0f > (0.0f > var_f23 ? -var_f23 : var_f23)) { + arg0->unk_1B4++; + arg0->unk_1A8 = arg0->unk_1C0; + arg0->unk_1A8.y += 900.0f; + arg0->unk_1A8.z -= 150.0f; + var_r30->unk_00.unk_6C = arg0->unk_19C; + var_r30->unk_00.unk_9C = 0.0f; + Hu3DMotionShiftSet(arg0->unk_08->model[0], arg0->unk_08->motion[6], 0.0f, 8.0f, HU3D_MOTATTR_LOOP); + } + break; + case 1: + if (50.0f > (0.0f > (arg0->unk_1A8.y - arg0->unk_190.y) ? -(arg0->unk_1A8.y - arg0->unk_190.y) : arg0->unk_1A8.y - arg0->unk_190.y)) { + arg0->unk_1B4++; + } + break; + case 2: + arg0->unk_1A8.y += 0.1f * (((900.0f + arg0->unk_1C0.y) - 200.0f) - arg0->unk_1A8.y); + if (((900.0f + arg0->unk_1C0.y) - 190.0f) > arg0->unk_1A8.y) { + arg0->unk_1B4++; + var_r30->unk_16C = 1; + var_r30->unk_180 = 0x7D3; + fn_1_4ED8(&var_r30->unk_00, 0); + var_r30->unk_00.unk_3C |= 0x210; + if (NULL != arg0->unk_0C) { + arg0->unk_1B4 = 4; + arg0->unk_08 = arg0->unk_0C; + var_r30 = arg0->unk_08->data; + fn_1_6D34(arg0, var_r30, &arg0->unk_1A8); + var_r30->unk_00.unk_3C |= 8; + var_r30->unk_180 = 0x7D9; + } + } + break; + case 3: + arg0->unk_1A8.y += 10.0f; + if ((2000.0f + arg0->unk_1C0.y) < arg0->unk_1A8.y) { + arg0->unk_08 = NULL; + Hu3DModelAttrSet(arg0->unk_04->model[25], HU3D_ATTR_DISPOFF); + return; + } + break; + case 4: + fn_1_40C0(&var_r30->unk_00); + var_f31 = arg0->unk_1A8.x - arg0->unk_190.x; + var_f30 = arg0->unk_1A8.z - arg0->unk_190.z; + arg0->unk_190.x += 0.05f * var_f31; + arg0->unk_190.y += 0.01f * (arg0->unk_1A8.y - arg0->unk_190.y); + arg0->unk_190.z += 0.05f * var_f30; + if (20.0f > sqrtf((var_f31 * var_f31) + (var_f30 * var_f30))) { + arg0->unk_19C = arg0->unk_190; + arg0->unk_1B4 = 0; + } + break; + } + if ((arg0->unk_1B4 > 0) && (arg0->unk_1B4 < 4)) { + if (arg0->unk_1B4 < 3) { + var_r30->unk_00.unk_6C = arg0->unk_19C; + fn_1_2DD4(&var_r30->unk_00); + } + var_f23 = 0.03f * (arg0->unk_1A8.y - arg0->unk_190.y); + arg0->unk_190.y += var_f23; + if (arg0->unk_1C0.y < arg0->unk_190.y) { + var_f26 = (arg0->unk_1A8.y - arg0->unk_190.y) / 900.0f; + if (0.1f > var_f26) { + var_f26 = 0.1f; + } + if (1.0f < var_f26) { + var_f26 = 1.0f; + } + var_f26 = 1.0f - var_f26; + arg0->unk_190.x += 0.03f * var_f26 * (arg0->unk_1A8.x - arg0->unk_190.x); + arg0->unk_190.z += 0.03f * var_f26 * (arg0->unk_1A8.z - arg0->unk_190.z); + } + } + Hu3DModelPosSet(arg0->unk_04->model[25], arg0->unk_190.x, arg0->unk_190.y, arg0->unk_190.z); + fn_1_1D18(arg0->unk_04->model[25], "g008m2_000-itemhook_sao", &arg0->unk_19C); +} + +void fn_1_7C1C(UnkBss0Struct *var_r31, UnkM432DllStruct *var_r30, UnkM432DllStruct *var_r29) +{ + float var_f31; + float var_f30; + + if ((var_r31->unk_7C == 0.0f) && ((0.0f < var_r31->unk_70) || (0.0f > var_r31->unk_74))) { + if (0.0f < var_r31->unk_70) { + var_r31->unk_28.y += 0.05f * (var_r31->unk_70 - var_r31->unk_28.y); + if (2.0f + > (0.0f > (var_r31->unk_70 - var_r31->unk_28.y) ? -(var_r31->unk_70 - var_r31->unk_28.y) : var_r31->unk_70 - var_r31->unk_28.y)) { + var_r31->unk_28.y = var_r31->unk_70; + var_r31->unk_70 = 0.0f; + } + } + if (0.0f > var_r31->unk_74) { + var_r31->unk_28.z += 0.05f * (var_r31->unk_74 - var_r31->unk_28.z); + if (2.0f + > (0.0f > (var_r31->unk_74 - var_r31->unk_28.z) ? -(var_r31->unk_74 - var_r31->unk_28.z) : var_r31->unk_74 - var_r31->unk_28.z)) { + var_r31->unk_28.z = var_r31->unk_74; + var_r31->unk_74 = 0.0f; + } + } + } + else { + var_f30 = var_r31->unk_1EC / var_r31->unk_1E8; + if (265.0f > var_f30) { + var_f31 = 0.2f * (265.0f - var_f30); + if (1.0f <= (0.0f > var_f31 ? -var_f31 : var_f31)) { + var_r31->unk_28.z -= var_f31; + } + } + switch (var_r31->unk_18) { + case 0: + if ((-7100.0f > var_r31->unk_28.z) && ((-7750.0f < var_r31->unk_1F0[0]) || (-7750.0f < var_r31->unk_1F0[1]))) { + var_r31->unk_28.z = -7100.0f; + } + if ((-7750.0f >= var_r31->unk_1F0[0]) && (-7750.0f >= var_r31->unk_1F0[1])) { + var_r31->unk_18++; + var_r31->unk_74 = -8700.0f; + var_r30->unk_17C += 3; + var_r30->unk_15C = -7750.0f; + var_r29->unk_17C += 3; + var_r29->unk_15C = -7750.0f; + fn_1_1D18(var_r31->unk_04->model[3], "m432_00-n1", &var_r31->unk_1C0); + return; + } + break; + case 1: + if ((-9500.0f > var_r31->unk_28.z) && ((-10200.0f < var_r31->unk_1F0[0]) || (-10200.0f < var_r31->unk_1F0[1]))) { + var_r31->unk_28.z = -9500.0f; + } + if ((-10200.0f >= var_r31->unk_1F0[0]) && (-10200.0f >= var_r31->unk_1F0[1])) { + var_r31->unk_18++; + var_r31->unk_74 = -11100.0f; + var_r30->unk_17C += 3; + var_r30->unk_15C = -10200.0f; + var_r29->unk_17C += 3; + var_r29->unk_15C = -10200.0f; + return; + } + break; + case 2: + if ((-11500.0f > var_r31->unk_28.z) && ((-12300.0f < var_r31->unk_1F0[0]) || (-12300.0f < var_r31->unk_1F0[1]))) { + var_r31->unk_28.z = -11500.0f; + } + if ((NULL != var_r30->unk_C8) && (var_r30->unk_C8->unk_14 & 8) && (NULL != var_r29->unk_C8) && ((var_r29->unk_C8->unk_14 & 8) != 0) + && (var_r30->unk_00.unk_38 == 0) && (var_r29->unk_00.unk_38 == 0)) { + var_r31->unk_18++; + var_r31->unk_1E4 = var_r30->unk_C8->unk_2C.y; + var_r31->unk_74 = -13500.0f; + var_r31->unk_70 = var_r30->unk_C8->unk_2C.y; + var_r30->unk_17C += 6; + var_r29->unk_17C += 6; + return; + } + break; + case 3: + if ((-13700.0f > var_r31->unk_28.z) && ((-14400.0f < var_r31->unk_1F0[0]) || (-14400.0f < var_r31->unk_1F0[1]))) { + var_r31->unk_28.z = -13700.0f; + } + if ((NULL != var_r30->unk_C8) && (var_r30->unk_C8->unk_14 & 0x10) && (NULL != var_r29->unk_C8) && (var_r29->unk_C8->unk_14 & 0x10) + && (var_r30->unk_00.unk_38 == 0) && (var_r29->unk_00.unk_38 == 0)) { + var_r31->unk_18++; + var_r31->unk_1E4 = var_r30->unk_C8->unk_2C.y; + var_r31->unk_74 = -15700.0f; + var_r31->unk_78 = 0.0f; + var_r31->unk_7C = 120.0f; + var_r31->unk_4C = var_r31->unk_28; + var_r31->unk_34 = var_r31->unk_1C; + var_r31->unk_58.x = var_r31->unk_28.x; + var_r31->unk_58.y = 400.0f + var_r30->unk_C8->unk_2C.y; + var_r31->unk_58.z = -15700.0f; + var_r31->unk_40 = var_r31->unk_58; + var_r31->unk_40.y = 800.0f + var_r30->unk_C8->unk_2C.y; + var_r31->unk_40.z += 3800.0f; + var_r30->unk_17C += 0xA; + var_r30->unk_148 = 0.0f; + fn_1_52B8(&lbl_1_bss_0[var_r30->unk_184 >> 1].unk_10[var_r30->unk_184 & 1][0x1B], &var_r30->unk_13C); + var_r29->unk_17C += 0xA; + var_r29->unk_148 = 0.0f; + fn_1_52B8(&lbl_1_bss_0[var_r29->unk_184 >> 1].unk_10[var_r29->unk_184 & 1][0x1B], &var_r29->unk_13C); + } + break; + } + } +} + +s32 fn_1_8540(UnkM432DllStruct *arg0) +{ + if (arg0->unk_17C >= 0x1F) { + return -1; + } + if (arg0->unk_17C >= 0x1B) { + return 3; + } + if (arg0->unk_17C >= 0xB) { + return 2; + } + if (arg0->unk_17C >= 5) { + return 1; + } + if (arg0->unk_17C >= 1) { + return 0; + } + return -1; +} + +UnkM432DllBss0SubStruct *fn_1_85AC(UnkM432DllStruct *arg0, UnkBss0Struct *arg1) +{ + UnkM432DllBss0SubStruct *var_r31 = arg1->unk_10[arg0->unk_184 & 1]; + s32 var_r30; + for (var_r30 = 0; var_r30 < 0x1F; var_r30++, var_r31++) { + if ((arg0->unk_17C <= var_r30) && (var_r31->unk_14 & 0xF00)) { + return var_r31; + } + } + return NULL; +} + +float fn_1_861C(UnkM432DllStruct *arg0, UnkBss0Struct *arg1, Vec *arg2) +{ + float var_f31; + float var_f30; + float var_f27; + float var_f28; + s32 var_r31; + + var_f28 = 100000.0f; + for (var_r31 = 0; var_r31 < 4; var_r31++) { + var_f31 = arg0->unk_00.unk_6C.x - arg1->unk_88[var_r31][1].x; + var_f30 = arg0->unk_00.unk_6C.z - arg1->unk_88[var_r31][1].z; + var_f27 = sqrtf((var_f31 * var_f31) + (var_f30 * var_f30)); + if (var_f28 > var_f27) { + var_f28 = var_f27; + *arg2 = arg1->unk_88[var_r31][1]; + } + } + return var_f28; +} + +void fn_1_8814(UnkM432DllStruct *arg0, s32 arg1, Vec *arg2) +{ + float var_f31; + float var_f30; + float var_f28; + float var_f27; + + var_f27 = 72.0f * arg0->unk_CC->unk_04; + var_f31 = arg2->x - arg0->unk_00.unk_6C.x; + var_f30 = arg2->z - arg0->unk_00.unk_6C.z; + var_f31 *= 4.0f; + var_f30 *= 4.0f; + var_f28 = sqrtf((var_f31 * var_f31) + (var_f30 * var_f30)); + if (var_f27 < var_f28) { + var_f31 = var_f27 * (var_f31 / var_f28); + var_f30 = var_f27 * (var_f30 / var_f28); + } + arg0->unk_00.unk_20 = var_f31; + arg0->unk_00.unk_24 = -var_f30; +} + +void fn_1_8A14(UnkM432DllStruct *arg0, s32 arg1, UnkM432DllBss0SubStruct *arg2) +{ + Vec spC; + + if (NULL != arg2) { + spC = arg2->unk_2C; + if (arg2->unk_14 & 0xF00) { + fn_1_52B8(arg2, &spC); + } + fn_1_8814(arg0, 0, &spC); + } +} + +UnkM432DllBss0SubStruct *fn_1_8CB4(UnkM432DllStruct *arg0, UnkM432DllStruct *arg1, UnkBss0Struct *arg2) +{ + s32 var_r30; + UnkM432DllBss0SubStruct *var_r29; + s32 var_r28; + s32 var_r27; + s32 var_r26; + s32 var_r25; + s32 var_r24; + s32 var_r21; + s32 var_r20; + s32 var_r19; + + var_r29 = NULL; + if (arg0->unk_17C < 0x1F) { + var_r29 = &arg2->unk_10[arg0->unk_184 & 1][arg0->unk_17C]; + } + if (NULL == var_r29) { + return NULL; + } + if (var_r29->unk_14 & 2) { + var_r28 = 5; + var_r27 = arg2->unk_1B8; + var_r26 = 0; + var_r25 = 5; + } + else { + var_r28 = 9; + var_r27 = arg2->unk_1BC; + var_r26 = 0; + var_r25 = 9; + if (-14100.0f < arg0->unk_00.unk_6C.z) { + var_r26 = 3; + var_r25 = 9; + } + if (-13700.0f < arg0->unk_00.unk_6C.z) { + var_r26 = 0; + var_r25 = 6; + } + if (-13300.0f < arg0->unk_00.unk_6C.z) { + var_r26 = 0; + var_r25 = 3; + } + } + var_r30 = frandmod(var_r28); + for (var_r21 = 0; var_r21 < var_r28; var_r21++) { + var_r30 = (var_r30 + 1) % var_r28; + if ((var_r26 <= var_r30) && (var_r25 > var_r30) + && ((arg0->unk_100 != 0) || ((var_r27 != var_r30) && (((var_r29->unk_14 & 4) == 0) || (var_r30 <= 3))))) { + var_r24 = arg0->unk_FC; + var_r19 = 0; + for (var_r20 = 0; var_r20 < arg0->unk_CC->unk_18; var_r20++) { + var_r24--; + if (var_r24 < 0) { + var_r24 += 0xA; + } + if (var_r30 == arg0->unk_D4[var_r24]) { + var_r19 = 1; + } + } + if (var_r19 == 0) { + break; + } + } + } + if ((var_r21 == var_r28) || (var_r27 == var_r30)) { + var_r30 = frandmod(var_r28); + while (var_r30 == var_r27) { + var_r30 = (var_r30 + 1) % var_r28; + } + } + if (arg0->unk_CC->unk_1C < arg0->unk_100) { + var_r30 = var_r27; + } + if (NULL != arg1->unk_C8) { + if (var_r29->unk_14 & 2) { + if (arg1->unk_C8->unk_14 & 8) { + var_r30 = var_r27; + } + } + else if (arg1->unk_C8->unk_14 & 0x10) { + var_r30 = var_r27; + } + } + arg0->unk_100++; + (void)var_r26; + (void)var_r25; + return &var_r29[var_r30]; +} + +void fn_1_8F3C(UnkM432DllStruct *arg0, UnkBss0Struct *arg1, UnkM432DllBss0SubStruct *arg2, Vec *arg3) +{ + *arg3 = arg2->unk_2C; + if (arg0->unk_00.unk_48 >= 0x14) { + if (-12200.0f < arg0->unk_00.unk_6C.z) { + arg3->x = arg1->unk_28.x; + } + else if ((-13300.0f < arg0->unk_00.unk_6C.z) && (-13400.0f > arg2->unk_2C.z)) { + arg3->x = arg1->unk_28.x - 500.0f; + } + else if ((-13700.0f < arg0->unk_00.unk_6C.z) && (-13800.0f > arg2->unk_2C.z)) { + arg3->x = 500.0f + arg1->unk_28.x; + } + else if ((-13500.0f > arg0->unk_00.unk_6C.z) && (-13400.0f < arg2->unk_2C.z)) { + arg3->x = 500.0f + arg1->unk_28.x; + return; + } + } +} + +void fn_1_906C(UnkM432DllStruct *var_r31, UnkM432DllBss0SubStruct *var_r27) +{ + float var_f31; + s32 var_r30; + s32 var_r29; + s32 var_r28; + + var_r30 = 0; + var_r29 = 0; + var_r28 = 0; + switch (var_r27->unk_14 & 0xF00) { + case 0x100: + var_r30 = 0x200; + var_r29 = 0x200; + break; + case 0x400: + var_r30 = 0x800; + var_r29 = 0x800; + var_r28 = 1; + break; + case 0x200: + var_r30 = 0x400; + var_r29 = 0x400; + var_r28 = 1; + break; + case 0x800: + if ((var_r31->unk_CC->unk_14 >= var_r31->unk_154) && (var_r31->unk_CC->unk_10 > var_r31->unk_158)) { + var_r31->unk_00.unk_34 = 0x96; + } + else if ((var_r31->unk_CC->unk_10 <= var_r31->unk_154) && (var_r31->unk_CC->unk_14 >= var_r31->unk_158)) { + var_r31->unk_00.unk_34 = 0x96; + } + else { + var_r31->unk_00.unk_30 = 0x96; + } + if (var_r31->unk_CC->unk_0C < frandf()) { + var_r31->unk_104 *= 0.99f; + } + if (var_r31->unk_CC->unk_00 > lbl_1_bss_57C) { + var_r31->unk_104 *= 0.99f; + } + else { + var_r31->unk_104 *= 1.01f; + } + if (0.5f > var_r31->unk_104) { + var_r31->unk_104 = 0.5f; + } + if (1.0f < var_r31->unk_104) { + var_r31->unk_104 = 1.0f; + } + var_r31->unk_00.unk_30 = var_r31->unk_00.unk_30 * var_r31->unk_104; + var_r31->unk_00.unk_34 = var_r31->unk_00.unk_34 * var_r31->unk_104; + break; + } + var_r31->unk_108 -= 1.0f; + if (0.0f > var_r31->unk_108) { + var_f31 = var_r31->unk_CC->unk_08; + if ((var_r28 != 0) && (GWPlayerCfg[var_r31->unk_188].diff == 3)) { + var_f31 = lbl_1_data_17D4.unk_08; + } + var_r31->unk_108 = var_f31 * (0.9f + (frandf() / 2)); + var_r31->unk_00.unk_28 |= var_r30; + var_r31->unk_00.unk_2C |= var_r29; + } +} + +void fn_1_93BC(UnkM432DllStruct *arg0) +{ + Vec spF8; + float spD0; + + float var_f31; + float var_f30; + + UnkM432DllBss0SubStruct *var_r30; + UnkBss0Struct *var_r29; + UnkM432DllBss0SubStruct *var_r28; + UnkM432DllStruct *var_r27; + s32 var_r20; + + if (NULL != arg0->unk_CC) { + var_r27 = fn_1_51A8(arg0->unk_184 ^ 1); + var_r29 = &lbl_1_bss_0[arg0->unk_184 >> 1]; + var_r20 = 1; + switch (fn_1_8540(arg0)) { + case 0: + var_r30 = fn_1_85AC(arg0, var_r29); + fn_1_8A14(arg0, 0, var_r30); + break; + case 1: + var_r28 = fn_1_85AC(arg0, var_r29); + if (NULL != var_r28) { + var_r30 = var_r28; + if (((NULL == arg0->unk_C8) && (NULL != var_r27->unk_C8)) || ((var_r28->unk_2C.z - 400.0f) > arg0->unk_00.unk_6C.z)) { + var_r30++; + } + else if ((var_r28->unk_2C.z - 1350.0f) > var_r27->unk_00.unk_6C.z) { + var_r30++; + var_r20 = 0; + } + if ((1400.0f < (var_r28->unk_2C.z - arg0->unk_00.unk_6C.z)) && (1400.0f < (var_r28->unk_2C.z - var_r27->unk_00.unk_6C.z))) { + var_r20 = 0; + arg0->unk_00.unk_24 = 0x48; + } + else { + if (((var_r28->unk_2C.z - 175.0f) > arg0->unk_00.unk_6C.z) && ((var_r28->unk_2C.z - 1350.0f) < arg0->unk_00.unk_6C.z)) { + if (((var_r29->unk_28.x - 20.0f) < arg0->unk_00.unk_6C.x) && ((20.0f + var_r29->unk_28.x) > arg0->unk_00.unk_6C.x) + && ((var_r28->unk_2C.z - 1000.0f) > arg0->unk_00.unk_6C.z)) { + arg0->unk_00.unk_24 = 0x48; + } + if ((var_r28->unk_2C.z - 1100.0f) > arg0->unk_00.unk_6C.z) { + arg0->unk_00.unk_28 |= 0x100; + arg0->unk_00.unk_2C |= 0x100; + fn_1_8A14(arg0, 0, var_r30); + } + else { + spD0 = fn_1_861C(arg0, var_r29, &spF8); + if ((arg0->unk_00.unk_BC < spD0) && (400.0f > spD0)) { + arg0->unk_00.unk_28 |= 0x100; + arg0->unk_00.unk_2C |= 0x100; + fn_1_8814(arg0, 0, &spF8); + } + } + } + else { + fn_1_8A14(arg0, 0, var_r30); + } + if (((var_r28->unk_2C.z - 175.0f) < arg0->unk_00.unk_6C.z) && (arg0->unk_00.unk_A8 < arg0->unk_00.unk_6C.y)) { + arg0->unk_00.unk_20 = 0; + arg0->unk_00.unk_24 = 0; + } + } + } + break; + case 2: + var_r20 = 0; + arg0->unk_10C -= 1.0f; + if (NULL == arg0->unk_D0) { + arg0->unk_D0 = fn_1_8CB4(arg0, var_r27, var_r29); + } + if (arg0->unk_10C == 1.0f) { + arg0->unk_D0 = fn_1_8CB4(arg0, var_r27, var_r29); + } + if (NULL != arg0->unk_D0) { + fn_1_8F3C(arg0, var_r29, arg0->unk_D0, &spF8); + fn_1_8814(arg0, 0, &spF8); + if (arg0->unk_00.unk_3C & 1) { + arg0->unk_10C = 20.0f + (20.0f * (arg0->unk_184 & 1)); + } + var_f31 = arg0->unk_00.unk_6C.x - arg0->unk_D0->unk_2C.x; + var_f30 = arg0->unk_00.unk_6C.z - arg0->unk_D0->unk_2C.z; + spD0 = sqrtf((var_f31 * var_f31) + (var_f30 * var_f30)); + if ((200.0f > spD0) || (arg0->unk_00.unk_4C > 0x14) || (arg0->unk_00.unk_48 > 0xC8)) { + arg0->unk_00.unk_28 |= 0x100; + arg0->unk_00.unk_2C |= 0x100; + } + if (50.0f > spD0) { + arg0->unk_00.unk_20 = 0; + arg0->unk_00.unk_24 = 0; + } + if (0.0f < arg0->unk_10C) { + arg0->unk_00.unk_20 = 0; + arg0->unk_00.unk_24 = 0; + arg0->unk_00.unk_28 &= 0xFFFFFEFF; + arg0->unk_00.unk_2C &= 0xFFFFFEFF; + } + } + break; + case 3: + var_r30 = fn_1_85AC(arg0, var_r29); + break; + } + if ((var_r20 != 0) && (NULL != var_r30)) { + fn_1_906C(arg0, var_r30); + } + } +} + +float fn_1_A974(UnkM432DllStruct *var_r31) +{ + Vec sp14; + Vec sp8; + + sp14 = var_r31->unk_00.unk_6C; + sp14.y = lbl_1_bss_0[var_r31->unk_184 >> 1].unk_28.y; + Hu3D3Dto2D(&sp14, lbl_1_data_A0[var_r31->unk_184 >> 1], &sp8); + return sp8.y; +} + +WorkPlayerOld *fn_1_AA00(int no) +{ + return &((UnkM432DllStruct *)lbl_1_bss_410[no]->data)->unk_00; +} + +void fn_1_AA1C(omObjData *object) +{ + float var_f31; + UnkM432DllStruct *var_r31; + UnkM432DllBss0SubStruct *var_r30; + s32 var_r29; + + var_r31 = object->data; + var_f31 = lbl_1_bss_0[var_r31->unk_184 >> 1].unk_28.z - 750.0f; + if (var_f31 > var_r31->unk_00.unk_6C.z) { + var_r31->unk_00.unk_6C.z = var_f31; + } + var_f31 = 900.0f + lbl_1_bss_0[var_r31->unk_184 >> 1].unk_28.z; + if (var_f31 < var_r31->unk_00.unk_6C.z) { + var_r31->unk_00.unk_6C.z = var_f31; + } + if (var_r31->unk_15C < var_r31->unk_00.unk_6C.z) { + var_r31->unk_00.unk_6C.z = var_r31->unk_15C; + } + var_r30 = lbl_1_bss_0[var_r31->unk_184 >> 1].unk_10[var_r31->unk_184 & 1]; + if ((var_r31->unk_184 & 1) != 0) { + lbl_1_bss_0[var_r31->unk_184 >> 1].unk_1E0 = 0.0f; + } + for (var_r29 = 0; var_r29 < 0x1F; var_r29++, var_r30++) { + if ((var_r31->unk_17C <= var_r29) && ((var_r30->unk_14 & 1) != 0)) { + var_f31 = 170.0f + var_r30->unk_2C.z; + if (var_f31 > var_r31->unk_00.unk_6C.z) { + var_r31->unk_00.unk_6C.z = var_f31; + } + if ((var_r31->unk_184 & 1) && (lbl_1_bss_0[var_r31->unk_184 >> 1].unk_1E0 > (var_r30->unk_2C.z - 170.0f))) { + lbl_1_bss_0[var_r31->unk_184 >> 1].unk_1E0 = var_r30->unk_2C.z - 170.0f; + } + } + } + if (((var_r31->unk_184 & 1) == 0) && (lbl_1_bss_0[var_r31->unk_184 >> 1].unk_28.x < var_r31->unk_00.unk_6C.x) + && (0.0f > lbl_1_bss_0[var_r31->unk_184 >> 1].unk_1E0) && (lbl_1_bss_0[var_r31->unk_184 >> 1].unk_1E0 < var_r31->unk_00.unk_6C.z)) { + var_r31->unk_00.unk_6C.z = lbl_1_bss_0[var_r31->unk_184 >> 1].unk_1E0; + } +} + +Vec *fn_1_ACC8(omObjData *object) +{ + float var_f31; + float var_f30; + float var_f27; + + UnkM432DllStruct *var_r31; + UnkBss0Struct *var_r30; + s32 var_r29; + UnkM432DllStruct *var_r28; + + var_r28 = object->data; + var_r31 = var_r28; + var_r30 = &lbl_1_bss_0[var_r28->unk_184 >> 1]; + for (var_r29 = 0; var_r29 < 4; var_r29++) { + if ((var_r31->unk_00.unk_6C.y <= var_r30->unk_88[var_r29][1].y) + && ((var_r31->unk_00.unk_6C.y + (var_r31->unk_00.unk_BC / 2)) >= var_r30->unk_88[var_r29][1].y)) { + var_f31 = var_r31->unk_00.unk_6C.x - var_r30->unk_88[var_r29][1].x; + var_f30 = var_r31->unk_00.unk_6C.z - var_r30->unk_88[var_r29][1].z; + var_f27 = sqrtf((var_f31 * var_f31) + (var_f30 * var_f30)); + if (var_f27 < (var_r31->unk_00.unk_BC + var_r30->unk_88[var_r29][2].y)) { + return &var_r30->unk_88[var_r29][0]; + } + } + } + return NULL; +} + +void fn_1_AF28(omObjData *object) +{ + UnkM432DllStruct *var_r31 = object->data; + var_r31->unk_16C = 0; + var_r31->unk_00.unk_3C &= 0xFFFFFFEF; + fn_1_4ED8(&var_r31->unk_00, 0); +} + +#include "src/REL/executor.c" + +void fn_1_B234(void) +{ + UnkM432DllStruct *var_r31; + s32 var_r30; + u32 var_r29; + u32 var_r28; + + if (HuPadBtn[0] & 2) { + lbl_1_bss_57C = 0x4650; + } + print8(0x18, 0x20, 1.5f, "COUNT:%d MODE:%d MES:%d", lbl_1_bss_580, lbl_1_bss_41C->work[0], lbl_1_bss_576); + print8(0x18, 0x30, 1.5f, "%f %f %f %f", lbl_1_bss_0[0].unk_64, lbl_1_bss_0[0].unk_68, lbl_1_bss_0[0].unk_6C, lbl_1_bss_0[0].unk_28.z); + print8(0x18, 0x40, 1.5f, "%f %f %f %f", lbl_1_bss_0[1].unk_64, lbl_1_bss_0[1].unk_68, lbl_1_bss_0[1].unk_6C, lbl_1_bss_0[0].unk_28.z); + print8(0x18, 0x50, 1.5f, "%x %x", HuMemHeapSizeGet(HEAP_SYSTEM) - HuMemUsedMallocSizeGet(HEAP_SYSTEM), + HuMemHeapSizeGet(HEAP_DATA) - HuMemUsedMallocSizeGet(HEAP_DATA)); + for (var_r30 = 0; var_r30 < 4; var_r30++) { + var_r31 = lbl_1_bss_410[var_r30]->data; + print8(0x18, (var_r30 * 0x10) + 0x70, 1.5f, "%d %d %04x %.3f (%.3f %.3f %.3f)", var_r31->unk_180, var_r31->unk_00.unk_38, + var_r31->unk_00.unk_3C, var_r31->unk_00.unk_A8, var_r31->unk_00.unk_6C.x, var_r31->unk_00.unk_6C.y, var_r31->unk_00.unk_6C.z); + } +} + +void fn_1_B458(omObjData *object) +{ + Hu3DModelAttrSet(object->model[0], HU3D_ATTR_DISPOFF); + fn_1_24(0x1000, object->model[0]); + omDelObjEx(lbl_1_bss_5B4, object); + lbl_1_bss_402--; +} + +void fn_1_B518(omObjData *object) +{ + float var_f31; + float var_f30; + float var_f29; + float var_f28; + + UnkM432DllStruct2 *var_r31; + + var_r31 = object->data; + var_r31->unk_10 += 1.0f; + if (30.0f <= var_r31->unk_10) { + fn_1_B458(object); + return; + } + if (10.0f > var_r31->unk_10) { + var_f31 = var_r31->unk_10 / 10.0f; + var_f30 = 0.0f; + } + else { + var_f31 = 1.0f; + var_f30 = (var_r31->unk_10 - 10.0f) / 20.0f; + } + var_f29 = sind((90.0f * var_f31)) * sind((90.0f * var_f31)); + var_f28 = sind((90.0f * var_f30)) * sind((90.0f * var_f30)); + omSetTra(object, var_r31->unk_00.x + (var_r31->unk_14 * var_f29), var_r31->unk_00.y, var_r31->unk_00.z + (var_r31->unk_18 * var_f28)); +} + +void fn_1_B7E4(omObjData *object) +{ + UnkM432DllStruct2 *var_r30; + UnkBss5D0Struct *var_r29; + UnkBss5D0Struct *var_r28; + UnkBss5D0Struct *var_r27; + s16 var_r26; + s16 var_r25; + s16 var_r24; + + var_r26 = fn_1_AC(0x1000); + if (var_r26 < 0) { + object->model[0] = Hu3DModelLink(lbl_1_bss_400); + } + else { + object->model[0] = var_r26; + } + var_r30 = object->data; + var_r30->unk_10 = 0.0f; + Hu3DModelAttrSet(object->model[0], HU3D_ATTR_DISPOFF); + Hu3DModelAttrSet(object->model[0], HU3D_MOTATTR_LOOP | HU3D_MOTATTR_PAUSE); + Hu3DModelLayerSet(object->model[0], 3); + omSetTra(object, var_r30->unk_00.x, var_r30->unk_00.y, var_r30->unk_00.z); + omSetRot(object, 0.0f, 0.0f, 0.0f); + omSetSca(object, var_r30->unk_0C, var_r30->unk_0C, var_r30->unk_0C); + Hu3DModelAttrReset(object->model[0], HU3D_MOTATTR_PAUSE); + Hu3DModelAttrReset(object->model[0], HU3D_ATTR_DISPOFF); + object->func = fn_1_B518; +} + +void fn_1_B974(Vec *arg0, float arg8, float arg9) +{ + UnkM432DllStruct2 *var_r31; + omObjData *var_r30; + + if (lbl_1_bss_402 < 0xF0) { + lbl_1_bss_402++; + var_r30 = omAddObjEx(lbl_1_bss_5B4, 0x67, 1, 0, 3, fn_1_B7E4); + var_r30->data = HuMemDirectMallocNum(HEAP_SYSTEM, sizeof(UnkM432DllStruct2), 0x10000000); + var_r31 = var_r30->data; + var_r31->unk_00 = *arg0; + var_r31->unk_00.x += 30.0f * arg9; + var_r31->unk_0C = 1.0f + arg8; + var_r31->unk_14 = 70.0f * arg9; + var_r31->unk_18 = -675.0f; + } +} + +void fn_1_BAA8(UnkM432DllStruct *arg0) +{ + Vec sp20; + Vec sp14; + float var_f31; + float var_f30; + + s32 *var_r29; + s32 var_r27; + + sp20 = arg0->unk_00.unk_6C; + sp20.y += 220.0f; + fn_1_1A60(&sp20, lbl_1_data_A0[arg0->unk_184 >> 1], &sp14); + + arg0->unk_110 = sp14.x; + arg0->unk_114 = sp14.y; + if (NULL != arg0->unk_C4) { + var_f31 = 0.0f; + var_f30 = 0.0f; + for (var_r29 = arg0->unk_C4, var_r27 = 1; var_r29[0] >= 0; var_r29 += 3) { + espPosSet(arg0->unk_118[var_r29[0]], var_r29[1] + (arg0->unk_110 + var_f31), var_r29[2] + (arg0->unk_114 + var_f30)); + espDispOn(arg0->unk_118[var_r29[0]]); + if (var_r27 != 0) { + var_r27 = 0; + var_f31 = var_r29[1]; + var_f30 = var_r29[2]; + } + } + } +} + +s32 fn_1_BF08(UnkM432DllStruct *arg0) +{ + switch (arg0->unk_C8->unk_14 & 0xF00) { + case 0x100: + if (arg0->unk_00.unk_28 & 0x200) { + return 0x7D4; + } + break; + case 0x400: + if (arg0->unk_00.unk_28 & 0x800) { + return 0x7D5; + } + break; + case 0x200: + if (arg0->unk_00.unk_28 & 0x400) { + return 0x7D5; + } + break; + case 0x800: + return 0x7D6; + } + return 0x7D3; +} + +void fn_1_BF9C(UnkM432DllStruct *arg0) +{ + Vec spC; + float var_f31; + float var_f30; + float var_f26; + + UnkM432DllStruct *var_r31; + + var_r31 = arg0; + var_r31->unk_00.unk_9C = fn_1_1E20(var_r31->unk_00.unk_9C, 180.0f + arg0->unk_C8->unk_18, 0.4f); + fn_1_52B8(arg0->unk_C8, &spC); + var_f31 = spC.x - var_r31->unk_00.unk_6C.x; + var_f30 = spC.z - var_r31->unk_00.unk_6C.z; + var_f26 = sqrtf((var_f31 * var_f31) + (var_f30 * var_f30)); + if (10.0f <= var_f26) { + var_f31 = 10.0f * (var_f31 / var_f26); + var_f30 = 10.0f * (var_f30 / var_f26); + } + var_r31->unk_00.unk_6C.x += var_f31; + var_r31->unk_00.unk_6C.z += var_f30; +} + +void fn_1_C33C(UnkM432DllStruct *arg0) +{ + Vec spC; + float sp8; + float var_f31; + float var_f30; + float var_f27; + UnkM432DllBss0SubStruct *var_r30; + s32 var_r29; + s32 *var_r28; + UnkM432DllStruct *var_r27; + + var_r28 = NULL; + if (arg0->unk_00.unk_38 == 0) { + for (var_r30 = lbl_1_bss_0[arg0->unk_184 >> 1].unk_10[arg0->unk_184 & 1], var_r29 = 0; var_r29 < 0x1F; var_r29++, var_r30++) + if ((arg0->unk_17C <= var_r29) && (var_r30->unk_14 & 0xF00) && (((var_r30->unk_14 & 0x700) == 0) || !(20.0f < arg0->unk_00.unk_6C.y))) { + fn_1_52B8(var_r30, &spC); + var_f31 = spC.x - arg0->unk_00.unk_6C.x; + var_f30 = spC.z - arg0->unk_00.unk_6C.z; + var_f27 = sqrtf((var_f31 * var_f31) + (var_f30 * var_f30)); + if (arg0->unk_00.unk_BC > var_f27) { + var_r27 = fn_1_51A8(arg0->unk_184 ^ 1); + if ((NULL == var_r27->unk_C8) || (var_r30->unk_08 != var_r27->unk_C8->unk_08)) { + arg0->unk_C8 = var_r30; + switch (var_r30->unk_14 & 0xF00) { + case 0x100: + var_r28 = lbl_1_data_2AC; + break; + case 0x200: + var_r28 = lbl_1_data_2D0; + break; + case 0x400: + var_r28 = lbl_1_data_2F4; + break; + case 0x800: + var_r28 = lbl_1_data_318; + break; + } + break; + } + } + } + } + + if (arg0->unk_C4 != var_r28) { + arg0->unk_C4 = var_r28; + if (NULL == var_r28) { + arg0->unk_C8 = NULL; + } + for (var_r29 = 0; var_r29 < 9; var_r29++) { + espDispOff(arg0->unk_118[var_r29]); + } + } +} + +void fn_1_C724(UnkM432DllStruct *var_r31, omObjData *var_r25, omObjData *var_r24) +{ + Vec spC; + float var_f25; + + UnkBss0Struct *var_r30; + UnkM432DllStruct *var_r29; + s32 var_r28; + void *var_r27; + s32 var_r26; + float var_f19; + + var_r30 = &lbl_1_bss_0[var_r31->unk_184 >> 1]; + fn_1_BF9C(var_r31); + if (fn_1_BF08(var_r31) == 0x7D4) { + var_r30->unk_1D4 += 1.0f - (2.0f * (var_r31->unk_14C / 60.0f)); + if (0.0f > var_r30->unk_1D4) { + var_r30->unk_1D4 = 0.0f; + } + if (1.0f < var_r30->unk_1D4) { + var_r30->unk_1D4 = 1.0f; + } + var_r31->unk_14C = 0.0f; + if (25.0f <= (var_r31->unk_C8->unk_38 += 1.0f)) { + var_r31->unk_C8->unk_38 = 25.0f; + } + omVibrate(var_r31->unk_188, 0xC, 6, 6); + } + else { + var_r31->unk_14C += 1.0f; + var_r30->unk_1D4 -= 0.016666668f; + if (0.0f > var_r30->unk_1D4) { + var_r30->unk_1D4 = 0.0f; + } + if (20.0f <= var_r31->unk_14C) { + var_r31->unk_14C = 0.0f; + if (0.0f >= (var_r31->unk_C8->unk_38 -= 1.0f)) { + var_r31->unk_C8->unk_38 = 0.0f; + } + } + } + HuAudFXPitchSet(var_r30->unk_1CC, (s32)(8191.0f * var_r30->unk_1D4)); + HuAudFXPitchSet(var_r30->unk_1D0, (s32)(8191.0f * (1.0f - (var_r31->unk_C8->unk_38 / 25.0f)))); + if (Hu3DMotionShiftIDGet(var_r25->model[0]) < 0) { + var_f25 = var_r31->unk_C8->unk_38 * (Hu3DMotionMaxTimeGet(var_r25->model[0]) / 25.0f); + Hu3DMotionTimeSet(var_r25->model[0], var_f25); + var_f25 = var_r31->unk_C8->unk_38 * (Hu3DMotionMaxTimeGet((var_r24->model[var_r31->unk_C8->unk_08])) / 25.0f); + Hu3DMotionTimeSet(var_r24->model[var_r31->unk_C8->unk_08], var_f25); + } + if ((25.0f <= var_r31->unk_C8->unk_38) || (var_r31->unk_C8->unk_38 == 0.0f)) { + if (25.0f <= var_r31->unk_C8->unk_38) { + var_r31->unk_17C++; + } + var_r31->unk_180 = 0x7D3; + fn_1_4ED8(&var_r31->unk_00, 0); + HuAudFXStop(var_r30->unk_1CC); + HuAudFXStop(var_r30->unk_1D0); + var_r30->unk_1CC = -1; + var_r30->unk_1D0 = -1; + } +} + +void fn_1_D0E0(UnkM432DllStruct *arg0, omObjData *arg1, omObjData *arg2) +{ + fn_1_BF9C(arg0); + if (fn_1_BF08(arg0) == 0x7D5) { + lbl_1_bss_0[arg0->unk_184 >> 1].unk_1DC += 1.0f - (2.0f * (arg0->unk_14C / 60.0f)); + if (0.0f > lbl_1_bss_0[arg0->unk_184 >> 1].unk_1DC) { + lbl_1_bss_0[arg0->unk_184 >> 1].unk_1DC = 0.0f; + } + if (1.0f < lbl_1_bss_0[arg0->unk_184 >> 1].unk_1DC) { + lbl_1_bss_0[arg0->unk_184 >> 1].unk_1DC = 1.0f; + } + arg0->unk_14C = 0.0f; + arg0->unk_C8->unk_3C += 3.0f; + omVibrate(arg0->unk_188, 0xC, 6, 6); + } + else { + arg0->unk_14C += 1.0f; + } + if (Hu3DMotionShiftIDGet(arg1->model[0]) < 0) { + Hu3DMotionTimeSet(arg1->model[0], 120.0 * (fmod(arg0->unk_C8->unk_38, 360.0) / 360.0)); + Hu3DMotionTimeSet( + arg2->model[arg0->unk_C8->unk_08], Hu3DMotionMaxTimeGet(arg2->model[arg0->unk_C8->unk_08]) * (fmod(arg0->unk_C8->unk_38, 360.0) / 360.0)); + } + if (20.0f <= arg0->unk_14C) { + arg0->unk_180 = 0x7D3; + fn_1_4ED8(&arg0->unk_00, 0); + } + else if (lbl_1_bss_0[arg0->unk_184 >> 1].unk_1D8 < 0) { + lbl_1_bss_0[arg0->unk_184 >> 1].unk_1DC = 0.5f; + lbl_1_bss_0[arg0->unk_184 >> 1].unk_1D8 = HuAudFXPlay((arg0->unk_184 & 2) == 0 ? 0x68E : 0x68F); + } +} + +void fn_1_D9EC(UnkM432DllStruct *arg0, omObjData *arg1, omObjData *arg2) +{ + float var_f28; + float var_f27; + float var_f23; + + fn_1_BF9C(arg0); + if ((arg0->unk_00.unk_30 <= 0) || (arg0->unk_00.unk_34 <= 0)) { + var_f27 = 0.0f; + if (arg0->unk_00.unk_30 > 0) { + var_f27 = -(arg0->unk_00.unk_30 / 150.0f); + } + if (arg0->unk_00.unk_34 > 0) { + var_f27 = arg0->unk_00.unk_34 / 150.0f; + } + if (var_f27 != 0.0f) { + if ((0.0f > var_f27 ? -1 : 1) != (0.0f > arg0->unk_150 ? -1 : 1)) { + var_f28 = arg0->unk_158 - arg0->unk_154; + if (0.0f < var_f28) { + if (0.98f < var_f28) { + var_f28 += 0.6f; + if ((arg0->unk_184 & 2) == 0) { + HuAudFXPlay(0x692); + } + else { + HuAudFXPlay(0x693); + } + } + arg0->unk_C8->unk_38 += 10.0f * var_f28; + var_f23 = var_f28; + if (0.5f > var_f23) { + var_f23 = 0.0f; + } + fn_1_B974(&arg0->unk_C8->unk_2C, var_f23 / 2, (arg0->unk_184 & 1) ? -1.0f : 1.0f); + } + arg0->unk_154 = arg0->unk_158; + } + arg0->unk_150 = var_f27; + arg0->unk_158 = arg0->unk_158 + (0.1f * arg0->unk_150); + if (0.0f > arg0->unk_158) { + arg0->unk_158 = 0.0f; + } + if (1.0f < arg0->unk_158) { + arg0->unk_158 = 1.0f; + } + } + } + if (Hu3DMotionShiftIDGet(arg1->model[0]) < 0) { + Hu3DMotionTimeSet(arg1->model[0], arg0->unk_158 * Hu3DMotionMaxTimeGet(arg1->model[0])); + Hu3DMotionTimeSet(arg2->model[arg0->unk_C8->unk_08], arg0->unk_158 * Hu3DMotionMaxTimeGet(arg2->model[arg0->unk_C8->unk_08])); + } + if (1000.0f <= lbl_1_bss_0[arg0->unk_184 >> 1].unk_124) { + arg0->unk_180 = 0x7D3; + fn_1_4ED8(&arg0->unk_00, 0); + } +} + +void fn_1_E3B4(UnkM432DllStruct *arg0, omObjData *arg1) +{ + float var_f31; + float var_f30; + s32 var_r28; + + if (arg0->unk_00.unk_38 != 0) { + fn_1_40C0(&arg0->unk_00); + return; + } + if (arg0->unk_C8->unk_14 & 0x18) { + if (((arg0->unk_C8->unk_14 & 8) && (arg0->unk_178 <= 0)) || ((arg0->unk_C8->unk_14 & 0x10) && (arg0->unk_178 <= 1))) { + arg0->unk_178++; + omVibrate(arg0->unk_188, 0xC, 4, 2); + if ((arg0->unk_184 & 2) == 0) { + HuAudFXPlay(0x690); + } + else { + HuAudFXPlay(0x691); + } + } + if ((arg0->unk_184 & 1) != 0) { + var_r28 = 1; + } + else { + var_r28 = -1; + } + arg0->unk_170 = var_r28 * 0x18; + arg0->unk_174 = 0x48; + arg0->unk_00.unk_9C = 180.0f; + if ((((arg0->unk_C8->unk_14 & 8) == 0) || !(-11100.0f < lbl_1_bss_0[arg0->unk_184 >> 1].unk_28.z)) + && (((arg0->unk_C8->unk_14 & 0x10) == 0) || !(-13500.0f < lbl_1_bss_0[arg0->unk_184 >> 1].unk_28.z))) { + var_f30 = 800.0f - (400.0f * (arg0->unk_184 & 1)); + if (0.0f > (lbl_1_bss_0[arg0->unk_184 >> 1].unk_74 - lbl_1_bss_0[arg0->unk_184 >> 1].unk_28.z)) { + var_f31 = -(lbl_1_bss_0[arg0->unk_184 >> 1].unk_74 - lbl_1_bss_0[arg0->unk_184 >> 1].unk_28.z); + } + else { + var_f31 = lbl_1_bss_0[arg0->unk_184 >> 1].unk_74 - lbl_1_bss_0[arg0->unk_184 >> 1].unk_28.z; + } + if (!(var_f30 < var_f31)) { + fn_1_5148(arg0); + HuAudCharVoicePlay(arg0->unk_18C, 0x122); + goto block_26; + } + } + } + else { + arg0->unk_170 = 0; + arg0->unk_174 = -0x48; + arg0->unk_00.unk_9C = 0.0f; + block_26: + arg0->unk_D0 = 0; + arg0->unk_D4[arg0->unk_FC] = arg0->unk_C8->unk_44 - arg0->unk_17C; + arg0->unk_FC = (arg0->unk_FC + 1) % 10; + arg0->unk_180 = 0x7D8; + arg0->unk_00.unk_6C = arg0->unk_C8->unk_2C; + arg0->unk_00.unk_6C.y -= 200.0f; + fn_1_4ED8(&arg0->unk_00, 3); + arg0->unk_00.unk_3C |= 8; + } +} + +void fn_1_E9E4(UnkM432DllStruct *arg0) +{ + float var_f31; + float var_f30; + float var_f28; + + arg0->unk_00.unk_20 = arg0->unk_170; + arg0->unk_00.unk_24 = arg0->unk_174; + arg0->unk_00.unk_28 = 0x100; + arg0->unk_00.unk_2C = 0x100; + fn_1_40C0(&arg0->unk_00); + var_f31 = arg0->unk_C8->unk_2C.x - arg0->unk_00.unk_6C.x; + var_f30 = arg0->unk_C8->unk_2C.z - arg0->unk_00.unk_6C.z; + if (sqrtf((var_f31 * var_f31) + (var_f30 * var_f30)) < 100.0f) { + var_f28 = 0.0f; + if (arg0->unk_174 > 0) { + var_f28 = 100.0f; + } + if ((arg0->unk_C8->unk_2C.y + var_f28) > arg0->unk_00.unk_6C.y) { + arg0->unk_00.unk_84.y = 26.766666f; + arg0->unk_00.unk_A4 = 1.0f; + return; + } + arg0->unk_00.unk_3C &= 0xFFFFFFF7; + return; + } + if ((0.0f > arg0->unk_00.unk_84.y) && ((100.0f + arg0->unk_C8->unk_2C.y) > arg0->unk_00.unk_6C.y)) { + arg0->unk_180 = 0x7D3; + HuAudCharVoicePlay(arg0->unk_18C, 0x10D); + } +} + +void fn_1_EC7C(UnkM432DllStruct *arg0, omObjData *arg1) +{ + if ((lbl_1_bss_0[arg0->unk_184 >> 1].unk_1E4 - (arg0->unk_00.unk_BC / 2)) > arg0->unk_00.unk_6C.y) { + Hu3DModelShadowDispOff(arg1->model[0]); + return; + } + Hu3DModelShadowDispOn(arg1->model[0]); +} + +void fn_1_ED0C(omObjData *object) +{ + float var_f31; + float var_f30; + float var_f26; + UnkBss0Struct *var_r28; + UnkM432DllStruct *var_r31; + s32 var_r26; + s32 var_r22; + + var_r31 = object->data; + var_r28 = &lbl_1_bss_0[var_r31->unk_184 >> 1]; + if (lbl_1_bss_41C->work[0] >= 0x3EC) { + if (lbl_1_bss_3FC != (var_r31->unk_184 & 2)) { + var_r26 = 1; + if (var_r31->unk_00.unk_A8 < var_r31->unk_00.unk_6C.y) { + var_r26 = 0; + } + if (var_r31->unk_180 == 0x7D7) { + var_r26 = 0; + } + if (var_r31->unk_180 == 0x7D8) { + var_r26 = 0; + } + if (var_r31->unk_180 == 0x7D9) { + var_r26 = 0; + } + if ((var_r31->unk_180 == 0x7D3) && (var_r31->unk_00.unk_38 == 1)) { + var_r26 = 0; + } + if (var_r26 != 0) { + var_r31->unk_180 = 0x7DA; + if (lbl_1_bss_3FC >= 0) { + Hu3DModelAttrReset(object->model[0], HU3D_MOTATTR_PAUSE); + Hu3DMotionShiftSet(object->model[0], object->motion[10], 0.0f, 8.0f, HU3D_ATTR_NONE); + } + else { + var_r31->unk_168 = 1; + Hu3DModelAttrReset(object->model[0], HU3D_MOTATTR_PAUSE); + Hu3DMotionShiftSet(object->model[0], object->motion[0], 0.0f, 8.0f, HU3D_MOTATTR_LOOP); + } + } + } + else { + var_r31->unk_180 = 0x7DB; + var_r31->unk_13C.x += 100.0f * (var_r31->unk_184 & 1 ? -1.0f : 1.0f); + var_r31->unk_13C.z += -475.0f; + Hu3DModelAttrReset(object->model[0], HU3D_MOTATTR_PAUSE); + Hu3DMotionShiftSet(object->model[0], object->motion[2], 0.0f, 8.0f, HU3D_MOTATTR_LOOP); + } + if (var_r31->unk_180 >= 0x7DA) { + for (var_r22 = 0; var_r22 < 9; var_r22++) { + espDispOff(var_r31->unk_118[var_r22]); + } + if (lbl_1_bss_3FC == (var_r31->unk_184 & 2)) { + GWPlayerCoinWinSet(var_r31->unk_188, 10); + } + object->func = fn_1_10250; + return; + } + } + if (GWPlayerCfg[var_r31->unk_188].iscom != 0) { + var_r31->unk_00.unk_20 = 0; + var_r31->unk_00.unk_24 = 0; + var_r31->unk_00.unk_28 = 0; + var_r31->unk_00.unk_2C = 0; + var_r31->unk_00.unk_30 = 0; + var_r31->unk_00.unk_34 = 0; + fn_1_93BC(var_r31); + } + else { + var_r31->unk_00.unk_20 = HuPadStkX[var_r31->unk_190]; + var_r31->unk_00.unk_24 = HuPadStkY[var_r31->unk_190]; + var_r31->unk_00.unk_28 = HuPadBtnDown[var_r31->unk_190]; + var_r31->unk_00.unk_2C = HuPadBtn[var_r31->unk_190]; + var_r31->unk_00.unk_30 = HuPadTrigL[var_r31->unk_190]; + var_r31->unk_00.unk_34 = HuPadTrigR[var_r31->unk_190]; + } + if ((var_r31->unk_180 == 0x7D3) && ((var_r31->unk_13C.x != 0.0f) || (var_r31->unk_13C.z != 0.0f))) { + var_f30 = var_r31->unk_13C.x - var_r31->unk_00.unk_6C.x; + var_f31 = var_r31->unk_13C.z - var_r31->unk_00.unk_6C.z; + if (var_r31->unk_00.unk_BC < (0.0f > var_f31 ? -var_f31 : var_f31)) { + var_f30 = 0.0f; + } + var_f26 = sqrtf((var_f30 * var_f30) + (var_f31 * var_f31)); + if (10.0f <= var_f26) { + var_f30 /= var_f26; + var_f31 /= var_f26; + } + else { + var_f30 = 0.0f; + var_f31 = 0.0f; + var_r31->unk_00.unk_9C = var_r31->unk_148; + } + var_r31->unk_00.unk_20 = 72.0f * var_f30; + var_r31->unk_00.unk_24 = 72.0f * -var_f31; + var_r31->unk_00.unk_28 = 0; + var_r31->unk_00.unk_2C = 0; + var_r31->unk_00.unk_30 = 0; + var_r31->unk_00.unk_34 = 0; + } + switch (var_r31->unk_180) { + case 0x7D3: + if ((var_r31->unk_16C != 0) && ((var_r31->unk_00.unk_3C & 0x101) != 0)) { + var_r31->unk_16C = 0; + var_r31->unk_00.unk_3C &= 0xFFFFFFEF; + fn_1_4ED8(&var_r31->unk_00, 0); + } + fn_1_40C0(&var_r31->unk_00); + fn_1_C33C(var_r31); + if ((NULL != var_r31->unk_C4) && (NULL != var_r31->unk_C8)) { + var_r31->unk_180 = fn_1_BF08(var_r31); + switch (var_r31->unk_180) { + case 0x7D4: + var_r31->unk_14C = 0.0f; + var_r31->unk_C8->unk_38 = 1.0f; + var_r28->unk_1D4 = 0.5f; + if (var_r28->unk_1CC < 0) { + var_r28->unk_1CC = HuAudFXPlay((var_r31->unk_184 & 2) == 0 ? 0x68C : 0x68D); + } + if (var_r28->unk_1D0 < 0) { + var_r28->unk_1D0 = HuAudFXPlay((var_r31->unk_184 & 2) == 0 ? 0x695 : 0x696); + } + Hu3DMotionShiftSet(object->model[0], object->motion[5], 0.0f, 8.0f, HU3D_MOTATTR_PAUSE); + break; + case 0x7D5: + var_r31->unk_14C = 0.0f; + var_r31->unk_C8->unk_3C += 3.0f; + if (var_r28->unk_1D8 < 0) { + var_r28->unk_1DC = 0.5f; + var_r28->unk_1D8 = HuAudFXPlay((var_r31->unk_184 & 2) == 0 ? 0x68E : 0x68F); + } + Hu3DMotionShiftSet( + object->model[0], object->motion[7], 120.0 * (fmod(var_r31->unk_C8->unk_38, 360.0) / 360.0), 8.0f, HU3D_MOTATTR_PAUSE); + break; + case 0x7D6: + var_r31->unk_14C = 0.0f; + var_r31->unk_150 = -1.0f; + var_r31->unk_158 = 0.0f; + var_r31->unk_154 = 0.0f; + Hu3DMotionShiftSet(object->model[0], object->motion[8], 0.0f, 8.0f, HU3D_MOTATTR_PAUSE); + break; + } + } + else if (-800.0f > var_r31->unk_00.unk_6C.y) { + var_r31->unk_00.unk_3C |= 0x10; + if (NULL == lbl_1_bss_0[var_r31->unk_184 >> 1].unk_08) { + lbl_1_bss_0[var_r31->unk_184 >> 1].unk_08 = object; + lbl_1_bss_0[var_r31->unk_184 >> 1].unk_1B4 = -1; + } + else { + lbl_1_bss_0[var_r31->unk_184 >> 1].unk_0C = object; + } + } + break; + case 0x7D4: + fn_1_C724(var_r31, object, lbl_1_bss_0[var_r31->unk_184 >> 1].unk_04); + break; + case 0x7D5: + fn_1_D0E0(var_r31, object, lbl_1_bss_0[var_r31->unk_184 >> 1].unk_04); + break; + case 0x7D6: + fn_1_D9EC(var_r31, object, lbl_1_bss_0[var_r31->unk_184 >> 1].unk_04); + break; + case 0x7D7: + fn_1_E3B4(var_r31, object); + break; + case 0x7D8: + fn_1_E9E4(var_r31); + break; + case 0x7D9: + break; + default: + OSReport("*** player mode error(%d)!!\n", var_r31->unk_180); + break; + } + fn_1_EC7C(var_r31, object); + fn_1_BAA8(var_r31); + + lbl_1_bss_0[var_r31->unk_184 >> 1].unk_1E8 += 1.0f; + + lbl_1_bss_0[var_r31->unk_184 >> 1].unk_1EC += fn_1_A974(var_r31); + lbl_1_bss_0[var_r31->unk_184 >> 1].unk_1F0[var_r31->unk_184 & 1] = var_r31->unk_00.unk_6C.z; + fn_1_2DD4(&var_r31->unk_00); +} + +void fn_1_10250(omObjData *object) +{ + float var_f31; + float var_f30; + float var_f24; + UnkM432DllStruct *var_r31; + omObjData *var_r29; + + var_r31 = object->data; + var_r29 = lbl_1_bss_0[var_r31->unk_184 >> 1].unk_04; + switch (var_r31->unk_180) { + case 0x7D0: + if (lbl_1_bss_41C->work[0] >= 0x3E9) { + var_r31->unk_180++; + Hu3DModelAttrReset(object->model[0], HU3D_ATTR_DISPOFF); + HuAudCharVoicePlay(var_r31->unk_18C, 0x125); + } + break; + case 0x7D1: + var_r31->unk_00.unk_20 = 0; + var_r31->unk_00.unk_24 = 0x48; + var_r31->unk_00.unk_28 = 0x100; + var_r31->unk_00.unk_2C = 0x100; + fn_1_40C0(&var_r31->unk_00); + if (200.0f > var_r31->unk_00.unk_6C.y) { + var_r31->unk_00.unk_84.y = 26.766666f; + var_r31->unk_00.unk_A4 = 1.0f; + } + else { + var_r31->unk_180++; + } + break; + case 0x7D2: + var_r31->unk_00.unk_20 = 0; + var_r31->unk_00.unk_24 = 0; + var_r31->unk_00.unk_28 = 0; + var_r31->unk_00.unk_2C = 0; + if (var_r31->unk_00.unk_38 == 1) { + var_r31->unk_00.unk_24 = 0x48; + } + fn_1_40C0(&var_r31->unk_00); + if ((var_r31->unk_00.unk_38 == 0) && (lbl_1_bss_41C->work[0] >= 0x3EB)) { + var_r31->unk_180++; + object->func = fn_1_ED0C; + } + break; + case 0x7DA: + if ((var_r31->unk_168 != 0) && (lbl_1_bss_3FC < 0) && (lbl_1_bss_41C->work[0] >= 0x3F1)) { + var_r31->unk_168 = 0; + Hu3DModelAttrReset(object->model[0], HU3D_MOTATTR_PAUSE); + Hu3DMotionShiftSet(object->model[0], object->motion[10], 0.0f, 8.0f, HU3D_ATTR_NONE); + } + break; + case 0x7DB: + var_f31 = var_r31->unk_13C.x - var_r31->unk_00.unk_6C.x; + var_f30 = var_r31->unk_13C.z - var_r31->unk_00.unk_6C.z; + if (1.0f > (0.0f > var_f31 ? -var_f31 : var_f31)) { + if (1.0f > (0.0f > var_f30 ? -var_f30 : var_f30)) { + var_r31->unk_180++; + var_r31->unk_160 = 0.0f; + var_r31->unk_164 = var_r31->unk_00.unk_6C.y; + Hu3DMotionShiftSet(object->model[0], object->motion[3], 0.0f, 8.0f, HU3D_ATTR_NONE); + break; + } + } + if (1.0f < (0.0f > var_f31 ? -var_f31 : var_f31)) { + var_f30 = 0.0f; + } + var_f24 = sqrtf((var_f31 * var_f31) + (var_f30 * var_f30)); + if (10.0f < var_f24) { + var_f31 = 10.0f * (var_f31 / var_f24); + var_f30 = 10.0f * (var_f30 / var_f24); + } + var_r31->unk_00.unk_6C.x += var_f31; + var_r31->unk_00.unk_6C.z += var_f30; + + var_r31->unk_00.unk_9C = fn_1_1E20(var_r31->unk_00.unk_9C, atan2d(var_f31, var_f30), 0.4f); + break; + case 0x7DC: + var_r31->unk_160 += 5.0f; + var_r31->unk_00.unk_6C.z -= 10.0f; + var_r31->unk_00.unk_6C.y = lbl_1_bss_0[var_r31->unk_184 >> 1].unk_118.y + (120.0 * sind(var_r31->unk_160)); + if (180.0f <= var_r31->unk_160) { + var_r31->unk_180++; + Hu3DMotionShiftSet(object->model[0], object->motion[4], 0.0f, 8.0f, HU3D_ATTR_NONE); + } + break; + case 0x7DD: + if ((Hu3DMotionShiftIDGet(object->model[0]) < 0) && (Hu3DMotionEndCheck(object->model[0]) != 0)) { + var_r31->unk_180++; + Hu3DMotionShiftSet(object->model[0], object->motion[0], 0.0f, 8.0f, HU3D_MOTATTR_LOOP); + Hu3DModelAttrReset(var_r29->model[9], HU3D_MOTATTR_PAUSE); + Hu3DModelAttrReset(var_r29->model[15], HU3D_MOTATTR_PAUSE); + Hu3DModelAttrReset(var_r29->model[23], HU3D_MOTATTR_PAUSE); + HuAudFXPlay(0x694); + } + break; + case 0x7DE: + var_r31->unk_00.unk_9C = fn_1_1E20(var_r31->unk_00.unk_9C, 0.0f, 0.4f); + if ((Hu3DMotionEndCheck(var_r29->model[9]) != 0) && (Hu3DMotionEndCheck(var_r29->model[15]) != 0)) { + var_r31->unk_180++; + } + break; + case 0x7DF: + var_r31->unk_00.unk_6C.y = lbl_1_bss_0[var_r31->unk_184 >> 1].unk_118.y; + if (lbl_1_bss_41C->work[0] >= 0x3F1) { + var_r31->unk_180++; + Hu3DMotionShiftSet(object->model[0], object->motion[9], 0.0f, 8.0f, HU3D_MOTATTR_LOOP); + HuAudCharVoicePlay(var_r31->unk_18C, 0x125); + } + break; + case 0x7E0: + var_r31->unk_00.unk_6C.y = lbl_1_bss_0[var_r31->unk_184 >> 1].unk_118.y; + break; + case 0x7D3: + case 0x7D4: + case 0x7D5: + case 0x7D6: + case 0x7D7: + case 0x7D8: + case 0x7D9: + default: + OSReport("*** player mode error(%d)!!\n", var_r31->unk_180); + break; + } + fn_1_EC7C(var_r31, object); + fn_1_2DD4(&var_r31->unk_00); +} + +void fn_1_10CCC(omObjData *object) +{ + Vec sp8; + + UnkM432DllStruct *var_r31; + s32 var_r29; + s32 var_r28; + s32 var_r27; + UnkM432DllBss0SubStruct *var_r26; + s32 var_r24; + s32 var_r23; + + var_r31 = object->data; + var_r26 = lbl_1_bss_0[var_r31->unk_184 >> 1].unk_10[var_r31->unk_184 & 1]; + var_r31->unk_18C = GWPlayerCfg[var_r31->unk_188].character; + var_r31->unk_190 = GWPlayerCfg[var_r31->unk_188].pad_idx; + var_r31->unk_180 = 0x7D0; + var_r31->unk_168 = 0; + var_r31->unk_CC = NULL; + var_r31->unk_C4 = NULL; + var_r31->unk_C8 = NULL; + var_r31->unk_150 = 0.0f; + var_r31->unk_158 = 0.0f; + var_r31->unk_154 = 0.0f; + var_r31->unk_17C = 0; + var_r31->unk_15C = 10000.0f; + var_r31->unk_178 = 0; + var_r31->unk_16C = 0; + var_r31->unk_104 = 0.5f; + var_r31->unk_108 = 0.0f; + fn_1_5148(var_r31); + sp8 = var_r26[var_r31->unk_17C++].unk_2C; + sp8.y -= 200.0f; + fn_1_2C1C(&var_r31->unk_00, object, var_r31->unk_188, var_r31->unk_18C, lbl_1_data_268, 0, &sp8, 180.0f); + var_r31->unk_00.unk_04 = fn_1_AA1C; + var_r31->unk_00.unk_08 = fn_1_ACC8; + fn_1_2DC8(&var_r31->unk_00, 1, (var_r31->unk_184 & 2) == 0 ? lbl_1_data_354 : lbl_1_data_36C); + var_r31->unk_00.unk_0C = fn_1_AF28; + var_r31->unk_13C.x = 0.0f; + var_r31->unk_13C.y = 0.0f; + var_r31->unk_13C.z = 0.0f; + object->model[0] = CharModelCreate(lbl_1_data_0[var_r31->unk_18C], 4); + CharModelStepTypeSet(lbl_1_data_0[var_r31->unk_18C], 0); + for (var_r29 = 0; var_r29 < 0xB; var_r29++) { + object->motion[var_r29] = CharModelMotionCreate(lbl_1_data_0[var_r31->unk_18C], lbl_1_data_108[var_r31->unk_18C][var_r29]); + CharModelMotionSet(lbl_1_data_0[var_r31->unk_18C], object->motion[var_r29]); + } + Hu3DModelCameraSet(object->model[0], lbl_1_data_A0[var_r31->unk_184 >> 1]); + Hu3DModelAttrSet(object->model[0], HU3D_ATTR_DISPOFF); + Hu3DModelAttrSet(object->model[0], HU3D_MOTATTR_LOOP); + Hu3DModelLayerSet(object->model[0], 2); + Hu3DMotionSet(object->model[0], object->motion[0]); + Hu3DModelShadowSet(object->model[0]); + fn_1_2DD4(&var_r31->unk_00); + for (var_r29 = 0; var_r29 < 9; var_r29++) { + var_r31->unk_118[var_r29] = espEntry(lbl_1_data_288[var_r29], 0, 0); + espDrawNoSet(var_r31->unk_118[var_r29], 0); + espDispOff(var_r31->unk_118[var_r29]); + espAttrSet(var_r31->unk_118[var_r29], HUSPR_ATTR_NOANIM); + espBankSet(var_r31->unk_118[var_r29], 0); + espPriSet(var_r31->unk_118[var_r29], 0x80 - var_r29); + } + espTPLvlSet(var_r31->unk_118[0], 0.9f); + espTPLvlSet(var_r31->unk_118[1], 0.9f); + if (GWPlayerCfg[var_r31->unk_188].iscom != 0) { + switch (GWPlayerCfg[var_r31->unk_188].diff) { + case 0: + var_r31->unk_CC = &lbl_1_data_1794; + break; + case 1: + var_r31->unk_CC = &lbl_1_data_17B4; + break; + case 2: + var_r31->unk_CC = &lbl_1_data_17D4; + break; + case 3: + default: + var_r31->unk_CC = &lbl_1_data_17F4; + break; + } + } + CharModelLayerSetAll2(5); + CharModelMotionDataClose(lbl_1_data_0[var_r31->unk_18C]); + object->func = fn_1_10250; +} + +void fn_1_113F0(omObjData *object) { } + +void fn_1_113F4(omObjData *var_r31) +{ + s32 sp48; + + UnkM432DllBss0SubStruct *var_r30; + s32 var_r28; + UnkBss0Struct *var_r22; + + var_r22 = &lbl_1_bss_0[var_r31->work[0]]; + var_r31->model[0] = fn_1_46C(DATA_MAKE_NUM(DATADIR_M432, 0x02)); + Hu3DModelCameraSet(var_r31->model[0], lbl_1_data_A0[var_r31->work[0]]); + Hu3DModelAttrSet(var_r31->model[0], HU3D_ATTR_DISPOFF); + Hu3DModelAttrSet(var_r31->model[0], HU3D_MOTATTR_LOOP); + Hu3DModelAttrReset(var_r31->model[0], HU3D_MOTATTR_PAUSE); + Hu3DModelLayerSet(var_r31->model[0], 0); + + var_r31->model[1] = fn_1_46C(DATA_MAKE_NUM(DATADIR_M432, 0x04)); + Hu3DModelCameraSet(var_r31->model[1], lbl_1_data_A0[var_r31->work[0]]); + Hu3DModelAttrSet(var_r31->model[1], HU3D_ATTR_DISPOFF); + Hu3DModelAttrSet(var_r31->model[1], HU3D_MOTATTR_LOOP); + Hu3DModelAttrReset(var_r31->model[1], HU3D_MOTATTR_PAUSE); + Hu3DModelLayerSet(var_r31->model[1], 0); + + var_r31->model[2] = fn_1_46C(lbl_1_data_528[var_r31->work[0]]); + Hu3DModelCameraSet(var_r31->model[2], lbl_1_data_A0[var_r31->work[0]]); + Hu3DModelAttrSet(var_r31->model[2], HU3D_ATTR_DISPOFF); + Hu3DModelAttrSet(var_r31->model[2], HU3D_MOTATTR_LOOP); + Hu3DModelAttrReset(var_r31->model[2], HU3D_MOTATTR_PAUSE); + Hu3DModelLayerSet(var_r31->model[2], 1); + + var_r31->model[3] = Hu3DModelCreateFile(DATA_MAKE_NUM(DATADIR_M432, 0x01)); + Hu3DModelCameraSet(var_r31->model[3], lbl_1_data_A0[var_r31->work[0]]); + Hu3DModelAttrSet(var_r31->model[3], HU3D_ATTR_DISPOFF); + Hu3DModelAttrSet(var_r31->model[3], HU3D_MOTATTR_PAUSE); + Hu3DModelAttrReset(var_r31->model[3], HU3D_MOTATTR_LOOP); + Hu3DModelLayerSet(var_r31->model[3], 0); + + var_r31->model[24] = fn_1_46C(DATA_MAKE_NUM(DATADIR_M432, 0x03)); + Hu3DModelCameraSet(var_r31->model[24], lbl_1_data_A0[var_r31->work[0]]); + Hu3DModelLayerSet(var_r31->model[24], 0); + Hu3DModelPosSet(var_r31->model[24], 0.0f, 0.0f, 0.0f); + Hu3DModelRotSet(var_r31->model[24], 0.0f, 0.0f, 0.0f); + Hu3DModelAttrSet(var_r31->model[24], HU3D_ATTR_DISPOFF); + Hu3DModelAttrSet(var_r31->model[24], HU3D_MOTATTR_PAUSE); + Hu3DModelAttrReset(var_r31->model[24], HU3D_MOTATTR_LOOP); + + var_r31->model[25] = Hu3DModelCreateFile(DATA_MAKE_NUM(DATADIR_M432, 0x07)); + Hu3DMotionSet(var_r31->model[25], Hu3DJointMotionFile(var_r31->model[25], DATA_MAKE_NUM(DATADIR_M432, 0x08))); + Hu3DModelCameraSet(var_r31->model[25], lbl_1_data_A0[var_r31->work[0]]); + Hu3DModelAttrSet(var_r31->model[25], HU3D_ATTR_DISPOFF); + Hu3DModelAttrSet(var_r31->model[25], HU3D_MOTATTR_LOOP); + Hu3DModelAttrReset(var_r31->model[25], HU3D_MOTATTR_PAUSE); + Hu3DModelLayerSet(var_r31->model[25], 2); + Hu3DModelShadowSet(var_r31->model[25]); + omSetTra(var_r31, var_r22->unk_28.x, 0.0f, 0.0f); + omSetRot(var_r31, 0.0f, 0.0f, 0.0f); + for (var_r28 = 0; var_r28 < 0x1A; var_r28++) { + Hu3DModelPosSet(var_r31->model[var_r28], var_r22->unk_28.x, 0.0f, 0.0f); + Hu3DModelRotSet(var_r31->model[var_r28], 0.0f, 0.0f, 0.0f); + } + for (var_r28 = 0; var_r28 < 2; var_r28++) { + var_r22->unk_10[var_r28] = HuMemDirectMallocNum(HEAP_SYSTEM, 31 * sizeof(UnkM432DllBss0SubStruct), MEMORY_DEFAULT_NUM); + memcpy(var_r22->unk_10[var_r28], var_r28 == 0 ? &lbl_1_data_5EC : &lbl_1_data_EDC, 31 * sizeof(UnkM432DllBss0SubStruct)); + for (var_r30 = var_r22->unk_10[var_r28], sp48 = 0; sp48 < 0x1F; sp48++, var_r30++) { + fn_1_1D18(var_r31->model[3], var_r30->unk_00, &var_r30->unk_20); + var_r30->unk_2C = var_r30->unk_20; + var_r30->unk_38 = 0.0f; + var_r30->unk_3C = 0.0f; + var_r30->unk_40 = -1; + var_r30->unk_44 = sp48; + if ((var_r30->unk_08 > 0) && (var_r30->unk_0C[var_r31->work[0]] != 0)) { + var_r31->model[var_r30->unk_08] = fn_1_46C(var_r30->unk_0C[var_r31->work[0]]); + Hu3DModelCameraSet(var_r31->model[var_r30->unk_08], lbl_1_data_A0[var_r31->work[0]]); + Hu3DModelLayerSet(var_r31->model[var_r30->unk_08], 0); + Hu3DModelPosSet(var_r31->model[var_r30->unk_08], var_r30->unk_2C.x, var_r30->unk_2C.y, var_r30->unk_2C.z); + Hu3DModelRotSet(var_r31->model[var_r30->unk_08], 0.0f, var_r30->unk_18, 0.0f); + Hu3DModelAttrSet(var_r31->model[var_r30->unk_08], HU3D_ATTR_DISPOFF | HU3D_ATTR_NOCULL); + Hu3DModelAttrSet(var_r31->model[var_r30->unk_08], HU3D_MOTATTR_PAUSE); + Hu3DModelAttrReset(var_r31->model[var_r30->unk_08], HU3D_MOTATTR_LOOP); + Hu3DModelAttrReset(var_r31->model[var_r30->unk_08], HU3D_ATTR_DISPOFF); + } + } + } + for (var_r28 = 0; var_r28 < 4; var_r28++) { + lbl_1_bss_0[var_r31->work[0]].unk_88[var_r28][2].y = 35.0f; + } + fn_1_1D18(var_r31->model[3], "m432_00-d0", &lbl_1_bss_0[var_r31->work[0]].unk_88[0][0]); + fn_1_1D18(var_r31->model[3], "m432_00-d0", &lbl_1_bss_0[var_r31->work[0]].unk_88[1][0]); + fn_1_1D18(var_r31->model[3], "m432_00-d1", &lbl_1_bss_0[var_r31->work[0]].unk_88[2][0]); + fn_1_1D18(var_r31->model[3], "m432_00-d1", &lbl_1_bss_0[var_r31->work[0]].unk_88[3][0]); + + fn_1_5364(var_r31->work[0], var_r31); + + fn_1_1D18(var_r31->model[3], "m432_00-h0", &lbl_1_bss_0[var_r31->work[0]].unk_118); + for (var_r28 = 0; var_r28 < 8; var_r28++) { + fn_1_1D18(var_r31->model[3], lbl_1_data_3DC[var_r28], &lbl_1_bss_0[var_r31->work[0]].unk_130[var_r28]); + if ((var_r28 % 4) < 2) { + lbl_1_bss_0[var_r31->work[0]].unk_130[var_r28].z -= 150.0f; + } + } + fn_1_1D18(var_r31->model[3], "m432_00-n0", &lbl_1_bss_0[var_r31->work[0]].unk_1C0); + Hu3DModelShadowMapSet(var_r31->model[0]); + Hu3DModelShadowMapSet(var_r31->model[20]); + Hu3DModelShadowMapSet(var_r31->model[21]); + Hu3DModelAttrReset(var_r31->model[0], HU3D_ATTR_DISPOFF); + Hu3DModelAttrReset(var_r31->model[1], HU3D_ATTR_DISPOFF); + Hu3DModelAttrReset(var_r31->model[2], HU3D_ATTR_DISPOFF); + var_r31->func = fn_1_113F0; +} + +void fn_1_12800(omObjData *object) { } + +void fn_1_12804(omObjData *object) +{ + object->model[0] = Hu3DModelCreateFile(DATA_MAKE_NUM(DATADIR_M432, 0x00)); + Hu3DModelAttrSet(object->model[0], HU3D_ATTR_DISPOFF); + omSetTra(object, lbl_1_bss_0[object->work[0]].unk_28.x, 0.0f, 0.0f); + omSetRot(object, 0.0f, 0.0f, 0.0f); + object->func = fn_1_12800; +} + +void fn_1_128C8(omObjData *object) +{ + s32 var_r31; + UnkM432DllStruct *var_r30; + UnkM432DllStruct *var_r29; + s32 var_r28; + s32 var_r27; + void *var_r26; + void *var_r25; + omObjData *var_r24; + void *var_r23; + void *var_r22; + + if (lbl_1_bss_41C->work[0] >= 0x3EB) { + for (var_r31 = 0; var_r31 < 2; var_r31++) { + var_r24 = lbl_1_bss_0[var_r31].unk_04; + var_r30 = fn_1_51A8(var_r31 * 2); + var_r29 = fn_1_51A8(var_r31 * 2 + 1); + if ((var_r30->unk_180 == 0x7DF) && (var_r29->unk_180 == 0x7DF)) { + lbl_1_bss_0[var_r31].unk_12C += 0.05f; + if (12.0f < lbl_1_bss_0[var_r31].unk_12C) { + lbl_1_bss_0[var_r31].unk_12C = 12.0f; + } + lbl_1_bss_0[var_r31].unk_118.y += lbl_1_bss_0[var_r31].unk_12C; + Hu3DModelPosSet(var_r24->model[22], lbl_1_bss_0[var_r31].unk_118.x, lbl_1_bss_0[var_r31].unk_118.y, lbl_1_bss_0[var_r31].unk_118.z); + lbl_1_bss_0[var_r31].unk_28.y += 0.1f * ((500.0f + lbl_1_bss_0[var_r31].unk_118.y) - lbl_1_bss_0[var_r31].unk_28.y); + lbl_1_bss_0[var_r31].unk_1C.y += 0.01f * (1000.0f - lbl_1_bss_0[var_r31].unk_1C.y); + lbl_1_bss_0[var_r31].unk_1C.z += 0.002f * ((4000.0f + lbl_1_bss_0[var_r31].unk_118.z) - lbl_1_bss_0[var_r31].unk_1C.z); + Hu3DCameraPosSetV(lbl_1_data_A0[var_r31], &lbl_1_bss_0[var_r31].unk_1C, &lbl_1_data_C8, &lbl_1_bss_0[var_r31].unk_28); + } + else { + fn_1_623C(&lbl_1_bss_0[var_r31], var_r31, var_r30, var_r29); + if (NULL != lbl_1_bss_0[var_r31].unk_08) { + fn_1_6F28(&lbl_1_bss_0[var_r31]); + } + if ((2.0f <= lbl_1_bss_0[var_r31].unk_1E8) && (lbl_1_bss_0[var_r31].unk_1EC != 0.0f)) { + fn_1_7C1C(&lbl_1_bss_0[var_r31], var_r30, var_r29); + } + lbl_1_bss_0[var_r31].unk_0C = NULL; + lbl_1_bss_0[var_r31].unk_1E8 = 0.0f; + lbl_1_bss_0[var_r31].unk_1EC = 0.0f; + lbl_1_bss_0[var_r31].unk_1F0[0] = 0.0f; + lbl_1_bss_0[var_r31].unk_1F0[1] = 0.0f; + } + } + if (lbl_1_bss_41C->work[0] >= 0x3EC) { + for (var_r31 = 0; var_r31 < 2; var_r31++) { + if (lbl_1_bss_0[var_r31].unk_1CC >= 0) { + HuAudFXStop(lbl_1_bss_0[var_r31].unk_1CC); + } + if (lbl_1_bss_0[var_r31].unk_1D0 >= 0) { + HuAudFXStop(lbl_1_bss_0[var_r31].unk_1D0); + } + if (lbl_1_bss_0[var_r31].unk_1D8 >= 0) { + HuAudFXStop(lbl_1_bss_0[var_r31].unk_1D8); + } + lbl_1_bss_0[var_r31].unk_1CC = -1; + lbl_1_bss_0[var_r31].unk_1D0 = -1; + lbl_1_bss_0[var_r31].unk_1D8 = -1; + } + } + } +} + +void fn_1_12EA8(void) +{ + float var_f31; + float var_f30; + + UnkBss0Struct *var_r31; + s32 var_r30; + + for (var_r30 = 0; var_r30 < 2; var_r30++) { + var_r31 = &lbl_1_bss_0[var_r30]; + if (var_r31->unk_7C == 0.0f) { + var_r31->unk_1C = var_r31->unk_28; + var_r31->unk_1C.x = var_r31->unk_1C.x + (var_r31->unk_68 * sind(var_r31->unk_64)); + var_r31->unk_1C.y += var_r31->unk_6C; + var_r31->unk_1C.z = var_r31->unk_1C.z + (var_r31->unk_68 * cosd(var_r31->unk_64)); + } + else { + var_r31->unk_78 += 1.0f; + var_f30 = var_r31->unk_78 / var_r31->unk_7C; + var_f31 = sind((90.0f * var_f30)) * sind((90.0f * var_f30)); + + var_r31->unk_1C.x = var_r31->unk_34.x + (var_f31 * (var_r31->unk_40.x - var_r31->unk_34.x)); + var_r31->unk_1C.y = var_r31->unk_34.y + (var_f31 * (var_r31->unk_40.y - var_r31->unk_34.y)); + var_r31->unk_1C.z = var_r31->unk_34.z + (var_f31 * (var_r31->unk_40.z - var_r31->unk_34.z)); + var_r31->unk_28.x = var_r31->unk_4C.x + (var_f31 * (var_r31->unk_58.x - var_r31->unk_4C.x)); + var_r31->unk_28.y = var_r31->unk_4C.y + (var_f31 * (var_r31->unk_58.y - var_r31->unk_4C.y)); + var_r31->unk_28.z = var_r31->unk_4C.z + (var_f31 * (var_r31->unk_58.z - var_r31->unk_4C.z)); + if (var_r31->unk_7C <= var_r31->unk_78) { + var_r31->unk_68 = var_r31->unk_1C.z - var_r31->unk_28.z; + var_r31->unk_6C = var_r31->unk_1C.y - var_r31->unk_28.y; + var_r31->unk_78 = 0.0f; + var_r31->unk_7C = 0.0f; + } + } + Hu3DCameraPosSetV(lbl_1_data_A0[var_r30], &var_r31->unk_1C, &lbl_1_data_C8, &var_r31->unk_28); + } +} + +void fn_1_131A8(omObjData *var_r28) +{ + Vec sp98; + Vec sp8C; + Vec sp80; + UnkM432DllStruct *sp7C[1]; + + float var_f31; + float var_f30; + float var_f27; + float var_f26; + float var_f22; + float var_f21; + + UnkBss0Struct *var_r29; + s32 var_r26; + s32 var_r17; + + if (omSysExitReq != 0) { + fn_1_1F58(-1); + WipeCreate(WIPE_MODE_OUT, WIPE_TYPE_NORMAL, 0x3C); + var_r28->func = fn_1_1615C; + } + lbl_1_bss_580++; + switch (var_r28->work[0]) { + case 0x3E8: + if (WipeStatGet() == 0) { + var_r28->work[0]++; + lbl_1_bss_3F0 = 0.0f; + } + break; + case 0x3E9: + lbl_1_bss_3F0 += 1.0f; + var_f31 = lbl_1_bss_3F0 / 60.0f; + var_f30 = sind((90.0f * var_f31)) * sind((90.0f * var_f31)); + for (var_r26 = 0; var_r26 < 2; var_r26++) { + lbl_1_bss_0[var_r26].unk_28.z = -300.0f + (-400.0f * var_f30); + } + fn_1_12EA8(); + if (60.0f <= lbl_1_bss_3F0) { + var_r28->work[0]++; + lbl_1_bss_3F0 = 0.0f; + } + break; + case 0x3EA: + if (lbl_1_bss_576 < 0) { + lbl_1_bss_576 = MGSeqCreate(3, 0); + } + else { + if ((lbl_1_bss_570 < 0) && ((MGSeqStatGet(lbl_1_bss_576) & 0x10) != 0)) { + fn_1_1F24(0x46); + } + if (MGSeqStatGet(lbl_1_bss_576) == 0) { + var_r28->work[0]++; + lbl_1_bss_57C = 0; + lbl_1_bss_576 = -1; + lbl_1_bss_3F0 = 0.0f; + } + } + break; + case 0x3EB: + lbl_1_bss_57C++; + if (lbl_1_bss_574 >= 0) { + MGSeqParamSet(lbl_1_bss_574, 1, (0x468B - lbl_1_bss_57C) / 60); + } + else if (lbl_1_bss_57C > 0x3F48) { + lbl_1_bss_574 = MGSeqCreate(1, (0x468B - lbl_1_bss_57C) / 60, -1, -1); + MGSeqPosSet(lbl_1_bss_574, 288.0f, 400.0f); + } + fn_1_580(lbl_1_bss_528, 0, lbl_1_bss_57C); + + fn_1_12EA8(); + if ((lbl_1_bss_57C >= 0x4650) || (lbl_1_bss_3FC >= 0)) { + var_r28->work[0] = 0x3EC; + lbl_1_bss_3F0 = 0.0f; + } + break; + case 0x3EC: + if (lbl_1_bss_576 < 0) { + if (lbl_1_bss_574 >= 0) { + MGSeqParamSet(lbl_1_bss_574, 2, -1); + } + lbl_1_bss_574 = -1; + lbl_1_bss_3F8 = 0; + lbl_1_bss_576 = MGSeqCreate(3, 1); + fn_1_1F58(0x64); + } + else { + var_r17 = 0; + for (var_r26 = 0; var_r26 < 4; var_r26++) { + if (((UnkM432DllStruct *)lbl_1_bss_410[var_r26]->data)->unk_180 >= 0x7DA) { + var_r17++; + } + } + if (++lbl_1_bss_3F8 > 0x78) { + var_r17 = 4; + } + lbl_1_bss_3F0 += 1.0f; + if ((var_r17 >= 4) && (60.0f <= lbl_1_bss_3F0) && (MGSeqStatGet(lbl_1_bss_576) == 0)) { + var_r28->work[0] = 0x3EE; + if ((lbl_1_bss_3FC >= 0) && (lbl_1_bss_57C < 0x1518)) { + if (GWPlayerCfg[fn_1_51A8(lbl_1_bss_3FC)->unk_188].iscom != 0) { + if (GWPlayerCfg[fn_1_51A8(lbl_1_bss_3FC + 1)->unk_188].iscom == 0) { + goto block_81; + } + } + else { + block_81: + GWGameStat.present[0x32] = 1; + } + } + if ((lbl_1_bss_3FC >= 0) && (lbl_1_bss_578 > lbl_1_bss_57C)) { + if (GWPlayerCfg[fn_1_51A8(lbl_1_bss_3FC)->unk_188].iscom != 0) { + if (GWPlayerCfg[fn_1_51A8(lbl_1_bss_3FC + 1)->unk_188].iscom == 0) { + goto block_98; + } + } + else { + block_98: + var_r28->work[0] = 0x3ED; + fn_1_798(3); + } + } + lbl_1_bss_576 = -1; + lbl_1_bss_3F0 = 0.0f; + } + } + break; + case 0x3ED: + if (lbl_1_bss_576 < 0) { + lbl_1_bss_576 = MGSeqCreate(0xE, lbl_1_bss_578); + } + else if (MGSeqStatGet(lbl_1_bss_576) == 0) { + var_r28->work[0]++; + lbl_1_bss_3F0 = 0.0f; + lbl_1_bss_576 = -1; + } + break; + case 0x3EE: + if (lbl_1_bss_3FC < 0) { + var_r28->work[0] = 0x3F1; + lbl_1_bss_3F0 = 0.0f; + } + else if (2000.0f < lbl_1_bss_0[lbl_1_bss_3FC >> 1].unk_118.y) { + var_r28->work[0]++; + WipeColorSet(0xFF, 0xFF, 0xFF); + WipeCreate(WIPE_MODE_OUT, WIPE_TYPE_NORMAL, 60); + } + break; + case 0x3EF: + if (WipeStatGet() == 0) { + var_r28->work[0]++; + lbl_1_bss_3F0 = 0.0f; + omDelObjEx(lbl_1_bss_5B4, lbl_1_bss_414); + Hu3DCameraKill(lbl_1_data_A0[(lbl_1_bss_3FC >> 1) ^ 1]); + Hu3DCameraPerspectiveSet(lbl_1_data_A0[lbl_1_bss_3FC >> 1], 20.0f, 20.0f, 20000.0f, 1.2f); + Hu3DCameraViewportSet(lbl_1_data_A0[lbl_1_bss_3FC >> 1], 0.0f, 0.0f, 640.0f, 480.0f, 0.0f, 1.0f); + Hu3DCameraScissorSet(lbl_1_data_A0[lbl_1_bss_3FC >> 1], 0, 0, 0x280, 0x1E0); + var_r29 = &lbl_1_bss_0[lbl_1_bss_3FC >> 1]; + var_r29->unk_118.y = 5000.0f; + Hu3DModelPosSet(var_r29->unk_04->model[22], var_r29->unk_118.x, var_r29->unk_118.y, var_r29->unk_118.z); + Hu3DModelPosSet(var_r29->unk_04->model[24], var_r29->unk_118.x, var_r29->unk_118.y, var_r29->unk_118.z); + Hu3DModelAttrReset(var_r29->unk_04->model[24], HU3D_ATTR_DISPOFF); + Hu3DModelAttrReset(var_r29->unk_04->model[24], HU3D_MOTATTR_PAUSE); + var_r29->unk_28.y = 8000.0f; + var_r29->unk_1C.y = 8000.0f; + var_r29->unk_1C.z = 5000.0f + var_r29->unk_118.z; + Hu3DCameraPosSetV(lbl_1_data_A0[lbl_1_bss_3FC >> 1], &var_r29->unk_1C, &lbl_1_data_C8, &var_r29->unk_28); + var_r29->unk_4C = var_r29->unk_28; + var_r29->unk_58 = var_r29->unk_28; + var_r29->unk_34 = var_r29->unk_1C; + var_r29->unk_40 = var_r29->unk_1C; + var_r29->unk_58.y = 5200.0f; + var_r29->unk_40.y = 5200.0f; + var_r29->unk_40.z = 2000.0f + var_r29->unk_118.z; + WipeCreate(WIPE_MODE_IN, WIPE_TYPE_NORMAL, 0x3C); + lbl_1_bss_3F4 = HuAudFXPlay(0x69B); + } + break; + case 0x3F0: + var_r29 = &lbl_1_bss_0[lbl_1_bss_3FC >> 1]; + lbl_1_bss_3F0 += 1.0f; + var_f31 = lbl_1_bss_3F0 / 180.0f; + var_f30 = sind((90.0f * var_f31)) * sind((90.0f * var_f31)); + var_r29->unk_28.y = var_r29->unk_4C.y + (var_f30 * (var_r29->unk_58.y - var_r29->unk_4C.y)); + var_r29->unk_1C.y = var_r29->unk_34.y + (var_f30 * (var_r29->unk_40.y - var_r29->unk_34.y)); + if (90.0f < lbl_1_bss_3F0) { + var_f31 = (lbl_1_bss_3F0 - 90.0f) / 90.0f; + var_f30 = sind((90.0f * var_f31)) * sind((90.0f * var_f31)); + var_r29->unk_1C.z = var_r29->unk_34.z + (var_f30 * (var_r29->unk_40.z - var_r29->unk_34.z)); + } + Hu3DCameraPosSetV(lbl_1_data_A0[lbl_1_bss_3FC >> 1], &var_r29->unk_1C, &lbl_1_data_C8, &var_r29->unk_28); + if (180.0f <= lbl_1_bss_3F0) { + var_r28->work[0]++; + lbl_1_bss_3F0 = 0.0f; + } + break; + case 0x3F1: + if (lbl_1_bss_576 < 0) { + if (lbl_1_bss_3FC < 0) { + lbl_1_bss_576 = MGSeqCreate(3, 2); + HuAudSStreamPlay(4); + } + else { + lbl_1_bss_576 = MGSeqCreate(5, 3, fn_1_51A8(lbl_1_bss_3FC)->unk_18C, fn_1_51A8(lbl_1_bss_3FC + 1)->unk_18C, -1, -1); + HuAudSStreamPlay(1); + } + } + else { + lbl_1_bss_3F0 += 1.0f; + if (0 <= lbl_1_bss_3FC) { } + if ((210.0f < lbl_1_bss_3F0) && (MGSeqStatGet(lbl_1_bss_576) == 0)) { + fn_1_1F58(-1); + lbl_1_bss_576 = -1; + WipeCreate(WIPE_MODE_OUT, WIPE_TYPE_NORMAL, 0x3C); + var_r28->func = fn_1_1615C; + } + } + break; + default: + OSReport("*** main mode error(%d)!!\n", var_r28->work[0]); + break; + } + fn_1_A40(); + if ((lbl_1_bss_3FC >= 0) && (var_r28->work[0] >= 0x3F0)) { + var_r29 = &lbl_1_bss_0[lbl_1_bss_3FC >> 1]; + var_r29->unk_118.y = 5000.0 + (10.0 * sind((lbl_1_bss_580 * 4))); + Hu3DModelPosSet(var_r29->unk_04->model[22], var_r29->unk_118.x, var_r29->unk_118.y, var_r29->unk_118.z); + } + sp98.x = 0.0f; + sp98.y = 0.0f; + sp98.z = 0.0f; + for (var_r26 = 0; var_r26 < 4; var_r26++) { + sp7C[0] = lbl_1_bss_410[var_r26]->data; + sp98.x += sp7C[0]->unk_00.unk_6C.x; + sp98.z += sp7C[0]->unk_00.unk_6C.z; + } + sp98.x *= 0.25f; + sp98.z *= 0.25f; + var_f27 = 0.0f; + for (var_r26 = 0; var_r26 < 4; var_r26++) { + var_f26 = VECDistance(&sp98, &((UnkM432DllStruct *)lbl_1_bss_410[var_r26]->data)->unk_00.unk_6C); + if (var_f27 < var_f26) { + var_f27 = var_f26; + } + } + + fn_1_52B8_inline(&sp80, sp98.x, 0.0f, sp98.z); + + sp98.y = 6.0f * var_f27; + sp98.z += 1000.0f; + VECNormalize(&sp98, &sp8C); + Hu3DShadowPosSet(&sp98, &sp8C, &sp80); + fn_1_2D8(); +} + +void fn_1_15320(omObjData *object) +{ + s32 var_r31; + object->work[0] = 0x3E8; + fn_1_B4C(80.0f, DATA_MAKE_NUM(DATADIR_M432, 0x1E)); + fn_1_9EC(); + WipeCreate(WIPE_MODE_IN, WIPE_TYPE_NORMAL, 60); + object->func = fn_1_131A8; +} + +void ObjectSetup(void) +{ + Vec sp8; + float var_f31; + float var_f30; + float var_f29; + + UnkBss0Struct *var_r31; + s32 var_r30; + float *var_r29; + UnkM432DllStruct *var_r28; + omObjData *var_r27; + s32 var_r26; + s32 var_r24; + s32 var_r23; + s32 var_r22; + s32 var_r21; + s32 var_r20; + + OSReport("******* M432 ObjectSetup *********\n"); + lbl_1_bss_5B4 = omInitObjMan(0x258, 0x2000); + omGameSysInit(lbl_1_bss_5B4); + nMap = 0; + nChar = 0; + lbl_1_bss_580 = 0; + lbl_1_bss_576 = -1; + lbl_1_bss_574 = -1; + lbl_1_bss_3FC = -1; + lbl_1_bss_3F8 = 0; + lbl_1_bss_570 = -1; + lbl_1_bss_3F4 = -1; + lbl_1_bss_57C = 0; + lbl_1_bss_578 = GWMGRecordGet(3); + lbl_1_bss_568 = -1.0f; + if (lbl_1_bss_578 == 0) { + lbl_1_bss_578 = 0x1C20; + } + fn_1_414(); + for (var_r30 = 0; var_r30 < 2; var_r30++) { + lbl_1_bss_0[var_r30].unk_08 = NULL; + lbl_1_bss_0[var_r30].unk_18 = 0; + lbl_1_bss_0[var_r30].unk_28.x = -800.0f + (1600.0f * var_r30); + lbl_1_bss_0[var_r30].unk_28.y = 0.0f; + lbl_1_bss_0[var_r30].unk_28.z = -300.0f; + lbl_1_bss_0[var_r30].unk_1E4 = 0.0f; + lbl_1_bss_0[var_r30].unk_64 = 0.0f; + lbl_1_bss_0[var_r30].unk_68 = 3900.0f; + lbl_1_bss_0[var_r30].unk_6C = 3250.0f; + lbl_1_bss_0[var_r30].unk_1E8 = 0.0f; + lbl_1_bss_0[var_r30].unk_70 = 0.0f; + lbl_1_bss_0[var_r30].unk_74 = 0.0f; + lbl_1_bss_0[var_r30].unk_78 = 0.0f; + lbl_1_bss_0[var_r30].unk_7C = 0.0f; + lbl_1_bss_0[var_r30].unk_80 = 0.0f; + lbl_1_bss_0[var_r30].unk_84 = 0.0f; + lbl_1_bss_0[var_r30].unk_124 = 0.0f; + lbl_1_bss_0[var_r30].unk_128 = 0.0f; + lbl_1_bss_0[var_r30].unk_12C = 0.0f; + lbl_1_bss_0[var_r30].unk_1B8 = frandmod(5); + lbl_1_bss_0[var_r30].unk_1BC = frandmod(9); + lbl_1_bss_0[var_r30].unk_1CC = -1; + lbl_1_bss_0[var_r30].unk_1D0 = -1; + lbl_1_bss_0[var_r30].unk_1D4 = 0.0f; + lbl_1_bss_0[var_r30].unk_1D8 = -1; + lbl_1_bss_0[var_r30].unk_1DC = 0.0f; + } + Hu3DCameraCreate(3); + Hu3DCameraPerspectiveSet(3, 20.0f, 20.0f, 20000.0f, 0.6f); + fn_1_12EA8(); + for (var_r29 = lbl_1_data_A8, var_r30 = 0; var_r30 < 2; var_r30++, var_r29 += 4) { + Hu3DCameraViewportSet(lbl_1_data_A0[var_r30], var_r29[0], var_r29[1], var_r29[2], var_r29[3], 0.0f, 1.0f); + Hu3DCameraScissorSet(lbl_1_data_A0[var_r30], var_r29[0], var_r29[1], var_r29[2], var_r29[3]); + } + var_r20 = Hu3DGLightCreateV(&lbl_1_data_D4, &lbl_1_data_E0, &lbl_1_data_EC); + Hu3DGLightStaticSet(var_r20, 0); + Hu3DGLightInfinitytSet(var_r20); + Hu3DShadowCreate(30.0f, 20.0f, 20000.0f); + Hu3DShadowTPLvlSet(0.5f); + VECNormalize(&lbl_1_data_F0, &sp8); + Hu3DShadowPosSet(&lbl_1_data_F0, &sp8, &lbl_1_data_FC); + fn_1_2C00(fn_1_AA00, 0.0f); + omMakeGroupEx(lbl_1_bss_5B4, 2, 4); + lbl_1_bss_410 = omGetGroupMemberListEx(lbl_1_bss_5B4, 2); + for (var_r30 = 0; var_r30 < 4; var_r30++) { + var_r27 = omAddObjEx(lbl_1_bss_5B4, 0x68, 1, 0xB, 2, fn_1_10CCC); + var_r27->data = HuMemDirectMallocNum(HEAP_SYSTEM, sizeof(UnkM432DllStruct), MEMORY_DEFAULT_NUM); + var_r27->work[0] = var_r30; + var_r28 = var_r27->data; + var_r28->unk_184 = -1; + var_r28->unk_188 = var_r27->work[0]; + var_r28->unk_194 = GWPlayerCfg[var_r28->unk_188].group; + } + for (var_r30 = 0; var_r30 < 4; var_r30++) { + var_r22 = -1; + var_r21 = 0x28; + for (var_r26 = 0; var_r26 < 4; var_r26++) { + var_r28 = lbl_1_bss_410[var_r26]->data; + if (var_r28->unk_184 < 0) { + var_r23 = var_r28->unk_188 + (var_r28->unk_194 * 4); + if (var_r21 > var_r23) { + var_r21 = var_r23; + var_r22 = var_r26; + } + } + } + ((UnkM432DllStruct *)lbl_1_bss_410[var_r22]->data)->unk_184 = var_r30; + } + for (var_r30 = 0; var_r30 < 2; var_r30++) { + lbl_1_bss_0[var_r30].unk_04 = omAddObjEx(lbl_1_bss_5B4, 0x64, 0x1A, 0, 0, fn_1_113F4); + lbl_1_bss_0[var_r30].unk_04->work[0] = var_r30; + lbl_1_bss_0[var_r30].unk_00 = omAddObjEx(lbl_1_bss_5B4, 0x65, 1, 0, 1, fn_1_12804); + lbl_1_bss_0[var_r30].unk_00->work[0] = var_r30; + MapObject[nMap++] = lbl_1_bss_0[var_r30].unk_00; + } + fn_1_150(); + lbl_1_bss_408 = HuSprAnimReadFile(DATA_MAKE_NUM(DATADIR_M432, 0x28)); + HuSprAnimLock(lbl_1_bss_408); + lbl_1_bss_404 = Hu3DParManCreate(lbl_1_bss_408, 0x1F4, &lbl_1_data_1814); + Hu3DParManAttrSet(lbl_1_bss_404, 1); + lbl_1_bss_402 = 0; + fn_1_0(); + omMakeGroupEx(lbl_1_bss_5B4, 3, 0xF0); + lbl_1_bss_418 = omGetGroupMemberListEx(lbl_1_bss_5B4, 3); + lbl_1_bss_400 = Hu3DModelCreateFile(DATA_MAKE_NUM(DATADIR_M432, 0x09)); + Hu3DModelAttrSet(lbl_1_bss_400, HU3D_ATTR_DISPOFF); + Hu3DModelAttrSet(lbl_1_bss_400, HU3D_MOTATTR_LOOP | HU3D_MOTATTR_PAUSE); + lbl_1_bss_414 = omAddObjEx(lbl_1_bss_5B4, 0x66, 0, 0, -1, fn_1_128C8); + lbl_1_bss_41C = omAddObjEx(lbl_1_bss_5B4, 0x69, 0x1A, 0, -1, fn_1_15320); + lbl_1_bss_41C->work[0] = 0x3E8; +} + +void fn_1_1615C(omObjData *arg0) +{ + s32 var_r31; + + if (lbl_1_bss_3F4 >= 0) { + lbl_1_bss_3F4 = -1; + HuAudFXStop(lbl_1_bss_3F4); + } + if (WipeStatGet() == 0) { + if (lbl_1_bss_576 >= 0) { + MGSeqKill(lbl_1_bss_576); + } + if (lbl_1_bss_574 >= 0) { + MGSeqKill(lbl_1_bss_574); + } + MGSeqKillAll(); + HuAudAllStop(); + for (var_r31 = 0; var_r31 < 4; var_r31++) { + CharModelKill(lbl_1_data_0[GWPlayerCfg[var_r31].character]); + } + omOvlReturnEx(1, 1); + } +} From 200d51a1b29182ec5bce46adf0e9894a44428b17 Mon Sep 17 00:00:00 2001 From: dbalatoni13 Date: Sun, 10 Nov 2024 06:57:04 +0100 Subject: [PATCH 05/29] Removed rel_sqrt_consts.h completely --- include/rel_sqrt_consts.h | 5 - src/REL/E3setupDLL/mgselect.c | 1 - src/REL/instDll/main.c | 2 - src/REL/m401Dll/main.c | 2 - src/REL/m402Dll/main.c | 1 - src/REL/m403Dll/main.c | 1 - src/REL/m404Dll/main.c | 2 +- src/REL/m405Dll/main.c | 1 - src/REL/m406Dll/main.c | 1 - src/REL/m407dll/player.c | 2 - src/REL/m408Dll/main.c | 2 - src/REL/m409Dll/main.c | 1 - src/REL/m410Dll/main.c | 118 ++-- src/REL/m411Dll/main.c | 1 - src/REL/m412Dll/main.c | 1 - src/REL/m413Dll/main.c | 2 - src/REL/m414Dll/main.c | 1 - src/REL/m415Dll/main.c | 1 - src/REL/m416Dll/main.c | 2 - src/REL/m417Dll/main.c | 1 - src/REL/m420dll/main.c | 1 - src/REL/m426Dll/main.c | 1 - src/REL/m429Dll/main.c | 1 - src/REL/m431Dll/main.c | 2 - src/REL/m434Dll/main.c | 3 - src/REL/m436Dll/main.c | 1116 ++++++++++++++++++--------------- src/REL/m438Dll/main.c | 1 - src/REL/m439Dll/main.c | 2 - src/REL/m440Dll/main.c | 2 +- src/REL/m441Dll/main.c | 1 - src/REL/m442Dll/main.c | 1 - src/REL/m443Dll/main.c | 2 +- src/REL/m444dll/main.c | 2 - src/REL/m445Dll/main.c | 1 - src/REL/m448Dll/main.c | 1 - src/REL/m450Dll/main.c | 1 - src/REL/m451Dll/m451.c | 2 - src/REL/m453Dll/main.c | 2 +- src/REL/m455Dll/main.c | 354 +++++------ src/REL/m461Dll/main.c | 1 - src/REL/mentDll/common.c | 3 - src/REL/messDll/main.c | 123 ++-- src/REL/mgmodedll/mgmode.c | 1 - src/REL/modeseldll/main.c | 575 ++++++++--------- src/REL/mpexDll/main.c | 1 - src/REL/resultDll/main.c | 1 - src/REL/ztardll/main.c | 1 - 47 files changed, 1178 insertions(+), 1172 deletions(-) delete mode 100644 include/rel_sqrt_consts.h diff --git a/include/rel_sqrt_consts.h b/include/rel_sqrt_consts.h deleted file mode 100644 index fd06a9e9..00000000 --- a/include/rel_sqrt_consts.h +++ /dev/null @@ -1,5 +0,0 @@ -#ifndef _REL_SQRT_CONSTS -#define _REL_SQRT_CONSTS - - -#endif diff --git a/src/REL/E3setupDLL/mgselect.c b/src/REL/E3setupDLL/mgselect.c index ece67721..5dbd89eb 100644 --- a/src/REL/E3setupDLL/mgselect.c +++ b/src/REL/E3setupDLL/mgselect.c @@ -6,7 +6,6 @@ #include "game/sprite.h" #include "game/window.h" #include "game/wipe.h" -#include "rel_sqrt_consts.h" #include "REL/E3SetupDLL.h" diff --git a/src/REL/instDll/main.c b/src/REL/instDll/main.c index 2853c63e..3dbcc0a4 100644 --- a/src/REL/instDll/main.c +++ b/src/REL/instDll/main.c @@ -21,8 +21,6 @@ #include "ext_math.h" #include "math.h" -#include "rel_sqrt_consts.h" - #include "REL/instDll.h" static s16 lbl_1_data_0 = 1; diff --git a/src/REL/m401Dll/main.c b/src/REL/m401Dll/main.c index 14147e35..cb02264e 100644 --- a/src/REL/m401Dll/main.c +++ b/src/REL/m401Dll/main.c @@ -17,8 +17,6 @@ #include "ext_math.h" #include "math.h" -#include "rel_sqrt_consts.h" - float lbl_2_data_0 = -7.1875f; s16 lbl_2_data_4[] = { 0, 1, 2, 3, 4, 5, 6, 7 }; diff --git a/src/REL/m402Dll/main.c b/src/REL/m402Dll/main.c index 3e3aadbd..59f189c3 100755 --- a/src/REL/m402Dll/main.c +++ b/src/REL/m402Dll/main.c @@ -22,7 +22,6 @@ #include "dolphin.h" #include "ext_math.h" -#include "rel_sqrt_consts.h" #undef ABS #define ABS(x) ((0 > (x)) ? -(x) : (x)) diff --git a/src/REL/m403Dll/main.c b/src/REL/m403Dll/main.c index d0f9003a..a1e3fc91 100755 --- a/src/REL/m403Dll/main.c +++ b/src/REL/m403Dll/main.c @@ -17,7 +17,6 @@ #include "game/wipe.h" #include "ext_math.h" -#include "rel_sqrt_consts.h" typedef struct { /* 0x000 */ u8 unk00; diff --git a/src/REL/m404Dll/main.c b/src/REL/m404Dll/main.c index 63011f56..6b790aee 100644 --- a/src/REL/m404Dll/main.c +++ b/src/REL/m404Dll/main.c @@ -10,7 +10,7 @@ #include "game/pad.h" #include "game/sprite.h" #include "game/wipe.h" -#include "rel_sqrt_consts.h" + #include "string.h" typedef struct UnkM404Struct { diff --git a/src/REL/m405Dll/main.c b/src/REL/m405Dll/main.c index f13da739..0c999c19 100755 --- a/src/REL/m405Dll/main.c +++ b/src/REL/m405Dll/main.c @@ -22,7 +22,6 @@ #include "dolphin.h" #include "ext_math.h" -#include "rel_sqrt_consts.h" #undef ABS #define ABS(x) ((0 > (x)) ? -(x) : (x)) diff --git a/src/REL/m406Dll/main.c b/src/REL/m406Dll/main.c index 6d70cd61..8642d951 100644 --- a/src/REL/m406Dll/main.c +++ b/src/REL/m406Dll/main.c @@ -5,7 +5,6 @@ #include "game/hsfdraw.h" #include "game/minigame_seq.h" #include "game/wipe.h" -#include "rel_sqrt_consts.h" #include "REL/m406Dll.h" diff --git a/src/REL/m407dll/player.c b/src/REL/m407dll/player.c index 394f2885..395fb157 100644 --- a/src/REL/m407dll/player.c +++ b/src/REL/m407dll/player.c @@ -8,8 +8,6 @@ #include "game/process.h" #include "math.h" -#include "rel_sqrt_consts.h" - #define ARRAY_COUNT(arr) (s32)(sizeof(arr) / sizeof(arr[0])) typedef void (*ObjFuncs)(omObjData *); diff --git a/src/REL/m408Dll/main.c b/src/REL/m408Dll/main.c index 32571be7..38ab51b1 100644 --- a/src/REL/m408Dll/main.c +++ b/src/REL/m408Dll/main.c @@ -19,8 +19,6 @@ #include "ext_math.h" #include "math.h" -#include "rel_sqrt_consts.h" - s32 lbl_1_data_0[] = { DATA_MAKE_NUM(DATADIR_MGCONST, 0x00), DATA_MAKE_NUM(DATADIR_MGCONST, 0x01), diff --git a/src/REL/m409Dll/main.c b/src/REL/m409Dll/main.c index e41a1130..5071127d 100644 --- a/src/REL/m409Dll/main.c +++ b/src/REL/m409Dll/main.c @@ -11,7 +11,6 @@ #include "game/sprite.h" #include "game/wipe.h" #include "math.h" -#include "rel_sqrt_consts.h" // bss Process *lbl_1_bss_E8; diff --git a/src/REL/m410Dll/main.c b/src/REL/m410Dll/main.c index 5b234c7b..42506076 100644 --- a/src/REL/m410Dll/main.c +++ b/src/REL/m410Dll/main.c @@ -5,7 +5,6 @@ #include "game/minigame_seq.h" #include "game/object.h" #include "game/wipe.h" -#include "rel_sqrt_consts.h" #include "REL/m410Dll.h" @@ -158,37 +157,36 @@ void fn_1_63C(omObjData *object) return; } switch (var_r31->unk_00) { - case 0: - WipeCreate(WIPE_MODE_IN, WIPE_TYPE_NORMAL, 60); - Hu3DCameraPerspectiveSet(1, 41.5f, 5.0f, 5000.0f, 1.2f); - var_r31->unk_00 = 1; - var_r31->unk_10 = 0; - object->func = fn_1_19C8(lbl_1_bss_28, object); - break; - case 1: - var_r31->unk_00 = 2; - var_r31->unk_18 = 0; - object->func = fn_1_FF0; - break; - case 2: - var_r31->unk_00 = 3; - var_r31->unk_28 = 0; - object->func = fn_1_216C(lbl_1_bss_28, object); - break; - case 3: - case 4: - var_r31->unk_08 = 1; - var_r31->unk_00 = 5; - object->func = fn_1_ABC; - break; - case 5: - default: - var_r31->unk_00 = 5; - object->func = fn_1_DEC; - break; + case 0: + WipeCreate(WIPE_MODE_IN, WIPE_TYPE_NORMAL, 60); + Hu3DCameraPerspectiveSet(1, 41.5f, 5.0f, 5000.0f, 1.2f); + var_r31->unk_00 = 1; + var_r31->unk_10 = 0; + object->func = fn_1_19C8(lbl_1_bss_28, object); + break; + case 1: + var_r31->unk_00 = 2; + var_r31->unk_18 = 0; + object->func = fn_1_FF0; + break; + case 2: + var_r31->unk_00 = 3; + var_r31->unk_28 = 0; + object->func = fn_1_216C(lbl_1_bss_28, object); + break; + case 3: + case 4: + var_r31->unk_08 = 1; + var_r31->unk_00 = 5; + object->func = fn_1_ABC; + break; + case 5: + default: + var_r31->unk_00 = 5; + object->func = fn_1_DEC; + break; } var_r31->unk_04 = 0; - } void fn_1_7A8(omObjData *object) @@ -233,38 +231,36 @@ void fn_1_FF0(omObjData *object) fn_1_5A8(object); switch (var_r29->unk_14) { - case 0: - var_r29->unk_1C = 30; - var_r29->unk_20 = 60; - lbl_1_bss_14 = MGSeqCreate(3, 0); - MGSeqPosSet(lbl_1_bss_14, 320.0f, 240.0f); - CRot.x = -11.2f; - CRot.y = CRot.z = 0.0f; - Center.x = 0.0f; - Center.y = 367.0f; - Center.z = 252.0f; - CZoom = 592.0f; - var_r29->unk_14 = 1; - var_r29->unk_18 = 0; - break; - - case 1: - if (lbl_1_bss_4 < 0 && MGSeqStatGet(lbl_1_bss_14) & 16) { - lbl_1_bss_4 = HuAudSeqPlay(71); - } - if (!MGSeqStatGet(lbl_1_bss_14) && !var_r29->unk_08) { - lbl_1_bss_1C = MGSeqCreate(1, var_r29->unk_1C, -1, -1); - var_r29->unk_14 = 2; - var_r29->unk_18 = 0; - object->func = fn_1_139C; - } - break; - - default: - break; - } + case 0: + var_r29->unk_1C = 30; + var_r29->unk_20 = 60; + lbl_1_bss_14 = MGSeqCreate(3, 0); + MGSeqPosSet(lbl_1_bss_14, 320.0f, 240.0f); + CRot.x = -11.2f; + CRot.y = CRot.z = 0.0f; + Center.x = 0.0f; + Center.y = 367.0f; + Center.z = 252.0f; + CZoom = 592.0f; + var_r29->unk_14 = 1; + var_r29->unk_18 = 0; + break; - + case 1: + if (lbl_1_bss_4 < 0 && MGSeqStatGet(lbl_1_bss_14) & 16) { + lbl_1_bss_4 = HuAudSeqPlay(71); + } + if (!MGSeqStatGet(lbl_1_bss_14) && !var_r29->unk_08) { + lbl_1_bss_1C = MGSeqCreate(1, var_r29->unk_1C, -1, -1); + var_r29->unk_14 = 2; + var_r29->unk_18 = 0; + object->func = fn_1_139C; + } + break; + + default: + break; + } } void fn_1_139C(omObjData *object) diff --git a/src/REL/m411Dll/main.c b/src/REL/m411Dll/main.c index dd110cb4..d4a6acef 100755 --- a/src/REL/m411Dll/main.c +++ b/src/REL/m411Dll/main.c @@ -18,7 +18,6 @@ #include "dolphin.h" #include "ext_math.h" -#include "rel_sqrt_consts.h" typedef struct { /* 0x00 */ s16 unk00; diff --git a/src/REL/m412Dll/main.c b/src/REL/m412Dll/main.c index 05a6ac98..1cad6746 100644 --- a/src/REL/m412Dll/main.c +++ b/src/REL/m412Dll/main.c @@ -12,7 +12,6 @@ #include "game/sprite.h" #include "game/wipe.h" #include "math.h" -#include "rel_sqrt_consts.h" // bss s16 lbl_1_bss_7A0; diff --git a/src/REL/m413Dll/main.c b/src/REL/m413Dll/main.c index 7ae0c7e6..ee218503 100644 --- a/src/REL/m413Dll/main.c +++ b/src/REL/m413Dll/main.c @@ -14,8 +14,6 @@ #include "ext_math.h" -#include "rel_sqrt_consts.h" - typedef struct struct_bss_2A6C StructBss2A6C; typedef struct struct_sp_14C8 StructSp14C8; diff --git a/src/REL/m414Dll/main.c b/src/REL/m414Dll/main.c index 8e6cad03..1268cdad 100644 --- a/src/REL/m414Dll/main.c +++ b/src/REL/m414Dll/main.c @@ -9,7 +9,6 @@ #include "game/pad.h" #include "game/sprite.h" #include "game/wipe.h" -#include "rel_sqrt_consts.h" typedef struct UnkM414Struct { s32 unk00; diff --git a/src/REL/m415Dll/main.c b/src/REL/m415Dll/main.c index cb5bdac7..971724b5 100644 --- a/src/REL/m415Dll/main.c +++ b/src/REL/m415Dll/main.c @@ -15,7 +15,6 @@ #include "game/sprite.h" #include "game/wipe.h" #include "math.h" -#include "rel_sqrt_consts.h" // bss unkStruct5 lbl_1_bss_36C; diff --git a/src/REL/m416Dll/main.c b/src/REL/m416Dll/main.c index 591b8b64..33fe0518 100644 --- a/src/REL/m416Dll/main.c +++ b/src/REL/m416Dll/main.c @@ -17,8 +17,6 @@ #include "REL/m416Dll.h" -#include "rel_sqrt_consts.h" - typedef struct camera_view_params { float zoom; Vec pos; diff --git a/src/REL/m417Dll/main.c b/src/REL/m417Dll/main.c index 3a5b2aff..02a55063 100644 --- a/src/REL/m417Dll/main.c +++ b/src/REL/m417Dll/main.c @@ -3,7 +3,6 @@ #include "game/hsfdraw.h" #include "game/minigame_seq.h" #include "game/wipe.h" -#include "rel_sqrt_consts.h" #include "REL/m417Dll.h" diff --git a/src/REL/m420dll/main.c b/src/REL/m420dll/main.c index c5fe048e..18f5b3ea 100644 --- a/src/REL/m420dll/main.c +++ b/src/REL/m420dll/main.c @@ -7,7 +7,6 @@ #include "game/pad.h" #include "game/printfunc.h" #include "game/wipe.h" -#include "rel_sqrt_consts.h" #include "REL/m420dll.h" diff --git a/src/REL/m426Dll/main.c b/src/REL/m426Dll/main.c index 8cd93019..d9864fb5 100644 --- a/src/REL/m426Dll/main.c +++ b/src/REL/m426Dll/main.c @@ -10,7 +10,6 @@ #include "game/pad.h" #include "game/sprite.h" #include "game/wipe.h" -#include "rel_sqrt_consts.h" typedef struct UnkM426Struct { /* 0x00 */ s32 unk_00; diff --git a/src/REL/m429Dll/main.c b/src/REL/m429Dll/main.c index c995e66a..7c2aa9be 100644 --- a/src/REL/m429Dll/main.c +++ b/src/REL/m429Dll/main.c @@ -21,7 +21,6 @@ #include "game/sprite.h" #include "ext_math.h" -#include "rel_sqrt_consts.h" #undef ABS #define ABS(x) ((0 > (x)) ? -(x) : (x)) diff --git a/src/REL/m431Dll/main.c b/src/REL/m431Dll/main.c index 3d3f65f2..9ef89c53 100644 --- a/src/REL/m431Dll/main.c +++ b/src/REL/m431Dll/main.c @@ -16,8 +16,6 @@ #include "REL/m431Dll.h" -#include "rel_sqrt_consts.h" - typedef struct bss_5C_struct { s16 unk0[6]; s16 unkC[2]; diff --git a/src/REL/m434Dll/main.c b/src/REL/m434Dll/main.c index e0fcf2ac..733df325 100644 --- a/src/REL/m434Dll/main.c +++ b/src/REL/m434Dll/main.c @@ -6,15 +6,12 @@ #include "game/sprite.h" #include "game/wipe.h" - #include "REL/m434Dll.h" #include "ext_math.h" #include "game/gamework_data.h" #include "game/minigame_seq.h" #include "math.h" -#include "rel_sqrt_consts.h" - typedef struct camera_view { float zoom; Vec pos; diff --git a/src/REL/m436Dll/main.c b/src/REL/m436Dll/main.c index 4e2523c2..c7a806b9 100755 --- a/src/REL/m436Dll/main.c +++ b/src/REL/m436Dll/main.c @@ -14,10 +14,9 @@ #include "game/wipe.h" #include "ext_math.h" -#include "rel_sqrt_consts.h" typedef struct { - /* 0x00 */ omObjData* unk00; + /* 0x00 */ omObjData *unk00; /* 0x04 */ s32 unk04; /* 0x08 */ s32 unk08; /* 0x0C */ s32 unk0C; @@ -47,18 +46,18 @@ typedef struct { } StructBss234; // Size 0xF8 typedef struct { - /* 0x00 */ omObjData* unk00; + /* 0x00 */ omObjData *unk00; /* 0x04 */ s32 unk04; /* 0x08 */ char unk08[0xC]; } StructBss220; // Size 0x14 typedef struct { - /* 0x00 */ omObjData* unk00; + /* 0x00 */ omObjData *unk00; /* 0x04 */ Vec unk04[8]; } StructBss1BC; // Size 0x64 typedef struct { - /* 0x00 */ omObjData* unk00; + /* 0x00 */ omObjData *unk00; /* 0x04 */ s32 unk04; /* 0x08 */ float unk08[6]; /* 0x20 */ char unk20[8]; @@ -73,12 +72,12 @@ typedef struct { } StructBssD8; // Size 0xA8 typedef struct { - /* 0x00 */ omObjData* unk00; + /* 0x00 */ omObjData *unk00; /* 0x04 */ char unk04[0x10]; } StructBss1A8; // Size 0x14 typedef struct { - /* 0x00 */ omObjData* unk00; + /* 0x00 */ omObjData *unk00; /* 0x04 */ char unk04[0x10]; } StructBss180; // Size 0x14 @@ -115,46 +114,24 @@ s32 lbl_1_bss_10; s32 lbl_1_bss_C; s32 lbl_1_bss_8; s32 lbl_1_bss_4; -Process* lbl_1_bss_0; +Process *lbl_1_bss_0; -s32 lbl_1_data_0[] = { - DATA_MAKE_NUM(DATADIR_M436, 13), - DATA_MAKE_NUM(DATADIR_M436, 14), - DATA_MAKE_NUM(DATADIR_M436, 15), - DATA_MAKE_NUM(DATADIR_M436, 16), - DATA_MAKE_NUM(DATADIR_M436, 17), - DATA_MAKE_NUM(DATADIR_M436, 18), - DATA_MAKE_NUM(DATADIR_M436, 19), - DATA_MAKE_NUM(DATADIR_M436, 20) -}; +s32 lbl_1_data_0[] + = { DATA_MAKE_NUM(DATADIR_M436, 13), DATA_MAKE_NUM(DATADIR_M436, 14), DATA_MAKE_NUM(DATADIR_M436, 15), DATA_MAKE_NUM(DATADIR_M436, 16), + DATA_MAKE_NUM(DATADIR_M436, 17), DATA_MAKE_NUM(DATADIR_M436, 18), DATA_MAKE_NUM(DATADIR_M436, 19), DATA_MAKE_NUM(DATADIR_M436, 20) }; -s32 lbl_1_data_20[] = { - MAKE_MESSID(29, 23), - MAKE_MESSID(29, 24), - MAKE_MESSID(29, 30), - MAKE_MESSID(29, 26), - MAKE_MESSID(29, 28), - MAKE_MESSID(29, 27), - MAKE_MESSID(29, 25), - MAKE_MESSID(29, 29) -}; +s32 lbl_1_data_20[] = { MAKE_MESSID(29, 23), MAKE_MESSID(29, 24), MAKE_MESSID(29, 30), MAKE_MESSID(29, 26), MAKE_MESSID(29, 28), MAKE_MESSID(29, 27), + MAKE_MESSID(29, 25), MAKE_MESSID(29, 29) }; -s32 lbl_1_data_40[][5] = { - { 91, 105, 126, 141, -1 }, - { 91, 105, 126, 141, -1 }, - { 124, 137, -1, -1, -1 }, - { 85, 100, 127, -1, -1 }, - { 124, 139, -1, -1, -1 }, - { 85, 97, 127, 139, -1 }, - { 127, 137, -1, -1, -1 }, - { 79, 95, 109, 127, -1 } -}; +s32 lbl_1_data_40[][5] = { { 91, 105, 126, 141, -1 }, { 91, 105, 126, 141, -1 }, { 124, 137, -1, -1, -1 }, { 85, 100, 127, -1, -1 }, + { 124, 139, -1, -1, -1 }, { 85, 97, 127, 139, -1 }, { 127, 137, -1, -1, -1 }, { 79, 95, 109, 127, -1 } }; s32 lbl_1_data_E0 = -1; s32 lbl_1_data_E4 = -1; s32 lbl_1_data_E8 = -1; -void fn_1_0(void) { +void fn_1_0(void) +{ s32 i; while (TRUE) { @@ -172,21 +149,24 @@ void fn_1_0(void) { } } -void fn_1_1A8(void) { +void fn_1_1A8(void) +{ s32 var_r31; var_r31 = Hu3DGLightCreate(0.0f, 1000.0f, 0.0f, 0.0f, -1.0f, 0.0f, 0xFF, 0xFF, 0xFF); Hu3DGLightInfinitytSet(var_r31); } -void fn_1_230(void) { - StructBss32C* var_r31; +void fn_1_230(void) +{ + StructBss32C *var_r31; var_r31 = &lbl_1_bss_32C; if (HuPadBtn[0] & 0x200) { if (HuPadBtn[0] & 0x100) { var_r31->unk0C -= HuPadStkY[0] / 10.0f; - } else { + } + else { var_r31->unk04 += HuPadStkX[0] / 10.0f; var_r31->unk08 += HuPadStkY[0] / 10.0f; } @@ -216,24 +196,28 @@ void fn_1_230(void) { print8(16, 130, 1.0f, "ZOOM : %.2f", var_r31->unk34); } -void fn_1_614(s32 arg0, s32 arg1, float arg2) { - StructBss32C* var_r31; +void fn_1_614(s32 arg0, s32 arg1, float arg2) +{ + StructBss32C *var_r31; var_r31 = &lbl_1_bss_32C; var_r31->unk40[arg0] = arg1; if (var_r31->unk5C[arg0] < 0.0f) { var_r31->unk5C[arg0] = -arg2; - } else { + } + else { var_r31->unk5C[arg0] = arg2; } } -void fn_1_67C(s32 arg0, float arg1) { +void fn_1_67C(s32 arg0, float arg1) +{ fn_1_614(arg0, -1, arg1); } -float fn_1_6E8(s32 arg0) { - StructBss32C* var_r31; +float fn_1_6E8(s32 arg0) +{ + StructBss32C *var_r31; var_r31 = &lbl_1_bss_32C; if (var_r31->unk5C[arg0] != 0.0f) { @@ -242,7 +226,8 @@ float fn_1_6E8(s32 arg0) { if (var_r31->unk5C[arg0] >= -0.5f && var_r31->unk5C[arg0] <= 0.5f) { var_r31->unk5C[arg0] = 0.0f; } - } else { + } + else { var_r31->unk40[arg0]--; if (var_r31->unk40[arg0] <= 0) { var_r31->unk40[arg0] = 0; @@ -253,8 +238,9 @@ float fn_1_6E8(s32 arg0) { return var_r31->unk5C[arg0]; } -void fn_1_818(void) { - StructBss32C* var_r31; +void fn_1_818(void) +{ + StructBss32C *var_r31; var_r31 = &lbl_1_bss_32C; var_r31->unk04 = 0.0f; @@ -266,15 +252,17 @@ void fn_1_818(void) { var_r31->unk34 = 300.0f; } -void fn_1_8A4(void (*arg0)(void)) { - StructBss32C* var_r31; +void fn_1_8A4(void (*arg0)(void)) +{ + StructBss32C *var_r31; var_r31 = &lbl_1_bss_32C; var_r31->unk00 = arg0; } -void fn_1_8C4(omObjData* arg0) { - StructBss32C* var_r31; +void fn_1_8C4(omObjData *arg0) +{ + StructBss32C *var_r31; var_r31 = &lbl_1_bss_32C; if (var_r31->unk00 != NULL) { @@ -289,7 +277,8 @@ void fn_1_8C4(omObjData* arg0) { CZoom = var_r31->unk34 + fn_1_6E8(6); } -void fn_1_F6C(void) { +void fn_1_F6C(void) +{ Hu3DCameraCreate(1); Hu3DCameraViewportSet(1, 0.0f, 0.0f, 640.0f, 480.0f, 0.0f, 1.0f); Hu3DCameraPerspectiveSet(1, 45.0f, 0.1f, 10000.0f, 1.2f); @@ -298,7 +287,8 @@ void fn_1_F6C(void) { omAddObjEx(lbl_1_bss_0, 0x7FD9, 0, 0, -1, fn_1_8C4); } -void fn_1_1084(void) { +void fn_1_1084(void) +{ Vec sp20 = { 0.0f, 2500.0f, 1.0f }; Vec sp14 = { 0.0f, 0.0f, 0.0f }; Vec sp8 = { 0.0f, 1.0f, 0.0f }; @@ -308,8 +298,9 @@ void fn_1_1084(void) { Hu3DShadowPosSet(&sp20, &sp8, &sp14); } -void fn_1_1148(s32 arg0, float arg1, float arg2, s32 arg3) { - WindowData* temp_r29; +void fn_1_1148(s32 arg0, float arg1, float arg2, s32 arg3) +{ + WindowData *temp_r29; float temp_f29; float temp_f28; float temp_f25; @@ -333,10 +324,12 @@ void fn_1_1148(s32 arg0, float arg1, float arg2, s32 arg3) { temp_f27 = 4.0f / temp_f25; if (var_f31 + 4.0f - (temp_f29 + temp_f25) >= 0.0f) { var_f31 = temp_f29 + temp_f25 - 4.0f; - } else { + } + else { if (temp_f29 - (var_f31 - 2.0f) >= 0.0f) { var_f31 = temp_f29; - } else { + } + else { var_f31 -= 2.0f; } } @@ -344,10 +337,12 @@ void fn_1_1148(s32 arg0, float arg1, float arg2, s32 arg3) { temp_f26 = 4.0f / temp_f24; if (var_f30 + 4.0f - (temp_f28 + temp_f24) >= 0.0f) { var_f30 = temp_f28 + temp_f24 - 4.0f; - } else { + } + else { if (temp_f28 - (var_f30 - 2.0f) >= 0.0f) { var_f30 = temp_f28; - } else { + } + else { var_f30 -= 2.0f; } } @@ -358,7 +353,8 @@ void fn_1_1148(s32 arg0, float arg1, float arg2, s32 arg3) { var_f21 = temp_f27; var_f22 = var_f30; var_f20 = temp_f26; - } else { + } + else { HuWinPosSet(arg0, temp_f29, temp_f28); HuWinScaleSet(arg0, 1.0f, 1.0f); var_f23 = temp_f29; @@ -373,15 +369,18 @@ void fn_1_1148(s32 arg0, float arg1, float arg2, s32 arg3) { if (i <= 10) { var_f23 = fn_1_11164(var_f31, temp_f29, i, 10.0f); var_f21 = fn_1_11164(temp_f27, 1.0f, i, 10.0f); - } else { + } + else { var_f22 = fn_1_11164(var_f30, temp_f28, i - 10, 5.0f); var_f20 = fn_1_11164(temp_f26, 1.0f, i - 10, 5.0f); } - } else { + } + else { if (i <= 10) { var_f22 = fn_1_11164(temp_f28, var_f30, i, 10.0f); var_f20 = fn_1_11164(1.0f, temp_f26, i, 10.0f); - } else { + } + else { var_f23 = fn_1_11164(temp_f29, var_f31, i - 10, 5.0f); var_f21 = fn_1_11164(1.0f, temp_f27, i - 10, 5.0f); } @@ -392,19 +391,22 @@ void fn_1_1148(s32 arg0, float arg1, float arg2, s32 arg3) { if (arg3 != 0) { HuWinPosSet(arg0, temp_f29, temp_f28); HuWinScaleSet(arg0, 1.0f, 1.0f); - } else { + } + else { HuWinPosSet(arg0, var_f31, var_f30); HuWinScaleSet(arg0, temp_f27, temp_f26); } HuPrcVSleep(); } -void fn_1_178C(void) { +void fn_1_178C(void) +{ HuWinInit(1); } -void fn_1_17B0(s32 arg0, float arg1, float arg2) { - WindowData* temp_r31; +void fn_1_17B0(s32 arg0, float arg1, float arg2) +{ + WindowData *temp_r31; float temp_f29; float temp_f28; float temp_f27; @@ -428,10 +430,12 @@ void fn_1_17B0(s32 arg0, float arg1, float arg2) { temp_f25 = 4.0f / temp_f27; if (var_f31 + 4.0f - (temp_f29 + temp_f27) >= 0.0f) { var_f31 = temp_f29 + temp_f27 - 4.0f; - } else { + } + else { if (temp_f29 - (var_f31 - 2.0f) >= 0.0f) { var_f31 = temp_f29; - } else { + } + else { var_f31 = var_f31 - 2.0f; } } @@ -439,10 +443,12 @@ void fn_1_17B0(s32 arg0, float arg1, float arg2) { temp_f24 = 4.0f / temp_f26; if (var_f30 + 4.0f - (temp_f28 + temp_f26) >= 0.0f) { var_f30 = temp_f28 + temp_f26 - 4.0f; - } else { + } + else { if (temp_f28 - (var_f30 - 2.0f) >= 0.0f) { var_f30 = temp_f28; - } else { + } + else { var_f30 = var_f30 - 2.0f; } } @@ -463,8 +469,9 @@ void fn_1_17B0(s32 arg0, float arg1, float arg2) { HuPrcVSleep(); } -void fn_1_1C08(s32 arg0, float arg1, float arg2) { - WindowData* temp_r31; +void fn_1_1C08(s32 arg0, float arg1, float arg2) +{ + WindowData *temp_r31; float temp_f29; float temp_f28; float temp_f27; @@ -488,10 +495,12 @@ void fn_1_1C08(s32 arg0, float arg1, float arg2) { temp_f25 = 4.0f / temp_f27; if (var_f31 + 4.0f - (temp_f29 + temp_f27) >= 0.0f) { var_f31 = temp_f29 + temp_f27 - 4.0f; - } else { + } + else { if (temp_f29 - (var_f31 - 2.0f) >= 0.0f) { var_f31 = temp_f29; - } else { + } + else { var_f31 = var_f31 - 2.0f; } } @@ -499,10 +508,12 @@ void fn_1_1C08(s32 arg0, float arg1, float arg2) { temp_f24 = 4.0f / temp_f26; if (var_f30 + 4.0f - (temp_f28 + temp_f26) >= 0.0f) { var_f30 = temp_f28 + temp_f26 - 4.0f; - } else { + } + else { if (temp_f28 - (var_f30 - 2.0f) >= 0.0f) { var_f30 = temp_f28; - } else { + } + else { var_f30 = var_f30 - 2.0f; } } @@ -523,12 +534,9 @@ void fn_1_1C08(s32 arg0, float arg1, float arg2) { HuPrcVSleep(); } -s32 fn_1_2060(s16 arg0, s16 arg1, s16 arg2, s16 arg3, s32 arg4) { - s32 sp20[][5] = { - { 0xFF, 0xFF, 0xCC, 0x00, 0x09 }, - { 0xCC, 0xFF, 0xFF, 0x00, 0x09 }, - { 0xFF, 0xCC, 0xFF, 0x00, 0x09 } - }; +s32 fn_1_2060(s16 arg0, s16 arg1, s16 arg2, s16 arg3, s32 arg4) +{ + s32 sp20[][5] = { { 0xFF, 0xFF, 0xCC, 0x00, 0x09 }, { 0xCC, 0xFF, 0xFF, 0x00, 0x09 }, { 0xFF, 0xCC, 0xFF, 0x00, 0x09 } }; float sp14[] = { 0.9f, 0.9f, 0.9f }; GXColor sp10; s32 temp_r31; @@ -543,22 +551,26 @@ s32 fn_1_2060(s16 arg0, s16 arg1, s16 arg2, s16 arg3, s32 arg4) { return temp_r31; } -s32 fn_1_2230(s16 arg0, s16 arg1, s16 arg2, s16 arg3, s32 arg4) { +s32 fn_1_2230(s16 arg0, s16 arg1, s16 arg2, s16 arg3, s32 arg4) +{ return fn_1_2060(arg0, arg1, arg2, arg3, arg4); } -void fn_1_2400(s32 arg0) { +void fn_1_2400(s32 arg0) +{ HuWinMesSet(arg0, MAKE_MESSID(29, 22)); HuPrcVSleep(); fn_1_1148(arg0, 0.5f, 0.5f, 0); HuWinKill(arg0); } -void fn_1_2468(s32 arg0) { +void fn_1_2468(s32 arg0) +{ fn_1_2400(arg0); } -void fn_1_24D0(s32 arg0, s32 arg1) { +void fn_1_24D0(s32 arg0, s32 arg1) +{ s32 i; s32 var_r30; s32 temp_r28; @@ -584,7 +596,8 @@ void fn_1_24D0(s32 arg0, s32 arg1) { HuWinComKeyReset(); } -void fn_1_25B8(s32 arg0) { +void fn_1_25B8(s32 arg0) +{ s32 var_r31; s32 temp_r28; s32 i; @@ -605,13 +618,15 @@ void fn_1_25B8(s32 arg0) { var_r31 = HuWinChoiceGet(arg0, 1); if (var_r31 == -1 || var_r31 == 1) { lbl_1_bss_8 = 0; - } else { + } + else { lbl_1_bss_8 = 1; } HuWinComKeyReset(); } -void fn_1_26D4(float* arg0, s32 arg1) { +void fn_1_26D4(float *arg0, s32 arg1) +{ float spC[2]; HuWinMesMaxSizeGet(1, spC, arg1); @@ -623,29 +638,34 @@ void fn_1_26D4(float* arg0, s32 arg1) { } } -void fn_1_2744(s32 arg0, s32 arg1) { +void fn_1_2744(s32 arg0, s32 arg1) +{ winData[arg0].mess_color = 0; winData[arg0].mess_shadow_color = 9; winData[arg0].attr |= 0x80; HuWinMesSet(arg0, arg1); } -void fn_1_27C8(s32 arg0) { +void fn_1_27C8(s32 arg0) +{ if (lbl_1_bss_10 == 0) { lbl_1_bss_10 = 1; lbl_1_bss_C = arg0 * 60; } } -s32 fn_1_2800(void) { +s32 fn_1_2800(void) +{ if (lbl_1_bss_10 == 3) { return 1; - } else { + } + else { return 0; } } -void fn_1_2824(void) { +void fn_1_2824(void) +{ if (lbl_1_bss_10 == 2) { lbl_1_bss_10 = 3; lbl_1_bss_C = 30; @@ -654,7 +674,8 @@ void fn_1_2824(void) { s32 lbl_1_data_16C = -1; -void fn_1_285C(omObjData* arg0) { +void fn_1_285C(omObjData *arg0) +{ switch (lbl_1_bss_10) { case 1: if (lbl_1_data_16C == -1) { @@ -683,20 +704,22 @@ void fn_1_285C(omObjData* arg0) { } } -void fn_1_2A2C(void) { +void fn_1_2A2C(void) +{ lbl_1_bss_C = 0; lbl_1_bss_10 = 0; omAddObjEx(lbl_1_bss_0, 0x2000, 0, 0, -1, fn_1_285C); } -void fn_1_2A90(s32 arg0) { +void fn_1_2A90(s32 arg0) +{ float spC[2]; float temp_f31; float temp_f30; float temp_f28; float temp_f29; - WindowData* temp_r29; - StructBss234* var_r31; + WindowData *temp_r29; + StructBss234 *var_r31; s32 i; temp_r29 = &winData[arg0]; @@ -707,7 +730,8 @@ void fn_1_2A90(s32 arg0) { temp_f29 = temp_r29->w; for (i = 0; i < var_r31->unk00; i++) { HuWinMesMaxSizeGet(1, spC, lbl_1_data_20[var_r31->unk44[i]]); - var_r31->unk08[i] = HuWinCreate(temp_f31 + temp_f29 + 16.0f + var_r31->unk80[i][0], temp_f30 + 26.0f + var_r31->unk80[i][1], spC[0], spC[1], 1); + var_r31->unk08[i] + = HuWinCreate(temp_f31 + temp_f29 + 16.0f + var_r31->unk80[i][0], temp_f30 + 26.0f + var_r31->unk80[i][1], spC[0], spC[1], 1); winData[var_r31->unk08[i]].mess_shadow_color = 9; HuWinMesColSet(var_r31->unk08[i], 0); HuWinScissorSet(var_r31->unk08[i], temp_f31 + 20.0f, temp_f30, temp_f29 + 20.0f, temp_f28); @@ -719,14 +743,15 @@ void fn_1_2A90(s32 arg0) { HuPrcVSleep(); } -void fn_1_2D94(s32 arg0) { +void fn_1_2D94(s32 arg0) +{ float sp10[2]; float temp_f31; float temp_f29; float spC; float temp_f30; - WindowData* temp_r30; - StructBss234* var_r31; + WindowData *temp_r30; + StructBss234 *var_r31; s32 i; temp_r30 = &winData[arg0]; @@ -755,9 +780,10 @@ void fn_1_2D94(s32 arg0) { HuPrcVSleep(); } -void fn_1_3020(void) { +void fn_1_3020(void) +{ s32 i; - StructBss234* var_r30; + StructBss234 *var_r30; var_r30 = &lbl_1_bss_234; for (i = 0; i < var_r30->unk00; i++) { @@ -767,9 +793,10 @@ void fn_1_3020(void) { HuPrcVSleep(); } -void fn_1_3088(void) { +void fn_1_3088(void) +{ float sp8[2]; - StructBss234* var_r31; + StructBss234 *var_r31; s32 i; var_r31 = &lbl_1_bss_234; @@ -792,9 +819,10 @@ void fn_1_3088(void) { } } -void fn_1_31FC(omObjData* arg0) { - StructBss220* var_r29; - ModelData* temp_r30; +void fn_1_31FC(omObjData *arg0) +{ + StructBss220 *var_r29; + ModelData *temp_r30; s32 i; var_r29 = &lbl_1_bss_220; @@ -869,7 +897,8 @@ void fn_1_31FC(omObjData* arg0) { if (Hu3DMotionTimeGet(arg0->model[10]) >= 25.0f && var_r29->unk04 == 0) { var_r29->unk04 = 1; fn_1_614(1, 10, 4.0f); - } else if (Hu3DMotionTimeGet(arg0->model[10]) >= 40.0f && var_r29->unk04 == 1) { + } + else if (Hu3DMotionTimeGet(arg0->model[10]) >= 40.0f && var_r29->unk04 == 1) { var_r29->unk04 = 2; fn_1_614(1, 10, 4.0f); } @@ -891,7 +920,8 @@ void fn_1_31FC(omObjData* arg0) { } } -void fn_1_39B4(omObjData* arg0) { +void fn_1_39B4(omObjData *arg0) +{ fn_1_11818(arg0, 0, 0, 1, 2); Hu3DModelPosSet(arg0->model[1], 0.0f, 0.0f, -680.0f); fn_1_11818(arg0, 1, 1, 1, 2); @@ -912,7 +942,8 @@ void fn_1_39B4(omObjData* arg0) { arg0->work[0] = arg0->work[1] = arg0->work[2] = arg0->work[3] = 0; } -void fn_1_3BF0(omObjData* arg0) { +void fn_1_3BF0(omObjData *arg0) +{ arg0->model[0] = Hu3DModelCreateFile(DATA_MAKE_NUM(DATADIR_M436, 21)); arg0->motion[0] = Hu3DMotionIDGet(arg0->model[0]); Hu3DModelShadowMapSet(arg0->model[0]); @@ -973,7 +1004,8 @@ void fn_1_3BF0(omObjData* arg0) { arg0->func = fn_1_31FC; } -void fn_1_420C(omObjData* arg0) { +void fn_1_420C(omObjData *arg0) +{ s32 i; switch (arg0->work[0]) { @@ -993,8 +1025,9 @@ void fn_1_420C(omObjData* arg0) { } } -void fn_1_4304(omObjData* arg0) { - StructBss1BC* var_r30; +void fn_1_4304(omObjData *arg0) +{ + StructBss1BC *var_r30; s32 i; var_r30 = &lbl_1_bss_1BC; @@ -1015,8 +1048,9 @@ void fn_1_4304(omObjData* arg0) { arg0->work[0] = arg0->work[1] = arg0->work[2] = arg0->work[3] = 0; } -void fn_1_4594(omObjData* arg0) { - StructBss1BC* var_r30; +void fn_1_4594(omObjData *arg0) +{ + StructBss1BC *var_r30; s32 i; var_r30 = &lbl_1_bss_1BC; @@ -1041,8 +1075,9 @@ void fn_1_4594(omObjData* arg0) { arg0->func = fn_1_420C; } -void fn_1_48AC(omObjData* arg0) { - StructBss1A8* sp8; +void fn_1_48AC(omObjData *arg0) +{ + StructBss1A8 *sp8; sp8 = &lbl_1_bss_1A8; switch (arg0->work[3]) { @@ -1074,7 +1109,8 @@ void fn_1_48AC(omObjData* arg0) { } } -void fn_1_49FC(omObjData* arg0) { +void fn_1_49FC(omObjData *arg0) +{ omSetTra(arg0, 0.0f, 37.0f, -565.0f); omSetSca(arg0, 1.5f, 1.5f, 1.5f); Hu3DModelHookReset(arg0->model[0]); @@ -1082,10 +1118,11 @@ void fn_1_49FC(omObjData* arg0) { arg0->work[0] = arg0->work[1] = arg0->work[2] = arg0->work[3] = 0; } -void fn_1_4AB4(s32 arg0) { - ModelData* var_r28; - HsfData* temp_r31; - HsfMaterial* var_r30; +void fn_1_4AB4(s32 arg0) +{ + ModelData *var_r28; + HsfData *temp_r31; + HsfMaterial *var_r30; s32 i; var_r28 = &Hu3DData[arg0]; @@ -1096,8 +1133,9 @@ void fn_1_4AB4(s32 arg0) { } } -void fn_1_4B1C(omObjData* arg0) { - StructBss1A8* sp8; +void fn_1_4B1C(omObjData *arg0) +{ + StructBss1A8 *sp8; sp8 = &lbl_1_bss_1A8; arg0->model[0] = Hu3DModelCreateFile(DATA_MAKE_NUM(DATADIR_M436, 31)); @@ -1126,14 +1164,16 @@ void fn_1_4B1C(omObjData* arg0) { arg0->func = fn_1_48AC; } -void fn_1_4EA8(omObjData* arg0) { +void fn_1_4EA8(omObjData *arg0) +{ switch (arg0->work[3]) { case 1: arg0->work[3] = 0; if (arg0->work[0] == 0) { fn_1_11818(arg0, 0, 2, 5, 0); fn_1_11818(arg0, 1, 5, 5, 2); - } else { + } + else { fn_1_11818(arg0, 0, 3, 5, 0); } break; @@ -1142,14 +1182,16 @@ void fn_1_4EA8(omObjData* arg0) { if (arg0->work[0] == 0) { fn_1_11818(arg0, 0, 0, 30, 1); fn_1_11818(arg0, 1, 5, 30, 1); - } else { + } + else { fn_1_11818(arg0, 0, 0, 30, 1); } break; } } -void fn_1_4FB0(omObjData* arg0) { +void fn_1_4FB0(omObjData *arg0) +{ s32 temp_r30; temp_r30 = arg0->work[0]; @@ -1167,7 +1209,8 @@ void fn_1_4FB0(omObjData* arg0) { Hu3DModelLayerSet(arg0->model[1], 2); fn_1_11818(arg0, 0, 0, 1, 1); fn_1_11818(arg0, 1, 5, 1, 1); - } else { + } + else { arg0->motion[0] = Hu3DJointMotionFile(arg0->model[0], DATA_MAKE_NUM(DATADIR_M436, 47)); arg0->motion[1] = Hu3DJointMotionFile(arg0->model[0], DATA_MAKE_NUM(DATADIR_M436, 51)); arg0->motion[2] = Hu3DJointMotionFile(arg0->model[0], DATA_MAKE_NUM(DATADIR_M436, 52)); @@ -1184,15 +1227,17 @@ void fn_1_4FB0(omObjData* arg0) { arg0->func = fn_1_4EA8; } -s32 fn_1_538C(s32 arg0) { - StructBss3E4* temp_r31; +s32 fn_1_538C(s32 arg0) +{ + StructBss3E4 *temp_r31; temp_r31 = &lbl_1_bss_3E4[arg0]; return temp_r31->unk04; } -s32 fn_1_53B4(void) { - StructBss3E4* temp_r29; +s32 fn_1_53B4(void) +{ + StructBss3E4 *temp_r29; s32 var_r30; s32 i; @@ -1206,8 +1251,9 @@ s32 fn_1_53B4(void) { return var_r30; } -s32 fn_1_5414(s32 arg0) { - StructBss3E4* temp_r31; +s32 fn_1_5414(s32 arg0) +{ + StructBss3E4 *temp_r31; temp_r31 = &lbl_1_bss_3E4[arg0]; if (temp_r31->unk0C != 0) { @@ -1216,8 +1262,9 @@ s32 fn_1_5414(s32 arg0) { return 0; } -s32 fn_1_5450(s32 arg0) { - StructBss3E4* temp_r31; +s32 fn_1_5450(s32 arg0) +{ + StructBss3E4 *temp_r31; temp_r31 = &lbl_1_bss_3E4[arg0]; if (HuPadBtnDown[temp_r31->unk18] == 0x100) { @@ -1226,8 +1273,9 @@ s32 fn_1_5450(s32 arg0) { return 0; } -void fn_1_54A0(void) { - StructBss3E4* temp_r31; +void fn_1_54A0(void) +{ + StructBss3E4 *temp_r31; s32 sp8[4]; s32 i; @@ -1245,7 +1293,8 @@ void fn_1_54A0(void) { temp_r31->unk0C = GWPlayerCfg[temp_r31->unk04].iscom; if (temp_r31->unk0C != 0) { temp_r31->unk10 = GWPlayerCfg[temp_r31->unk04].diff; - } else { + } + else { temp_r31->unk10 = 0; } temp_r31->unk14 = GWPlayerCfg[temp_r31->unk04].character; @@ -1253,13 +1302,14 @@ void fn_1_54A0(void) { } } -s32 fn_1_5608(omObjData* arg0, Vec arg1, float arg2, float arg3, float arg4, float arg5, s32 arg6) { +s32 fn_1_5608(omObjData *arg0, Vec arg1, float arg2, float arg3, float arg4, float arg5, s32 arg6) +{ float var_f31; float var_f30; float var_f27; float var_f26; s32 var_r30; - StructBss3E4* sp18; + StructBss3E4 *sp18; var_r30 = 0; sp18 = &lbl_1_bss_3E4[arg0->work[0]]; @@ -1270,14 +1320,16 @@ s32 fn_1_5608(omObjData* arg0, Vec arg1, float arg2, float arg3, float arg4, flo if (var_f27 <= arg4) { var_f31 = var_f30 = 0.0f; var_r30 = 1; - } else { + } + else { var_f31 = 72.0f * (var_f31 / var_f27); var_f30 = 72.0f * (var_f30 / var_f27); } var_f27 = arg3 * (sqrtf(var_f31 * var_f31 + var_f30 * var_f30) / 72.0f); if (var_f27 >= arg3) { var_f27 = arg3; - } else if (var_f27 <= 1.0f) { + } + else if (var_f27 <= 1.0f) { var_f31 = var_f30 = var_f27 = 0.0f; var_r30 = 1; } @@ -1292,7 +1344,8 @@ s32 fn_1_5608(omObjData* arg0, Vec arg1, float arg2, float arg3, float arg4, flo if (arg0->rot.y - var_f26 < -180.0f) { arg0->rot.y += 360.0f; } - } else { + } + else { if (arg0->rot.y - var_f26 > 180.0f) { arg0->rot.y -= 360.0f; } @@ -1307,25 +1360,28 @@ s32 fn_1_5608(omObjData* arg0, Vec arg1, float arg2, float arg3, float arg4, flo if (arg6 == 0) { if (var_f27 >= 6.75f) { fn_1_11B18(arg0, 0, 2, 15, 1); - } else if (var_f27 > 0.0f) { + } + else if (var_f27 > 0.0f) { fn_1_11B18(arg0, 0, 1, 15, 1); - } else { + } + else { fn_1_11B18(arg0, 0, 0, 15, 1); } } return var_r30; } -void fn_1_5CD0(omObjData* arg0) { - StructBss3E4* sp8; - char** temp_r26; +void fn_1_5CD0(omObjData *arg0) +{ + StructBss3E4 *sp8; + char **temp_r26; s32 var_r22; s32 i, j; - ModelData* temp_r24; - HsfData* temp_r27; - HsfMaterial* var_r31; - StructBss3E4* temp_r30; - HsfAttribute* temp_r23; + ModelData *temp_r24; + HsfData *temp_r27; + HsfMaterial *var_r31; + StructBss3E4 *temp_r30; + HsfAttribute *temp_r23; sp8 = &lbl_1_bss_3E4[arg0->work[0]]; if (arg0->work[2] != 1) { @@ -1353,7 +1409,8 @@ void fn_1_5CD0(omObjData* arg0) { } } } - } else { + } + else { temp_r26 = CharModelTexNameGet(temp_r30->unk14, 2); for (i = 0; i < temp_r27->materialCnt; i++, var_r31++) { var_r22 = 1; @@ -1385,15 +1442,11 @@ void fn_1_5CD0(omObjData* arg0) { } } -void fn_1_6060(omObjData* arg0) { +void fn_1_6060(omObjData *arg0) +{ u32 temp_r29 = arg0->work[0]; - StructBss3E4* temp_r30 = &lbl_1_bss_3E4[temp_r29]; - Vec sp8[] = { - { -600.0f, 0.0f, 300.0f }, - { -600.0f, 0.0f, 150.0f }, - { -450.0f, 0.0f, 150.0f }, - { -300.0f, 0.0f, 150.0f } - }; + StructBss3E4 *temp_r30 = &lbl_1_bss_3E4[temp_r29]; + Vec sp8[] = { { -600.0f, 0.0f, 300.0f }, { -600.0f, 0.0f, 150.0f }, { -450.0f, 0.0f, 150.0f }, { -300.0f, 0.0f, 150.0f } }; arg0->model[0] = CharModelCreate(temp_r30->unk14, 2); arg0->motion[0] = CharModelMotionCreate(temp_r30->unk14, DATA_MAKE_NUM(DATADIR_MARIOMOT, 0)); @@ -1415,18 +1468,15 @@ void fn_1_6060(omObjData* arg0) { } // unused -s16 gap_04_00000182_data[] = { - 0, 0x43, 0, 0x43, 1, 0x43, - 2, 0x43, 3, 0x43, 4, 0x43, - 5, 0x43, 6, 0x43, 7 -}; +s16 gap_04_00000182_data[] = { 0, 0x43, 0, 0x43, 1, 0x43, 2, 0x43, 3, 0x43, 4, 0x43, 5, 0x43, 6, 0x43, 7 }; -s32 fn_1_62C4(omObjData* arg0) { +s32 fn_1_62C4(omObjData *arg0) +{ Mtx sp8; - StructBss4A4* var_r25; - StructBssD8* var_r31; - StructBss1A8* var_r28; - StructBss3E4* temp_r27; + StructBss4A4 *var_r25; + StructBssD8 *var_r31; + StructBss1A8 *var_r28; + StructBss3E4 *temp_r27; s32 i; var_r25 = &lbl_1_bss_4A4; @@ -1473,9 +1523,11 @@ s32 fn_1_62C4(omObjData* arg0) { } if (var_r31->unk88[i] < 8.0f) { var_r31->unk68[i] += 0.025f; - } else if (var_r31->unk88[i] < 23.0f) { + } + else if (var_r31->unk88[i] < 23.0f) { var_r31->unk68[i] = 0.7f; - } else if (var_r31->unk88[i] < 31.0f) { + } + else if (var_r31->unk88[i] < 31.0f) { var_r31->unk68[i] -= 0.1f; if (var_r31->unk68[i] < 0.0f) { var_r31->unk68[i] = 0.0f; @@ -1506,16 +1558,18 @@ s32 fn_1_62C4(omObjData* arg0) { } } -void fn_1_68E8(omObjData* arg0) { - StructBss1A8* var_r30; +void fn_1_68E8(omObjData *arg0) +{ + StructBss1A8 *var_r30; var_r30 = &lbl_1_bss_1A8; fn_1_11818(var_r30->unk00, 0, 8, 5, 0); - arg0->func = (void*) fn_1_62C4; // fn_1_62C4 must return s32 to match + arg0->func = (void *)fn_1_62C4; // fn_1_62C4 must return s32 to match } -void fn_1_6944(omObjData* arg0) { - StructBssD8* var_r29; +void fn_1_6944(omObjData *arg0) +{ + StructBssD8 *var_r29; s32 i; var_r29 = &lbl_1_bss_D8; @@ -1523,7 +1577,8 @@ void fn_1_6944(omObjData* arg0) { if (i % 2 == 0) { arg0->model[i + 1] = Hu3DModelCreateFile(DATA_MAKE_NUM(DATADIR_M436, 44)); arg0->motion[i + 1] = Hu3DMotionIDGet(arg0->model[i + 1]); - } else { + } + else { arg0->model[i + 1] = Hu3DModelCreateFile(DATA_MAKE_NUM(DATADIR_M436, 45)); arg0->motion[i + 1] = Hu3DMotionIDGet(arg0->model[i + 1]); } @@ -1539,11 +1594,12 @@ void fn_1_6944(omObjData* arg0) { var_r29->unk88[i] = 0.0f; } var_r29->unk04 = 1; - arg0->func = (void*) fn_1_62C4; // fn_1_62C4 must return s32 to match + arg0->func = (void *)fn_1_62C4; // fn_1_62C4 must return s32 to match } -void fn_1_6BDC(void) { - StructBss32C* var_r31; +void fn_1_6BDC(void) +{ + StructBss32C *var_r31; var_r31 = &lbl_1_bss_32C; var_r31->unk10 = 0.0f; @@ -1556,8 +1612,9 @@ void fn_1_6BDC(void) { fn_1_125F4(var_r31, 200.0f); } -void fn_1_6C8C(void) { - StructBss32C* var_r31; +void fn_1_6C8C(void) +{ + StructBss32C *var_r31; StructBss32C sp8; var_r31 = &lbl_1_bss_32C; @@ -1571,8 +1628,9 @@ void fn_1_6C8C(void) { fn_1_14D24(var_r31, &sp8, var_r31->unk3C++, 30.0f, 5.0f); } -void fn_1_6D64(void) { - StructBss32C* var_r31; +void fn_1_6D64(void) +{ + StructBss32C *var_r31; var_r31 = &lbl_1_bss_32C; var_r31->unk10 = 0.0f; @@ -1585,8 +1643,9 @@ void fn_1_6D64(void) { fn_1_125F4(var_r31, 200.0f); } -void fn_1_6E14(void) { - StructBss32C* var_r31; +void fn_1_6E14(void) +{ + StructBss32C *var_r31; var_r31 = &lbl_1_bss_32C; var_r31->unk10 = 0.0f; @@ -1599,8 +1658,9 @@ void fn_1_6E14(void) { fn_1_125F4(var_r31, 45.0f); } -void fn_1_6EC4(void) { - StructBss32C* var_r31; +void fn_1_6EC4(void) +{ + StructBss32C *var_r31; var_r31 = &lbl_1_bss_32C; var_r31->unk10 = 0.0f; @@ -1613,8 +1673,9 @@ void fn_1_6EC4(void) { fn_1_125F4(var_r31, 30.0f); } -void fn_1_6F74(void) { - StructBss32C* var_r31; +void fn_1_6F74(void) +{ + StructBss32C *var_r31; StructBss32C sp8; var_r31 = &lbl_1_bss_32C; @@ -1628,8 +1689,9 @@ void fn_1_6F74(void) { fn_1_13C48(var_r31, &sp8, var_r31->unk3C++, 10.0f, 5.0f); } -void fn_1_704C(void) { - StructBss32C* var_r31; +void fn_1_704C(void) +{ + StructBss32C *var_r31; var_r31 = &lbl_1_bss_32C; var_r31->unk10 = 0.0f; @@ -1642,8 +1704,9 @@ void fn_1_704C(void) { fn_1_125F4(var_r31, 20.0f); } -void fn_1_70FC(void) { - StructBss32C* var_r31; +void fn_1_70FC(void) +{ + StructBss32C *var_r31; var_r31 = &lbl_1_bss_32C; var_r31->unk10 = 0.0f; @@ -1656,8 +1719,9 @@ void fn_1_70FC(void) { fn_1_125F4(var_r31, 20.0f); } -void fn_1_71AC(s32 arg0) { - StructBss32C* var_r23; +void fn_1_71AC(s32 arg0) +{ + StructBss32C *var_r23; var_r23 = &lbl_1_bss_32C; fn_1_12294(var_r23); @@ -1689,9 +1753,10 @@ void fn_1_71AC(s32 arg0) { } } -void fn_1_72CC(void) { +void fn_1_72CC(void) +{ float sp18[] = { 0.0f, 0.0f }; - StructBss1A8* var_r30; + StructBss1A8 *var_r30; s32 var_r31; var_r30 = &lbl_1_bss_1A8; @@ -1712,9 +1777,10 @@ void fn_1_72CC(void) { HuPrcEnd(); } -void fn_1_77F0(void) { +void fn_1_77F0(void) +{ float sp18[] = { 0.0f, 0.0f }; - StructBss1A8* var_r30; + StructBss1A8 *var_r30; s32 var_r31; var_r30 = &lbl_1_bss_1A8; @@ -1732,17 +1798,11 @@ void fn_1_77F0(void) { HuPrcEnd(); } -void fn_1_7B58(s32 arg0) { +void fn_1_7B58(s32 arg0) +{ float sp10[2] = { 0.0f, 0.0f }; - StructBss180* var_r30 = &lbl_1_bss_180[0]; - s32 sp18[] = { - MAKE_MESSID(29, 6), - MAKE_MESSID(29, 8), - MAKE_MESSID(29, 10), - MAKE_MESSID(29, 12), - MAKE_MESSID(29, 15), - MAKE_MESSID(29, 17) - }; + StructBss180 *var_r30 = &lbl_1_bss_180[0]; + s32 sp18[] = { MAKE_MESSID(29, 6), MAKE_MESSID(29, 8), MAKE_MESSID(29, 10), MAKE_MESSID(29, 12), MAKE_MESSID(29, 15), MAKE_MESSID(29, 17) }; s32 var_r31; var_r30->unk00->work[3] = 1; @@ -1756,9 +1816,10 @@ void fn_1_7B58(s32 arg0) { fn_1_2468(var_r31); } -void fn_1_7F1C(void) { +void fn_1_7F1C(void) +{ float sp2D8[2] = { 0.0f, 0.0f }; - StructBss180* var_r30; + StructBss180 *var_r30; s32 var_r31; var_r30 = &lbl_1_bss_180[1]; @@ -1814,10 +1875,11 @@ void fn_1_7F1C(void) { HuPrcEnd(); } -void fn_1_A5A8(void) { +void fn_1_A5A8(void) +{ float sp9C[2] = { 0.0f, 0.0f }; - StructBss220* sp68; - StructBss1A8* var_r28; + StructBss220 *sp68; + StructBss1A8 *var_r28; s32 var_r31; sp68 = &lbl_1_bss_220; @@ -1859,9 +1921,10 @@ void fn_1_A5A8(void) { HuPrcEnd(); } -void fn_1_B3D4(void) { +void fn_1_B3D4(void) +{ float sp1C[2] = { 0.0f, 0.0f }; - StructBss180* var_r30; + StructBss180 *var_r30; s32 var_r31; var_r30 = &lbl_1_bss_180[1]; @@ -1878,11 +1941,11 @@ void fn_1_B3D4(void) { HuPrcEnd(); } -void fn_1_B7E0(void) { -} +void fn_1_B7E0(void) { } -s32 fn_1_B7E4(void) { - StructBss220* var_r31; +s32 fn_1_B7E4(void) +{ + StructBss220 *var_r31; var_r31 = &lbl_1_bss_220; if (fn_1_11F04(&lbl_1_bss_C0, 0) == 80) { @@ -1907,20 +1970,23 @@ s32 fn_1_B7E4(void) { return 0; } -void fn_1_B968(void) { +void fn_1_B968(void) +{ lbl_1_bss_4 = 0; HuPrcChildCreate(fn_1_72CC, 100, 0x2000, 0, HuPrcCurrentGet()); } -s32 fn_1_B9B4(void) { +s32 fn_1_B9B4(void) +{ if (lbl_1_bss_4 == 1 && fn_1_11F04(&lbl_1_bss_C0, 1) != 0) { return fn_1_11D74(&lbl_1_bss_C0); } return 0; } -void fn_1_BA10(void) { - StructBss3E4* var_r30; +void fn_1_BA10(void) +{ + StructBss3E4 *var_r30; s32 i; lbl_1_bss_4 = 0; @@ -1931,10 +1997,11 @@ void fn_1_BA10(void) { } } -s32 fn_1_BAA4(void) { - StructBss220* var_r31; - StructBss1BC* var_r30; - StructBss220* var_r29; +s32 fn_1_BAA4(void) +{ + StructBss220 *var_r31; + StructBss1BC *var_r30; + StructBss220 *var_r29; var_r31 = &lbl_1_bss_220; var_r30 = &lbl_1_bss_1BC; @@ -1953,22 +2020,26 @@ s32 fn_1_BAA4(void) { return 0; } -void fn_1_BBA4(void) { +void fn_1_BBA4(void) +{ fn_1_71AC(10); } -s32 fn_1_BBF4(void) { +s32 fn_1_BBF4(void) +{ if (fn_1_11F04(&lbl_1_bss_C0, 1) != 0) { return fn_1_11D74(&lbl_1_bss_C0); } return 0; } -void fn_1_BC3C(void) { +void fn_1_BC3C(void) +{ HuPrcChildCreate(fn_1_B3D4, 100, 0x2000, 0, HuPrcCurrentGet()); } -s32 fn_1_BC78(void) { +s32 fn_1_BC78(void) +{ if (lbl_1_bss_4 != 0 && fn_1_11F04(&lbl_1_bss_C0, 1) != 0) { if (lbl_1_bss_8 != 0) { return fn_1_11D74(&lbl_1_bss_C0); @@ -1978,8 +2049,9 @@ s32 fn_1_BC78(void) { return 0; } -void fn_1_BCF8(void) { - StructBss1A8* var_r31; +void fn_1_BCF8(void) +{ + StructBss1A8 *var_r31; var_r31 = &lbl_1_bss_1A8; fn_1_11818(var_r31->unk00, 0, 12, 60, 1); @@ -1987,8 +2059,9 @@ void fn_1_BCF8(void) { HuPrcChildCreate(fn_1_7F1C, 100, 0x2000, 0, HuPrcCurrentGet()); } -s32 fn_1_BD6C(void) { - StructBss1A8* var_r31; +s32 fn_1_BD6C(void) +{ + StructBss1A8 *var_r31; var_r31 = &lbl_1_bss_1A8; if (lbl_1_bss_4 == 1 && fn_1_11F04(&lbl_1_bss_C0, 0) == 0) { @@ -2000,23 +2073,27 @@ s32 fn_1_BD6C(void) { return 0; } -void fn_1_BE1C(void) { +void fn_1_BE1C(void) +{ fn_1_71AC(11); } -s32 fn_1_BE6C(void) { +s32 fn_1_BE6C(void) +{ if (fn_1_11F04(&lbl_1_bss_C0, 1) != 0) { return fn_1_11D74(&lbl_1_bss_C0); } return 0; } -void fn_1_BEB4(void) { +void fn_1_BEB4(void) +{ lbl_1_bss_4 = 0; HuPrcChildCreate(fn_1_A5A8, 100, 0x2000, 0, HuPrcCurrentGet()); } -s32 fn_1_BF00(void) { +s32 fn_1_BF00(void) +{ if (lbl_1_bss_4 == 1) { lbl_1_bss_4 = 2; HuAudSeqFadeOut(lbl_1_bss_3A4[0], 1000); @@ -2028,23 +2105,17 @@ s32 fn_1_BF00(void) { return 0; } -StructData1E8 lbl_1_data_1E8[] = { - { fn_1_B7E0, fn_1_B7E4, 300 }, - { fn_1_B968, fn_1_B9B4, 60 }, - { fn_1_BA10, fn_1_BAA4, 60 }, - { fn_1_BBA4, fn_1_BBF4, 45 }, - { fn_1_BC3C, fn_1_BC78, 60 }, - { fn_1_BCF8, fn_1_BD6C, 60 }, - { fn_1_BE1C, fn_1_BE6C, 45 }, - { fn_1_BEB4, fn_1_BF00, 15 }, - { NULL, NULL, -1 } -}; +StructData1E8 lbl_1_data_1E8[] = { { fn_1_B7E0, fn_1_B7E4, 300 }, { fn_1_B968, fn_1_B9B4, 60 }, { fn_1_BA10, fn_1_BAA4, 60 }, + { fn_1_BBA4, fn_1_BBF4, 45 }, { fn_1_BC3C, fn_1_BC78, 60 }, { fn_1_BCF8, fn_1_BD6C, 60 }, { fn_1_BE1C, fn_1_BE6C, 45 }, + { fn_1_BEB4, fn_1_BF00, 15 }, { NULL, NULL, -1 } }; -void fn_1_BFC8(void) { +void fn_1_BFC8(void) +{ fn_1_11D18(&lbl_1_bss_C0, lbl_1_data_1E8); } -s32 fn_1_BFF8(void) { +s32 fn_1_BFF8(void) +{ s32 var_r31; var_r31 = 0; @@ -2058,11 +2129,12 @@ s32 fn_1_BFF8(void) { return var_r31; } -s32 fn_1_C090(s32 arg0, s32 arg1, s32 arg2) { - StructBss4A4* var_r28; - StructBss3E4* temp_r31; - StructBss1BC* var_r27; - StructBss234* var_r26; +s32 fn_1_C090(s32 arg0, s32 arg1, s32 arg2) +{ + StructBss4A4 *var_r28; + StructBss3E4 *temp_r31; + StructBss1BC *var_r27; + StructBss234 *var_r26; s32 var_r29; s32 var_r30; s32 spC; @@ -2083,43 +2155,52 @@ s32 fn_1_C090(s32 arg0, s32 arg1, s32 arg2) { case 0: if (arg2 <= 120) { var_r29 = 0; - } else if (var_r28->unk04 <= 3) { + } + else if (var_r28->unk04 <= 3) { temp_r31->unk24 = var_r29 = 1; - } else { + } + else { var_r29 = 0; } break; case 1: if (arg2 <= 120) { var_r29 = 0; - } else if (var_r28->unk04 <= 6) { + } + else if (var_r28->unk04 <= 6) { temp_r31->unk24 = var_r29 = 1; - } else { + } + else { var_r29 = 0; } break; case 2: if (arg2 <= 60) { var_r29 = 0; - } else if (var_r28->unk04 <= 9) { + } + else if (var_r28->unk04 <= 9) { temp_r31->unk24 = var_r29 = 1; - } else { + } + else { var_r29 = 0; } break; case 3: if (arg2 <= 60) { var_r29 = 0; - } else if (var_r28->unk04 <= 12) { + } + else if (var_r28->unk04 <= 12) { temp_r31->unk24 = var_r29 = 1; - } else { + } + else { var_r29 = 0; } break; } if (var_r29 == 0) { temp_r31->unk28 = rand8() % 8; - } else { + } + else { var_r23 = 0; for (i = 0; i <= temp_r31->unk10; i++) { temp_r22 = rand8() % 10; @@ -2136,29 +2217,35 @@ s32 fn_1_C090(s32 arg0, s32 arg1, s32 arg2) { } if (temp_r31->unk24 == 1 && temp_r31->unk28 == var_r30) { var_r30 = 99; - } else if (temp_r31->unk28 > var_r30 && temp_r31->unk00->trans.x >= var_r27->unk04[var_r30].x - 7.5f && var_r30 < 7) { + } + else if (temp_r31->unk28 > var_r30 && temp_r31->unk00->trans.x >= var_r27->unk04[var_r30].x - 7.5f && var_r30 < 7) { var_r30++; - } else if (temp_r31->unk28 < var_r30 && temp_r31->unk00->trans.x <= var_r27->unk04[var_r30].x + 7.5f && var_r30 > 0) { + } + else if (temp_r31->unk28 < var_r30 && temp_r31->unk00->trans.x <= var_r27->unk04[var_r30].x + 7.5f && var_r30 > 0) { var_r30--; } - } else { + } + else { var_r30 = arg1; if (HuPadStkX[temp_r31->unk18] > 20.0f && temp_r31->unk00->trans.x >= var_r27->unk04[var_r30].x - 7.5f && var_r30 < 7) { var_r30++; - } else if (HuPadStkX[temp_r31->unk18] < -20.0f && temp_r31->unk00->trans.x <= var_r27->unk04[var_r30].x + 7.5f && var_r30 > 0) { + } + else if (HuPadStkX[temp_r31->unk18] < -20.0f && temp_r31->unk00->trans.x <= var_r27->unk04[var_r30].x + 7.5f && var_r30 > 0) { var_r30--; - } else if (HuPadBtnDown[temp_r31->unk18] & 0x100) { + } + else if (HuPadBtnDown[temp_r31->unk18] & 0x100) { var_r30 = 99; } } return var_r30; } -void fn_1_C4E8(void) { - StructBss4A4* var_r29; - StructBss3E4* temp_r30; - StructBss1BC* var_r28; - StructBss32C* var_r31; +void fn_1_C4E8(void) +{ + StructBss4A4 *var_r29; + StructBss3E4 *temp_r30; + StructBss1BC *var_r28; + StructBss32C *var_r31; var_r29 = &lbl_1_bss_4A4; temp_r30 = &lbl_1_bss_3E4[var_r29->unk00]; @@ -2174,8 +2261,9 @@ void fn_1_C4E8(void) { fn_1_125F4(var_r31, 10.0f); } -void fn_1_C5E4(void) { - StructBss32C* var_r31; +void fn_1_C5E4(void) +{ + StructBss32C *var_r31; var_r31 = &lbl_1_bss_32C; var_r31->unk10 = 0.0f; @@ -2188,8 +2276,9 @@ void fn_1_C5E4(void) { fn_1_125F4(var_r31, 360.0f); } -void fn_1_C694(void) { - StructBss32C* var_r31; +void fn_1_C694(void) +{ + StructBss32C *var_r31; StructBss32C sp8; var_r31 = &lbl_1_bss_32C; @@ -2203,8 +2292,9 @@ void fn_1_C694(void) { fn_1_13C48(var_r31, &sp8, var_r31->unk3C++, 10.0f, 5.0f); } -void fn_1_C76C(void) { - StructBss32C* var_r31; +void fn_1_C76C(void) +{ + StructBss32C *var_r31; StructBss32C sp8; var_r31 = &lbl_1_bss_32C; @@ -2218,8 +2308,9 @@ void fn_1_C76C(void) { fn_1_13C48(var_r31, &sp8, var_r31->unk3C++, 60.0f, 10.0f); } -void fn_1_C844(s32 arg0) { - StructBss32C* var_r27; +void fn_1_C844(s32 arg0) +{ + StructBss32C *var_r27; var_r27 = &lbl_1_bss_32C; fn_1_12294(var_r27); @@ -2239,16 +2330,13 @@ void fn_1_C844(s32 arg0) { } } -void fn_1_C90C(void) { +void fn_1_C90C(void) +{ float sp28[] = { 0.0f, 0.0f }; s32 var_r28; s32 var_r31; - StructBss1A8* var_r27 = &lbl_1_bss_1A8; - s32 sp3C[] = { - MAKE_MESSID(29, 31), - MAKE_MESSID(29, 32), - MAKE_MESSID(29, 33) - }; + StructBss1A8 *var_r27 = &lbl_1_bss_1A8; + s32 sp3C[] = { MAKE_MESSID(29, 31), MAKE_MESSID(29, 32), MAKE_MESSID(29, 33) }; var_r28 = rand8() % 3; HuPrcSleep(70); @@ -2264,14 +2352,12 @@ void fn_1_C90C(void) { HuPrcEnd(); } -void fn_1_CCA4(void) { +void fn_1_CCA4(void) +{ float sp2C[] = { 0.0f, 0.0f }; s32 var_r28; s32 var_r31; - s32 sp24[] = { - MAKE_MESSID(29, 34), - MAKE_MESSID(29, 35) - }; + s32 sp24[] = { MAKE_MESSID(29, 34), MAKE_MESSID(29, 35) }; var_r28 = rand8() % 2; HuPrcSleep(40); @@ -2287,7 +2373,8 @@ void fn_1_CCA4(void) { HuPrcEnd(); } -void fn_1_D018(void) { +void fn_1_D018(void) +{ float sp2C[] = { 0.0f, 0.0f }; s32 var_r31; @@ -2304,10 +2391,11 @@ void fn_1_D018(void) { HuPrcEnd(); } -void fn_1_D344(void) { - StructBss4A4* var_r30; - StructBss3E4* temp_r31; - StructBss1A8* var_r29; +void fn_1_D344(void) +{ + StructBss4A4 *var_r30; + StructBss3E4 *temp_r31; + StructBss1A8 *var_r29; var_r30 = &lbl_1_bss_4A4; temp_r31 = &lbl_1_bss_3E4[var_r30->unk00]; @@ -2318,13 +2406,14 @@ void fn_1_D344(void) { fn_1_27C8(5); } -s32 fn_1_D418(void) { +s32 fn_1_D418(void) +{ Vec sp14; - StructBss4A4* var_r30; - StructBss3E4* temp_r31; - StructBss1BC* var_r28; - StructBss180* var_r26; - StructBss3E4* var_r25; + StructBss4A4 *var_r30; + StructBss3E4 *temp_r31; + StructBss1BC *var_r28; + StructBss180 *var_r26; + StructBss3E4 *var_r25; s32 var_r27; s32 i; @@ -2340,17 +2429,20 @@ s32 fn_1_D418(void) { if (fn_1_2800()) { temp_r31->unk20 = 1; temp_r31->unk24 = 0; - } else { + } + else { var_r27 = fn_1_C090(var_r30->unk00, temp_r31->unk1C, fn_1_11F04(&lbl_1_bss_A8, 0)); if (var_r27 == 99) { temp_r31->unk20 = 1; temp_r31->unk24 = 0; fn_1_2824(); - } else { + } + else { temp_r31->unk1C = var_r27; } } - } else if (temp_r31->unk24++ >= 60) { + } + else if (temp_r31->unk24++ >= 60) { return fn_1_11D74(&lbl_1_bss_A8); } sp14.x = var_r28->unk04[temp_r31->unk1C].x; @@ -2374,19 +2466,21 @@ s32 fn_1_D418(void) { return 0; } -void fn_1_D6C0(void) { - StructBss4A4* var_r30; +void fn_1_D6C0(void) +{ + StructBss4A4 *var_r30; var_r30 = &lbl_1_bss_4A4; var_r30->unk0C = 0; } -s32 fn_1_D6E4(void) { - StructBss4A4* var_r29; - StructBss3E4* temp_r31; - StructBss1BC* var_r30; - StructBss180* var_r26; - StructBss3E4* var_r25; +s32 fn_1_D6E4(void) +{ + StructBss4A4 *var_r29; + StructBss3E4 *temp_r31; + StructBss1BC *var_r30; + StructBss180 *var_r26; + StructBss3E4 *var_r25; s32 i; var_r29 = &lbl_1_bss_4A4; @@ -2400,17 +2494,21 @@ s32 fn_1_D6E4(void) { temp_r31->unk00->trans.z = var_r30->unk04[temp_r31->unk1C].z - 100.0f; fn_1_11B18(temp_r31->unk00, 0, 0, 10, 1); } - } else { + } + else { fn_1_11B18(temp_r31->unk00, 0, 0, 10, 1); } - } else if (fn_1_11F04(&lbl_1_bss_A8, 0) == 30) { + } + else if (fn_1_11F04(&lbl_1_bss_A8, 0) == 30) { fn_1_11990(temp_r31->unk00, 0, 5, 30, 0); - } else if (fn_1_11708(temp_r31->unk00, 0, 5, 35, 1) != 0 && var_r29->unk0C == 0) { + } + else if (fn_1_11708(temp_r31->unk00, 0, 5, 35, 1) != 0 && var_r29->unk0C == 0) { var_r29->unk0C = 1; Hu3DModelHookSet(temp_r31->unk00->model[0], CharModelHookNameGet(temp_r31->unk14, 2, 0), var_r30->unk00->model[temp_r31->unk1C + 1]); if (temp_r31->unk14 != 7) { Hu3DModelPosSet(var_r30->unk00->model[temp_r31->unk1C + 1], 0.0f, 5.0f, 0.0f); - } else { + } + else { Hu3DModelPosSet(var_r30->unk00->model[temp_r31->unk1C + 1], 0.0f, -15.0f, 0.0f); } Hu3DModelScaleSet(var_r30->unk00->model[temp_r31->unk1C + 1], 0.75f, 0.75f, 0.75f); @@ -2430,20 +2528,21 @@ s32 fn_1_D6E4(void) { // Required to match. if (0) { s32 var_r28 = 0; - (void) var_r28; - (void) var_r28; - (void) var_r28; - (void) var_r28; - (void) var_r28; - (void) var_r28; + (void)var_r28; + (void)var_r28; + (void)var_r28; + (void)var_r28; + (void)var_r28; + (void)var_r28; } return 0; } -void fn_1_DA60(void) { - StructBss4A4* var_r30; - StructBss1A8* sp8; - StructBss3E4* temp_r31; +void fn_1_DA60(void) +{ + StructBss4A4 *var_r30; + StructBss1A8 *sp8; + StructBss3E4 *temp_r31; var_r30 = &lbl_1_bss_4A4; temp_r31 = &lbl_1_bss_3E4[var_r30->unk00]; @@ -2457,14 +2556,15 @@ void fn_1_DA60(void) { Vec lbl_1_data_254 = { 0.0f, 0.0f, 0.0f }; Vec lbl_1_data_260 = { 0.0f, 0.0f, 0.0f }; // unused -s32 fn_1_DB00(void) { - StructBss4A4* var_r30; - StructBss220* var_r28; - StructBss1BC* sp8; - StructBss3E4* temp_r31; - StructBss1A8* var_r27; - StructBss180* var_r26; - StructBss3E4* var_r25; +s32 fn_1_DB00(void) +{ + StructBss4A4 *var_r30; + StructBss220 *var_r28; + StructBss1BC *sp8; + StructBss3E4 *temp_r31; + StructBss1A8 *var_r27; + StructBss180 *var_r26; + StructBss3E4 *var_r25; s32 i; var_r30 = &lbl_1_bss_4A4; @@ -2476,7 +2576,8 @@ s32 fn_1_DB00(void) { lbl_1_data_254.x = 0.0f; lbl_1_data_254.y = temp_r31->unk00->trans.y; lbl_1_data_254.z = 300.0f; - } else if (temp_r31->unk20 == 1 && fn_1_11F04(&lbl_1_bss_A8, 0) <= 320) { + } + else if (temp_r31->unk20 == 1 && fn_1_11F04(&lbl_1_bss_A8, 0) <= 320) { lbl_1_data_254.x = 0.0f; lbl_1_data_254.y = temp_r31->unk00->trans.y; lbl_1_data_254.z = -240.0f; @@ -2504,10 +2605,11 @@ s32 fn_1_DB00(void) { return 0; } -void fn_1_DDBC(void) { - StructBss4A4* var_r30; - StructBss1A8* var_r29; - StructBss3E4* temp_r31; +void fn_1_DDBC(void) +{ + StructBss4A4 *var_r30; + StructBss1A8 *var_r29; + StructBss3E4 *temp_r31; var_r30 = &lbl_1_bss_4A4; var_r29 = &lbl_1_bss_1A8; @@ -2522,14 +2624,15 @@ void fn_1_DDBC(void) { temp_r31->unk20 = temp_r31->unk24 = temp_r31->unk28 = 0; } -s32 fn_1_DEB0(void) { - StructBss4A4* var_r30; - StructBss220* var_r28; - StructBss1BC* var_r29; - StructBss3E4* temp_r31; - ModelData* temp_r27; - ModelData* temp_r26; - StructBss180* var_r25; +s32 fn_1_DEB0(void) +{ + StructBss4A4 *var_r30; + StructBss220 *var_r28; + StructBss1BC *var_r29; + StructBss3E4 *temp_r31; + ModelData *temp_r27; + ModelData *temp_r26; + StructBss180 *var_r25; var_r30 = &lbl_1_bss_4A4; var_r28 = &lbl_1_bss_220; @@ -2558,10 +2661,11 @@ s32 fn_1_DEB0(void) { return 0; } -void fn_1_E0B0(void) { - StructBss4A4* var_r31; - StructBss1A8* var_r30; - StructBss3E4* var_r29; +void fn_1_E0B0(void) +{ + StructBss4A4 *var_r31; + StructBss1A8 *var_r30; + StructBss3E4 *var_r29; var_r31 = &lbl_1_bss_4A4; var_r30 = &lbl_1_bss_1A8; @@ -2571,13 +2675,14 @@ void fn_1_E0B0(void) { fn_1_11818(var_r30->unk00, 0, 4, 1, 0); } -s32 fn_1_E144(void) { - StructBss4A4* var_r31; - StructBss220* var_r28; - StructBss1BC* var_r30; - StructBss1A8* var_r27; - StructBss3E4* temp_r29; - StructBss180* var_r25; +s32 fn_1_E144(void) +{ + StructBss4A4 *var_r31; + StructBss220 *var_r28; + StructBss1BC *var_r30; + StructBss1A8 *var_r27; + StructBss3E4 *temp_r29; + StructBss180 *var_r25; var_r31 = &lbl_1_bss_4A4; var_r28 = &lbl_1_bss_220; @@ -2606,10 +2711,11 @@ s32 fn_1_E144(void) { return 0; } -void fn_1_E38C(void) { - StructBss4A4* var_r31; - StructBss220* sp8; - StructBss1A8* var_r30; +void fn_1_E38C(void) +{ + StructBss4A4 *var_r31; + StructBss220 *sp8; + StructBss1A8 *var_r30; sp8 = &lbl_1_bss_220; var_r31 = &lbl_1_bss_4A4; @@ -2622,38 +2728,43 @@ void fn_1_E38C(void) { if (var_r31->unk04 > 3 && rand8() % 2 == 0) { var_r31->unk08 = 2; } - } else if (var_r31->unk08 == 2) { + } + else if (var_r31->unk08 == 2) { var_r31->unk08 = 1; fn_1_11818(var_r30->unk00, 0, 10, 15, 0); if (var_r31->unk04 > 6 && rand8() % 2 == 0) { var_r31->unk08 = 3; } - } else if (var_r31->unk08 == 3) { + } + else if (var_r31->unk08 == 3) { var_r31->unk08 = 1; fn_1_11818(var_r30->unk00, 0, 10, 15, 0); } } -s32 fn_1_E4CC(void) { - StructBss4A4* var_r31; - StructBss1A8* var_r30; +s32 fn_1_E4CC(void) +{ + StructBss4A4 *var_r31; + StructBss1A8 *var_r30; var_r31 = &lbl_1_bss_4A4; var_r30 = &lbl_1_bss_1A8; if (Hu3DMotionEndCheck(var_r30->unk00->model[0]) && fn_1_11F04(&lbl_1_bss_A8, 1) != 0) { if (var_r31->unk08 != 1) { return fn_1_11E70(&lbl_1_bss_A8, 5); - } else { + } + else { return fn_1_11D74(&lbl_1_bss_A8); } } return 0; } -void fn_1_E56C(void) { - StructBss4A4* var_r31; - StructBss234* var_r30; - StructBss3E4* var_r28; +void fn_1_E56C(void) +{ + StructBss4A4 *var_r31; + StructBss234 *var_r30; + StructBss3E4 *var_r28; s32 i; var_r31 = &lbl_1_bss_4A4; @@ -2672,20 +2783,23 @@ void fn_1_E56C(void) { } } -s32 fn_1_E628(void) { - StructBss4A4* var_r31; +s32 fn_1_E628(void) +{ + StructBss4A4 *var_r31; var_r31 = &lbl_1_bss_4A4; if (var_r31->unk08 != 0) { fn_1_11E70(&lbl_1_bss_A8, 10); - } else { + } + else { fn_1_11D74(&lbl_1_bss_A8); } } -void fn_1_E680(void) { - StructBss4A4* var_r31; - StructBss1A8* var_r30; +void fn_1_E680(void) +{ + StructBss4A4 *var_r31; + StructBss1A8 *var_r30; var_r31 = &lbl_1_bss_4A4; var_r30 = &lbl_1_bss_1A8; @@ -2695,12 +2809,13 @@ void fn_1_E680(void) { HuPrcChildCreate(fn_1_C90C, 100, 0x2000, 0, HuPrcCurrentGet()); } -s32 fn_1_E710(void) { - StructBss4A4* var_r29; - StructBss1A8* var_r28; - StructBss1BC* var_r31; - StructBss3E4* temp_r30; - StructBss180* var_r27; +s32 fn_1_E710(void) +{ + StructBss4A4 *var_r29; + StructBss1A8 *var_r28; + StructBss1BC *var_r31; + StructBss3E4 *temp_r30; + StructBss180 *var_r27; var_r29 = &lbl_1_bss_4A4; var_r31 = &lbl_1_bss_1BC; @@ -2714,7 +2829,8 @@ s32 fn_1_E710(void) { var_r27 = &lbl_1_bss_180[1]; fn_1_11818(var_r27->unk00, 0, 7, 10, 0); Hu3DModelHookReset(var_r28->unk00->model[0]); - Hu3DModelPosSet(var_r31->unk00->model[temp_r30->unk1C + 1], var_r31->unk04[temp_r30->unk1C].x, var_r31->unk04[temp_r30->unk1C].y + 65.0f, var_r31->unk04[temp_r30->unk1C].z); + Hu3DModelPosSet(var_r31->unk00->model[temp_r30->unk1C + 1], var_r31->unk04[temp_r30->unk1C].x, var_r31->unk04[temp_r30->unk1C].y + 65.0f, + var_r31->unk04[temp_r30->unk1C].z); Hu3DModelRotSet(var_r31->unk00->model[temp_r30->unk1C + 1], 0.0f, 0.0f, 0.0f); Hu3DModelScaleSet(var_r31->unk00->model[temp_r30->unk1C + 1], 1.0f, 1.0f, 1.0f); } @@ -2727,10 +2843,11 @@ s32 fn_1_E710(void) { return 0; } -void fn_1_E930(void) { - StructBss4A4* var_r29; - StructBss3E4* var_r28; - StructBss180* var_r31; +void fn_1_E930(void) +{ + StructBss4A4 *var_r29; + StructBss3E4 *var_r28; + StructBss180 *var_r31; s32 var_r30; var_r29 = &lbl_1_bss_4A4; @@ -2746,17 +2863,13 @@ void fn_1_E930(void) { fn_1_C844(3); } -s32 fn_1_EA04(void) { - Vec sp14[] = { - { -600.0f, 0.0f, 300.0f }, - { -600.0f, 0.0f, 150.0f }, - { -450.0f, 0.0f, 150.0f }, - { -300.0f, 0.0f, 150.0f } - }; - StructBss4A4* var_r30; - StructBss1BC* var_r27; - StructBss3E4* temp_r31; - StructBss3E4* temp_r26; +s32 fn_1_EA04(void) +{ + Vec sp14[] = { { -600.0f, 0.0f, 300.0f }, { -600.0f, 0.0f, 150.0f }, { -450.0f, 0.0f, 150.0f }, { -300.0f, 0.0f, 150.0f } }; + StructBss4A4 *var_r30; + StructBss1BC *var_r27; + StructBss3E4 *temp_r31; + StructBss3E4 *temp_r26; s32 i; s32 var_r28; @@ -2770,7 +2883,8 @@ s32 fn_1_EA04(void) { temp_r31 = &lbl_1_bss_3E4[var_r28]; if (i != 0) { fn_1_5608(temp_r31->unk00, sp14[i], 0.0f, 9.0f, 10.0f, 8.0f, 0); - } else { + } + else { temp_r31->unk00->trans.x -= 1.0f; temp_r31->unk00->trans.z += 5.0f; temp_r31->unk00->rot.y = fn_1_110FC(temp_r31->unk00->rot.y, 0.0f, 10.0f); @@ -2808,9 +2922,10 @@ s32 fn_1_EA04(void) { return 0; } -void fn_1_ED4C(void) { - StructBss4A4* var_r31; - StructBss1A8* var_r30; +void fn_1_ED4C(void) +{ + StructBss4A4 *var_r31; + StructBss1A8 *var_r30; var_r31 = &lbl_1_bss_4A4; var_r30 = &lbl_1_bss_1A8; @@ -2818,19 +2933,21 @@ void fn_1_ED4C(void) { lbl_1_bss_4 = 0; if (var_r31->unk08 == 1) { HuPrcChildCreate(fn_1_CCA4, 100, 0x2000, 0, HuPrcCurrentGet()); - } else { + } + else { HuPrcChildCreate(fn_1_D018, 100, 0x2000, 0, HuPrcCurrentGet()); } var_r31->unk04 = var_r31->unk08 = var_r31->unk0C = 0; } -s32 fn_1_EE10(void) { - StructBss4A4* var_r30; - StructBss220* var_r26; - StructBss1BC* var_r29; - StructBss1A8* var_r27; - StructBss180* var_r31; - StructBss3E4* temp_r28; +s32 fn_1_EE10(void) +{ + StructBss4A4 *var_r30; + StructBss220 *var_r26; + StructBss1BC *var_r29; + StructBss1A8 *var_r27; + StructBss180 *var_r31; + StructBss3E4 *temp_r28; var_r30 = &lbl_1_bss_4A4; var_r26 = &lbl_1_bss_220; @@ -2857,7 +2974,8 @@ s32 fn_1_EE10(void) { lbl_1_bss_3C.x = fn_1_1113C(lbl_1_bss_78[0][3], lbl_1_bss_48[0][3], lbl_1_bss_14, 30.0f); if (lbl_1_bss_14 < 13) { lbl_1_bss_3C.y = fn_1_11164(lbl_1_bss_78[1][3], 500.0f, lbl_1_bss_14, 13.0f); - } else { + } + else { lbl_1_bss_3C.y = fn_1_112F4(500.0f, lbl_1_bss_48[1][3], lbl_1_bss_14 - 13, 17.0f); } lbl_1_bss_3C.z = fn_1_1113C(lbl_1_bss_78[2][3], lbl_1_bss_48[2][3], lbl_1_bss_14, 30.0f); @@ -2868,13 +2986,15 @@ s32 fn_1_EE10(void) { if (fn_1_11708(var_r31->unk00, 0, 4, 21, 1) != 0 && var_r30->unk08 == 0) { var_r30->unk08 = 1; Hu3DMotionSpeedSet(var_r31->unk00->model[0], 0.0f); - } else { + } + else { Hu3DModelPosSet(var_r29->unk00->model[temp_r28->unk1C + 1], lbl_1_bss_3C.x, lbl_1_bss_3C.y, lbl_1_bss_3C.z); } if (lbl_1_bss_14++ >= 30) { var_r30->unk04 = 2; } - } else if (var_r30->unk04 == 2) { + } + else if (var_r30->unk04 == 2) { Hu3DModelHookSet(var_r31->unk00->model[0], "g007m0-itemhook_c", var_r29->unk00->model[temp_r28->unk1C + 1]); Hu3DModelPosSet(var_r29->unk00->model[temp_r28->unk1C + 1], 0.0f, 0.0f, 0.0f); Hu3DMotionSpeedSet(var_r31->unk00->model[0], 1.0f); @@ -2887,13 +3007,14 @@ s32 fn_1_EE10(void) { return 0; } -void fn_1_F404(void) { - StructBss4A4* var_r29; - StructBss1A8* spC; - StructBssD8* var_r28; - StructBss180* var_r31; - StructBss180* var_r30; - StructBss3E4* sp8; +void fn_1_F404(void) +{ + StructBss4A4 *var_r29; + StructBss1A8 *spC; + StructBssD8 *var_r28; + StructBss180 *var_r31; + StructBss180 *var_r30; + StructBss3E4 *sp8; var_r29 = &lbl_1_bss_4A4; spC = &lbl_1_bss_1A8; @@ -2908,34 +3029,26 @@ void fn_1_F404(void) { fn_1_11818(var_r30->unk00, 1, 6, 30, 1); } -s32 fn_1_F4F0(void) { +s32 fn_1_F4F0(void) +{ if (fn_1_11F04(&lbl_1_bss_A8, 1) != 0) { return fn_1_11D74(&lbl_1_bss_A8); } return 0; } -StructData1E8 lbl_1_data_290[] = { - { fn_1_D344, fn_1_D418, 600 }, - { fn_1_D6C0, fn_1_D6E4, 90 }, - { fn_1_DA60, fn_1_DB00, 300 }, - { fn_1_DDBC, fn_1_DEB0, 150 }, - { fn_1_E0B0, fn_1_E144, 240 }, - { fn_1_E38C, fn_1_E4CC, 90 }, - { fn_1_E56C, fn_1_E628, 120 }, - { fn_1_E680, fn_1_E710, 120 }, - { fn_1_E930, fn_1_EA04, 120 }, - { NULL, NULL, -1 }, - { fn_1_ED4C, fn_1_EE10, -1 }, - { fn_1_F404, fn_1_F4F0, 60 }, - { NULL, NULL, -1 } -}; +StructData1E8 lbl_1_data_290[] + = { { fn_1_D344, fn_1_D418, 600 }, { fn_1_D6C0, fn_1_D6E4, 90 }, { fn_1_DA60, fn_1_DB00, 300 }, { fn_1_DDBC, fn_1_DEB0, 150 }, + { fn_1_E0B0, fn_1_E144, 240 }, { fn_1_E38C, fn_1_E4CC, 90 }, { fn_1_E56C, fn_1_E628, 120 }, { fn_1_E680, fn_1_E710, 120 }, + { fn_1_E930, fn_1_EA04, 120 }, { NULL, NULL, -1 }, { fn_1_ED4C, fn_1_EE10, -1 }, { fn_1_F404, fn_1_F4F0, 60 }, { NULL, NULL, -1 } }; -void fn_1_F538(void) { +void fn_1_F538(void) +{ fn_1_11D18(&lbl_1_bss_A8, lbl_1_data_290); } -s32 fn_1_F568(void) { +s32 fn_1_F568(void) +{ s32 var_r31; var_r31 = 0; @@ -2949,9 +3062,10 @@ s32 fn_1_F568(void) { return var_r31; } -void fn_1_F600(void) { - StructBss4A4* var_r30; - StructBss3E4* temp_r31; +void fn_1_F600(void) +{ + StructBss4A4 *var_r30; + StructBss3E4 *temp_r31; var_r30 = &lbl_1_bss_4A4; temp_r31 = &lbl_1_bss_3E4[var_r30->unk00]; @@ -2962,9 +3076,10 @@ void fn_1_F600(void) { HuPrcChildCreate(fn_1_0, 100, 0x2000, 0, HuPrcCurrentGet()); } -s32 fn_1_F6B0(void) { - StructBss4A4* var_r31; - StructBss3E4* temp_r30; +s32 fn_1_F6B0(void) +{ + StructBss4A4 *var_r31; + StructBss3E4 *temp_r30; var_r31 = &lbl_1_bss_4A4; temp_r30 = &lbl_1_bss_3E4[var_r31->unk00]; @@ -2978,16 +3093,15 @@ s32 fn_1_F6B0(void) { return 0; } -StructData1E8 lbl_1_data_32C[] = { - { fn_1_F600, fn_1_F6B0, 360 }, - { NULL, NULL, -1 } -}; +StructData1E8 lbl_1_data_32C[] = { { fn_1_F600, fn_1_F6B0, 360 }, { NULL, NULL, -1 } }; -void fn_1_F75C(void) { +void fn_1_F75C(void) +{ fn_1_11D18(&lbl_1_bss_24, lbl_1_data_32C); } -s32 fn_1_F78C(void) { +s32 fn_1_F78C(void) +{ s32 var_r31; var_r31 = 0; @@ -3001,10 +3115,11 @@ s32 fn_1_F78C(void) { return var_r31; } -void fn_1_F824(omObjData* arg0) { - StructBss1A8* sp8; - StructBss4A4* var_r30; - StructBss3E4* temp_r29; +void fn_1_F824(omObjData *arg0) +{ + StructBss1A8 *sp8; + StructBss4A4 *var_r30; + StructBss3E4 *temp_r29; s32 i; sp8 = &lbl_1_bss_1A8; @@ -3023,7 +3138,8 @@ void fn_1_F824(omObjData* arg0) { } } -void fn_1_F924(omObjData* arg0) { +void fn_1_F924(omObjData *arg0) +{ if (omSysExitReq == 1) { HuAudSeqAllFadeOut(250); WipeCreate(WIPE_MODE_OUT, WIPE_TYPE_NORMAL, -1); @@ -3031,10 +3147,11 @@ void fn_1_F924(omObjData* arg0) { } } -void fn_1_F984(void) { - StructBss180* var_r21; - StructBss4A4* var_r22; - StructBss3E4* temp_r25; +void fn_1_F984(void) +{ + StructBss180 *var_r21; + StructBss4A4 *var_r22; + StructBss3E4 *temp_r25; s32 i; fn_1_3088(); @@ -3047,13 +3164,8 @@ void fn_1_F984(void) { var_r22 = &lbl_1_bss_4A4; var_r22->unk00 = var_r22->unk04 = var_r22->unk08 = var_r22->unk0C = 0; { - StructBss1BC* var_r20 = &lbl_1_bss_1BC; - Vec sp18[] = { - { -600.0f, 0.0f, 300.0f }, - { -600.0f, 0.0f, 150.0f }, - { -450.0f, 0.0f, 150.0f }, - { -300.0f, 0.0f, 150.0f } - }; + StructBss1BC *var_r20 = &lbl_1_bss_1BC; + Vec sp18[] = { { -600.0f, 0.0f, 300.0f }, { -600.0f, 0.0f, 150.0f }, { -450.0f, 0.0f, 150.0f }, { -300.0f, 0.0f, 150.0f } }; sp18[0].z = var_r20->unk04[0].z - 100.0f; for (i = 0; i < 4; i++) { @@ -3074,7 +3186,8 @@ void fn_1_F984(void) { lbl_1_bss_3AC.unk28 = HuAudFXPlay(0x6D7); } -void fn_1_1026C(omObjData* arg0) { +void fn_1_1026C(omObjData *arg0) +{ switch (lbl_1_bss_18) { case 0: fn_1_F984(); @@ -3134,13 +3247,14 @@ void fn_1_1026C(omObjData* arg0) { fn_1_F924(arg0); } -void fn_1_10670(omObjData* arg0) { - StructBss220* var_r28; - StructBss1BC* var_r27; - StructBss1A8* var_r26; - StructBss180* temp_r30; - StructBss3E4* temp_r29; - StructBssD8* var_r25; +void fn_1_10670(omObjData *arg0) +{ + StructBss220 *var_r28; + StructBss1BC *var_r27; + StructBss1A8 *var_r26; + StructBss180 *temp_r30; + StructBss3E4 *temp_r29; + StructBssD8 *var_r25; s32 i; var_r28 = &lbl_1_bss_220; @@ -3167,7 +3281,8 @@ void fn_1_10670(omObjData* arg0) { #include "src/REL/executor.c" -void fn_1_108DC(void) { +void fn_1_108DC(void) +{ lbl_1_bss_0 = omInitObjMan(62, 0x2000); omGameSysInit(lbl_1_bss_0); fn_1_1A8(); @@ -3179,6 +3294,7 @@ void fn_1_108DC(void) { omAddObjEx(lbl_1_bss_0, 0x1000, 0, 0, -1, fn_1_10670); } -void ObjectSetup(void) { +void ObjectSetup(void) +{ fn_1_108DC(); } diff --git a/src/REL/m438Dll/main.c b/src/REL/m438Dll/main.c index 2c4c80b4..26583249 100644 --- a/src/REL/m438Dll/main.c +++ b/src/REL/m438Dll/main.c @@ -9,7 +9,6 @@ #include "game/pad.h" #include "game/sprite.h" #include "game/wipe.h" -#include "rel_sqrt_consts.h" #include "REL/m438Dll.h" diff --git a/src/REL/m439Dll/main.c b/src/REL/m439Dll/main.c index f89c03d4..8e761bba 100644 --- a/src/REL/m439Dll/main.c +++ b/src/REL/m439Dll/main.c @@ -20,8 +20,6 @@ #include "ext_math.h" -#include "rel_sqrt_consts.h" - #include "REL/m439data.h" typedef struct camera_params { diff --git a/src/REL/m440Dll/main.c b/src/REL/m440Dll/main.c index 4f9c8c9e..e200145c 100644 --- a/src/REL/m440Dll/main.c +++ b/src/REL/m440Dll/main.c @@ -12,7 +12,7 @@ #include "game/sprite.h" #include "game/wipe.h" #include "math.h" -#include "rel_sqrt_consts.h" + #include "string.h" // bss diff --git a/src/REL/m441Dll/main.c b/src/REL/m441Dll/main.c index fcb990a5..10409258 100644 --- a/src/REL/m441Dll/main.c +++ b/src/REL/m441Dll/main.c @@ -21,7 +21,6 @@ #include "game/sprite.h" #include "ext_math.h" -#include "rel_sqrt_consts.h" #undef ABS #define ABS(x) ((0 > (x)) ? -(x) : (x)) diff --git a/src/REL/m442Dll/main.c b/src/REL/m442Dll/main.c index 38b861b7..b6e60e1e 100644 --- a/src/REL/m442Dll/main.c +++ b/src/REL/m442Dll/main.c @@ -12,7 +12,6 @@ #include "game/pad.h" #include "game/sprite.h" #include "game/wipe.h" -#include "rel_sqrt_consts.h" #include "REL/m442Dll.h" diff --git a/src/REL/m443Dll/main.c b/src/REL/m443Dll/main.c index b7c1cb01..5b22d7c6 100644 --- a/src/REL/m443Dll/main.c +++ b/src/REL/m443Dll/main.c @@ -11,7 +11,7 @@ #include "game/sprite.h" #include "game/wipe.h" #include "math.h" -#include "rel_sqrt_consts.h" + #include "string.h" #ifndef __MWERKS__ diff --git a/src/REL/m444dll/main.c b/src/REL/m444dll/main.c index 4a2c8b7e..12db5f84 100644 --- a/src/REL/m444dll/main.c +++ b/src/REL/m444dll/main.c @@ -19,8 +19,6 @@ #include "ext_math.h" #include "math.h" -#include "rel_sqrt_consts.h" - typedef struct camera_view_params { Vec rot; Vec pos; diff --git a/src/REL/m445Dll/main.c b/src/REL/m445Dll/main.c index 5056e81c..67dbe9d3 100755 --- a/src/REL/m445Dll/main.c +++ b/src/REL/m445Dll/main.c @@ -18,7 +18,6 @@ #include "dolphin.h" #include "ext_math.h" -#include "rel_sqrt_consts.h" typedef struct { /* 0x00 */ s16 unk00; diff --git a/src/REL/m448Dll/main.c b/src/REL/m448Dll/main.c index 6c160d1c..8309a194 100755 --- a/src/REL/m448Dll/main.c +++ b/src/REL/m448Dll/main.c @@ -20,7 +20,6 @@ #include "dolphin.h" #include "ext_math.h" -#include "rel_sqrt_consts.h" typedef struct { /* 0x00 */ s32 unk00; diff --git a/src/REL/m450Dll/main.c b/src/REL/m450Dll/main.c index 8bd49c19..cca17e4b 100644 --- a/src/REL/m450Dll/main.c +++ b/src/REL/m450Dll/main.c @@ -31,7 +31,6 @@ #include "game/sprite.h" #include "ext_math.h" -#include "rel_sqrt_consts.h" #include "game/window.h" #include "string.h" diff --git a/src/REL/m451Dll/m451.c b/src/REL/m451Dll/m451.c index 280fe651..05d6adaa 100644 --- a/src/REL/m451Dll/m451.c +++ b/src/REL/m451Dll/m451.c @@ -17,8 +17,6 @@ #include "game/gamework_data.h" -#include "rel_sqrt_consts.h" - typedef struct bss_348_data { s16 unk0[5]; s16 unkA; diff --git a/src/REL/m453Dll/main.c b/src/REL/m453Dll/main.c index 3e07c4b1..2c8f9116 100644 --- a/src/REL/m453Dll/main.c +++ b/src/REL/m453Dll/main.c @@ -12,7 +12,7 @@ #include "game/pad.h" #include "game/sprite.h" #include "game/wipe.h" -#include "rel_sqrt_consts.h" + #include "string.h" #include "REL/m453Dll.h" diff --git a/src/REL/m455Dll/main.c b/src/REL/m455Dll/main.c index 3a41ee0b..2a2c634a 100644 --- a/src/REL/m455Dll/main.c +++ b/src/REL/m455Dll/main.c @@ -1,25 +1,24 @@ +#include "game/hsfdraw.h" +#include "game/hsfman.h" #include "game/object.h" #include "game/objsub.h" -#include "game/hsfman.h" -#include "game/hsfdraw.h" + #include "game/hsfmotion.h" #include "game/pad.h" -#include "game/wipe.h" -#include "game/frand.h" -#include "game/audio.h" -#include "game/minigame_seq.h" -#include "game/gamework_data.h" -#include "game/chrman.h" #include "REL/m455Dll.h" +#include "game/audio.h" +#include "game/chrman.h" +#include "game/frand.h" +#include "game/gamework_data.h" +#include "game/minigame_seq.h" +#include "game/wipe.h" + #include "ext_math.h" #include "math.h" -#include "rel_sqrt_consts.h" - - typedef struct camera_view_params { float zoom; Vec pos; @@ -51,7 +50,6 @@ Vec lbl_1_bss_8; s16 lbl_1_bss_4; s32 lbl_1_bss_0; - void fn_1_330(omObjData *object); void fn_1_B94(Process *objman); void fn_1_2A90(Process *objman); @@ -68,9 +66,9 @@ void ObjectSetup(void) Hu3DCameraPerspectiveSet(HU3D_CAM0, -1, 20, 25000, 1.2f); Hu3DCameraViewportSet(HU3D_CAM0, 0, 0, 640, 480, 0, 1); lbl_1_bss_3C = omAddObjEx(objman, 32730, 0, 0, -1, omOutView); - lbl_1_bss_8.x = lbl_1_data_44.x-lbl_1_data_38.x; - lbl_1_bss_8.y = lbl_1_data_44.y-lbl_1_data_38.y; - lbl_1_bss_8.z = lbl_1_data_44.z-lbl_1_data_38.z; + lbl_1_bss_8.x = lbl_1_data_44.x - lbl_1_data_38.x; + lbl_1_bss_8.y = lbl_1_data_44.y - lbl_1_data_38.y; + lbl_1_bss_8.z = lbl_1_data_44.z - lbl_1_data_38.z; PSVECNormalize(&lbl_1_bss_8, &lbl_1_bss_8); light = Hu3DGLightCreateV(&lbl_1_data_38, &lbl_1_bss_8, &lbl_1_data_50); Hu3DGLightInfinitytSet(light); @@ -107,7 +105,7 @@ void fn_1_330(omObjData *object) lbl_1_bss_24 = 60; lbl_1_bss_22 = -1; lbl_1_bss_20 = 0; - lbl_1_bss_16 = ((frand16()*270.0f)/65536.0f)+30.0f; + lbl_1_bss_16 = ((frand16() * 270.0f) / 65536.0f) + 30.0f; WipeCreate(WIPE_MODE_IN, WIPE_TYPE_NORMAL, 60); camera->fov = 30.0f; object->func = fn_1_478; @@ -152,115 +150,114 @@ s16 lbl_1_data_90 = -1; s32 lbl_1_data_94 = -1; s32 lbl_1_data_98 = -1; - - void fn_1_478(omObjData *object) { s32 i; omObjData **playerList; M455Player *player; - - switch(fn_1_320()) { + + switch (fn_1_320()) { case 0: - if(lbl_1_data_98 < 0) { + if (lbl_1_data_98 < 0) { lbl_1_data_98 = HuAudFXPlay(1985); } - if(--lbl_1_bss_2C == 0) { + if (--lbl_1_bss_2C == 0) { fn_1_310(1); lbl_1_bss_2C = 120; } break; - + case 1: - if(--lbl_1_bss_2C == 0) { + if (--lbl_1_bss_2C == 0) { fn_1_310(2); lbl_1_bss_4 = MGSeqStartCreate(); } break; - + case 2: - if(!MGSeqStatGet(lbl_1_bss_4)) { + if (!MGSeqStatGet(lbl_1_bss_4)) { fn_1_310(3); } - if(lbl_1_data_94 < 0 && (MGSeqStatGet(lbl_1_bss_4) & 0x10)) { + if (lbl_1_data_94 < 0 && (MGSeqStatGet(lbl_1_bss_4) & 0x10)) { lbl_1_data_94 = HuAudSeqPlay(60); } break; - + case 3: - if(--lbl_1_bss_24 == 0) { + if (--lbl_1_bss_24 == 0) { lbl_1_bss_26--; - if(lbl_1_data_90 >= 0) { + if (lbl_1_data_90 >= 0) { MGSeqParamSet(lbl_1_data_90, 1, lbl_1_bss_26); } lbl_1_bss_24 = 60; - if(lbl_1_bss_26 == 10) { + if (lbl_1_bss_26 == 10) { lbl_1_data_90 = MGSeqTimerCreate(10); } } - if(lbl_1_bss_16 >= 0) { + if (lbl_1_bss_16 >= 0) { lbl_1_bss_16--; } - if(lbl_1_bss_26 == 0 || fn_1_C90()) { + if (lbl_1_bss_26 == 0 || fn_1_C90()) { fn_1_310(4); lbl_1_bss_4 = MGSeqFinishCreate(); HuAudSeqFadeOut(lbl_1_data_94, 100); } break; - + case 4: - if(lbl_1_data_90 >= 0) { + if (lbl_1_data_90 >= 0) { MGSeqParamSet(lbl_1_data_90, 2, -1); lbl_1_data_90 = -1; } - if(!MGSeqStatGet(lbl_1_bss_4)) { + if (!MGSeqStatGet(lbl_1_bss_4)) { fn_1_310(7); lbl_1_bss_2C = 120; } break; - + case 7: - if(--lbl_1_bss_2C == 0) { + if (--lbl_1_bss_2C == 0) { fn_1_310(9); - if(lbl_1_bss_30 >= 0) { + if (lbl_1_bss_30 >= 0) { HuAudSStreamPlay(1); playerList = omGetGroupMemberListEx(HuPrcCurrentGet(), 0); - for(i=0; i<4; i++) { + for (i = 0; i < 4; i++) { player = playerList[i]->data; - if(player->unk28 < 0) { - GWPlayerCoinWinSet(i, lbl_1_bss_22+1); + if (player->unk28 < 0) { + GWPlayerCoinWinSet(i, lbl_1_bss_22 + 1); } } - } else { + } + else { HuAudSStreamPlay(4); - for(i=0; i<4; i++) { + for (i = 0; i < 4; i++) { GWPlayerCoinWinSet(i, 3); } } lbl_1_bss_2C = 210; } break; - + case 9: - if(--lbl_1_bss_2C == 0) { + if (--lbl_1_bss_2C == 0) { WipeCreate(WIPE_MODE_OUT, WIPE_TYPE_NORMAL, 60); HuAudFXStop(lbl_1_data_98); object->func = fn_1_B38; } break; } - if(lbl_1_bss_20) { - if(lbl_1_bss_20 >= 2) { - for(i=0; i<100; i++){ - s32 srcIdx = (frand8()*lbl_1_bss_20) >> 8; - s32 dstIdx = (frand8()*lbl_1_bss_20) >> 8; + if (lbl_1_bss_20) { + if (lbl_1_bss_20 >= 2) { + for (i = 0; i < 100; i++) { + s32 srcIdx = (frand8() * lbl_1_bss_20) >> 8; + s32 dstIdx = (frand8() * lbl_1_bss_20) >> 8; s32 temp = lbl_1_bss_18[srcIdx]; lbl_1_bss_18[srcIdx] = lbl_1_bss_18[dstIdx]; lbl_1_bss_18[dstIdx] = temp; } } playerList = omGetGroupMemberListEx(HuPrcCurrentGet(), 0); - for(i=0; idata; @@ -268,7 +265,7 @@ void fn_1_478(omObjData *object) } lbl_1_bss_20 = 0; } - if(omSysExitReq && !WipeStatGet()) { + if (omSysExitReq && !WipeStatGet()) { WipeCreate(WIPE_MODE_OUT, WIPE_TYPE_NORMAL, 60); object->func = fn_1_B38; } @@ -276,7 +273,7 @@ void fn_1_478(omObjData *object) void fn_1_B38(omObjData *object) { - if(WipeStatGet()) { + if (WipeStatGet()) { return; } fn_1_C28(); @@ -295,9 +292,8 @@ void fn_1_B94(Process *objman) lbl_1_bss_28 = 0; lbl_1_bss_14 = 3; omMakeGroupEx(objman, 0, 4); - for(i=0; i<4; i++) { + for (i = 0; i < 4; i++) { omAddObjEx(objman, 5, 10, 50, 0, fn_1_D14); - } } @@ -308,10 +304,10 @@ void fn_1_C28(void) s32 i; omObjData **playerList; playerList = omGetGroupMemberListEx(HuPrcCurrentGet(), 0); - if(playerList == NULL) { + if (playerList == NULL) { return; } - for(i=0; i<4; i++) { + for (i = 0; i < 4; i++) { fn_1_2010(playerList[i]); } } @@ -321,9 +317,9 @@ s32 fn_1_C90(void) s32 i; omObjData **playerList; playerList = omGetGroupMemberListEx(HuPrcCurrentGet(), 0); - for(i=0; i<4; i++) { + for (i = 0; i < 4; i++) { M455Player *player = playerList[i]->data; - if(!player->field1) { + if (!player->field1) { return 0; } } @@ -333,11 +329,16 @@ s32 fn_1_C90(void) s32 fn_1_3214(void); u32 lbl_1_data_E0[5][2] = { - 0x5F0000, 0, - 0x540024, 1, - 0x54001C, 1, - 0x5F0017, 0, - 0x5F0018, 0, + 0x5F0000, + 0, + 0x540024, + 1, + 0x54001C, + 1, + 0x5F0017, + 0, + 0x5F0018, + 0, }; Vec lbl_1_data_108[4] = { @@ -372,13 +373,14 @@ void fn_1_D14(omObjData *object) Hu3DModelCameraSet(object->model[0], HU3D_CAM0); object->model[1] = Hu3DModelCreateFile(0x540002); Hu3DModelHookSet(object->model[0], "test11_tex_we-itemhook-r", object->model[1]); - Hu3DModelAttrSet(object->model[1], HU3D_MOTATTR_SHAPE_PAUSE|HU3D_MOTATTR_PAUSE); + Hu3DModelAttrSet(object->model[1], HU3D_MOTATTR_SHAPE_PAUSE | HU3D_MOTATTR_PAUSE); player->unk1C = 1; - for(i=0; i<5; i++) { - if(lbl_1_data_E0[i][1] == 0) { + for (i = 0; i < 5; i++) { + if (lbl_1_data_E0[i][1] == 0) { object->motion[i] = CharModelMotionCreate(player->unk10, lbl_1_data_E0[i][0]); - } else { - object->motion[i] = CharModelMotionCreate(player->unk10, player->unk10+lbl_1_data_E0[i][0]); + } + else { + object->motion[i] = CharModelMotionCreate(player->unk10, player->unk10 + lbl_1_data_E0[i][0]); } } Hu3DMotionSet(object->model[0], object->motion[player->unk1C]); @@ -400,7 +402,7 @@ void fn_1_D14(omObjData *object) Hu3DMotionSet(object->model[4], i); Hu3DModelAttrSet(object->model[4], HU3D_MOTATTR_LOOP); Hu3DModelAttrSet(object->model[4], HU3D_MOTATTR_PAUSE); - player->unk4C.x = object->trans.x+(50.0f*((((s32)frand() & 0x1FF)-256.0f)/256.0f)); + player->unk4C.x = object->trans.x + (50.0f * ((((s32)frand() & 0x1FF) - 256.0f) / 256.0f)); player->unk4C.y = -200; player->unk4C.z = -1500; Hu3DModelPosSetV(object->model[4], &player->unk4C); @@ -413,13 +415,14 @@ void fn_1_D14(omObjData *object) player->unk34[1].z = -1000; CharModelDataClose(player->unk10); object->rot.y = 180; - if(((s32)frand() & 0x1F) < 4-player->unk12) { - player->unk58 = lbl_1_bss_16-(60.0f*(0.05f*(4-player->unk12)))-((frand8()/256.0f)*6.0f); - if(player->unk58 < 0) { + if (((s32)frand() & 0x1F) < 4 - player->unk12) { + player->unk58 = lbl_1_bss_16 - (60.0f * (0.05f * (4 - player->unk12))) - ((frand8() / 256.0f) * 6.0f); + if (player->unk58 < 0) { player->unk58 = 0; } - } else { - player->unk58 = lbl_1_bss_16+(60.0f*(0.1f*(4-player->unk12)))+((frand8()/256.0f)*30.0f)+6.0f; + } + else { + player->unk58 = lbl_1_bss_16 + (60.0f * (0.1f * (4 - player->unk12))) + ((frand8() / 256.0f) * 30.0f) + 6.0f; } player->unk28 = -1; object->func = fn_1_1444; @@ -428,25 +431,17 @@ void fn_1_D14(omObjData *object) void fn_1_1400(omObjData *object) { M455Player *player = object->data; - if(player->unk58 != 0) { + if (player->unk58 != 0) { player->unk58--; - } else { + } + else { player->unkA |= PAD_BUTTON_A; } } -float lbl_1_data_154[4] = { - -350, - -170, - 170, - 350 -}; +float lbl_1_data_154[4] = { -350, -170, 170, 350 }; -float lbl_1_data_164[3] = { - 1.5f, - 1.0f, - 0.5f -}; +float lbl_1_data_164[3] = { 1.5f, 1.0f, 0.5f }; float fn_1_2390(float arg0, float arg1, float arg2); s32 fn_1_24F0(Vec *arg0, Vec *arg1, float arg2); @@ -461,38 +456,39 @@ void fn_1_1444(omObjData *object) Vec spC; float temp_f31; - temp_r31 = object->data; temp_r29 = temp_r31->unk1C; temp_r28 = temp_r31->unk20; object->trans.y = fn_1_687C(); - if(fn_1_320() < 3) { + if (fn_1_320() < 3) { return; } - switch(temp_r31->unk16) { + switch (temp_r31->unk16) { case 0: - if(fn_1_320() == 4 || lbl_1_bss_14 == 0) { + if (fn_1_320() == 4 || lbl_1_bss_14 == 0) { temp_r31->field1 = 1; temp_r31->unk16 = 2; espDispOff(temp_r31->unk2A); return; } - if(!GWPlayerCfg[temp_r31->unk2].iscom) { + if (!GWPlayerCfg[temp_r31->unk2].iscom) { temp_r31->unk6 = HuPadStkX[temp_r31->unk4]; temp_r31->unk7 = HuPadStkY[temp_r31->unk4]; temp_r31->unk8 = HuPadBtn[temp_r31->unk4]; temp_r31->unkA = HuPadBtnDown[temp_r31->unk4]; - } else { + } + else { temp_r31->unk8 = temp_r31->unkA = 0; temp_r31->unk6 = temp_r31->unk7 = 0; fn_1_1400(object); } - if(lbl_1_bss_16 == 0) { - if(temp_r31->unkC) { + if (lbl_1_bss_16 == 0) { + if (temp_r31->unkC) { omVibrate(temp_r31->unk2, 12, 12, 0); - } else { + } + else { sp18.x = object->trans.x; - sp18.y = object->trans.y+300; + sp18.y = object->trans.y + 300; sp18.z = object->trans.z; Hu3D3Dto2D(&sp18, HU3D_CAM0, &sp18); espPosSet(temp_r31->unk2A, sp18.x, sp18.y); @@ -501,31 +497,30 @@ void fn_1_1444(omObjData *object) } temp_r31->unk2C = temp_r31->unk2E = 30; } - - if(temp_r31->unkA & PAD_BUTTON_A) { + + if (temp_r31->unkA & PAD_BUTTON_A) { temp_r31->unk16 = 1; temp_r31->unk24 = temp_r31->unk26 = 90; temp_r31->unk2C = -1; - if(lbl_1_bss_16 <= 0) { + if (lbl_1_bss_16 <= 0) { lbl_1_bss_18[lbl_1_bss_20++] = temp_r31->unk2; } - Hu3DModelAttrReset(object->model[1], HU3D_MOTATTR_SHAPE_PAUSE|HU3D_MOTATTR_PAUSE); + Hu3DModelAttrReset(object->model[1], HU3D_MOTATTR_SHAPE_PAUSE | HU3D_MOTATTR_PAUSE); Hu3DMotionSpeedSet(object->model[1], 1.2f); Hu3DMotionShapeSpeedSet(object->model[1], 1.2f); HuAudFXPlay(1986); - } temp_r29 = 1; temp_r28 = HU3D_MOTATTR_LOOP; break; - + case 1: temp_r29 = 2; temp_r28 = HU3D_MOTATTR_NONE; - if(!temp_r31->field0) { - if(temp_r31->unk28 >= 0 && temp_r31->unk28 < 3) { + if (!temp_r31->field0) { + if (temp_r31->unk28 >= 0 && temp_r31->unk28 < 3) { temp_r31->field0 = 1; - if(temp_r31->unk28 == 0) { + if (temp_r31->unk28 == 0) { lbl_1_bss_30 = temp_r31->unk2; } temp_f31 = lbl_1_data_164[temp_r31->unk28]; @@ -533,13 +528,13 @@ void fn_1_1444(omObjData *object) Hu3DModelAttrReset(object->model[4], HU3D_ATTR_DISPOFF); } } - temp_f31 = 1.0f-((float)temp_r31->unk24/temp_r31->unk26); + temp_f31 = 1.0f - ((float)temp_r31->unk24 / temp_r31->unk26); sp24[0].x = temp_r31->unk4C.x; sp24[0].y = temp_r31->unk4C.y; sp24[0].z = temp_r31->unk4C.z; sp24[1].x = object->trans.x; - sp24[1].y = object->trans.y+1500; - sp24[1].z = object->trans.z-200; + sp24[1].y = object->trans.y + 1500; + sp24[1].z = object->trans.z - 200; sp24[2].x = lbl_1_data_154[temp_r31->unk2]; sp24[2].y = 0; sp24[2].z = 150; @@ -547,32 +542,32 @@ void fn_1_1444(omObjData *object) VECSubtract(&sp18, &Hu3DData[object->model[4]].pos, &spC); Hu3DModelRotSet(object->model[4], atan2d(-spC.y, VECMagXZ(&spC)), atan2d(spC.x, spC.z), 0); Hu3DModelPosSetV(object->model[4], &sp18); - if(sp18.y > 0.0f) { - if(!temp_r31->field2 && temp_r31->field0) { + if (sp18.y > 0.0f) { + if (!temp_r31->field2 && temp_r31->field0) { fn_1_6CB0(&sp18, -1); fn_1_6698(&sp18, -1, -1, -1); temp_r31->field2 = 1; } } - temp_r31->unk34[0].x = temp_f31*(2.0f*lbl_1_data_154[temp_r31->unk2]); - temp_r31->unk34[0].y = -200.0f+(-400.0f*temp_f31); - temp_r31->unk34[0].z = -500.0f+(-1500.0f*temp_f31); - temp_r31->unk34[1].x = temp_f31*lbl_1_data_154[temp_r31->unk2]; - temp_r31->unk34[1].y = -200.0f+(400.0f*temp_f31); - temp_r31->unk34[1].z = -1000.0f+(750.0f*temp_f31); - if(--temp_r31->unk24 == 0) { + temp_r31->unk34[0].x = temp_f31 * (2.0f * lbl_1_data_154[temp_r31->unk2]); + temp_r31->unk34[0].y = -200.0f + (-400.0f * temp_f31); + temp_r31->unk34[0].z = -500.0f + (-1500.0f * temp_f31); + temp_r31->unk34[1].x = temp_f31 * lbl_1_data_154[temp_r31->unk2]; + temp_r31->unk34[1].y = -200.0f + (400.0f * temp_f31); + temp_r31->unk34[1].z = -1000.0f + (750.0f * temp_f31); + if (--temp_r31->unk24 == 0) { temp_r31->unk16 = 2; temp_r31->field1 = 1; - if(temp_r31->field0) { + if (temp_r31->field0) { Hu3DModelAttrReset(object->model[4], HU3D_MOTATTR_PAUSE); Hu3DModelRotSet(object->model[4], 0, 0, 0); lbl_1_bss_14--; } } break; - + case 2: - if(fn_1_320() == 7) { + if (fn_1_320() == 7) { temp_r31->unk16 = 3; Hu3DModelObjPosGet(object->model[0], "test11_tex_we-itemhook-r", &sp18); CharModelEffectCreate(1, &sp18); @@ -580,46 +575,50 @@ void fn_1_1444(omObjData *object) Hu3DModelAttrSet(object->model[3], HU3D_ATTR_DISPOFF); } break; - + case 3: - if(fn_1_320() < 9) { + if (fn_1_320() < 9) { temp_r29 = 0; temp_r28 = HU3D_MOTATTR_LOOP; - } else { + } + else { object->rot.y = fn_1_2390(object->rot.y, 0, 0.2f); - if(temp_r31->unk2 == lbl_1_bss_30) { + if (temp_r31->unk2 == lbl_1_bss_30) { temp_r29 = 3; temp_r28 = HU3D_MOTATTR_NONE; - } else { + } + else { temp_r29 = 4; temp_r28 = HU3D_MOTATTR_NONE; } } break; - + default: break; } - if(temp_r31->unk2C) { - if(temp_r31->unk2C >= 0) { - temp_f31 = (0.5*sind((90.0f*(float)temp_r31->unk2C)/(float)temp_r31->unk2E))+0.5; + if (temp_r31->unk2C) { + if (temp_r31->unk2C >= 0) { + temp_f31 = (0.5 * sind((90.0f * (float)temp_r31->unk2C) / (float)temp_r31->unk2E)) + 0.5; espScaleSet(temp_r31->unk2A, temp_f31, temp_f31); - if(--temp_r31->unk2C == 0) { + if (--temp_r31->unk2C == 0) { temp_r31->unk2C = temp_r31->unk2E; } temp_r31->unk30++; - } else { - if(temp_r31->unk30 > 30.0f) { + } + else { + if (temp_r31->unk30 > 30.0f) { espDispOff(temp_r31->unk2A); temp_r31->unk2C = 0; - } else { + } + else { temp_r31->unk30++; } } } - if(temp_r31->unk16 >= 2 && temp_r31->unk16 <= 3 && temp_r31->field0) { + if (temp_r31->unk16 >= 2 && temp_r31->unk16 <= 3 && temp_r31->field0) { Hu3DData[object->model[4]].rot.y += 2.0f; - if(0.0f == Hu3DData[object->model[4]].unk_64) { + if (0.0f == Hu3DData[object->model[4]].unk_64) { HuAudFXPlay(1987); } } @@ -633,7 +632,7 @@ void fn_1_1444(omObjData *object) void fn_1_2010(omObjData *object) { M455Player *player = object->data; - if(object->data != NULL) { + if (object->data != NULL) { HuMemDirectFree(object->data); object->data = NULL; } @@ -647,7 +646,7 @@ void fn_1_2060(ModelData *arg0, Mtx arg1) { Vec vtxPos[4]; Mtx mtxHook; - + Vec pos; Vec itemHookPos; s32 i; @@ -666,16 +665,16 @@ void fn_1_2060(ModelData *arg0, Mtx arg1) GXSetTevOp(GX_TEVSTAGE0, GX_PASSCLR); GXClearVtxDesc(); GXSetVtxDesc(GX_VA_POS, GX_DIRECT); - GXSetVtxAttrFmt(GX_VTXFMT0, GX_VA_POS, GX_POS_XYZ, GX_F32, 0); + GXSetVtxAttrFmt(GX_VTXFMT0, GX_VA_POS, GX_POS_XYZ, GX_F32, 0); Hu3DModelObjMtxGet(object->model[0], "test11_tex_we-itemhook-r", mtxHook); Hu3DModelObjPosGet(object->model[1], "hook", &pos); MTXMultVec(mtxHook, &pos, &vtxPos[0]); - for(i=0; i<2; i++) { - vtxPos[i+1].x = player->unk34[i].x; - vtxPos[i+1].y = player->unk34[i].y; - vtxPos[i+1].z = player->unk34[i].z; + for (i = 0; i < 2; i++) { + vtxPos[i + 1].x = player->unk34[i].x; + vtxPos[i + 1].y = player->unk34[i].y; + vtxPos[i + 1].z = player->unk34[i].z; } - if(player->field0) { + if (player->field0) { Mtx hookMtx; Vec hookPos; Hu3DModelObjMtxGet(object->model[4], "itemhook_C", hookMtx); @@ -683,14 +682,15 @@ void fn_1_2060(ModelData *arg0, Mtx arg1) hookPos.y = -60.000004f; hookPos.z = 35.0f; MTXMultVec(hookMtx, &hookPos, &vtxPos[3]); - } else { + } + else { vtxPos[3].x = modelPuku->pos.x; vtxPos[3].y = modelPuku->pos.y; vtxPos[3].z = modelPuku->pos.z; } GXBegin(GX_LINESTRIP, GX_VTXFMT0, 20); - for(i=0; i<20; i++) { - fn_1_27A0(vtxPos, &pos, i/19.0f); + for (i = 0; i < 20; i++) { + fn_1_27A0(vtxPos, &pos, i / 19.0f); GXPosition3f32(pos.x, pos.y, pos.z); } GXEnd(); @@ -698,16 +698,16 @@ void fn_1_2060(ModelData *arg0, Mtx arg1) float fn_1_2390(float arg0, float arg1, float arg2) { - float temp_f31 = fmod(arg1-arg0, 360); + float temp_f31 = fmod(arg1 - arg0, 360); float temp_f30; - if(temp_f31 < 0) { + if (temp_f31 < 0) { temp_f31 += 360.0f; } - if(temp_f31 > 180) { + if (temp_f31 > 180) { temp_f31 -= 360.0f; } - temp_f30 = fmod(arg0+(arg2*temp_f31), 360); - if(temp_f30 < 0) { + temp_f30 = fmod(arg0 + (arg2 * temp_f31), 360); + if (temp_f30 < 0) { temp_f30 += 360.0f; } return temp_f30; @@ -715,8 +715,8 @@ float fn_1_2390(float arg0, float arg1, float arg2) float fn_1_2494(float arg0, float arg1, float arg2, float arg3) { - float temp_f31 = 1.0f-arg3; - return (arg0*(temp_f31*temp_f31))+((2.0f*temp_f31)*arg3*arg1)+(arg2*(arg3*arg3)); + float temp_f31 = 1.0f - arg3; + return (arg0 * (temp_f31 * temp_f31)) + ((2.0f * temp_f31) * arg3 * arg1) + (arg2 * (arg3 * arg3)); } s32 fn_1_24F0(Vec *arg0, Vec *arg1, float arg2) @@ -728,9 +728,9 @@ s32 fn_1_24F0(Vec *arg0, Vec *arg1, float arg2) float fn_1_26F8(float arg0, float arg1, float arg2, float arg3, float arg4) { - float temp_f31 = 1.0f-arg0; - float temp_f30 = temp_f31*temp_f31; - float temp_f29 = temp_f31*temp_f31*temp_f31; + float temp_f31 = 1.0f - arg0; + float temp_f30 = temp_f31 * temp_f31; + float temp_f29 = temp_f31 * temp_f31 * temp_f31; return (arg4 * (arg0 * (arg0 * arg0))) + ((arg3 * (arg0 * (3.0f * temp_f31 * arg0))) + ((temp_f29 * arg1) + (arg2 * (3.0f * temp_f30 * arg0)))); } @@ -755,33 +755,33 @@ void fn_1_2A90(Process *objman) void fn_1_2AF4(s32 arg0, s32 arg1, float arg2) { - CZoom = lbl_1_data_0[arg0].zoom+(arg2*(lbl_1_data_0[arg1].zoom-lbl_1_data_0[arg0].zoom)); - Center.x = lbl_1_data_0[arg0].pos.x+(arg2*(lbl_1_data_0[arg1].pos.x-lbl_1_data_0[arg0].pos.x)); - Center.y = lbl_1_data_0[arg0].pos.y+(arg2*(lbl_1_data_0[arg1].pos.y-lbl_1_data_0[arg0].pos.y)); - Center.z = lbl_1_data_0[arg0].pos.z+(arg2*(lbl_1_data_0[arg1].pos.z-lbl_1_data_0[arg0].pos.z)); - CRot.x = lbl_1_data_0[arg0].rot.x+(arg2*(lbl_1_data_0[arg1].rot.x-lbl_1_data_0[arg0].rot.x)); - CRot.y = lbl_1_data_0[arg0].rot.y+(arg2*(lbl_1_data_0[arg1].rot.y-lbl_1_data_0[arg0].rot.y)); - CRot.z = lbl_1_data_0[arg0].rot.z+(arg2*(lbl_1_data_0[arg1].rot.z-lbl_1_data_0[arg0].rot.z)); + CZoom = lbl_1_data_0[arg0].zoom + (arg2 * (lbl_1_data_0[arg1].zoom - lbl_1_data_0[arg0].zoom)); + Center.x = lbl_1_data_0[arg0].pos.x + (arg2 * (lbl_1_data_0[arg1].pos.x - lbl_1_data_0[arg0].pos.x)); + Center.y = lbl_1_data_0[arg0].pos.y + (arg2 * (lbl_1_data_0[arg1].pos.y - lbl_1_data_0[arg0].pos.y)); + Center.z = lbl_1_data_0[arg0].pos.z + (arg2 * (lbl_1_data_0[arg1].pos.z - lbl_1_data_0[arg0].pos.z)); + CRot.x = lbl_1_data_0[arg0].rot.x + (arg2 * (lbl_1_data_0[arg1].rot.x - lbl_1_data_0[arg0].rot.x)); + CRot.y = lbl_1_data_0[arg0].rot.y + (arg2 * (lbl_1_data_0[arg1].rot.y - lbl_1_data_0[arg0].rot.y)); + CRot.z = lbl_1_data_0[arg0].rot.z + (arg2 * (lbl_1_data_0[arg1].rot.z - lbl_1_data_0[arg0].rot.z)); } void fn_1_2D44(omObjData *object) { CameraData *camera = &Hu3DCamera[0]; - switch(fn_1_320()) { + switch (fn_1_320()) { case 1: - fn_1_2AF4(0, 1, sind(lbl_1_data_184[0]*90.0f)); - if(lbl_1_data_184[0] < 1.0f) { - lbl_1_data_184[0] += 1.0f/60.0f; - if(lbl_1_data_184[0] > 1.0f) { + fn_1_2AF4(0, 1, sind(lbl_1_data_184[0] * 90.0f)); + if (lbl_1_data_184[0] < 1.0f) { + lbl_1_data_184[0] += 1.0f / 60.0f; + if (lbl_1_data_184[0] > 1.0f) { lbl_1_data_184[0] = 1.0f; } } break; - + case 6: fn_1_2AF4(1, 1, 0); break; - + case 4: case 5: case 7: @@ -794,9 +794,9 @@ s32 fn_1_3214(void) { s32 rumble = HuPadRumbleGet(); s32 i; - for(i=0; i<4; i++) { - if(!GWPlayerCfg[i].iscom) { - if((rumble & lbl_1_data_18C[GWPlayerCfg[i].pad_idx]) == 0) { + for (i = 0; i < 4; i++) { + if (!GWPlayerCfg[i].iscom) { + if ((rumble & lbl_1_data_18C[GWPlayerCfg[i].pad_idx]) == 0) { return 0; } } @@ -804,4 +804,4 @@ s32 fn_1_3214(void) return GWGameStat.rumble; } -float lbl_1_data_19C[] = { 0,355,0,0,0,275,128,950,6,0,0,0,190,0,550 }; \ No newline at end of file +float lbl_1_data_19C[] = { 0, 355, 0, 0, 0, 275, 128, 950, 6, 0, 0, 0, 190, 0, 550 }; diff --git a/src/REL/m461Dll/main.c b/src/REL/m461Dll/main.c index 5b0ae287..f94c9831 100644 --- a/src/REL/m461Dll/main.c +++ b/src/REL/m461Dll/main.c @@ -22,7 +22,6 @@ #include "game/sprite.h" #include "ext_math.h" -#include "rel_sqrt_consts.h" #undef ABS #define ABS(x) ((0 > (x)) ? -(x) : (x)) diff --git a/src/REL/mentDll/common.c b/src/REL/mentDll/common.c index 9d71da1f..82910c62 100644 --- a/src/REL/mentDll/common.c +++ b/src/REL/mentDll/common.c @@ -13,9 +13,6 @@ #include "game/wipe.h" #include "math.h" - -#include "rel_sqrt_consts.h" - Process *lbl_1_bss_0; // TODO: unknown type extern s32 lbl_1_bss_A8[]; diff --git a/src/REL/messDll/main.c b/src/REL/messDll/main.c index 9f861bf1..f7b32576 100755 --- a/src/REL/messDll/main.c +++ b/src/REL/messDll/main.c @@ -9,9 +9,8 @@ #include "dolphin.h" #include "ext_math.h" -#include "rel_sqrt_consts.h" -extern s32 sprintf(char*, const char*, s32); +extern s32 sprintf(char *, const char *, s32); static void fn_1_2BC(omObjData *arg0); static void fn_1_300(omObjData *arg0); @@ -27,7 +26,8 @@ static u8 lbl_1_bss_4_pad[4]; static s16 lbl_1_bss_2; static s16 lbl_1_bss_0; -void ObjectSetup(void) { +void ObjectSetup(void) +{ OSReport("******* SAFObjectSetup *********\n"); lbl_1_bss_34 = omInitObjMan(0x32, 0x2000); CRot.x = -20.0f; @@ -46,12 +46,14 @@ void ObjectSetup(void) { lbl_1_bss_8 = HuPrcChildCreate(fn_1_E88, 100, 0x3000, 0, lbl_1_bss_34); } -static void fn_1_2BC(omObjData *arg0) { +static void fn_1_2BC(omObjData *arg0) +{ WipeCreate(WIPE_MODE_IN, WIPE_TYPE_NORMAL, 10); arg0->func = fn_1_300; } -static void fn_1_300(omObjData *arg0) { +static void fn_1_300(omObjData *arg0) +{ Vec sp2C; Vec sp20; Vec sp14; @@ -79,14 +81,14 @@ static void fn_1_300(omObjData *arg0) { sp14.z = cosd(CRot.y) * sind(CRot.x); temp_f31 = CRot.z; sp8.x = sp14.x * (sp20.x * sp20.x + (1.0f - sp20.x * sp20.x) * cosd(temp_f31)) - + sp14.y * (sp20.x * sp20.y * (1.0 - cosd(temp_f31)) - sp20.z * sind(temp_f31)) - + sp14.z * (sp20.x * sp20.z * (1.0 - cosd(temp_f31)) + sp20.y * sind(temp_f31)); + + sp14.y * (sp20.x * sp20.y * (1.0 - cosd(temp_f31)) - sp20.z * sind(temp_f31)) + + sp14.z * (sp20.x * sp20.z * (1.0 - cosd(temp_f31)) + sp20.y * sind(temp_f31)); sp8.y = sp14.x * (sp20.x * sp20.y * (1.0 - cosd(temp_f31)) + sp20.z * sind(temp_f31)) - + sp14.y * (sp20.y * sp20.y + (1.0f - sp20.y * sp20.y) * cosd(temp_f31)) - + sp14.z * (sp20.y * sp20.z * (1.0 - cosd(temp_f31)) - sp20.x * sind(temp_f31)); + + sp14.y * (sp20.y * sp20.y + (1.0f - sp20.y * sp20.y) * cosd(temp_f31)) + + sp14.z * (sp20.y * sp20.z * (1.0 - cosd(temp_f31)) - sp20.x * sind(temp_f31)); sp8.z = sp14.x * (sp20.x * sp20.z * (1.0 - cosd(temp_f31)) - sp20.y * sind(temp_f31)) - + sp14.y * (sp20.y * sp20.z * (1.0 - cosd(temp_f31)) + sp20.x * sind(temp_f31)) - + sp14.z * (sp20.z * sp20.z + (1.0f - sp20.z * sp20.z) * cosd(temp_f31)); + + sp14.y * (sp20.y * sp20.z * (1.0 - cosd(temp_f31)) + sp20.x * sind(temp_f31)) + + sp14.z * (sp20.z * sp20.z + (1.0f - sp20.z * sp20.z) * cosd(temp_f31)); VECCrossProduct(&sp14, &sp20, &sp20); VECNormalize(&sp20, &sp20); temp_r31 = HuPadSubStkX[0] & 0xF8; @@ -104,69 +106,19 @@ static void fn_1_300(omObjData *arg0) { } } -static char *lbl_1_data_32C[] = { - "001_Character_Name_ss", - "002_Hidden_Block", - "003_Battle_M", - "004_Bowser_M", - "005_Warp_M", - "006_Mushroom_M", - "007_Lot_house", - "008_Boo_house", - "009_ItemName", - "010_Bord", - "011_RoundItem", - "012_Spaceamida", - "013_Star_M", - "014_RollerCoaster", - "015_Last5", - "016_ItemShop", - "017_System", - "018_ModeSelect", - "019_Item", - "020_Map2_event", - "021_Lucky_Minigame", - "022_Bord_Start", - "023_Map3_event", - "024_Minigame_Name", - "025_mg_446", - "026_debugmes", - "027_Party_Mode", - "028_SETUP", - "029_Miracle", - "030_mg_kuppa", - "031_Story_Mode", - "032_Bowser_Story", - "033_Map4_event", - "034_mg_inst", - "035_E3_only", - "036_saf", - "037_Mg_inst_sys_", - "038_Bord_Results", - "039_Bord_Results2", - "040_Map5_event", - "041_Mg_Mode", - "042_mg_445", - "043_mg_447", - "044_mg_448", - "045_mg_449", - "046_mg_450", - "047_tutorial", - "048_Option_Rooml", - "049_Map6_event", - "050_charley", - "051_Present_Room", - "052_Extra_Room", - "053_Staff_Post", - "054_Staff_Name", - "055_Opening_Demo", - "056_mgex_inst", - NULL -}; +static char *lbl_1_data_32C[] + = { "001_Character_Name_ss", "002_Hidden_Block", "003_Battle_M", "004_Bowser_M", "005_Warp_M", "006_Mushroom_M", "007_Lot_house", "008_Boo_house", + "009_ItemName", "010_Bord", "011_RoundItem", "012_Spaceamida", "013_Star_M", "014_RollerCoaster", "015_Last5", "016_ItemShop", "017_System", + "018_ModeSelect", "019_Item", "020_Map2_event", "021_Lucky_Minigame", "022_Bord_Start", "023_Map3_event", "024_Minigame_Name", "025_mg_446", + "026_debugmes", "027_Party_Mode", "028_SETUP", "029_Miracle", "030_mg_kuppa", "031_Story_Mode", "032_Bowser_Story", "033_Map4_event", + "034_mg_inst", "035_E3_only", "036_saf", "037_Mg_inst_sys_", "038_Bord_Results", "039_Bord_Results2", "040_Map5_event", "041_Mg_Mode", + "042_mg_445", "043_mg_447", "044_mg_448", "045_mg_449", "046_mg_450", "047_tutorial", "048_Option_Rooml", "049_Map6_event", "050_charley", + "051_Present_Room", "052_Extra_Room", "053_Staff_Post", "054_Staff_Name", "055_Opening_Demo", "056_mgex_inst", NULL }; static s16 lbl_1_data_410 = -1; -static void fn_1_E88(void) { +static void fn_1_E88(void) +{ s16 sp10[256]; // unknown size char spC[4]; char sp8[4]; @@ -192,7 +144,7 @@ static void fn_1_E88(void) { var_r30 = (var_r28 << 16); var_r25 = 0; while (1) { - if ((s32) MessData_MesPtrGet(messDataPtr, var_r30 + var_r25) == 0) { + if ((s32)MessData_MesPtrGet(messDataPtr, var_r30 + var_r25) == 0) { break; } sp10[var_r28]++; @@ -226,13 +178,15 @@ static void fn_1_E88(void) { var_r31 = 0; } var_r30 = 0; - } else if (temp_r3_2 & 0x40) { + } + else if (temp_r3_2 & 0x40) { var_r31--; if (var_r31 < 0) { var_r31 = var_r27 - 1; } var_r30 = 0; - } else if (temp_r3_2 & 0x200) { + } + else if (temp_r3_2 & 0x200) { var_r30--; if (var_r30 < 0) { var_r31--; @@ -241,7 +195,8 @@ static void fn_1_E88(void) { } var_r30 = sp10[var_r31] - 1; } - } else { + } + else { var_r30++; if (var_r30 >= sp10[var_r31]) { var_r31++; @@ -255,18 +210,10 @@ static void fn_1_E88(void) { } } -static char *lbl_1_data_440[] = { - "]1^", - "]2^", - "]3^", - "]4^", - "]5^", - "]6^", - "]7^", - "]8^" -}; +static char *lbl_1_data_440[] = { "]1^", "]2^", "]3^", "]4^", "]5^", "]6^", "]7^", "]8^" }; -static s32 fn_1_11B0(s16 arg0, s16 arg1) { +static s32 fn_1_11B0(s16 arg0, s16 arg1) +{ WindowData *temp_r30; float spC[2]; s32 temp_r28; @@ -285,7 +232,7 @@ static s32 fn_1_11B0(s16 arg0, s16 arg1) { } temp_r28 = MAKE_MESSID(arg0, arg1); for (i = 0; i < 8; i++) { - HuWinInsertMesSizeGet(MAKE_MESSID_PTR(lbl_1_data_440[i]), (s16) i); + HuWinInsertMesSizeGet(MAKE_MESSID_PTR(lbl_1_data_440[i]), (s16)i); } HuWinMesMaxSizeGet(1, &spC[0], temp_r28); if (spC[0] <= 16.0f) { @@ -293,7 +240,7 @@ static s32 fn_1_11B0(s16 arg0, s16 arg1) { } lbl_1_data_410 = HuWinCreate(-10000.0f, -10000.0f, spC[0], spC[1], 0); for (i = 0; i < 8; i++) { - HuWinInsertMesSet(lbl_1_data_410, MAKE_MESSID_PTR(lbl_1_data_440[i]), (s16) i); + HuWinInsertMesSet(lbl_1_data_410, MAKE_MESSID_PTR(lbl_1_data_440[i]), (s16)i); } temp_r30 = &winData[lbl_1_data_410]; temp_r30->push_key |= 0x360; diff --git a/src/REL/mgmodedll/mgmode.c b/src/REL/mgmodedll/mgmode.c index 28d8c990..67b59009 100644 --- a/src/REL/mgmodedll/mgmode.c +++ b/src/REL/mgmodedll/mgmode.c @@ -6,7 +6,6 @@ #include "game/wipe.h" #include "ext_math.h" -#include "rel_sqrt_consts.h" typedef struct camera_view_params { Vec rot; diff --git a/src/REL/modeseldll/main.c b/src/REL/modeseldll/main.c index fc10e07b..f1d9be9b 100644 --- a/src/REL/modeseldll/main.c +++ b/src/REL/modeseldll/main.c @@ -1,26 +1,22 @@ -#include "game/object.h" +#include "REL/modeseldll.h" +#include "game/audio.h" +#include "game/gamework_data.h" #include "game/hsfman.h" +#include "game/object.h" +#include "game/objsub.h" +#include "game/pad.h" #include "game/process.h" #include "game/window.h" -#include "game/objsub.h" -#include "game/audio.h" #include "game/wipe.h" -#include "game/pad.h" #include "math.h" -#include "game/gamework_data.h" -#include "REL/modeseldll.h" -#include "rel_sqrt_consts.h" typedef struct camera_view_params { - Vec rot; - Vec pos; - float zoom; + Vec rot; + Vec pos; + float zoom; } CameraViewParams; -CameraViewParams lbl_1_data_0[] = { - { { 0, 0, 0 }, { 0, 0, 0 }, 1500 }, - { { 0, 0, 0 }, { 0, 0, 0 }, 524 } -}; +CameraViewParams lbl_1_data_0[] = { { { 0, 0, 0 }, { 0, 0, 0 }, 1500 }, { { 0, 0, 0 }, { 0, 0, 0 }, 524 } }; omObjData *lbl_1_bss_7C; Process *lbl_1_bss_78; @@ -42,325 +38,332 @@ void fn_1_1B6C(void); void ObjectSetup(void) { - s32 light; - OSReport("******* MS ObjectSetup *********\n"); - lbl_1_bss_78 = omInitObjMan(50, 8192); - omGameSysInit(lbl_1_bss_78); - lbl_1_bss_24[0].x = -70; - lbl_1_bss_24[0].y = 0; - lbl_1_bss_24[0].z = 0; - lbl_1_bss_C[0].x = 0; - lbl_1_bss_C[0].y = 130; - lbl_1_bss_C[0].z = -186; - lbl_1_bss_4[0] = 1360; - lbl_1_bss_64 = lbl_1_bss_24[0]; - lbl_1_bss_58 = lbl_1_bss_C[0]; - lbl_1_bss_54 = lbl_1_bss_4[0]; - lbl_1_bss_70[0] = 0; - Hu3DCameraCreate(1); - Hu3DCameraPerspectiveSet(1, 30, 20, 8000, 1.2f); - Hu3DCameraViewportSet(1, 0, 0, 640, 480, 0, 1); - Hu3DCameraScissorSet(1, 0, 16, 640, 448); - light = Hu3DGLightCreate(0, 100, 1000, 0, -0.5, -1, 255, 255, 255); - Hu3DGLightInfinitytSet(light); - HuPrcChildCreate(fn_1_414, 100, 16384, 0, lbl_1_bss_78); - HuPrcChildCreate(fn_1_AF0, 200, 4096, 0, lbl_1_bss_78); - lbl_1_bss_7C = omAddObjEx(lbl_1_bss_78, 32730, 0, 0, -1, fn_1_B8C); - omAddObjEx(lbl_1_bss_78, 0, 32, 32, -1, fn_1_F40); - Hu3DBGColorSet(0, 0, 0); - mgBoardHostEnableF = 0; - HuWinInit(1); - mgPracticeEnableF = 0; - mgQuitExtraF = 0; + s32 light; + OSReport("******* MS ObjectSetup *********\n"); + lbl_1_bss_78 = omInitObjMan(50, 8192); + omGameSysInit(lbl_1_bss_78); + lbl_1_bss_24[0].x = -70; + lbl_1_bss_24[0].y = 0; + lbl_1_bss_24[0].z = 0; + lbl_1_bss_C[0].x = 0; + lbl_1_bss_C[0].y = 130; + lbl_1_bss_C[0].z = -186; + lbl_1_bss_4[0] = 1360; + lbl_1_bss_64 = lbl_1_bss_24[0]; + lbl_1_bss_58 = lbl_1_bss_C[0]; + lbl_1_bss_54 = lbl_1_bss_4[0]; + lbl_1_bss_70[0] = 0; + Hu3DCameraCreate(1); + Hu3DCameraPerspectiveSet(1, 30, 20, 8000, 1.2f); + Hu3DCameraViewportSet(1, 0, 0, 640, 480, 0, 1); + Hu3DCameraScissorSet(1, 0, 16, 640, 448); + light = Hu3DGLightCreate(0, 100, 1000, 0, -0.5, -1, 255, 255, 255); + Hu3DGLightInfinitytSet(light); + HuPrcChildCreate(fn_1_414, 100, 16384, 0, lbl_1_bss_78); + HuPrcChildCreate(fn_1_AF0, 200, 4096, 0, lbl_1_bss_78); + lbl_1_bss_7C = omAddObjEx(lbl_1_bss_78, 32730, 0, 0, -1, fn_1_B8C); + omAddObjEx(lbl_1_bss_78, 0, 32, 32, -1, fn_1_F40); + Hu3DBGColorSet(0, 0, 0); + mgBoardHostEnableF = 0; + HuWinInit(1); + mgPracticeEnableF = 0; + mgQuitExtraF = 0; } void fn_1_414(void) { - fn_1_9F4(); - if(omovlevtno) { - HuAudSeqPlay(43); - } else { - if(!fn_1_37DC()) { - WipeColorSet(0, 0, 0); - WipeCreate(WIPE_MODE_OUT, WIPE_TYPE_NORMAL, 20); - HuAudSeqAllFadeOut(1000); - while(WipeStatGet()) { - HuPrcVSleep(); - } - omOvlReturnEx(1, 1); - while(1) { - HuPrcVSleep(); - } - } else { - s16 group = HuSprGrpCreate(1); - s16 sprite = HuTHPSprCreateVol("movie/opmov_s00.thp", 0, 3000, 70.0); - HuSprGrpMemberSet(group, 0, sprite); - HuSprPosSet(group, 0, 288, 240); - HuSprDrawNoSet(group, 0, 127); - HuPrcSleep(2); - espAttrSet(lbl_1_bss_152[0], HUSPR_ATTR_DISPOFF); - HuAudFXStop(lbl_1_data_100); - while(!HuTHPEndCheck()) { - HuPrcVSleep(); - } - HuTHPClose(); - HuSprGrpKill(group); - } - } - espAttrReset(lbl_1_bss_152[9], HUSPR_ATTR_DISPOFF); - espDrawNoSet(lbl_1_bss_152[9], 127); - { - s16 result = fn_1_2490(); - if(result == -1) { - HuAudSeqAllFadeOut(1000); - WipeColorSet(0, 0, 0); - WipeCreate(WIPE_MODE_OUT, WIPE_TYPE_NORMAL, 20); - - while(WipeStatGet()) { - HuPrcVSleep(); - } - omOvlGotoEx(OVL_MODESEL, 1, 0, 0); - while(1) { - HuPrcVSleep(); - } - } else { - s16 i; - omOvlHisData *his; - for(i=0; i<4; i++) { - GWPlayerCfg[i].pad_idx = i; - if(!HuPadStatGet(i)) { - GWPlayerCfg[i].iscom = 0; - } else { - GWPlayerCfg[i].iscom = 1; - } - } - his = omOvlHisGet(0); - omOvlHisChg(0, his->overlay, 1, his->stat); - _ClearFlag(FLAG_ID_MAKE(1, 0)); - _ClearFlag(FLAG_ID_MAKE(1, 8)); - _ClearFlag(FLAG_ID_MAKE(1, 12)); - _ClearFlag(FLAG_ID_MAKE(1, 11)); - GWGameStat.sound_mode = msmSysGetOutputMode(); - switch(result) { - case 0: - GWMGExplainSet(GWGameStat.party_pause.explain_mg); - GWMGShowComSet(GWGameStat.party_pause.show_com_mg); - GWMGListSet(GWGameStat.party_pause.mg_list); - GWMessSpeedSet(GWGameStat.party_pause.mess_speed); - GWSaveModeSet(GWGameStat.party_pause.save_mode); - omOvlCallEx(OVL_MENT, 1, 0, 0); - break; - - case 1: - GWMGExplainSet(GWGameStat.story_pause.explain_mg); - GWMGShowComSet(GWGameStat.story_pause.show_com_mg); - GWMGListSet(GWGameStat.story_pause.mg_list); - GWMessSpeedSet(GWGameStat.story_pause.mess_speed); - GWSaveModeSet(GWGameStat.story_pause.save_mode); - omOvlCallEx(OVL_MENT, 1, 1, 0); - break; - - case 2: - omOvlCallEx(OVL_MGMODE, 1, 0, 0); - break; - - case 3: - omOvlCallEx(OVL_MENT, 1, 3, 0); - break; - - case 4: - omOvlCallEx(OVL_MENT, 1, 4, 0); - break; - - case 5: - omOvlCallEx(OVL_MPEX, 1, 0, 0); - break; - } - while(1) { - HuPrcVSleep(); - } - } - } + fn_1_9F4(); + if (omovlevtno) { + HuAudSeqPlay(43); + } + else { + if (!fn_1_37DC()) { + WipeColorSet(0, 0, 0); + WipeCreate(WIPE_MODE_OUT, WIPE_TYPE_NORMAL, 20); + HuAudSeqAllFadeOut(1000); + while (WipeStatGet()) { + HuPrcVSleep(); + } + omOvlReturnEx(1, 1); + while (1) { + HuPrcVSleep(); + } + } + else { + s16 group = HuSprGrpCreate(1); + s16 sprite = HuTHPSprCreateVol("movie/opmov_s00.thp", 0, 3000, 70.0); + HuSprGrpMemberSet(group, 0, sprite); + HuSprPosSet(group, 0, 288, 240); + HuSprDrawNoSet(group, 0, 127); + HuPrcSleep(2); + espAttrSet(lbl_1_bss_152[0], HUSPR_ATTR_DISPOFF); + HuAudFXStop(lbl_1_data_100); + while (!HuTHPEndCheck()) { + HuPrcVSleep(); + } + HuTHPClose(); + HuSprGrpKill(group); + } + } + espAttrReset(lbl_1_bss_152[9], HUSPR_ATTR_DISPOFF); + espDrawNoSet(lbl_1_bss_152[9], 127); + { + s16 result = fn_1_2490(); + if (result == -1) { + HuAudSeqAllFadeOut(1000); + WipeColorSet(0, 0, 0); + WipeCreate(WIPE_MODE_OUT, WIPE_TYPE_NORMAL, 20); + + while (WipeStatGet()) { + HuPrcVSleep(); + } + omOvlGotoEx(OVL_MODESEL, 1, 0, 0); + while (1) { + HuPrcVSleep(); + } + } + else { + s16 i; + omOvlHisData *his; + for (i = 0; i < 4; i++) { + GWPlayerCfg[i].pad_idx = i; + if (!HuPadStatGet(i)) { + GWPlayerCfg[i].iscom = 0; + } + else { + GWPlayerCfg[i].iscom = 1; + } + } + his = omOvlHisGet(0); + omOvlHisChg(0, his->overlay, 1, his->stat); + _ClearFlag(FLAG_ID_MAKE(1, 0)); + _ClearFlag(FLAG_ID_MAKE(1, 8)); + _ClearFlag(FLAG_ID_MAKE(1, 12)); + _ClearFlag(FLAG_ID_MAKE(1, 11)); + GWGameStat.sound_mode = msmSysGetOutputMode(); + switch (result) { + case 0: + GWMGExplainSet(GWGameStat.party_pause.explain_mg); + GWMGShowComSet(GWGameStat.party_pause.show_com_mg); + GWMGListSet(GWGameStat.party_pause.mg_list); + GWMessSpeedSet(GWGameStat.party_pause.mess_speed); + GWSaveModeSet(GWGameStat.party_pause.save_mode); + omOvlCallEx(OVL_MENT, 1, 0, 0); + break; + + case 1: + GWMGExplainSet(GWGameStat.story_pause.explain_mg); + GWMGShowComSet(GWGameStat.story_pause.show_com_mg); + GWMGListSet(GWGameStat.story_pause.mg_list); + GWMessSpeedSet(GWGameStat.story_pause.mess_speed); + GWSaveModeSet(GWGameStat.story_pause.save_mode); + omOvlCallEx(OVL_MENT, 1, 1, 0); + break; + + case 2: + omOvlCallEx(OVL_MGMODE, 1, 0, 0); + break; + + case 3: + omOvlCallEx(OVL_MENT, 1, 3, 0); + break; + + case 4: + omOvlCallEx(OVL_MENT, 1, 4, 0); + break; + + case 5: + omOvlCallEx(OVL_MPEX, 1, 0, 0); + break; + } + while (1) { + HuPrcVSleep(); + } + } + } } void fn_1_9F4(void) { - Vec pos; - Vec target; - Vec up; - Hu3DShadowCreate(20, 100, 5000); - Hu3DShadowTPLvlSet(0.3f); - Hu3DShadowSizeSet(192); - target.x = target.y = target.z = 0; - pos.x = 500; - pos.z = 1000; - pos.y = 2000; - up.x = 0; - up.y = 1; - up.z = 0; - Hu3DShadowPosSet(&pos, &up, &target); - fn_1_BED8(lbl_1_data_428); - fn_1_C168(lbl_1_data_93C); + Vec pos; + Vec target; + Vec up; + Hu3DShadowCreate(20, 100, 5000); + Hu3DShadowTPLvlSet(0.3f); + Hu3DShadowSizeSet(192); + target.x = target.y = target.z = 0; + pos.x = 500; + pos.z = 1000; + pos.y = 2000; + up.x = 0; + up.y = 1; + up.z = 0; + Hu3DShadowPosSet(&pos, &up, &target); + fn_1_BED8(lbl_1_data_428); + fn_1_C168(lbl_1_data_93C); } void fn_1_AF0(void) { - s16 i; - while(1) { - if(lbl_1_bss_70[0] || omSysExitReq) { - break; - } - HuPrcVSleep(); - } - for(i=0; i<4; i++) { - GWPlayerCfg[i].character = -1; - } - BoardStatusKill(); - omOvlReturnEx(1, 1); - HuPrcEnd(); + s16 i; + while (1) { + if (lbl_1_bss_70[0] || omSysExitReq) { + break; + } + HuPrcVSleep(); + } + for (i = 0; i < 4; i++) { + GWPlayerCfg[i].character = -1; + } + BoardStatusKill(); + omOvlReturnEx(1, 1); + HuPrcEnd(); } u16 lbl_1_data_6E[] = { 1, 2 }; void fn_1_B8C(omObjData *object) { - s16 i; - for(i=0; i<1; i++) { - Vec pos, target, up; - float x, y, z; - - x = lbl_1_bss_24[i].x; - y = lbl_1_bss_24[i].y; - z = lbl_1_bss_24[i].z; - - pos.x = (((sin((M_PI*y)/180.0)*cos((M_PI*x)/180.0))*lbl_1_bss_4[i])+lbl_1_bss_C[i].x); - pos.y = (-sin((M_PI*x)/180.0)*lbl_1_bss_4[i])+lbl_1_bss_C[i].y; - pos.z = ((cos((M_PI*y)/180.0)*cos((M_PI*x)/180.0))*lbl_1_bss_4[i])+lbl_1_bss_C[i].z; - target.x = lbl_1_bss_C[i].x; - target.y = lbl_1_bss_C[i].y; - target.z = lbl_1_bss_C[i].z; - up.x = sin((M_PI*y)/180.0)*sin((M_PI*x)/180.0); - up.y = cos((M_PI*x)/180.0); - up.z = cos((M_PI*y)/180.0)*sin((M_PI*x)/180.0); - Hu3DCameraPosSet(lbl_1_data_6E[i], pos.x, pos.y, pos.z, up.x, up.y, up.z, target.x, target.y, target.z); - } + s16 i; + for (i = 0; i < 1; i++) { + Vec pos, target, up; + float x, y, z; + + x = lbl_1_bss_24[i].x; + y = lbl_1_bss_24[i].y; + z = lbl_1_bss_24[i].z; + + pos.x = (((sin((M_PI * y) / 180.0) * cos((M_PI * x) / 180.0)) * lbl_1_bss_4[i]) + lbl_1_bss_C[i].x); + pos.y = (-sin((M_PI * x) / 180.0) * lbl_1_bss_4[i]) + lbl_1_bss_C[i].y; + pos.z = ((cos((M_PI * y) / 180.0) * cos((M_PI * x) / 180.0)) * lbl_1_bss_4[i]) + lbl_1_bss_C[i].z; + target.x = lbl_1_bss_C[i].x; + target.y = lbl_1_bss_C[i].y; + target.z = lbl_1_bss_C[i].z; + up.x = sin((M_PI * y) / 180.0) * sin((M_PI * x) / 180.0); + up.y = cos((M_PI * x) / 180.0); + up.z = cos((M_PI * y) / 180.0) * sin((M_PI * x) / 180.0); + Hu3DCameraPosSet(lbl_1_data_6E[i], pos.x, pos.y, pos.z, up.x, up.y, up.z, target.x, target.y, target.z); + } } void fn_1_F40(omObjData *object) { - Vec pos; + Vec pos; Vec offset; Vec dir; Vec y_offset; - + f32 z_rot; s8 stick_pos; if (!lbl_1_bss_0) { - fn_1_1B6C(); + fn_1_1B6C(); return; } - lbl_1_bss_24[0].y += 0.1f * HuPadStkX[0]; - lbl_1_bss_24[0].x += 0.1f * HuPadStkY[0]; - lbl_1_bss_4[0] += HuPadTrigL[0] / 2; - lbl_1_bss_4[0] -= HuPadTrigR[0] / 2; - if(HuPadBtnDown[0] & PAD_BUTTON_B) { - OSReport("%f,%f,%f\n", lbl_1_bss_24[0].x, lbl_1_bss_24[0].y, lbl_1_bss_24[0].z); - OSReport("%f,%f,%f\n", lbl_1_bss_C[0].x, lbl_1_bss_C[0].y, lbl_1_bss_C[0].z); - OSReport("%f\n", lbl_1_bss_4[0]); - } - if (lbl_1_bss_4[0] < 100.0f) { - lbl_1_bss_4[0] = 100.0f; - } - pos.x = lbl_1_bss_C[0].x + (lbl_1_bss_4[0] * (sin((M_PI * lbl_1_bss_24[0].y) / 180.0) * cos((M_PI * lbl_1_bss_24[0].x) / 180.0))); - pos.y = (lbl_1_bss_C[0].y + (lbl_1_bss_4[0] * -sin((M_PI * lbl_1_bss_24[0].x) / 180.0))); - pos.z = (lbl_1_bss_C[0].z + (lbl_1_bss_4[0] * (cos((M_PI * lbl_1_bss_24[0].y) / 180.0) * cos((M_PI * lbl_1_bss_24[0].x) / 180.0)))); - offset.x = lbl_1_bss_C[0].x - pos.x; - offset.y = lbl_1_bss_C[0].y - pos.y; - offset.z = lbl_1_bss_C[0].z - pos.z; - dir.x = (sin((M_PI * lbl_1_bss_24[0].y) / 180.0) * sin((M_PI * lbl_1_bss_24[0].x) / 180.0)); - dir.y = cos((M_PI * lbl_1_bss_24[0].x) / 180.0); - dir.z = (cos((M_PI * lbl_1_bss_24[0].y) / 180.0) * sin((M_PI * lbl_1_bss_24[0].x) / 180.0)); - z_rot = lbl_1_bss_24[0].z; - y_offset.x = dir.x * (offset.x * offset.x + (1.0f - offset.x * offset.x) * cos((M_PI * z_rot) / 180.0)) - + dir.y * (offset.x * offset.y * (1.0f - cos((M_PI * z_rot) / 180.0)) - offset.z * sin((M_PI * z_rot) / 180.0)) - + dir.z * (offset.x * offset.z * (1.0f - cos((M_PI * z_rot) / 180.0)) + offset.y * sin((M_PI * z_rot) / 180.0)); + lbl_1_bss_24[0].y += 0.1f * HuPadStkX[0]; + lbl_1_bss_24[0].x += 0.1f * HuPadStkY[0]; + lbl_1_bss_4[0] += HuPadTrigL[0] / 2; + lbl_1_bss_4[0] -= HuPadTrigR[0] / 2; + if (HuPadBtnDown[0] & PAD_BUTTON_B) { + OSReport("%f,%f,%f\n", lbl_1_bss_24[0].x, lbl_1_bss_24[0].y, lbl_1_bss_24[0].z); + OSReport("%f,%f,%f\n", lbl_1_bss_C[0].x, lbl_1_bss_C[0].y, lbl_1_bss_C[0].z); + OSReport("%f\n", lbl_1_bss_4[0]); + } + if (lbl_1_bss_4[0] < 100.0f) { + lbl_1_bss_4[0] = 100.0f; + } + pos.x = lbl_1_bss_C[0].x + (lbl_1_bss_4[0] * (sin((M_PI * lbl_1_bss_24[0].y) / 180.0) * cos((M_PI * lbl_1_bss_24[0].x) / 180.0))); + pos.y = (lbl_1_bss_C[0].y + (lbl_1_bss_4[0] * -sin((M_PI * lbl_1_bss_24[0].x) / 180.0))); + pos.z = (lbl_1_bss_C[0].z + (lbl_1_bss_4[0] * (cos((M_PI * lbl_1_bss_24[0].y) / 180.0) * cos((M_PI * lbl_1_bss_24[0].x) / 180.0)))); + offset.x = lbl_1_bss_C[0].x - pos.x; + offset.y = lbl_1_bss_C[0].y - pos.y; + offset.z = lbl_1_bss_C[0].z - pos.z; + dir.x = (sin((M_PI * lbl_1_bss_24[0].y) / 180.0) * sin((M_PI * lbl_1_bss_24[0].x) / 180.0)); + dir.y = cos((M_PI * lbl_1_bss_24[0].x) / 180.0); + dir.z = (cos((M_PI * lbl_1_bss_24[0].y) / 180.0) * sin((M_PI * lbl_1_bss_24[0].x) / 180.0)); + z_rot = lbl_1_bss_24[0].z; + y_offset.x = dir.x * (offset.x * offset.x + (1.0f - offset.x * offset.x) * cos((M_PI * z_rot) / 180.0)) + + dir.y * (offset.x * offset.y * (1.0f - cos((M_PI * z_rot) / 180.0)) - offset.z * sin((M_PI * z_rot) / 180.0)) + + dir.z * (offset.x * offset.z * (1.0f - cos((M_PI * z_rot) / 180.0)) + offset.y * sin((M_PI * z_rot) / 180.0)); - y_offset.y = dir.y * (offset.y * offset.y + (1.0f - offset.y * offset.y) * cos((M_PI * z_rot) / 180.0)) - + dir.x * (offset.x * offset.y * (1.0f - cos((M_PI * z_rot) / 180.0)) + offset.z * sin((M_PI * z_rot) / 180.0)) - + dir.z * (offset.y * offset.z * (1.0f - cos((M_PI * z_rot) / 180.0)) - offset.x * sin((M_PI * z_rot) / 180.0)); - - y_offset.z = dir.z * (offset.z * offset.z + (1.0f - offset.z * offset.z) * cos((M_PI * z_rot) / 180.0)) - + (dir.x * (offset.x * offset.z * (1.0 - cos((M_PI * z_rot) / 180.0)) - offset.y * sin((M_PI * z_rot) / 180.0)) - + dir.y * (offset.y * offset.z * (1.0 - cos((M_PI * z_rot) / 180.0)) + offset.x * sin((M_PI * z_rot) / 180.0))); + y_offset.y = dir.y * (offset.y * offset.y + (1.0f - offset.y * offset.y) * cos((M_PI * z_rot) / 180.0)) + + dir.x * (offset.x * offset.y * (1.0f - cos((M_PI * z_rot) / 180.0)) + offset.z * sin((M_PI * z_rot) / 180.0)) + + dir.z * (offset.y * offset.z * (1.0f - cos((M_PI * z_rot) / 180.0)) - offset.x * sin((M_PI * z_rot) / 180.0)); - VECCrossProduct(&dir, &offset, &offset); - VECNormalize(&offset, &offset); - stick_pos = (HuPadSubStkX[0] & 0xF8); - if (stick_pos != 0) { - lbl_1_bss_C[0].x += 0.05f * (offset.x * stick_pos); - lbl_1_bss_C[0].y += 0.05f * (offset.y * stick_pos); - lbl_1_bss_C[0].z += 0.05f * (offset.z * stick_pos); - } - VECNormalize(&y_offset, &offset); - stick_pos = -(HuPadSubStkY[0] & 0xF8); - if (stick_pos != 0) { - lbl_1_bss_C[0].x += 0.05f * (offset.x * stick_pos); - lbl_1_bss_C[0].y += 0.05f * (offset.y * stick_pos); - lbl_1_bss_C[0].z += 0.05f * (offset.z * stick_pos); - } + y_offset.z = dir.z * (offset.z * offset.z + (1.0f - offset.z * offset.z) * cos((M_PI * z_rot) / 180.0)) + + (dir.x * (offset.x * offset.z * (1.0 - cos((M_PI * z_rot) / 180.0)) - offset.y * sin((M_PI * z_rot) / 180.0)) + + dir.y * (offset.y * offset.z * (1.0 - cos((M_PI * z_rot) / 180.0)) + offset.x * sin((M_PI * z_rot) / 180.0))); + + VECCrossProduct(&dir, &offset, &offset); + VECNormalize(&offset, &offset); + stick_pos = (HuPadSubStkX[0] & 0xF8); + if (stick_pos != 0) { + lbl_1_bss_C[0].x += 0.05f * (offset.x * stick_pos); + lbl_1_bss_C[0].y += 0.05f * (offset.y * stick_pos); + lbl_1_bss_C[0].z += 0.05f * (offset.z * stick_pos); + } + VECNormalize(&y_offset, &offset); + stick_pos = -(HuPadSubStkY[0] & 0xF8); + if (stick_pos != 0) { + lbl_1_bss_C[0].x += 0.05f * (offset.x * stick_pos); + lbl_1_bss_C[0].y += 0.05f * (offset.y * stick_pos); + lbl_1_bss_C[0].z += 0.05f * (offset.z * stick_pos); + } } void fn_1_1B6C(void) { - Vec delta_vec; - float delta_zoom; - if(lbl_1_bss_70[0]) { - return; - } - VECSubtract(&lbl_1_bss_64, &lbl_1_bss_24[0], &delta_vec); - if(VECMag(&delta_vec) > 0.2) { - VECScale(&delta_vec, &delta_vec, 0.05f); - VECAdd(&lbl_1_bss_24[0], &delta_vec, &lbl_1_bss_24[0]); - } else { - lbl_1_bss_24[0] = lbl_1_bss_64; - } - VECSubtract(&lbl_1_bss_58, &lbl_1_bss_C[0], &delta_vec); - if(VECMag(&delta_vec) > 0.2) { - VECScale(&delta_vec, &delta_vec, 0.05f); - VECAdd(&lbl_1_bss_C[0], &delta_vec, &lbl_1_bss_C[0]); - } else { - lbl_1_bss_C[0] = lbl_1_bss_58; - } - delta_zoom = lbl_1_bss_54-lbl_1_bss_4[0]; - if(sqrtf(delta_zoom*delta_zoom) > 0.2) { - delta_zoom *= 0.05f; - lbl_1_bss_4[0] += delta_zoom; - } else { - lbl_1_bss_4[0] = lbl_1_bss_54; - } + Vec delta_vec; + float delta_zoom; + if (lbl_1_bss_70[0]) { + return; + } + VECSubtract(&lbl_1_bss_64, &lbl_1_bss_24[0], &delta_vec); + if (VECMag(&delta_vec) > 0.2) { + VECScale(&delta_vec, &delta_vec, 0.05f); + VECAdd(&lbl_1_bss_24[0], &delta_vec, &lbl_1_bss_24[0]); + } + else { + lbl_1_bss_24[0] = lbl_1_bss_64; + } + VECSubtract(&lbl_1_bss_58, &lbl_1_bss_C[0], &delta_vec); + if (VECMag(&delta_vec) > 0.2) { + VECScale(&delta_vec, &delta_vec, 0.05f); + VECAdd(&lbl_1_bss_C[0], &delta_vec, &lbl_1_bss_C[0]); + } + else { + lbl_1_bss_C[0] = lbl_1_bss_58; + } + delta_zoom = lbl_1_bss_54 - lbl_1_bss_4[0]; + if (sqrtf(delta_zoom * delta_zoom) > 0.2) { + delta_zoom *= 0.05f; + lbl_1_bss_4[0] += delta_zoom; + } + else { + lbl_1_bss_4[0] = lbl_1_bss_54; + } } void fn_1_1E30(s16 view) { - lbl_1_bss_64 = lbl_1_data_0[view].rot; - lbl_1_bss_58 = lbl_1_data_0[view].pos; - lbl_1_bss_54 = lbl_1_data_0[view].zoom; + lbl_1_bss_64 = lbl_1_data_0[view].rot; + lbl_1_bss_58 = lbl_1_data_0[view].pos; + lbl_1_bss_54 = lbl_1_data_0[view].zoom; } void fn_1_1EC0(s16 view) { - s16 i; - lbl_1_bss_24[0] = lbl_1_data_0[view].rot; - lbl_1_bss_64 = lbl_1_bss_24[0]; - lbl_1_bss_C[0] = lbl_1_data_0[view].pos; - lbl_1_bss_58 = lbl_1_bss_C[0]; - lbl_1_bss_54 = lbl_1_bss_4[0] = lbl_1_data_0[view].zoom; - fn_1_B8C(NULL); + s16 i; + lbl_1_bss_24[0] = lbl_1_data_0[view].rot; + lbl_1_bss_64 = lbl_1_bss_24[0]; + lbl_1_bss_C[0] = lbl_1_data_0[view].pos; + lbl_1_bss_58 = lbl_1_bss_C[0]; + lbl_1_bss_54 = lbl_1_bss_4[0] = lbl_1_data_0[view].zoom; + fn_1_B8C(NULL); } float fn_1_2368(void) { - float delta_zoom = lbl_1_bss_54-lbl_1_bss_4[0]; - return sqrtf(delta_zoom*delta_zoom); + float delta_zoom = lbl_1_bss_54 - lbl_1_bss_4[0]; + return sqrtf(delta_zoom * delta_zoom); } diff --git a/src/REL/mpexDll/main.c b/src/REL/mpexDll/main.c index 148d7711..a613e729 100644 --- a/src/REL/mpexDll/main.c +++ b/src/REL/mpexDll/main.c @@ -8,7 +8,6 @@ #include "game/pad.h" #include "game/printfunc.h" #include "game/wipe.h" -#include "rel_sqrt_consts.h" #include "REL/mpexDll.h" diff --git a/src/REL/resultDll/main.c b/src/REL/resultDll/main.c index afe551d5..66c26486 100644 --- a/src/REL/resultDll/main.c +++ b/src/REL/resultDll/main.c @@ -13,7 +13,6 @@ #include "game/saveload.h" #include "game/window.h" #include "game/wipe.h" -#include "rel_sqrt_consts.h" #include "math.h" diff --git a/src/REL/ztardll/main.c b/src/REL/ztardll/main.c index d1d58b62..0c0b8ce0 100644 --- a/src/REL/ztardll/main.c +++ b/src/REL/ztardll/main.c @@ -10,7 +10,6 @@ #include "game/sprite.h" #include "game/window.h" #include "game/wipe.h" -#include "rel_sqrt_consts.h" #include "REL/ztardll.h" From 778bfdc0a86668f72e96394566f33c90e3432427 Mon Sep 17 00:00:00 2001 From: gamemasterplc Date: Sun, 10 Nov 2024 08:02:32 -0600 Subject: [PATCH 06/29] Match m437dll --- configure.py | 4 ++-- src/REL/m437Dll/main.c | 3 ++- 2 files changed, 4 insertions(+), 3 deletions(-) diff --git a/configure.py b/configure.py index 339a9dfe..6abbcebf 100644 --- a/configure.py +++ b/configure.py @@ -1102,8 +1102,8 @@ config.libs = [ Rel( "m437Dll", # Balloon of Doom objects={ - Object(NonMatching, "REL/m437Dll/main.c"), - Object(NonMatching, "REL/m437Dll/sequence.c"), + Object(Matching, "REL/m437Dll/main.c"), + Object(Matching, "REL/m437Dll/sequence.c"), }, ), Rel( diff --git a/src/REL/m437Dll/main.c b/src/REL/m437Dll/main.c index 7b67a481..efabc5e9 100755 --- a/src/REL/m437Dll/main.c +++ b/src/REL/m437Dll/main.c @@ -1835,7 +1835,8 @@ void fn_1_65E0(omObjData *arg0) break; } if ((temp_r31->unk0C == 4 || temp_r31->unk0C == 7) && temp_r31->unk10 == 0) { - Hu3DModelObjMtxGet(lbl_1_bss_8FC.unk00->model[0], "m437a01-chara-point", sp60); + StructBss8FC *temp = &lbl_1_bss_8FC; + Hu3DModelObjMtxGet(temp->unk00->model[0], "m437a01-chara-point", sp60); arg0->trans.y = sp60[1][3]; } } From feefeea542d282522c817961d89170ef4c49bc16 Mon Sep 17 00:00:00 2001 From: dbalatoni13 Date: Sun, 10 Nov 2024 19:01:38 +0100 Subject: [PATCH 07/29] Correct data locality in m437Dll --- config/GMPE01_00/rels/m437Dll/symbols.txt | 262 +++++++++++----------- src/REL/m437Dll/main.c | 1 - 2 files changed, 131 insertions(+), 132 deletions(-) diff --git a/config/GMPE01_00/rels/m437Dll/symbols.txt b/config/GMPE01_00/rels/m437Dll/symbols.txt index 2c062d3f..3e5eb926 100644 --- a/config/GMPE01_00/rels/m437Dll/symbols.txt +++ b/config/GMPE01_00/rels/m437Dll/symbols.txt @@ -214,125 +214,125 @@ fn_1_164B0 = .text:0x000164B0; // type:function size:0x15C fn_1_1660C = .text:0x0001660C; // type:function size:0x190 _ctors = .ctors:0x00000000; // type:label scope:global data:4byte _dtors = .dtors:0x00000000; // type:label scope:global data:4byte -lbl_1_rodata_10 = .rodata:0x00000010; // type:object size:0x8 data:double -lbl_1_rodata_18 = .rodata:0x00000018; // type:object size:0x4 data:float -lbl_1_rodata_1C = .rodata:0x0000001C; // type:object size:0x4 data:float -lbl_1_rodata_20 = .rodata:0x00000020; // type:object size:0x4 data:float -lbl_1_rodata_24 = .rodata:0x00000024; // type:object size:0x4 data:float -lbl_1_rodata_28 = .rodata:0x00000028; // type:object size:0x4 data:float -lbl_1_rodata_2C = .rodata:0x0000002C; // type:object size:0x4 data:float -lbl_1_rodata_30 = .rodata:0x00000030; // type:object size:0x4 data:float -lbl_1_rodata_34 = .rodata:0x00000034; // type:object size:0x4 data:float -lbl_1_rodata_38 = .rodata:0x00000038; // type:object size:0x4 data:float -lbl_1_rodata_3C = .rodata:0x0000003C; // type:object size:0x4 data:float -lbl_1_rodata_40 = .rodata:0x00000040; // type:object size:0x4 data:float -lbl_1_rodata_44 = .rodata:0x00000044; // type:object size:0x4 data:float -lbl_1_rodata_48 = .rodata:0x00000048; // type:object size:0x4 data:float -lbl_1_rodata_4C = .rodata:0x0000004C; // type:object size:0x4 data:float -lbl_1_rodata_50 = .rodata:0x00000050; // type:object size:0x4 data:float -lbl_1_rodata_54 = .rodata:0x00000054; // type:object size:0x4 data:float -lbl_1_rodata_58 = .rodata:0x00000058; // type:object size:0x4 data:float -lbl_1_rodata_5C = .rodata:0x0000005C; // type:object size:0x4 data:float -lbl_1_rodata_60 = .rodata:0x00000060; // type:object size:0x4 data:float -lbl_1_rodata_64 = .rodata:0x00000064; // type:object size:0x4 data:float -lbl_1_rodata_68 = .rodata:0x00000068; // type:object size:0xC data:float -lbl_1_rodata_74 = .rodata:0x00000074; // type:object size:0xC data:float -lbl_1_rodata_80 = .rodata:0x00000080; // type:object size:0xC data:float -lbl_1_rodata_8C = .rodata:0x0000008C; // type:object size:0x4 data:float -lbl_1_rodata_90 = .rodata:0x00000090; // type:object size:0x4 data:float -lbl_1_rodata_94 = .rodata:0x00000094; // type:object size:0x4 data:float -lbl_1_rodata_98 = .rodata:0x00000098; // type:object size:0x4 data:float -lbl_1_rodata_9C = .rodata:0x0000009C; // type:object size:0x4 data:float -lbl_1_rodata_A0 = .rodata:0x000000A0; // type:object size:0x4 data:float -lbl_1_rodata_A4 = .rodata:0x000000A4; // type:object size:0x48 -lbl_1_rodata_EC = .rodata:0x000000EC; // type:object size:0x4 data:float -lbl_1_rodata_F0 = .rodata:0x000000F0; // type:object size:0x4 data:float -lbl_1_rodata_F4 = .rodata:0x000000F4; // type:object size:0x4 data:float -lbl_1_rodata_F8 = .rodata:0x000000F8; // type:object size:0x4 data:float -lbl_1_rodata_FC = .rodata:0x000000FC; // type:object size:0x4 data:float -lbl_1_rodata_100 = .rodata:0x00000100; // type:object size:0x4 data:float -lbl_1_rodata_104 = .rodata:0x00000104; // type:object size:0x4 data:float -lbl_1_rodata_108 = .rodata:0x00000108; // type:object size:0x4 data:float -lbl_1_rodata_10C = .rodata:0x0000010C; // type:object size:0x4 data:float -lbl_1_rodata_110 = .rodata:0x00000110; // type:object size:0x78 -lbl_1_rodata_188 = .rodata:0x00000188; // type:object size:0x78 data:float -lbl_1_rodata_200 = .rodata:0x00000200; // type:object size:0xC8 -lbl_1_rodata_2C8 = .rodata:0x000002C8; // type:object size:0x78 data:float -lbl_1_rodata_340 = .rodata:0x00000340; // type:object size:0x4 data:float -lbl_1_rodata_344 = .rodata:0x00000344; // type:object size:0x4 data:float -lbl_1_rodata_348 = .rodata:0x00000348; // type:object size:0x4 data:float -lbl_1_rodata_34C = .rodata:0x0000034C; // type:object size:0x4 data:float -lbl_1_rodata_350 = .rodata:0x00000350; // type:object size:0x4 data:float -lbl_1_rodata_354 = .rodata:0x00000354; // type:object size:0x4 data:float -lbl_1_rodata_358 = .rodata:0x00000358; // type:object size:0x4 data:float -lbl_1_rodata_35C = .rodata:0x0000035C; // type:object size:0x14 data:4byte -lbl_1_rodata_370 = .rodata:0x00000370; // type:object size:0x4 data:float -lbl_1_rodata_374 = .rodata:0x00000374; // type:object size:0x4 data:float -lbl_1_rodata_378 = .rodata:0x00000378; // type:object size:0x4 data:float -lbl_1_rodata_37C = .rodata:0x0000037C; // type:object size:0x30 data:float -lbl_1_rodata_3AC = .rodata:0x000003AC; // type:object size:0x4 data:float -lbl_1_rodata_3B0 = .rodata:0x000003B0; // type:object size:0x4 data:float -lbl_1_rodata_3B4 = .rodata:0x000003B4; // type:object size:0x4 data:float -lbl_1_rodata_3B8 = .rodata:0x000003B8; // type:object size:0x4 data:float -lbl_1_rodata_3BC = .rodata:0x000003BC; // type:object size:0x4 data:float -lbl_1_rodata_3C0 = .rodata:0x000003C0; // type:object size:0x8 data:double -lbl_1_rodata_3C8 = .rodata:0x000003C8; // type:object size:0x8 data:double -lbl_1_rodata_3D0 = .rodata:0x000003D0; // type:object size:0x4 data:float -lbl_1_rodata_3D4 = .rodata:0x000003D4; // type:object size:0x4 data:float -lbl_1_rodata_3D8 = .rodata:0x000003D8; // type:object size:0x4 data:float -lbl_1_rodata_3DC = .rodata:0x000003DC; // type:object size:0x4 data:float -lbl_1_rodata_3E0 = .rodata:0x000003E0; // type:object size:0x4 data:float -lbl_1_rodata_3E4 = .rodata:0x000003E4; // type:object size:0x4 data:float -lbl_1_rodata_3E8 = .rodata:0x000003E8; // type:object size:0x4 data:float -lbl_1_rodata_3EC = .rodata:0x000003EC; // type:object size:0x4 data:float -lbl_1_rodata_3F0 = .rodata:0x000003F0; // type:object size:0x4 data:float -lbl_1_rodata_3F4 = .rodata:0x000003F4; // type:object size:0x4 data:float -lbl_1_rodata_3F8 = .rodata:0x000003F8; // type:object size:0x30 data:float -lbl_1_rodata_428 = .rodata:0x00000428; // type:object size:0x4 data:float -lbl_1_rodata_42C = .rodata:0x0000042C; // type:object size:0x4 data:float -lbl_1_rodata_430 = .rodata:0x00000430; // type:object size:0x4 data:float -lbl_1_rodata_434 = .rodata:0x00000434; // type:object size:0x4 data:float -lbl_1_rodata_438 = .rodata:0x00000438; // type:object size:0x4 data:float -lbl_1_rodata_43C = .rodata:0x0000043C; // type:object size:0x4 data:float -lbl_1_rodata_440 = .rodata:0x00000440; // type:object size:0x4 data:float -lbl_1_rodata_444 = .rodata:0x00000444; // type:object size:0x4 data:float -lbl_1_rodata_448 = .rodata:0x00000448; // type:object size:0x4 data:float -lbl_1_rodata_44C = .rodata:0x0000044C; // type:object size:0x4 data:float -lbl_1_rodata_450 = .rodata:0x00000450; // type:object size:0x4 data:float -lbl_1_rodata_454 = .rodata:0x00000454; // type:object size:0x4 data:float -lbl_1_rodata_458 = .rodata:0x00000458; // type:object size:0x4 data:float -lbl_1_rodata_45C = .rodata:0x0000045C; // type:object size:0x4 data:float -lbl_1_rodata_460 = .rodata:0x00000460; // type:object size:0x8 data:4byte -lbl_1_rodata_468 = .rodata:0x00000468; // type:object size:0x4 data:float -lbl_1_rodata_46C = .rodata:0x0000046C; // type:object size:0x4 data:float -lbl_1_rodata_470 = .rodata:0x00000470; // type:object size:0x8 data:4byte -lbl_1_rodata_478 = .rodata:0x00000478; // type:object size:0x8 data:4byte -lbl_1_rodata_480 = .rodata:0x00000480; // type:object size:0x4 data:float -lbl_1_rodata_484 = .rodata:0x00000484; // type:object size:0x4 data:float -lbl_1_rodata_488 = .rodata:0x00000488; // type:object size:0x8 data:4byte -lbl_1_rodata_490 = .rodata:0x00000490; // type:object size:0x20 data:4byte -lbl_1_rodata_4B0 = .rodata:0x000004B0; // type:object size:0x8 data:4byte -lbl_1_rodata_4B8 = .rodata:0x000004B8; // type:object size:0x20 data:4byte -lbl_1_rodata_4D8 = .rodata:0x000004D8; // type:object size:0x8 data:4byte -lbl_1_rodata_4E0 = .rodata:0x000004E0; // type:object size:0x30 data:float -lbl_1_rodata_510 = .rodata:0x00000510; // type:object size:0x4 data:float -lbl_1_rodata_514 = .rodata:0x00000514; // type:object size:0x4 data:float -lbl_1_rodata_518 = .rodata:0x00000518; // type:object size:0x4 data:float -lbl_1_rodata_51C = .rodata:0x0000051C; // type:object size:0x4 data:float -lbl_1_rodata_520 = .rodata:0x00000520; // type:object size:0x4 data:float -lbl_1_rodata_524 = .rodata:0x00000524; // type:object size:0x10 data:4byte -lbl_1_rodata_534 = .rodata:0x00000534; // type:object size:0x8 data:4byte -lbl_1_rodata_53C = .rodata:0x0000053C; // type:object size:0xC data:4byte -lbl_1_rodata_548 = .rodata:0x00000548; // type:object size:0x8 data:4byte -lbl_1_rodata_550 = .rodata:0x00000550; // type:object size:0x8 data:4byte -lbl_1_rodata_558 = .rodata:0x00000558; // type:object size:0x8 data:4byte -lbl_1_rodata_560 = .rodata:0x00000560; // type:object size:0x8 data:4byte -lbl_1_rodata_568 = .rodata:0x00000568; // type:object size:0xC data:4byte -lbl_1_rodata_574 = .rodata:0x00000574; // type:object size:0x8 data:4byte -lbl_1_rodata_57C = .rodata:0x0000057C; // type:object size:0x8 data:4byte -lbl_1_rodata_584 = .rodata:0x00000584; // type:object size:0x30 data:float -lbl_1_rodata_5B4 = .rodata:0x000005B4; // type:object size:0x18 data:float -lbl_1_rodata_5CC = .rodata:0x000005CC; // type:object size:0x4 data:float +lbl_1_rodata_10 = .rodata:0x00000010; // type:object size:0x8 scope:local data:double +lbl_1_rodata_18 = .rodata:0x00000018; // type:object size:0x4 scope:local data:float +lbl_1_rodata_1C = .rodata:0x0000001C; // type:object size:0x4 scope:local data:float +lbl_1_rodata_20 = .rodata:0x00000020; // type:object size:0x4 scope:local data:float +lbl_1_rodata_24 = .rodata:0x00000024; // type:object size:0x4 scope:local data:float +lbl_1_rodata_28 = .rodata:0x00000028; // type:object size:0x4 scope:local data:float +lbl_1_rodata_2C = .rodata:0x0000002C; // type:object size:0x4 scope:local data:float +lbl_1_rodata_30 = .rodata:0x00000030; // type:object size:0x4 scope:local data:float +lbl_1_rodata_34 = .rodata:0x00000034; // type:object size:0x4 scope:local data:float +lbl_1_rodata_38 = .rodata:0x00000038; // type:object size:0x4 scope:local data:float +lbl_1_rodata_3C = .rodata:0x0000003C; // type:object size:0x4 scope:local data:float +lbl_1_rodata_40 = .rodata:0x00000040; // type:object size:0x4 scope:local data:float +lbl_1_rodata_44 = .rodata:0x00000044; // type:object size:0x4 scope:local data:float +lbl_1_rodata_48 = .rodata:0x00000048; // type:object size:0x4 scope:local data:float +lbl_1_rodata_4C = .rodata:0x0000004C; // type:object size:0x4 scope:local data:float +lbl_1_rodata_50 = .rodata:0x00000050; // type:object size:0x4 scope:local data:float +lbl_1_rodata_54 = .rodata:0x00000054; // type:object size:0x4 scope:local data:float +lbl_1_rodata_58 = .rodata:0x00000058; // type:object size:0x4 scope:local data:float +lbl_1_rodata_5C = .rodata:0x0000005C; // type:object size:0x4 scope:local data:float +lbl_1_rodata_60 = .rodata:0x00000060; // type:object size:0x4 scope:local data:float +lbl_1_rodata_64 = .rodata:0x00000064; // type:object size:0x4 scope:local data:float +lbl_1_rodata_68 = .rodata:0x00000068; // type:object size:0xC scope:local data:float +lbl_1_rodata_74 = .rodata:0x00000074; // type:object size:0xC scope:local data:float +lbl_1_rodata_80 = .rodata:0x00000080; // type:object size:0xC scope:local data:float +lbl_1_rodata_8C = .rodata:0x0000008C; // type:object size:0x4 scope:local data:float +lbl_1_rodata_90 = .rodata:0x00000090; // type:object size:0x4 scope:local data:float +lbl_1_rodata_94 = .rodata:0x00000094; // type:object size:0x4 scope:local data:float +lbl_1_rodata_98 = .rodata:0x00000098; // type:object size:0x4 scope:local data:float +lbl_1_rodata_9C = .rodata:0x0000009C; // type:object size:0x4 scope:local data:float +lbl_1_rodata_A0 = .rodata:0x000000A0; // type:object size:0x4 scope:local data:float +lbl_1_rodata_A4 = .rodata:0x000000A4; // type:object size:0x48 scope:local +lbl_1_rodata_EC = .rodata:0x000000EC; // type:object size:0x4 scope:local data:float +lbl_1_rodata_F0 = .rodata:0x000000F0; // type:object size:0x4 scope:local data:float +lbl_1_rodata_F4 = .rodata:0x000000F4; // type:object size:0x4 scope:local data:float +lbl_1_rodata_F8 = .rodata:0x000000F8; // type:object size:0x4 scope:local data:float +lbl_1_rodata_FC = .rodata:0x000000FC; // type:object size:0x4 scope:local data:float +lbl_1_rodata_100 = .rodata:0x00000100; // type:object size:0x4 scope:local data:float +lbl_1_rodata_104 = .rodata:0x00000104; // type:object size:0x4 scope:local data:float +lbl_1_rodata_108 = .rodata:0x00000108; // type:object size:0x4 scope:local data:float +lbl_1_rodata_10C = .rodata:0x0000010C; // type:object size:0x4 scope:local data:float +lbl_1_rodata_110 = .rodata:0x00000110; // type:object size:0x78 scope:local +lbl_1_rodata_188 = .rodata:0x00000188; // type:object size:0x78 scope:local data:float +lbl_1_rodata_200 = .rodata:0x00000200; // type:object size:0xC8 scope:local +lbl_1_rodata_2C8 = .rodata:0x000002C8; // type:object size:0x78 scope:local data:float +lbl_1_rodata_340 = .rodata:0x00000340; // type:object size:0x4 scope:local data:float +lbl_1_rodata_344 = .rodata:0x00000344; // type:object size:0x4 scope:local data:float +lbl_1_rodata_348 = .rodata:0x00000348; // type:object size:0x4 scope:local data:float +lbl_1_rodata_34C = .rodata:0x0000034C; // type:object size:0x4 scope:local data:float +lbl_1_rodata_350 = .rodata:0x00000350; // type:object size:0x4 scope:local data:float +lbl_1_rodata_354 = .rodata:0x00000354; // type:object size:0x4 scope:local data:float +lbl_1_rodata_358 = .rodata:0x00000358; // type:object size:0x4 scope:local data:float +lbl_1_rodata_35C = .rodata:0x0000035C; // type:object size:0x14 scope:local data:4byte +lbl_1_rodata_370 = .rodata:0x00000370; // type:object size:0x4 scope:local data:float +lbl_1_rodata_374 = .rodata:0x00000374; // type:object size:0x4 scope:local data:float +lbl_1_rodata_378 = .rodata:0x00000378; // type:object size:0x4 scope:local data:float +lbl_1_rodata_37C = .rodata:0x0000037C; // type:object size:0x30 scope:local data:float +lbl_1_rodata_3AC = .rodata:0x000003AC; // type:object size:0x4 scope:local data:float +lbl_1_rodata_3B0 = .rodata:0x000003B0; // type:object size:0x4 scope:local data:float +lbl_1_rodata_3B4 = .rodata:0x000003B4; // type:object size:0x4 scope:local data:float +lbl_1_rodata_3B8 = .rodata:0x000003B8; // type:object size:0x4 scope:local data:float +lbl_1_rodata_3BC = .rodata:0x000003BC; // type:object size:0x4 scope:local data:float +lbl_1_rodata_3C0 = .rodata:0x000003C0; // type:object size:0x8 scope:local data:double +lbl_1_rodata_3C8 = .rodata:0x000003C8; // type:object size:0x8 scope:local data:double +lbl_1_rodata_3D0 = .rodata:0x000003D0; // type:object size:0x4 scope:local data:float +lbl_1_rodata_3D4 = .rodata:0x000003D4; // type:object size:0x4 scope:local data:float +lbl_1_rodata_3D8 = .rodata:0x000003D8; // type:object size:0x4 scope:local data:float +lbl_1_rodata_3DC = .rodata:0x000003DC; // type:object size:0x4 scope:local data:float +lbl_1_rodata_3E0 = .rodata:0x000003E0; // type:object size:0x4 scope:local data:float +lbl_1_rodata_3E4 = .rodata:0x000003E4; // type:object size:0x4 scope:local data:float +lbl_1_rodata_3E8 = .rodata:0x000003E8; // type:object size:0x4 scope:local data:float +lbl_1_rodata_3EC = .rodata:0x000003EC; // type:object size:0x4 scope:local data:float +lbl_1_rodata_3F0 = .rodata:0x000003F0; // type:object size:0x4 scope:local data:float +lbl_1_rodata_3F4 = .rodata:0x000003F4; // type:object size:0x4 scope:local data:float +lbl_1_rodata_3F8 = .rodata:0x000003F8; // type:object size:0x30 scope:local data:float +lbl_1_rodata_428 = .rodata:0x00000428; // type:object size:0x4 scope:local data:float +lbl_1_rodata_42C = .rodata:0x0000042C; // type:object size:0x4 scope:local data:float +lbl_1_rodata_430 = .rodata:0x00000430; // type:object size:0x4 scope:local data:float +lbl_1_rodata_434 = .rodata:0x00000434; // type:object size:0x4 scope:local data:float +lbl_1_rodata_438 = .rodata:0x00000438; // type:object size:0x4 scope:local data:float +lbl_1_rodata_43C = .rodata:0x0000043C; // type:object size:0x4 scope:local data:float +lbl_1_rodata_440 = .rodata:0x00000440; // type:object size:0x4 scope:local data:float +lbl_1_rodata_444 = .rodata:0x00000444; // type:object size:0x4 scope:local data:float +lbl_1_rodata_448 = .rodata:0x00000448; // type:object size:0x4 scope:local data:float +lbl_1_rodata_44C = .rodata:0x0000044C; // type:object size:0x4 scope:local data:float +lbl_1_rodata_450 = .rodata:0x00000450; // type:object size:0x4 scope:local data:float +lbl_1_rodata_454 = .rodata:0x00000454; // type:object size:0x4 scope:local data:float +lbl_1_rodata_458 = .rodata:0x00000458; // type:object size:0x4 scope:local data:float +lbl_1_rodata_45C = .rodata:0x0000045C; // type:object size:0x4 scope:local data:float +lbl_1_rodata_460 = .rodata:0x00000460; // type:object size:0x8 scope:local data:4byte +lbl_1_rodata_468 = .rodata:0x00000468; // type:object size:0x4 scope:local data:float +lbl_1_rodata_46C = .rodata:0x0000046C; // type:object size:0x4 scope:local data:float +lbl_1_rodata_470 = .rodata:0x00000470; // type:object size:0x8 scope:local data:4byte +lbl_1_rodata_478 = .rodata:0x00000478; // type:object size:0x8 scope:local data:4byte +lbl_1_rodata_480 = .rodata:0x00000480; // type:object size:0x4 scope:local data:float +lbl_1_rodata_484 = .rodata:0x00000484; // type:object size:0x4 scope:local data:float +lbl_1_rodata_488 = .rodata:0x00000488; // type:object size:0x8 scope:local data:4byte +lbl_1_rodata_490 = .rodata:0x00000490; // type:object size:0x20 scope:local data:4byte +lbl_1_rodata_4B0 = .rodata:0x000004B0; // type:object size:0x8 scope:local data:4byte +lbl_1_rodata_4B8 = .rodata:0x000004B8; // type:object size:0x20 scope:local data:4byte +lbl_1_rodata_4D8 = .rodata:0x000004D8; // type:object size:0x8 scope:local data:4byte +lbl_1_rodata_4E0 = .rodata:0x000004E0; // type:object size:0x30 scope:local data:float +lbl_1_rodata_510 = .rodata:0x00000510; // type:object size:0x4 scope:local data:float +lbl_1_rodata_514 = .rodata:0x00000514; // type:object size:0x4 scope:local data:float +lbl_1_rodata_518 = .rodata:0x00000518; // type:object size:0x4 scope:local data:float +lbl_1_rodata_51C = .rodata:0x0000051C; // type:object size:0x4 scope:local data:float +lbl_1_rodata_520 = .rodata:0x00000520; // type:object size:0x4 scope:local data:float +lbl_1_rodata_524 = .rodata:0x00000524; // type:object size:0x10 scope:local data:4byte +lbl_1_rodata_534 = .rodata:0x00000534; // type:object size:0x8 scope:local data:4byte +lbl_1_rodata_53C = .rodata:0x0000053C; // type:object size:0xC scope:local data:4byte +lbl_1_rodata_548 = .rodata:0x00000548; // type:object size:0x8 scope:local data:4byte +lbl_1_rodata_550 = .rodata:0x00000550; // type:object size:0x8 scope:local data:4byte +lbl_1_rodata_558 = .rodata:0x00000558; // type:object size:0x8 scope:local data:4byte +lbl_1_rodata_560 = .rodata:0x00000560; // type:object size:0x8 scope:local data:4byte +lbl_1_rodata_568 = .rodata:0x00000568; // type:object size:0xC scope:local data:4byte +lbl_1_rodata_574 = .rodata:0x00000574; // type:object size:0x8 scope:local data:4byte +lbl_1_rodata_57C = .rodata:0x0000057C; // type:object size:0x8 scope:local data:4byte +lbl_1_rodata_584 = .rodata:0x00000584; // type:object size:0x30 scope:local data:float +lbl_1_rodata_5B4 = .rodata:0x000005B4; // type:object size:0x18 scope:local data:float +lbl_1_rodata_5CC = .rodata:0x000005CC; // type:object size:0x4 scope:local data:float lbl_1_rodata_5D0 = .rodata:0x000005D0; // type:object size:0x4 scope:local data:float lbl_1_rodata_5D8 = .rodata:0x000005D8; // type:object size:0x8 scope:local data:double lbl_1_rodata_5E0 = .rodata:0x000005E0; // type:object size:0x4 scope:local data:float @@ -354,21 +354,21 @@ lbl_1_data_0 = .data:0x00000000; // type:object size:0xA0 lbl_1_data_A0 = .data:0x000000A0; // type:object size:0x4 data:4byte lbl_1_data_A4 = .data:0x000000A4; // type:object size:0x4 data:4byte lbl_1_data_A8 = .data:0x000000A8; // type:object size:0x4 data:4byte -lbl_1_data_AC = .data:0x000000AC; // type:object size:0x1B data:string -lbl_1_data_C7 = .data:0x000000C7; // type:object size:0x22 data:string -lbl_1_data_E9 = .data:0x000000E9; // type:object size:0x1A data:string -lbl_1_data_103 = .data:0x00000103; // type:object size:0x1A data:string -lbl_1_data_11D = .data:0x0000011D; // type:object size:0xE data:string +lbl_1_data_AC = .data:0x000000AC; // type:object size:0x1B scope:local data:string +lbl_1_data_C7 = .data:0x000000C7; // type:object size:0x22 scope:local data:string +lbl_1_data_E9 = .data:0x000000E9; // type:object size:0x1A scope:local data:string +lbl_1_data_103 = .data:0x00000103; // type:object size:0x1A scope:local data:string +lbl_1_data_11D = .data:0x0000011D; // type:object size:0xE scope:local data:string lbl_1_data_12C = .data:0x0000012C; // type:object size:0x4 data:4byte -lbl_1_data_130 = .data:0x00000130; // type:object size:0x16 data:string -lbl_1_data_146 = .data:0x00000146; // type:object size:0x13 data:string -lbl_1_data_159 = .data:0x00000159; // type:object size:0xE data:string -lbl_1_data_167 = .data:0x00000167; // type:object size:0xE data:string -lbl_1_data_175 = .data:0x00000175; // type:object size:0x12 data:string +lbl_1_data_130 = .data:0x00000130; // type:object size:0x16 scope:local data:string +lbl_1_data_146 = .data:0x00000146; // type:object size:0x13 scope:local data:string +lbl_1_data_159 = .data:0x00000159; // type:object size:0xE scope:local data:string +lbl_1_data_167 = .data:0x00000167; // type:object size:0xE scope:local data:string +lbl_1_data_175 = .data:0x00000175; // type:object size:0x12 scope:local data:string lbl_1_data_188 = .data:0x00000188; // type:object size:0x4 data:float -lbl_1_data_18C = .data:0x0000018C; // type:object size:0x14 data:string +lbl_1_data_18C = .data:0x0000018C; // type:object size:0x14 scope:local data:string jumptable_1_data_1A0 = .data:0x000001A0; // type:object size:0x20 scope:local -lbl_1_data_1C0 = .data:0x000001C0; // type:object size:0x12 data:string +lbl_1_data_1C0 = .data:0x000001C0; // type:object size:0x12 scope:local data:string jumptable_1_data_1D4 = .data:0x000001D4; // type:object size:0x30 scope:local lbl_1_data_204 = .data:0x00000204; // type:object size:0x78 lbl_1_data_27C = .data:0x0000027C; // type:object size:0x90 diff --git a/src/REL/m437Dll/main.c b/src/REL/m437Dll/main.c index efabc5e9..6b57e11a 100755 --- a/src/REL/m437Dll/main.c +++ b/src/REL/m437Dll/main.c @@ -1716,7 +1716,6 @@ void fn_1_6580(s32 arg0, s32 arg1, s32 arg2) float lbl_1_data_188 = -1.0f; -// TODO: https://decomp.me/scratch/dek39 void fn_1_65E0(omObjData *arg0) { Mtx sp60; From 692c9d32ec4e5d80efea36d3d9d6cb5a28d2edb9 Mon Sep 17 00:00:00 2001 From: dbalatoni13 Date: Sun, 10 Nov 2024 19:02:36 +0100 Subject: [PATCH 08/29] Implemented already discovered improvements in m426Dll --- config/GMPE01_00/rels/m426Dll/symbols.txt | 2 +- src/REL/m426Dll/main.c | 40 ++++++++--------------- 2 files changed, 14 insertions(+), 28 deletions(-) diff --git a/config/GMPE01_00/rels/m426Dll/symbols.txt b/config/GMPE01_00/rels/m426Dll/symbols.txt index 76e8528e..e85de3cf 100644 --- a/config/GMPE01_00/rels/m426Dll/symbols.txt +++ b/config/GMPE01_00/rels/m426Dll/symbols.txt @@ -197,7 +197,7 @@ jumptable_1_data_330 = .data:0x00000330; // type:object size:0x1C scope:local jumptable_1_data_34C = .data:0x0000034C; // type:object size:0x1C scope:local lbl_1_bss_0 = .bss:0x00000000; // type:object size:0xC data:float lbl_1_bss_C = .bss:0x0000000C; // type:object size:0xC data:float -lbl_1_bss_18 = .bss:0x00000018; // type:object size:0x1 data:byte +lbl_1_bss_18 = .bss:0x00000018; // type:object size:0x4 data:byte lbl_1_bss_1C = .bss:0x0000001C; // type:object size:0x8 data:4byte lbl_1_bss_24 = .bss:0x00000024; // type:object size:0x4 data:4byte lbl_1_bss_28 = .bss:0x00000028; // type:object size:0x4 data:float diff --git a/src/REL/m426Dll/main.c b/src/REL/m426Dll/main.c index d9864fb5..6f4d3a64 100644 --- a/src/REL/m426Dll/main.c +++ b/src/REL/m426Dll/main.c @@ -10,6 +10,7 @@ #include "game/pad.h" #include "game/sprite.h" #include "game/wipe.h" +#include "string.h" typedef struct UnkM426Struct { /* 0x00 */ s32 unk_00; @@ -676,7 +677,7 @@ void fn_1_117C(omObjData *object) fn_1_16F8(var_r31->unk_04[0]); } -void fn_1_11EC(omObjData *object) // TODO this probably gets inlined +void fn_1_11EC(omObjData *object) { s32 var_r30; UnkM426Struct *var_r29; @@ -778,6 +779,7 @@ void fn_1_125C(omObjData *object) object->func = NULL; } +// TODO https://decomp.me/scratch/1aZdv void fn_1_16F8(omObjData *object) { s32 spA8[3]; @@ -824,7 +826,7 @@ void fn_1_16F8(omObjData *object) } if (var_r31->unk_14) { sp20 = sp1C = 0.0f; - sp10 = var_r21 = 0; + sp10 = 0; fn_1_2F5C(object, &sp20, &sp1C, &sp10); } else { @@ -848,7 +850,7 @@ void fn_1_16F8(omObjData *object) if (!lbl_1_bss_40) { sp20 = sp1C = 0.0f; - sp10 = var_r21 = 0; + sp10 = 0; } if (fabs(sp20) > 8.0) { var_f30 = 0.25f * sp20; @@ -957,7 +959,6 @@ void fn_1_16F8(omObjData *object) else { if (fabs(sp20) > 8.0 || fabs(sp1C) > 8.0) { var_f26 = atan2d(sp20, -sp1C); - var_f26 = var_f26; } else { var_f26 = object->rot.y; @@ -1123,7 +1124,7 @@ void fn_1_16F8(omObjData *object) var_r31->unk_34 = var_r31->unk_34 ^ 1; } } - if (((var_r21 = var_r31->unk_24) == 0 || var_r31->unk_24 == 1 || var_r31->unk_24 == 2) && var_r31->unk_30) { + if ((var_r31->unk_24 == 0 || var_r31->unk_24 == 1 || var_r31->unk_24 == 2) && var_r31->unk_30) { if (var_r31->unk_30) { var_r31->unk_30 = var_r31->unk_30 - 1; } @@ -1136,6 +1137,7 @@ void fn_1_16F8(omObjData *object) } Hu3DModelTPLvlSet(var_r24, 1.0f); } + (void)var_r21; } Vec lbl_1_data_200[2] = { @@ -1202,22 +1204,10 @@ void fn_1_2AC8(omObjData *object) void fn_1_2ADC(void) { - omObjData *var_r31; s32 var_r30; - s32 var_r29; - UnkM426Struct *var_r27; - omObjData *var_r28; for (var_r30 = 0; var_r30 < 2; var_r30++) { - var_r31 = lbl_1_bss_8C[var_r30]; - var_r27 = var_r31->data; - for (var_r29 = 0; var_r29 < 2; var_r29++) { - var_r28 = var_r27->unk_04[var_r29]; - var_r28->data = 0; - var_r28->func = 0; - } - var_r31->data = NULL; - var_r31->func = NULL; + fn_1_11EC(lbl_1_bss_8C[var_r30]); } } @@ -1741,8 +1731,7 @@ void fn_1_3EFC(omObjData *object) void fn_1_45FC(omObjData *object) { fn_1_8E10(lbl_1_bss_24); - object->data = NULL; - object->func = NULL; + fn_1_2AC8(object); } void fn_1_4644(void) @@ -2133,20 +2122,17 @@ void fn_1_5134(omObjData *object) void fn_1_5B34(omObjData *object) { - object->data = NULL; - object->func = NULL; + fn_1_2AC8(object); } void fn_1_5B48(void) { - omObjData *var_r31; - - var_r31 = lbl_1_bss_74; - fn_1_5B34(var_r31); + fn_1_5B34(lbl_1_bss_74); lbl_1_bss_74 = NULL; } -void fn_1_5B88(s32 arg0) // probably gets inlined +// unused +void fn_1_5B88(s32 arg0) { UnkM426Struct4 *var_r31; s32 var_r28; From e2db9694efebc2b0f87871be3357b9daffb408c5 Mon Sep 17 00:00:00 2001 From: dbalatoni13 Date: Mon, 11 Nov 2024 00:24:45 +0100 Subject: [PATCH 09/29] Matched PPCArch.c, ai.c, db.c and got 99% on vi.c --- config/GMPE01_00/symbols.txt | 20 +- configure.py | 8 +- include/asm_types.h | 84 ++++ include/dolphin/ai.h | 6 + src/dolphin/PPCArch.c | 565 +++++++++++++++++++++ src/dolphin/ai.c | 362 ++++++++++++++ src/dolphin/db.c | 43 ++ src/dolphin/vi.c | 943 +++++++++++++++++++++++++++++++++++ 8 files changed, 2017 insertions(+), 14 deletions(-) create mode 100644 include/asm_types.h create mode 100644 src/dolphin/PPCArch.c create mode 100644 src/dolphin/ai.c create mode 100644 src/dolphin/db.c create mode 100644 src/dolphin/vi.c diff --git a/config/GMPE01_00/symbols.txt b/config/GMPE01_00/symbols.txt index 58e4e1b5..9607a86b 100644 --- a/config/GMPE01_00/symbols.txt +++ b/config/GMPE01_00/symbols.txt @@ -2192,8 +2192,8 @@ __init_user = .text:0x800BB280; // type:function size:0x20 scope:global __init_cpp = .text:0x800BB2A0; // type:function size:0x54 scope:local _ExitProcess = .text:0x800BB2F4; // type:function size:0x20 scope:global DBInit = .text:0x800BB314; // type:function size:0x28 scope:global -__DBExceptionDestinationAux = .text:0x800BB33C; // type:function size:0x48 scope:local -__DBExceptionDestination = .text:0x800BB384; // type:function size:0x10 scope:global +__DBExceptionDestinationAux = .text:0x800BB33C; // type:function size:0x48 scope:global +__DBExceptionDestination = .text:0x800BB384; // type:function size:0x10 scope:local __DBIsExceptionMarked = .text:0x800BB394; // type:function size:0x1C scope:global DBPrintf = .text:0x800BB3B0; // type:function size:0x50 scope:global PSMTXIdentity = .text:0x800BB400; // type:function size:0x2C @@ -2321,7 +2321,7 @@ __fstLoad = .text:0x800C0A04; // type:function size:0x168 scope:global __VIRetraceHandler = .text:0x800C0B6C; // type:function size:0x228 scope:local VISetPreRetraceCallback = .text:0x800C0D94; // type:function size:0x44 VISetPostRetraceCallback = .text:0x800C0DD8; // type:function size:0x44 -getTiming = .text:0x800C0E1C; // type:function size:0x90 +getTiming = .text:0x800C0E1C; // type:function size:0x90 scope:local __VIInit = .text:0x800C0EAC; // type:function size:0x1F8 VIInit = .text:0x800C10A4; // type:function size:0x478 VIWaitForRetrace = .text:0x800C151C; // type:function size:0x54 @@ -4344,7 +4344,7 @@ ResetFunctionInfo = .data:0x8013C2E0; // type:object size:0x10 scope:local lbl_8013C2F0 = .data:0x8013C2F0; // type:object size:0x78 YearDays = .data:0x8013C368; // type:object size:0x30 scope:local LeapYearDays = .data:0x8013C398; // type:object size:0x30 scope:local -lbl_8013C3C8 = .data:0x8013C3C8; // type:object size:0x18 data:string +lbl_8013C3C8 = .data:0x8013C3C8; // type:object size:0x18 scope:local data:string lbl_8013C3E0 = .data:0x8013C3E0; // type:object size:0xC8 data:string lbl_8013C4A8 = .data:0x8013C4A8; // type:object size:0x38 lbl_8013C4E0 = .data:0x8013C4E0; // type:object size:0x34 data:string @@ -4359,12 +4359,12 @@ ErrorTable = .data:0x8013C660; // type:object size:0x48 scope:local data:4byte timing = .data:0x8013C718; // type:object size:0x130 scope:local taps = .data:0x8013C848; // type:object size:0x32 scope:local jumptable_8013C87C = .data:0x8013C87C; // type:object size:0x58 scope:local -lbl_8013C8D4 = .data:0x8013C8D4; // type:object size:0x29 data:string -lbl_8013C900 = .data:0x8013C900; // type:object size:0x29 data:string -lbl_8013C92C = .data:0x8013C92C; // type:object size:0x29 data:string -lbl_8013C958 = .data:0x8013C958; // type:object size:0x29 data:string -lbl_8013C984 = .data:0x8013C984; // type:object size:0x29 data:string -lbl_8013C9B0 = .data:0x8013C9B0; // type:object size:0x29 data:string +lbl_8013C8D4 = .data:0x8013C8D4; // type:object size:0x29 scope:local data:string +lbl_8013C900 = .data:0x8013C900; // type:object size:0x29 scope:local data:string +lbl_8013C92C = .data:0x8013C92C; // type:object size:0x29 scope:local data:string +lbl_8013C958 = .data:0x8013C958; // type:object size:0x29 scope:local data:string +lbl_8013C984 = .data:0x8013C984; // type:object size:0x29 scope:local data:string +lbl_8013C9B0 = .data:0x8013C9B0; // type:object size:0x29 scope:local data:string DEMOFontBitmap = .data:0x8013C9E0; // type:object size:0xC00 align:32 lbl_8013D5E0 = .data:0x8013D5E0; // type:object size:0xC data:string lbl_8013D5EC = .data:0x8013D5EC; // type:object size:0x28 diff --git a/configure.py b/configure.py index b010ec9b..fa174004 100644 --- a/configure.py +++ b/configure.py @@ -303,7 +303,7 @@ config.rel_empty_file = "REL/empty.c" def DolphinLib(lib_name, objects): return { "lib": lib_name, - "mw_version": "GC/2.6", + "mw_version": "GC/1.2.5n", "cflags": cflags_base, "host": False, "objects": objects, @@ -442,7 +442,7 @@ config.libs = [ DolphinLib( "base", [ - Object(NonMatching, "dolphin/PPCArch.c"), + Object(Matching, "dolphin/PPCArch.c"), ], ), DolphinLib( @@ -477,7 +477,7 @@ config.libs = [ DolphinLib( "db", [ - Object(NonMatching, "dolphin/db.c"), + Object(Matching, "dolphin/db.c"), ], ), DolphinLib( @@ -527,7 +527,7 @@ config.libs = [ DolphinLib( "ai", [ - Object(NonMatching, "dolphin/ai.c"), + Object(Matching, "dolphin/ai.c"), ], ), DolphinLib( diff --git a/include/asm_types.h b/include/asm_types.h new file mode 100644 index 00000000..02d75dc5 --- /dev/null +++ b/include/asm_types.h @@ -0,0 +1,84 @@ +#ifndef _ASM_TYPES +#define _ASM_TYPES + +// Special Purpose Registers (SPRs) +#define XER 1 +#define LR 8 +#define CTR 9 +#define DSISR 18 +#define DAR 19 +#define DEC 22 +#define SDR1 25 +#define SRR0 26 +#define SRR1 27 +#define SPRG0 272 +#define SPRG1 273 +#define SPRG2 274 +#define SPRG3 275 +#define EAR 282 +#define PVR 287 +#define IBAT0U 528 +#define IBAT0L 529 +#define IBAT1U 530 +#define IBAT1L 531 +#define IBAT2U 532 +#define IBAT2L 533 +#define IBAT3U 534 +#define IBAT3L 535 +#define DBAT0U 536 +#define DBAT0L 537 +#define DBAT1U 538 +#define DBAT1L 539 +#define DBAT2U 540 +#define DBAT2L 541 +#define DBAT3U 542 +#define DBAT3L 543 +#define GQR0 912 +#define GQR1 913 +#define GQR2 914 +#define GQR3 915 +#define GQR4 916 +#define GQR5 917 +#define GQR6 918 +#define GQR7 919 +#define HID2 920 +#define WPAR 921 +#define DMA_U 922 +#define DMA_L 923 +#define UMMCR0 936 +#define UPMC1 937 +#define UPMC2 938 +#define USIA 939 +#define UMMCR1 940 +#define UPMC3 941 +#define UPMC4 942 +#define USDA 943 +#define MMCR0 952 +#define PMC1 953 +#define PMC2 954 +#define SIA 955 +#define MMCR1 956 +#define PMC3 957 +#define PMC4 958 +#define SDA 959 +#define HID0 1008 +#define HID1 1009 +#define IABR 1010 +#define DABR 1013 +#define L2CR 1017 +#define ICTC 1019 +#define THRM1 1020 +#define THRM2 1021 +#define THRM3 1022 + +// Condition Registers (CRs) +#define cr0 0 +#define cr1 1 +#define cr2 2 +#define cr3 3 +#define cr4 4 +#define cr5 5 +#define cr6 6 +#define cr7 7 + +#endif // _ASM_TYPES diff --git a/include/dolphin/ai.h b/include/dolphin/ai.h index e998e831..bba3a596 100644 --- a/include/dolphin/ai.h +++ b/include/dolphin/ai.h @@ -9,6 +9,12 @@ extern "C" { typedef void (*AISCallback)(u32 count); typedef void (*AIDCallback)(); +#define AI_STREAM_START 1 +#define AI_STREAM_STOP 0 + +#define AI_SAMPLERATE_32KHZ 0 +#define AI_SAMPLERATE_48KHZ 1 + AIDCallback AIRegisterDMACallback(AIDCallback callback); void AIInitDMA(u32 start_addr, u32 length); BOOL AIGetDMAEnableFlag(); diff --git a/src/dolphin/PPCArch.c b/src/dolphin/PPCArch.c new file mode 100644 index 00000000..8004ab3d --- /dev/null +++ b/src/dolphin/PPCArch.c @@ -0,0 +1,565 @@ +#include "types.h" +#include "asm_types.h" + +/* clang-format off */ + +union FpscrUnion +{ + f64 f; + struct + { + u32 fpscr_pad; + u32 fpscr; + } u; +}; + +#define HID0_SPD 0x00000200 // Speculative cache access enable (0 enable) + +void PPCMthid0 ( u32 newHID0 ); + +/* + * --INFO-- + * Address: 8036F7D4 + * Size: 000008 + */ +asm u32 PPCMfmsr (void) +{ + nofralloc + mfmsr r3 + blr +} + +/* + * --INFO-- + * Address: 8036F7DC + * Size: 000008 + */ +asm void PPCMtmsr (register u32 newMSR) +{ + nofralloc + mtmsr newMSR + blr +} + +/* + * --INFO-- + * Address: ........ + * Size: 00000C + */ +void PPCOrMsr(void) +{ + // UNUSED FUNCTION +} + +/* + * --INFO-- + * Address: ........ + * Size: 00000C + */ +void PPCAndMsr(void) +{ + // UNUSED FUNCTION +} + +/* + * --INFO-- + * Address: ........ + * Size: 00000C + */ +void PPCAndCMsr(void) +{ + // UNUSED FUNCTION +} + +/* + * --INFO-- + * Address: 8036F7E4 + * Size: 000008 + */ +asm u32 PPCMfhid0 (void) +{ + nofralloc + mfspr r3, HID0 + blr +} + +/* + * --INFO-- + * Address: 8036F7EC + * Size: 000008 + */ +asm void PPCMthid0 (register u32 newHID0) +{ + nofralloc + mtspr HID0, newHID0 + blr +} + +/* + * --INFO-- + * Address: ........ + * Size: 000008 + */ +void PPCMfhid1(void) +{ + // UNUSED FUNCTION +} + +/* + * --INFO-- + * Address: 8036F7F4 + * Size: 000008 + */ +asm u32 PPCMfl2cr (void) +{ + nofralloc + mfspr r3, L2CR + blr +} + +/* + * --INFO-- + * Address: 8036F7FC + * Size: 000008 + */ +asm void PPCMtl2cr (register u32 newL2cr) +{ + nofralloc + mtspr L2CR, newL2cr + blr +} + +/* + * --INFO-- + * Address: 8036F804 + * Size: 000008 + */ +__declspec ( weak ) asm void PPCMtdec ( register u32 newDec ) +{ + nofralloc + mtdec newDec + blr +} + +/* + * --INFO-- + * Address: ........ + * Size: 000008 + */ +void PPCMfdec(void) +{ + // UNUSED FUNCTION +} + +/* + * --INFO-- + * Address: 8036F80C + * Size: 000008 + */ +asm void PPCSync (void) +{ + nofralloc + sc + blr +} + +/* + * --INFO-- + * Address: ........ + * Size: 000034 + */ +asm void PPCEieio(void) { + nofralloc + mfmsr r5 + rlwinm r6, r5, 0, 0x11, 0xf + mtmsr r6 + mfspr r3, hid0 + ori r4, r3, 8 + mtspr hid0, r4 + isync + eieio + isync + + mtspr hid0, r3 + mtmsr r5 + isync + + blr +} + +/* + * --INFO-- + * Address: 8036F814 + * Size: 000014 + */ +__declspec ( weak ) asm void PPCHalt (void) //spins infinitely +{ + nofralloc + + sync + +_spin: + nop + li r3, 0 + nop + b _spin + + // NEVER REACHED +} + +/* + * --INFO-- + * Address: ........ + * Size: 000008 + */ +asm void PPCMfmmcr0(void) +{ + nofralloc + mfspr r3, MMCR0 + blr +} + +/* + * --INFO-- + * Address: ........ + * Size: 000008 + * UNUSED + */ +asm void PPCMtmmcr0 (register u32 newMmcr0) +{ + nofralloc + mtspr MMCR0, newMmcr0 + blr +} + +/* + * --INFO-- + * Address: ........ + * Size: 000008 + */ +asm void PPCMfmmcr1(void) +{ + nofralloc + mfspr r3, MMCR1 + blr} + +/* + * --INFO-- + * Address: ........ + * Size: 000008 + * UNUSED + */ +asm void PPCMtmmcr1 (register u32 newMmcr1) +{ + nofralloc + mtspr MMCR1, newMmcr1 + blr +} + +/* + * --INFO-- + * Address: ........ + * Size: 000008 + */ +asm void PPCMfpmc1(void) +{ + nofralloc + mfspr r3, PMC1 + blr +} + +/* + * --INFO-- + * Address: ........ + * Size: 000008 + * UNUSED + */ +asm void PPCMtpmc1 (register u32 newPmc1) +{ + nofralloc + mtspr PMC1, newPmc1 + blr +} + +/* + * --INFO-- + * Address: ........ + * Size: 000008 + */ +asm void PPCMfpmc2(void) +{ + nofralloc + mfspr r3, PMC2 + blr +} + +/* + * --INFO-- + * Address: ........ + * Size: 000008 + * UNUSED + */ +asm void PPCMtpmc2 (register u32 newPmc2) +{ + nofralloc + mtspr PMC2, newPmc2 + blr +} + +/* + * --INFO-- + * Address: ........ + * Size: 000008 + */ +asm void PPCMfpmc3(void) +{ + nofralloc + mfspr r3, PMC2 + blr} + +/* + * --INFO-- + * Address: ........ + * Size: 000008 + * UNUSED + */ +asm void PPCMtpmc3 (register u32 newPmc3) +{ + nofralloc + mtspr PMC3, newPmc3 + blr +} + +/* + * --INFO-- + * Address: ........ + * Size: 000008 + */ +asm void PPCMfpmc4(void) +{ + nofralloc + mfspr r3, PMC4 + blr +} + +/* + * --INFO-- + * Address: ........ + * Size: 000008 + * UNUSED + */ +asm void PPCMtpmc4 (register u32 newPmc4) +{ + nofralloc + mtspr PMC4, newPmc4 + blr +} + +/* + * --INFO-- + * Address: ........ + * Size: 000008 + */ +asm void PPCMfsia(void) +{ + nofralloc + mfspr r3, SIA + blr} + +/* + * --INFO-- + * Address: ........ + * Size: 000008 + */ +asm void PPCMtsia(register u32 newSia) +{ + nofralloc + mtspr SIA, newSia + blr +} + +/* + * --INFO-- + * Address: 8036F828 + * Size: 000020 + */ +u32 PPCMffpscr(void) +{ + union FpscrUnion m; + + + asm + { + mffs fp31 + stfd fp31, m.f; + } + + return m.u.fpscr; +} + +/* + * --INFO-- + * Address: 8036F848 + * Size: 000028 + */ +void PPCMtfpscr(register u32 newFPSCR) +{ + union FpscrUnion m; + + asm + { + li r4, 0 + stw r4, m.u.fpscr_pad; + stw newFPSCR, m.u.fpscr + lfd fp31, m.f + mtfsf 0xff, fp31 + } +} + +/* + * --INFO-- + * Address: 8036F870 + * Size: 000008 + */ +asm u32 PPCMfhid2 ( void ) +{ + nofralloc + mfspr r3, HID2 + blr +} + +/* + * --INFO-- + * Address: 8036F878 + * Size: 000008 + */ +asm void PPCMthid2 ( register u32 newhid2 ) +{ + nofralloc + mtspr HID2, newhid2 + blr +} + +/* + * --INFO-- + * Address: 8036F880 + * Size: 00000C + */ +asm u32 PPCMfwpar(void) +{ + nofralloc + sync + mfspr r3, WPAR + blr +} + +/* + * --INFO-- + * Address: 8036F88C + * Size: 000008 + */ +asm void PPCMtwpar ( register u32 newwpar ) +{ + nofralloc + mtspr WPAR, newwpar + blr +} + +/* + * --INFO-- + * Address: ........ + * Size: 000008 + */ +asm void PPCMfdmaU(void) +{ + nofralloc + mfspr r3, DMA_U + blr +} + +/* + * --INFO-- + * Address: ........ + * Size: 000008 + */ +asm void PPCMfdmaL(void) +{ + nofralloc + mfspr r3, DMA_L + blr +} + +/* + * --INFO-- + * Address: ........ + * Size: 000008 + */ +void PPCMtdmaU(void) +{ + // UNUSED FUNCTION +} + +/* + * --INFO-- + * Address: ........ + * Size: 000008 + */ +void PPCMtdmaL(void) +{ + // UNUSED FUNCTION +} + +/* + * --INFO-- + * Address: ........ + * Size: 000008 + */ +void PPCMfpvr(void) +{ + // UNUSED FUNCTION +} + +/* + * --INFO-- + * Address: ........ + * Size: 000028 + */ +void PPCEnableSpeculation(void) +{ + // UNUSED FUNCTION +} + +/* + * --INFO-- + * Address: 8036F894 + * Size: 000028 + */ +void PPCDisableSpeculation (void) +{ + PPCMthid0(PPCMfhid0() | HID0_SPD); +} + +/* + * --INFO-- + * Address: 8036F8BC + * Size: 000008 + */ +asm void PPCSetFpIEEEMode(void) +{ + nofralloc + mtfsb0 4*7+1 + blr +} +/* + * --INFO-- + * Address: 8036F8C4 + * Size: 000008 + */ +asm void PPCSetFpNonIEEEMode (void) +{ + nofralloc + mtfsb1 4*7+1 + blr +} + +/* clang-format on */ diff --git a/src/dolphin/ai.c b/src/dolphin/ai.c new file mode 100644 index 00000000..e9fa77bd --- /dev/null +++ b/src/dolphin/ai.c @@ -0,0 +1,362 @@ +#include "dolphin/ai.h" +#include "dolphin/hw_regs.h" +#include "dolphin/os.h" + +const char *__AIVersion = "<< Dolphin SDK - AI\trelease build: Sep 5 2002 05:34:25 (0x2301) >>"; + +static AISCallback __AIS_Callback = NULL; +static AIDCallback __AID_Callback = NULL; +static u8 *__CallbackStack; +static u8 *__OldStack; +static volatile s32 __AI_init_flag = FALSE; +static volatile s32 __AID_Active = FALSE; + +static OSTime bound_32KHz; +static OSTime bound_48KHz; +static OSTime min_wait; +static OSTime max_wait; +static OSTime buffer; + +void __AISHandler(s16 interrupt, OSContext *context); +void __AIDHandler(s16 interrupt, OSContext *context); +void __AICallbackStackSwitch(register AIDCallback cb); +void __AI_SRC_INIT(void); + +AIDCallback AIRegisterDMACallback(AIDCallback callback) +{ + s32 oldInts; + AIDCallback ret; + + ret = __AID_Callback; + oldInts = OSDisableInterrupts(); + __AID_Callback = callback; + OSRestoreInterrupts(oldInts); + return ret; +} + +void AIInitDMA(u32 addr, u32 length) +{ + s32 oldInts; + oldInts = OSDisableInterrupts(); + __DSPRegs[24] = (u16)((__DSPRegs[24] & ~0x3FF) | (addr >> 16)); + __DSPRegs[25] = (u16)((__DSPRegs[25] & ~0xFFE0) | (0xffff & addr)); + __DSPRegs[27] = (u16)((__DSPRegs[27] & ~0x7FFF) | (u16)((length >> 5) & 0xFFFF)); + OSRestoreInterrupts(oldInts); +} + +void AIStartDMA() +{ + __DSPRegs[27] |= 0x8000; +} + +void AIStopDMA(void) +{ + __DSPRegs[27] &= ~0x8000; +} + +u32 AIGetDMAStartAddr(void) +{ + return (u32)((__DSPRegs[24] & 0x03ff) << 16) | (__DSPRegs[25] & 0xffe0); +} + +AISCallback AIRegisterStreamCallback(AISCallback callback) +{ + AISCallback ret; + s32 oldInts; + + ret = __AIS_Callback; + oldInts = OSDisableInterrupts(); + __AIS_Callback = callback; + OSRestoreInterrupts(oldInts); + return ret; +} + +void AIResetStreamSampleCount(void) +{ + __AIRegs[0] = (__AIRegs[0] & ~0x20) | 0x20; +} + +void AISetStreamTrigger(u32 trigger) +{ + __AIRegs[3] = trigger; +} + +void AISetStreamPlayState(u32 state) +{ + s32 oldInts; + u8 volRight; + u8 volLeft; + + if (state == AIGetStreamPlayState()) { + return; + } + if ((AIGetStreamSampleRate() == 0U) && (state == 1)) { + volRight = AIGetStreamVolRight(); + volLeft = AIGetStreamVolLeft(); + AISetStreamVolRight(0); + AISetStreamVolLeft(0); + oldInts = OSDisableInterrupts(); + __AI_SRC_INIT(); + __AIRegs[0] = (__AIRegs[0] & ~0x20) | 0x20; + __AIRegs[0] = (__AIRegs[0] & ~1) | 1; + OSRestoreInterrupts(oldInts); + AISetStreamVolLeft(volRight); + AISetStreamVolRight(volLeft); + } + else { + __AIRegs[0] = (__AIRegs[0] & ~1) | state; + } +} + +u32 AIGetStreamPlayState() +{ + return __AIRegs[0] & 1; +} + +void AISetDSPSampleRate(u32 rate) +{ + u32 state; + s32 oldInts; + u8 left; + u8 right; + u32 sampleRate; + + if (rate == AIGetDSPSampleRate()) { + return; + } + + __AIRegs[0] &= ~0x40; + if (rate == 0) { + left = AIGetStreamVolLeft(); + right = AIGetStreamVolRight(); + state = AIGetStreamPlayState(); + sampleRate = AIGetStreamSampleRate(); + AISetStreamVolLeft(0); + AISetStreamVolRight(0); + oldInts = OSDisableInterrupts(); + __AI_SRC_INIT(); + __AIRegs[0] = (__AIRegs[0] & ~0x20) | 0x20; + __AIRegs[0] = (__AIRegs[0] & ~2) | (sampleRate * 2); + __AIRegs[0] = (__AIRegs[0] & ~1) | state; + __AIRegs[0] |= 0x40; + OSRestoreInterrupts(oldInts); + AISetStreamVolLeft(left); + AISetStreamVolRight(right); + } +} + +u32 AIGetDSPSampleRate() +{ + return ((__AIRegs[0] >> 6) & 1) ^ 1; +} + +void __AI_set_stream_sample_rate(u32 rate) +{ + s32 oldInts; + s32 state; + u8 left; + u8 right; + s32 temp_r26; + + if (rate == AIGetStreamSampleRate()) { + return; + } + state = AIGetStreamPlayState(); + left = AIGetStreamVolLeft(); + right = AIGetStreamVolRight(); + AISetStreamVolRight(0); + AISetStreamVolLeft(0); + temp_r26 = __AIRegs[0] & 0x40; + __AIRegs[0] &= ~0x40; + oldInts = OSDisableInterrupts(); + __AI_SRC_INIT(); + __AIRegs[0] |= temp_r26; + __AIRegs[0] = (__AIRegs[0] & ~0x20) | 0x20; + __AIRegs[0] = (__AIRegs[0] & ~2) | (rate * 2); + OSRestoreInterrupts(oldInts); + AISetStreamPlayState(state); + AISetStreamVolLeft(left); + AISetStreamVolRight(right); +} + +u32 AIGetStreamSampleRate() +{ + return (__AIRegs[0] >> 1) & 1; +} + +void AISetStreamVolLeft(u8 volume) +{ + __AIRegs[1] = (__AIRegs[1] & ~0xFF) | (volume & 0xFF); +} + +u8 AIGetStreamVolLeft() +{ + return __AIRegs[1]; +} + +void AISetStreamVolRight(u8 volume) +{ + __AIRegs[1] = (__AIRegs[1] & ~0xFF00) | ((volume & 0xFF) << 8); +} + +u8 AIGetStreamVolRight() +{ + return __AIRegs[1] >> 8; +} + +void AIInit(u8 *stack) +{ + if (__AI_init_flag == TRUE) { + return; + } + + bound_32KHz = OSNanosecondsToTicks(31524); + bound_48KHz = OSNanosecondsToTicks(42024); + min_wait = OSNanosecondsToTicks(42000); + max_wait = OSNanosecondsToTicks(63000); + buffer = OSNanosecondsToTicks(3000); + + AISetStreamVolRight(0); + AISetStreamVolLeft(0); + AISetStreamTrigger(0); + AIResetStreamSampleCount(); + __AI_set_stream_sample_rate(1); + AISetDSPSampleRate(0); + __AIS_Callback = 0; + __AID_Callback = 0; + __CallbackStack = stack; + __OSSetInterruptHandler(5, __AIDHandler); + __OSUnmaskInterrupts(0x04000000); + __OSSetInterruptHandler(8, __AISHandler); + __OSUnmaskInterrupts(0x800000); + __AI_init_flag = TRUE; +} + +void __AISHandler(s16 interrupt, OSContext *context) +{ + OSContext tmpContext; + __AIRegs[0] |= 8; + OSClearContext(&tmpContext); + OSSetCurrentContext(&tmpContext); + if (__AIS_Callback != NULL) { + __AIS_Callback(__AIRegs[2]); + } + OSClearContext(&tmpContext); + OSSetCurrentContext(context); +} + +void __AIDHandler(s16 interrupt, OSContext *context) +{ + OSContext tempContext; + u16 temp = __DSPRegs[5]; + __DSPRegs[5] = (temp & ~0xA0) | 8; + OSClearContext(&tempContext); + OSSetCurrentContext(&tempContext); + if (__AID_Callback) { + if (__CallbackStack) { + __AICallbackStackSwitch(__AID_Callback); + } + else { + __AID_Callback(); + } + } + + OSClearContext(&tempContext); + OSSetCurrentContext(context); +} + +// clang-format off +asm void __AICallbackStackSwitch(register AIDCallback cb) { + // Allocate stack frame + fralloc + + // Store current stack + lis r5, __OldStack@ha + addi r5, r5, __OldStack@l + stw r1, 0(r5) + + // Load stack for callback + lis r5, __CallbackStack@ha + addi r5, r5, __CallbackStack@l + lwz r1,0(r5) + + // Move stack down 8 bytes + subi r1, r1, 8 + // Call callback + mtlr cb + blrl + + // Restore old stack + lis r5, __OldStack @ha + addi r5, r5, __OldStack@l + lwz r1,0(r5) + + // Free stack frame + frfree + + blr +} +// clang-format on + +void __AI_SRC_INIT(void) +{ + OSTime rise32 = 0; + OSTime rise48 = 0; + OSTime diff = 0; + OSTime unused1 = 0; + OSTime temp = 0; + u32 temp0 = 0; + u32 temp1 = 0; + u32 done = 0; + u32 walking = 0; + u32 unused2 = 0; + u32 initCnt = 0; + + walking = 0; + initCnt = 0; + temp = 0; + + while (!done) { + __AIRegs[0] = (__AIRegs[0] & ~0x20) | 0x20; + __AIRegs[0] &= ~2; + __AIRegs[0] = (__AIRegs[0] & ~1) | 1; + + temp0 = __AIRegs[2]; + + while (temp0 == __AIRegs[2]) + ; + rise32 = OSGetTime(); + + __AIRegs[0] = (__AIRegs[0] & ~2) | 2; + __AIRegs[0] = (__AIRegs[0] & ~1) | 1; + + temp1 = __AIRegs[2]; + while (temp1 == __AIRegs[2]) + ; + + rise48 = OSGetTime(); + + diff = rise48 - rise32; + __AIRegs[0] &= ~2; + __AIRegs[0] &= ~1; + + if (diff < (bound_32KHz - buffer)) { + temp = min_wait; + done = 1; + ++initCnt; + } + else if (diff >= (bound_32KHz + buffer) && diff < (bound_48KHz - buffer)) { + temp = max_wait; + done = 1; + ++initCnt; + } + else { + done = 0; + walking = 1; + ++initCnt; + } + } + + while ((rise48 + temp) > OSGetTime()) + ; +} diff --git a/src/dolphin/db.c b/src/dolphin/db.c new file mode 100644 index 00000000..bcf8534d --- /dev/null +++ b/src/dolphin/db.c @@ -0,0 +1,43 @@ +#include +#include + +DBInterface* __DBInterface = NULL; +int DBVerbose; + +extern void __DBExceptionStart(); +extern void __DBExceptionEnd(); +extern void __DBExceptionSetNumber(); + +void DBInit(void) { + __DBInterface = (DBInterface*)OSPhysicalToCached(OS_DBINTERFACE_ADDR); + __DBInterface->ExceptionDestination = (void (*)())OSCachedToPhysical(__DBExceptionDestination); + DBVerbose = TRUE; +} + +void __DBExceptionDestinationAux(void) { + u32* contextAddr = (void*)0x00C0; + OSContext* context = (OSContext*)OSPhysicalToCached(*contextAddr); + + OSReport("DBExceptionDestination\n"); + OSDumpContext(context); + PPCHalt(); +} + +/* clang-format off */ +asm void __DBExceptionDestination(void) { + nofralloc + mfmsr r3 + ori r3, r3, 0x10|0x20 + mtmsr r3 + + b __DBExceptionDestinationAux +} +/* clang-format on */ + +BOOL __DBIsExceptionMarked(__OSException exception) { + u32 mask = 1 << exception; + + return (BOOL)(__DBInterface->exceptionMask & mask); +} + +void DBPrintf(char* format, ...) {} diff --git a/src/dolphin/vi.c b/src/dolphin/vi.c new file mode 100644 index 00000000..3cdedba0 --- /dev/null +++ b/src/dolphin/vi.c @@ -0,0 +1,943 @@ +#include "dolphin/vi.h" +#include "dolphin/OSRtcPriv.h" +#include "dolphin/hw_regs.h" +#include "dolphin/os.h" + +// Useful macros. +#define CLAMP(x, l, h) (((x) > (h)) ? (h) : (((x) < (l)) ? (l) : (x))) +#define MIN(a, b) (((a) < (b)) ? (a) : (b)) +#define MAX(a, b) (((a) > (b)) ? (a) : (b)) +#define IS_LOWER_16MB(x) ((x) < 16 * 1024 * 1024) +#define ToPhysical(fb) (u32)(((u32)(fb)) & 0x3FFFFFFF) +#define ONES(x) ((1 << (x)) - 1) +#define VI_BITMASK(index) (1ull << (63 - (index))) + +static BOOL IsInitialized; +static vu32 retraceCount; +static u32 flushFlag; +static OSThreadQueue retraceQueue; +static VIRetraceCallback PreCB; +static VIRetraceCallback PostCB; +static u32 encoderType; + +static s16 displayOffsetH; +static s16 displayOffsetV; + +static vu32 changeMode; +static vu64 changed; + +static vu32 shdwChangeMode; +static vu64 shdwChanged; + +static VITimingInfo *CurrTiming; +static u32 CurrTvMode; + +static u32 NextBufAddr; +static u32 CurrBufAddr; + +static u32 FBSet; + +static vu16 regs[60]; +static vu16 shdwRegs[60]; + +static VIPositionInfo HorVer; +// clang-format off +static VITimingInfo timing[8] = { + { // NTSC INT + 6, 240, 24, 25, 3, 2, 12, 13, 12, 13, 520, 519, 520, 519, 525, 429, 64, 71, 105, 162, 373, 122, 412, + }, + { // NTSC DS + 6, 240, 24, 24, 4, 4, 12, 12, 12, 12, 520, 520, 520, 520, 526, 429, 64, 71, 105, 162, 373, 122, 412, + }, + { // PAL INT + 5, 287, 35, 36, 1, 0, 13, 12, 11, 10, 619, 618, 617, 620, 625, 432, 64, 75, 106, 172, 380, 133, 420, + }, + { // PAL DS + 5, 287, 33, 33, 2, 2, 13, 11, 13, 11, 619, 621, 619, 621, 624, 432, 64, 75, 106, 172, 380, 133, 420, + }, + { // MPAL INT + 6, 240, 24, 25, 3, 2, 16, 15, 14, 13, 518, 517, 516, 519, 525, 429, 64, 78, 112, 162, 373, 122, 412, + }, + { // MPAL DS + 6, 240, 24, 24, 4, 4, 16, 14, 16, 14, 518, 520, 518, 520, 526, 429, 64, 78, 112, 162, 373, 122, 412, + }, + { // NTSC PRO + 12, 480, 48, 48, 6, 6, 24, 24, 24, 24, 1038, 1038, 1038, 1038, 1050, 429, 64, 71, 105, 162, 373, 122, 412, + }, + { // NTSC 3D + 12, 480, 44, 44, 10, 10, 24, 24, 24, 24, 1038, 1038, 1038, 1038, 1050, 429, 64, 71, 105, 168, 379, 122, 412, + }, +}; +// clang-format on + +static u16 taps[25] = { 496, 476, 430, 372, 297, 219, 142, 70, 12, 226, 203, 192, 196, 207, 222, 236, 252, 8, 15, 19, 19, 15, 12, 8, 1 }; + +// forward declaring statics +static u32 getCurrentFieldEvenOdd(); + +static void getEncoderType(void) +{ + // UNUSED FUNCTION +} + +static int cntlzd(u64 bit) +{ + u32 hi, lo; + int value; + + hi = (u32)(bit >> 32); + lo = (u32)(bit & 0xFFFFFFFF); + value = __cntlzw(hi); + + if (value < 32) { + return value; + } + + return (32 + __cntlzw(lo)); +} + +static BOOL VISetRegs(void) +{ + int regIndex; + + if (!((shdwChangeMode == 1) && (getCurrentFieldEvenOdd() == 0))) { + while (shdwChanged) { + regIndex = cntlzd(shdwChanged); + __VIRegs[regIndex] = shdwRegs[regIndex]; + shdwChanged &= ~(VI_BITMASK(regIndex)); + } + + shdwChangeMode = 0; + CurrTiming = HorVer.timing; + CurrTvMode = HorVer.tv; + + return TRUE; + } + return FALSE; +} + +static void __VIRetraceHandler(__OSInterrupt interrupt, OSContext *context) +{ + OSContext exceptionContext; + u16 viReg; + u32 inter = 0; + + viReg = __VIRegs[VI_DISP_INT_0]; + if (viReg & 0x8000) { + __VIRegs[VI_DISP_INT_0] = (u16)(viReg & ~0x8000); + inter |= 1; + } + + viReg = __VIRegs[VI_DISP_INT_1]; + if (viReg & 0x8000) { + __VIRegs[VI_DISP_INT_1] = (u16)(viReg & ~0x8000); + inter |= 2; + } + + viReg = __VIRegs[VI_DISP_INT_2]; + if (viReg & 0x8000) { + __VIRegs[VI_DISP_INT_2] = (u16)(viReg & ~0x8000); + inter |= 4; + } + + viReg = __VIRegs[VI_DISP_INT_3]; + if (viReg & 0x8000) { + __VIRegs[VI_DISP_INT_3] = (u16)(viReg & ~0x8000); + inter |= 8; + } + + if ((inter & 4) || (inter & 8)) { + OSSetCurrentContext(context); + return; + } + + retraceCount++; + + OSClearContext(&exceptionContext); + OSSetCurrentContext(&exceptionContext); + if (PreCB) { + (*PreCB)(retraceCount); + } + + if (flushFlag) { + if (VISetRegs()) { + flushFlag = 0; + SIRefreshSamplingRate(); + } + } + + if (PostCB) { + OSClearContext(&exceptionContext); + (*PostCB)(retraceCount); + } + + OSWakeupThread(&retraceQueue); + OSClearContext(&exceptionContext); + OSSetCurrentContext(context); +} + +VIRetraceCallback VISetPreRetraceCallback(VIRetraceCallback callback) +{ + int interrupt; + VIRetraceCallback oldCallback; + + oldCallback = PreCB; + + interrupt = OSDisableInterrupts(); + PreCB = callback; + OSRestoreInterrupts(interrupt); + + return oldCallback; +} + +VIRetraceCallback VISetPostRetraceCallback(VIRetraceCallback callback) +{ + int interrupt; + VIRetraceCallback oldCallback; + + oldCallback = PostCB; + + interrupt = OSDisableInterrupts(); + PostCB = callback; + OSRestoreInterrupts(interrupt); + + return oldCallback; +} + +#pragma dont_inline on +static VITimingInfo *getTiming(VITVMode mode) +{ + switch (mode) { + case VI_TVMODE_NTSC_INT: + return &timing[0]; + case VI_TVMODE_NTSC_DS: + return &timing[1]; + + case VI_TVMODE_PAL_INT: + return &timing[2]; + case VI_TVMODE_PAL_DS: + return &timing[3]; + + case VI_TVMODE_EURGB60_INT: + return &timing[0]; + case VI_TVMODE_EURGB60_DS: + return &timing[1]; + + case VI_TVMODE_MPAL_INT: + return &timing[4]; + case VI_TVMODE_MPAL_DS: + return &timing[5]; + + case VI_TVMODE_NTSC_PROG: + return &timing[6]; + case VI_TVMODE_NTSC_3D: + return &timing[7]; + + case VI_TVMODE_DEBUG_PAL_INT: + return &timing[2]; + case VI_TVMODE_DEBUG_PAL_DS: + return &timing[3]; + } + + return nullptr; +} +#pragma dont_inline off + +void __VIInit(VITVMode mode) +{ + VITimingInfo *tm; + u32 nonInter; + vu32 a; + u32 tv, tvForReg; + + u16 hct, vct; + + nonInter = mode & 2; + tv = (u32)mode >> 2; + + *(u32 *)OSPhysicalToCached(0xCC) = tv; + + tm = getTiming(mode); + + __VIRegs[VI_DISP_CONFIG] = 2; + for (a = 0; a < 1000; a++) { + ; + } + + __VIRegs[VI_DISP_CONFIG] = 0; + + __VIRegs[VI_HORIZ_TIMING_0U] = tm->hlw << 0; + __VIRegs[VI_HORIZ_TIMING_0L] = (tm->hce << 0) | (tm->hcs << 8); + + __VIRegs[VI_HORIZ_TIMING_1U] = (tm->hsy << 0) | ((tm->hbe640 & ((1 << 9) - 1)) << 7); + __VIRegs[VI_HORIZ_TIMING_1L] = ((tm->hbe640 >> 9) << 0) | (tm->hbs640 << 1); + + __VIRegs[VI_VERT_TIMING] = (tm->equ << 0) | (0 << 4); + + __VIRegs[VI_VERT_TIMING_ODD_U] = (tm->prbOdd + tm->acv * 2 - 2) << 0; + __VIRegs[VI_VERT_TIMING_ODD] = tm->psbOdd + 2 << 0; + + __VIRegs[VI_VERT_TIMING_EVEN_U] = (tm->prbEven + tm->acv * 2 - 2) << 0; + __VIRegs[VI_VERT_TIMING_EVEN] = tm->psbEven + 2 << 0; + + __VIRegs[VI_BBI_ODD_U] = (tm->bs1 << 0) | (tm->be1 << 5); + __VIRegs[VI_BBI_ODD] = (tm->bs3 << 0) | (tm->be3 << 5); + + __VIRegs[VI_BBI_EVEN_U] = (tm->bs2 << 0) | (tm->be2 << 5); + __VIRegs[VI_BBI_EVEN] = (tm->bs4 << 0) | (tm->be4 << 5); + + __VIRegs[VI_HSW] = (40 << 0) | (40 << 8); + + __VIRegs[VI_DISP_INT_1U] = 1; + __VIRegs[VI_DISP_INT_1] = (1 << 0) | (1 << 12) | (0 << 15); + + hct = (tm->hlw + 1); + vct = (tm->numHalfLines / 2 + 1) | (1 << 12) | (0 << 15); + __VIRegs[VI_DISP_INT_0U] = hct << 0; + __VIRegs[VI_DISP_INT_0] = vct; + + if (mode != VI_TVMODE_NTSC_PROG && mode != VI_TVMODE_NTSC_3D) { + __VIRegs[VI_DISP_CONFIG] = (1 << 0) | (0 << 1) | (nonInter << 2) | (0 << 3) | (0 << 4) | (0 << 6) | (tv << 8); + __VIRegs[VI_CLOCK_SEL] = 0; + } + else { + __VIRegs[VI_DISP_CONFIG] = (1 << 0) | (0 << 1) | (1 << 2) | (0 << 3) | (0 << 4) | (0 << 6) | (tv << 8); + __VIRegs[VI_CLOCK_SEL] = 1; + } +} + +static void AdjustPosition(u16 acv) +{ + s32 coeff, frac; + + HorVer.adjDispPosX = (u16)CLAMP((s16)HorVer.dispPosX + displayOffsetH, 0, 720 - HorVer.dispSizeX); + + coeff = (HorVer.xfbMode == VI_XFBMODE_SF) ? 2 : 1; + frac = HorVer.dispPosY & 1; + + HorVer.adjDispPosY = (u16)MAX((s16)HorVer.dispPosY + displayOffsetV, frac); + + HorVer.adjDispSizeY = (u16)(HorVer.dispSizeY + MIN((s16)HorVer.dispPosY + displayOffsetV - frac, 0) + - MAX((s16)HorVer.dispPosY + (s16)HorVer.dispSizeY + displayOffsetV - ((s16)acv * 2 - frac), 0)); + + HorVer.adjPanPosY = (u16)(HorVer.panPosY - MIN((s16)HorVer.dispPosY + displayOffsetV - frac, 0) / coeff); + + HorVer.adjPanSizeY = (u16)(HorVer.panSizeY + MIN((s16)HorVer.dispPosY + displayOffsetV - frac, 0) / coeff + - MAX((s16)HorVer.dispPosY + (s16)HorVer.dispSizeY + displayOffsetV - ((s16)acv * 2 - frac), 0) / coeff); +} + +static void ImportAdjustingValues(void) +{ + displayOffsetH = __OSLockSram()->displayOffsetH; + displayOffsetV = 0; + __OSUnlockSram(FALSE); +} + +void VIInit(void) +{ + u16 dspCfg; + u32 value, tv; + + encoderType = 1; + + if (!(__VIRegs[VI_DISP_CONFIG] & 1)) { + __VIInit(VI_TVMODE_NTSC_INT); + } + + retraceCount = 0; + changed = 0; + shdwChanged = 0; + changeMode = 0; + shdwChangeMode = 0; + flushFlag = 0; + + __VIRegs[VI_FCT_0U] = ((((taps[0])) << 0) | (((taps[1] & ((1 << (6)) - 1))) << 10)); + __VIRegs[VI_FCT_0] = ((((taps[1] >> 6)) << 0) | (((taps[2])) << 4)); + __VIRegs[VI_FCT_1U] = ((((taps[3])) << 0) | (((taps[4] & ((1 << (6)) - 1))) << 10)); + __VIRegs[VI_FCT_1] = ((((taps[4] >> 6)) << 0) | (((taps[5])) << 4)); + __VIRegs[VI_FCT_2U] = ((((taps[6])) << 0) | (((taps[7] & ((1 << (6)) - 1))) << 10)); + __VIRegs[VI_FCT_2] = ((((taps[7] >> 6)) << 0) | (((taps[8])) << 4)); + __VIRegs[VI_FCT_3U] = ((((taps[9])) << 0) | (((taps[10])) << 8)); + __VIRegs[VI_FCT_3] = ((((taps[11])) << 0) | (((taps[12])) << 8)); + __VIRegs[VI_FCT_4U] = ((((taps[13])) << 0) | (((taps[14])) << 8)); + __VIRegs[VI_FCT_4] = ((((taps[15])) << 0) | (((taps[16])) << 8)); + __VIRegs[VI_FCT_5U] = ((((taps[17])) << 0) | (((taps[18])) << 8)); + __VIRegs[VI_FCT_5] = ((((taps[19])) << 0) | (((taps[20])) << 8)); + __VIRegs[VI_FCT_6U] = ((((taps[21])) << 0) | (((taps[22])) << 8)); + __VIRegs[VI_FCT_6] = ((((taps[23])) << 0) | (((taps[24])) << 8)); + + __VIRegs[VI_WIDTH] = 640; + ImportAdjustingValues(); + dspCfg = __VIRegs[VI_DISP_CONFIG]; + + HorVer.nonInter = ((((u32)(dspCfg)) >> 2 & 0x00000001)); + HorVer.tv = ((((u32)(dspCfg)) & 0x00000300) >> 8); + + tv = (HorVer.tv == VI_DEBUG) ? VI_NTSC : HorVer.tv; + HorVer.timing = getTiming((VITVMode)VI_TVMODE(tv, HorVer.nonInter)); + regs[VI_DISP_CONFIG] = dspCfg; + + CurrTiming = HorVer.timing; + CurrTvMode = HorVer.tv; + + HorVer.dispSizeX = 640; + HorVer.dispSizeY = (u16)(CurrTiming->acv * 2); + HorVer.dispPosX = (u16)((720 - HorVer.dispSizeX) / 2); + HorVer.dispPosY = 0; + + AdjustPosition(CurrTiming->acv); + + HorVer.fbSizeX = 640; + HorVer.fbSizeY = (u16)(CurrTiming->acv * 2); + HorVer.panPosX = 0; + HorVer.panPosY = 0; + HorVer.panSizeX = 640; + HorVer.panSizeY = (u16)(CurrTiming->acv * 2); + HorVer.xfbMode = VI_XFBMODE_SF; + HorVer.wordPerLine = 40; + HorVer.std = 40; + HorVer.wpl = 40; + HorVer.xof = 0; + HorVer.isBlack = TRUE; + HorVer.is3D = FALSE; + + OSInitThreadQueue(&retraceQueue); + + value = __VIRegs[VI_DISP_INT_0]; + value = (((u32)(value)) & ~0x00008000) | (((0)) << 15); + __VIRegs[VI_DISP_INT_0] = value; + + value = __VIRegs[VI_DISP_INT_1]; + value = (((u32)(value)) & ~0x00008000) | (((0)) << 15); + __VIRegs[VI_DISP_INT_1] = value; + + PreCB = nullptr; + PostCB = nullptr; + + __OSSetInterruptHandler(24, __VIRetraceHandler); + __OSUnmaskInterrupts((0x80000000u >> (24))); +} + +void VIWaitForRetrace(void) +{ + int interrupt; + u32 startCount; + + interrupt = OSDisableInterrupts(); + startCount = retraceCount; + do { + OSSleepThread(&retraceQueue); + } while (startCount == retraceCount); + OSRestoreInterrupts(interrupt); +} + +static void setInterruptRegs(VITimingInfo *tm) +{ + u16 vct, hct, borrow; + + vct = (u16)(tm->numHalfLines / 2); + borrow = (u16)(tm->numHalfLines % 2); + hct = (u16)((borrow) ? tm->hlw : (u16)0); + + vct++; + hct++; + + regs[VI_DISP_INT_0U] = (u16)hct; + changed |= VI_BITMASK(VI_DISP_INT_0U); + + regs[VI_DISP_INT_0] = (u16)((((u32)(vct))) | (((u32)(1)) << 12) | (((u32)(0)) << 15)); + changed |= VI_BITMASK(VI_DISP_INT_0); +} + +static void setPicConfig(u16 fbSizeX, VIXFBMode xfbMode, u16 panPosX, u16 panSizeX, u8 *wordPerLine, u8 *std, u8 *wpl, u8 *xof) +{ + *wordPerLine = (u8)((fbSizeX + 15) / 16); + *std = (u8)((xfbMode == VI_XFBMODE_SF) ? *wordPerLine : (u8)(2 * *wordPerLine)); + *xof = (u8)(panPosX % 16); + *wpl = (u8)((*xof + panSizeX + 15) / 16); + + regs[VI_HSW] = (u16)((((u32)(*std))) | (((u32)(*wpl)) << 8)); + changed |= VI_BITMASK(VI_HSW); +} + +static void setBBIntervalRegs(VITimingInfo *tm) +{ + u16 val; + + val = (u16)((((u32)(tm->bs1))) | (((u32)(tm->be1)) << 5)); + regs[VI_BBI_ODD_U] = val; + changed |= VI_BITMASK(VI_BBI_ODD_U); + + val = (u16)((((u32)(tm->bs3))) | (((u32)(tm->be3)) << 5)); + regs[VI_BBI_ODD] = val; + changed |= VI_BITMASK(VI_BBI_ODD); + + val = (u16)((((u32)(tm->bs2))) | (((u32)(tm->be2)) << 5)); + regs[VI_BBI_EVEN_U] = val; + changed |= VI_BITMASK(VI_BBI_EVEN_U); + + val = (u16)((((u32)(tm->bs4))) | (((u32)(tm->be4)) << 5)); + regs[VI_BBI_EVEN] = val; + changed |= VI_BITMASK(VI_BBI_EVEN); +} + +static void setScalingRegs(u16 panSizeX, u16 dispSizeX, BOOL is3D) +{ + u32 scale; + + panSizeX = (u16)(is3D ? panSizeX * 2 : panSizeX); + + if (panSizeX < dispSizeX) { + scale = (256 * (u32)panSizeX + (u32)dispSizeX - 1) / (u32)dispSizeX; + + regs[VI_HSR] = (u16)((((u32)(scale))) | (((u32)(1)) << 12)); + changed |= VI_BITMASK(VI_HSR); + + regs[VI_WIDTH] = (u16)((((u32)(panSizeX)))); + changed |= VI_BITMASK(VI_WIDTH); + } + else { + regs[VI_HSR] = (u16)((((u32)(256))) | (((u32)(0)) << 12)); + changed |= VI_BITMASK(VI_HSR); + } +} + +static void calcFbbs(u32 bufAddr, u16 panPosX, u16 panPosY, u8 wordPerLine, VIXFBMode xfbMode, u16 dispPosY, u32 *tfbb, u32 *bfbb) +{ + u32 bytesPerLine, xoffInWords; + xoffInWords = (u32)panPosX / 16; + bytesPerLine = (u32)wordPerLine * 32; + + *tfbb = bufAddr + xoffInWords * 32 + bytesPerLine * panPosY; + *bfbb = (xfbMode == VI_XFBMODE_SF) ? *tfbb : (*tfbb + bytesPerLine); + + if (dispPosY % 2 == 1) { + u32 tmp = *tfbb; + *tfbb = *bfbb; + *bfbb = tmp; + } + + *tfbb = ToPhysical(*tfbb); + *bfbb = ToPhysical(*bfbb); +} + +static void setFbbRegs(VIPositionInfo *hv, u32 *tfbb, u32 *bfbb, u32 *rtfbb, u32 *rbfbb) +{ + u32 shifted; + calcFbbs(hv->bufAddr, hv->panPosX, hv->adjPanPosY, hv->wordPerLine, hv->xfbMode, hv->adjDispPosY, tfbb, bfbb); + + if (hv->is3D) { + calcFbbs(hv->rbufAddr, hv->panPosX, hv->adjPanPosY, hv->wordPerLine, hv->xfbMode, hv->adjDispPosY, rtfbb, rbfbb); + } + + if (IS_LOWER_16MB(*tfbb) && IS_LOWER_16MB(*bfbb) && IS_LOWER_16MB(*rtfbb) && IS_LOWER_16MB(*rbfbb)) { + shifted = 0; + } + else { + shifted = 1; + } + + if (shifted) { + *tfbb >>= 5; + *bfbb >>= 5; + *rtfbb >>= 5; + *rbfbb >>= 5; + } + + regs[VI_TOP_FIELD_BASE_LEFT_U] = (u16)(*tfbb & 0xFFFF); + changed |= VI_BITMASK(VI_TOP_FIELD_BASE_LEFT_U); + + regs[VI_TOP_FIELD_BASE_LEFT] = (u16)((((*tfbb >> 16))) | hv->xof << 8 | shifted << 12); + changed |= VI_BITMASK(VI_TOP_FIELD_BASE_LEFT); + + regs[VI_BTTM_FIELD_BASE_LEFT_U] = (u16)(*bfbb & 0xFFFF); + changed |= VI_BITMASK(VI_BTTM_FIELD_BASE_LEFT_U); + + regs[VI_BTTM_FIELD_BASE_LEFT] = (u16)(*bfbb >> 16); + changed |= VI_BITMASK(VI_BTTM_FIELD_BASE_LEFT); + + if (hv->is3D) { + regs[VI_TOP_FIELD_BASE_RIGHT_U] = *rtfbb & 0xffff; + changed |= VI_BITMASK(VI_TOP_FIELD_BASE_RIGHT_U); + + regs[VI_TOP_FIELD_BASE_RIGHT] = *rtfbb >> 16; + changed |= VI_BITMASK(VI_TOP_FIELD_BASE_RIGHT); + + regs[VI_BTTM_FIELD_BASE_RIGHT_U] = *rbfbb & 0xFFFF; + changed |= VI_BITMASK(VI_BTTM_FIELD_BASE_RIGHT_U); + + regs[VI_BTTM_FIELD_BASE_RIGHT] = *rbfbb >> 16; + changed |= VI_BITMASK(VI_BTTM_FIELD_BASE_RIGHT); + } +} + +static void setHorizontalRegs(VITimingInfo *tm, u16 dispPosX, u16 dispSizeX) +{ + u32 hbe, hbs, hbeLo, hbeHi; + + regs[VI_HORIZ_TIMING_0U] = (u16)tm->hlw; + changed |= VI_BITMASK(VI_HORIZ_TIMING_0U); + + regs[VI_HORIZ_TIMING_0L] = (u16)(tm->hce | tm->hcs << 8); + changed |= VI_BITMASK(VI_HORIZ_TIMING_0L); + + hbe = (u32)(tm->hbe640 - 40 + dispPosX); + hbs = (u32)(tm->hbs640 + 40 + dispPosX - (720 - dispSizeX)); + + hbeLo = hbe & ONES(9); + hbeHi = hbe >> 9; + + regs[VI_HORIZ_TIMING_1U] = (u16)(tm->hsy | hbeLo << 7); + changed |= VI_BITMASK(VI_HORIZ_TIMING_1U); + + regs[VI_HORIZ_TIMING_1L] = (u16)(hbeHi | hbs << 1); + changed |= VI_BITMASK(VI_HORIZ_TIMING_1L); +} + +static void setVerticalRegs(u16 dispPosY, u16 dispSizeY, u8 equ, u16 acv, u16 prbOdd, u16 prbEven, u16 psbOdd, u16 psbEven, BOOL black) +{ + u16 actualPrbOdd, actualPrbEven, actualPsbOdd, actualPsbEven, actualAcv, c, d; + + if (equ >= 10) { + c = 1; + d = 2; + } + else { + c = 2; + d = 1; + } + + if (dispPosY % 2 == 0) { + actualPrbOdd = (u16)(prbOdd + d * dispPosY); + actualPsbOdd = (u16)(psbOdd + d * ((c * acv - dispSizeY) - dispPosY)); + actualPrbEven = (u16)(prbEven + d * dispPosY); + actualPsbEven = (u16)(psbEven + d * ((c * acv - dispSizeY) - dispPosY)); + } + else { + actualPrbOdd = (u16)(prbEven + d * dispPosY); + actualPsbOdd = (u16)(psbEven + d * ((c * acv - dispSizeY) - dispPosY)); + actualPrbEven = (u16)(prbOdd + d * dispPosY); + actualPsbEven = (u16)(psbOdd + d * ((c * acv - dispSizeY) - dispPosY)); + } + + actualAcv = (u16)(dispSizeY / c); + + if (black) { + actualPrbOdd += 2 * actualAcv - 2; + actualPsbOdd += 2; + actualPrbEven += 2 * actualAcv - 2; + actualPsbEven += 2; + actualAcv = 0; + } + + regs[VI_VERT_TIMING] = (u16)(equ | actualAcv << 4); + changed |= VI_BITMASK(VI_VERT_TIMING); + + regs[VI_VERT_TIMING_ODD_U] = (u16)actualPrbOdd << 0; + changed |= VI_BITMASK(VI_VERT_TIMING_ODD_U); + + regs[VI_VERT_TIMING_ODD] = (u16)actualPsbOdd << 0; + changed |= VI_BITMASK(VI_VERT_TIMING_ODD); + + regs[VI_VERT_TIMING_EVEN_U] = (u16)actualPrbEven << 0; + changed |= VI_BITMASK(VI_VERT_TIMING_EVEN_U); + + regs[VI_VERT_TIMING_EVEN] = (u16)actualPsbEven << 0; + changed |= VI_BITMASK(VI_VERT_TIMING_EVEN); +} + +static void PrintDebugPalCaution(void) +{ + static u32 message = 0; + + if (message == 0) { + message = 1; + OSReport("***************************************\n"); + OSReport(" ! ! ! C A U T I O N ! ! ! \n"); + OSReport("This TV format \"DEBUG_PAL\" is only for \n"); + OSReport("temporary solution until PAL DAC board \n"); + OSReport("is available. Please do NOT use this \n"); + OSReport("mode in real games!!! \n"); + OSReport("***************************************\n"); + } +} + +void VIConfigure(const GXRenderModeObj *obj) +{ + VITimingInfo *tm; + u32 regDspCfg; + BOOL enabled; + u32 newNonInter, tvInBootrom, tvInGame; + + enabled = OSDisableInterrupts(); + newNonInter = (u32)obj->viTVmode & 3; + + if (HorVer.nonInter != newNonInter) { + changeMode = 1; + HorVer.nonInter = newNonInter; + } + + tvInGame = (u32)obj->viTVmode >> 2; + tvInBootrom = *(u32 *)OSPhysicalToCached(0xCC); + + if (tvInGame == VI_DEBUG_PAL) { + PrintDebugPalCaution(); + } + + if ((tvInGame == VI_NTSC) || (tvInGame == VI_MPAL)) { + HorVer.tv = tvInBootrom; + } + else { + HorVer.tv = tvInGame; + } + + HorVer.dispPosX = obj->viXOrigin; + HorVer.dispPosY = (u16)((HorVer.nonInter == VI_NON_INTERLACE) ? (u16)(obj->viYOrigin * 2) : obj->viYOrigin); + HorVer.dispSizeX = obj->viWidth; + HorVer.fbSizeX = obj->fbWidth; + HorVer.fbSizeY = obj->xfbHeight; + HorVer.xfbMode = obj->xFBmode; + HorVer.panSizeX = HorVer.fbSizeX; + HorVer.panSizeY = HorVer.fbSizeY; + HorVer.panPosX = 0; + HorVer.panPosY = 0; + + HorVer.dispSizeY = (u16)((HorVer.nonInter == VI_PROGRESSIVE) ? HorVer.panSizeY + : (HorVer.nonInter == VI_3D) ? HorVer.panSizeY + : (HorVer.xfbMode == VI_XFBMODE_SF) ? (u16)(2 * HorVer.panSizeY) + : HorVer.panSizeY); + + HorVer.is3D = (HorVer.nonInter == VI_3D) ? TRUE : FALSE; + + tm = getTiming((VITVMode)VI_TVMODE(HorVer.tv, HorVer.nonInter)); + HorVer.timing = tm; + + AdjustPosition(tm->acv); + if (encoderType == 0) { + HorVer.tv = VI_DEBUG; + } + setInterruptRegs(tm); + + regDspCfg = regs[VI_DISP_CONFIG]; + + if ((HorVer.nonInter == VI_PROGRESSIVE) || (HorVer.nonInter == VI_3D)) { + regDspCfg = (((u32)(regDspCfg)) & ~0x00000004) | (((u32)(1)) << 2); + } + else { + regDspCfg = (((u32)(regDspCfg)) & ~0x00000004) | (((u32)(HorVer.nonInter & 1)) << 2); + } + + regDspCfg = (((u32)(regDspCfg)) & ~0x00000008) | (((u32)(HorVer.is3D)) << 3); + + if ((HorVer.tv == VI_DEBUG_PAL) || (HorVer.tv == VI_EURGB60)) { + regDspCfg = (((u32)(regDspCfg)) & ~0x00000300) | (((u32)(0)) << 8); + } + else { + regDspCfg = (((u32)(regDspCfg)) & ~0x00000300) | (((u32)(HorVer.tv)) << 8); + } + + regs[VI_DISP_CONFIG] = (u16)regDspCfg; + changed |= VI_BITMASK(0x01); + + regDspCfg = regs[VI_CLOCK_SEL]; + if (obj->viTVmode == VI_TVMODE_NTSC_PROG || obj->viTVmode == VI_TVMODE_NTSC_3D) { + regDspCfg = (u32)(regDspCfg & ~0x1) | 1; + } + else { + regDspCfg = (u32)(regDspCfg & ~0x1); + } + + regs[VI_CLOCK_SEL] = (u16)regDspCfg; + + changed |= 0x200; + + setScalingRegs(HorVer.panSizeX, HorVer.dispSizeX, HorVer.is3D); + setHorizontalRegs(tm, HorVer.adjDispPosX, HorVer.dispSizeX); + setBBIntervalRegs(tm); + setPicConfig(HorVer.fbSizeX, HorVer.xfbMode, HorVer.panPosX, HorVer.panSizeX, &HorVer.wordPerLine, &HorVer.std, &HorVer.wpl, &HorVer.xof); + + if (FBSet) { + setFbbRegs(&HorVer, &HorVer.tfbb, &HorVer.bfbb, &HorVer.rtfbb, &HorVer.rbfbb); + } + + setVerticalRegs(HorVer.adjDispPosY, HorVer.adjDispSizeY, tm->equ, tm->acv, tm->prbOdd, tm->prbEven, tm->psbOdd, tm->psbEven, HorVer.isBlack); + OSRestoreInterrupts(enabled); +} + +void VIConfigurePan(u16 xOrg, u16 yOrg, u16 width, u16 height) +{ + BOOL enabled; + VITimingInfo *tm; + + enabled = OSDisableInterrupts(); + HorVer.panPosX = xOrg; + HorVer.panPosY = yOrg; + HorVer.panSizeX = width; + HorVer.panSizeY = height; + HorVer.dispSizeY = (HorVer.nonInter == 2) ? HorVer.panSizeY + : (HorVer.nonInter == 3) ? HorVer.panSizeY + : (HorVer.xfbMode == VI_XFBMODE_SF) ? (u16)(HorVer.panSizeY * 2) + : HorVer.panSizeY; + tm = HorVer.timing; + AdjustPosition(tm->acv); + setScalingRegs(HorVer.panSizeX, HorVer.dispSizeX, HorVer.is3D); + setPicConfig(HorVer.fbSizeX, HorVer.xfbMode, HorVer.panPosX, HorVer.panSizeX, &HorVer.wordPerLine, &HorVer.std, &HorVer.wpl, &HorVer.xof); + if (FBSet != 0) { + setFbbRegs(&HorVer, &HorVer.tfbb, &HorVer.bfbb, &HorVer.rtfbb, &HorVer.rbfbb); + } + setVerticalRegs(HorVer.adjDispPosY, HorVer.dispSizeY, tm->equ, tm->acv, tm->prbOdd, tm->prbEven, tm->psbOdd, tm->psbEven, HorVer.isBlack); + OSRestoreInterrupts(enabled); +} + +void VIFlush(void) +{ + BOOL enabled; + s32 regIndex; + u32 val; // for stack. + + enabled = OSDisableInterrupts(); + shdwChangeMode |= changeMode; + changeMode = 0; + shdwChanged |= changed; + + while (changed) { + regIndex = cntlzd(changed); + shdwRegs[regIndex] = regs[regIndex]; + changed &= ~VI_BITMASK(regIndex); + } + + flushFlag = 1; + OSRestoreInterrupts(enabled); +} + +void VISetNextFrameBuffer(void *fb) +{ + BOOL enabled = OSDisableInterrupts(); + HorVer.bufAddr = (u32)fb; + FBSet = 1; + setFbbRegs(&HorVer, &HorVer.tfbb, &HorVer.bfbb, &HorVer.rtfbb, &HorVer.rbfbb); + OSRestoreInterrupts(enabled); +} + +void *VIGetNextFrameBuffer() +{ + // UNUSED FUNCTION +} + +void *VIGetCurrentFrameBuffer(void) +{ + return (void *)CurrBufAddr; +} + +void VISetNextRightFrameBuffer(void *fb) +{ + // UNUSED FUNCTION +} + +void VISetBlack(BOOL isBlack) +{ + int interrupt; + VITimingInfo *tm; + + interrupt = OSDisableInterrupts(); + HorVer.isBlack = isBlack; + tm = HorVer.timing; + setVerticalRegs(HorVer.adjDispPosY, HorVer.dispSizeY, tm->equ, tm->acv, tm->prbOdd, tm->prbEven, tm->psbOdd, tm->psbEven, HorVer.isBlack); + OSRestoreInterrupts(interrupt); +} + +void VISet3D(void) +{ + // UNUSED FUNCTION +} + +u32 VIGetRetraceCount(void) +{ + return retraceCount; +} + +static u32 getCurrentHalfLine(void) +{ + u32 hcount; + u32 vcount0; + u32 vcount; + + vcount = __VIRegs[22] & 0x7FF; + do { + vcount0 = vcount; + hcount = __VIRegs[23] & 0x7FF; + vcount = __VIRegs[22] & 0x7FF; + } while (vcount0 != vcount); + return ((vcount - 1) * 2) + ((hcount - 1) / CurrTiming->hlw); +} + +static u32 getCurrentFieldEvenOdd() +{ + return (getCurrentHalfLine() < CurrTiming->numHalfLines) ? 1 : 0; +} + +u32 VIGetNextField(void) +{ + u32 nextField; + int interrupt; + + interrupt = OSDisableInterrupts(); + nextField = getCurrentFieldEvenOdd() ^ 1; + OSRestoreInterrupts(interrupt); + return nextField ^ (HorVer.adjDispPosY & 1); +} + +u32 VIGetCurrentLine(void) +{ + u32 line; + VITimingInfo *tm; + int interrupt; + + tm = CurrTiming; + interrupt = OSDisableInterrupts(); + line = getCurrentHalfLine(); + OSRestoreInterrupts(interrupt); + + if (line >= tm->numHalfLines) { + line -= tm->numHalfLines; + } + + return (line >> 1); +} + +u32 VIGetTvFormat(void) +{ + u32 fmt; + int interrupt; + + interrupt = OSDisableInterrupts(); + + switch (CurrTvMode) { + case VI_NTSC: + case VI_DEBUG: + fmt = VI_NTSC; + break; + case VI_PAL: + case VI_DEBUG_PAL: + fmt = VI_PAL; + break; + case VI_EURGB60: + case VI_MPAL: + fmt = CurrTvMode; + break; + } + + OSRestoreInterrupts(interrupt); + return fmt; +} + +u32 VIGetDTVStatus(void) +{ + u32 stat; + int interrupt; + + interrupt = OSDisableInterrupts(); + stat = (__VIRegs[VI_DTV_STAT] & 3); + OSRestoreInterrupts(interrupt); + return (stat & 1); +} From 53fba73d3374c3b15f2a63be2513c8acc310d69e Mon Sep 17 00:00:00 2001 From: gamemasterplc Date: Sun, 10 Nov 2024 18:27:13 -0600 Subject: [PATCH 10/29] Link in arq and most of dvd --- config/GMPE01_00/symbols.txt | 4 +- configure.py | 14 +- include/dolphin/os/OSBootInfo.h | 2 +- src/dolphin/ar/ar.c | 251 ++++++++++++++++++ src/dolphin/ar/arq.c | 168 ++++++++++++ src/dolphin/dvd/dvderror.c | 56 ++++ src/dolphin/dvd/dvdfs.c | 356 ++++++++++++++++++++++++++ src/dolphin/dvd/dvdlow.c | 436 ++++++++++++++++++++++++++++++++ src/dolphin/dvd/dvdqueue.c | 142 +++++++++++ src/dolphin/dvd/fstload.c | 68 +++++ 10 files changed, 1487 insertions(+), 10 deletions(-) create mode 100644 src/dolphin/ar/ar.c create mode 100644 src/dolphin/ar/arq.c create mode 100644 src/dolphin/dvd/dvderror.c create mode 100644 src/dolphin/dvd/dvdfs.c create mode 100644 src/dolphin/dvd/dvdlow.c create mode 100644 src/dolphin/dvd/dvdqueue.c create mode 100644 src/dolphin/dvd/fstload.c diff --git a/config/GMPE01_00/symbols.txt b/config/GMPE01_00/symbols.txt index 9607a86b..1c59588e 100644 --- a/config/GMPE01_00/symbols.txt +++ b/config/GMPE01_00/symbols.txt @@ -3911,7 +3911,7 @@ lbl_8012E70A = .data:0x8012E70A; // type:object size:0xB data:string lbl_8012E715 = .data:0x8012E715; // type:object size:0x273 lbl_8012E988 = .data:0x8012E988; // type:object size:0x12 data:string lbl_8012E99A = .data:0x8012E99A; // type:object size:0xD6 -HuSndGrpTbl = .data:0x8012EA70; // type:object size:0x5B0 +sndGrpTable = .data:0x8012EA70; // type:object size:0x5B0 lbl_8012F020 = .data:0x8012F020; // type:object size:0x94 lbl_8012F0B4 = .data:0x8012F0B4; // type:object size:0x11 data:string lbl_8012F0C5 = .data:0x8012F0C5; // type:object size:0x3A @@ -5692,7 +5692,7 @@ shdwChanged = .sbss:0x801D4460; // type:object size:0x8 scope:local align:8 data CurrTiming = .sbss:0x801D4468; // type:object size:0x4 scope:local data:4byte CurrTvMode = .sbss:0x801D446C; // type:object size:0x4 scope:local data:4byte FBSet = .sbss:0x801D4470; // type:object size:0x4 scope:local data:4byte -message$343 = .sbss:0x801D4474; // type:object size:0x4 scope:local data:4byte +message$320 = .sbss:0x801D4474; // type:object size:0x4 scope:local data:4byte rmode = .sbss:0x801D4478; // type:object size:0x8 scope:local data:4byte fontShift = .sbss:0x801D4480; // type:object size:0x8 scope:local data:4byte DemoStat = .sbss:0x801D4488; // type:object size:0x4 scope:local data:4byte diff --git a/configure.py b/configure.py index fa174004..67f32c23 100644 --- a/configure.py +++ b/configure.py @@ -494,18 +494,18 @@ config.libs = [ DolphinLib( "dvd", [ - Object(NonMatching, "dolphin/dvd/dvdlow.c"), - Object(NonMatching, "dolphin/dvd/dvdfs.c"), + Object(Matching, "dolphin/dvd/dvdlow.c"), + Object(Matching, "dolphin/dvd/dvdfs.c"), Object(NonMatching, "dolphin/dvd/dvd.c"), - Object(NonMatching, "dolphin/dvd/dvdqueue.c"), - Object(NonMatching, "dolphin/dvd/dvderror.c"), - Object(NonMatching, "dolphin/dvd/fstload.c"), + Object(Matching, "dolphin/dvd/dvdqueue.c"), + Object(Matching, "dolphin/dvd/dvderror.c"), + Object(Matching, "dolphin/dvd/fstload.c"), ], ), DolphinLib( "vi", [ - Object(NonMatching, "dolphin/vi.c"), + Object(Matching, "dolphin/vi.c"), ], ), DolphinLib( @@ -534,7 +534,7 @@ config.libs = [ "ar", [ Object(NonMatching, "dolphin/ar/ar.c"), - Object(NonMatching, "dolphin/ar/arq.c"), + Object(Matching, "dolphin/ar/arq.c"), ], ), DolphinLib( diff --git a/include/dolphin/os/OSBootInfo.h b/include/dolphin/os/OSBootInfo.h index a78d135f..19d4dfb5 100644 --- a/include/dolphin/os/OSBootInfo.h +++ b/include/dolphin/os/OSBootInfo.h @@ -4,7 +4,7 @@ #include "dolphin/DVDPriv.h" #include "dolphin/types.h" -typedef struct OSBootInfo { +typedef struct OSBootInfo_s { DVDDiskID DVDDiskID; u32 magic; u32 version; diff --git a/src/dolphin/ar/ar.c b/src/dolphin/ar/ar.c new file mode 100644 index 00000000..7f43c1a7 --- /dev/null +++ b/src/dolphin/ar/ar.c @@ -0,0 +1,251 @@ +#include "dolphin/ar.h" + +#include "dolphin/hw_regs.h" +#include "dolphin/os.h" + +static ARCallback __AR_Callback; +static u32 __AR_Size; +static u32 __AR_InternalSize; +static u32 __AR_ExpansionSize; + +static u32 __AR_StackPointer; +static u32 __AR_FreeBlocks; +static u32* __AR_BlockLength; + +static volatile BOOL __AR_init_flag = FALSE; + +static void __ARHandler(__OSInterrupt interrupt, OSContext* context); +static void __ARChecksize(void); +static void __ARClearArea(u32 start_addr, u32 length); + +ARCallback ARRegisterDMACallback(ARCallback callback) { + ARCallback oldCb; + BOOL enabled; + oldCb = __AR_Callback; + enabled = OSDisableInterrupts(); + __AR_Callback = callback; + OSRestoreInterrupts(enabled); + return oldCb; +} + +u32 ARGetDMAStatus() { + BOOL enabled; + u32 val; + enabled = OSDisableInterrupts(); + val = __DSPRegs[5] & 0x0200; + OSRestoreInterrupts(enabled); + return val; +} + +void ARStartDMA(u32 type, u32 mainmem_addr, u32 aram_addr, u32 length) { + BOOL enabled; + + enabled = OSDisableInterrupts(); + + __DSPRegs[16] = (u16)(__DSPRegs[16] & ~0x3ff) | (u16)(mainmem_addr >> 16); + __DSPRegs[17] = (u16)(__DSPRegs[17] & ~0xffe0) | (u16)(mainmem_addr & 0xffff); + __DSPRegs[18] = (u16)(__DSPRegs[18] & ~0x3ff) | (u16)(aram_addr >> 16); + __DSPRegs[19] = (u16)(__DSPRegs[19] & ~0xffe0) | (u16)(aram_addr & 0xffff); + __DSPRegs[20] = (u16)((__DSPRegs[20] & ~0x8000) | (type << 15)); + __DSPRegs[20] = (u16)(__DSPRegs[20] & ~0x3ff) | (u16)(length >> 16); + __DSPRegs[21] = (u16)(__DSPRegs[21] & ~0xffe0) | (u16)(length & 0xffff); + OSRestoreInterrupts(enabled); +} + +u32 ARAlloc(u32 length) { + u32 tmp; + BOOL enabled; + + enabled = OSDisableInterrupts(); + tmp = __AR_StackPointer; + __AR_StackPointer += length; + *__AR_BlockLength = length; + __AR_BlockLength++; + __AR_FreeBlocks--; + OSRestoreInterrupts(enabled); + + return tmp; +} + +#if NONMATCHING +u32 ARFree(u32* length) { + BOOL old; + + old = OSDisableInterrupts(); + + __AR_BlockLength--; + + if (length) { + *length = *__AR_BlockLength; + } + + __AR_StackPointer -= *__AR_BlockLength; + + __AR_FreeBlocks++; + + OSRestoreInterrupts(old); + + return __AR_StackPointer; +} +#else +/* clang-format off */ +#pragma push +#pragma optimization_level 0 +#pragma optimizewithasm off +asm u32 ARFree(u32* length) { + nofralloc + mflr r0 + stw r0, 4(r1) + stwu r1, -0x18(r1) + stw r31, 0x14(r1) + mr r31, r3 + bl OSDisableInterrupts + lwz r4, __AR_BlockLength + cmplwi r31, 0 + addi r0, r4, -4 + stw r0, __AR_BlockLength + beq lbl_8036DAB4 + lwz r4, __AR_BlockLength + lwz r0, 0(r4) + stw r0, 0(r31) +lbl_8036DAB4: + lwz r5, __AR_BlockLength + lwz r4, __AR_FreeBlocks + lwz r6, 0(r5) + addi r0, r4, 1 + lwz r5, __AR_StackPointer + stw r0, __AR_FreeBlocks + subf r0, r6, r5 + stw r0, __AR_StackPointer + bl OSRestoreInterrupts + lwz r3, __AR_StackPointer + lwz r0, 0x1c(r1) + lwz r31, 0x14(r1) + addi r1, r1, 0x18 + mtlr r0 + blr +} +#pragma pop +/* clang-format on */ +#endif + +BOOL ARCheckInit() { return __AR_init_flag; } + +u32 ARInit(u32* stack_index_addr, u32 num_entries) { + + BOOL old; + u16 refresh; + + if (__AR_init_flag == TRUE) { + return 0x4000; + } + + old = OSDisableInterrupts(); + + __AR_Callback = NULL; + + __OSSetInterruptHandler(__OS_INTERRUPT_DSP_ARAM, __ARHandler); + __OSUnmaskInterrupts(OS_INTERRUPTMASK_DSP_ARAM); + + __AR_StackPointer = 0x4000; + __AR_FreeBlocks = num_entries; + __AR_BlockLength = stack_index_addr; + + refresh = (u16)(__DSPRegs[13] & 0x000000ff); + + __DSPRegs[13] = (u16)((__DSPRegs[13] & ~0x000000ff) | (refresh & 0x000000ff)); + + __ARChecksize(); + + __AR_init_flag = TRUE; + + OSRestoreInterrupts(old); + + return __AR_StackPointer; +} + +u32 ARGetBaseAddress(void) { return 0x4000; } + +void ARSetSize(void) +{ + +} + +u32 ARGetSize() { return __AR_Size; } + +static void __ARHandler(__OSInterrupt interrupt, OSContext* context) { + + OSContext exceptionContext; + u16 tmp; + + tmp = __DSPRegs[5]; + tmp = (u16)((tmp & ~0x00000088) | 0x20); + __DSPRegs[5] = tmp; + + OSClearContext(&exceptionContext); + OSSetCurrentContext(&exceptionContext); + + if (__AR_Callback) { + (*__AR_Callback)(); + } + + OSClearContext(&exceptionContext); + OSSetCurrentContext(context); +} + +#define RoundUP32(x) (((u32)(x) + 32 - 1) & ~(32 - 1)) + +void __ARClearInterrupt(void) { + + u16 tmp; + tmp = __DSPRegs[5]; + tmp = (u16)((tmp & ~(0x00000080 | 0x00000008)) | 0x00000020); + __DSPRegs[5] = tmp; +} +u16 __ARGetInterruptStatus(void) { return ((u16)(__DSPRegs[5] & 0x0200)); } + +static void __ARWaitForDMA(void) { + + while (__DSPRegs[5] & 0x0200) { + } +} + +static void __ARWriteDMA(u32 mmem_addr, u32 aram_addr, u32 length) { + + __DSPRegs[16] = (u16)((__DSPRegs[16] & ~0x03ff) | (u16)(mmem_addr >> 16)); + __DSPRegs[16 + 1] = (u16)((__DSPRegs[16 + 1] & ~0xffe0) | (u16)(mmem_addr & 0xffff)); + + __DSPRegs[18] = (u16)((__DSPRegs[18] & ~0x03ff) | (u16)(aram_addr >> 16)); + __DSPRegs[18 + 1] = (u16)((__DSPRegs[18 + 1] & ~0xffe0) | (u16)(aram_addr & 0xffff)); + + __DSPRegs[20] = (u16)(__DSPRegs[20] & ~0x8000); + + __DSPRegs[20] = (u16)((__DSPRegs[20] & ~0x03ff) | (u16)(length >> 16)); + __DSPRegs[20 + 1] = (u16)((__DSPRegs[20 + 1] & ~0xffe0) | (u16)(length & 0xffff)); + + __ARWaitForDMA(); + + __ARClearInterrupt(); +} + +static void __ARReadDMA(u32 mmem_addr, u32 aram_addr, u32 length) { + + __DSPRegs[16] = (u16)((__DSPRegs[16] & ~0x03ff) | (u16)(mmem_addr >> 16)); + __DSPRegs[16 + 1] = (u16)((__DSPRegs[16 + 1] & ~0xffe0) | (u16)(mmem_addr & 0xffff)); + + __DSPRegs[18] = (u16)((__DSPRegs[18] & ~0x03ff) | (u16)(aram_addr >> 16)); + __DSPRegs[18 + 1] = (u16)((__DSPRegs[18 + 1] & ~0xffe0) | (u16)(aram_addr & 0xffff)); + + __DSPRegs[20] = (u16)(__DSPRegs[20] | 0x8000); + + __DSPRegs[20] = (u16)((__DSPRegs[20] & ~0x03ff) | (u16)(length >> 16)); + __DSPRegs[20 + 1] = (u16)((__DSPRegs[20 + 1] & ~0xffe0) | (u16)(length & 0xffff)); + + __ARWaitForDMA(); + + __ARClearInterrupt(); +} + +static void __ARChecksize(void) { + //TODO: Implement for this SDK version +} \ No newline at end of file diff --git a/src/dolphin/ar/arq.c b/src/dolphin/ar/arq.c new file mode 100644 index 00000000..a0537463 --- /dev/null +++ b/src/dolphin/ar/arq.c @@ -0,0 +1,168 @@ +#include "dolphin/arq.h" +#include "dolphin/os.h" + +static ARQRequest* __ARQRequestQueueHi; +static ARQRequest* __ARQRequestTailHi; +static ARQRequest* __ARQRequestQueueLo; +static ARQRequest* __ARQRequestTailLo; +static ARQRequest* __ARQRequestPendingHi; +static ARQRequest* __ARQRequestPendingLo; +static ARQCallback __ARQCallbackHi; +static ARQCallback __ARQCallbackLo; +static u32 __ARQChunkSize; + +static volatile BOOL __ARQ_init_flag = FALSE; + +void __ARQPopTaskQueueHi(void); +void __ARQServiceQueueLo(void); +void __ARQCallbackHack(void); +void __ARQInterruptServiceRoutine(void); +void __ARQInitTempQueue(void); +void __ARQPushTempQueue(ARQRequest* task); + +void __ARQPopTaskQueueHi(void) { + + if (__ARQRequestQueueHi) { + if (__ARQRequestQueueHi->type == ARQ_TYPE_MRAM_TO_ARAM) { + ARStartDMA(__ARQRequestQueueHi->type, __ARQRequestQueueHi->source, __ARQRequestQueueHi->dest, + __ARQRequestQueueHi->length); + } else { + ARStartDMA(__ARQRequestQueueHi->type, __ARQRequestQueueHi->dest, __ARQRequestQueueHi->source, + __ARQRequestQueueHi->length); + } + + __ARQCallbackHi = __ARQRequestQueueHi->callback; + + __ARQRequestPendingHi = __ARQRequestQueueHi; + + __ARQRequestQueueHi = __ARQRequestQueueHi->next; + } +} + +void __ARQServiceQueueLo(void) { + + if ((__ARQRequestPendingLo == NULL) && (__ARQRequestQueueLo)) { + __ARQRequestPendingLo = __ARQRequestQueueLo; + + __ARQRequestQueueLo = __ARQRequestQueueLo->next; + } + + if (__ARQRequestPendingLo) { + if (__ARQRequestPendingLo->length <= __ARQChunkSize) { + if (__ARQRequestPendingLo->type == ARQ_TYPE_MRAM_TO_ARAM) + ARStartDMA(__ARQRequestPendingLo->type, __ARQRequestPendingLo->source, + __ARQRequestPendingLo->dest, __ARQRequestPendingLo->length); + else + ARStartDMA(__ARQRequestPendingLo->type, __ARQRequestPendingLo->dest, + __ARQRequestPendingLo->source, __ARQRequestPendingLo->length); + + __ARQCallbackLo = __ARQRequestPendingLo->callback; + } else { + if (__ARQRequestPendingLo->type == ARQ_TYPE_MRAM_TO_ARAM) + ARStartDMA(__ARQRequestPendingLo->type, __ARQRequestPendingLo->source, + __ARQRequestPendingLo->dest, __ARQChunkSize); + else + ARStartDMA(__ARQRequestPendingLo->type, __ARQRequestPendingLo->dest, + __ARQRequestPendingLo->source, __ARQChunkSize); + } + + __ARQRequestPendingLo->length -= __ARQChunkSize; + __ARQRequestPendingLo->source += __ARQChunkSize; + __ARQRequestPendingLo->dest += __ARQChunkSize; + } +} +void __ARQCallbackHack(void) { return; } + +void __ARQInterruptServiceRoutine(void) { + + if (__ARQCallbackHi) { + (*__ARQCallbackHi)((u32)__ARQRequestPendingHi); + __ARQRequestPendingHi = NULL; + __ARQCallbackHi = NULL; + } + + else if (__ARQCallbackLo) { + (*__ARQCallbackLo)((u32)__ARQRequestPendingLo); + __ARQRequestPendingLo = NULL; + __ARQCallbackLo = NULL; + } + + __ARQPopTaskQueueHi(); + + if (__ARQRequestPendingHi == NULL) + __ARQServiceQueueLo(); +} + +void ARQInit(void) { + + if (TRUE == __ARQ_init_flag) { + return; + } + + __ARQRequestQueueHi = __ARQRequestQueueLo = NULL; + __ARQChunkSize = ARQ_CHUNK_SIZE_DEFAULT; + ARRegisterDMACallback(&__ARQInterruptServiceRoutine); + __ARQRequestPendingHi = NULL; + __ARQRequestPendingLo = NULL; + __ARQCallbackHi = NULL; + __ARQCallbackLo = NULL; + __ARQ_init_flag = TRUE; +} + +void ARQPostRequest(ARQRequest* request, u32 owner, u32 type, u32 priority, u32 source, u32 dest, + u32 length, ARQCallback callback) { + + BOOL enabled; + + request->next = NULL; + request->owner = owner; + request->type = type; + request->source = source; + request->dest = dest; + request->length = length; + + if (callback) { + request->callback = callback; + } else { + request->callback = (ARQCallback)&__ARQCallbackHack; + } + + enabled = OSDisableInterrupts(); + + switch (priority) { + case ARQ_PRIORITY_LOW: + + if (__ARQRequestQueueLo) { + __ARQRequestTailLo->next = request; + } else { + __ARQRequestQueueLo = request; + } + __ARQRequestTailLo = request; + + break; + + case ARQ_PRIORITY_HIGH: + + if (__ARQRequestQueueHi) { + __ARQRequestTailHi->next = request; + } else { + __ARQRequestQueueHi = request; + } + + __ARQRequestTailHi = request; + + break; + } + + if ((__ARQRequestPendingHi == NULL) && (__ARQRequestPendingLo == NULL)) { + __ARQPopTaskQueueHi(); + + if (__ARQRequestPendingHi == NULL) { + __ARQServiceQueueLo(); + } + } + + OSRestoreInterrupts(enabled); +} + +u32 ARQGetChunkSize(void) { return __ARQChunkSize; } \ No newline at end of file diff --git a/src/dolphin/dvd/dvderror.c b/src/dolphin/dvd/dvderror.c new file mode 100644 index 00000000..d7bf68ba --- /dev/null +++ b/src/dolphin/dvd/dvderror.c @@ -0,0 +1,56 @@ +#include "dolphin/DVDPriv.h" +#include "dolphin/OSRtcPriv.h" + +static u32 ErrorTable[] = { + 0, 0x00023A00, 0x00062800, 0x00030200, 0x00031100, 0x00052000, + 0x00052001, 0x00052100, 0x00052400, 0x00052401, 0x00052402, 0x000B5A01, + 0x00056300, 0x00020401, 0x00020400, 0x00040800, 0x00100007, 0, +}; + +static u8 ErrorCode2Num(u32 errorCode) { + u32 i; + + for (i = 0; i < sizeof(ErrorTable) / sizeof(ErrorTable[0]); i++) { + if (ErrorTable[i] == errorCode) { + return (u8)i; + } + } + + if ((errorCode >= 0x00100000) && (errorCode <= 0x00100008)) { + return 17; + } + + return 29; +} + +static u8 Convert(u32 error) { + u32 statusCode; + u32 errorCode; + u8 errorNum; + + if (error == 0x01234567) + return 255; + + if (error == 0x01234568) + return 254; + + statusCode = (error & 0xff000000) >> 24; + errorCode = error & 0x00ffffff; + + errorNum = ErrorCode2Num(errorCode); + if (statusCode >= 6) + statusCode = 6; + + return (u8)(statusCode * 30 + errorNum); +} + +void __DVDStoreErrorCode(u32 error) { + OSSramEx* sram; + u8 num; + + num = Convert(error); + + sram = __OSLockSramEx(); + sram->dvdErrorCode = num; + __OSUnlockSramEx(TRUE); +} \ No newline at end of file diff --git a/src/dolphin/dvd/dvdfs.c b/src/dolphin/dvd/dvdfs.c new file mode 100644 index 00000000..4f465be0 --- /dev/null +++ b/src/dolphin/dvd/dvdfs.c @@ -0,0 +1,356 @@ + +#include "dolphin/DVDPriv.h" +#include "dolphin/os.h" +#include "dolphin/os/OSBootInfo.h" + +typedef struct FSTEntry FSTEntry; + +struct FSTEntry { + unsigned int isDirAndStringOff; + unsigned int parentOrPosition; + unsigned int nextEntryOrLength; +}; + +static OSBootInfo* BootInfo; +static FSTEntry* FstStart; +static char* FstStringStart; +static u32 MaxEntryNum; +static u32 currentDirectory = 0; +OSThreadQueue __DVDThreadQueue; +u32 __DVDLongFileNameFlag = 0; + +static void cbForReadAsync(s32 result, DVDCommandBlock* block); +static void cbForReadSync(s32 result, DVDCommandBlock* block); +static void cbForSeekAsync(s32 result, DVDCommandBlock* block); +static void cbForSeekSync(s32 result, DVDCommandBlock* block); +static void cbForPrepareStreamAsync(s32 result, DVDCommandBlock* block); +static void cbForPrepareStreamSync(s32 result, DVDCommandBlock* block); + +void __DVDFSInit() { + BootInfo = (OSBootInfo*)OSPhysicalToCached(0); + FstStart = (FSTEntry*)BootInfo->FSTLocation; + + if (FstStart) { + MaxEntryNum = FstStart[0].nextEntryOrLength; + FstStringStart = (char*)&(FstStart[MaxEntryNum]); + } +} + +/* For convenience */ +#define entryIsDir(i) (((FstStart[i].isDirAndStringOff & 0xff000000) == 0) ? FALSE : TRUE) +#define stringOff(i) (FstStart[i].isDirAndStringOff & ~0xff000000) +#define parentDir(i) (FstStart[i].parentOrPosition) +#define nextDir(i) (FstStart[i].nextEntryOrLength) +#define filePosition(i) (FstStart[i].parentOrPosition) +#define fileLength(i) (FstStart[i].nextEntryOrLength) + +static BOOL isSame(const char* path, const char* string) { + while (*string != '\0') { + if (tolower(*path++) != tolower(*string++)) { + return FALSE; + } + } + + if ((*path == '/') || (*path == '\0')) { + return TRUE; + } + + return FALSE; +} + +s32 DVDConvertPathToEntrynum(char* pathPtr) { + const char* ptr; + char* stringPtr; + BOOL isDir; + u32 length; + u32 dirLookAt; + u32 i; + const char* origPathPtr = pathPtr; + const char* extentionStart; + BOOL illegal; + BOOL extention; + + dirLookAt = currentDirectory; + + while (1) { + + if (*pathPtr == '\0') { + return (s32)dirLookAt; + } else if (*pathPtr == '/') { + dirLookAt = 0; + pathPtr++; + continue; + } else if (*pathPtr == '.') { + if (*(pathPtr + 1) == '.') { + if (*(pathPtr + 2) == '/') { + dirLookAt = parentDir(dirLookAt); + pathPtr += 3; + continue; + } else if (*(pathPtr + 2) == '\0') { + return (s32)parentDir(dirLookAt); + } + } else if (*(pathPtr + 1) == '/') { + pathPtr += 2; + continue; + } else if (*(pathPtr + 1) == '\0') { + return (s32)dirLookAt; + } + } + + if (__DVDLongFileNameFlag == 0) { + extention = FALSE; + illegal = FALSE; + + for (ptr = pathPtr; (*ptr != '\0') && (*ptr != '/'); ptr++) { + if (*ptr == '.') { + if ((ptr - pathPtr > 8) || (extention == TRUE)) { + illegal = TRUE; + break; + } + extention = TRUE; + extentionStart = ptr + 1; + + } else if (*ptr == ' ') + illegal = TRUE; + } + + if ((extention == TRUE) && (ptr - extentionStart > 3)) + illegal = TRUE; + + if (illegal) + OSPanic(__FILE__, 376, + "DVDConvertEntrynumToPath(possibly DVDOpen or DVDChangeDir or DVDOpenDir): " + "specified directory or file (%s) doesn't match standard 8.3 format. This is a " + "temporary restriction and will be removed soon\n", + origPathPtr); + } else { + for (ptr = pathPtr; (*ptr != '\0') && (*ptr != '/'); ptr++) + ; + } + + isDir = (*ptr == '\0') ? FALSE : TRUE; + length = (u32)(ptr - pathPtr); + + ptr = pathPtr; + + for (i = dirLookAt + 1; i < nextDir(dirLookAt); i = entryIsDir(i) ? nextDir(i) : (i + 1)) { + if ((entryIsDir(i) == FALSE) && (isDir == TRUE)) { + continue; + } + + stringPtr = FstStringStart + stringOff(i); + + if (isSame(ptr, stringPtr) == TRUE) { + goto next_hier; + } + } + + return -1; + + next_hier: + if (!isDir) { + return (s32)i; + } + + dirLookAt = i; + pathPtr += length + 1; + } +} + +BOOL DVDFastOpen(s32 entrynum, DVDFileInfo* fileInfo) { + if ((entrynum < 0) || (entrynum >= MaxEntryNum) || entryIsDir(entrynum)) { + return FALSE; + } + + fileInfo->startAddr = filePosition(entrynum); + fileInfo->length = fileLength(entrynum); + fileInfo->callback = (DVDCallback)NULL; + fileInfo->cb.state = DVD_STATE_END; + + return TRUE; +} + +BOOL DVDOpen(char* fileName, DVDFileInfo* fileInfo) { + s32 entry; + char currentDir[128]; + + entry = DVDConvertPathToEntrynum(fileName); + + if (0 > entry) { + DVDGetCurrentDir(currentDir, 128); + OSReport("Warning: DVDOpen(): file '%s' was not found under %s.\n", fileName, currentDir); + return FALSE; + } + + if (entryIsDir(entry)) { + return FALSE; + } + + fileInfo->startAddr = filePosition(entry); + fileInfo->length = fileLength(entry); + fileInfo->callback = (DVDCallback)NULL; + fileInfo->cb.state = DVD_STATE_END; + + return TRUE; +} + +BOOL DVDClose(DVDFileInfo* fileInfo) { + DVDCancel(&(fileInfo->cb)); + return TRUE; +} + +static u32 myStrncpy(char* dest, char* src, u32 maxlen) { + u32 i = maxlen; + + while ((i > 0) && (*src != 0)) { + *dest++ = *src++; + i--; + } + + return (maxlen - i); +} + +static u32 entryToPath(u32 entry, char* path, u32 maxlen) { + char* name; + u32 loc; + + if (entry == 0) { + return 0; + } + + name = FstStringStart + stringOff(entry); + + loc = entryToPath(parentDir(entry), path, maxlen); + + if (loc == maxlen) { + return loc; + } + + *(path + loc++) = '/'; + + loc += myStrncpy(path + loc, name, maxlen - loc); + + return loc; +} + +static BOOL DVDConvertEntrynumToPath(s32 entrynum, char* path, u32 maxlen) { + u32 loc; + + loc = entryToPath((u32)entrynum, path, maxlen); + + if (loc == maxlen) { + path[maxlen - 1] = '\0'; + return FALSE; + } + + if (entryIsDir(entrynum)) { + if (loc == maxlen - 1) { + path[loc] = '\0'; + return FALSE; + } + + path[loc++] = '/'; + } + + path[loc] = '\0'; + return TRUE; +} + +BOOL DVDGetCurrentDir(char* path, u32 maxlen) { + return DVDConvertEntrynumToPath((s32)currentDirectory, path, maxlen); +} + +BOOL DVDChangeDir(char* dirName) { + s32 entry; + entry = DVDConvertPathToEntrynum(dirName); + if ((entry < 0) || (entryIsDir(entry) == FALSE)) { + return FALSE; + } + + currentDirectory = (u32)entry; + + return TRUE; +} + +BOOL DVDReadAsyncPrio(DVDFileInfo* fileInfo, void* addr, s32 length, s32 offset, + DVDCallback callback, s32 prio) { + + if (!((0 <= offset) && (offset < fileInfo->length))) { + OSPanic(__FILE__, 739, "DVDReadAsync(): specified area is out of the file "); + } + + if (!((0 <= offset + length) && (offset + length < fileInfo->length + DVD_MIN_TRANSFER_SIZE))) { + OSPanic(__FILE__, 745, "DVDReadAsync(): specified area is out of the file "); + } + + fileInfo->callback = callback; + DVDReadAbsAsyncPrio(&(fileInfo->cb), addr, length, (s32)(fileInfo->startAddr + offset), + cbForReadAsync, prio); + + return TRUE; +} +#ifndef offsetof +#define offsetof(type, memb) ((u32) & ((type*)0)->memb) +#endif + +static void cbForReadAsync(s32 result, DVDCommandBlock* block) { + DVDFileInfo* fileInfo; + + fileInfo = (DVDFileInfo*)((char*)block - offsetof(DVDFileInfo, cb)); + if (fileInfo->callback) { + (fileInfo->callback)(result, fileInfo); + } +} + +/* This is based on the revolution SDK, these may not match in all cases I have also left the line numbers at 0 */ +BOOL DVDReadPrio(DVDFileInfo* fileInfo, void* addr, s32 length, s32 offset, s32 prio) { + BOOL result; + DVDCommandBlock* block; + s32 state; + BOOL enabled; + s32 retVal; + + if (!((0 <= offset) && (offset < fileInfo->length))) { + OSPanic(__FILE__, 809, "DVDRead(): specified area is out of the file "); + } + + if (!((0 <= offset + length) && (offset + length < fileInfo->length + DVD_MIN_TRANSFER_SIZE))) { + OSPanic(__FILE__, 815, "DVDRead(): specified area is out of the file "); + } + + block = &(fileInfo->cb); + + result = DVDReadAbsAsyncPrio(block, addr, length, (s32)(fileInfo->startAddr + offset), + cbForReadSync, prio); + + if (result == FALSE) { + return -1; + } + + enabled = OSDisableInterrupts(); + + while(1) { + state = ((volatile DVDCommandBlock*)block)->state; + + if (state == DVD_STATE_END) { + retVal = (s32)block->transferredSize; + break; + } + if (state == DVD_STATE_FATAL_ERROR) { + retVal = DVD_RESULT_FATAL_ERROR; + break; + } + if (state == DVD_STATE_CANCELED) { + retVal = DVD_RESULT_CANCELED; + break; + } + + OSSleepThread(&__DVDThreadQueue); + } + + OSRestoreInterrupts(enabled); + return retVal; +} + +/* This is based on the revolution SDK, these may not match in all cases */ +static void cbForReadSync(s32 result, DVDCommandBlock* block) { OSWakeupThread(&__DVDThreadQueue); } \ No newline at end of file diff --git a/src/dolphin/dvd/dvdlow.c b/src/dolphin/dvd/dvdlow.c new file mode 100644 index 00000000..9b64c91a --- /dev/null +++ b/src/dolphin/dvd/dvdlow.c @@ -0,0 +1,436 @@ +#include "dolphin/DVDPriv.h" +#include "dolphin/os.h" + +extern DVDDiskID* DVDGetCurrentDiskID(); + +extern OSTime __OSGetSystemTime(); + +static BOOL FirstRead = TRUE; +static volatile BOOL StopAtNextInt = FALSE; +static u32 LastLength = 0; +static DVDLowCallback Callback = NULL; +static DVDLowCallback ResetCoverCallback = NULL; +static volatile OSTime LastResetEnd = 0; +static volatile u32 ResetOccurred = FALSE; +static volatile BOOL WaitingCoverClose = FALSE; +static BOOL Breaking = FALSE; +static volatile u32 WorkAroundType = 0; +static u32 WorkAroundSeekLocation = 0; +static volatile OSTime LastReadFinished = 0; +static OSTime LastReadIssued = 0; +static volatile BOOL LastCommandWasRead = FALSE; +static vu32 NextCommandNumber = 0; + +typedef struct DVDBuffer { + void* addr; + u32 length; + u32 offset; +} DVDBuffer; + +typedef struct DVDCommand { + s32 cmd; + void* addr; + u32 length; + u32 offset; + DVDLowCallback callback; +} DVDCommand; + +static DVDCommand CommandList[3]; +static OSAlarm AlarmForWA; +static OSAlarm AlarmForTimeout; +static OSAlarm AlarmForBreak; +static DVDBuffer Prev; +static DVDBuffer Curr; + +void __DVDInitWA() { + NextCommandNumber = 0; + CommandList[0].cmd = -1; + __DVDLowSetWAType(0, 0); + OSInitAlarm(); +} + +static void Read(void* addr, u32 length, u32 offset, DVDLowCallback callback); + +static BOOL ProcessNextCommand() { + s32 n = NextCommandNumber; + ASSERT(n < 3); + + if (CommandList[n].cmd == 1) { + ++NextCommandNumber; + Read(CommandList[n].addr, CommandList[n].length, CommandList[n].offset, + CommandList[n].callback); + return TRUE; + } else if (CommandList[n].cmd == 2) { + ++NextCommandNumber; + DVDLowSeek(CommandList[n].offset, CommandList[n].callback); + return TRUE; + } + + return FALSE; +} + +void __DVDInterruptHandler(__OSInterrupt interrupt, OSContext* context) { + DVDLowCallback cb; + OSContext exceptionContext; + u32 cause = 0; + u32 reg; + u32 intr; + u32 mask; + + OSCancelAlarm(&AlarmForTimeout); + + if (LastCommandWasRead) { + LastReadFinished = __OSGetSystemTime(); + FirstRead = FALSE; + Prev.addr = Curr.addr; + Prev.length = Curr.length; + Prev.offset = Curr.offset; + if (StopAtNextInt == TRUE) { + cause |= 8; + } + } + + LastCommandWasRead = FALSE; + StopAtNextInt = FALSE; + reg = __DIRegs[0]; + mask = reg & 0x2a; + intr = (reg & 0x54) & (mask << 1); + + if (intr & 0x40) { + cause |= 8; + } + + if (intr & 0x10) { + cause |= 1; + } + + if (intr & 4) { + cause |= 2; + } + + if (cause) { + ResetOccurred = FALSE; + + } + + __DIRegs[0] = intr | mask; + + if (ResetOccurred && (__OSGetSystemTime() - LastResetEnd) < OSMillisecondsToTicks(200)) { + reg = __DIRegs[1]; + mask = reg & 0x2; + intr = (reg & 4) & (mask << 1); + if (intr & 4) { + if (ResetCoverCallback) { + ResetCoverCallback(4); + } + ResetCoverCallback = NULL; + } + + __DIRegs[1] = __DIRegs[1]; + } else if (WaitingCoverClose) { + reg = __DIRegs[1]; + mask = reg & 2; + intr = (reg & 4) & (mask << 1); + + if (intr & 4) { + cause |= 4; + } + + __DIRegs[1] = intr | mask; + WaitingCoverClose = FALSE; + } else { + __DIRegs[1] = 0; + } + + if ((cause & 8) && !Breaking) { + cause &= ~8; + } + + if ((cause & 1)) { + if (ProcessNextCommand()) { + return; + } + } else { + CommandList[0].cmd = -1; + NextCommandNumber = 0; + } + + OSClearContext(&exceptionContext); + OSSetCurrentContext(&exceptionContext); + + if (cause) { + cb = Callback; + Callback = NULL; + if (cb) { + cb(cause); + } + + Breaking = FALSE; + } + + OSClearContext(&exceptionContext); + OSSetCurrentContext(context); +} + +static void AlarmHandler(OSAlarm* alarm, OSContext* context) { + BOOL error = ProcessNextCommand(); + ASSERTMSG(error != FALSE, "Failed assertion processed"); +} + +static void AlarmHandlerForTimeout(OSAlarm* alarm, OSContext* context) { + OSContext tmpContext; + DVDLowCallback callback; + __OSMaskInterrupts(0x400); + OSClearContext(&tmpContext); + OSSetCurrentContext(&tmpContext); + callback = Callback; + Callback = NULL; + if (callback != NULL) { + callback(0x10); + } + OSClearContext(&tmpContext); + OSSetCurrentContext(context); +} + +static void SetTimeoutAlarm(OSTime timeout) { + OSCreateAlarm(&AlarmForTimeout); + OSSetAlarm(&AlarmForTimeout, timeout, AlarmHandlerForTimeout); +} + +static void Read(void* addr, u32 length, u32 offset, DVDLowCallback callback) { + StopAtNextInt = FALSE; + LastCommandWasRead = TRUE; + Callback = callback; + LastReadIssued = __OSGetSystemTime(); + + __DIRegs[2] = 0xa8000000; + __DIRegs[3] = offset / 4; + __DIRegs[4] = length; + __DIRegs[5] = (u32)addr; + __DIRegs[6] = length; + LastLength = length; + __DIRegs[7] = 3; + + if (length > 0xa00000) { + SetTimeoutAlarm(OSSecondsToTicks(20)); + } else { + SetTimeoutAlarm(OSSecondsToTicks(10)); + } +} + +BOOL HitCache(DVDBuffer* cur, DVDBuffer* prev) { + u32 uVar1 = (prev->offset + prev->length - 1) >> 15; + u32 uVar2 = (cur->offset >> 15); + u32 iVar3 = (DVDGetCurrentDiskID()->streaming ? TRUE : FALSE) ? 5 : 15; + + if ((uVar2 > uVar1 - 2) || (uVar2 < uVar1 + iVar3 + 3)) { + return TRUE; + } + return FALSE; +} + +static void DoJustRead(void* addr, u32 length, u32 offset, DVDLowCallback callback) { + CommandList[0].cmd = -1; + NextCommandNumber = 0; + Read(addr, length, offset, callback); +} + +static void SeekTwiceBeforeRead(void* addr, u32 length, u32 offset, DVDLowCallback callback) { + u32 newOffset = offset & ~0x7FFF; + if (!newOffset) { + newOffset = 0; + } else { + newOffset += WorkAroundSeekLocation; + } + CommandList[0].cmd = 2; + CommandList[0].offset = newOffset; + CommandList[0].callback = callback; + CommandList[1].cmd = 1; + CommandList[1].addr = addr; + CommandList[1].length = length; + CommandList[1].offset = offset; + CommandList[1].callback = callback; + CommandList[2].cmd = -1; + NextCommandNumber = 0; + DVDLowSeek(newOffset, callback); +} + +static void WaitBeforeRead(void* addr, u32 length, u32 offset, DVDLowCallback callback, + OSTime timeout) { + CommandList[0].cmd = 1; + CommandList[0].addr = addr; + CommandList[0].length = length; + CommandList[0].offset = offset; + CommandList[0].callback = callback; + CommandList[1].cmd = -1; + NextCommandNumber = 0; + OSCreateAlarm(&AlarmForWA); + OSSetAlarm(&AlarmForWA, timeout, AlarmHandler); +} + + +BOOL DVDLowRead(void* addr, u32 length, u32 offset, DVDLowCallback callback) { + OSTime diff; + u32 prev; + + __DIRegs[6] = length; + Curr.addr = addr; + Curr.length = length; + Curr.offset = offset; + + if (WorkAroundType == 0) { + DoJustRead(addr, length, offset, callback); + } else if (WorkAroundType == 1) { + if (FirstRead) { + SeekTwiceBeforeRead(addr, length, offset, callback); + } else { + if (!HitCache(&Curr, &Prev)) { + DoJustRead(addr, length, offset, callback); + } else { + prev = (Prev.offset + Prev.length - 1) >> 15; + if (prev == Curr.offset >> 15 || prev + 1 == Curr.offset >> 15) { + diff = __OSGetSystemTime() - LastReadFinished; + if (OSMillisecondsToTicks(5) < diff) { + DoJustRead(addr, length, offset, callback); + } else { + WaitBeforeRead(addr, length, offset, callback, + OSMillisecondsToTicks(5) - diff + OSMicrosecondsToTicks(500)); + } + } else { + SeekTwiceBeforeRead(addr, length, offset, callback); + } + } + } + } + return TRUE; +} + +BOOL DVDLowSeek(u32 offset, DVDLowCallback callback) { + ASSERTMSG(offset & 3, "DVDLowSeek(): offset must be a multiple of 4."); + StopAtNextInt = FALSE; + Callback = callback; + __DIRegs[2] = 0xab000000; + __DIRegs[3] = offset / 4; + __DIRegs[7] = 1; + SetTimeoutAlarm(OSSecondsToTicks(10)); + return TRUE; +} + +BOOL DVDLowWaitCoverClose(DVDLowCallback callback) { + Callback = callback; + WaitingCoverClose = TRUE; + StopAtNextInt = FALSE; + __DIRegs[1] = 2; + return TRUE; +} + +BOOL DVDLowReadDiskID(DVDDiskID* diskID, DVDLowCallback callback) { + StopAtNextInt = FALSE; + Callback = callback; + __DIRegs[2] = 0xa8000040; + __DIRegs[3] = 0; + __DIRegs[4] = sizeof(DVDDiskID); + __DIRegs[5] = (u32)diskID; + __DIRegs[6] = sizeof(DVDDiskID); + __DIRegs[7] = 3; + SetTimeoutAlarm(OSSecondsToTicks(10)); + return TRUE; +} + +BOOL DVDLowStopMotor(DVDLowCallback callback) { + StopAtNextInt = FALSE; + Callback = callback; + __DIRegs[2] = 0xe3000000; + __DIRegs[7] = 1; + SetTimeoutAlarm(OSSecondsToTicks(10)); + return TRUE; +} + +BOOL DVDLowRequestError(DVDLowCallback callback) { + StopAtNextInt = FALSE; + Callback = callback; + __DIRegs[2] = 0xe0000000; + __DIRegs[7] = 1; + SetTimeoutAlarm(OSSecondsToTicks(10)); + return TRUE; +} + +BOOL DVDLowInquiry(DVDDriveInfo* info, DVDLowCallback callback) { + StopAtNextInt = FALSE; + Callback = callback; + __DIRegs[2] = 0x12000000; + __DIRegs[4] = sizeof(DVDDriveInfo); + __DIRegs[5] = (u32)info; + __DIRegs[6] = sizeof(DVDDriveInfo); + __DIRegs[7] = 3; + SetTimeoutAlarm(OSSecondsToTicks(10)); + return TRUE; +} + +BOOL DVDLowAudioStream(u32 subcmd, u32 length, u32 offset, DVDLowCallback callback) { + StopAtNextInt = FALSE; + Callback = callback; + __DIRegs[2] = subcmd | 0xe1000000; + __DIRegs[3] = offset >> 2; + __DIRegs[4] = length; + __DIRegs[7] = 1; + SetTimeoutAlarm(OSSecondsToTicks(10)); + return TRUE; +} + +BOOL DVDLowRequestAudioStatus(u32 subcmd, DVDLowCallback callback) { + StopAtNextInt = FALSE; + Callback = callback; + __DIRegs[2] = subcmd | 0xe2000000; + __DIRegs[7] = 1; + SetTimeoutAlarm(OSSecondsToTicks(10)); + return TRUE; +} + +BOOL DVDLowAudioBufferConfig(BOOL enable, u32 size, DVDLowCallback callback) { + StopAtNextInt = FALSE; + Callback = callback; + __DIRegs[2] = 0xe4000000 | (enable != 0 ? 0x10000 : 0) | size; + __DIRegs[7] = 1; + SetTimeoutAlarm(OSSecondsToTicks(10)); + return TRUE; +} + +void DVDLowReset() { + u32 reg; + OSTime resetStart; + + __DIRegs[1] = 2; + reg = __PIRegs[9]; + __PIRegs[9] = (reg & ~4) | 1; + + resetStart = __OSGetSystemTime(); + while ((__OSGetSystemTime() - resetStart) < OSMicrosecondsToTicks(12)) + ; + + __PIRegs[9] = reg | 5; + ResetOccurred = TRUE; + LastResetEnd = __OSGetSystemTime(); +} + +BOOL DVDLowBreak() { + StopAtNextInt = TRUE; + Breaking = TRUE; + return TRUE; +} + +DVDLowCallback DVDLowClearCallback() { + DVDLowCallback old; + __DIRegs[1] = 0; + old = Callback; + Callback = NULL; + return old; +} + +void __DVDLowSetWAType(u32 type, u32 location) { + BOOL enabled; + enabled = OSDisableInterrupts(); + WorkAroundType = type; + WorkAroundSeekLocation = location; + OSRestoreInterrupts(enabled); +} \ No newline at end of file diff --git a/src/dolphin/dvd/dvdqueue.c b/src/dolphin/dvd/dvdqueue.c new file mode 100644 index 00000000..445ae7e7 --- /dev/null +++ b/src/dolphin/dvd/dvdqueue.c @@ -0,0 +1,142 @@ +#include "dolphin/DVDPriv.h" + +#define MAX_QUEUES 4 +typedef struct { + DVDCommandBlock* next; + DVDCommandBlock* prev; +} DVDQueue; + +static DVDQueue WaitingQueue[MAX_QUEUES]; + +void __DVDClearWaitingQueue(void) { + u32 i; + + for (i = 0; i < MAX_QUEUES; i++) { + DVDCommandBlock* q; + + q = (DVDCommandBlock*)&(WaitingQueue[i]); + q->next = q; + q->prev = q; + } +} + +BOOL __DVDPushWaitingQueue(s32 prio, DVDCommandBlock* block) { + BOOL enabled; + DVDCommandBlock* q; + + enabled = OSDisableInterrupts(); + + q = (DVDCommandBlock*)&(WaitingQueue[prio]); + + q->prev->next = block; + block->prev = q->prev; + block->next = q; + q->prev = block; + + OSRestoreInterrupts(enabled); + + return TRUE; +} + +static DVDCommandBlock* PopWaitingQueuePrio(s32 prio) { + DVDCommandBlock* tmp; + BOOL enabled; + DVDCommandBlock* q; + + enabled = OSDisableInterrupts(); + + q = (DVDCommandBlock*)&(WaitingQueue[prio]); + + tmp = q->next; + q->next = tmp->next; + tmp->next->prev = q; + + OSRestoreInterrupts(enabled); + + tmp->next = (DVDCommandBlock*)NULL; + tmp->prev = (DVDCommandBlock*)NULL; + + return tmp; +} + +DVDCommandBlock* __DVDPopWaitingQueue(void) { + u32 i; + BOOL enabled; + DVDCommandBlock* q; + + enabled = OSDisableInterrupts(); + + for (i = 0; i < MAX_QUEUES; i++) { + q = (DVDCommandBlock*)&(WaitingQueue[i]); + if (q->next != q) { + OSRestoreInterrupts(enabled); + return PopWaitingQueuePrio((s32)i); + } + } + + OSRestoreInterrupts(enabled); + + return (DVDCommandBlock*)NULL; +} + +BOOL __DVDCheckWaitingQueue(void) { + u32 i; + BOOL enabled; + DVDCommandBlock* q; + + enabled = OSDisableInterrupts(); + + for (i = 0; i < MAX_QUEUES; i++) { + q = (DVDCommandBlock*)&(WaitingQueue[i]); + if (q->next != q) { + OSRestoreInterrupts(enabled); + return TRUE; + } + } + + OSRestoreInterrupts(enabled); + + return FALSE; +} + +BOOL __DVDDequeueWaitingQueue(DVDCommandBlock* block) { + BOOL enabled; + DVDCommandBlock* prev; + DVDCommandBlock* next; + + enabled = OSDisableInterrupts(); + + prev = block->prev; + next = block->next; + + if ((prev == (DVDCommandBlock*)NULL) || (next == (DVDCommandBlock*)NULL)) { + OSRestoreInterrupts(enabled); + return FALSE; + } + + prev->next = next; + next->prev = prev; + + OSRestoreInterrupts(enabled); + + return TRUE; +} + +BOOL __DVDIsBlockInWaitingQueue(DVDCommandBlock* block) { + u32 i; + DVDCommandBlock* start; + DVDCommandBlock* q; + + for (i = 0; i < MAX_QUEUES; i++) { + start = (DVDCommandBlock*)&(WaitingQueue[i]); + + if (start->next != start) { + for (q = start->next; q != start; q = q->next) { + if (q == block) + return TRUE; + } + } + } + + return FALSE; +} \ No newline at end of file diff --git a/src/dolphin/dvd/fstload.c b/src/dolphin/dvd/fstload.c new file mode 100644 index 00000000..fd127c61 --- /dev/null +++ b/src/dolphin/dvd/fstload.c @@ -0,0 +1,68 @@ + +#include +#include +#include +#include +#include +#include + +static s32 status = 0; + +static u8 bb2Buf[OSRoundUp32B(sizeof(DVDBB2)) + 31]; +static DVDBB2* bb2 = 0; +static DVDDiskID* idTmp = NULL; + +static void cb(s32 result, DVDCommandBlock* block) { + if (result > 0) { + switch (status) { + case 0: + status = 1; + DVDReadAbsAsyncForBS(block, bb2, OSRoundUp32B(sizeof(bb2)), 0x420, cb); + break; + case 1: + status = 2; + DVDReadAbsAsyncForBS(block, bb2->FSTAddress, OSRoundUp32B(bb2->FSTLength), bb2->FSTPosition, + cb); + } + } else if (result == -1) { + + } else if (result == -4) { + status = 0; + DVDReset(); + DVDReadDiskID(block, idTmp, cb); + } +} + +void __fstLoad() { + OSBootInfo* bootInfo; + DVDDiskID* id; + u8 idTmpBuf[sizeof(DVDDiskID) + 31]; + static DVDCommandBlock block; + void* arenaHi; + + arenaHi = OSGetArenaHi(); + bootInfo = (OSBootInfo*)OSPhysicalToCached(0); + + idTmp = (DVDDiskID*)(OSRoundUp32B(idTmpBuf)); + bb2 = (DVDBB2*)(OSRoundUp32B(bb2Buf)); + + DVDReset(); + DVDReadDiskID(&block, idTmp, cb); + while (DVDGetDriveStatus() != 0); + + bootInfo->FSTLocation = bb2->FSTAddress; + bootInfo->FSTMaxLength = bb2->FSTMaxLength; + + id = &bootInfo->DVDDiskID; + + memcpy(id, idTmp, sizeof(DVDDiskID)); + OSReport("\n"); + OSReport(" Game Name ... %c%c%c%c\n", id->gameName[0], id->gameName[1], id->gameName[2], + id->gameName[3]); + OSReport(" Company ..... %c%c\n", id->company[0], id->company[1]); + OSReport(" Disk # ...... %d\n", id->diskNumber); + OSReport(" Game ver .... %d\n", id->gameVersion); + OSReport(" Streaming ... %s\n", (id->streaming == 0) ? "OFF" : "ON"); + OSReport("\n"); + OSSetArenaHi(bb2->FSTAddress); +} From 6dfc6da0e46ad425e812ccfe32187f28a9cd41b1 Mon Sep 17 00:00:00 2001 From: dbalatoni13 Date: Mon, 11 Nov 2024 01:43:35 +0100 Subject: [PATCH 11/29] Nearly linked dolphin/dvd.c --- include/dolphin/os/OSAlarm.h | 1 + src/dolphin/dvd/dvd.c | 1466 ++++++++++++++++++++++++++++++++++ 2 files changed, 1467 insertions(+) create mode 100644 src/dolphin/dvd/dvd.c diff --git a/include/dolphin/os/OSAlarm.h b/include/dolphin/os/OSAlarm.h index a0c9d380..497b4a44 100644 --- a/include/dolphin/os/OSAlarm.h +++ b/include/dolphin/os/OSAlarm.h @@ -1,6 +1,7 @@ #ifndef _DOLPHIN_OSALARM #define _DOLPHIN_OSALARM +#include #include #include diff --git a/src/dolphin/dvd/dvd.c b/src/dolphin/dvd/dvd.c new file mode 100644 index 00000000..9253df47 --- /dev/null +++ b/src/dolphin/dvd/dvd.c @@ -0,0 +1,1466 @@ +#include "dolphin/os/OSAlarm.h" +#include +#include +#include +#include +#include + +typedef void (*stateFunc)(DVDCommandBlock *block); +stateFunc LastState; + +extern OSThreadQueue __DVDThreadQueue; + +static u8 tmpBuffer[0x80] ATTRIBUTE_ALIGN(32); +static DVDCommandBlock *executing; +static DVDDiskID *currID; +static OSBootInfo *bootInfo; +static BOOL autoInvalidation = TRUE; +static volatile BOOL PauseFlag = FALSE; +static volatile BOOL PausingFlag = FALSE; +static volatile BOOL AutoFinishing = FALSE; +static volatile BOOL FatalErrorFlag = FALSE; +static vu32 CurrCommand; +static vu32 Canceling = FALSE; +static DVDCBCallback CancelCallback; +static vu32 ResumeFromHere = 0; +static vu32 CancelLastError; +static vu32 LastError; +static vs32 NumInternalRetry = 0; +static volatile BOOL ResetRequired; +static volatile BOOL CancelAllSyncComplete = FALSE; +static volatile BOOL FirstTimeInBootrom = FALSE; + +static DVDCommandBlock DummyCommandBlock; +static OSAlarm ResetAlarm; + +static BOOL DVDInitialized = FALSE; + +/* States */ +static void stateReadingFST(); +static void stateTimeout(); +static void stateGettingError(); +static void stateGoToRetry(); +static void stateCheckID(); +static void stateCheckID3(); +static void stateCheckID2a(); +static void stateCheckID2(); +static void stateCoverClosed(); +static void stateCoverClosed_CMD(); +static void stateCoverOpen(); +static void stateMotorStopped(); +static void stateReady(); +static void stateBusy(); + +/* Callbacks */ +static void cbForStateReadingFST(u32 intType); +static void cbForStateError(u32 intType); +static void cbForStateGettingError(u32 intType); +static void cbForUnrecoveredError(u32 intType); +static void cbForUnrecoveredErrorRetry(u32 intType); +static void cbForStateGoToRetry(u32 intType); +static void cbForStateCheckID2a(u32 intType); +static void cbForStateCheckID1(u32 intType); +static void cbForStateCheckID2(u32 intType); +static void cbForStateCheckID3(u32 intType); +static void cbForStateCoverClosed(u32 intType); +static void cbForStateMotorStopped(u32 intType); +static void cbForStateBusy(u32 intType); +static void cbForCancelStreamSync(s32 result, DVDCommandBlock *block); +static void cbForCancelSync(s32 result, DVDCommandBlock *block); +static void cbForCancelAllSync(s32 result, DVDCommandBlock *block); + +static void defaultOptionalCommandChecker(DVDCommandBlock *block, DVDLowCallback cb); + +static DVDOptionalCommandChecker checkOptionalCommand = defaultOptionalCommandChecker; + +extern void __DVDInterruptHandler(__OSInterrupt interrupt, OSContext *context); + +static void defaultOptionalCommandChecker(DVDCommandBlock *block, DVDLowCallback cb) { } + +void DVDInit() +{ + if (DVDInitialized) { + return; + } + + OSInitAlarm(); + DVDInitialized = TRUE; + __DVDFSInit(); + __DVDClearWaitingQueue(); + __DVDInitWA(); + bootInfo = (OSBootInfo *)OSPhysicalToCached(0x0000); + currID = &(bootInfo->DVDDiskID); + __OSSetInterruptHandler(21, __DVDInterruptHandler); + __OSUnmaskInterrupts(0x400); + OSInitThreadQueue(&__DVDThreadQueue); + __DIRegs[DI_STATUS] = 42; + __DIRegs[DI_COVER_STATUS] = 0; + if (bootInfo->magic == OS_BOOTINFO_MAGIC_JTAG) { + OSReport("app booted via JTAG\n"); + OSReport("load fst\n"); + __fstLoad(); + } + else if (bootInfo->magic == 0xD15EA5E) { + OSReport("app booted from bootrom\n"); + } + else { + FirstTimeInBootrom = TRUE; + OSReport("bootrom\n"); + } +} + +static void stateReadingFST() +{ + LastState = (stateFunc)stateReadingFST; + + DVDLowRead(bootInfo->FSTLocation, OSRoundUp32B(((u32 *)tmpBuffer)[2]), ((u32 *)tmpBuffer)[1], cbForStateReadingFST); +} + +static void cbForStateReadingFST(u32 intType) +{ + DVDCommandBlock *finished; + if (intType == 0x10) { + executing->state = -1; + stateTimeout(); + } + else if ((intType & 1) != 0) { + NumInternalRetry = 0; + finished = executing; + executing = &DummyCommandBlock; + finished->state = 0; + if (finished->callback) { + (finished->callback)(0, finished); + } + stateReady(); + } + else { + stateGettingError(); + } +} + +inline static void stateError(u32 error) +{ + __DVDStoreErrorCode(error); + DVDLowStopMotor(cbForStateError); +} + +static void cbForStateError(u32 intType) +{ + DVDCommandBlock *finished; + + if (intType == 16) { + executing->state = -1; + stateTimeout(); + return; + } + + FatalErrorFlag = TRUE; + finished = executing; + executing = &DummyCommandBlock; + if (finished->callback) { + (finished->callback)(-1, finished); + } + + if (Canceling) { + Canceling = FALSE; + if (CancelCallback) + (CancelCallback)(0, finished); + } + + stateReady(); + + return; +} + +static void stateTimeout() +{ + __DVDStoreErrorCode(0x1234568); + DVDReset(); + cbForStateError(0); +} + +static void stateGettingError() +{ + DVDLowRequestError(cbForStateGettingError); +} + +static u32 CategorizeError(u32 error) +{ + if (error == 0x20400) { + LastError = error; + return 1; + } + + error &= 0xffffff; + + if ((error == 0x62800) || (error == 0x23a00) || (error == 0xb5a01)) { + return 0; + } + + ++NumInternalRetry; + if (NumInternalRetry == 2) { + if (error == LastError) { + LastError = error; + return 1; + } + else { + LastError = error; + return 2; + } + } + else { + LastError = error; + + if ((error == 0x31100) || (executing->command == 5)) { + return 2; + } + else { + return 3; + } + } +} + +inline static BOOL CheckCancel(u32 resume) +{ + DVDCommandBlock *finished; + + if (Canceling) { + ResumeFromHere = resume; + Canceling = FALSE; + + finished = executing; + executing = &DummyCommandBlock; + + finished->state = 10; + if (finished->callback) + (*finished->callback)(-3, finished); + if (CancelCallback) + (CancelCallback)(0, finished); + stateReady(); + return TRUE; + } + return FALSE; +} + +static void cbForStateGettingError(u32 intType) +{ + u32 error; + u32 status; + u32 errorCategory; + u32 resume; + + if (intType == 16) { + executing->state = -1; + stateTimeout(); + return; + } + + if (intType & 2) { + executing->state = -1; + stateError(0x1234567); + return; + } + + error = __DIRegs[8]; + status = error & 0xff000000; + + errorCategory = CategorizeError(error); + + if (errorCategory == 1) { + executing->state = -1; + stateError(error); + return; + } + + if ((errorCategory == 2) || (errorCategory == 3)) { + resume = 0; + } + else { + if (status == 0x01000000) + resume = 4; + else if (status == 0x02000000) + resume = 6; + else if (status == 0x03000000) + resume = 3; + else + resume = 5; + } + + if (CheckCancel(resume)) + return; + + if (errorCategory == 2) { + __DVDStoreErrorCode(error); + stateGoToRetry(); + return; + } + + if (errorCategory == 3) { + if ((error & 0x00ffffff) == 0x00031100) { + DVDLowSeek(executing->offset, cbForUnrecoveredError); + } + else { + LastState(executing); + } + return; + } + + if (status == 0x01000000) { + executing->state = 5; + stateMotorStopped(); + return; + } + else if (status == 0x02000000) { + executing->state = 3; + stateCoverClosed(); + return; + } + else if (status == 0x03000000) { + executing->state = 4; + stateMotorStopped(); + return; + } + else { + executing->state = -1; + stateError(0x1234567); + return; + } +} + +static void cbForUnrecoveredError(u32 intType) +{ + if (intType == 16) { + executing->state = -1; + stateTimeout(); + return; + } + + if (intType & 1) { + stateGoToRetry(); + return; + } + + DVDLowRequestError(cbForUnrecoveredErrorRetry); +} + +static void cbForUnrecoveredErrorRetry(u32 intType) +{ + if (intType == 16) { + executing->state = -1; + stateTimeout(); + return; + } + executing->state = -1; + + if (intType & 2) { + __DVDStoreErrorCode(0x1234567); + DVDLowStopMotor(cbForStateError); + return; + } + + __DVDStoreErrorCode(__DIRegs[8]); + DVDLowStopMotor(cbForStateError); +} + +static void stateGoToRetry() +{ + DVDLowStopMotor(cbForStateGoToRetry); +} + +static void cbForStateGoToRetry(u32 intType) +{ + if (intType == 16) { + executing->state = -1; + stateTimeout(); + return; + } + + if (intType & 2) { + executing->state = -1; + stateError(0x1234567); + return; + } + + NumInternalRetry = 0; + + if ((CurrCommand == 4) || (CurrCommand == 5) || (CurrCommand == 13) || (CurrCommand == 15)) { + ResetRequired = TRUE; + } + + if (!CheckCancel(2)) { + executing->state = 11; + stateMotorStopped(); + } +} + +static void stateCheckID() +{ + switch (CurrCommand) { + case 3: + if (memcmp(tmpBuffer, executing->id, 0x1C) != FALSE) { + DVDLowStopMotor(cbForStateCheckID1); + } + else { + memcpy(currID, tmpBuffer, sizeof(DVDDiskID)); + executing->state = 1; + DCInvalidateRange(tmpBuffer, sizeof(DVDBB2)); + LastState = stateCheckID2; + stateCheckID2(executing); + } + break; + default: + if (memcmp(tmpBuffer, currID, sizeof(DVDDiskID)) != 0) { + DVDLowStopMotor(cbForStateCheckID1); + } + else { + LastState = stateCheckID3; + stateCheckID3(executing); + } + break; + } +} + +static void stateCheckID3() +{ + DVDLowAudioBufferConfig(currID->streaming, 10, cbForStateCheckID3); +} + +static void stateCheckID2a() +{ + DVDLowAudioBufferConfig(currID->streaming, 10, cbForStateCheckID2a); +} + +static void cbForStateCheckID2a(u32 intType) +{ + if (intType == 16) { + executing->state = -1; + stateTimeout(); + return; + } + + if (intType & 1) { + NumInternalRetry = 0; + stateCheckID2(executing); + return; + } + + DVDLowRequestError(cbForStateGettingError); +} + +static void stateCheckID2(DVDCommandBlock *block) +{ + DVDLowRead(tmpBuffer, OSRoundUp32B(sizeof(DVDBB2)), 0x420, cbForStateCheckID2); +} + +static void cbForStateCheckID1(u32 intType) +{ + if (intType == 16) { + executing->state = -1; + stateTimeout(); + return; + } + + if (intType & 2) { + executing->state = -1; + stateError(0x1234567); + return; + } + + NumInternalRetry = 0; + + if (!CheckCancel(1)) { + executing->state = 6; + stateMotorStopped(); + } +} + +static void cbForStateCheckID2(u32 intType) +{ + if (intType == 16) { + executing->state = -1; + stateTimeout(); + return; + } + + if (intType & 1) { + + NumInternalRetry = 0; + + stateReadingFST(); + } + else { + + stateGettingError(); + } +} + +static void cbForStateCheckID3(u32 intType) +{ + if (intType == 16) { + executing->state = -1; + stateTimeout(); + return; + } + + if (intType & 1) { + + NumInternalRetry = 0; + + if (!CheckCancel(0)) { + executing->state = 1; + stateBusy(executing); + } + } + else { + stateGettingError(); + } +} + +static void AlarmHandler(OSAlarm *alarm, OSContext *context) +{ + DVDReset(); + DCInvalidateRange(tmpBuffer, sizeof(DVDDiskID)); + LastState = stateCoverClosed_CMD; + stateCoverClosed_CMD(executing); +} + +static void stateCoverClosed() +{ + DVDCommandBlock *finished; + + switch (CurrCommand) { + case 5: + case 4: + case 13: + case 15: + __DVDClearWaitingQueue(); + finished = executing; + executing = &DummyCommandBlock; + if (finished->callback) { + (finished->callback)(-4, finished); + } + stateReady(); + break; + + default: + DVDReset(); + OSCreateAlarm(&ResetAlarm); + OSSetAlarm(&ResetAlarm, OSMillisecondsToTicks(1150), AlarmHandler); + break; + } +} + +static void stateCoverClosed_CMD(DVDCommandBlock *block) +{ + DVDLowReadDiskID(tmpBuffer, cbForStateCoverClosed); +} + +static void cbForStateCoverClosed(u32 intType) +{ + if (intType == 16) { + executing->state = -1; + stateTimeout(); + return; + } + + if (intType & 1) { + NumInternalRetry = 0; + stateCheckID(); + } + else { + stateGettingError(); + } +} + +static void stateMotorStopped(void) +{ + DVDLowWaitCoverClose(cbForStateMotorStopped); +} + +static void cbForStateMotorStopped(u32 intType) +{ + __DIRegs[1] = 0; + executing->state = 3; + stateCoverClosed(); +} + +void stateReady() +{ + DVDCommandBlock *finished; + + if (!__DVDCheckWaitingQueue()) { + executing = (DVDCommandBlock *)nullptr; + return; + } + + if (PauseFlag) { + PausingFlag = TRUE; + executing = (DVDCommandBlock *)nullptr; + return; + } + + executing = __DVDPopWaitingQueue(); + + if (FatalErrorFlag) { + executing->state = -1; + finished = executing; + executing = &DummyCommandBlock; + if (finished->callback) { + (finished->callback)(-1, finished); + } + stateReady(); + return; + } + + CurrCommand = executing->command; + + if (ResumeFromHere) { + switch (ResumeFromHere) { + case 1: + executing->state = 6; + stateMotorStopped(); + break; + + case 2: + executing->state = 11; + stateMotorStopped(); + break; + + case 3: + executing->state = 4; + stateMotorStopped(); + break; + + case 7: + executing->state = 7; + stateMotorStopped(); + break; + + case 4: + executing->state = 5; + stateMotorStopped(); + break; + + case 6: + executing->state = 3; + stateCoverClosed(); + break; + + case 5: + executing->state = -1; + stateError(CancelLastError); + break; + } + + ResumeFromHere = 0; + } + else { + executing->state = 1; + stateBusy(executing); + } +} + +#define MIN(a, b) (((a) > (b)) ? (b) : (a)) +static void stateBusy(DVDCommandBlock *block) +{ + DVDCommandBlock *finished; + LastState = stateBusy; + switch (block->command) { + case 5: + __DIRegs[1] = __DIRegs[1]; + block->currTransferSize = sizeof(DVDDiskID); + DVDLowReadDiskID(block->addr, cbForStateBusy); + break; + case 1: + case 4: + __DIRegs[1] = __DIRegs[1]; + block->currTransferSize = MIN(block->length - block->transferredSize, 0x80000); + DVDLowRead((void *)((u8 *)block->addr + block->transferredSize), block->currTransferSize, block->offset + block->transferredSize, + cbForStateBusy); + break; + case 2: + __DIRegs[1] = __DIRegs[1]; + DVDLowSeek(block->offset, cbForStateBusy); + break; + case 3: + DVDLowStopMotor(cbForStateBusy); + break; + case 15: + DVDLowStopMotor(cbForStateBusy); + break; + case 6: + __DIRegs[1] = __DIRegs[1]; + if (AutoFinishing) { + executing->currTransferSize = 0; + DVDLowRequestAudioStatus(0, cbForStateBusy); + } + else { + executing->currTransferSize = 1; + DVDLowAudioStream(0, block->length, block->offset, cbForStateBusy); + } + break; + case 7: + __DIRegs[1] = __DIRegs[1]; + DVDLowAudioStream(0x10000, 0, 0, cbForStateBusy); + break; + case 8: + __DIRegs[1] = __DIRegs[1]; + AutoFinishing = TRUE; + DVDLowAudioStream(0, 0, 0, cbForStateBusy); + break; + case 9: + __DIRegs[1] = __DIRegs[1]; + DVDLowRequestAudioStatus(0, cbForStateBusy); + break; + case 10: + __DIRegs[1] = __DIRegs[1]; + DVDLowRequestAudioStatus(0x10000, cbForStateBusy); + break; + case 11: + __DIRegs[1] = __DIRegs[1]; + DVDLowRequestAudioStatus(0x20000, cbForStateBusy); + break; + case 12: + __DIRegs[1] = __DIRegs[1]; + DVDLowRequestAudioStatus(0x30000, cbForStateBusy); + break; + case 13: + __DIRegs[1] = __DIRegs[1]; + DVDLowAudioBufferConfig(block->offset, block->length, cbForStateBusy); + break; + case 14: + __DIRegs[1] = __DIRegs[1]; + block->currTransferSize = sizeof(DVDDriveInfo); + DVDLowInquiry(block->addr, cbForStateBusy); + break; + } +} + +// removing these matches DVDCancelAsync and DVDCheckDisk +static u32 ImmCommand[] = { 0xffffffff, 0xffffffff, 0xffffffff }; +static u32 DmaCommand[] = { 0xffffffff }; + +inline static BOOL IsImmCommandWithResult(u32 command) +{ + u32 i; + + if (command == 9 || command == 10 || command == 11 || command == 12) { + return TRUE; + } + + for (i = 0; i < sizeof(ImmCommand) / sizeof(ImmCommand[0]); i++) { + if (command == ImmCommand[i]) + return TRUE; + } + + return FALSE; +} + +inline static BOOL IsDmaCommand(u32 command) +{ + u32 i; + + if (command == 1 || command == 4 || command == 5 || command == 14) + return TRUE; + + for (i = 0; i < sizeof(DmaCommand) / sizeof(DmaCommand[0]); i++) { + if (command == DmaCommand[i]) + return TRUE; + } + + return FALSE; +} + +void cbForStateBusy(u32 intType) +{ + DVDCommandBlock *finished; + + if (intType == 16) { + executing->state = -1; + stateTimeout(); + return; + } + + if ((CurrCommand == 3) || (CurrCommand == 15)) { + if (intType & 2) { + executing->state = -1; + stateError(0x1234567); + return; + } + + NumInternalRetry = 0; + + if (CurrCommand == 15) { + ResetRequired = TRUE; + } + + if (CheckCancel(7)) { + return; + } + + executing->state = 7; + stateMotorStopped(); + return; + } + + if ((CurrCommand == 1) || (CurrCommand == 4) || (CurrCommand == 5) || (CurrCommand == 14)) { + executing->transferredSize += executing->currTransferSize - __DIRegs[6]; + } + + if (intType & 8) { + Canceling = FALSE; + finished = executing; + executing = &DummyCommandBlock; + + finished->state = 10; + if (finished->callback) { + (*finished->callback)(-3, finished); + } + if (CancelCallback) { + (CancelCallback)(0, finished); + } + stateReady(); + + return; + } + + if (intType & 1) { + NumInternalRetry = 0; + + if (CheckCancel(0)) + return; + + if ((CurrCommand == 1) || (CurrCommand == 4) || (CurrCommand == 5) || (CurrCommand == 14)) { + if (executing->transferredSize != executing->length) { + stateBusy(executing); + return; + } + + finished = executing; + executing = &DummyCommandBlock; + + finished->state = 0; + if (finished->callback) { + (finished->callback)((s32)finished->transferredSize, finished); + } + stateReady(); + } + else if ((CurrCommand == 9) || (CurrCommand == 10) || (CurrCommand == 11) || (CurrCommand == 12)) { + s32 result; + + if ((CurrCommand == 11) || (CurrCommand == 10)) { + result = (s32)(__DIRegs[DI_MM_BUF] << 2); + } + else { + result = (s32)__DIRegs[DI_MM_BUF]; + } + finished = executing; + executing = &DummyCommandBlock; + + finished->state = 0; + if (finished->callback) { + (finished->callback)(result, finished); + } + stateReady(); + } + else if (CurrCommand == 6) { + if (executing->currTransferSize == 0) { + if (__DIRegs[DI_MM_BUF] & 1) { + finished = executing; + executing = &DummyCommandBlock; + + finished->state = 9; + if (finished->callback) { + (finished->callback)(-2, finished); + } + stateReady(); + } + else { + AutoFinishing = FALSE; + executing->currTransferSize = 1; + DVDLowAudioStream(0, executing->length, executing->offset, cbForStateBusy); + } + } + else { + finished = executing; + executing = &DummyCommandBlock; + + finished->state = 0; + if (finished->callback) { + (finished->callback)(0, finished); + } + stateReady(); + } + } + else { + finished = executing; + executing = &DummyCommandBlock; + + finished->state = 0; + if (finished->callback) { + (finished->callback)(0, finished); + } + stateReady(); + } + } + else { + if (CurrCommand == 14) { + executing->state = -1; + stateError(0x01234567); + return; + } + + if ((CurrCommand == 1 || CurrCommand == 4 || CurrCommand == 5 || CurrCommand == 14) && (executing->transferredSize == executing->length)) { + + if (CheckCancel(0)) { + return; + } + finished = executing; + executing = &DummyCommandBlock; + + finished->state = 0; + if (finished->callback) { + (finished->callback)((s32)finished->transferredSize, finished); + } + stateReady(); + return; + } + + stateGettingError(); + } +} + +static BOOL issueCommand(s32 prio, DVDCommandBlock *block) +{ + BOOL level; + BOOL result; + + if (autoInvalidation && (block->command == 1 || block->command == 4 || block->command == 5 || block->command == 14)) { + DCInvalidateRange(block->addr, block->length); + } + + level = OSDisableInterrupts(); + + block->state = 2; + result = __DVDPushWaitingQueue(prio, block); + + if ((executing == (DVDCommandBlock *)NULL) && (PauseFlag == FALSE)) { + stateReady(); + } + + OSRestoreInterrupts(level); + + return result; +} + +BOOL DVDReadAbsAsyncPrio(DVDCommandBlock *block, void *addr, s32 length, s32 offset, DVDCBCallback callback, s32 prio) +{ + BOOL idle; + block->command = 1; + block->addr = addr; + block->length = length; + block->offset = offset; + block->transferredSize = 0; + block->callback = callback; + + idle = issueCommand(prio, block); + return idle; +} +BOOL DVDReadAbsAsyncForBS(DVDCommandBlock *block, void *addr, s32 length, s32 offset, DVDCBCallback callback) +{ + BOOL idle; + block->command = 4; + block->addr = addr; + block->length = length; + block->offset = offset; + block->transferredSize = 0; + block->callback = callback; + + idle = issueCommand(2, block); + return idle; +} +BOOL DVDReadDiskID(DVDCommandBlock *block, DVDDiskID *diskID, DVDCBCallback callback) +{ + BOOL idle; + block->command = 5; + block->addr = diskID; + block->length = sizeof(DVDDiskID); + ; + block->offset = 0; + block->transferredSize = 0; + block->callback = callback; + + idle = issueCommand(2, block); + return idle; +} +BOOL DVDPrepareStreamAbsAsync(DVDCommandBlock *block, u32 length, u32 offset, DVDCBCallback callback) +{ + BOOL idle; + block->command = 6; + block->length = length; + block->offset = offset; + block->callback = callback; + + idle = issueCommand(1, block); + return idle; +} +BOOL DVDCancelStreamAsync(DVDCommandBlock *block, DVDCBCallback callback) +{ + BOOL idle; + block->command = 7; + block->callback = callback; + idle = issueCommand(1, block); + return idle; +} +s32 DVDCancelStream(DVDCommandBlock *block) +{ + BOOL result; + s32 state; + BOOL enabled; + s32 retVal; + + result = DVDCancelStreamAsync(block, cbForCancelStreamSync); + + if (result == FALSE) { + return -1; + } + + enabled = OSDisableInterrupts(); + + while (TRUE) { + state = ((volatile DVDCommandBlock *)block)->state; + + if (state == 0 || state == -1 || state == 10) { + retVal = (s32)block->transferredSize; + break; + } + + OSSleepThread(&__DVDThreadQueue); + } + + OSRestoreInterrupts(enabled); + return retVal; +} +static void cbForCancelStreamSync(s32 result, DVDCommandBlock *block) +{ + block->transferredSize = (u32)result; + OSWakeupThread(&__DVDThreadQueue); +} +BOOL DVDStopStreamAtEndAsync(DVDCommandBlock *block, DVDCBCallback callback) +{ + BOOL idle; + + block->command = 8; + block->callback = callback; + + idle = issueCommand(1, block); + + return idle; +} +BOOL DVDGetStreamErrorStatusAsync(DVDCommandBlock *block, DVDCBCallback callback) +{ + BOOL idle; + + block->command = 9; + block->callback = callback; + + idle = issueCommand(1, block); + + return idle; +} +BOOL DVDGetStreamPlayAddrAsync(DVDCommandBlock *block, DVDCBCallback callback) +{ + BOOL idle; + + block->command = 10; + block->callback = callback; + + idle = issueCommand(1, block); + + return idle; +} +BOOL DVDInquiryAsync(DVDCommandBlock *block, DVDDriveInfo *info, DVDCBCallback callback) +{ + BOOL idle; + + block->command = 14; + block->addr = (void *)info; + block->length = sizeof(DVDDriveInfo); + block->transferredSize = 0; + block->callback = callback; + + idle = issueCommand(2, block); + + return idle; +} + +void DVDReset(void) +{ + DVDLowReset(); + __DIRegs[0] = 0x2a; + __DIRegs[1] = __DIRegs[1]; + ResetRequired = FALSE; + ResumeFromHere = 0; +} + +s32 DVDGetCommandBlockStatus(const DVDCommandBlock *block) +{ + BOOL enabled; + s32 retVal; + + enabled = OSDisableInterrupts(); + + if (block->state == 3) { + retVal = 1; + } + else { + retVal = block->state; + } + + OSRestoreInterrupts(enabled); + + return retVal; +} + +s32 DVDGetDriveStatus() +{ + BOOL enabled; + s32 retVal; + + enabled = OSDisableInterrupts(); + + if (FatalErrorFlag) { + retVal = -1; + } + else if (PausingFlag) { + retVal = 8; + } + else { + if (executing == (DVDCommandBlock *)NULL) { + retVal = 0; + } + else if (executing == &DummyCommandBlock) { + retVal = 0; + } + else { + retVal = DVDGetCommandBlockStatus(executing); + } + } + + OSRestoreInterrupts(enabled); + + return retVal; +} + +BOOL DVDSetAutoInvalidation(BOOL autoInval) +{ + BOOL prev; + prev = autoInvalidation; + autoInvalidation = autoInval; + return prev; +} + +inline void DVDPause(void) +{ + BOOL level; + level = OSDisableInterrupts(); + PauseFlag = TRUE; + if (executing == (DVDCommandBlock *)NULL) { + PausingFlag = TRUE; + } + OSRestoreInterrupts(level); +} + +inline void DVDResume(void) +{ + BOOL level; + level = OSDisableInterrupts(); + PauseFlag = FALSE; + if (PausingFlag) { + PausingFlag = FALSE; + stateReady(); + } + OSRestoreInterrupts(level); +} + +BOOL DVDCancelAsync(DVDCommandBlock *block, DVDCBCallback callback) +{ + BOOL enabled; + DVDLowCallback old; + + enabled = OSDisableInterrupts(); + + switch (block->state) { + case -1: + case 0: + case 10: + if (callback) + (*callback)(0, block); + break; + + case 1: + if (Canceling) { + OSRestoreInterrupts(enabled); + return FALSE; + } + + Canceling = TRUE; + CancelCallback = callback; + if (block->command == 4 || block->command == 1) { + DVDLowBreak(); + } + break; + + case 2: + __DVDDequeueWaitingQueue(block); + block->state = 10; + if (block->callback) + (block->callback)(-3, block); + if (callback) + (*callback)(0, block); + break; + + case 3: + switch (block->command) { + case 5: + case 4: + case 13: + case 15: + if (callback) + (*callback)(0, block); + break; + + default: + if (Canceling) { + OSRestoreInterrupts(enabled); + return FALSE; + } + Canceling = TRUE; + CancelCallback = callback; + break; + } + break; + + case 4: + case 5: + case 6: + case 7: + case 11: + old = DVDLowClearCallback(); + if (old != cbForStateMotorStopped) { + OSRestoreInterrupts(enabled); + return FALSE; + } + + if (block->state == 4) + ResumeFromHere = 3; + if (block->state == 5) + ResumeFromHere = 4; + if (block->state == 6) + ResumeFromHere = 1; + if (block->state == 11) + ResumeFromHere = 2; + if (block->state == 7) + ResumeFromHere = 7; + + block->state = 10; + if (block->callback) { + (block->callback)(-3, block); + } + if (callback) { + (callback)(0, block); + } + stateReady(); + break; + } + + OSRestoreInterrupts(enabled); + return TRUE; +} + +s32 DVDCancel(DVDCommandBlock *block) +{ + BOOL result; + s32 state; + u32 command; + BOOL enabled; + + result = DVDCancelAsync(block, cbForCancelSync); + + if (result == FALSE) { + return -1; + } + + enabled = OSDisableInterrupts(); + + for (;;) { + state = ((volatile DVDCommandBlock *)block)->state; + + if ((state == 0) || (state == -1) || (state == 10)) { + break; + } + + if (state == 3) { + command = ((volatile DVDCommandBlock *)block)->command; + + if ((command == 4) || (command == 5) || (command == 13) || (command == 15)) { + break; + } + } + + OSSleepThread(&__DVDThreadQueue); + } + + OSRestoreInterrupts(enabled); + return 0; +} + +static void cbForCancelSync(s32 result, DVDCommandBlock *block) +{ + OSWakeupThread(&__DVDThreadQueue); +} + +inline BOOL DVDCancelAllAsync(DVDCBCallback callback) +{ + BOOL enabled; + DVDCommandBlock *p; + BOOL retVal; + + enabled = OSDisableInterrupts(); + DVDPause(); + + while ((p = __DVDPopWaitingQueue()) != 0) { + DVDCancelAsync(p, NULL); + } + + if (executing) + retVal = DVDCancelAsync(executing, callback); + else { + retVal = TRUE; + if (callback) + (*callback)(0, NULL); + } + + DVDResume(); + OSRestoreInterrupts(enabled); + return retVal; +} + +s32 DVDCancelAll(void) +{ + BOOL result; + BOOL enabled; + + enabled = OSDisableInterrupts(); + CancelAllSyncComplete = FALSE; + + result = DVDCancelAllAsync(cbForCancelAllSync); + + if (result == FALSE) { + OSRestoreInterrupts(enabled); + return -1; + } + + for (;;) { + if (CancelAllSyncComplete) + break; + + OSSleepThread(&__DVDThreadQueue); + } + + OSRestoreInterrupts(enabled); + return 0; +} + +static void cbForCancelAllSync(s32 result, DVDCommandBlock *block) +{ + CancelAllSyncComplete = TRUE; + OSWakeupThread(&__DVDThreadQueue); +} + +DVDDiskID *DVDGetCurrentDiskID(void) +{ + return (DVDDiskID *)OSPhysicalToCached(0); +} +BOOL DVDCheckDisk(void) +{ + BOOL enabled; + s32 retVal; + s32 state; + u32 coverReg; + + enabled = OSDisableInterrupts(); + + if (FatalErrorFlag) { + state = -1; + } + else if (PausingFlag) { + state = 8; + } + else { + if (executing == (DVDCommandBlock *)NULL) { + state = 0; + } + else if (executing == &DummyCommandBlock) { + state = 0; + } + else { + state = executing->state; + } + } + + switch (state) { + case 1: + case 9: + case 10: + case 2: + retVal = TRUE; + break; + + case -1: + case 11: + case 7: + case 3: + case 4: + case 5: + case 6: + retVal = FALSE; + break; + + case 0: + case 8: + coverReg = __DIRegs[1]; + if (((coverReg >> 2) & 1) || (coverReg & 1)) { + retVal = FALSE; + } + else { + retVal = TRUE; + } + } + + OSRestoreInterrupts(enabled); + + return retVal; +} + +void __DVDPrepareResetAsync(DVDCBCallback callback) +{ + BOOL enabled; + + enabled = OSDisableInterrupts(); + + __DVDClearWaitingQueue(); + + if (Canceling) { + CancelCallback = callback; + } + else { + if (executing) { + executing->callback = NULL; + } + + DVDCancelAllAsync(callback); + } + + OSRestoreInterrupts(enabled); +} From 4bbaec7455eabbb0f7b036f15dcae51027a77006 Mon Sep 17 00:00:00 2001 From: dbalatoni13 Date: Tue, 12 Nov 2024 00:08:39 +0100 Subject: [PATCH 12/29] Matched pad.c and a few mtx files --- config/GMPE01_00/rels/m420dll/symbols.txt | 4 +- config/GMPE01_00/splits.txt | 7 +- config/GMPE01_00/symbols.txt | 44 +- configure.py | 8 +- src/dolphin/mtx/mtx.c | 1315 +++++++++++++++++++++ src/dolphin/mtx/mtx44.c | 99 ++ src/dolphin/mtx/mtxvec.c | 146 +++ src/dolphin/mtx/psmtx.c | 355 ++++++ src/dolphin/mtx/quat.c | 80 ++ src/dolphin/mtx/vec.c | 287 +++++ src/dolphin/pad/Pad.c | 783 ++++++++++++ src/dolphin/pad/Padclamp.c | 119 ++ 12 files changed, 3216 insertions(+), 31 deletions(-) create mode 100644 src/dolphin/mtx/mtx.c create mode 100644 src/dolphin/mtx/mtx44.c create mode 100644 src/dolphin/mtx/mtxvec.c create mode 100644 src/dolphin/mtx/psmtx.c create mode 100644 src/dolphin/mtx/quat.c create mode 100644 src/dolphin/mtx/vec.c create mode 100644 src/dolphin/pad/Pad.c create mode 100644 src/dolphin/pad/Padclamp.c diff --git a/config/GMPE01_00/rels/m420dll/symbols.txt b/config/GMPE01_00/rels/m420dll/symbols.txt index 8e6b2a20..365355d3 100644 --- a/config/GMPE01_00/rels/m420dll/symbols.txt +++ b/config/GMPE01_00/rels/m420dll/symbols.txt @@ -207,9 +207,9 @@ lbl_1_data_0 = .data:0x00000000; // type:object size:0x1E scope:local data:strin lbl_1_data_1E = .data:0x0000001E; // type:object size:0x1E scope:local data:string lbl_1_data_3C = .data:0x0000003C; // type:object size:0x11 scope:local data:string lbl_1_data_50 = .data:0x00000050; // type:object size:0x80 -lbl_1_data_D0 = .data:0x000000D0; // type:object size:0x1B data:string +lbl_1_data_D0 = .data:0x000000D0; // type:object size:0x1B scope:local data:string lbl_1_data_EC = .data:0x000000EC; // type:object size:0x30 -lbl_1_data_11C = .data:0x0000011C; // type:object size:0x19 data:string +lbl_1_data_11C = .data:0x0000011C; // type:object size:0x19 scope:local data:string lbl_1_data_135 = .data:0x00000135; // type:object size:0x1 lbl_1_data_138 = .data:0x00000138; // type:object size:0x1C lbl_1_data_154 = .data:0x00000154; // type:object size:0x10 data:4byte diff --git a/config/GMPE01_00/splits.txt b/config/GMPE01_00/splits.txt index 7eefd3c3..6b38187f 100644 --- a/config/GMPE01_00/splits.txt +++ b/config/GMPE01_00/splits.txt @@ -680,12 +680,12 @@ dolphin/mtx/vec.c: .sdata2 start:0x801D6380 end:0x801D6390 dolphin/mtx/quat.c: - .text start:0x800BC2C4 end:0x800BC710 + .text start:0x800BC2C4 end:0x800BC884 .rodata start:0x8011E430 end:0x8011E440 .sdata2 start:0x801D6390 end:0x801D63B8 dolphin/mtx/psmtx.c: - .text start:0x800BC710 end:0x800BC9E8 + .text start:0x800BC884 end:0x800BC9E8 dolphin/dvd/dvdlow.c: .text start:0x800BC9E8 end:0x800BD83C @@ -742,7 +742,7 @@ dolphin/demo/DEMOPuts.c: dolphin/demo/DEMOStats.c: .text start:0x800C2F84 end:0x800C3CDC - .data start:0x8013D5E0 end:0x8013D748 + .data start:0x8013D5E0 end:0x8013D738 .sdata start:0x801D3908 end:0x801D3910 .sbss start:0x801D4488 end:0x801D44E8 .sdata2 start:0x801D63D8 end:0x801D63E8 @@ -753,6 +753,7 @@ dolphin/pad/Padclamp.c: dolphin/pad/Pad.c: .text start:0x800C3F14 end:0x800C59DC + .data start:0x8013D738 end:0x8013D748 .bss start:0x801A61B0 end:0x801A6200 .sdata start:0x801D3918 end:0x801D3938 .sbss start:0x801D44E8 end:0x801D4510 diff --git a/config/GMPE01_00/symbols.txt b/config/GMPE01_00/symbols.txt index 1c59588e..99198763 100644 --- a/config/GMPE01_00/symbols.txt +++ b/config/GMPE01_00/symbols.txt @@ -4345,10 +4345,10 @@ lbl_8013C2F0 = .data:0x8013C2F0; // type:object size:0x78 YearDays = .data:0x8013C368; // type:object size:0x30 scope:local LeapYearDays = .data:0x8013C398; // type:object size:0x30 scope:local lbl_8013C3C8 = .data:0x8013C3C8; // type:object size:0x18 scope:local data:string -lbl_8013C3E0 = .data:0x8013C3E0; // type:object size:0xC8 data:string -lbl_8013C4A8 = .data:0x8013C4A8; // type:object size:0x38 -lbl_8013C4E0 = .data:0x8013C4E0; // type:object size:0x34 data:string -lbl_8013C514 = .data:0x8013C514; // type:object size:0x34 +lbl_8013C3E0 = .data:0x8013C3E0; // type:object size:0xC8 scope:local data:string +lbl_8013C4A8 = .data:0x8013C4A8; // type:object size:0x38 scope:local +lbl_8013C4E0 = .data:0x8013C4E0; // type:object size:0x34 scope:local data:string +lbl_8013C514 = .data:0x8013C514; // type:object size:0x34 scope:local @13 = .data:0x8013C548; // type:object size:0x15 scope:local data:string @293 = .data:0x8013C594; // type:object size:0x20 scope:local jumptable_8013C5B4 = .data:0x8013C5B4; // type:object size:0x40 scope:local @@ -4373,7 +4373,7 @@ jumptable_8013D698 = .data:0x8013D698; // type:object size:0x28 scope:local jumptable_8013D6C0 = .data:0x8013D6C0; // type:object size:0x28 scope:local jumptable_8013D6E8 = .data:0x8013D6E8; // type:object size:0x28 scope:local jumptable_8013D710 = .data:0x8013D710; // type:object size:0x28 scope:local -lbl_8013D738 = .data:0x8013D738; // type:object size:0x10 +ResetFunctionInfo = .data:0x8013D738; // type:object size:0x10 lbl_8013D748 = .data:0x8013D748; // type:object size:0x38 lbl_8013D780 = .data:0x8013D780; // type:object size:0x140 jumptable_8013D8C0 = .data:0x8013D8C0; // type:object size:0x68 scope:local @@ -4976,8 +4976,8 @@ __OSArenaLo = .sdata:0x801D38C0; // type:object size:0x4 scope:local data:4byte @32 = .sdata:0x801D38C8; // type:object size:0x2 scope:local data:string fontEncode$80 = .sdata:0x801D38D0; // type:object size:0x8 scope:local data:2byte Unit01 = .sdata:0x801D38D8; // type:object size:0x8 -FirstRead = .sdata:0x801D38E0; // type:object size:0x8 scope:local data:4byte -lbl_801D38E8 = .sdata:0x801D38E8; // type:object size:0x8 data:string +FirstRead = .sdata:0x801D38E0; // type:object size:0x4 scope:local data:4byte +lbl_801D38E8 = .sdata:0x801D38E8; // type:object size:0x8 scope:local data:string autoInvalidation = .sdata:0x801D38F0; // type:object size:0x4 scope:local data:4byte @35 = .sdata:0x801D38F8; // type:object size:0x2 scope:local data:string @40 = .sdata:0x801D38FC; // type:object size:0x4 scope:local data:string @@ -7284,21 +7284,21 @@ lbl_801D6338 = .sdata2:0x801D6338; // type:object size:0x4 data:float lbl_801D633C = .sdata2:0x801D633C; // type:object size:0x4 data:float lbl_801D6340 = .sdata2:0x801D6340; // type:object size:0x8 data:double lbl_801D6348 = .sdata2:0x801D6348; // type:object size:0x8 data:float -lbl_801D6350 = .sdata2:0x801D6350; // type:object size:0x4 data:float -lbl_801D6354 = .sdata2:0x801D6354; // type:object size:0x4 data:float -lbl_801D6358 = .sdata2:0x801D6358; // type:object size:0x4 data:float -lbl_801D635C = .sdata2:0x801D635C; // type:object size:0x4 data:float -lbl_801D6360 = .sdata2:0x801D6360; // type:object size:0x8 data:float -lbl_801D6368 = .sdata2:0x801D6368; // type:object size:0x4 data:float -lbl_801D636C = .sdata2:0x801D636C; // type:object size:0x4 data:float -lbl_801D6370 = .sdata2:0x801D6370; // type:object size:0x4 data:float -lbl_801D6374 = .sdata2:0x801D6374; // type:object size:0x4 data:float -lbl_801D6378 = .sdata2:0x801D6378; // type:object size:0x4 data:float -lbl_801D637C = .sdata2:0x801D637C; // type:object size:0x4 data:float -lbl_801D6380 = .sdata2:0x801D6380; // type:object size:0x4 data:float -lbl_801D6384 = .sdata2:0x801D6384; // type:object size:0x4 data:float -lbl_801D6388 = .sdata2:0x801D6388; // type:object size:0x4 data:float -lbl_801D638C = .sdata2:0x801D638C; // type:object size:0x4 data:float +lbl_801D6350 = .sdata2:0x801D6350; // type:object size:0x4 scope:local data:float +lbl_801D6354 = .sdata2:0x801D6354; // type:object size:0x4 scope:local data:float +lbl_801D6358 = .sdata2:0x801D6358; // type:object size:0x4 scope:local data:float +lbl_801D635C = .sdata2:0x801D635C; // type:object size:0x4 scope:local data:float +lbl_801D6360 = .sdata2:0x801D6360; // type:object size:0x8 scope:local data:float +lbl_801D6368 = .sdata2:0x801D6368; // type:object size:0x4 scope:local data:float +lbl_801D636C = .sdata2:0x801D636C; // type:object size:0x4 scope:local data:float +lbl_801D6370 = .sdata2:0x801D6370; // type:object size:0x4 scope:local data:float +lbl_801D6374 = .sdata2:0x801D6374; // type:object size:0x4 scope:local data:float +lbl_801D6378 = .sdata2:0x801D6378; // type:object size:0x4 scope:local data:float +lbl_801D637C = .sdata2:0x801D637C; // type:object size:0x4 scope:local data:float +lbl_801D6380 = .sdata2:0x801D6380; // type:object size:0x4 scope:local data:float +lbl_801D6384 = .sdata2:0x801D6384; // type:object size:0x4 scope:local data:float +lbl_801D6388 = .sdata2:0x801D6388; // type:object size:0x4 scope:local data:float +lbl_801D638C = .sdata2:0x801D638C; // type:object size:0x4 scope:local data:float lbl_801D6390 = .sdata2:0x801D6390; // type:object size:0x4 data:float lbl_801D6394 = .sdata2:0x801D6394; // type:object size:0x4 data:float lbl_801D6398 = .sdata2:0x801D6398; // type:object size:0x8 data:double diff --git a/configure.py b/configure.py index 67f32c23..cc6076bf 100644 --- a/configure.py +++ b/configure.py @@ -484,11 +484,11 @@ config.libs = [ "mtx", [ Object(NonMatching, "dolphin/mtx/mtx.c"), - Object(NonMatching, "dolphin/mtx/mtxvec.c"), - Object(NonMatching, "dolphin/mtx/mtx44.c"), + Object(Matching, "dolphin/mtx/mtxvec.c"), + Object(Matching, "dolphin/mtx/mtx44.c"), Object(NonMatching, "dolphin/mtx/vec.c"), Object(NonMatching, "dolphin/mtx/quat.c"), - Object(NonMatching, "dolphin/mtx/psmtx.c"), + Object(Matching, "dolphin/mtx/psmtx.c"), ], ), DolphinLib( @@ -521,7 +521,7 @@ config.libs = [ "pad", [ Object(NonMatching, "dolphin/pad/Padclamp.c"), - Object(NonMatching, "dolphin/pad/Pad.c"), + Object(Matching, "dolphin/pad/Pad.c"), ], ), DolphinLib( diff --git a/src/dolphin/mtx/mtx.c b/src/dolphin/mtx/mtx.c new file mode 100644 index 00000000..a8f2bb06 --- /dev/null +++ b/src/dolphin/mtx/mtx.c @@ -0,0 +1,1315 @@ +#include "dolphin/mtx.h" + +static f32 Unit01[] = { 0.0f, 1.0f }; + +extern f32 sinf(f32); + +void C_MTXIdentity(Mtx mtx) +{ + mtx[0][0] = 1.0f; + mtx[0][1] = 0.0f; + mtx[0][2] = 0.0f; + mtx[1][0] = 0.0f; + mtx[1][1] = 1.0f; + mtx[1][2] = 0.0f; + mtx[2][0] = 0.0f; + mtx[2][1] = 0.0f; + mtx[2][2] = 1.0f; +} + +#ifdef GEKKO +void PSMTXIdentity(register Mtx m) +{ + register f32 zero_c = 0.0f; + register f32 one_c = 1.0f; + register f32 c_01; + register f32 c_10; + // clang-format off + asm { + psq_st zero_c, 8(m), 0, 0 + ps_merge01 c_01, zero_c, one_c + psq_st zero_c, 24(m), 0, 0 + ps_merge10 c_10, one_c, zero_c + psq_st zero_c, 32(m), 0, 0 + psq_st c_01, 16(m), 0, 0 + psq_st c_10, 0(m), 0, 0 + psq_st c_10, 40(m), 0, 0 + } + // clang-format on +} +#endif + +void C_MTXCopy(const Mtx src, Mtx dst) +{ + + if (src == dst) { + return; + } + + dst[0][0] = src[0][0]; + dst[0][1] = src[0][1]; + dst[0][2] = src[0][2]; + dst[0][3] = src[0][3]; + + dst[1][0] = src[1][0]; + dst[1][1] = src[1][1]; + dst[1][2] = src[1][2]; + dst[1][3] = src[1][3]; + + dst[2][0] = src[2][0]; + dst[2][1] = src[2][1]; + dst[2][2] = src[2][2]; + dst[2][3] = src[2][3]; +} + +#ifdef GEKKO +asm void PSMTXCopy(const register Mtx src, register Mtx dst) +{ + // clang-format off + nofralloc + + psq_l fp0, 0(src), 0, 0 + psq_st fp0, 0(dst), 0, 0 + psq_l fp1, 8(src), 0, 0 + psq_st fp1, 8(dst), 0, 0 + psq_l fp2, 16(src), 0, 0 + psq_st fp2, 16(dst), 0, 0 + psq_l fp3, 24(src), 0, 0 + psq_st fp3, 24(dst), 0, 0 + psq_l fp4, 32(src), 0, 0 + psq_st fp4, 32(dst), 0, 0 + psq_l fp5, 40(src), 0, 0 + psq_st fp5, 40(dst), 0, 0 + + blr + // clang-format on +} +#endif + +void C_MTXConcat(const Mtx a, const Mtx b, Mtx ab) +{ + Mtx mTmp; + MtxPtr m; + + if ((ab == a) || (ab == b)) { + m = mTmp; + } + + else { + m = ab; + } + + m[0][0] = a[0][0] * b[0][0] + a[0][1] * b[1][0] + a[0][2] * b[2][0]; + m[0][1] = a[0][0] * b[0][1] + a[0][1] * b[1][1] + a[0][2] * b[2][1]; + m[0][2] = a[0][0] * b[0][2] + a[0][1] * b[1][2] + a[0][2] * b[2][2]; + m[0][3] = a[0][0] * b[0][3] + a[0][1] * b[1][3] + a[0][2] * b[2][3] + a[0][3]; + + m[1][0] = a[1][0] * b[0][0] + a[1][1] * b[1][0] + a[1][2] * b[2][0]; + m[1][1] = a[1][0] * b[0][1] + a[1][1] * b[1][1] + a[1][2] * b[2][1]; + m[1][2] = a[1][0] * b[0][2] + a[1][1] * b[1][2] + a[1][2] * b[2][2]; + m[1][3] = a[1][0] * b[0][3] + a[1][1] * b[1][3] + a[1][2] * b[2][3] + a[1][3]; + + m[2][0] = a[2][0] * b[0][0] + a[2][1] * b[1][0] + a[2][2] * b[2][0]; + m[2][1] = a[2][0] * b[0][1] + a[2][1] * b[1][1] + a[2][2] * b[2][1]; + m[2][2] = a[2][0] * b[0][2] + a[2][1] * b[1][2] + a[2][2] * b[2][2]; + m[2][3] = a[2][0] * b[0][3] + a[2][1] * b[1][3] + a[2][2] * b[2][3] + a[2][3]; + + if (m == mTmp) { + C_MTXCopy(mTmp, ab); + } +} + +#ifdef GEKKO +asm void PSMTXConcat(const register Mtx mA, const register Mtx mB, register Mtx mAB) +{ + // clang-format off + nofralloc + +#define FP0 fp0 +#define FP1 fp1 +#define FP2 fp2 +#define FP3 fp3 +#define FP4 fp4 +#define FP5 fp5 +#define FP6 fp6 +#define FP7 fp7 +#define FP8 fp8 +#define FP9 fp9 +#define FP10 fp10 +#define FP11 fp11 +#define FP12 fp12 +#define FP13 fp13 +#define FP14 fp14 +#define FP15 fp15 +#define FP31 fp31 + stwu r1, -64(r1); + psq_l FP0, 0(mA), 0, 0; + stfd fp14, 8(r1); + psq_l FP6, 0(mB), 0, 0; + addis r6, 0, Unit01@ha; + psq_l FP7, 8(mB), 0, 0; + stfd fp15, 16(r1) + addi r6, r6, Unit01@l; + stfd fp31, 40(r1) + psq_l FP8, 16(mB), 0, 0 + ps_muls0 FP12, FP6, FP0 + psq_l FP2, 16(mA), 0, 0 + ps_muls0 FP13, FP7, FP0 + psq_l FP31, 0(r6), 0, 0 + ps_muls0 FP14, FP6, FP2 + psq_l FP9, 24(mB), 0, 0 + ps_muls0 FP15, FP7, FP2 + psq_l FP1, 8(mA), 0, 0 + ps_madds1 FP12, FP8, FP0, FP12 + psq_l FP3, 24(mA), 0, 0 + ps_madds1 FP14, FP8, FP2, FP14 + psq_l FP10, 32(mB), 0, 0 + ps_madds1 FP13, FP9, FP0, FP13 + psq_l FP11, 40(mB), 0, 0 + ps_madds1 FP15, FP9, FP2, FP15 + psq_l FP4, 32(mA), 0, 0 + psq_l FP5, 40(mA), 0, 0 + ps_madds0 FP12, FP10, FP1, FP12 + ps_madds0 FP13, FP11, FP1, FP13 + ps_madds0 FP14, FP10, FP3, FP14 + ps_madds0 FP15, FP11, FP3, FP15 + psq_st FP12, 0(mAB), 0, 0 + + ps_muls0 FP2, FP6, FP4 + ps_madds1 FP13, FP31, FP1, FP13 + ps_muls0 FP0, FP7, FP4 + psq_st FP14, 16(mAB), 0, 0 + ps_madds1 FP15, FP31, FP3, FP15 + + psq_st FP13, 8(mAB), 0, 0 + + ps_madds1 FP2, FP8, FP4, FP2 + ps_madds1 FP0, FP9, FP4, FP0 + ps_madds0 FP2, FP10, FP5, FP2 + lfd fp14, 8(r1) + psq_st FP15, 24(mAB), 0, 0 + ps_madds0 FP0, FP11, FP5, FP0 + psq_st FP2, 32(mAB), 0, 0 + ps_madds1 FP0, FP31, FP5, FP0 + lfd fp15, 16(r1) + psq_st FP0, 40(mAB), 0, 0 + + lfd fp31, 40(r1) + addi r1, r1, 64 + + blr + // clang-format on + +#undef FP0 +#undef FP1 +#undef FP2 +#undef FP3 +#undef FP4 +#undef FP5 +#undef FP6 +#undef FP7 +#undef FP8 +#undef FP9 +#undef FP10 +#undef FP11 +#undef FP12 +#undef FP13 +#undef FP14 +#undef FP15 +#undef FP31 +} +#endif + +void C_MTXConcatArray(const Mtx a, const Mtx *srcBase, Mtx *dstBase, u32 count) +{ + u32 i; + for (i = 0; i < count; i++) { + C_MTXConcat(a, *srcBase, *dstBase); + + srcBase++; + dstBase++; + } +} + +#ifdef GEKKO +#if (defined(__MWERKS__) && defined(_DEBUG)) +#pragma global_optimizer on +#pragma optimization_level 1 +#endif + +void PSMTXConcatArray(const register Mtx a, const register Mtx *srcBase, register Mtx *dstBase, register u32 count) +{ + register f32 va0, va1, va2, va3, va4, va5; + register f32 vb0, vb1, vb2, vb3, vb4, vb5; + register f32 vd0, vd1, vd2, vd3, vd4, vd5; + register f32 u01; + register f32 *u01Ptr = Unit01; + + // clang-format off + asm + { + psq_l va0, 0(a), 0, 0 + psq_l va1, 8(a), 0, 0 + psq_l va2, 16(a), 0, 0 + psq_l va3, 24(a), 0, 0 + subi count, count, 1 + psq_l va4, 32(a), 0, 0 + psq_l va5, 40(a), 0, 0 + mtctr count + psq_l u01, 0(u01Ptr), 0, 0 + + psq_l vb0, 0(srcBase), 0, 0 + psq_l vb2, 16(srcBase), 0, 0 + + ps_muls0 vd0, vb0, va0 + ps_muls0 vd2, vb0, va2 + ps_muls0 vd4, vb0, va4 + + psq_l vb4, 32(srcBase), 0, 0 + + ps_madds1 vd0, vb2, va0, vd0 + ps_madds1 vd2, vb2, va2, vd2 + ps_madds1 vd4, vb2, va4, vd4 + + psq_l vb1, 8(srcBase), 0, 0 + + ps_madds0 vd0, vb4, va1, vd0 + ps_madds0 vd2, vb4, va3, vd2 + ps_madds0 vd4, vb4, va5, vd4 + + psq_l vb3, 24(srcBase), 0, 0 + psq_st vd0, 0(dstBase), 0, 0 + + ps_muls0 vd1, vb1, va0 + ps_muls0 vd3, vb1, va2 + ps_muls0 vd5, vb1, va4 + + psq_l vb5, 40(srcBase), 0, 0 + psq_st vd2, 16(dstBase), 0, 0 + ps_madds1 vd1, vb3, va0, vd1 + ps_madds1 vd3, vb3, va2, vd3 + ps_madds1 vd5, vb3, va4, vd5 + +_loop: + addi srcBase, srcBase, sizeof(Mtx) + ps_madds0 vd1, vb5, va1, vd1 + ps_madds0 vd3, vb5, va3, vd3 + ps_madds0 vd5, vb5, va5, vd5 + psq_l vb0, 0(srcBase), 0, 0 + psq_st vd4, 32(dstBase), 0, 0 + ps_madd vd1, u01, va1, vd1 + ps_madd vd3, u01, va3, vd3 + ps_madd vd5, u01, va5, vd5 + psq_l vb2, 16(srcBase), 0, 0 + psq_st vd1, 8(dstBase), 0, 0 + ps_muls0 vd0, vb0, va0 + ps_muls0 vd2, vb0, va2 + ps_muls0 vd4, vb0, va4 + psq_l vb4, 32(srcBase), 0, 0 + psq_st vd3, 24(dstBase), 0, 0 + ps_madds1 vd0, vb2, va0, vd0 + ps_madds1 vd2, vb2, va2, vd2 + ps_madds1 vd4, vb2, va4, vd4 + psq_l vb1, 8(srcBase), 0, 0 + psq_st vd5, 40(dstBase), 0, 0 + addi dstBase, dstBase, sizeof(Mtx) + + ps_madds0 vd0, vb4, va1, vd0 + ps_madds0 vd2, vb4, va3, vd2 + ps_madds0 vd4, vb4, va5, vd4 + psq_l vb3, 24(srcBase), 0, 0 + psq_st vd0, 0(dstBase), 0, 0 + ps_muls0 vd1, vb1, va0 + ps_muls0 vd3, vb1, va2 + ps_muls0 vd5, vb1, va4 + psq_l vb5, 40(srcBase), 0, 0 + psq_st vd2, 16(dstBase), 0, 0 + ps_madds1 vd1, vb3, va0, vd1 + ps_madds1 vd3, vb3, va2, vd3 + ps_madds1 vd5, vb3, va4, vd5 + bdnz _loop + psq_st vd4, 32(dstBase), 0, 0 + ps_madds0 vd1, vb5, va1, vd1 + ps_madds0 vd3, vb5, va3, vd3 + ps_madds0 vd5, vb5, va5, vd5 + ps_madd vd1, u01, va1, vd1 + ps_madd vd3, u01, va3, vd3 + ps_madd vd5, u01, va5, vd5 + psq_st vd1, 8(dstBase), 0, 0 + psq_st vd3, 24(dstBase), 0, 0 + psq_st vd5, 40(dstBase), 0, 0 + } + // clang-format on +} + +#if (defined(__MWERKS__) && defined(_DEBUG)) +#pragma optimization_level 0 +#pragma global_optimizer reset +#endif + +#endif + +void C_MTXTranspose(const Mtx src, Mtx xPose) +{ + Mtx mTmp; + MtxPtr m; + + if (src == xPose) { + m = mTmp; + } + else { + m = xPose; + } + + m[0][0] = src[0][0]; + m[0][1] = src[1][0]; + m[0][2] = src[2][0]; + m[0][3] = 0.0f; + m[1][0] = src[0][1]; + m[1][1] = src[1][1]; + m[1][2] = src[2][1]; + m[1][3] = 0.0f; + m[2][0] = src[0][2]; + m[2][1] = src[1][2]; + m[2][2] = src[2][2]; + m[2][3] = 0.0f; + + if (m == mTmp) { + C_MTXCopy(mTmp, xPose); + } +} + +#ifdef GEKKO +void PSMTXTranspose(const register Mtx src, register Mtx xPose) +{ + register f32 c_zero = 0.0F; + register f32 row0a, row1a, row0b, row1b; + register f32 trns0, trns1, trns2; + // clang-format off + asm + { + psq_l row0a, 0(src), 0, 0 + stfs c_zero, 44(xPose) + psq_l row1a, 16(src), 0, 0 + ps_merge00 trns0, row0a, row1a + psq_l row0b, 8(src), 1, 0 + ps_merge11 trns1, row0a, row1a + psq_l row1b, 24(src), 1, 0 + psq_st trns0, 0(xPose), 0, 0 + psq_l row0a, 32(src), 0, 0 + ps_merge00 trns2, row0b, row1b + psq_st trns1, 16(xPose), 0, 0 + ps_merge00 trns0, row0a, c_zero + psq_st trns2, 32(xPose), 0, 0 + ps_merge10 trns1, row0a, c_zero + psq_st trns0, 8(xPose), 0, 0 + lfs row0b, 40(src) + psq_st trns1, 24(xPose), 0, 0 + stfs row0b, 40(xPose) + } + // clang-format on +} +#endif + +u32 C_MTXInverse(const Mtx src, Mtx inv) +{ + Mtx mTmp; + MtxPtr m; + f32 det; + + if (src == inv) { + m = mTmp; + } + else { + m = inv; + } + + det = src[0][0] * src[1][1] * src[2][2] + src[0][1] * src[1][2] * src[2][0] + src[0][2] * src[1][0] * src[2][1] + - src[2][0] * src[1][1] * src[0][2] - src[1][0] * src[0][1] * src[2][2] - src[0][0] * src[2][1] * src[1][2]; + + if (det == 0.0f) { + return 0; + } + + det = 1.0f / det; + + m[0][0] = (src[1][1] * src[2][2] - src[2][1] * src[1][2]) * det; + m[0][1] = -(src[0][1] * src[2][2] - src[2][1] * src[0][2]) * det; + m[0][2] = (src[0][1] * src[1][2] - src[1][1] * src[0][2]) * det; + + m[1][0] = -(src[1][0] * src[2][2] - src[2][0] * src[1][2]) * det; + m[1][1] = (src[0][0] * src[2][2] - src[2][0] * src[0][2]) * det; + m[1][2] = -(src[0][0] * src[1][2] - src[1][0] * src[0][2]) * det; + + m[2][0] = (src[1][0] * src[2][1] - src[2][0] * src[1][1]) * det; + m[2][1] = -(src[0][0] * src[2][1] - src[2][0] * src[0][1]) * det; + m[2][2] = (src[0][0] * src[1][1] - src[1][0] * src[0][1]) * det; + + m[0][3] = -m[0][0] * src[0][3] - m[0][1] * src[1][3] - m[0][2] * src[2][3]; + m[1][3] = -m[1][0] * src[0][3] - m[1][1] * src[1][3] - m[1][2] * src[2][3]; + m[2][3] = -m[2][0] * src[0][3] - m[2][1] * src[1][3] - m[2][2] * src[2][3]; + + if (m == mTmp) { + C_MTXCopy(mTmp, inv); + } + + return 1; +} + +#ifdef GEKKO +asm u32 PSMTXInverse(const register Mtx src, register Mtx inv) { + // clang-format off + nofralloc + + psq_l fp0, 0(src), 1, 0 + psq_l fp1, 4(src), 0, 0 + psq_l fp2, 16(src), 1, 0 + ps_merge10 fp6, fp1, fp0 + psq_l fp3, 20(src), 0, 0 + psq_l fp4, 32(src), 1, 0 + ps_merge10 fp7, fp3, fp2 + psq_l fp5, 36(src), 0, 0 + ps_mul fp11, fp3, fp6 + ps_mul fp13, fp5, fp7 + ps_merge10 fp8, fp5, fp4 + ps_msub fp11, fp1, fp7, fp11 + ps_mul fp12, fp1, fp8 + ps_msub fp13, fp3, fp8, fp13 + ps_mul fp10, fp3, fp4 + ps_msub fp12, fp5, fp6, fp12 + ps_mul fp9, fp0, fp5 + ps_mul fp8, fp1, fp2 + ps_sub fp6, fp6, fp6 + ps_msub fp10, fp2, fp5, fp10 + ps_mul fp7, fp0, fp13 + ps_msub fp9, fp1, fp4, fp9 + ps_madd fp7, fp2, fp12, fp7 + ps_msub fp8, fp0, fp3, fp8 + ps_madd fp7, fp4, fp11, fp7 + ps_cmpo0 cr0, fp7, fp6 + bne _regular + addi r3, 0, 0 + blr + +_regular: + fres fp0, fp7 + ps_add fp6, fp0, fp0 + ps_mul fp5, fp0, fp0 + ps_nmsub fp0, fp7, fp5, fp6 + lfs fp1, 12(src) + ps_muls0 fp13, fp13, fp0 + lfs fp2, 28(src) + ps_muls0 fp12, fp12, fp0 + lfs fp3, 44(src) + ps_muls0 fp11, fp11, fp0 + ps_merge00 fp5, fp13, fp12 + ps_muls0 fp10, fp10, fp0 + ps_merge11 fp4, fp13, fp12 + ps_muls0 fp9, fp9, fp0 + psq_st fp5, 0(inv), 0, 0 + ps_mul fp6, fp13, fp1 + psq_st fp4, 16(inv), 0, 0 + ps_muls0 fp8, fp8, fp0 + ps_madd fp6, fp12, fp2, fp6 + psq_st fp10, 32(inv), 1, 0 + ps_nmadd fp6, fp11, fp3, fp6 + psq_st fp9, 36(inv), 1, 0 + ps_mul fp7, fp10, fp1 + ps_merge00 fp5, fp11, fp6 + psq_st fp8, 40(inv), 1, 0 + ps_merge11 fp4, fp11, fp6 + psq_st fp5, 8(inv), 0, 0 + ps_madd fp7, fp9, fp2, fp7 + psq_st fp4, 24(inv), 0, 0 + ps_nmadd fp7, fp8, fp3, fp7 + addi r3, 0, 1 + psq_st fp7, 44(inv), 1, 0 + blr + // clang-format on +} +#endif + +u32 C_MTXInvXpose(const Mtx src, Mtx invX) +{ + Mtx mTmp; + MtxPtr m; + f32 det; + + if (src == invX) { + m = mTmp; + } + else { + m = invX; + } + + det = src[0][0] * src[1][1] * src[2][2] + src[0][1] * src[1][2] * src[2][0] + src[0][2] * src[1][0] * src[2][1] + - src[2][0] * src[1][1] * src[0][2] - src[1][0] * src[0][1] * src[2][2] - src[0][0] * src[2][1] * src[1][2]; + + if (det == 0.0f) { + return 0; + } + + det = 1.0f / det; + + m[0][0] = (src[1][1] * src[2][2] - src[2][1] * src[1][2]) * det; + m[0][1] = -(src[1][0] * src[2][2] - src[2][0] * src[1][2]) * det; + m[0][2] = (src[1][0] * src[2][1] - src[2][0] * src[1][1]) * det; + + m[1][0] = -(src[0][1] * src[2][2] - src[2][1] * src[0][2]) * det; + m[1][1] = (src[0][0] * src[2][2] - src[2][0] * src[0][2]) * det; + m[1][2] = -(src[0][0] * src[2][1] - src[2][0] * src[0][1]) * det; + + m[2][0] = (src[0][1] * src[1][2] - src[1][1] * src[0][2]) * det; + m[2][1] = -(src[0][0] * src[1][2] - src[1][0] * src[0][2]) * det; + m[2][2] = (src[0][0] * src[1][1] - src[1][0] * src[0][1]) * det; + + m[0][3] = 0.0F; + m[1][3] = 0.0F; + m[2][3] = 0.0F; + + if (m == mTmp) { + C_MTXCopy(mTmp, invX); + } + + return 1; +} + +#ifdef GEKKO +asm u32 PSMTXInvXpose(const register Mtx src, register Mtx invX) +{ + // clang-format off + nofralloc + + psq_l fp0, 0(src), 1, 0 + psq_l fp1, 4(src), 0, 0 + psq_l fp2, 16(src), 1, 0 + ps_merge10 fp6, fp1, fp0 + psq_l fp3, 20(src), 0, 0 + psq_l fp4, 32(src), 1, 0 + ps_merge10 fp7, fp3, fp2 + psq_l fp5, 36(src), 0, 0 + ps_mul fp11, fp3, fp6 + ps_merge10 fp8, fp5, fp4 + ps_mul fp13, fp5, fp7 + ps_msub fp11, fp1, fp7, fp11 + ps_mul fp12, fp1, fp8 + ps_msub fp13, fp3, fp8, fp13 + ps_msub fp12, fp5, fp6, fp12 + ps_mul fp10, fp3, fp4 + ps_mul fp9, fp0, fp5 + ps_mul fp8, fp1, fp2 + ps_msub fp10, fp2, fp5, fp10 + ps_msub fp9, fp1, fp4, fp9 + ps_msub fp8, fp0, fp3, fp8 + ps_mul fp7, fp0, fp13 + ps_sub fp1, fp1, fp1 + ps_madd fp7, fp2, fp12, fp7 + ps_madd fp7, fp4, fp11, fp7 + ps_cmpo0 cr0, fp7, fp1 + bne _regular + addi r3, 0, 0 + blr + +_regular: + fres fp0, fp7 + psq_st fp1, 12(invX), 1, 0 + ps_add fp6, fp0, fp0 + ps_mul fp5, fp0, fp0 + psq_st fp1, 28(invX), 1, 0 + ps_nmsub fp0, fp7, fp5, fp6 + psq_st fp1, 44(invX), 1, 0 + ps_muls0 fp13, fp13, fp0 + ps_muls0 fp12, fp12, fp0 + ps_muls0 fp11, fp11, fp0 + psq_st fp13, 0(invX), 0, 0 + psq_st fp12, 16(invX), 0, 0 + ps_muls0 fp10, fp10, fp0 + ps_muls0 fp9, fp9, fp0 + psq_st fp11, 32(invX), 0, 0 + psq_st fp10, 8(invX), 1, 0 + ps_muls0 fp8, fp8, fp0 + addi r3, 0, 1 + psq_st fp9, 24(invX), 1, 0 + psq_st fp8, 40(invX), 1, 0 + blr + // clang-format on +} +#endif + +void C_MTXRotRad(Mtx m, char axis, f32 rad) +{ + + f32 sinA, cosA; + sinA = sinf(rad); + cosA = cosf(rad); + C_MTXRotTrig(m, axis, sinA, cosA); +} + +#ifdef GEKKO +void PSMTXRotRad(Mtx m, char axis, f32 rad) +{ + // f32 sinA, cosA; + + // sinA = sinf(rad); + // cosA = cosf(rad); + + // PSMTXRotTrig(m, axis, sinA, cosA); +} +#endif + +void C_MTXRotTrig(Mtx m, char axis, f32 sinA, f32 cosA) +{ + switch (axis) { + + case 'x': + case 'X': + m[0][0] = 1.0f; + m[0][1] = 0.0f; + m[0][2] = 0.0f; + m[0][3] = 0.0f; + m[1][0] = 0.0f; + m[1][1] = cosA; + m[1][2] = -sinA; + m[1][3] = 0.0f; + m[2][0] = 0.0f; + m[2][1] = sinA; + m[2][2] = cosA; + m[2][3] = 0.0f; + break; + + case 'y': + case 'Y': + m[0][0] = cosA; + m[0][1] = 0.0f; + m[0][2] = sinA; + m[0][3] = 0.0f; + m[1][0] = 0.0f; + m[1][1] = 1.0f; + m[1][2] = 0.0f; + m[1][3] = 0.0f; + m[2][0] = -sinA; + m[2][1] = 0.0f; + m[2][2] = cosA; + m[2][3] = 0.0f; + break; + + case 'z': + case 'Z': + m[0][0] = cosA; + m[0][1] = -sinA; + m[0][2] = 0.0f; + m[0][3] = 0.0f; + m[1][0] = sinA; + m[1][1] = cosA; + m[1][2] = 0.0f; + m[1][3] = 0.0f; + m[2][0] = 0.0f; + m[2][1] = 0.0f; + m[2][2] = 1.0f; + m[2][3] = 0.0f; + break; + + default: + break; + } +} + +#ifdef GEKKO +void PSMTXRotTrig(register Mtx m, register char axis, register f32 sinA, register f32 cosA) +{ +// register f32 fc0, fc1, nsinA; +// register f32 fw0, fw1, fw2, fw3; +// // clang-format off +// asm +// { +// frsp sinA, sinA +// frsp cosA, cosA +// } + +// fc0 = 0.0F; +// fc1 = 1.0F; +// asm +// { +// ori axis, axis, 0x20 +// ps_neg nsinA, sinA +// cmplwi axis, 'x' +// beq _case_x +// cmplwi axis, 'y' +// beq _case_y +// cmplwi axis, 'z' +// beq _case_z +// b _end + +// _case_x: +// psq_st fc1, 0(m), 1, 0 +// psq_st fc0, 4(m), 0, 0 +// ps_merge00 fw0, sinA, cosA +// psq_st fc0, 12(m), 0, 0 +// ps_merge00 fw1, cosA, nsinA +// psq_st fc0, 28(m), 0, 0 +// psq_st fc0, 44(m), 1, 0 +// psq_st fw0, 36(m), 0, 0 +// psq_st fw1, 20(m), 0, 0 +// b _end; + +// _case_y: +// ps_merge00 fw0, cosA, fc0 +// ps_merge00 fw1, fc0, fc1 +// psq_st fc0, 24(m), 0, 0 +// psq_st fw0, 0(m), 0, 0 +// ps_merge00 fw2, nsinA, fc0 +// ps_merge00 fw3, sinA, fc0 +// psq_st fw0, 40(m), 0, 0; +// psq_st fw1, 16(m), 0, 0; +// psq_st fw3, 8(m), 0, 0; +// psq_st fw2, 32(m), 0, 0; +// b _end; + +// _case_z: +// psq_st fc0, 8(m), 0, 0 +// ps_merge00 fw0, sinA, cosA +// ps_merge00 fw2, cosA, nsinA +// psq_st fc0, 24(m), 0, 0 +// psq_st fc0, 32(m), 0, 0 +// ps_merge00 fw1, fc1, fc0 +// psq_st fw0, 16(m), 0, 0 +// psq_st fw2, 0(m), 0, 0 +// psq_st fw1, 40(m), 0, 0 + +// _end: +// } +// // clang-format on +} + +#endif + +void C_MTXRotAxisRad(Mtx m, const Vec *axis, f32 rad) +{ + Vec vN; + f32 s, c; + f32 t; + f32 x, y, z; + f32 xSq, ySq, zSq; + + s = sinf(rad); + c = cosf(rad); + t = 1.0f - c; + + C_VECNormalize(axis, &vN); + + x = vN.x; + y = vN.y; + z = vN.z; + + xSq = x * x; + ySq = y * y; + zSq = z * z; + + m[0][0] = (t * xSq) + (c); + m[0][1] = (t * x * y) - (s * z); + m[0][2] = (t * x * z) + (s * y); + m[0][3] = 0.0f; + + m[1][0] = (t * x * y) + (s * z); + m[1][1] = (t * ySq) + (c); + m[1][2] = (t * y * z) - (s * x); + m[1][3] = 0.0f; + + m[2][0] = (t * x * z) - (s * y); + m[2][1] = (t * y * z) + (s * x); + m[2][2] = (t * zSq) + (c); + m[2][3] = 0.0f; +} + +#ifdef GEKKO +static void __PSMTXRotAxisRadInternal(register Mtx m, const register Vec *axis, register f32 sT, register f32 cT) +{ + register f32 tT, fc0; + register f32 tmp0, tmp1, tmp2, tmp3, tmp4; + register f32 tmp5, tmp6, tmp7, tmp8, tmp9; + + tmp9 = 0.5F; + tmp8 = 3.0F; + // clang-format off + asm + { + frsp cT, cT + psq_l tmp0, 0(axis), 0, 0 + frsp sT, sT + lfs tmp1, 8(axis) + ps_mul tmp2, tmp0, tmp0 + fadds tmp7, tmp9, tmp9 + ps_madd tmp3, tmp1, tmp1, tmp2 + fsubs fc0, tmp9, tmp9 + ps_sum0 tmp4, tmp3, tmp1, tmp2 + fsubs tT, tmp7, cT + frsqrte tmp5, tmp4 + fmuls tmp2, tmp5, tmp5 + fmuls tmp3, tmp5, tmp9 + fnmsubs tmp2, tmp2, tmp4, tmp8 + fmuls tmp5, tmp2, tmp3 + ps_merge00 cT, cT, cT + ps_muls0 tmp0, tmp0, tmp5 + ps_muls0 tmp1, tmp1, tmp5 + ps_muls0 tmp4, tmp0, tT + ps_muls0 tmp9, tmp0, sT + ps_muls0 tmp5, tmp1, tT + ps_muls1 tmp3, tmp4, tmp0 + ps_muls0 tmp2, tmp4, tmp0 + ps_muls0 tmp4, tmp4, tmp1 + fnmsubs tmp6, tmp1, sT, tmp3 + fmadds tmp7, tmp1, sT, tmp3 + ps_neg tmp0, tmp9 + ps_sum0 tmp8, tmp4, fc0, tmp9 + ps_sum0 tmp2, tmp2, tmp6, cT + ps_sum1 tmp3, cT, tmp7, tmp3 + ps_sum0 tmp6, tmp0, fc0 ,tmp4 + psq_st tmp8, 8(m), 0, 0 + ps_sum0 tmp0, tmp4, tmp4, tmp0 + psq_st tmp2, 0(m), 0, 0 + ps_muls0 tmp5, tmp5, tmp1 + psq_st tmp3, 16(m), 0, 0 + ps_sum1 tmp4, tmp9, tmp0, tmp4 + psq_st tmp6, 24(m), 0, 0 + ps_sum0 tmp5, tmp5, fc0, cT + psq_st tmp4, 32(m), 0, 0 + psq_st tmp5, 40(m), 0, 0 + } + // clang-format on +} + +void PSMTXRotAxisRad(Mtx m, const Vec *axis, f32 rad) +{ + // f32 sinT, cosT; + + // sinT = sinf(rad); + // cosT = cosf(rad); + + // __PSMTXRotAxisRadInternal(m, axis, sinT, cosT); +} + +#endif + +void C_MTXTrans(Mtx m, f32 xT, f32 yT, f32 zT) +{ + m[0][0] = 1.0f; + m[0][1] = 0.0f; + m[0][2] = 0.0f; + m[0][3] = xT; + m[1][0] = 0.0f; + m[1][1] = 1.0f; + m[1][2] = 0.0f; + m[1][3] = yT; + m[2][0] = 0.0f; + m[2][1] = 0.0f; + m[2][2] = 1.0f; + m[2][3] = zT; +} + +#ifdef GEKKO +void PSMTXTrans(register Mtx m, register f32 xT, register f32 yT, register f32 zT) +{ + register f32 c0 = 0.0F; + register f32 c1 = 1.0F; + // clang-format off + asm + { + stfs xT, 12(m) + stfs yT, 28(m) + psq_st c0, 4(m), 0, 0 + psq_st c0, 32(m), 0, 0 + stfs c0, 16(m) + stfs c1, 20(m) + stfs c0, 24(m) + stfs c1, 40(m) + stfs zT, 44(m) + stfs c1, 0(m) + } + // clang-format on +} +#endif + +void C_MTXTransApply(const Mtx src, Mtx dst, f32 xT, f32 yT, f32 zT) +{ + if (src != dst) { + dst[0][0] = src[0][0]; + dst[0][1] = src[0][1]; + dst[0][2] = src[0][2]; + dst[1][0] = src[1][0]; + dst[1][1] = src[1][1]; + dst[1][2] = src[1][2]; + dst[2][0] = src[2][0]; + dst[2][1] = src[2][1]; + dst[2][2] = src[2][2]; + } + + dst[0][3] = src[0][3] + xT; + dst[1][3] = src[1][3] + yT; + dst[2][3] = src[2][3] + zT; +} + +#ifdef GEKKO +asm void PSMTXTransApply(const register Mtx src, register Mtx dst, register f32 xT, register f32 yT, register f32 zT) +{ + // clang-format off + nofralloc; + psq_l fp4, 0(src), 0, 0 + frsp xT, xT + psq_l fp5, 8(src), 0, 0 + frsp yT, yT + psq_l fp7, 24(src), 0, 0 + frsp zT, zT + psq_l fp8, 40(src), 0, 0 + psq_st fp4, 0(dst), 0, 0 + ps_sum1 fp5, xT, fp5, fp5 + psq_l fp6, 16(src), 0, 0 + psq_st fp5, 8(dst), 0, 0 + ps_sum1 fp7, yT, fp7, fp7 + psq_l fp9, 32(src), 0, 0 + psq_st fp6, 16(dst), 0, 0 + ps_sum1 fp8, zT, fp8, fp8 + psq_st fp7, 24(dst), 0, 0 + psq_st fp9, 32(dst), 0, 0 + psq_st fp8, 40(dst), 0, 0 + blr + // clang-format on +} +#endif + +void C_MTXScale(Mtx m, f32 xS, f32 yS, f32 zS) +{ + m[0][0] = xS; + m[0][1] = 0.0f; + m[0][2] = 0.0f; + m[0][3] = 0.0f; + m[1][0] = 0.0f; + m[1][1] = yS; + m[1][2] = 0.0f; + m[1][3] = 0.0f; + m[2][0] = 0.0f; + m[2][1] = 0.0f; + m[2][2] = zS; + m[2][3] = 0.0f; +} + +#ifdef GEKKO +void PSMTXScale(register Mtx m, register f32 xS, register f32 yS, register f32 zS) +{ + register f32 c0 = 0.0F; + // clang-format off + asm + { + stfs xS, 0(m) + psq_st c0, 4(m), 0, 0 + psq_st c0, 12(m), 0, 0 + stfs yS, 20(m) + psq_st c0, 24(m), 0, 0 + psq_st c0, 32(m), 0, 0 + stfs zS, 40(m) + stfs c0, 44(m) + } + // clang-format on +} +#endif + +void C_MTXScaleApply(const Mtx src, Mtx dst, f32 xS, f32 yS, f32 zS) +{ + dst[0][0] = src[0][0] * xS; + dst[0][1] = src[0][1] * xS; + dst[0][2] = src[0][2] * xS; + dst[0][3] = src[0][3] * xS; + + dst[1][0] = src[1][0] * yS; + dst[1][1] = src[1][1] * yS; + dst[1][2] = src[1][2] * yS; + dst[1][3] = src[1][3] * yS; + + dst[2][0] = src[2][0] * zS; + dst[2][1] = src[2][1] * zS; + dst[2][2] = src[2][2] * zS; + dst[2][3] = src[2][3] * zS; +} + +#ifdef GEKKO +asm void PSMTXScaleApply(const register Mtx src, register Mtx dst, register f32 xS, register f32 yS, register f32 zS) +{ + // clang-format off + nofralloc; + frsp xS, xS + psq_l fp4, 0(src), 0, 0 + frsp yS, yS + psq_l fp5, 8(src), 0, 0 + frsp zS, zS + ps_muls0 fp4, fp4, xS + psq_l fp6, 16(src), 0, 0 + ps_muls0 fp5, fp5, xS + psq_l fp7, 24(src), 0, 0 + ps_muls0 fp6, fp6, yS + psq_l fp8, 32(src), 0, 0 + psq_st fp4, 0(dst), 0, 0 + ps_muls0 fp7, fp7, yS + psq_l fp2, 40(src), 0, 0 + psq_st fp5, 8(dst), 0, 0 + ps_muls0 fp8, fp8, zS + psq_st fp6, 16(dst), 0, 0 + ps_muls0 fp2, fp2, zS + psq_st fp7, 24(dst), 0, 0 + psq_st fp8, 32(dst), 0, 0 + psq_st fp2, 40(dst), 0, 0 + blr + // clang-format on +} +#endif + +void C_MTXQuat(Mtx m, const Quaternion *q) +{ + + f32 s, xs, ys, zs, wx, wy, wz, xx, xy, xz, yy, yz, zz; + s = 2.0f / ((q->x * q->x) + (q->y * q->y) + (q->z * q->z) + (q->w * q->w)); + + xs = q->x * s; + ys = q->y * s; + zs = q->z * s; + wx = q->w * xs; + wy = q->w * ys; + wz = q->w * zs; + xx = q->x * xs; + xy = q->x * ys; + xz = q->x * zs; + yy = q->y * ys; + yz = q->y * zs; + zz = q->z * zs; + + m[0][0] = 1.0f - (yy + zz); + m[0][1] = xy - wz; + m[0][2] = xz + wy; + m[0][3] = 0.0f; + + m[1][0] = xy + wz; + m[1][1] = 1.0f - (xx + zz); + m[1][2] = yz - wx; + m[1][3] = 0.0f; + + m[2][0] = xz - wy; + m[2][1] = yz + wx; + m[2][2] = 1.0f - (xx + yy); + m[2][3] = 0.0f; +} + +#ifdef GEKKO +void PSMTXQuat(register Mtx m, const register Quaternion *q) +{ + register f32 c_zero, c_one, c_two, scale; + register f32 tmp0, tmp1, tmp2, tmp3, tmp4; + register f32 tmp5, tmp6, tmp7, tmp8, tmp9; + + c_one = 1.0F; + // clang-format off + asm + { + psq_l tmp0, 0(q), 0, 0 + psq_l tmp1, 8(q), 0, 0 + fsubs c_zero, c_one, c_one + fadds c_two, c_one, c_one + ps_mul tmp2, tmp0, tmp0 + ps_merge10 tmp5, tmp0, tmp0 + ps_madd tmp4, tmp1, tmp1, tmp2 + ps_mul tmp3, tmp1, tmp1 + ps_sum0 scale, tmp4, tmp4, tmp4 + ps_muls1 tmp7, tmp5, tmp1 + fres tmp9, scale + ps_sum1 tmp4, tmp3, tmp4, tmp2 + ps_nmsub scale, scale, tmp9, c_two + ps_muls1 tmp6, tmp1, tmp1 + ps_mul scale, tmp9, scale + ps_sum0 tmp2, tmp2, tmp2, tmp2 + fmuls scale, scale, c_two + ps_madd tmp8, tmp0, tmp5, tmp6 + ps_msub tmp6, tmp0, tmp5, tmp6 + psq_st c_zero, 12(m), 1, 0 + ps_nmsub tmp2, tmp2, scale, c_one + ps_nmsub tmp4, tmp4, scale, c_one + psq_st c_zero, 44(m), 1, 0 + ps_mul tmp8, tmp8, scale + ps_mul tmp6, tmp6, scale + psq_st tmp2, 40(m), 1, 0 + ps_madds0 tmp5, tmp0, tmp1, tmp7 + ps_merge00 tmp1, tmp8, tmp4 + ps_nmsub tmp7, tmp7, c_two, tmp5 + ps_merge10 tmp0, tmp4, tmp6 + psq_st tmp1, 16(m), 0, 0 + ps_mul tmp5, tmp5, scale + ps_mul tmp7, tmp7, scale + psq_st tmp0, 0(m), 0, 0 + psq_st tmp5, 8(m), 1, 0 + ps_merge10 tmp3, tmp7, c_zero + ps_merge01 tmp9, tmp7, tmp5 + psq_st tmp3, 24(m), 0, 0 + psq_st tmp9, 32(m), 0, 0 + } + // clang-format on +} +#endif + +void C_MTXReflect(Mtx m, const Vec *p, const Vec *n) +{ + f32 vxy, vxz, vyz, pdotn; + + vxy = -2.0f * n->x * n->y; + vxz = -2.0f * n->x * n->z; + vyz = -2.0f * n->y * n->z; + pdotn = 2.0f * C_VECDotProduct(p, n); + + m[0][0] = 1.0f - 2.0f * n->x * n->x; + m[0][1] = vxy; + m[0][2] = vxz; + m[0][3] = pdotn * n->x; + + m[1][0] = vxy; + m[1][1] = 1.0f - 2.0f * n->y * n->y; + m[1][2] = vyz; + m[1][3] = pdotn * n->y; + + m[2][0] = vxz; + m[2][1] = vyz; + m[2][2] = 1.0f - 2.0f * n->z * n->z; + m[2][3] = pdotn * n->z; +} + +#ifdef GEKKO +void PSMTXReflect(register Mtx m, const register Vec *p, const register Vec *n) +{ + register f32 c_one = 1.0F; + register f32 vn_xy, vn_z1, n2vn_xy, n2vn_z1, pdotn; + register f32 tmp0, tmp1, tmp2, tmp3; + register f32 tmp4, tmp5, tmp6, tmp7; + // clang-format off + asm + { + psq_l vn_z1, 8(n), 1, 0 + psq_l vn_xy, 0(n), 0, 0 + psq_l tmp0, 0(p), 0, 0 + ps_nmadd n2vn_z1, vn_z1, c_one, vn_z1 + psq_l tmp1, 8(p), 1, 0 + ps_nmadd n2vn_xy, vn_xy, c_one, vn_xy + ps_muls0 tmp4, vn_xy, n2vn_z1 + ps_mul pdotn, n2vn_xy, tmp0 + ps_muls0 tmp2, vn_xy, n2vn_xy + ps_sum0 pdotn, pdotn, pdotn, pdotn + ps_muls1 tmp3, vn_xy, n2vn_xy + psq_st tmp4, 32(m), 0, 0 + ps_sum0 tmp2, tmp2, tmp2, c_one + ps_nmadd pdotn, n2vn_z1, tmp1, pdotn + ps_sum1 tmp3, c_one, tmp3, tmp3 + psq_st tmp2, 0(m), 0, 0 + ps_muls0 tmp5, vn_xy, pdotn + ps_merge00 tmp6, n2vn_z1, pdotn + psq_st tmp3, 16(m), 0, 0 + ps_merge00 tmp7, tmp4, tmp5 + ps_muls0 tmp6, tmp6, vn_z1 + ps_merge11 tmp5, tmp4, tmp5 + psq_st tmp7, 8(m), 0, 0 + ps_sum0 tmp6, tmp6, tmp6, c_one + psq_st tmp5, 24(m), 0, 0 + psq_st tmp6, 40(m), 0, 0 + } + // clang-format on +} +#endif + +void C_MTXLookAt(Mtx m, const Point3d *camPos, const Vec *camUp, const Point3d *target) +{ + // Vec vLook, vRight, vUp; + + // vLook.x = camPos->x - target->x; + // vLook.y = camPos->y - target->y; + // vLook.z = camPos->z - target->z; + // VECNormalize(&vLook, &vLook); + // VECCrossProduct(camUp, &vLook, &vRight); + // VECNormalize(&vRight, &vRight); + // VECCrossProduct(&vLook, &vRight, &vUp); + + // m[0][0] = vRight.x; + // m[0][1] = vRight.y; + // m[0][2] = vRight.z; + // m[0][3] = -(camPos->x * vRight.x + camPos->y * vRight.y + camPos->z * vRight.z); + + // m[1][0] = vUp.x; + // m[1][1] = vUp.y; + // m[1][2] = vUp.z; + // m[1][3] = -(camPos->x * vUp.x + camPos->y * vUp.y + camPos->z * vUp.z); + + // m[2][0] = vLook.x; + // m[2][1] = vLook.y; + // m[2][2] = vLook.z; + // m[2][3] = -(camPos->x * vLook.x + camPos->y * vLook.y + camPos->z * vLook.z); +} + +void C_MTXLightFrustum(Mtx m, float t, float b, float l, float r, float n, float scaleS, float scaleT, float transS, float transT) +{ + f32 tmp; + + tmp = 1.0f / (r - l); + m[0][0] = ((2 * n) * tmp) * scaleS; + m[0][1] = 0.0f; + m[0][2] = (((r + l) * tmp) * scaleS) - transS; + m[0][3] = 0.0f; + + tmp = 1.0f / (t - b); + m[1][0] = 0.0f; + m[1][1] = ((2 * n) * tmp) * scaleT; + m[1][2] = (((t + b) * tmp) * scaleT) - transT; + m[1][3] = 0.0f; + + m[2][0] = 0.0f; + m[2][1] = 0.0f; + m[2][2] = -1.0f; + m[2][3] = 0.0f; +} + +void C_MTXLightPerspective(Mtx m, f32 fovY, f32 aspect, float scaleS, float scaleT, float transS, float transT) +{ + // f32 angle; + // f32 cot; + + // angle = fovY * 0.5f; + // angle = MTXDegToRad(angle); + + // cot = 1.0f / tanf(angle); + + // m[0][0] = (cot / aspect) * scaleS; + // m[0][1] = 0.0f; + // m[0][2] = -transS; + // m[0][3] = 0.0f; + + // m[1][0] = 0.0f; + // m[1][1] = cot * scaleT; + // m[1][2] = -transT; + // m[1][3] = 0.0f; + + // m[2][0] = 0.0f; + // m[2][1] = 0.0f; + // m[2][2] = -1.0f; + // m[2][3] = 0.0f; +} + +void C_MTXLightOrtho(Mtx m, f32 t, f32 b, f32 l, f32 r, float scaleS, float scaleT, float transS, float transT) +{ + f32 tmp; + tmp = 1.0f / (r - l); + m[0][0] = (2.0f * tmp * scaleS); + m[0][1] = 0.0f; + m[0][2] = 0.0f; + m[0][3] = ((-(r + l) * tmp) * scaleS) + transS; + + tmp = 1.0f / (t - b); + m[1][0] = 0.0f; + m[1][1] = (2.0f * tmp) * scaleT; + m[1][2] = 0.0f; + m[1][3] = ((-(t + b) * tmp) * scaleT) + transT; + + m[2][0] = 0.0f; + m[2][1] = 0.0f; + m[2][2] = 0.0f; + m[2][3] = 1.0f; +} diff --git a/src/dolphin/mtx/mtx44.c b/src/dolphin/mtx/mtx44.c new file mode 100644 index 00000000..a6c2faa9 --- /dev/null +++ b/src/dolphin/mtx/mtx44.c @@ -0,0 +1,99 @@ +#include "dolphin/mtx.h" +#include "math.h" + +void C_MTXFrustum(Mtx44 m, f32 arg1, f32 arg2, f32 arg3, f32 arg4, f32 arg5, f32 arg6) +{ + f32 tmp = 1.0f / (arg4 - arg3); + m[0][0] = (2 * arg5) * tmp; + m[0][1] = 0.0f; + m[0][2] = (arg4 + arg3) * tmp; + m[0][3] = 0.0f; + tmp = 1.0f / (arg1 - arg2); + m[1][0] = 0.0f; + m[1][1] = (2 * arg5) * tmp; + m[1][2] = (arg1 + arg2) * tmp; + m[1][3] = 0.0f; + m[2][0] = 0.0f; + m[2][1] = 0.0f; + tmp = 1.0f / (arg6 - arg5); + m[2][2] = -(arg5)*tmp; + m[2][3] = -(arg6 * arg5) * tmp; + m[3][0] = 0.0f; + m[3][1] = 0.0f; + m[3][2] = -1.0f; + m[3][3] = 0.0f; +} + +// Functions match but has issues with float constants +void C_MTXPerspective(Mtx44 m, f32 fovY, f32 aspect, f32 n, f32 f) +{ + f32 angle = fovY * 0.5f; + f32 cot; + f32 tmp; + angle = MTXDegToRad(angle); + cot = 1.0f / tanf(angle); + m[0][0] = cot / aspect; + m[0][1] = 0.0f; + m[0][2] = 0.0f; + m[0][3] = 0.0f; + m[1][0] = 0.0f; + m[1][1] = cot; + m[1][2] = 0.0f; + m[1][3] = 0.0f; + m[2][0] = 0.0f; + m[2][1] = 0.0f; + tmp = 1.0f / (f - n); + m[2][2] = -(n)*tmp; + m[2][3] = -(f * n) * tmp; + m[3][0] = 0.0f; + m[3][1] = 0.0f; + m[3][2] = -1.0f; + m[3][3] = 0.0f; +} + +void C_MTXOrtho(Mtx44 m, f32 t, f32 b, f32 l, f32 r, f32 n, f32 f) +{ + f32 tmp = 1.0f / (r - l); + m[0][0] = 2.0f * tmp; + m[0][1] = 0.0f; + m[0][2] = 0.0f; + m[0][3] = -(r + l) * tmp; + tmp = 1.0f / (t - b); + m[1][0] = 0.0f; + m[1][1] = 2.0f * tmp; + m[1][2] = 0.0f; + m[1][3] = -(t + b) * tmp; + m[2][0] = 0.0f; + m[2][1] = 0.0f; + tmp = 1.0f / (f - n); + m[2][2] = -(1.0f) * tmp; + m[2][3] = -(f)*tmp; + m[3][0] = 0.0f; + m[3][1] = 0.0f; + m[3][2] = 0.0f; + m[3][3] = 1.0f; +} + +asm void PSMTX44Copy(register Mtx44 src, register Mtx44 dest) +{ +#ifdef __MWERKS__ // clang-format off + nofralloc; + psq_l fp1, 0(src), 0, 0; + psq_st fp1, 0(dest), 0, 0; + psq_l fp1, 8(src), 0, 0; + psq_st fp1, 8(dest), 0, 0; + psq_l fp1, 0x10(src), 0, 0; + psq_st fp1, 0x10(dest), 0, 0; + psq_l fp1, 0x18(src), 0, 0; + psq_st fp1, 0x18(dest), 0, 0; + psq_l fp1, 0x20(src), 0, 0; + psq_st fp1, 0x20(dest), 0, 0; + psq_l fp1, 0x28(src), 0, 0; + psq_st fp1, 0x28(dest), 0, 0; + psq_l fp1, 0x30(src), 0, 0; + psq_st fp1, 0x30(dest), 0, 0; + psq_l fp1, 0x38(src), 0, 0; + psq_st fp1, 0x38(dest), 0, 0; + blr; +#endif // clang-format on +} diff --git a/src/dolphin/mtx/mtxvec.c b/src/dolphin/mtx/mtxvec.c new file mode 100644 index 00000000..d4e70ab0 --- /dev/null +++ b/src/dolphin/mtx/mtxvec.c @@ -0,0 +1,146 @@ +#include "dolphin/mtx.h" + +asm void PSMTXMultVec(const register Mtx m, const register Vec* in, register Vec* out) { +#ifdef __MWERKS__ // clang-format off + nofralloc; + psq_l fp0, 0(in), 0, 0; + psq_l fp2, 0(m), 0, 0; + psq_l fp1, 8(in), 1, 0; + ps_mul fp4, fp2, fp0; + psq_l fp3, 8(m), 0, 0; + ps_madd fp5, fp3, fp1, fp4; + psq_l fp8, 16(m), 0, 0; + ps_sum0 fp6, fp5, fp6, fp5; + psq_l fp9, 24(m), 0, 0; + ps_mul fp10, fp8, fp0; + psq_st fp6, 0(out), 1, 0; + ps_madd fp11, fp9, fp1, fp10; + psq_l fp2, 32(m), 0, 0; + ps_sum0 fp12, fp11, fp12, fp11; + psq_l fp3, 40(m), 0, 0; + ps_mul fp4, fp2, fp0; + psq_st fp12, 4(out), 1, 0; + ps_madd fp5, fp3, fp1, fp4; + ps_sum0 fp6, fp5, fp6, fp5; + psq_st fp6, 8(out), 1, 0; + blr +#endif // clang-format on +} + +asm void PSMTXMultVecArray(register const Mtx m, register const Vec* srcBase, register Vec* dstBase, + register u32 count) { +#ifdef __MWERKS__ // clang-format off + nofralloc + + psq_l f13, 0(m), 0, 0 + psq_l f12, 16(m), 0, 0 + addi count, count, -1 + psq_l f11, 8(m), 0, 0 + ps_merge00 f0, f13, f12 + addi dstBase, dstBase, -4 + psq_l f10, 24(m), 0, 0 + ps_merge11 f1, f13, f12 + mtctr count + psq_l f4, 32(m), 0, 0 + ps_merge00 f2, f11, f10 + psq_l f5, 40(m), 0, 0 + ps_merge11 f3, f11, f10 + psq_l f6, 0(srcBase), 0, 0 + psq_lu f7, 8(srcBase), 1, 0 + ps_madds0 f8, f0, f6, f3 + ps_mul f9, f4, f6 + ps_madds1 f8, f1, f6, f8 + ps_madd f10, f5, f7, f9 + +lbl_80346E0C: + psq_lu f6, 4(srcBase), 0, 0 + ps_madds0 f12, f2, f7, f8 + psq_lu f7, 8(srcBase), 1, 0 + ps_sum0 f13, f10, f9, f10 + ps_madds0 f8, f0, f6, f3 + ps_mul f9, f4, f6 + psq_stu f12, 4(dstBase), 0, 0 + ps_madds1 f8, f1, f6, f8 + psq_stu f13, 8(dstBase), 1, 0 + ps_madd f10, f5, f7, f9 + bdnz lbl_80346E0C + + ps_madds0 f12, f2, f7, f8 + ps_sum0 f13, f10, f9, f10 + psq_stu f12, 4(dstBase), 0, 0 + psq_stu f13, 8(dstBase), 1, 0 + blr +#endif // clang-format on +} + +asm void PSMTXMultVecSR(const register Mtx mtx, const register Vec* in, register Vec* out) { +#ifdef __MWERKS__ // clang-format off + nofralloc; + psq_l fp0, 0(mtx), 0, 0; + psq_l fp6, 0(in), 0, 0; + psq_l fp2, 0x10(mtx), 0, 0; + ps_mul fp8, fp0, fp6; + psq_l fp4, 0x20(mtx), 0, 0; + ps_mul fp10, fp2, fp6; + psq_l fp7, 8(in), 1, 0; + ps_mul fp12, fp4, fp6; + psq_l fp3, 0x18(mtx), 0, 0; + ps_sum0 fp8, fp8, fp8, fp8; + psq_l fp5, 0x28(mtx), 0, 0; + ps_sum0 fp10, fp10, fp10, fp10; + psq_l fp1, 8(mtx), 0, 0; + ps_sum0 fp12, fp12, fp12, fp12; + ps_madd fp9, fp1, fp7, fp8; + psq_st fp9, 0(out), 1, 0; + ps_madd fp11, fp3, fp7, fp10; + psq_st fp11, 4(out), 1, 0; + ps_madd fp13, fp5, fp7, fp12; + psq_st fp13, 8(out), 1, 0; + blr +#endif // clang-format on +} + +asm void PSMTXMultVecArraySR(register const Mtx m, register const Vec* srcBase, + register Vec* dstBase, register u32 count) { +#ifdef __MWERKS__ // clang-format off + nofralloc + + psq_l f13, 0(m), 0, 0 + psq_l f12, 16(m), 0, 0 + addi count, count, -1 + psq_l f11, 8(m), 1, 0 + ps_merge00 f0, f13, f12 + addi dstBase, dstBase, -4 + psq_l f10, 24(m), 1, 0 + ps_merge11 f1, f13, f12 + mtctr count + psq_l f3, 32(m), 0, 0 + ps_merge00 f2, f11, f10 + psq_l f4, 40(m), 1, 0 + psq_l f6, 0(srcBase), 0, 0 + psq_lu f7, 8(srcBase), 1, 0 + ps_muls0 f8, f0, f6 + ps_mul f9, f3, f6 + ps_madds1 f8, f1, f6, f8 + ps_madd f10, f4, f7, f9 + +lbl_80346EE8: + psq_lu f6, 4(srcBase), 0, 0 + ps_madds0 f12, f2, f7, f8 + psq_lu f7, 8(srcBase), 1, 0 + ps_sum0 f13, f10, f9, f9 + ps_muls0 f8, f0, f6 + ps_mul f9, f3, f6 + psq_stu f12, 4(dstBase), 0, 0 + ps_madds1 f8, f1, f6, f8 + psq_stu f13, 8(dstBase), 1, 0 + ps_madd f10, f4, f7, f9 + bdnz lbl_80346EE8 + + ps_madds0 f12, f2, f7, f8 + ps_sum0 f13, f10, f9, f9 + psq_stu f12, 4(dstBase), 0, 0 + psq_stu f13, 8(dstBase), 1, 0 + blr +#endif // clang-format on +} diff --git a/src/dolphin/mtx/psmtx.c b/src/dolphin/mtx/psmtx.c new file mode 100644 index 00000000..0a6c5276 --- /dev/null +++ b/src/dolphin/mtx/psmtx.c @@ -0,0 +1,355 @@ +#include +#include + +#define qr0 0 +#define qr1 1 +#define qr6 6 + +asm void PSMTXReorder(const register Mtx src, register ROMtx dest) +{ + /* clang-format off */ + psq_l f0, 0(src), 0, qr0 + psq_l f2, 16(src), 0, qr0 + psq_l f4, 32(src), 0, qr0 + psq_l f1, 8(src), 0, qr0 + ps_merge00 f6, f0, f2 + psq_l f3, 24(src), 0, qr0 + ps_merge01 f12, f4, f0 + psq_l f5, 40(src), 0, qr0 + ps_merge11 f7, f2, f4 + psq_st f6, 0(dest), 0, qr0 + ps_merge00 f8, f1, f3 + psq_st f12, 8(dest), 0, qr0 + ps_merge01 f9, f5, f1 + psq_st f7, 16(dest), 0, qr0 + ps_merge11 f10, f3, f5 + psq_st f8, 24(dest), 0, qr0 + psq_st f9, 32(dest), 0, qr0 + psq_st f10, 40(dest), 0, qr0 + /* clang-format on */ +} + +asm void PSMTXROMultVecArray(const register ROMtx m, const register Vec *srcBase, register Vec *dstBase, register u32 count) +{ + /* clang-format off */ + nofralloc + stwu r1, -64(r1) + stfd f14, 8(r1) + subi r7, count, 1 + stfd f15, 16(r1) + srwi r7, r7, 1 + stfd f16, 24(r1) + stfd f17, 32(r1) + stfd f18, 40(r1) + mtctr r7 + psq_l f0, 0(m), 0, qr0 + subi srcBase, srcBase, 8 + psq_l f1, 8(m), 1, qr0 + subi dstBase, dstBase, 4 + psq_l f6, 36(m), 0, qr0 + psq_lu f8, 8(srcBase), 0, qr0 + psq_l f7, 44(m), 1, qr0 + psq_lu f9, 8(srcBase), 0, qr0 + ps_madds0 f11, f0, f8, f6 + psq_l f2, 12(m), 0, qr0 + ps_madds0 f12, f1, f8, f7 + psq_l f3, 20(m), 1, qr0 + ps_madds1 f13, f0, f9, f6 + psq_lu f10, 8(srcBase), 0, qr0 + ps_madds1 f14, f1, f9, f7 + psq_l f5, 32(m), 1, qr0 + ps_madds1 f11, f2, f8, f11 + ps_madds1 f12, f3, f8, f12 + psq_l f4, 24(m), 0, qr0 + ps_madds0 f13, f2, f10, f13 + psq_lu f8, 8(srcBase), 0, qr0 + ps_madds0 f14, f3, f10, f14 + ps_madds0 f15, f4, f9, f11 + ps_madds0 f16, f5, f9, f12 + psq_lu f9, 8(srcBase), 0, qr0 + ps_madds1 f17, f4, f10, f13 + ps_madds1 f18, f5, f10, f14 + psq_lu f10, 8(srcBase), 0, qr0 +loop: + ps_madds0 f11, f0, f8, f6 + psq_stu f15, 4(dstBase), 0, qr0 + ps_madds0 f12, f1, f8, f7 + psq_stu f16, 8(dstBase), 1, qr0 + ps_madds1 f13, f0, f9, f6 + psq_stu f17, 4(dstBase), 0, qr0 + ps_madds1 f14, f1, f9, f7 + psq_stu f18, 8(dstBase), 1, qr0 + ps_madds1 f11, f2, f8, f11 + ps_madds1 f12, f3, f8, f12 + psq_lu f8, 8(srcBase), 0, qr0 + ps_madds0 f13, f2, f10, f13 + ps_madds0 f14, f3, f10, f14 + ps_madds0 f15, f4, f9, f11 + ps_madds0 f16, f5, f9, f12 + psq_lu f9, 8(srcBase), 0, qr0 + ps_madds1 f17, f4, f10, f13 + ps_madds1 f18, f5, f10, f14 + psq_lu f10, 8(srcBase), 0, qr0 + bdnz loop + psq_stu f15, 4(dstBase), 0, qr0 + clrlwi. r7, count, 31 + psq_stu f16, 8(dstBase), 1, qr0 + bne exit + psq_stu f17, 4(dstBase), 0, qr0 + psq_stu f18, 8(dstBase), 1, qr0 +exit: + lfd f14, 8(r1) + lfd f15, 16(r1) + lfd f16, 24(r1) + lfd f17, 32(r1) + lfd f18, 40(r1) + addi r1, r1, 64 + blr + /* clang-format on */ +} + +asm void PSMTXROSkin2VecArray(const register ROMtx m0, const register ROMtx m1, const register f32 *wtBase, const register Vec *srcBase, + register Vec *dstBase, register u32 count) +{ + /* clang-format off */ + nofralloc + stwu r1, -160(r1) + stfd f14, 8(r1) + stfd f15, 16(r1) + stfd f16, 24(r1) + stfd f17, 32(r1) + stfd f18, 40(r1) + stfd f19, 48(r1) + stfd f20, 56(r1) + stfd f21, 64(r1) + stfd f22, 72(r1) + stfd f23, 80(r1) + stfd f24, 88(r1) + stfd f25, 96(r1) + stfd f26, 104(r1) + stfd f27, 112(r1) + stfd f28, 120(r1) + stfd f29, 128(r1) + stfd f30, 136(r1) + subi r9, r8, 1 + mtctr r9 + subi srcBase, srcBase, 4 + subi dstBase, dstBase, 4 + subi wtBase, wtBase, 4 + psq_l f14, 0(m0), 0, qr0 + psq_l f22, 0(m1), 0, qr0 + psq_l f15, 8(m0), 1, qr0 + psq_l f23, 8(m1), 1, qr0 + psq_l f16, 12(m0), 0, qr0 + psq_l f24, 12(m1), 0, qr0 + ps_sub f22, f22, f14 + psq_l f17, 20(m0), 1, qr0 + psq_l f25, 20(m1), 1, qr0 + ps_sub f23, f23, f15 + psq_l f18, 24(m0), 0, qr0 + psq_l f26, 24(m1), 0, qr0 + ps_sub f24, f24, f16 + psq_l f19, 32(m0), 1, qr0 + psq_l f27, 32(m1), 1, qr0 + ps_sub f25, f25, f17 + psq_l f20, 36(m0), 0, qr0 + psq_l f28, 36(m1), 0, qr0 + ps_sub f26, f26, f18 + psq_l f21, 44(m0), 1, qr0 + psq_l f29, 44(m1), 1, qr0 + ps_sub f27, f27, f19 + ps_sub f28, f28, f20 + ps_sub f29, f29, f21 + psq_lu f30, 4(wtBase), 1, qr0 + psq_lu f8, 4(srcBase), 0, qr0 + psq_lu f9, 8(srcBase), 1, qr0 + ps_madds0 f0, f22, f30, f14 + ps_madds0 f1, f23, f30, f15 + ps_madds0 f2, f24, f30, f16 + ps_madds0 f3, f25, f30, f17 + ps_madds0 f4, f26, f30, f18 + ps_madds0 f5, f27, f30, f19 + ps_madds0 f6, f28, f30, f20 + ps_madds0 f7, f29, f30, f21 + ps_madds0 f12, f0, f8, f6 + ps_madds0 f13, f1, f8, f7 + psq_lu f30, 4(wtBase), 1, qr0 +loop: + ps_madds1 f12, f2, f8, f12 + ps_madds1 f13, f3, f8, f13 + psq_lu f8, 4(srcBase), 0, qr0 + ps_madds0 f10, f4, f9, f12 + ps_madds0 f11, f5, f9, f13 + psq_lu f9, 8(srcBase), 1, qr0 + ps_madds0 f0, f22, f30, f14 + ps_madds0 f1, f23, f30, f15 + ps_madds0 f2, f24, f30, f16 + ps_madds0 f3, f25, f30, f17 + ps_madds0 f4, f26, f30, f18 + ps_madds0 f5, f27, f30, f19 + ps_madds0 f6, f28, f30, f20 + ps_madds0 f7, f29, f30, f21 + psq_stu f10, 4(dstBase), 0, qr0 + ps_madds0 f12, f0, f8, f6 + ps_madds0 f13, f1, f8, f7 + psq_stu f11, 8(dstBase), 1, qr0 + psq_lu f30, 4(wtBase), 1, qr0 + bdnz loop + ps_madds1 f12, f2, f8, f12 + ps_madds1 f13, f3, f8, f13 + ps_madds0 f10, f4, f9, f12 + psq_stu f10, 4(dstBase), 0, qr0 + ps_madds0 f11, f5, f9, f13 + psq_stu f11, 8(dstBase), 1, qr0 + lfd f14, 8(r1) + lfd f15, 16(r1) + lfd f16, 24(r1) + lfd f17, 32(r1) + lfd f18, 40(r1) + lfd f19, 48(r1) + lfd f20, 56(r1) + lfd f21, 64(r1) + lfd f22, 72(r1) + lfd f23, 80(r1) + lfd f24, 88(r1) + lfd f25, 96(r1) + lfd f26, 104(r1) + lfd f27, 112(r1) + lfd f28, 120(r1) + lfd f29, 128(r1) + lfd f30, 136(r1) + addi r1, r1, 160 + blr + /* clang-format on */ +} + +asm void PSMTXROMultS16VecArray(const register ROMtx m, const register S16Vec *srcBase, register Vec *dstBase, register u32 count) +{ + /* clang-format off */ + nofralloc + stwu r1, -64(r1) + stfd f14, 8(r1) + subi r7, count, 1 + stfd f15, 16(r1) + srwi r7, r7, 1 + stfd f16, 24(r1) + lis r8, 7 + stfd f17, 32(r1) + mtspr GQR6, r8 + stfd f18, 40(r1) + mtctr r7 + psq_l f0, 0(m), 0, qr0 + subi srcBase, srcBase, 4 + psq_l f1, 8(m), 1, qr0 + subi dstBase, dstBase, 4 + psq_l f6, 36(m), 0, qr0 + psq_lu f8, 4(srcBase), 0, qr6 + psq_l f7, 44(m), 1, qr0 + psq_lu f9, 4(srcBase), 0, qr6 + ps_madds0 f11, f0, f8, f6 + psq_l f2, 12(m), 0, qr0 + ps_madds0 f12, f1, f8, f7 + psq_l f3, 20(m), 1, qr0 + ps_madds1 f13, f0, f9, f6 + psq_lu f10, 4(srcBase), 0, qr6 + ps_madds1 f14, f1, f9, f7 + psq_l f5, 32(m), 1, qr0 + ps_madds1 f11, f2, f8, f11 + ps_madds1 f12, f3, f8, f12 + psq_l f4, 24(m), 0, qr0 + ps_madds0 f13, f2, f10, f13 + psq_lu f8, 4(srcBase), 0, qr6 + ps_madds0 f14, f3, f10, f14 + ps_madds0 f15, f4, f9, f11 + ps_madds0 f16, f5, f9, f12 + psq_lu f9, 4(srcBase), 0, qr6 + ps_madds1 f17, f4, f10, f13 + ps_madds1 f18, f5, f10, f14 + psq_lu f10, 4(srcBase), 0, qr6 +loop: + ps_madds0 f11, f0, f8, f6 + psq_stu f15, 4(dstBase), 0, qr0 + ps_madds0 f12, f1, f8, f7 + psq_stu f16, 8(dstBase), 1, qr0 + ps_madds1 f13, f0, f9, f6 + psq_stu f17, 4(dstBase), 0, qr0 + ps_madds1 f14, f1, f9, f7 + psq_stu f18, 8(dstBase), 1, qr0 + ps_madds1 f11, f2, f8, f11 + ps_madds1 f12, f3, f8, f12 + psq_lu f8, 4(srcBase), 0, qr6 + ps_madds0 f13, f2, f10, f13 + ps_madds0 f14, f3, f10, f14 + ps_madds0 f15, f4, f9, f11 + ps_madds0 f16, f5, f9, f12 + psq_lu f9, 4(srcBase), 0, qr6 + ps_madds1 f17, f4, f10, f13 + ps_madds1 f18, f5, f10, f14 + psq_lu f10, 4(srcBase), 0, qr6 + bdnz loop + psq_stu f15, 4(dstBase), 0, qr0 + clrlwi. r7, count, 31 + psq_stu f16, 8(dstBase), 1, qr0 + bne exit + psq_stu f17, 4(dstBase), 0, qr0 + psq_stu f18, 8(dstBase), 1, qr0 +exit: + lfd f14, 8(r1) + lfd f15, 16(r1) + lfd f16, 24(r1) + lfd f17, 32(r1) + lfd f18, 40(r1) + addi r1, r1, 64 + blr + /* clang-format on */ +} + +asm void PSMTXMultS16VecArray(const register Mtx44 m, const register S16Vec *srcBase, register Vec *dstBase, register u32 count) +{ + /* clang-format off */ + psq_l f0, 0(m), 0, qr0 + lis r7, 7 + mtspr GQR6, r7 + psq_l f6, 0(srcBase), 0, qr6 + subi count, count, 1 + psq_l f7, 4(srcBase), 1, qr6 + mtctr count + psq_l f1, 8(m), 0, qr0 + addi srcBase, srcBase, 4 + psq_l f2, 16(m), 0, qr0 + subi dstBase, dstBase, 4 + psq_l f3, 24(m), 0, qr0 + ps_mul f8, f0, f6 + psq_l f4, 32(m), 0, qr0 + ps_mul f10, f2, f6 + psq_l f5, 40(m), 0, qr0 + ps_mul f12, f4, f6 + psq_lu f6, 2(srcBase), 0, qr1 + ps_madd f8, f1, f7, f8 + ps_madd f10, f3, f7, f10 + ps_madd f12, f5, f7, f12 + psq_lu f7, 4(srcBase), 1, qr6 + ps_sum0 f9, f8, f8, f8 +loop: + ps_sum0 f11, f10, f10, f10 + ps_mul f8, f0, f6 + ps_sum0 f13, f12, f12, f12 + ps_mul f10, f2, f6 + psq_stu f9, 4(dstBase), 1, qr0 + ps_mul f12, f4, f6 + psq_stu f11, 4(dstBase), 1, qr0 + ps_madd f8, f1, f7, f8 + psq_stu f13, 4(dstBase), 1, qr0 + ps_madd f10, f3, f7, f10 + psq_lu f6, 2(srcBase), 0, qr6 + ps_madd f12, f5, f7, f12 + psq_lu f7, 4(srcBase), 1, qr6 + ps_sum0 f9, f8, f8, f8 + bdnz loop + ps_sum0 f11, f10, f10, f10 + ps_sum0 f13, f12, f12, f12 + psq_stu f9, 4(dstBase), 1, qr0 + psq_stu f11, 4(dstBase), 1, qr0 + psq_stu f13, 4(dstBase), 1, qr0 + /* clang-format on */ +} diff --git a/src/dolphin/mtx/quat.c b/src/dolphin/mtx/quat.c new file mode 100644 index 00000000..a874e14c --- /dev/null +++ b/src/dolphin/mtx/quat.c @@ -0,0 +1,80 @@ +#include "dolphin/mtx.h" +#include "math.h" + +void PSQUATMultiply(register const Quaternion *a, register const Quaternion *b, register Quaternion *ab) +{ + asm { + psq_l f0, 0(a), 0, 0 + psq_l f1, 8(a), 0, 0 + psq_l f2, 0(b), 0, 0 + ps_neg f5, f0 + psq_l f3, 8(b), 0, 0 + ps_neg f6, f1 + ps_merge01 f4, f5, f0 + ps_muls0 f7, f1, f2 + ps_muls0 f5, f5, f2 + ps_merge01 f1, f6, f1 + ps_muls1 f8, f4, f2 + ps_madds0 f7, f4, f3, f7 + ps_muls1 f2, f1, f2 + ps_madds0 f5, f1, f3, f5 + ps_madds1 f8, f6, f3, f8 + ps_merge10 f7, f7, f7 + ps_madds1 f2, f0, f3, f2 + ps_merge10 f5, f5, f5 + ps_add f7, f7, f2 + psq_st f7, 0(ab), 0, 0 + ps_sub f5, f5, f8 + psq_st f5, 8(ab), 0, 0 + } +} + +void C_QUATRotAxisRad(Quaternion *q, const Vec *axis, f32 rad) +{ + f32 tmp, tmp2, tmp3; + Vec dst; + + tmp = rad; + PSVECNormalize(axis, &dst); + + tmp2 = tmp * 0.5f; + tmp3 = sinf(tmp * 0.5f); + tmp = tmp3; + tmp3 = cosf(tmp2); + + q->x = tmp * dst.x; + q->y = tmp * dst.y; + q->z = tmp * dst.z; + q->w = tmp3; +} + +void C_QUATSlerp(const Quaternion *p, const Quaternion *q, Quaternion *r, f32 t) +{ + f32 ratioA, ratioB; + + f32 value = 1.0f; + f32 cosHalfTheta = p->x * q->x + p->y * q->y + p->z * q->z + p->w * q->w; + + if (cosHalfTheta < 0.0f) { + cosHalfTheta = -cosHalfTheta; + value = -value; + } + + if (cosHalfTheta <= 0.9999899864196777f) { + f32 halfTheta = acosf(cosHalfTheta); + f32 sinHalfTheta = sinf(halfTheta); + + ratioA = sinf((1.0f - t) * halfTheta) / sinHalfTheta; + ratioB = sinf(t * halfTheta) / sinHalfTheta; + value *= ratioB; + } + else { + ratioA = 1.0f - t; + value *= t; + } + + r->x = (ratioA * p->x) + (value * q->x); + r->y = (ratioA * p->y) + (value * q->y); + r->z = (ratioA * p->z) + (value * q->z); + r->w = (ratioA * p->w) + (value * q->w); +} diff --git a/src/dolphin/mtx/vec.c b/src/dolphin/mtx/vec.c new file mode 100644 index 00000000..985a6196 --- /dev/null +++ b/src/dolphin/mtx/vec.c @@ -0,0 +1,287 @@ +#include "dolphin/mtx.h" +#include "math.h" + +#define R_RET fp1 +#define FP2 fp2 +#define FP3 fp3 +#define FP4 fp4 +#define FP5 fp5 +#define FP6 fp6 +#define FP7 fp7 +#define FP8 fp8 +#define FP9 fp9 +#define FP10 fp10 +#define FP11 fp11 +#define FP12 fp12 +#define FP13 fp13 + +asm void PSVECAdd(const register Vec *vec1, const register Vec *vec2, register Vec *ret) +{ +#ifdef __MWERKS__ // clang-format off + nofralloc; + psq_l FP2, 0(vec1), 0, 0; + psq_l FP4, 0(vec2), 0, 0; + ps_add FP6, FP2, FP4; + psq_st FP6, 0(ret), 0, 0; + psq_l FP3, 8(vec1), 1, 0; + psq_l FP5, 8(vec2), 1, 0; + ps_add FP7, FP3, FP5; + psq_st FP7, 8(ret), 1, 0; + blr +#endif // clang-format on +} + +asm void PSVECSubtract(const register Vec *vec1, const register Vec *vec2, register Vec *ret) +{ +#ifdef __MWERKS__ // clang-format off + nofralloc; + psq_l FP2, 0(vec1), 0, 0; + psq_l FP4, 0(vec2), 0, 0; + ps_sub FP6, FP2, FP4; + psq_st FP6, 0(ret), 0, 0; + psq_l FP3, 8(vec1), 1, 0; + psq_l FP5, 8(vec2), 1, 0; + ps_sub FP7, FP3, FP5; + psq_st FP7, 8(ret), 1, 0; + blr +#endif // clang-format on +} + +asm void PSVECScale(register const Vec *src, register Vec *dst, register f32 scale) +{ +#ifdef __MWERKS__ // clang-format off + nofralloc + psq_l f0, 0(src), 0, 0 + psq_l f2, 8(src), 1, 0 + ps_muls0 f0, f0, f1 + psq_st f0, 0(dst), 0, 0 + ps_muls0 f0, f2, f1 + psq_st f0, 8(dst), 1, 0 + blr +#endif // clang-format on +} + +void C_VECScale(const Vec *src, Vec *dst, f32 scale) +{ + f32 s; + + s = 1.0f / sqrtf(src->z * src->z + src->x * src->x + src->y * src->y); + dst->x = src->x * s; + dst->y = src->y * s; + dst->z = src->z * s; +} + +void PSVECNormalize(const register Vec *vec1, register Vec *ret) +{ +#ifdef __MWERKS__ // clang-format off + register f32 half = 0.5f; + register f32 three = 3.0f; + register f32 xx_zz, xx_yy; + register f32 square_sum; + register f32 ret_sqrt; + register f32 n_0, n_1; + asm { + psq_l FP2, 0(vec1), 0, 0; + ps_mul xx_yy, FP2, FP2; + psq_l FP3, 8(vec1), 1, 0; + ps_madd xx_zz, FP3, FP3, xx_yy; + ps_sum0 square_sum, xx_zz, FP3, xx_yy; + frsqrte ret_sqrt, square_sum; + fmuls n_0, ret_sqrt, ret_sqrt; + fmuls n_1, ret_sqrt, half; + fnmsubs n_0, n_0, square_sum, three; + fmuls ret_sqrt, n_0, n_1; + ps_muls0 FP2, FP2, ret_sqrt; + psq_st FP2, 0(ret), 0, 0; + ps_muls0 FP3, FP3, ret_sqrt; + psq_st FP3, 8(ret), 1, 0; + } +#endif // clang-format on +} + +asm f32 PSVECSquareMag(register const Vec *v) { +#ifdef __MWERKS__ // clang-format off + nofralloc + psq_l f0, 0(v), 0, 0 + ps_mul f0, f0, f0 + lfs f1, 8(v) + ps_madd f1, f1, f1, f0 + ps_sum0 f1, f1, f0, f0 + blr +#endif // clang-format on +} + +f32 PSVECMag(const register Vec *v) +{ + register f32 v_xy, v_zz, square_mag; + register f32 ret_mag, n_0, n_1; + register f32 three, half, zero; +#ifdef __MWERKS__ // clang-format off + asm { + psq_l v_xy, 0(v), 0, 0 + ps_mul v_xy, v_xy, v_xy + lfs v_zz, 8(v) + ps_madd square_mag, v_zz, v_zz, v_xy + } +#endif // clang-format on + half = 0.5f; +#ifdef __MWERKS__ // clang-format off + asm { + ps_sum0 square_mag, square_mag, v_xy, v_xy + frsqrte ret_mag, square_mag + } +#endif // clang-format on + three = 3.0f; +#ifdef __MWERKS__ // clang-format off +asm { + fmuls n_0, ret_mag, ret_mag + fmuls n_1, ret_mag, half + fnmsubs n_0, n_0, square_mag, three + fmuls ret_mag, n_0, n_1 + fsel ret_mag, ret_mag, ret_mag, square_mag + fmuls square_mag, square_mag, ret_mag + } +#endif // clang-format on + return square_mag; +} + +asm f32 PSVECDotProduct(const register Vec *vec1, const register Vec *vec2) +{ +#ifdef __MWERKS__ // clang-format off + nofralloc; + psq_l f2, 4(r3), 0, 0 /* qr0 */ + psq_l f3, 4(r4), 0, 0 /* qr0 */ + ps_mul f2, f2, f3 + psq_l f5, 0(r3), 0, 0 /* qr0 */ + psq_l f4, 0(r4), 0, 0 /* qr0 */ + ps_madd f3, f5, f4, f2 + ps_sum0 f1, f3, f2, f2 + blr +#endif // clang-format on +} + +asm void PSVECCrossProduct(register const Vec *a, register const Vec *b, register Vec *axb) +{ +#ifdef __MWERKS__ // clang-format off + nofralloc + psq_l f1, 0(b), 0, 0 + lfs f2, 8(a) + psq_l f0, 0(a), 0, 0 + ps_merge10 f6, f1, f1 + lfs f3, 8(b) + ps_mul f4, f1, f2 + ps_muls0 f7, f1, f0 + ps_msub f5, f0, f3, f4 + ps_msub f8, f0, f6, f7 + ps_merge11 f9, f5, f5 + ps_merge01 f10, f5, f8 + psq_st f9, 0(axb), 1, 0 + ps_neg f10, f10 + psq_st f10, 4(axb), 0, 0 + blr +#endif // clang-format on +} + +void C_VECHalfAngle(const Vec *a, const Vec *b, Vec *half) +{ + Vec a0; + Vec b0; + Vec ab; + + a0.x = -a->x; + a0.y = -a->y; + a0.z = -a->z; + + b0.x = -b->x; + b0.y = -b->y; + b0.z = -b->z; + + VECNormalize(&a0, &a0); + VECNormalize(&b0, &b0); + VECAdd(&a0, &b0, &ab); + + if (VECDotProduct(&ab, &ab) > 0.0f) { + VECNormalize(&ab, half); + } + else { + *half = ab; + } +} + +void C_VECReflect(const Vec *src, const Vec *normal, Vec *dst) +{ + // Vec a0; + // Vec b0; + // f32 dot; + + // a0.x = -src->x; + // a0.y = -src->y; + // a0.z = -src->z; + + // VECNormalize(&a0, &a0); + // VECNormalize(normal, &b0); + + // dot = VECDotProduct(&a0, &b0); + // dst->x = b0.x * 2.0f * dot - a0.x; + // dst->y = b0.y * 2.0f * dot - a0.y; + // dst->z = b0.z * 2.0f * dot - a0.z; + + // VECNormalize(dst, dst); +} + +asm f32 PSVECSquareDistance(register const Vec *a, register const Vec *b) { +#ifdef __MWERKS__ // clang-format off + nofralloc + psq_l f0, 4(a), 0, 0 + psq_l f1, 4(b), 0, 0 + ps_sub f2, f0, f1 + psq_l f0, 0(a), 0, 0 + psq_l f1, 0(b), 0, 0 + ps_mul f2, f2, f2 + ps_sub f0, f0, f1 + ps_madd f1, f0, f0, f2 + ps_sum0 f1, f1, f2, f2 + blr +#endif // clang-format on +} + +f32 PSVECDistance(register const Vec *a, register const Vec *b) +{ + + register f32 half_c; + register f32 three_c; + register f32 dist; + +#ifdef __MWERKS__ // clang-format off + asm { + psq_l f0, 4(a), 0, 0 /* qr0 */ + psq_l f1, 4(b), 0, 0 /* qr0 */ + ps_sub f2, f0, f1 + psq_l f0, 0(a), 0, 0 /* qr0 */ + psq_l f1, 0(b), 0, 0 /* qr0 */ + ps_mul f2, f2, f2 + ps_sub f0, f0, f1 + } + + half_c = 0.5f; + + asm { + ps_madd f0, f0, f0, f2 + ps_sum0 f0, f0, f2, f2 + } + + three_c = 3.0f; + + asm { + frsqrte dist, f0 + fmuls f2, dist, dist + fmuls dist, dist, half_c + fnmsubs f2, f2, f0, three_c + fmuls dist, f2, dist + fsel dist, dist, dist, f0 + fmuls dist, f0, dist + } + + return dist; +#endif // clang-format on +} diff --git a/src/dolphin/pad/Pad.c b/src/dolphin/pad/Pad.c new file mode 100644 index 00000000..1852cf0d --- /dev/null +++ b/src/dolphin/pad/Pad.c @@ -0,0 +1,783 @@ +#include +#include + +u8 UnkVal : (OS_BASE_CACHED | 0x30e3); +u16 __OSWirelessPadFixMode : (OS_BASE_CACHED | 0x30E0); + +static void PADTypeAndStatusCallback(s32 chan, u32 type); +static void PADOriginCallback(s32 chan, u32 error, OSContext *context); +static void PADProbeCallback(s32 chan, u32 error, OSContext *context); +static void SPEC0_MakeStatus(s32 chan, PADStatus *status, u32 data[2]); +static void SPEC1_MakeStatus(s32 chan, PADStatus *status, u32 data[2]); +static void SPEC2_MakeStatus(s32 chan, PADStatus *status, u32 data[2]); +static void PADTypeAndStatusCallback(s32 chan, u32 type); + +static void PADOriginCallback(s32 chan, u32 error, OSContext *context); +static void PADProbeCallback(s32 chan, u32 error, OSContext *context); + +static void SPEC0_MakeStatus(s32 chan, PADStatus *status, u32 data[2]); +static void SPEC1_MakeStatus(s32 chan, PADStatus *status, u32 data[2]); +static void SPEC2_MakeStatus(s32 chan, PADStatus *status, u32 data[2]); + +static BOOL Initialized; + +static u32 EnabledBits; +static u32 ResettingBits; +static s32 ResettingChan = 32; +static u32 RecalibrateBits; +static u32 WaitingBits; +static u32 CheckingBits; +static u32 PendingBits; + +static u32 XPatchBits = PAD_CHAN0_BIT | PAD_CHAN1_BIT | PAD_CHAN2_BIT | PAD_CHAN3_BIT; + +static u32 AnalogMode = 0x00000300u; + +u32 __PADSpec; +static u32 Spec = 5; +static void (*MakeStatus)(s32, PADStatus *, u32[2]) = SPEC2_MakeStatus; + +static u32 Type[SI_MAX_CHAN]; +static PADStatus Origin[SI_MAX_CHAN]; + +static u32 CmdReadOrigin = 0x41 << 24; +static u32 CmdCalibrate = 0x42 << 24; +static u32 CmdProbeDevice[SI_MAX_CHAN]; + +static BOOL OnReset(BOOL final); + +static OSResetFunctionInfo ResetFunctionInfo = { OnReset, 127 }; + +static void (*SamplingCallback)(void); + +static void PADEnable(s32 chan) +{ + u32 cmd; + u32 chanBit; + u32 data[2]; + + chanBit = PAD_CHAN0_BIT >> chan; + EnabledBits |= chanBit; + SIGetResponse(chan, data); + cmd = (0x40 << 16) | AnalogMode; + SISetCommand(chan, cmd); + SIEnablePolling(EnabledBits); +} + +static void PADDisable(s32 chan) +{ + BOOL enabled; + u32 chanBit; + + enabled = OSDisableInterrupts(); + + chanBit = PAD_CHAN0_BIT >> chan; + SIDisablePolling(chanBit); + EnabledBits &= ~chanBit; + WaitingBits &= ~chanBit; + CheckingBits &= ~chanBit; + PendingBits &= ~chanBit; + OSSetWirelessID(chan, 0); + + OSRestoreInterrupts(enabled); +} + +static void DoReset(void) +{ + u32 chanBit; + + ResettingChan = __cntlzw(ResettingBits); + if (ResettingChan == 32) { + return; + } + + chanBit = PAD_CHAN0_BIT >> ResettingChan; + ResettingBits &= ~chanBit; + + memset(&Origin[ResettingChan], 0, sizeof(PADStatus)); + SIGetTypeAsync(ResettingChan, PADTypeAndStatusCallback); +} + +static void UpdateOrigin(s32 chan) +{ + PADStatus *origin; + u32 chanBit = PAD_CHAN0_BIT >> chan; + + origin = &Origin[chan]; + switch (AnalogMode & 0x00000700u) { + case 0x00000000u: + case 0x00000500u: + case 0x00000600u: + case 0x00000700u: + origin->triggerL &= ~15; + origin->triggerR &= ~15; + origin->analogA &= ~15; + origin->analogB &= ~15; + break; + case 0x00000100u: + origin->substickX &= ~15; + origin->substickY &= ~15; + origin->analogA &= ~15; + origin->analogB &= ~15; + break; + case 0x00000200u: + origin->substickX &= ~15; + origin->substickY &= ~15; + origin->triggerL &= ~15; + origin->triggerR &= ~15; + break; + case 0x00000300u: + break; + case 0x00000400u: + break; + } + + origin->stickX -= 128; + origin->stickY -= 128; + origin->substickX -= 128; + origin->substickY -= 128; + + if (XPatchBits & chanBit) { + if (64 < origin->stickX && (SIGetType(chan) & 0xffff0000) == SI_GC_CONTROLLER) { + origin->stickX = 0; + } + } +} + +static void PADOriginCallback(s32 chan, u32 error, OSContext *context) +{ + if (!(error & (SI_ERROR_UNDER_RUN | SI_ERROR_OVER_RUN | SI_ERROR_NO_RESPONSE | SI_ERROR_COLLISION))) { + UpdateOrigin(ResettingChan); + PADEnable(ResettingChan); + } + DoReset(); +} + +static void PADOriginUpdateCallback(s32 chan, u32 error, OSContext *context) +{ + + if (!(EnabledBits & (PAD_CHAN0_BIT >> chan))) { + return; + } + + if (!(error & (SI_ERROR_UNDER_RUN | SI_ERROR_OVER_RUN | SI_ERROR_NO_RESPONSE | SI_ERROR_COLLISION))) { + UpdateOrigin(chan); + } + + if (error & SI_ERROR_NO_RESPONSE) { + PADDisable(chan); + } +} + +static void PADProbeCallback(s32 chan, u32 error, OSContext *context) +{ + if (!(error & (SI_ERROR_UNDER_RUN | SI_ERROR_OVER_RUN | SI_ERROR_NO_RESPONSE | SI_ERROR_COLLISION))) { + PADEnable(ResettingChan); + WaitingBits |= PAD_CHAN0_BIT >> ResettingChan; + } + DoReset(); +} + +static void PADTypeAndStatusCallback(s32 chan, u32 type) +{ + u32 chanBit; + u32 recalibrate; + BOOL rc = TRUE; + u32 error; + chanBit = PAD_CHAN0_BIT >> ResettingChan; + error = type & 0xFF; + recalibrate = RecalibrateBits & chanBit; + RecalibrateBits &= ~chanBit; + + if (error & (SI_ERROR_UNDER_RUN | SI_ERROR_OVER_RUN | SI_ERROR_NO_RESPONSE | SI_ERROR_COLLISION)) { + DoReset(); + return; + } + + type &= ~0xFF; + + Type[ResettingChan] = type; + + if ((type & SI_TYPE_MASK) != SI_TYPE_GC || !(type & SI_GC_STANDARD)) { + DoReset(); + return; + } + + if (Spec < PAD_SPEC_2) { + PADEnable(ResettingChan); + DoReset(); + return; + } + + if (!(type & SI_GC_WIRELESS) || (type & SI_WIRELESS_IR)) { + if (recalibrate) { + rc = SITransfer(ResettingChan, &CmdCalibrate, 3, &Origin[ResettingChan], 10, PADOriginCallback, 0); + } + else { + rc = SITransfer(ResettingChan, &CmdReadOrigin, 1, &Origin[ResettingChan], 10, PADOriginCallback, 0); + } + } + else if ((type & SI_WIRELESS_FIX_ID) && (type & SI_WIRELESS_CONT_MASK) == SI_WIRELESS_CONT && !(type & SI_WIRELESS_LITE)) { + if (type & SI_WIRELESS_RECEIVED) { + rc = SITransfer(ResettingChan, &CmdReadOrigin, 1, &Origin[ResettingChan], 10, PADOriginCallback, 0); + } + else { + rc = SITransfer(ResettingChan, &CmdProbeDevice[ResettingChan], 3, &Origin[ResettingChan], 8, PADProbeCallback, 0); + } + } + if (!rc) { + PendingBits |= chanBit; + DoReset(); + return; + } +} + +static void PADReceiveCheckCallback(s32 chan, u32 type) +{ + u32 error; + u32 chanBit; + + chanBit = PAD_CHAN0_BIT >> chan; + if (!(EnabledBits & chanBit)) { + return; + } + + error = type & 0xFF; + type &= ~0xFF; + + WaitingBits &= ~chanBit; + CheckingBits &= ~chanBit; + + if (!(error & (SI_ERROR_UNDER_RUN | SI_ERROR_OVER_RUN | SI_ERROR_NO_RESPONSE | SI_ERROR_COLLISION)) && (type & SI_GC_WIRELESS) + && (type & SI_WIRELESS_FIX_ID) && (type & SI_WIRELESS_RECEIVED) && !(type & SI_WIRELESS_IR) + && (type & SI_WIRELESS_CONT_MASK) == SI_WIRELESS_CONT && !(type & SI_WIRELESS_LITE)) { + SITransfer(chan, &CmdReadOrigin, 1, &Origin[chan], 10, PADOriginUpdateCallback, 0); + } + else { + PADDisable(chan); + } +} + +BOOL PADReset(u32 mask) +{ + BOOL enabled; + u32 diableBits; + + enabled = OSDisableInterrupts(); + + mask |= PendingBits; + PendingBits = 0; + mask &= ~(WaitingBits | CheckingBits); + ResettingBits |= mask; + diableBits = ResettingBits & EnabledBits; + EnabledBits &= ~mask; + + if (Spec == PAD_SPEC_4) { + RecalibrateBits |= mask; + } + + SIDisablePolling(diableBits); + + if (ResettingChan == 32) { + DoReset(); + } + OSRestoreInterrupts(enabled); + return TRUE; +} + +BOOL PADRecalibrate(u32 mask) +{ + BOOL enabled; + u32 disableBits; + + enabled = OSDisableInterrupts(); + + mask |= PendingBits; + PendingBits = 0; + mask &= ~(WaitingBits | CheckingBits); + ResettingBits |= mask; + disableBits = ResettingBits & EnabledBits; + EnabledBits &= ~mask; + + if (!(UnkVal & 0x40)) { + RecalibrateBits |= mask; + } + + SIDisablePolling(disableBits); + if (ResettingChan == 32) { + DoReset(); + } + OSRestoreInterrupts(enabled); + return TRUE; +} + +BOOL PADInit() +{ + s32 chan; + if (Initialized) { + return TRUE; + } + + if (__PADSpec) { + PADSetSpec(__PADSpec); + } + + Initialized = TRUE; + + if (__PADFixBits != 0) { + OSTime time = OSGetTime(); + __OSWirelessPadFixMode = (u16)((((time)&0xffff) + ((time >> 16) & 0xffff) + ((time >> 32) & 0xffff) + ((time >> 48) & 0xffff)) & 0x3fffu); + RecalibrateBits = PAD_CHAN0_BIT | PAD_CHAN1_BIT | PAD_CHAN2_BIT | PAD_CHAN3_BIT; + } + + for (chan = 0; chan < SI_MAX_CHAN; ++chan) { + CmdProbeDevice[chan] = (0x4D << 24) | (chan << 22) | ((__OSWirelessPadFixMode & 0x3fffu) << 8); + } + + SIRefreshSamplingRate(); + OSRegisterResetFunction(&ResetFunctionInfo); + + return PADReset(PAD_CHAN0_BIT | PAD_CHAN1_BIT | PAD_CHAN2_BIT | PAD_CHAN3_BIT); +} + +#define offsetof(type, memb) ((u32) & ((type *)0)->memb) + +u32 PADRead(PADStatus *status) +{ + BOOL enabled; + s32 chan; + u32 data[2]; + u32 chanBit; + u32 sr; + int chanShift; + u32 motor; + + enabled = OSDisableInterrupts(); + + motor = 0; + for (chan = 0; chan < SI_MAX_CHAN; chan++, status++) { + chanBit = PAD_CHAN0_BIT >> chan; + chanShift = 8 * (SI_MAX_CHAN - 1 - chan); + + if (PendingBits & chanBit) { + PADReset(0); + status->err = PAD_ERR_NOT_READY; + memset(status, 0, offsetof(PADStatus, err)); + continue; + } + + if ((ResettingBits & chanBit) || ResettingChan == chan) { + status->err = PAD_ERR_NOT_READY; + memset(status, 0, offsetof(PADStatus, err)); + continue; + } + + if (!(EnabledBits & chanBit)) { + status->err = (s8)PAD_ERR_NO_CONTROLLER; + memset(status, 0, offsetof(PADStatus, err)); + continue; + } + + if (SIIsChanBusy(chan)) { + status->err = PAD_ERR_TRANSFER; + memset(status, 0, offsetof(PADStatus, err)); + continue; + } + + sr = SIGetStatus(chan); + if (sr & SI_ERROR_NO_RESPONSE) { + SIGetResponse(chan, data); + + if (WaitingBits & chanBit) { + status->err = (s8)PAD_ERR_NONE; + memset(status, 0, offsetof(PADStatus, err)); + + if (!(CheckingBits & chanBit)) { + CheckingBits |= chanBit; + SIGetTypeAsync(chan, PADReceiveCheckCallback); + } + continue; + } + + PADDisable(chan); + + status->err = (s8)PAD_ERR_NO_CONTROLLER; + memset(status, 0, offsetof(PADStatus, err)); + continue; + } + + if (!(SIGetType(chan) & SI_GC_NOMOTOR)) { + motor |= chanBit; + } + + if (!SIGetResponse(chan, data)) { + status->err = PAD_ERR_TRANSFER; + memset(status, 0, offsetof(PADStatus, err)); + continue; + } + + if (data[0] & 0x80000000) { + status->err = PAD_ERR_TRANSFER; + memset(status, 0, offsetof(PADStatus, err)); + continue; + } + + MakeStatus(chan, status, data); + + // Check and clear PAD_ORIGIN bit + if (status->button & 0x2000) { + status->err = PAD_ERR_TRANSFER; + memset(status, 0, offsetof(PADStatus, err)); + + // Get origin. It is okay if the following transfer fails + // since the PAD_ORIGIN bit remains until the read origin + // command complete. + SITransfer(chan, &CmdReadOrigin, 1, &Origin[chan], 10, PADOriginUpdateCallback, 0); + continue; + } + + status->err = PAD_ERR_NONE; + + // Clear PAD_INTERFERE bit + status->button &= ~0x0080; + } + + OSRestoreInterrupts(enabled); + return motor; +} + +void PADControlAllMotors(const u32 *commandArray) +{ + BOOL enabled; + int chan; + u32 command; + BOOL commit; + u32 chanBit; + + enabled = OSDisableInterrupts(); + commit = FALSE; + for (chan = 0; chan < SI_MAX_CHAN; chan++, commandArray++) { + chanBit = PAD_CHAN0_BIT >> chan; + if ((EnabledBits & chanBit) && !(SIGetType(chan) & SI_GC_NOMOTOR)) { + command = *commandArray; + if (Spec < PAD_SPEC_2 && command == PAD_MOTOR_STOP_HARD) { + command = PAD_MOTOR_STOP; + } + + SISetCommand(chan, (0x40 << 16) | AnalogMode | (command & (0x00000001 | 0x00000002))); + commit = TRUE; + } + } + if (commit) { + SITransferCommands(); + } + OSRestoreInterrupts(enabled); +} + +void PADControlMotor(s32 chan, u32 command) +{ + BOOL enabled; + u32 chanBit; + + enabled = OSDisableInterrupts(); + chanBit = PAD_CHAN0_BIT >> chan; + if ((EnabledBits & chanBit) && !(SIGetType(chan) & SI_GC_NOMOTOR)) { + if (Spec < PAD_SPEC_2 && command == PAD_MOTOR_STOP_HARD) { + command = PAD_MOTOR_STOP; + } + + SISetCommand(chan, (0x40 << 16) | AnalogMode | (command & (0x00000001 | 0x00000002))); + SITransferCommands(); + } + OSRestoreInterrupts(enabled); +} + +void PADSetSpec(u32 spec) +{ + __PADSpec = 0; + switch (spec) { + case PAD_SPEC_0: + MakeStatus = SPEC0_MakeStatus; + break; + case PAD_SPEC_1: + MakeStatus = SPEC1_MakeStatus; + break; + case PAD_SPEC_2: + case PAD_SPEC_3: + case PAD_SPEC_4: + case PAD_SPEC_5: + MakeStatus = SPEC2_MakeStatus; + break; + } + Spec = spec; +} + +u32 PADGetSpec(void) +{ + return Spec; +} + +static void SPEC0_MakeStatus(s32 chan, PADStatus *status, u32 data[2]) +{ + status->button = 0; + status->button |= ((data[0] >> 16) & 0x0008) ? PAD_BUTTON_A : 0; + status->button |= ((data[0] >> 16) & 0x0020) ? PAD_BUTTON_B : 0; + status->button |= ((data[0] >> 16) & 0x0100) ? PAD_BUTTON_X : 0; + status->button |= ((data[0] >> 16) & 0x0001) ? PAD_BUTTON_Y : 0; + status->button |= ((data[0] >> 16) & 0x0010) ? PAD_BUTTON_START : 0; + status->stickX = (s8)(data[1] >> 16); + status->stickY = (s8)(data[1] >> 24); + status->substickX = (s8)(data[1]); + status->substickY = (s8)(data[1] >> 8); + status->triggerL = (u8)(data[0] >> 8); + status->triggerR = (u8)data[0]; + status->analogA = 0; + status->analogB = 0; + if (170 <= status->triggerL) { + status->button |= PAD_TRIGGER_L; + } + if (170 <= status->triggerR) { + status->button |= PAD_TRIGGER_R; + } + status->stickX -= 128; + status->stickY -= 128; + status->substickX -= 128; + status->substickY -= 128; +} + +static void SPEC1_MakeStatus(s32 chan, PADStatus *status, u32 data[2]) +{ + + status->button = 0; + status->button |= ((data[0] >> 16) & 0x0080) ? PAD_BUTTON_A : 0; + status->button |= ((data[0] >> 16) & 0x0100) ? PAD_BUTTON_B : 0; + status->button |= ((data[0] >> 16) & 0x0020) ? PAD_BUTTON_X : 0; + status->button |= ((data[0] >> 16) & 0x0010) ? PAD_BUTTON_Y : 0; + status->button |= ((data[0] >> 16) & 0x0200) ? PAD_BUTTON_START : 0; + + status->stickX = (s8)(data[1] >> 16); + status->stickY = (s8)(data[1] >> 24); + status->substickX = (s8)(data[1]); + status->substickY = (s8)(data[1] >> 8); + + status->triggerL = (u8)(data[0] >> 8); + status->triggerR = (u8)data[0]; + + status->analogA = 0; + status->analogB = 0; + + if (170 <= status->triggerL) { + status->button |= PAD_TRIGGER_L; + } + if (170 <= status->triggerR) { + status->button |= PAD_TRIGGER_R; + } + + status->stickX -= 128; + status->stickY -= 128; + status->substickX -= 128; + status->substickY -= 128; +} + +static s8 ClampS8(s8 var, s8 org) +{ + if (0 < org) { + s8 min = (s8)(-128 + org); + if (var < min) { + var = min; + } + } + else if (org < 0) { + s8 max = (s8)(127 + org); + if (max < var) { + var = max; + } + } + return var -= org; +} + +static u8 ClampU8(u8 var, u8 org) +{ + if (var < org) { + var = org; + } + return var -= org; +} + +#define PAD_ALL \ + (PAD_BUTTON_LEFT | PAD_BUTTON_RIGHT | PAD_BUTTON_DOWN | PAD_BUTTON_UP | PAD_TRIGGER_Z | PAD_TRIGGER_R | PAD_TRIGGER_L | PAD_BUTTON_A \ + | PAD_BUTTON_B | PAD_BUTTON_X | PAD_BUTTON_Y | PAD_BUTTON_MENU | 0x2000 | 0x0080) + +static void SPEC2_MakeStatus(s32 chan, PADStatus *status, u32 data[2]) +{ + PADStatus *origin; + + status->button = (u16)((data[0] >> 16) & PAD_ALL); + status->stickX = (s8)(data[0] >> 8); + status->stickY = (s8)(data[0]); + + switch (AnalogMode & 0x00000700) { + case 0x00000000: + case 0x00000500: + case 0x00000600: + case 0x00000700: + status->substickX = (s8)(data[1] >> 24); + status->substickY = (s8)(data[1] >> 16); + status->triggerL = (u8)(((data[1] >> 12) & 0x0f) << 4); + status->triggerR = (u8)(((data[1] >> 8) & 0x0f) << 4); + status->analogA = (u8)(((data[1] >> 4) & 0x0f) << 4); + status->analogB = (u8)(((data[1] >> 0) & 0x0f) << 4); + break; + case 0x00000100: + status->substickX = (s8)(((data[1] >> 28) & 0x0f) << 4); + status->substickY = (s8)(((data[1] >> 24) & 0x0f) << 4); + status->triggerL = (u8)(data[1] >> 16); + status->triggerR = (u8)(data[1] >> 8); + status->analogA = (u8)(((data[1] >> 4) & 0x0f) << 4); + status->analogB = (u8)(((data[1] >> 0) & 0x0f) << 4); + break; + case 0x00000200: + status->substickX = (s8)(((data[1] >> 28) & 0x0f) << 4); + status->substickY = (s8)(((data[1] >> 24) & 0x0f) << 4); + status->triggerL = (u8)(((data[1] >> 20) & 0x0f) << 4); + status->triggerR = (u8)(((data[1] >> 16) & 0x0f) << 4); + status->analogA = (u8)(data[1] >> 8); + status->analogB = (u8)(data[1] >> 0); + break; + case 0x00000300: + status->substickX = (s8)(data[1] >> 24); + status->substickY = (s8)(data[1] >> 16); + status->triggerL = (u8)(data[1] >> 8); + status->triggerR = (u8)(data[1] >> 0); + status->analogA = 0; + status->analogB = 0; + break; + case 0x00000400: + status->substickX = (s8)(data[1] >> 24); + status->substickY = (s8)(data[1] >> 16); + status->triggerL = 0; + status->triggerR = 0; + status->analogA = (u8)(data[1] >> 8); + status->analogB = (u8)(data[1] >> 0); + break; + } + + status->stickX -= 128; + status->stickY -= 128; + status->substickX -= 128; + status->substickY -= 128; + + origin = &Origin[chan]; + status->stickX = ClampS8(status->stickX, origin->stickX); + status->stickY = ClampS8(status->stickY, origin->stickY); + status->substickX = ClampS8(status->substickX, origin->substickX); + status->substickY = ClampS8(status->substickY, origin->substickY); + status->triggerL = ClampU8(status->triggerL, origin->triggerL); + status->triggerR = ClampU8(status->triggerR, origin->triggerR); +} + +BOOL PADGetType(s32 chan, u32 *type) +{ + u32 chanBit; + + *type = SIGetType(chan); + chanBit = PAD_CHAN0_BIT >> chan; + if ((ResettingBits & chanBit) || ResettingChan == chan || !(EnabledBits & chanBit)) { + return FALSE; + } + return TRUE; +} + +BOOL PADSync(void) +{ + return ResettingBits == 0 && ResettingChan == 32 && !SIBusy(); +} + +void PADSetAnalogMode(u32 mode) +{ + BOOL enabled; + u32 mask; + + enabled = OSDisableInterrupts(); + AnalogMode = mode << 8; + mask = EnabledBits; + + EnabledBits &= ~mask; + WaitingBits &= ~mask; + CheckingBits &= ~mask; + + SIDisablePolling(mask); + OSRestoreInterrupts(enabled); +} + +static BOOL OnReset(BOOL f) +{ + static BOOL recalibrated = FALSE; + BOOL sync; + + if (SamplingCallback) { + PADSetSamplingCallback(NULL); + } + + if (!f) { + sync = PADSync(); + if (!recalibrated && sync) { + recalibrated = PADRecalibrate(PAD_CHAN0_BIT | PAD_CHAN1_BIT | PAD_CHAN2_BIT | PAD_CHAN3_BIT); + return FALSE; + } + return sync; + } + else { + recalibrated = FALSE; + } + + return TRUE; +} + +void __PADDisableXPatch(void) +{ + XPatchBits = 0; +} + +static void SamplingHandler(__OSInterrupt interrupt, OSContext *context) +{ + OSContext exceptionContext; + + if (SamplingCallback) { + OSClearContext(&exceptionContext); + OSSetCurrentContext(&exceptionContext); + SamplingCallback(); + OSClearContext(&exceptionContext); + OSSetCurrentContext(context); + } +} + +PADSamplingCallback PADSetSamplingCallback(PADSamplingCallback callback) +{ + PADSamplingCallback prev; + + prev = SamplingCallback; + SamplingCallback = callback; + if (callback) { + SIRegisterPollingHandler(SamplingHandler); + } + else { + SIUnregisterPollingHandler(SamplingHandler); + } + return prev; +} + +BOOL __PADDisableRecalibration(BOOL disable) +{ + BOOL enabled; + BOOL prev; + + enabled = OSDisableInterrupts(); + prev = (UnkVal & 0x40) ? TRUE : FALSE; + UnkVal &= (u8)~0x40; + if (disable) { + UnkVal |= 0x40; + } + OSRestoreInterrupts(enabled); + return prev; +} diff --git a/src/dolphin/pad/Padclamp.c b/src/dolphin/pad/Padclamp.c new file mode 100644 index 00000000..a96d75c4 --- /dev/null +++ b/src/dolphin/pad/Padclamp.c @@ -0,0 +1,119 @@ +#include + +#include + +typedef struct PADClampRegion { + u8 minTrigger; + u8 maxTrigger; + s8 minStick; + s8 maxStick; + s8 xyStick; + s8 minSubstick; + s8 maxSubstick; + s8 xySubstick; +} PADClampRegion; + +static PADClampRegion ClampRegion = { + // Triggers + 30, + 180, + + // Left stick + 15, + 72, + 40, + + // Right stick + 15, + 59, + 31, +}; + +static void ClampStick(s8 *px, s8 *py, s8 max, s8 xy, s8 min) +{ + int x = *px; + int y = *py; + int signX; + int signY; + int d; + + if (0 <= x) { + signX = 1; + } + else { + signX = -1; + x = -x; + } + + if (0 <= y) { + signY = 1; + } + else { + signY = -1; + y = -y; + } + + if (x <= min) { + x = 0; + } + else { + x -= min; + } + if (y <= min) { + y = 0; + } + else { + y -= min; + } + + if (x == 0 && y == 0) { + *px = *py = 0; + return; + } + + if (xy * y <= xy * x) { + d = xy * x + (max - xy) * y; + if (xy * max < d) { + x = (s8)(xy * max * x / d); + y = (s8)(xy * max * y / d); + } + } + else { + d = xy * y + (max - xy) * x; + if (xy * max < d) { + x = (s8)(xy * max * x / d); + y = (s8)(xy * max * y / d); + } + } + + *px = (s8)(signX * x); + *py = (s8)(signY * y); +} + +static void ClampTrigger(u8 *trigger, u8 min, u8 max) +{ + if (*trigger <= min) { + *trigger = 0; + } + else { + if (max < *trigger) { + *trigger = max; + } + *trigger -= min; + } +} + +void PADClamp(PADStatus *status) +{ + // int i; + // for (i = 0; i < PAD_CHANMAX; i++, status++) { + // if (status->err != PAD_ERR_NONE) { + // continue; + // } + + // ClampStick(&status->stickX, &status->stickY, ClampRegion.maxStick, ClampRegion.xyStick, ClampRegion.minStick); + // ClampStick(&status->substickX, &status->substickY, ClampRegion.maxSubstick, ClampRegion.xySubstick, ClampRegion.minSubstick); + // ClampTrigger(&status->triggerL, ClampRegion.minTrigger, ClampRegion.maxTrigger); + // ClampTrigger(&status->triggerR, ClampRegion.minTrigger, ClampRegion.maxTrigger); + // } +} From 5bfbe7814b5126c7dc0018ab5fe9985d24613767 Mon Sep 17 00:00:00 2001 From: gamemasterplc Date: Mon, 11 Nov 2024 17:20:41 -0600 Subject: [PATCH 13/29] Fix dvd.c --- config/GMPE01_00/symbols.txt | 2 +- configure.py | 2 +- src/dolphin/dvd/dvd.c | 37 +----------------------------------- 3 files changed, 3 insertions(+), 38 deletions(-) diff --git a/config/GMPE01_00/symbols.txt b/config/GMPE01_00/symbols.txt index 99198763..5acdcfae 100644 --- a/config/GMPE01_00/symbols.txt +++ b/config/GMPE01_00/symbols.txt @@ -5627,7 +5627,7 @@ Prepared = .sbss:0x801D4320; // type:object size:0x8 scope:local data:4byte ResetFunctionQueue = .sbss:0x801D4328; // type:object size:0x8 scope:local data:4byte ResetCallback = .sbss:0x801D4330; // type:object size:0x4 data:4byte Down = .sbss:0x801D4334; // type:object size:0x4 data:4byte -LastState = .sbss:0x801D4338; // type:object size:0x8 data:4byte +LastState = .sbss:0x801D4338; // type:object size:0x8 scope:local data:4byte HoldUp = .sbss:0x801D4340; // type:object size:0x8 align:8 data:4byte HoldDown = .sbss:0x801D4348; // type:object size:0x8 align:8 data:4byte RunQueueBits = .sbss:0x801D4350; // type:object size:0x4 scope:local data:4byte diff --git a/configure.py b/configure.py index cc6076bf..680ce836 100644 --- a/configure.py +++ b/configure.py @@ -496,7 +496,7 @@ config.libs = [ [ Object(Matching, "dolphin/dvd/dvdlow.c"), Object(Matching, "dolphin/dvd/dvdfs.c"), - Object(NonMatching, "dolphin/dvd/dvd.c"), + Object(Matching, "dolphin/dvd/dvd.c"), Object(Matching, "dolphin/dvd/dvdqueue.c"), Object(Matching, "dolphin/dvd/dvderror.c"), Object(Matching, "dolphin/dvd/fstload.c"), diff --git a/src/dolphin/dvd/dvd.c b/src/dolphin/dvd/dvd.c index 9253df47..5ddde4fc 100644 --- a/src/dolphin/dvd/dvd.c +++ b/src/dolphin/dvd/dvd.c @@ -6,7 +6,6 @@ #include typedef void (*stateFunc)(DVDCommandBlock *block); -stateFunc LastState; extern OSThreadQueue __DVDThreadQueue; @@ -34,6 +33,7 @@ static DVDCommandBlock DummyCommandBlock; static OSAlarm ResetAlarm; static BOOL DVDInitialized = FALSE; +static stateFunc LastState; /* States */ static void stateReadingFST(); @@ -736,41 +736,6 @@ static void stateBusy(DVDCommandBlock *block) } } -// removing these matches DVDCancelAsync and DVDCheckDisk -static u32 ImmCommand[] = { 0xffffffff, 0xffffffff, 0xffffffff }; -static u32 DmaCommand[] = { 0xffffffff }; - -inline static BOOL IsImmCommandWithResult(u32 command) -{ - u32 i; - - if (command == 9 || command == 10 || command == 11 || command == 12) { - return TRUE; - } - - for (i = 0; i < sizeof(ImmCommand) / sizeof(ImmCommand[0]); i++) { - if (command == ImmCommand[i]) - return TRUE; - } - - return FALSE; -} - -inline static BOOL IsDmaCommand(u32 command) -{ - u32 i; - - if (command == 1 || command == 4 || command == 5 || command == 14) - return TRUE; - - for (i = 0; i < sizeof(DmaCommand) / sizeof(DmaCommand[0]); i++) { - if (command == DmaCommand[i]) - return TRUE; - } - - return FALSE; -} - void cbForStateBusy(u32 intType) { DVDCommandBlock *finished; From 5877067872af832ede18b044caab8ddb8c9b28de Mon Sep 17 00:00:00 2001 From: gamemasterplc Date: Mon, 11 Nov 2024 17:24:55 -0600 Subject: [PATCH 14/29] mtxquat fixes --- configure.py | 8 +++++++- src/dolphin/mtx/quat.c | 6 +++++- 2 files changed, 12 insertions(+), 2 deletions(-) diff --git a/configure.py b/configure.py index 680ce836..cc9c8936 100644 --- a/configure.py +++ b/configure.py @@ -210,6 +210,12 @@ cflags_runtime = [ "-inline auto,deferred", ] +# Dolphin library flags +cflags_dolphin = [ + *cflags_base, + "-fp_contract off", +] + # Metrowerks library flags cflags_msl = [ *cflags_base, @@ -304,7 +310,7 @@ def DolphinLib(lib_name, objects): return { "lib": lib_name, "mw_version": "GC/1.2.5n", - "cflags": cflags_base, + "cflags": cflags_dolphin, "host": False, "objects": objects, } diff --git a/src/dolphin/mtx/quat.c b/src/dolphin/mtx/quat.c index a874e14c..66964bf0 100644 --- a/src/dolphin/mtx/quat.c +++ b/src/dolphin/mtx/quat.c @@ -1,5 +1,9 @@ #include "dolphin/mtx.h" -#include "math.h" + +float acosf(float x); + +float sinf(float x); +float cosf(float x); void PSQUATMultiply(register const Quaternion *a, register const Quaternion *b, register Quaternion *ab) { From 36a05264a5b0a3944bccbe20080868554fd46abd Mon Sep 17 00:00:00 2001 From: dbalatoni13 Date: Tue, 12 Nov 2024 01:40:59 +0100 Subject: [PATCH 15/29] Imported dolphin/demo except for one function --- include/dolphin/demo.h | 72 +++ include/dolphin/demo/DEMOInit.h | 21 + include/dolphin/demo/DEMOPad.h | 26 ++ include/dolphin/demo/DEMOPuts.h | 27 ++ include/dolphin/demo/DEMOStats.h | 38 ++ include/dolphin/demo/DEMOWin.h | 77 +++ include/dolphin/demotypes.h | 11 + src/dolphin/demo/DEMOFont.c | 773 +++++++++++++++++++++++++++++++ src/dolphin/demo/DEMOInit.c | 251 ++++++++++ src/dolphin/demo/DEMOPuts.c | 146 ++++++ src/dolphin/demo/DEMOStats.c | 424 +++++++++++++++++ 11 files changed, 1866 insertions(+) create mode 100644 include/dolphin/demo.h create mode 100644 include/dolphin/demo/DEMOInit.h create mode 100644 include/dolphin/demo/DEMOPad.h create mode 100644 include/dolphin/demo/DEMOPuts.h create mode 100644 include/dolphin/demo/DEMOStats.h create mode 100644 include/dolphin/demo/DEMOWin.h create mode 100644 include/dolphin/demotypes.h create mode 100644 src/dolphin/demo/DEMOFont.c create mode 100644 src/dolphin/demo/DEMOInit.c create mode 100644 src/dolphin/demo/DEMOPuts.c create mode 100644 src/dolphin/demo/DEMOStats.c diff --git a/include/dolphin/demo.h b/include/dolphin/demo.h new file mode 100644 index 00000000..b712723a --- /dev/null +++ b/include/dolphin/demo.h @@ -0,0 +1,72 @@ +#ifndef _DOLPHIN_DEMO +#define _DOLPHIN_DEMO + +#include +#include + +struct STRUCT_MENU_ITEM { + /* 0x00 */ char * name; + /* 0x04 */ unsigned long flags; + /* 0x08 */ void (* function)(struct STRUCT_MENU *, unsigned long, unsigned long *); + /* 0x0C */ struct STRUCT_MENU * link; +}; + +struct STRUCT_MENU { + /* 0x00 */ char * title; + /* 0x04 */ struct STRUCT_DEMOWIN * handle; + /* 0x08 */ struct STRUCT_MENU_ITEM * items; + /* 0x0C */ long max_display_items; + /* 0x10 */ unsigned long flags; + /* 0x14 */ void (* cb_open)(struct STRUCT_MENU *, unsigned long); + /* 0x18 */ void (* cb_move)(struct STRUCT_MENU *, unsigned long); + /* 0x1C */ void (* cb_select)(struct STRUCT_MENU *, unsigned long); + /* 0x20 */ void (* cb_cancel)(struct STRUCT_MENU *, unsigned long); + /* 0x24 */ long num_display_items; + /* 0x28 */ long num_items; + /* 0x2C */ unsigned long max_str_len; + /* 0x30 */ long curr_pos; + /* 0x34 */ long display_pos; +}; + +typedef struct { + /* 0x00 */ struct PADStatus pads[4]; + /* 0x30 */ unsigned long button[4]; + /* 0x40 */ unsigned long old_button[4]; + /* 0x50 */ unsigned long changed_button[4]; + /* 0x60 */ unsigned long repeat_button[4]; + /* 0x70 */ unsigned long repeat_ctr[4]; +} DEMOWinPadInfo; + +struct STRUCT_LISTBOX_ITEM { + /* 0x00 */ char * name; // offset 0x0, size 0x4 + /* 0x04 */ unsigned long flags; // offset 0x4, size 0x4 +}; + +struct STRUCT_LISTBOX { + /* 0x00 */ char * title; // offset 0x0, size 0x4 + /* 0x04 */ struct STRUCT_DEMOWIN * handle; // offset 0x4, size 0x4 + /* 0x08 */ struct STRUCT_LISTBOX_ITEM * items; // offset 0x8, size 0x4 + /* 0x0C */ long max_display_items; // offset 0xC, size 0x4 + /* 0x10 */ unsigned long flags; // offset 0x10, size 0x4 + /* 0x14 */ long num_display_items; // offset 0x14, size 0x4 + /* 0x18 */ long num_items; // offset 0x18, size 0x4 + /* 0x1C */ unsigned long max_str_len; // offset 0x1C, size 0x4 + /* 0x20 */ long curr_pos; // offset 0x20, size 0x4 + /* 0x24 */ long display_pos; // offset 0x24, size 0x4 + /* 0x28 */ int cursor_state; // offset 0x28, size 0x4 +}; + +extern unsigned long DEMOFontBitmap[768]; + +#include +#include +#include +#include +#include + +// unsorted externs +extern void DEMOPrintf(s16 x, s16 y, s16 priority, char *str, ...); + +extern struct _GXRenderModeObj *DEMOGetRenderModeObj(); + +#endif diff --git a/include/dolphin/demo/DEMOInit.h b/include/dolphin/demo/DEMOInit.h new file mode 100644 index 00000000..00bcd849 --- /dev/null +++ b/include/dolphin/demo/DEMOInit.h @@ -0,0 +1,21 @@ +#ifndef _DOLPHIN_DEMOINIT +#define _DOLPHIN_DEMOINIT + +#include + +extern void *DemoFrameBuffer1; +extern void *DemoFrameBuffer2; +extern void *DemoCurrentBuffer; + +void DEMOInit(struct _GXRenderModeObj *mode); +void DEMOBeforeRender(); +void DEMODoneRender(); +void DEMOSwapBuffers(); +void DEMOSetTevColorIn(enum _GXTevStageID stage, enum _GXTevColorArg a, enum _GXTevColorArg b, enum _GXTevColorArg c, enum _GXTevColorArg d); +void DEMOSetTevOp(enum _GXTevStageID id, enum _GXTevMode mode); +struct _GXRenderModeObj *DEMOGetRenderModeObj(); +u32 DEMOGetCurrentBuffer(void); +void DEMOEnableBypassWorkaround(unsigned long timeoutFrames); +void DEMOReInit(struct _GXRenderModeObj *mode); + +#endif diff --git a/include/dolphin/demo/DEMOPad.h b/include/dolphin/demo/DEMOPad.h new file mode 100644 index 00000000..34bcc6b6 --- /dev/null +++ b/include/dolphin/demo/DEMOPad.h @@ -0,0 +1,26 @@ +#ifndef _DOLPHIN_DEMOPAD +#define _DOLPHIN_DEMOPAD + +#include + +typedef struct { + /* 0x00 */ struct PADStatus pst; + /* 0x0C */ u16 buttonDown; + /* 0x0E */ u16 buttonUp; + /* 0x10 */ u16 dirs; + /* 0x12 */ u16 dirsNew; + /* 0x14 */ u16 dirsReleased; + /* 0x16 */ s16 stickDeltaX; + /* 0x18 */ s16 stickDeltaY; + /* 0x1A */ s16 substickDeltaX; + /* 0x1C */ s16 substickDeltaY; +} DEMODMPad; + +extern DEMODMPad DemoPad[4]; + +extern u32 DemoNumValidPads; + +void DEMOPadRead(); +void DEMOPadInit(); + +#endif diff --git a/include/dolphin/demo/DEMOPuts.h b/include/dolphin/demo/DEMOPuts.h new file mode 100644 index 00000000..49434d9c --- /dev/null +++ b/include/dolphin/demo/DEMOPuts.h @@ -0,0 +1,27 @@ +#ifndef _DOLPHIN_DEMOPUTS +#define _DOLPHIN_DEMOPUTS + +#include + +typedef enum { + DMTF_POINTSAMPLE, + DMTF_BILERP, +} DMTexFlt; + +typedef enum { DM_FT_OPQ, DM_FT_RVS, DM_FT_XLU } DMFontType; + +void DEMOSetFontType(DMFontType attr); +void DEMOLoadFont(enum _GXTexMapID texMap, enum _GXTexMtx texMtx, DMTexFlt texFlt); +void DEMOSetupScrnSpc(long width, long height, float depth); +void DEMOInitCaption(long font_type, long width, long height); +void DEMOPuts(s16 x, s16 y, s16 z, char *string); +void DEMOPrintf(s16 x, s16 y, s16 z, char *fmt, ...); +struct OSFontHeader *DEMOInitROMFont(); +void DEMOSetROMFontSize(s16 size, s16 space); +int DEMORFPuts(s16 x, s16 y, s16 z, char *string); +int DEMORFPutsEx(s16 x, s16 y, s16 z, char *string, s16 maxWidth, int length); +int DEMORFPrintf(s16 x, s16 y, s16 z, char *fmt, ...); +char *DEMODumpROMFont(char *string); +int DEMOGetRFTextWidth(char *string); + +#endif diff --git a/include/dolphin/demo/DEMOStats.h b/include/dolphin/demo/DEMOStats.h new file mode 100644 index 00000000..5ec6e00a --- /dev/null +++ b/include/dolphin/demo/DEMOStats.h @@ -0,0 +1,38 @@ +#ifndef _DOLPHIN_DEMOSTATS +#define _DOLPHIN_DEMOSTATS + +typedef enum DEMO_STAT_TYPE { + DEMO_STAT_GP0 = 0, + DEMO_STAT_GP1 = 1, + DEMO_STAT_MEM = 2, + DEMO_STAT_PIX = 3, + DEMO_STAT_VC = 4, + DEMO_STAT_FR = 5, + DEMO_STAT_TBW = 6, + DEMO_STAT_TBP = 7, + DEMO_STAT_MYC = 8, + DEMO_STAT_MYR = 9, +} DEMO_STAT_TYPE; + +typedef struct DemoStatData { + char text[50]; + DEMO_STAT_TYPE stat_type; + unsigned long stat; + unsigned long count; +} DemoStatData; + +typedef enum { + DEMO_STAT_TL = 0, + DEMO_STAT_BL = 1, + DEMO_STAT_TLD = 2, + DEMO_STAT_BLD = 3, + DEMO_STAT_IO = 4, +} DEMO_STAT_DISP; + +extern unsigned char DemoStatEnable; + +void DEMOSetStats(DemoStatData * stat, unsigned long nstats, DEMO_STAT_DISP disp); +void DEMOUpdateStats(unsigned char inc); +void DEMOPrintStats(void); + +#endif diff --git a/include/dolphin/demo/DEMOWin.h b/include/dolphin/demo/DEMOWin.h new file mode 100644 index 00000000..2c24b50d --- /dev/null +++ b/include/dolphin/demo/DEMOWin.h @@ -0,0 +1,77 @@ +#ifndef _DOLPHIN_DEMOWIN +#define _DOLPHIN_DEMOWIN + +#include +#include + +enum DEMOWinItem { + DEMOWIN_ITEM_CAP, + DEMOWIN_ITEM_BKGND, + DEMOWIN_ITEM_BORDER, + DEMOWIN_ITEM_DEFAULT +}; + +// flags +#define DEMOWIN_FLAGS_INIT (1 << 0) +#define DEMOWIN_FLAGS_OPENED (1 << 1) + +struct STRUCT_DEMOWIN { + /* 0x00 */ long x1; + /* 0x04 */ long y1; + /* 0x08 */ long x2; + /* 0x0C */ long y2; + /* 0x10 */ unsigned long priority; + /* 0x14 */ unsigned long flags; + /* 0x18 */ unsigned short x_cal; + /* 0x1A */ unsigned short y_cal; + /* 0x1C */ unsigned short pixel_width; + /* 0x1E */ unsigned short pixel_height; + /* 0x20 */ unsigned short char_width; + /* 0x22 */ unsigned short char_height; + /* 0x24 */ unsigned short num_scroll_lines; + /* 0x26 */ unsigned short total_lines; + /* 0x28 */ unsigned short curr_output_line; + /* 0x2A */ unsigned short curr_output_col; + /* 0x2C */ unsigned short curr_view_line; + /* 0x2E */ signed short cursor_line; + /* 0x30 */ char * caption; + /* 0x34 */ unsigned char * buffer; + /* 0x38 */ GXColor bkgnd; + /* 0x3C */ GXColor cap; + /* 0x40 */ GXColor border; + /* 0x44 */ void (* refresh)(struct STRUCT_DEMOWIN *); + /* 0x48 */ struct STRUCT_DEMOWIN * next; + /* 0x4C */ struct STRUCT_DEMOWIN * prev; + /* 0x50 */ void * parent; +}; + +// functions +void DEMOWinInit(); +struct STRUCT_DEMOWIN * DEMOWinCreateWindow(s32 x1, s32 y1, s32 x2, s32 y2, char * caption, u16 scroll, void * func); +void DEMOWinDestroyWindow(struct STRUCT_DEMOWIN * handle); +void DEMOWinOpenWindow(struct STRUCT_DEMOWIN * handle); +void DEMOWinCloseWindow(struct STRUCT_DEMOWIN * handle); +void DEMOWinSetWindowColor(struct STRUCT_DEMOWIN * handle, enum DEMOWinItem item, u8 r, u8 g, u8 b, u8 a); +void DEMOWinLogPrintf(struct STRUCT_DEMOWIN * handle, char * fmt, ...); +void DEMOWinPrintfXY(struct STRUCT_DEMOWIN * handle, u16 col, u16 row, char * fmt, ...); +void DEMOWinScrollWindow(struct STRUCT_DEMOWIN * handle, u32 dir); +void DEMOWinBringToFront(struct STRUCT_DEMOWIN * handle); +void DEMOWinSendToBack(struct STRUCT_DEMOWIN * handle); +void DEMOWinClearRow(struct STRUCT_DEMOWIN * handle, u16 row); +void DEMOWinClearWindow(struct STRUCT_DEMOWIN * handle); +void DEMOWinClearBuffer(struct STRUCT_DEMOWIN * handle); +void DEMOWinRefresh(); +struct STRUCT_MENU * DEMOWinCreateMenuWindow(struct STRUCT_MENU * menu, u16 x, u16 y); +void DEMOWinDestroyMenuWindow(struct STRUCT_MENU * menu); +u32 DEMOWinMenuChild(struct STRUCT_MENU * menu, int child_flag); +void DEMOWinPadInit(DEMOWinPadInfo *p); +void DEMOWinPadRead(DEMOWinPadInfo *p); +void DEMOWinSetRepeat(unsigned long threshold, unsigned long rate); +void DEMOWinResetRepeat(); +struct STRUCT_LISTBOX * DEMOWinCreateListWindow(struct STRUCT_LISTBOX * list, unsigned short x, unsigned short y); +void DEMOWinDestroyListWindow(struct STRUCT_LISTBOX * list); +void DEMOWinListSetCursor(struct STRUCT_LISTBOX * list, int x); +long DEMOWinListScrollList(struct STRUCT_LISTBOX * list, unsigned long dir); +long DEMOWinListMoveCursor(struct STRUCT_LISTBOX * list, unsigned long dir); + +#endif diff --git a/include/dolphin/demotypes.h b/include/dolphin/demotypes.h new file mode 100644 index 00000000..00f29a3c --- /dev/null +++ b/include/dolphin/demotypes.h @@ -0,0 +1,11 @@ +#ifndef _DOLPHIN_DEMOTYPES +#define _DOLPHIN_DEMOTYPES + +#include + +extern struct STRUCT_DEMOWIN * __first_node; +extern struct STRUCT_DEMOWIN * __last_node; +extern struct STRUCT_DEMOWIN * __curr_node; +extern struct _GXRenderModeObj * __rmp; + +#endif diff --git a/src/dolphin/demo/DEMOFont.c b/src/dolphin/demo/DEMOFont.c new file mode 100644 index 00000000..121cd356 --- /dev/null +++ b/src/dolphin/demo/DEMOFont.c @@ -0,0 +1,773 @@ +#include +#include + +unsigned long DEMOFontBitmap[768] ATTRIBUTE_ALIGN(32) = { + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x000FF000, + 0x000FF000, + 0x000FF000, + 0x000FF000, + 0x000FF000, + 0x00000000, + 0x000FF000, + 0x00000000, + 0x00F00F00, + 0x00F00F00, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00F00F00, + 0x00F00F00, + 0x0FFFFFF0, + 0x00F00F00, + 0x0FFFFFF0, + 0x00F00F00, + 0x00F00F00, + 0x00000000, + 0x0000F000, + 0x00FFFFF0, + 0x0F00F000, + 0x00FFFF00, + 0x0000F0F0, + 0x0FFFFF00, + 0x0000F000, + 0x00000000, + 0x0FF000F0, + 0x0FF00F00, + 0x0000F000, + 0x000F0000, + 0x00F00FF0, + 0x0F000FF0, + 0x00000000, + 0x00000000, + 0x000F0000, + 0x00F0F000, + 0x00F0F000, + 0x00FF0000, + 0x0F000FF0, + 0x0F0000F0, + 0x00FFFF00, + 0x00000000, + 0x000FF000, + 0x000FF000, + 0x0000F000, + 0x000F0000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x0000F000, + 0x000F0000, + 0x00F00000, + 0x00F00000, + 0x00F00000, + 0x000F0000, + 0x0000F000, + 0x00000000, + 0x000F0000, + 0x0000F000, + 0x00000F00, + 0x00000F00, + 0x00000F00, + 0x0000F000, + 0x000F0000, + 0x00000000, + 0x00000000, + 0x00F000F0, + 0x000F0F00, + 0x00FFFFF0, + 0x000F0F00, + 0x00F000F0, + 0x00000000, + 0x00000000, + 0x00000000, + 0x0000F000, + 0x0000F000, + 0x00FFFFF0, + 0x0000F000, + 0x0000F000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x000FF000, + 0x000FF000, + 0x0000F000, + 0x000F0000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00FFFFF0, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x000FF000, + 0x000FF000, + 0x00000000, + 0x000000F0, + 0x00000F00, + 0x0000F000, + 0x000F0000, + 0x00F00000, + 0x0F000000, + 0x00000000, + 0x00000000, + 0x000FF000, + 0x00F00F00, + 0x0F0000F0, + 0x0F0000F0, + 0x0F0000F0, + 0x00F00F00, + 0x000FF000, + 0x00000000, + 0x0000F000, + 0x000FF000, + 0x0000F000, + 0x0000F000, + 0x0000F000, + 0x0000F000, + 0x000FFF00, + 0x00000000, + 0x00FFFF00, + 0x0F0000F0, + 0x000000F0, + 0x00000F00, + 0x0000F000, + 0x000F0000, + 0x0FFFFFF0, + 0x00000000, + 0x00FFFF00, + 0x0F0000F0, + 0x000000F0, + 0x0000FF00, + 0x000000F0, + 0x0F0000F0, + 0x00FFFF00, + 0x00000000, + 0x00000F00, + 0x0000FF00, + 0x000F0F00, + 0x00F00F00, + 0x0FFFFFF0, + 0x00000F00, + 0x00000F00, + 0x00000000, + 0x0FFFFFF0, + 0x0F000000, + 0x0F000000, + 0x0FFFFF00, + 0x000000F0, + 0x0F0000F0, + 0x00FFFF00, + 0x00000000, + 0x000FFF00, + 0x00F00000, + 0x0F000000, + 0x0FFFFF00, + 0x0F0000F0, + 0x0F0000F0, + 0x00FFFF00, + 0x00000000, + 0x0FFFFFF0, + 0x0F0000F0, + 0x00000F00, + 0x0000F000, + 0x0000F000, + 0x0000F000, + 0x0000F000, + 0x00000000, + 0x00FFFF00, + 0x0F0000F0, + 0x0F0000F0, + 0x00FFFF00, + 0x0F0000F0, + 0x0F0000F0, + 0x00FFFF00, + 0x00000000, + 0x00FFFF00, + 0x0F0000F0, + 0x0F0000F0, + 0x00FFFFF0, + 0x000000F0, + 0x000000F0, + 0x00FFFF00, + 0x00000000, + 0x00000000, + 0x000FF000, + 0x000FF000, + 0x00000000, + 0x000FF000, + 0x000FF000, + 0x00000000, + 0x00000000, + 0x000FF000, + 0x000FF000, + 0x00000000, + 0x000FF000, + 0x000FF000, + 0x0000F000, + 0x000F0000, + 0x00000000, + 0x00000F00, + 0x0000F000, + 0x000F0000, + 0x00F00000, + 0x000F0000, + 0x0000F000, + 0x00000F00, + 0x00000000, + 0x00000000, + 0x00000000, + 0x0FFFFFF0, + 0x00000000, + 0x0FFFFFF0, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00F00000, + 0x000F0000, + 0x0000F000, + 0x00000F00, + 0x0000F000, + 0x000F0000, + 0x00F00000, + 0x00000000, + 0x00FFFF00, + 0x0F0000F0, + 0x0F0000F0, + 0x0000FF00, + 0x000FF000, + 0x00000000, + 0x000FF000, + 0x00000000, + 0x00FFFF00, + 0x0F0000F0, + 0x0F000FF0, + 0x0F00F0F0, + 0x0F00FFF0, + 0x0F000000, + 0x00FFFFF0, + 0x00000000, + 0x000FF000, + 0x00F00F00, + 0x0F0000F0, + 0x0F0000F0, + 0x0FFFFFF0, + 0x0F0000F0, + 0x0F0000F0, + 0x00000000, + 0x0FFFFF00, + 0x0F0000F0, + 0x0F0000F0, + 0x0FFFFF00, + 0x0F0000F0, + 0x0F0000F0, + 0x0FFFFF00, + 0x00000000, + 0x000FFF00, + 0x00F000F0, + 0x0F000000, + 0x0F000000, + 0x0F000000, + 0x00F000F0, + 0x000FFF00, + 0x00000000, + 0x0FFFF000, + 0x0F000F00, + 0x0F0000F0, + 0x0F0000F0, + 0x0F0000F0, + 0x0F000F00, + 0x0FFFF000, + 0x00000000, + 0x0FFFFFF0, + 0x0F000000, + 0x0F000000, + 0x0FFFFF00, + 0x0F000000, + 0x0F000000, + 0x0FFFFFF0, + 0x00000000, + 0x0FFFFFF0, + 0x0F000000, + 0x0F000000, + 0x0FFFFF00, + 0x0F000000, + 0x0F000000, + 0x0F000000, + 0x00000000, + 0x000FFF00, + 0x00F00000, + 0x0F000000, + 0x0F00FFF0, + 0x0F0000F0, + 0x00F000F0, + 0x000FFF00, + 0x00000000, + 0x0F0000F0, + 0x0F0000F0, + 0x0F0000F0, + 0x0FFFFFF0, + 0x0F0000F0, + 0x0F0000F0, + 0x0F0000F0, + 0x00000000, + 0x000FFF00, + 0x0000F000, + 0x0000F000, + 0x0000F000, + 0x0000F000, + 0x0000F000, + 0x000FFF00, + 0x00000000, + 0x0000FFF0, + 0x00000F00, + 0x00000F00, + 0x00000F00, + 0x00000F00, + 0x0F000F00, + 0x00FFF000, + 0x00000000, + 0x0F0000F0, + 0x0F000F00, + 0x0F00F000, + 0x0FFF0000, + 0x0F00F000, + 0x0F000F00, + 0x0F0000F0, + 0x00000000, + 0x0F000000, + 0x0F000000, + 0x0F000000, + 0x0F000000, + 0x0F000000, + 0x0F000000, + 0x0FFFFFF0, + 0x00000000, + 0x0F00000F, + 0x0FF000FF, + 0x0F0F0F0F, + 0x0F00F00F, + 0x0F00F00F, + 0x0F00000F, + 0x0F00000F, + 0x00000000, + 0x0F0000F0, + 0x0FF000F0, + 0x0F0F00F0, + 0x0F00F0F0, + 0x0F00F0F0, + 0x0F000FF0, + 0x0F0000F0, + 0x00000000, + 0x00FFFF00, + 0x0F0000F0, + 0x0F0000F0, + 0x0F0000F0, + 0x0F0000F0, + 0x0F0000F0, + 0x00FFFF00, + 0x00000000, + 0x0FFFFF00, + 0x0F0000F0, + 0x0F0000F0, + 0x0FFFFF00, + 0x0F000000, + 0x0F000000, + 0x0F000000, + 0x00000000, + 0x00FFFF00, + 0x0F0000F0, + 0x0F0000F0, + 0x0F0000F0, + 0x0F00F0F0, + 0x0F000F00, + 0x00FFF0F0, + 0x00000000, + 0x0FFFFF00, + 0x0F0000F0, + 0x0F0000F0, + 0x0FFFFF00, + 0x0F00F000, + 0x0F000F00, + 0x0F0000F0, + 0x00000000, + 0x00FFFF00, + 0x0F0000F0, + 0x0F000000, + 0x00FFFF00, + 0x000000F0, + 0x0F0000F0, + 0x00FFFF00, + 0x00000000, + 0x0FFFFFFF, + 0x0000F000, + 0x0000F000, + 0x0000F000, + 0x0000F000, + 0x0000F000, + 0x0000F000, + 0x00000000, + 0x0F0000F0, + 0x0F0000F0, + 0x0F0000F0, + 0x0F0000F0, + 0x0F0000F0, + 0x0F0000F0, + 0x00FFFF00, + 0x00000000, + 0x0F0000F0, + 0x0F0000F0, + 0x0F0000F0, + 0x0F0000F0, + 0x00F00F00, + 0x00F00F00, + 0x000FF000, + 0x00000000, + 0x0F00000F, + 0x0F00000F, + 0x0F00000F, + 0x0F00F00F, + 0x0F00F00F, + 0x0F00F00F, + 0x00FF0FF0, + 0x00000000, + 0x0F0000F0, + 0x0F0000F0, + 0x00F00F00, + 0x000FF000, + 0x00F00F00, + 0x0F0000F0, + 0x0F0000F0, + 0x00000000, + 0x0F00000F, + 0x00F000F0, + 0x000F0F00, + 0x0000F000, + 0x0000F000, + 0x0000F000, + 0x0000F000, + 0x00000000, + 0x0FFFFFF0, + 0x000000F0, + 0x00000F00, + 0x000FF000, + 0x00F00000, + 0x0F000000, + 0x0FFFFFF0, + 0x00000000, + 0x000FFF00, + 0x000F0000, + 0x000F0000, + 0x000F0000, + 0x000F0000, + 0x000F0000, + 0x000FFF00, + 0x00000000, + 0x0F000000, + 0x00F00000, + 0x000F0000, + 0x0000F000, + 0x00000F00, + 0x000000F0, + 0x00000000, + 0x00000000, + 0x00FFF000, + 0x0000F000, + 0x0000F000, + 0x0000F000, + 0x0000F000, + 0x0000F000, + 0x00FFF000, + 0x00000000, + 0x000FF000, + 0x00F00F00, + 0x0F0000F0, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x0FFFFFF0, + 0x00000000, + 0x000FF000, + 0x000FF000, + 0x000F0000, + 0x0000F000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00FFFF00, + 0x0F000F00, + 0x0F000F00, + 0x0F000F00, + 0x00FFFFF0, + 0x00000000, + 0x00F00000, + 0x00F00000, + 0x00F00000, + 0x00FFFF00, + 0x00F000F0, + 0x00F000F0, + 0x00FFFF00, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00FFFF00, + 0x0F000000, + 0x0F000000, + 0x0F000000, + 0x00FFFF00, + 0x00000000, + 0x000000F0, + 0x000000F0, + 0x000000F0, + 0x000FFFF0, + 0x00F000F0, + 0x00F000F0, + 0x000FFFF0, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00FFFF00, + 0x0F0000F0, + 0x0FFFFFF0, + 0x0F000000, + 0x00FFFF00, + 0x00000000, + 0x0000FF00, + 0x000F0000, + 0x000F0000, + 0x0FFFFF00, + 0x000F0000, + 0x000F0000, + 0x000F0000, + 0x00000000, + 0x00000000, + 0x000FFFF0, + 0x00F000F0, + 0x00F000F0, + 0x000FFFF0, + 0x000000F0, + 0x000FFF00, + 0x00000000, + 0x00F00000, + 0x00F00000, + 0x00F00000, + 0x00F0FF00, + 0x00FF00F0, + 0x00F000F0, + 0x00F000F0, + 0x00000000, + 0x00000000, + 0x0000F000, + 0x00000000, + 0x0000F000, + 0x0000F000, + 0x0000F000, + 0x0000F000, + 0x00000000, + 0x00000F00, + 0x00000000, + 0x00000F00, + 0x00000F00, + 0x00000F00, + 0x00F00F00, + 0x000FF000, + 0x00000000, + 0x00000000, + 0x00F00000, + 0x00F00000, + 0x00F00F00, + 0x00F0F000, + 0x00FFF000, + 0x00F00F00, + 0x00000000, + 0x0000F000, + 0x0000F000, + 0x0000F000, + 0x0000F000, + 0x0000F000, + 0x0000F000, + 0x00000F00, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00F0FF00, + 0x0F0F00F0, + 0x0F0F00F0, + 0x0F0F00F0, + 0x0F0F00F0, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00F0FF00, + 0x00FF00F0, + 0x00F000F0, + 0x00F000F0, + 0x00F000F0, + 0x00000000, + 0x00000000, + 0x00000000, + 0x000FFF00, + 0x00F000F0, + 0x00F000F0, + 0x00F000F0, + 0x000FFF00, + 0x00000000, + 0x00000000, + 0x00FFF000, + 0x00F00F00, + 0x00F00F00, + 0x00FFF000, + 0x00F00000, + 0x00F00000, + 0x00000000, + 0x00000000, + 0x000FFF00, + 0x00F00F00, + 0x00F00F00, + 0x000FFF00, + 0x00000F00, + 0x00000FF0, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00F0FFF0, + 0x00FF0000, + 0x00F00000, + 0x00F00000, + 0x00F00000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x000FFFF0, + 0x00F00000, + 0x000FFF00, + 0x000000F0, + 0x00FFFF00, + 0x00000000, + 0x00000000, + 0x0000F000, + 0x00FFFFF0, + 0x0000F000, + 0x0000F000, + 0x0000F000, + 0x00000FF0, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00F000F0, + 0x00F000F0, + 0x00F000F0, + 0x00F000F0, + 0x000FFFF0, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00F000F0, + 0x00F000F0, + 0x00F000F0, + 0x000F0F00, + 0x0000F000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x0F0000F0, + 0x0F00F0F0, + 0x0F00F0F0, + 0x0F00F0F0, + 0x00FF0F00, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00F000F0, + 0x000F0F00, + 0x0000F000, + 0x000F0F00, + 0x00F000F0, + 0x00000000, + 0x00000000, + 0x0F000F00, + 0x0F000F00, + 0x00F00F00, + 0x000FFF00, + 0x00000F00, + 0x00FFF000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00FFFFF0, + 0x00000F00, + 0x0000F000, + 0x000F0000, + 0x00FFFFF0, + 0x00000000, + 0x00000F00, + 0x0000F000, + 0x0000F000, + 0x00FF0000, + 0x0000F000, + 0x0000F000, + 0x00000F00, + 0x00000000, + 0x0000F000, + 0x0000F000, + 0x0000F000, + 0x0000F000, + 0x0000F000, + 0x0000F000, + 0x0000F000, + 0x00000000, + 0x000F0000, + 0x0000F000, + 0x0000F000, + 0x00000FF0, + 0x0000F000, + 0x0000F000, + 0x000F0000, + 0x00000000, + 0x00FF00FF, + 0x0F00FF00, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00FF0000, + 0x0FF00000, + 0xFFFFFFFF, + 0xFFFFF000, + 0xFFFFF000, + 0xFFF00000, + 0x00000000 +}; diff --git a/src/dolphin/demo/DEMOInit.c b/src/dolphin/demo/DEMOInit.c new file mode 100644 index 00000000..0ebcc3c0 --- /dev/null +++ b/src/dolphin/demo/DEMOInit.c @@ -0,0 +1,251 @@ +#include +#include +#include +#include +#include +#include "game/init.h" + +#include + +extern unsigned char DemoStatEnable; // size: 0x1, address: 0x0 + +// .bss +static struct _GXRenderModeObj rmodeobj; // size: 0x3C, address: 0x0 + +// .sdata +static unsigned char DemoFirstFrame = 1; // size: 0x1, address: 0x0 + +// .sbss +static void *DefaultFifo = NULL; // size: 0x4, address: 0x0 +static GXFifoObj *DefaultFifoObj = NULL; // size: 0x4, address: 0x4 +static struct _GXRenderModeObj *rmode; // size: 0x4, address: 0x8 +static int BypassWorkaround; // size: 0x4, address: 0xC +static unsigned long FrameCount; // size: 0x4, address: 0x10 +static unsigned long FrameMissThreshold; // size: 0x4, address: 0x14 + +// functions +static void __DEMOInitRenderMode(struct _GXRenderModeObj *mode); +static void __DEMOInitMem(); +static void __DEMOInitGX(); +static void __DEMOInitVI(); +static void __DEMOInitForEmu(); +static void __BypassRetraceCallback(); +static void LoadMemInfo(); + +void DEMOInit(struct _GXRenderModeObj *mode) +{ + OSInit(); + DVDInit(); + VIInit(); + DEMOPadInit(); + __DEMOInitRenderMode(mode); + __DEMOInitMem(); + VIConfigure(rmode); + DefaultFifo = OSAllocFromHeap(__OSCurrHeap, 0x40000); + DefaultFifoObj = GXInit(DefaultFifo, 0x40000); + __DEMOInitGX(); + __DEMOInitVI(); +} + +static void __DEMOInitRenderMode(struct _GXRenderModeObj *mode) +{ + if (mode != NULL) { + rmode = mode; + return; + } + switch (VIGetTvFormat()) { + case VI_NTSC: + rmode = &GXNtsc480IntDf; + break; + case VI_PAL: + rmode = &GXPal528IntDf; + break; + case VI_MPAL: + rmode = &GXMpal480IntDf; + break; + default: + OSPanic(__FILE__, 0x1A6, "DEMOInit: invalid TV format\n"); + break; + } + GXAdjustForOverscan(rmode, &rmodeobj, 0, 0x10); + rmode = &rmodeobj; +} + +static void __DEMOInitMem() +{ + void *arenaLo = OSGetArenaLo(); + void *arenaHi = OSGetArenaHi(); + unsigned long fbSize = ((u16)(rmode->fbWidth + 15) & 0xFFF0) * rmode->xfbHeight * 2; + + DemoFrameBuffer1 = (void *)(((u32)arenaLo + 0x1F) & 0xFFFFFFE0); + DemoFrameBuffer2 = (void *)(((u32)DemoFrameBuffer1 + fbSize + 0x1F) & 0xFFFFFFE0); + DemoCurrentBuffer = DemoFrameBuffer2; + arenaLo = (void *)(((u32)DemoFrameBuffer2 + fbSize + 0x1F) & 0xFFFFFFE0); + OSSetArenaLo(arenaLo); + if (((OSGetConsoleType() + 0xF0000000) == 4U) && ((OSGetPhysicalMemSize() + 0xFFC00000) != 0U) + && (OSGetConsoleSimulatedMemSize() < 0x01800000U)) { + LoadMemInfo(); + return; + } + arenaLo = OSGetArenaLo(); + arenaHi = OSGetArenaHi(); + arenaLo = OSInitAlloc(arenaLo, arenaHi, 1); + OSSetArenaLo(arenaLo); + arenaLo = (void *)(((u32)arenaLo + 0x1F) & 0xFFFFFFE0); + arenaHi = (void *)((u32)arenaHi & 0xFFFFFFE0); + OSSetCurrentHeap(OSCreateHeap((void *)(((u32)arenaLo)), arenaHi)); + OSSetArenaLo((arenaLo = arenaHi)); +} + +static void __DEMOInitGX() +{ + GXSetViewport(0.0f, 0.0f, rmode->fbWidth, rmode->xfbHeight, 0.0f, 1.0f); + GXSetScissor(0, 0, rmode->fbWidth, rmode->efbHeight); + GXSetDispCopySrc(0, 0, rmode->fbWidth, rmode->efbHeight); + GXSetDispCopyDst(rmode->fbWidth, rmode->xfbHeight); + GXSetDispCopyYScale(((f32)rmode->xfbHeight / (f32)rmode->efbHeight)); + GXSetCopyFilter(rmode->aa, rmode->sample_pattern, 1, rmode->vfilter); + if (rmode->aa != 0) { + GXSetPixelFmt(2, 0); + } + else { + GXSetPixelFmt(0, 0); + } + GXCopyDisp(DemoCurrentBuffer, 1); + GXSetDispCopyGamma(0); +} + +static void __DEMOInitVI() +{ + unsigned long nin; + + VISetNextFrameBuffer(DemoFrameBuffer1); + DemoCurrentBuffer = DemoFrameBuffer2; + VIFlush(); + VIWaitForRetrace(); + nin = rmode->viTVmode & 1; + if (nin != 0) { + VIWaitForRetrace(); + } +} + +static void __DEMOInitForEmu() { } + +void DEMOBeforeRender() +{ + if (BypassWorkaround != 0) { + GXSetDrawSync(0xFEEB); + } + if (rmode->field_rendering != 0) { + GXSetViewportJitter(0.0f, 0.0f, rmode->fbWidth, rmode->xfbHeight, 0.0f, 1.0f, VIGetNextField()); + } + else { + GXSetViewport(0.0f, 0.0f, rmode->fbWidth, rmode->xfbHeight, 0.0f, 1.0f); + } + GXInvalidateVtxCache(); + GXInvalidateTexAll(); +} + +void DEMOSwapBuffers() +{ + VISetNextFrameBuffer(DemoCurrentBuffer); + if (DemoFirstFrame != 0) { + VISetBlack(0); + DemoFirstFrame = 0; + } + VIFlush(); + VIWaitForRetrace(); + if ((u32)DemoCurrentBuffer == (u32)DemoFrameBuffer1) { + DemoCurrentBuffer = DemoFrameBuffer2; + return; + } + DemoCurrentBuffer = DemoFrameBuffer1; +} + +struct _GXRenderModeObj *DEMOGetRenderModeObj() +{ + return rmode; +} + +u32 DEMOGetCurrentBuffer(void) +{ + return (u32)DemoCurrentBuffer; +} + +void DEMOEnableBypassWorkaround(unsigned long timeoutFrames) +{ + BypassWorkaround = 1; + FrameMissThreshold = timeoutFrames; + VISetPreRetraceCallback(__BypassRetraceCallback); +} + +static void __BypassRetraceCallback() +{ + FrameCount += 1; +} + +static void LoadMemInfo() +{ + void *arenaHiOld; + void *arenaLo; + void *arenaHi; + void *simMemEnd; + struct DVDFileInfo fileInfo; + unsigned long length; + unsigned long transferLength; + long offset; + unsigned long i; + unsigned long indexMax; + char *buf[63]; + struct { + void *start; + void *end; + } *memEntry; + + OSReport("\nNow, try to find memory info file...\n\n"); + if (!DVDOpen("/meminfo.bin", &fileInfo)) { + OSReport("\nCan't find memory info file. Use /XXX toolname/ to maximize available\n"); + OSReport("memory space. For now, we only use the first %dMB.\n", OSGetConsoleSimulatedMemSize() >> 0x14); + arenaLo = OSGetArenaLo(); + arenaHi = OSGetArenaHi(); + arenaLo = OSInitAlloc(arenaLo, arenaHi, 1); + OSSetArenaLo(arenaLo); + arenaLo = (void *)(((u32)arenaLo + 0x1F) & 0xFFFFFFE0); + arenaHi = (void *)((u32)arenaHi & 0xFFFFFFE0); + OSSetCurrentHeap(OSCreateHeap((void *)(((u32)arenaLo)), arenaHi)); + OSSetArenaLo((arenaLo = arenaHi)); + return; + } + memEntry = (void *)((u32)buf + 0x1F & 0xFFFFFFE0); + arenaHiOld = OSGetArenaHi(); + simMemEnd = OSPhysicalToCached(OSGetConsoleSimulatedMemSize()); + OSSetArenaHi(OSPhysicalToCached(OSGetPhysicalMemSize())); + arenaLo = OSGetArenaLo(); + arenaHi = OSGetArenaHi(); + arenaLo = OSInitAlloc(arenaLo, arenaHi, 1); + OSSetArenaLo(arenaLo); + arenaLo = (void *)(((u32)arenaLo + 0x1F) & 0xFFFFFFE0); + arenaHi = (void *)((u32)arenaHi & 0xFFFFFFE0); + OSSetCurrentHeap(OSCreateHeap((void *)(arenaLo), arenaHi)); + OSSetArenaLo((arenaLo = arenaHi)); + OSAllocFixed(&arenaHiOld, &simMemEnd); + length = fileInfo.length; + offset = 0; + while (length) { + OSReport("loop\n"); + transferLength = (length < 0x20) ? length : 0x20; + if (DVDReadPrio(&fileInfo, memEntry, (transferLength + 0x1F) & 0xFFFFFFE0, offset, 2) < 0) { + OSPanic(__FILE__, 0x49F, "An error occurred when issuing read to /meminfo.bin\n"); + } + indexMax = (transferLength / 8); + for (i = 0; i < indexMax; i++) { + OSReport("start: 0x%08x, end: 0x%08x\n", memEntry[i].start, memEntry[i].end); + OSAllocFixed(&memEntry[i].start, &memEntry[i].end); + OSReport("Removed 0x%08x - 0x%08x from the current heap\n", memEntry[i].start, (char *)memEntry[i].end - 1); + } + length -= transferLength; + offset += transferLength; + } + DVDClose(&fileInfo); + OSDumpHeap(__OSCurrHeap); +} diff --git a/src/dolphin/demo/DEMOPuts.c b/src/dolphin/demo/DEMOPuts.c new file mode 100644 index 00000000..5a582ee4 --- /dev/null +++ b/src/dolphin/demo/DEMOPuts.c @@ -0,0 +1,146 @@ +#include "stdarg.h" +#include "stdio.h" +#include +#include +#include +#include + +#include + +extern unsigned long DEMOFontBitmap[]; // size: 0x0, address: 0x0 + +// .bss +static struct _GXTexObj fontTexObj; // size: 0x20, address: 0x0 + +// .sbss +static long fontShift; // size: 0x4, address: 0x0 + +// functions +static void DrawFontChar(int x, int y, int z, int xChar, int yChar); +static void LoadSheet(void *image, enum _GXTexMapID texMapID); + +void DEMOSetFontType(DMFontType attr) +{ + switch (attr) { + case DM_FT_RVS: + GXSetBlendMode(2, 0, 0, 0xC); + break; + case DM_FT_XLU: + GXSetBlendMode(1, 1, 1, 0); + break; + case DM_FT_OPQ: + default: + GXSetBlendMode(1, 1, 0, 0); + break; + } +} + +void DEMOLoadFont(enum _GXTexMapID texMap, enum _GXTexMtx texMtx, DMTexFlt texFlt) +{ + // float fontTMtx[3][4]; + // unsigned short width; + // unsigned short height; + + // width = 64; + // height = 0x1800 / width; + // GXInitTexObj(&fontTexObj, (void *)DEMOFontBitmap, width, (u16)height, 0, 0, 0, 0); + // if (texFlt == 0) { + // GXInitTexObjLOD(&fontTexObj, 0, 0, 0, 0, 0, 0.0f, 0.0f, 0.0f); + // fontShift = 0; + // } + // GXLoadTexObj(&fontTexObj, texMap); + // MTXScale(fontTMtx, 1.0f / (width - fontShift), 1.0f / ((u16)height - !fontShift), 1.0f); + // GXLoadTexMtxImm(fontTMtx, texMtx, 1); + // GXSetNumTexGens(1); + // GXSetTexCoordGen(0, 1, 4, texMtx); +} + +void DEMOSetupScrnSpc(long width, long height, float depth) +{ + float pMtx[4][4]; + float mMtx[3][4]; + + MTXOrtho(pMtx, 0.0f, height, 0.0f, width, 0.0f, -depth); + GXSetProjection(pMtx, 1); + MTXIdentity(mMtx); + GXLoadPosMtxImm(mMtx, 0); + GXSetCurrentMtx(0); +} + +void DEMOInitCaption(long font_type, long width, long height) +{ + DEMOSetupScrnSpc(width, height, 100.0f); + GXSetZMode(1, 7, 1); + GXSetNumChans(0); + GXSetNumTevStages(1); + GXSetTevOp(0, 3); + GXSetTevOrder(0, 0, 0, 0xFF); + DEMOLoadFont(0, 0x1E, 0); + DEMOSetFontType(font_type); +} + +void DEMOPuts(s16 x, s16 y, s16 z, char *string) +{ + char *str; + long s; + long t; + long c; + long w; + long len; + long i; + + str = string; + GXClearVtxDesc(); + GXSetVtxDesc(9, 1); + GXSetVtxDesc(0xD, 1); + GXSetVtxAttrFmt(0, 9, 1, 3, 0); + GXSetVtxAttrFmt(0, 0xD, 1, 3, 1); + + // calc len + len = 0; + while (1) { + c = *(str++); + if ((c >= 0x20) && (c <= 0x7F)) { + len++; + continue; + } + + if (len > 0) { + GXBegin(0x80, 0, len * 4); + for (i = 0; i < len; i++) { + w = string[i] - 0x20; + s = fontShift + ((w % 8) * 0x10); + t = fontShift + ((w / 8) * 0x10); + GXPosition3s16(x + (i * 8), y, z); + GXTexCoord2s16(s, t); + GXPosition3s16(x + (i * 8) + 8, y, z); + GXTexCoord2s16(s + 0x10, t); + GXPosition3s16(x + (i * 8) + 8, y + 8, z); + GXTexCoord2s16(s + 0x10, t + 0x10); + GXPosition3s16(x + (i * 8), y + 8, z); + GXTexCoord2s16(s, t + 0x10); + } + GXEnd(); + len = 0; + } + + string = str; + if (c == 0xA) { + y += 0x8; + } + else { + break; + } + } +} + +void DEMOPrintf(s16 x, s16 y, s16 z, char *fmt, ...) +{ + va_list vlist; + char buf[256]; + + va_start(vlist, fmt); + vsprintf(buf, fmt, vlist); + DEMOPuts(x, y, z, buf); + va_end(vlist); +} diff --git a/src/dolphin/demo/DEMOStats.c b/src/dolphin/demo/DEMOStats.c new file mode 100644 index 00000000..d98b436c --- /dev/null +++ b/src/dolphin/demo/DEMOStats.c @@ -0,0 +1,424 @@ +#include "dolphin/gx/GXPerf.h" +#include "string.h" +#include +#include +#include + +#include + +unsigned char DemoStatEnable = 0; +static DemoStatData *DemoStat; +static unsigned long DemoStatIndx; +static unsigned long DemoStatMaxIndx; +static unsigned long DemoStatClocks; +static unsigned long DemoStatDisp; +static unsigned long DemoStatStrLen; +static unsigned long topPixIn; +static unsigned long topPixOut; +static unsigned long botPixIn; +static unsigned long botPixOut; +static unsigned long clrPixIn; +static unsigned long copyClks; +static unsigned long vcCheck; +static unsigned long vcMiss; +static unsigned long vcStall; +static unsigned long cpReq; +static unsigned long tcReq; +static unsigned long cpuRdReq; +static unsigned long cpuWrReq; +static unsigned long dspReq; +static unsigned long ioReq; +static unsigned long viReq; +static unsigned long peReq; +static unsigned long rfReq; +static unsigned long fiReq; + +// functions +static void DEMOWriteStats(unsigned char update); +static void DEMOWriteStats(unsigned char update); + +void DEMOSetStats(DemoStatData *stat, unsigned long nstats, DEMO_STAT_DISP disp) +{ + if (!stat || nstats == 0) { + DemoStatEnable = FALSE; + } + else { + DemoStatEnable = TRUE; + DemoStat = stat; + DemoStatIndx = 0; + DemoStatMaxIndx = nstats; + DemoStatDisp = disp; + DemoStatStrLen = strlen(DemoStat->text); + } +} + +static void DEMOWriteStats(unsigned char update) +{ + unsigned long cnt0; + unsigned long cnt1; + unsigned long cnt2; + unsigned long cnt3; + unsigned long cnt4; + unsigned long cnt5; + unsigned long cnt6; + unsigned long cnt7; + unsigned long cnt8; + unsigned long cnt9; + + switch (DemoStat[DemoStatIndx].stat_type) { + case DEMO_STAT_GP0: + if (update) { + cnt0 = GXReadGP0Metric(); + DemoStat[DemoStatIndx].count = cnt0; + GXSetGPMetric(GX_PERF0_NONE, GX_PERF1_NONE); + break; + } + GXSetGPMetric(DemoStat[DemoStatIndx].stat, GX_PERF1_NONE); + GXClearGPMetric(); + break; + case DEMO_STAT_GP1: + if (update) { + cnt0 = GXReadGP1Metric(); + DemoStat[DemoStatIndx].count = cnt0; + GXSetGPMetric(GX_PERF0_NONE, GX_PERF1_NONE); + break; + } + GXSetGPMetric(GX_PERF0_NONE, DemoStat[DemoStatIndx].stat); + GXClearGPMetric(); + break; + case DEMO_STAT_MEM: + if (update) { + GXReadMemMetric(&cnt0, &cnt1, &cnt2, &cnt3, &cnt4, &cnt5, &cnt6, &cnt7, &cnt8, &cnt9); + cpReq = cnt0; + tcReq = cnt1; + cpuRdReq = cnt2; + cpuWrReq = cnt3; + dspReq = cnt4; + ioReq = cnt5; + viReq = cnt6; + peReq = cnt7; + rfReq = cnt8; + fiReq = cnt9; + break; + } + GXClearMemMetric(); + break; + case DEMO_STAT_PIX: + if (update) { + GXReadPixMetric(&cnt0, &cnt1, &cnt2, &cnt3, &cnt4, &cnt5); + topPixIn = cnt0; + topPixOut = cnt1; + botPixIn = cnt2; + botPixOut = cnt3; + clrPixIn = cnt4; + copyClks = cnt5; + break; + } + GXClearPixMetric(); + break; + case DEMO_STAT_VC: + if (update) { + GXReadVCacheMetric(&cnt0, &cnt1, &cnt2); + vcCheck = cnt0; + vcMiss = cnt1; + vcStall = cnt2; + break; + } + GXSetVCacheMetric(GX_VC_POS); + GXClearVCacheMetric(); + break; + case DEMO_STAT_FR: + if (update) { + GXReadPixMetric(&cnt0, &cnt1, &cnt2, &cnt3, &cnt4, &cnt5); + topPixIn = cnt0; + topPixOut = cnt1; + botPixIn = cnt2; + botPixOut = cnt3; + clrPixIn = cnt4; + copyClks = cnt5; + DemoStatClocks = GXReadGP0Metric(); + GXSetGPMetric(GX_PERF0_NONE, GX_PERF1_NONE); + break; + } + GXClearPixMetric(); + GXSetGPMetric(GX_PERF0_CLOCKS, GX_PERF1_NONE); + GXClearGPMetric(); + break; + case DEMO_STAT_TBW: + case DEMO_STAT_TBP: + GXClearPixMetric(); + if (update) { + GXReadPixMetric(&cnt0, &cnt1, &cnt2, &cnt3, &cnt4, &cnt5); + topPixIn = cnt0; + topPixOut = cnt1; + botPixIn = cnt2; + botPixOut = cnt3; + clrPixIn = cnt4; + copyClks = cnt5; + DemoStatClocks = GXReadGP0Metric(cnt4, cnt3, cnt2, cnt1, cnt0); + GXReadMemMetric(&cnt0, &cnt1, &cnt2, &cnt3, &cnt4, &cnt5, &cnt6, &cnt7, &cnt8, &cnt9); + tcReq = cnt1; + GXSetGPMetric(GX_PERF0_NONE, GX_PERF1_NONE); + break; + } + GXClearMemMetric(); + GXSetGPMetric(GX_PERF0_CLOCKS, GX_PERF1_NONE); + GXClearGPMetric(); + break; + case DEMO_STAT_MYC: + case DEMO_STAT_MYR: + break; + default: + OSPanic("DEMOStats.c", 0x127, "DEMOSetStats: Unknown demo stat type\n"); + } +} + +void DEMOUpdateStats(unsigned char inc) +{ + DEMOWriteStats(inc); + if (inc) { + DemoStatIndx = DemoStatIndx + 1; + if (DemoStatIndx == DemoStatMaxIndx) { + DemoStatIndx = 0; + } + } +} + +void DEMOPrintStats(void) +{ + GXRenderModeObj *rmode; + unsigned long i; + signed short text_x; + signed short text_y; + signed short text_yinc; + unsigned short wd; + unsigned short ht; + float rate; + + if (DemoStatDisp == DEMO_STAT_IO) { + for (i = 0; i < DemoStatMaxIndx; i++) { + switch (DemoStat[i].stat_type) { + case DEMO_STAT_PIX: + switch (DemoStat[i].stat) { + case 0: + OSReport("%s: %8d\n", DemoStat[i].text, topPixIn); + break; + case 1: + OSReport("%s: %8d\n", DemoStat[i].text, topPixOut); + break; + case 2: + OSReport("%s: %8d\n", DemoStat[i].text, botPixIn); + break; + case 3: + OSReport("%s: %8d\n", DemoStat[i].text, botPixOut); + break; + case 4: + OSReport("%s: %8d\n", DemoStat[i].text, clrPixIn); + break; + case 5: + OSReport("%s: %8d\n", DemoStat[i].text, copyClks); + break; + } + break; + case DEMO_STAT_FR: + rate = 162.0F * (topPixIn + botPixIn) / (float)(DemoStatClocks - copyClks); + OSReport("%s: %8.2f\n", DemoStat[i].text, rate); + break; + case DEMO_STAT_TBW: + rate = 162.0F * (tcReq << 5) / (float)(DemoStatClocks - copyClks); + OSReport("%s: %8.2f\n", DemoStat[i].text, rate); + break; + case DEMO_STAT_TBP: + rate = (tcReq << 5) / (float)(topPixIn + botPixIn); + OSReport("%s: %8.2f\n", DemoStat[i].text, rate); + break; + case DEMO_STAT_VC: + switch (DemoStat[i].stat) { + case 0: + OSReport("%s: %8d\n", DemoStat[i].text, vcCheck); + break; + case 1: + OSReport("%s: %8d\n", DemoStat[i].text, vcMiss); + break; + case 2: + OSReport("%s: %8d\n", DemoStat[i].text, vcStall); + break; + } + break; + case DEMO_STAT_MYR: + rate = DemoStat[i].stat / (float)DemoStat[i].count; + OSReport("%s: %8.2f\n", DemoStat[i].text, rate); + break; + case DEMO_STAT_MEM: + switch (DemoStat[i].stat) { + case 0: + OSReport("%s: %8d\n", DemoStat[i].text, cpReq); + break; + case 1: + OSReport("%s: %8d\n", DemoStat[i].text, tcReq); + break; + case 2: + OSReport("%s: %8d\n", DemoStat[i].text, cpuRdReq); + break; + case 3: + OSReport("%s: %8d\n", DemoStat[i].text, cpuWrReq); + break; + case 4: + OSReport("%s: %8d\n", DemoStat[i].text, dspReq); + break; + case 5: + OSReport("%s: %8d\n", DemoStat[i].text, ioReq); + break; + case 6: + OSReport("%s: %8d\n", DemoStat[i].text, viReq); + break; + case 7: + OSReport("%s: %8d\n", DemoStat[i].text, peReq); + break; + case 8: + OSReport("%s: %8d\n", DemoStat[i].text, rfReq); + break; + case 9: + OSReport("%s: %8d\n", DemoStat[i].text, fiReq); + break; + } + break; + default: + OSReport("%s: %8d\n", DemoStat[i].text, DemoStat[i].count); + break; + } + } + } + else { + rmode = DEMOGetRenderModeObj(); + switch (DemoStatDisp) { + case DEMO_STAT_TL: + text_x = 0x10; + text_y = 0x10; + text_yinc = 0xA; + wd = rmode->fbWidth; + ht = rmode->xfbHeight; + break; + case DEMO_STAT_BL: + text_x = 0x10; + text_y = rmode->xfbHeight - 0x18; + text_yinc = -0xA; + wd = rmode->fbWidth; + ht = rmode->xfbHeight; + break; + case DEMO_STAT_TLD: + text_x = 8; + text_y = 8; + text_yinc = 9; + wd = rmode->fbWidth / 2; + ht = rmode->xfbHeight / 2; + break; + case DEMO_STAT_BLD: + text_x = 8; + text_y = (rmode->xfbHeight - 0x18) / 2; + text_yinc = -9; + wd = rmode->fbWidth / 2; + ht = rmode->xfbHeight / 2; + break; + } + DEMOInitCaption(0, wd, ht); + for (i = 0; i < DemoStatMaxIndx; i++) { + switch (DemoStat[i].stat_type) { + case DEMO_STAT_PIX: + switch (DemoStat[i].stat) { + case 0: + DEMOPrintf(text_x, text_y, 0, "%s: %8d\n", DemoStat[i].text, topPixIn); + break; + case 1: + DEMOPrintf(text_x, text_y, 0, "%s: %8d\n", DemoStat[i].text, topPixOut); + break; + case 2: + DEMOPrintf(text_x, text_y, 0, "%s: %8d\n", DemoStat[i].text, botPixIn); + break; + case 3: + DEMOPrintf(text_x, text_y, 0, "%s: %8d\n", DemoStat[i].text, botPixOut); + break; + case 4: + DEMOPrintf(text_x, text_y, 0, "%s: %8d\n", DemoStat[i].text, clrPixIn); + break; + case 5: + DEMOPrintf(text_x, text_y, 0, "%s: %8d\n", DemoStat[i].text, copyClks); + break; + } + break; + case DEMO_STAT_FR: + rate = 162.0F * (topPixIn + botPixIn) / (float)(DemoStatClocks - copyClks); + DEMOPrintf(text_x, text_y, 0, "%s: %8.2f\n", DemoStat[i].text, rate); + break; + case DEMO_STAT_TBW: + rate = 162.0F * (tcReq << 5) / (float)(DemoStatClocks - copyClks); + DEMOPrintf(text_x, text_y, 0, "%s: %8.2f\n", DemoStat[i].text, rate); + break; + case DEMO_STAT_TBP: + rate = (tcReq << 5) / (float)(topPixIn - botPixIn); + DEMOPrintf(text_x, text_y, 0, "%s: %8.3f\n", DemoStat[i].text, rate); + break; + case DEMO_STAT_VC: + switch (DemoStat[i].stat) { + case 0: + DEMOPrintf(text_x, text_y, 0, "%s: %8d\n", DemoStat[i].text, vcCheck); + break; + case 1: + DEMOPrintf(text_x, text_y, 0, "%s: %8d\n", DemoStat[i].text, vcMiss); + break; + case 2: + DEMOPrintf(text_x, text_y, 0, "%s: %8d\n", DemoStat[i].text, vcStall); + break; + } + break; + case DEMO_STAT_MEM: + switch (DemoStat[i].stat) { + case 0: + DEMOPrintf(text_x, text_y, 0, "%s: %8d\n", DemoStat[i].text, cpReq); + break; + case 1: + DEMOPrintf(text_x, text_y, 0, "%s: %8d\n", DemoStat[i].text, tcReq); + break; + case 2: + DEMOPrintf(text_x, text_y, 0, "%s: %8d\n", DemoStat[i].text, cpuRdReq); + break; + case 3: + DEMOPrintf(text_x, text_y, 0, "%s: %8d\n", DemoStat[i].text, cpuWrReq); + break; + case 4: + DEMOPrintf(text_x, text_y, 0, "%s: %8d\n", DemoStat[i].text, dspReq); + break; + case 5: + DEMOPrintf(text_x, text_y, 0, "%s: %8d\n", DemoStat[i].text, ioReq); + break; + case 6: + DEMOPrintf(text_x, text_y, 0, "%s: %8d\n", DemoStat[i].text, viReq); + break; + case 7: + DEMOPrintf(text_x, text_y, 0, "%s: %8d\n", DemoStat[i].text, peReq); + break; + case 8: + DEMOPrintf(text_x, text_y, 0, "%s: %8d\n", DemoStat[i].text, rfReq); + break; + case 9: + DEMOPrintf(text_x, text_y, 0, "%s: %8d\n", DemoStat[i].text, fiReq); + break; + } + break; + case DEMO_STAT_GP0: + case DEMO_STAT_GP1: + case DEMO_STAT_MYC: + DEMOPrintf(text_x, text_y, 0, "%s: %8d", DemoStat[i].text, DemoStat[i].count); + break; + case DEMO_STAT_MYR: + rate = DemoStat[i].stat / (float)DemoStat[i].count; + DEMOPrintf(text_x, text_y, 0, "%s: %8.3f", DemoStat[i].text, rate); + break; + default: + OSReport("Undefined stat type %d in DEMOPrintStats()\n", DemoStat[i].stat_type); + break; + } + text_y += text_yinc; + } + } +} From 9267fa627de4ee1728bd7b02a5a59755c658b0f6 Mon Sep 17 00:00:00 2001 From: dbalatoni13 Date: Tue, 12 Nov 2024 02:09:45 +0100 Subject: [PATCH 16/29] Imported dolphin/dsp --- config/GMPE01_00/symbols.txt | 32 +-- configure.py | 12 +- include/dolphin/dsp.h | 1 + src/dolphin/dsp/dsp.c | 99 +++++++++ src/dolphin/dsp/dsp_debug.c | 5 + src/dolphin/dsp/dsp_task.c | 389 +++++++++++++++++++++++++++++++++++ 6 files changed, 520 insertions(+), 18 deletions(-) create mode 100644 src/dolphin/dsp/dsp.c create mode 100644 src/dolphin/dsp/dsp_debug.c create mode 100644 src/dolphin/dsp/dsp_task.c diff --git a/config/GMPE01_00/symbols.txt b/config/GMPE01_00/symbols.txt index 5acdcfae..c1bb0fa7 100644 --- a/config/GMPE01_00/symbols.txt +++ b/config/GMPE01_00/symbols.txt @@ -4366,16 +4366,24 @@ lbl_8013C958 = .data:0x8013C958; // type:object size:0x29 scope:local data:strin lbl_8013C984 = .data:0x8013C984; // type:object size:0x29 scope:local data:string lbl_8013C9B0 = .data:0x8013C9B0; // type:object size:0x29 scope:local data:string DEMOFontBitmap = .data:0x8013C9E0; // type:object size:0xC00 align:32 -lbl_8013D5E0 = .data:0x8013D5E0; // type:object size:0xC data:string -lbl_8013D5EC = .data:0x8013D5EC; // type:object size:0x28 +lbl_8013D5E0 = .data:0x8013D5E0; // type:object size:0xC scope:local data:string +lbl_8013D5EC = .data:0x8013D5EC; // type:object size:0x28 scope:local data:string jumptable_8013D614 = .data:0x8013D614; // type:object size:0x28 scope:local jumptable_8013D698 = .data:0x8013D698; // type:object size:0x28 scope:local jumptable_8013D6C0 = .data:0x8013D6C0; // type:object size:0x28 scope:local jumptable_8013D6E8 = .data:0x8013D6E8; // type:object size:0x28 scope:local jumptable_8013D710 = .data:0x8013D710; // type:object size:0x28 scope:local ResetFunctionInfo = .data:0x8013D738; // type:object size:0x10 -lbl_8013D748 = .data:0x8013D748; // type:object size:0x38 -lbl_8013D780 = .data:0x8013D780; // type:object size:0x140 +lbl_8013D748 = .data:0x8013D748; // type:object size:0x20 scope:local data:string +lbl_8013D768 = .data:0x8013D768; // type:object size:0xC scope:local data:string +lbl_8013D774 = .data:0x8013D774; // type:object size:0xC scope:local data:string +lbl_8013D780 = .data:0x8013D780; // type:object size:0x20 scope:local data:string +lbl_8013D7A0 = .data:0x8013D7A0; // type:object size:0x30 scope:local data:string +lbl_8013D7D0 = .data:0x8013D7D0; // type:object size:0x30 scope:local data:string +lbl_8013D800 = .data:0x8013D800; // type:object size:0x30 scope:local data:string +lbl_8013D830 = .data:0x8013D830; // type:object size:0x30 scope:local data:string +lbl_8013D860 = .data:0x8013D860; // type:object size:0x30 scope:local data:string +lbl_8013D890 = .data:0x8013D890; // type:object size:0x30 scope:local data:string jumptable_8013D8C0 = .data:0x8013D8C0; // type:object size:0x68 scope:local jumptable_8013D928 = .data:0x8013D928; // type:object size:0x44 scope:local jumptable_8013D96C = .data:0x8013D96C; // type:object size:0x1C scope:local @@ -4982,7 +4990,7 @@ autoInvalidation = .sdata:0x801D38F0; // type:object size:0x4 scope:local data:4 @35 = .sdata:0x801D38F8; // type:object size:0x2 scope:local data:string @40 = .sdata:0x801D38FC; // type:object size:0x4 scope:local data:string @41 = .sdata:0x801D3900; // type:object size:0x3 scope:local data:string -lbl_801D3908 = .sdata:0x801D3908; // type:object size:0x8 data:string +lbl_801D3908 = .sdata:0x801D3908; // type:object size:0x8 scope:local data:string ClampRegion = .sdata:0x801D3910; // type:object size:0x8 scope:local data:byte ResettingChan = .sdata:0x801D3918; // type:object size:0x4 scope:local data:4byte XPatchBits = .sdata:0x801D391C; // type:object size:0x4 scope:local data:4byte @@ -7307,13 +7315,13 @@ lbl_801D63A8 = .sdata2:0x801D63A8; // type:object size:0x4 data:float lbl_801D63AC = .sdata2:0x801D63AC; // type:object size:0x4 data:float lbl_801D63B0 = .sdata2:0x801D63B0; // type:object size:0x4 data:float lbl_801D63B4 = .sdata2:0x801D63B4; // type:object size:0x4 data:float -lbl_801D63B8 = .sdata2:0x801D63B8; // type:object size:0x4 data:float -lbl_801D63BC = .sdata2:0x801D63BC; // type:object size:0x4 data:float -lbl_801D63C0 = .sdata2:0x801D63C0; // type:object size:0x8 data:double -lbl_801D63C8 = .sdata2:0x801D63C8; // type:object size:0x8 data:double -lbl_801D63D0 = .sdata2:0x801D63D0; // type:object size:0x8 data:float -lbl_801D63D8 = .sdata2:0x801D63D8; // type:object size:0x4 data:float -lbl_801D63E0 = .sdata2:0x801D63E0; // type:object size:0x8 data:double +lbl_801D63B8 = .sdata2:0x801D63B8; // type:object size:0x4 scope:local data:float +lbl_801D63BC = .sdata2:0x801D63BC; // type:object size:0x4 scope:local data:float +lbl_801D63C0 = .sdata2:0x801D63C0; // type:object size:0x8 scope:local data:double +lbl_801D63C8 = .sdata2:0x801D63C8; // type:object size:0x8 scope:local data:double +lbl_801D63D0 = .sdata2:0x801D63D0; // type:object size:0x8 scope:local data:float +lbl_801D63D8 = .sdata2:0x801D63D8; // type:object size:0x4 scope:local data:float +lbl_801D63E0 = .sdata2:0x801D63E0; // type:object size:0x8 scope:local data:double lbl_801D63E8 = .sdata2:0x801D63E8; // type:object size:0x4 data:4byte lbl_801D63EC = .sdata2:0x801D63EC; // type:object size:0x4 data:4byte lbl_801D63F0 = .sdata2:0x801D63F0; // type:object size:0x4 data:4byte diff --git a/configure.py b/configure.py index cc9c8936..27a4ba3a 100644 --- a/configure.py +++ b/configure.py @@ -517,10 +517,10 @@ config.libs = [ DolphinLib( "demo", [ - Object(NonMatching, "dolphin/demo/DEMOInit.c"), - Object(NonMatching, "dolphin/demo/DEMOFont.c"), + Object(Matching, "dolphin/demo/DEMOInit.c"), + Object(Matching, "dolphin/demo/DEMOFont.c"), Object(NonMatching, "dolphin/demo/DEMOPuts.c"), - Object(NonMatching, "dolphin/demo/DEMOStats.c"), + Object(Matching, "dolphin/demo/DEMOStats.c"), ], ), DolphinLib( @@ -546,9 +546,9 @@ config.libs = [ DolphinLib( "dsp", [ - Object(NonMatching, "dolphin/dsp/dsp.c"), - Object(NonMatching, "dolphin/dsp/dsp_debug.c"), - Object(NonMatching, "dolphin/dsp/dsp_task.c"), + Object(Matching, "dolphin/dsp/dsp.c"), + Object(Matching, "dolphin/dsp/dsp_debug.c"), + Object(Matching, "dolphin/dsp/dsp_task.c"), ], ), DolphinLib( diff --git a/include/dolphin/dsp.h b/include/dolphin/dsp.h index 368138c9..18df2eb6 100644 --- a/include/dolphin/dsp.h +++ b/include/dolphin/dsp.h @@ -59,6 +59,7 @@ DSPTaskInfo* DSPAddTask(DSPTaskInfo* task); void __DSP_exec_task(DSPTaskInfo* curr, DSPTaskInfo* next); void __DSP_boot_task(DSPTaskInfo* task); +void __DSP_insert_task(DSPTaskInfo* task); void __DSP_remove_task(DSPTaskInfo* task); void __DSP_add_task(DSPTaskInfo* task); void __DSP_debug_printf(const char* fmt, ...); diff --git a/src/dolphin/dsp/dsp.c b/src/dolphin/dsp/dsp.c new file mode 100644 index 00000000..f003f6fb --- /dev/null +++ b/src/dolphin/dsp/dsp.c @@ -0,0 +1,99 @@ +#include "dolphin/dsp.h" +#include "dolphin/os.h" + +#include "dolphin/hw_regs.h" + +#ifdef __cplusplus +extern "C" { +#endif + +static s32 __DSP_init_flag = 0; +extern DSPTaskInfo* __DSP_tmp_task; +extern DSPTaskInfo* __DSP_last_task; +extern DSPTaskInfo* __DSP_first_task; +extern DSPTaskInfo* __DSP_curr_task; + +extern void __DSPHandler(__OSInterrupt, OSContext*); +extern void __DSP_debug_printf(const char* fmt, ...); +extern void __DSP_boot_task(DSPTaskInfo* task); + +u32 DSPCheckMailToDSP(void) { return (__DSPRegs[0] >> 0xF) & 1; } + +u32 DSPCheckMailFromDSP(void) { return (__DSPRegs[2] >> 0xF) & 1; } + +u32 DSPReadMailFromDSP() { + u16 reg1; + u16 reg2; + reg1 = __DSPRegs[2]; + reg2 = __DSPRegs[3]; + return reg1 << 16 | reg2; +} + +void DSPSendMailToDSP(u32 mail) { + __DSPRegs[0] = mail >> 16; + __DSPRegs[1] = mail; +} + +void DSPInit(void) { + u32 oldInt; + u16 reg; + __DSP_debug_printf("DSPInit(): Build Date: %s %s\n", "Dec 17 2001", "18:25:00"); + + if (__DSP_init_flag == 1) { + return; + } + oldInt = OSDisableInterrupts(); + __OSSetInterruptHandler(7, __DSPHandler); + __OSUnmaskInterrupts(0x1000000); + reg = __DSPRegs[5]; + reg = (reg & ~0xA8) | 0x800; + __DSPRegs[5] = reg; + reg = __DSPRegs[5]; + reg = reg & ~0xAC; + __DSPRegs[5] = reg; + __DSP_tmp_task = 0; + __DSP_curr_task = 0; + __DSP_last_task = 0; + __DSP_first_task = 0; + __DSP_init_flag = 1; + OSRestoreInterrupts(oldInt); +} + +void DSPReset(void) { + u16 reg; + u32 oldInt; + oldInt = OSDisableInterrupts(); + reg = __DSPRegs[5]; + __DSPRegs[5] = (reg & ~0xA8) | 0x801; + __DSP_init_flag = 0; + OSRestoreInterrupts(oldInt); +} + +void DSPHalt(void) { + u16 reg; + u32 oldInt; + oldInt = OSDisableInterrupts(); + reg = __DSPRegs[5]; + __DSPRegs[5] = (reg & ~0xA8) | 4; + OSRestoreInterrupts(oldInt); +} + +u32 DSPGetDMAStatus(void) { return __DSPRegs[5] & 0x200; } + +DSPTaskInfo* DSPAddTask(DSPTaskInfo* task) { + u32 oldInt; + oldInt = OSDisableInterrupts(); + __DSP_insert_task(task); + task->state = 0; + task->flags = 1; + OSRestoreInterrupts(oldInt); + if (task == __DSP_first_task) { + __DSP_boot_task(task); + } + + return task; +} + +#ifdef __cplusplus +} +#endif diff --git a/src/dolphin/dsp/dsp_debug.c b/src/dolphin/dsp/dsp_debug.c new file mode 100644 index 00000000..22455a34 --- /dev/null +++ b/src/dolphin/dsp/dsp_debug.c @@ -0,0 +1,5 @@ +#include "types.h" + +void __DSP_debug_printf(const char* fmt, ...) { + // UNUSED(fmt); +} diff --git a/src/dolphin/dsp/dsp_task.c b/src/dolphin/dsp/dsp_task.c new file mode 100644 index 00000000..9ba343cf --- /dev/null +++ b/src/dolphin/dsp/dsp_task.c @@ -0,0 +1,389 @@ +#include "dolphin/dsp.h" +#include "dolphin/hw_regs.h" + +DSPTaskInfo *__DSP_curr_task; +DSPTaskInfo *__DSP_first_task; +DSPTaskInfo *__DSP_last_task; +DSPTaskInfo *__DSP_tmp_task; +DSPTaskInfo *__DSP_rude_task; + +BOOL __DSP_rude_task_pending; + +void __DSPHandler(__OSInterrupt, OSContext *context) +{ + DSPTaskInfo *tmp_task; + OSContext exceptionContext; + u16 tmp; + u32 mail; + + tmp = __DSPRegs[5]; + tmp = (u16)(tmp & ~0x28) | 0x80; + __DSPRegs[5] = tmp; + + OSClearContext(&exceptionContext); + OSSetCurrentContext(&exceptionContext); + + while (!DSPCheckMailFromDSP()) + ; + mail = DSPReadMailFromDSP(); + + if ((__DSP_curr_task->flags & DSP_TASK_FLAG_CANCEL) && (mail == 0xDCD10002)) { + mail = 0xDCD10003; + } + + switch (mail) { + case 0xDCD10000: + __DSP_curr_task->state = DSP_TASK_STATE_RUN; + + if (__DSP_curr_task->init_cb) { + (*(__DSP_curr_task->init_cb))((void *)(__DSP_curr_task)); + } + break; + case 0xDCD10001: + __DSP_curr_task->state = DSP_TASK_STATE_RUN; + if (__DSP_curr_task->res_cb) { + (*(__DSP_curr_task->res_cb))((void *)(__DSP_curr_task)); + } + break; + case 0xDCD10002: + if (__DSP_rude_task_pending) { + + if (__DSP_curr_task == __DSP_rude_task) { + DSPSendMailToDSP(0xCDD10003); + while (DSPCheckMailToDSP()) { } + + __DSP_rude_task = NULL; + __DSP_rude_task_pending = FALSE; + + if (__DSP_curr_task->res_cb) { + (*(__DSP_curr_task->res_cb))((void *)(__DSP_curr_task)); + } + + break; + } + else { + DSPSendMailToDSP(0xCDD10001); + while (DSPCheckMailToDSP()) + ; + __DSP_exec_task(__DSP_curr_task, __DSP_rude_task); + + __DSP_curr_task->state = DSP_TASK_STATE_YIELD; + __DSP_curr_task = __DSP_rude_task; + + __DSP_rude_task = NULL; + __DSP_rude_task_pending = FALSE; + + break; + } + } + + if (__DSP_curr_task->next == NULL) { + + if (__DSP_curr_task == __DSP_first_task) { + + DSPSendMailToDSP(0xCDD10003); + while (DSPCheckMailToDSP()) + ; + + if (__DSP_curr_task->res_cb) { + (*(__DSP_curr_task->res_cb))((void *)(__DSP_curr_task)); + } + } + else { + DSPSendMailToDSP(0xCDD10001); + while (DSPCheckMailToDSP()) { } + + __DSP_exec_task(__DSP_curr_task, __DSP_first_task); + + __DSP_curr_task->state = DSP_TASK_STATE_YIELD; + __DSP_curr_task = __DSP_first_task; + } + } + else { + + DSPSendMailToDSP(0xCDD10001); + while (DSPCheckMailToDSP()) { } + + __DSP_exec_task(__DSP_curr_task, __DSP_curr_task->next); + + __DSP_curr_task->state = DSP_TASK_STATE_YIELD; + __DSP_curr_task = __DSP_curr_task->next; + } + break; + case 0xDCD10003: + if (__DSP_rude_task_pending) { + + if (__DSP_curr_task->done_cb) { + (*(__DSP_curr_task->done_cb))((void *)(__DSP_curr_task)); + } + + DSPSendMailToDSP(0xCDD10001); + while (DSPCheckMailToDSP()) + ; + + __DSP_exec_task(NULL, __DSP_rude_task); + + __DSP_remove_task(__DSP_curr_task); + __DSP_curr_task = __DSP_rude_task; + + __DSP_rude_task = NULL; + __DSP_rude_task_pending = FALSE; + + break; + } + + if (__DSP_curr_task->next == NULL) { + + if (__DSP_curr_task == __DSP_first_task) { + + if (__DSP_curr_task->done_cb) { + (*(__DSP_curr_task->done_cb))((void *)(__DSP_curr_task)); + } + + DSPSendMailToDSP(0xCDD10002); + while (DSPCheckMailToDSP()) + ; + + __DSP_curr_task->state = DSP_TASK_STATE_DONE; + + __DSP_remove_task(__DSP_curr_task); + } + else { + + if (__DSP_curr_task->done_cb) { + (*(__DSP_curr_task->done_cb))((void *)(__DSP_curr_task)); + } + + DSPSendMailToDSP(0xCDD10001); + while (DSPCheckMailToDSP()) + ; + + __DSP_curr_task->state = DSP_TASK_STATE_DONE; + __DSP_exec_task(NULL, __DSP_first_task); + + __DSP_curr_task = __DSP_first_task; + __DSP_remove_task(__DSP_last_task); + } + } + else { + if (__DSP_curr_task->done_cb) { + (*(__DSP_curr_task->done_cb))((void *)(__DSP_curr_task)); + } + DSPSendMailToDSP(0xCDD10001); + while (DSPCheckMailToDSP()) + ; + + __DSP_curr_task->state = DSP_TASK_STATE_DONE; + __DSP_exec_task(NULL, __DSP_curr_task->next); + + __DSP_curr_task = __DSP_curr_task->next; + __DSP_remove_task(__DSP_curr_task->prev); + } + break; + + case 0xDCD10004: + + if (__DSP_curr_task->req_cb) { + (*(__DSP_curr_task->req_cb))((void *)(__DSP_curr_task)); + } + break; + default: + break; + } + OSClearContext(&exceptionContext); + OSSetCurrentContext(context); +} + +void __DSP_exec_task(DSPTaskInfo *curr, DSPTaskInfo *next) +{ + if (curr) { + DSPSendMailToDSP((u32)(curr->dram_mmem_addr)); + while (DSPCheckMailToDSP()) + ; + DSPSendMailToDSP((u32)(curr->dram_length)); + while (DSPCheckMailToDSP()) + ; + DSPSendMailToDSP((u32)(curr->dram_addr)); + while (DSPCheckMailToDSP()) + ; + } + else { + + DSPSendMailToDSP((u32)(0)); + while (DSPCheckMailToDSP()) + ; + DSPSendMailToDSP((u32)(0)); + while (DSPCheckMailToDSP()) + ; + DSPSendMailToDSP((u32)(0)); + while (DSPCheckMailToDSP()) + ; + } + + DSPSendMailToDSP((u32)(next->iram_mmem_addr)); + while (DSPCheckMailToDSP()) + ; + DSPSendMailToDSP((u32)(next->iram_length)); + while (DSPCheckMailToDSP()) + ; + DSPSendMailToDSP((u32)(next->iram_addr)); + while (DSPCheckMailToDSP()) + ; + + if (DSP_TASK_STATE_INIT == next->state) { + DSPSendMailToDSP((u32)(next->dsp_init_vector)); + while (DSPCheckMailToDSP()) + ; + DSPSendMailToDSP((u32)(0)); + while (DSPCheckMailToDSP()) + ; + DSPSendMailToDSP((u32)(0)); + while (DSPCheckMailToDSP()) + ; + DSPSendMailToDSP((u32)(0)); + while (DSPCheckMailToDSP()) + ; + } + else { + DSPSendMailToDSP((u32)(next->dsp_resume_vector)); + while (DSPCheckMailToDSP()) + ; + DSPSendMailToDSP((u32)(next->dram_mmem_addr)); + while (DSPCheckMailToDSP()) + ; + + DSPSendMailToDSP((u32)(next->dram_length)); + while (DSPCheckMailToDSP()) + ; + + DSPSendMailToDSP((u32)(next->dram_addr)); + while (DSPCheckMailToDSP()) + ; + } +} + +#define MSG_BASE 0x80F30000 +void __DSP_boot_task(DSPTaskInfo *task) +{ + + volatile u32 mail; + + while (!DSPCheckMailFromDSP()) + ; + + mail = DSPReadMailFromDSP(); + + DSPSendMailToDSP(MSG_BASE | 0xA001); + while (DSPCheckMailToDSP()) { } + DSPSendMailToDSP((u32)(task->iram_mmem_addr)); + while (DSPCheckMailToDSP()) { } + + DSPSendMailToDSP(MSG_BASE | 0xC002); + while (DSPCheckMailToDSP()) { } + DSPSendMailToDSP((u32)(task->iram_addr & 0xffff)); + while (DSPCheckMailToDSP()) { } + + DSPSendMailToDSP(MSG_BASE | 0xA002); + while (DSPCheckMailToDSP()) { } + DSPSendMailToDSP(task->iram_length); + while (DSPCheckMailToDSP()) { } + + DSPSendMailToDSP(MSG_BASE | 0xB002); + while (DSPCheckMailToDSP()) { } + DSPSendMailToDSP(0x00000000); + while (DSPCheckMailToDSP()) { } + + DSPSendMailToDSP(MSG_BASE | 0xD001); + while (DSPCheckMailToDSP()) { } + DSPSendMailToDSP((u32)(0xffff & task->dsp_init_vector)); + while (DSPCheckMailToDSP()) { } + + __DSP_debug_printf("DSP is booting task: 0x%08X\n", task); + __DSP_debug_printf("__DSP_boot_task() : IRAM MMEM ADDR: 0x%08X\n", (u32)(task->iram_mmem_addr)); + __DSP_debug_printf("__DSP_boot_task() : IRAM DSP ADDR : 0x%08X\n", (u32)(task->iram_addr)); + __DSP_debug_printf("__DSP_boot_task() : IRAM LENGTH : 0x%08X\n", (u32)(task->iram_length)); + __DSP_debug_printf("__DSP_boot_task() : DRAM MMEM ADDR: 0x%08X\n", (u32)(task->dram_length)); + __DSP_debug_printf("__DSP_boot_task() : Start Vector : 0x%08X\n", (u32)(task->dsp_init_vector)); +} + +void __DSP_insert_task(DSPTaskInfo *task) +{ + + DSPTaskInfo *temp; + + if (__DSP_first_task == NULL) { + __DSP_first_task = __DSP_last_task = __DSP_curr_task = task; + task->next = task->prev = NULL; + } + else { + temp = __DSP_first_task; + + while (temp) { + if (task->priority < temp->priority) { + task->prev = temp->prev; + temp->prev = task; + task->next = temp; + if (task->prev == NULL) { + __DSP_first_task = task; + } + else { + (task->prev)->next = task; + } + break; + } + temp = temp->next; + } + + if (temp == NULL) { + __DSP_last_task->next = task; + task->next = NULL; + task->prev = __DSP_last_task; + __DSP_last_task = task; + } + } +} + +void __DSP_add_task(DSPTaskInfo *task) +{ + if (__DSP_last_task == NULL) { + __DSP_first_task = __DSP_last_task = __DSP_curr_task = task; + task->next = task->prev = NULL; + } + else { + __DSP_last_task->next = task; + task->next = NULL; + task->prev = __DSP_last_task; + __DSP_last_task = task; + } + + task->state = DSP_TASK_STATE_INIT; + + __DSP_debug_printf("__DSP_add_task() : Added task : 0x%08X\n", task); +} + +void __DSP_remove_task(DSPTaskInfo *task) +{ + + task->flags = DSP_TASK_FLAG_CLEARALL; + task->state = DSP_TASK_STATE_DONE; + + if (__DSP_first_task == task) { + if (task->next) { + __DSP_first_task = (task->next); + task->next->prev = NULL; + } + else { + __DSP_first_task = __DSP_last_task = __DSP_curr_task = NULL; + } + } + else if (__DSP_last_task == task) { + __DSP_last_task = (task->prev); + task->prev->next = NULL; + __DSP_curr_task = __DSP_first_task; + } + else { + __DSP_curr_task = task->next; + task->prev->next = task->next; + task->next->prev = task->prev; + } +} From e957d339b0109620d1a441da6001ba87d0fc1845 Mon Sep 17 00:00:00 2001 From: dbalatoni13 Date: Tue, 12 Nov 2024 02:30:56 +0100 Subject: [PATCH 17/29] Imported dolphin/si --- config/GMPE01_00/symbols.txt | 11 + src/dolphin/si/SIBios.c | 817 ++++++++++++++++++++++++++++++++ src/dolphin/si/SISamplingRate.c | 56 +++ 3 files changed, 884 insertions(+) create mode 100644 src/dolphin/si/SIBios.c create mode 100644 src/dolphin/si/SISamplingRate.c diff --git a/config/GMPE01_00/symbols.txt b/config/GMPE01_00/symbols.txt index c1bb0fa7..9bcdbabc 100644 --- a/config/GMPE01_00/symbols.txt +++ b/config/GMPE01_00/symbols.txt @@ -4408,6 +4408,17 @@ SectorSizeTable = .data:0x8013E060; // type:object size:0x20 scope:local LatencyTable = .data:0x8013E080; // type:object size:0x20 scope:local Si = .data:0x8013E0A0; // type:object size:0x14 scope:local data:4byte Type = .data:0x8013E0B4; // type:object size:0x10 scope:local +@464 = .data:0x8013E0C4; // type:object size:0x9 scope:local data:string +lbl_8013E0D0 = .data:0x8013E0D0; // type:object size:0xF scope:local data:string +lbl_8013E0E0 = .data:0x8013E0E0; // type:object size:0xF scope:local data:string +lbl_8013E0F0 = .data:0x8013E0F0; // type:object size:0xD scope:local data:string +lbl_8013E100 = .data:0x8013E100; // type:object size:0xA scope:local data:string +lbl_8013E10C = .data:0x8013E10C; // type:object size:0x10 scope:local data:string +lbl_8013E11C = .data:0x8013E11C; // type:object size:0x14 scope:local data:string +lbl_8013E130 = .data:0x8013E130; // type:object size:0x12 scope:local data:string +lbl_8013E144 = .data:0x8013E144; // type:object size:0x14 scope:local data:string +lbl_8013E158 = .data:0x8013E158; // type:object size:0x9 scope:local data:string +lbl_8013E164 = .data:0x8013E164; // type:object size:0x9 scope:local data:string XYNTSC = .data:0x8013E170; // type:object size:0x30 scope:local XYPAL = .data:0x8013E1A0; // type:object size:0x30 scope:local __vt__Q23std9exception = .data:0x8013E208; // type:object size:0x10 scope:weak diff --git a/src/dolphin/si/SIBios.c b/src/dolphin/si/SIBios.c new file mode 100644 index 00000000..0d34277a --- /dev/null +++ b/src/dolphin/si/SIBios.c @@ -0,0 +1,817 @@ +#include +#include +#include +#include + + +extern OSTime __OSGetSystemTime(); + +typedef struct SIControl { + s32 chan; + u32 poll; + u32 inputBytes; + void *input; + SICallback callback; +} SIControl; + +static SIControl Si = { + -1, + 0, + 0, + NULL, + NULL, +}; + +typedef struct SIComm_s { + u32 tcint : 1; + u32 tcintmsk : 1; + u32 comerr : 1; + u32 rdstint : 1; + u32 rdstintmsk : 1; + u32 pad0 : 4; + u32 outlngth : 7; + u32 pad1 : 1; + u32 inlngth : 7; + u32 pad2 : 5; + u32 channel : 2; + u32 tstart : 1; +} SIComm_s; + +typedef union SIComm_u { + u32 val; + SIComm_s f; +} SIComm_u; + +static SIPacket Packet[SI_MAX_CHAN]; +static OSAlarm Alarm[SI_MAX_CHAN]; +static u32 Type[SI_MAX_CHAN] = { + SI_ERROR_NO_RESPONSE, + SI_ERROR_NO_RESPONSE, + SI_ERROR_NO_RESPONSE, + SI_ERROR_NO_RESPONSE, +}; + +static OSTime TypeTime[SI_MAX_CHAN]; +static OSTime XferTime[SI_MAX_CHAN]; + +static SITypeAndStatusCallback TypeCallback[SI_MAX_CHAN][4]; +static __OSInterruptHandler RDSTHandler[4]; + +u32 __PADFixBits; + +static BOOL __SITransfer(s32 chan, void *output, u32 outputBytes, void *input, u32 inputBytes, SICallback callback); + +static BOOL InputBufferValid[SI_MAX_CHAN]; +static u32 InputBuffer[SI_MAX_CHAN][2]; +static vu32 InputBufferVcount[SI_MAX_CHAN]; + +static BOOL SIGetResponseRaw(s32 chan); +static void GetTypeCallback(s32 chan, u32 error, OSContext *context); + +BOOL SIBusy() +{ + return Si.chan != -1 ? TRUE : FALSE; +} + +BOOL SIIsChanBusy(s32 chan) +{ + return (Packet[chan].chan != -1 || Si.chan == chan); +} + +static void SIClearTCInterrupt() +{ + u32 reg; + + reg = __SIRegs[13]; + reg |= 0x80000000; + reg &= ~0x00000001; + __SIRegs[13] = reg; +} + +static u32 CompleteTransfer() +{ + u32 sr; + u32 i; + u32 rLen; + u8 *input; + + sr = __SIRegs[14]; + + SIClearTCInterrupt(); + + if (Si.chan != -1) { + XferTime[Si.chan] = __OSGetSystemTime(); + + input = Si.input; + + rLen = Si.inputBytes / 4; + for (i = 0; i < rLen; i++) { + *(u32 *)input = __SIRegs[32 + i]; + input += 4; + } + + rLen = Si.inputBytes & 3; + if (rLen) { + u32 temp = __SIRegs[32 + i]; + for (i = 0; i < rLen; i++) { + *input++ = (u8)((temp >> ((3 - i) * 8)) & 0xff); + } + } + + if (__SIRegs[13] & 0x20000000) { + sr >>= 8 * (3 - Si.chan); + sr &= 0xf; + + if ((sr & SI_ERROR_NO_RESPONSE) && !(Type[Si.chan] & SI_ERROR_BUSY)) { + Type[Si.chan] = SI_ERROR_NO_RESPONSE; + } + if (sr == 0) { + sr = SI_ERROR_COLLISION; + } + } + else { + TypeTime[Si.chan] = __OSGetSystemTime(); + sr = 0; + } + + Si.chan = -1; + } + return sr; +} + +static void SITransferNext(s32 chan) +{ + int i; + SIPacket *packet; + + for (i = 0; i < SI_MAX_CHAN; ++i) { + ++chan; + chan %= SI_MAX_CHAN; + packet = &Packet[chan]; + if (packet->chan != -1 && packet->fire <= __OSGetSystemTime()) { + if (__SITransfer(packet->chan, packet->output, packet->outputBytes, packet->input, packet->inputBytes, packet->callback)) { + OSCancelAlarm(&Alarm[chan]); + packet->chan = -1; + } + break; + } + } +} + +static void SIInterruptHandler(__OSInterrupt interrupt, OSContext *context) +{ + u32 reg; + + reg = __SIRegs[13]; + + if ((reg & 0xc0000000) == 0xc0000000) { + s32 chan; + u32 sr; + SICallback callback; + + chan = Si.chan; + sr = CompleteTransfer(); + callback = Si.callback; + Si.callback = 0; + + SITransferNext(chan); + + if (callback) { + callback(chan, sr, context); + } + + sr = __SIRegs[14]; + sr &= 0xf000000 >> (8 * chan); + __SIRegs[14] = sr; + + if (Type[chan] == SI_ERROR_BUSY && !SIIsChanBusy(chan)) { + static u32 cmdTypeAndStatus = 0 << 24; + SITransfer(chan, &cmdTypeAndStatus, 1, &Type[chan], 3, GetTypeCallback, OSMicrosecondsToTicks(65)); + } + } + + if ((reg & 0x18000000) == 0x18000000) { + + int i; + u32 vcount; + u32 x; + + vcount = VIGetCurrentLine() + 1; + x = (Si.poll & 0x03ff0000) >> 16; + + for (i = 0; i < SI_MAX_CHAN; ++i) { + if (SIGetResponseRaw(i)) { + InputBufferVcount[i] = vcount; + } + } + + for (i = 0; i < SI_MAX_CHAN; ++i) { + if (!(Si.poll & (SI_CHAN0_BIT >> (31 - 7 + i)))) { + continue; + } + if (InputBufferVcount[i] == 0 || InputBufferVcount[i] + (x / 2) < vcount) { + return; + } + } + + for (i = 0; i < SI_MAX_CHAN; ++i) { + InputBufferVcount[i] = 0; + } + + for (i = 0; i < 4; ++i) { + if (RDSTHandler[i]) { + RDSTHandler[i](interrupt, context); + } + } + } +} + +static BOOL SIEnablePollingInterrupt(BOOL enable) +{ + BOOL enabled; + BOOL rc; + u32 reg; + int i; + + enabled = OSDisableInterrupts(); + reg = __SIRegs[13]; + rc = (reg & 0x08000000) ? TRUE : FALSE; + if (enable) { + reg |= 0x08000000; + for (i = 0; i < SI_MAX_CHAN; ++i) { + InputBufferVcount[i] = 0; + } + } + else { + reg &= ~0x08000000; + } + reg &= ~0x80000001; + __SIRegs[13] = reg; + OSRestoreInterrupts(enabled); + return rc; +} + +BOOL SIRegisterPollingHandler(__OSInterruptHandler handler) +{ + BOOL enabled; + int i; + + enabled = OSDisableInterrupts(); + for (i = 0; i < 4; ++i) { + if (RDSTHandler[i] == handler) { + OSRestoreInterrupts(enabled); + return TRUE; + } + } + for (i = 0; i < 4; ++i) { + if (RDSTHandler[i] == 0) { + RDSTHandler[i] = handler; + SIEnablePollingInterrupt(TRUE); + OSRestoreInterrupts(enabled); + return TRUE; + } + } + OSRestoreInterrupts(enabled); + return FALSE; +} + +BOOL SIUnregisterPollingHandler(__OSInterruptHandler handler) +{ + BOOL enabled; + int i; + + enabled = OSDisableInterrupts(); + for (i = 0; i < 4; ++i) { + if (RDSTHandler[i] == handler) { + RDSTHandler[i] = 0; + for (i = 0; i < 4; ++i) { + if (RDSTHandler[i]) { + break; + } + } + if (i == 4) { + SIEnablePollingInterrupt(FALSE); + } + OSRestoreInterrupts(enabled); + return TRUE; + break; + } + } + OSRestoreInterrupts(enabled); + return FALSE; +} + +void SIInit(void) +{ + Packet[0].chan = Packet[1].chan = Packet[2].chan = Packet[3].chan = -1; + + Si.poll = 0; + SISetSamplingRate(0); + + while (__SIRegs[13] & 1) + ; + + __SIRegs[13] = 0x80000000; + + __OSSetInterruptHandler(__OS_INTERRUPT_PI_SI, SIInterruptHandler); + __OSUnmaskInterrupts(OS_INTERRUPTMASK_PI_SI); + + SIGetType(0); + SIGetType(1); + SIGetType(2); + SIGetType(3); +} + +#define ROUND(n, a) (((u32)(n) + (a)-1) & ~((a)-1)) + +static BOOL __SITransfer(s32 chan, void *output, u32 outputBytes, void *input, u32 inputBytes, SICallback callback) +{ + BOOL enabled; + u32 rLen; + u32 i; + u32 sr; + SIComm_u comcsr; + + enabled = OSDisableInterrupts(); + if (Si.chan != -1) { + OSRestoreInterrupts(enabled); + return FALSE; + } + + sr = __SIRegs[14]; + sr &= (0xf000000) >> (8 * chan); + __SIRegs[14] = sr; + + Si.chan = chan; + Si.callback = callback; + Si.inputBytes = inputBytes; + Si.input = input; + + rLen = ROUND(outputBytes, 4) / 4; + for (i = 0; i < rLen; i++) { + __SIRegs[32 + i] = ((u32 *)output)[i]; + } + + comcsr.val = __SIRegs[13]; + comcsr.f.tcint = 1; + comcsr.f.tcintmsk = callback ? 1 : 0; + comcsr.f.outlngth = (outputBytes == SI_MAX_COMCSR_OUTLNGTH) ? 0 : outputBytes; + comcsr.f.inlngth = (inputBytes == SI_MAX_COMCSR_INLNGTH) ? 0 : inputBytes; + comcsr.f.channel = chan; + comcsr.f.tstart = 1; + __SIRegs[13] = comcsr.val; + + OSRestoreInterrupts(enabled); + + return TRUE; +} + +u32 SISync(void) +{ + BOOL enabled; + u32 sr; + + while (__SIRegs[13] & 1) + ; + + enabled = OSDisableInterrupts(); + sr = CompleteTransfer(); + + SITransferNext(SI_MAX_CHAN); + + OSRestoreInterrupts(enabled); + + return sr; +} + +u32 SIGetStatus(s32 chan) +{ + BOOL enabled; + u32 sr; + int chanShift; + + enabled = OSDisableInterrupts(); + sr = __SIRegs[14]; + chanShift = 8 * (SI_MAX_CHAN - 1 - chan); + sr >>= chanShift; + if (sr & SI_ERROR_NO_RESPONSE) { + if (!(Type[chan] & SI_ERROR_BUSY)) { + Type[chan] = SI_ERROR_NO_RESPONSE; + } + } + OSRestoreInterrupts(enabled); + return sr; +} + +void SISetCommand(s32 chan, u32 command) +{ + __SIRegs[3 * chan] = command; +} + +u32 SIGetCommand(s32 chan) +{ + return __SIRegs[3 * chan]; +} + +void SITransferCommands(void) +{ + __SIRegs[14] = 0x80000000; +} + +u32 SISetXY(u32 x, u32 y) +{ + u32 poll; + BOOL enabled; + + poll = x << 16; + poll |= y << 8; + + enabled = OSDisableInterrupts(); + Si.poll &= ~(0x03ff0000 | 0x0000ff00); + Si.poll |= poll; + poll = Si.poll; + __SIRegs[12] = poll; + OSRestoreInterrupts(enabled); + return poll; +} + +u32 SIEnablePolling(u32 poll) +{ + BOOL enabled; + u32 en; + + if (poll == 0) { + return Si.poll; + } + + enabled = OSDisableInterrupts(); + + poll >>= (31 - 7); + en = poll & 0xf0; + + poll &= (en >> 4) | 0x03fffff0; + + poll &= ~0x03ffff00; + + Si.poll &= ~(en >> 4); + + Si.poll |= poll; + + poll = Si.poll; + + SITransferCommands(); + + __SIRegs[12] = poll; + + OSRestoreInterrupts(enabled); + + return poll; +} + +u32 SIDisablePolling(u32 poll) +{ + BOOL enabled; + + if (poll == 0) { + return Si.poll; + } + + enabled = OSDisableInterrupts(); + + poll >>= (31 - 7); + poll &= 0xf0; + + poll = Si.poll & ~poll; + + __SIRegs[12] = poll; + Si.poll = poll; + + OSRestoreInterrupts(enabled); + return poll; +} + +static BOOL SIGetResponseRaw(s32 chan) +{ + u32 sr; + + sr = SIGetStatus(chan); + if (sr & SI_ERROR_RDST) { + InputBuffer[chan][0] = __SIRegs[3 * chan + 1]; + InputBuffer[chan][1] = __SIRegs[3 * chan + 2]; + InputBufferValid[chan] = TRUE; + return TRUE; + } + return FALSE; +} + +BOOL SIGetResponse(s32 chan, void *data) +{ + BOOL rc; + BOOL enabled; + + enabled = OSDisableInterrupts(); + SIGetResponseRaw(chan); + rc = InputBufferValid[chan]; + InputBufferValid[chan] = FALSE; + if (rc) { + ((u32 *)data)[0] = InputBuffer[chan][0]; + ((u32 *)data)[1] = InputBuffer[chan][1]; + } + OSRestoreInterrupts(enabled); + return rc; +} + +static void AlarmHandler(OSAlarm *alarm, OSContext *context) +{ +#pragma unused(context) + s32 chan; + SIPacket *packet; + + chan = alarm - Alarm; + packet = &Packet[chan]; + if (packet->chan != -1) { + if (__SITransfer(packet->chan, packet->output, packet->outputBytes, packet->input, packet->inputBytes, packet->callback)) { + packet->chan = -1; + } + } +} + +BOOL SITransfer(s32 chan, void *output, u32 outputBytes, void *input, u32 inputBytes, SICallback callback, OSTime delay) +{ + BOOL enabled; + SIPacket *packet = &Packet[chan]; + OSTime now; + OSTime fire; + + enabled = OSDisableInterrupts(); + if (packet->chan != -1 || Si.chan == chan) { + OSRestoreInterrupts(enabled); + return FALSE; + } + + now = __OSGetSystemTime(); + if (delay == 0) { + fire = now; + } + else { + fire = XferTime[chan] + delay; + } + if (now < fire) { + delay = fire - now; + OSSetAlarm(&Alarm[chan], delay, AlarmHandler); + } + else if (__SITransfer(chan, output, outputBytes, input, inputBytes, callback)) { + OSRestoreInterrupts(enabled); + return TRUE; + } + + packet->chan = chan; + packet->output = output; + packet->outputBytes = outputBytes; + packet->input = input; + packet->inputBytes = inputBytes; + packet->callback = callback; + packet->fire = fire; + + OSRestoreInterrupts(enabled); + return TRUE; +} + +static void CallTypeAndStatusCallback(s32 chan, u32 type) +{ + SITypeAndStatusCallback callback; + int i; + + for (i = 0; i < 4; ++i) { + callback = TypeCallback[chan][i]; + if (callback) { + TypeCallback[chan][i] = 0; + callback(chan, type); + } + } +} + +static void GetTypeCallback(s32 chan, u32 error, OSContext *context) +{ + static u32 cmdFixDevice[SI_MAX_CHAN]; + u32 type; + u32 chanBit; + BOOL fix; + u32 id; + + Type[chan] &= ~SI_ERROR_BUSY; + Type[chan] |= error; + TypeTime[chan] = __OSGetSystemTime(); + + type = Type[chan]; + + chanBit = SI_CHAN0_BIT >> chan; + fix = (BOOL)(__PADFixBits & chanBit); + __PADFixBits &= ~chanBit; + + if ((error & (SI_ERROR_UNDER_RUN | SI_ERROR_OVER_RUN | SI_ERROR_NO_RESPONSE | SI_ERROR_COLLISION)) || (type & SI_TYPE_MASK) != SI_TYPE_DOLPHIN + || !(type & SI_GC_WIRELESS) || (type & SI_WIRELESS_IR)) { + OSSetWirelessID(chan, 0); + CallTypeAndStatusCallback(chan, Type[chan]); + return; + } + + id = (u32)(OSGetWirelessID(chan) << 8); + + if (fix && (id & SI_WIRELESS_FIX_ID)) { + cmdFixDevice[chan] = 0x4Eu << 24 | (id & SI_WIRELESS_TYPE_ID) | SI_WIRELESS_FIX_ID; + Type[chan] = SI_ERROR_BUSY; + SITransfer(chan, &cmdFixDevice[chan], 3, &Type[chan], 3, GetTypeCallback, 0); + return; + } + + if (type & SI_WIRELESS_FIX_ID) { + if ((id & SI_WIRELESS_TYPE_ID) != (type & SI_WIRELESS_TYPE_ID)) { + if (!(id & SI_WIRELESS_FIX_ID)) { + id = type & SI_WIRELESS_TYPE_ID; + id |= SI_WIRELESS_FIX_ID; + OSSetWirelessID(chan, (u16)((id >> 8) & 0xffff)); + } + + cmdFixDevice[chan] = 0x4E << 24 | id; + Type[chan] = SI_ERROR_BUSY; + SITransfer(chan, &cmdFixDevice[chan], 3, &Type[chan], 3, GetTypeCallback, 0); + return; + } + } + else if (type & SI_WIRELESS_RECEIVED) { + id = type & SI_WIRELESS_TYPE_ID; + id |= SI_WIRELESS_FIX_ID; + + OSSetWirelessID(chan, (u16)((id >> 8) & 0xffff)); + + cmdFixDevice[chan] = 0x4E << 24 | id; + Type[chan] = SI_ERROR_BUSY; + SITransfer(chan, &cmdFixDevice[chan], 3, &Type[chan], 3, GetTypeCallback, 0); + return; + } + else { + OSSetWirelessID(chan, 0); + } + + CallTypeAndStatusCallback(chan, Type[chan]); +} + +u32 SIGetType(s32 chan) +{ + static u32 cmdTypeAndStatus; + BOOL enabled; + u32 type; + OSTime diff; + + enabled = OSDisableInterrupts(); + + type = Type[chan]; + diff = __OSGetSystemTime() - TypeTime[chan]; + if (Si.poll & (0x80 >> chan)) { + if (type != SI_ERROR_NO_RESPONSE) { + TypeTime[chan] = __OSGetSystemTime(); + OSRestoreInterrupts(enabled); + return type; + } + else { + type = Type[chan] = SI_ERROR_BUSY; + } + } + else if (diff <= OSMillisecondsToTicks(50) && type != SI_ERROR_NO_RESPONSE) { + OSRestoreInterrupts(enabled); + return type; + } + else if (diff <= OSMillisecondsToTicks(75)) { + Type[chan] = SI_ERROR_BUSY; + } + else { + type = Type[chan] = SI_ERROR_BUSY; + } + TypeTime[chan] = __OSGetSystemTime(); + + SITransfer(chan, &cmdTypeAndStatus, 1, &Type[chan], 3, GetTypeCallback, OSMicrosecondsToTicks(65)); + + OSRestoreInterrupts(enabled); + return type; +} + +u32 SIGetTypeAsync(s32 chan, SITypeAndStatusCallback callback) +{ + BOOL enabled; + u32 type; + + enabled = OSDisableInterrupts(); + type = SIGetType(chan); + if (Type[chan] & SI_ERROR_BUSY) { + int i; + + for (i = 0; i < 4; ++i) { + if (TypeCallback[chan][i] == callback) { + break; + } + if (TypeCallback[chan][i] == 0) { + TypeCallback[chan][i] = callback; + break; + } + } + } + else { + callback(chan, type); + } + OSRestoreInterrupts(enabled); + return type; +} + +u32 SIDecodeType(u32 type) +{ + u32 error; + + error = type & 0xff; + type &= ~0xff; + + if (error & SI_ERROR_NO_RESPONSE) { + return SI_ERROR_NO_RESPONSE; + } + if (error & (SI_ERROR_UNDER_RUN | SI_ERROR_OVER_RUN | SI_ERROR_COLLISION | SI_ERROR_UNKNOWN)) { + return SI_ERROR_UNKNOWN; + } + if (error) { + return SI_ERROR_BUSY; + } + + if ((type & SI_TYPE_MASK) == SI_TYPE_N64) { + switch (type & 0xffff0000) { + case SI_N64_CONTROLLER: + case SI_N64_MIC: + case SI_N64_KEYBOARD: + case SI_N64_MOUSE: + case SI_GBA: + return type & 0xffff0000; + break; + } + return SI_ERROR_UNKNOWN; + } + + if ((type & SI_TYPE_MASK) != SI_TYPE_GC) { + + return SI_ERROR_UNKNOWN; + } + switch (type & 0xffff0000) { + case SI_GC_CONTROLLER: + case SI_GC_STEERING: + return type & 0xffff0000; + break; + } + + if ((type & 0xffe00000) == SI_GC_KEYBOARD) { + return SI_GC_KEYBOARD; + } + + if ((type & SI_GC_WIRELESS) && !(type & SI_WIRELESS_IR)) { + if ((type & SI_GC_WAVEBIRD) == SI_GC_WAVEBIRD) { + return SI_GC_WAVEBIRD; + } + else if (!(type & SI_WIRELESS_STATE)) { + return SI_GC_RECEIVER; + } + } + + if ((type & SI_GC_CONTROLLER) == SI_GC_CONTROLLER) { + return SI_GC_CONTROLLER; + } + return SI_ERROR_UNKNOWN; +} + +u32 SIProbe(s32 chan) +{ + return SIDecodeType(SIGetType(chan)); +} + +char *SIGetTypeString(u32 type) +{ + switch (SIDecodeType(type)) { + case SI_ERROR_NO_RESPONSE: + return "No response"; + case SI_N64_CONTROLLER: + return "N64 controller"; + case SI_N64_MIC: + return "N64 microphone"; + case SI_N64_KEYBOARD: + return "N64 keyboard"; + case SI_N64_MOUSE: + return "N64 mouse"; + case SI_GBA: + return "GameBoy Advance"; + case SI_GC_CONTROLLER: + return "Standard controller"; + case SI_GC_RECEIVER: + return "Wireless receiver"; + case SI_GC_WAVEBIRD: + return "WaveBird controller"; + case SI_GC_KEYBOARD: + return "Keyboard"; + case SI_GC_STEERING: + return "Steering"; + } +} diff --git a/src/dolphin/si/SISamplingRate.c b/src/dolphin/si/SISamplingRate.c new file mode 100644 index 00000000..9b799fbc --- /dev/null +++ b/src/dolphin/si/SISamplingRate.c @@ -0,0 +1,56 @@ +#include "dolphin/sipriv.h" +#include "dolphin/vi.h" +#include "dolphin/hw_regs.h" + +#pragma dont_inline on +static u32 SamplingRate; + +typedef struct XY { + u16 line; + u8 count; +} XY; + +static XY XYNTSC[12] = { + {263 - 17, 2}, {15, 18}, {30, 9}, {44, 6}, {52, 5}, {65, 4}, + {87, 3}, {87, 3}, {87, 3}, {131, 2}, {131, 2}, {131, 2}, +}; + +static XY XYPAL[12] = { + {313 - 17, 2}, {15, 21}, {29, 11}, {45, 7}, {52, 6}, {63, 5}, + {78, 4}, {104, 3}, {104, 3}, {104, 3}, {104, 3}, {156, 2}, +}; + +void SISetSamplingRate(u32 msec) { + XY* xy; + BOOL enabled; + + if (msec > 11) { + msec = 11; + } + + enabled = OSDisableInterrupts(); + + SamplingRate = msec; + + switch (VIGetTvFormat()) { + case VI_NTSC: + case VI_MPAL: + case VI_EURGB60: + xy = XYNTSC; + break; + case VI_PAL: + xy = XYPAL; + break; + default: + OSReport("SISetSamplingRate: unknown TV format. Use default."); + msec = 0; + xy = XYNTSC; + break; + } + + SISetXY((__VIRegs[54] & 1 ? 2u : 1u) * xy[msec].line, xy[msec].count); + OSRestoreInterrupts(enabled); +} + +void SIRefreshSamplingRate() { SISetSamplingRate(SamplingRate); } +#pragma dont_inline reset From 61676fc9820a87cff3e285d601ef9fbd754591ca Mon Sep 17 00:00:00 2001 From: dbalatoni13 Date: Tue, 12 Nov 2024 03:01:02 +0100 Subject: [PATCH 18/29] Imported dolphin/exi --- configure.py | 8 +- include/dolphin/exi.h | 27 ++ src/dolphin/exi/EXIBios.c | 684 ++++++++++++++++++++++++++++++++++++++ src/dolphin/exi/EXIUart.c | 184 ++++++++++ 4 files changed, 899 insertions(+), 4 deletions(-) create mode 100644 include/dolphin/exi.h create mode 100644 src/dolphin/exi/EXIBios.c create mode 100644 src/dolphin/exi/EXIUart.c diff --git a/configure.py b/configure.py index 27a4ba3a..0048e928 100644 --- a/configure.py +++ b/configure.py @@ -594,15 +594,15 @@ config.libs = [ DolphinLib( "exi", [ - Object(NonMatching, "dolphin/exi/EXIBios.c"), - Object(NonMatching, "dolphin/exi/EXIUart.c"), + Object(Matching, "dolphin/exi/EXIBios.c"), + Object(Matching, "dolphin/exi/EXIUart.c"), ], ), DolphinLib( "si", [ - Object(NonMatching, "dolphin/si/SIBios.c"), - Object(NonMatching, "dolphin/si/SISamplingRate.c"), + Object(Matching, "dolphin/si/SIBios.c"), + Object(Matching, "dolphin/si/SISamplingRate.c"), ], ), DolphinLib( diff --git a/include/dolphin/exi.h b/include/dolphin/exi.h new file mode 100644 index 00000000..5187b6a8 --- /dev/null +++ b/include/dolphin/exi.h @@ -0,0 +1,27 @@ +#ifndef _DOLPHIN_EXI +#define _DOLPHIN_EXI + +#include + +typedef void (*EXICallback)(s32 chan, OSContext *context); + +EXICallback EXISetExiCallback(s32 channel, EXICallback callback); + +void EXIInit(void); +BOOL EXILock(s32 channel, u32 device, EXICallback callback); +BOOL EXIUnlock(s32 channel); +BOOL EXISelect(s32 channel, u32 device, u32 frequency); +BOOL EXIDeselect(s32 channel); +BOOL EXIImm(s32 channel, void *buffer, s32 length, u32 type, EXICallback callback); +BOOL EXIImmEx(s32 channel, void *buffer, s32 length, u32 type); +BOOL EXIDma(s32 channel, void *buffer, s32 length, u32 type, EXICallback callback); +BOOL EXISync(s32 channel); +BOOL EXIProbe(s32 channel); +s32 EXIProbeEx(s32 channel); +BOOL EXIAttach(s32 channel, EXICallback callback); +BOOL EXIDetach(s32 channel); +u32 EXIGetState(s32 channel); +s32 EXIGetID(s32 channel, u32 device, u32 *id); +void EXIProbeReset(void); + +#endif diff --git a/src/dolphin/exi/EXIBios.c b/src/dolphin/exi/EXIBios.c new file mode 100644 index 00000000..b8843fa2 --- /dev/null +++ b/src/dolphin/exi/EXIBios.c @@ -0,0 +1,684 @@ +#include +#include +#include + +#define MAX_DEV 3 +#define MAX_CHAN 3 + +#define REG_MAX 5 +#define REG(chan, idx) (__EXIRegs[((chan)*REG_MAX) + (idx)]) + +#define STATE_IDLE 0x00 +#define STATE_DMA 0x01 +#define STATE_IMM 0x02 +#define STATE_BUSY (STATE_DMA | STATE_IMM) +#define STATE_SELECTED 0x04 +#define STATE_ATTACHED 0x08 +#define STATE_LOCKED 0x10 + +#define EXI_0CR(tstart, dma, rw, tlen) ((((u32)(tstart)) << 0) | (((u32)(dma)) << 1) | (((u32)(rw)) << 2) | (((u32)(tlen)) << 4)) + +#define CPR_CS(x) ((1u << (x)) << 7) +#define CPR_CLK(x) ((x) << 4) + +typedef struct EXIControl { + EXICallback exiCallback; + EXICallback tcCallback; + EXICallback extCallback; + vu32 state; + int immLen; + u8 *immBuf; + u32 dev; + u32 id; + s32 idTime; + int items; + struct { + u32 dev; + EXICallback callback; + } queue[MAX_DEV]; +} EXIControl; + +static EXIControl Ecb[MAX_CHAN]; + +s32 __EXIProbeStartTime[2] : (OS_BASE_CACHED | 0x30C0); + +static void SetExiInterruptMask(s32 chan, EXIControl *exi) +{ + EXIControl *exi2; + + exi2 = &Ecb[2]; + switch (chan) { + case 0: + if ((exi->exiCallback == 0 && exi2->exiCallback == 0) || (exi->state & STATE_LOCKED)) { + __OSMaskInterrupts(OS_INTERRUPTMASK_EXI_0_EXI | OS_INTERRUPTMASK_EXI_2_EXI); + } + else { + __OSUnmaskInterrupts(OS_INTERRUPTMASK_EXI_0_EXI | OS_INTERRUPTMASK_EXI_2_EXI); + } + break; + case 1: + if (exi->exiCallback == 0 || (exi->state & STATE_LOCKED)) { + __OSMaskInterrupts(OS_INTERRUPTMASK_EXI_1_EXI); + } + else { + __OSUnmaskInterrupts(OS_INTERRUPTMASK_EXI_1_EXI); + } + break; + case 2: + if (__OSGetInterruptHandler(__OS_INTERRUPT_PI_DEBUG) == 0 || (exi->state & STATE_LOCKED)) { + __OSMaskInterrupts(OS_INTERRUPTMASK_PI_DEBUG); + } + else { + __OSUnmaskInterrupts(OS_INTERRUPTMASK_PI_DEBUG); + } + break; + } +} + +static void CompleteTransfer(s32 chan) +{ + EXIControl *exi = &Ecb[chan]; + u8 *buf; + u32 data; + int i; + int len; + + if (exi->state & STATE_BUSY) { + if ((exi->state & STATE_IMM) && (len = exi->immLen)) { + buf = exi->immBuf; + data = REG(chan, 4); + for (i = 0; i < len; i++) { + *buf++ = (u8)((data >> ((3 - i) * 8)) & 0xff); + } + } + exi->state &= ~STATE_BUSY; + } +} + +BOOL EXIImm(s32 chan, void *buf, s32 len, u32 type, EXICallback callback) +{ + EXIControl *exi = &Ecb[chan]; + BOOL enabled; + + enabled = OSDisableInterrupts(); + if ((exi->state & STATE_BUSY) || !(exi->state & STATE_SELECTED)) { + OSRestoreInterrupts(enabled); + return FALSE; + } + + exi->tcCallback = callback; + if (exi->tcCallback) { + EXIClearInterrupts(chan, FALSE, TRUE, FALSE); + __OSUnmaskInterrupts(OS_INTERRUPTMASK_EXI_0_TC >> (3 * chan)); + } + + exi->state |= STATE_IMM; + + if (type != EXI_READ) { + u32 data; + int i; + + data = 0; + for (i = 0; i < len; i++) { + data |= ((u8 *)buf)[i] << ((3 - i) * 8); + } + REG(chan, 4) = data; + } + + exi->immBuf = buf; + exi->immLen = (type != EXI_WRITE) ? len : 0; + + REG(chan, 3) = EXI_0CR(1, 0, type, len - 1); + + OSRestoreInterrupts(enabled); + + return TRUE; +} + +BOOL EXIImmEx(s32 chan, void *buf, s32 len, u32 mode) +{ + s32 xLen; + + while (len) { + xLen = (len < 4) ? len : 4; + if (!EXIImm(chan, buf, xLen, mode, NULL)) { + return FALSE; + } + + if (!EXISync(chan)) { + return FALSE; + } + + (u8 *)buf += xLen; + len -= xLen; + } + return TRUE; +} + +BOOL EXIDma(s32 chan, void *buf, s32 len, u32 type, EXICallback callback) +{ + EXIControl *exi = &Ecb[chan]; + BOOL enabled; + + enabled = OSDisableInterrupts(); + if ((exi->state & STATE_BUSY) || !(exi->state & STATE_SELECTED)) { + OSRestoreInterrupts(enabled); + return FALSE; + } + + exi->tcCallback = callback; + if (exi->tcCallback) { + EXIClearInterrupts(chan, FALSE, TRUE, FALSE); + __OSUnmaskInterrupts(OS_INTERRUPTMASK_EXI_0_TC >> (3 * chan)); + } + + exi->state |= STATE_DMA; + + REG(chan, 1) = (u32)buf & 0x3ffffe0; + REG(chan, 2) = (u32)len; + REG(chan, 3) = EXI_0CR(1, 1, type, 0); + + OSRestoreInterrupts(enabled); + + return TRUE; +} + +extern u32 __OSGetDIConfig(void); + +vu16 __OSDeviceCode : (OS_BASE_CACHED | 0x30E6); + +BOOL EXISync(s32 chan) +{ + EXIControl *exi = &Ecb[chan]; + BOOL rc = FALSE; + BOOL enabled; + + while (exi->state & STATE_SELECTED) { + if (((REG(chan, 3) & 1) >> 0) == 0) { + enabled = OSDisableInterrupts(); + if (exi->state & STATE_SELECTED) { + CompleteTransfer(chan); + if (__OSGetDIConfig() != 0xff || exi->immLen != 4 || (REG(chan, 0) & 0x00000070) != (EXI_FREQ_1M << 4) + || (REG(chan, 4) != EXI_USB_ADAPTER && REG(chan, 4) != EXI_IS_VIEWER && REG(chan, 4) != 0x04220001) || __OSDeviceCode == 0x8200) { + rc = TRUE; + } + } + OSRestoreInterrupts(enabled); + break; + } + } + return rc; +} + +u32 EXIClearInterrupts(s32 chan, BOOL exi, BOOL tc, BOOL ext) +{ + u32 cpr; + u32 prev; + + prev = cpr = REG(chan, 0); + cpr &= 0x7f5; + if (exi) + cpr |= 2; + if (tc) + cpr |= 8; + if (ext) + cpr |= 0x800; + REG(chan, 0) = cpr; + return prev; +} + +EXICallback EXISetExiCallback(s32 chan, EXICallback exiCallback) +{ + EXIControl *exi = &Ecb[chan]; + EXICallback prev; + BOOL enabled; + + enabled = OSDisableInterrupts(); + prev = exi->exiCallback; + exi->exiCallback = exiCallback; + + if (chan != 2) { + SetExiInterruptMask(chan, exi); + } + else { + SetExiInterruptMask(0, &Ecb[0]); + } + + OSRestoreInterrupts(enabled); + return prev; +} + +void EXIProbeReset(void) +{ + __EXIProbeStartTime[0] = __EXIProbeStartTime[1] = 0; + Ecb[0].idTime = Ecb[1].idTime = 0; + __EXIProbe(0); + __EXIProbe(1); +} + +static BOOL __EXIProbe(s32 chan) +{ + EXIControl *exi = &Ecb[chan]; + BOOL enabled; + BOOL rc; + u32 cpr; + s32 t; + + if (chan == 2) { + return TRUE; + } + + rc = TRUE; + enabled = OSDisableInterrupts(); + cpr = REG(chan, 0); + if (!(exi->state & EXI_STATE_ATTACHED)) { + if (cpr & 0x00000800) { + EXIClearInterrupts(chan, FALSE, FALSE, TRUE); + __EXIProbeStartTime[chan] = exi->idTime = 0; + } + + if (cpr & 0x00001000) { + t = (s32)(OSTicksToMilliseconds(OSGetTime()) / 100) + 1; + if (__EXIProbeStartTime[chan] == 0) { + __EXIProbeStartTime[chan] = t; + } + if (t - __EXIProbeStartTime[chan] < 300 / 100) { + rc = FALSE; + } + } + else { + __EXIProbeStartTime[chan] = exi->idTime = 0; + rc = FALSE; + } + } + else if (!(cpr & 0x00001000) || (cpr & 0x00000800)) { + __EXIProbeStartTime[chan] = exi->idTime = 0; + rc = FALSE; + } + OSRestoreInterrupts(enabled); + + return rc; +} + +BOOL EXIProbe(s32 chan) +{ + EXIControl *exi = &Ecb[chan]; + BOOL rc; + u32 id; + + rc = __EXIProbe(chan); + if (rc && exi->idTime == 0) { + rc = EXIGetID(chan, 0, &id) ? TRUE : FALSE; + } + return rc; +} + +s32 EXIProbeEx(s32 chan) +{ + if (EXIProbe(chan)) { + return 1; + } + else if (__EXIProbeStartTime[chan] != 0) { + return 0; + } + else { + return -1; + } +} + +static BOOL __EXIAttach(s32 chan, EXICallback extCallback) +{ + EXIControl *exi = &Ecb[chan]; + BOOL enabled; + + enabled = OSDisableInterrupts(); + if ((exi->state & EXI_STATE_ATTACHED) || __EXIProbe(chan) == FALSE) { + OSRestoreInterrupts(enabled); + return FALSE; + } + + EXIClearInterrupts(chan, TRUE, FALSE, FALSE); + + exi->extCallback = extCallback; + __OSUnmaskInterrupts(OS_INTERRUPTMASK_EXI_0_EXT >> (3 * chan)); + exi->state |= STATE_ATTACHED; + OSRestoreInterrupts(enabled); + + return TRUE; +} + +BOOL EXIAttach(s32 chan, EXICallback extCallback) +{ + EXIControl *exi = &Ecb[chan]; + BOOL enabled; + BOOL rc; + + EXIProbe(chan); + + enabled = OSDisableInterrupts(); + if (exi->idTime == 0) { + OSRestoreInterrupts(enabled); + return FALSE; + } + rc = __EXIAttach(chan, extCallback); + OSRestoreInterrupts(enabled); + return rc; +} + +BOOL EXIDetach(s32 chan) +{ + EXIControl *exi = &Ecb[chan]; + BOOL enabled; + + enabled = OSDisableInterrupts(); + if (!(exi->state & STATE_ATTACHED)) { + OSRestoreInterrupts(enabled); + return TRUE; + } + if ((exi->state & STATE_LOCKED) && exi->dev == 0) { + OSRestoreInterrupts(enabled); + return FALSE; + } + + exi->state &= ~STATE_ATTACHED; + __OSMaskInterrupts((OS_INTERRUPTMASK_EXI_0_EXT | OS_INTERRUPTMASK_EXI_0_EXI) >> (3 * chan)); + OSRestoreInterrupts(enabled); + return TRUE; +} + +BOOL EXISelect(s32 chan, u32 dev, u32 freq) +{ + EXIControl *exi = &Ecb[chan]; + u32 cpr; + BOOL enabled; + + enabled = OSDisableInterrupts(); + if ((exi->state & STATE_SELECTED) + || chan != 2 && (dev == 0 && !(exi->state & STATE_ATTACHED) && !__EXIProbe(chan) || !(exi->state & STATE_LOCKED) || (exi->dev != dev))) { + OSRestoreInterrupts(enabled); + return FALSE; + } + + exi->state |= STATE_SELECTED; + cpr = REG(chan, 0); + cpr &= 0x405; + cpr |= CPR_CS(dev) | CPR_CLK(freq); + REG(chan, 0) = cpr; + + if (exi->state & STATE_ATTACHED) { + switch (chan) { + case 0: + __OSMaskInterrupts(OS_INTERRUPTMASK_EXI_0_EXT); + break; + case 1: + __OSMaskInterrupts(OS_INTERRUPTMASK_EXI_1_EXT); + break; + } + } + + OSRestoreInterrupts(enabled); + return TRUE; +} + +BOOL EXIDeselect(s32 chan) +{ + EXIControl *exi = &Ecb[chan]; + u32 cpr; + BOOL enabled; + + enabled = OSDisableInterrupts(); + if (!(exi->state & STATE_SELECTED)) { + OSRestoreInterrupts(enabled); + return FALSE; + } + exi->state &= ~STATE_SELECTED; + cpr = REG(chan, 0); + REG(chan, 0) = cpr & 0x405; + + if (exi->state & STATE_ATTACHED) { + switch (chan) { + case 0: + __OSUnmaskInterrupts(OS_INTERRUPTMASK_EXI_0_EXT); + break; + case 1: + __OSUnmaskInterrupts(OS_INTERRUPTMASK_EXI_1_EXT); + break; + } + } + + OSRestoreInterrupts(enabled); + + if (chan != 2 && (cpr & CPR_CS(0))) { + return __EXIProbe(chan) ? TRUE : FALSE; + } + + return TRUE; +} + +static void EXIIntrruptHandler(__OSInterrupt interrupt, OSContext *context) +{ + s32 chan; + EXIControl *exi; + EXICallback callback; + + chan = (interrupt - __OS_INTERRUPT_EXI_0_EXI) / 3; + exi = &Ecb[chan]; + EXIClearInterrupts(chan, TRUE, FALSE, FALSE); + callback = exi->exiCallback; + if (callback) { + OSContext exceptionContext; + + OSClearContext(&exceptionContext); + OSSetCurrentContext(&exceptionContext); + + callback(chan, context); + + OSClearContext(&exceptionContext); + OSSetCurrentContext(context); + } +} + +static void TCIntrruptHandler(__OSInterrupt interrupt, OSContext *context) +{ + OSContext exceptionContext; + s32 chan; + EXIControl *exi; + EXICallback callback; + + chan = (interrupt - __OS_INTERRUPT_EXI_0_TC) / 3; + exi = &Ecb[chan]; + __OSMaskInterrupts(OS_INTERRUPTMASK(interrupt)); + EXIClearInterrupts(chan, FALSE, TRUE, FALSE); + callback = exi->tcCallback; + if (callback) { + exi->tcCallback = 0; + CompleteTransfer(chan); + + OSClearContext(&exceptionContext); + OSSetCurrentContext(&exceptionContext); + + callback(chan, context); + + OSClearContext(&exceptionContext); + OSSetCurrentContext(context); + } +} + +static void EXTIntrruptHandler(__OSInterrupt interrupt, OSContext *context) +{ + s32 chan; + EXIControl *exi; + EXICallback callback; + + chan = (interrupt - __OS_INTERRUPT_EXI_0_EXT) / 3; + __OSMaskInterrupts((OS_INTERRUPTMASK_EXI_0_EXT | OS_INTERRUPTMASK_EXI_0_EXI) >> (3 * chan)); + exi = &Ecb[chan]; + callback = exi->extCallback; + exi->state &= ~STATE_ATTACHED; + if (callback) { + OSContext exceptionContext; + + OSClearContext(&exceptionContext); + OSSetCurrentContext(&exceptionContext); + + exi->extCallback = 0; + callback(chan, context); + + OSClearContext(&exceptionContext); + OSSetCurrentContext(context); + } +} + +void EXIInit(void) +{ + __OSMaskInterrupts(OS_INTERRUPTMASK_EXI_0_EXI | OS_INTERRUPTMASK_EXI_0_TC | OS_INTERRUPTMASK_EXI_0_EXT | OS_INTERRUPTMASK_EXI_1_EXI + | OS_INTERRUPTMASK_EXI_1_TC | OS_INTERRUPTMASK_EXI_1_EXT | OS_INTERRUPTMASK_EXI_2_EXI | OS_INTERRUPTMASK_EXI_2_TC); + + REG(0, 0) = 0; + REG(1, 0) = 0; + REG(2, 0) = 0; + + REG(0, 0) = 0x00002000; + + __OSSetInterruptHandler(__OS_INTERRUPT_EXI_0_EXI, EXIIntrruptHandler); + __OSSetInterruptHandler(__OS_INTERRUPT_EXI_0_TC, TCIntrruptHandler); + __OSSetInterruptHandler(__OS_INTERRUPT_EXI_0_EXT, EXTIntrruptHandler); + __OSSetInterruptHandler(__OS_INTERRUPT_EXI_1_EXI, EXIIntrruptHandler); + __OSSetInterruptHandler(__OS_INTERRUPT_EXI_1_TC, TCIntrruptHandler); + __OSSetInterruptHandler(__OS_INTERRUPT_EXI_1_EXT, EXTIntrruptHandler); + __OSSetInterruptHandler(__OS_INTERRUPT_EXI_2_EXI, EXIIntrruptHandler); + __OSSetInterruptHandler(__OS_INTERRUPT_EXI_2_TC, TCIntrruptHandler); + + if ((OSGetConsoleType() & 0x10000000) != 0) { + __EXIProbeStartTime[0] = __EXIProbeStartTime[1] = 0; + Ecb[0].idTime = Ecb[1].idTime = 0; + __EXIProbe(0); + __EXIProbe(1); + } +} + +BOOL EXILock(s32 chan, u32 dev, EXICallback unlockedCallback) +{ + EXIControl *exi = &Ecb[chan]; + BOOL enabled; + int i; + + enabled = OSDisableInterrupts(); + if (exi->state & STATE_LOCKED) { + if (unlockedCallback) { + for (i = 0; i < exi->items; i++) { + if (exi->queue[i].dev == dev) { + OSRestoreInterrupts(enabled); + return FALSE; + } + } + exi->queue[exi->items].callback = unlockedCallback; + exi->queue[exi->items].dev = dev; + exi->items++; + } + OSRestoreInterrupts(enabled); + return FALSE; + } + + exi->state |= STATE_LOCKED; + exi->dev = dev; + SetExiInterruptMask(chan, exi); + + OSRestoreInterrupts(enabled); + return TRUE; +} + +BOOL EXIUnlock(s32 chan) +{ + EXIControl *exi = &Ecb[chan]; + BOOL enabled; + EXICallback unlockedCallback; + + enabled = OSDisableInterrupts(); + if (!(exi->state & STATE_LOCKED)) { + OSRestoreInterrupts(enabled); + return FALSE; + } + exi->state &= ~STATE_LOCKED; + SetExiInterruptMask(chan, exi); + + if (0 < exi->items) { + unlockedCallback = exi->queue[0].callback; + if (0 < --exi->items) { + memmove(&exi->queue[0], &exi->queue[1], sizeof(exi->queue[0]) * exi->items); + } + unlockedCallback(chan, 0); + } + + OSRestoreInterrupts(enabled); + return TRUE; +} + +u32 EXIGetState(s32 chan) +{ + EXIControl *exi = &Ecb[chan]; + + return (u32)exi->state; +} + +static void UnlockedHandler(s32 chan, OSContext *context) +{ + u32 id; + + EXIGetID(chan, 0, &id); +} + +s32 EXIGetID(s32 chan, u32 dev, u32 *id) +{ + EXIControl *exi = &Ecb[chan]; + BOOL err; + u32 cmd; + s32 startTime; + BOOL enabled; + + if (chan < 2 && dev == 0) { + if (!__EXIProbe(chan)) { + return 0; + } + + if (exi->idTime == __EXIProbeStartTime[chan]) { + *id = exi->id; + return exi->idTime; + } + + if (!__EXIAttach(chan, NULL)) { + return 0; + } + + startTime = __EXIProbeStartTime[chan]; + } + + err = !EXILock(chan, dev, (chan < 2 && dev == 0) ? UnlockedHandler : NULL); + if (!err) { + err = !EXISelect(chan, dev, EXI_FREQ_1M); + if (!err) { + cmd = 0; + err |= !EXIImm(chan, &cmd, 2, EXI_WRITE, NULL); + err |= !EXISync(chan); + err |= !EXIImm(chan, id, 4, EXI_READ, NULL); + err |= !EXISync(chan); + err |= !EXIDeselect(chan); + } + EXIUnlock(chan); + } + + if (chan < 2 && dev == 0) { + EXIDetach(chan); + enabled = OSDisableInterrupts(); + err |= (startTime != __EXIProbeStartTime[chan]); + if (!err) { + exi->id = *id; + exi->idTime = startTime; + } + OSRestoreInterrupts(enabled); + + return err ? 0 : exi->idTime; + } + + return err ? 0 : !0; +} diff --git a/src/dolphin/exi/EXIUart.c b/src/dolphin/exi/EXIUart.c new file mode 100644 index 00000000..fb067196 --- /dev/null +++ b/src/dolphin/exi/EXIUart.c @@ -0,0 +1,184 @@ +#include +#include + +#define EXI_TX 0x800400u +#define EXI_MAGIC 0xa5ff005a + +static s32 Chan; +static u32 Dev; +static u32 Enabled = 0; +static u32 BarnacleEnabled = 0; + +static BOOL ProbeBarnacle(s32 chan, u32 dev, u32 *revision) +{ + BOOL err; + u32 cmd; + + if (chan != 2 && dev == 0 && !EXIAttach(chan, NULL)) { + return FALSE; + } + + err = !EXILock(chan, dev, NULL); + if (!err) { + err = !EXISelect(chan, dev, EXI_FREQ_1M); + if (!err) { + cmd = 0x20011300; + err = FALSE; + err |= !EXIImm(chan, &cmd, 4, EXI_WRITE, NULL); + err |= !EXISync(chan); + err |= !EXIImm(chan, revision, 4, EXI_READ, NULL); + err |= !EXISync(chan); + err |= !EXIDeselect(chan); + } + EXIUnlock(chan); + } + + if (chan != 2 && dev == 0) { + EXIDetach(chan); + } + + if (err) { + return FALSE; + } + + return (*revision != 0xFFFFFFFF) ? TRUE : FALSE; +} + +void __OSEnableBarnacle(s32 chan, u32 dev) +{ + u32 id; + + if (EXIGetID(chan, dev, &id)) { + switch (id) { + case 0xffffffff: + case EXI_MEMORY_CARD_59: + case EXI_MEMORY_CARD_123: + case EXI_MEMORY_CARD_251: + case EXI_MEMORY_CARD_507: + case EXI_USB_ADAPTER: + case EXI_NPDP_GDEV: + case EXI_MODEM: + case EXI_MARLIN: + case 0x04220000: + case 0x04020100: + case 0x04020200: + case 0x04020300: + case 0x04040404: + case 0x04060000: + case 0x04120000: + case 0x04130000: + case 0x80000000 | EXI_MEMORY_CARD_59: + case 0x80000000 | EXI_MEMORY_CARD_123: + case 0x80000000 | EXI_MEMORY_CARD_251: + case 0x80000000 | EXI_MEMORY_CARD_507: + break; + default: + if (ProbeBarnacle(chan, dev, &id)) { + Chan = chan; + Dev = dev; + Enabled = BarnacleEnabled = EXI_MAGIC; + } + break; + } + } +} + +u32 InitializeUART(u32 baudRate) +{ + if (BarnacleEnabled == EXI_MAGIC) { + return 0; + } + + if (!(OSGetConsoleType() & OS_CONSOLE_DEVELOPMENT)) { + Enabled = 0; + return 2; + } + else { + Chan = 0; + Dev = 1; + Enabled = EXI_MAGIC; + return 0; + } +} + +u32 ReadUARTN(void *bytes, unsigned long length) +{ + return 4; +} + +static int QueueLength(void) +{ + u32 cmd; + + if (!EXISelect(Chan, Dev, EXI_FREQ_8M)) + return -1; + + cmd = EXI_TX << 6; + EXIImm(Chan, &cmd, 4, EXI_WRITE, NULL); + EXISync(Chan); + + EXIImm(Chan, &cmd, 1, EXI_READ, NULL); + EXISync(Chan); + EXIDeselect(Chan); + + return 16 - (int)((cmd >> 24) & 0xff); +} + +u32 WriteUARTN(const void *buf, unsigned long len) +{ + u32 cmd; + int qLen; + long xLen; + char *ptr; + BOOL locked; + u32 error; + + if (Enabled != EXI_MAGIC) + return 2; + + locked = EXILock(Chan, Dev, 0); + if (!locked) { + return 0; + } + + for (ptr = (char *)buf; ptr - buf < len; ptr++) { + if (*ptr == '\n') + *ptr = '\r'; + } + + error = 0; + cmd = (EXI_TX | 0x2000000) << 6; + while (len) { + qLen = QueueLength(); + if (qLen < 0) { + error = 3; + break; + } + + if (qLen < 12 && qLen < len) + continue; + + if (!EXISelect(Chan, Dev, EXI_FREQ_8M)) { + error = 3; + break; + } + + EXIImm(Chan, &cmd, 4, EXI_WRITE, NULL); + EXISync(Chan); + + while (qLen && len) { + if (qLen < 4 && qLen < len) + break; + xLen = (len < 4) ? (long)len : 4; + EXIImm(Chan, (void *)buf, xLen, EXI_WRITE, NULL); + (u8 *)buf += xLen; + len -= xLen; + qLen -= xLen; + EXISync(Chan); + } + EXIDeselect(Chan); + } + + EXIUnlock(Chan); + return error; +} From b44fb658a15a844374a9816864cbd9bfdc985574 Mon Sep 17 00:00:00 2001 From: dbalatoni13 Date: Tue, 12 Nov 2024 03:38:42 +0100 Subject: [PATCH 19/29] Imported dolphin/card --- include/dolphin/CARDPriv.h | 202 ++++++----- include/dolphin/os/OSReset.h | 1 + src/dolphin/card/CARDBios.c | 615 ++++++++++++++++++++++++++++++++++ src/dolphin/card/CARDBlock.c | 170 ++++++++++ src/dolphin/card/CARDCheck.c | 343 +++++++++++++++++++ src/dolphin/card/CARDCreate.c | 126 +++++++ src/dolphin/card/CARDDelete.c | 111 ++++++ src/dolphin/card/CARDDir.c | 101 ++++++ src/dolphin/card/CARDFormat.c | 141 ++++++++ src/dolphin/card/CARDMount.c | 396 ++++++++++++++++++++++ src/dolphin/card/CARDNet.c | 34 ++ src/dolphin/card/CARDOpen.c | 134 ++++++++ src/dolphin/card/CARDRdwr.c | 108 ++++++ src/dolphin/card/CARDRead.c | 149 ++++++++ src/dolphin/card/CARDRename.c | 70 ++++ src/dolphin/card/CARDStat.c | 158 +++++++++ src/dolphin/card/CARDUnlock.c | 406 ++++++++++++++++++++++ src/dolphin/card/CARDWrite.c | 128 +++++++ 18 files changed, 3315 insertions(+), 78 deletions(-) create mode 100644 src/dolphin/card/CARDBios.c create mode 100644 src/dolphin/card/CARDBlock.c create mode 100644 src/dolphin/card/CARDCheck.c create mode 100644 src/dolphin/card/CARDCreate.c create mode 100644 src/dolphin/card/CARDDelete.c create mode 100644 src/dolphin/card/CARDDir.c create mode 100644 src/dolphin/card/CARDFormat.c create mode 100644 src/dolphin/card/CARDMount.c create mode 100644 src/dolphin/card/CARDNet.c create mode 100644 src/dolphin/card/CARDOpen.c create mode 100644 src/dolphin/card/CARDRdwr.c create mode 100644 src/dolphin/card/CARDRead.c create mode 100644 src/dolphin/card/CARDRename.c create mode 100644 src/dolphin/card/CARDStat.c create mode 100644 src/dolphin/card/CARDUnlock.c create mode 100644 src/dolphin/card/CARDWrite.c diff --git a/include/dolphin/CARDPriv.h b/include/dolphin/CARDPriv.h index ca28f6e1..8e531702 100644 --- a/include/dolphin/CARDPriv.h +++ b/include/dolphin/CARDPriv.h @@ -21,103 +21,149 @@ extern "C" { #define CARD_MAX_MOUNT_STEP (CARD_NUM_SYSTEM_BLOCK + 2) typedef struct CARDDir { - u8 gameName[4]; - u8 company[2]; - u8 _padding0; - u8 bannerFormat; - u8 fileName[CARD_FILENAME_MAX]; - u32 time; // seconds since 01/01/2000 midnight + u8 gameName[4]; + u8 company[2]; + u8 _padding0; + u8 bannerFormat; + u8 fileName[CARD_FILENAME_MAX]; + u32 time; // seconds since 01/01/2000 midnight - u32 iconAddr; // 0xffffffff if not used - u16 iconFormat; - u16 iconSpeed; + u32 iconAddr; // 0xffffffff if not used + u16 iconFormat; + u16 iconSpeed; - u8 permission; - u8 copyTimes; - u16 startBlock; - u16 length; - u8 _padding1[2]; + u8 permission; + u8 copyTimes; + u16 startBlock; + u16 length; + u8 _padding1[2]; - u32 commentAddr; // 0xffffffff if not used + u32 commentAddr; // 0xffffffff if not used } CARDDir; typedef struct CARDDirCheck { - u8 padding0[64 - 2 * 4]; - u16 padding1; - s16 checkCode; - u16 checkSum; - u16 checkSumInv; + u8 padding0[64 - 2 * 4]; + u16 padding1; + s16 checkCode; + u16 checkSum; + u16 checkSumInv; } CARDDirCheck; typedef struct CARDControl { - BOOL attached; - s32 result; - u16 size; - u16 pageSize; - s32 sectorSize; - u16 cBlock; - u16 vendorID; - s32 latency; - u8 id[12]; - int mountStep; - int formatStep; - u32 scramble; - DSPTaskInfo task; - void* workArea; - CARDDir* currentDir; - u16* currentFat; - OSThreadQueue threadQueue; - u8 cmd[9]; - s32 cmdlen; - vu32 mode; - int retry; - int repeat; - u32 addr; - void* buffer; - s32 xferred; - u16 freeNo; - u16 startBlock; - CARDFileInfo* fileInfo; - CARDCallback extCallback; - CARDCallback txCallback; - CARDCallback exiCallback; - CARDCallback apiCallback; - CARDCallback xferCallback; - CARDCallback eraseCallback; - CARDCallback unlockCallback; - OSAlarm alarm; - u32 cid; - const DVDDiskID* diskID; + BOOL attached; + s32 result; + u16 size; + u16 pageSize; + s32 sectorSize; + u16 cBlock; + u16 vendorID; + s32 latency; + u8 id[12]; + int mountStep; + int formatStep; + u32 scramble; + DSPTaskInfo task; + void *workArea; + CARDDir *currentDir; + u16 *currentFat; + OSThreadQueue threadQueue; + u8 cmd[9]; + s32 cmdlen; + vu32 mode; + int retry; + int repeat; + u32 addr; + void *buffer; + s32 xferred; + u16 freeNo; + u16 startBlock; + CARDFileInfo *fileInfo; + CARDCallback extCallback; + CARDCallback txCallback; + CARDCallback exiCallback; + CARDCallback apiCallback; + CARDCallback xferCallback; + CARDCallback eraseCallback; + CARDCallback unlockCallback; + OSAlarm alarm; + u32 cid; + const DVDDiskID *diskID; } CARDControl; typedef struct CARDID { - u8 serial[32]; // flashID[12] + timebase[8] + counterBias[4] + language[4] + XXX[4] - u16 deviceID; - u16 size; - u16 encode; // character set -- 0: S-JIS, 1: ANSI + u8 serial[32]; // flashID[12] + timebase[8] + counterBias[4] + language[4] + XXX[4] + u16 deviceID; + u16 size; + u16 encode; // character set -- 0: S-JIS, 1: ANSI - u8 padding[512 - 32 - 5 * 2]; + u8 padding[512 - 32 - 5 * 2]; - u16 checkSum; - u16 checkSumInv; + u16 checkSum; + u16 checkSumInv; } CARDID; void __CARDDefaultApiCallback(s32 chan, s32 result); +s32 __CARDEraseSector(s32 chan, u32 addr, CARDCallback callback); +s32 __CARDPutControlBlock(struct CARDControl *card, s32 result); +void __CARDSyncCallback(s32 chan, s32 result); +u16 *__CARDGetFatBlock(CARDControl *card); -#define CARDIsValidBlockNo(card, iBlock) \ - (CARD_NUM_SYSTEM_BLOCK <= (iBlock) && (iBlock) < (card)->cBlock) -#define __CARDGetDirCheck(dir) ((CARDDirCheck*)&(dir)[CARD_MAX_FILE]) +/* CARDBios */ +void __CARDExtHandler(s32 chan, OSContext *context); +void __CARDExiHandler(s32 chan, OSContext *context); +void __CARDTxHandler(s32 chan, OSContext *context); +void __CARDUnlockedHandler(s32 chan, OSContext *context); +s32 __CARDEnableInterrupt(s32 chan, BOOL enable); +s32 __CARDReadStatus(s32 chan, u8 *status); +s32 __CARDReadVendorID(s32 chan, u16 *vendorId); +s32 __CARDClearStatus(s32 chan); +s32 __CARDStart(s32 chan, CARDCallback txCallback, CARDCallback exiCallback); +s32 __CARDReadSegment(s32 chan, CARDCallback callback); +s32 __CARDWritePage(s32 chan, CARDCallback callback); +u16 __CARDGetFontEncode(void); +void __CARDSetDiskID(const DVDDiskID *id); +s32 __CARDGetControlBlock(s32 chan, struct CARDControl **pcard); +s32 __CARDSync(s32 chan); -CARDDir* __CARDGetDirBlock(CARDControl* card); -u16* __CARDGetFatBlock(CARDControl* card); -s32 __CARDUpdateFatBlock(s32 chan, u16* fat, CARDCallback callback); -void __CARDCheckSum(void* ptr, int length, u16* checkSum, u16* checkSumInv); -u16 __CARDGetFontEncode(); -void __CARDExiHandler(s32 chan, OSContext* context); -void __CARDExtHandler(s32 chan, OSContext* context); -void __CARDUnlockedHandler(s32 chan, OSContext* context); -s32 __CARDAccess(CARDControl* card, CARDDir* ent); -BOOL __CARDIsWritable(CARDDir* ent); +/* CARDBlock */ +s32 __CARDAllocBlock(s32 chan, u32 cBlock, CARDCallback callback); +s32 __CARDFreeBlock(s32 chan, u16 nBlock, CARDCallback callback); +s32 __CARDUpdateFatBlock(s32 chan, u16 *fat, CARDCallback callback); + +/* CARDCheck */ +void __CARDCheckSum(void *ptr, int length, u16 *checksum, u16 *checksumInv); +s32 __CARDVerify(CARDControl *card); + +/* CARDDir */ +CARDDir *__CARDGetDirBlock(CARDControl *card); +s32 __CARDUpdateDir(s32 chan, CARDCallback callback); + +/* CARDFormat */ +s32 __CARDFormatRegionAsync(s32 chan, u16 encode, CARDCallback callback); + +/* CARDMount */ +void __CARDMountCallback(s32 chan, s32 result); + +/* CARDOpen */ +BOOL __CARDCompareFileName(CARDDir *ent, const char *fileName); +s32 __CARDAccess(CARDControl *card, CARDDir *ent); +BOOL __CARDIsPublic(CARDDir *ent); +s32 __CARDIsReadable(CARDControl *card, CARDDir *ent); +s32 __CARDGetFileNo(CARDControl *card, const char *fileName, s32 *pfileNo); +BOOL __CARDIsOpened(CARDControl *card, s32 fileNo); + +/* CARDRdwr */ +s32 __CARDRead(s32 chan, u32 addr, s32 length, void *dst, CARDCallback callback); +s32 __CARDWrite(s32 chan, u32 addr, s32 length, void *dst, CARDCallback callback); + +/* CARDRead */ +s32 __CARDSeek(CARDFileInfo *fileInfo, s32 length, s32 offset, CARDControl **pcard); + +/* CARDUnlock */ +s32 __CARDUnlock(s32 chan, u8 flashID[12]); + +#define CARDIsValidBlockNo(card, iBlock) (CARD_NUM_SYSTEM_BLOCK <= (iBlock) && (iBlock) < (card)->cBlock) +#define __CARDGetDirCheck(dir) ((CARDDirCheck *)&(dir)[CARD_MAX_FILE]) #define TRUNC(n, a) (((u32)(n)) & ~((a)-1)) #define OFFSET(n, a) (((u32)(n)) & ((a)-1)) diff --git a/include/dolphin/os/OSReset.h b/include/dolphin/os/OSReset.h index d420a6f8..ae0e77e3 100644 --- a/include/dolphin/os/OSReset.h +++ b/include/dolphin/os/OSReset.h @@ -39,6 +39,7 @@ struct OSResetFunctionInfo { OSResetFunctionInfo* prev; }; +void OSRegisterResetFunction(OSResetFunctionInfo *info); u32 OSGetResetCode(void); #ifdef __cplusplus diff --git a/src/dolphin/card/CARDBios.c b/src/dolphin/card/CARDBios.c new file mode 100644 index 00000000..ff2d55ff --- /dev/null +++ b/src/dolphin/card/CARDBios.c @@ -0,0 +1,615 @@ +#include +#include +#include +#include +#include + +#include + +CARDControl __CARDBlock[2]; +DVDDiskID __CARDDiskNone; + +static u16 __CARDEncode; + +s32 __CARDReadStatus(s32 chan, u8 *status); +s32 __CARDClearStatus(s32 chan); +void __CARDSetDiskID(const DVDDiskID *id); +static s32 Retry(s32 chan); + +static BOOL OnReset(BOOL f); +static OSResetFunctionInfo ResetFunctionInfo = { OnReset, 127 }; + +void __CARDDefaultApiCallback(s32 chan, s32 result) { } + +void __CARDSyncCallback(s32 chan, s32 result) +{ + OSWakeupThread(&__CARDBlock[chan].threadQueue); +} + +void __CARDExtHandler(s32 chan, OSContext *context) +{ + CARDControl *card; + CARDCallback callback; + + card = &__CARDBlock[chan]; + if (card->attached) { + card->attached = FALSE; + EXISetExiCallback(chan, 0); + OSCancelAlarm(&card->alarm); + callback = card->exiCallback; + + if (callback) { + card->exiCallback = 0; + callback(chan, CARD_RESULT_NOCARD); + } + + if (card->result != CARD_RESULT_BUSY) { + card->result = CARD_RESULT_NOCARD; + } + + callback = card->extCallback; + if (callback && CARD_MAX_MOUNT_STEP <= card->mountStep) { + card->extCallback = 0; + callback(chan, CARD_RESULT_NOCARD); + } + } +} + +void __CARDExiHandler(s32 chan, OSContext *context) +{ + CARDControl *card; + CARDCallback callback; + u8 status; + s32 result; + + card = &__CARDBlock[chan]; + + OSCancelAlarm(&card->alarm); + + if (!card->attached) { + return; + } + + if (!EXILock(chan, 0, 0)) { + result = CARD_RESULT_FATAL_ERROR; + goto fatal; + } + + if ((result = __CARDReadStatus(chan, &status)) < 0 || (result = __CARDClearStatus(chan)) < 0) { + goto error; + } + + if ((result = (status & 0x18) ? CARD_RESULT_IOERROR : CARD_RESULT_READY) == CARD_RESULT_IOERROR && --card->retry > 0) { + result = Retry(chan); + if (result >= 0) { + return; + } + goto fatal; + } + +error: + EXIUnlock(chan); + +fatal: + callback = card->exiCallback; + if (callback) { + card->exiCallback = 0; + callback(chan, result); + } +} + +void __CARDTxHandler(s32 chan, OSContext *context) +{ + CARDControl *card; + CARDCallback callback; + BOOL err; + + card = &__CARDBlock[chan]; + err = !EXIDeselect(chan); + EXIUnlock(chan); + callback = card->txCallback; + if (callback) { + card->txCallback = 0; + callback(chan, (!err && EXIProbe(chan)) ? CARD_RESULT_READY : CARD_RESULT_NOCARD); + } +} + +void __CARDUnlockedHandler(s32 chan, OSContext *context) +{ + CARDControl *card; + CARDCallback callback; + + card = &__CARDBlock[chan]; + callback = card->unlockCallback; + if (callback) { + card->unlockCallback = 0; + callback(chan, EXIProbe(chan) ? CARD_RESULT_UNLOCKED : CARD_RESULT_NOCARD); + } +} + +s32 __CARDEnableInterrupt(s32 chan, BOOL enable) +{ + BOOL err; + u32 cmd; + + if (!EXISelect(chan, 0, 4)) { + return CARD_RESULT_NOCARD; + } + + cmd = enable ? 0x81010000 : 0x81000000; + err = FALSE; + err |= !EXIImm(chan, &cmd, 2, 1, NULL); + err |= !EXISync(chan); + err |= !EXIDeselect(chan); + return err ? CARD_RESULT_NOCARD : CARD_RESULT_READY; +} + +s32 __CARDReadStatus(s32 chan, u8 *status) +{ + BOOL err; + u32 cmd; + + if (!EXISelect(chan, 0, 4)) { + return CARD_RESULT_NOCARD; + } + + cmd = 0x83000000; + err = FALSE; + err |= !EXIImm(chan, &cmd, 2, 1, NULL); + err |= !EXISync(chan); + err |= !EXIImm(chan, status, 1, 0, NULL); + err |= !EXISync(chan); + err |= !EXIDeselect(chan); + return err ? CARD_RESULT_NOCARD : CARD_RESULT_READY; +} + +s32 __CARDClearStatus(s32 chan) +{ + BOOL err; + u32 cmd; + + if (!EXISelect(chan, 0, 4)) { + return CARD_RESULT_NOCARD; + } + + cmd = 0x89000000; + err = FALSE; + err |= !EXIImm(chan, &cmd, 1, 1, 0); + err |= !EXISync(chan); + err |= !EXIDeselect(chan); + + return err ? CARD_RESULT_NOCARD : CARD_RESULT_READY; +} + +static void TimeoutHandler(OSAlarm *alarm, OSContext *context) +{ + s32 chan; + CARDControl *card; + CARDCallback callback; + for (chan = 0; chan < 2; ++chan) { + card = &__CARDBlock[chan]; + if (alarm == &card->alarm) { + break; + } + } + + if (!card->attached) { + return; + } + + EXISetExiCallback(chan, NULL); + callback = card->exiCallback; + if (callback) { + card->exiCallback = 0; + callback(chan, CARD_RESULT_IOERROR); + } +} + +static void SetupTimeoutAlarm(CARDControl *card) +{ + OSCancelAlarm(&card->alarm); + switch (card->cmd[0]) { + case 0xF2: + OSSetAlarm(&card->alarm, OSMillisecondsToTicks(100), TimeoutHandler); + break; + case 0xF3: + break; + case 0xF4: + case 0xF1: + OSSetAlarm(&card->alarm, OSSecondsToTicks((OSTime)2) * (card->sectorSize / 0x2000), TimeoutHandler); + break; + } +} + +static s32 Retry(s32 chan) +{ + CARDControl *card; + card = &__CARDBlock[chan]; + + if (!EXISelect(chan, 0, 4)) { + EXIUnlock(chan); + return CARD_RESULT_NOCARD; + } + + SetupTimeoutAlarm(card); + + if (!EXIImmEx(chan, card->cmd, card->cmdlen, 1)) { + EXIDeselect(chan); + EXIUnlock(chan); + return CARD_RESULT_NOCARD; + } + + if (card->cmd[0] == 0x52 && !EXIImmEx(chan, (u8 *)card->workArea + sizeof(CARDID), card->latency, 1)) { + EXIDeselect(chan); + EXIUnlock(chan); + return CARD_RESULT_NOCARD; + } + + if (card->mode == 0xffffffff) { + EXIDeselect(chan); + EXIUnlock(chan); + return CARD_RESULT_READY; + } + + if (!EXIDma(chan, card->buffer, (s32)((card->cmd[0] == 0x52) ? 512 : 128), card->mode, __CARDTxHandler)) { + EXIDeselect(chan); + EXIUnlock(chan); + return CARD_RESULT_NOCARD; + } + + return CARD_RESULT_READY; +} + +static void UnlockedCallback(s32 chan, s32 result) +{ + CARDCallback callback; + CARDControl *card; + + card = &__CARDBlock[chan]; + if (result >= 0) { + card->unlockCallback = UnlockedCallback; + if (!EXILock(chan, 0, __CARDUnlockedHandler)) { + result = CARD_RESULT_READY; + } + else { + card->unlockCallback = 0; + result = Retry(chan); + } + } + + if (result < 0) { + switch (card->cmd[0]) { + case 0x52: + callback = card->txCallback; + if (callback) { + card->txCallback = 0; + callback(chan, result); + } + + break; + case 0xF2: + case 0xF4: + case 0xF1: + callback = card->exiCallback; + if (callback) { + card->exiCallback = 0; + callback(chan, result); + } + break; + } + } +} + +static s32 __CARDStart(s32 chan, CARDCallback txCallback, CARDCallback exiCallback) +{ + BOOL enabled; + CARDControl *card; + s32 result; + + enabled = OSDisableInterrupts(); + + card = &__CARDBlock[chan]; + if (!card->attached) { + result = CARD_RESULT_NOCARD; + } + else { + + if (txCallback) { + card->txCallback = txCallback; + } + if (exiCallback) { + card->exiCallback = exiCallback; + } + card->unlockCallback = UnlockedCallback; + if (!EXILock(chan, 0, __CARDUnlockedHandler)) { + result = CARD_RESULT_BUSY; + } + else { + card->unlockCallback = 0; + + if (!EXISelect(chan, 0, 4)) { + EXIUnlock(chan); + result = CARD_RESULT_NOCARD; + } + else { + SetupTimeoutAlarm(card); + result = CARD_RESULT_READY; + } + } + } + + OSRestoreInterrupts(enabled); + return result; +} + +#define AD1(x) ((u8)(((x) >> 17) & 0x7f)) +#define AD1EX(x) ((u8)(AD1(x) | 0x80)); +#define AD2(x) ((u8)(((x) >> 9) & 0xff)) +#define AD3(x) ((u8)(((x) >> 7) & 0x03)) +#define BA(x) ((u8)((x)&0x7f)) + +s32 __CARDReadSegment(s32 chan, CARDCallback callback) +{ + CARDControl *card; + s32 result; + + card = &__CARDBlock[chan]; + card->cmd[0] = 0x52; + card->cmd[1] = AD1(card->addr); + card->cmd[2] = AD2(card->addr); + card->cmd[3] = AD3(card->addr); + card->cmd[4] = BA(card->addr); + card->cmdlen = 5; + card->mode = 0; + card->retry = 0; + + result = __CARDStart(chan, callback, 0); + if (result == CARD_RESULT_BUSY) { + result = CARD_RESULT_READY; + } + else if (result >= 0) { + if (!EXIImmEx(chan, card->cmd, card->cmdlen, 1) + || !EXIImmEx(chan, (u8 *)card->workArea + sizeof(CARDID), card->latency, + 1) + || // XXX use DMA if possible + !EXIDma(chan, card->buffer, 512, card->mode, __CARDTxHandler)) { + card->txCallback = 0; + EXIDeselect(chan); + EXIUnlock(chan); + result = CARD_RESULT_NOCARD; + } + else { + result = CARD_RESULT_READY; + } + } + return result; +} + +s32 __CARDWritePage(s32 chan, CARDCallback callback) +{ + CARDControl *card; + s32 result; + + card = &__CARDBlock[chan]; + card->cmd[0] = 0xF2; + card->cmd[1] = AD1(card->addr); + card->cmd[2] = AD2(card->addr); + card->cmd[3] = AD3(card->addr); + card->cmd[4] = BA(card->addr); + card->cmdlen = 5; + card->mode = 1; + card->retry = 3; + + result = __CARDStart(chan, 0, callback); + if (result == CARD_RESULT_BUSY) { + result = CARD_RESULT_READY; + } + else if (result >= 0) { + if (!EXIImmEx(chan, card->cmd, card->cmdlen, 1) || !EXIDma(chan, card->buffer, 128, card->mode, __CARDTxHandler)) { + card->exiCallback = 0; + EXIDeselect(chan); + EXIUnlock(chan); + result = CARD_RESULT_NOCARD; + } + else { + result = CARD_RESULT_READY; + } + } + return result; +} + +s32 __CARDEraseSector(s32 chan, u32 addr, CARDCallback callback) +{ + CARDControl *card; + s32 result; + + card = &__CARDBlock[chan]; + card->cmd[0] = 0xF1; + card->cmd[1] = AD1(addr); + card->cmd[2] = AD2(addr); + card->cmdlen = 3; + card->mode = -1; + card->retry = 3; + + result = __CARDStart(chan, 0, callback); + + if (result == CARD_RESULT_BUSY) { + result = CARD_RESULT_READY; + } + else if (result >= 0) { + if (!EXIImmEx(chan, card->cmd, card->cmdlen, 1)) { + card->exiCallback = NULL; + result = CARD_RESULT_NOCARD; + } + else { + result = CARD_RESULT_READY; + } + + EXIDeselect(chan); + EXIUnlock(chan); + } + return result; +} + +void CARDInit(void) +{ + int chan; + + if (__CARDBlock[0].diskID && __CARDBlock[1].diskID) { + return; + } + + DSPInit(); + OSInitAlarm(); + + for (chan = 0; chan < 2; ++chan) { + CARDControl *card = &__CARDBlock[chan]; + + card->result = CARD_RESULT_NOCARD; + OSInitThreadQueue(&card->threadQueue); + OSCreateAlarm(&card->alarm); + } + __CARDSetDiskID((DVDDiskID *)OSPhysicalToCached(0x0)); + + OSRegisterResetFunction(&ResetFunctionInfo); +} + +u16 __CARDGetFontEncode() +{ + return __CARDEncode; +} + +void __CARDSetDiskID(const DVDDiskID *id) +{ + __CARDBlock[0].diskID = id ? id : &__CARDDiskNone; + __CARDBlock[1].diskID = id ? id : &__CARDDiskNone; +} + +s32 __CARDGetControlBlock(s32 chan, CARDControl **pcard) +{ + BOOL enabled; + s32 result; + CARDControl *card; + + card = &__CARDBlock[chan]; + if (chan < 0 || chan >= 2 || card->diskID == NULL) { + return CARD_RESULT_FATAL_ERROR; + } + + enabled = OSDisableInterrupts(); + if (!card->attached) { + result = CARD_RESULT_NOCARD; + } + else if (card->result == CARD_RESULT_BUSY) { + result = CARD_RESULT_BUSY; + } + else { + card->result = CARD_RESULT_BUSY; + result = CARD_RESULT_READY; + card->apiCallback = 0; + *pcard = card; + } + OSRestoreInterrupts(enabled); + return result; +} + +s32 __CARDPutControlBlock(CARDControl *card, s32 result) +{ + BOOL enabled; + + enabled = OSDisableInterrupts(); + if (card->attached) { + card->result = result; + } + else if (card->result == CARD_RESULT_BUSY) { + card->result = result; + } + OSRestoreInterrupts(enabled); + return result; +} + +s32 CARDGetResultCode(s32 chan) +{ + CARDControl *card; + if (chan < 0 || chan >= 2) { + return CARD_RESULT_FATAL_ERROR; + } + card = &__CARDBlock[chan]; + return card->result; +} + +s32 CARDFreeBlocks(s32 chan, s32 *byteNotUsed, s32 *filesNotUsed) +{ + CARDControl *card; + s32 result; + u16 *fat; + CARDDir *dir; + CARDDir *ent; + u16 fileNo; + + result = __CARDGetControlBlock(chan, &card); + if (result < 0) { + return result; + } + + fat = __CARDGetFatBlock(card); + dir = __CARDGetDirBlock(card); + if (fat == 0 || dir == 0) { + return __CARDPutControlBlock(card, CARD_RESULT_BROKEN); + } + + if (byteNotUsed) { + *byteNotUsed = (s32)(card->sectorSize * fat[CARD_FAT_FREEBLOCKS]); + } + + if (filesNotUsed) { + *filesNotUsed = 0; + for (fileNo = 0; fileNo < CARD_MAX_FILE; fileNo++) { + ent = &dir[fileNo]; + if (ent->fileName[0] == 0xff) { + ++*filesNotUsed; + } + } + } + + return __CARDPutControlBlock(card, CARD_RESULT_READY); +} + +s32 CARDGetSectorSize(s32 chan, u32 *size) +{ + struct CARDControl *card; + long result; + + result = __CARDGetControlBlock(chan, &card); + if (result < 0) { + return result; + } + *size = card->sectorSize; + return __CARDPutControlBlock(card, 0); +} + +s32 __CARDSync(s32 chan) +{ + CARDControl *block; + s32 result; + s32 enabled; + + block = &__CARDBlock[chan]; + enabled = OSDisableInterrupts(); + while ((result = CARDGetResultCode(chan)) == -1) { + OSSleepThread(&block->threadQueue); + } + OSRestoreInterrupts(enabled); + return result; +} + +static BOOL OnReset(BOOL f) +{ + if (!f) { + if (CARDUnmount(0) == CARD_RESULT_BUSY || CARDUnmount(1) == CARD_RESULT_BUSY) { + return FALSE; + } + } + + return TRUE; +} diff --git a/src/dolphin/card/CARDBlock.c b/src/dolphin/card/CARDBlock.c new file mode 100644 index 00000000..c6543c7f --- /dev/null +++ b/src/dolphin/card/CARDBlock.c @@ -0,0 +1,170 @@ +#include +#include +#include +#include + +#include "string.h" + +#include + +u16 *__CARDGetFatBlock(CARDControl *card) +{ + return card->currentFat; +} + +static void WriteCallback(s32 chan, s32 result) +{ + CARDControl *card; + CARDCallback callback; + u16 *fat; + u16 *fatBack; + + card = &__CARDBlock[chan]; + + if (result >= 0) { + fat = (u16 *)((u8 *)card->workArea + 0x6000); + fatBack = (u16 *)((u8 *)card->workArea + 0x8000); + + if (card->currentFat == fat) { + card->currentFat = fatBack; + memcpy(fatBack, fat, 0x2000); + } + else { + card->currentFat = fat; + memcpy(fat, fatBack, 0x2000); + } + } + + if (card->apiCallback == NULL) { + __CARDPutControlBlock(card, result); + } + + callback = card->eraseCallback; + if (callback) { + card->eraseCallback = NULL; + callback(chan, result); + } +} + +static void EraseCallback(s32 chan, s32 result) +{ + CARDControl *card; + CARDCallback callback; + u32 temp[2]; /* this compiler sucks */ + u16 *fat; + u32 addr; + + card = &__CARDBlock[chan]; + if (result < 0) { + goto error; + } + + fat = __CARDGetFatBlock(card); + addr = ((u32)fat - (u32)card->workArea) / CARD_SYSTEM_BLOCK_SIZE * card->sectorSize; + result = __CARDWrite(chan, addr, CARD_SYSTEM_BLOCK_SIZE, fat, WriteCallback); + if (result < 0) { + goto error; + } + + return; + +error: + if (card->apiCallback == NULL) { + __CARDPutControlBlock(card, result); + } + callback = card->eraseCallback; + if (callback) { + card->eraseCallback = NULL; + callback(chan, result); + } +} + +s32 __CARDAllocBlock(s32 chan, u32 cBlock, CARDCallback callback) +{ + CARDControl *card; + u16 *fat; + u16 iBlock; + u16 startBlock; + u16 prevBlock; + u16 count; + + card = &__CARDBlock[chan]; + if (!card->attached) { + return CARD_RESULT_NOCARD; + } + + fat = __CARDGetFatBlock(card); + if (fat[3] < cBlock) { + return CARD_RESULT_INSSPACE; + } + + fat[3] -= cBlock; + startBlock = 0xFFFF; + iBlock = fat[4]; + count = 0; + while (0 < cBlock) { + if (card->cBlock - 5 < ++count) { + return CARD_RESULT_BROKEN; + } + + iBlock++; + if (!CARDIsValidBlockNo(card, iBlock)) { + iBlock = 5; + } + + if (fat[iBlock] == 0x0000u) { + if (startBlock == 0xFFFF) { + startBlock = iBlock; + } + else { + fat[prevBlock] = iBlock; + } + prevBlock = iBlock; + fat[iBlock] = 0xFFFF; + --cBlock; + } + } + fat[4] = iBlock; + card->startBlock = startBlock; + + return __CARDUpdateFatBlock(chan, fat, callback); +} + +s32 __CARDFreeBlock(s32 chan, u16 nBlock, CARDCallback callback) +{ + CARDControl *card; + u16 *fat; + u16 nextBlock; + + card = card = &__CARDBlock[chan]; + if (!card->attached) { + return CARD_RESULT_NOCARD; + } + + fat = __CARDGetFatBlock(card); + while (nBlock != 0xFFFF) { + if (!CARDIsValidBlockNo(card, nBlock)) { + return CARD_RESULT_BROKEN; + } + + nextBlock = fat[nBlock]; + fat[nBlock] = 0; + nBlock = nextBlock; + ++fat[3]; + } + + return __CARDUpdateFatBlock(chan, fat, callback); +} + +s32 __CARDUpdateFatBlock(s32 chan, u16 *fat, CARDCallback callback) +{ + CARDControl *card; + + card = &__CARDBlock[chan]; + ++fat[2]; + __CARDCheckSum(fat + 2, 0x1FFC, fat, fat + 1); + DCStoreRange(fat, 0x2000); + card->eraseCallback = callback; + + return __CARDEraseSector(chan, (((u32)fat - (u32)card->workArea) / 8192u) * card->sectorSize, EraseCallback); +} diff --git a/src/dolphin/card/CARDCheck.c b/src/dolphin/card/CARDCheck.c new file mode 100644 index 00000000..988e16b3 --- /dev/null +++ b/src/dolphin/card/CARDCheck.c @@ -0,0 +1,343 @@ +#include +#include +#include +#include + +#include +#include + +#include "string.h" + +void __CARDCheckSum(void *ptr, int length, u16 *checksum, u16 *checksumInv) +{ + u16 *p; + int i; + + length /= sizeof(u16); + *checksum = *checksumInv = 0; + for (i = 0, p = ptr; i < length; i++, p++) { + *checksum += *p; + *checksumInv += ~*p; + } + if (*checksum == 0xffff) { + *checksum = 0; + } + if (*checksumInv == 0xffff) { + *checksumInv = 0; + } +} + +static s32 VerifyID(CARDControl *card) +{ + CARDID *id; + u16 checksum; + u16 checksumInv; + OSSramEx *sramEx; + OSTime rand; + int i; + + id = card->workArea; + + if (id->deviceID != 0 || id->size != card->size) + return CARD_RESULT_BROKEN; + + __CARDCheckSum(id, sizeof(CARDID) - sizeof(u32), &checksum, &checksumInv); + if (id->checkSum != checksum || id->checkSumInv != checksumInv) + return CARD_RESULT_BROKEN; + + if (id->encode != OSGetFontEncode()) + return CARD_RESULT_ENCODING; + + rand = *(OSTime *)&id->serial[12]; + sramEx = __OSLockSramEx(); + for (i = 0; i < 12; i++) { + rand = (rand * 1103515245 + 12345) >> 16; + if (id->serial[i] != (u8)(sramEx->flashID[card - __CARDBlock][i] + rand)) { + __OSUnlockSramEx(FALSE); + return CARD_RESULT_BROKEN; + } + rand = ((rand * 1103515245 + 12345) >> 16) & 0x7FFF; + } + + __OSUnlockSramEx(FALSE); + + return CARD_RESULT_READY; +} + +static s32 VerifyDir(CARDControl *card, int *outCurrent) +{ + CARDDir *dir[2]; + CARDDirCheck *check[2]; + u16 checkSum; + u16 checkSumInv; + int i; + int errors; + int current; + + current = errors = 0; + for (i = 0; i < 2; i++) { + dir[i] = (CARDDir *)((u8 *)card->workArea + (1 + i) * CARD_SYSTEM_BLOCK_SIZE); + check[i] = __CARDGetDirCheck(dir[i]); + __CARDCheckSum(dir[i], CARD_SYSTEM_BLOCK_SIZE - sizeof(u32), &checkSum, &checkSumInv); + if (check[i]->checkSum != checkSum || check[i]->checkSumInv != checkSumInv) { + ++errors; + current = i; + card->currentDir = 0; + } + } + + if (0 == errors) { + if (card->currentDir == 0) { + if ((check[0]->checkCode - check[1]->checkCode) < 0) { + current = 0; + } + else { + current = 1; + } + card->currentDir = dir[current]; + memcpy(dir[current], dir[current ^ 1], CARD_SYSTEM_BLOCK_SIZE); + } + else { + current = (card->currentDir == dir[0]) ? 0 : 1; + } + } + if (outCurrent) { + *outCurrent = current; + } + return errors; +} + +static s32 VerifyFAT(CARDControl *card, int *outCurrent) +{ + u16 *fat[2]; + u16 *fatp; + u16 nBlock; + u16 cFree; + int i; + u16 checkSum; + u16 checkSumInv; + int errors; + int current; + + current = errors = 0; + for (i = 0; i < 2; i++) { + fatp = fat[i] = (u16 *)((u8 *)card->workArea + (3 + i) * CARD_SYSTEM_BLOCK_SIZE); + + __CARDCheckSum(&fatp[CARD_FAT_CHECKCODE], CARD_SYSTEM_BLOCK_SIZE - sizeof(u32), &checkSum, &checkSumInv); + if (fatp[CARD_FAT_CHECKSUM] != checkSum || fatp[CARD_FAT_CHECKSUMINV] != checkSumInv) { + ++errors; + current = i; + card->currentFat = 0; + continue; + } + + cFree = 0; + for (nBlock = CARD_NUM_SYSTEM_BLOCK; nBlock < card->cBlock; nBlock++) { + if (fatp[nBlock] == CARD_FAT_AVAIL) { + cFree++; + } + } + if (cFree != fatp[CARD_FAT_FREEBLOCKS]) { + ++errors; + current = i; + card->currentFat = 0; + continue; + } + } + + if (0 == errors) { + if (card->currentFat == 0) { + if (((s16)fat[0][CARD_FAT_CHECKCODE] - (s16)fat[1][CARD_FAT_CHECKCODE]) < 0) { + current = 0; + } + else { + current = 1; + } + card->currentFat = fat[current]; + memcpy(fat[current], fat[current ^ 1], CARD_SYSTEM_BLOCK_SIZE); + } + else { + current = (card->currentFat == fat[0]) ? 0 : 1; + } + } + if (outCurrent) { + *outCurrent = current; + } + return errors; +} + +s32 __CARDVerify(CARDControl *card) +{ + s32 result; + int errors; + + result = VerifyID(card); + if (result < 0) { + return result; + } + + errors = VerifyDir(card, NULL); + errors += VerifyFAT(card, NULL); + switch (errors) { + case 0: + return CARD_RESULT_READY; + case 1: + return CARD_RESULT_BROKEN; + default: + return CARD_RESULT_BROKEN; + } +} + +s32 CARDCheckExAsync(s32 chan, s32 *xferBytes, CARDCallback callback) +{ + CARDControl *card; + CARDDir *dir[2]; + u16 *fat[2]; + u16 *map; + s32 result; + int errors; + int currentFat; + int currentDir; + s32 fileNo; + u16 iBlock; + u16 cBlock; + u16 cFree; + BOOL updateFat = FALSE; + BOOL updateDir = FALSE; + BOOL updateOrphan = FALSE; + + if (xferBytes) { + *xferBytes = 0; + } + + result = __CARDGetControlBlock(chan, &card); + if (result < 0) { + return result; + } + + result = VerifyID(card); + if (result < 0) { + return __CARDPutControlBlock(card, result); + } + + errors = VerifyDir(card, ¤tDir); + errors += VerifyFAT(card, ¤tFat); + if (1 < errors) { + return __CARDPutControlBlock(card, CARD_RESULT_BROKEN); + } + + dir[0] = (CARDDir *)((u8 *)card->workArea + (1 + 0) * CARD_SYSTEM_BLOCK_SIZE); + dir[1] = (CARDDir *)((u8 *)card->workArea + (1 + 1) * CARD_SYSTEM_BLOCK_SIZE); + fat[0] = (u16 *)((u8 *)card->workArea + (3 + 0) * CARD_SYSTEM_BLOCK_SIZE); + fat[1] = (u16 *)((u8 *)card->workArea + (3 + 1) * CARD_SYSTEM_BLOCK_SIZE); + + switch (errors) { + case 0: + break; + case 1: + if (!card->currentDir) { + card->currentDir = dir[currentDir]; + memcpy(dir[currentDir], dir[currentDir ^ 1], CARD_SYSTEM_BLOCK_SIZE); + updateDir = TRUE; + } + else { + card->currentFat = fat[currentFat]; + memcpy(fat[currentFat], fat[currentFat ^ 1], CARD_SYSTEM_BLOCK_SIZE); + updateFat = TRUE; + } + break; + } + + map = fat[currentFat ^ 1]; + memset(map, 0, CARD_SYSTEM_BLOCK_SIZE); + + for (fileNo = 0; fileNo < CARD_MAX_FILE; fileNo++) { + CARDDir *ent; + + ent = &card->currentDir[fileNo]; + if (ent->gameName[0] == 0xff) { + continue; + } + + for (iBlock = ent->startBlock, cBlock = 0; iBlock != 0xFFFF && cBlock < ent->length; iBlock = card->currentFat[iBlock], ++cBlock) { + if (!CARDIsValidBlockNo(card, iBlock) || 1 < ++map[iBlock]) { + return __CARDPutControlBlock(card, CARD_RESULT_BROKEN); + } + } + if (cBlock != ent->length || iBlock != 0xFFFF) { + return __CARDPutControlBlock(card, CARD_RESULT_BROKEN); + } + } + + cFree = 0; + for (iBlock = CARD_NUM_SYSTEM_BLOCK; iBlock < card->cBlock; iBlock++) { + u16 nextBlock; + + nextBlock = card->currentFat[iBlock]; + if (map[iBlock] == 0) { + if (nextBlock != CARD_FAT_AVAIL) { + card->currentFat[iBlock] = CARD_FAT_AVAIL; + updateOrphan = TRUE; + } + cFree++; + } + else if (!CARDIsValidBlockNo(card, nextBlock) && nextBlock != 0xFFFF) { + return __CARDPutControlBlock(card, CARD_RESULT_BROKEN); + } + } + if (cFree != card->currentFat[CARD_FAT_FREEBLOCKS]) { + card->currentFat[CARD_FAT_FREEBLOCKS] = cFree; + updateOrphan = TRUE; + } + if (updateOrphan) { + __CARDCheckSum(&card->currentFat[CARD_FAT_CHECKCODE], CARD_SYSTEM_BLOCK_SIZE - sizeof(u32), &card->currentFat[CARD_FAT_CHECKSUM], + &card->currentFat[CARD_FAT_CHECKSUMINV]); + } + + memcpy(fat[currentFat ^ 1], fat[currentFat], CARD_SYSTEM_BLOCK_SIZE); + + if (updateDir) { + if (xferBytes) { + *xferBytes = CARD_SYSTEM_BLOCK_SIZE; + } + return __CARDUpdateDir(chan, callback); + } + + if (updateFat | updateOrphan) { + if (xferBytes) { + *xferBytes = CARD_SYSTEM_BLOCK_SIZE; + } + return __CARDUpdateFatBlock(chan, card->currentFat, callback); + } + + __CARDPutControlBlock(card, CARD_RESULT_READY); + if (callback) { + BOOL enabled = OSDisableInterrupts(); + callback(chan, CARD_RESULT_READY); + OSRestoreInterrupts(enabled); + } + return CARD_RESULT_READY; +} + +s32 CARDCheckAsync(s32 chan, CARDCallback callback) +{ + s32 xferBytes; + + return CARDCheckExAsync(chan, &xferBytes, callback); +} + +s32 CARDCheck(s32 chan) +{ + s32 xferBytes; + + s32 result = CARDCheckExAsync(chan, &xferBytes, __CARDSyncCallback); + if (result >= 0) { + if (&xferBytes == NULL) { + return result; + } + + return __CARDSync(chan); + } + + return result; +} diff --git a/src/dolphin/card/CARDCreate.c b/src/dolphin/card/CARDCreate.c new file mode 100644 index 00000000..ac91d727 --- /dev/null +++ b/src/dolphin/card/CARDCreate.c @@ -0,0 +1,126 @@ +#include +#include +#include +#include + +#include + +static void CreateCallbackFat(s32 chan, s32 result) +{ + CARDControl *card; + CARDDir *dir; + CARDDir *ent; + CARDCallback callback; + + card = &__CARDBlock[chan]; + callback = card->apiCallback; + card->apiCallback = 0; + if (result < 0) { + goto error; + } + + dir = __CARDGetDirBlock(card); + ent = &dir[card->freeNo]; + memcpy(ent->gameName, card->diskID->gameName, sizeof(ent->gameName)); + memcpy(ent->company, card->diskID->company, sizeof(ent->company)); + ent->permission = CARD_ATTR_PUBLIC; + ent->copyTimes = 0; + ent->startBlock = card->startBlock; + + ent->bannerFormat = 0; + ent->iconAddr = 0xffffffff; + ent->iconFormat = 0; + ent->iconSpeed = 0; + ent->commentAddr = 0xffffffff; + + CARDSetIconSpeed(ent, 0, CARD_STAT_SPEED_FAST); + + card->fileInfo->offset = 0; + card->fileInfo->iBlock = ent->startBlock; + + ent->time = (u32)OSTicksToSeconds(OSGetTime()); + result = __CARDUpdateDir(chan, callback); + if (result < 0) { + goto error; + } + return; + +error: + __CARDPutControlBlock(card, result); + if (callback) { + callback(chan, result); + } +} + +s32 CARDCreateAsync(s32 chan, const char *fileName, u32 size, CARDFileInfo *fileInfo, CARDCallback callback) +{ + CARDControl *card; + CARDDir *dir; + CARDDir *ent; + s32 result; + u16 fileNo; + u16 freeNo; + u16 *fat; + + if (strlen(fileName) > (u32)CARD_FILENAME_MAX) { + return CARD_RESULT_NAMETOOLONG; + } + + result = __CARDGetControlBlock(chan, &card); + if (result < 0) { + return result; + } + + if (size <= 0 || (size % card->sectorSize) != 0) { + return CARD_RESULT_FATAL_ERROR; + } + + freeNo = (u16)-1; + dir = __CARDGetDirBlock(card); + for (fileNo = 0; fileNo < CARD_MAX_FILE; fileNo++) { + ent = &dir[fileNo]; + if (ent->gameName[0] == 0xff) { + if (freeNo == (u16)-1) { + freeNo = fileNo; + } + } + else if (memcmp(ent->gameName, card->diskID->gameName, sizeof(ent->gameName)) == 0 + && memcmp(ent->company, card->diskID->company, sizeof(ent->company)) == 0 && __CARDCompareFileName(ent, fileName)) { + return __CARDPutControlBlock(card, CARD_RESULT_EXIST); + } + } + if (freeNo == (u16)-1) { + return __CARDPutControlBlock(card, CARD_RESULT_NOENT); + } + + fat = __CARDGetFatBlock(card); + if (card->sectorSize * fat[CARD_FAT_FREEBLOCKS] < size) { + return __CARDPutControlBlock(card, CARD_RESULT_INSSPACE); + } + + card->apiCallback = callback ? callback : __CARDDefaultApiCallback; + card->freeNo = freeNo; + ent = &dir[freeNo]; + ent->length = (u16)(size / card->sectorSize); + strcat(ent->fileName, fileName, CARD_FILENAME_MAX); + + card->fileInfo = fileInfo; + fileInfo->chan = chan; + fileInfo->fileNo = freeNo; + + result = __CARDAllocBlock(chan, size / card->sectorSize, CreateCallbackFat); + if (result < 0) { + return __CARDPutControlBlock(card, result); + } + return result; +} + +s32 CARDCreate(s32 chan, const char *fileName, u32 size, CARDFileInfo *fileInfo) +{ + s32 result = CARDCreateAsync(chan, fileName, size, fileInfo, __CARDSyncCallback); + if (result < 0) { + return result; + } + + return __CARDSync(chan); +} diff --git a/src/dolphin/card/CARDDelete.c b/src/dolphin/card/CARDDelete.c new file mode 100644 index 00000000..8b531738 --- /dev/null +++ b/src/dolphin/card/CARDDelete.c @@ -0,0 +1,111 @@ +#include +#include +#include +#include + +#include "string.h" + +#include + +static void DeleteCallback(s32 chan, s32 result) +{ + CARDControl *card; + CARDCallback callback; + + card = &__CARDBlock[chan]; + callback = card->apiCallback; + card->apiCallback = 0; + + if (result < 0) { + goto error; + } + + result = __CARDFreeBlock(chan, card->startBlock, callback); + if (result < 0) { + goto error; + } + return; + +error: + __CARDPutControlBlock(card, result); + if (callback) { + callback(chan, result); + } +} + +s32 CARDFastDeleteAsync(s32 chan, s32 fileNo, CARDCallback callback) +{ + CARDControl *card; + CARDDir *dir; + CARDDir *ent; + s32 result; + + if (fileNo < 0 || CARD_MAX_FILE <= fileNo) { + return CARD_RESULT_FATAL_ERROR; + } + result = __CARDGetControlBlock(chan, &card); + if (result < 0) { + return result; + } + + dir = __CARDGetDirBlock(card); + ent = &dir[fileNo]; + result = __CARDAccess(card, ent); + if (result < 0) { + return __CARDPutControlBlock(card, result); + } + if (__CARDIsOpened(card, fileNo)) { + return __CARDPutControlBlock(card, CARD_RESULT_BUSY); + } + card->startBlock = ent->startBlock; + memset(ent, 0xff, sizeof(CARDDir)); + + card->apiCallback = callback ? callback : __CARDDefaultApiCallback; + result = __CARDUpdateDir(chan, DeleteCallback); + if (result < 0) { + __CARDPutControlBlock(card, result); + } + return result; +} + +s32 CARDDeleteAsync(s32 chan, const char *fileName, CARDCallback callback) +{ + CARDControl *card; + s32 fileNo; + s32 result; + CARDDir *dir; + CARDDir *ent; + + result = __CARDGetControlBlock(chan, &card); + if (result < 0) { + return result; + } + result = __CARDGetFileNo(card, fileName, &fileNo); + if (result < 0) { + return __CARDPutControlBlock(card, result); + } + if (__CARDIsOpened(card, fileNo)) { + return __CARDPutControlBlock(card, CARD_RESULT_BUSY); + } + + dir = __CARDGetDirBlock(card); + ent = &dir[fileNo]; + card->startBlock = ent->startBlock; + memset(ent, 0xff, sizeof(CARDDir)); + + card->apiCallback = callback ? callback : __CARDDefaultApiCallback; + result = __CARDUpdateDir(chan, DeleteCallback); + if (result < 0) { + __CARDPutControlBlock(card, result); + } + return result; +} + +s32 CARDDelete(s32 chan, const char *fileName) +{ + s32 result = CARDDeleteAsync(chan, fileName, __CARDSyncCallback); + + if (result < 0) + return result; + return __CARDSync(chan); +} diff --git a/src/dolphin/card/CARDDir.c b/src/dolphin/card/CARDDir.c new file mode 100644 index 00000000..97844a6e --- /dev/null +++ b/src/dolphin/card/CARDDir.c @@ -0,0 +1,101 @@ +#include +#include +#include +#include + +#include "string.h" + +#include + +CARDDir *__CARDGetDirBlock(CARDControl *card) +{ + return card->currentDir; +} + +static void WriteCallback(s32 chan, s32 result) +{ + CARDControl *card; + CARDCallback callback; + + card = &__CARDBlock[chan]; + if (0 <= result) { + CARDDir *dir0 = (CARDDir *)((u8 *)card->workArea + 0x2000); + CARDDir *dir1 = (CARDDir *)((u8 *)card->workArea + 0x4000); + + if (card->currentDir == dir0) { + card->currentDir = dir1; + memcpy(dir1, dir0, 0x2000); + } + else { + card->currentDir = dir0; + memcpy(dir0, dir1, 0x2000); + } + } + +error: + if (card->apiCallback == 0) { + __CARDPutControlBlock(card, result); + } + callback = card->eraseCallback; + if (callback) { + card->eraseCallback = 0; + callback(chan, result); + } +} + +static void EraseCallback(s32 chan, s32 result) +{ + CARDControl *card; + CARDCallback callback; + CARDDir *dir; + u32 tmp[2]; + u32 addr; + + card = &__CARDBlock[chan]; + if (result < 0) { + goto error; + } + + dir = __CARDGetDirBlock(card); + addr = ((u32)dir - (u32)card->workArea) / 0x2000 * card->sectorSize; + result = __CARDWrite(chan, addr, 0x2000, dir, WriteCallback); + if (result < 0) { + goto error; + } + + return; + +error: + if (card->apiCallback == 0) { + __CARDPutControlBlock(card, result); + } + callback = card->eraseCallback; + if (callback) { + card->eraseCallback = 0; + callback(chan, result); + } +} + +s32 __CARDUpdateDir(s32 chan, CARDCallback callback) +{ + CARDControl *card; + CARDDirCheck *check; + u32 tmp[2]; + u32 addr; + CARDDir *dir; + + card = &__CARDBlock[chan]; + if (!card->attached) { + return CARD_RESULT_NOCARD; + } + + dir = __CARDGetDirBlock(card); + check = __CARDGetDirCheck(dir); + ++check->checkCode; + __CARDCheckSum(dir, 0x2000 - sizeof(u32), &check->checkSum, &check->checkSumInv); + DCStoreRange(dir, 0x2000); + + card->eraseCallback = callback; + addr = ((u32)dir - (u32)card->workArea) / 0x2000 * card->sectorSize; + return __CARDEraseSector(chan, addr, EraseCallback); +} diff --git a/src/dolphin/card/CARDFormat.c b/src/dolphin/card/CARDFormat.c new file mode 100644 index 00000000..b2c91930 --- /dev/null +++ b/src/dolphin/card/CARDFormat.c @@ -0,0 +1,141 @@ +#include +#include +#include +#include + +#include +#include +#include +#include + +#include "string.h" + +static void FormatCallback(s32 chan, s32 result) +{ + CARDControl *card; + CARDCallback callback; + + card = &__CARDBlock[chan]; + if (result < 0) { + goto error; + } + + ++card->formatStep; + if (card->formatStep < CARD_NUM_SYSTEM_BLOCK) { + result = __CARDEraseSector(chan, (u32)card->sectorSize * card->formatStep, FormatCallback); + if (0 <= result) { + return; + } + } + else if (card->formatStep < 2 * CARD_NUM_SYSTEM_BLOCK) { + int step = card->formatStep - CARD_NUM_SYSTEM_BLOCK; + result = __CARDWrite( + chan, (u32)card->sectorSize * step, CARD_SYSTEM_BLOCK_SIZE, (u8 *)card->workArea + (CARD_SYSTEM_BLOCK_SIZE * step), FormatCallback); + if (result >= 0) { + return; + } + } + else { + card->currentDir = (CARDDir *)((u8 *)card->workArea + (1 + 0) * CARD_SYSTEM_BLOCK_SIZE); + memcpy(card->currentDir, (u8 *)card->workArea + (1 + 1) * CARD_SYSTEM_BLOCK_SIZE, CARD_SYSTEM_BLOCK_SIZE); + card->currentFat = (u16 *)((u8 *)card->workArea + (3 + 0) * CARD_SYSTEM_BLOCK_SIZE); + memcpy(card->currentFat, (u8 *)card->workArea + (3 + 1) * CARD_SYSTEM_BLOCK_SIZE, CARD_SYSTEM_BLOCK_SIZE); + } + +error: + callback = card->apiCallback; + card->apiCallback = 0; + __CARDPutControlBlock(card, result); + callback(chan, result); +} + +s32 __CARDFormatRegionAsync(s32 chan, u16 encode, CARDCallback callback) +{ + CARDControl *card; + CARDID *id; + CARDDir *dir; + u16 *fat; + s16 i; + s32 result; + OSSram *sram; + OSSramEx *sramEx; + u16 viDTVStatus; + OSTime time; + OSTime rand; + + result = __CARDGetControlBlock(chan, &card); + if (result < 0) { + return result; + } + + id = (CARDID *)card->workArea; + memset(id, 0xff, CARD_SYSTEM_BLOCK_SIZE); + viDTVStatus = __VIRegs[55]; + + id->encode = encode; + + sram = __OSLockSram(); + *(u32 *)&id->serial[20] = sram->counterBias; + *(u32 *)&id->serial[24] = sram->language; + __OSUnlockSram(FALSE); + + rand = time = OSGetTime(); + + sramEx = __OSLockSramEx(); + for (i = 0; i < 12; i++) { + rand = (rand * 1103515245 + 12345) >> 16; + id->serial[i] = (u8)(sramEx->flashID[chan][i] + rand); + rand = ((rand * 1103515245 + 12345) >> 16) & 0x7FFF; + } + __OSUnlockSramEx(FALSE); + + *(u32 *)&id->serial[28] = viDTVStatus; + *(OSTime *)&id->serial[12] = time; + + id->deviceID = 0; + id->size = card->size; + __CARDCheckSum(id, sizeof(CARDID) - sizeof(u32), &id->checkSum, &id->checkSumInv); + + for (i = 0; i < 2; i++) { + CARDDirCheck *check; + + dir = (CARDDir *)((u8 *)card->workArea + (1 + i) * CARD_SYSTEM_BLOCK_SIZE); + memset(dir, 0xff, CARD_SYSTEM_BLOCK_SIZE); + check = __CARDGetDirCheck(dir); + check->checkCode = i; + __CARDCheckSum(dir, CARD_SYSTEM_BLOCK_SIZE - sizeof(u32), &check->checkSum, &check->checkSumInv); + } + for (i = 0; i < 2; i++) { + fat = (u16 *)((u8 *)card->workArea + (3 + i) * CARD_SYSTEM_BLOCK_SIZE); + memset(fat, 0x00, CARD_SYSTEM_BLOCK_SIZE); + fat[CARD_FAT_CHECKCODE] = (u16)i; + fat[CARD_FAT_FREEBLOCKS] = (u16)(card->cBlock - CARD_NUM_SYSTEM_BLOCK); + fat[CARD_FAT_LASTSLOT] = CARD_NUM_SYSTEM_BLOCK - 1; + __CARDCheckSum(&fat[CARD_FAT_CHECKCODE], CARD_SYSTEM_BLOCK_SIZE - sizeof(u32), &fat[CARD_FAT_CHECKSUM], &fat[CARD_FAT_CHECKSUMINV]); + } + + card->apiCallback = callback ? callback : __CARDDefaultApiCallback; + DCStoreRange(card->workArea, CARD_WORKAREA_SIZE); + + card->formatStep = 0; + result = __CARDEraseSector(chan, (u32)card->sectorSize * card->formatStep, FormatCallback); + if (result < 0) { + __CARDPutControlBlock(card, result); + } + return result; +} + +s32 CARDFormatAsync(s32 chan, CARDCallback callback) +{ + return __CARDFormatRegionAsync(chan, __CARDGetFontEncode(), callback); +} + +s32 CARDFormat(s32 chan) +{ + s32 result = __CARDFormatRegionAsync(chan, OSGetFontEncode(), __CARDSyncCallback); + if (result < 0) { + return result; + } + + return __CARDSync(chan); +} diff --git a/src/dolphin/card/CARDMount.c b/src/dolphin/card/CARDMount.c new file mode 100644 index 00000000..f8e75c49 --- /dev/null +++ b/src/dolphin/card/CARDMount.c @@ -0,0 +1,396 @@ +#include +#include +#include +#include +#include + +#include +#include + +u8 GameChoice : (OS_BASE_CACHED | 0x000030E3); + +static u32 SectorSizeTable[8] = { + 8 * 1024, + 16 * 1024, + 32 * 1024, + 64 * 1024, + 128 * 1024, + 256 * 1024, + 0, + 0, +}; + +static u32 LatencyTable[8] = { + 4, + 8, + 16, + 32, + 64, + 128, + 256, + 512, +}; + +void __CARDMountCallback(s32 chan, s32 result); +static void DoUnmount(s32 chan, s32 result); + +static BOOL IsCard(u32 id) +{ + u32 size; + s32 sectorSize; + if (id & (0xFFFF0000) && (id != 0x80000004 || __CARDVendorID == 0xFFFF)) { + return FALSE; + } + + if ((id & 3) != 0) { + return FALSE; + } + + size = id & 0xfc; + switch (size) { + case 4: + case 8: + case 16: + case 32: + case 64: + case 128: + break; + default: + return FALSE; + break; + } + + sectorSize = SectorSizeTable[(id & 0x00003800) >> 11]; + if (sectorSize == 0) { + return FALSE; + } + + if ((size * 1024 * 1024 / 8) / sectorSize < 8) { + return FALSE; + } + + return TRUE; +} + +s32 CARDProbeEx(s32 chan, s32 *memSize, s32 *sectorSize) +{ + u32 id; + CARDControl *card; + BOOL enabled; + s32 result; + int probe; + + if (chan < 0 || 2 <= chan) { + return CARD_RESULT_FATAL_ERROR; + } + + if (GameChoice & 0x80) { + return CARD_RESULT_NOCARD; + } + + card = &__CARDBlock[chan]; + enabled = OSDisableInterrupts(); + + probe = EXIProbeEx(chan); + if (probe == -1) { + result = CARD_RESULT_NOCARD; + } + else if (probe == 0) { + result = CARD_RESULT_BUSY; + } + else if (card->attached) { + if (card->mountStep < 1) { + result = CARD_RESULT_BUSY; + } + else { + if (memSize) { + *memSize = card->size; + } + if (sectorSize) { + *sectorSize = card->sectorSize; + } + result = CARD_RESULT_READY; + } + } + else if ((EXIGetState(chan) & 8)) { + result = CARD_RESULT_WRONGDEVICE; + } + else if (!EXIGetID(chan, 0, &id)) { + result = CARD_RESULT_BUSY; + } + else if (IsCard(id)) { + if (memSize) { + *memSize = (s32)(id & 0xfc); + } + if (sectorSize) { + *sectorSize = SectorSizeTable[(id & 0x00003800) >> 11]; + } + result = CARD_RESULT_READY; + } + else { + result = CARD_RESULT_WRONGDEVICE; + } + + OSRestoreInterrupts(enabled); + return result; +} + +static s32 DoMount(s32 chan) +{ + CARDControl *card; + u32 id; + u8 status; + s32 result; + OSSramEx *sram; + int i; + u8 checkSum; + int step; + + card = &__CARDBlock[chan]; + + if (card->mountStep == 0) { + if (EXIGetID(chan, 0, &id) == 0) { + result = CARD_RESULT_NOCARD; + } + else if (IsCard(id)) { + result = CARD_RESULT_READY; + } + else { + result = CARD_RESULT_WRONGDEVICE; + } + if (result < 0) { + goto error; + } + + card->cid = id; + + card->size = (u16)(id & 0xFC); + card->sectorSize = SectorSizeTable[(id & 0x00003800) >> 11]; + card->cBlock = (u16)((card->size * 1024 * 1024 / 8) / card->sectorSize); + card->latency = LatencyTable[(id & 0x00000700) >> 8]; + + result = __CARDClearStatus(chan); + if (result < 0) { + goto error; + } + result = __CARDReadStatus(chan, &status); + if (result < 0) { + goto error; + } + + if (!EXIProbe(chan)) { + result = CARD_RESULT_NOCARD; + goto error; + } + + if (!(status & 0x40)) { + result = __CARDUnlock(chan, card->id); + if (result < 0) { + goto error; + } + + checkSum = 0; + sram = __OSLockSramEx(); + for (i = 0; i < 12; i++) { + sram->flashID[chan][i] = card->id[i]; + checkSum += card->id[i]; + } + sram->flashIDCheckSum[chan] = (u8)~checkSum; + __OSUnlockSramEx(TRUE); + + return result; + } + else { + card->mountStep = 1; + + checkSum = 0; + sram = __OSLockSramEx(); + for (i = 0; i < 12; i++) { + checkSum += sram->flashID[chan][i]; + } + __OSUnlockSramEx(FALSE); + if (sram->flashIDCheckSum[chan] != (u8)~checkSum) { + result = CARD_RESULT_IOERROR; + goto error; + } + } + } + + if (card->mountStep == 1) { + if (card->cid == 0x80000004) { + u16 vendorID; + + sram = __OSLockSramEx(); + vendorID = *(u16 *)sram->flashID[chan]; + __OSUnlockSramEx(FALSE); + + if (__CARDVendorID == 0xffff || vendorID != __CARDVendorID) { + result = CARD_RESULT_WRONGDEVICE; + goto error; + } + } + + card->mountStep = 2; + + result = __CARDEnableInterrupt(chan, TRUE); + if (result < 0) { + goto error; + } + + EXISetExiCallback(chan, __CARDExiHandler); + EXIUnlock(chan); + DCInvalidateRange(card->workArea, CARD_WORKAREA_SIZE); + } + + step = card->mountStep - 2; + result = __CARDRead( + chan, (u32)card->sectorSize * step, CARD_SYSTEM_BLOCK_SIZE, (u8 *)card->workArea + (CARD_SYSTEM_BLOCK_SIZE * step), __CARDMountCallback); + if (result < 0) { + __CARDPutControlBlock(card, result); + } + return result; + +error: + EXIUnlock(chan); + DoUnmount(chan, result); + return result; +} + +void __CARDMountCallback(s32 chan, s32 result) +{ + CARDControl *card; + CARDCallback callback; + + card = &__CARDBlock[chan]; + + switch (result) { + case CARD_RESULT_READY: + if (++card->mountStep < CARD_MAX_MOUNT_STEP) { + result = DoMount(chan); + if (0 <= result) { + return; + } + } + else { + result = __CARDVerify(card); + } + break; + case CARD_RESULT_UNLOCKED: + card->unlockCallback = __CARDMountCallback; + if (!EXILock(chan, 0, __CARDUnlockedHandler)) { + return; + } + card->unlockCallback = 0; + + result = DoMount(chan); + if (0 <= result) { + return; + } + break; + case CARD_RESULT_IOERROR: + case CARD_RESULT_NOCARD: + DoUnmount(chan, result); + break; + } + + callback = card->apiCallback; + card->apiCallback = 0; + __CARDPutControlBlock(card, result); + callback(chan, result); +} + +s32 CARDMountAsync(s32 chan, void *workArea, CARDCallback detachCallback, CARDCallback attachCallback) +{ + CARDControl *card; + BOOL enabled; + + if (chan < 0 || 2 <= chan) { + return CARD_RESULT_FATAL_ERROR; + } + if (GameChoice & 0x80) { + return CARD_RESULT_NOCARD; + } + card = &__CARDBlock[chan]; + + enabled = OSDisableInterrupts(); + if (card->result == CARD_RESULT_BUSY) { + OSRestoreInterrupts(enabled); + return CARD_RESULT_BUSY; + } + + if (!card->attached && (EXIGetState(chan) & 0x08)) { + OSRestoreInterrupts(enabled); + return CARD_RESULT_WRONGDEVICE; + } + + card->result = CARD_RESULT_BUSY; + card->workArea = workArea; + card->extCallback = detachCallback; + card->apiCallback = attachCallback ? attachCallback : __CARDDefaultApiCallback; + card->exiCallback = 0; + + if (!card->attached && !EXIAttach(chan, __CARDExtHandler)) { + card->result = CARD_RESULT_NOCARD; + OSRestoreInterrupts(enabled); + return CARD_RESULT_NOCARD; + } + + card->mountStep = 0; + card->attached = TRUE; + EXISetExiCallback(chan, 0); + OSCancelAlarm(&card->alarm); + + card->currentDir = 0; + card->currentFat = 0; + + OSRestoreInterrupts(enabled); + + card->unlockCallback = __CARDMountCallback; + if (!EXILock(chan, 0, __CARDUnlockedHandler)) { + return CARD_RESULT_READY; + } + card->unlockCallback = 0; + + return DoMount(chan); +} + +s32 CARDMount(s32 chan, void *workArea, CARDCallback attachCb) +{ + s32 result = CARDMountAsync(chan, workArea, attachCb, __CARDSyncCallback); + if (result < 0) { + return result; + } + + return __CARDSync(chan); +} + +static void DoUnmount(s32 chan, s32 result) +{ + CARDControl *card; + BOOL enabled; + + card = &__CARDBlock[chan]; + enabled = OSDisableInterrupts(); + if (card->attached) { + EXISetExiCallback(chan, 0); + EXIDetach(chan); + OSCancelAlarm(&card->alarm); + card->attached = FALSE; + card->result = result; + card->mountStep = 0; + } + OSRestoreInterrupts(enabled); +} + +s32 CARDUnmount(s32 chan) +{ + CARDControl *card; + s32 result; + + result = __CARDGetControlBlock(chan, &card); + if (result < 0) { + return result; + } + DoUnmount(chan, CARD_RESULT_NOCARD); + return CARD_RESULT_READY; +} diff --git a/src/dolphin/card/CARDNet.c b/src/dolphin/card/CARDNet.c new file mode 100644 index 00000000..24ab484f --- /dev/null +++ b/src/dolphin/card/CARDNet.c @@ -0,0 +1,34 @@ +#include +#include +#include +#include + +#include + +u16 __CARDVendorID = 0xffff; + +s32 CARDGetSerialNo(s32 chan, u64 *serialNo) +{ + CARDControl *card; + CARDID *id; + int i; + u64 code; + s32 result; + + if (!(0 <= chan && chan < 2)) { + return CARD_RESULT_FATAL_ERROR; + } + + result = __CARDGetControlBlock(chan, &card); + if (result < 0) { + return result; + } + + id = (CARDID *)card->workArea; + for (code = 0, i = 0; i < sizeof(id->serial) / sizeof(u64); ++i) { + code ^= *(u64 *)&id->serial[sizeof(u64) * i]; + } + *serialNo = code; + + return __CARDPutControlBlock(card, CARD_RESULT_READY); +} diff --git a/src/dolphin/card/CARDOpen.c b/src/dolphin/card/CARDOpen.c new file mode 100644 index 00000000..929982a0 --- /dev/null +++ b/src/dolphin/card/CARDOpen.c @@ -0,0 +1,134 @@ +#include +#include +#include +#include + +#include + +BOOL __CARDCompareFileName(CARDDir *ent, const char *fileName) +{ + char *entName; + char c1; + char c2; + int n; + + entName = (char *)ent->fileName; + n = CARD_FILENAME_MAX; + while (0 <= --n) { + if ((c1 = *entName++) != (c2 = *fileName++)) { + return FALSE; + } + else if (c2 == '\0') { + return TRUE; + } + } + + if (*fileName == '\0') { + return TRUE; + } + + return FALSE; +} + +s32 __CARDAccess(CARDControl *card, CARDDir *ent) +{ + if (ent->gameName[0] == 0xFF) { + return CARD_RESULT_NOFILE; + } + + if (card->diskID == &__CARDDiskNone + || (memcmp(ent->gameName, card->diskID->gameName, 4) == 0 && memcmp(ent->company, card->diskID->company, 2) == 0)) { + return CARD_RESULT_READY; + } + + return CARD_RESULT_NOPERM; +} + +BOOL __CARDIsPublic(CARDDir *ent) +{ + if (ent->gameName[0] == 0xFF) { + return CARD_RESULT_NOFILE; + } + + if ((ent->permission & CARD_ATTR_PUBLIC) != 0) { + return CARD_RESULT_READY; + } + + return CARD_RESULT_NOPERM; +} + +s32 __CARDGetFileNo(CARDControl *card, const char *fileName, s32 *pfileNo) +{ + CARDDir *dir; + CARDDir *ent; + s32 fileNo; + s32 result; + + if (!card->attached) { + return CARD_RESULT_NOCARD; + } + + dir = __CARDGetDirBlock(card); + for (fileNo = 0; fileNo < CARD_MAX_FILE; fileNo++) { + ent = &dir[fileNo]; + result = __CARDAccess(card, ent); + if (result < 0) { + continue; + } + if (__CARDCompareFileName(ent, fileName)) { + *pfileNo = fileNo; + return CARD_RESULT_READY; + } + } + + return CARD_RESULT_NOFILE; +} + +s32 CARDOpen(s32 chan, const char *fileName, CARDFileInfo *fileInfo) +{ + CARDControl *card; + CARDDir *dir; + CARDDir *ent; + s32 result; + s32 fileNo; + + fileInfo->chan = -1; + result = __CARDGetControlBlock(chan, &card); + if (result < 0) { + return result; + } + result = __CARDGetFileNo(card, fileName, &fileNo); + if (0 <= result) { + dir = __CARDGetDirBlock(card); + ent = &dir[fileNo]; + if (!CARDIsValidBlockNo(card, ent->startBlock)) { + result = CARD_RESULT_BROKEN; + } + else { + fileInfo->chan = chan; + fileInfo->fileNo = fileNo; + fileInfo->offset = 0; + fileInfo->iBlock = ent->startBlock; + } + } + return __CARDPutControlBlock(card, result); +} + +s32 CARDClose(CARDFileInfo *fileInfo) +{ + CARDControl *card; + s32 result; + + result = __CARDGetControlBlock(fileInfo->chan, &card); + if (result < 0) { + return result; + } + + fileInfo->chan = -1; + return __CARDPutControlBlock(card, CARD_RESULT_READY); +} + +BOOL __CARDIsOpened(CARDControl *card, s32 fileNo) +{ + return FALSE; +} diff --git a/src/dolphin/card/CARDRdwr.c b/src/dolphin/card/CARDRdwr.c new file mode 100644 index 00000000..3a235891 --- /dev/null +++ b/src/dolphin/card/CARDRdwr.c @@ -0,0 +1,108 @@ +#include +#include +#include +#include + +#include + +static void BlockReadCallback(s32 chan, s32 result) +{ + CARDControl *card; + CARDCallback callback; + + card = &__CARDBlock[chan]; + if (result < 0) { + goto error; + } + + card->xferred += CARD_SEG_SIZE; + + card->addr += CARD_SEG_SIZE; + (u8 *)card->buffer += CARD_SEG_SIZE; + if (--card->repeat <= 0) { + goto error; + } + + result = __CARDReadSegment(chan, BlockReadCallback); + if (result < 0) { + goto error; + } + return; + +error: + if (card->apiCallback == 0) { + __CARDPutControlBlock(card, result); + } + callback = card->xferCallback; + if (callback) { + card->xferCallback = 0; + callback(chan, result); + } +} + +s32 __CARDRead(s32 chan, u32 addr, s32 length, void *dst, CARDCallback callback) +{ + CARDControl *card; + card = &__CARDBlock[chan]; + if (!card->attached) { + return CARD_RESULT_NOCARD; + } + + card->xferCallback = callback; + card->repeat = (int)(length / CARD_SEG_SIZE); + card->addr = addr; + card->buffer = dst; + + return __CARDReadSegment(chan, BlockReadCallback); +} + +static void BlockWriteCallback(s32 chan, s32 result) +{ + CARDControl *card; + CARDCallback callback; + + card = &__CARDBlock[chan]; + if (result < 0) { + goto error; + } + + card->xferred += CARD_PAGE_SIZE; + + card->addr += CARD_PAGE_SIZE; + (u8 *)card->buffer += CARD_PAGE_SIZE; + if (--card->repeat <= 0) { + goto error; + } + + result = __CARDWritePage(chan, BlockWriteCallback); + if (result < 0) { + goto error; + } + return; + +error: + if (card->apiCallback == 0) { + __CARDPutControlBlock(card, result); + } + callback = card->xferCallback; + if (callback) { + card->xferCallback = 0; + callback(chan, result); + } +} + +s32 __CARDWrite(s32 chan, u32 addr, s32 length, void *dst, CARDCallback callback) +{ + CARDControl *card; + card = &__CARDBlock[chan]; + if (!card->attached) { + return CARD_RESULT_NOCARD; + } + + card->xferCallback = callback; + card->repeat = (int)(length / CARD_PAGE_SIZE); + card->addr = addr; + card->buffer = dst; + + return __CARDWritePage(chan, BlockWriteCallback); +} diff --git a/src/dolphin/card/CARDRead.c b/src/dolphin/card/CARDRead.c new file mode 100644 index 00000000..4de1d769 --- /dev/null +++ b/src/dolphin/card/CARDRead.c @@ -0,0 +1,149 @@ +#include +#include +#include +#include + +#include + +s32 __CARDSeek(CARDFileInfo *fileInfo, s32 length, s32 offset, CARDControl **pcard) +{ + CARDControl *card; + CARDDir *dir; + CARDDir *ent; + s32 result; + u16 *fat; + + result = __CARDGetControlBlock(fileInfo->chan, &card); + if (result < 0) { + return result; + } + + if (!CARDIsValidBlockNo(card, fileInfo->iBlock) || card->cBlock * card->sectorSize <= fileInfo->offset) { + return __CARDPutControlBlock(card, CARD_RESULT_FATAL_ERROR); + } + + dir = __CARDGetDirBlock(card); + ent = &dir[fileInfo->fileNo]; + if (ent->length * card->sectorSize <= offset || ent->length * card->sectorSize < offset + length) { + return __CARDPutControlBlock(card, CARD_RESULT_LIMIT); + } + + card->fileInfo = fileInfo; + fileInfo->length = length; + if (offset < fileInfo->offset) { + fileInfo->offset = 0; + fileInfo->iBlock = ent->startBlock; + if (!CARDIsValidBlockNo(card, fileInfo->iBlock)) { + return __CARDPutControlBlock(card, CARD_RESULT_BROKEN); + } + } + fat = __CARDGetFatBlock(card); + while (fileInfo->offset < TRUNC(offset, card->sectorSize)) { + fileInfo->offset += card->sectorSize; + fileInfo->iBlock = fat[fileInfo->iBlock]; + if (!CARDIsValidBlockNo(card, fileInfo->iBlock)) { + return __CARDPutControlBlock(card, CARD_RESULT_BROKEN); + } + } + + fileInfo->offset = offset; + + *pcard = card; + return CARD_RESULT_READY; +} + +static void ReadCallback(s32 chan, s32 result) +{ + CARDControl *card; + CARDCallback callback; + u16 *fat; + CARDFileInfo *fileInfo; + s32 length; + + card = &__CARDBlock[chan]; + if (result < 0) { + goto error; + } + + fileInfo = card->fileInfo; + if (fileInfo->length < 0) { + result = CARD_RESULT_CANCELED; + goto error; + } + + length = (s32)TRUNC(fileInfo->offset + card->sectorSize, card->sectorSize) - fileInfo->offset; + fileInfo->length -= length; + if (fileInfo->length <= 0) { + goto error; + } + + fat = __CARDGetFatBlock(card); + fileInfo->offset += length; + fileInfo->iBlock = fat[fileInfo->iBlock]; + if (!CARDIsValidBlockNo(card, fileInfo->iBlock)) { + result = CARD_RESULT_BROKEN; + goto error; + } + + result = __CARDRead(chan, card->sectorSize * (u32)fileInfo->iBlock, (fileInfo->length < card->sectorSize) ? fileInfo->length : card->sectorSize, + card->buffer, ReadCallback); + if (result < 0) { + goto error; + } + + return; + +error: + callback = card->apiCallback; + card->apiCallback = 0; + __CARDPutControlBlock(card, result); + callback(chan, result); +} + +s32 CARDReadAsync(CARDFileInfo *fileInfo, void *buf, s32 length, s32 offset, CARDCallback callback) +{ + CARDControl *card; + s32 result; + CARDDir *dir; + CARDDir *ent; + + if (OFFSET(offset, CARD_SEG_SIZE) != 0 || OFFSET(length, CARD_SEG_SIZE) != 0) { + return CARD_RESULT_FATAL_ERROR; + } + result = __CARDSeek(fileInfo, length, offset, &card); + if (result < 0) { + return result; + } + + dir = __CARDGetDirBlock(card); + ent = &dir[fileInfo->fileNo]; + result = __CARDAccess(card, ent); + if (result == CARD_RESULT_NOPERM) { + result = __CARDIsPublic(ent); + } + + if (result < 0) { + return __CARDPutControlBlock(card, result); + } + + DCInvalidateRange(buf, (u32)length); + card->apiCallback = callback ? callback : __CARDDefaultApiCallback; + + offset = (s32)OFFSET(fileInfo->offset, card->sectorSize); + length = (length < card->sectorSize - offset) ? length : card->sectorSize - offset; + result = __CARDRead(fileInfo->chan, card->sectorSize * (u32)fileInfo->iBlock + offset, length, buf, ReadCallback); + if (result < 0) { + __CARDPutControlBlock(card, result); + } + return result; +} + +s32 CARDRead(CARDFileInfo *fileInfo, void *buf, s32 length, s32 offset) +{ + s32 result = CARDReadAsync(fileInfo, buf, length, offset, __CARDSyncCallback); + if (result < 0) { + return result; + } + + return __CARDSync(fileInfo->chan); +} diff --git a/src/dolphin/card/CARDRename.c b/src/dolphin/card/CARDRename.c new file mode 100644 index 00000000..83d1c8a5 --- /dev/null +++ b/src/dolphin/card/CARDRename.c @@ -0,0 +1,70 @@ +#include +#include +#include +#include + +#include + +s32 CARDRenameAsync(s32 chan, const char* old, const char* new, CARDCallback callback) { + CARDControl* card; + CARDDir* dir; + CARDDir* ent; + s32 result; + int fileNo; + int newNo; + int oldNo; + + if (*old == 0xff || *new == 0xff || *old == 0x00 || *new == 0x00) { + return CARD_RESULT_FATAL_ERROR; + } + if (CARD_FILENAME_MAX < (u32)strlen(old) || CARD_FILENAME_MAX < (u32)strlen(new)) { + return CARD_RESULT_NAMETOOLONG; + } + result = __CARDGetControlBlock(chan, &card); + if (result < 0) { + return result; + } + + newNo = oldNo = -1; + dir = __CARDGetDirBlock(card); + for (fileNo = 0; fileNo < CARD_MAX_FILE; fileNo++) { + ent = &dir[fileNo]; + if (ent->gameName[0] == 0xff) { + continue; + } + + if (memcmp(ent->gameName, card->diskID->gameName, sizeof(ent->gameName)) != 0 || + memcmp(ent->company, card->diskID->company, sizeof(ent->company)) != 0) { + continue; + } + + if (__CARDCompareFileName(ent, old)) { + oldNo = fileNo; + } + if (__CARDCompareFileName(ent, new)) { + newNo = fileNo; + } + } + + if (oldNo == -1) { + return __CARDPutControlBlock(card, CARD_RESULT_NOFILE); + } + if (newNo != -1) { + return __CARDPutControlBlock(card, CARD_RESULT_EXIST); + } + + ent = &dir[oldNo]; + result = __CARDAccess(card, ent); + if (result < 0) { + return __CARDPutControlBlock(card, result); + } + + strncpy((char*)ent->fileName, new, CARD_FILENAME_MAX); + + ent->time = (u32)OSTicksToSeconds(OSGetTime()); + result = __CARDUpdateDir(chan, callback); + if (result < 0) { + __CARDPutControlBlock(card, result); + } + return result; +} diff --git a/src/dolphin/card/CARDStat.c b/src/dolphin/card/CARDStat.c new file mode 100644 index 00000000..e4fbc265 --- /dev/null +++ b/src/dolphin/card/CARDStat.c @@ -0,0 +1,158 @@ +#include +#include +#include +#include + +#include "string.h" + +#include + +static void UpdateIconOffsets(CARDDir *ent, CARDStat *stat) +{ + u32 offset; + BOOL iconTlut; + int i; + + offset = ent->iconAddr; + if (offset == 0xffffffff) { + stat->bannerFormat = 0; + stat->iconFormat = 0; + stat->iconSpeed = 0; + offset = 0; + } + + iconTlut = FALSE; + switch (CARDGetBannerFormat(ent)) { + case CARD_STAT_BANNER_C8: + stat->offsetBanner = offset; + offset += CARD_BANNER_WIDTH * CARD_BANNER_HEIGHT; + stat->offsetBannerTlut = offset; + offset += 2 * 256; + break; + case CARD_STAT_BANNER_RGB5A3: + stat->offsetBanner = offset; + offset += 2 * CARD_BANNER_WIDTH * CARD_BANNER_HEIGHT; + stat->offsetBannerTlut = 0xffffffff; + break; + default: + stat->offsetBanner = 0xffffffff; + stat->offsetBannerTlut = 0xffffffff; + break; + } + for (i = 0; i < CARD_ICON_MAX; ++i) { + switch (CARDGetIconFormat(ent, i)) { + case CARD_STAT_ICON_C8: + stat->offsetIcon[i] = offset; + offset += CARD_ICON_WIDTH * CARD_ICON_HEIGHT; + iconTlut = TRUE; + break; + case CARD_STAT_ICON_RGB5A3: + stat->offsetIcon[i] = offset; + offset += 2 * CARD_ICON_WIDTH * CARD_ICON_HEIGHT; + break; + default: + stat->offsetIcon[i] = 0xffffffff; + break; + } + } + if (iconTlut) { + stat->offsetIconTlut = offset; + offset += 2 * 256; + } + else { + stat->offsetIconTlut = 0xffffffff; + } + stat->offsetData = offset; +} + +s32 CARDGetStatus(s32 chan, s32 fileNo, CARDStat *stat) +{ + CARDControl *card; + CARDDir *dir; + CARDDir *ent; + s32 result; + + if (fileNo < 0 || CARD_MAX_FILE <= fileNo) { + return CARD_RESULT_FATAL_ERROR; + } + result = __CARDGetControlBlock(chan, &card); + if (result < 0) { + return result; + } + + dir = __CARDGetDirBlock(card); + ent = &dir[fileNo]; + result = __CARDAccess(card, ent); + if (result == CARD_RESULT_NOPERM) { + result = __CARDIsPublic(ent); + } + + if (result >= 0) { + memcpy(stat->gameName, ent->gameName, sizeof(stat->gameName)); + memcpy(stat->company, ent->company, sizeof(stat->company)); + stat->length = (u32)ent->length * card->sectorSize; + memcpy(stat->fileName, ent->fileName, CARD_FILENAME_MAX); + stat->time = ent->time; + + stat->bannerFormat = ent->bannerFormat; + stat->iconAddr = ent->iconAddr; + stat->iconFormat = ent->iconFormat; + stat->iconSpeed = ent->iconSpeed; + stat->commentAddr = ent->commentAddr; + + UpdateIconOffsets(ent, stat); + } + return __CARDPutControlBlock(card, result); +} + +s32 CARDSetStatusAsync(s32 chan, s32 fileNo, CARDStat *stat, CARDCallback callback) +{ + CARDControl *card; + CARDDir *dir; + CARDDir *ent; + s32 result; + + if (fileNo < 0 || CARD_MAX_FILE <= fileNo || (stat->iconAddr != 0xffffffff && CARD_READ_SIZE <= stat->iconAddr) + || (stat->commentAddr != 0xffffffff && CARD_SYSTEM_BLOCK_SIZE - CARD_COMMENT_SIZE < stat->commentAddr % CARD_SYSTEM_BLOCK_SIZE)) { + return CARD_RESULT_FATAL_ERROR; + } + result = __CARDGetControlBlock(chan, &card); + if (result < 0) { + return result; + } + + dir = __CARDGetDirBlock(card); + ent = &dir[fileNo]; + result = __CARDAccess(card, ent); + if (result < 0) { + return __CARDPutControlBlock(card, result); + } + + ent->bannerFormat = stat->bannerFormat; + ent->iconAddr = stat->iconAddr; + ent->iconFormat = stat->iconFormat; + ent->iconSpeed = stat->iconSpeed; + ent->commentAddr = stat->commentAddr; + UpdateIconOffsets(ent, stat); + + if (ent->iconAddr == 0xffffffff) { + CARDSetIconSpeed(ent, 0, CARD_STAT_SPEED_FAST); + } + + ent->time = (u32)OSTicksToSeconds(OSGetTime()); + result = __CARDUpdateDir(chan, callback); + if (result < 0) { + __CARDPutControlBlock(card, result); + } + return result; +} + +s32 CARDSetStatus(s32 chan, s32 fileNo, CARDStat *stat) +{ + s32 result = CARDSetStatusAsync(chan, fileNo, stat, __CARDSyncCallback); + if (result < 0) { + return result; + } + + return __CARDSync(chan); +} diff --git a/src/dolphin/card/CARDUnlock.c b/src/dolphin/card/CARDUnlock.c new file mode 100644 index 00000000..55989b97 --- /dev/null +++ b/src/dolphin/card/CARDUnlock.c @@ -0,0 +1,406 @@ +#include +#include +#include +#include +#include + +#include "string.h" + +#include + +static void InitCallback(void *task); +static void DoneCallback(void *task); + +static u8 CardData[] ATTRIBUTE_ALIGN(32) = { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x21, 0x02, 0xFF, 0x00, 0x21, 0x13, 0x06, 0x12, 0x03, 0x12, 0x04, 0x13, 0x05, 0x00, + 0x92, 0x00, 0xFF, 0x00, 0x88, 0xFF, 0xFF, 0x00, 0x89, 0xFF, 0xFF, 0x00, 0x8A, 0xFF, 0xFF, 0x00, 0x8B, 0xFF, 0xFF, 0x8F, 0x00, 0x02, 0xBF, 0x00, + 0x88, 0x16, 0xFC, 0xDC, 0xD1, 0x16, 0xFD, 0x00, 0x00, 0x16, 0xFB, 0x00, 0x01, 0x02, 0xBF, 0x00, 0x8E, 0x25, 0xFF, 0x03, 0x80, 0xFF, 0x00, 0x02, + 0x94, 0x00, 0x27, 0x02, 0xBF, 0x00, 0x8E, 0x1F, 0xDF, 0x24, 0xFF, 0x02, 0x40, 0x0F, 0xFF, 0x00, 0x98, 0x04, 0x00, 0x00, 0x9A, 0x00, 0x10, 0x00, + 0x99, 0x00, 0x00, 0x8E, 0x00, 0x02, 0xBF, 0x00, 0x94, 0x02, 0xBF, 0x86, 0x44, 0x02, 0xBF, 0x00, 0x88, 0x16, 0xFC, 0xDC, 0xD1, 0x16, 0xFD, 0x00, + 0x03, 0x16, 0xFB, 0x00, 0x01, 0x8F, 0x00, 0x02, 0xBF, 0x00, 0x8E, 0x03, 0x80, 0xCD, 0xD1, 0x02, 0x94, 0x00, 0x48, 0x27, 0xFF, 0x03, 0x80, 0x00, + 0x01, 0x02, 0x95, 0x00, 0x5A, 0x03, 0x80, 0x00, 0x02, 0x02, 0x95, 0x80, 0x00, 0x02, 0x9F, 0x00, 0x48, 0x00, 0x21, 0x8E, 0x00, 0x02, 0xBF, 0x00, + 0x8E, 0x25, 0xFF, 0x02, 0xBF, 0x00, 0x8E, 0x25, 0xFF, 0x02, 0xBF, 0x00, 0x8E, 0x25, 0xFF, 0x02, 0xBF, 0x00, 0x8E, 0x00, 0xC5, 0xFF, 0xFF, 0x03, + 0x40, 0x0F, 0xFF, 0x1C, 0x9F, 0x02, 0xBF, 0x00, 0x8E, 0x00, 0xC7, 0xFF, 0xFF, 0x02, 0xBF, 0x00, 0x8E, 0x00, 0xC6, 0xFF, 0xFF, 0x02, 0xBF, 0x00, + 0x8E, 0x00, 0xC0, 0xFF, 0xFF, 0x02, 0xBF, 0x00, 0x8E, 0x20, 0xFF, 0x03, 0x40, 0x0F, 0xFF, 0x1F, 0x5F, 0x02, 0xBF, 0x00, 0x8E, 0x21, 0xFF, 0x02, + 0xBF, 0x00, 0x8E, 0x23, 0xFF, 0x12, 0x05, 0x12, 0x06, 0x02, 0x9F, 0x80, 0xB5, 0x00, 0x21, 0x27, 0xFC, 0x03, 0xC0, 0x80, 0x00, 0x02, 0x9D, 0x00, + 0x88, 0x02, 0xDF, 0x27, 0xFE, 0x03, 0xC0, 0x80, 0x00, 0x02, 0x9C, 0x00, 0x8E, 0x02, 0xDF, 0x2E, 0xCE, 0x2C, 0xCF, 0x00, 0xF8, 0xFF, 0xCD, 0x00, + 0xF9, 0xFF, 0xC9, 0x00, 0xFA, 0xFF, 0xCB, 0x26, 0xC9, 0x02, 0xC0, 0x00, 0x04, 0x02, 0x9D, 0x00, 0x9C, 0x02, 0xDF, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 }; + +typedef struct DecodeParameters { + u8 *inputAddr; + u32 inputLength; + u32 aramAddr; + u8 *outputAddr; +} DecodeParameters; + +static unsigned long int next = 1; + +static int CARDRand(void) +{ + next = next * 1103515245 + 12345; + return (int)((unsigned int)(next / 65536) % 32768); +} + +static void CARDSrand(unsigned int seed) +{ + next = seed; +} + +static u32 GetInitVal(void) +{ + u32 tmp; + u32 tick; + + tick = OSGetTick(); + CARDSrand(tick); + tmp = 0x7fec8000; + tmp |= CARDRand(); + tmp &= 0xfffff000; + return tmp; +} + +static u32 exnor_1st(u32 data, u32 rshift) +{ + u32 wk; + u32 w; + u32 i; + + w = data; + for (i = 0; i < rshift; i++) { + wk = ~(w ^ (w >> 7) ^ (w >> 15) ^ (w >> 23)); + w = (w >> 1) | ((wk << 30) & 0x40000000); + } + return w; +} + +static u32 exnor(u32 data, u32 lshift) +{ + u32 wk; + u32 w; + u32 i; + + w = data; + for (i = 0; i < lshift; i++) { + // 1bit Left Shift + wk = ~(w ^ (w << 7) ^ (w << 15) ^ (w << 23)); + w = (w << 1) | ((wk >> 30) & 0x00000002); + // printf("i=%d, w=%8x\n", i, w); + } + return w; +} + +static u32 bitrev(u32 data) +{ + u32 wk; + u32 i; + u32 k = 0; + u32 j = 1; + + wk = 0; + for (i = 0; i < 32; i++) { + if (i > 15) { + if (i == 31) { + wk |= (((data & (0x01 << 31)) >> 31) & 0x01); + } + else { + wk |= ((data & (0x01 << i)) >> j); + j += 2; + } + } + else { + wk |= ((data & (0x01 << i)) << (31 - i - k)); + k++; + } + } + return wk; +} + +#define SEC_AD1(x) ((u8)(((x) >> 29) & 0x03)) +#define SEC_AD2(x) ((u8)(((x) >> 21) & 0xff)) +#define SEC_AD3(x) ((u8)(((x) >> 19) & 0x03)) +#define SEC_BA(x) ((u8)(((x) >> 12) & 0x7f)) + +static s32 ReadArrayUnlock(s32 chan, u32 data, void *rbuf, s32 rlen, s32 mode) +{ + CARDControl *card; + BOOL err; + u8 cmd[5]; + + card = &__CARDBlock[chan]; + if (!EXISelect(chan, 0, 4)) { + return CARD_RESULT_NOCARD; + } + + data &= 0xfffff000; + memset(cmd, 0, 5); + cmd[0] = 0x52; + if (mode == 0) { + cmd[1] = SEC_AD1(data); + cmd[2] = SEC_AD2(data); + cmd[3] = SEC_AD3(data); + cmd[4] = SEC_BA(data); + } + else { + cmd[1] = (u8)((data & 0xff000000) >> 24); + cmd[2] = (u8)((data & 0x00ff0000) >> 16); + } + + err = FALSE; + err |= !EXIImmEx(chan, cmd, 5, 1); + err |= !EXIImmEx(chan, (u8 *)card->workArea + (u32)sizeof(CARDID), card->latency, 1); + err |= !EXIImmEx(chan, rbuf, rlen, 0); + err |= !EXIDeselect(chan); + + return err ? CARD_RESULT_NOCARD : CARD_RESULT_READY; +} + +// Calculate Dummy Read Length, 4-32Bytes +static s32 DummyLen(void) +{ + u32 tick; + u32 wk; + s32 tmp; + u32 max; + + wk = 1; + max = 0; + tick = OSGetTick(); + CARDSrand(tick); + + tmp = CARDRand(); + tmp &= 0x0000001f; + tmp += 1; + while ((tmp < 4) && (max < 10)) { + tick = OSGetTick(); + tmp = (s32)(tick << wk); + wk++; + if (wk > 16) { + wk = 1; + } + CARDSrand((u32)tmp); + tmp = CARDRand(); + tmp &= 0x0000001f; + tmp += 1; + max++; + } + if (tmp < 4) { + tmp = 4; + } + + return tmp; +} + +s32 __CARDUnlock(s32 chan, u8 flashID[12]) +{ + u32 init_val; + u32 data; + + s32 dummy; + s32 rlen; + u32 rshift; + + u8 fsts; + u32 wk, wk1; + u32 Ans1 = 0; + u32 Ans2 = 0; + u32 *dp; + u8 rbuf[64]; + u32 para1A = 0; + u32 para1B = 0; + u32 para2A = 0; + u32 para2B = 0; + + CARDControl *card; + DSPTaskInfo *task; + DecodeParameters *param; + u8 *input; + u8 *output; + + card = &__CARDBlock[chan]; + task = &card->task; + param = (DecodeParameters *)card->workArea; + input = (u8 *)((u8 *)param + sizeof(DecodeParameters)); + input = (u8 *)OSRoundUp32B(input); + output = input + 32; + + fsts = 0; + init_val = GetInitVal(); + + dummy = DummyLen(); + rlen = dummy; + if (ReadArrayUnlock(chan, init_val, rbuf, rlen, 0) < 0) { + return CARD_RESULT_NOCARD; + } + + rshift = (u32)(dummy * 8 + 1); + wk = exnor_1st(init_val, rshift); + wk1 = ~(wk ^ (wk >> 7) ^ (wk >> 15) ^ (wk >> 23)); + card->scramble = (wk | ((wk1 << 31) & 0x80000000)); + card->scramble = bitrev(card->scramble); + dummy = DummyLen(); + rlen = 20 + dummy; + data = 0; + if (ReadArrayUnlock(chan, data, rbuf, rlen, 1) < 0) { + return CARD_RESULT_NOCARD; + } + dp = (u32 *)rbuf; + para1A = *dp++; + para1B = *dp++; + Ans1 = *dp++; + para2A = *dp++; + para2B = *dp++; + para1A = (para1A ^ card->scramble); + rshift = 32; + wk = exnor(card->scramble, rshift); + wk1 = ~(wk ^ (wk << 7) ^ (wk << 15) ^ (wk << 23)); + card->scramble = (wk | ((wk1 >> 31) & 0x00000001)); + para1B = (para1B ^ card->scramble); + rshift = 32; + wk = exnor(card->scramble, rshift); + wk1 = ~(wk ^ (wk << 7) ^ (wk << 15) ^ (wk << 23)); + card->scramble = (wk | ((wk1 >> 31) & 0x00000001)); + Ans1 ^= card->scramble; + rshift = 32; + wk = exnor(card->scramble, rshift); + wk1 = ~(wk ^ (wk << 7) ^ (wk << 15) ^ (wk << 23)); + card->scramble = (wk | ((wk1 >> 31) & 0x00000001)); + para2A = (para2A ^ card->scramble); + rshift = 32; + wk = exnor(card->scramble, rshift); + wk1 = ~(wk ^ (wk << 7) ^ (wk << 15) ^ (wk << 23)); + card->scramble = (wk | ((wk1 >> 31) & 0x00000001)); + para2B = (para2B ^ card->scramble); + rshift = (u32)(dummy * 8); + wk = exnor(card->scramble, rshift); + wk1 = ~(wk ^ (wk << 7) ^ (wk << 15) ^ (wk << 23)); + card->scramble = (wk | ((wk1 >> 31) & 0x00000001)); + rshift = 32 + 1; + wk = exnor(card->scramble, rshift); + wk1 = ~(wk ^ (wk << 7) ^ (wk << 15) ^ (wk << 23)); + card->scramble = (wk | ((wk1 >> 31) & 0x00000001)); + + *(u32 *)&input[0] = para2A; + *(u32 *)&input[4] = para2B; + + param->inputAddr = input; + param->inputLength = 8; + param->outputAddr = output; + param->aramAddr = 0; + + DCFlushRange(input, 8); + DCInvalidateRange(output, 4); + DCFlushRange(param, sizeof(DecodeParameters)); + + task->priority = 255; + task->iram_mmem_addr = (u16 *)OSPhysicalToCached(CardData); + task->iram_length = 0x160; + task->iram_addr = 0; + task->dsp_init_vector = 0x10; + task->init_cb = InitCallback; + task->res_cb = NULL; + task->done_cb = DoneCallback; + task->req_cb = NULL; + DSPAddTask(task); + + dp = (u32 *)flashID; + *dp++ = para1A; + *dp++ = para1B; + *dp = Ans1; + + return CARD_RESULT_READY; +} + +static void InitCallback(void *_task) +{ + s32 chan; + CARDControl *card; + DSPTaskInfo *task; + DecodeParameters *param; + + task = _task; + for (chan = 0; chan < 2; ++chan) { + card = &__CARDBlock[chan]; + if ((DSPTaskInfo *)&card->task == task) { + break; + } + } + param = (DecodeParameters *)card->workArea; + + DSPSendMailToDSP(0xff000000); + while (DSPCheckMailToDSP()) + ; + + DSPSendMailToDSP((u32)param); + while (DSPCheckMailToDSP()) + ; +} + +static void DoneCallback(void *_task) +{ + u8 rbuf[64]; + u32 data; + s32 dummy; + s32 rlen; + u32 rshift; + + u8 unk; + u32 wk, wk1; + u32 Ans2; + + s32 chan; + CARDControl *card; + s32 result; + DSPTaskInfo *task; + DecodeParameters *param; + + u8 *input; + u8 *output; + task = _task; + for (chan = 0; chan < 2; ++chan) { + card = &__CARDBlock[chan]; + if ((DSPTaskInfo *)&card->task == task) { + break; + } + } + + param = (DecodeParameters *)card->workArea; + input = (u8 *)((u8 *)param + sizeof(DecodeParameters)); + input = (u8 *)OSRoundUp32B(input); + output = input + 32; + + Ans2 = *(u32 *)output; + dummy = DummyLen(); + rlen = dummy; + data = ((Ans2 ^ card->scramble) & 0xffff0000); + if (ReadArrayUnlock(chan, data, rbuf, rlen, 1) < 0) { + EXIUnlock(chan); + __CARDMountCallback(chan, CARD_RESULT_NOCARD); + return; + } + + rshift = (u32)((dummy + 4 + card->latency) * 8 + 1); + wk = exnor(card->scramble, rshift); + wk1 = ~(wk ^ (wk << 7) ^ (wk << 15) ^ (wk << 23)); + card->scramble = (wk | ((wk1 >> 31) & 0x00000001)); + + dummy = DummyLen(); + rlen = dummy; + data = (((Ans2 << 16) ^ card->scramble) & 0xffff0000); + if (ReadArrayUnlock(chan, data, rbuf, rlen, 1) < 0) { + EXIUnlock(chan); + __CARDMountCallback(chan, CARD_RESULT_NOCARD); + return; + } + result = __CARDReadStatus(chan, &unk); + if (!EXIProbe(chan)) { + EXIUnlock(chan); + __CARDMountCallback(chan, CARD_RESULT_NOCARD); + return; + } + if (result == CARD_RESULT_READY && !(unk & 0x40)) { + EXIUnlock(chan); + result = CARD_RESULT_IOERROR; + } + __CARDMountCallback(chan, result); +} diff --git a/src/dolphin/card/CARDWrite.c b/src/dolphin/card/CARDWrite.c new file mode 100644 index 00000000..ca8aacfb --- /dev/null +++ b/src/dolphin/card/CARDWrite.c @@ -0,0 +1,128 @@ +#include +#include +#include +#include + +#include + +static void EraseCallback(s32 chan, s32 result); + +static void WriteCallback(s32 chan, s32 result) +{ + CARDControl *card; + CARDCallback callback; + u16 *fat; + CARDDir *dir; + CARDDir *ent; + CARDFileInfo *fileInfo; + + card = &__CARDBlock[chan]; + if (result < 0) { + goto error; + } + + fileInfo = card->fileInfo; + if (fileInfo->length < 0) { + result = CARD_RESULT_CANCELED; + goto error; + } + + fileInfo->length -= card->sectorSize; + if (fileInfo->length <= 0) { + dir = __CARDGetDirBlock(card); + ent = &dir[fileInfo->fileNo]; + ent->time = (u32)OSTicksToSeconds(OSGetTime()); + callback = card->apiCallback; + card->apiCallback = 0; + result = __CARDUpdateDir(chan, callback); + } + else { + fat = __CARDGetFatBlock(card); + fileInfo->offset += card->sectorSize; + fileInfo->iBlock = fat[fileInfo->iBlock]; + if (!CARDIsValidBlockNo(card, fileInfo->iBlock)) { + result = CARD_RESULT_BROKEN; + goto error; + } + result = __CARDEraseSector(chan, card->sectorSize * (u32)fileInfo->iBlock, EraseCallback); + } + + if (result < 0) { + goto error; + } + return; + +error: + callback = card->apiCallback; + card->apiCallback = 0; + __CARDPutControlBlock(card, result); + callback(chan, result); +} + +static void EraseCallback(s32 chan, s32 result) +{ + CARDControl *card; + CARDCallback callback; + CARDFileInfo *fileInfo; + + card = &__CARDBlock[chan]; + if (result < 0) { + goto error; + } + + fileInfo = card->fileInfo; + result = __CARDWrite(chan, card->sectorSize * (u32)fileInfo->iBlock, card->sectorSize, card->buffer, WriteCallback); + if (result < 0) { + goto error; + } + return; + +error: + callback = card->apiCallback; + card->apiCallback = 0; + __CARDPutControlBlock(card, result); + callback(chan, result); +} + +s32 CARDWriteAsync(CARDFileInfo *fileInfo, const void *buf, s32 length, s32 offset, CARDCallback callback) +{ + CARDControl *card; + s32 result; + CARDDir *dir; + CARDDir *ent; + + result = __CARDSeek(fileInfo, length, offset, &card); + if (result < 0) { + return result; + } + + if (OFFSET(offset, card->sectorSize) != 0 || OFFSET(length, card->sectorSize) != 0) { + return __CARDPutControlBlock(card, CARD_RESULT_FATAL_ERROR); + } + + dir = __CARDGetDirBlock(card); + ent = &dir[fileInfo->fileNo]; + result = __CARDAccess(card, ent); + if (result < 0) { + return __CARDPutControlBlock(card, result); + } + + DCStoreRange((void *)buf, (u32)length); + card->apiCallback = callback ? callback : __CARDDefaultApiCallback; + card->buffer = (void *)buf; + result = __CARDEraseSector(fileInfo->chan, card->sectorSize * (u32)fileInfo->iBlock, EraseCallback); + if (result < 0) { + __CARDPutControlBlock(card, result); + } + return result; +} + +s32 CARDWrite(CARDFileInfo *fileInfo, const void *buf, s32 length, s32 offset) +{ + s32 result = CARDWriteAsync(fileInfo, buf, length, offset, __CARDSyncCallback); + if (result < 0) { + return result; + } + + return __CARDSync(fileInfo->chan); +} From 38fc86d571ccf9b93b64312b2595e8ca35acd5b4 Mon Sep 17 00:00:00 2001 From: dbalatoni13 Date: Tue, 12 Nov 2024 03:51:15 +0100 Subject: [PATCH 20/29] dolphin header improvements --- include/dolphin/{demotypes.h => demoPriv.h} | 4 ++-- src/dolphin/demo/DEMOInit.c | 2 +- src/dolphin/demo/DEMOPuts.c | 2 +- src/dolphin/demo/DEMOStats.c | 2 +- src/dolphin/exi/EXIBios.c | 2 ++ 5 files changed, 7 insertions(+), 5 deletions(-) rename include/dolphin/{demotypes.h => demoPriv.h} (79%) diff --git a/include/dolphin/demotypes.h b/include/dolphin/demoPriv.h similarity index 79% rename from include/dolphin/demotypes.h rename to include/dolphin/demoPriv.h index 00f29a3c..bce6d3bc 100644 --- a/include/dolphin/demotypes.h +++ b/include/dolphin/demoPriv.h @@ -1,5 +1,5 @@ -#ifndef _DOLPHIN_DEMOTYPES -#define _DOLPHIN_DEMOTYPES +#ifndef _DOLPHIN_DEMOPRIV +#define _DOLPHIN_DEMOPRIV #include diff --git a/src/dolphin/demo/DEMOInit.c b/src/dolphin/demo/DEMOInit.c index 0ebcc3c0..86df9bd1 100644 --- a/src/dolphin/demo/DEMOInit.c +++ b/src/dolphin/demo/DEMOInit.c @@ -5,7 +5,7 @@ #include #include "game/init.h" -#include +#include extern unsigned char DemoStatEnable; // size: 0x1, address: 0x0 diff --git a/src/dolphin/demo/DEMOPuts.c b/src/dolphin/demo/DEMOPuts.c index 5a582ee4..3b7e84bc 100644 --- a/src/dolphin/demo/DEMOPuts.c +++ b/src/dolphin/demo/DEMOPuts.c @@ -5,7 +5,7 @@ #include #include -#include +#include extern unsigned long DEMOFontBitmap[]; // size: 0x0, address: 0x0 diff --git a/src/dolphin/demo/DEMOStats.c b/src/dolphin/demo/DEMOStats.c index d98b436c..89a6595f 100644 --- a/src/dolphin/demo/DEMOStats.c +++ b/src/dolphin/demo/DEMOStats.c @@ -4,7 +4,7 @@ #include #include -#include +#include unsigned char DemoStatEnable = 0; static DemoStatData *DemoStat; diff --git a/src/dolphin/exi/EXIBios.c b/src/dolphin/exi/EXIBios.c index b8843fa2..4b9a1d78 100644 --- a/src/dolphin/exi/EXIBios.c +++ b/src/dolphin/exi/EXIBios.c @@ -21,6 +21,8 @@ #define CPR_CS(x) ((1u << (x)) << 7) #define CPR_CLK(x) ((x) << 4) +static BOOL __EXIProbe(s32 chan); + typedef struct EXIControl { EXICallback exiCallback; EXICallback tcCallback; From 3c7ab99b35123515f10a1f4c9dbabfded6e97e2f Mon Sep 17 00:00:00 2001 From: dbalatoni13 Date: Tue, 12 Nov 2024 04:27:58 +0100 Subject: [PATCH 21/29] Set dolphin/card to matching Imported thp, THPDec.c is matching --- config/GMPE01_00/symbols.txt | 4 +- configure.py | 49 +- src/thp/THPAudio.c | 162 +++ src/thp/THPDec.c | 2280 ++++++++++++++++++++++++++++++++++ 4 files changed, 2472 insertions(+), 23 deletions(-) create mode 100644 src/thp/THPAudio.c create mode 100644 src/thp/THPDec.c diff --git a/config/GMPE01_00/symbols.txt b/config/GMPE01_00/symbols.txt index 9bcdbabc..8b2b8d1b 100644 --- a/config/GMPE01_00/symbols.txt +++ b/config/GMPE01_00/symbols.txt @@ -5816,8 +5816,8 @@ Vachuff = .sbss:0x801D46E0; // type:object size:0x4 scope:local align:32 data:4b __THPHuffmanBits = .sbss:0x801D46E4; // type:object size:0x4 scope:local data:4byte __THPHuffmanSizeTab = .sbss:0x801D46E8; // type:object size:0x4 scope:local data:4byte __THPHuffmanCodeTab = .sbss:0x801D46EC; // type:object size:0x4 scope:local data:4byte -Gbase = .sbss:0x801D4700; // type:object size:0x20 align:32 data:4byte -Gwid = .sbss:0x801D4720; // type:object size:0x20 align:32 data:4byte +Gbase = .sbss:0x801D4700; // type:object size:0x20 scope:local align:32 data:4byte +Gwid = .sbss:0x801D4720; // type:object size:0x20 scope:local align:32 data:4byte Gq = .sbss:0x801D4740; // type:object size:0x4 scope:local align:32 data:4byte __THPOldGQR5 = .sbss:0x801D4744; // type:object size:0x4 scope:local data:4byte __THPOldGQR6 = .sbss:0x801D4748; // type:object size:0x4 scope:local data:4byte diff --git a/configure.py b/configure.py index 0048e928..a27cc629 100644 --- a/configure.py +++ b/configure.py @@ -216,6 +216,10 @@ cflags_dolphin = [ "-fp_contract off", ] +cflags_thp = [ + *cflags_base, +] + # Metrowerks library flags cflags_msl = [ *cflags_base, @@ -574,21 +578,21 @@ config.libs = [ DolphinLib( "card", [ - Object(NonMatching, "dolphin/card/CARDBios.c"), - Object(NonMatching, "dolphin/card/CARDUnlock.c"), - Object(NonMatching, "dolphin/card/CARDRdwr.c"), - Object(NonMatching, "dolphin/card/CARDBlock.c"), - Object(NonMatching, "dolphin/card/CARDDir.c"), - Object(NonMatching, "dolphin/card/CARDCheck.c"), - Object(NonMatching, "dolphin/card/CARDMount.c"), - Object(NonMatching, "dolphin/card/CARDFormat.c"), - Object(NonMatching, "dolphin/card/CARDOpen.c"), - Object(NonMatching, "dolphin/card/CARDCreate.c"), - Object(NonMatching, "dolphin/card/CARDRead.c"), - Object(NonMatching, "dolphin/card/CARDWrite.c"), - Object(NonMatching, "dolphin/card/CARDDelete.c"), - Object(NonMatching, "dolphin/card/CARDStat.c"), - Object(NonMatching, "dolphin/card/CARDNet.c"), + Object(Matching, "dolphin/card/CARDBios.c"), + Object(Matching, "dolphin/card/CARDUnlock.c"), + Object(Matching, "dolphin/card/CARDRdwr.c"), + Object(Matching, "dolphin/card/CARDBlock.c"), + Object(Matching, "dolphin/card/CARDDir.c"), + Object(Matching, "dolphin/card/CARDCheck.c"), + Object(Matching, "dolphin/card/CARDMount.c"), + Object(Matching, "dolphin/card/CARDFormat.c"), + Object(Matching, "dolphin/card/CARDOpen.c"), + Object(Matching, "dolphin/card/CARDCreate.c"), + Object(Matching, "dolphin/card/CARDRead.c"), + Object(Matching, "dolphin/card/CARDWrite.c"), + Object(Matching, "dolphin/card/CARDDelete.c"), + Object(Matching, "dolphin/card/CARDStat.c"), + Object(Matching, "dolphin/card/CARDNet.c"), ], ), DolphinLib( @@ -605,13 +609,16 @@ config.libs = [ Object(Matching, "dolphin/si/SISamplingRate.c"), ], ), - DolphinLib( - "thp", - [ - Object(NonMatching, "dolphin/thp/THPDec.c"), - Object(NonMatching, "dolphin/thp/THPAudio.c"), + { + "lib": "thp", + "mw_version": "GC/1.2.5", + "cflags": cflags_thp, + "host": False, + "objects": [ + Object(Matching, "thp/THPDec.c"), + Object(NonMatching, "thp/THPAudio.c"), ], - ), + }, { "lib": "Runtime.PPCEABI.H", "mw_version": config.linker_version, diff --git a/src/thp/THPAudio.c b/src/thp/THPAudio.c new file mode 100644 index 00000000..11a29fe4 --- /dev/null +++ b/src/thp/THPAudio.c @@ -0,0 +1,162 @@ +#include + +u32 THPAudioDecode(s16 *audioBuffer, u8 *audioFrame, s32 flag) +{ + // THPAudioRecordHeader *header; + // THPAudioDecodeInfo decInfo; + // u8 *left, *right; + // s16 *decLeftPtr, *decRightPtr; + // s16 yn1, yn2; + // s32 i; + // s32 step; + // s32 sample; + // s64 yn; + + // if (audioBuffer == NULL || audioFrame == NULL) { + // return 0; + // } + + // header = (THPAudioRecordHeader *)audioFrame; + // left = audioFrame + sizeof(THPAudioRecordHeader); + // right = left + header->offsetNextChannel; + + // if (flag == 1) { + // decRightPtr = audioBuffer; + // decLeftPtr = audioBuffer + header->sampleSize; + // step = 1; + // } + // else { + // decRightPtr = audioBuffer; + // decLeftPtr = audioBuffer + 1; + // step = 2; + // } + + // if (header->offsetNextChannel == 0) { + // __THPAudioInitialize(&decInfo, left); + + // yn1 = header->lYn1; + // yn2 = header->lYn2; + + // for (i = 0; i < header->sampleSize; i++) { + // sample = __THPAudioGetNewSample(&decInfo); + // yn = header->lCoef[decInfo.predictor][1] * yn2; + // yn += header->lCoef[decInfo.predictor][0] * yn1; + // yn += (sample << decInfo.scale) << 11; + // yn <<= 5; + + // if (sample > 0x8000) { + // yn += 0x10000; + // } + // else if ((sample == 0x8000) && ((yn & 0x10000) != 0)) { + // yn += 0x10000; + // } + + // yn += 0x8000; + + // if (yn > 2147483647LL) { + // yn = 2147483647LL; + // } + + // if (yn < -2147483648LL) { + // yn = -2147483648LL; + // } + + // *decLeftPtr = (s16)(yn >> 16); + // decLeftPtr += step; + // *decRightPtr = (s16)(yn >> 16); + // decRightPtr += step; + // yn2 = yn1; + // yn1 = (s16)(yn >> 16); + // } + // } + // else { + // __THPAudioInitialize(&decInfo, left); + + // yn1 = header->lYn1; + // yn2 = header->lYn2; + + // for (i = 0; i < header->sampleSize; i++) { + // sample = __THPAudioGetNewSample(&decInfo); + // yn = header->lCoef[decInfo.predictor][1] * yn2; + // yn += header->lCoef[decInfo.predictor][0] * yn1; + // yn += (sample << decInfo.scale) << 11; + // yn <<= 5; + // yn += 0x8000; + + // if (yn > 2147483647LL) { + // yn = 2147483647LL; + // } + + // if (yn < -2147483648LL) { + // yn = -2147483648LL; + // } + + // *decLeftPtr = (s16)(yn >> 16); + // decLeftPtr += step; + // yn2 = yn1; + // yn1 = (s16)(yn >> 16); + // } + + // __THPAudioInitialize(&decInfo, right); + + // yn1 = header->rYn1; + // yn2 = header->rYn2; + + // for (i = 0; i < header->sampleSize; i++) { + // sample = __THPAudioGetNewSample(&decInfo); + // yn = header->rCoef[decInfo.predictor][1] * yn2; + // yn += header->rCoef[decInfo.predictor][0] * yn1; + // yn += (sample << decInfo.scale) << 11; + // yn <<= 5; + + // yn += 0x8000; + + // if (yn > 2147483647LL) { + // yn = 2147483647LL; + // } + + // if (yn < -2147483648LL) { + // yn = -2147483648LL; + // } + + // *decRightPtr = (s16)(yn >> 16); + // decRightPtr += step; + // yn2 = yn1; + // yn1 = (s16)(yn >> 16); + // } + // } + + // return header->sampleSize; +} + +static s32 __THPAudioGetNewSample(THPAudioDecodeInfo *info) +{ + s32 sample; + + if (!(info->offsetNibbles & 0x0f)) { + info->predictor = (u8)((*(info->encodeData) & 0x70) >> 4); + info->scale = (u8)((*(info->encodeData) & 0xF)); + info->encodeData++; + info->offsetNibbles += 2; + } + + if (info->offsetNibbles & 0x1) { + sample = (s32)((*(info->encodeData) & 0xF) << 28) >> 28; + info->encodeData++; + } + else { + sample = (s32)((*(info->encodeData) & 0xF0) << 24) >> 28; + } + + info->offsetNibbles++; + return sample; +} + +static void __THPAudioInitialize(THPAudioDecodeInfo *info, u8 *ptr) +{ + info->encodeData = ptr; + info->offsetNibbles = 2; + info->predictor = (u8)((*(info->encodeData) & 0x70) >> 4); + info->scale = (u8)((*(info->encodeData) & 0xF)); + info->encodeData++; +} diff --git a/src/thp/THPDec.c b/src/thp/THPDec.c new file mode 100644 index 00000000..13ff4c8d --- /dev/null +++ b/src/thp/THPDec.c @@ -0,0 +1,2280 @@ +#include +#include + +static THPHuffmanTab *Ydchuff ATTRIBUTE_ALIGN(32); +static THPHuffmanTab *Udchuff ATTRIBUTE_ALIGN(32); +static THPHuffmanTab *Vdchuff ATTRIBUTE_ALIGN(32); +static THPHuffmanTab *Yachuff ATTRIBUTE_ALIGN(32); +static THPHuffmanTab *Uachuff ATTRIBUTE_ALIGN(32); +static THPHuffmanTab *Vachuff ATTRIBUTE_ALIGN(32); +static f32 __THPIDCTWorkspace[64] ATTRIBUTE_ALIGN(32); +static u8 *__THPHuffmanBits; +static u8 *__THPHuffmanSizeTab; +static u16 *__THPHuffmanCodeTab; +static THPSample *Gbase ATTRIBUTE_ALIGN(32); +static u32 Gwid ATTRIBUTE_ALIGN(32); +static f32 *Gq ATTRIBUTE_ALIGN(32); +static u8 *__THPLCWork512[3]; +static u8 *__THPLCWork640[3]; +static u32 __THPOldGQR5; +static u32 __THPOldGQR6; +static u8 *__THPWorkArea; +static THPCoeff *__THPMCUBuffer[6]; +static THPFileInfo *__THPInfo; +static BOOL __THPInitFlag = FALSE; + +#define THPROUNDUP(a, b) ((((s32)(a)) + ((s32)(b)-1L)) / ((s32)(b))) + +s32 THPVideoDecode(void *file, void *tileY, void *tileU, void *tileV, void *work) +{ + u8 all_done, status; + s32 errorCode; + + if (!file) { + goto _err_no_input; + } + + if (tileY == NULL || tileU == NULL || tileV == NULL) { + goto _err_no_output; + } + + if (!work) { + goto _err_no_work; + } + + if (!(PPCMfhid2() & 0x10000000)) { + goto _err_lc_not_enabled; + } + + if (__THPInitFlag == FALSE) { + goto _err_not_initialized; + } + + __THPWorkArea = (u8 *)work; + __THPInfo = (THPFileInfo *)OSRoundUp32B(__THPWorkArea); + __THPWorkArea = (u8 *)OSRoundUp32B(__THPWorkArea) + sizeof(THPFileInfo); + DCZeroRange(__THPInfo, sizeof(THPFileInfo)); + __THPInfo->cnt = 33; + __THPInfo->decompressedY = 0; + __THPInfo->c = (u8 *)file; + all_done = FALSE; + + for (;;) { + if ((*(__THPInfo->c)++) != 255) { + goto _err_bad_syntax; + } + + while (*__THPInfo->c == 255) { + ((__THPInfo->c)++); + } + + status = (*(__THPInfo->c)++); + + if (status <= 0xD7) { + if (status == 196) { + status = __THPReadHuffmanTableSpecification(); + if (status != 0) { + goto _err_bad_status; + } + } + + else if (status == 192) { + status = __THPReadFrameHeader(); + if (status != 0) { + goto _err_bad_status; + } + } + + else { + goto _err_unsupported_marker; + } + } + + else if (0xD8 <= status && status <= 0xDF) { + if (status == 221) { + __THPRestartDefinition(); + } + + else if (status == 219) { + status = __THPReadQuantizationTable(); + if (status != 0) { + goto _err_bad_status; + } + } + + else if (status == 218) { + status = __THPReadScaneHeader(); + if (status != 0) { + goto _err_bad_status; + } + + all_done = TRUE; + } + else if (status == 216) { + // empty but required for match + } + else { + goto _err_unsupported_marker; + } + } + + else if (0xE0 <= status) { + if ((224 <= status && status <= 239) || status == 254) { + __THPInfo->c += (__THPInfo->c)[0] << 8 | (__THPInfo->c)[1]; + } + else { + goto _err_unsupported_marker; + } + } + + if (all_done) { + break; + } + } + + __THPSetupBuffers(); + __THPDecompressYUV(tileY, tileU, tileV); + return 0; + +_err_no_input: + errorCode = 25; + goto _err_exit; + +_err_no_output: + errorCode = 27; + goto _err_exit; + +_err_no_work: + errorCode = 26; + goto _err_exit; + +_err_unsupported_marker: + errorCode = 11; + goto _err_exit; + +_err_bad_resource: + errorCode = 1; + goto _err_exit; + +_err_no_mem: + errorCode = 6; + goto _err_exit; + +_err_bad_syntax: + errorCode = 3; + goto _err_exit; + +_err_bad_status: + errorCode = status; + goto _err_exit; + +_err_lc_not_enabled: + errorCode = 28; + goto _err_exit; + +_err_not_initialized: + errorCode = 29; + goto _err_exit; + +_err_exit: + return errorCode; +} + +static void __THPSetupBuffers(void) +{ + u8 i; + THPCoeff *buffer; + + buffer = (THPCoeff *)OSRoundUp32B(__THPWorkArea); + + for (i = 0; i < 6; i++) { + __THPMCUBuffer[i] = &buffer[i * 64]; + } +} + +static u8 __THPReadFrameHeader(void) +{ + u8 i, utmp8; + + __THPInfo->c += 2; + + utmp8 = (*(__THPInfo->c)++); + + if (utmp8 != 8) { + return 10; + } + + __THPInfo->yPixelSize = (u16)((__THPInfo->c)[0] << 8 | (__THPInfo->c)[1]); + __THPInfo->c += 2; + __THPInfo->xPixelSize = (u16)((__THPInfo->c)[0] << 8 | (__THPInfo->c)[1]); + __THPInfo->c += 2; + + utmp8 = (*(__THPInfo->c)++); + if (utmp8 != 3) { + return 12; + } + + for (i = 0; i < 3; i++) { + utmp8 = (*(__THPInfo->c)++); + utmp8 = (*(__THPInfo->c)++); + if ((i == 0 && utmp8 != 0x22) || (i > 0 && utmp8 != 0x11)) { + return 19; + } + + __THPInfo->components[i].quantizationTableSelector = (*(__THPInfo->c)++); + } + + return 0; +} + +static u8 __THPReadScaneHeader(void) +{ + u8 i, utmp8; + __THPInfo->c += 2; + + utmp8 = (*(__THPInfo->c)++); + + if (utmp8 != 3) { + return 12; + } + + for (i = 0; i < 3; i++) { + utmp8 = (*(__THPInfo->c)++); + + utmp8 = (*(__THPInfo->c)++); + __THPInfo->components[i].DCTableSelector = (u8)(utmp8 >> 4); + __THPInfo->components[i].ACTableSelector = (u8)(utmp8 & 15); + + if ((__THPInfo->validHuffmanTabs & (1 << ((utmp8 >> 4)))) == 0) { + return 15; + } + + if ((__THPInfo->validHuffmanTabs & (1 << ((utmp8 & 15) + 1))) == 0) { + return 15; + } + } + + __THPInfo->c += 3; + __THPInfo->MCUsPerRow = (u16)THPROUNDUP(__THPInfo->xPixelSize, 16); + __THPInfo->components[0].predDC = 0; + __THPInfo->components[1].predDC = 0; + __THPInfo->components[2].predDC = 0; + return 0; +} + +static u8 __THPReadQuantizationTable(void) +{ + u16 length, id, i, row, col; + f32 q_temp[64]; + + length = (u16)((__THPInfo->c)[0] << 8 | (__THPInfo->c)[1]); + __THPInfo->c += 2; + length -= 2; + + for (;;) { + id = (*(__THPInfo->c)++); + + for (i = 0; i < 64; i++) { + q_temp[__THPJpegNaturalOrder[i]] = (f32)(*(__THPInfo->c)++); + } + + i = 0; + for (row = 0; row < 8; row++) { + for (col = 0; col < 8; col++) { + __THPInfo->quantTabs[id][i] = (f32)((f64)q_temp[i] * __THPAANScaleFactor[row] * __THPAANScaleFactor[col]); + i++; + } + } + + length -= 65; + if (!length) { + break; + } + } + + return 0; +} + +static u8 __THPReadHuffmanTableSpecification(void) +{ + u8 t_class, id, i, tab_index; + u16 length, num_Vij; + + __THPHuffmanSizeTab = __THPWorkArea; + __THPHuffmanCodeTab = (u16 *)((u32)__THPWorkArea + 256 + 1); + length = (u16)((__THPInfo->c)[0] << 8 | (__THPInfo->c)[1]); + __THPInfo->c += 2; + length -= 2; + + for (;;) { + i = (*(__THPInfo->c)++); + id = (u8)(i & 15); + t_class = (u8)(i >> 4); + __THPHuffmanBits = __THPInfo->c; + tab_index = (u8)((id << 1) + t_class); + num_Vij = 0; + + for (i = 0; i < 16; i++) { + num_Vij += (*(__THPInfo->c)++); + } + + __THPInfo->huffmanTabs[tab_index].Vij = __THPInfo->c; + __THPInfo->c += num_Vij; + __THPHuffGenerateSizeTable(); + __THPHuffGenerateCodeTable(); + __THPHuffGenerateDecoderTables(tab_index); + __THPInfo->validHuffmanTabs |= 1 << tab_index; + length -= 17 + num_Vij; + + if (length == 0) { + break; + } + } + + return 0; +} + +static void __THPHuffGenerateSizeTable(void) +{ + s32 p, l, i; + p = 0; + + for (l = 1; l <= 16; l++) { + i = (s32)__THPHuffmanBits[l - 1]; + while (i--) { + __THPHuffmanSizeTab[p++] = (u8)l; + } + } + + __THPHuffmanSizeTab[p] = 0; +} + +static void __THPHuffGenerateCodeTable(void) +{ + u8 si; + u16 p, code; + + p = 0; + code = 0; + si = __THPHuffmanSizeTab[0]; + + while (__THPHuffmanSizeTab[p]) { + while (__THPHuffmanSizeTab[p] == si) { + __THPHuffmanCodeTab[p++] = code; + code++; + } + + code <<= 1; + si++; + } +} + +static void __THPHuffGenerateDecoderTables(u8 tabIndex) +{ + s32 p, l; + THPHuffmanTab *h; + + p = 0; + h = &__THPInfo->huffmanTabs[tabIndex]; + for (l = 1; l <= 16; l++) { + if (__THPHuffmanBits[l - 1]) { + h->valPtr[l] = p - __THPHuffmanCodeTab[p]; + p += __THPHuffmanBits[l - 1]; + h->maxCode[l] = __THPHuffmanCodeTab[p - 1]; + } + else { + h->maxCode[l] = -1; + h->valPtr[l] = -1; + } + } + + h->maxCode[17] = 0xfffffL; +} + +static void __THPRestartDefinition(void) +{ + __THPInfo->RST = TRUE; + __THPInfo->c += 2; + __THPInfo->nMCU = (u16)((__THPInfo->c)[0] << 8 | (__THPInfo->c)[1]); + __THPInfo->c += 2; + __THPInfo->currMCU = __THPInfo->nMCU; +} + +static inline void __THPGQRSetup(void) +{ + register u32 tmp1, tmp2; + + // clang-format off + asm { + mfspr tmp1, GQR5; + mfspr tmp2, GQR6; + } + // clang-format on + + __THPOldGQR5 = tmp1; + __THPOldGQR6 = tmp2; + + // clang-format off + asm { + li r3, 0x0007 + oris r3, r3, 0x0007 + mtspr GQR5, r3 + li r3, 0x3D04 + oris r3, r3, 0x3D04 + mtspr GQR6, r3 + } + // clang-format on +} + +static inline void __THPGQRRestore(void) +{ + register u32 tmp1, tmp2; + tmp1 = __THPOldGQR5; + tmp2 = __THPOldGQR6; + + // clang-format off + asm { + mtspr GQR5, tmp1; + mtspr GQR6, tmp2; + } + // clang-format on +} + +void __THPPrepBitStream(void) +{ + u32 *ptr; + u32 offset, i, j, k; + + ptr = (u32 *)((u32)__THPInfo->c & 0xFFFFFFFC); + offset = (u32)__THPInfo->c & 3; + + if (__THPInfo->cnt != 33) { + __THPInfo->cnt -= (3 - offset) * 8; + } + else { + __THPInfo->cnt = (offset * 8) + 1; + } + + __THPInfo->c = (u8 *)ptr; + __THPInfo->currByte = *ptr; + + for (i = 0; i < 4; i++) { + if (__THPInfo->validHuffmanTabs & (1 << i)) { + for (j = 0; j < 32; j++) { + __THPInfo->huffmanTabs[i].quick[j] = 0xFF; + + for (k = 0; k < 5; k++) { + s32 code = (s32)(j >> (5 - k - 1)); + + if (code <= __THPInfo->huffmanTabs[i].maxCode[k + 1]) { + __THPInfo->huffmanTabs[i].quick[j] = __THPInfo->huffmanTabs[i].Vij[(s32)(code + __THPInfo->huffmanTabs[i].valPtr[k + 1])]; + __THPInfo->huffmanTabs[i].increment[j] = (u8)(k + 1); + k = 99; + } + else { + } + } + } + } + } + + { + s32 YdcTab, UdcTab, VdcTab, YacTab, UacTab, VacTab; + + YdcTab = (__THPInfo->components[0].DCTableSelector << 1); + UdcTab = (__THPInfo->components[1].DCTableSelector << 1); + VdcTab = (__THPInfo->components[2].DCTableSelector << 1); + + YacTab = (__THPInfo->components[0].ACTableSelector << 1) + 1; + UacTab = (__THPInfo->components[1].ACTableSelector << 1) + 1; + VacTab = (__THPInfo->components[2].ACTableSelector << 1) + 1; + + Ydchuff = &__THPInfo->huffmanTabs[YdcTab]; + Udchuff = &__THPInfo->huffmanTabs[UdcTab]; + Vdchuff = &__THPInfo->huffmanTabs[VdcTab]; + + Yachuff = &__THPInfo->huffmanTabs[YacTab]; + Uachuff = &__THPInfo->huffmanTabs[UacTab]; + Vachuff = &__THPInfo->huffmanTabs[VacTab]; + } +} + +static void __THPDecompressYUV(void *tileY, void *tileU, void *tileV) +{ + u16 currentY, targetY; + __THPInfo->dLC[0] = tileY; + __THPInfo->dLC[1] = tileU; + __THPInfo->dLC[2] = tileV; + + currentY = __THPInfo->decompressedY; + targetY = __THPInfo->yPixelSize; + + __THPGQRSetup(); + __THPPrepBitStream(); + + if (__THPInfo->xPixelSize == 512 && targetY == 448) { + while (currentY < targetY) { + __THPDecompressiMCURow512x448(); + currentY += 16; + } + } + else if (__THPInfo->xPixelSize == 640 && targetY == 480) { + while (currentY < targetY) { + __THPDecompressiMCURow640x480(); + currentY += 16; + } + } + else { + while (currentY < targetY) { + __THPDecompressiMCURowNxN(); + currentY += 16; + } + } + + __THPGQRRestore(); +} + +inline void __THPInverseDCTNoYPos(register THPCoeff *in, register u32 xPos) +{ + register f32 *q, *ws; + register f32 tmp0, tmp1, tmp2, tmp3, tmp4, tmp5, tmp6, tmp7, tmp8, tmp9; + register f32 tmp10, tmp11, tmp12, tmp13; + register f32 tmp20, tmp21, tmp22, tmp23; + register f32 cc4 = 1.414213562F; + register f32 cc2 = 1.847759065F; + register f32 cc2c6s = 1.082392200F; + register f32 cc2c6a = -2.613125930F; + register f32 bias = 1024.0F; + q = Gq; + ws = &__THPIDCTWorkspace[0] - 2; + + { + register u32 itmp0, itmp1, itmp2, itmp3; + // clang-format off + asm { + li itmp2, 8 + mtctr itmp2 + + _loopHead0: + psq_l tmp10, 0(in), 0, 5 + psq_l tmp11, 0(q), 0, 0 + lwz itmp0, 12(in) + lwz itmp3, 8(in) + ps_mul tmp10, tmp10, tmp11 + lwz itmp1, 4(in) + lhz itmp2, 2(in) + or. itmp0, itmp0, itmp3 + + _loopHead1: + cmpwi itmp0, 0 + bne _regularIDCT + ps_merge00 tmp0, tmp10, tmp10 + cmpwi itmp1, 0 + psq_st tmp0, 8(ws), 0, 0 + bne _halfIDCT + psq_st tmp0, 16(ws), 0, 0 + cmpwi itmp2, 0 + psq_st tmp0, 24(ws), 0, 0 + bne _quarterIDCT + addi q, q, 8*sizeof(f32) + psq_stu tmp0, 32(ws), 0, 0 + addi in, in, 8*sizeof(THPCoeff) + bdnz _loopHead0 + b _loopEnd + + _quarterIDCT: + addi in, in, 8*sizeof(THPCoeff) + ps_msub tmp2, tmp10, cc2, tmp10 + addi q, q, 8*sizeof(f32) + ps_merge00 tmp9, tmp10, tmp10 + lwz itmp1, 4(in) + ps_sub tmp1, cc2, cc2c6s + ps_msub tmp3, tmp10, cc4, tmp2 + lhz itmp2, 2(in) + ps_merge11 tmp5, tmp10, tmp2 + psq_l tmp11, 0(q), 0, 0 + ps_nmsub tmp4, tmp10, tmp1, tmp3 + ps_add tmp7, tmp9, tmp5 + psq_l tmp10, 0(in), 0, 5 + ps_merge11 tmp6, tmp3, tmp4 + ps_sub tmp5, tmp9, tmp5 + lwz itmp0, 12(in) + ps_add tmp8, tmp9, tmp6 + lwz itmp3, 8(in) + ps_sub tmp6, tmp9, tmp6 + psq_stu tmp7, 8(ws), 0, 0 + ps_merge10 tmp6, tmp6, tmp6 + psq_stu tmp8, 8(ws), 0, 0 + ps_merge10 tmp5, tmp5, tmp5 + or itmp0, itmp0, itmp3 + psq_stu tmp6, 8(ws), 0, 0 + ps_mul tmp10, tmp10, tmp11 + psq_stu tmp5, 8(ws), 0, 0 + bdnz _loopHead1 + b _loopEnd + + _halfIDCT: + psq_l tmp1, 4(in), 0, 5 + psq_l tmp9, 8(q), 0, 0 + addi in, in, 8*sizeof(THPCoeff) + ps_mul tmp1, tmp1, tmp9 + addi q, q, 8*sizeof(f32) + ps_sub tmp3, tmp10, tmp1 + ps_add tmp2, tmp10, tmp1 + lwz itmp0, 12(in) + ps_madd tmp4, tmp1, cc4, tmp3 + ps_nmsub tmp5, tmp1, cc4, tmp2 + ps_mul tmp8, tmp3, cc2 + ps_merge00 tmp4, tmp2, tmp4 + lwz itmp3, 8(in) + ps_nmsub tmp6, tmp1, cc2c6a, tmp8 + ps_merge00 tmp5, tmp5, tmp3 + lwz itmp1, 4(in) + ps_sub tmp6, tmp6, tmp2 + ps_msub tmp7, tmp10, cc2c6s, tmp8 + lhz itmp2, 2(in) + ps_merge11 tmp2, tmp2, tmp6 + ps_msub tmp8, tmp3, cc4, tmp6 + psq_l tmp10, 0(in), 0, 5 + ps_add tmp9, tmp4, tmp2 + ps_add tmp7, tmp8, tmp7 + psq_l tmp11, 0(q), 0, 0 + ps_merge11 tmp3, tmp8, tmp7 + ps_sub tmp4, tmp4, tmp2 + psq_stu tmp9, 8(ws), 0, 0 + ps_add tmp0, tmp5, tmp3 + ps_sub tmp1, tmp5, tmp3 + or itmp0, itmp0, itmp3 + psq_stu tmp0, 8(ws), 0, 0 + ps_merge10 tmp1, tmp1, tmp1 + ps_merge10 tmp4, tmp4, tmp4 + psq_stu tmp1, 8(ws), 0, 0 + ps_mul tmp10, tmp10, tmp11 + psq_stu tmp4, 8(ws), 0, 0 + bdnz _loopHead1 + b _loopEnd + + _regularIDCT: + psq_l tmp9, 4(in), 0, 5 + psq_l tmp5, 8(q), 0, 0 + ps_mul tmp9, tmp9, tmp5 + psq_l tmp2, 8(in), 0, 5 + psq_l tmp6, 16(q), 0, 0 + ps_merge01 tmp0, tmp10, tmp9 + psq_l tmp3, 12(in), 0, 5 + ps_merge01 tmp1, tmp9, tmp10 + psq_l tmp7, 24(q), 0, 0 + addi in, in, 8*sizeof(THPCoeff) + ps_madd tmp4, tmp2, tmp6, tmp0 + ps_nmsub tmp5, tmp2, tmp6, tmp0 + ps_madd tmp6, tmp3, tmp7, tmp1 + ps_nmsub tmp7, tmp3, tmp7, tmp1 + addi q, q, 8*sizeof(f32) + ps_add tmp0, tmp4, tmp6 + ps_sub tmp3, tmp4, tmp6 + ps_msub tmp2, tmp7, cc4, tmp6 + lwz itmp0, 12(in) + ps_sub tmp8, tmp7, tmp5 + ps_add tmp1, tmp5, tmp2 + ps_sub tmp2, tmp5, tmp2 + ps_mul tmp8, tmp8, cc2 + lwz itmp3, 8(in) + ps_merge00 tmp1, tmp0, tmp1 + ps_nmsub tmp6, tmp5, cc2c6a, tmp8 + ps_msub tmp4, tmp7, cc2c6s, tmp8 + lwz itmp1, 4(in) + ps_sub tmp6, tmp6, tmp0 + ps_merge00 tmp2, tmp2, tmp3 + lhz itmp2, 2(in) + ps_madd tmp5, tmp3, cc4, tmp6 + ps_merge11 tmp7, tmp0, tmp6 + psq_l tmp10, 0(in), 0, 5 + ps_sub tmp4, tmp4, tmp5 + ps_add tmp3, tmp1, tmp7 + psq_l tmp11, 0(q), 0, 0 + ps_merge11 tmp4, tmp5, tmp4 + ps_sub tmp0, tmp1, tmp7 + ps_mul tmp10, tmp10, tmp11 + ps_add tmp5, tmp2, tmp4 + ps_sub tmp6, tmp2, tmp4 + ps_merge10 tmp5, tmp5, tmp5 + psq_stu tmp3, 8(ws), 0, 0 + ps_merge10 tmp0, tmp0, tmp0 + psq_stu tmp6, 8(ws), 0, 0 + psq_stu tmp5, 8(ws), 0, 0 + or itmp0, itmp0, itmp3 + psq_stu tmp0, 8(ws), 0, 0 + bdnz _loopHead1 + + _loopEnd: + + } + // clang-format on + } + + ws = &__THPIDCTWorkspace[0]; + + { + register THPSample *obase = Gbase; + register u32 wid = Gwid; + + register u32 itmp0, off0, off1; + register THPSample *out0, *out1; + + // clang-format off + asm { + psq_l tmp10, 8*0*sizeof(f32)(ws), 0, 0 + slwi xPos, xPos, 2 + psq_l tmp11, 8*4*sizeof(f32)(ws), 0, 0 + slwi off1, wid, 2 + psq_l tmp12, 8*2*sizeof(f32)(ws), 0, 0 + mr off0, xPos + ps_add tmp6, tmp10, tmp11 + psq_l tmp13, 8*6*sizeof(f32)(ws), 0, 0 + ps_sub tmp8, tmp10, tmp11 + add off1, off0, off1 + ps_add tmp6, tmp6, bias + li itmp0, 3 + ps_add tmp7, tmp12, tmp13 + add out0, obase, off0 + ps_sub tmp9, tmp12, tmp13 + ps_add tmp0, tmp6, tmp7 + add out1, obase, off1 + ps_add tmp8, tmp8, bias + mtctr itmp0 + + _loopHead10: + psq_l tmp4, 8*1*sizeof(f32)(ws), 0, 0 + ps_msub tmp9, tmp9, cc4, tmp7 + psq_l tmp5, 8*3*sizeof(f32)(ws), 0, 0 + ps_sub tmp3, tmp6, tmp7 + ps_add tmp1, tmp8, tmp9 + psq_l tmp6, 8*5*sizeof(f32)(ws), 0, 0 + ps_sub tmp2, tmp8, tmp9 + psq_l tmp7, 8*7*sizeof(f32)(ws), 0, 0 + ps_add tmp8, tmp6, tmp5 + ps_sub tmp6, tmp6, tmp5 + addi ws, ws, 2*sizeof(f32) + ps_add tmp9, tmp4, tmp7 + ps_sub tmp4, tmp4, tmp7 + psq_l tmp10, 8*0*sizeof(f32)(ws), 0, 0 + ps_add tmp7, tmp9, tmp8 + ps_sub tmp5, tmp9, tmp8 + ps_add tmp8, tmp6, tmp4 + psq_l tmp11, 8*4*sizeof(f32)(ws), 0, 0 + ps_add tmp9, tmp0, tmp7 + ps_mul tmp8, tmp8, cc2 + psq_l tmp12, 8*2*sizeof(f32)(ws), 0, 0 + ps_sub tmp23, tmp0, tmp7 + ps_madd tmp6, tmp6, cc2c6a, tmp8 + psq_l tmp13, 8*6*sizeof(f32)(ws), 0, 0 + ps_sub tmp6, tmp6, tmp7 + addi off0, off0, 2*sizeof(THPSample) + psq_st tmp9, 0(out0), 0, 6 + ps_msub tmp4, tmp4, cc2c6s, tmp8 + ps_add tmp9, tmp1, tmp6 + ps_msub tmp5, tmp5, cc4, tmp6 + ps_sub tmp22, tmp1, tmp6 + psq_st tmp9, 8(out0), 0, 6 + ps_add tmp8, tmp2, tmp5 + ps_add tmp4, tmp4, tmp5 + psq_st tmp8, 16(out0), 0, 6 + addi off1, off1, 2*sizeof(THPSample) + ps_sub tmp9, tmp3, tmp4 + ps_add tmp20, tmp3, tmp4 + psq_st tmp9, 24(out0), 0, 6 + ps_sub tmp21, tmp2, tmp5 + ps_add tmp6, tmp10, tmp11 + psq_st tmp20, 0(out1), 0, 6 + ps_sub tmp8, tmp10, tmp11 + ps_add tmp6, tmp6, bias + psq_st tmp21, 8(out1), 0, 6 + ps_add tmp7, tmp12, tmp13 + ps_sub tmp9, tmp12, tmp13 + psq_st tmp22, 16(out1), 0, 6 + add out0, obase, off0 + ps_add tmp0, tmp6, tmp7 + psq_st tmp23, 24(out1), 0, 6 + ps_add tmp8, tmp8, bias + add out1, obase, off1 + bdnz _loopHead10 + psq_l tmp4, 8*1*sizeof(f32)(ws), 0, 0 + ps_msub tmp9, tmp9, cc4, tmp7 + psq_l tmp5, 8*3*sizeof(f32)(ws), 0, 0 + ps_sub tmp3, tmp6, tmp7 + ps_add tmp1, tmp8, tmp9 + psq_l tmp6, 8*5*sizeof(f32)(ws), 0, 0 + ps_sub tmp2, tmp8, tmp9 + psq_l tmp7, 8*7*sizeof(f32)(ws), 0, 0 + ps_add tmp8, tmp6, tmp5 + ps_sub tmp6, tmp6, tmp5 + ps_add tmp9, tmp4, tmp7 + ps_sub tmp4, tmp4, tmp7 + ps_add tmp7, tmp9, tmp8 + ps_sub tmp5, tmp9, tmp8 + ps_add tmp8, tmp6, tmp4 + ps_add tmp9, tmp0, tmp7 + ps_mul tmp8, tmp8, cc2 + ps_sub tmp23, tmp0, tmp7 + ps_madd tmp6, tmp6, cc2c6a, tmp8 + psq_st tmp9, 0(out0), 0, 6 + ps_sub tmp6, tmp6, tmp7 + ps_msub tmp4, tmp4, cc2c6s, tmp8 + psq_st tmp23, 24(out1), 0, 6 + ps_add tmp9, tmp1, tmp6 + ps_msub tmp5, tmp5, cc4, tmp6 + ps_sub tmp22, tmp1, tmp6 + psq_st tmp9, 8(out0), 0, 6 + ps_add tmp8, tmp2, tmp5 + ps_add tmp4, tmp4, tmp5 + psq_st tmp22, 16(out1), 0, 6 + psq_st tmp8, 16(out0), 0, 6 + ps_sub tmp9, tmp3, tmp4 + ps_add tmp20, tmp3, tmp4 + psq_st tmp9, 24(out0), 0, 6 + ps_sub tmp21, tmp2, tmp5 + psq_st tmp20, 0(out1), 0, 6 + psq_st tmp21, 8(out1), 0, 6 + } + // clang-format on + } +} + +inline void __THPInverseDCTY8(register THPCoeff *in, register u32 xPos) +{ + register f32 *q, *ws; + register f32 tmp0, tmp1, tmp2, tmp3, tmp4, tmp5, tmp6, tmp7, tmp8, tmp9; + register f32 tmp10, tmp11, tmp12, tmp13; + register f32 tmp20, tmp21, tmp22, tmp23; + register f32 cc4 = 1.414213562F; + register f32 cc2 = 1.847759065F; + register f32 cc2c6s = 1.082392200F; + register f32 cc2c6a = -2.613125930F; + register f32 bias = 1024.0F; + + q = Gq; + ws = &__THPIDCTWorkspace[0] - 2; + + { + register u32 itmp0, itmp1, itmp2, itmp3; + + // clang-format off + asm { + li itmp2, 8 + mtctr itmp2 + + _loopHead0: + psq_l tmp10, 0(in), 0, 5 + psq_l tmp11, 0(q), 0, 0 + lwz itmp0, 12(in) + lwz itmp3, 8(in) + ps_mul tmp10, tmp10, tmp11 + lwz itmp1, 4(in) + lhz itmp2, 2(in) + or itmp0, itmp0, itmp3 + + _loopHead1: + cmpwi itmp0, 0 + bne _regularIDCT + ps_merge00 tmp0, tmp10, tmp10 + cmpwi itmp1, 0 + psq_st tmp0, 8(ws), 0, 0 + bne _halfIDCT + psq_st tmp0, 16(ws), 0, 0 + cmpwi itmp2, 0 + psq_st tmp0, 24(ws), 0, 0 + bne _quarterIDCT + addi q, q, 8*sizeof(f32) + psq_stu tmp0, 32(ws), 0, 0 + addi in, in, 8*sizeof(THPCoeff) + bdnz _loopHead0 + b _loopEnd + + _quarterIDCT: + ps_msub tmp2, tmp10, cc2, tmp10 + addi in, in, 8*sizeof(THPCoeff) + ps_merge00 tmp9, tmp10, tmp10 + addi q, q, 8*sizeof(f32) + ps_sub tmp1, cc2, cc2c6s + lwz itmp1, 4(in) + ps_msub tmp3, tmp10, cc4, tmp2 + lhz itmp2, 2(in) + ps_merge11 tmp5, tmp10, tmp2 + psq_l tmp11, 0(q), 0, 0 + ps_nmsub tmp4, tmp10, tmp1, tmp3 + ps_add tmp7, tmp9, tmp5 + psq_l tmp10, 0(in), 0, 5 + ps_merge11 tmp6, tmp3, tmp4 + ps_sub tmp5, tmp9, tmp5 + lwz itmp0, 12(in) + ps_add tmp8, tmp9, tmp6 + lwz itmp3, 8(in) + ps_sub tmp6, tmp9, tmp6 + psq_stu tmp7, 8(ws), 0, 0 + ps_merge10 tmp6, tmp6, tmp6 + psq_stu tmp8, 8(ws), 0, 0 + ps_merge10 tmp5, tmp5, tmp5 + or itmp0, itmp0, itmp3 + psq_stu tmp6, 8(ws), 0, 0 + ps_mul tmp10, tmp10, tmp11 + psq_stu tmp5, 8(ws), 0, 0 + bdnz _loopHead1 + b _loopEnd + + _halfIDCT: + psq_l tmp1, 4(in), 0, 5 + psq_l tmp9, 8(q), 0, 0 + addi in, in, 8*sizeof(THPCoeff) + ps_mul tmp1, tmp1, tmp9 + addi q, q, 8*sizeof(f32) + ps_sub tmp3, tmp10, tmp1 + ps_add tmp2, tmp10, tmp1 + lwz itmp0, 12(in) + ps_madd tmp4, tmp1, cc4, tmp3 + ps_nmsub tmp5, tmp1, cc4, tmp2 + ps_mul tmp8, tmp3, cc2 + ps_merge00 tmp4, tmp2, tmp4 + lwz itmp3, 8(in) + ps_nmsub tmp6, tmp1, cc2c6a, tmp8 + ps_merge00 tmp5, tmp5, tmp3 + lwz itmp1, 4(in) + ps_sub tmp6, tmp6, tmp2 + ps_msub tmp7, tmp10, cc2c6s, tmp8 + lhz itmp2, 2(in) + ps_merge11 tmp2, tmp2, tmp6 + ps_msub tmp8, tmp3, cc4, tmp6 + psq_l tmp10, 0(in), 0, 5 + ps_add tmp9, tmp4, tmp2 + ps_add tmp7, tmp8, tmp7 + psq_l tmp11, 0(q), 0, 0 + ps_merge11 tmp3, tmp8, tmp7 + ps_sub tmp4, tmp4, tmp2 + psq_stu tmp9, 8(ws), 0, 0 + ps_add tmp0, tmp5, tmp3 + ps_sub tmp1, tmp5, tmp3 + or itmp0, itmp0, itmp3 + psq_stu tmp0, 8(ws), 0, 0 + ps_merge10 tmp1, tmp1, tmp1 + ps_merge10 tmp4, tmp4, tmp4 + psq_stu tmp1, 8(ws), 0, 0 + ps_mul tmp10, tmp10, tmp11 + psq_stu tmp4, 8(ws), 0, 0 + bdnz _loopHead1 + b _loopEnd + + _regularIDCT: + psq_l tmp9, 4(in), 0, 5 + psq_l tmp5, 8(q), 0, 0 + ps_mul tmp9, tmp9, tmp5 + psq_l tmp2, 8(in), 0, 5 + psq_l tmp6, 16(q), 0, 0 + ps_merge01 tmp0, tmp10, tmp9 + psq_l tmp3, 12(in), 0, 5 + ps_merge01 tmp1, tmp9, tmp10 + psq_l tmp7, 24(q), 0, 0 + addi in, in, 8*sizeof(THPCoeff) + ps_madd tmp4, tmp2, tmp6, tmp0 + ps_nmsub tmp5, tmp2, tmp6, tmp0 + ps_madd tmp6, tmp3, tmp7, tmp1 + ps_nmsub tmp7, tmp3, tmp7, tmp1 + addi q, q, 8*sizeof(f32) + ps_add tmp0, tmp4, tmp6 + ps_sub tmp3, tmp4, tmp6 + ps_msub tmp2, tmp7, cc4, tmp6 + lwz itmp0, 12(in) + ps_sub tmp8, tmp7, tmp5 + ps_add tmp1, tmp5, tmp2 + ps_sub tmp2, tmp5, tmp2 + ps_mul tmp8, tmp8, cc2 + lwz itmp3, 8(in) + ps_merge00 tmp1, tmp0, tmp1 + ps_nmsub tmp6, tmp5, cc2c6a, tmp8 + ps_msub tmp4, tmp7, cc2c6s, tmp8 + lwz itmp1, 4(in) + ps_sub tmp6, tmp6, tmp0 + ps_merge00 tmp2, tmp2, tmp3 + lhz itmp2, 2(in) + ps_madd tmp5, tmp3, cc4, tmp6 + ps_merge11 tmp7, tmp0, tmp6 + psq_l tmp10, 0(in), 0, 5 + ps_sub tmp4, tmp4, tmp5 + ps_add tmp3, tmp1, tmp7 + psq_l tmp11, 0(q), 0, 0 + ps_merge11 tmp4, tmp5, tmp4 + ps_sub tmp0, tmp1, tmp7 + ps_mul tmp10, tmp10, tmp11 + ps_add tmp5, tmp2, tmp4 + ps_sub tmp6, tmp2, tmp4 + ps_merge10 tmp5, tmp5, tmp5 + psq_stu tmp3, 8(ws), 0, 0 + ps_merge10 tmp0, tmp0, tmp0 + psq_stu tmp6, 8(ws), 0, 0 + psq_stu tmp5, 8(ws), 0, 0 + or itmp0, itmp0, itmp3 + psq_stu tmp0, 8(ws), 0, 0 + bdnz _loopHead1 + + _loopEnd: + + } + // clang-format on + } + + ws = &__THPIDCTWorkspace[0]; + + { + register THPSample *obase = Gbase; + register u32 wid = Gwid; + + register u32 itmp0, off0, off1; + register THPSample *out0, *out1; + + // clang-format off + asm { + psq_l tmp10, 8*0*sizeof(f32)(ws), 0, 0 + slwi off0, wid, 3; + psq_l tmp11, 8*4*sizeof(f32)(ws), 0, 0 + slwi xPos, xPos, 2 + psq_l tmp12, 8*2*sizeof(f32)(ws), 0, 0 + slwi off1, wid, 2 + ps_add tmp6, tmp10, tmp11 + add off0, off0, xPos + psq_l tmp13, 8*6*sizeof(f32)(ws), 0, 0 + ps_sub tmp8, tmp10, tmp11 + add off1, off0, off1 + ps_add tmp6, tmp6, bias + li itmp0, 3 + ps_add tmp7, tmp12, tmp13 + add out0, obase, off0 + ps_sub tmp9, tmp12, tmp13 + ps_add tmp0, tmp6, tmp7 + add out1, obase, off1 + ps_add tmp8, tmp8, bias + mtctr itmp0 + + _loopHead10: + psq_l tmp4, 8*1*sizeof(f32)(ws), 0, 0 + ps_msub tmp9, tmp9, cc4, tmp7 + psq_l tmp5, 8*3*sizeof(f32)(ws), 0, 0 + ps_sub tmp3, tmp6, tmp7 + ps_add tmp1, tmp8, tmp9 + psq_l tmp6, 8*5*sizeof(f32)(ws), 0, 0 + ps_sub tmp2, tmp8, tmp9 + psq_l tmp7, 8*7*sizeof(f32)(ws), 0, 0 + ps_add tmp8, tmp6, tmp5 + ps_sub tmp6, tmp6, tmp5 + addi ws, ws, 2*sizeof(f32) + ps_add tmp9, tmp4, tmp7 + ps_sub tmp4, tmp4, tmp7 + psq_l tmp10, 8*0*sizeof(f32)(ws), 0, 0 + ps_add tmp7, tmp9, tmp8 + ps_sub tmp5, tmp9, tmp8 + ps_add tmp8, tmp6, tmp4 + psq_l tmp11, 8*4*sizeof(f32)(ws), 0, 0 + ps_add tmp9, tmp0, tmp7 + ps_mul tmp8, tmp8, cc2 + psq_l tmp12, 8*2*sizeof(f32)(ws), 0, 0 + ps_sub tmp23, tmp0, tmp7 + ps_madd tmp6, tmp6, cc2c6a, tmp8 + psq_l tmp13, 8*6*sizeof(f32)(ws), 0, 0 + ps_sub tmp6, tmp6, tmp7 + addi off0, off0, 2*sizeof(THPSample) + psq_st tmp9, 0(out0), 0, 6 + ps_msub tmp4, tmp4, cc2c6s, tmp8 + ps_add tmp9, tmp1, tmp6 + ps_msub tmp5, tmp5, cc4, tmp6 + ps_sub tmp22, tmp1, tmp6 + psq_st tmp9, 8(out0), 0, 6 + ps_add tmp8, tmp2, tmp5 + ps_add tmp4, tmp4, tmp5 + psq_st tmp8, 16(out0), 0, 6 + addi off1, off1, 2*sizeof(THPSample) + ps_sub tmp9, tmp3, tmp4 + ps_add tmp20, tmp3, tmp4 + psq_st tmp9, 24(out0), 0, 6 + ps_sub tmp21, tmp2, tmp5 + ps_add tmp6, tmp10, tmp11 + psq_st tmp20, 0(out1), 0, 6 + ps_sub tmp8, tmp10, tmp11 + ps_add tmp6, tmp6, bias + psq_st tmp21, 8(out1), 0, 6 + ps_add tmp7, tmp12, tmp13 + ps_sub tmp9, tmp12, tmp13 + psq_st tmp22, 16(out1), 0, 6 + add out0, obase, off0 + ps_add tmp0, tmp6, tmp7 + psq_st tmp23, 24(out1), 0, 6 + ps_add tmp8, tmp8, bias + add out1, obase, off1 + + bdnz _loopHead10 + psq_l tmp4, 8*1*sizeof(f32)(ws), 0, 0 + ps_msub tmp9, tmp9, cc4, tmp7 + psq_l tmp5, 8*3*sizeof(f32)(ws), 0, 0 + ps_sub tmp3, tmp6, tmp7 + ps_add tmp1, tmp8, tmp9 + psq_l tmp6, 8*5*sizeof(f32)(ws), 0, 0 + ps_sub tmp2, tmp8, tmp9 + psq_l tmp7, 8*7*sizeof(f32)(ws), 0, 0 + ps_add tmp8, tmp6, tmp5 + ps_sub tmp6, tmp6, tmp5 + ps_add tmp9, tmp4, tmp7 + ps_sub tmp4, tmp4, tmp7 + ps_add tmp7, tmp9, tmp8 + ps_sub tmp5, tmp9, tmp8 + ps_add tmp8, tmp6, tmp4 + ps_add tmp9, tmp0, tmp7 + ps_mul tmp8, tmp8, cc2 + ps_sub tmp23, tmp0, tmp7 + ps_madd tmp6, tmp6, cc2c6a, tmp8 + psq_st tmp9, 0(out0), 0, 6 + ps_sub tmp6, tmp6, tmp7 + ps_msub tmp4, tmp4, cc2c6s, tmp8 + psq_st tmp23, 24(out1), 0, 6 + ps_add tmp9, tmp1, tmp6 + ps_msub tmp5, tmp5, cc4, tmp6 + ps_sub tmp22, tmp1, tmp6 + psq_st tmp9, 8(out0), 0, 6 + ps_add tmp8, tmp2, tmp5 + ps_add tmp4, tmp4, tmp5 + psq_st tmp8, 16(out0), 0, 6 + ps_sub tmp9, tmp3, tmp4 + psq_st tmp22, 16(out1), 0, 6 + ps_add tmp20, tmp3, tmp4 + psq_st tmp9, 24(out0), 0, 6 + ps_sub tmp21, tmp2, tmp5 + psq_st tmp20, 0(out1), 0, 6 + psq_st tmp21, 8(out1), 0, 6 + + } + // clang-format on + } +} + +static void __THPDecompressiMCURow512x448(void) +{ + u8 cl_num; + u32 x_pos; + THPComponent *comp; + + LCQueueWait(3); + + for (cl_num = 0; cl_num < __THPInfo->MCUsPerRow; cl_num++) { + __THPHuffDecodeDCTCompY(__THPInfo, __THPMCUBuffer[0]); + __THPHuffDecodeDCTCompY(__THPInfo, __THPMCUBuffer[1]); + __THPHuffDecodeDCTCompY(__THPInfo, __THPMCUBuffer[2]); + __THPHuffDecodeDCTCompY(__THPInfo, __THPMCUBuffer[3]); + __THPHuffDecodeDCTCompU(__THPInfo, __THPMCUBuffer[4]); + __THPHuffDecodeDCTCompV(__THPInfo, __THPMCUBuffer[5]); + + comp = &__THPInfo->components[0]; + Gbase = __THPLCWork512[0]; + Gwid = 512; + Gq = __THPInfo->quantTabs[comp->quantizationTableSelector]; + x_pos = (u32)(cl_num * 16); + __THPInverseDCTNoYPos(__THPMCUBuffer[0], x_pos); + __THPInverseDCTNoYPos(__THPMCUBuffer[1], x_pos + 8); + __THPInverseDCTY8(__THPMCUBuffer[2], x_pos); + __THPInverseDCTY8(__THPMCUBuffer[3], x_pos + 8); + + comp = &__THPInfo->components[1]; + Gbase = __THPLCWork512[1]; + Gwid = 256; + Gq = __THPInfo->quantTabs[comp->quantizationTableSelector]; + x_pos /= 2; + __THPInverseDCTNoYPos(__THPMCUBuffer[4], x_pos); + comp = &__THPInfo->components[2]; + Gbase = __THPLCWork512[2]; + Gq = __THPInfo->quantTabs[comp->quantizationTableSelector]; + __THPInverseDCTNoYPos(__THPMCUBuffer[5], x_pos); + + if (__THPInfo->RST != 0) { + if ((--__THPInfo->currMCU) == 0) { + __THPInfo->currMCU = __THPInfo->nMCU; + __THPInfo->cnt = 1 + ((__THPInfo->cnt + 6) & 0xFFFFFFF8); + + if (__THPInfo->cnt > 33) { + __THPInfo->cnt = 33; + } + + __THPInfo->components[0].predDC = 0; + __THPInfo->components[1].predDC = 0; + __THPInfo->components[2].predDC = 0; + } + } + } + + LCStoreData(__THPInfo->dLC[0], __THPLCWork512[0], 0x2000); + LCStoreData(__THPInfo->dLC[1], __THPLCWork512[1], 0x800); + LCStoreData(__THPInfo->dLC[2], __THPLCWork512[2], 0x800); + + __THPInfo->dLC[0] += 0x2000; + __THPInfo->dLC[1] += 0x800; + __THPInfo->dLC[2] += 0x800; +} + +inline s32 __THPHuffDecodeTab(register THPFileInfo *info, register THPHuffmanTab *h) +{ + register s32 code; + register u32 cnt; + register s32 cb; + register u32 increment; + register s32 tmp; + + // clang-format off + asm + { + lwz cnt, info->cnt; + addi increment, h, 32; + lwz cb, info->currByte; + addi code, cnt, 4; + cmpwi cnt, 28; + rlwnm tmp, cb, code, 27, 31; + bgt _notEnoughBits; + lbzx code, h, tmp; + lbzx increment, increment, tmp; + cmpwi code, 0xFF; + beq _FailedCheckEnoughBits; + add cnt, cnt, increment; + stw cnt, info->cnt; + } + // clang-format on +_done: + return code; + + { + register u32 maxcodebase; + register u32 tmp2; + + _FailedCheckEnoughBits: + maxcodebase = (u32) & (h->maxCode); + cnt += 5; + + // clang-format off + asm { + li tmp2, sizeof(s32)*(5); + li code, 5; + add maxcodebase, maxcodebase, tmp2; + __WHILE_START: + cmpwi cnt, 33; + slwi tmp, tmp, 1 + + beq _FCEB_faster; + rlwnm increment, cb, cnt, 31, 31; + lwzu tmp2, 4(maxcodebase); + or tmp, tmp, increment + addi cnt, cnt, 1; + b __WHILE_CHECK; + + _FCEB_faster: + lwz increment, info->c; + li cnt, 1; + lwzu cb, 4(increment); + lwzu tmp2, 4(maxcodebase); + + stw increment, info->c; + rlwimi tmp, cb, 1,31,31; + stw cb, info->currByte; + b __FL_WHILE_CHECK; + + __FL_WHILE_START: + slwi tmp, tmp, 1; + rlwnm increment, cb, cnt, 31, 31; + lwzu tmp2, 4(maxcodebase); + or tmp, tmp, increment; + + __FL_WHILE_CHECK: + cmpw tmp,tmp2 + addi cnt, cnt, 1; + addi code, code, 1 + bgt __FL_WHILE_START; + b _FCEB_Done; + + __WHILE_CHECK: + cmpw tmp,tmp2 + addi code, code, 1 + bgt __WHILE_START; + } + // clang-format on + } +_FCEB_Done: + info->cnt = cnt; + return (h->Vij[(s32)(tmp + h->valPtr[code])]); + + // clang-format off + asm + { + _notEnoughBits: + cmpwi cnt, 33; + lwz tmp, info->c; + beq _getfullword; + + cmpwi cnt, 32; + rlwnm code, cb, code, 27, 31 + beq _1bitleft; + + lbzx tmp, h, code; + lbzx increment, increment, code; + cmpwi tmp, 0xFF; + add code, cnt, increment; + beq _FailedCheckNoBits0; + + cmpwi code, 33; + stw code, info->cnt; + bgt _FailedCheckNoBits1; + } + // clang-format on + return tmp; + + // clang-format off + asm + { + _1bitleft: + lwzu cb, 4(tmp); + + stw tmp, info->c; + rlwimi code, cb, 4, 28, 31; + lbzx tmp, h, code; + lbzx increment, increment, code + stw cb, info->currByte; + cmpwi tmp, 0xFF + stw increment, info->cnt; + beq _Read4; + + } + // clang-format on + return tmp; + +_Read4 : { + register u32 maxcodebase = (u32) & (h->maxCode); + register u32 tmp2; + + // clang-format off + asm + { + li cnt, sizeof(s32)*5; + add maxcodebase, maxcodebase, cnt; + + slwi tmp, code, 32-5; + li cnt,5; + rlwimi tmp, cb, 32-1, 1,31; + + __DR4_WHILE_START: + + subfic cb, cnt, 31; + lwzu tmp2, 4(maxcodebase); + srw code, tmp, cb; + __DR4_WHILE_CHECK: + cmpw code, tmp2 + addi cnt, cnt, 1 + bgt __DR4_WHILE_START; + + } + // clang-format on +} + + info->cnt = cnt; +__CODE_PLUS_VP_CNT: + return (h->Vij[(s32)(code + h->valPtr[cnt])]); + +_getfullword: + // clang-format off + asm + { + lwzu cb, 4(tmp); + + rlwinm code, cb, 5, 27, 31 + stw tmp, info->c; + lbzx cnt, h, code; + lbzx increment, increment, code; + cmpwi cnt, 0xFF + stw cb, info->currByte; + addi increment, increment, 1 + beq _FailedCheckEnoughbits_Updated; + + stw increment, info->cnt; + } + // clang-format on + return (s32)cnt; + +_FailedCheckEnoughbits_Updated: + + cnt = 5; + do { + // clang-format off + asm + { + subfic tmp, cnt, 31; + addi cnt, cnt, 1; + srw code, cb, tmp; + } + // clang-format on + } while (code > h->maxCode[cnt]); + + info->cnt = cnt + 1; + goto __CODE_PLUS_VP_CNT; + +_FailedCheckNoBits0: +_FailedCheckNoBits1 : + +{ + register u32 mask = 0xFFFFFFFF << (33 - cnt); + register u32 tmp2; + + code = (s32)(cb & (~mask)); + mask = (u32) & (h->maxCode); + + // clang-format off + asm + { + lwz tmp, info->c; + subfic tmp2, cnt, 33; + addi cnt, tmp2, 1; + slwi tmp2, tmp2, 2; + lwzu cb, 4(tmp); + add mask,mask, tmp2; + stw tmp, info->c; + slwi code, code, 1; + stw cb, info->currByte; + rlwimi code, cb, 1, 31, 31; + lwzu tmp2, 4(mask); + li tmp, 2; + b __FCNB1_WHILE_CHECK; + + __FCNB1_WHILE_START: + slwi code, code, 1; + + addi cnt, cnt, 1; + lwzu tmp2, 4(mask); + add code, code, increment; + addi tmp, tmp, 1; + + __FCNB1_WHILE_CHECK: + cmpw code, tmp2; + rlwnm increment, cb, tmp, 31, 31; + bgt __FCNB1_WHILE_START; + + } + // clang-format on +} + + info->cnt = (u32)tmp; + return (h->Vij[(s32)(code + h->valPtr[cnt])]); +} + +static void __THPDecompressiMCURow640x480(void) +{ + u8 cl_num; + u32 x_pos; + THPComponent *comp; + + LCQueueWait(3); + + { + for (cl_num = 0; cl_num < __THPInfo->MCUsPerRow; cl_num++) { + THPFileInfo *um = __THPInfo; + __THPHuffDecodeDCTCompY(um, __THPMCUBuffer[0]); + __THPHuffDecodeDCTCompY(__THPInfo, __THPMCUBuffer[1]); + __THPHuffDecodeDCTCompY(__THPInfo, __THPMCUBuffer[2]); + __THPHuffDecodeDCTCompY(__THPInfo, __THPMCUBuffer[3]); + __THPHuffDecodeDCTCompU(__THPInfo, __THPMCUBuffer[4]); + __THPHuffDecodeDCTCompV(__THPInfo, __THPMCUBuffer[5]); + + comp = &__THPInfo->components[0]; + Gbase = __THPLCWork640[0]; + Gwid = 640; + Gq = __THPInfo->quantTabs[comp->quantizationTableSelector]; + x_pos = (u32)(cl_num * 16); + __THPInverseDCTNoYPos(__THPMCUBuffer[0], x_pos); + __THPInverseDCTNoYPos(__THPMCUBuffer[1], x_pos + 8); + __THPInverseDCTY8(__THPMCUBuffer[2], x_pos); + __THPInverseDCTY8(__THPMCUBuffer[3], x_pos + 8); + + comp = &__THPInfo->components[1]; + Gbase = __THPLCWork640[1]; + Gwid = 320; + Gq = __THPInfo->quantTabs[comp->quantizationTableSelector]; + x_pos /= 2; + __THPInverseDCTNoYPos(__THPMCUBuffer[4], x_pos); + + comp = &__THPInfo->components[2]; + Gbase = __THPLCWork640[2]; + Gq = __THPInfo->quantTabs[comp->quantizationTableSelector]; + __THPInverseDCTNoYPos(__THPMCUBuffer[5], x_pos); + + if (__THPInfo->RST != 0) { + __THPInfo->currMCU--; + if (__THPInfo->currMCU == 0) { + __THPInfo->currMCU = __THPInfo->nMCU; + + __THPInfo->cnt = 1 + ((__THPInfo->cnt + 6) & 0xFFFFFFF8); + + if (__THPInfo->cnt > 32) { + __THPInfo->cnt = 33; + } + + __THPInfo->components[0].predDC = 0; + __THPInfo->components[1].predDC = 0; + __THPInfo->components[2].predDC = 0; + } + } + } + } + + LCStoreData(__THPInfo->dLC[0], __THPLCWork640[0], 0x2800); + LCStoreData(__THPInfo->dLC[1], __THPLCWork640[1], 0xA00); + LCStoreData(__THPInfo->dLC[2], __THPLCWork640[2], 0xA00); + + __THPInfo->dLC[0] += 0x2800; + __THPInfo->dLC[1] += 0xA00; + __THPInfo->dLC[2] += 0xA00; +} + +static void __THPDecompressiMCURowNxN(void) +{ + u8 cl_num; + u32 x_pos, x; + THPComponent *comp; + + x = __THPInfo->xPixelSize; + + LCQueueWait(3); + + for (cl_num = 0; cl_num < __THPInfo->MCUsPerRow; cl_num++) { + __THPHuffDecodeDCTCompY(__THPInfo, __THPMCUBuffer[0]); + __THPHuffDecodeDCTCompY(__THPInfo, __THPMCUBuffer[1]); + __THPHuffDecodeDCTCompY(__THPInfo, __THPMCUBuffer[2]); + __THPHuffDecodeDCTCompY(__THPInfo, __THPMCUBuffer[3]); + __THPHuffDecodeDCTCompU(__THPInfo, __THPMCUBuffer[4]); + __THPHuffDecodeDCTCompV(__THPInfo, __THPMCUBuffer[5]); + + comp = &__THPInfo->components[0]; + Gbase = __THPLCWork640[0]; + Gwid = x; + Gq = __THPInfo->quantTabs[comp->quantizationTableSelector]; + x_pos = (u32)(cl_num * 16); + __THPInverseDCTNoYPos(__THPMCUBuffer[0], x_pos); + __THPInverseDCTNoYPos(__THPMCUBuffer[1], x_pos + 8); + __THPInverseDCTY8(__THPMCUBuffer[2], x_pos); + __THPInverseDCTY8(__THPMCUBuffer[3], x_pos + 8); + + comp = &__THPInfo->components[1]; + Gbase = __THPLCWork640[1]; + Gwid = x / 2; + Gq = __THPInfo->quantTabs[comp->quantizationTableSelector]; + x_pos /= 2; + __THPInverseDCTNoYPos(__THPMCUBuffer[4], x_pos); + + comp = &__THPInfo->components[2]; + Gbase = __THPLCWork640[2]; + Gq = __THPInfo->quantTabs[comp->quantizationTableSelector]; + __THPInverseDCTNoYPos(__THPMCUBuffer[5], x_pos); + + if (__THPInfo->RST != 0) { + __THPInfo->currMCU--; + if (__THPInfo->currMCU == 0) { + __THPInfo->currMCU = __THPInfo->nMCU; + __THPInfo->cnt = 1 + ((__THPInfo->cnt + 6) & 0xFFFFFFF8); + + if (__THPInfo->cnt > 32) { + __THPInfo->cnt = 33; + } + + __THPInfo->components[0].predDC = 0; + __THPInfo->components[1].predDC = 0; + __THPInfo->components[2].predDC = 0; + } + } + } + + LCStoreData(__THPInfo->dLC[0], __THPLCWork640[0], ((4 * sizeof(u8) * 64) * (x / 16))); + LCStoreData(__THPInfo->dLC[1], __THPLCWork640[1], ((sizeof(u8) * 64) * (x / 16))); + LCStoreData(__THPInfo->dLC[2], __THPLCWork640[2], ((sizeof(u8) * 64) * (x / 16))); + __THPInfo->dLC[0] += ((4 * sizeof(u8) * 64) * (x / 16)); + __THPInfo->dLC[1] += ((sizeof(u8) * 64) * (x / 16)); + __THPInfo->dLC[2] += ((sizeof(u8) * 64) * (x / 16)); +} + +static void __THPHuffDecodeDCTCompY(register THPFileInfo *info, THPCoeff *block) +{ + { + register s32 t; + THPCoeff dc; + register THPCoeff diff; + + __dcbz((void *)block, 0); + t = __THPHuffDecodeTab(info, Ydchuff); + __dcbz((void *)block, 32); + diff = 0; + __dcbz((void *)block, 64); + + if (t) { + { + register s32 v; + register u32 cb; + register u32 cnt; + register u32 code; + register u32 tmp; + register u32 cnt1; + register u32 tmp1; + // clang-format off + asm { + lwz cnt,info->cnt; + subfic code,cnt,33; + lwz cb,info->currByte; + + subfc. tmp, code, t; + subi cnt1,cnt,1; + + bgt _notEnoughBitsDIFF; + add v,cnt,t; + + slw cnt,cb,cnt1; + stw v,info->cnt; + subfic v,t,32; + srw diff,cnt,v; + } + // clang-format on + + // clang-format off + asm + { + b _DoneDIFF; + _notEnoughBitsDIFF: + lwz tmp1, info->c; + slw v, cb, cnt1; + lwzu cb, 4(tmp1); + addi tmp, tmp, 1; + stw cb, info->currByte; + srw cb, cb, code; + stw tmp1, info->c; + add v, cb, v; + stw tmp, info->cnt; + subfic tmp, t, 32; + srw diff, v, tmp; + _DoneDIFF: + } + // clang-format on + } + + if (__cntlzw((u32)diff) > 32 - t) { + diff += ((0xFFFFFFFF << t) + 1); + } + }; + + __dcbz((void *)block, 96); + dc = (s16)(info->components[0].predDC + diff); + block[0] = info->components[0].predDC = dc; + } + + { + register s32 k; + register s32 code; + register u32 cnt; + register u32 cb; + register u32 increment; + register s32 tmp; + register THPHuffmanTab *h = Yachuff; + + // clang-format off + asm + { + lwz cnt, info->cnt; + addi increment, h, 32; + lwz cb, info->currByte; + } + // clang-format on + + for (k = 1; k < 64; k++) + { + register s32 ssss; + register s32 rrrr; + + // clang-format off + asm { + addi code, cnt, 4; + cmpwi cnt, 28; + rlwnm tmp, cb, code, 27, 31; + bgt _notEnoughBits; + + lbzx ssss, h, tmp; + lbzx code, increment, tmp; + cmpwi ssss, 0xFF; + + beq _FailedCheckEnoughBits; + add cnt, cnt, code; + b _DoneDecodeTab; + } + // clang-format on + + { + register u32 maxcodebase; + register u32 tmp2; + + _FailedCheckEnoughBits: + cnt += 5; + maxcodebase = (u32) & (h->maxCode); + // clang-format off + asm { + li tmp2, sizeof(s32)*(5); + li code, 5; + add maxcodebase, maxcodebase, tmp2; + __WHILE_START: + cmpwi cnt, 33; + slwi tmp, tmp, 1 + + beq _FCEB_faster; + rlwnm ssss, cb, cnt, 31, 31; + lwzu tmp2, 4(maxcodebase); + or tmp, tmp, ssss + addi cnt, cnt, 1; + b __WHILE_CHECK; + + _FCEB_faster: + lwz ssss, info->c; + li cnt, 1; + lwzu cb, 4(ssss); + + lwzu tmp2, 4(maxcodebase); + + stw ssss, info->c; + rlwimi tmp, cb, 1,31,31; + b __FL_WHILE_CHECK; + + __FL_WHILE_START: + slwi tmp, tmp, 1; + + rlwnm ssss, cb, cnt, 31, 31; + lwzu tmp2, 4(maxcodebase); + or tmp, tmp, ssss; + + __FL_WHILE_CHECK: + cmpw tmp,tmp2 + addi cnt, cnt, 1; + addi code, code, 1 + bgt __FL_WHILE_START; + b _FCEB_Done; + + __WHILE_CHECK: + cmpw tmp,tmp2 + addi code, code, 1 + bgt __WHILE_START; + } + // clang-format on + } + _FCEB_Done: + ssss = (h->Vij[(s32)(tmp + h->valPtr[code])]); + goto _DoneDecodeTab; + + _notEnoughBits: + // clang-format off + asm + { + cmpwi cnt, 33; + lwz tmp, info->c; + beq _getfullword; + + cmpwi cnt, 32; + rlwnm code, cb, code, 27, 31 + beq _1bitleft; + + lbzx ssss, h, code; + lbzx rrrr, increment, code; + cmpwi ssss, 0xFF; + add code, cnt, rrrr; + beq _FailedCheckNoBits0; + + cmpwi code, 33; + bgt _FailedCheckNoBits1; + } + // clang-format on + cnt = (u32)code; + goto _DoneDecodeTab; + + _getfullword : { + // clang-format off + asm + { + lwzu cb, 4(tmp); + rlwinm code, cb, 5, 27, 31 + stw tmp, info->c; + lbzx ssss, h, code; + lbzx tmp, increment, code; + cmpwi ssss, 0xFF + addi cnt, tmp, 1 + beq _FailedCheckEnoughbits_Updated; + } + // clang-format on + } + goto _DoneDecodeTab; + + _FailedCheckEnoughbits_Updated: + ssss = 5; + do { + // clang-format off + asm + { + subfic tmp, ssss, 31; + addi ssss, ssss, 1; + srw code, cb, tmp; + } + // clang-format on + } while (code > h->maxCode[ssss]); + + cnt = (u32)(ssss + 1); + ssss = (h->Vij[(s32)(code + h->valPtr[ssss])]); + + goto _DoneDecodeTab; + + _1bitleft: + // clang-format off + asm { + lwzu cb, 4(tmp); + + stw tmp, info->c; + rlwimi code, cb, 4, 28, 31; + lbzx ssss, h, code; + lbzx cnt, increment, code + cmpwi ssss, 0xFF + beq _Read4; + + } + // clang-format on + + goto _DoneDecodeTab; + + _Read4 : { + register u32 maxcodebase = (u32) & (h->maxCode); + register u32 tmp2; + + // clang-format off + asm { + li cnt, sizeof(s32)*5; + add maxcodebase, maxcodebase, cnt; + + slwi tmp, code, 32-5; + li cnt,5; + rlwimi tmp, cb, 32-1, 1,31; + + __DR4_WHILE_START: + + subfic ssss, cnt, 31; + lwzu tmp2, 4(maxcodebase); + srw code, tmp, ssss; + __DR4_WHILE_CHECK: + cmpw code, tmp2 + addi cnt, cnt, 1 + bgt __DR4_WHILE_START; + + } + // clang-format on + } + ssss = (h->Vij[(s32)(code + h->valPtr[cnt])]); + goto _DoneDecodeTab; + + _FailedCheckNoBits0: + _FailedCheckNoBits1: + _REALFAILEDCHECKNOBITS : { + register u32 mask = 0xFFFFFFFF << (33 - cnt); + register u32 tmp2; + register u32 tmp3; + code = (s32)(cb & (~mask)); + mask = (u32) & (h->maxCode); + + // clang-format off + asm { + lwz tmp, info->c; + subfic tmp2, cnt, 33; + addi tmp3, tmp2, 1; + slwi tmp2, tmp2, 2; + lwzu cb, 4(tmp); + add mask,mask, tmp2; + stw tmp, info->c; + slwi code, code, 1; + rlwimi code, cb, 1, 31, 31; + lwzu tmp2, 4(mask); + li cnt, 2; + b __FCNB1_WHILE_CHECK; + + __FCNB1_WHILE_START: + slwi code, code, 1; + + addi tmp3, tmp3, 1; + lwzu tmp2, 4(mask); + add code, code, rrrr; + addi cnt, cnt, 1; + + __FCNB1_WHILE_CHECK: + cmpw code, tmp2; + rlwnm rrrr, cb, cnt, 31, 31; + bgt __FCNB1_WHILE_START; + + } + // clang-format on + ssss = (h->Vij[(s32)(code + h->valPtr[tmp3])]); + } + + goto _DoneDecodeTab; + + _DoneDecodeTab: + // clang-format off + asm { + andi. rrrr, ssss, 15; + srawi ssss, ssss, 4; + beq _RECV_SSSS_ZERO; + } + // clang-format on + + { + k += ssss; + { + register s32 v; + register u32 cnt1; + register u32 tmp1; + // clang-format off + asm + { + subfic code,cnt,33; + subfc. tmp, code, rrrr; + subi cnt1,cnt,1; + bgt _RECVnotEnoughBits; + add cnt,cnt,rrrr; + slw tmp1,cb,cnt1; + subfic v,rrrr,32; + srw ssss,tmp1,v; + } + // clang-format on + // clang-format off + asm + { + b _RECVDone; + _RECVnotEnoughBits: + lwz tmp1, info->c; + slw v, cb, cnt1; + lwzu cb, 4(tmp1); + addi cnt, tmp, 1; + stw tmp1, info->c; + srw tmp1, cb, code; + + add v, tmp1, v; + subfic tmp, rrrr, 32; + srw ssss, v, tmp; + _RECVDone: + } + // clang-format on + } + + if (__cntlzw((u32)ssss) > 32 - rrrr) { + ssss += ((0xFFFFFFFF << rrrr) + 1); + } + + block[__THPJpegNaturalOrder[k]] = (s16)ssss; + goto _RECV_END; + } + + { + _RECV_SSSS_ZERO: + if (ssss != 15) { + break; + } + + k += 15; + }; + + // clang-format off + asm + { + _RECV_END: + } + // clang-format on + } + info->cnt = cnt; + info->currByte = cb; + } +} + +static void __THPHuffDecodeDCTCompU(register THPFileInfo *info, THPCoeff *block) +{ + register s32 t; + register THPCoeff diff; + THPCoeff dc; + register s32 v; + register u32 cb; + register u32 cnt; + register u32 cnt33; + register u32 tmp; + register u32 cnt1; + register u32 tmp1; + register s32 k; + register s32 ssss; + register s32 rrrr; + + __dcbz((void *)block, 0); + t = __THPHuffDecodeTab(info, Udchuff); + __dcbz((void *)block, 32); + diff = 0; + __dcbz((void *)block, 64); + + if (t) { + // clang-format off + asm + { + lwz cnt,info->cnt; + subfic cnt33,cnt,33; + lwz cb,info->currByte; + subfc. tmp, cnt33, t; + subi cnt1,cnt,1; + bgt _notEnoughBitsDIFF; + add v,cnt,t; + slw cnt,cb,cnt1; + stw v,info->cnt; + subfic v,t,32; + srw diff,cnt,v; + } + // clang-format on + + // clang-format off + asm + { + b _DoneDIFF; + _notEnoughBitsDIFF: + lwz tmp1, info->c; + slw v, cb, cnt1; + lwzu cb, 4(tmp1); + addi tmp, tmp, 1; + stw cb, info->currByte; + srw cb, cb, cnt33; + stw tmp1, info->c; + add v, cb, v; + stw tmp, info->cnt; + subfic tmp, t, 32; + srw diff, v, tmp; + _DoneDIFF: + } + // clang-format on + + if (__cntlzw((u32)diff) > 32 - t) { + diff += ((0xFFFFFFFF << t) + 1); + } + } + + __dcbz((void *)block, 96); + dc = (s16)(info->components[1].predDC + diff); + block[0] = info->components[1].predDC = dc; + + for (k = 1; k < 64; k++) { + ssss = __THPHuffDecodeTab(info, Uachuff); + rrrr = ssss >> 4; + ssss &= 15; + + if (ssss) { + k += rrrr; + // clang-format off + asm + { + lwz cnt,info->cnt; + subfic cnt33,cnt,33; + lwz cb,info->currByte; + subf. tmp, cnt33, ssss; + subi cnt1,cnt,1; + bgt _notEnoughBits; + add v,cnt,ssss; + slw cnt,cb,cnt1; + stw v,info->cnt; + subfic v,ssss,32; + srw rrrr,cnt,v; + } + // clang-format on + + // clang-format off + asm + { + b _Done; + _notEnoughBits: + lwz tmp1, info->c; + slw v, cb, cnt1; + lwzu cb, 4(tmp1); + addi tmp, tmp, 1; + stw cb, info->currByte; + srw cb, cb, cnt33; + stw tmp1, info->c; + add v, cb, v; + stw tmp, info->cnt; + subfic tmp, ssss, 32; + srw rrrr, v, tmp; + _Done: + } + // clang-format on + + if (__cntlzw((u32)rrrr) > 32 - ssss) { + rrrr += ((0xFFFFFFFF << ssss) + 1); + } + + block[__THPJpegNaturalOrder[k]] = (s16)rrrr; + } + + else { + if (rrrr != 15) + break; + k += 15; + } + } +} + +static void __THPHuffDecodeDCTCompV(register THPFileInfo *info, THPCoeff *block) +{ + register s32 t; + register THPCoeff diff; + THPCoeff dc; + register s32 v; + register u32 cb; + register u32 cnt; + register u32 cnt33; + register u32 tmp; + register u32 cnt1; + register u32 tmp1; + register s32 k; + register s32 ssss; + register s32 rrrr; + + __dcbz((void *)block, 0); + t = __THPHuffDecodeTab(info, Vdchuff); + __dcbz((void *)block, 32); + diff = 0; + __dcbz((void *)block, 64); + + if (t) { + // clang-format off + asm + { + lwz cnt,info->cnt; + subfic cnt33,cnt,33; + lwz cb,info->currByte; + subf. tmp, cnt33, t; + subi cnt1,cnt,1; + bgt _notEnoughBitsDIFF; + add v,cnt,t; + slw cnt,cb,cnt1; + stw v,info->cnt; + subfic v,t,32; + srw diff,cnt,v; + } + // clang-format on + + // clang-format off + asm + { + b _DoneDIFF; + _notEnoughBitsDIFF: + lwz tmp1, info->c; + slw v, cb, cnt1; + lwzu cb, 4(tmp1); + addi tmp, tmp, 1; + stw cb, info->currByte; + srw cb, cb, cnt33; + stw tmp1, info->c; + add v, cb, v; + stw tmp, info->cnt; + subfic tmp, t, 32; + srw diff, v, tmp; + _DoneDIFF: + } + // clang-format on + + if (__cntlzw((u32)diff) > 32 - t) { + diff += ((0xFFFFFFFF << t) + 1); + } + } + + __dcbz((void *)block, 96); + + dc = (s16)(info->components[2].predDC + diff); + block[0] = info->components[2].predDC = dc; + + for (k = 1; k < 64; k++) { + ssss = __THPHuffDecodeTab(info, Vachuff); + rrrr = ssss >> 4; + ssss &= 15; + + if (ssss) { + k += rrrr; + + // clang-format off + asm + { + lwz cnt,info->cnt; + subfic cnt33,cnt,33; + lwz cb,info->currByte; + + subf. tmp, cnt33, ssss; + subi cnt1,cnt,1; + + bgt _notEnoughBits; + add v,cnt,ssss; + + slw cnt,cb,cnt1; + stw v,info->cnt; + subfic v,ssss,32; + srw rrrr,cnt,v; + } + // clang-format on + + // clang-format off + asm + { + b _Done; + _notEnoughBits: + lwz tmp1, info->c; + slw v, cb, cnt1; + lwzu cb, 4(tmp1); + addi tmp, tmp, 1; + stw cb, info->currByte; + srw cb, cb, cnt33; + stw tmp1, info->c; + add v, cb, v; + stw tmp, info->cnt; + subfic tmp, ssss, 32; + srw rrrr, v, tmp; + _Done: + } + // clang-format on + + if (__cntlzw((u32)rrrr) > 32 - ssss) { + rrrr += ((0xFFFFFFFF << ssss) + 1); + } + + block[__THPJpegNaturalOrder[k]] = (s16)rrrr; + } + else { + if (rrrr != 15) + break; + k += 15; + } + } +} + +BOOL THPInit(void) +{ + u8 *base; + base = (u8 *)(0xE000 << 16); + + __THPLCWork512[0] = base; + base += 0x2000; + __THPLCWork512[1] = base; + base += 0x800; + __THPLCWork512[2] = base; + base += 0x200; + + base = (u8 *)(0xE000 << 16); + __THPLCWork640[0] = base; + base += 0x2800; + __THPLCWork640[1] = base; + base += 0xA00; + __THPLCWork640[2] = base; + base += 0xA00; + + OSInitFastCast(); + + __THPInitFlag = TRUE; + return TRUE; +} From 27055da9946afa73450586e703cea1823f4b78f3 Mon Sep 17 00:00:00 2001 From: dbalatoni13 Date: Tue, 12 Nov 2024 04:37:37 +0100 Subject: [PATCH 22/29] Fixed the path of thp --- src/{ => dolphin}/thp/THPAudio.c | 0 src/{ => dolphin}/thp/THPDec.c | 0 2 files changed, 0 insertions(+), 0 deletions(-) rename src/{ => dolphin}/thp/THPAudio.c (100%) rename src/{ => dolphin}/thp/THPDec.c (100%) diff --git a/src/thp/THPAudio.c b/src/dolphin/thp/THPAudio.c similarity index 100% rename from src/thp/THPAudio.c rename to src/dolphin/thp/THPAudio.c diff --git a/src/thp/THPDec.c b/src/dolphin/thp/THPDec.c similarity index 100% rename from src/thp/THPDec.c rename to src/dolphin/thp/THPDec.c From 13b6c32c8ff546787fe9659bdaf019b82f250b6e Mon Sep 17 00:00:00 2001 From: dbalatoni13 Date: Tue, 12 Nov 2024 04:39:47 +0100 Subject: [PATCH 23/29] Update the path of thp in configure.py --- configure.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/configure.py b/configure.py index a27cc629..7c6f1fe0 100644 --- a/configure.py +++ b/configure.py @@ -615,8 +615,8 @@ config.libs = [ "cflags": cflags_thp, "host": False, "objects": [ - Object(Matching, "thp/THPDec.c"), - Object(NonMatching, "thp/THPAudio.c"), + Object(Matching, "dolphin/thp/THPDec.c"), + Object(NonMatching, "dolphin/thp/THPAudio.c"), ], }, { From 393303dca7dc131b1a52cbc801fa8d394bc6d738 Mon Sep 17 00:00:00 2001 From: dbalatoni13 Date: Tue, 12 Nov 2024 04:48:22 +0100 Subject: [PATCH 24/29] Fixed dolphin/DEMOPuts.c --- configure.py | 2 +- src/dolphin/demo/DEMOPuts.c | 30 +++++++++++++++--------------- 2 files changed, 16 insertions(+), 16 deletions(-) diff --git a/configure.py b/configure.py index 7c6f1fe0..5e8750df 100644 --- a/configure.py +++ b/configure.py @@ -523,7 +523,7 @@ config.libs = [ [ Object(Matching, "dolphin/demo/DEMOInit.c"), Object(Matching, "dolphin/demo/DEMOFont.c"), - Object(NonMatching, "dolphin/demo/DEMOPuts.c"), + Object(Matching, "dolphin/demo/DEMOPuts.c"), Object(Matching, "dolphin/demo/DEMOStats.c"), ], ), diff --git a/src/dolphin/demo/DEMOPuts.c b/src/dolphin/demo/DEMOPuts.c index 3b7e84bc..618152e5 100644 --- a/src/dolphin/demo/DEMOPuts.c +++ b/src/dolphin/demo/DEMOPuts.c @@ -37,22 +37,22 @@ void DEMOSetFontType(DMFontType attr) void DEMOLoadFont(enum _GXTexMapID texMap, enum _GXTexMtx texMtx, DMTexFlt texFlt) { - // float fontTMtx[3][4]; - // unsigned short width; - // unsigned short height; + float fontTMtx[3][4]; + unsigned short width; + unsigned short height; - // width = 64; - // height = 0x1800 / width; - // GXInitTexObj(&fontTexObj, (void *)DEMOFontBitmap, width, (u16)height, 0, 0, 0, 0); - // if (texFlt == 0) { - // GXInitTexObjLOD(&fontTexObj, 0, 0, 0, 0, 0, 0.0f, 0.0f, 0.0f); - // fontShift = 0; - // } - // GXLoadTexObj(&fontTexObj, texMap); - // MTXScale(fontTMtx, 1.0f / (width - fontShift), 1.0f / ((u16)height - !fontShift), 1.0f); - // GXLoadTexMtxImm(fontTMtx, texMtx, 1); - // GXSetNumTexGens(1); - // GXSetTexCoordGen(0, 1, 4, texMtx); + width = 64; + height = 0x1800 / width; + GXInitTexObj(&fontTexObj, (void *)DEMOFontBitmap, width, (u16)height, 0, 0, 0, 0); + if (texFlt == 0) { + GXInitTexObjLOD(&fontTexObj, 0, 0, 0, 0, 0, 0.0f, 0.0f, 0.0f); + fontShift = 0; + } + GXLoadTexObj(&fontTexObj, texMap); + MTXScale(fontTMtx, 1.0f / width, 1.0f / height, 1.0f); + GXLoadTexMtxImm(fontTMtx, texMtx, 1); + GXSetNumTexGens(1); + GXSetTexCoordGen(0, 1, 4, texMtx); } void DEMOSetupScrnSpc(long width, long height, float depth) From 023cd9067566efa0e968c9c6e90cabcb43856c21 Mon Sep 17 00:00:00 2001 From: dbalatoni13 Date: Tue, 12 Nov 2024 18:21:21 +0100 Subject: [PATCH 25/29] Correct the length of string symbols --- config/GMPE01_00/rels/E3setupDLL/symbols.txt | 6 +- config/GMPE01_00/rels/m404Dll/symbols.txt | 4 +- config/GMPE01_00/rels/m406Dll/symbols.txt | 4 +- config/GMPE01_00/rels/m410Dll/symbols.txt | 6 +- config/GMPE01_00/rels/m412Dll/symbols.txt | 2 +- config/GMPE01_00/rels/m420dll/symbols.txt | 2 +- config/GMPE01_00/rels/m432Dll/symbols.txt | 10 +-- config/GMPE01_00/rels/m438Dll/symbols.txt | 2 +- config/GMPE01_00/rels/m440Dll/symbols.txt | 2 +- config/GMPE01_00/rels/m442Dll/symbols.txt | 4 +- config/GMPE01_00/rels/m443Dll/symbols.txt | 2 +- config/GMPE01_00/rels/m446dll/symbols.txt | 10 +-- config/GMPE01_00/rels/m450Dll/symbols.txt | 16 ++--- config/GMPE01_00/rels/m453Dll/symbols.txt | 2 +- config/GMPE01_00/rels/mentDll/symbols.txt | 4 +- config/GMPE01_00/rels/mpexDll/symbols.txt | 10 +-- config/GMPE01_00/rels/present/symbols.txt | 6 +- config/GMPE01_00/rels/w05Dll/symbols.txt | 4 +- config/GMPE01_00/rels/w10Dll/symbols.txt | 2 +- config/GMPE01_00/rels/ztardll/symbols.txt | 2 +- config/GMPE01_00/symbols.txt | 68 +++++++++++++++----- src/REL/E3setupDLL/mgselect.c | 6 +- 22 files changed, 104 insertions(+), 70 deletions(-) diff --git a/config/GMPE01_00/rels/E3setupDLL/symbols.txt b/config/GMPE01_00/rels/E3setupDLL/symbols.txt index da0474aa..4089dcf6 100644 --- a/config/GMPE01_00/rels/E3setupDLL/symbols.txt +++ b/config/GMPE01_00/rels/E3setupDLL/symbols.txt @@ -131,11 +131,11 @@ lbl_2_data_151 = .data:0x00000151; // type:object size:0x16 data:string lbl_2_data_167 = .data:0x00000167; // type:object size:0x16 data:string lbl_2_data_17D = .data:0x0000017D; // type:object size:0x16 data:string lbl_2_data_193 = .data:0x00000193; // type:object size:0x16 data:string -lbl_2_data_1A9 = .data:0x000001A9; // type:object size:0x17 data:string +lbl_2_data_1A9 = .data:0x000001A9; // type:object size:0x16 data:string mgNameTestTbl = .data:0x000001C0; // type:object size:0x34 scope:local cursorYOfsTbl = .data:0x000001F4; // type:object size:0x14 scope:local data:float mgPicTbl = .data:0x00000208; // type:object size:0x34 scope:local -startText = .data:0x0000023C; // type:object size:0x14 scope:local data:string +startText = .data:0x0000023C; // type:object size:0x10 scope:local data:string shadowPos = .data:0x00000250; // type:object size:0xC scope:local shadowTarget = .data:0x0000025C; // type:object size:0xC scope:local shadowUp = .data:0x00000268; // type:object size:0xC scope:local @@ -148,7 +148,7 @@ lbl_2_data_31E = .data:0x0000031E; // type:object size:0x8 playerCntMessTbl = .data:0x00000328; // type:object size:0x10 scope:local charPosTbl = .data:0x00000338; // type:object size:0x40 scope:local data:float charComSfxTbl = .data:0x00000378; // type:object size:0x20 scope:local -lbl_2_data_398 = .data:0x00000398; // type:object size:0x10 scope:local data:string +lbl_2_data_398 = .data:0x00000398; // type:object size:0xF scope:local data:string charSpriteTbl = .data:0x000003A8; // type:object size:0x20 scope:local cursorSpriteTbl = .data:0x000003C8; // type:object size:0x14 scope:local hiliteSprTbl = .data:0x000003DC; // type:object size:0x14 scope:local diff --git a/config/GMPE01_00/rels/m404Dll/symbols.txt b/config/GMPE01_00/rels/m404Dll/symbols.txt index 06571197..dd934235 100644 --- a/config/GMPE01_00/rels/m404Dll/symbols.txt +++ b/config/GMPE01_00/rels/m404Dll/symbols.txt @@ -113,7 +113,7 @@ lbl_1_data_77C = .data:0x0000077C; // type:object size:0xC data:float lbl_1_data_788 = .data:0x00000788; // type:object size:0x4 lbl_1_data_78C = .data:0x0000078C; // type:object size:0xC data:float lbl_1_data_798 = .data:0x00000798; // type:object size:0xC data:float -lbl_1_data_7A4 = .data:0x000007A4; // type:object size:0x24 scope:local data:string +lbl_1_data_7A4 = .data:0x000007A4; // type:object size:0x23 scope:local data:string lbl_1_data_7C8 = .data:0x000007C8; // type:object size:0x4 data:4byte jumptable_1_data_7CC = .data:0x000007CC; // type:object size:0x28 scope:local lbl_1_data_7F4 = .data:0x000007F4; // type:object size:0x1C scope:local data:string @@ -128,7 +128,7 @@ lbl_1_data_8D8 = .data:0x000008D8; // type:object size:0x10 data:float lbl_1_data_8E8 = .data:0x000008E8; // type:object size:0xC lbl_1_data_8F4 = .data:0x000008F4; // type:object size:0x8 data:2byte lbl_1_data_8FC = .data:0x000008FC; // type:object size:0x18 -lbl_1_data_914 = .data:0x00000914; // type:object size:0x1C scope:local data:string +lbl_1_data_914 = .data:0x00000914; // type:object size:0x19 scope:local data:string lbl_1_data_930 = .data:0x00000930; // type:object size:0x20 lbl_1_data_950 = .data:0x00000950; // type:object size:0x20 lbl_1_data_970 = .data:0x00000970; // type:object size:0x7 scope:local data:string diff --git a/config/GMPE01_00/rels/m406Dll/symbols.txt b/config/GMPE01_00/rels/m406Dll/symbols.txt index 5697d866..1287dc3c 100644 --- a/config/GMPE01_00/rels/m406Dll/symbols.txt +++ b/config/GMPE01_00/rels/m406Dll/symbols.txt @@ -340,7 +340,7 @@ lbl_1_rodata_430 = .rodata:0x00000430; // type:object size:0x4 scope:local data: lbl_1_rodata_434 = .rodata:0x00000434; // type:object size:0x4 scope:local data:float lbl_1_rodata_438 = .rodata:0x00000438; // type:object size:0x4 scope:local data:float lbl_1_data_0 = .data:0x00000000; // type:object size:0x8C data:float -lbl_1_data_8C = .data:0x0000008C; // type:object size:0x24 scope:local data:string +lbl_1_data_8C = .data:0x0000008C; // type:object size:0x23 scope:local data:string jumptable_1_data_B0 = .data:0x000000B0; // type:object size:0x40 scope:local lbl_1_data_F0 = .data:0x000000F0; // type:object size:0x348 lbl_1_data_438 = .data:0x00000438; // type:object size:0x348 @@ -378,7 +378,7 @@ lbl_1_data_FF0 = .data:0x00000FF0; // type:object size:0x10 lbl_1_data_1000 = .data:0x00001000; // type:object size:0x19 scope:local data:string lbl_1_data_1019 = .data:0x00001019; // type:object size:0x19 scope:local data:string lbl_1_data_1032 = .data:0x00001032; // type:object size:0x1A scope:local data:string -lbl_1_data_104C = .data:0x0000104C; // type:object size:0x1C scope:local data:string +lbl_1_data_104C = .data:0x0000104C; // type:object size:0x1A scope:local data:string lbl_1_data_1068 = .data:0x00001068; // type:object size:0x10 lbl_1_data_1078 = .data:0x00001078; // type:object size:0x28 lbl_1_data_10A0 = .data:0x000010A0; // type:object size:0x80 data:4byte diff --git a/config/GMPE01_00/rels/m410Dll/symbols.txt b/config/GMPE01_00/rels/m410Dll/symbols.txt index 9403fd83..b0cd6c90 100644 --- a/config/GMPE01_00/rels/m410Dll/symbols.txt +++ b/config/GMPE01_00/rels/m410Dll/symbols.txt @@ -277,13 +277,13 @@ lbl_1_data_88 = .data:0x00000088; // type:object size:0x3C data:float lbl_1_data_C4 = .data:0x000000C4; // type:object size:0x14 lbl_1_data_D8 = .data:0x000000D8; // type:object size:0x2 data:2byte lbl_1_data_DC = .data:0x000000DC; // type:object size:0x20 -lbl_1_data_FC = .data:0x000000FC; // type:object size:0x8 scope:local data:string +lbl_1_data_FC = .data:0x000000FC; // type:object size:0x7 scope:local data:string lbl_1_data_104 = .data:0x00000104; // type:object size:0xC lbl_1_data_110 = .data:0x00000110; // type:object size:0x4 data:4byte lbl_1_data_114 = .data:0x00000114; // type:object size:0x16 scope:local data:string -lbl_1_data_130 = .data:0x00000130; // type:object size:0x10 scope:local data:string +lbl_1_data_130 = .data:0x00000130; // type:object size:0xF scope:local data:string lbl_1_data_140 = .data:0x00000140; // type:object size:0x20 -lbl_1_data_160 = .data:0x00000160; // type:object size:0xC scope:local data:string +lbl_1_data_160 = .data:0x00000160; // type:object size:0xB scope:local data:string lbl_1_data_16C = .data:0x0000016C; // type:object size:0x20 lbl_1_data_18C = .data:0x0000018C; // type:object size:0x20 lbl_1_data_1AC = .data:0x000001AC; // type:object size:0x28 diff --git a/config/GMPE01_00/rels/m412Dll/symbols.txt b/config/GMPE01_00/rels/m412Dll/symbols.txt index f6b625d3..95938828 100644 --- a/config/GMPE01_00/rels/m412Dll/symbols.txt +++ b/config/GMPE01_00/rels/m412Dll/symbols.txt @@ -160,7 +160,7 @@ lbl_1_data_284 = .data:0x00000284; // type:object size:0x14 scope:local data:str lbl_1_data_298 = .data:0x00000298; // type:object size:0x5C lbl_1_data_2F4 = .data:0x000002F4; // type:object size:0xC scope:local data:string lbl_1_data_300 = .data:0x00000300; // type:object size:0x7 scope:local data:string -lbl_1_data_307 = .data:0x00000307; // type:object size:0x6 scope:local data:string +lbl_1_data_307 = .data:0x00000307; // type:object size:0x7 scope:local data:string lbl_1_data_310 = .data:0x00000310; // type:object size:0x30 lbl_1_data_340 = .data:0x00000340; // type:object size:0x8 lbl_1_data_348 = .data:0x00000348; // type:object size:0x18 diff --git a/config/GMPE01_00/rels/m420dll/symbols.txt b/config/GMPE01_00/rels/m420dll/symbols.txt index 365355d3..096cbad2 100644 --- a/config/GMPE01_00/rels/m420dll/symbols.txt +++ b/config/GMPE01_00/rels/m420dll/symbols.txt @@ -205,7 +205,7 @@ lbl_1_rodata_564 = .rodata:0x00000564; // type:object size:0x4 scope:local data: lbl_1_rodata_568 = .rodata:0x00000568; // type:object size:0x8 scope:local data:float lbl_1_data_0 = .data:0x00000000; // type:object size:0x1E scope:local data:string lbl_1_data_1E = .data:0x0000001E; // type:object size:0x1E scope:local data:string -lbl_1_data_3C = .data:0x0000003C; // type:object size:0x11 scope:local data:string +lbl_1_data_3C = .data:0x0000003C; // type:object size:0x10 scope:local data:string lbl_1_data_50 = .data:0x00000050; // type:object size:0x80 lbl_1_data_D0 = .data:0x000000D0; // type:object size:0x1B scope:local data:string lbl_1_data_EC = .data:0x000000EC; // type:object size:0x30 diff --git a/config/GMPE01_00/rels/m432Dll/symbols.txt b/config/GMPE01_00/rels/m432Dll/symbols.txt index 4926357c..c01d6777 100644 --- a/config/GMPE01_00/rels/m432Dll/symbols.txt +++ b/config/GMPE01_00/rels/m432Dll/symbols.txt @@ -264,7 +264,7 @@ lbl_1_data_407 = .data:0x00000407; // type:object size:0xB scope:local data:stri lbl_1_data_412 = .data:0x00000412; // type:object size:0xB scope:local data:string lbl_1_data_41D = .data:0x0000041D; // type:object size:0xB scope:local data:string lbl_1_data_428 = .data:0x00000428; // type:object size:0xB scope:local data:string -lbl_1_data_433 = .data:0x00000433; // type:object size:0xD scope:local data:string +lbl_1_data_433 = .data:0x00000433; // type:object size:0xB scope:local data:string lbl_1_data_440 = .data:0x00000440; // type:object size:0x18 data:4byte lbl_1_data_458 = .data:0x00000458; // type:object size:0xB scope:local data:string lbl_1_data_463 = .data:0x00000463; // type:object size:0xB scope:local data:string @@ -275,7 +275,7 @@ lbl_1_data_48F = .data:0x0000048F; // type:object size:0xB scope:local data:stri lbl_1_data_49A = .data:0x0000049A; // type:object size:0xB scope:local data:string lbl_1_data_4A5 = .data:0x000004A5; // type:object size:0xB scope:local data:string lbl_1_data_4B0 = .data:0x000004B0; // type:object size:0xB scope:local data:string -lbl_1_data_4BB = .data:0x000004BB; // type:object size:0xD scope:local data:string +lbl_1_data_4BB = .data:0x000004BB; // type:object size:0xB scope:local data:string lbl_1_data_4C8 = .data:0x000004C8; // type:object size:0x28 data:4byte lbl_1_data_4F0 = .data:0x000004F0; // type:object size:0x14 data:byte lbl_1_data_504 = .data:0x00000504; // type:object size:0x24 data:byte @@ -302,7 +302,7 @@ lbl_1_data_EA4 = .data:0x00000EA4; // type:object size:0xB scope:local data:stri lbl_1_data_EAF = .data:0x00000EAF; // type:object size:0xB scope:local data:string lbl_1_data_EBA = .data:0x00000EBA; // type:object size:0xB scope:local data:string lbl_1_data_EC5 = .data:0x00000EC5; // type:object size:0xB scope:local data:string -lbl_1_data_ED0 = .data:0x00000ED0; // type:object size:0xC scope:local data:string +lbl_1_data_ED0 = .data:0x00000ED0; // type:object size:0xB scope:local data:string lbl_1_data_EDC = .data:0x00000EDC; // type:object size:0x8B8 lbl_1_data_1794 = .data:0x00001794; // type:object size:0x20 lbl_1_data_17B4 = .data:0x000017B4; // type:object size:0x20 @@ -318,11 +318,11 @@ lbl_1_data_18BA = .data:0x000018BA; // type:object size:0x18 scope:local data:st lbl_1_data_18D2 = .data:0x000018D2; // type:object size:0xC scope:local data:string lbl_1_data_18DE = .data:0x000018DE; // type:object size:0x6 scope:local data:string lbl_1_data_18E4 = .data:0x000018E4; // type:object size:0x21 scope:local data:string -lbl_1_data_1905 = .data:0x00001905; // type:object size:0x1F scope:local data:string +lbl_1_data_1905 = .data:0x00001905; // type:object size:0x1D scope:local data:string jumptable_1_data_1924 = .data:0x00001924; // type:object size:0x1C scope:local jumptable_1_data_1940 = .data:0x00001940; // type:object size:0x44 scope:local lbl_1_data_1984 = .data:0x00001984; // type:object size:0xB scope:local data:string -lbl_1_data_198F = .data:0x0000198F; // type:object size:0x1D scope:local data:string +lbl_1_data_198F = .data:0x0000198F; // type:object size:0x1B scope:local data:string jumptable_1_data_19AC = .data:0x000019AC; // type:object size:0x28 scope:local lbl_1_data_19D4 = .data:0x000019D4; // type:object size:0x24 scope:local data:string lbl_1_bss_0 = .bss:0x00000000; // type:object size:0x3F0 data:float diff --git a/config/GMPE01_00/rels/m438Dll/symbols.txt b/config/GMPE01_00/rels/m438Dll/symbols.txt index 8b3796d8..dfbd3109 100644 --- a/config/GMPE01_00/rels/m438Dll/symbols.txt +++ b/config/GMPE01_00/rels/m438Dll/symbols.txt @@ -381,7 +381,7 @@ lbl_1_data_18 = .data:0x00000018; // type:object size:0x4 lbl_1_data_1C = .data:0x0000001C; // type:object size:0xC lbl_1_data_28 = .data:0x00000028; // type:object size:0xC lbl_1_data_34 = .data:0x00000034; // type:object size:0xC -lbl_1_data_40 = .data:0x00000040; // type:object size:0x24 data:string +lbl_1_data_40 = .data:0x00000040; // type:object size:0x23 data:string lbl_1_data_64 = .data:0x00000064; // type:object size:0x4 data:4byte lbl_1_data_68 = .data:0x00000068; // type:object size:0x420 lbl_1_data_488 = .data:0x00000488; // type:object size:0x2C diff --git a/config/GMPE01_00/rels/m440Dll/symbols.txt b/config/GMPE01_00/rels/m440Dll/symbols.txt index 1457a3b2..8cff0e70 100644 --- a/config/GMPE01_00/rels/m440Dll/symbols.txt +++ b/config/GMPE01_00/rels/m440Dll/symbols.txt @@ -247,7 +247,7 @@ lbl_1_data_104 = .data:0x00000104; // type:object size:0x2 data:2byte lbl_1_data_108 = .data:0x00000108; // type:object size:0x2 data:2byte lbl_1_data_10C = .data:0x0000010C; // type:object size:0x12 lbl_1_data_11E = .data:0x0000011E; // type:object size:0x13 scope:local data:string -lbl_1_data_131 = .data:0x00000131; // type:object size:0x18 scope:local data:string +lbl_1_data_131 = .data:0x00000131; // type:object size:0x17 scope:local data:string lbl_1_data_149 = .data:0x00000149; // type:object size:0x19 scope:local data:string lbl_1_data_162 = .data:0x00000162; // type:object size:0x1C scope:local data:string lbl_1_data_17E = .data:0x0000017E; // type:object size:0x10 scope:local data:string diff --git a/config/GMPE01_00/rels/m442Dll/symbols.txt b/config/GMPE01_00/rels/m442Dll/symbols.txt index c4f962cc..e5e664a3 100644 --- a/config/GMPE01_00/rels/m442Dll/symbols.txt +++ b/config/GMPE01_00/rels/m442Dll/symbols.txt @@ -167,14 +167,14 @@ lbl_1_data_60 = .data:0x00000060; // type:object size:0xC data:float lbl_1_data_6C = .data:0x0000006C; // type:object size:0x4 data:byte lbl_1_data_70 = .data:0x00000070; // type:object size:0xC data:float lbl_1_data_7C = .data:0x0000007C; // type:object size:0xC data:float -lbl_1_data_88 = .data:0x00000088; // type:object size:0x24 scope:local data:string +lbl_1_data_88 = .data:0x00000088; // type:object size:0x23 scope:local data:string lbl_1_data_AC = .data:0x000000AC; // type:object size:0x4 data:4byte jumptable_1_data_B0 = .data:0x000000B0; // type:object size:0x30 scope:local lbl_1_data_E0 = .data:0x000000E0; // type:object size:0x1C scope:local data:string lbl_1_data_FC = .data:0x000000FC; // type:object size:0x1C data:4byte lbl_1_data_118 = .data:0x00000118; // type:object size:0x8 data:4byte lbl_1_data_120 = .data:0x00000120; // type:object size:0x30 data:float -lbl_1_data_150 = .data:0x00000150; // type:object size:0x1A scope:local data:string +lbl_1_data_150 = .data:0x00000150; // type:object size:0x19 scope:local data:string lbl_1_data_16A = .data:0x0000016A; // type:object size:0x20 data:2byte lbl_1_data_18A = .data:0x0000018A; // type:object size:0x14 data:2byte lbl_1_data_1A0 = .data:0x000001A0; // type:object size:0xC data:4byte diff --git a/config/GMPE01_00/rels/m443Dll/symbols.txt b/config/GMPE01_00/rels/m443Dll/symbols.txt index 66c15dad..ed466311 100644 --- a/config/GMPE01_00/rels/m443Dll/symbols.txt +++ b/config/GMPE01_00/rels/m443Dll/symbols.txt @@ -307,7 +307,7 @@ lbl_1_data_3C4 = .data:0x000003C4; // type:object size:0x30 lbl_1_data_3F4 = .data:0x000003F4; // type:object size:0x5 scope:local data:string lbl_1_data_3F9 = .data:0x000003F9; // type:object size:0x7 scope:local data:string lbl_1_data_400 = .data:0x00000400; // type:object size:0x7 scope:local data:string -lbl_1_data_407 = .data:0x00000407; // type:object size:0x9 scope:local data:string +lbl_1_data_407 = .data:0x00000407; // type:object size:0x7 scope:local data:string lbl_1_data_410 = .data:0x00000410; // type:object size:0x58 lbl_1_data_468 = .data:0x00000468; // type:object size:0x20 lbl_1_data_488 = .data:0x00000488; // type:object size:0x58 diff --git a/config/GMPE01_00/rels/m446dll/symbols.txt b/config/GMPE01_00/rels/m446dll/symbols.txt index e9879dc0..b1e4494c 100644 --- a/config/GMPE01_00/rels/m446dll/symbols.txt +++ b/config/GMPE01_00/rels/m446dll/symbols.txt @@ -260,22 +260,22 @@ lbl_1_data_150 = .data:0x00000150; // type:object size:0xC lbl_1_data_15C = .data:0x0000015C; // type:object size:0x20 scope:local jumptable_1_data_17C = .data:0x0000017C; // type:object size:0x2C scope:local lbl_1_data_1A8 = .data:0x000001A8; // type:object size:0x1F scope:local data:string -lbl_1_data_1C7 = .data:0x000001C7; // type:object size:0x1F scope:local data:string +lbl_1_data_1C7 = .data:0x000001C7; // type:object size:0x1E scope:local data:string lbl_1_data_1E8 = .data:0x000001E8; // type:object size:0x1E scope:local data:string -lbl_1_data_206 = .data:0x00000206; // type:object size:0x22 scope:local data:string +lbl_1_data_206 = .data:0x00000206; // type:object size:0x1E scope:local data:string lbl_1_data_228 = .data:0x00000228; // type:object size:0x24 lbl_1_data_24C = .data:0x0000024C; // type:object size:0x90 lbl_1_data_2DC = .data:0x000002DC; // type:object size:0x14 lbl_1_data_2F0 = .data:0x000002F0; // type:object size:0x1F scope:local data:string lbl_1_data_30F = .data:0x0000030F; // type:object size:0x1F scope:local data:string -lbl_1_data_32E = .data:0x0000032E; // type:object size:0x22 scope:local data:string +lbl_1_data_32E = .data:0x0000032E; // type:object size:0x1F scope:local data:string jumptable_1_data_350 = .data:0x00000350; // type:object size:0x1C scope:local lbl_1_data_370 = .data:0x00000370; // type:object size:0xC data:float lbl_1_data_37C = .data:0x0000037C; // type:object size:0x1E scope:local data:string lbl_1_data_39A = .data:0x0000039A; // type:object size:0x1E scope:local data:string -lbl_1_data_3B8 = .data:0x000003B8; // type:object size:0x10 scope:local data:string +lbl_1_data_3B8 = .data:0x000003B8; // type:object size:0xE scope:local data:string lbl_1_data_3C8 = .data:0x000003C8; // type:object size:0x24 -lbl_1_data_3EC = .data:0x000003EC; // type:object size:0x24 scope:local data:string +lbl_1_data_3EC = .data:0x000003EC; // type:object size:0x1F scope:local data:string lbl_1_data_410 = .data:0x00000410; // type:object size:0x14 lbl_1_data_424 = .data:0x00000424; // type:object size:0x3C lbl_1_data_460 = .data:0x00000460; // type:object size:0x54 data:byte diff --git a/config/GMPE01_00/rels/m450Dll/symbols.txt b/config/GMPE01_00/rels/m450Dll/symbols.txt index 6adc8754..37af9137 100644 --- a/config/GMPE01_00/rels/m450Dll/symbols.txt +++ b/config/GMPE01_00/rels/m450Dll/symbols.txt @@ -367,7 +367,7 @@ lbl_1_data_2B6 = .data:0x000002B6; // type:object size:0x13 scope:local data:str lbl_1_data_2C9 = .data:0x000002C9; // type:object size:0x14 scope:local data:string lbl_1_data_2DD = .data:0x000002DD; // type:object size:0x1C scope:local data:string lbl_1_data_2F9 = .data:0x000002F9; // type:object size:0x12 scope:local data:string -lbl_1_data_30B = .data:0x0000030B; // type:object size:0x11 scope:local data:string +lbl_1_data_30B = .data:0x0000030B; // type:object size:0xE scope:local data:string jumptable_1_data_31C = .data:0x0000031C; // type:object size:0x60 scope:local lbl_1_data_37C = .data:0x0000037C; // type:object size:0x12 scope:local data:string lbl_1_data_38E = .data:0x0000038E; // type:object size:0x12 scope:local data:string @@ -375,9 +375,9 @@ lbl_1_data_3A0 = .data:0x000003A0; // type:object size:0x13 scope:local data:str lbl_1_data_3B3 = .data:0x000003B3; // type:object size:0x14 scope:local data:string lbl_1_data_3C7 = .data:0x000003C7; // type:object size:0x14 scope:local data:string lbl_1_data_3DB = .data:0x000003DB; // type:object size:0x13 scope:local data:string -lbl_1_data_3EE = .data:0x000003EE; // type:object size:0x1E scope:local data:string +lbl_1_data_3EE = .data:0x000003EE; // type:object size:0x1C scope:local data:string jumptable_1_data_40C = .data:0x0000040C; // type:object size:0x44 scope:local -lbl_1_data_450 = .data:0x00000450; // type:object size:0x14 scope:local data:string +lbl_1_data_450 = .data:0x00000450; // type:object size:0x12 scope:local data:string lbl_1_data_464 = .data:0x00000464; // type:object size:0xC data:4byte lbl_1_data_470 = .data:0x00000470; // type:object size:0xC lbl_1_data_47C = .data:0x0000047C; // type:object size:0xC data:4byte @@ -411,7 +411,7 @@ lbl_1_data_9EC = .data:0x000009EC; // type:object size:0x20 lbl_1_data_A0C = .data:0x00000A0C; // type:object size:0x38 data:4byte lbl_1_data_A44 = .data:0x00000A44; // type:object size:0x13 scope:local data:string lbl_1_data_A57 = .data:0x00000A57; // type:object size:0x13 scope:local data:string -lbl_1_data_A6A = .data:0x00000A6A; // type:object size:0x16 scope:local data:string +lbl_1_data_A6A = .data:0x00000A6A; // type:object size:0x13 scope:local data:string lbl_1_data_A80 = .data:0x00000A80; // type:object size:0x18C lbl_1_data_C0C = .data:0x00000C0C; // type:object size:0x13 scope:local data:string lbl_1_data_C1F = .data:0x00000C1F; // type:object size:0x13 scope:local data:string @@ -422,7 +422,7 @@ lbl_1_data_E10 = .data:0x00000E10; // type:object size:0x11 scope:local data:str lbl_1_data_E21 = .data:0x00000E21; // type:object size:0x11 scope:local data:string lbl_1_data_E32 = .data:0x00000E32; // type:object size:0x11 scope:local data:string lbl_1_data_E43 = .data:0x00000E43; // type:object size:0x11 scope:local data:string -lbl_1_data_E54 = .data:0x00000E54; // type:object size:0x14 scope:local data:string +lbl_1_data_E54 = .data:0x00000E54; // type:object size:0x11 scope:local data:string lbl_1_data_E68 = .data:0x00000E68; // type:object size:0x14 lbl_1_data_E7C = .data:0x00000E7C; // type:object size:0x84 lbl_1_data_F00 = .data:0x00000F00; // type:object size:0x5C @@ -466,7 +466,7 @@ lbl_1_data_12FC = .data:0x000012FC; // type:object size:0x13 scope:local data:st lbl_1_data_130F = .data:0x0000130F; // type:object size:0x13 scope:local data:string lbl_1_data_1322 = .data:0x00001322; // type:object size:0x13 scope:local data:string lbl_1_data_1335 = .data:0x00001335; // type:object size:0x13 scope:local data:string -lbl_1_data_1348 = .data:0x00001348; // type:object size:0x14 scope:local data:string +lbl_1_data_1348 = .data:0x00001348; // type:object size:0x13 scope:local data:string lbl_1_data_135C = .data:0x0000135C; // type:object size:0x24 lbl_1_data_1380 = .data:0x00001380; // type:object size:0x38 data:4byte lbl_1_data_13B8 = .data:0x000013B8; // type:object size:0x38 data:4byte @@ -474,7 +474,7 @@ lbl_1_data_13F0 = .data:0x000013F0; // type:object size:0x13 scope:local data:st lbl_1_data_1403 = .data:0x00001403; // type:object size:0x13 scope:local data:string lbl_1_data_1416 = .data:0x00001416; // type:object size:0x13 scope:local data:string lbl_1_data_1429 = .data:0x00001429; // type:object size:0x13 scope:local data:string -lbl_1_data_143C = .data:0x0000143C; // type:object size:0x14 scope:local data:string +lbl_1_data_143C = .data:0x0000143C; // type:object size:0x13 scope:local data:string lbl_1_data_1450 = .data:0x00001450; // type:object size:0xB4 lbl_1_data_1504 = .data:0x00001504; // type:object size:0x50 lbl_1_data_1554 = .data:0x00001554; // type:object size:0x13 scope:local data:string @@ -491,7 +491,7 @@ lbl_1_data_161F = .data:0x0000161F; // type:object size:0xE scope:local data:str lbl_1_data_162D = .data:0x0000162D; // type:object size:0x6 scope:local data:string lbl_1_data_1633 = .data:0x00001633; // type:object size:0x1D scope:local data:string jumptable_1_data_1650 = .data:0x00001650; // type:object size:0x70 scope:local -lbl_1_data_16C0 = .data:0x000016C0; // type:object size:0x1C scope:local data:string +lbl_1_data_16C0 = .data:0x000016C0; // type:object size:0x1B scope:local data:string jumptable_1_data_16DC = .data:0x000016DC; // type:object size:0xC4 scope:local lbl_1_data_17A0 = .data:0x000017A0; // type:object size:0x24 scope:local data:string lbl_1_bss_0 = .bss:0x00000000; // type:object size:0x4 data:4byte diff --git a/config/GMPE01_00/rels/m453Dll/symbols.txt b/config/GMPE01_00/rels/m453Dll/symbols.txt index 518e286d..298e2fb6 100644 --- a/config/GMPE01_00/rels/m453Dll/symbols.txt +++ b/config/GMPE01_00/rels/m453Dll/symbols.txt @@ -213,7 +213,7 @@ lbl_1_data_0 = .data:0x00000000; // type:object size:0x2 data:2byte lbl_1_data_4 = .data:0x00000004; // type:object size:0xC lbl_1_data_10 = .data:0x00000010; // type:object size:0xC lbl_1_data_1C = .data:0x0000001C; // type:object size:0x28 -lbl_1_data_44 = .data:0x00000044; // type:object size:0x24 scope:local data:string +lbl_1_data_44 = .data:0x00000044; // type:object size:0x23 scope:local data:string lbl_1_data_68 = .data:0x00000068; // type:object size:0x24 data:4byte jumptable_1_data_8C = .data:0x0000008C; // type:object size:0x1C scope:local jumptable_1_data_A8 = .data:0x000000A8; // type:object size:0x1C scope:local diff --git a/config/GMPE01_00/rels/mentDll/symbols.txt b/config/GMPE01_00/rels/mentDll/symbols.txt index e29109dd..fe98fd1f 100644 --- a/config/GMPE01_00/rels/mentDll/symbols.txt +++ b/config/GMPE01_00/rels/mentDll/symbols.txt @@ -392,7 +392,7 @@ lbl_1_data_245 = .data:0x00000245; // type:object size:0x1D scope:local data:str lbl_1_data_262 = .data:0x00000262; // type:object size:0x14 scope:local data:string lbl_1_data_276 = .data:0x00000276; // type:object size:0x15 scope:local data:string lbl_1_data_28B = .data:0x0000028B; // type:object size:0x14 scope:local data:string -lbl_1_data_29F = .data:0x0000029F; // type:object size:0x15 scope:local data:string +lbl_1_data_29F = .data:0x0000029F; // type:object size:0x14 scope:local data:string lbl_1_data_2B4 = .data:0x000002B4; // type:object size:0x3C lbl_1_data_2F0 = .data:0x000002F0; // type:object size:0x4 data:4byte lbl_1_data_2F4 = .data:0x000002F4; // type:object size:0x20 scope:local data:string @@ -408,7 +408,7 @@ lbl_1_data_413 = .data:0x00000413; // type:object size:0x2B scope:local data:str lbl_1_data_43E = .data:0x0000043E; // type:object size:0x29 scope:local data:string lbl_1_data_467 = .data:0x00000467; // type:object size:0x2B scope:local data:string lbl_1_data_492 = .data:0x00000492; // type:object size:0x20 scope:local data:string -lbl_1_data_4B2 = .data:0x000004B2; // type:object size:0x22 scope:local data:string +lbl_1_data_4B2 = .data:0x000004B2; // type:object size:0x20 scope:local data:string jumptable_1_data_4D4 = .data:0x000004D4; // type:object size:0x54 scope:local lbl_1_data_528 = .data:0x00000528; // type:object size:0x1B scope:local data:string lbl_1_data_543 = .data:0x00000543; // type:object size:0x1A scope:local data:string diff --git a/config/GMPE01_00/rels/mpexDll/symbols.txt b/config/GMPE01_00/rels/mpexDll/symbols.txt index bc7d5ab0..d4725e33 100644 --- a/config/GMPE01_00/rels/mpexDll/symbols.txt +++ b/config/GMPE01_00/rels/mpexDll/symbols.txt @@ -395,14 +395,14 @@ lbl_1_data_232 = .data:0x00000232; // type:object size:0xE scope:local data:stri lbl_1_data_240 = .data:0x00000240; // type:object size:0x54 data:float lbl_1_data_294 = .data:0x00000294; // type:object size:0x4 data:4byte lbl_1_data_298 = .data:0x00000298; // type:object size:0x4 data:4byte -lbl_1_data_29C = .data:0x0000029C; // type:object size:0x18 scope:local data:string +lbl_1_data_29C = .data:0x0000029C; // type:object size:0x15 scope:local data:string lbl_1_data_2B4 = .data:0x000002B4; // type:object size:0x10 data:4byte lbl_1_data_2C4 = .data:0x000002C4; // type:object size:0x4 data:4byte lbl_1_data_2C8 = .data:0x000002C8; // type:object size:0x3 scope:local data:string lbl_1_data_2CB = .data:0x000002CB; // type:object size:0x5 scope:local data:string lbl_1_data_2D0 = .data:0x000002D0; // type:object size:0x19 scope:local data:string lbl_1_data_2E9 = .data:0x000002E9; // type:object size:0x12 scope:local data:string -lbl_1_data_2FB = .data:0x000002FB; // type:object size:0x29 scope:local data:string +lbl_1_data_2FB = .data:0x000002FB; // type:object size:0x28 scope:local data:string lbl_1_data_324 = .data:0x00000324; // type:object size:0x4 data:4byte lbl_1_data_328 = .data:0x00000328; // type:object size:0x4 data:4byte lbl_1_data_32C = .data:0x0000032C; // type:object size:0xC data:4byte @@ -410,7 +410,7 @@ lbl_1_data_338 = .data:0x00000338; // type:object size:0x2B scope:local data:str lbl_1_data_363 = .data:0x00000363; // type:object size:0x28 scope:local data:string lbl_1_data_38B = .data:0x0000038B; // type:object size:0x5 scope:local data:string lbl_1_data_390 = .data:0x00000390; // type:object size:0x4 scope:local data:string -lbl_1_data_394 = .data:0x00000394; // type:object size:0x4 scope:local data:string +lbl_1_data_394 = .data:0x00000394; // type:object size:0x3 scope:local data:string jumptable_1_data_398 = .data:0x00000398; // type:object size:0x2C scope:local lbl_1_data_3C4 = .data:0x000003C4; // type:object size:0x3C scope:local data:string lbl_1_data_400 = .data:0x00000400; // type:object size:0x16 scope:local data:string @@ -422,11 +422,11 @@ lbl_1_data_47B = .data:0x0000047B; // type:object size:0x16 scope:local data:str lbl_1_data_491 = .data:0x00000491; // type:object size:0x16 scope:local data:string lbl_1_data_4A7 = .data:0x000004A7; // type:object size:0x19 scope:local data:string lbl_1_data_4C0 = .data:0x000004C0; // type:object size:0x16 scope:local data:string -lbl_1_data_4D6 = .data:0x000004D6; // type:object size:0x42 scope:local data:string +lbl_1_data_4D6 = .data:0x000004D6; // type:object size:0x3B scope:local data:string lbl_1_data_518 = .data:0x00000518; // type:object size:0x3C scope:local data:string lbl_1_data_554 = .data:0x00000554; // type:object size:0x19 scope:local data:string lbl_1_data_56D = .data:0x0000056D; // type:object size:0x1A scope:local data:string -lbl_1_data_587 = .data:0x00000587; // type:object size:0x3D scope:local data:string +lbl_1_data_587 = .data:0x00000587; // type:object size:0x3A scope:local data:string lbl_1_data_5C4 = .data:0x000005C4; // type:object size:0x20 data:4byte lbl_1_data_5E4 = .data:0x000005E4; // type:object size:0x40 data:4byte lbl_1_data_624 = .data:0x00000624; // type:object size:0x70 diff --git a/config/GMPE01_00/rels/present/symbols.txt b/config/GMPE01_00/rels/present/symbols.txt index a5b07fdb..332b6bce 100644 --- a/config/GMPE01_00/rels/present/symbols.txt +++ b/config/GMPE01_00/rels/present/symbols.txt @@ -171,16 +171,16 @@ lbl_1_rodata_C48 = .rodata:0x00000C48; // type:object size:0x4 scope:local data: lbl_1_rodata_C4C = .rodata:0x00000C4C; // type:object size:0x4 scope:local data:float lbl_1_data_0 = .data:0x00000000; // type:object size:0x1B scope:local data:string lbl_1_data_1B = .data:0x0000001B; // type:object size:0x1B scope:local data:string -lbl_1_data_36 = .data:0x00000036; // type:object size:0x1A scope:local data:string +lbl_1_data_36 = .data:0x00000036; // type:object size:0x16 scope:local data:string lightTbl = .data:0x00000050; // type:object size:0x1C scope:local data:4byte execModeTbl = .data:0x0000006C; // type:object size:0x10 scope:local data:4byte -lbl_1_data_7C = .data:0x0000007C; // type:object size:0x8 scope:local data:string +lbl_1_data_7C = .data:0x0000007C; // type:object size:0x7 scope:local data:string roomIdxTbl2 = .data:0x00000084; // type:object size:0x20 jumptable_1_data_A4 = .data:0x000000A4; // type:object size:0x2C scope:local jumptable_1_data_D0 = .data:0x000000D0; // type:object size:0x1C scope:local shadowPosTbl = .data:0x000000F0; // type:object size:0x24 scope:local data:float lbl_1_data_114 = .data:0x00000114; // type:object size:0x2A scope:local data:string -lbl_1_data_13E = .data:0x0000013E; // type:object size:0x2E scope:local data:string +lbl_1_data_13E = .data:0x0000013E; // type:object size:0x2B scope:local data:string jumptable_1_data_16C = .data:0x0000016C; // type:object size:0x34 scope:local execModeTbl = .data:0x000001A0; // type:object size:0xC scope:local data:4byte scene = .bss:0x00000000; // type:object size:0x4 scope:local data:4byte diff --git a/config/GMPE01_00/rels/w05Dll/symbols.txt b/config/GMPE01_00/rels/w05Dll/symbols.txt index 4f1ddabd..56c26c7c 100644 --- a/config/GMPE01_00/rels/w05Dll/symbols.txt +++ b/config/GMPE01_00/rels/w05Dll/symbols.txt @@ -287,7 +287,7 @@ lbl_1_data_2F4 = .data:0x000002F4; // type:object size:0x18 lbl_1_data_310 = .data:0x00000310; // type:object size:0x8 lbl_1_data_318 = .data:0x00000318; // type:object size:0x7 scope:local data:string lbl_1_data_31F = .data:0x0000031F; // type:object size:0x7 scope:local data:string -lbl_1_data_326 = .data:0x00000326; // type:object size:0xA scope:local data:string +lbl_1_data_326 = .data:0x00000326; // type:object size:0x7 scope:local data:string lbl_1_data_330 = .data:0x00000330; // type:object size:0xC lbl_1_data_33C = .data:0x0000033C; // type:object size:0x7 scope:local data:string lbl_1_data_343 = .data:0x00000343; // type:object size:0xD scope:local data:string @@ -302,7 +302,7 @@ lbl_1_data_470 = .data:0x00000470; // type:object size:0xC lbl_1_data_47C = .data:0x0000047C; // type:object size:0xC lbl_1_data_488 = .data:0x00000488; // type:object size:0x3 scope:local data:string lbl_1_data_48B = .data:0x0000048B; // type:object size:0x4 scope:local data:string -lbl_1_data_48F = .data:0x0000048F; // type:object size:0x5 scope:local data:string +lbl_1_data_48F = .data:0x0000048F; // type:object size:0x4 scope:local data:string lbl_1_data_494 = .data:0x00000494; // type:object size:0xC lbl_1_data_4A0 = .data:0x000004A0; // type:object size:0xD scope:local data:string lbl_1_data_4AD = .data:0x000004AD; // type:object size:0x5 scope:local data:string diff --git a/config/GMPE01_00/rels/w10Dll/symbols.txt b/config/GMPE01_00/rels/w10Dll/symbols.txt index 89f2a634..f10220e4 100644 --- a/config/GMPE01_00/rels/w10Dll/symbols.txt +++ b/config/GMPE01_00/rels/w10Dll/symbols.txt @@ -98,7 +98,7 @@ lotteryHostMot = .data:0x00000064; // type:object size:0x8 scope:local booHouseHostMot = .data:0x0000006C; // type:object size:0x8 scope:local hostMot = .data:0x00000078; // type:object size:0x8 scope:local hostPosTbl = .data:0x00000080; // type:object size:0x18 scope:local data:float -lbl_1_data_98 = .data:0x00000098; // type:object size:0x2E scope:local data:string +lbl_1_data_98 = .data:0x00000098; // type:object size:0x2D scope:local data:string rollDataTbl = .data:0x000000C6; // type:object size:0x42 scope:local sceneTbl = .data:0x00000108; // type:object size:0x150 scope:local lbl_1_data_258 = .data:0x00000258; // type:object size:0x50 scope:local data:string diff --git a/config/GMPE01_00/rels/ztardll/symbols.txt b/config/GMPE01_00/rels/ztardll/symbols.txt index 05abe49e..f92691a8 100644 --- a/config/GMPE01_00/rels/ztardll/symbols.txt +++ b/config/GMPE01_00/rels/ztardll/symbols.txt @@ -219,7 +219,7 @@ lbl_1_data_3E8 = .data:0x000003E8; // type:object size:0x20 lbl_1_data_408 = .data:0x00000408; // type:object size:0x3C scope:local data:string lbl_1_data_444 = .data:0x00000444; // type:object size:0x19 scope:local data:string lbl_1_data_45D = .data:0x0000045D; // type:object size:0x1A scope:local data:string -lbl_1_data_477 = .data:0x00000477; // type:object size:0x3D scope:local data:string +lbl_1_data_477 = .data:0x00000477; // type:object size:0x3A scope:local data:string lbl_1_data_4B4 = .data:0x000004B4; // type:object size:0x20 data:4byte lbl_1_data_4D4 = .data:0x000004D4; // type:object size:0x40 data:4byte lbl_1_data_514 = .data:0x00000514; // type:object size:0x70 diff --git a/config/GMPE01_00/symbols.txt b/config/GMPE01_00/symbols.txt index 8b2b8d1b..3cb7cb54 100644 --- a/config/GMPE01_00/symbols.txt +++ b/config/GMPE01_00/symbols.txt @@ -3665,7 +3665,7 @@ T = .rodata:0x8011E950; // type:object size:0x68 scope:local data:double atanhi = .rodata:0x8011E9B8; // type:object size:0x20 scope:local atanlo = .rodata:0x8011E9D8; // type:object size:0x20 scope:local aT = .rodata:0x8011E9F8; // type:object size:0x58 scope:local -@62 = .rodata:0x8011EA50; // type:object size:0x1B scope:local data:string +@62 = .rodata:0x8011EA50; // type:object size:0x1C scope:local data:string lbl_8011EA70 = .rodata:0x8011EA70; // type:object size:0x20 gTRKMemMap = .rodata:0x8011EA90; // type:object size:0x10 data:4byte lbl_8011EAA0 = .rodata:0x8011EAA0; // type:object size:0x28 data:4byte @@ -3826,7 +3826,8 @@ DataDirStat = .data:0x8011F7C4; // type:object size:0x468 scope:local data:4byte lbl_8011FC2C = .data:0x8011FC2C; // type:object size:0x1D data:string lbl_8011FC49 = .data:0x8011FC49; // type:object size:0x1F data:string lbl_8011FC68 = .data:0x8011FC68; // type:object size:0x1D data:string -lbl_8011FC85 = .data:0x8011FC85; // type:object size:0x1F data:string +lbl_8011FC85 = .data:0x8011FC85; // type:object size:0x12 data:string +lbl_8011FC97 = .data:0x8011FC97; // type:object size:0xD data:string lbl_8011FCA4 = .data:0x8011FCA4; // type:object size:0x1A data:string lbl_8011FCBE = .data:0x8011FCBE; // type:object size:0x122 lbl_8011FDE0 = .data:0x8011FDE0; // type:object size:0x20 @@ -4328,12 +4329,47 @@ jumptable_8013B4D4 = .data:0x8013B4D4; // type:object size:0x20 scope:local jumptable_8013B4F4 = .data:0x8013B4F4; // type:object size:0x20 scope:local lbl_8013B518 = .data:0x8013B518; // type:object size:0x24 data:string lbl_8013B53C = .data:0x8013B53C; // type:object size:0x24 data:string -@84 = .data:0x8013B560; // type:object size:0x1E scope:local data:string -__OSExceptionLocations = .data:0x8013B648; // type:object size:0x3C +@82 = .data:0x8013B560; // type:object size:0x1E scope:local data:string +lbl_8013B580 = .data:0x8013B580; // type:object size:0x16 scope:local data:string +lbl_8013B598 = .data:0x8013B598; // type:object size:0xC scope:local data:string +lbl_8013B5A4 = .data:0x8013B5A4; // type:object size:0x9 scope:local data:string +lbl_8013B5B4 = .data:0x8013B5B0; // type:object size:0x10 scope:local data:string +lbl_8013B5C0 = .data:0x8013B5C0; // type:object size:0xB scope:local data:string +lbl_8013B5CC = .data:0x8013B5CC; // type:object size:0xE scope:local data:string +lbl_8013B5DC = .data:0x8013B5DC; // type:object size:0xD scope:local data:string +lbl_8013B5EC = .data:0x8013B5EC; // type:object size:0xD scope:local data:string +lbl_8013B5FC = .data:0x8013B5FC; // type:object size:0xD scope:local data:string +lbl_8013B60C = .data:0x8013B60C; // type:object size:0x12 scope:local data:string +lbl_8013B620 = .data:0x8013B620; // type:object size:0xE scope:local data:string +lbl_8013B630 = .data:0x8013B630; // type:object size:0x15 scope:local data:string +__OSExceptionLocations = .data:0x8013B648; // type:object size:0x3C scope:local lbl_8013B720 = .data:0x8013B720; // type:object size:0x398 DSPInitCode = .data:0x8013BAB8; // type:object size:0x80 scope:local @69 = .data:0x8013BB38; // type:object size:0x29 scope:local data:string -lbl_8013BD68 = .data:0x8013BD68; // type:object size:0x1B4 +lbl_8013BB64 = .data:0x8013BB64; // type:object size:0x18 scope:local data:string +lbl_8013BB7C = .data:0x8013BB7C; // type:object size:0x1B scope:local data:string +lbl_8013BB98 = .data:0x8013BB98; // type:object size:0x30 scope:local data:string +lbl_8013BBC8 = .data:0x8013BBC8; // type:object size:0x3C scope:local data:string +lbl_8013BC04 = .data:0x8013BC04; // type:object size:0x37 scope:local data:string +lbl_8013BC3D = .data:0x8013BC3D; // type:object size:0x3E scope:local data:string +lbl_8013BC7C = .data:0x8013BC7C; // type:object size:0x29 scope:local data:string +lbl_8013BCA8 = .data:0x8013BCA8; // type:object size:0x1D scope:local data:string +lbl_8013BCC8 = .data:0x8013BCC8; // type:object size:0x19 scope:local data:string +lbl_8013BCE4 = .data:0x8013BCE4; // type:object size:0x19 scope:local data:string +lbl_8013BD00 = .data:0x8013BD00; // type:object size:0x19 scope:local data:string +lbl_8013BD1C = .data:0x8013BD1C; // type:object size:0x16 scope:local data:string +lbl_8013BD34 = .data:0x8013BD34; // type:object size:0x2E scope:local data:string +lbl_8013BD68 = .data:0x8013BD68; // type:object size:0x44 scope:local data:string +lbl_8013BDAC = .data:0x8013BDAC; // type:object size:0x5F scope:local data:string +lbl_8013BE0C = .data:0x8013BE0C; // type:object size:0x2F scope:local data:string +lbl_8013BE3C = .data:0x8013BE3C; // type:object size:0x11 scope:local data:string +lbl_8013BE50 = .data:0x8013BE50; // type:object size:0x21 scope:local data:string +lbl_8013BE74 = .data:0x8013BE74; // type:object size:0x12 scope:local data:string +lbl_8013BE88 = .data:0x8013BE88; // type:object size:0x19 scope:local data:string +lbl_8013BEA4 = .data:0x8013BEA4; // type:object size:0x12 scope:local data:string +lbl_8013BEB8 = .data:0x8013BEB8; // type:object size:0x1D scope:local data:string +lbl_8013BED8 = .data:0x8013BED8; // type:object size:0x26 scope:local data:string +lbl_8013BF00 = .data:0x8013BF00; // type:object size:0x1C scope:local data:string @74 = .data:0x8013BF1C; // type:object size:0x23 scope:local data:string @10 = .data:0x8013BF40; // type:object size:0x16 scope:local data:string @43 = .data:0x8013C21C; // type:object size:0x40 scope:local @@ -4367,23 +4403,23 @@ lbl_8013C984 = .data:0x8013C984; // type:object size:0x29 scope:local data:strin lbl_8013C9B0 = .data:0x8013C9B0; // type:object size:0x29 scope:local data:string DEMOFontBitmap = .data:0x8013C9E0; // type:object size:0xC00 align:32 lbl_8013D5E0 = .data:0x8013D5E0; // type:object size:0xC scope:local data:string -lbl_8013D5EC = .data:0x8013D5EC; // type:object size:0x28 scope:local data:string +lbl_8013D5EC = .data:0x8013D5EC; // type:object size:0x26 scope:local data:string jumptable_8013D614 = .data:0x8013D614; // type:object size:0x28 scope:local jumptable_8013D698 = .data:0x8013D698; // type:object size:0x28 scope:local jumptable_8013D6C0 = .data:0x8013D6C0; // type:object size:0x28 scope:local jumptable_8013D6E8 = .data:0x8013D6E8; // type:object size:0x28 scope:local jumptable_8013D710 = .data:0x8013D710; // type:object size:0x28 scope:local ResetFunctionInfo = .data:0x8013D738; // type:object size:0x10 -lbl_8013D748 = .data:0x8013D748; // type:object size:0x20 scope:local data:string +lbl_8013D748 = .data:0x8013D748; // type:object size:0x1E scope:local data:string lbl_8013D768 = .data:0x8013D768; // type:object size:0xC scope:local data:string -lbl_8013D774 = .data:0x8013D774; // type:object size:0xC scope:local data:string -lbl_8013D780 = .data:0x8013D780; // type:object size:0x20 scope:local data:string -lbl_8013D7A0 = .data:0x8013D7A0; // type:object size:0x30 scope:local data:string -lbl_8013D7D0 = .data:0x8013D7D0; // type:object size:0x30 scope:local data:string -lbl_8013D800 = .data:0x8013D800; // type:object size:0x30 scope:local data:string -lbl_8013D830 = .data:0x8013D830; // type:object size:0x30 scope:local data:string -lbl_8013D860 = .data:0x8013D860; // type:object size:0x30 scope:local data:string -lbl_8013D890 = .data:0x8013D890; // type:object size:0x30 scope:local data:string +lbl_8013D774 = .data:0x8013D774; // type:object size:0x9 scope:local data:string +lbl_8013D780 = .data:0x8013D780; // type:object size:0x1D scope:local data:string +lbl_8013D7A0 = .data:0x8013D7A0; // type:object size:0x2D scope:local data:string +lbl_8013D7D0 = .data:0x8013D7D0; // type:object size:0x2D scope:local data:string +lbl_8013D800 = .data:0x8013D800; // type:object size:0x2D scope:local data:string +lbl_8013D830 = .data:0x8013D830; // type:object size:0x2D scope:local data:string +lbl_8013D860 = .data:0x8013D860; // type:object size:0x2D scope:local data:string +lbl_8013D890 = .data:0x8013D890; // type:object size:0x2B scope:local data:string jumptable_8013D8C0 = .data:0x8013D8C0; // type:object size:0x68 scope:local jumptable_8013D928 = .data:0x8013D928; // type:object size:0x44 scope:local jumptable_8013D96C = .data:0x8013D96C; // type:object size:0x1C scope:local @@ -4408,7 +4444,7 @@ SectorSizeTable = .data:0x8013E060; // type:object size:0x20 scope:local LatencyTable = .data:0x8013E080; // type:object size:0x20 scope:local Si = .data:0x8013E0A0; // type:object size:0x14 scope:local data:4byte Type = .data:0x8013E0B4; // type:object size:0x10 scope:local -@464 = .data:0x8013E0C4; // type:object size:0x9 scope:local data:string +@464 = .data:0x8013E0C4; // type:object size:0xC scope:local data:string lbl_8013E0D0 = .data:0x8013E0D0; // type:object size:0xF scope:local data:string lbl_8013E0E0 = .data:0x8013E0E0; // type:object size:0xF scope:local data:string lbl_8013E0F0 = .data:0x8013E0F0; // type:object size:0xD scope:local data:string diff --git a/src/REL/E3setupDLL/mgselect.c b/src/REL/E3setupDLL/mgselect.c index 5dbd89eb..d87c662f 100644 --- a/src/REL/E3setupDLL/mgselect.c +++ b/src/REL/E3setupDLL/mgselect.c @@ -142,8 +142,6 @@ static float cursorYOfsTbl[] = { -100.0f, -50.0f, 0.0f, 50.0f, 100.0f }; static s32 mgPicTbl[] = { 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52 }; -static char startText[] = "\013\016\r PRESS START"; - static void StartMGSelect(omObjData *object) { HuAudSeqPlay(0x2B); @@ -490,12 +488,12 @@ static void CreateMGInterface(omObjData *object) index = HuSprCreate(temp_r3_2, 0x271A, 0); HuSprGrpMemberSet(group, 0, index); index2++; - HuWinMesMaxSizeGet(1, sp8, &startText); + HuWinMesMaxSizeGet(1, sp8, "\013\016\r PRESS START"); index = HuWinCreate(340.0f, 362.0f, sp8[0], sp8[1], 0); unkStruct->unk_2C = index; HuWinMesColSet(index, 0); HuWinBGTPLvlSet(index, 0.0f); HuWinMesSpeedSet(index, 0); - HuWinMesSet(index, MAKE_MESSID_PTR(startText)); + HuWinMesSet(index, MAKE_MESSID_PTR("\013\016\r PRESS START")); object->func = UpdateMGInterface; } From 970da00ce2ce2696db14e872975f0212e6f42499 Mon Sep 17 00:00:00 2001 From: dbalatoni13 Date: Tue, 12 Nov 2024 19:16:59 +0100 Subject: [PATCH 26/29] Imported most of dolphin/os --- config/GMPE01_00/symbols.txt | 54 ++- configure.py | 44 +-- include/__ppc_eabi_linker.h | 79 ++++ include/dolphin/OSRtcPriv.h | 41 +- include/dolphin/os.h | 116 +++--- include/dolphin/os/OSAlloc.h | 17 +- include/dolphin/os/OSContext.h | 6 + include/dolphin/os/OSFont.h | 43 ++- include/dolphin/os/OSIC.h | 20 + include/dolphin/os/OSModule.h | 4 +- include/dolphin/os/OSPriv.h | 32 ++ src/dolphin/os/OS.c | 645 +++++++++++++++++++++++++++++++ src/dolphin/os/OSAlarm.c | 199 ++++++++++ src/dolphin/os/OSAlloc.c | 531 +++++++++++++++++++++++++ src/dolphin/os/OSArena.c | 53 +++ src/dolphin/os/OSAudioSystem.c | 118 ++++++ src/dolphin/os/OSCache.c | 450 +++++++++++++++++++++ src/dolphin/os/OSContext.c | 555 ++++++++++++++++++++++++++ src/dolphin/os/OSError.c | 115 ++++++ src/dolphin/os/OSFont.c | 323 ++++++++++++++++ src/dolphin/os/OSInterrupt.c | 434 +++++++++++++++++++++ src/dolphin/os/OSLink.c | 504 ++++++++++++++++++++++++ src/dolphin/os/OSMemory.c | 230 +++++++++++ src/dolphin/os/OSMessage.c | 91 +++++ src/dolphin/os/OSMutex.c | 244 ++++++++++++ src/dolphin/os/OSReboot.c | 94 +++++ src/dolphin/os/OSReset.c | 203 ++++++++++ src/dolphin/os/OSResetSW.c | 89 +++++ src/dolphin/os/OSRtc.c | 363 +++++++++++++++++ src/dolphin/os/OSStopwatch.c | 61 +++ src/dolphin/os/OSSync.c | 29 ++ src/dolphin/os/OSThread.c | 552 ++++++++++++++++++++++++++ src/dolphin/os/OSTime.c | 146 +++++++ src/dolphin/os/__ppc_eabi_init.c | 76 ++++ src/dolphin/os/__start.c | 161 ++++++++ 35 files changed, 6591 insertions(+), 131 deletions(-) create mode 100644 include/__ppc_eabi_linker.h create mode 100644 include/dolphin/os/OSIC.h create mode 100644 src/dolphin/os/OS.c create mode 100644 src/dolphin/os/OSAlarm.c create mode 100644 src/dolphin/os/OSAlloc.c create mode 100644 src/dolphin/os/OSArena.c create mode 100644 src/dolphin/os/OSAudioSystem.c create mode 100644 src/dolphin/os/OSCache.c create mode 100644 src/dolphin/os/OSContext.c create mode 100644 src/dolphin/os/OSError.c create mode 100644 src/dolphin/os/OSFont.c create mode 100644 src/dolphin/os/OSInterrupt.c create mode 100644 src/dolphin/os/OSLink.c create mode 100644 src/dolphin/os/OSMemory.c create mode 100644 src/dolphin/os/OSMessage.c create mode 100644 src/dolphin/os/OSMutex.c create mode 100644 src/dolphin/os/OSReboot.c create mode 100644 src/dolphin/os/OSReset.c create mode 100644 src/dolphin/os/OSResetSW.c create mode 100644 src/dolphin/os/OSRtc.c create mode 100644 src/dolphin/os/OSStopwatch.c create mode 100644 src/dolphin/os/OSSync.c create mode 100644 src/dolphin/os/OSThread.c create mode 100644 src/dolphin/os/OSTime.c create mode 100644 src/dolphin/os/__ppc_eabi_init.c create mode 100644 src/dolphin/os/__start.c diff --git a/config/GMPE01_00/symbols.txt b/config/GMPE01_00/symbols.txt index 3cb7cb54..144dc6c3 100644 --- a/config/GMPE01_00/symbols.txt +++ b/config/GMPE01_00/symbols.txt @@ -2102,6 +2102,8 @@ OSSetErrorHandler = .text:0x800B6FC8; // type:function size:0x1C scope:global __OSUnhandledException = .text:0x800B6FE4; // type:function size:0x200 scope:global OSGetFontEncode = .text:0x800B71E4; // type:function size:0x58 OSDisableInterrupts = .text:0x800B723C; // type:function size:0x14 scope:global +__RAS_OSDisableInterrupts_begin = .text:0x800B723C; // type:label scope:global +__RAS_OSDisableInterrupts_end = .text:0x800B724C; // type:label scope:global OSEnableInterrupts = .text:0x800B7250; // type:function size:0x14 scope:global OSRestoreInterrupts = .text:0x800B7264; // type:function size:0x24 scope:global __OSSetInterruptHandler = .text:0x800B7288; // type:function size:0x1C scope:global @@ -4343,7 +4345,25 @@ lbl_8013B60C = .data:0x8013B60C; // type:object size:0x12 scope:local data:strin lbl_8013B620 = .data:0x8013B620; // type:object size:0xE scope:local data:string lbl_8013B630 = .data:0x8013B630; // type:object size:0x15 scope:local data:string __OSExceptionLocations = .data:0x8013B648; // type:object size:0x3C scope:local -lbl_8013B720 = .data:0x8013B720; // type:object size:0x398 +lbl_8013B720 = .data:0x8013B720; // type:object size:0x24 scope:local data:string +lbl_8013B744 = .data:0x8013B744; // type:object size:0x37 scope:local data:string +lbl_8013B77C = .data:0x8013B77C; // type:object size:0x28 scope:local data:string +lbl_8013B7A4 = .data:0x8013B7A4; // type:object size:0x4F scope:local data:string +lbl_8013B7F4 = .data:0x8013B7F4; // type:object size:0x3E scope:local data:string +lbl_8013B834 = .data:0x8013B834; // type:object size:0x37 scope:local data:string +lbl_8013B86C = .data:0x8013B86C; // type:object size:0x49 scope:local data:string +lbl_8013B8B8 = .data:0x8013B8B8; // type:object size:0x33 scope:local data:string +lbl_8013B8EC = .data:0x8013B8EC; // type:object size:0x3D scope:local data:string +lbl_8013B92C = .data:0x8013B92C; // type:object size:0x39 scope:local data:string +lbl_8013B968 = .data:0x8013B968; // type:object size:0x45 scope:local data:string +lbl_8013B9B0 = .data:0x8013B9B0; // type:object size:0x5F scope:local data:string +lbl_8013BA10 = .data:0x8013BA10; // type:object size:0x2C scope:local data:string +lbl_8013BA3C = .data:0x8013BA3C; // type:object size:0x12 scope:local data:string +lbl_8013BA50 = .data:0x8013BA50; // type:object size:0x12 scope:local data:string +lbl_8013BA64 = .data:0x8013BA64; // type:object size:0x1A scope:local data:string +lbl_8013BA80 = .data:0x8013BA80; // type:object size:0x13 scope:local data:string +lbl_8013BA94 = .data:0x8013BA94; // type:object size:0x10 scope:local data:string +lbl_8013BAA4 = .data:0x8013BAA4; // type:object size:0xE scope:local data:string DSPInitCode = .data:0x8013BAB8; // type:object size:0x80 scope:local @69 = .data:0x8013BB38; // type:object size:0x29 scope:local data:string lbl_8013BB64 = .data:0x8013BB64; // type:object size:0x18 scope:local data:string @@ -4360,7 +4380,8 @@ lbl_8013BD00 = .data:0x8013BD00; // type:object size:0x19 scope:local data:strin lbl_8013BD1C = .data:0x8013BD1C; // type:object size:0x16 scope:local data:string lbl_8013BD34 = .data:0x8013BD34; // type:object size:0x2E scope:local data:string lbl_8013BD68 = .data:0x8013BD68; // type:object size:0x44 scope:local data:string -lbl_8013BDAC = .data:0x8013BDAC; // type:object size:0x5F scope:local data:string +lbl_8013BDAC = .data:0x8013BDAC; // type:object size:0x30 scope:local data:string +lbl_8013BDDC = .data:0x8013BDDC; // type:object size:0x2F scope:local data:string lbl_8013BE0C = .data:0x8013BE0C; // type:object size:0x2F scope:local data:string lbl_8013BE3C = .data:0x8013BE3C; // type:object size:0x11 scope:local data:string lbl_8013BE50 = .data:0x8013BE50; // type:object size:0x21 scope:local data:string @@ -4370,14 +4391,33 @@ lbl_8013BEA4 = .data:0x8013BEA4; // type:object size:0x12 scope:local data:strin lbl_8013BEB8 = .data:0x8013BEB8; // type:object size:0x1D scope:local data:string lbl_8013BED8 = .data:0x8013BED8; // type:object size:0x26 scope:local data:string lbl_8013BF00 = .data:0x8013BF00; // type:object size:0x1C scope:local data:string -@74 = .data:0x8013BF1C; // type:object size:0x23 scope:local data:string +@76 = .data:0x8013BF1C; // type:object size:0x23 scope:local data:string @10 = .data:0x8013BF40; // type:object size:0x16 scope:local data:string -@43 = .data:0x8013C21C; // type:object size:0x40 scope:local +lbl_8013BF58 = .data:0x8013BF58; // type:object size:0x26 scope:local data:string +lbl_8013BF80 = .data:0x8013BF80; // type:object size:0x1C scope:local data:string +lbl_8013BF9C = .data:0x8013BF9C; // type:object size:0x1D scope:local data:string +lbl_8013BFBC = .data:0x8013BFBC; // type:object size:0x17 scope:local data:string +lbl_8013BFD4 = .data:0x8013BFD4; // type:object size:0x31 scope:local data:string +lbl_8013C008 = .data:0x8013C008; // type:object size:0x10 scope:local data:string +lbl_8013C018 = .data:0x8013C018; // type:object size:0x60 scope:local data:string +lbl_8013C078 = .data:0x8013C078; // type:object size:0x4C scope:local data:string +lbl_8013C0C4 = .data:0x8013C0C4; // type:object size:0x62 scope:local data:string +lbl_8013C128 = .data:0x8013C128; // type:object size:0x60 scope:local data:string +lbl_8013C188 = .data:0x8013C188; // type:object size:0x1F scope:local data:string +lbl_8013C1A8 = .data:0x8013C1A8; // type:object size:0x1F scope:local data:string +lbl_8013C1C8 = .data:0x8013C1C8; // type:object size:0x1B scope:local data:string +lbl_8013C1E4 = .data:0x8013C1E4; // type:object size:0x35 scope:local data:string +@87 = .data:0x8013C21C; // type:object size:0x40 scope:local InterruptPrioTable = .data:0x8013C260; // type:object size:0x2C scope:local data:4byte -lbl_8013C290 = .data:0x8013C290; // type:object size:0x28 -lbl_8013C2B8 = .data:0x8013C2B8; // type:object size:0x28 +lbl_8013C290 = .data:0x8013C290; // type:object size:0x25 scope:local data:string +lbl_8013C2B8 = .data:0x8013C2B8; // type:object size:0x27 scope:local data:string ResetFunctionInfo = .data:0x8013C2E0; // type:object size:0x10 scope:local -lbl_8013C2F0 = .data:0x8013C2F0; // type:object size:0x78 +lbl_8013C2F0 = .data:0x8013C2F0; // type:object size:0x12 scope:local data:string +lbl_8013C304 = .data:0x8013C304; // type:object size:0x11 scope:local data:string +lbl_8013C318 = .data:0x8013C318; // type:object size:0xD scope:local data:string +lbl_8013C328 = .data:0x8013C328; // type:object size:0x11 scope:local data:string +lbl_8013C33C = .data:0x8013C33C; // type:object size:0x11 scope:local data:string +lbl_8013C350 = .data:0x8013C350; // type:object size:0x11 scope:local data:string YearDays = .data:0x8013C368; // type:object size:0x30 scope:local LeapYearDays = .data:0x8013C398; // type:object size:0x30 scope:local lbl_8013C3C8 = .data:0x8013C3C8; // type:object size:0x18 scope:local data:string diff --git a/configure.py b/configure.py index 5e8750df..52215c30 100644 --- a/configure.py +++ b/configure.py @@ -458,30 +458,30 @@ config.libs = [ DolphinLib( "os", [ - Object(NonMatching, "dolphin/os/OS.c"), - Object(NonMatching, "dolphin/os/OSAlarm.c"), + Object(Matching, "dolphin/os/OS.c"), + Object(Matching, "dolphin/os/OSAlarm.c"), Object(NonMatching, "dolphin/os/OSAlloc.c"), - Object(NonMatching, "dolphin/os/OSArena.c"), - Object(NonMatching, "dolphin/os/OSAudioSystem.c"), - Object(NonMatching, "dolphin/os/OSCache.c"), - Object(NonMatching, "dolphin/os/OSContext.c"), - Object(NonMatching, "dolphin/os/OSError.c"), - Object(NonMatching, "dolphin/os/OSFont.c"), - Object(NonMatching, "dolphin/os/OSInterrupt.c"), - Object(NonMatching, "dolphin/os/OSLink.c"), - Object(NonMatching, "dolphin/os/OSMessage.c"), - Object(NonMatching, "dolphin/os/OSMemory.c"), - Object(NonMatching, "dolphin/os/OSMutex.c"), + Object(Matching, "dolphin/os/OSArena.c"), + Object(Matching, "dolphin/os/OSAudioSystem.c"), + Object(Matching, "dolphin/os/OSCache.c"), + Object(Matching, "dolphin/os/OSContext.c"), + Object(Matching, "dolphin/os/OSError.c"), + Object(Matching, "dolphin/os/OSFont.c"), + Object(Matching, "dolphin/os/OSInterrupt.c"), + Object(Matching, "dolphin/os/OSLink.c"), + Object(Matching, "dolphin/os/OSMessage.c"), + Object(Matching, "dolphin/os/OSMemory.c"), + Object(Matching, "dolphin/os/OSMutex.c"), Object(NonMatching, "dolphin/os/OSReboot.c"), - Object(NonMatching, "dolphin/os/OSReset.c"), - Object(NonMatching, "dolphin/os/OSResetSW.c"), - Object(NonMatching, "dolphin/os/OSRtc.c"), - Object(NonMatching, "dolphin/os/OSStopwatch.c"), - Object(NonMatching, "dolphin/os/OSSync.c"), - Object(NonMatching, "dolphin/os/OSThread.c"), - Object(NonMatching, "dolphin/os/OSTime.c"), - Object(NonMatching, "dolphin/os/__start.c"), - Object(NonMatching, "dolphin/os/__ppc_eabi_init.c"), + Object(Matching, "dolphin/os/OSReset.c"), + Object(Matching, "dolphin/os/OSResetSW.c"), + Object(Matching, "dolphin/os/OSRtc.c"), + Object(Matching, "dolphin/os/OSStopwatch.c"), + Object(Matching, "dolphin/os/OSSync.c"), + Object(Matching, "dolphin/os/OSThread.c"), + Object(Matching, "dolphin/os/OSTime.c"), + Object(Matching, "dolphin/os/__start.c"), + Object(Matching, "dolphin/os/__ppc_eabi_init.c"), ], ), DolphinLib( diff --git a/include/__ppc_eabi_linker.h b/include/__ppc_eabi_linker.h new file mode 100644 index 00000000..2fddd9c9 --- /dev/null +++ b/include/__ppc_eabi_linker.h @@ -0,0 +1,79 @@ +#ifndef __PPC_EABI_LINKER +#define __PPC_EABI_LINKER + +#ifdef __MWERKS__ +#define DECL_SECTION(name) __declspec(section name) +#else +#define DECL_SECTION(name) +#endif + +DECL_SECTION(".init") extern char _stack_addr[]; +DECL_SECTION(".init") extern char _stack_end[]; +DECL_SECTION(".init") extern char _heap_addr[]; +DECL_SECTION(".init") extern char _heap_end[]; +DECL_SECTION(".init") extern const char _fextabindex_rom[]; +DECL_SECTION(".init") extern char _fextabindex[]; +DECL_SECTION(".init") extern char _eextabindex[]; + +DECL_SECTION(".init") extern char _SDA_BASE_[]; + +DECL_SECTION(".init") extern char _SDA2_BASE_[]; + +typedef struct __rom_copy_info { + char* rom; + char* addr; + unsigned int size; +} __rom_copy_info; + +DECL_SECTION(".init") extern __rom_copy_info _rom_copy_info[]; + +typedef struct __bss_init_info { + char* addr; + unsigned int size; +} __bss_init_info; + +DECL_SECTION(".init") extern __bss_init_info _bss_init_info[]; + +typedef struct __eti_init_info { + void* eti_start; + void* eti_end; + void* code_start; + unsigned long code_size; +} __eti_init_info; + +DECL_SECTION(".init") extern __eti_init_info _eti_init_info[]; +DECL_SECTION(".init") extern const char _f_init_rom[]; +DECL_SECTION(".init") extern char _f_init[]; +DECL_SECTION(".init") extern char _e_init[]; +DECL_SECTION(".init") extern const char _f_text_rom[]; +DECL_SECTION(".init") extern char _f_text[]; +DECL_SECTION(".init") extern char _e_text[]; +DECL_SECTION(".init") extern const char _f_rodata_rom[]; +DECL_SECTION(".init") extern char _f_rodata[]; +DECL_SECTION(".init") extern char _e_rodata[]; +DECL_SECTION(".init") extern const char _fextab_rom[]; +DECL_SECTION(".init") extern char _fextab[]; +DECL_SECTION(".init") extern char _eextab[]; +DECL_SECTION(".init") extern const char _f_data_rom[]; +DECL_SECTION(".init") extern char _f_data[]; +DECL_SECTION(".init") extern char _e_data[]; +DECL_SECTION(".init") extern char _f_bss[]; +DECL_SECTION(".init") extern char _e_bss[]; +DECL_SECTION(".init") extern const char _f_sdata_rom[]; +DECL_SECTION(".init") extern char _f_sdata[]; +DECL_SECTION(".init") extern char _e_sdata[]; +DECL_SECTION(".init") extern char _f_sbss[]; +DECL_SECTION(".init") extern char _e_sbss[]; +DECL_SECTION(".init") extern const char _f_sdata2_rom[]; +DECL_SECTION(".init") extern char _f_sdata2[]; +DECL_SECTION(".init") extern char _e_sdata2[]; +DECL_SECTION(".init") extern char _f_sbss2[]; +DECL_SECTION(".init") extern char _e_sbss2[]; +DECL_SECTION(".init") extern const char _f_PPC_EMB_sdata0_rom[]; +DECL_SECTION(".init") extern char _f_PPC_EMB_sdata0[]; +DECL_SECTION(".init") extern char _e_PPC_EMB_sdata0[]; +DECL_SECTION(".init") extern char _f_PPC_EMB_sbss0[]; +DECL_SECTION(".init") extern char _e_PPC_EMB_sbss0[]; + + +#endif // __PPC_EABI_LINKER diff --git a/include/dolphin/OSRtcPriv.h b/include/dolphin/OSRtcPriv.h index 949c71e7..fe1df144 100644 --- a/include/dolphin/OSRtcPriv.h +++ b/include/dolphin/OSRtcPriv.h @@ -4,30 +4,33 @@ #include typedef struct OSSram { - u16 checkSum; - u16 checkSumInv; - u32 ead0; - u32 ead1; - u32 counterBias; - s8 displayOffsetH; - u8 ntd; - u8 language; - u8 flags; + u16 checkSum; + u16 checkSumInv; + u32 ead0; + u32 ead1; + u32 counterBias; + s8 displayOffsetH; + u8 ntd; + u8 language; + u8 flags; } OSSram; typedef struct OSSramEx { - u8 flashID[2][12]; - u32 wirelessKeyboardID; - u16 wirelessPadID[4]; - u8 dvdErrorCode; - u8 _padding0; - u8 flashIDCheckSum[2]; - u16 gbs; - u8 _padding1[2]; + u8 flashID[2][12]; + u32 wirelessKeyboardID; + u16 wirelessPadID[4]; + u8 dvdErrorCode; + u8 _padding0; + u8 flashIDCheckSum[2]; + u16 gbs; + u8 _padding1[2]; } OSSramEx; -OSSram* __OSLockSram(); -OSSramEx* __OSLockSramEx(); +void __OSInitSram(); +OSSram *__OSLockSram(); +BOOL __OSSyncSram(); +BOOL __OSUnlockSram(BOOL commit); +OSSramEx *__OSLockSramEx(); void OSSetWirelessID(s32 chan, u16 id); u16 OSGetWirelessID(s32 chan); diff --git a/include/dolphin/os.h b/include/dolphin/os.h index 83f15519..6394de8b 100644 --- a/include/dolphin/os.h +++ b/include/dolphin/os.h @@ -23,26 +23,26 @@ extern "C" { #endif typedef s64 OSTime; typedef u32 OSTick; -u32 __OSBusClock AT_ADDRESS(OS_BASE_CACHED | 0x00F8); // sync with OSLoMem.h +u32 __OSBusClock AT_ADDRESS(OS_BASE_CACHED | 0x00F8); // sync with OSLoMem.h u32 __OSCoreClock AT_ADDRESS(OS_BASE_CACHED | 0x00FC); // sync with OSLoMem.h -#define OS_BUS_CLOCK (u32)__OSBusClock +#define OS_BUS_CLOCK (u32) __OSBusClock #define OS_CORE_CLOCK __OSCoreClock #define OS_TIMER_CLOCK (OS_BUS_CLOCK / 4) #ifndef _DEBUG -#define OSPhysicalToCached(paddr) ((void*)((u32)(paddr) + OS_BASE_CACHED)) -#define OSPhysicalToUncached(paddr) ((void*)((u32)(paddr) + OS_BASE_UNCACHED)) -#define OSCachedToPhysical(caddr) ((u32)((u8*)(caddr)-OS_BASE_CACHED)) -#define OSUncachedToPhysical(ucaddr) ((u32)((u8*)(ucaddr)-OS_BASE_UNCACHED)) -#define OSCachedToUncached(caddr) ((void*)((u8*)(caddr) + (OS_BASE_UNCACHED - OS_BASE_CACHED))) -#define OSUncachedToCached(ucaddr) ((void*)((u8*)(ucaddr) - (OS_BASE_UNCACHED - OS_BASE_CACHED))) +#define OSPhysicalToCached(paddr) ((void *)((u32)(paddr) + OS_BASE_CACHED)) +#define OSPhysicalToUncached(paddr) ((void *)((u32)(paddr) + OS_BASE_UNCACHED)) +#define OSCachedToPhysical(caddr) ((u32)((u8 *)(caddr)-OS_BASE_CACHED)) +#define OSUncachedToPhysical(ucaddr) ((u32)((u8 *)(ucaddr)-OS_BASE_UNCACHED)) +#define OSCachedToUncached(caddr) ((void *)((u8 *)(caddr) + (OS_BASE_UNCACHED - OS_BASE_CACHED))) +#define OSUncachedToCached(ucaddr) ((void *)((u8 *)(ucaddr) - (OS_BASE_UNCACHED - OS_BASE_CACHED))) #else -u32 OSPhysicalToCached(void* paddr); -u32 OSPhysicalToUncached(void* paddr); -u32 OSCachedToPhysical(void* caddr); -u32 OSUncachedToPhysical(void* ucaddr); -u32 OSCachedToUncached(void* caddr); -u32 OSUncachedToCached(void* ucaddr); +u32 OSPhysicalToCached(void *paddr); +u32 OSPhysicalToUncached(void *paddr); +u32 OSCachedToPhysical(void *caddr); +u32 OSUncachedToPhysical(void *ucaddr); +u32 OSCachedToUncached(void *caddr); +u32 OSUncachedToCached(void *ucaddr); #endif #define OSTicksToCycles(ticks) (((ticks) * ((OS_CORE_CLOCK * 2) / OS_TIMER_CLOCK)) / 2) @@ -50,7 +50,7 @@ u32 OSUncachedToCached(void* ucaddr); #define OSTicksToMilliseconds(ticks) ((ticks) / (OS_TIMER_CLOCK / 1000)) #define OSTicksToMicroseconds(ticks) (((ticks)*8) / (OS_TIMER_CLOCK / 125000)) #define OSTicksToNanoseconds(ticks) (((ticks)*8000) / (OS_TIMER_CLOCK / 125000)) -#define OSSecondsToTicks(sec) ((sec)*OS_TIMER_CLOCK) +#define OSSecondsToTicks(sec) ((sec)*OS_TIMER_CLOCK) #define OSMillisecondsToTicks(msec) ((msec) * (OS_TIMER_CLOCK / 1000)) #define OSMicrosecondsToTicks(usec) (((usec) * (OS_TIMER_CLOCK / 125000)) / 8) #define OSNanosecondsToTicks(nsec) (((nsec) * (OS_TIMER_CLOCK / 125000)) / 8000) @@ -60,52 +60,44 @@ u32 OSUncachedToCached(void* ucaddr); #define OSRoundUp32B(v) (((u32)(v + 31) & ~31)) #define OSRoundDown32B(x) (((u32)(x)) & ~31) -void* OSGetArenaHi(void); -void* OSGetArenaLo(void); -void OSSetArenaHi(void* newHi); -void OSSetArenaLo(void* newLo); - -void* OSAllocFromArenaLo(u32 size, u32 align); -void* OSAllocFromArenaHi(u32 size, u32 align); - void OSInit(); OSTime OSGetTime(); OSTick OSGetTick(); typedef struct OSCalendarTime { - int sec; // seconds after the minute [0, 61] - int min; // minutes after the hour [0, 59] - int hour; // hours since midnight [0, 23] - int mday; // day of the month [1, 31] - int mon; // month since January [0, 11] - int year; // years in AD [1, ...] - int wday; // days since Sunday [0, 6] - int yday; // days since January 1 [0, 365] + int sec; // seconds after the minute [0, 61] + int min; // minutes after the hour [0, 59] + int hour; // hours since midnight [0, 23] + int mday; // day of the month [1, 31] + int mon; // month since January [0, 11] + int year; // years in AD [1, ...] + int wday; // days since Sunday [0, 6] + int yday; // days since January 1 [0, 365] - int msec; // milliseconds after the second [0,999] - int usec; // microseconds after the millisecond [0,999] + int msec; // milliseconds after the second [0,999] + int usec; // microseconds after the millisecond [0,999] } OSCalendarTime; -OSTime OSCalendarTimeToTicks(OSCalendarTime* td); -void OSTicksToCalendarTime(OSTime ticks, OSCalendarTime* td); +OSTime OSCalendarTimeToTicks(OSCalendarTime *td); +void OSTicksToCalendarTime(OSTime ticks, OSCalendarTime *td); typedef struct OSStopwatch { - char* name; - OSTime total; - u32 hits; - OSTime min; - OSTime max; - OSTime last; - BOOL running; + char *name; + OSTime total; + u32 hits; + OSTime min; + OSTime max; + OSTime last; + BOOL running; } OSStopwatch; -void OSInitStopwatch(OSStopwatch* sw, char* name); -void OSStartStopwatch(OSStopwatch* sw); -void OSStopStopwatch(OSStopwatch* sw); -OSTime OSCheckStopwatch(OSStopwatch* sw); -void OSResetStopwatch(OSStopwatch* sw); -void OSDumpStopwatch(OSStopwatch* sw); +void OSInitStopwatch(OSStopwatch *sw, char *name); +void OSStartStopwatch(OSStopwatch *sw); +void OSStopStopwatch(OSStopwatch *sw); +OSTime OSCheckStopwatch(OSStopwatch *sw); +void OSResetStopwatch(OSStopwatch *sw); +void OSDumpStopwatch(OSStopwatch *sw); #define OS_CONSOLE_MASK 0xf0000000 #define OS_CONSOLE_RETAIL 0x00000000 @@ -159,7 +151,7 @@ void OSSetLanguage(u8 language); u32 OSGetEuRgb60Mode(void); void OSSetEuRgb60Mode(u32 on); -void OSRegisterVersion(const char* id); +void OSRegisterVersion(const char *id); BOOL OSDisableInterrupts(void); BOOL OSEnableInterrupts(void); @@ -174,8 +166,7 @@ BOOL OSRestoreInterrupts(BOOL level); #endif #ifndef ASSERTMSG -#if defined(__STDC_VERSION__) && (199901L <= __STDC_VERSION__) || defined(__MWERKS__) || \ - defined(__SN__) +#if defined(__STDC_VERSION__) && (199901L <= __STDC_VERSION__) || defined(__MWERKS__) || defined(__SN__) #define ASSERTMSG(exp, ...) (void)((exp) || (OSPanic(__FILE__, __LINE__, __VA_ARGS__), 0)) #else #define ASSERTMSG(exp, msg) (void)((exp) || (OSPanic(__FILE__, __LINE__, (msg)), 0)) @@ -183,23 +174,20 @@ BOOL OSRestoreInterrupts(BOOL level); #endif #ifndef ASSERTMSG1 -#define ASSERTMSG1(exp, msg, param1) \ - (void)((exp) || (OSPanic(__FILE__, __LINE__, (msg), (param1)), 0)) +#define ASSERTMSG1(exp, msg, param1) (void)((exp) || (OSPanic(__FILE__, __LINE__, (msg), (param1)), 0)) #endif #ifndef ASSERTMSG2 -#define ASSERTMSG2(exp, msg, param1, param2) \ - (void)((exp) || (OSPanic(__FILE__, __LINE__, (msg), (param1), (param2)), 0)) +#define ASSERTMSG2(exp, msg, param1, param2) (void)((exp) || (OSPanic(__FILE__, __LINE__, (msg), (param1), (param2)), 0)) #endif #ifndef ASSERTMSG3 -#define ASSERTMSG3(exp, msg, param1, param2, param3) \ - (void)((exp) || (OSPanic(__FILE__, __LINE__, (msg), (param1), (param2), (param3)), 0)) +#define ASSERTMSG3(exp, msg, param1, param2, param3) (void)((exp) || (OSPanic(__FILE__, __LINE__, (msg), (param1), (param2), (param3)), 0)) #endif #ifndef ASSERTMSG4 -#define ASSERTMSG4(exp, msg, param1, param2, param3, param4) \ - (void)((exp) || (OSPanic(__FILE__, __LINE__, (msg), (param1), (param2), (param3), (param4)), 0)) +#define ASSERTMSG4(exp, msg, param1, param2, param3, param4) \ + (void)((exp) || (OSPanic(__FILE__, __LINE__, (msg), (param1), (param2), (param3), (param4)), 0)) #endif #else // _DEBUG @@ -209,8 +197,7 @@ BOOL OSRestoreInterrupts(BOOL level); #endif #ifndef ASSERTMSG -#if defined(__STDC_VERSION__) && (199901L <= __STDC_VERSION__) || defined(__MWERKS__) || \ - defined(__SN__) +#if defined(__STDC_VERSION__) && (199901L <= __STDC_VERSION__) || defined(__MWERKS__) || defined(__SN__) #define ASSERTMSG(exp, ...) ((void)0) #else #define ASSERTMSG(exp, msg) ((void)0) @@ -232,9 +219,9 @@ BOOL OSRestoreInterrupts(BOOL level); #endif // _DEBUG -void OSReport(const char* msg, ...); -void OSPanic(const char* file, int line, const char* msg, ...); -void OSFatal(GXColor fg, GXColor bg, const char* msg); +void OSReport(const char *msg, ...); +void OSPanic(const char *file, int line, const char *msg, ...); +void OSFatal(GXColor fg, GXColor bg, const char *msg); u32 OSGetPhysicalMemSize(void); u32 OSGetConsoleSimulatedMemSize(void); @@ -253,6 +240,7 @@ u32 OSGetConsoleSimulatedMemSize(void); #include #include #include +#include #include #include #include diff --git a/include/dolphin/os/OSAlloc.h b/include/dolphin/os/OSAlloc.h index bbd90491..686dae2b 100644 --- a/include/dolphin/os/OSAlloc.h +++ b/include/dolphin/os/OSAlloc.h @@ -7,19 +7,18 @@ extern "C" { #endif typedef int OSHeapHandle; -typedef void (*OSAllocVisitor)(void* obj, u32 size); -void* OSInitAlloc(void* arenaStart, void* arenaEnd, int maxHeaps); -OSHeapHandle OSCreateHeap(void* start, void* end); +typedef void (*OSAllocVisitor)(void *obj, u32 size); +void *OSInitAlloc(void *arenaStart, void *arenaEnd, int maxHeaps); +OSHeapHandle OSCreateHeap(void *start, void *end); void OSDestroyHeap(OSHeapHandle heap); -void OSAddToHeap(OSHeapHandle heap, void* start, void* end); +void OSAddToHeap(OSHeapHandle heap, void *start, void *end); OSHeapHandle OSSetCurrentHeap(OSHeapHandle heap); -void* OSAllocFromHeap(OSHeapHandle heap, u32 size); -void* OSAllocFixed(void** rstart, void** rend); -void OSFreeToHeap(OSHeapHandle heap, void* ptr); +void *OSAllocFromHeap(OSHeapHandle heap, u32 size); +void *OSAllocFixed(void **rstart, void **rend); +void OSFreeToHeap(OSHeapHandle heap, void *ptr); long OSCheckHeap(OSHeapHandle heap); void OSDumpHeap(OSHeapHandle heap); -void *OSAllocFixed(void **rstart, void **rend); -u32 OSReferentSize(void* ptr); +u32 OSReferentSize(void *ptr); void OSVisitAllocated(OSAllocVisitor visitor); extern volatile OSHeapHandle __OSCurrHeap; #define OSAlloc(size) OSAllocFromHeap(__OSCurrHeap, (size)) diff --git a/include/dolphin/os/OSContext.h b/include/dolphin/os/OSContext.h index bbd0aaa1..b363a214 100644 --- a/include/dolphin/os/OSContext.h +++ b/include/dolphin/os/OSContext.h @@ -158,10 +158,16 @@ typedef struct OSContext { } OSContext; +u32 OSGetStackPointer(void); +void OSDumpContext(OSContext *context); u32 OSSaveContext(OSContext* context); +void OSLoadContext(OSContext* context); void OSClearContext(OSContext* context); OSContext* OSGetCurrentContext(); void OSSetCurrentContext(OSContext* context); +void OSSaveFPUContext(OSContext *fpuContext); +void OSInitContext(OSContext *context, u32 pc, u32 newsp); + #ifdef __cplusplus } diff --git a/include/dolphin/os/OSFont.h b/include/dolphin/os/OSFont.h index 99238bad..54cfec1b 100644 --- a/include/dolphin/os/OSFont.h +++ b/include/dolphin/os/OSFont.h @@ -9,17 +9,44 @@ extern "C" { #define OS_FONT_ENCODE_ANSI 0u #define OS_FONT_ENCODE_SJIS 1u -#define OS_FONT_ENCODE_UTF8 3u // UTF-8 [RFC 3629] -#define OS_FONT_ENCODE_UTF16 4u // UTF-16BE [RFC 2781] -#define OS_FONT_ENCODE_UTF32 5u // UTF-32 -#define OS_FONT_ENCODE_MAX 5u -#define OS_FONT_ENCODE_VOID 0xffffu +#define OS_FONT_SIZE_ANSI (288 + 131072) // 9 sheets +#define OS_FONT_SIZE_SJIS (3840 + 1179648) // 1 sheet +#define OS_FONT_ROM_SIZE_ANSI 0x03000 +#define OS_FONT_ROM_SIZE_SJIS 0x4D000 -#define OS_FONT_PROPORTIONAL FALSE -#define OS_FONT_FIXED TRUE +typedef struct OSFontHeader +{ + /*0x00*/ u16 fontType; + u16 firstChar; + u16 lastChar; + u16 invalChar; + /*0x08*/ u16 ascent; + u16 descent; + u16 width; + u16 leading; + /*0x10*/ u16 cellWidth; + u16 cellHeight; + /*0x14*/ u32 sheetSize; + /*0x18*/ u16 sheetFormat; + u16 sheetColumn; + u16 sheetRow; + u16 sheetWidth; + /*0x20*/ u16 sheetHeight; + u16 widthTable; + u32 sheetImage; + u32 sheetFullSize; + u8 c0; + u8 c1; + u8 c2; + u8 c3; +} OSFontHeader; u16 OSGetFontEncode(void); -u16 OSSetFontEncode(u16 encode); +BOOL OSInitFont(OSFontHeader *fontData); +u32 OSLoadFont(OSFontHeader *fontData, void *temp); +char *OSGetFontTexture(char *string, void **image, s32 *x, s32 *y, s32 *width); +char *OSGetFontWidth(char *string, s32 *width); +char *OSGetFontTexel(char *string, void *image, s32 pos, s32 stride, s32 *width); #ifdef __cplusplus } diff --git a/include/dolphin/os/OSIC.h b/include/dolphin/os/OSIC.h new file mode 100644 index 00000000..017d5a58 --- /dev/null +++ b/include/dolphin/os/OSIC.h @@ -0,0 +1,20 @@ +#ifndef _DOLPHIN_OSIC +#define _DOLPHIN_OSIC + +#ifdef __cplusplus +extern "C" { +#endif + +void ICFlashInvalidate(void); +void ICEnable(void); +void ICDisable(void); +void ICFreeze(void); +void ICUnfreeze(void); +void ICBlockInvalidate(void *addr); +void ICSync(void); + +#ifdef __cplusplus +} +#endif + +#endif diff --git a/include/dolphin/os/OSModule.h b/include/dolphin/os/OSModule.h index 7baf2a9f..e8cbe25b 100644 --- a/include/dolphin/os/OSModule.h +++ b/include/dolphin/os/OSModule.h @@ -105,8 +105,8 @@ BOOL OSUnlink(OSModuleInfo* oldModule); OSModuleInfo* OSSearchModule(void* ptr, u32* section, u32* offset); // debugger notification -void OSNotifyLink(OSModuleInfo* module); -void OSNotifyUnlink(OSModuleInfo* module); +void OSNotifyLink(void); +void OSNotifyUnlink(void); #ifdef __cplusplus } diff --git a/include/dolphin/os/OSPriv.h b/include/dolphin/os/OSPriv.h index 8b914f25..11eeec59 100644 --- a/include/dolphin/os/OSPriv.h +++ b/include/dolphin/os/OSPriv.h @@ -7,10 +7,42 @@ extern "C" { #endif +#define OFFSET(addr, align) (((u32)(addr) & ((align)-1))) + +// OSAudioSystem.c +void __OSInitAudioSystem(void); +void __OSStopAudioSystem(void); + +// OSCache.c +void __OSCacheInit(void); + +// OSContext.c +void __OSContextInit(void); + +// OSMutex.c +void __OSUnlockAllMutex(struct OSThread *thread); + +// OSInterrupt.c +extern void __RAS_OSDisableInterrupts_begin(void); +extern void __RAS_OSDisableInterrupts_end(void); +void __OSInterruptInit(void); +void __OSModuleInit(void); + +void __OSInitSystemCall(void); + +// OSThread.c +void __OSThreadInit(void); +void __OSReschedule(void); + +typedef void (*OSExceptionHandler)(__OSException, OSContext*); +OSExceptionHandler __OSSetExceptionHandler(__OSException exception, OSExceptionHandler handler); __OSExceptionHandler __OSGetExceptionHandler(__OSException exception); OSTime __OSGetSystemTime(); OSTime __OSTimeToSystemTime(OSTime); +// OSReboot +void __OSReboot(u32 resetCode, u32 bootDol); + #ifdef __cplusplus } #endif diff --git a/src/dolphin/os/OS.c b/src/dolphin/os/OS.c new file mode 100644 index 00000000..69843d73 --- /dev/null +++ b/src/dolphin/os/OS.c @@ -0,0 +1,645 @@ +#include <__ppc_eabi_linker.h> +#include +#include +#include +#include +#include +#include +#include +#include +#include + +extern OSTime __OSGetSystemTime(); +extern char _db_stack_end[]; + +#define OS_BI2_DEBUG_ADDRESS 0x800000F4 +#define DEBUGFLAG_ADDR 0x800030E8 +#define OS_DEBUG_ADDRESS_2 0x800030E9 +#define OS_CURRENTCONTEXT_PADDR 0x00C0 + +extern char *__OSResetSWInterruptHandler[]; + +vu16 __OSDeviceCode : (OS_BASE_CACHED | 0x30E6); +static DVDDriveInfo DriveInfo ATTRIBUTE_ALIGN(32); +static DVDCommandBlock DriveBlock; + +static OSBootInfo *BootInfo; +static u32 *BI2DebugFlag; +static u32 *BI2DebugFlagHolder; +__declspec(weak) BOOL __OSIsGcam = FALSE; +static f64 ZeroF; +static f32 ZeroPS[2]; +static BOOL AreWeInitialized = FALSE; +static __OSExceptionHandler *OSExceptionTable; +OSTime __OSStartTime; +BOOL __OSInIPL; + +extern u8 __ArenaHi[]; +extern u8 __ArenaLo[]; +extern u32 __DVDLongFileNameFlag; +extern u32 __PADSpec; + +#define OS_EXCEPTIONTABLE_ADDR 0x3000 +#define OS_DBJUMPPOINT_ADDR 0x60 +// memory locations for important stuff +#define OS_CACHED_REGION_PREFIX 0x8000 +#define OS_BI2_DEBUG_ADDRESS 0x800000F4 +#define OS_BI2_DEBUGFLAG_OFFSET 0xC +#define PAD3_BUTTON_ADDR 0x800030E4 +#define OS_DVD_DEVICECODE 0x800030E6 +#define DEBUGFLAG_ADDR 0x800030E8 +#define OS_DEBUG_ADDRESS_2 0x800030E9 +#define DB_EXCEPTIONRET_OFFSET 0xC +#define DB_EXCEPTIONDEST_OFFSET 0x8 + +void OSDefaultExceptionHandler(__OSException exception, OSContext *context); +extern BOOL __DBIsExceptionMarked(__OSException); +static void OSExceptionInit(void); + +/* clang-format off */ +asm void __OSFPRInit(void) +{ + nofralloc + + mfmsr r3 + ori r3, r3, 0x2000 + mtmsr r3 + + mfspr r3, 0x398 + rlwinm. r3, r3, 3, 31, 31 + beq SkipPairedSingles + + lis r3, ZeroPS@ha + addi r3, r3, ZeroPS@l + psq_l fp0, 0(r3), 0, 0 + ps_mr fp1, fp0 + ps_mr fp2, fp0 + ps_mr fp3, fp0 + ps_mr fp4, fp0 + ps_mr fp5, fp0 + ps_mr fp6, fp0 + ps_mr fp7, fp0 + ps_mr fp8, fp0 + ps_mr fp9, fp0 + ps_mr fp10, fp0 + ps_mr fp11, fp0 + ps_mr fp12, fp0 + ps_mr fp13, fp0 + ps_mr fp14, fp0 + ps_mr fp15, fp0 + ps_mr fp16, fp0 + ps_mr fp17, fp0 + ps_mr fp18, fp0 + ps_mr fp19, fp0 + ps_mr fp20, fp0 + ps_mr fp21, fp0 + ps_mr fp22, fp0 + ps_mr fp23, fp0 + ps_mr fp24, fp0 + ps_mr fp25, fp0 + ps_mr fp26, fp0 + ps_mr fp27, fp0 + ps_mr fp28, fp0 + ps_mr fp29, fp0 + ps_mr fp30, fp0 + ps_mr fp31, fp0 + +SkipPairedSingles: + lfd fp0, ZeroF + fmr fp1, fp0 + fmr fp2, fp0 + fmr fp3, fp0 + fmr fp4, fp0 + fmr fp5, fp0 + fmr fp6, fp0 + fmr fp7, fp0 + fmr fp8, fp0 + fmr fp9, fp0 + fmr fp10, fp0 + fmr fp11, fp0 + fmr fp12, fp0 + fmr fp13, fp0 + fmr fp14, fp0 + fmr fp15, fp0 + fmr fp16, fp0 + fmr fp17, fp0 + fmr fp18, fp0 + fmr fp19, fp0 + fmr fp20, fp0 + fmr fp21, fp0 + fmr fp22, fp0 + fmr fp23, fp0 + fmr fp24, fp0 + fmr fp25, fp0 + fmr fp26, fp0 + fmr fp27, fp0 + fmr fp28, fp0 + fmr fp29, fp0 + fmr fp30, fp0 + fmr fp31, fp0 + + mtfsf 0xFF, fp0 + + blr +} +/* clang-format on */ + +u32 OSGetConsoleType() +{ + if (BootInfo == NULL || BootInfo->consoleType == 0) { + return OS_CONSOLE_ARTHUR; + } + return BootInfo->consoleType; +} + +void *__OSSavedRegionStart; +void *__OSSavedRegionEnd; + +extern u32 BOOT_REGION_START : 0x812FDFF0; //(*(u32 *)0x812fdff0) +extern u32 BOOT_REGION_END : 0x812FDFEC; //(*(u32 *)0x812fdfec) + +void ClearArena(void) +{ + if ((u32)(OSGetResetCode() + 0x80000000) != 0U) { + __OSSavedRegionStart = 0U; + __OSSavedRegionEnd = 0U; + memset(OSGetArenaLo(), 0U, (u32)OSGetArenaHi() - (u32)OSGetArenaLo()); + return; + } + __OSSavedRegionStart = (void *)BOOT_REGION_START; + __OSSavedRegionEnd = (void *)BOOT_REGION_END; + if (BOOT_REGION_START == 0U) { + memset(OSGetArenaLo(), 0U, (u32)OSGetArenaHi() - (u32)OSGetArenaLo()); + return; + } + + if ((u32)OSGetArenaLo() < (u32)__OSSavedRegionStart) { + if ((u32)OSGetArenaHi() <= (u32)__OSSavedRegionStart) { + memset((u32)OSGetArenaLo(), 0U, (u32)OSGetArenaHi() - (u32)OSGetArenaLo()); + return; + } + memset(OSGetArenaLo(), 0U, (u32)__OSSavedRegionStart - (u32)OSGetArenaLo()); + if ((u32)OSGetArenaHi() > (u32)__OSSavedRegionEnd) { + memset((u32)__OSSavedRegionEnd, 0, (u32)OSGetArenaHi() - (u32)__OSSavedRegionEnd); + } + } +} + +static void InquiryCallback(s32 result, DVDCommandBlock *block) +{ + switch (block->state) { + case 0: + __OSDeviceCode = (u16)(0x8000 | DriveInfo.deviceCode); + break; + default: + __OSDeviceCode = 1; + break; + } +} + +void OSInit(void) +{ + /* + Initializes the Dolphin operating system. + - most of the main operations get farmed out to other functions + - loading debug info and setting up heap bounds largely happen here + - a lot of OS reporting also gets controlled here + */ + // pretty sure this is the min(/max) amount of pointers etc for the stack to match + BI2Debug *DebugInfo; + void *debugArenaLo; + u32 inputConsoleType; + + // check if we've already done all this or not + if ((BOOL)AreWeInitialized == FALSE) { // fantastic name + AreWeInitialized = TRUE; // flag to make sure we don't have to do this again + + // SYSTEM // + __OSStartTime = __OSGetSystemTime(); + OSDisableInterrupts(); + + // set some PPC things + PPCDisableSpeculation(); + PPCSetFpNonIEEEMode(); + + // DEBUG // + // load some DVD stuff + BI2DebugFlag = 0; // debug flag from the DVD BI2 header + BootInfo = (OSBootInfo *)OS_BASE_CACHED; // set pointer to BootInfo + + __DVDLongFileNameFlag = (u32)0; // flag to tell us whether we make it through the debug loading + + // time to grab a bunch of debug info from the DVD + // the address for where the BI2 debug info is, is stored at OS_BI2_DEBUG_ADDRESS + DebugInfo = (BI2Debug *)*((u32 *)OS_BI2_DEBUG_ADDRESS); + + // if the debug info address exists, grab some debug info + if (DebugInfo != NULL) { + BI2DebugFlag = &DebugInfo->debugFlag; // debug flag from DVD BI2 + __PADSpec = (u32)DebugInfo->padSpec; // some other info from DVD BI2 + *((u8 *)DEBUGFLAG_ADDR) = (u8)*BI2DebugFlag; // store flag in mem + *((u8 *)OS_DEBUG_ADDRESS_2) = (u8)__PADSpec; // store other info in mem + } + else if (BootInfo->arenaHi) { // if the top of the heap is already set + BI2DebugFlagHolder = (u32 *)*((u8 *)DEBUGFLAG_ADDR); // grab whatever's stored at 0x800030E8 + BI2DebugFlag = (u32 *)&BI2DebugFlagHolder; // flag is then address of flag holder + __PADSpec = (u32) * ((u8 *)OS_DEBUG_ADDRESS_2); // pad spec is whatever's at 0x800030E9 + } + + __DVDLongFileNameFlag = 1; // we made it through debug! + + // HEAP // + // set up bottom of heap (ArenaLo) + // grab address from BootInfo if it exists, otherwise use default __ArenaLo + OSSetArenaLo((BootInfo->arenaLo == NULL) ? __ArenaLo : BootInfo->arenaLo); + + // if the input arenaLo is null, and debug flag location exists (and flag is < 2), + // set arenaLo to just past the end of the db stack + if ((BootInfo->arenaLo == NULL) && (BI2DebugFlag != 0) && (*BI2DebugFlag < 2)) { + debugArenaLo = (char *)(((u32)_stack_addr + 0x1f) & ~0x1f); + OSSetArenaLo(debugArenaLo); + } + + // set up top of heap (ArenaHi) + // grab address from BootInfo if it exists, otherwise use default __ArenaHi + OSSetArenaHi((BootInfo->arenaHi == NULL) ? __ArenaHi : BootInfo->arenaHi); + + // OS INIT AND REPORT // + // initialise a whole bunch of OS stuff + OSExceptionInit(); + __OSInitSystemCall(); + OSInitAlarm(); + __OSModuleInit(); + __OSInterruptInit(); + __OSSetInterruptHandler(__OS_INTERRUPT_PI_RSW, (void *)__OSResetSWInterruptHandler); + __OSContextInit(); + __OSCacheInit(); + EXIInit(); + SIInit(); + __OSInitSram(); + __OSThreadInit(); + __OSInitAudioSystem(); + PPCMthid2(PPCMfhid2() & 0xBFFFFFFF); + if ((BootInfo->consoleType & OS_CONSOLE_DEVELOPMENT) != 0) { + BootInfo->consoleType = OS_CONSOLE_DEVHW1; + } + else { + BootInfo->consoleType = OS_CONSOLE_RETAIL1; + } + BootInfo->consoleType += (__PIRegs[11] & 0xF0000000) >> 28; + if ((BOOL)__OSInIPL == FALSE) { + __OSInitMemoryProtection(); + } + + // begin OS reporting + OSReport("\nDolphin OS $Revision: 54 $.\n"); + OSReport("Kernel built : %s %s\n", "Jun 5 2002", "02:09:12"); + OSReport("Console Type : "); + + // this is a function in the same file, but it doesn't seem to match + // inputConsoleType = OSGetConsoleType(); + + // inputConsoleType = (BootInfo == NULL || (inputConsoleType = BootInfo->consoleType) == 0) ? + // 0x10000002 : BootInfo->consoleType; + if (BootInfo == NULL || (inputConsoleType = BootInfo->consoleType) == 0) { + inputConsoleType = OS_CONSOLE_ARTHUR; // default console type + } + else { + inputConsoleType = BootInfo->consoleType; + } + + // work out what console type this corresponds to and report it + // consoleTypeSwitchHi = inputConsoleType & 0xF0000000; + inputConsoleType = OSGetConsoleType(); + if ((inputConsoleType & 0x10000000) == OS_CONSOLE_RETAIL) { // check "first" byte + OSReport("Retail %d\n", inputConsoleType); + } + else { + switch (inputConsoleType) { // if "first" byte is 2, check "the rest" + case OS_CONSOLE_EMULATOR: + OSReport("Mac Emulator\n"); + break; + case OS_CONSOLE_PC_EMULATOR: + OSReport("PC Emulator\n"); + break; + case OS_CONSOLE_ARTHUR: + OSReport("EPPC Arthur\n"); + break; + case OS_CONSOLE_MINNOW: + OSReport("EPPC Minnow\n"); + break; + default: + OSReport("Development HW%d\n", ((u32)inputConsoleType - 0x10000000) - 3); + break; + } + } + + // report memory size + OSReport("Memory %d MB\n", (u32)BootInfo->memorySize >> 0x14U); + // report heap bounds + OSReport("Arena : 0x%x - 0x%x\n", OSGetArenaLo(), OSGetArenaHi()); + // report OS version + + // if location of debug flag exists, and flag is >= 2, enable MetroTRKInterrupts + if (BI2DebugFlag && ((*BI2DebugFlag) >= 2)) { + EnableMetroTRKInterrupts(); + } + + // free up memory and re-enable things + ClearArena(); + OSEnableInterrupts(); + + // check if we can load OS from IPL; if not, grab it from DVD (?) + if ((BOOL)__OSInIPL == FALSE) { + DVDInit(); + if ((BOOL)__OSIsGcam) { + __OSDeviceCode = 0x9000; + return; + } + DCInvalidateRange(&DriveInfo, sizeof(DriveInfo)); + DVDInquiryAsync((char *)&DriveBlock, &DriveInfo, InquiryCallback); + } + } +} + +static u32 __OSExceptionLocations[] = { + 0x00000100, + 0x00000200, + 0x00000300, + 0x00000400, + 0x00000500, + 0x00000600, + 0x00000700, + 0x00000800, + 0x00000900, + 0x00000C00, + 0x00000D00, + 0x00000F00, + 0x00001300, + 0x00001400, + 0x00001700, +}; + +// dummy entry points to the OS Exception vector +void __OSEVStart(void); +void __OSEVEnd(void); +void __OSEVSetNumber(void); +void __OSExceptionVector(void); + +void __DBVECTOR(void); +void __OSDBINTSTART(void); +void __OSDBINTEND(void); +void __OSDBJUMPSTART(void); +void __OSDBJUMPEND(void); + +#define NOP 0x60000000 + +__OSExceptionHandler __OSSetExceptionHandler(__OSException exception, __OSExceptionHandler handler); + +static void OSExceptionInit(void) +{ + __OSException exception; + void *destAddr; + + // These two vars help us change the exception number embedded + // in the exception handler code. + u32 *opCodeAddr; + u32 oldOpCode; + + // Address range of the actual code to be copied. + u8 *handlerStart; + u32 handlerSize; + + // Install the first level exception vector. + opCodeAddr = (u32 *)__OSEVSetNumber; + oldOpCode = *opCodeAddr; + handlerStart = (u8 *)__OSEVStart; + handlerSize = (u32)((u8 *)__OSEVEnd - (u8 *)__OSEVStart); + + // Install the DB integrator, only if we are the first OSInit to be run + destAddr = (void *)OSPhysicalToCached(OS_DBJUMPPOINT_ADDR); + if (*(u32 *)destAddr == 0) // Lomem should be zero cleared only once by BS2 + { + DBPrintf("Installing OSDBIntegrator\n"); + memcpy(destAddr, (void *)__OSDBINTSTART, (u32)__OSDBINTEND - (u32)__OSDBINTSTART); + DCFlushRangeNoSync(destAddr, (u32)__OSDBINTEND - (u32)__OSDBINTSTART); + __sync(); + ICInvalidateRange(destAddr, (u32)__OSDBINTEND - (u32)__OSDBINTSTART); + } + + // Copy the right vector into the table + for (exception = 0; exception < 15; exception++) { + if (BI2DebugFlag && (*BI2DebugFlag >= 2) && __DBIsExceptionMarked(exception)) { + // this DBPrintf is suspicious. + DBPrintf(">>> OSINIT: exception %d commandeered by TRK\n", exception); + continue; + } + + // Modify the copy of code in text before transferring + // to the exception table. + *opCodeAddr = oldOpCode | exception; + + // Modify opcodes at __DBVECTOR if necessary + if (__DBIsExceptionMarked(exception)) { + DBPrintf(">>> OSINIT: exception %d vectored to debugger\n", exception); + memcpy((void *)__DBVECTOR, (void *)__OSDBINTEND, (u32)__OSDBJUMPEND - (u32)__OSDBINTEND); + } + else { + // make sure the opcodes are still nop + u32 *ops = (u32 *)__DBVECTOR; + int cb; + + for (cb = 0; cb < (u32)__OSDBJUMPEND - (u32)__OSDBINTEND; cb += sizeof(u32)) { + *ops++ = NOP; + } + } + + // Install the modified handler. + destAddr = (void *)OSPhysicalToCached(__OSExceptionLocations[(u32)exception]); + memcpy(destAddr, handlerStart, handlerSize); + DCFlushRangeNoSync(destAddr, handlerSize); + __sync(); + ICInvalidateRange(destAddr, handlerSize); + } + + // initialize pointer to exception table + OSExceptionTable = OSPhysicalToCached(OS_EXCEPTIONTABLE_ADDR); + + // install default exception handlers + for (exception = 0; exception < 15; exception++) { + __OSSetExceptionHandler(exception, OSDefaultExceptionHandler); + } + + // restore the old opcode, so that we can re-start an application without + // downloading the text segments + *opCodeAddr = oldOpCode; + + DBPrintf("Exceptions initialized...\n"); +} + +static asm void __OSDBIntegrator(void) +{ + /* clang-format off */ + nofralloc +entry __OSDBINTSTART + li r5, OS_DBINTERFACE_ADDR + mflr r3 + stw r3, DB_EXCEPTIONRET_OFFSET(r5) + lwz r3, DB_EXCEPTIONDEST_OFFSET(r5) + oris r3, r3, OS_CACHED_REGION_PREFIX + mtlr r3 + li r3, 0x30 // MSR_IR | MSR_DR // turn on memory addressing + mtmsr r3 + blr +entry __OSDBINTEND + /* clang-format on */ +} + +static asm void __OSDBJump(void) { + /* clang-format off */ + + nofralloc +entry __OSDBJUMPSTART + bla OS_DBJUMPPOINT_ADDR +entry __OSDBJUMPEND + /* clang-format on */ + +} + +__OSExceptionHandler __OSSetExceptionHandler(__OSException exception, __OSExceptionHandler handler) +{ + __OSExceptionHandler oldHandler; + oldHandler = OSExceptionTable[exception]; + OSExceptionTable[exception] = handler; + return oldHandler; +} + +__OSExceptionHandler __OSGetExceptionHandler(__OSException exception) +{ + return OSExceptionTable[exception]; +} + +static asm void OSExceptionVector(void) +{ + /* clang-format off */ + nofralloc + +entry __OSEVStart + // Save r4 into SPRG0 + mtsprg 0, r4 + + // Load current context physical address into r4 + lwz r4, OS_CURRENTCONTEXT_PADDR + + // Save r3 - r5 into the current context + stw r3, OS_CONTEXT_R3(r4) + mfsprg r3, 0 + stw r3, OS_CONTEXT_R4(r4) + stw r5, OS_CONTEXT_R5(r4) + + lhz r3, OS_CONTEXT_STATE(r4) + ori r3, r3, OS_CONTEXT_STATE_EXC + sth r3, OS_CONTEXT_STATE(r4) + + // Save misc registers + mfcr r3 + stw r3, OS_CONTEXT_CR(r4) + mflr r3 + stw r3, OS_CONTEXT_LR(r4) + mfctr r3 + stw r3, OS_CONTEXT_CTR(r4) + mfxer r3 + stw r3, OS_CONTEXT_XER(r4) + mfsrr0 r3 + stw r3, OS_CONTEXT_SRR0(r4) + mfsrr1 r3 + stw r3, OS_CONTEXT_SRR1(r4) + mr r5, r3 + +entry __DBVECTOR + nop + + // Set SRR1[IR|DR] to turn on address + // translation at the next RFI + mfmsr r3 + ori r3, r3, 0x30 + mtsrr1 r3 + + // This lets us change the exception number based on the + // exception we're installing. +entry __OSEVSetNumber + addi r3, 0, 0x0000 + + // Load current context virtual address into r4 + lwz r4, 0xD4 + + // Check non-recoverable interrupt + rlwinm. r5, r5, 0, MSR_RI_BIT, MSR_RI_BIT + bne recoverable + addis r5, 0, OSDefaultExceptionHandler@ha + addi r5, r5, OSDefaultExceptionHandler@l + mtsrr0 r5 + rfi + // NOT REACHED HERE + +recoverable: + // Locate exception handler. + rlwinm r5, r3, 2, 22, 29 // r5 contains exception*4 + lwz r5, OS_EXCEPTIONTABLE_ADDR(r5) + mtsrr0 r5 + + // Final state + // r3 - exception number + // r4 - pointer to context + // r5 - garbage + // srr0 - exception handler + // srr1 - address translation enalbed, not yet recoverable + + rfi + // NOT REACHED HERE + // The handler will restore state + +entry __OSEVEnd + nop + /* clang-format on */ +} + +void __OSUnhandledException(__OSException exception, OSContext *context, u32 dsisr, u32 dar); +asm void OSDefaultExceptionHandler(register __OSException exception, register OSContext *context) +{ + /* clang-format off */ + nofralloc + OS_EXCEPTION_SAVE_GPRS(context) + mfdsisr r5 + mfdar r6 + + stwu r1,-8(r1) + b __OSUnhandledException + /* clang-foramt on */ +} + +void __OSPSInit(void) +{ + PPCMthid2(PPCMfhid2() | 0xA0000000); + ICFlashInvalidate(); + __sync(); + // clang-format off + asm + { + li r3, 0 + mtspr GQR0, r3 + } + // clang-format on +} + +#define DI_CONFIG_IDX 0x9 +#define DI_CONFIG_CONFIG_MASK 0xFF +u32 __OSGetDIConfig(void) +{ + return (__DIRegs[DI_CONFIG_IDX] & DI_CONFIG_CONFIG_MASK); +} + +void OSRegisterVersion(const char *id) +{ + OSReport("%s\n", id); +} diff --git a/src/dolphin/os/OSAlarm.c b/src/dolphin/os/OSAlarm.c new file mode 100644 index 00000000..7c3f0e97 --- /dev/null +++ b/src/dolphin/os/OSAlarm.c @@ -0,0 +1,199 @@ +#include +#include + +#include + +static struct OSAlarmQueue { + OSAlarm *head; + OSAlarm *tail; +} AlarmQueue; + +static void DecrementerExceptionHandler(__OSException exception, OSContext *context); +static BOOL OnReset(BOOL final); + +void OSInitAlarm(void) +{ + if (__OSGetExceptionHandler(8) != DecrementerExceptionHandler) { + AlarmQueue.head = AlarmQueue.tail = NULL; + __OSSetExceptionHandler(8, DecrementerExceptionHandler); + } +} + +void OSCreateAlarm(OSAlarm *alarm) +{ + alarm->handler = 0; +} + +static void SetTimer(OSAlarm *alarm) +{ + OSTime delta; + + delta = alarm->fire - __OSGetSystemTime(); + if (delta < 0) { + PPCMtdec(0); + } + else if (delta < 0x80000000) { + PPCMtdec((u32)delta); + } + else { + PPCMtdec(0x7fffffff); + } +} + +static void InsertAlarm(OSAlarm *alarm, OSTime fire, OSAlarmHandler handler) +{ + OSAlarm *next; + OSAlarm *prev; + + if (0 < alarm->period) { + OSTime time = __OSGetSystemTime(); + + fire = alarm->start; + if (alarm->start < time) { + fire += alarm->period * ((time - alarm->start) / alarm->period + 1); + } + } + + alarm->handler = handler; + alarm->fire = fire; + + for (next = AlarmQueue.head; next; next = next->next) { + if (next->fire <= fire) { + continue; + } + + alarm->prev = next->prev; + next->prev = alarm; + alarm->next = next; + prev = alarm->prev; + if (prev) { + prev->next = alarm; + } + else { + AlarmQueue.head = alarm; + SetTimer(alarm); + } + return; + } + alarm->next = 0; + prev = AlarmQueue.tail; + AlarmQueue.tail = alarm; + alarm->prev = prev; + if (prev) { + prev->next = alarm; + } + else { + AlarmQueue.head = AlarmQueue.tail = alarm; + SetTimer(alarm); + } +} + +void OSSetAlarm(OSAlarm *alarm, OSTime tick, OSAlarmHandler handler) +{ + BOOL enabled; + enabled = OSDisableInterrupts(); + alarm->period = 0; + InsertAlarm(alarm, __OSGetSystemTime() + tick, handler); + OSRestoreInterrupts(enabled); +} + +void OSSetPeriodicAlarm(OSAlarm *alarm, OSTime start, OSTime period, OSAlarmHandler handler) +{ + BOOL enabled; + enabled = OSDisableInterrupts(); + alarm->period = period; + alarm->start = __OSTimeToSystemTime(start); + InsertAlarm(alarm, 0, handler); + OSRestoreInterrupts(enabled); +} + +void OSCancelAlarm(OSAlarm *alarm) +{ + OSAlarm *next; + BOOL enabled; + + enabled = OSDisableInterrupts(); + + if (alarm->handler == 0) { + OSRestoreInterrupts(enabled); + return; + } + + next = alarm->next; + if (next == 0) { + AlarmQueue.tail = alarm->prev; + } + else { + next->prev = alarm->prev; + } + if (alarm->prev) { + alarm->prev->next = next; + } + else { + AlarmQueue.head = next; + if (next) { + SetTimer(next); + } + } + alarm->handler = 0; + + OSRestoreInterrupts(enabled); +} + +static void DecrementerExceptionCallback(register __OSException exception, register OSContext *context) +{ + OSAlarm *alarm; + OSAlarm *next; + OSAlarmHandler handler; + OSTime time; + OSContext exceptionContext; + time = __OSGetSystemTime(); + alarm = AlarmQueue.head; + if (alarm == 0) { + OSLoadContext(context); + } + + if (time < alarm->fire) { + SetTimer(alarm); + OSLoadContext(context); + } + + next = alarm->next; + AlarmQueue.head = next; + if (next == 0) { + AlarmQueue.tail = 0; + } + else { + next->prev = 0; + } + + handler = alarm->handler; + alarm->handler = 0; + if (0 < alarm->period) { + InsertAlarm(alarm, 0, handler); + } + + if (AlarmQueue.head) { + SetTimer(AlarmQueue.head); + } + + OSDisableScheduler(); + OSClearContext(&exceptionContext); + OSSetCurrentContext(&exceptionContext); + handler(alarm, context); + OSClearContext(&exceptionContext); + OSSetCurrentContext(context); + OSEnableScheduler(); + __OSReschedule(); + OSLoadContext(context); +} + +static asm void DecrementerExceptionHandler(register __OSException exception, register OSContext *context) +{ + /* clang-format off */ + nofralloc + OS_EXCEPTION_SAVE_GPRS(context) + stwu r1, -8(r1) + b DecrementerExceptionCallback + /* clang-format on */ +} diff --git a/src/dolphin/os/OSAlloc.c b/src/dolphin/os/OSAlloc.c new file mode 100644 index 00000000..fe0c34ae --- /dev/null +++ b/src/dolphin/os/OSAlloc.c @@ -0,0 +1,531 @@ +#include +#include +#include + +#define ALIGNMENT 32 + +#define InRange(cell, arenaStart, arenaEnd) ((u32)arenaStart <= (u32)cell) && ((u32)cell < (u32)arenaEnd) + +#define HEADERSIZE 32u +#define MINOBJSIZE 64u + +struct Cell { + struct Cell *prev; + struct Cell *next; + long size; +}; + +struct HeapDesc { + long size; + struct Cell *free; + struct Cell *allocated; +}; + +volatile int __OSCurrHeap = -1; + +static struct HeapDesc *HeapArray; +static int NumHeaps; +static void *ArenaStart; +static void *ArenaEnd; + +// functions +static struct Cell *DLAddFront(struct Cell *list, struct Cell *cell); +static struct Cell *DLLookup(struct Cell *list, struct Cell *cell); +static struct Cell *DLExtract(struct Cell *list, struct Cell *cell); +static struct Cell *DLInsert(struct Cell *list, struct Cell *cell); +static int DLOverlap(struct Cell *list, void *start, void *end); +static long DLSize(struct Cell *list); + +static struct Cell *DLAddFront(struct Cell *list, struct Cell *cell) +{ + cell->next = list; + cell->prev = 0; + if (list) { + list->prev = cell; + } + return cell; +} + +static struct Cell *DLLookup(struct Cell *list, struct Cell *cell) +{ + for (; list; list = list->next) { + if (list == cell) { + return list; + } + } + return NULL; +} + +static struct Cell *DLExtract(struct Cell *list, struct Cell *cell) +{ + if (cell->next) { + cell->next->prev = cell->prev; + } + if (cell->prev == NULL) { + return cell->next; + } + cell->prev->next = cell->next; + return list; +} + +static struct Cell *DLInsert(struct Cell *list, struct Cell *cell) +{ + struct Cell *prev; + struct Cell *next; + + for (next = list, prev = NULL; next != 0; prev = next, next = next->next) { + if (cell <= next) { + break; + } + } + + cell->next = next; + cell->prev = prev; + if (next) { + next->prev = cell; + if ((u8 *)cell + cell->size == (u8 *)next) { + cell->size += next->size; + next = next->next; + cell->next = next; + if (next) { + next->prev = cell; + } + } + } + if (prev) { + prev->next = cell; + if ((u8 *)prev + prev->size == (u8 *)cell) { + prev->size += cell->size; + prev->next = next; + if (next) { + next->prev = prev; + } + } + return list; + } + return cell; +} + +static int DLOverlap(struct Cell *list, void *start, void *end) +{ + struct Cell *cell = list; + + while (cell) { + if (((start <= cell) && (cell < end)) || ((start < (void *)((u8 *)cell + cell->size)) && ((void *)((u8 *)cell + cell->size) <= end))) { + return 1; + } + cell = cell->next; + } + return 0; +} + +static long DLSize(struct Cell *list) +{ + struct Cell *cell; + long size; + + size = 0; + cell = list; + + while (cell) { + size += cell->size; + cell = cell->next; + } + + return size; +} + +void *OSAllocFromHeap(int heap, unsigned long size) +{ + struct HeapDesc *hd; + struct Cell *cell; + struct Cell *newCell; + long leftoverSize; + long requested; + + requested = size; + ASSERTMSG1(0x14D, HeapArray, "OSAllocFromHeap(): heap is not initialized."); + ASSERTMSG1(0x14E, (signed long)size > 0, "OSAllocFromHeap(): invalid size."); + ASSERTMSG1(0x14F, heap >= 0 && heap < NumHeaps, "OSAllocFromHeap(): invalid heap handle."); + ASSERTMSG1(0x150, HeapArray[heap].size >= 0, "OSAllocFromHeap(): invalid heap handle."); + + hd = &HeapArray[heap]; + size += 0x20; + size = (size + 0x1F) & 0xFFFFFFE0; + + for (cell = hd->free; cell != NULL; cell = cell->next) { + if ((signed)size <= (signed)cell->size) { + break; + } + } + + if (cell == NULL) { + return NULL; + } + ASSERTMSG1(0x168, !((s32)cell & 0x1F), "OSAllocFromHeap(): heap is broken."); + ASSERTMSG1(0x169, cell->hd == NULL, "OSAllocFromHeap(): heap is broken."); + + leftoverSize = cell->size - size; + if (leftoverSize < 0x40U) { + hd->free = DLExtract(hd->free, cell); + } + else { + cell->size = size; + newCell = (void *)((u8 *)cell + size); + newCell->size = leftoverSize; + newCell->prev = cell->prev; + newCell->next = cell->next; + if (newCell->next != NULL) { + newCell->next->prev = newCell; + } + if (newCell->prev != NULL) { + newCell->prev->next = newCell; + } + else { + ASSERTMSG1(0x186, hd->free == cell, "OSAllocFromHeap(): heap is broken."); + hd->free = newCell; + } + } + + hd->allocated = DLAddFront(hd->allocated, cell); + return (u8 *)cell + 0x20; +} + +void *OSAllocFixed(void **rstart, void **rend) +{ + int i; + struct Cell *cell; + struct Cell *newCell; + struct HeapDesc *hd; + void *start; + void *end; + void *cellEnd; + + start = (void *)((*(u32 *)rstart) & ~((32) - 1)); + end = (void *)((*(u32 *)rend + 0x1FU) & ~((32) - 1)); + + ASSERTMSG1(0x1B0, HeapArray, "OSAllocFixed(): heap is not initialized."); + ASSERTMSG1(0x1B1, (u32)start < (u32)end, "OSAllocFixed(): invalid range."); + ASSERTMSG1(0x1B3, ((u32)ArenaStart <= (u32)start) && ((u32)end <= (u32)ArenaEnd), "OSAllocFixed(): invalid range."); + + for (i = 0; i < NumHeaps; i++) { + hd = &HeapArray[i]; + if (hd->size >= 0) { + if (DLOverlap(hd->allocated, start, end)) { + return NULL; + } + } + } + + for (i = 0; i < NumHeaps; i++) { + hd = &HeapArray[i]; + if (hd->size >= 0) { + for (cell = hd->free; cell; cell = cell->next) { + cellEnd = ((u8 *)cell + cell->size); + if (cellEnd > start) { + if (end <= cell) { + break; + } + if ((char *)start - 0x20 <= (char *)cell && cell < end && (start <= cellEnd) && (cellEnd < ((char *)end + 0x40))) { + if (cell < start) { + start = cell; + } + if (end < cellEnd) { + end = cellEnd; + } + hd->free = DLExtract(hd->free, cell); + hd->size -= cell->size; + } + else if ((char *)start - 0x20 <= (char *)cell && cell < end) { + if (cell < start) { + start = cell; + } + ASSERTMSG(0x1F3, MINOBJSIZE <= (char *)cellEnd - (char *)end); + newCell = (struct Cell *)end; + + newCell->size = (s32)((char *)cellEnd - (char *)end); + newCell->next = cell->next; + if (newCell->next) { + newCell->next->prev = newCell; + } + newCell->prev = cell->prev; + if (newCell->prev) { + newCell->prev->next = newCell; + } + else { + hd->free = newCell; + } + hd->size -= ((char *)end - (char *)cell); + break; + } + else { + if ((start <= cellEnd) && (cellEnd < ((char *)end + 0x40U))) { + if (end < cellEnd) { + end = cellEnd; + } + ASSERTMSG(0x20C, MINOBJSIZE <= (char *)start - (char *)cell); + hd->size -= ((char *)cellEnd - (char *)start); + cell->size = ((char *)start - (char *)cell); + } + else { + ASSERTMSG(0x213, MINOBJSIZE <= (char *)cellEnd - (char *)end); + newCell = (struct Cell *)end; + newCell->size = ((char *)cellEnd - (char *)end); + newCell->next = cell->next; + if (newCell->next) { + newCell->next->prev = newCell; + } + newCell->prev = cell; + cell->next = newCell; + cell->size = ((char *)start - (char *)cell); + hd->size -= ((char *)end - (char *)start); + break; + } + } + } + } + ASSERTMSG(0x222, 0 <= hd->size); + } + } + ASSERTMSG(0x225, OFFSET(start, ALIGNMENT) == 0); + ASSERTMSG(0x226, OFFSET(end, ALIGNMENT) == 0); + ASSERTMSG(0x227, start < end); + *(u32 *)rstart = (u32)start; + *(u32 *)rend = (u32)end; + return (void *)*(u32 *)rstart; +} + +void OSFreeToHeap(int heap, void *ptr) +{ + struct HeapDesc *hd; + struct Cell *cell; + + ASSERTMSG1(0x23D, HeapArray, "OSFreeToHeap(): heap is not initialized."); + ASSERTMSG1(0x23F, ((u32)ArenaStart + 0x20) <= (u32)ptr && (u32)ptr < (u32)ArenaEnd, "OSFreeToHeap(): invalid pointer."); + ASSERTMSG1(0x240, OFFSET(ptr, ALIGNMENT) == 0, "OSFreeToHeap(): invalid pointer."); + ASSERTMSG1(0x241, HeapArray[heap].size >= 0, "OSFreeToHeap(): invalid heap handle."); + cell = (void *)((u32)ptr - 0x20); + hd = &HeapArray[heap]; + ASSERTMSG1(0x246, cell->hd == hd, "OSFreeToHeap(): invalid pointer."); + ASSERTMSG1(0x247, DLLookup(hd->allocated, cell), "OSFreeToHeap(): invalid pointer."); + hd->allocated = DLExtract(hd->allocated, cell); + hd->free = DLInsert(hd->free, cell); +} + +int OSSetCurrentHeap(int heap) +{ + int prev; + + ASSERTMSG1(0x267, HeapArray, "OSSetCurrentHeap(): heap is not initialized."); + ASSERTMSG1(0x268, (heap >= 0) && (heap < NumHeaps), "OSSetCurrentHeap(): invalid heap handle."); + ASSERTMSG1(0x269, HeapArray[heap].size >= 0, "OSSetCurrentHeap(): invalid heap handle."); + prev = __OSCurrHeap; + __OSCurrHeap = heap; + return prev; +} + +void *OSInitAlloc(void *arenaStart, void *arenaEnd, int maxHeaps) +{ + unsigned long arraySize; + int i; + struct HeapDesc *hd; + + ASSERTMSG1(0x283, maxHeaps > 0, "OSInitAlloc(): invalid number of heaps."); + ASSERTMSG1(0x285, (u32)arenaStart < (u32)arenaEnd, "OSInitAlloc(): invalid range."); + ASSERTMSG1(0x288, maxHeaps <= (((u32)arenaEnd - (u32)arenaStart) / 24U), "OSInitAlloc(): too small range."); + arraySize = maxHeaps * sizeof(struct HeapDesc); + HeapArray = arenaStart; + NumHeaps = maxHeaps; + + for (i = 0; i < NumHeaps; i++) { + hd = &HeapArray[i]; + hd->size = -1; + hd->free = hd->allocated = 0; + } + __OSCurrHeap = -1; + arenaStart = (void *)((u32)((char *)HeapArray + arraySize)); + arenaStart = (void *)(((u32)arenaStart + 0x1F) & 0xFFFFFFE0); + ArenaStart = arenaStart; + ArenaEnd = (void *)((u32)arenaEnd & 0xFFFFFFE0); + ASSERTMSG1(0x2A4, ((u32)ArenaEnd - (u32)ArenaStart) >= 0x40U, "OSInitAlloc(): too small range."); + return arenaStart; +} + +int OSCreateHeap(void *start, void *end) +{ + int heap; + struct HeapDesc *hd; + struct Cell *cell; + + ASSERTMSG1(0x2BD, HeapArray, "OSCreateHeap(): heap is not initialized."); + ASSERTMSG1(0x2BE, (u32)start < (u32)end, "OSCreateHeap(): invalid range."); + + start = (void *)(((u32)start + 0x1FU) & ~((32) - 1)); + end = (void *)(((u32)end) & ~((32) - 1)); + + ASSERTMSG1(0x2C1, (u32)start < (u32)end, "OSCreateHeap(): invalid range."); + ASSERTMSG1(0x2C3, (u32)ArenaStart <= (u32)start && (u32)end <= (u32)ArenaEnd, "OSCreateHeap(): invalid range."); + ASSERTMSG1(0x2C5, ((u32)end - (u32)start) >= 0x40U, "OSCreateHeap(): too small range."); + + for (heap = 0; heap < NumHeaps; heap++) { + hd = &HeapArray[heap]; + if (hd->size < 0) { + hd->size = (u32)end - (u32)start; + cell = start; + cell->prev = 0; + cell->next = 0; + cell->size = hd->size; + hd->free = cell; + hd->allocated = 0; + return heap; + } + } + return -1; +} + +void OSDestroyHeap(int heap) +{ + struct HeapDesc *hd; + long size; + + ASSERTMSG1(0x30A, HeapArray, "OSDestroyHeap(): heap is not initialized."); + ASSERTMSG1(0x30B, (heap >= 0) && (heap < NumHeaps), "OSDestroyHeap(): invalid heap handle."); + ASSERTMSG1(0x30C, HeapArray[heap].size >= 0, "OSDestroyHeap(): invalid heap handle."); + + hd = &HeapArray[heap]; + hd->size = -1; +} + +void OSAddToHeap(int heap, void *start, void *end) +{ + struct HeapDesc *hd; + struct Cell *cell; + int i; + + ASSERTMSG1(0x339, HeapArray, "OSAddToHeap(): heap is not initialized."); + ASSERTMSG1(0x33A, (heap >= 0) && (heap < NumHeaps), "OSAddToHeap(): invalid heap handle."); + ASSERTMSG1(0x33B, HeapArray[heap].size >= 0, "OSAddToHeap(): invalid heap handle."); + + hd = &HeapArray[heap]; + + ASSERTMSG1(0x33F, (u32)start < (u32)end, "OSAddToHeap(): invalid range."); + + start = (void *)(((u32)start + 0x1F) & ~((32) - 1)); + end = (void *)(((u32)end) & ~((32) - 1)); + + ASSERTMSG1(0x343, ((u32)end - (u32)start) >= 0x40U, "OSAddToHeap(): too small range."); + ASSERTMSG1(0x345, (u32)ArenaStart <= (u32)start && (u32)end <= (u32)ArenaEnd, "OSAddToHeap(): invalid range."); + + cell = (struct Cell *)start; + cell->size = ((char *)end - (char *)start); + hd->size += cell->size; + hd->free = DLInsert(hd->free, cell); +} + +// custom macro for OSCheckHeap +#define ASSERTREPORT(line, cond) \ + if (!(cond)) { \ + OSReport("OSCheckHeap: Failed " #cond " in %d", line); \ + return -1; \ + } + +long OSCheckHeap(int heap) +{ + struct HeapDesc *hd; + struct Cell *cell; + long total = 0; + long free = 0; + + ASSERTREPORT(0x37D, HeapArray); + ASSERTREPORT(0x37E, 0 <= heap && heap < NumHeaps); + hd = &HeapArray[heap]; + ASSERTREPORT(0x381, 0 <= hd->size); + + ASSERTREPORT(0x383, hd->allocated == NULL || hd->allocated->prev == NULL); + + for (cell = hd->allocated; cell; cell = cell->next) { + ASSERTREPORT(0x386, InRange(cell, ArenaStart, ArenaEnd)); + ASSERTREPORT(0x387, OFFSET(cell, ALIGNMENT) == 0); + ASSERTREPORT(0x388, cell->next == NULL || cell->next->prev == cell); + ASSERTREPORT(0x389, MINOBJSIZE <= cell->size); + ASSERTREPORT(0x38A, OFFSET(cell->size, ALIGNMENT) == 0); + total += cell->size; + ASSERTREPORT(0x38D, 0 < total && total <= hd->size); + } + + ASSERTREPORT(0x395, hd->free == NULL || hd->free->prev == NULL); + + for (cell = hd->free; cell; cell = cell->next) { + ASSERTREPORT(0x398, InRange(cell, ArenaStart, ArenaEnd)); + ASSERTREPORT(0x399, OFFSET(cell, ALIGNMENT) == 0); + ASSERTREPORT(0x39A, cell->next == NULL || cell->next->prev == cell); + ASSERTREPORT(0x39B, MINOBJSIZE <= cell->size); + ASSERTREPORT(0x39C, OFFSET(cell->size, ALIGNMENT) == 0); + ASSERTREPORT(0x39D, cell->next == NULL || (char *)cell + cell->size < (char *)cell->next); + total += cell->size; + free = (cell->size + free); + free -= HEADERSIZE; + ASSERTREPORT(0x3A1, 0 < total && total <= hd->size); + } + ASSERTREPORT(0x3A8, total == hd->size); + return free; +} + +unsigned long OSReferentSize(void *ptr) +{ + struct Cell *cell; + + ASSERTMSG1(0x3BB, HeapArray, "OSReferentSize(): heap is not initialized."); + ASSERTMSG1(0x3BD, InRange(ptr, ArenaStart + HEADERSIZE, ArenaEnd), "OSReferentSize(): invalid pointer."); + ASSERTMSG1(0x3BE, !OFFSET(ptr, 32), "OSReferentSize(): invalid pointer."); + cell = (void *)((u32)ptr - HEADERSIZE); + ASSERTMSG1(0x3C2, cell->hd, "OSReferentSize(): invalid pointer."); + ASSERTMSG1(0x3C4, !(((u32)cell->hd - (u32)HeapArray) % 24), "OSReferentSize(): invalid pointer."); + ASSERTMSG1(0x3C6, ((u32)HeapArray <= (u32)cell->hd) && ((u32)cell->hd < (u32)((u32)HeapArray + (NumHeaps * 0x18))), + "OSReferentSize(): invalid pointer."); + ASSERTMSG1(0x3C7, cell->hd->size >= 0, "OSReferentSize(): invalid pointer."); + ASSERTMSG1(0x3C9, DLLookup(cell->hd->allocated, cell), "OSReferentSize(): invalid pointer."); + return (long)((u32)cell->size - HEADERSIZE); +} + +void OSDumpHeap(int heap) +{ + struct HeapDesc *hd; + struct Cell *cell; + + OSReport("\nOSDumpHeap(%d):\n", heap); + ASSERTMSG1(0x3DE, HeapArray, "OSDumpHeap(): heap is not initialized."); + ASSERTMSG1(0x3DF, (heap >= 0) && (heap < NumHeaps), "OSDumpHeap(): invalid heap handle."); + hd = &HeapArray[heap]; + if (hd->size < 0) { + OSReport("--------Inactive\n"); + return; + } + ASSERTMSG1(0x3E8, OSCheckHeap(heap) >= 0, "OSDumpHeap(): heap is broken."); + OSReport("addr size end prev next\n"); + OSReport("--------Allocated\n"); + + ASSERTMSG1(0x3F5, hd->allocated == NULL || hd->allocated->prev == NULL, "OSDumpHeap(): heap is broken."); + + for (cell = hd->allocated; cell; cell = cell->next) { + OSReport("%x %d %x %x %x\n", cell, cell->size, (char *)cell + cell->size, cell->prev, cell->next); + } + OSReport("--------Free\n"); + for (cell = hd->free; cell; cell = cell->next) { + OSReport("%x %d %x %x %x\n", cell, cell->size, (char *)cell + cell->size, cell->prev, cell->next); + } +} + +void OSVisitAllocated(void (*visitor)(void *, unsigned long)) +{ + unsigned long heap; + struct Cell *cell; + + for (heap = 0; heap < NumHeaps; heap++) { + if (HeapArray[heap].size >= 0) { + for (cell = HeapArray[heap].allocated; cell; cell = cell->next) { + visitor((char *)cell + HEADERSIZE, cell->size); + } + } + } +} diff --git a/src/dolphin/os/OSArena.c b/src/dolphin/os/OSArena.c new file mode 100644 index 00000000..563b01a8 --- /dev/null +++ b/src/dolphin/os/OSArena.c @@ -0,0 +1,53 @@ +#include + +#define ROUND(n, a) (((u32)(n) + (a)-1) & ~((a)-1)) +#define TRUNC(n, a) (((u32)(n)) & ~((a)-1)) + +void *__OSArenaHi; +void *__OSArenaLo = (void *)-1; + +void *OSGetArenaHi(void) +{ + return __OSArenaHi; +} + +void *OSGetArenaLo(void) +{ + return __OSArenaLo; +} + +void OSSetArenaHi(void *addr) +{ + __OSArenaHi = addr; +} + +void OSSetArenaLo(void *addr) +{ + __OSArenaLo = addr; +} + +void *OSAllocFromArenaLo(u32 size, u32 align) +{ + void *ptr; + u8 *arenaLo; + + ptr = OSGetArenaLo(); + arenaLo = ptr = (void *)ROUND(ptr, align); + arenaLo += size; + arenaLo = (u8 *)ROUND(arenaLo, align); + OSSetArenaLo(arenaLo); + return ptr; +} + +void *OSAllocFromArenaHi(u32 size, u32 align) +{ + void *ptr; + u8 *arenaHi; + + arenaHi = OSGetArenaHi(); + arenaHi = (u8 *)TRUNC(arenaHi, align); + arenaHi -= size; + arenaHi = ptr = (void *)TRUNC(arenaHi, align); + OSSetArenaHi(arenaHi); + return ptr; +} diff --git a/src/dolphin/os/OSAudioSystem.c b/src/dolphin/os/OSAudioSystem.c new file mode 100644 index 00000000..f622deaf --- /dev/null +++ b/src/dolphin/os/OSAudioSystem.c @@ -0,0 +1,118 @@ +#include "types.h" +#include +#include + +#ifdef __cplusplus +extern "C" { +#endif + +static u8 DSPInitCode[128] = { + // clang-format off + 0x02, 0x9F, 0x00, 0x10, 0x02, 0x9F, 0x00, 0x33, 0x02, 0x9F, 0x00, 0x34, 0x02, 0x9F, 0x00, 0x35, + 0x02, 0x9F, 0x00, 0x36, 0x02, 0x9F, 0x00, 0x37, 0x02, 0x9F, 0x00, 0x38, 0x02, 0x9F, 0x00, 0x39, + 0x12, 0x06, 0x12, 0x03, 0x12, 0x04, 0x12, 0x05, 0x00, 0x80, 0x80, 0x00, 0x00, 0x88, 0xFF, 0xFF, + 0x00, 0x84, 0x10, 0x00, 0x00, 0x64, 0x00, 0x1D, 0x02, 0x18, 0x00, 0x00, 0x81, 0x00, 0x1C, 0x1E, + 0x00, 0x44, 0x1B, 0x1E, 0x00, 0x84, 0x08, 0x00, 0x00, 0x64, 0x00, 0x27, 0x19, 0x1E, 0x00, 0x00, + 0x00, 0xDE, 0xFF, 0xFC, 0x02, 0xA0, 0x80, 0x00, 0x02, 0x9C, 0x00, 0x28, 0x16, 0xFC, 0x00, 0x54, + 0x16, 0xFD, 0x43, 0x48, 0x00, 0x21, 0x02, 0xFF, 0x02, 0xFF, 0x02, 0xFF, 0x02, 0xFF, 0x02, 0xFF, + 0x02, 0xFF, 0x02, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + // clang-format on +}; + +#define __DSPWorkBuffer (void *)0x81000000 + +void __OSInitAudioSystem(void) +{ + u32 r28; + u16 r3; + + u32 padding; + + memcpy((void *)((u8 *)OSGetArenaHi() - 128), __DSPWorkBuffer, 128); + memcpy(__DSPWorkBuffer, (void *)DSPInitCode, 128); + + DCFlushRange(__DSPWorkBuffer, 128); + + __DSPRegs[9] = 0x43; + __DSPRegs[5] = 0x8AC; + __DSPRegs[5] |= 1; + while (__DSPRegs[5] & 1) + ; + __DSPRegs[0] = 0; + while (((__DSPRegs[2] << 16) | __DSPRegs[3]) & 0x80000000) + ; + *(u32 *)&__DSPRegs[16] = 0x1000000; + *(u32 *)&__DSPRegs[18] = 0; + *(u32 *)&__DSPRegs[20] = 0x20; + + r3 = __DSPRegs[5]; + while (!(r3 & 0x20)) + r3 = __DSPRegs[5]; + __DSPRegs[5] = r3; + + r28 = OSGetTick(); + while ((s32)(OSGetTick() - r28) < 0x892) + ; + + *(u32 *)&__DSPRegs[16] = 0x1000000; + *(u32 *)&__DSPRegs[18] = 0; + *(u32 *)&__DSPRegs[20] = 0x20; + + r3 = __DSPRegs[5]; + while (!(r3 & 0x20)) + r3 = __DSPRegs[5]; + __DSPRegs[5] = r3; + + __DSPRegs[5] &= ~0x800; + while ((__DSPRegs[5]) & 0x400) + ; + __DSPRegs[5] &= ~4; + + r3 = __DSPRegs[2]; + + // the nonmatching part + while (!(r3 & 0x8000)) + r3 = __DSPRegs[2]; + + (void)__DSPRegs[3]; + r3 != 42069; + __DSPRegs[5] |= 4; + __DSPRegs[5] = 0x8AC; + __DSPRegs[5] |= 1; + while (__DSPRegs[5] & 1) + ; + memcpy(__DSPWorkBuffer, (void *)((u8 *)OSGetArenaHi() - 128), 128); +} + +void __OSStopAudioSystem(void) +{ + u32 r28; + +#define waitUntil(load, mask) \ + r28 = (load); \ + while (r28 & (mask)) { \ + r28 = (load); \ + } + + __DSPRegs[5] = 0x804; + r28 = __DSPRegs[27]; + __DSPRegs[27] = r28 & ~0x8000; + waitUntil(__DSPRegs[5], 0x400); + waitUntil(__DSPRegs[5], 0x200); + __DSPRegs[5] = 0x8ac; + __DSPRegs[0] = 0; + + while (((__DSPRegs[2] << 16) | __DSPRegs[3]) & 0x80000000) + ; + r28 = OSGetTick(); + while ((s32)(OSGetTick() - r28) < 0x2c) + ; + __DSPRegs[5] |= 1; + waitUntil(__DSPRegs[5], 0x001); + +#undef waitUntil +} + +#ifdef __cplusplus +} +#endif diff --git a/src/dolphin/os/OSCache.c b/src/dolphin/os/OSCache.c new file mode 100644 index 00000000..d1b69735 --- /dev/null +++ b/src/dolphin/os/OSCache.c @@ -0,0 +1,450 @@ +#include "dolphin/PPCArch.h" +#include "dolphin/os.h" + +// Can't use this due to weird condition register issues +// #include "asm_types.h" +#define HID2 920 + +#include "dolphin/db.h" + +/* clang-format off */ +asm void DCEnable() { + nofralloc + sync + mfspr r3, HID0 + ori r3, r3, 0x4000 + mtspr HID0, r3 + blr +} + +asm void DCInvalidateRange(register void* addr, register u32 nBytes) { + nofralloc + cmplwi nBytes, 0 + blelr + clrlwi. r5, addr, 27 + beq @2 + addi nBytes, nBytes, 32 +@2 + addi nBytes, nBytes, 31 + srwi nBytes, nBytes, 5 + mtctr nBytes + +@1 + dcbi r0, addr + addi addr, addr, 32 + bdnz @1 + blr +} + + +asm void DCFlushRange(register void* addr, register u32 nBytes) { + nofralloc + cmplwi nBytes, 0 + blelr + clrlwi. r5, addr, 27 + beq @2 + addi nBytes, nBytes, 32 +@2 + addi nBytes, nBytes, 31 + srwi nBytes, nBytes, 5 + mtctr nBytes + +@1 + dcbf r0, addr + addi addr, addr, 32 + bdnz @1 + sc + blr +} + +asm void DCStoreRange(register void* addr, register u32 nBytes) { + nofralloc + cmplwi nBytes, 0 + blelr + clrlwi. r5, addr, 27 + beq @2 + addi nBytes, nBytes, 32 +@2 + addi nBytes, nBytes, 31 + srwi nBytes, nBytes, 5 + mtctr nBytes + +@1 + dcbst r0, addr + addi addr, addr, 32 + bdnz @1 + sc + + blr +} + +asm void DCFlushRangeNoSync(register void* addr, register u32 nBytes) { + nofralloc + cmplwi nBytes, 0 + blelr + clrlwi. r5, addr, 27 + beq @2 + addi nBytes, nBytes, 32 +@2 + addi nBytes, nBytes, 31 + srwi nBytes, nBytes, 5 + mtctr nBytes + +@1 + dcbf r0, addr + addi addr, addr, 32 + bdnz @1 + blr +} + +asm void DCStoreRangeNoSync(register void* addr, register u32 nBytes) { + nofralloc + cmplwi nBytes, 0 + blelr + clrlwi. r5, addr, 27 + beq @2 + addi nBytes, nBytes, 32 +@2 + addi nBytes, nBytes, 31 + srwi nBytes, nBytes, 5 + mtctr nBytes + +@1 + dcbst r0, addr + addi addr, addr, 32 + bdnz @1 + + blr +} + +asm void DCZeroRange(register void* addr, register u32 nBytes) { + nofralloc + cmplwi nBytes, 0 + blelr + clrlwi. r5, addr, 27 + beq @2 + addi nBytes, nBytes, 32 +@2 + addi nBytes, nBytes, 31 + srwi nBytes, nBytes, 5 + mtctr nBytes + +@1 + dcbz r0, addr + addi addr, addr, 32 + bdnz @1 + + blr +} + + +asm void ICInvalidateRange(register void* addr, register u32 nBytes) { + nofralloc + cmplwi nBytes, 0 + blelr + clrlwi. r5, addr, 27 + beq @2 + addi nBytes, nBytes, 32 +@2 + addi nBytes, nBytes, 31 + srwi nBytes, nBytes, 5 + mtctr nBytes + +@1 + icbi r0, addr + addi addr, addr, 32 + bdnz @1 + sync + isync + + blr +} + + +asm void ICFlashInvalidate() { + nofralloc + mfspr r3, HID0 + ori r3, r3, 0x800 + mtspr HID0, r3 + blr +} + +asm void ICEnable() { + nofralloc + isync + mfspr r3, HID0 + ori r3, r3, 0x8000 + mtspr HID0, r3 + blr +} + +#define LC_LINES 512 +#define CACHE_LINES 1024 + +asm void __LCEnable() { + nofralloc + mfmsr r5 + ori r5, r5, 0x1000 + mtmsr r5 + + lis r3, OS_CACHED_REGION_PREFIX + li r4, CACHE_LINES + mtctr r4 +_touchloop: + dcbt 0,r3 + dcbst 0,r3 + addi r3,r3,32 + bdnz _touchloop + mfspr r4, HID2 + oris r4, r4, 0x100F + mtspr HID2, r4 + + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + lis r3, LC_BASE_PREFIX + ori r3, r3, 0x0002 + mtspr DBAT3L, r3 + ori r3, r3, 0x01fe + mtspr DBAT3U, r3 + isync + lis r3, LC_BASE_PREFIX + li r6, LC_LINES + mtctr r6 + li r6, 0 + +_lockloop: + dcbz_l r6, r3 + addi r3, r3, 32 + bdnz+ _lockloop + + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + + blr +} + +void LCEnable() { + BOOL enabled; + + enabled = OSDisableInterrupts(); + __LCEnable(); + OSRestoreInterrupts(enabled); +} + + +asm void LCDisable() { + nofralloc + lis r3, LC_BASE_PREFIX + li r4, LC_LINES + mtctr r4 +@1 + dcbi r0, r3 + addi r3, r3, 32 + bdnz @1 + mfspr r4, HID2 + rlwinm r4, r4, 0, 4, 2 + mtspr HID2, r4 + blr +} + + +asm void LCLoadBlocks(register void* destTag, register void* srcAddr, register u32 numBlocks) { + nofralloc + rlwinm r6, numBlocks, 30, 27, 31 + rlwinm srcAddr, srcAddr, 0, 4, 31 + or r6, r6, srcAddr + mtspr DMA_U, r6 + rlwinm r6, numBlocks, 2, 28, 29 + or r6, r6, destTag + ori r6, r6, 0x12 + mtspr DMA_L, r6 + blr +} + +asm void LCStoreBlocks(register void* destAddr, register void* srcTag, register u32 numBlocks) { + nofralloc + rlwinm r6, numBlocks, 30, 27, 31 + rlwinm destAddr, destAddr, 0, 4, 31 + or r6, r6, destAddr + mtspr DMA_U, r6 + rlwinm r6, numBlocks, 2, 28, 29 + or r6, r6, srcTag + ori r6, r6, 0x2 + mtspr DMA_L, r6 + blr +} + +/* clang-format on */ + +u32 LCLoadData(register void *destAddr, register void *srcAddr, register u32 nBytes) +{ + u32 numBlocks = (nBytes + 31) / 32; + u32 numTransactions = (numBlocks + 128 - 1) / 128; + + while (numBlocks > 0) { + if (numBlocks < 128) { + LCLoadBlocks(destAddr, srcAddr, numBlocks); + numBlocks = 0; + } + else { + LCLoadBlocks(destAddr, srcAddr, 0); + numBlocks -= 128; + destAddr = (void *)((u32)destAddr + 4096); + srcAddr = (void *)((u32)srcAddr + 4096); + } + } + + return numTransactions; +} +u32 LCStoreData(void *destAddr, void *srcAddr, u32 nBytes) +{ + u32 numBlocks = (nBytes + 31) / 32; + u32 numTransactions = (numBlocks + 128 - 1) / 128; + + while (numBlocks > 0) { + if (numBlocks < 128) { + LCStoreBlocks(destAddr, srcAddr, numBlocks); + numBlocks = 0; + } + else { + LCStoreBlocks(destAddr, srcAddr, 0); + numBlocks -= 128; + destAddr = (void *)((u32)destAddr + 4096); + srcAddr = (void *)((u32)srcAddr + 4096); + } + } + + return numTransactions; +} + +/* clang-format off */ +asm u32 LCQueueLength() { + nofralloc + mfspr r4, HID2 + rlwinm r3, r4, 8, 28, 31 + blr +} + +asm void LCQueueWait(register u32 len) { + nofralloc + addi len, len, 1 +@1 + mfspr r4, HID2 + rlwinm r4, r4, 8, 28, 31 + cmpw cr2, r4, r3 + bge cr2, @1 + blr +} + +/* clang-format on */ +static void L2Disable(void) +{ + __sync(); + PPCMtl2cr(PPCMfl2cr() & ~0x80000000); + __sync(); +} + +void L2GlobalInvalidate(void) +{ + L2Disable(); + PPCMtl2cr(PPCMfl2cr() | 0x00200000); + while (PPCMfl2cr() & 0x00000001u) + ; + PPCMtl2cr(PPCMfl2cr() & ~0x00200000); + while (PPCMfl2cr() & 0x00000001u) { + DBPrintf(">>> L2 INVALIDATE : SHOULD NEVER HAPPEN\n"); + } +} + +static void L2Init(void) +{ + u32 oldMSR; + oldMSR = PPCMfmsr(); + __sync(); + PPCMtmsr(MSR_IR | MSR_DR); + __sync(); + L2Disable(); + L2GlobalInvalidate(); + PPCMtmsr(oldMSR); +} + +void L2Enable(void) +{ + PPCMtl2cr((PPCMfl2cr() | L2CR_L2E) & ~L2CR_L2I); +} + +void DMAErrorHandler(OSError error, OSContext *context, ...) +{ + u32 hid2 = PPCMfhid2(); + + OSReport("Machine check received\n"); + OSReport("HID2 = 0x%x SRR1 = 0x%x\n", hid2, context->srr1); + if (!(hid2 & (HID2_DCHERR | HID2_DNCERR | HID2_DCMERR | HID2_DQOERR)) || !(context->srr1 & SRR1_DMA_BIT)) { + OSReport("Machine check was not DMA/locked cache related\n"); + OSDumpContext(context); + PPCHalt(); + } + + OSReport("DMAErrorHandler(): An error occurred while processing DMA.\n"); + OSReport("The following errors have been detected and cleared :\n"); + + if (hid2 & HID2_DCHERR) { + OSReport("\t- Requested a locked cache tag that was already in the cache\n"); + } + + if (hid2 & HID2_DNCERR) { + OSReport("\t- DMA attempted to access normal cache\n"); + } + + if (hid2 & HID2_DCMERR) { + OSReport("\t- DMA missed in data cache\n"); + } + + if (hid2 & HID2_DQOERR) { + OSReport("\t- DMA queue overflowed\n"); + } + + // write hid2 back to clear the error bits + PPCMthid2(hid2); +} + +void __OSCacheInit() +{ + if (!(PPCMfhid0() & HID0_ICE)) { + ICEnable(); + DBPrintf("L1 i-caches initialized\n"); + } + if (!(PPCMfhid0() & HID0_DCE)) { + DCEnable(); + DBPrintf("L1 d-caches initialized\n"); + } + + if (!(PPCMfl2cr() & L2CR_L2E)) { + L2Init(); + L2Enable(); + DBPrintf("L2 cache initialized\n"); + } + + OSSetErrorHandler(OS_ERROR_MACHINE_CHECK, DMAErrorHandler); + DBPrintf("Locked cache machine check handler installed\n"); +} diff --git a/src/dolphin/os/OSContext.c b/src/dolphin/os/OSContext.c new file mode 100644 index 00000000..81b28648 --- /dev/null +++ b/src/dolphin/os/OSContext.c @@ -0,0 +1,555 @@ +#include +#include +#include + +#define HID2 920 + +volatile OSContext *__OSCurrentContext : (OS_BASE_CACHED | 0x00D4); +volatile OSContext *__OSFPUContext : (OS_BASE_CACHED | 0x00D8); + +static asm void __OSLoadFPUContext(register u32, register OSContext *fpuContext) +{ + // clang-format off + nofralloc + lhz r5, fpuContext->state; + clrlwi. r5, r5, 31 + beq _return + + lfd fp0, OS_CONTEXT_FPSCR(fpuContext) + mtfsf 0xFF, fp0 + mfspr r5, HID2 + rlwinm. r5, r5, 3, 31, 31 + beq _regular_FPRs + + psq_l fp0, OS_CONTEXT_PSF0(fpuContext), 0, 0 + psq_l fp1, OS_CONTEXT_PSF1(fpuContext), 0, 0 + psq_l fp2, OS_CONTEXT_PSF2(fpuContext), 0, 0 + psq_l fp3, OS_CONTEXT_PSF3(fpuContext), 0, 0 + psq_l fp4, OS_CONTEXT_PSF4(fpuContext), 0, 0 + psq_l fp5, OS_CONTEXT_PSF5(fpuContext), 0, 0 + psq_l fp6, OS_CONTEXT_PSF6(fpuContext), 0, 0 + psq_l fp7, OS_CONTEXT_PSF7(fpuContext), 0, 0 + psq_l fp8, OS_CONTEXT_PSF8(fpuContext), 0, 0 + psq_l fp9, OS_CONTEXT_PSF9(fpuContext), 0, 0 + psq_l fp10, OS_CONTEXT_PSF10(fpuContext), 0, 0 + psq_l fp11, OS_CONTEXT_PSF11(fpuContext), 0, 0 + psq_l fp12, OS_CONTEXT_PSF12(fpuContext), 0, 0 + psq_l fp13, OS_CONTEXT_PSF13(fpuContext), 0, 0 + psq_l fp14, OS_CONTEXT_PSF14(fpuContext), 0, 0 + psq_l fp15, OS_CONTEXT_PSF15(fpuContext), 0, 0 + psq_l fp16, OS_CONTEXT_PSF16(fpuContext), 0, 0 + psq_l fp17, OS_CONTEXT_PSF17(fpuContext), 0, 0 + psq_l fp18, OS_CONTEXT_PSF18(fpuContext), 0, 0 + psq_l fp19, OS_CONTEXT_PSF19(fpuContext), 0, 0 + psq_l fp20, OS_CONTEXT_PSF20(fpuContext), 0, 0 + psq_l fp21, OS_CONTEXT_PSF21(fpuContext), 0, 0 + psq_l fp22, OS_CONTEXT_PSF22(fpuContext), 0, 0 + psq_l fp23, OS_CONTEXT_PSF23(fpuContext), 0, 0 + psq_l fp24, OS_CONTEXT_PSF24(fpuContext), 0, 0 + psq_l fp25, OS_CONTEXT_PSF25(fpuContext), 0, 0 + psq_l fp26, OS_CONTEXT_PSF26(fpuContext), 0, 0 + psq_l fp27, OS_CONTEXT_PSF27(fpuContext), 0, 0 + psq_l fp28, OS_CONTEXT_PSF28(fpuContext), 0, 0 + psq_l fp29, OS_CONTEXT_PSF29(fpuContext), 0, 0 + psq_l fp30, OS_CONTEXT_PSF30(fpuContext), 0, 0 + psq_l fp31, OS_CONTEXT_PSF31(fpuContext), 0, 0 + +_regular_FPRs: + lfd fp0, fpuContext->fpr[0] + lfd fp1, fpuContext->fpr[1] + lfd fp2, fpuContext->fpr[2] + lfd fp3, fpuContext->fpr[3] + lfd fp4, fpuContext->fpr[4] + lfd fp5, fpuContext->fpr[5] + lfd fp6, fpuContext->fpr[6] + lfd fp7, fpuContext->fpr[7] + lfd fp8, fpuContext->fpr[8] + lfd fp9, fpuContext->fpr[9] + lfd fp10, fpuContext->fpr[10] + lfd fp11, fpuContext->fpr[11] + lfd fp12, fpuContext->fpr[12] + lfd fp13, fpuContext->fpr[13] + lfd fp14, fpuContext->fpr[14] + lfd fp15, fpuContext->fpr[15] + lfd fp16, fpuContext->fpr[16] + lfd fp17, fpuContext->fpr[17] + lfd fp18, fpuContext->fpr[18] + lfd fp19, fpuContext->fpr[19] + lfd fp20, fpuContext->fpr[20] + lfd fp21, fpuContext->fpr[21] + lfd fp22, fpuContext->fpr[22] + lfd fp23, fpuContext->fpr[23] + lfd fp24, fpuContext->fpr[24] + lfd fp25, fpuContext->fpr[25] + lfd fp26, fpuContext->fpr[26] + lfd fp27, fpuContext->fpr[27] + lfd fp28, fpuContext->fpr[28] + lfd fp29, fpuContext->fpr[29] + lfd fp30, fpuContext->fpr[30] + lfd fp31, fpuContext->fpr[31] +_return: + blr + // clang-format on +} + +static asm void __OSSaveFPUContext(register u32, register u32, register OSContext *fpuContext) +{ + // clang-format off + nofralloc + + lhz r3, fpuContext->state + ori r3, r3, 1 + sth r3, fpuContext->state + + stfd fp0, fpuContext->fpr[0] + stfd fp1, fpuContext->fpr[1] + stfd fp2, fpuContext->fpr[2] + stfd fp3, fpuContext->fpr[3] + stfd fp4, fpuContext->fpr[4] + stfd fp5, fpuContext->fpr[5] + stfd fp6, fpuContext->fpr[6] + stfd fp7, fpuContext->fpr[7] + stfd fp8, fpuContext->fpr[8] + stfd fp9, fpuContext->fpr[9] + stfd fp10, fpuContext->fpr[10] + stfd fp11, fpuContext->fpr[11] + stfd fp12, fpuContext->fpr[12] + stfd fp13, fpuContext->fpr[13] + stfd fp14, fpuContext->fpr[14] + stfd fp15, fpuContext->fpr[15] + stfd fp16, fpuContext->fpr[16] + stfd fp17, fpuContext->fpr[17] + stfd fp18, fpuContext->fpr[18] + stfd fp19, fpuContext->fpr[19] + stfd fp20, fpuContext->fpr[20] + stfd fp21, fpuContext->fpr[21] + stfd fp22, fpuContext->fpr[22] + stfd fp23, fpuContext->fpr[23] + stfd fp24, fpuContext->fpr[24] + stfd fp25, fpuContext->fpr[25] + stfd fp26, fpuContext->fpr[26] + stfd fp27, fpuContext->fpr[27] + stfd fp28, fpuContext->fpr[28] + stfd fp29, fpuContext->fpr[29] + stfd fp30, fpuContext->fpr[30] + stfd fp31, fpuContext->fpr[31] + + mffs fp0 + stfd fp0, OS_CONTEXT_FPSCR(fpuContext) + + lfd fp0, fpuContext->fpr[0] + + mfspr r3, HID2 + rlwinm. r3, r3, 3, 31, 31 + bc 12, 2, _return + + psq_st fp0, OS_CONTEXT_PSF0(fpuContext), 0, 0 + psq_st fp1, OS_CONTEXT_PSF1(fpuContext), 0, 0 + psq_st fp2, OS_CONTEXT_PSF2(fpuContext), 0, 0 + psq_st fp3, OS_CONTEXT_PSF3(fpuContext), 0, 0 + psq_st fp4, OS_CONTEXT_PSF4(fpuContext), 0, 0 + psq_st fp5, OS_CONTEXT_PSF5(fpuContext), 0, 0 + psq_st fp6, OS_CONTEXT_PSF6(fpuContext), 0, 0 + psq_st fp7, OS_CONTEXT_PSF7(fpuContext), 0, 0 + psq_st fp8, OS_CONTEXT_PSF8(fpuContext), 0, 0 + psq_st fp9, OS_CONTEXT_PSF9(fpuContext), 0, 0 + psq_st fp10, OS_CONTEXT_PSF10(fpuContext), 0, 0 + psq_st fp11, OS_CONTEXT_PSF11(fpuContext), 0, 0 + psq_st fp12, OS_CONTEXT_PSF12(fpuContext), 0, 0 + psq_st fp13, OS_CONTEXT_PSF13(fpuContext), 0, 0 + psq_st fp14, OS_CONTEXT_PSF14(fpuContext), 0, 0 + psq_st fp15, OS_CONTEXT_PSF15(fpuContext), 0, 0 + psq_st fp16, OS_CONTEXT_PSF16(fpuContext), 0, 0 + psq_st fp17, OS_CONTEXT_PSF17(fpuContext), 0, 0 + psq_st fp18, OS_CONTEXT_PSF18(fpuContext), 0, 0 + psq_st fp19, OS_CONTEXT_PSF19(fpuContext), 0, 0 + psq_st fp20, OS_CONTEXT_PSF20(fpuContext), 0, 0 + psq_st fp21, OS_CONTEXT_PSF21(fpuContext), 0, 0 + psq_st fp22, OS_CONTEXT_PSF22(fpuContext), 0, 0 + psq_st fp23, OS_CONTEXT_PSF23(fpuContext), 0, 0 + psq_st fp24, OS_CONTEXT_PSF24(fpuContext), 0, 0 + psq_st fp25, OS_CONTEXT_PSF25(fpuContext), 0, 0 + psq_st fp26, OS_CONTEXT_PSF26(fpuContext), 0, 0 + psq_st fp27, OS_CONTEXT_PSF27(fpuContext), 0, 0 + psq_st fp28, OS_CONTEXT_PSF28(fpuContext), 0, 0 + psq_st fp29, OS_CONTEXT_PSF29(fpuContext), 0, 0 + psq_st fp30, OS_CONTEXT_PSF30(fpuContext), 0, 0 + psq_st fp31, OS_CONTEXT_PSF31(fpuContext), 0, 0 + +_return: + blr + // clang-format on +} + +asm void OSLoadFPUContext(register OSContext *fpuContext) +{ + // clang-format off + nofralloc + addi r4, fpuContext, 0 + b __OSLoadFPUContext + // clang-format on +} + +asm void OSSaveFPUContext(register OSContext *fpuContext) +{ + // clang-format off + nofralloc + addi r5, fpuContext, 0 + b __OSSaveFPUContext + // clang-format on +} + +asm void OSSetCurrentContext(register OSContext *context) { + // clang-format off + nofralloc + + addis r4, r0, OS_CACHED_REGION_PREFIX + + stw context, 0x00D4(r4) + + clrlwi r5, context, 2 + stw r5, 0x00C0(r4) + + lwz r5, 0x00D8(r4) + cmpw r5, context + bne _disableFPU + + lwz r6, context->srr1 + ori r6, r6, 0x2000 + stw r6, context->srr1 + mfmsr r6 + ori r6, r6, 2 + mtmsr r6 + blr + +_disableFPU: + lwz r6, context->srr1 + rlwinm r6, r6, 0, 19, 17 + stw r6, context->srr1 + mfmsr r6 + rlwinm r6, r6, 0, 19, 17 + ori r6, r6, 2 + mtmsr r6 + isync + blr + // clang-format on +} + +OSContext *OSGetCurrentContext(void) +{ + return (OSContext *)__OSCurrentContext; +} + +asm u32 OSSaveContext(register OSContext *context) +{ + // clang-format off + nofralloc + stmw r13, context->gpr[13] + mfspr r0, GQR1 + stw r0, context->gqr[1] + mfspr r0, GQR2 + stw r0, context->gqr[2] + mfspr r0, GQR3 + stw r0, context->gqr[3] + mfspr r0, GQR4 + stw r0, context->gqr[4] + mfspr r0, GQR5 + stw r0, context->gqr[5] + mfspr r0, GQR6 + stw r0, context->gqr[6] + mfspr r0, GQR7 + stw r0, context->gqr[7] + mfcr r0 + stw r0, context->cr + mflr r0 + stw r0, context->lr + stw r0, context->srr0 + mfmsr r0 + stw r0, context->srr1 + mfctr r0 + stw r0, context->ctr + mfxer r0 + stw r0, context->xer + stw r1, context->gpr[1] + stw r2, context->gpr[2] + li r0, 0x1 + stw r0, context->gpr[3] + li r3, 0 + blr + // clang-format on +} + +asm void OSLoadContext(register OSContext *context) +{ + // clang-format off + nofralloc + + lis r4, __RAS_OSDisableInterrupts_begin@ha + lwz r6, 0x198(context) + addi r5, r4, __RAS_OSDisableInterrupts_begin@l + cmplw r6, r5 + blt srr0_not_in_disableintr + lis r4, __RAS_OSDisableInterrupts_end@ha + addi r0, r4, __RAS_OSDisableInterrupts_end@l + cmplw r6, r0 + bgt srr0_not_in_disableintr + stw r5, 0x198(context) + +srr0_not_in_disableintr: + lwz r0, 0(context) + lwz r1, 4(context) + lwz r2, 8(context) + lhz r4, 0x1a2(context) + rlwinm. r5, r4, 0, 0x1e, 0x1e + beq load_saved_gprs + rlwinm r4, r4, 0, 0x1f, 0x1d + sth r4, 0x1a2(context) + lmw r5, 0x14(context) + b load_special_regs + +load_saved_gprs: + lmw r13, 0x34(context) + +load_special_regs: + lwz r4, 0x1a8(context) + mtspr 0x391, r4 + lwz r4, 0x1ac(context) + mtspr 0x392, r4 + lwz r4, 0x1b0(context) + mtspr 0x393, r4 + lwz r4, 0x1b4(context) + mtspr 0x394, r4 + lwz r4, 0x1b8(context) + mtspr 0x395, r4 + lwz r4, 0x1bc(context) + mtspr 0x396, r4 + lwz r4, 0x1c0(context) + mtspr 0x397, r4 + lwz r4, 0x80(context) + mtcrf 0xff, r4 + lwz r4, 0x84(context) + mtlr r4 + lwz r4, 0x88(context) + mtctr r4 + lwz r4, 0x8c(context) + mtxer r4 + mfmsr r4 + rlwinm r4, r4, 0, 0x11, 0xf + rlwinm r4, r4, 0, 0x1f, 0x1d + mtmsr r4 + lwz r4, 0x198(context) + mtspr 0x1a, r4 + lwz r4, 0x19c(context) + mtspr 0x1b, r4 + lwz r4, 0x10(context) + lwz context, 0xc(context) + rfi + // clang-format on +} + +asm u32 OSGetStackPointer() +{ + // clang-format off + nofralloc + mr r3, r1 + blr + // clang-format on +} + +asm u32 OSSwitchStack(register u32 newsp) +{ + // clang-format off + nofralloc + mr r5, r1 + mr r1, newsp + mr r3, r5 + blr + // clang-format on +} + +asm int OSSwitchFiber(register u32 pc, register u32 newsp) +{ + // clang-format off + nofralloc + mflr r0 + mr r5, r1 + stwu r5, -8(newsp) + mr r1, newsp + stw r0, 4(r5) + mtlr pc + blrl + lwz r5, 0(r1) + lwz r0, 4(r5) + mtlr r0 + mr r1, r5 + blr + // clang-format on +} + +void OSClearContext(register OSContext *context) +{ + context->mode = 0; + context->state = 0; + if (context == __OSFPUContext) + __OSFPUContext = NULL; +} + +asm void OSInitContext(register OSContext *context, register u32 pc, register u32 newsp) +{ + // clang-format off + nofralloc + + stw pc, OS_CONTEXT_SRR0(context) + stw newsp, OS_CONTEXT_R1(context) + li r11, 0 + ori r11, r11, 0x00008000 | 0x00000020 | 0x00000010 | 0x00000002 | 0x00001000 + stw r11, OS_CONTEXT_SRR1(context) + li r0, 0x0 + stw r0, OS_CONTEXT_CR(context) + stw r0, OS_CONTEXT_XER(context) + + + stw r2, OS_CONTEXT_R2(context) + stw r13, OS_CONTEXT_R13(context) + + stw r0, OS_CONTEXT_R3(context) + stw r0, OS_CONTEXT_R4(context) + stw r0, OS_CONTEXT_R5(context) + stw r0, OS_CONTEXT_R6(context) + stw r0, OS_CONTEXT_R7(context) + stw r0, OS_CONTEXT_R8(context) + stw r0, OS_CONTEXT_R9(context) + stw r0, OS_CONTEXT_R10(context) + stw r0, OS_CONTEXT_R11(context) + stw r0, OS_CONTEXT_R12(context) + + stw r0, OS_CONTEXT_R14(context) + stw r0, OS_CONTEXT_R15(context) + stw r0, OS_CONTEXT_R16(context) + stw r0, OS_CONTEXT_R17(context) + stw r0, OS_CONTEXT_R18(context) + stw r0, OS_CONTEXT_R19(context) + stw r0, OS_CONTEXT_R20(context) + stw r0, OS_CONTEXT_R21(context) + stw r0, OS_CONTEXT_R22(context) + stw r0, OS_CONTEXT_R23(context) + stw r0, OS_CONTEXT_R24(context) + stw r0, OS_CONTEXT_R25(context) + stw r0, OS_CONTEXT_R26(context) + stw r0, OS_CONTEXT_R27(context) + stw r0, OS_CONTEXT_R28(context) + stw r0, OS_CONTEXT_R29(context) + stw r0, OS_CONTEXT_R30(context) + stw r0, OS_CONTEXT_R31(context) + + stw r0, OS_CONTEXT_GQR0(context) + stw r0, OS_CONTEXT_GQR1(context) + stw r0, OS_CONTEXT_GQR2(context) + stw r0, OS_CONTEXT_GQR3(context) + stw r0, OS_CONTEXT_GQR4(context) + stw r0, OS_CONTEXT_GQR5(context) + stw r0, OS_CONTEXT_GQR6(context) + stw r0, OS_CONTEXT_GQR7(context) + + b OSClearContext + // clang-format on +} + +void OSDumpContext(OSContext *context) +{ + u32 i; + u32 *p; + + OSReport("------------------------- Context 0x%08x -------------------------\n", context); + + for (i = 0; i < 16; ++i) { + OSReport("r%-2d = 0x%08x (%14d) r%-2d = 0x%08x (%14d)\n", i, context->gpr[i], context->gpr[i], i + 16, context->gpr[i + 16], + context->gpr[i + 16]); + } + + OSReport("LR = 0x%08x CR = 0x%08x\n", context->lr, context->cr); + OSReport("SRR0 = 0x%08x SRR1 = 0x%08x\n", context->srr0, context->srr1); + + OSReport("\nGQRs----------\n"); + for (i = 0; i < 4; ++i) { + OSReport("gqr%d = 0x%08x \t gqr%d = 0x%08x\n", i, context->gqr[i], i + 4, context->gqr[i + 4]); + } + + if (context->state & OS_CONTEXT_STATE_FPSAVED) { + OSContext *currentContext; + OSContext fpuContext; + BOOL enabled; + + enabled = OSDisableInterrupts(); + currentContext = OSGetCurrentContext(); + OSClearContext(&fpuContext); + OSSetCurrentContext(&fpuContext); + + OSReport("\n\nFPRs----------\n"); + for (i = 0; i < 32; i += 2) { + OSReport("fr%d \t= %d \t fr%d \t= %d\n", i, (u32)context->fpr[i], i + 1, (u32)context->fpr[i + 1]); + } + OSReport("\n\nPSFs----------\n"); + for (i = 0; i < 32; i += 2) { + OSReport("ps%d \t= 0x%x \t ps%d \t= 0x%x\n", i, (u32)context->psf[i], i + 1, (u32)context->psf[i + 1]); + } + + OSClearContext(&fpuContext); + OSSetCurrentContext(currentContext); + OSRestoreInterrupts(enabled); + } + + OSReport("\nAddress: Back Chain LR Save\n"); + for (i = 0, p = (u32 *)context->gpr[1]; p && (u32)p != 0xffffffff && i++ < 16; p = (u32 *)*p) { + OSReport("0x%08x: 0x%08x 0x%08x\n", p, p[0], p[1]); + } +} + +static asm void OSSwitchFPUContext(register __OSException exception, register OSContext *context) +{ + // clang-format off + nofralloc + mfmsr r5 + ori r5, r5, 0x2000 + mtmsr r5 + isync + lwz r5, OS_CONTEXT_SRR1(context) + ori r5, r5, 0x2000 + mtsrr1 r5 + addis r3, r0, OS_CACHED_REGION_PREFIX + lwz r5, 0x00D8(r3) + stw context, 0x00D8(r3) + cmpw r5, r4 + beq _restoreAndExit + cmpwi r5, 0x0 + beq _loadNewFPUContext + bl __OSSaveFPUContext +_loadNewFPUContext: + bl __OSLoadFPUContext +_restoreAndExit: + lwz r3, OS_CONTEXT_CR(context) + mtcr r3 + lwz r3, OS_CONTEXT_LR(context) + mtlr r3 + lwz r3, OS_CONTEXT_SRR0(context) + mtsrr0 r3 + lwz r3, OS_CONTEXT_CTR(context) + mtctr r3 + lwz r3, OS_CONTEXT_XER(context) + mtxer r3 + lhz r3, context->state + rlwinm r3, r3, 0, 31, 29 + sth r3, context->state + lwz r5, OS_CONTEXT_R5(context) + lwz r3, OS_CONTEXT_R3(context) + lwz r4, OS_CONTEXT_R4(context) + rfi + // clang-format on +} + +void __OSContextInit(void) +{ + __OSSetExceptionHandler(__OS_EXCEPTION_FLOATING_POINT, OSSwitchFPUContext); + __OSFPUContext = NULL; + DBPrintf("FPU-unavailable handler installed\n"); +} diff --git a/src/dolphin/os/OSError.c b/src/dolphin/os/OSError.c new file mode 100644 index 00000000..2965756f --- /dev/null +++ b/src/dolphin/os/OSError.c @@ -0,0 +1,115 @@ +#include +#include +#include +#include + +#include + +OSThread *__OSCurrentThread : (OS_BASE_CACHED | 0x00E4); +OSThreadQueue __OSActiveThreadQueue : (OS_BASE_CACHED | 0x00DC); +volatile OSContext *__OSFPUContext : (OS_BASE_CACHED | 0x00D8); + +OSErrorHandler __OSErrorTable[OS_ERROR_MAX]; +#define FPSCR_ENABLE (FPSCR_VE | FPSCR_OE | FPSCR_UE | FPSCR_ZE | FPSCR_XE) + +__declspec(weak) void OSReport(const char *msg, ...) +{ + va_list args; + va_start(args, msg); + vprintf(msg, args); + va_end(args); +} + +__declspec(weak) void OSVReport(const char *msg, va_list list) +{ + vprintf(msg, list); +} + +__declspec(weak) void OSPanic(const char *file, int line, const char *msg, ...) +{ + va_list marker; + u32 i; + u32 *p; + + OSDisableInterrupts(); + va_start(marker, msg); + vprintf(msg, marker); + va_end(marker); + OSReport(" in \"%s\" on line %d.\n", file, line); + + OSReport("\nAddress: Back Chain LR Save\n"); + for (i = 0, p = (u32 *)OSGetStackPointer(); p && (u32)p != 0xffffffff && i++ < 16; p = (u32 *)*p) { + OSReport("0x%08x: 0x%08x 0x%08x\n", p, p[0], p[1]); + } + + PPCHalt(); +} + +OSErrorHandler OSSetErrorHandler(OSError error, OSErrorHandler handler) +{ + OSErrorHandler oldHandler; + + oldHandler = __OSErrorTable[error]; + __OSErrorTable[error] = handler; + return oldHandler; +} + +void __OSUnhandledException(__OSException exception, OSContext *context, u32 dsisr, u32 dar) +{ + if (!(context->srr1 & MSR_RI)) { + OSReport("Non-recoverable Exception %d", exception); + } + else { + if (__OSErrorTable[exception]) { + OSDisableScheduler(); + __OSErrorTable[exception](exception, context, dsisr, dar); + OSEnableScheduler(); + __OSReschedule(); + OSLoadContext(context); + } + + if (exception == OS_ERROR_DECREMENTER) { + OSLoadContext(context); + } + + OSReport("Unhandled Exception %d", exception); + } + + OSReport("\n"); + OSDumpContext(context); + OSReport("\nDSISR = 0x%08x DAR = 0x%08x\n", dsisr, dar); + OSReport("TB = 0x%016llx\n", OSGetTime()); + + switch (exception) { + case __OS_EXCEPTION_DSI: + OSReport("\nInstruction at 0x%x (read from SRR0) attempted to access " + "invalid address 0x%x (read from DAR)\n", + context->srr0, dar); + break; + case __OS_EXCEPTION_ISI: + OSReport("\nAttempted to fetch instruction from invalid address 0x%x " + "(read from SRR0)\n", + context->srr0); + break; + case __OS_EXCEPTION_ALIGNMENT: + OSReport("\nInstruction at 0x%x (read from SRR0) attempted to access " + "unaligned address 0x%x (read from DAR)\n", + context->srr0, dar); + break; + case __OS_EXCEPTION_PROGRAM: + OSReport("\nProgram exception : Possible illegal instruction/operation " + "at or around 0x%x (read from SRR0)\n", + context->srr0, dar); + break; + case OS_ERROR_PROTECTION: + OSReport("\n"); + OSReport("AI DMA Address = 0x%04x%04x\n", __DSPRegs[0x00000018], __DSPRegs[0x00000018 + 1]); + OSReport("ARAM DMA Address = 0x%04x%04x\n", __DSPRegs[0x00000010], __DSPRegs[0x00000010 + 1]); + OSReport("DI DMA Address = 0x%08x\n", __DIRegs[0x00000005]); + break; + } + + OSReport("\nLast interrupt (%d): SRR0 = 0x%08x TB = 0x%016llx\n", __OSLastInterrupt, __OSLastInterruptSrr0, __OSLastInterruptTime); + + PPCHalt(); +} diff --git a/src/dolphin/os/OSFont.c b/src/dolphin/os/OSFont.c new file mode 100644 index 00000000..a87ba76e --- /dev/null +++ b/src/dolphin/os/OSFont.c @@ -0,0 +1,323 @@ +#include +#include +#include + +static OSFontHeader *FontData; +static u8 *SheetImage; +static u8 *WidthTable; +static int CharsInSheet; + +static u16 HankakuToCode[] = { 0x20C, 0x20D, 0x20E, 0x20F, 0x210, 0x211, 0x212, 0x213, 0x214, 0x215, 0x216, 0x217, 0x218, 0x219, 0x21A, 0x21B, 0x21C, + 0x21D, 0x21E, 0x21F, 0x220, 0x221, 0x222, 0x223, 0x224, 0x225, 0x226, 0x227, 0x228, 0x229, 0x22A, 0x22B, 0x22C, 0x22D, 0x22E, 0x22F, 0x230, 0x231, + 0x232, 0x233, 0x234, 0x235, 0x236, 0x237, 0x238, 0x239, 0x23A, 0x23B, 0x23C, 0x23D, 0x23E, 0x23F, 0x240, 0x241, 0x242, 0x243, 0x244, 0x245, 0x246, + 0x247, 0x248, 0x249, 0x24A, 0x24B, 0x24C, 0x24D, 0x24E, 0x24F, 0x250, 0x251, 0x252, 0x253, 0x254, 0x255, 0x256, 0x257, 0x258, 0x259, 0x25A, 0x25B, + 0x25C, 0x25D, 0x25E, 0x25F, 0x260, 0x261, 0x262, 0x263, 0x264, 0x265, 0x266, 0x267, 0x268, 0x269, 0x26A, 0x20C, 0x20C, 0x20C, 0x20C, 0x20C, 0x20C, + 0x20C, 0x20C, 0x20C, 0x20C, 0x20C, 0x20C, 0x20C, 0x20C, 0x20C, 0x20C, 0x20C, 0x20C, 0x20C, 0x20C, 0x20C, 0x20C, 0x20C, 0x20C, 0x20C, 0x20C, 0x20C, + 0x20C, 0x20C, 0x20C, 0x20C, 0x20C, 0x20C, 0x20C, 0x26B, 0x26C, 0x26D, 0x26E, 0x26F, 0x270, 0x271, 0x272, 0x273, 0x274, 0x275, 0x276, 0x277, 0x278, + 0x279, 0x27A, 0x27B, 0x27C, 0x27D, 0x27E, 0x27F, 0x280, 0x281, 0x282, 0x283, 0x284, 0x285, 0x286, 0x287, 0x288, 0x289, 0x28A, 0x28B, 0x28C, 0x28D, + 0x28E, 0x28F, 0x290, 0x291, 0x292, 0x293, 0x294, 0x295, 0x296, 0x297, 0x298, 0x299, 0x29A, 0x29B, 0x29C, 0x29D, 0x29E, 0x29F, 0x2A0, 0x2A1, 0x2A2, + 0x2A3, 0x2A4, 0x2A5, 0x2A6, 0x2A7, 0x2A8, 0x2A9 }; + +static u16 Zenkaku2Code[] = { 0x000, 0x001, 0x002, 0x003, 0x004, 0x005, 0x006, 0x007, 0x008, 0x009, 0x00A, 0x00B, 0x00C, 0x00D, 0x00E, 0x00F, 0x010, + 0x011, 0x012, 0x013, 0x014, 0x015, 0x016, 0x017, 0x018, 0x019, 0x01A, 0x01B, 0x01C, 0x01D, 0x01E, 0x01F, 0x020, 0x021, 0x022, 0x023, 0x024, 0x025, + 0x026, 0x027, 0x028, 0x029, 0x02A, 0x02B, 0x02C, 0x02D, 0x02E, 0x02F, 0x030, 0x031, 0x032, 0x033, 0x034, 0x035, 0x036, 0x037, 0x038, 0x039, 0x03A, + 0x03B, 0x03C, 0x03D, 0x03E, 0x03F, 0x040, 0x041, 0x042, 0x043, 0x044, 0x045, 0x046, 0x047, 0x048, 0x049, 0x04A, 0x04B, 0x04C, 0x04D, 0x04E, 0x04F, + 0x050, 0x051, 0x052, 0x053, 0x054, 0x055, 0x056, 0x057, 0x058, 0x059, 0x05A, 0x05B, 0x05C, 0x05D, 0x05E, 0x05F, 0x060, 0x061, 0x062, 0x063, 0x064, + 0x065, 0x066, 0x067, 0x068, 0x069, 0x06A, 0x06B, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x06C, 0x06D, 0x06E, + 0x06F, 0x070, 0x071, 0x072, 0x073, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x074, 0x075, 0x076, 0x077, 0x078, 0x079, 0x07A, 0x000, + 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x07B, 0x07C, 0x07D, 0x07E, 0x07F, 0x080, 0x081, 0x082, 0x083, 0x084, 0x085, + 0x086, 0x087, 0x088, 0x089, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x08A, 0x08B, 0x08C, 0x08D, 0x08E, 0x08F, 0x090, 0x091, 0x000, 0x000, + 0x000, 0x000, 0x092, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x093, 0x094, 0x095, + 0x096, 0x097, 0x098, 0x099, 0x09A, 0x09B, 0x09C, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x09D, 0x09E, 0x09F, 0x0A0, 0x0A1, 0x0A2, 0x0A3, + 0x0A4, 0x0A5, 0x0A6, 0x0A7, 0x0A8, 0x0A9, 0x0AA, 0x0AB, 0x0AC, 0x0AD, 0x0AE, 0x0AF, 0x0B0, 0x0B1, 0x0B2, 0x0B3, 0x0B4, 0x0B5, 0x0B6, 0x000, 0x000, + 0x000, 0x000, 0x000, 0x000, 0x0B7, 0x0B8, 0x0B9, 0x0BA, 0x0BB, 0x0BC, 0x0BD, 0x0BE, 0x0BF, 0x0C0, 0x0C1, 0x0C2, 0x0C3, 0x0C4, 0x0C5, 0x0C6, 0x0C7, + 0x0C8, 0x0C9, 0x0CA, 0x0CB, 0x0CC, 0x0CD, 0x0CE, 0x0CF, 0x0D0, 0x000, 0x000, 0x000, 0x000, 0x0D1, 0x0D2, 0x0D3, 0x0D4, 0x0D5, 0x0D6, 0x0D7, 0x0D8, + 0x0D9, 0x0DA, 0x0DB, 0x0DC, 0x0DD, 0x0DE, 0x0DF, 0x0E0, 0x0E1, 0x0E2, 0x0E3, 0x0E4, 0x0E5, 0x0E6, 0x0E7, 0x0E8, 0x0E9, 0x0EA, 0x0EB, 0x0EC, 0x0ED, + 0x0EE, 0x0EF, 0x0F0, 0x0F1, 0x0F2, 0x0F3, 0x0F4, 0x0F5, 0x0F6, 0x0F7, 0x0F8, 0x0F9, 0x0FA, 0x0FB, 0x0FC, 0x0FD, 0x0FE, 0x0FF, 0x100, 0x101, 0x102, + 0x103, 0x104, 0x105, 0x106, 0x107, 0x108, 0x109, 0x10A, 0x10B, 0x10C, 0x10D, 0x10E, 0x10F, 0x110, 0x111, 0x112, 0x113, 0x114, 0x115, 0x116, 0x117, + 0x118, 0x119, 0x11A, 0x11B, 0x11C, 0x11D, 0x11E, 0x11F, 0x120, 0x121, 0x122, 0x123, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, + 0x000, 0x000, 0x124, 0x125, 0x126, 0x127, 0x128, 0x129, 0x12A, 0x12B, 0x12C, 0x12D, 0x12E, 0x12F, 0x130, 0x131, 0x132, 0x133, 0x134, 0x135, 0x136, + 0x137, 0x138, 0x139, 0x13A, 0x13B, 0x13C, 0x13D, 0x13E, 0x13F, 0x140, 0x141, 0x142, 0x143, 0x144, 0x145, 0x146, 0x147, 0x148, 0x149, 0x14A, 0x14B, + 0x14C, 0x14D, 0x14E, 0x14F, 0x150, 0x151, 0x152, 0x153, 0x154, 0x155, 0x156, 0x157, 0x158, 0x159, 0x15A, 0x15B, 0x15C, 0x15D, 0x15E, 0x15F, 0x160, + 0x161, 0x162, 0x163, 0x164, 0x165, 0x166, 0x167, 0x168, 0x169, 0x16A, 0x16B, 0x16C, 0x16D, 0x16E, 0x16F, 0x170, 0x171, 0x172, 0x173, 0x174, 0x175, + 0x176, 0x177, 0x178, 0x179, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x17A, 0x17B, 0x17C, 0x17D, 0x17E, 0x17F, 0x180, 0x181, 0x182, + 0x183, 0x184, 0x185, 0x186, 0x187, 0x188, 0x189, 0x18A, 0x18B, 0x18C, 0x18D, 0x18E, 0x18F, 0x190, 0x191, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, + 0x000, 0x000, 0x192, 0x193, 0x194, 0x195, 0x196, 0x197, 0x198, 0x199, 0x19A, 0x19B, 0x19C, 0x19D, 0x19E, 0x19F, 0x1A0, 0x1A1, 0x1A2, 0x1A3, 0x1A4, + 0x1A5, 0x1A6, 0x1A7, 0x1A8, 0x1A9, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, + 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, + 0x000, 0x1AA, 0x1AB, 0x1AC, 0x1AD, 0x1AE, 0x1AF, 0x1B0, 0x1B1, 0x1B2, 0x1B3, 0x1B4, 0x1B5, 0x1B6, 0x1B7, 0x1B8, 0x1B9, 0x1BA, 0x1BB, 0x1BC, 0x1BD, + 0x1BE, 0x1BF, 0x1C0, 0x1C1, 0x1C2, 0x1C3, 0x1C4, 0x1C5, 0x1C6, 0x1C7, 0x1C8, 0x1C9, 0x1CA, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, + 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x1CB, 0x1CC, 0x1CD, 0x1CE, 0x1CF, 0x1D0, 0x1D1, 0x1D2, 0x1D3, 0x1D4, 0x1D5, 0x1D6, 0x1D7, 0x1D8, + 0x1D9, 0x1DA, 0x1DB, 0x1DC, 0x1DD, 0x1DE, 0x1DF, 0x1E0, 0x1E1, 0x1E2, 0x1E3, 0x1E4, 0x1E5, 0x1E6, 0x1E7, 0x1E8, 0x1E9, 0x1EA, 0x1EB, 0x000, 0x000, + 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x1EC, 0x1ED, 0x1EE, 0x1EF, 0x1F0, 0x1F1, 0x1F2, 0x1F3, 0x1F4, 0x1F5, + 0x1F6, 0x1F7, 0x1F8, 0x1F9, 0x1FA, 0x1FB, 0x1FC, 0x1FD, 0x1FE, 0x1FF, 0x200, 0x201, 0x202, 0x203, 0x204, 0x205, 0x206, 0x207, 0x208, 0x209, 0x20A, + 0x20B, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, + 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, + 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x20C, + 0x20D, 0x20E, 0x20F, 0x210, 0x211, 0x212, 0x213, 0x214, 0x215, 0x216, 0x217, 0x218, 0x219, 0x21A, 0x21B, 0x21C, 0x21D, 0x21E, 0x21F, 0x220, 0x221, + 0x222, 0x223, 0x224, 0x225, 0x226, 0x227, 0x228, 0x229, 0x22A, 0x22B, 0x22C, 0x22D, 0x22E, 0x22F, 0x230, 0x231, 0x232, 0x233, 0x234, 0x235, 0x236, + 0x237, 0x238, 0x239, 0x23A, 0x23B, 0x23C, 0x23D, 0x23E, 0x23F, 0x240, 0x241, 0x242, 0x243, 0x244, 0x245, 0x246, 0x247, 0x248, 0x249, 0x24A, 0x24B, + 0x24C, 0x24D, 0x24E, 0x24F, 0x250, 0x251, 0x252, 0x253, 0x254, 0x255, 0x256, 0x257, 0x258, 0x259, 0x25A, 0x25B, 0x25C, 0x25D, 0x25E, 0x25F, 0x260, + 0x261, 0x262, 0x263, 0x264, 0x265, 0x266, 0x267, 0x268, 0x269, 0x26A, 0x26B, 0x26C, 0x26D, 0x26E, 0x26F, 0x270, 0x271, 0x272, 0x273, 0x274, 0x275, + 0x276, 0x277, 0x278, 0x279, 0x27A, 0x27B, 0x27C, 0x27D, 0x27E, 0x27F, 0x280, 0x281, 0x282, 0x283, 0x284, 0x285, 0x286, 0x287, 0x288, 0x289, 0x28A, + 0x28B, 0x28C, 0x28D, 0x28E, 0x28F, 0x290, 0x291, 0x292, 0x293, 0x294, 0x295, 0x296, 0x297, 0x298, 0x299, 0x29A, 0x29B, 0x29C, 0x29D, 0x29E, 0x29F, + 0x2A0, 0x2A1, 0x2A2, 0x2A3, 0x2A4, 0x2A5, 0x2A6, 0x2A7, 0x2A8, 0x2A9, 0x2AA, 0x2AB, 0x2AC, 0x2AD, 0x2AE, 0x2AF, 0x2B0, 0x2B1, 0x2B2, 0x2B3, 0x2B4, + 0x2B5, 0x2B6, 0x2B7, 0x2B8, 0x2B9, 0x2BA, 0x2BB, 0x2BC, 0x2BD, 0x2BE, 0x2BF, 0x2C0, 0x2C1, 0x2C2, 0x2C3, 0x2C4, 0x2C5, 0x2C6, 0x2C7, 0x2C8, 0x000, + 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, + 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, + 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, + 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, + 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, + 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, + 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, + 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, + 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x2C9, 0x2CA, + 0x2CB, 0x2CC, 0x2CD, 0x2CE, 0x2CF, 0x2D0, 0x2D1, 0x2D2, 0x2D3, 0x2D4, 0x2D5, 0x2D6, 0x2D7, 0x2D8, 0x2D9, 0x2DA, 0x2DB, 0x2DC, 0x2DD, 0x2DE, 0x2DF, + 0x2E0, 0x2E1, 0x2E2, 0x2E3, 0x2E4, 0x2E5, 0x2E6, 0x000, 0x2E7, 0x2E8, 0x2E9, 0x2EA, 0x2EB, 0x2EC, 0x2ED, 0x2EE, 0x2EF, 0x2F0, 0x2F1, 0x2F2, 0x2F3, + 0x2F4, 0x2F5, 0x2F6, 0x2F7, 0x2F8, 0x2F9, 0x2FA, 0x2FB, 0x2FC, 0x2FD, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x2FE, 0x2FF, 0x300, + 0x301, 0x302, 0x303, 0x304, 0x305, 0x306, 0x307, 0x308, 0x309, 0x30A, 0x30B, 0x30C, 0x30D, 0x30E, 0x30F, 0x310, 0x311, 0x312, 0x313, 0x314, 0x315, + 0x316, 0x317, 0x318, 0x319, 0x31A, 0x31B, 0x000 }; + +static int GetFontCode(unsigned short code) +{ + if (OSGetFontEncode() == OS_FONT_ENCODE_SJIS) { + if (code >= 0x20 && code <= 0xDF) { + return HankakuToCode[code - 0x20]; + } + + if (code > 0x889E) { + int i = ((code >> 8) - 0x88) * 188; + int j = (code & 0xFF) - 0x40; + + if (j >= 0x40) { + j--; + } + + return (i + j + 0x2BE); + } + + if (code < 0x879E) { + int i = ((code >> 8) - 0x81) * 188; + int j = (code & 0xFF) - 0x40; + + if (j >= 0x40) { + j--; + } + + return Zenkaku2Code[i + j]; + } + } + else if (code > 0x20 && code <= 0xFF) { + return code - 0x20; + } + else { + return 0; + } +} + +static void Decode(unsigned char *s, unsigned char *d) +{ + int i; + int j; + int k; + int p; + int q; + int r7; // huh? DWARF info says these 2 variables might be register names and not actual names. + int r25; + int cnt; + int os; + unsigned int flag; + unsigned int code; + + os = *(int *)(s + 0x4); + r7 = *(int *)(s + 0x8); + r25 = *(int *)(s + 0xC); + + q = 0; + flag = 0; + p = 16; + + do { + // Get next mask + if (flag == 0) { + code = *(u32 *)(s + p); + p += sizeof(u32); + flag = sizeof(u32) * 8; + } + + // Non-linked chunk + if (code & 0x80000000) { + d[q++] = s[r25++]; + } + // Linked chunk + else { + // Read offset from link table + j = s[r7] << 8 | s[r7 + 1]; + r7 += sizeof(u16); + + // Apply offset + k = q - (j & 0x0FFF); + cnt = j >> 12; + if (cnt == 0) { + cnt = s[r25++] + 0x12; + } + else { + cnt += 2; + } + + // Copy chunk + for (i = 0; i < cnt; i++, q++, k++) { + d[q] = d[k - 1]; + } + } + + // Prepare next mask bit + code <<= 1; + flag--; + } while (q < os); +} + +static u32 GetFontSize(u8 *buf) +{ + if (buf[0] == 'Y' && buf[1] == 'a' && buf[2] == 'y') { + return *(u32 *)(buf + 0x4); + } + + return 0; +} + +u16 OSGetFontEncode(void) +{ + static u16 fontEncode = 0xFFFF; + if (fontEncode <= 1) { + return fontEncode; + } + switch (*(int *)OSPhysicalToCached(0xCC)) { + case VI_NTSC: + fontEncode = (__VIRegs[VI_DTV_STAT] & 2) ? OS_FONT_ENCODE_SJIS : OS_FONT_ENCODE_ANSI; + break; + + case VI_PAL: + case VI_MPAL: + case VI_DEBUG: + case VI_DEBUG_PAL: + case VI_EURGB60: + default: + fontEncode = OS_FONT_ENCODE_ANSI; + } + + return fontEncode; +} + +static void ReadROM(void *buf, int length, int offset) +{ + int len; + while (length > 0) { + len = (length <= 0x100) ? length : 0x100; + length -= len; + + while (!__OSReadROM(buf, len, offset)) { + ; + } + + offset += len; + (u8 *)buf += len; + } +} + +static u32 ReadFont(void *img) +{ + if (OSGetFontEncode() == OS_FONT_ENCODE_SJIS) { + ReadROM(img, OS_FONT_ROM_SIZE_SJIS, 0x1AFF00); + } + else { + ReadROM(img, OS_FONT_ROM_SIZE_ANSI, 0x1FCF00); + } + + return GetFontSize(img); +} + +u32 OSLoadFont(OSFontHeader *fontData, void *temp) +{ + u32 size; + + SheetImage = NULL; + size = ReadFont(temp); + if (size) { + Decode(temp, (void *)fontData); + FontData = fontData; + WidthTable = (u8 *)FontData + FontData->widthTable; + CharsInSheet = FontData->sheetColumn * FontData->sheetRow; + } + + return size; +} + +char *OSGetFontTexel(char *string, void *image, long pos, long stride, long *width) +{ + unsigned short code; + unsigned char *src; + unsigned char *dst; + int fontCode; + int sheet; + int numChars; + int row; + int column; + int x; + int y; + int offsetSrc; + int offsetDst; + unsigned char *colorIndex; + unsigned char *imageSrc; + + // ASSERTLINE(0x1F6, FontData && !SheetImage); + + code = *string; + if (code == '\0') { + return string; + } + + string++; + if (OSGetFontEncode() == OS_FONT_ENCODE_SJIS) { + if ((((code >= 0x80) && (code <= 0x9F)) || ((code >= 0xE0) && (code <= 0xFF))) && ((s8)*string != 0U)) { + code = (code << 8) | (*string++); // Shift-JIS encoded byte + } + } + colorIndex = &FontData->c0; + + // ASSERTLINE(0x209, FontData->sheetFormat == GX_TF_I4); + + fontCode = GetFontCode(code); + + sheet = fontCode / CharsInSheet; + numChars = fontCode - (sheet * CharsInSheet); + row = numChars / FontData->sheetColumn; + column = (numChars - (row * FontData->sheetColumn)); + row *= FontData->cellHeight; + column *= FontData->cellWidth; + imageSrc = (u8 *)FontData + FontData->sheetImage; + imageSrc += (sheet * FontData->sheetSize) / 2; + + for (y = 0; y < FontData->cellHeight; y++) { + for (x = 0; x < FontData->cellWidth; x++) { + src = imageSrc + (((FontData->sheetWidth / 8) * 32) / 2) * ((row + y) / 8); + src += ((column + x) / 8) * 16; + src += ((row + y) % 8) * 2; + src += ((column + x) % 8) / 4; + + offsetSrc = (column + x) % 4; + + dst = (u8 *)image + ((y / 8) * (((stride * 4) / 8) * 32)); + dst += (((pos + x) / 8) * 32); + dst += ((y % 8) * 4); + dst += ((pos + x) % 8) / 2; + + offsetDst = (pos + x) % 2; + + *dst |= colorIndex[*src >> (6 - (offsetSrc * 2)) & 3] & ((offsetDst != 0) ? 0x0F : 0xF0); + } + } + *width = WidthTable[fontCode]; + + return string; +} diff --git a/src/dolphin/os/OSInterrupt.c b/src/dolphin/os/OSInterrupt.c new file mode 100644 index 00000000..061e7daf --- /dev/null +++ b/src/dolphin/os/OSInterrupt.c @@ -0,0 +1,434 @@ +#include +#include +#include + +static asm void ExternalInterruptHandler(register __OSException exception, register OSContext *context); + +static __OSInterruptHandler *InterruptHandlerTable; + +static OSInterruptMask InterruptPrioTable[] = { + OS_INTERRUPTMASK_PI_ERROR, + OS_INTERRUPTMASK_PI_DEBUG, + OS_INTERRUPTMASK_MEM, + OS_INTERRUPTMASK_PI_RSW, + OS_INTERRUPTMASK_PI_VI, + OS_INTERRUPTMASK_PI_PE, + OS_INTERRUPTMASK_PI_HSP, + OS_INTERRUPTMASK_DSP_ARAM | OS_INTERRUPTMASK_DSP_DSP | OS_INTERRUPTMASK_AI | OS_INTERRUPTMASK_EXI | OS_INTERRUPTMASK_PI_SI + | OS_INTERRUPTMASK_PI_DI, + OS_INTERRUPTMASK_DSP_AI, + OS_INTERRUPTMASK_PI_CP, + 0xFFFFFFFF, +}; + +asm BOOL OSDisableInterrupts(void) +{ + // clang-format off + nofralloc +entry __RAS_OSDisableInterrupts_begin + mfmsr r3 + rlwinm r4, r3, 0, 17, 15 + mtmsr r4 + rlwinm r3, r3, 17, 31, 31 +entry __RAS_OSDisableInterrupts_end + blr + // clang-format on +} +asm BOOL OSEnableInterrupts(void) +{ + // clang-format off + nofralloc + + mfmsr r3 + ori r4, r3, 0x8000 + mtmsr r4 + rlwinm r3, r3, 17, 31, 31 + blr + // clang-format on +} + +asm BOOL OSRestoreInterrupts(register BOOL level) { + // clang-format off + + nofralloc + + cmpwi level, 0 + mfmsr r4 + beq _disable + ori r5, r4, 0x8000 + b _restore +_disable: + rlwinm r5, r4, 0, 17, 15 +_restore: + mtmsr r5 + rlwinm r3, r4, 17, 31, 31 + blr + // clang-format on +} + +__OSInterruptHandler __OSSetInterruptHandler(__OSInterrupt interrupt, __OSInterruptHandler handler) +{ + __OSInterruptHandler oldHandler; + + oldHandler = InterruptHandlerTable[interrupt]; + InterruptHandlerTable[interrupt] = handler; + return oldHandler; +} + +__OSInterruptHandler __OSGetInterruptHandler(__OSInterrupt interrupt) +{ + return InterruptHandlerTable[interrupt]; +} + +void __OSInterruptInit(void) +{ + InterruptHandlerTable = OSPhysicalToCached(0x3040); + memset(InterruptHandlerTable, 0, __OS_INTERRUPT_MAX * sizeof(__OSInterruptHandler)); + + *(OSInterruptMask *)OSPhysicalToCached(0x00C4) = 0; + + *(OSInterruptMask *)OSPhysicalToCached(0x00C8) = 0; + + __PIRegs[1] = 0xf0; + + __OSMaskInterrupts(OS_INTERRUPTMASK_MEM | OS_INTERRUPTMASK_DSP | OS_INTERRUPTMASK_AI | OS_INTERRUPTMASK_EXI | OS_INTERRUPTMASK_PI); + + __OSSetExceptionHandler(4, ExternalInterruptHandler); +} + +u32 SetInterruptMask(OSInterruptMask mask, OSInterruptMask current) +{ + u32 reg; + + switch (__cntlzw(mask)) { + case __OS_INTERRUPT_MEM_0: + case __OS_INTERRUPT_MEM_1: + case __OS_INTERRUPT_MEM_2: + case __OS_INTERRUPT_MEM_3: + case __OS_INTERRUPT_MEM_ADDRESS: + reg = 0; + if (!(current & OS_INTERRUPTMASK_MEM_0)) + reg |= 0x1; + if (!(current & OS_INTERRUPTMASK_MEM_1)) + reg |= 0x2; + if (!(current & OS_INTERRUPTMASK_MEM_2)) + reg |= 0x4; + if (!(current & OS_INTERRUPTMASK_MEM_3)) + reg |= 0x8; + if (!(current & OS_INTERRUPTMASK_MEM_ADDRESS)) + reg |= 0x10; + __MEMRegs[0x0000000e] = (u16)reg; + mask &= ~OS_INTERRUPTMASK_MEM; + break; + case __OS_INTERRUPT_DSP_AI: + case __OS_INTERRUPT_DSP_ARAM: + case __OS_INTERRUPT_DSP_DSP: + reg = __DSPRegs[0x00000005]; + reg &= ~0x1F8; + if (!(current & OS_INTERRUPTMASK_DSP_AI)) + reg |= 0x10; + if (!(current & OS_INTERRUPTMASK_DSP_ARAM)) + reg |= 0x40; + if (!(current & OS_INTERRUPTMASK_DSP_DSP)) + reg |= 0x100; + __DSPRegs[0x00000005] = (u16)reg; + mask &= ~OS_INTERRUPTMASK_DSP; + break; + case __OS_INTERRUPT_AI_AI: + reg = __AIRegs[0]; + reg &= ~0x2C; + if (!(current & OS_INTERRUPTMASK_AI_AI)) + reg |= 0x4; + __AIRegs[0] = reg; + mask &= ~OS_INTERRUPTMASK_AI; + break; + case __OS_INTERRUPT_EXI_0_EXI: + case __OS_INTERRUPT_EXI_0_TC: + case __OS_INTERRUPT_EXI_0_EXT: + reg = __EXIRegs[0]; + reg &= ~0x2C0F; + if (!(current & OS_INTERRUPTMASK_EXI_0_EXI)) + reg |= 0x1; + if (!(current & OS_INTERRUPTMASK_EXI_0_TC)) + reg |= 0x4; + if (!(current & OS_INTERRUPTMASK_EXI_0_EXT)) + reg |= 0x400; + __EXIRegs[0] = reg; + mask &= ~OS_INTERRUPTMASK_EXI_0; + break; + case __OS_INTERRUPT_EXI_1_EXI: + case __OS_INTERRUPT_EXI_1_TC: + case __OS_INTERRUPT_EXI_1_EXT: + reg = __EXIRegs[5]; + reg &= ~0xC0F; + + if (!(current & OS_INTERRUPTMASK_EXI_1_EXI)) + reg |= 0x1; + if (!(current & OS_INTERRUPTMASK_EXI_1_TC)) + reg |= 0x4; + if (!(current & OS_INTERRUPTMASK_EXI_1_EXT)) + reg |= 0x400; + __EXIRegs[5] = reg; + mask &= ~OS_INTERRUPTMASK_EXI_1; + break; + case __OS_INTERRUPT_EXI_2_EXI: + case __OS_INTERRUPT_EXI_2_TC: + reg = __EXIRegs[10]; + reg &= ~0xF; + if (!(current & OS_INTERRUPTMASK_EXI_2_EXI)) + reg |= 0x1; + if (!(current & OS_INTERRUPTMASK_EXI_2_TC)) + reg |= 0x4; + + __EXIRegs[10] = reg; + mask &= ~OS_INTERRUPTMASK_EXI_2; + break; + case __OS_INTERRUPT_PI_CP: + case __OS_INTERRUPT_PI_SI: + case __OS_INTERRUPT_PI_DI: + case __OS_INTERRUPT_PI_RSW: + case __OS_INTERRUPT_PI_ERROR: + case __OS_INTERRUPT_PI_VI: + case __OS_INTERRUPT_PI_DEBUG: + case __OS_INTERRUPT_PI_PE_TOKEN: + case __OS_INTERRUPT_PI_PE_FINISH: + case __OS_INTERRUPT_PI_HSP: + reg = 0xF0; + + if (!(current & OS_INTERRUPTMASK_PI_CP)) { + reg |= 0x800; + } + if (!(current & OS_INTERRUPTMASK_PI_SI)) { + reg |= 0x8; + } + if (!(current & OS_INTERRUPTMASK_PI_DI)) { + reg |= 0x4; + } + if (!(current & OS_INTERRUPTMASK_PI_RSW)) { + reg |= 0x2; + } + if (!(current & OS_INTERRUPTMASK_PI_ERROR)) { + reg |= 0x1; + } + if (!(current & OS_INTERRUPTMASK_PI_VI)) { + reg |= 0x100; + } + if (!(current & OS_INTERRUPTMASK_PI_DEBUG)) { + reg |= 0x1000; + } + if (!(current & OS_INTERRUPTMASK_PI_PE_TOKEN)) { + reg |= 0x200; + } + if (!(current & OS_INTERRUPTMASK_PI_PE_FINISH)) { + reg |= 0x400; + } + if (!(current & OS_INTERRUPTMASK_PI_HSP)) { + reg |= 0x2000; + } + __PIRegs[1] = reg; + mask &= ~OS_INTERRUPTMASK_PI; + break; + default: + break; + } + return mask; +} + +OSInterruptMask OSGetInterruptMask(void) +{ + return *(OSInterruptMask *)OSPhysicalToCached(0x00C8); +} + +OSInterruptMask OSSetInterruptMask(OSInterruptMask local) +{ + BOOL enabled; + OSInterruptMask global; + OSInterruptMask prev; + OSInterruptMask mask; + + enabled = OSDisableInterrupts(); + global = *(OSInterruptMask *)OSPhysicalToCached(0x00C4); + prev = *(OSInterruptMask *)OSPhysicalToCached(0x00C8); + mask = (global | prev) ^ local; + *(OSInterruptMask *)OSPhysicalToCached(0x00C8) = local; + while (mask) { + mask = SetInterruptMask(mask, global | local); + } + OSRestoreInterrupts(enabled); + return prev; +} + +OSInterruptMask __OSMaskInterrupts(OSInterruptMask global) +{ + BOOL enabled; + OSInterruptMask prev; + OSInterruptMask local; + OSInterruptMask mask; + + enabled = OSDisableInterrupts(); + prev = *(OSInterruptMask *)OSPhysicalToCached(0x00C4); + local = *(OSInterruptMask *)OSPhysicalToCached(0x00C8); + mask = ~(prev | local) & global; + global |= prev; + *(OSInterruptMask *)OSPhysicalToCached(0x00C4) = global; + while (mask) { + mask = SetInterruptMask(mask, global | local); + } + OSRestoreInterrupts(enabled); + return prev; +} + +OSInterruptMask __OSUnmaskInterrupts(OSInterruptMask global) +{ + BOOL enabled; + OSInterruptMask prev; + OSInterruptMask local; + OSInterruptMask mask; + + enabled = OSDisableInterrupts(); + prev = *(OSInterruptMask *)OSPhysicalToCached(0x00C4); + local = *(OSInterruptMask *)OSPhysicalToCached(0x00C8); + mask = (prev | local) & global; + global = prev & ~global; + *(OSInterruptMask *)OSPhysicalToCached(0x00C4) = global; + while (mask) { + mask = SetInterruptMask(mask, global | local); + } + OSRestoreInterrupts(enabled); + return prev; +} + +volatile OSTime __OSLastInterruptTime; +volatile __OSInterrupt __OSLastInterrupt; +volatile u32 __OSLastInterruptSrr0; + +void __OSDispatchInterrupt(__OSException exception, OSContext *context) +{ + u32 intsr; + u32 reg; + OSInterruptMask cause; + OSInterruptMask unmasked; + OSInterruptMask *prio; + __OSInterrupt interrupt; + __OSInterruptHandler handler; + intsr = __PIRegs[0]; + intsr &= ~0x00010000; + + if (intsr == 0 || (intsr & __PIRegs[1]) == 0) { + OSLoadContext(context); + } + + cause = 0; + + if (intsr & 0x00000080) { + reg = __MEMRegs[15]; + if (reg & 0x1) + cause |= OS_INTERRUPTMASK_MEM_0; + if (reg & 0x2) + cause |= OS_INTERRUPTMASK_MEM_1; + if (reg & 0x4) + cause |= OS_INTERRUPTMASK_MEM_2; + if (reg & 0x8) + cause |= OS_INTERRUPTMASK_MEM_3; + if (reg & 0x10) + cause |= OS_INTERRUPTMASK_MEM_ADDRESS; + } + + if (intsr & 0x00000040) { + reg = __DSPRegs[5]; + if (reg & 0x8) + cause |= OS_INTERRUPTMASK_DSP_AI; + if (reg & 0x20) + cause |= OS_INTERRUPTMASK_DSP_ARAM; + if (reg & 0x80) + cause |= OS_INTERRUPTMASK_DSP_DSP; + } + + if (intsr & 0x00000020) { + reg = __AIRegs[0]; + if (reg & 0x8) + cause |= OS_INTERRUPTMASK_AI_AI; + } + + if (intsr & 0x00000010) { + reg = __EXIRegs[0]; + if (reg & 0x2) + cause |= OS_INTERRUPTMASK_EXI_0_EXI; + if (reg & 0x8) + cause |= OS_INTERRUPTMASK_EXI_0_TC; + if (reg & 0x800) + cause |= OS_INTERRUPTMASK_EXI_0_EXT; + reg = __EXIRegs[5]; + if (reg & 0x2) + cause |= OS_INTERRUPTMASK_EXI_1_EXI; + if (reg & 0x8) + cause |= OS_INTERRUPTMASK_EXI_1_TC; + if (reg & 0x800) + cause |= OS_INTERRUPTMASK_EXI_1_EXT; + reg = __EXIRegs[10]; + if (reg & 0x2) + cause |= OS_INTERRUPTMASK_EXI_2_EXI; + if (reg & 0x8) + cause |= OS_INTERRUPTMASK_EXI_2_TC; + } + + if (intsr & 0x00002000) + cause |= OS_INTERRUPTMASK_PI_HSP; + if (intsr & 0x00001000) + cause |= OS_INTERRUPTMASK_PI_DEBUG; + if (intsr & 0x00000400) + cause |= OS_INTERRUPTMASK_PI_PE_FINISH; + if (intsr & 0x00000200) + cause |= OS_INTERRUPTMASK_PI_PE_TOKEN; + if (intsr & 0x00000100) + cause |= OS_INTERRUPTMASK_PI_VI; + if (intsr & 0x00000008) + cause |= OS_INTERRUPTMASK_PI_SI; + if (intsr & 0x00000004) + cause |= OS_INTERRUPTMASK_PI_DI; + if (intsr & 0x00000002) + cause |= OS_INTERRUPTMASK_PI_RSW; + if (intsr & 0x00000800) + cause |= OS_INTERRUPTMASK_PI_CP; + if (intsr & 0x00000001) + cause |= OS_INTERRUPTMASK_PI_ERROR; + + unmasked = cause & ~(*(OSInterruptMask *)OSPhysicalToCached(0x00C4) | *(OSInterruptMask *)OSPhysicalToCached(0x00C8)); + if (unmasked) { + for (prio = InterruptPrioTable;; ++prio) { + if (unmasked & *prio) { + interrupt = (__OSInterrupt)__cntlzw(unmasked & *prio); + break; + } + } + + handler = __OSGetInterruptHandler(interrupt); + if (handler) { + if (__OS_INTERRUPT_MEM_ADDRESS < interrupt) { + __OSLastInterrupt = interrupt; + __OSLastInterruptTime = OSGetTime(); + __OSLastInterruptSrr0 = context->srr0; + } + + OSDisableScheduler(); + handler(interrupt, context); + OSEnableScheduler(); + __OSReschedule(); + OSLoadContext(context); + } + } + + OSLoadContext(context); +} + +static asm void ExternalInterruptHandler(register __OSException exception, register OSContext *context) +{ +#pragma unused(exception) + // clang-format off + nofralloc + OS_EXCEPTION_SAVE_GPRS(context) + + stwu r1, -8(r1) + b __OSDispatchInterrupt + // clang-format on +} diff --git a/src/dolphin/os/OSLink.c b/src/dolphin/os/OSLink.c new file mode 100644 index 00000000..c3f3e03c --- /dev/null +++ b/src/dolphin/os/OSLink.c @@ -0,0 +1,504 @@ +#include "dolphin/os.h" + +#define SHN_UNDEF 0 +#define SHN_LORESERVE 0xff00 +#define SHN_LOPROC 0xff00 +#define SHN_HIPROC 0xff1f +#define SHN_ABS 0xfff1 +#define SHN_COMMON 0xfff2 +#define SHN_HIRESERVE 0xffff + +#define ELF32_R_SYM(i) ((i) >> 8) +#define ELF32_R_TYPE(i) ((unsigned char)(i)) +#define ELF32_R_INFO(s, t) (((s) << 8) + (unsigned char)(t)) + +// Name Value Field Calculation +#define R_PPC_NONE 0 // none none +#define R_PPC_ADDR32 1 // word32 S + A +#define R_PPC_ADDR24 2 // low24* (S + A) >> 2 +#define R_PPC_ADDR16 3 // half16* S + A +#define R_PPC_ADDR16_LO 4 // half16 #lo(S + A) +#define R_PPC_ADDR16_HI 5 // half16 #hi(S + A) +#define R_PPC_ADDR16_HA 6 // half16 #ha(S + A) +#define R_PPC_ADDR14 7 // low14* (S + A) >> 2 +#define R_PPC_ADDR14_BRTAKEN 8 // low14* (S + A) >> 2 +#define R_PPC_ADDR14_BRNTAKEN 9 // low14* (S + A) >> 2 +#define R_PPC_REL24 10 // low24* (S + A - P) >> 2 +#define R_PPC_REL14 11 // low14* (S + A - P) >> 2 +#define R_PPC_REL14_BRTAKEN 12 // low14* (S + A - P) >> 2 +#define R_PPC_REL14_BRNTAKEN 13 // low14* (S + A - P) >> 2 + +#define R_PPC_GOT16 14 // half16* G + A +#define R_PPC_GOT16_LO 15 // half16 #lo(G + A) +#define R_PPC_GOT16_HI 16 // half16 #hi(G + A) +#define R_PPC_GOT16_HA 17 // half16 #ha(G + A) +#define R_PPC_PLTREL24 18 // low24* (L + A - P) >> 2 +#define R_PPC_COPY 19 // none none +#define R_PPC_GLOB_DAT 20 // word32 S + A +#define R_PPC_JMP_SLOT 21 // none +#define R_PPC_RELATIVE 22 // word32 B + A + +#define R_PPC_LOCAL24PC 23 // low24* + +#define R_PPC_UADDR32 24 // word32 S + A +#define R_PPC_UADDR16 25 // half16* S + A +#define R_PPC_REL32 26 // word32 S + A - P + +#define R_PPC_PLT32 27 // word32 L + A +#define R_PPC_PLTREL32 28 // word32 L + A - P +#define R_PPC_PLT16_LO 29 // half16 #lo(L + A) +#define R_PPL_PLT16_HI 30 // half16 #hi(L + A) +#define R_PPC_PLT16_HA 31 // half16 #ha(L + A) + +#define R_PPC_SDAREL16 32 // half16* S + A - _SDA_BASE_ +#define R_PPC_SECTOFF 33 // half16* R + A +#define R_PPC_SECTOFF_LO 34 // half16 #lo(R + A) +#define R_PPC_SECTOFF_HI 35 // half16 #hi(R + A) +#define R_PPC_SECTOFF_HA 36 // half16 #ha(R + A) +#define R_PPC_ADDR30 37 // word30 (S + A - P) >> 2 + +#define R_PPC_EMB_NADDR32 101 // uword32 N (A - S) +#define R_PPC_EMB_NADDR16 102 // uhalf16 Y (A - S) +#define R_PPC_EMB_NADDR16_LO 103 // uhalf16 N #lo(A - S) +#define R_PPC_EMB_NADDR16_HI 104 // uhalf16 N #hi(A - S) +#define R_PPC_EMB_NADDR16_HA 105 // uhalf16 N #ha(A - S) +#define R_PPC_EMB_SDAI16 106 // uhalf16 Y T +#define R_PPC_EMB_SDA2I16 107 // uhalf16 Y U +#define R_PPC_EMB_SDA2REL 108 // uhalf16 Y S + A - _SDA2_BASE_ +#define R_PPC_EMB_SDA21 109 // ulow21 N +#define R_PPC_EMB_MRKREF 110 // none N +#define R_PPC_EMB_RELSEC16 111 // uhalf16 Y V + A +#define R_PPC_EMB_RELST_LO 112 // uhalf16 N #lo(W + A) +#define R_PPC_EMB_RELST_HI 113 // uhalf16 N #hi(W + A) +#define R_PPC_EMB_RELST_HA 114 // uhalf16 N #ha(W + A) +#define R_PPC_EMB_BIT_FLD 115 // uword32 Y +#define R_PPC_EMB_RELSDA 116 // uhalf16 Y + +OSModuleQueue __OSModuleInfoList : (OS_BASE_CACHED | 0x30C8); +const void *__OSStringTable : (OS_BASE_CACHED | 0x30D0); + +#pragma dont_inline on +__declspec(weak) void OSNotifyLink(void) { } + +__declspec(weak) void OSNotifyUnlink(void) { } + +#pragma dont_inline reset + +#define EnqueueTail(queue, moduleInfo, link) \ + do { \ + OSModuleInfo *__prev; \ + \ + __prev = (queue)->tail; \ + if (__prev == NULL) \ + (queue)->head = (moduleInfo); \ + else \ + __prev->link.next = (moduleInfo); \ + (moduleInfo)->link.prev = __prev; \ + (moduleInfo)->link.next = NULL; \ + (queue)->tail = (moduleInfo); \ + } while (0) + +#define DequeueItem(queue, moduleInfo, link) \ + do { \ + OSModuleInfo *__next; \ + OSModuleInfo *__prev; \ + \ + __next = (moduleInfo)->link.next; \ + __prev = (moduleInfo)->link.prev; \ + \ + if (__next == NULL) \ + (queue)->tail = __prev; \ + else \ + __next->link.prev = __prev; \ + \ + if (__prev == NULL) \ + (queue)->head = __next; \ + else \ + __prev->link.next = __next; \ + } while (0) + +void OSSetStringTable(const void *stringTable) +{ + __OSStringTable = stringTable; +} + +static BOOL Relocate(OSModuleHeader *newModule, OSModuleHeader *module) +{ + OSModuleID idNew; + OSImportInfo *imp; + OSRel *rel; + OSSectionInfo *si; + OSSectionInfo *siFlush; + u32 *p; + u32 offset; + u32 x; + + idNew = newModule ? newModule->info.id : 0; + for (imp = (OSImportInfo *)module->impOffset; imp < (OSImportInfo *)(module->impOffset + module->impSize); imp++) { + if (imp->id == idNew) { + goto Found; + } + } + return FALSE; + +Found: + siFlush = 0; + for (rel = (OSRel *)imp->offset; rel->type != R_DOLPHIN_END; rel++) { + (u8 *)p += rel->offset; + if (idNew) { + si = &OSGetSectionInfo(newModule)[rel->section]; + offset = OS_SECTIONINFO_OFFSET(si->offset); + } + else { + offset = 0; + } + switch (rel->type) { + case R_PPC_NONE: + break; + case R_PPC_ADDR32: + x = offset + rel->addend; + *p = x; + break; + case R_PPC_ADDR24: + x = offset + rel->addend; + *p = (*p & ~0x03fffffc) | (x & 0x03fffffc); + break; + case R_PPC_ADDR16: + x = offset + rel->addend; + *(u16 *)p = (u16)(x & 0xffff); + break; + case R_PPC_ADDR16_LO: + x = offset + rel->addend; + *(u16 *)p = (u16)(x & 0xffff); + break; + case R_PPC_ADDR16_HI: + x = offset + rel->addend; + *(u16 *)p = (u16)(((x >> 16) & 0xffff)); + break; + case R_PPC_ADDR16_HA: + x = offset + rel->addend; + *(u16 *)p = (u16)(((x >> 16) + ((x & 0x8000) ? 1 : 0)) & 0xffff); + break; + case R_PPC_REL24: + x = offset + rel->addend - (u32)p; + *p = (*p & ~0x03fffffc) | (x & 0x03fffffc); + break; + case R_DOLPHIN_NOP: + break; + case R_DOLPHIN_SECTION: + si = &OSGetSectionInfo(module)[rel->section]; + p = (u32 *)OS_SECTIONINFO_OFFSET(si->offset); + if (siFlush) { + offset = OS_SECTIONINFO_OFFSET(siFlush->offset); + DCFlushRange((void *)offset, siFlush->size); + ICInvalidateRange((void *)offset, siFlush->size); + } + siFlush = (si->offset & OS_SECTIONINFO_EXEC) ? si : 0; + break; + default: + OSReport("OSLink: unknown relocation type %3d\n", rel->type); + break; + } + } + + if (siFlush) { + offset = OS_SECTIONINFO_OFFSET(siFlush->offset); + DCFlushRange((void *)offset, siFlush->size); + ICInvalidateRange((void *)offset, siFlush->size); + } + + return TRUE; +} + +#if OS_MODULE_VERSION >= 3 +static BOOL Link(OSModuleInfo *newModule, void *bss, BOOL fixed) +{ + u32 i; + OSSectionInfo *si; + OSModuleHeader *moduleHeader; + OSModuleInfo *moduleInfo; + OSImportInfo *imp; + + moduleHeader = (OSModuleHeader *)newModule; + moduleHeader->bssSection = 0; + + if (OS_MODULE_VERSION < newModule->version + || 2 <= newModule->version + && (moduleHeader->align && (u32)newModule % moduleHeader->align != 0 + || moduleHeader->bssAlign && (u32)bss % moduleHeader->bssAlign != 0)) { + return FALSE; + } + + EnqueueTail(&__OSModuleInfoList, newModule, link); + newModule->sectionInfoOffset += (u32)moduleHeader; + moduleHeader->relOffset += (u32)moduleHeader; + moduleHeader->impOffset += (u32)moduleHeader; + if (3 <= newModule->version) { + moduleHeader->fixSize += (u32)moduleHeader; + } + for (i = 1; i < newModule->numSections; i++) { + si = &OSGetSectionInfo(newModule)[i]; + if (si->offset != 0) { + si->offset += (u32)moduleHeader; + } + else if (si->size != 0) { + moduleHeader->bssSection = (u8)i; + si->offset = (u32)bss; + bss = (void *)((u32)bss + si->size); + } + } + for (imp = (OSImportInfo *)moduleHeader->impOffset; imp < (OSImportInfo *)(moduleHeader->impOffset + moduleHeader->impSize); imp++) { + imp->offset += (u32)moduleHeader; + } + if (moduleHeader->prologSection != SHN_UNDEF) { + moduleHeader->prolog += OS_SECTIONINFO_OFFSET(OSGetSectionInfo(newModule)[moduleHeader->prologSection].offset); + } + if (moduleHeader->epilogSection != SHN_UNDEF) { + moduleHeader->epilog += OS_SECTIONINFO_OFFSET(OSGetSectionInfo(newModule)[moduleHeader->epilogSection].offset); + } + if (moduleHeader->unresolvedSection != SHN_UNDEF) { + moduleHeader->unresolved += OS_SECTIONINFO_OFFSET(OSGetSectionInfo(newModule)[moduleHeader->unresolvedSection].offset); + } + if (__OSStringTable) { + newModule->nameOffset += (u32)__OSStringTable; + } + + Relocate(0, moduleHeader); + + for (moduleInfo = __OSModuleInfoList.head; moduleInfo; moduleInfo = moduleInfo->link.next) { + Relocate(moduleHeader, (OSModuleHeader *)moduleInfo); + if (moduleInfo != newModule) { + Relocate((OSModuleHeader *)moduleInfo, moduleHeader); + } + } + + if (fixed) { + for (imp = (OSImportInfo *)moduleHeader->impOffset; imp < (OSImportInfo *)(moduleHeader->impOffset + moduleHeader->impSize); imp++) { + if (imp->id == 0 || imp->id == newModule->id) { + moduleHeader->impSize = (u32)((u8 *)imp - (u8 *)moduleHeader->impOffset); + break; + } + } + } + + memset(bss, 0, moduleHeader->bssSize); + + OSNotifyLink(newModule); + + return TRUE; +} + +BOOL OSLink(OSModuleInfo *newModule, void *bss) +{ + return Link(newModule, bss, FALSE); +} + +BOOL OSLinkFixed(OSModuleInfo *newModule, void *bss) +{ + if (OS_MODULE_VERSION < newModule->version || newModule->version < 3) { + return FALSE; + } + return Link(newModule, bss, TRUE); +} +#else +BOOL OSLink(OSModuleInfo *newModule, void *bss) +{ + u32 i; + OSSectionInfo *si; + OSModuleHeader *moduleHeader; + OSModuleInfo *moduleInfo; + OSImportInfo *imp; + + moduleHeader = (OSModuleHeader *)newModule; + + if (OS_MODULE_VERSION < newModule->version + || 2 <= newModule->version + && (moduleHeader->align && (u32)newModule % moduleHeader->align != 0 + || moduleHeader->bssAlign && (u32)bss % moduleHeader->bssAlign != 0)) { + return FALSE; + } + + EnqueueTail(&__OSModuleInfoList, newModule, link); + memset(bss, 0, moduleHeader->bssSize); + newModule->sectionInfoOffset += (u32)moduleHeader; + moduleHeader->relOffset += (u32)moduleHeader; + moduleHeader->impOffset += (u32)moduleHeader; + + for (i = 0; i < newModule->numSections; i++) { + si = &OSGetSectionInfo(newModule)[i]; + if (si->offset != 0) { + si->offset += (u32)moduleHeader; + } + else if (si->size != 0) { + si->offset = (u32)bss; + bss = (void *)((u32)bss + si->size); + } + } + for (imp = (OSImportInfo *)moduleHeader->impOffset; imp < (OSImportInfo *)(moduleHeader->impOffset + moduleHeader->impSize); imp++) { + imp->offset += (u32)moduleHeader; + } + if (moduleHeader->prologSection != SHN_UNDEF) { + moduleHeader->prolog += OS_SECTIONINFO_OFFSET(OSGetSectionInfo(newModule)[moduleHeader->prologSection].offset); + } + if (moduleHeader->epilogSection != SHN_UNDEF) { + moduleHeader->epilog += OS_SECTIONINFO_OFFSET(OSGetSectionInfo(newModule)[moduleHeader->epilogSection].offset); + } + if (moduleHeader->unresolvedSection != SHN_UNDEF) { + moduleHeader->unresolved += OS_SECTIONINFO_OFFSET(OSGetSectionInfo(newModule)[moduleHeader->unresolvedSection].offset); + } + if (__OSStringTable) { + newModule->nameOffset += (u32)__OSStringTable; + } + + Relocate(0, moduleHeader); + + for (moduleInfo = __OSModuleInfoList.head; moduleInfo; moduleInfo = moduleInfo->link.next) { + Relocate(moduleHeader, (OSModuleHeader *)moduleInfo); + if (moduleInfo != newModule) { + Relocate((OSModuleHeader *)moduleInfo, moduleHeader); + } + } + + OSNotifyLink(); + + return TRUE; +} +#endif + +static BOOL Undo(OSModuleHeader *newModule, OSModuleHeader *module) +{ + OSModuleID idNew; + OSImportInfo *imp; + OSRel *rel; + OSSectionInfo *si; + OSSectionInfo *siFlush; + u32 *p; + u32 offset; + u32 x; + + idNew = newModule->info.id; + + for (imp = (OSImportInfo *)module->impOffset; imp < (OSImportInfo *)(module->impOffset + module->impSize); imp++) { + if (imp->id == idNew) { + goto Found; + } + } + return FALSE; + +Found: + siFlush = 0; + for (rel = (OSRel *)imp->offset; rel->type != R_DOLPHIN_END; rel++) { + (u8 *)p += rel->offset; + si = &OSGetSectionInfo(newModule)[rel->section]; + offset = OS_SECTIONINFO_OFFSET(si->offset); + x = 0; + switch (rel->type) { + case R_PPC_NONE: + break; + case R_PPC_ADDR32: + *p = x; + break; + case R_PPC_ADDR24: + *p = (*p & ~0x03fffffc) | (x & 0x03fffffc); + break; + case R_PPC_ADDR16: + *(u16 *)p = (u16)(x & 0xffff); + break; + case R_PPC_ADDR16_LO: + *(u16 *)p = (u16)(x & 0xffff); + break; + case R_PPC_ADDR16_HI: + *(u16 *)p = (u16)(((x >> 16) & 0xffff)); + break; + case R_PPC_ADDR16_HA: + *(u16 *)p = (u16)(((x >> 16) + ((x & 0x8000) ? 1 : 0)) & 0xffff); + break; + case R_PPC_REL24: + if (module->unresolvedSection != SHN_UNDEF) { + x = (u32)module->unresolved - (u32)p; + } + *p = (*p & ~0x03fffffc) | (x & 0x03fffffc); + break; + case R_DOLPHIN_NOP: + break; + case R_DOLPHIN_SECTION: + si = &OSGetSectionInfo(module)[rel->section]; + p = (u32 *)OS_SECTIONINFO_OFFSET(si->offset); + if (siFlush) { + offset = OS_SECTIONINFO_OFFSET(siFlush->offset); + DCFlushRange((void *)offset, siFlush->size); + ICInvalidateRange((void *)offset, siFlush->size); + } + siFlush = (si->offset & OS_SECTIONINFO_EXEC) ? si : 0; + break; + default: + OSReport("OSUnlink: unknown relocation type %3d\n", rel->type); + break; + } + } + + if (siFlush) { + offset = OS_SECTIONINFO_OFFSET(siFlush->offset); + DCFlushRange((void *)offset, siFlush->size); + ICInvalidateRange((void *)offset, siFlush->size); + } + + return TRUE; +} + +BOOL OSUnlink(OSModuleInfo *oldModule) +{ + OSModuleHeader *moduleHeader; + OSModuleInfo *moduleInfo; + + moduleHeader = (OSModuleHeader *)oldModule; + + DequeueItem(&__OSModuleInfoList, oldModule, link); + + for (moduleInfo = __OSModuleInfoList.head; moduleInfo; moduleInfo = moduleInfo->link.next) { + Undo(moduleHeader, (OSModuleHeader *)moduleInfo); + } + + OSNotifyUnlink(); + + return TRUE; +} + +void __OSModuleInit(void) +{ + __OSModuleInfoList.head = __OSModuleInfoList.tail = 0; + __OSStringTable = 0; +} + +OSModuleInfo *OSSearchModule(void *ptr, u32 *section, u32 *offset) +{ + OSModuleInfo *moduleInfo; + OSSectionInfo *sectionInfo; + u32 i; + u32 baseSection; + + if (ptr == NULL) { + return NULL; + } + + for (moduleInfo = __OSModuleInfoList.head; moduleInfo; moduleInfo = moduleInfo->link.next) { + sectionInfo = OSGetSectionInfo(moduleInfo); + for (i = 0; i < moduleInfo->numSections; ++i) { + if (sectionInfo->size) { + baseSection = OS_SECTIONINFO_OFFSET(sectionInfo->offset); + if (baseSection <= (u32)ptr && (u32)ptr < baseSection + sectionInfo->size) { + if (section) { + *section = i; + } + if (offset) { + *offset = (u32)ptr - baseSection; + } + return moduleInfo; + } + } + sectionInfo++; + } + } + + return NULL; +} diff --git a/src/dolphin/os/OSMemory.c b/src/dolphin/os/OSMemory.c new file mode 100644 index 00000000..7cfda15a --- /dev/null +++ b/src/dolphin/os/OSMemory.c @@ -0,0 +1,230 @@ +#include +#include + +#define TRUNC(n, a) (((u32)(n)) & ~((a)-1)) +#define ROUND(n, a) (((u32)(n) + (a)-1) & ~((a)-1)) + +extern OSErrorHandler __OSErrorTable[16]; + +static BOOL OnReset(BOOL final); + +static OSResetFunctionInfo ResetFunctionInfo = { + OnReset, + 127, +}; +u32 OSGetPhysicalMemSize() +{ + return *(u32 *)(OSPhysicalToCached(0x0028)); +} + +u32 OSGetConsoleSimulatedMemSize() +{ + return *(u32 *)(OSPhysicalToCached(0x00F0)); +} + +static BOOL OnReset(BOOL final) +{ + if (final != FALSE) { + __MEMRegs[8] = 0xFF; + __OSMaskInterrupts(0xf0000000); + } + return TRUE; +} + +static void MEMIntrruptHandler(__OSInterrupt interrupt, OSContext *context) +{ + u32 addr; + u32 cause; + + cause = __MEMRegs[0xf]; + addr = (((u32)__MEMRegs[0x12] & 0x3ff) << 16) | __MEMRegs[0x11]; + __MEMRegs[0x10] = 0; + + if (__OSErrorTable[OS_ERROR_PROTECTION]) { + __OSErrorTable[OS_ERROR_PROTECTION](OS_ERROR_PROTECTION, context, cause, addr); + return; + } + + __OSUnhandledException(OS_ERROR_PROTECTION, context, cause, addr); +} + +void OSProtectRange(u32 chan, void *addr, u32 nBytes, u32 control) +{ + BOOL enabled; + u32 start; + u32 end; + u16 reg; + if (4 <= chan) { + return; + } + + control &= OS_PROTECT_CONTROL_RDWR; + + end = (u32)addr + nBytes; + start = TRUNC(addr, 1u << 10); + end = ROUND(end, 1u << 10); + + DCFlushRange((void *)start, end - start); + + enabled = OSDisableInterrupts(); + + __OSMaskInterrupts(OS_INTERRUPTMASK(__OS_INTERRUPT_MEM_0 + chan)); + + __MEMRegs[0 + 2 * chan] = (u16)(start >> 10); + __MEMRegs[1 + 2 * chan] = (u16)(end >> 10); + + reg = __MEMRegs[8]; + reg &= ~(OS_PROTECT_CONTROL_RDWR << 2 * chan); + reg |= control << 2 * chan; + __MEMRegs[8] = reg; + + if (control != OS_PROTECT_CONTROL_RDWR) { + __OSUnmaskInterrupts(OS_INTERRUPTMASK(__OS_INTERRUPT_MEM_0 + chan)); + } + + OSRestoreInterrupts(enabled); +} + +asm void Config24MB() +{ + // clang-format off + nofralloc + + addi r7,r0,0 + + addis r4,r0,0x00000002@ha + addi r4,r4,0x00000002@l + addis r3,r0,0x800001ff@ha + addi r3,r3,0x800001ff@l + + addis r6,r0,0x01000002@ha + addi r6,r6,0x01000002@l + addis r5,r0,0x810000ff@ha + addi r5,r5,0x810000ff@l + + isync + + mtspr dbat0u,r7 + mtspr dbat0l,r4 + mtspr dbat0u,r3 + isync + + mtspr ibat0u,r7 + mtspr ibat0l,r4 + mtspr ibat0u,r3 + isync + + mtspr dbat2u,r7 + mtspr dbat2l,r6 + mtspr dbat2u,r5 + isync + + mtspr ibat2u,r7 + mtspr ibat2l,r6 + mtspr ibat2u,r5 + isync + + mfmsr r3 + ori r3, r3, 0x30 + mtsrr1 r3 + + mflr r3 + mtsrr0 r3 + rfi + // clang-format on +} + +asm void Config48MB() +{ + // clang-format off + nofralloc + + addi r7,r0,0x0000 + + addis r4,r0,0x00000002@ha + addi r4,r4,0x00000002@l + addis r3,r0,0x800003ff@ha + addi r3,r3,0x800003ff@l + + addis r6,r0,0x02000002@ha + addi r6,r6,0x02000002@l + addis r5,r0,0x820001ff@ha + addi r5,r5,0x820001ff@l + + isync + + mtspr dbat0u,r7 + mtspr dbat0l,r4 + mtspr dbat0u,r3 + isync + + mtspr ibat0u,r7 + mtspr ibat0l,r4 + mtspr ibat0u,r3 + isync + + mtspr dbat2u,r7 + mtspr dbat2l,r6 + mtspr dbat2u,r5 + isync + + mtspr ibat2u,r7 + mtspr ibat2l,r6 + mtspr ibat2u,r5 + isync + + mfmsr r3 + ori r3, r3, 0x30 + mtsrr1 r3 + + mflr r3 + mtsrr0 r3 + rfi + // clang-format on +} + +asm void RealMode(register u32 addr) +{ + // clang-format off + nofralloc + clrlwi r3, r3, 2 + mtsrr0 r3 + mfmsr r3 + rlwinm r3, r3, 0, 28, 25 + mtsrr1 r3 + rfi + // clang-format on +} + +void __OSInitMemoryProtection() +{ + u32 padding[8]; + u32 simulatedSize; + BOOL enabled; + simulatedSize = OSGetConsoleSimulatedMemSize(); + enabled = OSDisableInterrupts(); + if (simulatedSize <= 0x1800000) { + RealMode((u32)&Config24MB); + } + else if (simulatedSize <= 0x3000000) { + RealMode((u32)&Config48MB); + } + + __MEMRegs[16] = 0; + __MEMRegs[8] = 0xFF; + + __OSMaskInterrupts(OS_INTERRUPTMASK_MEM_0 | OS_INTERRUPTMASK_MEM_1 | OS_INTERRUPTMASK_MEM_2 | OS_INTERRUPTMASK_MEM_3); + __OSSetInterruptHandler(__OS_INTERRUPT_MEM_0, MEMIntrruptHandler); + __OSSetInterruptHandler(__OS_INTERRUPT_MEM_1, MEMIntrruptHandler); + __OSSetInterruptHandler(__OS_INTERRUPT_MEM_2, MEMIntrruptHandler); + __OSSetInterruptHandler(__OS_INTERRUPT_MEM_3, MEMIntrruptHandler); + __OSSetInterruptHandler(__OS_INTERRUPT_MEM_ADDRESS, MEMIntrruptHandler); + OSRegisterResetFunction(&ResetFunctionInfo); + + if (OSGetConsoleSimulatedMemSize() < OSGetPhysicalMemSize() && OSGetConsoleSimulatedMemSize() == 0x1800000) { + __MEMRegs[20] = 2; + } + + __OSUnmaskInterrupts(OS_INTERRUPTMASK_MEM_ADDRESS); + OSRestoreInterrupts(enabled); +} diff --git a/src/dolphin/os/OSMessage.c b/src/dolphin/os/OSMessage.c new file mode 100644 index 00000000..0d364af2 --- /dev/null +++ b/src/dolphin/os/OSMessage.c @@ -0,0 +1,91 @@ +#include + +void OSInitMessageQueue(OSMessageQueue *mq, OSMessage *msgArray, s32 msgCount) +{ + OSInitThreadQueue(&mq->queueSend); + OSInitThreadQueue(&mq->queueReceive); + mq->msgArray = msgArray; + mq->msgCount = msgCount; + mq->firstIndex = 0; + mq->usedCount = 0; +} +BOOL OSSendMessage(OSMessageQueue *mq, OSMessage msg, s32 flags) +{ + BOOL enabled; + s32 lastIndex; + + enabled = OSDisableInterrupts(); + + while (mq->msgCount <= mq->usedCount) { + if (!(flags & OS_MESSAGE_BLOCK)) { + OSRestoreInterrupts(enabled); + return FALSE; + } + else { + OSSleepThread(&mq->queueSend); + } + } + + lastIndex = (mq->firstIndex + mq->usedCount) % mq->msgCount; + mq->msgArray[lastIndex] = msg; + mq->usedCount++; + + OSWakeupThread(&mq->queueReceive); + + OSRestoreInterrupts(enabled); + return TRUE; +} + +BOOL OSReceiveMessage(OSMessageQueue *mq, OSMessage *msg, s32 flags) +{ + BOOL enabled; + + enabled = OSDisableInterrupts(); + + while (mq->usedCount == 0) { + if (!(flags & OS_MESSAGE_BLOCK)) { + OSRestoreInterrupts(enabled); + return FALSE; + } + else { + OSSleepThread(&mq->queueReceive); + } + } + + if (msg != NULL) { + *msg = mq->msgArray[mq->firstIndex]; + } + mq->firstIndex = (mq->firstIndex + 1) % mq->msgCount; + mq->usedCount--; + + OSWakeupThread(&mq->queueSend); + + OSRestoreInterrupts(enabled); + return TRUE; +} + +BOOL OSJamMessage(OSMessageQueue *mq, OSMessage msg, s32 flags) +{ + BOOL enabled; + + enabled = OSDisableInterrupts(); + + while (mq->msgCount <= mq->usedCount) { + if (!(flags & OS_MESSAGE_BLOCK)) { + OSRestoreInterrupts(enabled); + return FALSE; + } + else { + OSSleepThread(&mq->queueSend); + } + } + + mq->firstIndex = (mq->firstIndex + mq->msgCount - 1) % mq->msgCount; + mq->msgArray[mq->firstIndex] = msg; + mq->usedCount++; + + OSWakeupThread(&mq->queueReceive); + + OSRestoreInterrupts(enabled); + return TRUE; +} diff --git a/src/dolphin/os/OSMutex.c b/src/dolphin/os/OSMutex.c new file mode 100644 index 00000000..986b81e0 --- /dev/null +++ b/src/dolphin/os/OSMutex.c @@ -0,0 +1,244 @@ +#include "dolphin/os.h" + +#define PushTail(queue, mutex, link) \ + do { \ + OSMutex *__prev; \ + \ + __prev = (queue)->tail; \ + if (__prev == NULL) \ + (queue)->head = (mutex); \ + else \ + __prev->link.next = (mutex); \ + (mutex)->link.prev = __prev; \ + (mutex)->link.next = NULL; \ + (queue)->tail = (mutex); \ + } while (0) + +#define PopHead(queue, mutex, link) \ + do { \ + OSMutex *__next; \ + \ + (mutex) = (queue)->head; \ + __next = (mutex)->link.next; \ + if (__next == NULL) \ + (queue)->tail = NULL; \ + else \ + __next->link.prev = NULL; \ + (queue)->head = __next; \ + } while (0) + +#define PopItem(queue, mutex, link) \ + do { \ + OSMutex *__next; \ + OSMutex *__prev; \ + \ + __next = (mutex)->link.next; \ + __prev = (mutex)->link.prev; \ + \ + if (__next == NULL) \ + (queue)->tail = __prev; \ + else \ + __next->link.prev = __prev; \ + \ + if (__prev == NULL) \ + (queue)->head = __next; \ + else \ + __prev->link.next = __next; \ + } while (0) + +void OSInitMutex(OSMutex *mutex) +{ + OSInitThreadQueue(&mutex->queue); + mutex->thread = 0; + mutex->count = 0; +} + +void OSLockMutex(OSMutex *mutex) +{ + BOOL enabled = OSDisableInterrupts(); + OSThread *currentThread = OSGetCurrentThread(); + OSThread *ownerThread; + + while (TRUE) { + ownerThread = ((OSMutex *)mutex)->thread; + if (ownerThread == 0) { + mutex->thread = currentThread; + mutex->count++; + PushTail(¤tThread->queueMutex, mutex, link); + break; + } + else if (ownerThread == currentThread) { + mutex->count++; + break; + } + else { + currentThread->mutex = mutex; + __OSPromoteThread(mutex->thread, currentThread->priority); + OSSleepThread(&mutex->queue); + currentThread->mutex = 0; + } + } + OSRestoreInterrupts(enabled); +} + +void OSUnlockMutex(OSMutex *mutex) +{ + BOOL enabled = OSDisableInterrupts(); + OSThread *currentThread = OSGetCurrentThread(); + + if (mutex->thread == currentThread && --mutex->count == 0) { + PopItem(¤tThread->queueMutex, mutex, link); + mutex->thread = NULL; + if (currentThread->priority < currentThread->base) { + currentThread->priority = __OSGetEffectivePriority(currentThread); + } + + OSWakeupThread(&mutex->queue); + } + OSRestoreInterrupts(enabled); +} + +void __OSUnlockAllMutex(OSThread *thread) +{ + OSMutex *mutex; + + while (thread->queueMutex.head) { + PopHead(&thread->queueMutex, mutex, link); + mutex->count = 0; + mutex->thread = NULL; + OSWakeupThread(&mutex->queue); + } +} + +BOOL OSTryLockMutex(OSMutex *mutex) +{ + BOOL enabled = OSDisableInterrupts(); + OSThread *currentThread = OSGetCurrentThread(); + BOOL locked; + if (mutex->thread == 0) { + mutex->thread = currentThread; + mutex->count++; + PushTail(¤tThread->queueMutex, mutex, link); + locked = TRUE; + } + else if (mutex->thread == currentThread) { + mutex->count++; + locked = TRUE; + } + else { + locked = FALSE; + } + OSRestoreInterrupts(enabled); + return locked; +} + +void OSInitCond(OSCond *cond) +{ + OSInitThreadQueue(&cond->queue); +} + +void OSWaitCond(OSCond *cond, OSMutex *mutex) +{ + BOOL enabled = OSDisableInterrupts(); + OSThread *currentThread = OSGetCurrentThread(); + s32 count; + + if (mutex->thread == currentThread) { + count = mutex->count; + mutex->count = 0; + PopItem(¤tThread->queueMutex, mutex, link); + mutex->thread = NULL; + + if (currentThread->priority < currentThread->base) { + currentThread->priority = __OSGetEffectivePriority(currentThread); + } + + OSDisableScheduler(); + OSWakeupThread(&mutex->queue); + OSEnableScheduler(); + OSSleepThread(&cond->queue); + OSLockMutex(mutex); + mutex->count = count; + } + + OSRestoreInterrupts(enabled); +} + +void OSSignalCond(OSCond *cond) +{ + OSWakeupThread(&cond->queue); +} + +static BOOL IsMember(OSMutexQueue *queue, OSMutex *mutex) +{ + OSMutex *member; + + for (member = queue->head; member; member = member->link.next) { + if (mutex == member) + return TRUE; + } + return FALSE; +} + +BOOL __OSCheckMutex(OSMutex *mutex) +{ + OSThread *thread; + OSThreadQueue *queue; + OSPriority priority = 0; + + queue = &mutex->queue; + if (!(queue->head == NULL || queue->head->link.prev == NULL)) + return FALSE; + if (!(queue->tail == NULL || queue->tail->link.next == NULL)) + return FALSE; + for (thread = queue->head; thread; thread = thread->link.next) { + if (!(thread->link.next == NULL || thread == thread->link.next->link.prev)) + return FALSE; + if (!(thread->link.prev == NULL || thread == thread->link.prev->link.next)) + return FALSE; + + if (thread->state != OS_THREAD_STATE_WAITING) + return FALSE; + + if (thread->priority < priority) + return FALSE; + priority = thread->priority; + } + + if (mutex->thread) { + if (mutex->count <= 0) + return FALSE; + } + else { + if (0 != mutex->count) + return FALSE; + } + + return TRUE; +} + +BOOL __OSCheckDeadLock(OSThread *thread) +{ + OSMutex *mutex; + + mutex = thread->mutex; + while (mutex && mutex->thread) { + if (mutex->thread == thread) + return TRUE; + mutex = mutex->thread->mutex; + } + return FALSE; +} + +BOOL __OSCheckMutexes(OSThread *thread) +{ + OSMutex *mutex; + + for (mutex = thread->queueMutex.head; mutex; mutex = mutex->link.next) { + if (mutex->thread != thread) + return FALSE; + if (!__OSCheckMutex(mutex)) + return FALSE; + } + return TRUE; +} diff --git a/src/dolphin/os/OSReboot.c b/src/dolphin/os/OSReboot.c new file mode 100644 index 00000000..381d39c4 --- /dev/null +++ b/src/dolphin/os/OSReboot.c @@ -0,0 +1,94 @@ +#include +#include +#include +#include +#include + +typedef struct ApploaderHeader { + // total size: 0x20 + char date[16]; // offset 0x0, size 0x10 + u32 entry; // offset 0x10, size 0x4 + u32 size; // offset 0x14, size 0x4 + u32 rebootSize; // offset 0x18, size 0x4 + u32 reserved2; // offset 0x1C, size 0x4 +} ApploaderHeader; + +struct { + // total size: 0x1C + int valid; // offset 0x0, size 0x4 + unsigned long restartCode; // offset 0x4, size 0x4 + unsigned long bootDol; // offset 0x8, size 0x4 + void *regionStart; // offset 0xC, size 0x4 + void *regionEnd; // offset 0x10, size 0x4 + int argsUseDefault; // offset 0x14, size 0x4 + void *argsAddr; // offset 0x18, size 0x4 +} __OSRebootParams; // size: 0x1C, address: 0x0 + +static ApploaderHeader Header; + +extern void *__OSSavedRegionStart; +extern void *__OSSavedRegionEnd; + +static void *SaveStart = NULL; +static void *SaveEnd = NULL; + +volatile u8 DAT_800030e2 : 0x800030e2; + +extern u32 BOOT_REGION_START AT_ADDRESS(0x812FDFF0); //(*(u32 *)0x812fdff0) +extern u32 BOOT_REGION_END AT_ADDRESS(0x812FDFEC); //(*(u32 *)0x812fdfec) +extern u32 UNK_HOT_RESET1 AT_ADDRESS(0x817ffff8); +extern u32 UNK_HOT_RESET2 AT_ADDRESS(0x817ffffc); +// extern u32 OS_RESET_CODE AT_ADDRESS(0x800030F0); +// extern u8 OS_REBOOT_BOOL AT_ADDRESS(0x800030E2); // unknown function, set to true by __OSReboot + +extern u32 __OSIsGcam; + +static BOOL Prepared = FALSE; + +extern void __DVDPrepareResetAsync(DVDCBCallback callback); +extern BOOL DVDCheckDisk(void); +extern BOOL DVDReadAbsAsyncForBS(DVDCommandBlock *block, void *addr, s32 length, s32 offset, DVDCBCallback callback); + +void Run(register u32 addr) +{ + OSDisableInterrupts(); + ICFlashInvalidate(); + // clang-format off + asm { + sync + isync + mtlr addr + blr + } + // clang-format on +} + +static void Callback() +{ + Prepared = TRUE; +} + +void ReadApploader(OSTime time1) { } + +void __OSReboot(u32 resetCode, u32 bootDol) +{ + // TODO +} + +void OSSetSaveRegion(void *start, void *end) +{ + SaveStart = start; + SaveEnd = end; +} + +void OSGetSaveRegion(void **start, void **end) +{ + *start = SaveStart; + *end = SaveEnd; +} + +void OSGetSavedRegion(void **start, void **end) +{ + *start = __OSSavedRegionStart; + *end = __OSSavedRegionEnd; +} diff --git a/src/dolphin/os/OSReset.c b/src/dolphin/os/OSReset.c new file mode 100644 index 00000000..c4ee2c9b --- /dev/null +++ b/src/dolphin/os/OSReset.c @@ -0,0 +1,203 @@ +#include +#include +#include +#include +#include + +#include "string.h" + +volatile u8 DAT_800030e2 : 0x800030e2; +typedef struct Unk { + u8 pad[0x24]; + u32 resetCode; +} Unk; +volatile Unk DAT_cc003000 : 0xcc003000; + +typedef struct Unk2 { + u16 _0; + u16 _2; +} Unk2; + +volatile Unk2 DAT_cc002000 : 0xcc002000; + +typedef struct OSResetQueue { + OSResetFunctionInfo *first; + OSResetFunctionInfo *last; +} OSResetQueue; + +OSResetQueue ResetFunctionQueue; + +void OSRegisterResetFunction(OSResetFunctionInfo *func) +{ + OSResetFunctionInfo *tmp; + OSResetFunctionInfo *iter; + + for (iter = ResetFunctionQueue.first; iter && iter->priority <= func->priority; iter = iter->next) + ; + + if (iter == NULL) { + tmp = ResetFunctionQueue.last; + if (tmp == NULL) { + ResetFunctionQueue.first = func; + } + else { + tmp->next = func; + } + func->prev = tmp; + func->next = NULL; + ResetFunctionQueue.last = func; + return; + } + + func->next = iter; + tmp = iter->prev; + iter->prev = func; + func->prev = tmp; + if (tmp == NULL) { + ResetFunctionQueue.first = func; + return; + } + tmp->next = func; +} + +BOOL __OSCallResetFunctions(u32 arg0) +{ + OSResetFunctionInfo *iter; + s32 retCode = 0; + + for (iter = ResetFunctionQueue.first; iter != NULL; iter = iter->next) { + retCode |= !iter->func(arg0); + } + retCode |= !__OSSyncSram(); + if (retCode) { + return 0; + } + return 1; +} + +asm void Reset(register s32 resetCode) +{ + // clang-format off + nofralloc + b lbl_8038315C +lbl_80383140: + mfspr r8, HID0 + ori r8, r8, 8 + mtspr HID0, r8 + isync + sync + nop + b lbl_80383160 +lbl_8038315C: + b lbl_8038317C +lbl_80383160: + mftb r5, 268 +lbl_80383164: + mftb r6, 268 + subf r7, r5, r6 + cmplwi r7, 0x1124 + blt lbl_80383164 + nop + b lbl_80383180 +lbl_8038317C: + b lbl_8038319C +lbl_80383180: + lis r8, 0xCC003000@h + ori r8, r8, 0xCC003000@l + li r4, 3 + stw r4, 0x24(r8) + stw r3, 0x24(r8) + nop + b lbl_803831A0 +lbl_8038319C: + b lbl_803831A8 +lbl_803831A0: + nop + b lbl_803831A0 +lbl_803831A8: + b lbl_80383140 + // clang-format on +} + +OSThreadQueue __OSActiveThreadQueue : (OS_BASE_CACHED | 0x00DC); + +static void KillThreads(void) +{ + OSThread *thread; + OSThread *next; + + for (thread = __OSActiveThreadQueue.head; thread; thread = next) { + next = thread->linkActive.next; + switch (thread->state) { + case 1: + case 4: + OSCancelThread(thread); + break; + default: + break; + } + } +} + +void __OSDoHotReset(s32 arg0) +{ + OSDisableInterrupts(); + __VIRegs[1] = 0; + ICFlashInvalidate(); + Reset(arg0 * 8); +} + +void OSResetSystem(int reset, u32 resetCode, BOOL forceMenu) +{ + BOOL rc; + BOOL disableRecalibration; + u32 unk[3]; + OSDisableScheduler(); + __OSStopAudioSystem(); + + if (reset == OS_RESET_SHUTDOWN) { + disableRecalibration = __PADDisableRecalibration(TRUE); + } + + while (!__OSCallResetFunctions(FALSE)) + ; + + if (reset == OS_RESET_HOTRESET && forceMenu) { + OSSram *sram; + + sram = __OSLockSram(); + sram->flags |= 0x40; + __OSUnlockSram(TRUE); + + while (!__OSSyncSram()) + ; + } + OSDisableInterrupts(); + __OSCallResetFunctions(TRUE); + LCDisable(); + if (reset == OS_RESET_HOTRESET) { + __OSDoHotReset(resetCode); + } + else if (reset == OS_RESET_RESTART) { + KillThreads(); + OSEnableScheduler(); + __OSReboot(resetCode, forceMenu); + } + KillThreads(); + memset(OSPhysicalToCached(0x40), 0, 0xcc - 0x40); + memset(OSPhysicalToCached(0xd4), 0, 0xe8 - 0xd4); + memset(OSPhysicalToCached(0xf4), 0, 0xf8 - 0xf4); + memset(OSPhysicalToCached(0x3000), 0, 0xc0); + memset(OSPhysicalToCached(0x30c8), 0, 0xd4 - 0xc8); + memset(OSPhysicalToCached(0x30e2), 0, 1); + + __PADDisableRecalibration(disableRecalibration); +} + +u32 OSGetResetCode(void) +{ + if (DAT_800030e2 != 0) { + return 0x80000000; + } + return ((DAT_cc003000.resetCode & ~7) >> 3); +} diff --git a/src/dolphin/os/OSResetSW.c b/src/dolphin/os/OSResetSW.c new file mode 100644 index 00000000..59e70494 --- /dev/null +++ b/src/dolphin/os/OSResetSW.c @@ -0,0 +1,89 @@ +#include + +extern OSTime __OSGetSystemTime(); + +u8 GameChoice : (OS_BASE_CACHED | 0x30E3); + +vu32 __PIRegs[12] : 0xCC003000; + +extern OSTime __OSStartTime; + +static OSResetCallback ResetCallback; +static BOOL Down; +static BOOL LastState; +static OSTime HoldUp; +static OSTime HoldDown; + +void __OSResetSWInterruptHandler(__OSInterrupt interrupt, OSContext* context) { + OSResetCallback callback; + + HoldDown = __OSGetSystemTime(); + while (__OSGetSystemTime() - HoldDown < OSMicrosecondsToTicks(100) && + !(__PIRegs[0] & 0x00010000)) { + ; + } + if (!(__PIRegs[0] & 0x00010000)) { + LastState = Down = TRUE; + __OSMaskInterrupts(OS_INTERRUPTMASK_PI_RSW); + if (ResetCallback) { + callback = ResetCallback; + ResetCallback = NULL; + callback(); + } + } + __PIRegs[0] = 2; +} + +BOOL OSGetResetButtonState(void) { + BOOL enabled; + BOOL state; + u32 reg; + OSTime now; + + enabled = OSDisableInterrupts(); + + now = __OSGetSystemTime(); + + reg = __PIRegs[0]; + if (!(reg & 0x00010000)) { + if (!Down) { + Down = TRUE; + state = HoldUp ? TRUE : FALSE; + HoldDown = now; + } else { + state = (HoldUp || (OSMicrosecondsToTicks(100) < now - HoldDown)) ? TRUE : FALSE; + } + } else if (Down) { + Down = FALSE; + state = LastState; + if (state) { + HoldUp = now; + } else { + HoldUp = 0; + } + } else if (HoldUp && (now - HoldUp < OSMillisecondsToTicks(40))) { + state = TRUE; + } else { + state = FALSE; + HoldUp = 0; + } + + LastState = state; + + if (GameChoice & 0x3f) { + OSTime fire = (GameChoice & 0x3f) * 60; + fire = __OSStartTime + OSSecondsToTicks(fire); + if (fire < now) { + now -= fire; + now = OSTicksToSeconds(now) / 2; + if ((now & 1) == 0) { + state = TRUE; + } else { + state = FALSE; + } + } + } + + OSRestoreInterrupts(enabled); + return state; +} diff --git a/src/dolphin/os/OSRtc.c b/src/dolphin/os/OSRtc.c new file mode 100644 index 00000000..e3d2da41 --- /dev/null +++ b/src/dolphin/os/OSRtc.c @@ -0,0 +1,363 @@ +#include +#include +#include + +#define RTC_CMD_READ 0x20000000 +#define RTC_CMD_WRITE 0xa0000000 + +#define RTC_SRAM_ADDR 0x00000100 +#define RTC_SRAM_SIZE 64 + +#define RTC_CHAN 0 +#define RTC_DEV 1 +#define RTC_FREQ 3 // EXI_FREQ_8M + +typedef struct SramControlBlock { + u8 sram[RTC_SRAM_SIZE]; + u32 offset; + BOOL enabled; + BOOL locked; + BOOL sync; + void (*callback)(void); +} SramControlBlock; + +static SramControlBlock Scb ATTRIBUTE_ALIGN(32); + +static BOOL GetRTC(u32 *rtc) +{ + BOOL err; + u32 cmd; + + if (!EXILock(RTC_CHAN, RTC_DEV, 0)) { + return FALSE; + } + if (!EXISelect(RTC_CHAN, RTC_DEV, RTC_FREQ)) { + EXIUnlock(RTC_CHAN); + return FALSE; + } + + cmd = RTC_CMD_READ; + err = FALSE; + err |= !EXIImm(RTC_CHAN, &cmd, 4, 1, NULL); + err |= !EXISync(RTC_CHAN); + err |= !EXIImm(RTC_CHAN, &cmd, 4, 0, NULL); + err |= !EXISync(RTC_CHAN); + err |= !EXIDeselect(RTC_CHAN); + EXIUnlock(RTC_CHAN); + + *rtc = cmd; + + return !err; +} + +BOOL __OSGetRTC(u32 *rtc) +{ + BOOL err; + u32 t0; + u32 t1; + int i; + + for (i = 0; i < 16; i++) { + err = FALSE; + err |= !GetRTC(&t0); + err |= !GetRTC(&t1); + if (err) { + break; + } + if (t0 == t1) { + *rtc = t0; + return TRUE; + } + } + return FALSE; +} + +BOOL __OSSetRTC(u32 rtc) +{ + BOOL err; + u32 cmd; + + if (!EXILock(RTC_CHAN, RTC_DEV, 0)) { + return FALSE; + } + if (!EXISelect(RTC_CHAN, RTC_DEV, RTC_FREQ)) { + EXIUnlock(RTC_CHAN); + return FALSE; + } + + cmd = RTC_CMD_WRITE; + err = FALSE; + err |= !EXIImm(RTC_CHAN, &cmd, 4, 1, NULL); + err |= !EXISync(RTC_CHAN); + err |= !EXIImm(RTC_CHAN, &rtc, 4, 1, NULL); + err |= !EXISync(RTC_CHAN); + err |= !EXIDeselect(RTC_CHAN); + EXIUnlock(RTC_CHAN); + + return !err; +} + +static BOOL ReadSram(void *buffer) +{ + BOOL err; + u32 cmd; + + DCInvalidateRange(buffer, RTC_SRAM_SIZE); + + if (!EXILock(RTC_CHAN, RTC_DEV, 0)) { + return FALSE; + } + if (!EXISelect(RTC_CHAN, RTC_DEV, RTC_FREQ)) { + EXIUnlock(RTC_CHAN); + return FALSE; + } + + cmd = RTC_CMD_READ | RTC_SRAM_ADDR; + err = FALSE; + err |= !EXIImm(RTC_CHAN, &cmd, 4, 1, NULL); + err |= !EXISync(RTC_CHAN); + err |= !EXIDma(RTC_CHAN, buffer, RTC_SRAM_SIZE, 0, NULL); + err |= !EXISync(RTC_CHAN); + err |= !EXIDeselect(RTC_CHAN); + EXIUnlock(RTC_CHAN); + + return !err; +} + +BOOL WriteSram(void *buffer, u32 offset, u32 size); +static void WriteSramCallback(s32 chan, OSContext *context) +{ + Scb.sync = WriteSram(Scb.sram + Scb.offset, Scb.offset, RTC_SRAM_SIZE - Scb.offset); + if (Scb.sync) { + Scb.offset = RTC_SRAM_SIZE; + } +} + +BOOL WriteSram(void *buffer, u32 offset, u32 size) +{ + BOOL err; + u32 cmd; + + if (!EXILock(RTC_CHAN, RTC_DEV, WriteSramCallback)) { + return FALSE; + } + if (!EXISelect(RTC_CHAN, RTC_DEV, RTC_FREQ)) { + EXIUnlock(RTC_CHAN); + return FALSE; + } + + offset <<= 6; + cmd = RTC_CMD_WRITE | RTC_SRAM_ADDR + offset; + err = FALSE; + err |= !EXIImm(RTC_CHAN, &cmd, 4, 1, NULL); + err |= !EXISync(RTC_CHAN); + err |= !EXIImmEx(RTC_CHAN, buffer, (s32)size, 1); + err |= !EXIDeselect(RTC_CHAN); + EXIUnlock(RTC_CHAN); + + return !err; +} + +void __OSInitSram() +{ + Scb.locked = Scb.enabled = FALSE; + Scb.sync = ReadSram(Scb.sram); + Scb.offset = RTC_SRAM_SIZE; +} + +static void *LockSram(u32 offset) +{ + BOOL enabled; + enabled = OSDisableInterrupts(); + + if (Scb.locked != FALSE) { + OSRestoreInterrupts(enabled); + return NULL; + } + + Scb.enabled = enabled; + Scb.locked = TRUE; + + return Scb.sram + offset; +} + +OSSram *__OSLockSram() +{ + return LockSram(0); +} + +OSSramEx *__OSLockSramEx() +{ + return LockSram(sizeof(OSSram)); +} + +static BOOL UnlockSram(BOOL commit, u32 offset) +{ + u16 *p; + + if (commit) { + if (offset == 0) { + OSSram *sram = (OSSram *)Scb.sram; + + if (2u < (sram->flags & 3)) { + sram->flags &= ~3; + } + + sram->checkSum = sram->checkSumInv = 0; + for (p = (u16 *)&sram->counterBias; p < (u16 *)(Scb.sram + sizeof(OSSram)); p++) { + sram->checkSum += *p; + sram->checkSumInv += ~*p; + } + } + + if (offset < Scb.offset) { + Scb.offset = offset; + } + + Scb.sync = WriteSram(Scb.sram + Scb.offset, Scb.offset, RTC_SRAM_SIZE - Scb.offset); + if (Scb.sync) { + Scb.offset = RTC_SRAM_SIZE; + } + } + Scb.locked = FALSE; + OSRestoreInterrupts(Scb.enabled); + return Scb.sync; +} + +BOOL __OSUnlockSram(BOOL commit) +{ + return UnlockSram(commit, 0); +} + +BOOL __OSUnlockSramEx(BOOL commit) +{ + return UnlockSram(commit, sizeof(OSSram)); +} + +BOOL __OSSyncSram() +{ + return Scb.sync; +} + +BOOL __OSReadROM(void *buffer, s32 length, s32 offset) +{ + BOOL err; + u32 cmd; + + DCInvalidateRange(buffer, (u32)length); + + if (!EXILock(RTC_CHAN, RTC_DEV, 0)) { + return FALSE; + } + if (!EXISelect(RTC_CHAN, RTC_DEV, RTC_FREQ)) { + EXIUnlock(RTC_CHAN); + return FALSE; + } + + cmd = (u32)(offset << 6); + err = FALSE; + err |= !EXIImm(RTC_CHAN, &cmd, 4, 1, NULL); + err |= !EXISync(RTC_CHAN); + err |= !EXIDma(RTC_CHAN, buffer, length, 0, NULL); + err |= !EXISync(RTC_CHAN); + err |= !EXIDeselect(RTC_CHAN); + EXIUnlock(RTC_CHAN); + + return !err; +} + +inline OSSram *__OSLockSramHACK() +{ + return LockSram(0); +} +u32 OSGetSoundMode() +{ + OSSram *sram; + u32 mode; + + sram = __OSLockSramHACK(); + mode = (sram->flags & 0x4) ? OS_SOUND_MODE_STEREO : OS_SOUND_MODE_MONO; + __OSUnlockSram(FALSE); + return mode; +} + +void OSSetSoundMode(u32 mode) +{ + OSSram *sram; + mode <<= 2; + mode &= 4; + + sram = __OSLockSramHACK(); + if (mode == (sram->flags & 4)) { + __OSUnlockSram(FALSE); + return; + } + + sram->flags &= ~4; + sram->flags |= mode; + __OSUnlockSram(TRUE); +} + +u32 OSGetProgressiveMode() +{ + OSSram *sram; + u32 mode; + + sram = __OSLockSramHACK(); + mode = (sram->flags & 0x80) >> 7; + __OSUnlockSram(FALSE); + return mode; +} + +void OSSetProgressiveMode(u32 mode) +{ + OSSram *sram; + mode <<= 7; + mode &= 0x80; + + sram = __OSLockSramHACK(); + if (mode == (sram->flags & 0x80)) { + __OSUnlockSram(FALSE); + return; + } + + sram->flags &= ~0x80; + sram->flags |= mode; + __OSUnlockSram(TRUE); +} + +u8 OSGetLanguage() +{ + OSSram *sram; + u8 language; + + sram = __OSLockSramHACK(); + language = sram->language; + __OSUnlockSram(FALSE); + return language; +} + +u16 OSGetWirelessID(s32 channel) +{ + OSSramEx *sram; + u16 id; + + sram = __OSLockSramEx(); + id = sram->wirelessPadID[channel]; + __OSUnlockSramEx(FALSE); + return id; +} + +void OSSetWirelessID(s32 channel, u16 id) +{ + OSSramEx *sram; + + sram = __OSLockSramEx(); + if (sram->wirelessPadID[channel] != id) { + sram->wirelessPadID[channel] = id; + __OSUnlockSramEx(TRUE); + return; + } + + __OSUnlockSramEx(FALSE); +} diff --git a/src/dolphin/os/OSStopwatch.c b/src/dolphin/os/OSStopwatch.c new file mode 100644 index 00000000..80e7dbdd --- /dev/null +++ b/src/dolphin/os/OSStopwatch.c @@ -0,0 +1,61 @@ +#include +#include + +void OSInitStopwatch(struct OSStopwatch *sw, char *name) +{ + sw->name = name; + sw->total = 0; + sw->hits = 0; + sw->min = 0x00000000FFFFFFFF; + sw->max = 0; +} + +void OSStartStopwatch(struct OSStopwatch *sw) +{ + sw->running = 1; + sw->last = OSGetTime(); +} + +void OSStopStopwatch(struct OSStopwatch *sw) +{ + long long interval; + + if (sw->running != 0) { + interval = OSGetTime() - sw->last; + sw->total += interval; + sw->running = 0; + sw->hits++; + if (sw->max < interval) { + sw->max = interval; + } + if (interval < sw->min) { + sw->min = interval; + } + } +} + +long long OSCheckStopwatch(struct OSStopwatch *sw) +{ + long long currTotal; + + currTotal = sw->total; + if (sw->running != 0) { + currTotal += OSGetTime() - sw->last; + } + return currTotal; +} + +void OSResetStopwatch(struct OSStopwatch *sw) +{ + OSInitStopwatch(sw, sw->name); +} + +void OSDumpStopwatch(struct OSStopwatch *sw) +{ + OSReport("Stopwatch [%s] :\n", sw->name); + OSReport("\tTotal= %lld us\n", OSTicksToMicroseconds(sw->total)); + OSReport("\tHits = %d \n", sw->hits); + OSReport("\tMin = %lld us\n", OSTicksToMicroseconds(sw->min)); + OSReport("\tMax = %lld us\n", OSTicksToMicroseconds(sw->max)); + OSReport("\tMean = %lld us\n", OSTicksToMicroseconds(sw->total / sw->hits)); +} diff --git a/src/dolphin/os/OSSync.c b/src/dolphin/os/OSSync.c new file mode 100644 index 00000000..b5aeccf7 --- /dev/null +++ b/src/dolphin/os/OSSync.c @@ -0,0 +1,29 @@ +#include "string.h" +#include "dolphin/PPCArch.h" +#include "dolphin/os.h" + +void __OSSystemCallVectorStart(); +void __OSSystemCallVectorEnd(); +static asm void SystemCallVector() { + nofralloc +entry __OSSystemCallVectorStart + mfspr r9, HID0 + ori r10, r9, 8 + mtspr HID0, r10 + isync + sync + mtspr HID0, r9 + + rfi + +entry __OSSystemCallVectorEnd + nop +} + +void __OSInitSystemCall() { + void* addr = OSPhysicalToCached(0x00C00); + memcpy(addr, __OSSystemCallVectorStart, (size_t)__OSSystemCallVectorEnd - (size_t)__OSSystemCallVectorStart); + DCFlushRangeNoSync(addr, 0x100); + __sync(); + ICInvalidateRange(addr, 0x100); +} diff --git a/src/dolphin/os/OSThread.c b/src/dolphin/os/OSThread.c new file mode 100644 index 00000000..c9f4348d --- /dev/null +++ b/src/dolphin/os/OSThread.c @@ -0,0 +1,552 @@ +#include + +static vu32 RunQueueBits; +static volatile BOOL RunQueueHint; +static vs32 Reschedule; + +static OSThreadQueue RunQueue[32]; +static OSThread IdleThread; +static OSThread DefaultThread; +static OSContext IdleContext; +static void DefaultSwitchThreadCallback(OSThread *from, OSThread *to); +static OSSwitchThreadCallback SwitchThreadCallback = DefaultSwitchThreadCallback; + +OSThread *__OSCurrentThread : OS_BASE_CACHED + 0x00E4; +OSThreadQueue __OSActiveThreadQueue : OS_BASE_CACHED + 0x00DC; +volatile OSContext __OSCurrentContext : OS_BASE_CACHED + 0x00D4; +volatile OSContext *__OSFPUContext : OS_BASE_CACHED + 0x00D8; + +static void DefaultSwitchThreadCallback(OSThread *from, OSThread *to) { } + +extern u8 _stack_addr[]; +extern u8 _stack_end[]; + +#define AddTail(queue, thread, link) \ + do { \ + OSThread *prev; \ + \ + prev = (queue)->tail; \ + if (prev == NULL) \ + (queue)->head = (thread); \ + else \ + prev->link.next = (thread); \ + (thread)->link.prev = prev; \ + (thread)->link.next = NULL; \ + (queue)->tail = (thread); \ + } while (0) + +#define AddPrio(queue, thread, link) \ + do { \ + OSThread *prev, *next; \ + \ + for (next = (queue)->head; next && next->priority <= thread->priority; next = next->link.next) \ + ; \ + if (next == NULL) \ + AddTail(queue, thread, link); \ + else { \ + (thread)->link.next = next; \ + prev = next->link.prev; \ + next->link.prev = (thread); \ + (thread)->link.prev = prev; \ + if (prev == NULL) \ + (queue)->head = (thread); \ + else \ + prev->link.next = (thread); \ + } \ + } while (0) + +#define RemoveItem(queue, thread, link) \ + do { \ + OSThread *next, *prev; \ + next = (thread)->link.next; \ + prev = (thread)->link.prev; \ + if (next == NULL) \ + (queue)->tail = prev; \ + else \ + next->link.prev = prev; \ + if (prev == NULL) \ + (queue)->head = next; \ + else \ + prev->link.next = next; \ + } while (0) + +#define RemoveHead(queue, thread, link) \ + do { \ + OSThread *__next; \ + (thread) = (queue)->head; \ + __next = (thread)->link.next; \ + if (__next == NULL) \ + (queue)->tail = NULL; \ + else \ + __next->link.prev = NULL; \ + (queue)->head = __next; \ + } while (0) + +static inline void OSInitMutexQueue(OSMutexQueue *queue) +{ + queue->head = queue->tail = NULL; +} + +static inline void OSSetCurrentThread(OSThread *thread) +{ + __OSCurrentThread = thread; +} + +void __OSThreadInit() +{ + OSThread *thread = &DefaultThread; + int prio; + + thread->state = OS_THREAD_STATE_RUNNING; + thread->attr = OS_THREAD_ATTR_DETACH; + thread->priority = thread->base = 16; + thread->suspend = 0; + thread->val = (void *)-1; + thread->mutex = NULL; + OSInitThreadQueue(&thread->queueJoin); + OSInitMutexQueue(&thread->queueMutex); + + __OSFPUContext = &thread->context; + + OSClearContext(&thread->context); + OSSetCurrentContext(&thread->context); + thread->stackBase = (void *)_stack_addr; + thread->stackEnd = (void *)_stack_end; + *(thread->stackEnd) = OS_THREAD_STACK_MAGIC; + + OSSetCurrentThread(thread); + RunQueueBits = 0; + RunQueueHint = FALSE; + for (prio = OS_PRIORITY_MIN; prio <= OS_PRIORITY_MAX; ++prio) { + OSInitThreadQueue(&RunQueue[prio]); + } + + OSInitThreadQueue(&__OSActiveThreadQueue); + AddTail(&__OSActiveThreadQueue, thread, linkActive); + OSClearContext(&IdleContext); + Reschedule = 0; +} + +void OSInitThreadQueue(OSThreadQueue *queue) +{ + queue->head = queue->tail = NULL; +} + +OSThread *OSGetCurrentThread() +{ + return __OSCurrentThread; +} + +s32 OSDisableScheduler() +{ + BOOL enabled; + s32 count; + + enabled = OSDisableInterrupts(); + count = Reschedule++; + OSRestoreInterrupts(enabled); + return count; +} + +s32 OSEnableScheduler() +{ + BOOL enabled; + s32 count; + + enabled = OSDisableInterrupts(); + count = Reschedule--; + OSRestoreInterrupts(enabled); + return count; +} + +static void SetRun(OSThread *thread) +{ + thread->queue = &RunQueue[thread->priority]; + AddTail(thread->queue, thread, link); + RunQueueBits |= 1u << (OS_PRIORITY_MAX - thread->priority); + RunQueueHint = TRUE; +} +#pragma dont_inline on +static void UnsetRun(OSThread *thread) +{ + OSThreadQueue *queue; + queue = thread->queue; + RemoveItem(queue, thread, link); + if (queue->head == 0) + RunQueueBits &= ~(1u << (OS_PRIORITY_MAX - thread->priority)); + thread->queue = NULL; +} +#pragma dont_inline reset + +OSPriority __OSGetEffectivePriority(OSThread *thread) +{ + OSPriority priority; + OSMutex *mutex; + OSThread *blocked; + + priority = thread->base; + for (mutex = thread->queueMutex.head; mutex; mutex = mutex->link.next) { + blocked = mutex->queue.head; + if (blocked && blocked->priority < priority) { + priority = blocked->priority; + } + } + return priority; +} + +static OSThread *SetEffectivePriority(OSThread *thread, OSPriority priority) +{ + switch (thread->state) { + case OS_THREAD_STATE_READY: + UnsetRun(thread); + thread->priority = priority; + SetRun(thread); + break; + case OS_THREAD_STATE_WAITING: + RemoveItem(thread->queue, thread, link); + thread->priority = priority; + AddPrio(thread->queue, thread, link); + if (thread->mutex) { + return thread->mutex->thread; + } + break; + case OS_THREAD_STATE_RUNNING: + RunQueueHint = TRUE; + thread->priority = priority; + break; + } + return NULL; +} + +static void UpdatePriority(OSThread *thread) +{ + OSPriority priority; + + do { + if (0 < thread->suspend) { + break; + } + priority = __OSGetEffectivePriority(thread); + if (thread->priority == priority) { + break; + } + thread = SetEffectivePriority(thread, priority); + } while (thread); +} + +static void __OSSwitchThread(OSThread *nextThread) +{ + OSSetCurrentThread(nextThread); + OSSetCurrentContext(&nextThread->context); + OSLoadContext(&nextThread->context); +} + +static OSThread *SelectThread(BOOL yield) +{ + OSContext *currentContext; + OSThread *currentThread; + OSThread *nextThread; + OSPriority priority; + OSThreadQueue *queue; + + if (0 < Reschedule) { + return 0; + } + + currentContext = OSGetCurrentContext(); + currentThread = OSGetCurrentThread(); + if (currentContext != ¤tThread->context) { + return 0; + } + + if (currentThread) { + if (currentThread->state == OS_THREAD_STATE_RUNNING) { + if (!yield) { + priority = __cntlzw(RunQueueBits); + if (currentThread->priority <= priority) { + return 0; + } + } + currentThread->state = OS_THREAD_STATE_READY; + SetRun(currentThread); + } + + if (!(currentThread->context.state & OS_CONTEXT_STATE_EXC) && OSSaveContext(¤tThread->context)) { + return 0; + } + } + + OSSetCurrentThread(NULL); + if (RunQueueBits == 0) { + OSSetCurrentContext(&IdleContext); + do { + OSEnableInterrupts(); + while (RunQueueBits == 0) + ; + OSDisableInterrupts(); + } while (RunQueueBits == 0); + + OSClearContext(&IdleContext); + } + + RunQueueHint = FALSE; + + priority = __cntlzw(RunQueueBits); + queue = &RunQueue[priority]; + RemoveHead(queue, nextThread, link); + if (queue->head == 0) { + RunQueueBits &= ~(1u << (OS_PRIORITY_MAX - priority)); + } + nextThread->queue = NULL; + nextThread->state = OS_THREAD_STATE_RUNNING; + __OSSwitchThread(nextThread); + return nextThread; +} + +void __OSReschedule() +{ + if (!RunQueueHint) { + return; + } + + SelectThread(FALSE); +} + +void OSYieldThread(void) +{ + BOOL enabled; + + enabled = OSDisableInterrupts(); + SelectThread(TRUE); + OSRestoreInterrupts(enabled); +} + +int OSCreateThread(struct OSThread * thread, void * (* func)(void *), void * param, void * stack, unsigned long stackSize, long priority, unsigned short attr) { + int enabled; + unsigned long sp; + + // why check this for an assert just to check it again right after? + if ((priority < 0) || (priority > 0x1F)) { + return 0; + } + + thread->state = 1; + thread->attr = attr & 1U; + thread->base = priority; + thread->priority = priority; + thread->suspend = 1; + thread->val = (void*)-1; + thread->mutex = 0; + OSInitThreadQueue(&thread->queueJoin); + OSInitThreadQueue((void*)&thread->queueMutex); // why + sp = (u32)stack; + sp &= ~7; + sp -= 8; + ((u32*)sp)[0] = 0; + ((u32*)sp)[1] = 0; + OSInitContext(&thread->context, (u32)func, sp); + thread->context.lr = (unsigned long)&OSExitThread; + thread->context.gpr[3] = (unsigned long)param; + thread->stackBase = stack; + thread->stackEnd = (void*)((unsigned int)stack - stackSize); + *thread->stackEnd = 0xDEADBABE; + enabled = OSDisableInterrupts(); + + AddTail(&__OSActiveThreadQueue, thread, linkActive); + + OSRestoreInterrupts(enabled); + return 1; +} + +void OSExitThread(void *val) +{ + int enabled = OSDisableInterrupts(); + struct OSThread *currentThread = OSGetCurrentThread(); + + OSClearContext(¤tThread->context); + if (currentThread->attr & 1) { + RemoveItem(&__OSActiveThreadQueue, currentThread, linkActive); + currentThread->state = 0; + } + else { + currentThread->state = 8; + currentThread->val = val; + } + __OSUnlockAllMutex(currentThread); + OSWakeupThread(¤tThread->queueJoin); + RunQueueHint = 1; + if (RunQueueHint != 0) { + SelectThread(0); + } + OSRestoreInterrupts(enabled); +} + +void OSCancelThread(OSThread *thread) +{ + BOOL enabled; + + enabled = OSDisableInterrupts(); + + switch (thread->state) { + case OS_THREAD_STATE_READY: + if (!(0 < thread->suspend)) { + UnsetRun(thread); + } + break; + case OS_THREAD_STATE_RUNNING: + RunQueueHint = TRUE; + break; + case OS_THREAD_STATE_WAITING: + RemoveItem(thread->queue, thread, link); + thread->queue = NULL; + if (!(0 < thread->suspend) && thread->mutex) { + UpdatePriority(thread->mutex->thread); + } + break; + default: + OSRestoreInterrupts(enabled); + return; + } + + OSClearContext(&thread->context); + if (thread->attr & OS_THREAD_ATTR_DETACH) { + RemoveItem(&__OSActiveThreadQueue, thread, linkActive); + thread->state = 0; + } + else { + thread->state = OS_THREAD_STATE_MORIBUND; + } + + __OSUnlockAllMutex(thread); + + OSWakeupThread(&thread->queueJoin); + + __OSReschedule(); + OSRestoreInterrupts(enabled); + + return; +} + +s32 OSResumeThread(OSThread *thread) +{ + BOOL enabled; + s32 suspendCount; + + enabled = OSDisableInterrupts(); + suspendCount = thread->suspend--; + if (thread->suspend < 0) { + thread->suspend = 0; + } + else if (thread->suspend == 0) { + switch (thread->state) { + case OS_THREAD_STATE_READY: + thread->priority = __OSGetEffectivePriority(thread); + SetRun(thread); + break; + case OS_THREAD_STATE_WAITING: + RemoveItem(thread->queue, thread, link); + thread->priority = __OSGetEffectivePriority(thread); + AddPrio(thread->queue, thread, link); + if (thread->mutex) { + UpdatePriority(thread->mutex->thread); + } + break; + } + __OSReschedule(); + } + OSRestoreInterrupts(enabled); + return suspendCount; +} + +s32 OSSuspendThread(OSThread *thread) +{ + BOOL enabled; + s32 suspendCount; + + enabled = OSDisableInterrupts(); + suspendCount = thread->suspend++; + if (suspendCount == 0) { + switch (thread->state) { + case OS_THREAD_STATE_RUNNING: + RunQueueHint = TRUE; + thread->state = OS_THREAD_STATE_READY; + break; + case OS_THREAD_STATE_READY: + UnsetRun(thread); + break; + case OS_THREAD_STATE_WAITING: + RemoveItem(thread->queue, thread, link); + thread->priority = 32; + AddTail(thread->queue, thread, link); + if (thread->mutex) { + UpdatePriority(thread->mutex->thread); + } + break; + } + + __OSReschedule(); + } + OSRestoreInterrupts(enabled); + return suspendCount; +} + +void OSSleepThread(OSThreadQueue *queue) +{ + BOOL enabled; + OSThread *currentThread; + + enabled = OSDisableInterrupts(); + currentThread = OSGetCurrentThread(); + + currentThread->state = OS_THREAD_STATE_WAITING; + currentThread->queue = queue; + AddPrio(queue, currentThread, link); + RunQueueHint = TRUE; + __OSReschedule(); + OSRestoreInterrupts(enabled); +} + +void OSWakeupThread(OSThreadQueue *queue) +{ + BOOL enabled; + OSThread *thread; + + enabled = OSDisableInterrupts(); + while (queue->head) { + RemoveHead(queue, thread, link); + thread->state = OS_THREAD_STATE_READY; + if (!(0 < thread->suspend)) { + SetRun(thread); + } + } + __OSReschedule(); + OSRestoreInterrupts(enabled); +} + +void OSClearStack(u8 val) +{ + register u32 sp; + register u32 *p; + register u32 pattern; + + pattern = ((u32)val << 24) | ((u32)val << 16) | ((u32)val << 8) | (u32)val; + sp = OSGetStackPointer(); + for (p = __OSCurrentThread->stackEnd + 1; p < (u32 *)sp; ++p) { + *p = pattern; + } +} + +struct OSThread *OSSetIdleFunction(void (*idleFunction)(void *), void *param, void *stack, unsigned long stackSize) +{ + if (idleFunction) { + if (IdleThread.state == 0) { + OSCreateThread(&IdleThread, (void *)idleFunction, param, stack, stackSize, 0x1F, 1); + OSResumeThread(&IdleThread); + return &IdleThread; + } + } + else if (IdleThread.state != 0) { + OSCancelThread(&IdleThread); + } + return NULL; +} diff --git a/src/dolphin/os/OSTime.c b/src/dolphin/os/OSTime.c new file mode 100644 index 00000000..604e45c6 --- /dev/null +++ b/src/dolphin/os/OSTime.c @@ -0,0 +1,146 @@ +#include + +#define OS_TIME_MONTH_MAX 12 +#define OS_TIME_WEEK_DAY_MAX 7 +#define OS_TIME_YEAR_DAY_MAX 365 + +// End of each month in standard year +static s32 YearDays[OS_TIME_MONTH_MAX] = { 0, 31, 59, 90, 120, 151, 181, 212, 243, 273, 304, 334 }; +// End of each month in leap year +static s32 LeapYearDays[OS_TIME_MONTH_MAX] = { 0, 31, 60, 91, 121, 152, 182, 213, 244, 274, 305, 335 }; + +asm OSTime OSGetTime(void) +{ + // clang-format off + nofralloc +@0 + mftbu r3 + mftb r4 + + // Check for possible carry from TBL to TBU + mftbu r5 + cmpw r3, r5 + bne @0 + + blr + // clang-format on +} + +asm OSTick OSGetTick(void) { + // clang-format off + nofralloc + + mftb r3 + blr + // clang-format on +} + +#define OS_SYSTEMTIME_BASE 0x30D8 + +OSTime __OSGetSystemTime(void) +{ + BOOL enabled; + OSTime *timeAdjustAddr = (OSTime *)(OS_BASE_CACHED + OS_SYSTEMTIME_BASE); + OSTime result; + + enabled = OSDisableInterrupts(); + result = *timeAdjustAddr + OSGetTime(); + OSRestoreInterrupts(enabled); + + return result; +} + +OSTime __OSTimeToSystemTime(OSTime time) +{ + BOOL enabled; + OSTime *timeAdjustAddr = (OSTime *)(OS_BASE_CACHED + OS_SYSTEMTIME_BASE); + OSTime result; + + enabled = OSDisableInterrupts(); + result = *timeAdjustAddr + time; + OSRestoreInterrupts(enabled); + + return result; +} + +static BOOL IsLeapYear(s32 year) +{ + return (year % 4 == 0 && year % 100 != 0) || (year % 400 == 0); +} + +static s32 GetYearDays(s32 year, s32 mon) +{ + return (IsLeapYear(year) ? LeapYearDays : YearDays)[mon]; +} + +static s32 GetLeapDays(s32 year) +{ + if (year < 1) { + return 0; + } + return (year + 3) / 4 - (year - 1) / 100 + (year - 1) / 400; +} + +static void GetDates(s32 days, OSCalendarTime *cal) +{ + s32 year; + s32 totalDays; + s32 *p_days; + s32 month; + cal->wday = (days + 6) % OS_TIME_WEEK_DAY_MAX; + + for (year = days / OS_TIME_YEAR_DAY_MAX; days < (totalDays = year * OS_TIME_YEAR_DAY_MAX + GetLeapDays(year));) { + year--; + } + + days -= totalDays; + cal->year = year; + cal->yday = days; + + p_days = IsLeapYear(year) ? LeapYearDays : YearDays; + month = OS_TIME_MONTH_MAX; + while (days < p_days[--month]) { + ; + } + cal->mon = month; + cal->mday = days - p_days[month] + 1; +} + +#define BIAS (2000 * 365 + (2000 + 3) / 4 - (2000 - 1) / 100 + (2000 - 1) / 400) + +#pragma push +#pragma dont_inline on +void OSTicksToCalendarTime(OSTime ticks, OSCalendarTime *td) +{ + int days; + int secs; + OSTime d; + + d = ticks % OSSecondsToTicks(1); + if (d < 0) { + d += OSSecondsToTicks(1); + } + td->usec = (int)(OSTicksToMicroseconds(d) % 1000); + td->msec = (int)(OSTicksToMilliseconds(d) % 1000); + + ticks -= d; + days = (int)(OSTicksToSeconds(ticks) / 86400 + BIAS); + secs = (int)(OSTicksToSeconds(ticks) % 86400); + if (secs < 0) { + days -= 1; + secs += 24 * 60 * 60; + } + + GetDates(days, td); + + td->hour = secs / 60 / 60; + td->min = (secs / 60) % 60; + td->sec = secs % 60; +} +#pragma dont_inline reset + +OSTime OSCalendarTimeToTicks(OSCalendarTime *time) +{ + ; + ; +} diff --git a/src/dolphin/os/__ppc_eabi_init.c b/src/dolphin/os/__ppc_eabi_init.c new file mode 100644 index 00000000..4b7c8c6e --- /dev/null +++ b/src/dolphin/os/__ppc_eabi_init.c @@ -0,0 +1,76 @@ +#include +#include + +#ifdef __cplusplus +extern "C" { +#endif +void __OSPSInit(); +void __OSCacheInit(); + +asm void __init_hardware(void) +{ + // clang-format off + nofralloc + mfmsr r0 + ori r0, r0, 0x2000 + mtmsr r0 + + mflr r31 + bl __OSPSInit + bl __OSCacheInit + mtlr r31 + blr + // clang-format on +} + +asm void __flush_cache(register void *address, register unsigned int size) +{ + // clang-format off + nofralloc + lis r5, ~0 + ori r5, r5, ~14 + and r5, r5, r3 + subf r3, r5, r3 + add r4, r4, r3 + +loop: + dcbst r0, r5 + sync + icbi r0, r5 + addic r5, r5, 8 + subic. r4, r4, 8 + bge loop + isync + blr + // clang-format on +} + +void __init_user() +{ + __init_cpp(); +} + +typedef void (*voidfunctionptr)(void); // pointer to function returning void +__declspec(section ".init") extern voidfunctionptr _ctors[]; +__declspec(section ".init") extern voidfunctionptr _dtors[]; + +void __init_cpp(void) +{ + voidfunctionptr *constructor; + + /* + * call static initializers + */ + for (constructor = _ctors; *constructor; constructor++) { + (*constructor)(); + } +} + +void _ExitProcess(void) +{ + PPCHalt(); +} + +#ifdef __cplusplus +} +#endif diff --git a/src/dolphin/os/__start.c b/src/dolphin/os/__start.c new file mode 100644 index 00000000..475b3b4c --- /dev/null +++ b/src/dolphin/os/__start.c @@ -0,0 +1,161 @@ +#include +#include "__ppc_eabi_linker.h" + +void __check_pad3(void) { + if ((Pad3Button & 0x0eef) == 0x0eef) { + OSResetSystem(OS_RESET_RESTART, 0, FALSE); + } + return; +} + +__declspec(weak) asm void __start(void) { + // clang-format off + nofralloc + bl __init_registers + bl __init_hardware + li r0, -1 + stwu r1, -8(r1) + stw r0, 4(r1) + stw r0, 0(r1) + bl __init_data + li r0, 0 + lis r6, EXCEPTIONMASK_ADDR@ha + addi r6, r6, EXCEPTIONMASK_ADDR@l + stw r0, 0(r6) + lis r6, BOOTINFO2_ADDR@ha + addi r6, r6, BOOTINFO2_ADDR@l + lwz r6, 0(r6) + +_check_TRK: + cmplwi r6, 0 + beq _load_lomem_debug_flag + lwz r7, OS_BI2_DEBUGFLAG_OFFSET(r6) + b _check_debug_flag + +_load_lomem_debug_flag: + lis r5, ARENAHI_ADDR@ha + addi r5, r5, ARENAHI_ADDR@l + lwz r5, 0(r5) + cmplwi r5, 0 + beq _goto_main + lis r7, DEBUGFLAG_ADDR@ha + addi r7, r7, DEBUGFLAG_ADDR@l + lwz r7, 0(r7) + +_check_debug_flag: + li r5, 0 + cmplwi r7, 2 + beq _goto_inittrk + cmplwi r7, 3 + bne _goto_main + li r5, 1 + +_goto_inittrk: + lis r6, InitMetroTRK@ha + addi r6, r6, InitMetroTRK@l + mtlr r6 + blrl + +_goto_main: + lis r6, BOOTINFO2_ADDR@ha + addi r6, r6, BOOTINFO2_ADDR@l + lwz r5, 0(r6) + cmplwi r5, 0 + beq+ _no_args + lwz r6, 8(r5) + cmplwi r6, 0 + beq+ _no_args + add r6, r5, r6 + lwz r14, 0(r6) + cmplwi r14, 0 + beq _no_args + addi r15, r6, 4 + mtctr r14 + +_loop: + addi r6, r6, 4 + lwz r7, 0(r6) + add r7, r7, r5 + stw r7, 0(r6) + bdnz _loop + lis r5, ARENAHI_ADDR@ha + addi r5, r5, ARENAHI_ADDR@l + rlwinm r7, r15, 0, 0, 0x1a + stw r7, 0(r5) + b _end_of_parseargs + +_no_args: + li r14, 0 + li r15, 0 + +_end_of_parseargs: + bl DBInit + bl OSInit + lis r4, DVD_DEVICECODE_ADDR@ha + addi r4, r4, DVD_DEVICECODE_ADDR@l + lhz r3, 0(r4) + andi. r5, r3, 0x8000 + beq _check_pad3 + andi. r3, r3, 0x7fff + cmplwi r3, 1 + bne _goto_skip_init_bba + +_check_pad3: + bl __check_pad3 + +_goto_skip_init_bba: + bl __init_user + mr r3, r14 + mr r4, r15 + bl main + b exit + // clang-format on +} + +asm static void __init_registers(void) { + // clang-format off + nofralloc + lis r1, _stack_addr@h + ori r1, r1, _stack_addr@l + lis r2, _SDA2_BASE_@h + ori r2, r2, _SDA2_BASE_@l + lis r13, _SDA_BASE_@h + ori r13, r13, _SDA_BASE_@l + blr + // clang-format on +} + +inline static void __copy_rom_section(void* dst, const void* src, unsigned long size) { + if (size && (dst != src)) { + memcpy(dst, src, size); + __flush_cache(dst, size); + } +} + +inline static void __init_bss_section(void* dst, unsigned long size) { + if (size) { + memset(dst, 0, size); + } +} + +#pragma scheduling off +void __init_data(void) { + __rom_copy_info* dci; + __bss_init_info* bii; + + dci = _rom_copy_info; + while (TRUE) { + if (dci->size == 0) + break; + __copy_rom_section(dci->addr, dci->rom, dci->size); + dci++; + } + + bii = _bss_init_info; + while (TRUE) { + if (bii->size == 0) + break; + __init_bss_section(bii->addr, bii->size); + bii++; + } +} From f6b979ac3c57dcc788f57ce20a563bd06717f893 Mon Sep 17 00:00:00 2001 From: dbalatoni13 Date: Tue, 12 Nov 2024 19:29:11 +0100 Subject: [PATCH 27/29] Matched dolphin/OSAlloc.c --- configure.py | 2 +- src/dolphin/os/OSAlloc.c | 4 +++- 2 files changed, 4 insertions(+), 2 deletions(-) diff --git a/configure.py b/configure.py index 52215c30..f0e1d479 100644 --- a/configure.py +++ b/configure.py @@ -460,7 +460,7 @@ config.libs = [ [ Object(Matching, "dolphin/os/OS.c"), Object(Matching, "dolphin/os/OSAlarm.c"), - Object(NonMatching, "dolphin/os/OSAlloc.c"), + Object(Matching, "dolphin/os/OSAlloc.c"), Object(Matching, "dolphin/os/OSArena.c"), Object(Matching, "dolphin/os/OSAudioSystem.c"), Object(Matching, "dolphin/os/OSCache.c"), diff --git a/src/dolphin/os/OSAlloc.c b/src/dolphin/os/OSAlloc.c index fe0c34ae..32515afd 100644 --- a/src/dolphin/os/OSAlloc.c +++ b/src/dolphin/os/OSAlloc.c @@ -461,7 +461,9 @@ long OSCheckHeap(int heap) ASSERTREPORT(0x39A, cell->next == NULL || cell->next->prev == cell); ASSERTREPORT(0x39B, MINOBJSIZE <= cell->size); ASSERTREPORT(0x39C, OFFSET(cell->size, ALIGNMENT) == 0); - ASSERTREPORT(0x39D, cell->next == NULL || (char *)cell + cell->size < (char *)cell->next); + /* clang-format off*/ + ASSERTREPORT(0x39D, cell->next == NULL || (char*) cell + cell->size < (char*) cell->next); + /* clang-format on*/ total += cell->size; free = (cell->size + free); free -= HEADERSIZE; From bedf7ba7b5b1c503bbdc0b3e7850301daee69aca Mon Sep 17 00:00:00 2001 From: dbalatoni13 Date: Tue, 12 Nov 2024 21:41:34 +0100 Subject: [PATCH 28/29] Imported odemuexi2, amcstubs and odenotstub --- configure.py | 8 +- src/OdemuExi2/DebuggerDriver.c | 327 +++++++++++++++++++++++++++++++++ src/amcstubs/AmcExi2Stubs.c | 40 ++++ src/odenotstub/odenotstub.c | 7 + 4 files changed, 378 insertions(+), 4 deletions(-) create mode 100644 src/OdemuExi2/DebuggerDriver.c create mode 100644 src/amcstubs/AmcExi2Stubs.c create mode 100644 src/odenotstub/odenotstub.c diff --git a/configure.py b/configure.py index f0e1d479..f54e93c4 100644 --- a/configure.py +++ b/configure.py @@ -760,11 +760,11 @@ config.libs = [ ), { "lib": "OdemuExi2", - "mw_version": config.linker_version, + "mw_version": "GC/1.2.5", "cflags": cflags_odemuexi, "host": False, "objects": [ - Object(NonMatching, "OdemuExi2/DebuggerDriver.c"), + Object(Matching, "OdemuExi2/DebuggerDriver.c"), ], }, { @@ -773,7 +773,7 @@ config.libs = [ "cflags": cflags_amcstub, "host": False, "objects": [ - Object(NonMatching, "amcstubs/AmcExi2Stubs.c"), + Object(Matching, "amcstubs/AmcExi2Stubs.c"), ], }, { @@ -782,7 +782,7 @@ config.libs = [ "cflags": cflags_odenotstub, "host": False, "objects": [ - Object(NonMatching, "odenotstub/odenotstub.c"), + Object(Matching, "odenotstub/odenotstub.c"), ], }, { diff --git a/src/OdemuExi2/DebuggerDriver.c b/src/OdemuExi2/DebuggerDriver.c new file mode 100644 index 00000000..3a56495b --- /dev/null +++ b/src/OdemuExi2/DebuggerDriver.c @@ -0,0 +1,327 @@ +#include +#include +#include + + +typedef void (*MTRCallbackType)(int); + +static MTRCallbackType MTRCallback; + +static void (*DBGCallback)(u32, OSContext *); + +static u32 SendMailData; + +static s32 RecvDataLeng; + +static u8 *pEXIInputFlag; + +static u8 EXIInputFlag; + +static u8 SendCount = 0x80; + +#define IS_TRUE(x) ((x) != FALSE) +#define IS_FALSE(x) !IS_TRUE(x) +#define ROUND_UP(x, align) (((x) + (align)-1) & (-(align))) + +// TODO this matches, but there are probably no inline flags used, so the order of functions would be different that way + +void DBGEXIInit() +{ + __OSMaskInterrupts(0x18000); + __EXIRegs[10] = 0; +} + +static u32 DBGEXISelect(u32 v) +{ + u32 regs = __EXIRegs[10]; + regs &= 0x405; + regs |= 0x80 | (v << 4); + __EXIRegs[10] = regs; + return TRUE; +} + +BOOL DBGEXIDeselect(void) +{ + __EXIRegs[10] &= 0x405; + return TRUE; +} + +static BOOL DBGEXISync() +{ + while (__EXIRegs[13] & 1) + ; + + return TRUE; +} + +static BOOL DBGEXIImm(void *buffer, s32 bytecounter, u32 write) +{ + u8 *tempPointer; + u32 writeOutValue; + int i; + + if (write) { + tempPointer = buffer; + writeOutValue = 0; + for (i = 0; i < bytecounter; i++) { + u8 *temp = ((u8 *)buffer) + i; + writeOutValue |= *temp << ((3 - i) << 3); + } + __EXIRegs[14] = writeOutValue; + } + + __EXIRegs[13] = 1 | write << 2 | (bytecounter - 1) << 4; + DBGEXISync(); + + if (!write) { + writeOutValue = __EXIRegs[14]; + tempPointer = buffer; + for (i = 0; i < bytecounter; i++) { + *tempPointer++ = writeOutValue >> ((3 - i) << 3); + } + } + + return TRUE; +} + +static BOOL DBGWriteMailbox(u32 p1) +{ + u32 cmd = 0xc0000000; + u32 v; + u32 base = p1; + BOOL total = FALSE; + + DBGEXISelect(4); + v = (base & 0x1fffffff) | (cmd); + total |= IS_FALSE(DBGEXIImm(&v, sizeof(v), 1)); + total |= IS_FALSE(DBGEXISync()); + total |= IS_FALSE(DBGEXIDeselect()); + + return IS_FALSE(total); +} + +#pragma dont_inline on + +static BOOL DBGReadMailbox(u32 *p1) +{ + BOOL total = FALSE; + u32 v; + + DBGEXISelect(4); + + v = 0x60000000; + total |= IS_FALSE(DBGEXIImm(&v, 2, 1)); + total |= IS_FALSE(DBGEXISync()); + + total |= IS_FALSE(DBGEXIImm(p1, 4, 0)); + total |= IS_FALSE(DBGEXISync()); + + total |= IS_FALSE(DBGEXIDeselect()); + + return IS_FALSE(total); +} +#pragma dont_inline off + +static BOOL DBGRead(u32 count, u32 *buffer, s32 param3) +{ + BOOL total = FALSE; + u32 *buf_p = (u32 *)buffer; + u32 v1; + u32 v; + + DBGEXISelect(4); + + v1 = (count & 0x1fffc) << 8 | 0x20000000; + total |= IS_FALSE(DBGEXIImm(&v1, sizeof(v1), 1)); + total |= IS_FALSE(DBGEXISync()); + + while (param3) { + total |= IS_FALSE(DBGEXIImm(&v, sizeof(v), 0)); + total |= IS_FALSE(DBGEXISync()); + + *buf_p++ = v; + + param3 -= 4; + if (param3 < 0) { + param3 = 0; + } + } + + total |= IS_FALSE(DBGEXIDeselect()); + return IS_FALSE(total); +} + +static BOOL DBGWrite(u32 count, void *buffer, s32 param3) +{ + BOOL total = FALSE; + u32 *buf_p = (u32 *)buffer; + u32 v1; + u32 v; + + DBGEXISelect(4); + + v1 = (count & 0x1fffc) << 8 | 0xa0000000; + total |= IS_FALSE(DBGEXIImm(&v1, sizeof(v1), 1)); + total |= IS_FALSE(DBGEXISync()); + + while (param3 != 0) { + v = *buf_p++; + + total |= IS_FALSE(DBGEXIImm(&v, sizeof(v), 1)); + total |= IS_FALSE(DBGEXISync()); + + param3 -= 4; + if (param3 < 0) { + param3 = 0; + } + } + + total |= IS_FALSE(DBGEXIDeselect()); + return IS_FALSE(total); +} + +static BOOL _DBGReadStatus(u32 *p1) +{ + BOOL total = FALSE; + u32 v; + + DBGEXISelect(4); + + v = 1 << 30; + total |= IS_FALSE(DBGEXIImm(&v, 2, 1)); + total |= IS_FALSE(DBGEXISync()); + + total |= IS_FALSE(DBGEXIImm(p1, 4, 0)); + total |= IS_FALSE(DBGEXISync()); + + total |= IS_FALSE(DBGEXIDeselect()); + + return IS_FALSE(total); +} + +static BOOL DBGReadStatus(u32 *p1) +{ + return _DBGReadStatus(p1); +} + +static void MWCallback(u32 a, OSContext *b) +{ + EXIInputFlag = TRUE; + if (MTRCallback) { + MTRCallback(0); + } +} + +static void DBGHandler(s16 a, OSContext *b) +{ + *__PIRegs = 0x1000; + if (DBGCallback) { + DBGCallback(a, b); + } +} + +void DBInitComm(u8 **a, MTRCallbackType b) +{ + BOOL interrupts = OSDisableInterrupts(); + { + pEXIInputFlag = (u8 *)EXIInputFlag; + pEXIInputFlag = &EXIInputFlag; + + *a = pEXIInputFlag; + + MTRCallback = b; + + DBGEXIInit(); + } + OSRestoreInterrupts(interrupts); +} + +void DBInitInterrupts(void) +{ + __OSMaskInterrupts(0x18000); + __OSMaskInterrupts(0x40); + DBGCallback = &MWCallback; + __OSSetInterruptHandler(0x19, DBGHandler); + __OSUnmaskInterrupts(0x40); +} + +static void CheckMailBox(void) +{ + u32 v; + DBGReadStatus(&v); + if (v & 1) { + DBGReadMailbox(&v); + v &= 0x1fffffff; + + if ((v & 0x1f000000) == 0x1f000000) { + SendMailData = v; + RecvDataLeng = v & 0x7fff; + EXIInputFlag = 1; + } + } +} + +u32 DBQueryData(void) +{ + BOOL interrupts; + EXIInputFlag = 0; + if (!RecvDataLeng) { + interrupts = OSDisableInterrupts(); + CheckMailBox(); + } + OSRestoreInterrupts(interrupts); + return RecvDataLeng; +} + +BOOL DBRead(u32 *buffer, s32 count) +{ + u32 interrupts = OSDisableInterrupts(); + u32 v = SendMailData & 0x10000 ? 0x1000 : 0; + + DBGRead(v + 0x1e000, buffer, ROUND_UP(count, 4)); + + RecvDataLeng = 0; + EXIInputFlag = 0; + + OSRestoreInterrupts(interrupts); + + return 0; +} + +BOOL DBWrite(void *src, u32 size) +{ + u32 v; + u32 busyFlag; + BOOL interrupts = OSDisableInterrupts(); + + do { + _DBGReadStatus(&busyFlag); + } while (busyFlag & 2); + + SendCount++; + v = ((SendCount & 1) ? 0x1000 : 0); + + while (!DBGWrite(v | 0x1c000, src, ROUND_UP(size, 4))) + ; + + do { + _DBGReadStatus(&busyFlag); + } while (busyFlag & 2); + + v = SendCount; + while (!DBGWriteMailbox((0x1f000000) | v << 0x10 | size)) + ; + + do { + while (!_DBGReadStatus(&busyFlag)) + ; + } while (busyFlag & 2); + + OSRestoreInterrupts(interrupts); + + return 0; +} + +void DBOpen(void) { } + +void DBClose(void) { } diff --git a/src/amcstubs/AmcExi2Stubs.c b/src/amcstubs/AmcExi2Stubs.c new file mode 100644 index 00000000..f3aa9d3f --- /dev/null +++ b/src/amcstubs/AmcExi2Stubs.c @@ -0,0 +1,40 @@ +#include + +// EXI error codes +typedef enum { AMC_EXI_NO_ERROR = 0, AMC_EXI_UNSELECTED } AmcExiError; + +int AMC_IsStub(); +void EXI2_Unreserve(); +void EXI2_Reserve(); +AmcExiError EXI2_WriteN(); +AmcExiError EXI2_ReadN(); +int EXI2_Poll(); +void EXI2_EnableInterrupts(); +void EXI2_Init(); + +int AMC_IsStub() +{ + return 1; +} + +void EXI2_Unreserve() { } + +void EXI2_Reserve() { } + +AmcExiError EXI2_WriteN() +{ + return AMC_EXI_NO_ERROR; +} + +AmcExiError EXI2_ReadN() +{ + return AMC_EXI_NO_ERROR; +} + +int EXI2_Poll() +{ + return 0; +} + +void EXI2_EnableInterrupts() { } +void EXI2_Init() { } diff --git a/src/odenotstub/odenotstub.c b/src/odenotstub/odenotstub.c new file mode 100644 index 00000000..2aeb1140 --- /dev/null +++ b/src/odenotstub/odenotstub.c @@ -0,0 +1,7 @@ +#include + +int Hu_IsStub(); + +int Hu_IsStub() { + return 0; +} From f84b74b7ff8606a7c87f019a68bc0f32d385ac4c Mon Sep 17 00:00:00 2001 From: dbalatoni13 Date: Tue, 12 Nov 2024 22:38:27 +0100 Subject: [PATCH 29/29] Set DebuggerDriver.c to unmatching as we still have to figure out the inling issue --- configure.py | 4 ++-- src/OdemuExi2/DebuggerDriver.c | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/configure.py b/configure.py index f54e93c4..f8a43598 100644 --- a/configure.py +++ b/configure.py @@ -242,7 +242,7 @@ cflags_trk = [ cflags_odemuexi = [ *cflags_base, - "-inline auto,deferred", + # TODO figure out flags ] cflags_amcstub = [ @@ -764,7 +764,7 @@ config.libs = [ "cflags": cflags_odemuexi, "host": False, "objects": [ - Object(Matching, "OdemuExi2/DebuggerDriver.c"), + Object(NonMatching, "OdemuExi2/DebuggerDriver.c"), ], }, { diff --git a/src/OdemuExi2/DebuggerDriver.c b/src/OdemuExi2/DebuggerDriver.c index 3a56495b..e9be8b4e 100644 --- a/src/OdemuExi2/DebuggerDriver.c +++ b/src/OdemuExi2/DebuggerDriver.c @@ -23,7 +23,7 @@ static u8 SendCount = 0x80; #define IS_FALSE(x) !IS_TRUE(x) #define ROUND_UP(x, align) (((x) + (align)-1) & (-(align))) -// TODO this matches, but there are probably no inline flags used, so the order of functions would be different that way +// TODO void DBGEXIInit() {