Previous | 199869 Revisions | Next |
r32449 Sunday 28th September, 2014 at 15:28:57 UTC by Fabio Priuli |
---|
(MESS) consolidation + cleanup, part1. nw. |
[src/emu/bus/a7800] | a78_slot.c a78_slot.h |
[src/emu/bus/a800] | a800_slot.c a800_slot.h rom.c |
[src/emu/bus/gameboy] | gb_slot.c gb_slot.h mbc.c |
[src/emu/bus/gba] | gba_slot.c gba_slot.h rom.c rom.h |
[src/emu/bus/megadrive] | md_slot.c md_slot.h |
[src/emu/bus/pce] | pce_slot.c pce_slot.h |
[src/emu/bus/saturn] | rom.c sat_slot.c sat_slot.h |
[src/emu/bus/sega8] | rom.c sega8_slot.c sega8_slot.h |
[src/emu/bus/snes] | snes_slot.c snes_slot.h |
[src/emu/bus/vcs] | rom.c vcs_slot.c vcs_slot.h |
[src/mess/drivers] | a2600.c a7800.c atari400.c gba.c megadriv.c segapico.c sg1000.c |
[src/mess/includes] | gba.h md_cons.h sg1000.h |
[src/mess/machine] | sms.c |
r32448 | r32449 | |
---|---|---|
41 | 41 | } |
42 | 42 | |
43 | 43 | //------------------------------------------------- |
44 | // rom_alloc - alloc the space for the cart | |
45 | //------------------------------------------------- | |
46 | ||
47 | void device_gba_cart_interface::rom_alloc(UINT32 size, const char *tag) | |
48 | { | |
49 | if (m_rom == NULL) | |
50 | { | |
51 | astring tempstring(tag); | |
52 | tempstring.cat(GBASLOT_ROM_REGION_TAG); | |
53 | // we always alloc 32MB of rom region! | |
54 | m_rom = (UINT32 *)device().machine().memory().region_alloc(tempstring, 0x2000000, 4, ENDIANNESS_LITTLE)->base(); | |
55 | m_rom_size = size; | |
56 | } | |
57 | } | |
58 | ||
59 | ||
60 | //------------------------------------------------- | |
44 | 61 | // nvram_alloc - alloc the space for the ram |
45 | 62 | //------------------------------------------------- |
46 | 63 | |
r32448 | r32449 | |
150 | 167 | { |
151 | 168 | if (m_cart) |
152 | 169 | { |
153 | UINT8 *ROM = (UINT8 *)m_cart->get_rom_base(); | |
154 | UINT32 cart_size; | |
170 | UINT8 *ROM; | |
171 | UINT32 size = (software_entry() != NULL) ? get_software_region_length("rom") : length(); | |
172 | if (size > 0x2000000) | |
173 | { | |
174 | seterror(IMAGE_ERROR_UNSPECIFIED, "Attempted loading a cart larger than 32MB"); | |
175 | return IMAGE_INIT_FAIL; | |
176 | } | |
155 | 177 | |
178 | m_cart->rom_alloc(size, tag()); | |
179 | ROM = (UINT8 *)m_cart->get_rom_base(); | |
180 | ||
156 | 181 | if (software_entry() == NULL) |
157 | 182 | { |
158 | cart_size = length(); | |
159 | if (cart_size > 0x2000000) | |
160 | { | |
161 | seterror(IMAGE_ERROR_UNSPECIFIED, "Attempted loading a cart larger than 32MB"); | |
162 | return IMAGE_INIT_FAIL; | |
163 | } | |
164 | fread(ROM, cart_size); | |
165 | m_cart->set_rom_size(cart_size); // we store the actual game size... | |
166 | ||
167 | m_type = get_cart_type(ROM, cart_size); | |
183 | fread(ROM, size); | |
184 | m_type = get_cart_type(ROM, size); | |
168 | 185 | } |
169 | 186 | else |
170 | 187 | { |
171 | 188 | const char *pcb_name = get_feature("slot"); |
172 | 189 | |
173 | cart_size = get_software_region_length("rom"); | |
174 | if (cart_size > 0x2000000) | |
175 | { | |
176 | seterror(IMAGE_ERROR_UNSPECIFIED, "Attempted loading a cart larger than 32MB"); | |
177 | return IMAGE_INIT_FAIL; | |
178 | } | |
179 | memcpy(ROM, get_software_region("rom"), cart_size); | |
180 | m_cart->set_rom_size(cart_size); // we store the actual game size... | |
190 | memcpy(ROM, get_software_region("rom"), size); | |
181 | 191 | |
182 | 192 | if (pcb_name) |
183 | 193 | m_type = gba_get_pcb_id(pcb_name); |
r32448 | r32449 | |
191 | 201 | m_cart->nvram_alloc(0x10000); |
192 | 202 | |
193 | 203 | // mirror the ROM |
194 | switch ( | |
204 | switch (size) | |
195 | 205 | { |
196 | 206 | case 2 * 1024 * 1024: |
197 | 207 | memcpy(ROM + 0x200000, ROM, 0x200000); |
r32448 | r32449 | |
452 | 462 | void gba_cart_slot_device::internal_header_logging(UINT8 *ROM, UINT32 len) |
453 | 463 | { |
454 | 464 | } |
455 | ||
456 | ||
457 | /*------------------------------------------------- | |
458 | Install ROM - directly point system address map | |
459 | to the cart ROM region so to avoid the memory | |
460 | system additional load | |
461 | -------------------------------------------------*/ | |
462 | ||
463 | void gba_cart_slot_device::install_rom() | |
464 | { | |
465 | if (m_cart) | |
466 | { | |
467 | astring tempstring; | |
468 | address_space &space = machine().device<cpu_device>("maincpu")->space(AS_PROGRAM); | |
469 | space.install_read_bank(0x08000000, 0x09ffffff, 0, 0, "rom1"); | |
470 | space.install_read_bank(0x0a000000, 0x0bffffff, 0, 0, "rom2"); | |
471 | space.install_read_bank(0x0c000000, 0x0cffffff, 0, 0, "rom3"); | |
472 | machine().root_device().membank("rom1")->set_base(machine().root_device().memregion(m_cart->device().subtag(tempstring, "cartridge"))->base()); | |
473 | machine().root_device().membank("rom2")->set_base(machine().root_device().memregion(m_cart->device().subtag(tempstring, "cartridge"))->base()); | |
474 | machine().root_device().membank("rom3")->set_base(machine().root_device().memregion(m_cart->device().subtag(tempstring, "cartridge"))->base()); | |
475 | } | |
476 | } |
r32448 | r32449 | |
---|---|---|
68 | 68 | |
69 | 69 | |
70 | 70 | //------------------------------------------------- |
71 | // ROM Region to allow faster access to cart data | |
72 | //------------------------------------------------- | |
73 | ||
74 | ROM_START( gba_cart ) | |
75 | // cartridge region - 32 MBytes (128 Mbit) | |
76 | ROM_REGION( 0x2000000, "cartridge", ROMREGION_ERASEFF ) | |
77 | ROM_END | |
78 | ||
79 | const rom_entry *gba_rom_device::device_rom_region() const | |
80 | { | |
81 | return ROM_NAME( gba_cart ); | |
82 | } | |
83 | ||
84 | //------------------------------------------------- | |
85 | 71 | // mapper specific start/reset |
86 | 72 | //------------------------------------------------- |
87 | 73 | |
88 | 74 | void gba_rom_device::device_start() |
89 | 75 | { |
90 | astring tempstring; | |
91 | m_rom = (UINT32 *)memregion(this->subtag(tempstring, "cartridge"))->base(); | |
92 | 76 | } |
93 | 77 | |
94 | 78 | void gba_rom_device::device_reset() |
r32448 | r32449 | |
108 | 92 | |
109 | 93 | void gba_rom_eeprom_device::device_start() |
110 | 94 | { |
111 | astring tempstring; | |
112 | m_rom = (UINT32 *)memregion(this->subtag(tempstring, "cartridge"))->base(); | |
113 | ||
114 | 95 | // for the moment we use a custom eeprom implementation, so we alloc/save it as nvram |
115 | 96 | nvram_alloc(0x200); |
116 | 97 | m_eeprom.reset(global_alloc(gba_eeprom_device(machine(), (UINT8*)get_nvram_base(), get_nvram_size(), 6))); |
r32448 | r32449 | |
118 | 99 | |
119 | 100 | void gba_rom_eeprom64_device::device_start() |
120 | 101 | { |
121 | astring tempstring; | |
122 | m_rom = (UINT32 *)memregion(this->subtag(tempstring, "cartridge"))->base(); | |
123 | ||
124 | 102 | // for the moment we use a custom eeprom implementation, so we alloc/save it as nvram |
125 | 103 | nvram_alloc(0x2000); |
126 | 104 | m_eeprom.reset(global_alloc(gba_eeprom_device(machine(), (UINT8*)get_nvram_base(), get_nvram_size(), 14))); |
r32448 | r32449 | |
---|---|---|
34 | 34 | virtual DECLARE_READ32_MEMBER(read_ram) { return 0xffffffff; } |
35 | 35 | virtual DECLARE_WRITE32_MEMBER(write_ram) {}; |
36 | 36 | |
37 | void rom_alloc(UINT32 size, const char *tag); | |
37 | 38 | void nvram_alloc(UINT32 size); |
38 | 39 | UINT32* get_rom_base() { return m_rom; } |
39 | 40 | UINT32* get_nvram_base() { return m_nvram; } |
r32448 | r32449 | |
45 | 46 | |
46 | 47 | // internal state |
47 | 48 | UINT32 *m_rom; // this points to the cart rom region |
49 | UINT32 m_rom_size; // this is the actual game size, not the rom region size! | |
48 | 50 | dynamic_array<UINT32> m_nvram; |
49 | UINT32 m_rom_size; // this is the actual game size, not the rom region size! | |
50 | 51 | }; |
51 | 52 | |
52 | 53 | |
r32448 | r32449 | |
70 | 71 | virtual void call_unload(); |
71 | 72 | virtual bool call_softlist_load(software_list_device &swlist, const char *swname, const rom_entry *start_entry); |
72 | 73 | |
73 | void install_rom(); | |
74 | ||
75 | 74 | int get_type() { return m_type; } |
76 | 75 | int get_cart_type(UINT8 *ROM, UINT32 len); |
77 | 76 | |
r32448 | r32449 | |
115 | 114 | DEVICE CONFIGURATION MACROS |
116 | 115 | ***************************************************************************/ |
117 | 116 | |
117 | #define GBASLOT_ROM_REGION_TAG ":cart:rom" | |
118 | ||
118 | 119 | #define MCFG_GBA_CARTRIDGE_ADD(_tag,_slot_intf,_def_slot) \ |
119 | 120 | MCFG_DEVICE_ADD(_tag, GBA_CART_SLOT, 0) \ |
120 | 121 | MCFG_DEVICE_SLOT_INTERFACE(_slot_intf, _def_slot, false) |
r32448 | r32449 | |
---|---|---|
17 | 17 | |
18 | 18 | // device-level overrides |
19 | 19 | virtual void device_start(); |
20 | virtual const rom_entry *device_rom_region() const; | |
21 | 20 | virtual void device_reset(); |
22 | 21 | |
23 | 22 | // reading and writing |
r32448 | r32449 | |
---|---|---|
28 | 28 | //------------------------------------------------- |
29 | 29 | |
30 | 30 | device_vcs_cart_interface::device_vcs_cart_interface(const machine_config &mconfig, device_t &device) |
31 | : device_slot_card_interface(mconfig, device) | |
31 | : device_slot_card_interface(mconfig, device), | |
32 | m_rom(NULL), | |
33 | m_rom_size(0) | |
32 | 34 | { |
33 | 35 | } |
34 | 36 | |
r32448 | r32449 | |
45 | 47 | // rom_alloc - alloc the space for the cart |
46 | 48 | //------------------------------------------------- |
47 | 49 | |
48 | void device_vcs_cart_interface::rom_alloc(UINT32 size) | |
50 | void device_vcs_cart_interface::rom_alloc(UINT32 size, const char *tag) | |
49 | 51 | { |
50 | m_rom.resize(size); | |
52 | if (m_rom == NULL) | |
53 | { | |
54 | astring tempstring(tag); | |
55 | tempstring.cat(A26SLOT_ROM_REGION_TAG); | |
56 | m_rom = device().machine().memory().region_alloc(tempstring, size, 1, ENDIANNESS_LITTLE)->base(); | |
57 | m_rom_size = size; | |
58 | } | |
51 | 59 | } |
52 | 60 | |
53 | 61 | //------------------------------------------------- |
r32448 | r32449 | |
206 | 214 | return IMAGE_INIT_FAIL; |
207 | 215 | } |
208 | 216 | |
209 | m_cart->rom_alloc(len); | |
217 | m_cart->rom_alloc(len, tag()); | |
210 | 218 | ROM = m_cart->get_rom_base(); |
211 | 219 | |
212 | 220 | if (software_entry() != NULL) |
r32448 | r32449 | |
---|---|---|
228 | 228 | |
229 | 229 | void a26_rom_3e_device::device_reset() |
230 | 230 | { |
231 | m_num_bank = m_rom | |
231 | m_num_bank = m_rom_size / 0x800; | |
232 | 232 | m_base_bank = m_num_bank - 1; |
233 | 233 | m_ram_bank = 0; |
234 | 234 | m_ram_enable = 0; |
r32448 | r32449 | |
236 | 236 | |
237 | 237 | void a26_rom_3f_device::device_reset() |
238 | 238 | { |
239 | m_num_bank = m_rom | |
239 | m_num_bank = m_rom_size / 0x800; | |
240 | 240 | m_base_bank = m_num_bank - 1; |
241 | 241 | } |
242 | 242 | |
r32448 | r32449 | |
332 | 332 | return m_ram[offset & (m_ram.count() - 1)]; |
333 | 333 | } |
334 | 334 | |
335 | return m_rom[offset & (m_rom | |
335 | return m_rom[offset & (m_rom_size - 1)]; | |
336 | 336 | } |
337 | 337 | |
338 | 338 | /*------------------------------------------------- |
r32448 | r32449 | |
845 | 845 | |
846 | 846 | READ8_MEMBER(a26_rom_ua_device::read_rom) |
847 | 847 | { |
848 | return m_rom[(offset + (m_base_bank * 0x1000)) & (m_rom | |
848 | return m_rom[(offset + (m_base_bank * 0x1000)) & (m_rom_size - 1)]; | |
849 | 849 | } |
850 | 850 | |
851 | 851 | READ8_MEMBER(a26_rom_ua_device::read_bank) |
r32448 | r32449 | |
---|---|---|
59 | 59 | |
60 | 60 | virtual void setup_addon_ptr(UINT8 *ptr) {} |
61 | 61 | |
62 | void rom_alloc(UINT32 size); | |
62 | void rom_alloc(UINT32 size, const char *tag); | |
63 | 63 | void ram_alloc(UINT32 size); |
64 | 64 | UINT8* get_rom_base() { return m_rom; } |
65 | 65 | UINT8* get_ram_base() { return m_ram; } |
66 | UINT32 get_rom_size() { return m_rom | |
66 | UINT32 get_rom_size() { return m_rom_size; } | |
67 | 67 | UINT32 get_ram_size() { return m_ram.bytes(); } |
68 | 68 | |
69 | 69 | protected: |
70 | 70 | // internal state |
71 | dynamic_buffer m_rom; | |
71 | UINT8 *m_rom; | |
72 | UINT32 m_rom_size; | |
72 | 73 | dynamic_buffer m_ram; |
73 | 74 | }; |
74 | 75 | |
r32448 | r32449 | |
146 | 147 | DEVICE CONFIGURATION MACROS |
147 | 148 | ***************************************************************************/ |
148 | 149 | |
150 | #define A26SLOT_ROM_REGION_TAG ":cart:rom" | |
151 | ||
152 | ||
149 | 153 | #define MCFG_VCS_CARTRIDGE_ADD(_tag,_slot_intf,_def_slot) \ |
150 | 154 | MCFG_DEVICE_ADD(_tag, VCS_CART_SLOT, 0) \ |
151 | 155 | MCFG_DEVICE_SLOT_INTERFACE(_slot_intf, _def_slot, false) |
r32448 | r32449 | |
---|---|---|
40 | 40 | |
41 | 41 | device_a800_cart_interface::device_a800_cart_interface (const machine_config &mconfig, device_t &device) |
42 | 42 | : device_slot_card_interface(mconfig, device), |
43 | m_rom(NULL), | |
44 | m_rom_size(0), | |
43 | 45 | m_bank_mask(0) |
44 | 46 | { |
45 | 47 | } |
r32448 | r32449 | |
57 | 59 | // rom_alloc - alloc the space for the cart |
58 | 60 | //------------------------------------------------- |
59 | 61 | |
60 | void device_a800_cart_interface::rom_alloc(UINT32 size) | |
62 | void device_a800_cart_interface::rom_alloc(UINT32 size, const char *tag) | |
61 | 63 | { |
62 | m_rom.resize(size); | |
63 | ||
64 | // setup other helpers | |
65 | m_bank_mask = (size / 0x2000) - 1; // code for XEGS carts makes use of this to simplify banking | |
64 | if (m_rom == NULL) | |
65 | { | |
66 | astring tempstring(tag); | |
67 | tempstring.cat(A800SLOT_ROM_REGION_TAG); | |
68 | m_rom = device().machine().memory().region_alloc(tempstring, size, 1, ENDIANNESS_LITTLE)->base(); | |
69 | m_rom_size = size; | |
70 | ||
71 | // setup other helpers | |
72 | m_bank_mask = (size / 0x2000) - 1; // code for XEGS carts makes use of this to simplify banking | |
73 | } | |
66 | 74 | } |
67 | 75 | |
68 | 76 | //------------------------------------------------- |
r32448 | r32449 | |
234 | 242 | { |
235 | 243 | if (m_cart) |
236 | 244 | { |
237 | UINT8 *ROM; | |
238 | 245 | UINT32 len; |
239 | 246 | |
240 | 247 | if (software_entry() != NULL) |
r32448 | r32449 | |
242 | 249 | const char *pcb_name; |
243 | 250 | len = get_software_region_length("rom"); |
244 | 251 | |
245 | m_cart->rom_alloc(len); | |
246 | ROM = m_cart->get_rom_base(); | |
247 | memcpy(ROM, get_software_region("rom"), len); | |
252 | m_cart->rom_alloc(len, tag()); | |
253 | memcpy(m_cart->get_rom_base(), get_software_region("rom"), len); | |
248 | 254 | |
249 | 255 | if ((pcb_name = get_feature("slot")) != NULL) |
250 | 256 | m_type = a800_get_pcb_id(pcb_name); |
r32448 | r32449 | |
275 | 281 | m_type = A5200_4K; |
276 | 282 | } |
277 | 283 | |
278 | m_cart->rom_alloc(len); | |
279 | ROM = m_cart->get_rom_base(); | |
280 | fread(ROM, len); | |
284 | m_cart->rom_alloc(len, tag()); | |
285 | fread(m_cart->get_rom_base(), len); | |
281 | 286 | } |
282 | 287 | if (m_type == A800_TELELINK2) |
283 | 288 | m_cart->nvram_alloc(0x100); |
r32448 | r32449 | |
---|---|---|
204 | 204 | |
205 | 205 | READ8_MEMBER(a800_rom_device::read_80xx) |
206 | 206 | { |
207 | return m_rom[offset & (m_rom | |
207 | return m_rom[offset & (m_rom_size - 1)]; | |
208 | 208 | } |
209 | 209 | |
210 | 210 |
r32448 | r32449 | |
---|---|---|
56 | 56 | virtual DECLARE_WRITE8_MEMBER(write_80xx) {} |
57 | 57 | virtual DECLARE_WRITE8_MEMBER(write_d5xx) {} |
58 | 58 | |
59 | void rom_alloc(UINT32 size); | |
59 | void rom_alloc(UINT32 size, const char *tag); | |
60 | 60 | void ram_alloc(UINT32 size); |
61 | 61 | void nvram_alloc(UINT32 size); |
62 | 62 | UINT8* get_rom_base() { return m_rom; } |
63 | 63 | UINT8* get_ram_base() { return m_ram; } |
64 | 64 | UINT8* get_nvram_base() { return m_nvram; } |
65 | UINT32 get_rom_size() { return m_rom | |
65 | UINT32 get_rom_size() { return m_rom_size; } | |
66 | 66 | UINT32 get_ram_size() { return m_ram.bytes(); } |
67 | 67 | UINT32 get_nvram_size() { return m_nvram.bytes(); } |
68 | 68 | |
69 | 69 | protected: |
70 | 70 | // internal state |
71 | dynamic_buffer m_rom; | |
71 | UINT8 *m_rom; | |
72 | UINT32 m_rom_size; | |
72 | 73 | dynamic_buffer m_ram; |
73 | 74 | dynamic_buffer m_nvram; // HiScore cart can save scores! |
74 | 75 | // helpers |
r32448 | r32449 | |
169 | 170 | DEVICE CONFIGURATION MACROS |
170 | 171 | ***************************************************************************/ |
171 | 172 | |
173 | #define A800SLOT_ROM_REGION_TAG ":cart:rom" | |
174 | ||
172 | 175 | #define MCFG_A800_CARTRIDGE_ADD(_tag,_slot_intf,_def_slot) \ |
173 | 176 | MCFG_DEVICE_ADD(_tag, A800_CART_SLOT, 0) \ |
174 | 177 | MCFG_DEVICE_SLOT_INTERFACE(_slot_intf, _def_slot, false) |
r32448 | r32449 | |
---|---|---|
422 | 422 | if (offset >= 0x8000 && offset < 0xa000) |
423 | 423 | return m_ram[offset & 0x7ff]; |
424 | 424 | |
425 | return m_rom[offset % m_rom | |
425 | return m_rom[offset % m_rom_size]; | |
426 | 426 | } |
427 | 427 | |
428 | 428 | WRITE8_MEMBER(sega8_othello_device::write_cart) |
r32448 | r32449 | |
446 | 446 | if (offset >= 0x8000 && offset < 0xa000) |
447 | 447 | return m_ram[offset & 0x1fff]; |
448 | 448 | |
449 | return m_rom[offset % m_rom | |
449 | return m_rom[offset % m_rom_size]; | |
450 | 450 | } |
451 | 451 | |
452 | 452 | WRITE8_MEMBER(sega8_castle_device::write_cart) |
r32448 | r32449 | |
470 | 470 | if (offset >= 0x8000) |
471 | 471 | return m_ram[offset & 0x3fff]; |
472 | 472 | |
473 | return m_rom[offset % m_rom | |
473 | return m_rom[offset % m_rom_size]; | |
474 | 474 | } |
475 | 475 | |
476 | 476 | WRITE8_MEMBER(sega8_basic_l3_device::write_cart) |
r32448 | r32449 | |
504 | 504 | if (offset >= 0x8000 && offset < 0xa000) |
505 | 505 | return m_ram[offset & 0x1fff]; |
506 | 506 | |
507 | return m_rom[offset % m_rom | |
507 | return m_rom[offset % m_rom_size]; | |
508 | 508 | } |
509 | 509 | |
510 | 510 | WRITE8_MEMBER(sega8_music_editor_device::write_cart) |
r32448 | r32449 | |
623 | 623 | if (offset >= 0x2000 && offset < 0x4000) |
624 | 624 | return m_ram[offset & 0x1fff]; |
625 | 625 | |
626 | return m_rom[offset % m_rom | |
626 | return m_rom[offset % m_rom_size]; | |
627 | 627 | } |
628 | 628 | |
629 | 629 | WRITE8_MEMBER(sega8_dahjee_typea_device::write_cart) |
r32448 | r32449 | |
651 | 651 | // TYPE B |
652 | 652 | READ8_MEMBER(sega8_dahjee_typeb_device::read_cart) |
653 | 653 | { |
654 | return m_rom[offset % m_rom | |
654 | return m_rom[offset % m_rom_size]; | |
655 | 655 | } |
656 | 656 | |
657 | 657 | READ8_MEMBER(sega8_dahjee_typeb_device::read_ram) |
r32448 | r32449 | |
---|---|---|
49 | 49 | virtual DECLARE_READ8_MEMBER(read_ram) { return 0xff; } |
50 | 50 | virtual DECLARE_WRITE8_MEMBER(write_ram) {} |
51 | 51 | |
52 | void rom_alloc(UINT32 size); | |
52 | void rom_alloc(UINT32 size, const char *tag); | |
53 | 53 | void ram_alloc(UINT32 size); |
54 | 54 | |
55 | 55 | virtual void late_bank_setup() {} |
r32448 | r32449 | |
66 | 66 | //protected: |
67 | 67 | UINT8* get_rom_base() { return m_rom; } |
68 | 68 | UINT8* get_ram_base() { return m_ram; } |
69 | UINT32 get_rom_size() { return m_rom | |
69 | UINT32 get_rom_size() { return m_rom_size; } | |
70 | 70 | UINT32 get_ram_size() { return m_ram.count(); } |
71 | 71 | |
72 | 72 | void rom_map_setup(UINT32 size); |
r32448 | r32449 | |
76 | 76 | |
77 | 77 | //private: |
78 | 78 | // internal state |
79 | dynamic_buffer m_rom; | |
79 | UINT8 *m_rom; | |
80 | UINT32 m_rom_size; | |
80 | 81 | dynamic_buffer m_ram; |
81 | 82 | int m_rom_page_count; |
82 | 83 | |
r32448 | r32449 | |
171 | 172 | DEVICE CONFIGURATION MACROS |
172 | 173 | ***************************************************************************/ |
173 | 174 | |
175 | #define S8SLOT_ROM_REGION_TAG ":cart:rom" | |
176 | ||
177 | ||
174 | 178 | #define MCFG_SG1000_CARTRIDGE_ADD(_tag,_slot_intf,_def_slot) \ |
175 | 179 | MCFG_DEVICE_ADD(_tag, SEGA8_CART_SLOT, 0) \ |
176 | 180 | MCFG_DEVICE_SLOT_INTERFACE(_slot_intf, _def_slot, false) \ |
r32448 | r32449 | |
---|---|---|
49 | 49 | |
50 | 50 | device_sega8_cart_interface::device_sega8_cart_interface(const machine_config &mconfig, device_t &device) |
51 | 51 | : device_slot_card_interface(mconfig, device), |
52 | m_rom(NULL), | |
53 | m_rom_size(0), | |
52 | 54 | m_rom_page_count(0), |
53 | 55 | has_battery(FALSE), |
54 | 56 | m_late_battery_enable(FALSE), |
r32448 | r32449 | |
70 | 72 | // rom_alloc - alloc the space for the cart |
71 | 73 | //------------------------------------------------- |
72 | 74 | |
73 | void device_sega8_cart_interface::rom_alloc(UINT32 size) | |
75 | void device_sega8_cart_interface::rom_alloc(UINT32 size, const char *tag) | |
74 | 76 | { |
75 | m_rom.resize(size); | |
76 | m_rom_page_count = size / 0x4000; | |
77 | if (!m_rom_page_count) | |
78 | m_rom_page_count = 1; // we compute rom pages through (XXX % m_rom_page_count)! | |
79 | late_bank_setup(); | |
77 | if (m_rom == NULL) | |
78 | { | |
79 | astring tempstring(tag); | |
80 | tempstring.cat(S8SLOT_ROM_REGION_TAG); | |
81 | m_rom = device().machine().memory().region_alloc(tempstring, size, 1, ENDIANNESS_LITTLE)->base(); | |
82 | m_rom_size = size; | |
83 | m_rom_page_count = size / 0x4000; | |
84 | if (!m_rom_page_count) | |
85 | m_rom_page_count = 1; // we compute rom pages through (XXX % m_rom_page_count)! | |
86 | late_bank_setup(); | |
87 | } | |
80 | 88 | } |
81 | 89 | |
82 | 90 | |
r32448 | r32449 | |
353 | 361 | if (len & 0x3fff) |
354 | 362 | len = ((len >> 14) + 1) << 14; |
355 | 363 | |
356 | m_cart->rom_alloc(len); | |
364 | m_cart->rom_alloc(len, tag()); | |
357 | 365 | ROM = m_cart->get_rom_base(); |
358 | 366 | |
359 | 367 | if (software_entry() == NULL) |
r32448 | r32449 | |
---|---|---|
67 | 67 | //------------------------------------------------- |
68 | 68 | |
69 | 69 | device_sns_cart_interface::device_sns_cart_interface(const machine_config &mconfig, device_t &device) |
70 | : device_slot_card_interface(mconfig, device) | |
70 | : device_slot_card_interface(mconfig, device), | |
71 | m_rom(NULL), | |
72 | m_rom_size(0) | |
71 | 73 | { |
72 | 74 | } |
73 | 75 | |
r32448 | r32449 | |
84 | 86 | // rom_alloc - alloc the space for the cart |
85 | 87 | //------------------------------------------------- |
86 | 88 | |
87 | void device_sns_cart_interface::rom_alloc(UINT32 size) | |
89 | void device_sns_cart_interface::rom_alloc(UINT32 size, const char *tag) | |
88 | 90 | { |
89 | m_rom.resize(size); | |
91 | if (m_rom == NULL) | |
92 | { | |
93 | astring tempstring(tag); | |
94 | tempstring.cat(SNSSLOT_ROM_REGION_TAG); | |
95 | m_rom = device().machine().memory().region_alloc(tempstring, size, 1, ENDIANNESS_LITTLE)->base(); | |
96 | m_rom_size = size; | |
97 | } | |
90 | 98 | } |
91 | 99 | |
92 | 100 | |
r32448 | r32449 | |
612 | 620 | |
613 | 621 | len = (software_entry() == NULL) ? (length() - offset) : get_software_region_length("rom"); |
614 | 622 | |
615 | m_cart->rom_alloc(len); | |
623 | m_cart->rom_alloc(len, tag()); | |
616 | 624 | ROM = m_cart->get_rom_base(); |
617 | 625 | if (software_entry() == NULL) |
618 | 626 | fread(ROM, len); |
r32448 | r32449 | |
652 | 660 | // by installing read_bank in address space and mapping m_bios there |
653 | 661 | m_cart->speedup_addon_bios_access(); |
654 | 662 | |
655 | ||
656 | 663 | setup_nvram(); |
657 | 664 | |
658 | 665 | if (m_cart->get_nvram_size() || m_cart->get_rtc_ram_size()) |
r32448 | r32449 | |
---|---|---|
111 | 111 | virtual DECLARE_WRITE8_MEMBER(chip_write) {} |
112 | 112 | virtual void speedup_addon_bios_access() {}; |
113 | 113 | |
114 | void rom_alloc(UINT32 size); | |
114 | void rom_alloc(UINT32 size, const char *tag); | |
115 | 115 | void nvram_alloc(UINT32 size); |
116 | 116 | void rtc_ram_alloc(UINT32 size); |
117 | 117 | void addon_bios_alloc(UINT32 size); |
r32448 | r32449 | |
119 | 119 | UINT8* get_nvram_base() { return m_nvram; }; |
120 | 120 | UINT8* get_addon_bios_base() { return m_bios; }; |
121 | 121 | UINT8* get_rtc_ram_base() { return m_rtc_ram; }; |
122 | UINT32 get_rom_size() { return m_rom | |
122 | UINT32 get_rom_size() { return m_rom_size; }; | |
123 | 123 | UINT32 get_nvram_size() { return m_nvram.count(); }; |
124 | 124 | UINT32 get_addon_bios_size() { return m_bios.count(); }; |
125 | 125 | UINT32 get_rtc_ram_size() { return m_rtc_ram.count(); }; |
r32448 | r32449 | |
129 | 129 | void save_rtc_ram() { device().save_item(NAME(m_rtc_ram)); } |
130 | 130 | |
131 | 131 | // internal state |
132 | dynamic_buffer m_rom; | |
132 | UINT8 *m_rom; | |
133 | UINT32 m_rom_size; | |
133 | 134 | dynamic_buffer m_nvram; |
134 | 135 | dynamic_buffer m_bios; |
135 | 136 | dynamic_buffer m_rtc_ram; // temp pointer to save RTC ram to nvram (will disappear when RTCs become devices) |
r32448 | r32449 | |
252 | 253 | DEVICE CONFIGURATION MACROS |
253 | 254 | ***************************************************************************/ |
254 | 255 | |
256 | #define SNSSLOT_ROM_REGION_TAG ":cart:rom" | |
257 | ||
258 | ||
255 | 259 | #define MCFG_SNS_CARTRIDGE_ADD(_tag,_slot_intf,_def_slot) \ |
256 | 260 | MCFG_DEVICE_ADD(_tag, SNS_CART_SLOT, 0) \ |
257 | 261 | MCFG_DEVICE_SLOT_INTERFACE(_slot_intf, _def_slot, false) |
r32448 | r32449 | |
---|---|---|
86 | 86 | if (m_rom == NULL) |
87 | 87 | { |
88 | 88 | astring tempstring(tag); |
89 | tempstring.cat(MDSLOT_ROM_REGION_TAG); | |
89 | 90 | m_rom = (UINT16 *)device().machine().memory().region_alloc(tempstring, size, 2, ENDIANNESS_LITTLE)->base(); |
90 | 91 | m_rom_size = size; |
91 | 92 | } |
r32448 | r32449 | |
369 | 370 | // if cart size is not (2^n * 64K), the system will see anyway that size so we need to alloc a bit more space |
370 | 371 | length = m_cart->get_padded_size(length); |
371 | 372 | |
372 | astring cart_string(tag()); | |
373 | cart_string.cat(":cart:rom"); | |
374 | m_cart->rom_alloc(length, cart_string.cstr()); | |
373 | m_cart->rom_alloc(length, tag()); | |
375 | 374 | ROM = m_cart->get_rom_base(); |
376 | 375 | memcpy((UINT8 *)ROM, get_software_region("rom"), get_software_region_length("rom")); |
377 | 376 | |
r32448 | r32449 | |
482 | 481 | // STEP 2: allocate space for the real copy of the game |
483 | 482 | // if cart size is not (2^n * 64K), the system will see anyway that size so we need to alloc a bit more space |
484 | 483 | len = m_cart->get_padded_size(tmplen - offset); |
484 | ||
485 | 485 | // this contains an hack for SSF2: its current bankswitch code needs larger rom space to work |
486 | astring cart_string(tag()); | |
487 | cart_string.cat(":cart:rom"); | |
488 | m_cart->rom_alloc((len == 0x500000) ? 0x900000 : len, cart_string.cstr()); | |
486 | m_cart->rom_alloc((len == 0x500000) ? 0x900000 : len, tag()); | |
489 | 487 | |
490 | ||
491 | 488 | // STEP 3: copy the game data in the appropriate way |
492 | 489 | ROM = (unsigned char *)m_cart->get_rom_base(); |
493 | 490 |
r32448 | r32449 | |
---|---|---|
237 | 237 | DEVICE CONFIGURATION MACROS |
238 | 238 | ***************************************************************************/ |
239 | 239 | |
240 | #define MDSLOT_ROM_REGION_TAG ":cart:rom" | |
241 | ||
240 | 242 | #define MCFG_MD_CARTRIDGE_ADD(_tag,_slot_intf,_def_slot) \ |
241 | 243 | MCFG_DEVICE_ADD(_tag, MD_CART_SLOT, 0) \ |
242 | 244 | MCFG_DEVICE_SLOT_INTERFACE(_slot_intf, _def_slot, false) |
r32448 | r32449 | |
---|---|---|
677 | 677 | } |
678 | 678 | else if (offset < 0x4000) |
679 | 679 | { |
680 | m_reg = data & ((m_rom | |
680 | m_reg = data & ((m_rom_size / 0x4000) - 1); | |
681 | 681 | m_bank = m_reg & m_bank_mask; |
682 | 682 | if (m_bank == 0) |
683 | 683 | m_bank = 1; |
r32448 | r32449 | |
---|---|---|
36 | 36 | |
37 | 37 | device_gb_cart_interface::device_gb_cart_interface(const machine_config &mconfig, device_t &device) |
38 | 38 | : device_slot_card_interface(mconfig, device), |
39 | m_rom(NULL), | |
40 | m_rom_size(0), | |
39 | 41 | has_rumble(false), |
40 | 42 | has_timer(false), |
41 | 43 | has_battery(false) |
r32448 | r32449 | |
55 | 57 | // rom_alloc - alloc the space for the cart |
56 | 58 | //------------------------------------------------- |
57 | 59 | |
58 | void device_gb_cart_interface::rom_alloc(UINT32 size) | |
60 | void device_gb_cart_interface::rom_alloc(UINT32 size, const char *tag) | |
59 | 61 | { |
60 | m_rom.resize(size); | |
62 | if (m_rom == NULL) | |
63 | { | |
64 | astring tempstring(tag); | |
65 | tempstring.cat(GBSLOT_ROM_REGION_TAG); | |
66 | m_rom = device().machine().memory().region_alloc(tempstring, size, 1, ENDIANNESS_LITTLE)->base(); | |
67 | m_rom_size = size; | |
68 | } | |
61 | 69 | } |
62 | 70 | |
63 | 71 | |
r32448 | r32449 | |
274 | 282 | } |
275 | 283 | } |
276 | 284 | |
277 | m_cart->rom_alloc(len); | |
285 | m_cart->rom_alloc(len, tag()); | |
278 | 286 | ROM = m_cart->get_rom_base(); |
279 | 287 | |
280 | 288 | if (software_entry() == NULL) |
r32448 | r32449 | |
397 | 405 | if (m_cart) |
398 | 406 | { |
399 | 407 | UINT32 len = (software_entry() == NULL) ? length() : get_software_region_length("rom"); |
400 | UINT8 *ROM; | |
401 | 408 | |
402 | m_cart->rom_alloc(len); | |
403 | ROM = m_cart->get_rom_base(); | |
409 | m_cart->rom_alloc(len, tag()); | |
404 | 410 | |
405 | 411 | if (software_entry() == NULL) |
406 | fread( | |
412 | fread(m_cart->get_rom_base(), len); | |
407 | 413 | else |
408 | memcpy( | |
414 | memcpy(m_cart->get_rom_base(), get_software_region("rom"), len); | |
409 | 415 | |
410 | 416 | // setup rom bank map based on real length, not header value |
411 | 417 | m_cart->rom_map_setup(len); |
r32448 | r32449 | |
---|---|---|
56 | 56 | virtual DECLARE_READ8_MEMBER(read_ram) { return 0xff; } |
57 | 57 | virtual DECLARE_WRITE8_MEMBER(write_ram) {} |
58 | 58 | |
59 | void rom_alloc(UINT32 size); | |
59 | void rom_alloc(UINT32 size, const char *tag); | |
60 | 60 | void ram_alloc(UINT32 size); |
61 | 61 | UINT8* get_rom_base() { return m_rom; } |
62 | 62 | UINT8* get_ram_base() { return m_ram; } |
63 | UINT32 get_rom_size() { return m_rom | |
63 | UINT32 get_rom_size() { return m_rom_size; } | |
64 | 64 | UINT32 get_ram_size() { return m_ram.count(); } |
65 | 65 | |
66 | 66 | void rom_map_setup(UINT32 size); |
r32448 | r32449 | |
74 | 74 | void save_ram() { device().save_item(NAME(m_ram)); } |
75 | 75 | |
76 | 76 | // internal state |
77 | dynamic_buffer m_rom; | |
77 | UINT8 *m_rom; | |
78 | UINT32 m_rom_size; | |
78 | 79 | dynamic_buffer m_ram; |
79 | 80 | |
80 | 81 | // bankswitch variables |
r32448 | r32449 | |
190 | 191 | DEVICE CONFIGURATION MACROS |
191 | 192 | ***************************************************************************/ |
192 | 193 | |
194 | #define GBSLOT_ROM_REGION_TAG ":cart:rom" | |
195 | ||
193 | 196 | #define MCFG_GB_CARTRIDGE_ADD(_tag,_slot_intf,_def_slot) \ |
194 | 197 | MCFG_DEVICE_ADD(_tag, GB_CART_SLOT, 0) \ |
195 | 198 | MCFG_DEVICE_SLOT_INTERFACE(_slot_intf, _def_slot, false) |
r32448 | r32449 | |
---|---|---|
42 | 42 | |
43 | 43 | device_a78_cart_interface::device_a78_cart_interface (const machine_config &mconfig, device_t &device) |
44 | 44 | : device_slot_card_interface(mconfig, device), |
45 | m_rom(NULL), | |
46 | m_rom_size(0), | |
45 | 47 | m_base_rom(0x8000), |
46 | 48 | m_bank_mask(0) |
47 | 49 | { |
r32448 | r32449 | |
60 | 62 | // rom_alloc - alloc the space for the cart |
61 | 63 | //------------------------------------------------- |
62 | 64 | |
63 | void device_a78_cart_interface::rom_alloc(UINT32 size) | |
65 | void device_a78_cart_interface::rom_alloc(UINT32 size, const char *tag) | |
64 | 66 | { |
65 | m_rom.resize(size); | |
66 | ||
67 | // setup other helpers | |
68 | if ((size / 0x4000) & 1) // compensate for SuperGame carts with 9 x 16K banks (to my knowledge no other cart has m_bank_mask != power of 2) | |
69 | m_bank_mask = (size / 0x4000) - 2; | |
70 | else | |
71 | m_bank_mask = (size / 0x4000) - 1; | |
72 | ||
73 | // the rom is mapped to the top of the memory area | |
74 | // so we store the starting point of data to simplify | |
75 | // the access handling | |
76 | m_base_rom = 0x10000 - size; | |
67 | if (m_rom == NULL) | |
68 | { | |
69 | astring tempstring(tag); | |
70 | tempstring.cat(A78SLOT_ROM_REGION_TAG); | |
71 | m_rom = device().machine().memory().region_alloc(tempstring, size, 1, ENDIANNESS_LITTLE)->base(); | |
72 | m_rom_size = size; | |
73 | ||
74 | // setup other helpers | |
75 | if ((size / 0x4000) & 1) // compensate for SuperGame carts with 9 x 16K banks (to my knowledge no other cart has m_bank_mask != power of 2) | |
76 | m_bank_mask = (size / 0x4000) - 2; | |
77 | else | |
78 | m_bank_mask = (size / 0x4000) - 1; | |
79 | ||
80 | // the rom is mapped to the top of the memory area | |
81 | // so we store the starting point of data to simplify | |
82 | // the access handling | |
83 | m_base_rom = 0x10000 - size; | |
84 | } | |
77 | 85 | } |
78 | 86 | |
79 | 87 | //------------------------------------------------- |
r32448 | r32449 | |
340 | 348 | { |
341 | 349 | if (m_cart) |
342 | 350 | { |
343 | UINT8 *ROM; | |
344 | 351 | UINT32 len; |
345 | 352 | |
346 | 353 | if (software_entry() != NULL) |
r32448 | r32449 | |
350 | 357 | bool has_nvram = get_software_region("nvram") ? TRUE : FALSE; |
351 | 358 | len = get_software_region_length("rom"); |
352 | 359 | |
353 | m_cart->rom_alloc(len); | |
354 | ROM = m_cart->get_rom_base(); | |
355 | memcpy(ROM, get_software_region("rom"), len); | |
360 | m_cart->rom_alloc(len, tag()); | |
361 | memcpy(m_cart->get_rom_base(), get_software_region("rom"), len); | |
356 | 362 | |
357 | 363 | if ((pcb_name = get_feature("slot")) != NULL) |
358 | 364 | m_type = a78_get_pcb_id(pcb_name); |
r32448 | r32449 | |
447 | 453 | |
448 | 454 | internal_header_logging((UINT8 *)head, length()); |
449 | 455 | |
450 | m_cart->rom_alloc(len); | |
451 | ROM = m_cart->get_rom_base(); | |
452 | fread(ROM, len); | |
456 | m_cart->rom_alloc(len, tag()); | |
457 | fread(m_cart->get_rom_base(), len); | |
453 | 458 | |
454 | 459 | if (m_type == A78_TYPE6) |
455 | 460 | m_cart->ram_alloc(0x4000); |
r32448 | r32449 | |
---|---|---|
53 | 53 | virtual DECLARE_WRITE8_MEMBER(write_30xx) {} |
54 | 54 | virtual DECLARE_WRITE8_MEMBER(write_40xx) {} |
55 | 55 | |
56 | void rom_alloc(UINT32 size); | |
56 | void rom_alloc(UINT32 size, const char *tag); | |
57 | 57 | void ram_alloc(UINT32 size); |
58 | 58 | void nvram_alloc(UINT32 size); |
59 | 59 | UINT8* get_rom_base() { return m_rom; } |
60 | 60 | UINT8* get_ram_base() { return m_ram; } |
61 | 61 | UINT8* get_nvram_base() { return m_nvram; } |
62 | UINT32 get_rom_size() { return m_rom | |
62 | UINT32 get_rom_size() { return m_rom_size; } | |
63 | 63 | UINT32 get_ram_size() { return m_ram.bytes(); } |
64 | 64 | UINT32 get_nvram_size() { return m_nvram.bytes(); } |
65 | 65 | |
66 | 66 | protected: |
67 | 67 | // internal state |
68 | dynamic_buffer m_rom; | |
68 | UINT8 *m_rom; | |
69 | UINT32 m_rom_size; | |
69 | 70 | dynamic_buffer m_ram; |
70 | 71 | dynamic_buffer m_nvram; // HiScore cart can save scores! |
71 | 72 | // helpers |
r32448 | r32449 | |
144 | 145 | DEVICE CONFIGURATION MACROS |
145 | 146 | ***************************************************************************/ |
146 | 147 | |
148 | #define A78SLOT_ROM_REGION_TAG ":cart:rom" | |
149 | ||
147 | 150 | #define MCFG_A78_CARTRIDGE_ADD(_tag,_slot_intf,_def_slot) \ |
148 | 151 | MCFG_DEVICE_ADD(_tag, A78_CART_SLOT, 0) \ |
149 | 152 | MCFG_DEVICE_SLOT_INTERFACE(_slot_intf, _def_slot, false) |
r32448 | r32449 | |
---|---|---|
25 | 25 | //------------------------------------------------- |
26 | 26 | |
27 | 27 | device_pce_cart_interface::device_pce_cart_interface(const machine_config &mconfig, device_t &device) |
28 | : device_slot_card_interface(mconfig, device) | |
28 | : device_slot_card_interface(mconfig, device), | |
29 | m_rom(NULL), | |
30 | m_rom_size(0) | |
29 | 31 | { |
30 | 32 | } |
31 | 33 | |
r32448 | r32449 | |
42 | 44 | // rom_alloc - alloc the space for the cart |
43 | 45 | //------------------------------------------------- |
44 | 46 | |
45 | void device_pce_cart_interface::rom_alloc(UINT32 size) | |
47 | void device_pce_cart_interface::rom_alloc(UINT32 size, const char *tag) | |
46 | 48 | { |
47 | m_rom.resize(size); | |
49 | if (m_rom == NULL) | |
50 | { | |
51 | astring tempstring(tag); | |
52 | tempstring.cat(PCESLOT_ROM_REGION_TAG); | |
53 | m_rom = device().machine().memory().region_alloc(tempstring, size, 1, ENDIANNESS_LITTLE)->base(); | |
54 | m_rom_size = size; | |
55 | } | |
48 | 56 | } |
49 | 57 | |
50 | 58 | |
r32448 | r32449 | |
216 | 224 | fseek(offset, SEEK_SET); |
217 | 225 | } |
218 | 226 | |
219 | m_cart->rom_alloc(len); | |
227 | m_cart->rom_alloc(len, tag()); | |
220 | 228 | ROM = m_cart->get_rom_base(); |
221 | 229 | |
222 | 230 | if (software_entry() == NULL) |
r32448 | r32449 | |
---|---|---|
30 | 30 | virtual DECLARE_READ8_MEMBER(read_cart) { return 0xff; } |
31 | 31 | virtual DECLARE_WRITE8_MEMBER(write_cart) {}; |
32 | 32 | |
33 | void rom_alloc(UINT32 size); | |
33 | void rom_alloc(UINT32 size, const char *tag); | |
34 | 34 | void ram_alloc(UINT32 size); |
35 | 35 | UINT8* get_rom_base() { return m_rom; } |
36 | 36 | UINT8* get_ram_base() { return m_ram; } |
37 | UINT32 get_rom_size() { return m_rom | |
37 | UINT32 get_rom_size() { return m_rom_size; } | |
38 | 38 | UINT32 get_ram_size() { return m_ram.count(); } |
39 | 39 | |
40 | 40 | // internal state |
41 | dynamic_buffer m_rom; | |
41 | UINT8 *m_rom; | |
42 | UINT32 m_rom_size; | |
42 | 43 | dynamic_buffer m_ram; |
43 | 44 | |
44 | 45 | void rom_map_setup(UINT32 size); |
r32448 | r32449 | |
110 | 111 | DEVICE CONFIGURATION MACROS |
111 | 112 | ***************************************************************************/ |
112 | 113 | |
114 | #define PCESLOT_ROM_REGION_TAG ":cart:rom" | |
115 | ||
113 | 116 | #define MCFG_PCE_CARTRIDGE_ADD(_tag,_slot_intf,_def_slot) \ |
114 | 117 | MCFG_DEVICE_ADD(_tag, PCE_CART_SLOT, 0) \ |
115 | 118 | MCFG_DEVICE_SLOT_INTERFACE(_slot_intf, _def_slot, false) \ |
r32448 | r32449 | |
---|---|---|
49 | 49 | |
50 | 50 | READ32_MEMBER(saturn_rom_device::read_rom) |
51 | 51 | { |
52 | return m_rom[offset & (m_rom | |
52 | return m_rom[offset & (m_rom_size/4 - 1)]; | |
53 | 53 | } |
r32448 | r32449 | |
---|---|---|
29 | 29 | virtual int get_cart_type() { return m_cart_type; }; |
30 | 30 | |
31 | 31 | |
32 | void rom_alloc(UINT32 size); | |
32 | void rom_alloc(UINT32 size, const char *tag); | |
33 | 33 | UINT32* get_rom_base() { return m_rom; } |
34 | 34 | UINT32* get_ext_dram0_base() { return m_ext_dram0; } |
35 | 35 | UINT32* get_ext_dram1_base() { return m_ext_dram1; } |
36 | 36 | UINT8* get_ext_bram_base() { return m_ext_bram; } |
37 | UINT32 get_rom_size() { return m_rom | |
37 | UINT32 get_rom_size() { return m_rom_size; } | |
38 | 38 | UINT32 get_ext_dram0_size() { return m_ext_dram0.bytes(); } |
39 | 39 | UINT32 get_ext_dram1_size() { return m_ext_dram1.bytes(); } |
40 | 40 | UINT32 get_ext_bram_size() { return m_ext_bram.bytes(); } |
r32448 | r32449 | |
43 | 43 | int m_cart_type; |
44 | 44 | |
45 | 45 | // internal state |
46 | dynamic_array<UINT32> m_rom; | |
46 | UINT32 *m_rom; | |
47 | UINT32 m_rom_size; | |
47 | 48 | dynamic_array<UINT32> m_ext_dram0; |
48 | 49 | dynamic_array<UINT32> m_ext_dram1; |
49 | 50 | dynamic_buffer m_ext_bram; |
r32448 | r32449 | |
107 | 108 | DEVICE CONFIGURATION MACROS |
108 | 109 | ***************************************************************************/ |
109 | 110 | |
111 | #define SATSLOT_ROM_REGION_TAG ":cart:rom" | |
112 | ||
110 | 113 | #define MCFG_SATURN_CARTRIDGE_ADD(_tag,_slot_intf,_def_slot) \ |
111 | 114 | MCFG_DEVICE_ADD(_tag, SATURN_CART_SLOT, 0) \ |
112 | 115 | MCFG_DEVICE_SLOT_INTERFACE(_slot_intf, _def_slot, false) |
r32448 | r32449 | |
---|---|---|
35 | 35 | //------------------------------------------------- |
36 | 36 | |
37 | 37 | device_sat_cart_interface::device_sat_cart_interface(const machine_config &mconfig, device_t &device) |
38 | : device_slot_card_interface(mconfig, device) | |
38 | : device_slot_card_interface(mconfig, device), | |
39 | m_rom(NULL), | |
40 | m_rom_size(0) | |
39 | 41 | { |
40 | 42 | } |
41 | 43 | |
r32448 | r32449 | |
52 | 54 | // rom_alloc - alloc the space for the cart |
53 | 55 | //------------------------------------------------- |
54 | 56 | |
55 | void device_sat_cart_interface::rom_alloc(UINT32 size) | |
57 | void device_sat_cart_interface::rom_alloc(UINT32 size, const char *tag) | |
56 | 58 | { |
57 | m_rom.resize(size/sizeof(UINT32)); | |
59 | if (m_rom == NULL) | |
60 | { | |
61 | astring tempstring(tag); | |
62 | tempstring.cat(SATSLOT_ROM_REGION_TAG); | |
63 | m_rom = (UINT32 *)device().machine().memory().region_alloc(tempstring, size, 4, ENDIANNESS_LITTLE)->base(); | |
64 | m_rom_size = size; | |
65 | } | |
58 | 66 | } |
59 | 67 | |
60 | 68 | |
r32448 | r32449 | |
122 | 130 | else |
123 | 131 | len = length(); |
124 | 132 | |
125 | m_cart->rom_alloc(len); | |
133 | m_cart->rom_alloc(len, tag()); | |
126 | 134 | ROM = m_cart->get_rom_base(); |
127 | 135 | |
128 | 136 | if (software_entry() != NULL) |
r32448 | r32449 | |
---|---|---|
91 | 91 | else |
92 | 92 | { |
93 | 93 | UINT8 svp_test = 0; |
94 | if (m_slotcart) | |
95 | svp_test = m_slotcart->read_test(); | |
94 | if (m_cart) | |
95 | svp_test = m_cart->read_test(); | |
96 | 96 | |
97 | 97 | // handle test input for SVP test |
98 | 98 | if (portnum == 0 && svp_test) |
r32448 | r32449 | |
266 | 266 | |
267 | 267 | m_vdp->stop_timers(); |
268 | 268 | |
269 | if (m_slotcart) | |
270 | m_slotcart->save_nvram(); | |
269 | if (m_cart) | |
270 | m_cart->save_nvram(); | |
271 | 271 | } |
272 | 272 | |
273 | 273 | MACHINE_START_MEMBER(md_cons_state, ms_megadriv) |
r32448 | r32449 | |
275 | 275 | MACHINE_START_CALL_MEMBER( md_common ); |
276 | 276 | |
277 | 277 | // the SVP introduces some kind of DMA 'lag', which we have to compensate for, this is obvious even on gfx DMAd from ROM (the Speedometer) |
278 | if (m_ | |
278 | if (m_cart->get_type() == SEGA_SVP) | |
279 | 279 | m_vdp->set_dma_delay(2); |
280 | 280 | |
281 | 281 | // for now m_cartslot is only in MD and not 32x and SegaCD |
282 | m_maincpu->space(AS_PROGRAM).install_readwrite_handler(0x000000, 0x7fffff, read16_delegate(FUNC(base_md_cart_slot_device::read),(base_md_cart_slot_device*)m_slotcart), write16_delegate(FUNC(base_md_cart_slot_device::write),(base_md_cart_slot_device*)m_slotcart)); | |
283 | m_maincpu->space(AS_PROGRAM).install_readwrite_handler(0xa13000, 0xa130ff, read16_delegate(FUNC(base_md_cart_slot_device::read_a13),(base_md_cart_slot_device*)m_slotcart), write16_delegate(FUNC(base_md_cart_slot_device::write_a13),(base_md_cart_slot_device*)m_slotcart)); | |
284 | m_maincpu->space(AS_PROGRAM).install_readwrite_handler(0xa15000, 0xa150ff, read16_delegate(FUNC(base_md_cart_slot_device::read_a15),(base_md_cart_slot_device*)m_slotcart), write16_delegate(FUNC(base_md_cart_slot_device::write_a15),(base_md_cart_slot_device*)m_slotcart)); | |
285 | m_maincpu->space(AS_PROGRAM).install_write_handler(0xa14000, 0xa14003, write16_delegate(FUNC(base_md_cart_slot_device::write_tmss_bank),(base_md_cart_slot_device*)m_slotcart)); | |
282 | m_maincpu->space(AS_PROGRAM).install_readwrite_handler(0x000000, 0x7fffff, read16_delegate(FUNC(base_md_cart_slot_device::read),(base_md_cart_slot_device*)m_cart), write16_delegate(FUNC(base_md_cart_slot_device::write),(base_md_cart_slot_device*)m_cart)); | |
283 | m_maincpu->space(AS_PROGRAM).install_readwrite_handler(0xa13000, 0xa130ff, read16_delegate(FUNC(base_md_cart_slot_device::read_a13),(base_md_cart_slot_device*)m_cart), write16_delegate(FUNC(base_md_cart_slot_device::write_a13),(base_md_cart_slot_device*)m_cart)); | |
284 | m_maincpu->space(AS_PROGRAM).install_readwrite_handler(0xa15000, 0xa150ff, read16_delegate(FUNC(base_md_cart_slot_device::read_a15),(base_md_cart_slot_device*)m_cart), write16_delegate(FUNC(base_md_cart_slot_device::write_a15),(base_md_cart_slot_device*)m_cart)); | |
285 | m_maincpu->space(AS_PROGRAM).install_write_handler(0xa14000, 0xa14003, write16_delegate(FUNC(base_md_cart_slot_device::write_tmss_bank),(base_md_cart_slot_device*)m_cart)); | |
286 | 286 | } |
287 | 287 | |
288 | 288 | MACHINE_START_MEMBER(md_cons_state, ms_megacd) |
r32448 | r32449 | |
---|---|---|
32 | 32 | m_riot_ram(*this, "riot_ram"), |
33 | 33 | m_joy1(*this, CONTROL1_TAG), |
34 | 34 | m_joy2(*this, CONTROL2_TAG) , |
35 | m_cart | |
35 | m_cart(*this, "cartslot"), | |
36 | 36 | m_tia(*this, "tia_video"), |
37 | 37 | m_maincpu(*this, "maincpu"), |
38 | 38 | m_screen(*this, "screen") { } |
r32448 | r32449 | |
58 | 58 | protected: |
59 | 59 | required_device<vcs_control_port_device> m_joy1; |
60 | 60 | required_device<vcs_control_port_device> m_joy2; |
61 | required_device<vcs_cart_slot_device> m_cart | |
61 | required_device<vcs_cart_slot_device> m_cart; | |
62 | 62 | required_device<tia_video_device> m_tia; |
63 | 63 | |
64 | 64 | unsigned long detect_2600controllers(); |
r32448 | r32449 | |
236 | 236 | READ8_MEMBER(a2600_state::cart_over_riot_r) |
237 | 237 | { |
238 | 238 | if (!space.debugger_access()) |
239 | if (m_cartslot) | |
240 | m_cartslot->write_bank(space, offset, 0); | |
239 | m_cart->write_bank(space, offset, 0); | |
241 | 240 | return m_riot_ram[0x20 + offset]; |
242 | 241 | } |
243 | 242 | |
244 | 243 | WRITE8_MEMBER(a2600_state::cart_over_riot_w) |
245 | 244 | { |
246 | if (m_cartslot) | |
247 | m_cartslot->write_bank(space, offset, 0); | |
245 | m_cart->write_bank(space, offset, 0); | |
248 | 246 | m_riot_ram[0x20 + offset] = data; |
249 | 247 | |
250 | 248 | } |
r32448 | r32449 | |
252 | 250 | WRITE8_MEMBER(a2600_state::cart_over_tia_w) |
253 | 251 | { |
254 | 252 | // Both Cart & TIA see these addresses |
255 | if (m_cartslot) | |
256 | m_cartslot->write_bank(space, offset, data); | |
257 | ||
253 | m_cart->write_bank(space, offset, data); | |
258 | 254 | m_tia->write(space, offset, data); |
259 | 255 | } |
260 | 256 | |
r32448 | r32449 | |
263 | 259 | m_current_screen_height = m_screen->height(); |
264 | 260 | memset(m_riot_ram, 0x00, 0x80); |
265 | 261 | |
266 | switch (m_cart | |
262 | switch (m_cart->get_cart_type()) | |
267 | 263 | { |
268 | 264 | case A26_2K: |
269 | 265 | case A26_4K: |
r32448 | r32449 | |
277 | 273 | case A26_DC: |
278 | 274 | case A26_FV: |
279 | 275 | case A26_8IN1: |
280 | m_maincpu->space(AS_PROGRAM).install_readwrite_handler(0x1000, 0x1fff, read8_delegate(FUNC(vcs_cart_slot_device::read_rom),(vcs_cart_slot_device*)m_cart | |
276 | m_maincpu->space(AS_PROGRAM).install_readwrite_handler(0x1000, 0x1fff, read8_delegate(FUNC(vcs_cart_slot_device::read_rom),(vcs_cart_slot_device*)m_cart), write8_delegate(FUNC(vcs_cart_slot_device::write_bank),(vcs_cart_slot_device*)m_cart)); | |
281 | 277 | break; |
282 | 278 | case A26_F6: |
283 | 279 | case A26_DPC: |
284 | m_maincpu->space(AS_PROGRAM).install_readwrite_handler(0x1000, 0x1fff, read8_delegate(FUNC(vcs_cart_slot_device::read_rom),(vcs_cart_slot_device*)m_cartslot), write8_delegate(FUNC(vcs_cart_slot_device::write_bank),(vcs_cart_slot_device*)m_cartslot)); | |
285 | m_maincpu->space(AS_PROGRAM).set_direct_update_handler(direct_update_delegate(FUNC(vcs_cart_slot_device::cart_opbase),(vcs_cart_slot_device*)m_cartslot)); | |
280 | m_maincpu->space(AS_PROGRAM).install_readwrite_handler(0x1000, 0x1fff, read8_delegate(FUNC(vcs_cart_slot_device::read_rom),(vcs_cart_slot_device*)m_cart), write8_delegate(FUNC(vcs_cart_slot_device::write_bank),(vcs_cart_slot_device*)m_cart)); | |
281 | m_maincpu->space(AS_PROGRAM).set_direct_update_handler(direct_update_delegate(FUNC(vcs_cart_slot_device::cart_opbase),(vcs_cart_slot_device*)m_cart)); | |
286 | 282 | break; |
287 | 283 | case A26_FE: |
288 | m_maincpu->space(AS_PROGRAM).install_readwrite_handler(0x1000, 0x1fff, read8_delegate(FUNC(vcs_cart_slot_device::read_rom),(vcs_cart_slot_device*)m_cartslot), write8_delegate(FUNC(vcs_cart_slot_device::write_ram),(vcs_cart_slot_device*)m_cartslot)); | |
289 | m_maincpu->space(AS_PROGRAM).install_read_handler(0x01fe, 0x01ff, read8_delegate(FUNC(vcs_cart_slot_device::read_bank),(vcs_cart_slot_device*)m_cartslot)); | |
290 | m_maincpu->space(AS_PROGRAM).install_write_handler(0x01fe, 0x01fe, write8_delegate(FUNC(vcs_cart_slot_device::write_bank),(vcs_cart_slot_device*)m_cartslot)); | |
284 | m_maincpu->space(AS_PROGRAM).install_readwrite_handler(0x1000, 0x1fff, read8_delegate(FUNC(vcs_cart_slot_device::read_rom),(vcs_cart_slot_device*)m_cart), write8_delegate(FUNC(vcs_cart_slot_device::write_ram),(vcs_cart_slot_device*)m_cart)); | |
285 | m_maincpu->space(AS_PROGRAM).install_read_handler(0x01fe, 0x01ff, read8_delegate(FUNC(vcs_cart_slot_device::read_bank),(vcs_cart_slot_device*)m_cart)); | |
286 | m_maincpu->space(AS_PROGRAM).install_write_handler(0x01fe, 0x01fe, write8_delegate(FUNC(vcs_cart_slot_device::write_bank),(vcs_cart_slot_device*)m_cart)); | |
291 | 287 | break; |
292 | 288 | case A26_3E: |
293 | m_maincpu->space(AS_PROGRAM).install_readwrite_handler(0x1000, 0x1fff, read8_delegate(FUNC(vcs_cart_slot_device::read_rom),(vcs_cart_slot_device*)m_cart | |
289 | m_maincpu->space(AS_PROGRAM).install_readwrite_handler(0x1000, 0x1fff, read8_delegate(FUNC(vcs_cart_slot_device::read_rom),(vcs_cart_slot_device*)m_cart), write8_delegate(FUNC(vcs_cart_slot_device::write_ram),(vcs_cart_slot_device*)m_cart)); | |
294 | 290 | m_maincpu->space(AS_PROGRAM).install_write_handler(0x00, 0x3f, write8_delegate(FUNC(a2600_state::cart_over_tia_w), this)); |
295 | 291 | break; |
296 | 292 | case A26_3F: |
297 | m_maincpu->space(AS_PROGRAM).install_read_handler(0x1000, 0x1fff, read8_delegate(FUNC(vcs_cart_slot_device::read_rom),(vcs_cart_slot_device*)m_cart | |
293 | m_maincpu->space(AS_PROGRAM).install_read_handler(0x1000, 0x1fff, read8_delegate(FUNC(vcs_cart_slot_device::read_rom),(vcs_cart_slot_device*)m_cart)); | |
298 | 294 | m_maincpu->space(AS_PROGRAM).install_write_handler(0x00, 0x3f, write8_delegate(FUNC(a2600_state::cart_over_tia_w), this)); |
299 | 295 | break; |
300 | 296 | case A26_UA: |
301 | m_maincpu->space(AS_PROGRAM).install_read_handler(0x1000, 0x1fff, read8_delegate(FUNC(vcs_cart_slot_device::read_rom),(vcs_cart_slot_device*)m_cartslot)); | |
302 | m_maincpu->space(AS_PROGRAM).install_readwrite_handler(0x200, 0x27f, read8_delegate(FUNC(vcs_cart_slot_device::read_bank),(vcs_cart_slot_device*)m_cartslot), write8_delegate(FUNC(vcs_cart_slot_device::write_bank),(vcs_cart_slot_device*)m_cartslot)); | |
297 | m_maincpu->space(AS_PROGRAM).install_read_handler(0x1000, 0x1fff, read8_delegate(FUNC(vcs_cart_slot_device::read_rom),(vcs_cart_slot_device*)m_cart)); | |
298 | m_maincpu->space(AS_PROGRAM).install_readwrite_handler(0x200, 0x27f, read8_delegate(FUNC(vcs_cart_slot_device::read_bank),(vcs_cart_slot_device*)m_cart), write8_delegate(FUNC(vcs_cart_slot_device::write_bank),(vcs_cart_slot_device*)m_cart)); | |
303 | 299 | break; |
304 | 300 | case A26_JVP: |
305 | m_maincpu->space(AS_PROGRAM).install_readwrite_handler(0x1000, 0x1fff, read8_delegate(FUNC(vcs_cart_slot_device::read_rom),(vcs_cart_slot_device*)m_cart | |
301 | m_maincpu->space(AS_PROGRAM).install_readwrite_handler(0x1000, 0x1fff, read8_delegate(FUNC(vcs_cart_slot_device::read_rom),(vcs_cart_slot_device*)m_cart), write8_delegate(FUNC(vcs_cart_slot_device::write_bank),(vcs_cart_slot_device*)m_cart)); | |
306 | 302 | // to verify the actual behavior... |
307 | 303 | m_maincpu->space(AS_PROGRAM).install_readwrite_handler(0xfa0, 0xfc0, read8_delegate(FUNC(a2600_state::cart_over_riot_r), this), write8_delegate(FUNC(a2600_state::cart_over_riot_w), this)); |
308 | 304 | break; |
309 | 305 | case A26_4IN1: |
310 | 306 | case A26_32IN1: |
311 | m_maincpu->space(AS_PROGRAM).install_read_handler(0x1000, 0x1fff, read8_delegate(FUNC(vcs_cart_slot_device::read_rom),(vcs_cart_slot_device*)m_cart | |
307 | m_maincpu->space(AS_PROGRAM).install_read_handler(0x1000, 0x1fff, read8_delegate(FUNC(vcs_cart_slot_device::read_rom),(vcs_cart_slot_device*)m_cart)); | |
312 | 308 | break; |
313 | 309 | case A26_SS: |
314 | m_maincpu->space(AS_PROGRAM).install_read_handler(0x1000, 0x1fff, read8_delegate(FUNC(vcs_cart_slot_device::read_rom),(vcs_cart_slot_device*)m_cart | |
310 | m_maincpu->space(AS_PROGRAM).install_read_handler(0x1000, 0x1fff, read8_delegate(FUNC(vcs_cart_slot_device::read_rom),(vcs_cart_slot_device*)m_cart)); | |
315 | 311 | break; |
316 | 312 | case A26_CM: |
317 | m_maincpu->space(AS_PROGRAM).install_read_handler(0x1000, 0x1fff, read8_delegate(FUNC(vcs_cart_slot_device::read_rom),(vcs_cart_slot_device*)m_cart | |
313 | m_maincpu->space(AS_PROGRAM).install_read_handler(0x1000, 0x1fff, read8_delegate(FUNC(vcs_cart_slot_device::read_rom),(vcs_cart_slot_device*)m_cart)); | |
318 | 314 | break; |
319 | 315 | } |
320 | 316 |
r32448 | r32449 | |
---|---|---|
119 | 119 | m_io_buttons(*this, "buttons"), |
120 | 120 | m_io_vblank(*this, "vblank"), |
121 | 121 | m_io_console_buttons(*this, "console_buttons"), |
122 | m_cart | |
122 | m_cart(*this, "cartslot"), | |
123 | 123 | m_screen(*this, "screen") { } |
124 | 124 | |
125 | 125 | int m_lines; |
r32448 | r32449 | |
160 | 160 | required_ioport m_io_buttons; |
161 | 161 | required_ioport m_io_vblank; |
162 | 162 | required_ioport m_io_console_buttons; |
163 | required_device<a78_cart_slot_device> m_cart | |
163 | required_device<a78_cart_slot_device> m_cart; | |
164 | 164 | required_device<screen_device> m_screen; |
165 | 165 | }; |
166 | 166 | |
r32448 | r32449 | |
272 | 272 | if (!(m_ctrl_reg & 0x04)) |
273 | 273 | return m_bios[offset]; |
274 | 274 | else |
275 | return m_cart | |
275 | return m_cart->read_40xx(space, offset + 0x8000); | |
276 | 276 | } |
277 | 277 | |
278 | 278 | /*************************************************************************** |
r32448 | r32449 | |
1315 | 1315 | save_item(NAME(m_maria_flag)); |
1316 | 1316 | |
1317 | 1317 | // install additional handlers, if needed |
1318 | if (m_cartslot->exists()) | |
1319 | switch (m_cartslot->get_cart_type()) | |
1318 | if (m_cart->exists()) | |
1320 | 1319 | { |
1321 | case A78_HSC: | |
1322 | // ROM+NVRAM accesses for HiScore | |
1323 | m_maincpu->space(AS_PROGRAM).install_readwrite_handler(0x1000, 0x17ff, read8_delegate(FUNC(a78_cart_slot_device::read_10xx),(a78_cart_slot_device*)m_cartslot), write8_delegate(FUNC(a78_cart_slot_device::write_10xx),(a78_cart_slot_device*)m_cartslot)); | |
1324 | m_maincpu->space(AS_PROGRAM).install_readwrite_handler(0x3000, 0x3fff, read8_delegate(FUNC(a78_cart_slot_device::read_30xx),(a78_cart_slot_device*)m_cartslot), write8_delegate(FUNC(a78_cart_slot_device::write_30xx),(a78_cart_slot_device*)m_cartslot)); | |
1325 | break; | |
1326 | case A78_XB_BOARD: | |
1327 | case A78_TYPE0_POK450: | |
1328 | case A78_TYPE1_POK450: | |
1329 | case A78_TYPE6_POK450: | |
1330 | case A78_TYPEA_POK450: | |
1331 | case A78_VERSA_POK450: | |
1332 | // POKEY and RAM regs at 0x400-0x47f | |
1333 | m_maincpu->space(AS_PROGRAM).install_readwrite_handler(0x0400, 0x047f, read8_delegate(FUNC(a78_cart_slot_device::read_04xx),(a78_cart_slot_device*)m_cartslot), write8_delegate(FUNC(a78_cart_slot_device::write_04xx),(a78_cart_slot_device*)m_cartslot)); | |
1334 | break; | |
1335 | case A78_XM_BOARD: | |
1336 | // POKEY and RAM and YM regs at 0x400-0x47f | |
1337 | m_maincpu->space(AS_PROGRAM).install_readwrite_handler(0x0400, 0x047f, read8_delegate(FUNC(a78_cart_slot_device::read_04xx),(a78_cart_slot_device*)m_cartslot), write8_delegate(FUNC(a78_cart_slot_device::write_04xx),(a78_cart_slot_device*)m_cartslot)); | |
1338 | // ROM+NVRAM accesses for HiScore | |
1339 | m_maincpu->space(AS_PROGRAM).install_readwrite_handler(0x1000, 0x17ff, read8_delegate(FUNC(a78_cart_slot_device::read_10xx),(a78_cart_slot_device*)m_cartslot), write8_delegate(FUNC(a78_cart_slot_device::write_10xx),(a78_cart_slot_device*)m_cartslot)); | |
1340 | m_maincpu->space(AS_PROGRAM).install_readwrite_handler(0x3000, 0x3fff, read8_delegate(FUNC(a78_cart_slot_device::read_30xx),(a78_cart_slot_device*)m_cartslot), write8_delegate(FUNC(a78_cart_slot_device::write_30xx),(a78_cart_slot_device*)m_cartslot)); | |
1341 | break; | |
1320 | switch (m_cart->get_cart_type()) | |
1321 | { | |
1322 | case A78_HSC: | |
1323 | // ROM+NVRAM accesses for HiScore | |
1324 | m_maincpu->space(AS_PROGRAM).install_readwrite_handler(0x1000, 0x17ff, read8_delegate(FUNC(a78_cart_slot_device::read_10xx),(a78_cart_slot_device*)m_cart), write8_delegate(FUNC(a78_cart_slot_device::write_10xx),(a78_cart_slot_device*)m_cart)); | |
1325 | m_maincpu->space(AS_PROGRAM).install_readwrite_handler(0x3000, 0x3fff, read8_delegate(FUNC(a78_cart_slot_device::read_30xx),(a78_cart_slot_device*)m_cart), write8_delegate(FUNC(a78_cart_slot_device::write_30xx),(a78_cart_slot_device*)m_cart)); | |
1326 | break; | |
1327 | case A78_XB_BOARD: | |
1328 | case A78_TYPE0_POK450: | |
1329 | case A78_TYPE1_POK450: | |
1330 | case A78_TYPE6_POK450: | |
1331 | case A78_TYPEA_POK450: | |
1332 | case A78_VERSA_POK450: | |
1333 | // POKEY and RAM regs at 0x400-0x47f | |
1334 | m_maincpu->space(AS_PROGRAM).install_readwrite_handler(0x0400, 0x047f, read8_delegate(FUNC(a78_cart_slot_device::read_04xx),(a78_cart_slot_device*)m_cart), write8_delegate(FUNC(a78_cart_slot_device::write_04xx),(a78_cart_slot_device*)m_cart)); | |
1335 | break; | |
1336 | case A78_XM_BOARD: | |
1337 | // POKEY and RAM and YM regs at 0x400-0x47f | |
1338 | m_maincpu->space(AS_PROGRAM).install_readwrite_handler(0x0400, 0x047f, read8_delegate(FUNC(a78_cart_slot_device::read_04xx),(a78_cart_slot_device*)m_cart), write8_delegate(FUNC(a78_cart_slot_device::write_04xx),(a78_cart_slot_device*)m_cart)); | |
1339 | // ROM+NVRAM accesses for HiScore | |
1340 | m_maincpu->space(AS_PROGRAM).install_readwrite_handler(0x1000, 0x17ff, read8_delegate(FUNC(a78_cart_slot_device::read_10xx),(a78_cart_slot_device*)m_cart), write8_delegate(FUNC(a78_cart_slot_device::write_10xx),(a78_cart_slot_device*)m_cart)); | |
1341 | m_maincpu->space(AS_PROGRAM).install_readwrite_handler(0x3000, 0x3fff, read8_delegate(FUNC(a78_cart_slot_device::read_30xx),(a78_cart_slot_device*)m_cart), write8_delegate(FUNC(a78_cart_slot_device::write_30xx),(a78_cart_slot_device*)m_cart)); | |
1342 | break; | |
1343 | } | |
1342 | 1344 | } |
1343 | 1345 | } |
1344 | 1346 |
r32448 | r32449 | |
---|---|---|
2118 | 2118 | m_irq_timer = machine().scheduler().timer_alloc(timer_expired_delegate(FUNC(gba_state::handle_irq),this)); |
2119 | 2119 | m_irq_timer->adjust(attotime::never); |
2120 | 2120 | |
2121 | // install the cart ROM into the address map, if present | |
2122 | m_cartslot->install_rom(); | |
2121 | // install the cart ROM & SRAM into the address map, if present | |
2122 | if (m_cart->exists()) | |
2123 | { | |
2124 | address_space &space = machine().device<cpu_device>("maincpu")->space(AS_PROGRAM); | |
2125 | space.install_read_bank(0x08000000, 0x09ffffff, 0, 0, "rom1"); | |
2126 | space.install_read_bank(0x0a000000, 0x0bffffff, 0, 0, "rom2"); | |
2127 | space.install_read_bank(0x0c000000, 0x0cffffff, 0, 0, "rom3"); | |
2123 | 2128 | |
2124 | // add nvram to save state | |
2125 | m_cartslot->save_nvram(); | |
2129 | astring region_tag; | |
2130 | memory_region *cart_rom = memregion(region_tag.cpy(m_cart->tag()).cat(GBASLOT_ROM_REGION_TAG)); | |
2126 | 2131 | |
2127 | // install the cart NVRAM handlers if necessary | |
2128 | if (m_cartslot->get_type() == GBA_SRAM) | |
2129 | { | |
2130 | m_maincpu->space(AS_PROGRAM).install_read_handler(0xe000000, 0xe00ffff, read32_delegate(FUNC(gba_cart_slot_device::read_ram),(gba_cart_slot_device*)m_cartslot)); | |
2131 | m_maincpu->space(AS_PROGRAM).install_write_handler(0xe000000, 0xe00ffff, write32_delegate(FUNC(gba_cart_slot_device::write_ram),(gba_cart_slot_device*)m_cartslot)); | |
2132 | // install ROM accesses | |
2133 | membank("rom1")->set_base(cart_rom->base()); | |
2134 | membank("rom2")->set_base(cart_rom->base()); | |
2135 | membank("rom3")->set_base(cart_rom->base()); | |
2136 | ||
2137 | // add nvram to save state | |
2138 | m_cart->save_nvram(); | |
2139 | ||
2140 | // install the cart NVRAM handlers if necessary | |
2141 | if (m_cart->get_type() == GBA_SRAM) | |
2142 | { | |
2143 | m_maincpu->space(AS_PROGRAM).install_read_handler(0xe000000, 0xe00ffff, read32_delegate(FUNC(gba_cart_slot_device::read_ram),(gba_cart_slot_device*)m_cart)); | |
2144 | m_maincpu->space(AS_PROGRAM).install_write_handler(0xe000000, 0xe00ffff, write32_delegate(FUNC(gba_cart_slot_device::write_ram),(gba_cart_slot_device*)m_cart)); | |
2145 | } | |
2146 | if (m_cart->get_type() == GBA_EEPROM || m_cart->get_type() == GBA_EEPROM4 || m_cart->get_type() == GBA_EEPROM64) | |
2147 | { | |
2148 | // for games larger than 16MB the actual range is smaller but read_ram/write_ram handles that! | |
2149 | m_maincpu->space(AS_PROGRAM).install_read_handler(0xd000000, 0xdffffff, read32_delegate(FUNC(gba_cart_slot_device::read_ram),(gba_cart_slot_device*)m_cart)); | |
2150 | m_maincpu->space(AS_PROGRAM).install_write_handler(0xd000000, 0xdffffff, write32_delegate(FUNC(gba_cart_slot_device::write_ram),(gba_cart_slot_device*)m_cart)); | |
2151 | } | |
2152 | // merge the two flash and mask accesses in read_ram?!? | |
2153 | if (m_cart->get_type() == GBA_FLASH || m_cart->get_type() == GBA_FLASH512) | |
2154 | { | |
2155 | m_maincpu->space(AS_PROGRAM).install_read_handler(0xe000000, 0xe00ffff, read32_delegate(FUNC(gba_cart_slot_device::read_ram),(gba_cart_slot_device*)m_cart)); | |
2156 | m_maincpu->space(AS_PROGRAM).install_write_handler(0xe000000, 0xe00ffff, write32_delegate(FUNC(gba_cart_slot_device::write_ram),(gba_cart_slot_device*)m_cart)); | |
2157 | } | |
2158 | if (m_cart->get_type() == GBA_FLASH1M) | |
2159 | { | |
2160 | m_maincpu->space(AS_PROGRAM).install_read_handler(0xe000000, 0xe01ffff, read32_delegate(FUNC(gba_cart_slot_device::read_ram),(gba_cart_slot_device*)m_cart)); | |
2161 | m_maincpu->space(AS_PROGRAM).install_write_handler(0xe000000, 0xe01ffff, write32_delegate(FUNC(gba_cart_slot_device::write_ram),(gba_cart_slot_device*)m_cart)); | |
2162 | } | |
2132 | 2163 | } |
2133 | if (m_cartslot->get_type() == GBA_EEPROM || m_cartslot->get_type() == GBA_EEPROM4 || m_cartslot->get_type() == GBA_EEPROM64) | |
2134 | { | |
2135 | // for games larger than 16MB the actual range is smaller but read_ram/write_ram handles that! | |
2136 | m_maincpu->space(AS_PROGRAM).install_read_handler(0xd000000, 0xdffffff, read32_delegate(FUNC(gba_cart_slot_device::read_ram),(gba_cart_slot_device*)m_cartslot)); | |
2137 | m_maincpu->space(AS_PROGRAM).install_write_handler(0xd000000, 0xdffffff, write32_delegate(FUNC(gba_cart_slot_device::write_ram),(gba_cart_slot_device*)m_cartslot)); | |
2138 | } | |
2139 | // merge the two flash and mask accesses in read_ram?!? | |
2140 | if (m_cartslot->get_type() == GBA_FLASH || m_cartslot->get_type() == GBA_FLASH512) | |
2141 | { | |
2142 | m_maincpu->space(AS_PROGRAM).install_read_handler(0xe000000, 0xe00ffff, read32_delegate(FUNC(gba_cart_slot_device::read_ram),(gba_cart_slot_device*)m_cartslot)); | |
2143 | m_maincpu->space(AS_PROGRAM).install_write_handler(0xe000000, 0xe00ffff, write32_delegate(FUNC(gba_cart_slot_device::write_ram),(gba_cart_slot_device*)m_cartslot)); | |
2144 | } | |
2145 | if (m_cartslot->get_type() == GBA_FLASH1M) | |
2146 | { | |
2147 | m_maincpu->space(AS_PROGRAM).install_read_handler(0xe000000, 0xe01ffff, read32_delegate(FUNC(gba_cart_slot_device::read_ram),(gba_cart_slot_device*)m_cartslot)); | |
2148 | m_maincpu->space(AS_PROGRAM).install_write_handler(0xe000000, 0xe01ffff, write32_delegate(FUNC(gba_cart_slot_device::write_ram),(gba_cart_slot_device*)m_cartslot)); | |
2149 | } | |
2150 | 2164 | |
2151 | 2165 | save_item(NAME(m_DISPSTAT)); |
2152 | 2166 | save_item(NAME(m_BG2X)); |
r32448 | r32449 | |
---|---|---|
251 | 251 | m_0000(*this, "0000"), |
252 | 252 | m_8000(*this, "8000"), |
253 | 253 | m_a000(*this, "a000"), |
254 | m_cartslot(*this, "cartleft"), | |
255 | m_cartslot2(*this, "cartright") { } | |
254 | m_cart(*this, "cartleft"), | |
255 | m_cart2(*this, "cartright") { } | |
256 | 256 | |
257 | 257 | DECLARE_MACHINE_START(a400); |
258 | 258 | DECLARE_MACHINE_START(a800); |
r32448 | r32449 | |
296 | 296 | optional_memory_bank m_0000; |
297 | 297 | optional_memory_bank m_8000; |
298 | 298 | optional_memory_bank m_a000; |
299 | optional_device<a800_cart_slot_device> m_cartslot; | |
300 | optional_device<a800_cart_slot_device> m_cartslot2; | |
299 | optional_device<a800_cart_slot_device> m_cart; | |
300 | optional_device<a800_cart_slot_device> m_cart2; | |
301 | 301 | |
302 | 302 | int m_cart_disabled; |
303 | 303 | int m_last_offs; |
r32448 | r32449 | |
1735 | 1735 | |
1736 | 1736 | WRITE8_MEMBER(a400_state::disable_cart) |
1737 | 1737 | { |
1738 | if (m_cartslot->exists()) | |
1739 | switch (m_cartslot->get_cart_type()) | |
1738 | if (m_cart->exists()) | |
1740 | 1739 | { |
1741 | case A800_PHOENIX: | |
1742 | case A800_BLIZZARD: | |
1743 | if (!m_cart_disabled) | |
1744 | { | |
1745 | m_cart_disabled = 1; | |
1746 | setup_ram(2, m_ram->size()); | |
1747 | } | |
1748 | break; | |
1749 | case A800_OSS034M: | |
1750 | case A800_OSS043M: | |
1751 | case A800_EXPRESS: | |
1752 | case A800_DIAMOND: | |
1753 | case A800_WILLIAMS: | |
1754 | // use m_cart_disabled & m_last_offs to avoid continuous remapping of | |
1755 | // the memory space in some games (e.g. dropzone) | |
1756 | if (offset & 0x8 && !m_cart_disabled) | |
1757 | { | |
1758 | m_cart_disabled = 1; | |
1759 | setup_ram(2, m_ram->size()); | |
1760 | } | |
1761 | else if (!(offset & 0x8)) | |
1762 | { | |
1763 | if (m_cart_disabled) | |
1740 | switch (m_cart->get_cart_type()) | |
1741 | { | |
1742 | case A800_PHOENIX: | |
1743 | case A800_BLIZZARD: | |
1744 | if (!m_cart_disabled) | |
1764 | 1745 | { |
1765 | m_cart_disabled = 0; | |
1766 | m_maincpu->space(AS_PROGRAM).install_read_handler(0xa000, 0xbfff, read8_delegate(FUNC(a800_cart_slot_device::read_80xx),(a800_cart_slot_device*)m_cartslot)); | |
1767 | m_maincpu->space(AS_PROGRAM).unmap_write(0xa000, 0xbfff); | |
1746 | m_cart_disabled = 1; | |
1747 | setup_ram(2, m_ram->size()); | |
1768 | 1748 | } |
1769 | ||
1770 | if ((offset & 0x7) != m_last_offs) | |
1749 | break; | |
1750 | case A800_OSS034M: | |
1751 | case A800_OSS043M: | |
1752 | case A800_EXPRESS: | |
1753 | case A800_DIAMOND: | |
1754 | case A800_WILLIAMS: | |
1755 | // use m_cart_disabled & m_last_offs to avoid continuous remapping of | |
1756 | // the memory space in some games (e.g. dropzone) | |
1757 | if (offset & 0x8 && !m_cart_disabled) | |
1771 | 1758 | { |
1772 | // we enter here only if we are writing to a different offset than last time | |
1773 | m_last_offs = offset & 0x7; | |
1774 | m_cartslot->write_d5xx(space, offset, data); | |
1759 | m_cart_disabled = 1; | |
1760 | setup_ram(2, m_ram->size()); | |
1775 | 1761 | } |
1776 | } | |
1777 | break; | |
1778 | case A800_TURBO64: | |
1779 | case A800_TURBO128: | |
1780 | if (offset & 0x10 && !m_cart_disabled) | |
1781 | { | |
1782 | m_cart_disabled = 1; | |
1783 | setup_ram(2, m_ram->size()); | |
1784 | } | |
1785 | else if (!(offset & 0x10)) | |
1786 | { | |
1787 | if (m_cart_disabled) | |
1762 | else if (!(offset & 0x8)) | |
1788 | 1763 | { |
1789 | m_cart_disabled = 0; | |
1790 | m_maincpu->space(AS_PROGRAM).install_read_handler(0xa000, 0xbfff, read8_delegate(FUNC(a800_cart_slot_device::read_80xx),(a800_cart_slot_device*)m_cartslot)); | |
1764 | if (m_cart_disabled) | |
1765 | { | |
1766 | m_cart_disabled = 0; | |
1767 | m_maincpu->space(AS_PROGRAM).install_read_handler(0xa000, 0xbfff, read8_delegate(FUNC(a800_cart_slot_device::read_80xx),(a800_cart_slot_device*)m_cart)); | |
1768 | m_maincpu->space(AS_PROGRAM).unmap_write(0xa000, 0xbfff); | |
1769 | } | |
1770 | ||
1771 | if ((offset & 0x7) != m_last_offs) | |
1772 | { | |
1773 | // we enter here only if we are writing to a different offset than last time | |
1774 | m_last_offs = offset & 0x7; | |
1775 | m_cart->write_d5xx(space, offset, data); | |
1776 | } | |
1777 | } | |
1778 | break; | |
1779 | case A800_TURBO64: | |
1780 | case A800_TURBO128: | |
1781 | if (offset & 0x10 && !m_cart_disabled) | |
1782 | { | |
1783 | m_cart_disabled = 1; | |
1784 | setup_ram(2, m_ram->size()); | |
1785 | } | |
1786 | else if (!(offset & 0x10)) | |
1787 | { | |
1788 | if (m_cart_disabled) | |
1789 | { | |
1790 | m_cart_disabled = 0; | |
1791 | m_maincpu->space(AS_PROGRAM).install_read_handler(0xa000, 0xbfff, read8_delegate(FUNC(a800_cart_slot_device::read_80xx),(a800_cart_slot_device*)m_cart)); | |
1792 | m_maincpu->space(AS_PROGRAM).unmap_write(0xa000, 0xbfff); | |
1793 | } | |
1794 | ||
1795 | if ((offset & 0x0f) != m_last_offs) | |
1796 | { | |
1797 | // we enter here only if we are writing to a different offset than last time | |
1798 | m_last_offs = offset & 0x0f; | |
1799 | m_cart->write_d5xx(space, offset & 0x0f, data); | |
1800 | } | |
1801 | } | |
1802 | break; | |
1803 | case A800_SPARTADOS: | |
1804 | // writes with offset & 8 are also used to enable/disable the subcart, so they go through! | |
1805 | m_cart->write_d5xx(space, offset, data); | |
1806 | break; | |
1807 | case A800_OSSM091: | |
1808 | case A800_OSS8K: | |
1809 | if ((offset & 0x9) == 0x08) | |
1810 | setup_ram(2, m_ram->size()); | |
1811 | else | |
1812 | { | |
1813 | m_maincpu->space(AS_PROGRAM).install_read_handler(0xa000, 0xbfff, read8_delegate(FUNC(a800_cart_slot_device::read_80xx),(a800_cart_slot_device*)m_cart)); | |
1791 | 1814 | m_maincpu->space(AS_PROGRAM).unmap_write(0xa000, 0xbfff); |
1815 | m_cart->write_d5xx(space, offset, data); | |
1792 | 1816 | } |
1793 | ||
1794 | if ((offset & 0x0f) != m_last_offs) | |
1817 | break; | |
1818 | case A800_MICROCALC: | |
1819 | m_cart_disabled = (m_cart_disabled + 1) % 5; | |
1820 | if (m_cart_disabled == 4) | |
1821 | setup_ram(2, m_ram->size()); | |
1822 | else | |
1795 | 1823 | { |
1796 | // we enter here only if we are writing to a different offset than last time | |
1797 | m_last_offs = offset & 0x0f; | |
1798 | m_cartslot->write_d5xx(space, offset & 0x0f, data); | |
1824 | m_maincpu->space(AS_PROGRAM).install_read_handler(0xa000, 0xbfff, read8_delegate(FUNC(a800_cart_slot_device::read_80xx),(a800_cart_slot_device*)m_cart)); | |
1825 | m_maincpu->space(AS_PROGRAM).unmap_write(0xa000, 0xbfff); | |
1826 | m_cart->write_d5xx(space, offset, m_cart_disabled); | |
1799 | 1827 | } |
1800 | } | |
1801 | break; | |
1802 | case A800_SPARTADOS: | |
1803 | // writes with offset & 8 are also used to enable/disable the subcart, so they go through! | |
1804 | m_cartslot->write_d5xx(space, offset, data); | |
1805 | break; | |
1806 | case A800_OSSM091: | |
1807 | case A800_OSS8K: | |
1808 | if ((offset & 0x9) == 0x08) | |
1809 | setup_ram(2, m_ram->size()); | |
1810 | else | |
1811 | { | |
1812 | m_maincpu->space(AS_PROGRAM).install_read_handler(0xa000, 0xbfff, read8_delegate(FUNC(a800_cart_slot_device::read_80xx),(a800_cart_slot_device*)m_cartslot)); | |
1813 | m_maincpu->space(AS_PROGRAM).unmap_write(0xa000, 0xbfff); | |
1814 | m_cartslot->write_d5xx(space, offset, data); | |
1815 | } | |
1816 | break; | |
1817 | case A800_MICROCALC: | |
1818 | m_cart_disabled = (m_cart_disabled + 1) % 5; | |
1819 | if (m_cart_disabled == 4) | |
1820 | setup_ram(2, m_ram->size()); | |
1821 | else | |
1822 | { | |
1823 | m_maincpu->space(AS_PROGRAM).install_read_handler(0xa000, 0xbfff, read8_delegate(FUNC(a800_cart_slot_device::read_80xx),(a800_cart_slot_device*)m_cartslot)); | |
1824 | m_maincpu->space(AS_PROGRAM).unmap_write(0xa000, 0xbfff); | |
1825 | m_cartslot->write_d5xx(space, offset, m_cart_disabled); | |
1826 | } | |
1827 | break; | |
1828 | default: | |
1829 | break; | |
1830 | } | |
1828 | break; | |
1829 | default: | |
1830 | break; | |
1831 | } | |
1832 | } | |
1831 | 1833 | } |
1832 | 1834 | |
1833 | 1835 | void a400_state::setup_cart(a800_cart_slot_device *slot) |
r32448 | r32449 | |
1836 | 1838 | m_last_offs = -1; |
1837 | 1839 | |
1838 | 1840 | if (slot->exists()) |
1839 | switch (slot->get_cart_type()) | |
1840 | 1841 | { |
1841 | case A800_8K: | |
1842 | m_maincpu->space(AS_PROGRAM).install_read_handler(0xa000, 0xbfff, read8_delegate(FUNC(a800_cart_slot_device::read_80xx),(a800_cart_slot_device*)slot)); | |
1843 | m_maincpu->space(AS_PROGRAM).unmap_write(0xa000, 0xbfff); | |
1844 | break; | |
1845 | case A800_8K_RIGHT: | |
1846 | m_maincpu->space(AS_PROGRAM).install_read_handler(0x8000, 0x9fff, read8_delegate(FUNC(a800_cart_slot_device::read_80xx),(a800_cart_slot_device*)slot)); | |
1847 | m_maincpu->space(AS_PROGRAM).unmap_write(0x8000, 0x9fff); | |
1848 | break; | |
1849 | case A800_16K: | |
1850 | m_maincpu->space(AS_PROGRAM).install_read_handler(0x8000, 0xbfff, read8_delegate(FUNC(a800_cart_slot_device::read_80xx),(a800_cart_slot_device*)slot)); | |
1851 | m_maincpu->space(AS_PROGRAM).unmap_write(0x8000, 0xbfff); | |
1852 | break; | |
1853 | case A800_PHOENIX: | |
1854 | m_maincpu->space(AS_PROGRAM).install_read_handler(0xa000, 0xbfff, read8_delegate(FUNC(a800_cart_slot_device::read_80xx),(a800_cart_slot_device*)slot)); | |
1855 | m_maincpu->space(AS_PROGRAM).unmap_write(0xa000, 0xbfff); | |
1856 | m_maincpu->space(AS_PROGRAM).install_write_handler(0xd500, 0xd5ff, write8_delegate(FUNC(a400_state::disable_cart), this)); | |
1857 | break; | |
1858 | case A800_BBSB: | |
1859 | m_maincpu->space(AS_PROGRAM).install_read_handler(0x8000, 0xbfff, read8_delegate(FUNC(a800_cart_slot_device::read_80xx),(a800_cart_slot_device*)slot)); | |
1860 | m_maincpu->space(AS_PROGRAM).install_write_handler(0x8000, 0x9fff, write8_delegate(FUNC(a800_cart_slot_device::write_80xx),(a800_cart_slot_device*)slot)); | |
1861 | m_maincpu->space(AS_PROGRAM).unmap_write(0xa000, 0xbfff); | |
1862 | break; | |
1863 | case A800_OSS034M: | |
1864 | case A800_OSS043M: | |
1865 | case A800_OSSM091: | |
1866 | case A800_OSS8K: | |
1867 | case A800_TURBO64: | |
1868 | case A800_TURBO128: | |
1869 | m_maincpu->space(AS_PROGRAM).install_read_handler(0xa000, 0xbfff, read8_delegate(FUNC(a800_cart_slot_device::read_80xx),(a800_cart_slot_device*)slot)); | |
1870 | m_maincpu->space(AS_PROGRAM).unmap_write(0xa000, 0xbfff); | |
1871 | m_maincpu->space(AS_PROGRAM).install_write_handler(0xd500, 0xd5ff, write8_delegate(FUNC(a400_state::disable_cart), this)); | |
1872 | break; | |
1873 | case A800_MICROCALC: | |
1874 | // this can also disable ROM when reading in 0xd500-0xd5ff | |
1875 | m_maincpu->space(AS_PROGRAM).install_read_handler(0xa000, 0xbfff, read8_delegate(FUNC(a800_cart_slot_device::read_80xx),(a800_cart_slot_device*)slot)); | |
1876 | m_maincpu->space(AS_PROGRAM).unmap_write(0xa000, 0xbfff); | |
1877 | m_maincpu->space(AS_PROGRAM).install_readwrite_handler(0xd500, 0xd5ff, read8_delegate(FUNC(a400_state::read_d5xx), this), write8_delegate(FUNC(a400_state::disable_cart), this)); | |
1878 | break; | |
1879 | case A800_EXPRESS: | |
1880 | m_maincpu->space(AS_PROGRAM).install_read_handler(0xa000, 0xbfff, read8_delegate(FUNC(a800_cart_slot_device::read_80xx),(a800_cart_slot_device*)slot)); | |
1881 | m_maincpu->space(AS_PROGRAM).unmap_write(0xa000, 0xbfff); | |
1882 | m_maincpu->space(AS_PROGRAM).install_write_handler(0xd570, 0xd57f, write8_delegate(FUNC(a400_state::disable_cart), this)); | |
1883 | break; | |
1884 | case A800_DIAMOND: | |
1885 | m_maincpu->space(AS_PROGRAM).install_read_handler(0xa000, 0xbfff, read8_delegate(FUNC(a800_cart_slot_device::read_80xx),(a800_cart_slot_device*)slot)); | |
1886 | m_maincpu->space(AS_PROGRAM).unmap_write(0xa000, 0xbfff); | |
1887 | m_maincpu->space(AS_PROGRAM).install_write_handler(0xd5d0, 0xd5df, write8_delegate(FUNC(a400_state::disable_cart), this)); | |
1888 | break; | |
1889 | case A800_WILLIAMS: | |
1890 | m_maincpu->space(AS_PROGRAM).install_read_handler(0xa000, 0xbfff, read8_delegate(FUNC(a800_cart_slot_device::read_80xx),(a800_cart_slot_device*)slot)); | |
1891 | m_maincpu->space(AS_PROGRAM).unmap_write(0xa000, 0xbfff); | |
1892 | m_maincpu->space(AS_PROGRAM).install_write_handler(0xd500, 0xd50f, write8_delegate(FUNC(a400_state::disable_cart), this)); | |
1893 | break; | |
1894 | case A800_SPARTADOS: | |
1895 | m_maincpu->space(AS_PROGRAM).install_read_handler(0xa000, 0xbfff, read8_delegate(FUNC(a800_cart_slot_device::read_80xx),(a800_cart_slot_device*)slot)); | |
1896 | m_maincpu->space(AS_PROGRAM).unmap_write(0xa000, 0xbfff); | |
1897 | m_maincpu->space(AS_PROGRAM).install_write_handler(0xd5e0, 0xd5ef, write8_delegate(FUNC(a400_state::disable_cart), this)); | |
1898 | break; | |
1899 | case A800_TELELINK2: | |
1900 | m_maincpu->space(AS_PROGRAM).install_read_handler(0x8000, 0xbfff, read8_delegate(FUNC(a800_cart_slot_device::read_80xx),(a800_cart_slot_device*)slot)); | |
1901 | m_maincpu->space(AS_PROGRAM).install_write_handler(0x9000, 0x90ff, write8_delegate(FUNC(a800_cart_slot_device::write_80xx),(a800_cart_slot_device*)slot)); | |
1902 | m_maincpu->space(AS_PROGRAM).unmap_write(0xa000, 0xbfff); | |
1903 | m_maincpu->space(AS_PROGRAM).install_read_handler(0xd501, 0xd501, read8_delegate(FUNC(a800_cart_slot_device::read_d5xx),(a800_cart_slot_device*)slot)); | |
1904 | m_maincpu->space(AS_PROGRAM).install_write_handler(0xd502, 0xd502, write8_delegate(FUNC(a800_cart_slot_device::write_d5xx),(a800_cart_slot_device*)slot)); | |
1905 | break; | |
1906 | case A800_BLIZZARD: | |
1907 | m_maincpu->space(AS_PROGRAM).install_read_handler(0x8000, 0xbfff, read8_delegate(FUNC(a800_cart_slot_device::read_80xx),(a800_cart_slot_device*)slot)); | |
1908 | m_maincpu->space(AS_PROGRAM).unmap_write(0x8000, 0xbfff); | |
1909 | m_maincpu->space(AS_PROGRAM).install_write_handler(0xd500, 0xd5ff, write8_delegate(FUNC(a400_state::disable_cart), this)); | |
1910 | break; | |
1911 | case A800_XEGS: | |
1912 | m_maincpu->space(AS_PROGRAM).install_read_handler(0x8000, 0xbfff, read8_delegate(FUNC(a800_cart_slot_device::read_80xx),(a800_cart_slot_device*)slot)); | |
1913 | m_maincpu->space(AS_PROGRAM).unmap_write(0x8000, 0xbfff); | |
1914 | m_maincpu->space(AS_PROGRAM).install_write_handler(0xd500, 0xd5ff, write8_delegate(FUNC(a800_cart_slot_device::write_d5xx),(a800_cart_slot_device*)slot)); | |
1915 | break; | |
1916 | case A5200_4K: | |
1917 | case A5200_8K: | |
1918 | case A5200_16K: | |
1919 | case A5200_32K: | |
1920 | case A5200_16K_2CHIPS: | |
1921 | m_maincpu->space(AS_PROGRAM).install_read_handler(0x4000, 0xbfff, read8_delegate(FUNC(a800_cart_slot_device::read_80xx),(a800_cart_slot_device*)slot)); | |
1922 | m_maincpu->space(AS_PROGRAM).unmap_write(0x4000, 0xbfff); | |
1923 | break; | |
1924 | case A5200_BBSB: | |
1925 | m_maincpu->space(AS_PROGRAM).install_read_handler(0x4000, 0xbfff, read8_delegate(FUNC(a800_cart_slot_device::read_80xx),(a800_cart_slot_device*)slot)); | |
1926 | m_maincpu->space(AS_PROGRAM).install_write_handler(0x4000, 0x5fff, write8_delegate(FUNC(a800_cart_slot_device::write_80xx),(a800_cart_slot_device*)slot)); | |
1927 | m_maincpu->space(AS_PROGRAM).unmap_write(0x6000, 0xbfff); | |
1928 | break; | |
1929 | } | |
1842 | switch (slot->get_cart_type()) | |
1843 | { | |
1844 | case A800_8K: | |
1845 | m_maincpu->space(AS_PROGRAM).install_read_handler(0xa000, 0xbfff, read8_delegate(FUNC(a800_cart_slot_device::read_80xx),(a800_cart_slot_device*)slot)); | |
1846 | m_maincpu->space(AS_PROGRAM).unmap_write(0xa000, 0xbfff); | |
1847 | break; | |
1848 | case A800_8K_RIGHT: | |
1849 | m_maincpu->space(AS_PROGRAM).install_read_handler(0x8000, 0x9fff, read8_delegate(FUNC(a800_cart_slot_device::read_80xx),(a800_cart_slot_device*)slot)); | |
1850 | m_maincpu->space(AS_PROGRAM).unmap_write(0x8000, 0x9fff); | |
1851 | break; | |
1852 | case A800_16K: | |
1853 | m_maincpu->space(AS_PROGRAM).install_read_handler(0x8000, 0xbfff, read8_delegate(FUNC(a800_cart_slot_device::read_80xx),(a800_cart_slot_device*)slot)); | |
1854 | m_maincpu->space(AS_PROGRAM).unmap_write(0x8000, 0xbfff); | |
1855 | break; | |
1856 | case A800_PHOENIX: | |
1857 | m_maincpu->space(AS_PROGRAM).install_read_handler(0xa000, 0xbfff, read8_delegate(FUNC(a800_cart_slot_device::read_80xx),(a800_cart_slot_device*)slot)); | |
1858 | m_maincpu->space(AS_PROGRAM).unmap_write(0xa000, 0xbfff); | |
1859 | m_maincpu->space(AS_PROGRAM).install_write_handler(0xd500, 0xd5ff, write8_delegate(FUNC(a400_state::disable_cart), this)); | |
1860 | break; | |
1861 | case A800_BBSB: | |
1862 | m_maincpu->space(AS_PROGRAM).install_read_handler(0x8000, 0xbfff, read8_delegate(FUNC(a800_cart_slot_device::read_80xx),(a800_cart_slot_device*)slot)); | |
1863 | m_maincpu->space(AS_PROGRAM).install_write_handler(0x8000, 0x9fff, write8_delegate(FUNC(a800_cart_slot_device::write_80xx),(a800_cart_slot_device*)slot)); | |
1864 | m_maincpu->space(AS_PROGRAM).unmap_write(0xa000, 0xbfff); | |
1865 | break; | |
1866 | case A800_OSS034M: | |
1867 | case A800_OSS043M: | |
1868 | case A800_OSSM091: | |
1869 | case A800_OSS8K: | |
1870 | case A800_TURBO64: | |
1871 | case A800_TURBO128: | |
1872 | m_maincpu->space(AS_PROGRAM).install_read_handler(0xa000, 0xbfff, read8_delegate(FUNC(a800_cart_slot_device::read_80xx),(a800_cart_slot_device*)slot)); | |
1873 | m_maincpu->space(AS_PROGRAM).unmap_write(0xa000, 0xbfff); | |
1874 | m_maincpu->space(AS_PROGRAM).install_write_handler(0xd500, 0xd5ff, write8_delegate(FUNC(a400_state::disable_cart), this)); | |
1875 | break; | |
1876 | case A800_MICROCALC: | |
1877 | // this can also disable ROM when reading in 0xd500-0xd5ff | |
1878 | m_maincpu->space(AS_PROGRAM).install_read_handler(0xa000, 0xbfff, read8_delegate(FUNC(a800_cart_slot_device::read_80xx),(a800_cart_slot_device*)slot)); | |
1879 | m_maincpu->space(AS_PROGRAM).unmap_write(0xa000, 0xbfff); | |
1880 | m_maincpu->space(AS_PROGRAM).install_readwrite_handler(0xd500, 0xd5ff, read8_delegate(FUNC(a400_state::read_d5xx), this), write8_delegate(FUNC(a400_state::disable_cart), this)); | |
1881 | break; | |
1882 | case A800_EXPRESS: | |
1883 | m_maincpu->space(AS_PROGRAM).install_read_handler(0xa000, 0xbfff, read8_delegate(FUNC(a800_cart_slot_device::read_80xx),(a800_cart_slot_device*)slot)); | |
1884 | m_maincpu->space(AS_PROGRAM).unmap_write(0xa000, 0xbfff); | |
1885 | m_maincpu->space(AS_PROGRAM).install_write_handler(0xd570, 0xd57f, write8_delegate(FUNC(a400_state::disable_cart), this)); | |
1886 | break; | |
1887 | case A800_DIAMOND: | |
1888 | m_maincpu->space(AS_PROGRAM).install_read_handler(0xa000, 0xbfff, read8_delegate(FUNC(a800_cart_slot_device::read_80xx),(a800_cart_slot_device*)slot)); | |
1889 | m_maincpu->space(AS_PROGRAM).unmap_write(0xa000, 0xbfff); | |
1890 | m_maincpu->space(AS_PROGRAM).install_write_handler(0xd5d0, 0xd5df, write8_delegate(FUNC(a400_state::disable_cart), this)); | |
1891 | break; | |
1892 | case A800_WILLIAMS: | |
1893 | m_maincpu->space(AS_PROGRAM).install_read_handler(0xa000, 0xbfff, read8_delegate(FUNC(a800_cart_slot_device::read_80xx),(a800_cart_slot_device*)slot)); | |
1894 | m_maincpu->space(AS_PROGRAM).unmap_write(0xa000, 0xbfff); | |
1895 | m_maincpu->space(AS_PROGRAM).install_write_handler(0xd500, 0xd50f, write8_delegate(FUNC(a400_state::disable_cart), this)); | |
1896 | break; | |
1897 | case A800_SPARTADOS: | |
1898 | m_maincpu->space(AS_PROGRAM).install_read_handler(0xa000, 0xbfff, read8_delegate(FUNC(a800_cart_slot_device::read_80xx),(a800_cart_slot_device*)slot)); | |
1899 | m_maincpu->space(AS_PROGRAM).unmap_write(0xa000, 0xbfff); | |
1900 | m_maincpu->space(AS_PROGRAM).install_write_handler(0xd5e0, 0xd5ef, write8_delegate(FUNC(a400_state::disable_cart), this)); | |
1901 | break; | |
1902 | case A800_TELELINK2: | |
1903 | m_maincpu->space(AS_PROGRAM).install_read_handler(0x8000, 0xbfff, read8_delegate(FUNC(a800_cart_slot_device::read_80xx),(a800_cart_slot_device*)slot)); | |
1904 | m_maincpu->space(AS_PROGRAM).install_write_handler(0x9000, 0x90ff, write8_delegate(FUNC(a800_cart_slot_device::write_80xx),(a800_cart_slot_device*)slot)); | |
1905 | m_maincpu->space(AS_PROGRAM).unmap_write(0xa000, 0xbfff); | |
1906 | m_maincpu->space(AS_PROGRAM).install_read_handler(0xd501, 0xd501, read8_delegate(FUNC(a800_cart_slot_device::read_d5xx),(a800_cart_slot_device*)slot)); | |
1907 | m_maincpu->space(AS_PROGRAM).install_write_handler(0xd502, 0xd502, write8_delegate(FUNC(a800_cart_slot_device::write_d5xx),(a800_cart_slot_device*)slot)); | |
1908 | break; | |
1909 | case A800_BLIZZARD: | |
1910 | m_maincpu->space(AS_PROGRAM).install_read_handler(0x8000, 0xbfff, read8_delegate(FUNC(a800_cart_slot_device::read_80xx),(a800_cart_slot_device*)slot)); | |
1911 | m_maincpu->space(AS_PROGRAM).unmap_write(0x8000, 0xbfff); | |
1912 | m_maincpu->space(AS_PROGRAM).install_write_handler(0xd500, 0xd5ff, write8_delegate(FUNC(a400_state::disable_cart), this)); | |
1913 | break; | |
1914 | case A800_XEGS: | |
1915 | m_maincpu->space(AS_PROGRAM).install_read_handler(0x8000, 0xbfff, read8_delegate(FUNC(a800_cart_slot_device::read_80xx),(a800_cart_slot_device*)slot)); | |
1916 | m_maincpu->space(AS_PROGRAM).unmap_write(0x8000, 0xbfff); | |
1917 | m_maincpu->space(AS_PROGRAM).install_write_handler(0xd500, 0xd5ff, write8_delegate(FUNC(a800_cart_slot_device::write_d5xx),(a800_cart_slot_device*)slot)); | |
1918 | break; | |
1919 | case A5200_4K: | |
1920 | case A5200_8K: | |
1921 | case A5200_16K: | |
1922 | case A5200_32K: | |
1923 | case A5200_16K_2CHIPS: | |
1924 | m_maincpu->space(AS_PROGRAM).install_read_handler(0x4000, 0xbfff, read8_delegate(FUNC(a800_cart_slot_device::read_80xx),(a800_cart_slot_device*)slot)); | |
1925 | m_maincpu->space(AS_PROGRAM).unmap_write(0x4000, 0xbfff); | |
1926 | break; | |
1927 | case A5200_BBSB: | |
1928 | m_maincpu->space(AS_PROGRAM).install_read_handler(0x4000, 0xbfff, read8_delegate(FUNC(a800_cart_slot_device::read_80xx),(a800_cart_slot_device*)slot)); | |
1929 | m_maincpu->space(AS_PROGRAM).install_write_handler(0x4000, 0x5fff, write8_delegate(FUNC(a800_cart_slot_device::write_80xx),(a800_cart_slot_device*)slot)); | |
1930 | m_maincpu->space(AS_PROGRAM).unmap_write(0x6000, 0xbfff); | |
1931 | break; | |
1932 | } | |
1933 | } | |
1930 | 1934 | } |
1931 | 1935 | |
1932 | 1936 | |
r32448 | r32449 | |
1957 | 1961 | setup_ram(0, m_ram->size()); |
1958 | 1962 | setup_ram(1, m_ram->size()); |
1959 | 1963 | setup_ram(2, m_ram->size()); |
1960 | setup_cart(m_cart | |
1964 | setup_cart(m_cart); | |
1961 | 1965 | |
1962 | 1966 | save_item(NAME(m_cart_disabled)); |
1963 | 1967 | save_item(NAME(m_last_offs)); |
r32448 | r32449 | |
1969 | 1973 | setup_ram(0, m_ram->size()); |
1970 | 1974 | setup_ram(1, m_ram->size()); |
1971 | 1975 | setup_ram(2, m_ram->size()); |
1972 | setup_cart(m_cartslot); | |
1973 | setup_cart(m_cartslot2); | |
1976 | setup_cart(m_cart); | |
1977 | setup_cart(m_cart2); | |
1974 | 1978 | |
1975 | 1979 | save_item(NAME(m_cart_disabled)); |
1976 | 1980 | save_item(NAME(m_last_offs)); |
r32448 | r32449 | |
1980 | 1984 | { |
1981 | 1985 | m_mmu = 0xfd; |
1982 | 1986 | m_ext_bank = 0x03; // only used by a130xe |
1983 | setup_cart(m_cart | |
1987 | setup_cart(m_cart); | |
1984 | 1988 | |
1985 | 1989 | save_item(NAME(m_cart_disabled)); |
1986 | 1990 | save_item(NAME(m_last_offs)); |
r32448 | r32449 | |
1991 | 1995 | |
1992 | 1996 | MACHINE_START_MEMBER( a400_state, a5200 ) |
1993 | 1997 | { |
1994 | setup_cart(m_cart | |
1998 | setup_cart(m_cart); | |
1995 | 1999 | |
1996 | 2000 | save_item(NAME(m_cart_disabled)); |
1997 | 2001 | save_item(NAME(m_last_offs)); |
r32448 | r32449 | |
---|---|---|
156 | 156 | : pico_base_state(mconfig, type, tag), |
157 | 157 | m_picocart(*this, "picoslot") { } |
158 | 158 | |
159 | | |
159 | required_device<pico_cart_slot_device> m_picocart; | |
160 | 160 | DECLARE_MACHINE_START(pico); |
161 | 161 | }; |
162 | 162 | |
r32448 | r32449 | |
519 | 519 | : pico_base_state(mconfig, type, tag), |
520 | 520 | m_picocart(*this, "coperaslot") { } |
521 | 521 | |
522 | | |
522 | required_device<copera_cart_slot_device> m_picocart; | |
523 | 523 | DECLARE_MACHINE_START(copera); |
524 | 524 | }; |
525 | 525 |
r32448 | r32449 | |
---|---|---|
79 | 79 | // for the moment let assume the latter! |
80 | 80 | READ8_MEMBER( sg1000_state::omv_r ) |
81 | 81 | { |
82 | if (m_cartslot && m_cartslot->m_cart) | |
83 | return m_cartslot->m_cart->read_cart(space, offset); | |
82 | if (m_cart && m_cart->exists()) | |
83 | return m_cart->read_cart(space, offset); | |
84 | 84 | else |
85 | 85 | return m_rom->base()[offset]; |
86 | 86 | } |
87 | 87 | |
88 | 88 | WRITE8_MEMBER( sg1000_state::omv_w ) |
89 | 89 | { |
90 | if (m_cartslot && m_cartslot->m_cart) | |
91 | m_cartslot->m_cart->write_cart(space, offset, data); | |
90 | if (m_cart && m_cart->exists()) | |
91 | m_cart->write_cart(space, offset, data); | |
92 | 92 | } |
93 | 93 | |
94 | 94 | /*------------------------------------------------- |
r32448 | r32449 | |
633 | 633 | |
634 | 634 | void sg1000_state::machine_start() |
635 | 635 | { |
636 | if (m_cart | |
636 | if (m_cart->get_type() == SEGA8_DAHJEE_TYPEA || m_cart->get_type() == SEGA8_DAHJEE_TYPEB) | |
637 | 637 | { |
638 | m_maincpu->space(AS_PROGRAM).install_read_handler(0xc000, 0xffff, 0, 0, read8_delegate(FUNC(sega8_cart_slot_device::read_ram),(sega8_cart_slot_device*)m_cartslot)); | |
639 | m_maincpu->space(AS_PROGRAM).install_write_handler(0xc000, 0xffff, 0, 0, write8_delegate(FUNC(sega8_cart_slot_device::write_ram),(sega8_cart_slot_device*)m_cartslot)); | |
638 | m_maincpu->space(AS_PROGRAM).install_read_handler(0xc000, 0xffff, 0, 0, read8_delegate(FUNC(sega8_cart_slot_device::read_ram),(sega8_cart_slot_device*)m_cart)); | |
639 | m_maincpu->space(AS_PROGRAM).install_write_handler(0xc000, 0xffff, 0, 0, write8_delegate(FUNC(sega8_cart_slot_device::write_ram),(sega8_cart_slot_device*)m_cart)); | |
640 | 640 | } |
641 | 641 | |
642 | if (m_cartslot) | |
643 | m_cartslot->save_ram(); | |
642 | if (m_cart) | |
643 | m_cart->save_ram(); | |
644 | 644 | } |
645 | 645 | |
646 | 646 | /*------------------------------------------------- |
r32448 | r32449 | |
673 | 673 | /* register for state saving */ |
674 | 674 | save_item(NAME(m_keylatch)); |
675 | 675 | |
676 | if (m_cartslot && (m_cartslot->get_type() == SEGA8_BASIC_L3 || m_cartslot->get_type() == SEGA8_MUSIC_EDITOR | |
677 | || m_cartslot->get_type() == SEGA8_DAHJEE_TYPEA || m_cartslot->get_type() == SEGA8_DAHJEE_TYPEB)) | |
676 | if (m_cart && m_cart->exists() && (m_cart->get_type() == SEGA8_BASIC_L3 || m_cart->get_type() == SEGA8_MUSIC_EDITOR | |
677 | || m_cart->get_type() == SEGA8_DAHJEE_TYPEA || m_cart->get_type() == SEGA8_DAHJEE_TYPEB)) | |
678 | 678 | { |
679 | m_maincpu->space(AS_PROGRAM).install_read_handler(0xc000, 0xffff, 0, 0, read8_delegate(FUNC(sega8_cart_slot_device::read_ram),(sega8_cart_slot_device*)m_cartslot)); | |
680 | m_maincpu->space(AS_PROGRAM).install_write_handler(0xc000, 0xffff, 0, 0, write8_delegate(FUNC(sega8_cart_slot_device::write_ram),(sega8_cart_slot_device*)m_cartslot)); | |
679 | m_maincpu->space(AS_PROGRAM).install_read_handler(0xc000, 0xffff, 0, 0, read8_delegate(FUNC(sega8_cart_slot_device::read_ram),(sega8_cart_slot_device*)m_cart)); | |
680 | m_maincpu->space(AS_PROGRAM).install_write_handler(0xc000, 0xffff, 0, 0, write8_delegate(FUNC(sega8_cart_slot_device::write_ram),(sega8_cart_slot_device*)m_cart)); | |
681 | 681 | } |
682 | 682 | |
683 | if (m_cartslot) | |
684 | m_cartslot->save_ram(); | |
683 | if (m_cart) | |
684 | m_cart->save_ram(); | |
685 | 685 | } |
686 | 686 | |
687 | 687 |
r32448 | r32449 | |
---|---|---|
206 | 206 | */ |
207 | 207 | WRITE_LINE_MEMBER(sms_state::sms_pause_callback) |
208 | 208 | { |
209 | if (m_is_gamegear && m_cartslot-> | |
209 | if (m_is_gamegear && m_cartslot->exists() && !m_cartslot->m_cart->get_sms_mode()) | |
210 | 210 | return; |
211 | 211 | |
212 | 212 | if ((m_is_gamegear && !(m_port_start->read() & 0x80)) || (!m_is_gamegear && !(m_port_pause->read() & 0x80))) |
r32448 | r32449 | |
642 | 642 | // (/CART pin) that prioritizes the cartridge slot if it has media |
643 | 643 | // inserted. Japanese 3-D cartridges do not connect the /CART pin, |
644 | 644 | // to not disable the card adaptor used by the 3-D glasses. |
645 | if (m_cartslot && m_cartslot-> | |
645 | if (m_cartslot && m_cartslot->exists()) | |
646 | 646 | { |
647 | 647 | m_mem_device_enabled |= ENABLE_CART; |
648 | 648 | logerror("Cartridge ROM/RAM enabled.\n"); |
649 | 649 | } |
650 | else if (m_cardslot && m_cardslot-> | |
650 | else if (m_cardslot && m_cardslot->exists()) | |
651 | 651 | { |
652 | 652 | m_mem_device_enabled |= ENABLE_CARD; |
653 | 653 | logerror("Card ROM port enabled.\n"); |
r32448 | r32449 | |
661 | 661 | logerror("Expansion port enabled.\n"); |
662 | 662 | } |
663 | 663 | |
664 | if (!(m_mem_ctrl_reg & IO_CARD) && m_cardslot && m_cardslot-> | |
664 | if (!(m_mem_ctrl_reg & IO_CARD) && m_cardslot && m_cardslot->exists()) | |
665 | 665 | { |
666 | 666 | m_mem_device_enabled |= ENABLE_CARD; |
667 | 667 | logerror("Card ROM port enabled.\n"); |
668 | 668 | } |
669 | 669 | |
670 | if (!(m_mem_ctrl_reg & IO_CARTRIDGE) && m_cartslot && m_cartslot-> | |
670 | if (!(m_mem_ctrl_reg & IO_CARTRIDGE) && m_cartslot && m_cartslot->exists()) | |
671 | 671 | { |
672 | 672 | m_mem_device_enabled |= ENABLE_CART; |
673 | 673 | logerror("Cartridge ROM/RAM enabled.\n"); |
r32448 | r32449 | |
852 | 852 | |
853 | 853 | if (m_is_gamegear) |
854 | 854 | { |
855 | if (m_cartslot-> | |
855 | if (m_cartslot->exists() && m_cartslot->m_cart->get_sms_mode()) | |
856 | 856 | m_vdp->set_sega315_5124_compatibility_mode(true); |
857 | 857 | |
858 | 858 | /* Initialize SIO stuff for GG */ |
r32448 | r32449 | |
---|---|---|
13 | 13 | : md_base_state(mconfig, type, tag), |
14 | 14 | m_32x(*this,"sega32x"), |
15 | 15 | m_segacd(*this,"segacd"), |
16 | m_ | |
16 | m_cart(*this, "mdslot") | |
17 | 17 | { } |
18 | 18 | |
19 | 19 | ioport_port *m_io_ctrlr; |
r32448 | r32449 | |
22 | 22 | |
23 | 23 | optional_device<sega_32x_device> m_32x; |
24 | 24 | optional_device<sega_segacd_device> m_segacd; |
25 | optional_device<md_cart_slot_device> m_ | |
25 | optional_device<md_cart_slot_device> m_cart; | |
26 | 26 | |
27 | 27 | DECLARE_DRIVER_INIT(mess_md_common); |
28 | 28 | DECLARE_DRIVER_INIT(genesis); |
r32448 | r32449 | |
---|---|---|
138 | 138 | m_lbdac(*this, "direct_b_left"), |
139 | 139 | m_rbdac(*this, "direct_b_right"), |
140 | 140 | m_gbsound(*this, "custom"), |
141 | m_cart | |
141 | m_cart(*this, "cartslot"), | |
142 | 142 | m_region_maincpu(*this, "maincpu"), |
143 | 143 | m_io_in0(*this, "IN0") |
144 | 144 | { } |
r32448 | r32449 | |
152 | 152 | required_device<dac_device> m_lbdac; |
153 | 153 | required_device<dac_device> m_rbdac; |
154 | 154 | required_device<gameboy_sound_device> m_gbsound; |
155 | required_device<gba_cart_slot_device> m_cart | |
155 | required_device<gba_cart_slot_device> m_cart; | |
156 | 156 | |
157 | 157 | void request_irq(UINT32 int_type); |
158 | 158 | void dma_exec(FPTR ch); |
r32448 | r32449 | |
---|---|---|
49 | 49 | m_maincpu(*this, Z80_TAG), |
50 | 50 | m_ram(*this, RAM_TAG), |
51 | 51 | m_rom(*this, Z80_TAG), |
52 | m_cart | |
52 | m_cart(*this, CARTSLOT_TAG) | |
53 | 53 | { } |
54 | 54 | |
55 | 55 | required_device<cpu_device> m_maincpu; |
56 | 56 | required_device<ram_device> m_ram; |
57 | 57 | required_memory_region m_rom; |
58 | optional_device<sega8_cart_slot_device> m_cart | |
58 | optional_device<sega8_cart_slot_device> m_cart; | |
59 | 59 | |
60 | 60 | virtual void machine_start(); |
61 | 61 |
Previous | 199869 Revisions | Next |