From 647c08e1e69d0243528b75c56c32310d8c3cd095 Mon Sep 17 00:00:00 2001 From: negative Date: Sun, 7 Jan 2024 21:59:25 +0800 Subject: [PATCH] Add support for misc rom area --- src/ines.cpp | 18 +++++++++++++++++- src/ines.h | 2 ++ 2 files changed, 19 insertions(+), 1 deletion(-) diff --git a/src/ines.cpp b/src/ines.cpp index a09189de..47329738 100644 --- a/src/ines.cpp +++ b/src/ines.cpp @@ -49,6 +49,7 @@ extern SFORMAT FCEUVSUNI_STATEINFO[]; uint8 *trainerpoo = NULL; uint8 *ROM = NULL; uint8 *VROM = NULL; +uint8 *MiscROM = NULL; uint8 *ExtraNTARAM = NULL; iNES_HEADER head; @@ -58,6 +59,7 @@ uint8 Mirroring = 0; uint8 MirroringAs2bits = 0; uint32 ROM_size = 0; uint32 VROM_size = 0; +uint32 MiscROM_size = 0; char LoadedRomFName[4096]; //mbg merge 7/17/06 added char LoadedRomFNamePatchToUse[4096]; @@ -806,10 +808,13 @@ int iNESLoad(const char *name, FCEUFILE *fp, int OverwriteVidMode) { struct md5_context md5; uint64 partialmd5 = 0; const char* mappername = "Not Listed"; + size_t filesize = FCEU_fgetsize(fp); if (FCEU_fread(&head, 1, 16, fp) != 16 || memcmp(&head, "NES\x1A", 4)) return LOADER_INVALID_FORMAT; - + // Remove header size from filesize + filesize -= 16; + head.cleanup(); iNESCart.clear(); @@ -946,6 +951,7 @@ int iNESLoad(const char *name, FCEUFILE *fp, int OverwriteVidMode) { if (head.ROM_type & 4) { /* Trainer */ trainerpoo = (uint8*)FCEU_gmalloc(512); FCEU_fread(trainerpoo, 512, 1, fp); + filesize -= 512; } ResetCartMapping(); @@ -957,6 +963,15 @@ int iNESLoad(const char *name, FCEUFILE *fp, int OverwriteVidMode) { if (vrom_size_bytes) FCEU_fread(VROM, 1, vrom_size_bytes, fp); + + // Misc ROMS + if ((head.misc_roms & 0x03) && !(head.ROM_type & 4)) { + MiscROM_size = filesize - rom_size_bytes - vrom_size_bytes; + MiscROM = (uint8 *)FCEU_malloc(MiscROM_size); + memset(MiscROM, 0xFF, MiscROM_size); + FCEU_fread(MiscROM, 1, MiscROM_size, fp); + FCEU_printf(" Misc ROM size : %d\n", MiscROM_size); + } md5_starts(&md5); md5_update(&md5, ROM, rom_size_bytes); @@ -1008,6 +1023,7 @@ int iNESLoad(const char *name, FCEUFILE *fp, int OverwriteVidMode) { FCEU_printf(" WRAM backed by battery: %d KiB\n", iNESCart.battery_wram_size / 1024); FCEU_printf(" VRAM backed by battery: %d KiB\n", iNESCart.battery_vram_size / 1024); } + if (head.misc_roms & 0x03) FCEU_printf(" Misc ROM: %d KiB\n", MiscROM_size / 1024); } SetInput(); diff --git a/src/ines.h b/src/ines.h index 6c95863a..7d738bd3 100644 --- a/src/ines.h +++ b/src/ines.h @@ -42,8 +42,10 @@ public: //mbg merge 6/29/06 extern uint8 *ROM; extern uint8 *VROM; +extern uint8 *MiscROM; extern uint32 VROM_size; extern uint32 ROM_size; +extern uint32 MiscROM_size; extern uint8 *ExtraNTARAM; extern uint8 **VPageR; extern int iNesSave(void); //bbit Edited: line added