From 401e47d89014b9af79c9b977853bd6829001fef3 Mon Sep 17 00:00:00 2001 From: Extrems Date: Wed, 31 Jan 2024 17:59:16 -0500 Subject: [PATCH] - Partially fix selecting an alternate executable from a 2-disc game. --- cube/swiss/include/gcm.h | 4 ++-- cube/swiss/source/gcm.c | 28 +++++++++++++++++++--------- cube/swiss/source/swiss.c | 16 ++++++++-------- 3 files changed, 29 insertions(+), 19 deletions(-) diff --git a/cube/swiss/include/gcm.h b/cube/swiss/include/gcm.h index e4ee441f..0364904b 100644 --- a/cube/swiss/include/gcm.h +++ b/cube/swiss/include/gcm.h @@ -99,8 +99,8 @@ struct ExecutableFile { u64 hash; char name[256]; u32 type; - u32 tgcFstOffset; - u32 tgcFstSize; + u32 fstOffset; + u32 fstSize; u32 tgcBase; u32 tgcFileStartArea; u32 tgcFakeOffset; diff --git a/cube/swiss/source/gcm.c b/cube/swiss/source/gcm.c index 468bbc5e..6f6a7f72 100644 --- a/cube/swiss/source/gcm.c +++ b/cube/swiss/source/gcm.c @@ -246,6 +246,8 @@ int parse_gcm(file_handle *file, file_handle *file2, ExecutableFile *filesToPatc filesToPatch[numFiles].size = 0x400000; filesToPatch[numFiles].hash = get_gcm_boot_hash(diskHeader, file->meta); filesToPatch[numFiles].type = PATCH_BIN; + filesToPatch[numFiles].fstOffset = diskHeader->FSTOffset; + filesToPatch[numFiles].fstSize = diskHeader->FSTSize; sprintf(filesToPatch[numFiles].name, "default.bin"); numFiles++; } @@ -263,6 +265,8 @@ int parse_gcm(file_handle *file, file_handle *file2, ExecutableFile *filesToPatc filesToPatch[numFiles].size = dolSize = DOLSize(&dolhdr); filesToPatch[numFiles].hash = get_gcm_boot_hash(diskHeader, file->meta); filesToPatch[numFiles].type = PATCH_DOL; + filesToPatch[numFiles].fstOffset = diskHeader->FSTOffset; + filesToPatch[numFiles].fstSize = diskHeader->FSTSize; sprintf(filesToPatch[numFiles].name, "default.dol"); numFiles++; } @@ -299,6 +303,8 @@ int parse_gcm(file_handle *file, file_handle *file2, ExecutableFile *filesToPatc filesToPatch[numFiles].offset = file_offset; filesToPatch[numFiles].size = size; filesToPatch[numFiles].type = PATCH_DOL; + filesToPatch[numFiles].fstOffset = diskHeader->FSTOffset; + filesToPatch[numFiles].fstSize = diskHeader->FSTSize; memcpy(&filesToPatch[numFiles].name,&filename[0],64); numFiles++; } @@ -307,6 +313,8 @@ int parse_gcm(file_handle *file, file_handle *file2, ExecutableFile *filesToPatc filesToPatch[numFiles].offset = file_offset; filesToPatch[numFiles].size = size; filesToPatch[numFiles].type = PATCH_DOL_PRS; + filesToPatch[numFiles].fstOffset = diskHeader->FSTOffset; + filesToPatch[numFiles].fstSize = diskHeader->FSTSize; memcpy(&filesToPatch[numFiles].name,&filename[0],64); numFiles++; } @@ -320,6 +328,8 @@ int parse_gcm(file_handle *file, file_handle *file2, ExecutableFile *filesToPatc filesToPatch[numFiles].offset = file_offset; filesToPatch[numFiles].size = size; filesToPatch[numFiles].type = PATCH_ELF; + filesToPatch[numFiles].fstOffset = diskHeader->FSTOffset; + filesToPatch[numFiles].fstSize = diskHeader->FSTSize; memcpy(&filesToPatch[numFiles].name,&filename[0],64); numFiles++; } @@ -409,9 +419,9 @@ int parse_tgc(file_handle *file, ExecutableFile *filesToPatch, u32 tgc_base, cha filesToPatch[numFiles].offset = tgc_base+tgcHeader.dolStart; filesToPatch[numFiles].size = tgcHeader.dolLength; filesToPatch[numFiles].type = PATCH_DOL; - filesToPatch[numFiles].tgcFstOffset = tgc_base+tgcHeader.fstStart; - filesToPatch[numFiles].tgcFstSize = tgcHeader.fstLength; - filesToPatch[numFiles].tgcBase = file->fileBase+tgc_base; + filesToPatch[numFiles].fstOffset = tgc_base+tgcHeader.fstStart; + filesToPatch[numFiles].fstSize = tgcHeader.fstLength; + filesToPatch[numFiles].tgcBase = tgc_base+file->fileBase; filesToPatch[numFiles].tgcFileStartArea = tgcHeader.userStart; filesToPatch[numFiles].tgcFakeOffset = tgcHeader.gcmUserStart; sprintf(filesToPatch[numFiles].name, "%s/%s", tgcname, "default.dol"); @@ -447,9 +457,9 @@ int parse_tgc(file_handle *file, ExecutableFile *filesToPatch, u32 tgc_base, cha filesToPatch[numFiles].offset = file_offset; filesToPatch[numFiles].size = size; filesToPatch[numFiles].type = PATCH_DOL; - filesToPatch[numFiles].tgcFstOffset = tgc_base+tgcHeader.fstStart; - filesToPatch[numFiles].tgcFstSize = tgcHeader.fstLength; - filesToPatch[numFiles].tgcBase = file->fileBase+tgc_base; + filesToPatch[numFiles].fstOffset = tgc_base+tgcHeader.fstStart; + filesToPatch[numFiles].fstSize = tgcHeader.fstLength; + filesToPatch[numFiles].tgcBase = tgc_base+file->fileBase; filesToPatch[numFiles].tgcFileStartArea = tgcHeader.userStart; filesToPatch[numFiles].tgcFakeOffset = tgcHeader.gcmUserStart; memcpy(&filesToPatch[numFiles].name,&filename[0],64); @@ -463,9 +473,9 @@ int parse_tgc(file_handle *file, ExecutableFile *filesToPatch, u32 tgc_base, cha filesToPatch[numFiles].offset = file_offset; filesToPatch[numFiles].size = size; filesToPatch[numFiles].type = PATCH_ELF; - filesToPatch[numFiles].tgcFstOffset = tgc_base+tgcHeader.fstStart; - filesToPatch[numFiles].tgcFstSize = tgcHeader.fstLength; - filesToPatch[numFiles].tgcBase = file->fileBase+tgc_base; + filesToPatch[numFiles].fstOffset = tgc_base+tgcHeader.fstStart; + filesToPatch[numFiles].fstSize = tgcHeader.fstLength; + filesToPatch[numFiles].tgcBase = tgc_base+file->fileBase; filesToPatch[numFiles].tgcFileStartArea = tgcHeader.userStart; filesToPatch[numFiles].tgcFakeOffset = tgcHeader.gcmUserStart; memcpy(&filesToPatch[numFiles].name,&filename[0],64); diff --git a/cube/swiss/source/swiss.c b/cube/swiss/source/swiss.c index 2d5cb4cb..508067f9 100644 --- a/cube/swiss/source/swiss.c +++ b/cube/swiss/source/swiss.c @@ -1013,11 +1013,11 @@ void load_app(ExecutableFile *fileToPatch) if(fileToPatch != NULL && fileToPatch->file != NULL) { // For a DOL from a TGC, redirect the FST to the TGC FST. - if(fileToPatch->tgcFstOffset != 0) { + if(fileToPatch->tgcBase + fileToPatch->tgcFileStartArea != 0) { // Read FST to top of Main Memory (round to 32 byte boundary) - u32 fstAddr = (topAddr-fileToPatch->tgcFstSize)&~31; - u32 fstSize = (fileToPatch->tgcFstSize+31)&~31; - devices[DEVICE_CUR]->seekFile(fileToPatch->file,fileToPatch->tgcFstOffset,DEVICE_HANDLER_SEEK_SET); + u32 fstAddr = (topAddr-fileToPatch->fstSize)&~31; + u32 fstSize = (fileToPatch->fstSize+31)&~31; + devices[DEVICE_CUR]->seekFile(fileToPatch->file,fileToPatch->fstOffset,DEVICE_HANDLER_SEEK_SET); if(devices[DEVICE_CUR]->readFile(fileToPatch->file,(void*)fstAddr,fstSize) != fstSize) { message = "Failed to read FST!"; goto fail_early; @@ -1035,16 +1035,16 @@ void load_app(ExecutableFile *fileToPatch) *(vu32*)(VAR_AREA+0x0024) = 1; *(vu32*)(VAR_AREA+0x0034) = fstAddr; // Arena Hi *(vu32*)(VAR_AREA+0x0038) = fstAddr; // FST Location in ram - *(vu32*)(VAR_AREA+0x003C) = fileToPatch->tgcFstSize; // FST Max Length + *(vu32*)(VAR_AREA+0x003C) = fileToPatch->fstSize; // FST Max Length *(vu32*)(VAR_AREA+0x00F4) = bi2Addr; // bi2.bin location *(vu32*)(VAR_AREA+0x30F4) = fileToPatch->tgcBase; } else { // Read FST to top of Main Memory (round to 32 byte boundary) u32 fstAddr = (topAddr-GCMDisk.MaxFSTSize)&~31; - u32 fstSize = (GCMDisk.FSTSize+31)&~31; - devices[DEVICE_CUR]->seekFile(&curFile,GCMDisk.FSTOffset,DEVICE_HANDLER_SEEK_SET); - if(devices[DEVICE_CUR]->readFile(&curFile,(void*)fstAddr,fstSize) != fstSize) { + u32 fstSize = (fileToPatch->fstSize+31)&~31; + devices[DEVICE_CUR]->seekFile(fileToPatch->file,fileToPatch->fstOffset,DEVICE_HANDLER_SEEK_SET); + if(devices[DEVICE_CUR]->readFile(fileToPatch->file,(void*)fstAddr,fstSize) != fstSize) { message = "Failed to read FST!"; goto fail_early; }