diff --git a/src/cart.h b/src/cart.h index 08de902..abd3f6e 100644 --- a/src/cart.h +++ b/src/cart.h @@ -29,6 +29,8 @@ typedef struct { int region; /* video system timing (ntsc, pal, dendy */ uint8 MD5[16]; + uint32 PRGCRC32; + uint32 CHRCRC32; uint32 CRC32; /* Should be set by the iNES/UNIF loading * code, used by mapper/board code, maybe * other code in the future. diff --git a/src/drivers/libretro/libretro.c b/src/drivers/libretro/libretro.c index c3a4e4c..342ba74 100644 --- a/src/drivers/libretro/libretro.c +++ b/src/drivers/libretro/libretro.c @@ -2089,8 +2089,6 @@ static char slash = '\\'; static char slash = '/'; #endif -extern uint32_t iNESGameCRC32; - bool retro_load_game(const struct retro_game_info *game) { unsigned i, j; @@ -2227,7 +2225,7 @@ bool retro_load_game(const struct retro_game_info *game) for (i = 0; i < fourscore_len; i++) { - if (fourscore_db_list[i].crc == iNESGameCRC32) + if (fourscore_db_list[i].crc == iNESCart.CRC32) { FCEUI_DisableFourScore(0); enable_4player = true; @@ -2237,7 +2235,7 @@ bool retro_load_game(const struct retro_game_info *game) for (i = 0; i < famicom_4p_len; i++) { - if (famicom_4p_db_list[i].crc == iNESGameCRC32) + if (famicom_4p_db_list[i].crc == iNESCart.CRC32) { GameInfo->inputfc = SIFC_4PLAYER; FCEUI_SetInputFC(SIFC_4PLAYER, &JSReturn, 0); diff --git a/src/ines.c b/src/ines.c index cc4b88f..d10d3d6 100644 --- a/src/ines.c +++ b/src/ines.c @@ -114,8 +114,6 @@ static void iNESGI(int h) { } } -uint32 iNESGameCRC32 = 0; - struct CRCMATCH { uint32 crc; char *name; @@ -205,7 +203,7 @@ static void SetInput(void) { int x = 0; while (moo[x].input1 >= 0 || moo[x].input2 >= 0 || moo[x].inputfc >= 0) { - if (moo[x].crc32 == iNESGameCRC32) { + if (moo[x].crc32 == iNESCart.CRC32) { GameInfo->input[0] = moo[x].input1; GameInfo->input[1] = moo[x].input2; GameInfo->inputfc = moo[x].inputfc; @@ -307,7 +305,7 @@ static void CheckHInfo(void) { x = 0; do { - if (moo[x].crc32 == iNESGameCRC32) { + if (moo[x].crc32 == iNESCart.CRC32) { if (moo[x].mapper >= 0) { if (moo[x].mapper & 0x800 && VROM_size) { VROM_size = 0; @@ -864,19 +862,60 @@ 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); - iNESGameCRC32 = CalcCRC32(0, ROM, prgRom << 14); - - if (VROM_size) { - iNESGameCRC32 = CalcCRC32(iNESGameCRC32, VROM, chrRom << 13); + if (VROM_size) md5_update(&md5, VROM, chrRom << 13); - } md5_finish(&md5, iNESCart.MD5); memcpy(&GameInfo->MD5, &iNESCart.MD5, sizeof(iNESCart.MD5)); - iNESCart.CRC32 = iNESGameCRC32; + mappername = "Not Listed"; + + for (mappertest = 0; mappertest < (sizeof bmap / sizeof bmap[0]) - 1; mappertest++) { + if (bmap[mappertest].number == MapperNo) { + mappername = (char*)bmap[mappertest].name; + break; + } + } + + FCEU_printf(" PRG-ROM CRC32: 0x%08X\n", iNESCart.PRGCRC32); + FCEU_printf(" PRG+CHR CRC32: 0x%08X\n", iNESCart.CRC32); + FCEU_printf(" PRG+CHR MD5: 0x%s\n", md5_asciistr(iNESCart.MD5)); + FCEU_printf(" PRG-ROM: %3d x 16KiB\n", prgRom); + FCEU_printf(" CHR-ROM: %3d x 8KiB\n", chrRom); + + if (iNES2) { + const char *tv_region[] = { "NTSC", "PAL", "Multi-region", "Dendy" }; + unsigned PRGRAM = iNESCart.prgRam + iNESCart.prgRam_battery; + unsigned CHRRAM = iNESCart.chrRam + iNESCart.chrRam_battery; + + FCEU_printf(" NES 2.0 extended iNES.\n"); + FCEU_printf(" Mapper #: %3d\n", MapperNo); + FCEU_printf(" Sub Mapper #: %3d\n", subMapper); + FCEU_printf(" Mapper name: %s\n", mappername); + if (PRGRAM || CHRRAM) { + FCEU_printf(" PRG RAM: %d KB\n", PRGRAM / 1024); + FCEU_printf(" CHR RAM: %d KB\n", CHRRAM / 1024); + if (head.ROM_type & 0x02) { + FCEU_printf(" PRG RAM backed by battery: %d KiB\n", iNESCart.prgRam_battery / 1024); + FCEU_printf(" CHR RAM backed by battery: %d KiB\n", iNESCart.chrRam_battery / 1024); + } + } + FCEU_printf(" Mirroring: %s\n", Mirroring == 2 ? "None (Four-screen)" : Mirroring ? "Vertical" : "Horizontal"); + FCEU_printf(" System: %s\n", tv_region[region]); + FCEU_printf(" Trained: %s\n", (head.ROM_type & 4) ? "Yes" : "No"); + } else { + FCEU_printf(" Mapper #: %3d\n", MapperNo); + FCEU_printf(" Mapper name: %s\n", mappername); + FCEU_printf(" Mirroring: %s\n", Mirroring == 2 ? "None (Four-screen)" : Mirroring ? "Vertical" : "Horizontal"); + FCEU_printf(" Battery-backed: %s\n", (head.ROM_type & 2) ? "Yes" : "No"); + FCEU_printf(" Trained: %s\n", (head.ROM_type & 4) ? "Yes" : "No"); + } SetInput(); CheckHInfo(); @@ -911,48 +950,6 @@ int iNESLoad(const char *name, FCEUFILE *fp) { iNESCart.battery = (head.ROM_type & 2) ? 1 : 0; iNESCart.mirror = Mirroring; - mappername = "Not Listed"; - - for (mappertest = 0; mappertest < (sizeof bmap / sizeof bmap[0]) - 1; mappertest++) { - if (bmap[mappertest].number == MapperNo) { - mappername = (char*)bmap[mappertest].name; - break; - } - } - - if (iNES2) FCEU_printf(" NES 2.0 extended iNES.\n"); - FCEU_printf(" ROM CRC32: 0x%08lx\n", iNESGameCRC32); - FCEU_printf(" ROM MD5: 0x%s\n", md5_asciistr(iNESCart.MD5)); - FCEU_printf(" PRG ROM: %3d x 16KiB\n", prgRom); - FCEU_printf(" CHR ROM: %3d x 8KiB\n", chrRom); - - if (iNES2) { - const char *tv_region[] = { "NTSC", "PAL", "Multi-region", "Dendy" }; - unsigned PRGRAM = iNESCart.prgRam + iNESCart.prgRam_battery; - unsigned CHRRAM = iNESCart.chrRam + iNESCart.chrRam_battery; - - FCEU_printf(" Mapper #: %3d\n", MapperNo); - FCEU_printf(" Sub Mapper #: %3d\n", subMapper); - FCEU_printf(" Mapper name: %s\n", mappername); - if (PRGRAM || CHRRAM) { - FCEU_printf(" PRG RAM: %d KiB\n", PRGRAM / 1024); - FCEU_printf(" CHR RAM: %d KiB\n", CHRRAM / 1024); - if (head.ROM_type & 0x02) { - FCEU_printf(" PRG RAM backed by battery: %d KiB\n", iNESCart.prgRam_battery / 1024); - FCEU_printf(" CHR RAM backed by battery: %d KiB\n", iNESCart.chrRam_battery / 1024); - } - } - FCEU_printf(" Mirroring: %s\n", Mirroring == 2 ? "None (Four-screen)" : Mirroring ? "Vertical" : "Horizontal"); - FCEU_printf(" System: %s\n", tv_region[region]); - FCEU_printf(" Trained: %s\n", (head.ROM_type & 4) ? "Yes" : "No"); - } else { - FCEU_printf(" Mapper #: %3d\n", MapperNo); - FCEU_printf(" Mapper name: %s\n", mappername); - FCEU_printf(" Mirroring: %s\n", Mirroring == 2 ? "None (Four-screen)" : Mirroring ? "Vertical" : "Horizontal"); - FCEU_printf(" Battery-backed: %s\n", (head.ROM_type & 2) ? "Yes" : "No"); - FCEU_printf(" Trained: %s\n", (head.ROM_type & 4) ? "Yes" : "No"); - } - if (!iNES_Init(MapperNo)) { FCEU_printf("\n"); FCEU_PrintError(" iNES mapper #%d is not supported at all.\n", MapperNo); diff --git a/src/unif.c b/src/unif.c index 030d8d5..58a0aec 100644 --- a/src/unif.c +++ b/src/unif.c @@ -771,6 +771,10 @@ 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); + md5_starts(&md5); md5_update(&md5, ROM, UNIF_PRGROMSize); if (VROM_size) @@ -787,13 +791,14 @@ int UNIFLoad(const char *name, FCEUFILE *fp) { if (!InitializeBoard()) goto aborto; + FCEU_printf(" PRG-ROM CRC32: 0x%08X\n", UNIFCart.PRGCRC32); + FCEU_printf(" PRG+CHR CRC32: 0x%08X\n", UNIFCart.CRC32); + FCEU_printf(" PRG+CHR MD5 : 0x%s\n", md5_asciistr(UNIFCart.MD5)); if (UNIFCart.mapper) FCEU_printf(" [Unif] Mapper: %d\n", UNIFCart.mapper); FCEU_printf(" [Unif] SubMapper: %d\n", UNIFCart.submapper); - FCEU_printf(" [Unif] PRG ROM: %d KiB\n", UNIF_PRGROMSize / 1024); - if (VROM_size) - FCEU_printf(" [Unif] CHR ROM: %d KiB\n", UNIF_CHRROMSize / 1024); - FCEU_printf(" [Unif] ROM MD5: 0X%s\n", md5_asciistr(UNIFCart.MD5)); + FCEU_printf(" [Unif] PRG ROM: %d KiB\n", UNIF_PRGROMSize >> 10); + FCEU_printf(" [Unif] CHR ROM: %d KiB\n", UNIF_CHRROMSize / 1024); GameInterface = UNIFGI; return 1;