@@ -79,10 +79,10 @@ static const struct mapper_NES PROGMEM mapsize[] = {
79
79
{ 38 , 1 , 3 , 0 , 3 , 0 , 0 }, // 普澤 [Bit Corp.] PCI556 (Crime Busters)
80
80
{ 39 , 3 , 5 , 0 , 0 , 0 , 0 }, // duplicate of 241
81
81
// 40 - NTDEC 2722/2752 [TODO]
82
- // 41 - NTDEC 2399 (Caltron 6-in-1) [TODO]
82
+ { 41 , 4 , 4 , 5 , 5 , 0 , 0 }, // NTDEC 2399 (Caltron 6-in-1)
83
83
{ 42 , 0 , 3 , 0 , 5 , 0 , 0 }, // AC08/LH09 (FDS games hacked to cartridges)
84
- // 43 - TONY-I / YS-612 [TODO ]
85
- // 44 - Super HiK 7-in-1 (MMC3) [TODO]
84
+ { 43 , 2 , 2 , 0 , 0 , 0 , 0 }, // TONY-I / YS-612 [88KiB ]
85
+ // { 44, 5, 6, 7, 8, 0, 0 }, Super HiK 7-in-1 (MMC3) [TODO]
86
86
{ 45 , 3 , 6 , 0 , 8 , 0 , 0 }, // TC3294/GA23C
87
87
{ 46 , 1 , 6 , 0 , 8 , 0 , 0 }, // GameStation/RumbleStation
88
88
{ 47 , 4 , 5 , 6 , 7 , 0 , 0 }, // Nintendo NES-QJ (2-in-1)
@@ -1901,8 +1901,8 @@ void readPRG(bool readrom) {
1901
1901
break ;
1902
1902
1903
1903
case 1 :
1904
- case 155 : // 32K/64K/128K/256K/512K
1905
- if (prgsize == 1 ) { // fix for SEROM/SHROM/SH1ROM PCBs
1904
+ case 155 : // 32K/64K/128K/256K/512K
1905
+ if (prgsize == 1 ) {
1906
1906
write_prg_byte (0x8000 , 0x80 );
1907
1907
dumpBankPRG (0x0 , 0x8000 , base);
1908
1908
} else {
@@ -2247,6 +2247,15 @@ void readPRG(bool readrom) {
2247
2247
}
2248
2248
break ;
2249
2249
2250
+ case 41 :
2251
+ banks = int_pow (2 , prgsize) / 2 ;
2252
+ for (size_t i = 0 ; i < banks; i++) {
2253
+ write_prg_byte (0x6000 + i, 0 );
2254
+ write_prg_byte (0x6000 + i, 0 );
2255
+ dumpBankPRG (0x0 , 0x8000 , base);
2256
+ }
2257
+ break ;
2258
+
2250
2259
case 42 :
2251
2260
banks = int_pow (2 , prgsize) * 2 ;
2252
2261
base = 0x6000 ; // 8k switchable PRG ROM bank at $6000-$7FFF
@@ -2258,6 +2267,20 @@ void readPRG(bool readrom) {
2258
2267
dumpBankPRG (0x0 , 0x8000 , base);
2259
2268
break ;
2260
2269
2270
+ case 43 :
2271
+ base = 0xC000 ;
2272
+ for (size_t i = 0 ; i < 8 ; i++) {
2273
+ write_prg_byte (0x4022 , i);
2274
+ dumpBankPRG (0x0 , 0x2000 , base);
2275
+ }
2276
+ base = 0x5000 ;
2277
+ for (size_t i = 0 ; i < 4 ; i++) {
2278
+ dumpBankPRG (0x0 , 0x1000 , base);
2279
+ }
2280
+ base = 0xE000 ;
2281
+ dumpBankPRG (0x0 , 0x1000 , base);
2282
+ break ;
2283
+
2261
2284
case 45 : // MMC3 Clone with Outer Registers
2262
2285
banks = ((int_pow (2 , prgsize) * 2 )) - 2 ; // Set Number of Banks
2263
2286
for (size_t i = 0 ; i < banks; i += 2 ) { // 128K/256K/512K/1024K
@@ -2932,6 +2955,7 @@ void readCHR(bool readrom) {
2932
2955
if (myFile) {
2933
2956
switch (mapper) {
2934
2957
case 0 : // 8K
2958
+ case 43 :
2935
2959
dumpBankCHR (0x0 , 0x2000 );
2936
2960
break ;
2937
2961
@@ -3144,41 +3168,43 @@ void readCHR(bool readrom) {
3144
3168
break ;
3145
3169
3146
3170
case 23 :
3147
- banks = int_pow (2 , chrsize) * 4 ;
3148
- // Detect VRC4e Carts - read PRG 0x1FFF6 (DATE)
3149
- // Boku Dracula-kun = 890810, Tiny Toon = 910809
3150
- // Crisis Force = 910701, Parodius Da! = 900916
3151
- write_prg_byte (0x8000 , 15 );
3152
- uint8_t prgchk0 = read_prg_byte (0x9FF6 );
3153
- if (prgchk0 == 0x30 ) { // Check for "0" in middle of date. If true, assume VRC4e Cart
3154
- for (size_t i = 0 ; i < banks; i++) {
3155
- write_prg_byte (0xB000 , i & 0xF ); // CHR Bank Lower 4 bits
3156
- write_prg_byte (0xB004 , (i >> 4 ) & 0xF ); // CHR Bank Upper 4 bits VRC4e
3157
- dumpBankCHR (0x0 , 0x400 );
3171
+ { // 128K
3172
+ banks = int_pow (2 , chrsize) * 4 ;
3173
+ // Detect VRC4e Carts - read PRG 0x1FFF6 (DATE)
3174
+ // Boku Dracula-kun = 890810, Tiny Toon = 910809
3175
+ // Crisis Force = 910701, Parodius Da! = 900916
3176
+ write_prg_byte (0x8000 , 15 );
3177
+ uint8_t prgchk0 = read_prg_byte (0x9FF6 );
3178
+ if (prgchk0 == 0x30 ) { // Check for "0" in middle of date. If true, assume VRC4e Cart
3179
+ for (size_t i = 0 ; i < banks; i++) {
3180
+ write_prg_byte (0xB000 , i & 0xF ); // CHR Bank Lower 4 bits
3181
+ write_prg_byte (0xB004 , (i >> 4 ) & 0xF ); // CHR Bank Upper 4 bits VRC4e
3182
+ dumpBankCHR (0x0 , 0x400 );
3183
+ }
3184
+ break ;
3185
+ }
3186
+ // VRC2b/VRC4f - See https://www.nesdev.org/wiki/VRC2_and_VRC4
3187
+ for (size_t i = 0 ; i < banks; i += 8 ) {
3188
+ write_prg_byte (0xB000 , i & 0xF ); // CHR Bank 0: Lower 4 bits
3189
+ write_prg_byte (0xB001 , (i >> 4 ) & 0xF ); // CHR Bank 0: Upper 4 bits
3190
+ write_prg_byte (0xB002 , (i + 1 ) & 0xF ); // CHR Bank 1: Lower 4 bits
3191
+ write_prg_byte (0xB003 , ((i + 1 ) >> 4 ) & 0xF ); // CHR Bank 1: Upper 4 bits
3192
+ write_prg_byte (0xC000 , (i + 2 ) & 0xF ); // CHR Bank 2: Lower 4 bits
3193
+ write_prg_byte (0xC001 , ((i + 2 ) >> 4 ) & 0xF ); // CHR Bank 2: Upper 4 bits
3194
+ write_prg_byte (0xC002 , (i + 3 ) & 0xF ); // CHR Bank 3: Lower 4 bits
3195
+ write_prg_byte (0xC003 , ((i + 3 ) >> 4 ) & 0xF ); // CHR Bank 3: Upper 4 bits
3196
+ write_prg_byte (0xD000 , (i + 4 ) & 0xF ); // CHR Bank 4: Lower 4 bits
3197
+ write_prg_byte (0xD001 , ((i + 4 ) >> 4 ) & 0xF ); // CHR Bank 4: Upper 4 bits
3198
+ write_prg_byte (0xD002 , (i + 5 ) & 0xF ); // CHR Bank 5: Lower 4 bits
3199
+ write_prg_byte (0xD003 , ((i + 5 ) >> 4 ) & 0xF ); // CHR Bank 5: Upper 4 bits
3200
+ write_prg_byte (0xE000 , (i + 6 ) & 0xF ); // CHR Bank 6: Lower 4 bits
3201
+ write_prg_byte (0xE001 , ((i + 6 ) >> 4 ) & 0xF ); // CHR Bank 6: Upper 4 bits
3202
+ write_prg_byte (0xE002 , (i + 7 ) & 0xF ); // CHR Bank 7: Lower 4 bits
3203
+ write_prg_byte (0xE003 , ((i + 7 ) >> 4 ) & 0xF ); // CHR Bank 7: Upper 4 bits
3204
+ dumpBankCHR (0x0 , 0x2000 ); // 8 Banks for a total of 8 KiB
3158
3205
}
3159
3206
break ;
3160
3207
}
3161
- // VRC2b/VRC4f - See https://www.nesdev.org/wiki/VRC2_and_VRC4
3162
- for (size_t i = 0 ; i < banks; i += 8 ) {
3163
- write_prg_byte (0xB000 , i & 0xF ); // CHR Bank 0: Lower 4 bits
3164
- write_prg_byte (0xB001 , (i >> 4 ) & 0xF ); // CHR Bank 0: Upper 4 bits
3165
- write_prg_byte (0xB002 , (i + 1 ) & 0xF ); // CHR Bank 1: Lower 4 bits
3166
- write_prg_byte (0xB003 , ((i + 1 ) >> 4 ) & 0xF ); // CHR Bank 1: Upper 4 bits
3167
- write_prg_byte (0xC000 , (i + 2 ) & 0xF ); // CHR Bank 2: Lower 4 bits
3168
- write_prg_byte (0xC001 , ((i + 2 ) >> 4 ) & 0xF ); // CHR Bank 2: Upper 4 bits
3169
- write_prg_byte (0xC002 , (i + 3 ) & 0xF ); // CHR Bank 3: Lower 4 bits
3170
- write_prg_byte (0xC003 , ((i + 3 ) >> 4 ) & 0xF ); // CHR Bank 3: Upper 4 bits
3171
- write_prg_byte (0xD000 , (i + 4 ) & 0xF ); // CHR Bank 4: Lower 4 bits
3172
- write_prg_byte (0xD001 , ((i + 4 ) >> 4 ) & 0xF ); // CHR Bank 4: Upper 4 bits
3173
- write_prg_byte (0xD002 , (i + 5 ) & 0xF ); // CHR Bank 5: Lower 4 bits
3174
- write_prg_byte (0xD003 , ((i + 5 ) >> 4 ) & 0xF ); // CHR Bank 5: Upper 4 bits
3175
- write_prg_byte (0xE000 , (i + 6 ) & 0xF ); // CHR Bank 6: Lower 4 bits
3176
- write_prg_byte (0xE001 , ((i + 6 ) >> 4 ) & 0xF ); // CHR Bank 6: Upper 4 bits
3177
- write_prg_byte (0xE002 , (i + 7 ) & 0xF ); // CHR Bank 7: Lower 4 bits
3178
- write_prg_byte (0xE003 , ((i + 7 ) >> 4 ) & 0xF ); // CHR Bank 7: Upper 4 bits
3179
- dumpBankCHR (0x0 , 0x2000 ); // 8 Banks for a total of 8 KiB
3180
- }
3181
- break ;
3182
3208
3183
3209
case 24 : // 128K
3184
3210
banks = int_pow (2 , chrsize) * 4 ;
@@ -3281,6 +3307,17 @@ void readCHR(bool readrom) {
3281
3307
}
3282
3308
break ;
3283
3309
3310
+ case 41 :
3311
+ banks = int_pow (2 , chrsize) / 2 ;
3312
+ for (size_t i = 0 ; i < banks; i++) {
3313
+ write_prg_byte (0x6004 + ((i & 0x0C ) << 1 ), 0x00 );
3314
+ write_prg_byte (0x6004 + ((i & 0x0C ) << 1 ), 0x00 );
3315
+ write_prg_byte (0xFFF0 + (i & 0x03 ), i & 0x03 );
3316
+ write_prg_byte (0xFFF0 + (i & 0x03 ), i & 0x03 );
3317
+ dumpBankCHR (0x0 , 0x2000 );
3318
+ }
3319
+ break ;
3320
+
3284
3321
case 42 :
3285
3322
banks = int_pow (2 , chrsize);
3286
3323
for (size_t i = 0 ; i < banks; i++) {
@@ -3574,16 +3611,6 @@ void readCHR(bool readrom) {
3574
3611
}
3575
3612
break ;
3576
3613
3577
- case 122 :
3578
- case 184 : // 16K/32K
3579
- banks = int_pow (2 , chrsize);
3580
- for (size_t i = 0 ; i < banks; i++) { // 4K Banks
3581
- write_prg_byte (0x6000 , i); // CHR LOW (Bits 0-2) ($0000-$0FFF)
3582
- dumpBankCHR (0x0 , 0x1000 ); // 4K Banks ($0000-$0FFF)
3583
- }
3584
- break ;
3585
-
3586
-
3587
3614
case 140 : // 32K/128K
3588
3615
banks = int_pow (2 , chrsize) / 2 ;
3589
3616
for (size_t i = 0 ; i < banks; i++) { // 8K Banks
@@ -3599,6 +3626,15 @@ void readCHR(bool readrom) {
3599
3626
}
3600
3627
break ;
3601
3628
3629
+ case 122 :
3630
+ case 184 : // 16K/32K
3631
+ banks = int_pow (2 , chrsize);
3632
+ for (size_t i = 0 ; i < banks; i++) { // 4K Banks
3633
+ write_prg_byte (0x6000 , i); // CHR LOW (Bits 0-2) ($0000-$0FFF)
3634
+ dumpBankCHR (0x0 , 0x1000 ); // 4K Banks ($0000-$0FFF)
3635
+ }
3636
+ break ;
3637
+
3602
3638
case 185 : // 8K [READ 32K TO OVERRIDE LOCKOUT]
3603
3639
for (size_t i = 0 ; i < 4 ; i++) { // Read 32K to locate valid 8K
3604
3640
write_prg_byte (0x8000 , i);
@@ -3732,6 +3768,18 @@ void readCHR(bool readrom) {
3732
3768
dumpBankCHR (0x1000 , 0x1400 );
3733
3769
}
3734
3770
break ;
3771
+
3772
+ case 332 :
3773
+ banks = int_pow (2 , chrsize) / 2 ;
3774
+ for (int i = 0 ; i < banks; i++) {
3775
+ write_prg_byte (0x6001 , 0x30 | (i & 0x07 )); // NROM mode, A15-A13
3776
+ write_prg_byte (0x6001 , 0x30 | (i & 0x07 )); // NROM mode, A15-A13
3777
+ write_prg_byte (0x6000 , (i & 0x08 ) << 3 ); // A16
3778
+ write_prg_byte (0x6000 , (i & 0x08 ) << 3 ); // A16
3779
+ delay (100 );
3780
+ dumpBankCHR (0x0 , 0x2000 );
3781
+ }
3782
+ break ;
3735
3783
}
3736
3784
if (!readrom) {
3737
3785
myFile.flush ();
0 commit comments