diff --git a/src/cart.h b/src/cart.h index 4573403..ed0f4e3 100644 --- a/src/cart.h +++ b/src/cart.h @@ -26,6 +26,9 @@ typedef struct { int CHRRamSize; /* chr ram size in bytes (volatile) */ int PRGRamSaveSize; /* prg ram size in bytes (non-volatile or battery backed) */ int CHRRamSaveSize; /* chr ram size in bytes (non-volatile or battery backed) */ + int miscROMSize; + int miscROMNumber; + uint64 totalFileSize; int region; /* video system timing (ntsc, pal, dendy */ uint8 MD5[16]; diff --git a/src/ines.c b/src/ines.c index 615e5ce..f3f18bc 100644 --- a/src/ines.c +++ b/src/ines.c @@ -54,7 +54,6 @@ CartInfo iNESCart = {0}; uint32 ROM_size = 0; uint32 VROM_size = 0; -uint32 MiscROM_size; static int CHRRAMSize = -1; @@ -109,6 +108,10 @@ static void iNESGI(int h) { free(ExtraNTARAM); ExtraNTARAM = NULL; } + if (MiscROM) { + free(MiscROM); + MiscROM = NULL; + } break; } } @@ -939,6 +942,11 @@ static void iNES_read_header_info(void) { if (head.PRGRAM_size & 0xF0) iNESCart.PRGRamSaveSize = 64 << ((head.PRGRAM_size >> 4) & 0x0F); if (head.CHRRAM_size & 0x0F) iNESCart.CHRRamSize = 64 << ((head.CHRRAM_size >> 0) & 0x0F); if (head.CHRRAM_size & 0xF0) iNESCart.CHRRamSaveSize = 64 << ((head.CHRRAM_size >> 4) & 0x0F); + iNESCart.PRGRomSize = ROM_size >=0xF00? (pow(2, head.ROM_size >>2)*((head.ROM_size &3)*2+1)): (ROM_size*0x4000); + iNESCart.CHRRomSize =VROM_size >=0xF00? (pow(2, head.VROM_size>>2)*((head.VROM_size&3)*2+1)): (VROM_size*0x2000);; + iNESCart.miscROMNumber =head.MiscRoms; + iNESCart.miscROMSize =iNESCart.miscROMNumber? (iNESCart.totalFileSize -16 -(head.ROM_type &4? 512: 0) -iNESCart.PRGRomSize -iNESCart.CHRRomSize): 0; + if (iNESCart.miscROMSize &0x8000000) iNESCart.miscROMSize =0; } } @@ -981,6 +989,7 @@ int iNESLoad(const char *name, FCEUFILE *fp) memset((char*)(&head) + 0xA, 0, 0x6); } + iNESCart.totalFileSize =filesize; iNES_read_header_info(); if (!ROM_size) @@ -996,9 +1005,6 @@ int iNESLoad(const char *name, FCEUFILE *fp) filesize -= 512; } - iNESCart.PRGRomSize = ROM_size >=0xF00? (pow(2, head.ROM_size >>2)*((head.ROM_size &3)*2+1)): (ROM_size*0x4000); - iNESCart.CHRRomSize =VROM_size >=0xF00? (pow(2, head.VROM_size>>2)*((head.VROM_size&3)*2+1)): (VROM_size*0x2000);; - romSize = iNESCart.PRGRomSize + iNESCart.CHRRomSize; if (romSize > filesize) @@ -1030,6 +1036,18 @@ int iNESLoad(const char *name, FCEUFILE *fp) memset(VROM, 0xFF, vrom_size_pow2); FCEU_fread(VROM, 1, iNESCart.CHRRomSize, fp); } + + if (iNESCart.miscROMSize) { + MiscROM =(uint8*) FCEU_malloc(iNESCart.miscROMSize); + if (!MiscROM) { + free(VROM); + free(ROM); + VROM =NULL; + ROM =NULL; + return 0; + } + FCEU_fread(MiscROM, 1, iNESCart.miscROMSize, fp); + } iNESCart.PRGCRC32 = CalcCRC32(0, ROM, iNESCart.PRGRomSize); iNESCart.CHRCRC32 = CalcCRC32(0, VROM, iNESCart.CHRRomSize);