diff options
Diffstat (limited to 'Cart_Reader/NES.ino')
-rw-r--r-- | Cart_Reader/NES.ino | 114 |
1 files changed, 45 insertions, 69 deletions
diff --git a/Cart_Reader/NES.ino b/Cart_Reader/NES.ino index 3eaddde..55b00e9 100644 --- a/Cart_Reader/NES.ino +++ b/Cart_Reader/NES.ino @@ -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 - banks = int_pow(2, chrsize); - for (size_t i = 0; i < banks; i++) { // 64K/128K + case 10: + banks = int_pow(2, chrsize); + 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; |