From ef090a2b8fbc3ebda55ea0f0441a7c05a5fa2411 Mon Sep 17 00:00:00 2001 From: fgsfds Date: Mon, 25 Sep 2023 00:30:02 +0200 Subject: [PATCH] port: properly get size from external files --- port/src/romdata.c | 50 ++++++++++++++++++++++++---------------------- 1 file changed, 26 insertions(+), 24 deletions(-) diff --git a/port/src/romdata.c b/port/src/romdata.c index 10367d36f..b7f420f64 100644 --- a/port/src/romdata.c +++ b/port/src/romdata.c @@ -55,6 +55,12 @@ static u8 *romDataSeg; static u32 romDataSegSize; static const char *romName = ROMDATA_ROM_NAME; +enum loadsource { + SRC_UNLOADED = 0, + SRC_ROM, + SRC_EXTERNAL +}; + struct romfile { u8 **segstart; u8 **segend; @@ -62,7 +68,7 @@ struct romfile { u8 *data; u32 size; preprocessfunc preprocess; - s32 external; + s32 source; // enum loadsource s32 preprocessed; }; @@ -225,13 +231,14 @@ static inline void romdataInitSegment(struct romfile *seg) // no external data, just make it point to the rom if (g_RomFile) { newData = g_RomFile + (uintptr_t)seg->data; + seg->source = SRC_ROM; sysLogPrintf(LOG_NOTE, "loading segment %s from ROM (offset %08x pointer %p)", seg->name, (u32)seg->data, newData); } else { sysFatalError("No ROM or external file for segment:\n%s", seg->name); } } else { // loaded external data - seg->external = 1; + seg->source = SRC_EXTERNAL; sysLogPrintf(LOG_NOTE, "loading segment %s from file (pointer %p)", seg->name, newData); } @@ -298,7 +305,7 @@ static inline void romdataInitFiles(void) const u32 ofs = PD_BE32(offsets[i]); fileSlots[i].data = g_RomFile + ofs; fileSlots[i].size = nextofs - ofs; - fileSlots[i].external = 0; + fileSlots[i].source = SRC_UNLOADED; fileSlots[i].preprocessed = 0; } } @@ -348,24 +355,19 @@ s32 romdataFileGetSize(s32 fileNum) sysLogPrintf(LOG_ERROR, "romdataFileGetSize: invalid file num %d", fileNum); return -1; } - if (!fileSlots[fileNum].data) { - sysLogPrintf(LOG_ERROR, "romdataFileGetSize: file %d is not loaded", fileNum); - return -1; + + // ensure any external files are loaded and we use their size + if (romdataFileLoad(fileNum, NULL)) { + return fileSlots[fileNum].size; } - return fileSlots[fileNum].size; + + sysLogPrintf(LOG_ERROR, "romdataFileGetSize: could not load file num %d", fileNum); + return -1; } u8 *romdataFileGetData(s32 fileNum) { - if (fileNum < 1 || fileNum >= ROMDATA_MAX_FILES) { - sysLogPrintf(LOG_ERROR, "romdataFileGetData: invalid file num %d", fileNum); - return NULL; - } - if (!fileSlots[fileNum].data) { - sysLogPrintf(LOG_NOTE, "romdataFileGetData: file %d is not loaded, loading", fileNum); - return romdataFileLoad(fileNum, NULL); - } - return fileSlots[fileNum].data; + return romdataFileLoad(fileNum, NULL); } u8 *romdataFileLoad(s32 fileNum, u32 *outSize) @@ -378,7 +380,7 @@ u8 *romdataFileLoad(s32 fileNum, u32 *outSize) u8 *out = NULL; // try to load external file - if (!fileSlots[fileNum].external) { + if (fileSlots[fileNum].source == SRC_UNLOADED) { char tmp[FS_MAXPATH] = { 0 }; snprintf(tmp, sizeof(tmp), ROMDATA_FILEDIR "/%s", fileSlots[fileNum].name); if (fsFileSize(tmp) > 0) { @@ -388,9 +390,11 @@ u8 *romdataFileLoad(s32 fileNum, u32 *outSize) sysLogPrintf(LOG_NOTE, "file %d (%s) loaded externally", fileNum, fileSlots[fileNum].name); fileSlots[fileNum].data = out; fileSlots[fileNum].size = size; - fileSlots[fileNum].external = 1; + fileSlots[fileNum].source = SRC_EXTERNAL; } } + // tried and failed, fall back to ROM + fileSlots[fileNum].source = SRC_ROM; } if (!out) { @@ -426,14 +430,12 @@ void romdataFileFree(s32 fileNum) return; } - if (!fileSlots[fileNum].external) { - sysLogPrintf(LOG_ERROR, "fsFileFree: file %d not external", fileNum); - return; + if (fileSlots[fileNum].source == SRC_EXTERNAL) { + free(fileSlots[fileNum].data); + fileSlots[fileNum].data = NULL; } - free(fileSlots[fileNum].data); - fileSlots[fileNum].data = NULL; - fileSlots[fileNum].external = 0; + fileSlots[fileNum].source = SRC_UNLOADED; } u8 *romdataSegGetData(const char *segName)