Update NES.ino

- regrouped more MMC3-like mappers
- fixed mapper 91
- simplified mappers 1/155, 9, 10, 157
This commit is contained in:
nsx0r 2024-12-22 08:25:24 +00:00 committed by GitHub
parent 3f22b405ad
commit 1a16fcf875
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194

View File

@ -17,10 +17,10 @@
//803 Low Level Functions
//1012 File Functions
//1083 Config Functions
//1701 ROM Functions
//3558 RAM Functions
//3958 Eeprom Functions
//4145 NESmaker Flash Cart Functions
//1704 ROM Functions
//3534 RAM Functions
//3934 Eeprom Functions
//4122 NESmaker Flash Cart Functions
struct mapper_NES {
uint16_t mapper;
@ -38,15 +38,15 @@ struct mapper_NES {
// Supported Mapper Array (iNES Mapper #s)
// Format = {mapper,prglo,prghi,chrlo,chrhi,ramlo,ramhi}
static const struct mapper_NES PROGMEM mapsize[] = {
{ 0, 0, 1, 0, 1, 0, 2 }, // nrom [sram r/w]
{ 1, 1, 5, 0, 5, 0, 3 }, // mmc1 [sram r/w]
{ 2, 2, 4, 0, 0, 0, 0 }, // uxrom
{ 3, 0, 1, 0, 9, 0, 0 }, // cnrom
{ 4, 1, 5, 0, 6, 0, 1 }, // mmc3/mmc6 [sram/prgram r/w]
{ 5, 3, 5, 5, 7, 0, 3 }, // mmc5 [sram r/w]
{ 7, 2, 4, 0, 0, 0, 0 }, // axrom
{ 9, 3, 3, 5, 5, 0, 0 }, // mmc2 (punch out)
{ 10, 3, 4, 4, 5, 1, 1 }, // mmc4 [sram r/w]
{ 0, 0, 1, 0, 1, 0, 2 }, // NROM [sram r/w]
{ 1, 1, 5, 0, 5, 0, 3 }, // MMC1 [sram r/w]
{ 2, 2, 4, 0, 0, 0, 0 }, // UxROM
{ 3, 0, 1, 0, 9, 0, 0 }, // CNROM
{ 4, 1, 5, 0, 6, 0, 1 }, // MMC3/MMC6 [sram/prgram r/w]
{ 5, 3, 5, 5, 7, 0, 3 }, // MMC5 [sram r/w]
{ 7, 2, 4, 0, 0, 0, 0 }, // AxROM
{ 9, 0, 3, 0, 5, 0, 0 }, // MMC2/PxROM
{ 10, 0, 4, 4, 5, 1, 1 }, // MMC4/FxROM [sram r/w]
{ 11, 1, 3, 1, 5, 0, 0 }, // Color Dreams [UNLICENSED]
{ 13, 1, 1, 0, 0, 0, 0 }, // cprom (videomation)
{ 15, 6, 6, 0, 0, 0, 0 }, // K-1029/K-1030P [UNLICENSED]
@ -637,7 +637,7 @@ void getMapping() {
}
// Read first 512 bytes of first and last block of PRG ROM and compute CRC32
// MMC3 maps the last 8KB block of PRG ROM to 0xE000 while 0x8000 can contain random data after bootup
// Some mappers (like MMC3) map the last 8KB block of PRG ROM to 0xE000 while 0x8000 can contain random data after bootup
for (size_t c = 0; c < 512; c++) {
UPDATE_CRC(oldcrc32, read_prg_byte(0x8000 + c));
UPDATE_CRC(oldcrc32MMC3, read_prg_byte(0xE000 + c));
@ -1792,7 +1792,7 @@ void readPRG(bool readrom) {
case 1:
case 155: // 32K/64K/128K/256K/512K
banks = int_pow(2, prgsize) - 1;
banks = int_pow(2, prgsize);
for (size_t i = 0; i < banks; i++) { // 16K Banks ($8000-$BFFF)
write_prg_byte(0x8000, 0x80); // Clear Register
write_mmc1_byte(0x8000, 0x0C); // Switch 16K Bank ($8000-$BFFF) + Fixed Last Bank ($C000-$FFFF)
@ -1803,7 +1803,6 @@ void readPRG(bool readrom) {
write_mmc1_byte(0xE000, i);
dumpBankPRG(0x0, 0x4000, base);
}
dumpBankPRG(0x4000, 0x8000, base); // Final Bank ($C000-$FFFF)
break;
case 2: // bus conflicts - fixed last bank
@ -1926,20 +1925,20 @@ void readPRG(bool readrom) {
}
break;
case 9: // 128K
for (size_t i = 0; i < 13; i++) { // 16-3 = 13 = 128K
write_prg_byte(0xA000, i); // $8000-$9FFF
dumpBankPRG(0x0, 0x2000, base); // Switch Bank ($8000-$9FFF)
case 9:
banks = int_pow(2, prgsize) * 2; // 8K banks
for (size_t i = 0; i < banks; i++) {
write_prg_byte(0xA000, i); // Switch bank at $8000
dumpBankPRG(0x0, 0x2000, base); //
}
dumpBankPRG(0x2000, 0x8000, base); // Final 3 Banks ($A000-$FFFF)
break;
case 10: // 128K/256K
for (size_t i = 0; i < (unsigned)(((prgsize - 3) * 8) + 7); i++) {
write_prg_byte(0xA000, i); // $8000-$BFFF
dumpBankPRG(0x0, 0x4000, base); // Switch Bank ($8000-$BFFF)
case 10:
banks = int_pow(2, prgsize);
for (size_t i = 0; i < banks; i++) {
write_prg_byte(0xA000, i);
dumpBankPRG(0x0, 0x4000, base);
}
dumpBankPRG(0x4000, 0x8000, base); // Final Bank ($C000-$FFFF)
break;
case 11:
@ -2090,7 +2089,6 @@ void readPRG(bool readrom) {
case 211:
banks = int_pow(2, prgsize) * 2;
write_prg_byte(0xD000, 0x02);
for (uint8_t i = 0; i < banks; i++) {
write_prg_byte(0xD003, (((i >> 5) & 0x06) | 0x20));
write_prg_byte(0x8000, (i & 0x3f));
@ -2333,13 +2331,12 @@ void readPRG(bool readrom) {
break;
case 91:
banks = int_pow(2, prgsize);
for (size_t i = 0; i < (banks - 2); i += 2) {
write_prg_byte(0x7000, (i | 0));
write_prg_byte(0x7001, (i | 1));
dumpBankPRG(0x0, 0x4000, base);
banks = int_pow(2, prgsize) * 2;
for (size_t i = 0; i < banks; i += 1) {
write_prg_byte(0x8000 + ((i & 0x30) >> 3), i); // PRG A18-A17 (submapper 0 only)
write_prg_byte(0x7000, i); // PRG -A13
dumpBankPRG(0x0, 0x2000, base);
}
dumpBankPRG(0x4000, 0x8000, base);
break;
case 92: // 256K
@ -2467,11 +2464,11 @@ void readPRG(bool readrom) {
break;
case 157:
for (size_t i = 0; i < 15; i++) {
write_prg_byte(0x8008, i); // select 16k bank at $8000-$BFFF
banks = int_pow(2, prgsize);
for (size_t i = 0; i < banks; i++) {
write_prg_byte(0x8008, i);
dumpBankPRG(0x0, 0x4000, base);
}
dumpBankPRG(0x4000, 0x8000, base); // last 16k bank fixed at $C000-$FFFF
break;
case 162:
@ -2792,12 +2789,16 @@ void readCHR(bool readrom) {
case 52:
case 64:
case 76:
case 88: // 128K
case 95: // 32K
case 118:
case 119:
case 126:
case 134:
case 154: // 128K
case 158:
case 176:
case 206: // 16K/32K/64K
case 315:
case 366:
banks = int_pow(2, chrsize) * 4;
@ -2871,12 +2872,9 @@ void readCHR(bool readrom) {
break;
case 9:
case 10: // Mapper 9: 128K, Mapper 10: 64K/128K
if (mapper == 9)
banks = 32;
else // Mapper 10
case 10:
banks = int_pow(2, chrsize);
for (size_t i = 0; i < banks; i++) { // 64K/128K
for (size_t i = 0; i < banks; i++) {
write_prg_byte(0xB000, i);
write_prg_byte(0xC000, i);
dumpBankCHR(0x0, 0x1000);
@ -3311,26 +3309,6 @@ void readCHR(bool readrom) {
}
break;
case 88: // 128K
case 95: // 32K
case 154: // 128K
case 206: // 16K/32K/64K
banks = int_pow(2, chrsize) * 4;
for (size_t i = 0; i < banks; i += 2) { // 1K Banks
if (i < 64) {
write_prg_byte(0x8000, 0); // CHR Command ($0000-$07FF) 2K Bank
write_prg_byte(0x8001, i & 0x3F); // CHR Bank
dumpBankCHR(0x0, 0x800);
} else {
write_prg_byte(0x8000, 2); // CHR Command ($1000-$13FF) 1K Bank
write_prg_byte(0x8001, i); // CHR Bank
write_prg_byte(0x8000, 3); // CHR Command ($1400-$17FF) 1K Bank
write_prg_byte(0x8001, i + 1); // CHR Bank
dumpBankCHR(0x1000, 0x1800);
}
}
break;
case 89: // 128K
banks = int_pow(2, chrsize) / 2;
for (size_t i = 0; i < banks; i++) { // 8K Banks
@ -3343,13 +3321,11 @@ void readCHR(bool readrom) {
break;
case 91:
banks = int_pow(2, chrsize) / 2;
for (size_t i = 0; i < banks; i += 8) {
write_prg_byte(0x6000, (i / 2) | 0);
write_prg_byte(0x6001, (i / 2) | 1);
write_prg_byte(0x6002, (i / 2) | 2);
write_prg_byte(0x6003, (i / 2) | 3);
dumpBankCHR(0x0, 0x2000);
banks = int_pow(2, chrsize) * 2;
for (size_t i = 0; i < banks; i += 1) {
write_prg_byte(0x8000 + ((i & 0x100) >> 8), i); // CHR A19 (submapper 0 only)
write_prg_byte(0x6000, i); // CHR A18-A11
dumpBankCHR(0x0, 0x0800);
}
break;