Skip to content

Commit

Permalink
- Partially fix selecting an alternate executable from a 2-disc game.
Browse files Browse the repository at this point in the history
  • Loading branch information
Extrems committed Jan 31, 2024
1 parent d7b6b9e commit 401e47d
Show file tree
Hide file tree
Showing 3 changed files with 29 additions and 19 deletions.
4 changes: 2 additions & 2 deletions cube/swiss/include/gcm.h
Expand Up @@ -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;
Expand Down
28 changes: 19 additions & 9 deletions cube/swiss/source/gcm.c
Expand Up @@ -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++;
}
Expand All @@ -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++;
}
Expand Down Expand Up @@ -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++;
}
Expand All @@ -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++;
}
Expand All @@ -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++;
}
Expand Down Expand Up @@ -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");
Expand Down Expand Up @@ -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);
Expand All @@ -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);
Expand Down
16 changes: 8 additions & 8 deletions cube/swiss/source/swiss.c
Expand Up @@ -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;
Expand All @@ -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;
}
Expand Down

0 comments on commit 401e47d

Please sign in to comment.