From c831b27965d7fc33ce96040d5aa64718d8c440e4 Mon Sep 17 00:00:00 2001 From: gamemasterplc Date: Thu, 23 Nov 2023 23:54:10 -0600 Subject: [PATCH 1/4] Mostly match dvd.c --- config/GMPE01_00/symbols.txt | 10 +- configure.py | 2 +- src/game/dvd.c | 178 +++++++++++++++++++++++++++++++++++ 3 files changed, 184 insertions(+), 6 deletions(-) create mode 100644 src/game/dvd.c diff --git a/config/GMPE01_00/symbols.txt b/config/GMPE01_00/symbols.txt index d3235d0a..fc9b1b69 100644 --- a/config/GMPE01_00/symbols.txt +++ b/config/GMPE01_00/symbols.txt @@ -534,7 +534,7 @@ fn_8002FB40 = .text:0x8002FB40; // type:function size:0x2F8 fn_8002FE38 = .text:0x8002FE38; // type:function size:0xE0 fn_8002FF18 = .text:0x8002FF18; // type:function size:0x2C fn_8002FF44 = .text:0x8002FF44; // type:function size:0x8 -fn_8002FF4C = .text:0x8002FF4C; // type:function size:0x150 +OSPanic = .text:0x8002FF4C; // type:function size:0x150 fn_8003009C = .text:0x8003009C; // type:function size:0x118 fn_800301B4 = .text:0x800301B4; // type:function size:0x34 fn_800301E8 = .text:0x800301E8; // type:function size:0x98 @@ -2260,12 +2260,12 @@ fn_800BD7E0 = .text:0x800BD7E0; // type:function size:0x18 __DVDLowSetWAType = .text:0x800BD7F8; // type:function size:0x44 scope:global __DVDFSInit = .text:0x800BD83C; // type:function size:0x38 scope:global fn_800BD874 = .text:0x800BD874; // type:function size:0x2F4 -fn_800BDB68 = .text:0x800BDB68; // type:function size:0x74 -fn_800BDBDC = .text:0x800BDBDC; // type:function size:0xC8 -fn_800BDCA4 = .text:0x800BDCA4; // type:function size:0x24 +DVDFastOpen = .text:0x800BDB68; // type:function size:0x74 +DVDOpen = .text:0x800BDBDC; // type:function size:0xC8 +DVDClose = .text:0x800BDCA4; // type:function size:0x24 fn_800BDCC8 = .text:0x800BDCC8; // type:function size:0x160 fn_800BDE28 = .text:0x800BDE28; // type:function size:0xC4 -fn_800BDEEC = .text:0x800BDEEC; // type:function size:0xC0 +DVDReadAsyncPrio = .text:0x800BDEEC; // type:function size:0xC0 fn_800BDFAC = .text:0x800BDFAC; // type:function size:0x30 fn_800BDFDC = .text:0x800BDFDC; // type:function size:0x118 fn_800BE0F4 = .text:0x800BE0F4; // type:function size:0x24 diff --git a/configure.py b/configure.py index fb49a2ff..7d18c190 100755 --- a/configure.py +++ b/configure.py @@ -231,7 +231,7 @@ config.libs = [ "objects": [ Object(NonMatching, "game/main.c"), Object(NonMatching, "game/pad.c"), - Object(NonMatching, "game/dvd.c"), + Object(Matching, "game/dvd.c"), Object(NonMatching, "game/data.c"), Object(Matching, "game/decode.c"), Object(NonMatching, "game/font.c"), diff --git a/src/game/dvd.c b/src/game/dvd.c new file mode 100644 index 00000000..dfc4b976 --- /dev/null +++ b/src/game/dvd.c @@ -0,0 +1,178 @@ +#include "common.h" +#include "dolphin/dvd.h" +#include "dolphin/os.h" + +extern u32 DirDataSize; + +static DVDDiskID correctDiskID = { + { 'M', 'P', 'G', 'C' }, //gameName + { 'H', 'U' }, //company + 1, //diskNumber + 1, //gameVersion + 1, //streaming + 0, //streamingBufSize +}; + +void HuDvdErrorWatch(); + +static s32 beforeDvdStatus; +static int CallBackStatus; + +static void HuDVDReadAsyncCallBack() +{ + CallBackStatus = 1; +} + +static void *HuDvdDataReadWait(DVDFileInfo *file, int heap, int mode, int num, DVDCallback cb, BOOL skip_wait) +{ + u32 len; + void *buf; + if(mode != 0 && mode != 1 && mode != 2) { + OSReport("dvd.c: HuDvdDataReadWait Mode Error"); + } + len = file->length; + DirDataSize = len; + if(mode == 1) { + buf = HuMemDirectMallocNum(heap, OSRoundUp32B(len), num); + } else { + buf = HuMemDirectMalloc(heap, OSRoundUp32B(len)); + } + if(!buf) { + OSReport("dvd.c: Memory Allocation Error (Length %x) (mode %d)\n", len, mode); + OSReport("Rest Memory %x\n", HuMemHeapSizeGet(3)-HuMemUsedMallocSizeGet(3)); + OSPanic("dvd.c", 75, "\n"); + return NULL; + } + + DCInvalidateRange(buf, OSRoundUp32B(len)); + OSReport("Rest Memory %x\n", HuMemHeapSizeGet(3)-HuMemUsedMallocSizeGet(3)); + CallBackStatus = 0; + DVDReadAsync(file, buf, OSRoundUp32B(len), 0, cb); + if(!skip_wait) { + while(!CallBackStatus) { + HuDvdErrorWatch(); + } + HuDvdErrorWatch(); + } + + return buf; +} + +void *HuDvdDataRead(char *path) +{ + DVDFileInfo file; + void *data = NULL; + if(!DVDOpen(path, &file)) { + OSPanic("dvd.c", 146, "dvd.c: File Open Error"); + } else { + data = HuDvdDataReadWait(&file, 3, 0, 0, HuDVDReadAsyncCallBack, FALSE); + DVDClose(&file); + } + return data; +} + +void **HuDvdDataReadMulti(char **paths) +{ + DVDFileInfo file; + u32 count; + int i; + void **file_ptrs; + count = 0; + while(paths[count]) { + count++; + } + file_ptrs = HuMemDirectMalloc(0, count*4); + for(i=0; i Date: Fri, 24 Nov 2023 00:18:52 -0600 Subject: [PATCH 2/4] Decompile HuDVDReadAsyncCallBack --- include/common_structs.h | 13 +++++++++++++ src/game/dvd.c | 18 +++++++++++++++--- 2 files changed, 28 insertions(+), 3 deletions(-) diff --git a/include/common_structs.h b/include/common_structs.h index ab27ba9d..81bf2467 100644 --- a/include/common_structs.h +++ b/include/common_structs.h @@ -2,6 +2,7 @@ #define _COMMON_STRUCTS_H #include "types.h" +#include "dolphin/dvd.h" typedef struct UnkOvl { s32 unk0; @@ -62,4 +63,16 @@ typedef struct file_list_entry { s32 file_id; } FileListEntry; +typedef struct data_stat { + s32 dir_id; + void *dir; + void *data; + u32 raw_len; + u32 comp_type; + BOOL used; + s32 num; + u32 status; + DVDFileInfo file_info; +} DataStat; + #endif diff --git a/src/game/dvd.c b/src/game/dvd.c index dfc4b976..78f0e752 100644 --- a/src/game/dvd.c +++ b/src/game/dvd.c @@ -3,6 +3,7 @@ #include "dolphin/os.h" extern u32 DirDataSize; +extern void HuDataDirReadAsyncCallBack(s32 result, DVDFileInfo* fileInfo); static DVDDiskID correctDiskID = { { 'M', 'P', 'G', 'C' }, //gameName @@ -18,7 +19,7 @@ void HuDvdErrorWatch(); static s32 beforeDvdStatus; static int CallBackStatus; -static void HuDVDReadAsyncCallBack() +static void HuDVDReadAsyncCallBack(s32 result, DVDFileInfo* fileInfo) { CallBackStatus = 1; } @@ -125,9 +126,8 @@ void *HuDvdDataFastReadNum(s32 entrynum, s32 num) DVDFileInfo file; void *data = NULL; if(!DVDFastOpen(entrynum, &file)) { - OSPanic("dvd.c", 258, "dvd.c: File Open Error"); (void)num; - (void)data; + OSPanic("dvd.c", 258, "dvd.c: File Open Error"); } else { data = HuDvdDataReadWait(&file, 3, 1, num, HuDVDReadAsyncCallBack, FALSE); DVDClose(&file); @@ -135,6 +135,18 @@ void *HuDvdDataFastReadNum(s32 entrynum, s32 num) return data; } +void *HuDvdDataFastReadAsync(s32 entrynum, DataStat *stat) +{ + DVDFileInfo file; + void *data = NULL; + if(!DVDFastOpen(entrynum, &stat->file_info)) { + OSPanic("dvd.c", 274, "dvd.c: File Open Error"); + } else { + data = HuDvdDataReadWait(&stat->file_info, 3, 0, 0, HuDataDirReadAsyncCallBack, TRUE); + } + return data; +} + void HuDvdDataClose(void *ptr) { if(ptr) { From f1cecd920d927feae80bf476ad2ba5b35a591b0f Mon Sep 17 00:00:00 2001 From: gamemasterplc Date: Fri, 24 Nov 2023 00:20:07 -0600 Subject: [PATCH 3/4] Fix DirDataSize Scope --- config/GMPE01_00/symbols.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/config/GMPE01_00/symbols.txt b/config/GMPE01_00/symbols.txt index fc9b1b69..09b967f2 100644 --- a/config/GMPE01_00/symbols.txt +++ b/config/GMPE01_00/symbols.txt @@ -5942,7 +5942,7 @@ beforeDvdStatus = .sbss:0x801D3AE0; // type:object size:0x4 scope:local data:4by CallBackStatus = .sbss:0x801D3AE4; // type:object size:0x4 scope:local data:4byte shortAccessSleep = .sbss:0x801D3AE8; // type:object size:0x4 scope:local data:4byte DataDirMax = .sbss:0x801D3AEC; // type:object size:0x4 scope:local data:4byte -DirDataSize = .sbss:0x801D3AF0; // type:object size:0x8 scope:local data:4byte +DirDataSize = .sbss:0x801D3AF0; // type:object size:0x8 data:4byte lbl_801D3AF8 = .sbss:0x801D3AF8; // type:object size:0x4 data:4byte lbl_801D3AFC = .sbss:0x801D3AFC; // type:object size:0x4 data:4byte lbl_801D3B00 = .sbss:0x801D3B00; // type:object size:0x4 data:float From cb6805a852fc876d0967705e26fc9abc05331bd3 Mon Sep 17 00:00:00 2001 From: gamemasterplc Date: Fri, 24 Nov 2023 08:16:34 -0600 Subject: [PATCH 4/4] Match dvd.c --- src/game/dvd.c | 13 +++++++------ 1 file changed, 7 insertions(+), 6 deletions(-) diff --git a/src/game/dvd.c b/src/game/dvd.c index 78f0e752..d41390f6 100644 --- a/src/game/dvd.c +++ b/src/game/dvd.c @@ -16,8 +16,8 @@ static DVDDiskID correctDiskID = { void HuDvdErrorWatch(); -static s32 beforeDvdStatus; static int CallBackStatus; +static s32 beforeDvdStatus; static void HuDVDReadAsyncCallBack(s32 result, DVDFileInfo* fileInfo) { @@ -30,6 +30,8 @@ static void *HuDvdDataReadWait(DVDFileInfo *file, int heap, int mode, int num, D void *buf; if(mode != 0 && mode != 1 && mode != 2) { OSReport("dvd.c: HuDvdDataReadWait Mode Error"); + buf = NULL; + len = 0; } len = file->length; DirDataSize = len; @@ -75,8 +77,8 @@ void *HuDvdDataRead(char *path) void **HuDvdDataReadMulti(char **paths) { DVDFileInfo file; - u32 count; int i; + u32 count; void **file_ptrs; count = 0; while(paths[count]) { @@ -167,15 +169,15 @@ void HuDvdErrorWatch() while(1); break; - case 6: + case 5: OSReport("DVD ERROR:No disk\n"); break; - case 7: + case 6: OSReport("DVD ERROR:Cover open\n"); break; - case 8: + case 7: OSReport("DVD ERROR:Wrong disk\n"); break; @@ -184,7 +186,6 @@ void HuDvdErrorWatch() break; default: - break; } } \ No newline at end of file