diff --git a/src/boards/bmc42in1r.c b/src/boards/bmc42in1r.c index bc4c5b1..3ac92b8 100644 --- a/src/boards/bmc42in1r.c +++ b/src/boards/bmc42in1r.c @@ -88,7 +88,7 @@ static void M226Reset(void) { void Mapper226_Init(CartInfo *info) { isresetbased = 0; /* 1536KiB PRG roms have different bank order */ - reorder_banks = ((info->PRGRomSize * 16) == 1536) ? 1 : 0; + reorder_banks = ((info->PRGRomSize / 1024) == 1536) ? 1 : 0; info->Power = M226Power; info->Reset = M226Reset; AddExState(&StateRegs, ~0, 0, 0); diff --git a/src/cart.h b/src/cart.h index 3762c03..4573403 100644 --- a/src/cart.h +++ b/src/cart.h @@ -20,12 +20,12 @@ typedef struct { * set to mapper 4. */ int battery; /* Presence of an actual battery. */ - int PRGRomSize; /* total prg rom size in 16 K chunks */ - int CHRRomSize; /* total chr rom size in 8 K chunks */ - int PRGRamSize; /* prg ram size (volatile) */ - int CHRRamSize; /* chr ram size (volatile) */ - int PRGRamSaveSize; /* prg ram size (non-volatile or battery backed) */ - int CHRRamSaveSize; /* chr ram size (non-volatile or battery backed) */ + int PRGRomSize; /* prg rom size in bytes */ + int CHRRomSize; /* chr rom size in bytes */ + int PRGRamSize; /* prg ram size in bytes (volatile) */ + 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 region; /* video system timing (ntsc, pal, dendy */ uint8 MD5[16]; diff --git a/src/ines.c b/src/ines.c index 396d180..f0e2a8b 100644 --- a/src/ines.c +++ b/src/ines.c @@ -659,7 +659,7 @@ static BMAPPINGLocal bmap[] = { {(uint8_t*)"OK-411", 361, GN45_Init}, /* OK-411 is emulated together with GN-45 */ {(uint8_t*)"HUMMER/JY-052", 281, Mapper281_Init}, {(uint8_t*)"GN-45", 366, GN45_Init}, - + {(uint8_t*)"GKCX1", 288, Mapper288_Init }, {(uint8_t*)"Bit Corp 4-in-1", 357, Mapper357_Init }, {(uint8_t*)"MMC3 PIRATE SFC-12", 372, Mapper372_Init }, @@ -856,8 +856,8 @@ int iNESLoad(const char *name, FCEUFILE *fp) { } else if (romSize < filesize) FCEU_PrintError(" File contains %llu bytes of unused data\n", filesize - romSize); - iNESCart.PRGRomSize = prgRom; - iNESCart.CHRRomSize = chrRom; + iNESCart.PRGRomSize = prgRom << 14; + iNESCart.CHRRomSize = chrRom << 13; ROM_size = uppow2(prgRom); @@ -886,11 +886,11 @@ int iNESLoad(const char *name, FCEUFILE *fp) { if (VROM_size) FCEU_fread(VROM, 0x2000, chrRom, fp); - + iNESCart.PRGCRC32 = CalcCRC32(0, ROM, prgRom * 0x4000); iNESCart.CHRCRC32 = CalcCRC32(0, VROM, chrRom * 0x2000); iNESCart.CRC32 = CalcCRC32(iNESCart.PRGCRC32, VROM, chrRom * 0x2000); - + md5_starts(&md5); md5_update(&md5, ROM, prgRom << 14); if (VROM_size) diff --git a/src/ines.h b/src/ines.h index b43ef34..cd21141 100644 --- a/src/ines.h +++ b/src/ines.h @@ -40,8 +40,8 @@ typedef struct { extern uint8 *ROM; extern uint8 *VROM; -extern uint32 ROM_size; -extern uint32 VROM_size; +extern uint32 ROM_size; /* prg size in 16K chunks */ +extern uint32 VROM_size; /* chr size in 8K chunks */ extern iNES_HEADER head; void NSFVRC6_Init(void); diff --git a/src/unif.c b/src/unif.c index 6f31002..bdad1ad 100644 --- a/src/unif.c +++ b/src/unif.c @@ -743,18 +743,23 @@ int UNIFLoad(const char *name, FCEUFILE *fp) { if (!LoadUNIFChunks(fp)) goto aborto; - UNIFCart.PRGRomSize = (UNIF_PRGROMSize / 0x1000) + ((UNIF_PRGROMSize % 0x1000) ? 1 : 0); - UNIFCart.PRGRomSize = (UNIFCart.PRGRomSize >> 2) + ((UNIFCart.PRGRomSize & 3) ? 1: 0); - UNIFCart.CHRRomSize = (UNIF_CHRROMSize / 0x400) + ((UNIF_CHRROMSize % 0x400) ? 1 : 0); - UNIFCart.CHRRomSize = (UNIFCart.CHRRomSize >> 3) + ((UNIFCart.CHRRomSize & 7) ? 1: 0); + ROM_size = (UNIF_PRGROMSize / 0x1000) + ((UNIF_PRGROMSize % 0x1000) ? 1 : 0); + ROM_size = (ROM_size >> 2) + ((ROM_size & 3) ? 1: 0); + if (UNIF_CHRROMSize) { + VROM_size = (UNIF_CHRROMSize / 0x400) + ((UNIF_CHRROMSize % 0x400) ? 1 : 0); + VROM_size = (VROM_size >> 3) + ((VROM_size & 7) ? 1: 0); + } - ROM_size = FixRomSize(UNIF_PRGROMSize, 2048); + UNIFCart.PRGRomSize = UNIF_PRGROMSize; + UNIFCart.CHRRomSize = UNIF_CHRROMSize; + + UNIF_PRGROMSize = FixRomSize(UNIF_PRGROMSize, 2048); if (UNIF_CHRROMSize) - VROM_size = FixRomSize(UNIF_CHRROMSize, 8192); + UNIF_CHRROMSize = FixRomSize(UNIF_CHRROMSize, 8192); - ROM = (uint8*)malloc(ROM_size); - if (VROM_size) - VROM = (uint8*)malloc(VROM_size); + ROM = (uint8*)malloc(UNIF_PRGROMSize); + if (UNIF_CHRROMSize) + VROM = (uint8*)malloc(UNIF_CHRROMSize); for (x = 0; x < 16; x++) { unsigned p = prg_idx[x]; @@ -774,22 +779,24 @@ int UNIFLoad(const char *name, FCEUFILE *fp) { } } - UNIFCart.PRGCRC32 = CalcCRC32(0, ROM, UNIF_PRGROMSize); - UNIFCart.CHRCRC32 = CalcCRC32(0, VROM, UNIF_CHRROMSize); - UNIFCart.CRC32 = CalcCRC32(UNIFCart.PRGCRC32, VROM, UNIF_CHRROMSize); + UNIFCart.PRGCRC32 = CalcCRC32(0, ROM, PRGptr); + UNIFCart.CHRCRC32 = CalcCRC32(0, VROM, CHRptr); + UNIFCart.CRC32 = CalcCRC32(UNIFCart.PRGCRC32, VROM, CHRptr); + + FCEU_printf("CHR CRC32 = %08x\n", UNIFCart.CHRCRC32); md5_starts(&md5); - md5_update(&md5, ROM, UNIF_PRGROMSize); - if (VROM_size) - md5_update(&md5, VROM, UNIF_CHRROMSize); + md5_update(&md5, ROM, PRGptr); + if (UNIF_CHRROMSize) + md5_update(&md5, VROM, CHRptr); md5_finish(&md5, UNIFCart.MD5); memcpy(GameInfo->MD5, UNIFCart.MD5, sizeof(UNIFCart.MD5)); CheckHashInfo(); - SetupCartPRGMapping(0, ROM, ROM_size, 0); - if (VROM_size) - SetupCartCHRMapping(0, VROM, VROM_size, 0); + SetupCartPRGMapping(0, ROM, UNIF_PRGROMSize, 0); + if (UNIF_CHRROMSize) + SetupCartCHRMapping(0, VROM, UNIF_CHRROMSize, 0); if (!InitializeBoard()) goto aborto; @@ -804,6 +811,7 @@ int UNIFLoad(const char *name, FCEUFILE *fp) { FCEU_printf(" [Unif] CHR ROM: %u KiB\n", UNIF_CHRROMSize / 1024); GameInterface = UNIFGI; + return 1; aborto: