2 * should better do some pointer stuff here. But as none of these bankswitch
3 * while the game runs, memcpy will suffice.
6 #include "../PicoInt.h"
9 /* 12-in-1 and 4-in-1. Assuming 2MB ROMs here. */
10 static unsigned int carthw_12in1_read16(unsigned int a, int realsize)
13 elprintf(EL_UIO, "12-in-1: read [%06x] @ %06x", a, SekPc);
17 static void carthw_12in1_write8(unsigned int a, unsigned int d, int realsize)
21 if (a < 0xA13000 || a >= 0xA13040) {
22 /* 4-in-1 has Real Deal Boxing, which uses serial eeprom,
23 * but I really doubt that pirate cart had it */
25 elprintf(EL_ANOMALY, "12-in-1: unexpected write [%06x] %02x @ %06x", a, d, SekPc);
30 len = Pico.romsize - a;
32 elprintf(EL_ANOMALY, "12-in-1: missing bank @ %06x", a);
36 memcpy(Pico.rom, Pico.rom + Pico.romsize + a, len);
39 static void carthw_12in1_reset(void)
41 carthw_12in1_write8(0xA13000, 0, 0);
44 void carthw_12in1_startup(void)
48 elprintf(EL_STATUS, "12-in-1 mapper detected");
50 tmp = realloc(Pico.rom, Pico.romsize * 2);
53 elprintf(EL_STATUS, "OOM");
57 memcpy(Pico.rom + Pico.romsize, Pico.rom, Pico.romsize);
59 PicoRead16Hook = carthw_12in1_read16;
60 PicoWrite8Hook = carthw_12in1_write8;
61 PicoResetHook = carthw_12in1_reset;
65 /* Realtec, based on TascoDLX doc
66 * http://www.sharemation.com/TascoDLX/REALTEC%20Cart%20Mapper%20-%20description%20v1.txt
68 static int realtec_bank = 0x80000000, realtec_size = 0x80000000;
69 static int realtec_romsize = 0;
71 static void carthw_realtec_write8(unsigned int a, unsigned int d, int realsize)
73 int i, bank_old = realtec_bank, size_old = realtec_size;
77 realtec_bank &= 0x0e0000;
78 realtec_bank |= 0x300000 & (d << 19);
79 if (realtec_bank != bank_old)
80 elprintf(EL_ANOMALY, "write [%06x] %02x @ %06x", a, d, SekPc);
82 else if (a == 0x402000)
84 realtec_size = (d << 17) & 0x3e0000;
85 if (realtec_size != size_old)
86 elprintf(EL_ANOMALY, "write [%06x] %02x @ %06x", a, d, SekPc);
88 else if (a == 0x404000)
90 realtec_bank &= 0x300000;
91 realtec_bank |= 0x0e0000 & (d << 17);
92 if (realtec_bank != bank_old)
93 elprintf(EL_ANOMALY, "write [%06x] %02x @ %06x", a, d, SekPc);
96 elprintf(EL_ANOMALY, "realtec: unexpected write [%06x] %02x @ %06x", a, d, SekPc);
98 if (realtec_bank >= 0 && realtec_size >= 0 &&
99 (realtec_bank != bank_old || realtec_size != size_old))
101 elprintf(EL_ANOMALY, "realtec: new bank %06x, size %06x", realtec_bank, realtec_size, SekPc);
102 if (realtec_size > realtec_romsize - realtec_bank || realtec_bank >= realtec_romsize)
104 elprintf(EL_ANOMALY, "realtec: bank too large / out of range?");
108 for (i = 0; i < 0x400000; i += realtec_size)
109 memcpy(Pico.rom + i, Pico.rom + 0x400000 + realtec_bank, realtec_size);
113 void carthw_realtec_reset(void)
117 for (i = 0; i < 0x400000; i += 0x2000)
118 memcpy(Pico.rom + i, Pico.rom + 0x400000 + realtec_romsize - 0x2000, 0x2000);
119 realtec_bank = realtec_size = 0x80000000;
122 void carthw_realtec_startup(void)
126 elprintf(EL_STATUS, "Realtec mapper detected");
128 realtec_romsize = Pico.romsize;
129 Pico.romsize = 0x400000;
130 tmp = realloc(Pico.rom, 0x400000 + realtec_romsize);
133 elprintf(EL_STATUS, "OOM");
137 memcpy(Pico.rom + 0x400000, Pico.rom, realtec_romsize);
139 PicoWrite8Hook = carthw_realtec_write8;
140 PicoResetHook = carthw_realtec_reset;