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_baddr = 0;
12 static carthw_state_chunk carthw_12in1_state[] =
14 { CHUNK_CARTHW, sizeof(carthw_12in1_baddr), &carthw_12in1_baddr },
18 static unsigned int carthw_12in1_read16(unsigned int a, int realsize)
21 elprintf(EL_UIO, "12-in-1: read [%06x] @ %06x", a, SekPc);
25 static void carthw_12in1_write8(unsigned int a, unsigned int d, int realsize)
29 if (a < 0xA13000 || a >= 0xA13040) {
30 /* 4-in-1 has Real Deal Boxing, which uses serial eeprom,
31 * but I really doubt that pirate cart had it */
33 elprintf(EL_ANOMALY, "12-in-1: unexpected write [%06x] %02x @ %06x", a, d, SekPc);
37 carthw_12in1_baddr = a;
39 len = Pico.romsize - a;
41 elprintf(EL_ANOMALY, "12-in-1: missing bank @ %06x", a);
45 memcpy(Pico.rom, Pico.rom + Pico.romsize + a, len);
48 static void carthw_12in1_reset(void)
50 carthw_12in1_write8(0xA13000, 0, 0);
53 static void carthw_12in1_statef(void)
55 carthw_12in1_write8(carthw_12in1_baddr, 0, 0);
58 void carthw_12in1_startup(void)
62 elprintf(EL_STATUS, "12-in-1 mapper detected");
64 tmp = realloc(Pico.rom, Pico.romsize * 2);
67 elprintf(EL_STATUS, "OOM");
71 memcpy(Pico.rom + Pico.romsize, Pico.rom, Pico.romsize);
73 PicoRead16Hook = carthw_12in1_read16;
74 PicoWrite8Hook = carthw_12in1_write8;
75 PicoResetHook = carthw_12in1_reset;
76 PicoLoadStateHook = carthw_12in1_statef;
77 carthw_chunks = carthw_12in1_state;
81 /* Realtec, based on TascoDLX doc
82 * http://www.sharemation.com/TascoDLX/REALTEC%20Cart%20Mapper%20-%20description%20v1.txt
84 static int realtec_bank = 0x80000000, realtec_size = 0x80000000;
85 static int realtec_romsize = 0;
87 static void carthw_realtec_write8(unsigned int a, unsigned int d, int realsize)
89 int i, bank_old = realtec_bank, size_old = realtec_size;
93 realtec_bank &= 0x0e0000;
94 realtec_bank |= 0x300000 & (d << 19);
95 if (realtec_bank != bank_old)
96 elprintf(EL_ANOMALY, "write [%06x] %02x @ %06x", a, d, SekPc);
98 else if (a == 0x402000)
100 realtec_size = (d << 17) & 0x3e0000;
101 if (realtec_size != size_old)
102 elprintf(EL_ANOMALY, "write [%06x] %02x @ %06x", a, d, SekPc);
104 else if (a == 0x404000)
106 realtec_bank &= 0x300000;
107 realtec_bank |= 0x0e0000 & (d << 17);
108 if (realtec_bank != bank_old)
109 elprintf(EL_ANOMALY, "write [%06x] %02x @ %06x", a, d, SekPc);
112 elprintf(EL_ANOMALY, "realtec: unexpected write [%06x] %02x @ %06x", a, d, SekPc);
114 if (realtec_bank >= 0 && realtec_size >= 0 &&
115 (realtec_bank != bank_old || realtec_size != size_old))
117 elprintf(EL_ANOMALY, "realtec: new bank %06x, size %06x", realtec_bank, realtec_size, SekPc);
118 if (realtec_size > realtec_romsize - realtec_bank || realtec_bank >= realtec_romsize)
120 elprintf(EL_ANOMALY, "realtec: bank too large / out of range?");
124 for (i = 0; i < 0x400000; i += realtec_size)
125 memcpy(Pico.rom + i, Pico.rom + 0x400000 + realtec_bank, realtec_size);
129 void carthw_realtec_reset(void)
133 for (i = 0; i < 0x400000; i += 0x2000)
134 memcpy(Pico.rom + i, Pico.rom + 0x400000 + realtec_romsize - 0x2000, 0x2000);
135 realtec_bank = realtec_size = 0x80000000;
138 void carthw_realtec_startup(void)
142 elprintf(EL_STATUS, "Realtec mapper detected");
144 realtec_romsize = Pico.romsize;
145 Pico.romsize = 0x400000;
146 tmp = realloc(Pico.rom, 0x400000 + realtec_romsize);
149 elprintf(EL_STATUS, "OOM");
153 memcpy(Pico.rom + 0x400000, Pico.rom, realtec_romsize);
155 PicoWrite8Hook = carthw_realtec_write8;
156 PicoResetHook = carthw_realtec_reset;