From 47a2824b57109b64e297a1cc00e01206afc15673 Mon Sep 17 00:00:00 2001 From: Fabio Priuli Date: Wed, 17 Sep 2014 17:24:53 +0000 Subject: [PATCH] (MESS) a2600.c: fixed mapper 3E support, as used by Boulder Dash homebrew. Also allowed bankswitch writes to get to the TIA for this and mapper 3F. Finally, included a couple of demos in the softlist so to be able to test the code in future. nw. --- hash/a2600.xml | 30 ++++++++++++++++++++++++++++++ src/emu/bus/vcs/rom.c | 23 +++++++++-------------- src/mess/drivers/a2600.c | 16 ++++++++++++++-- 3 files changed, 53 insertions(+), 16 deletions(-) diff --git a/hash/a2600.xml b/hash/a2600.xml index 9b19ddf7c7c..21e1eacde42 100644 --- a/hash/a2600.xml +++ b/hash/a2600.xml @@ -18400,4 +18400,34 @@ Info from Atariage and Atarimania + + + + + Boulder Dash (Demo v2) + 2014 + <homebrew> + + + + + + + + + + + + Boulder Dash (Demo v1) + 2011 + <homebrew> + + + + + + + + + diff --git a/src/emu/bus/vcs/rom.c b/src/emu/bus/vcs/rom.c index 2953f705e2c..c83f0054e17 100755 --- a/src/emu/bus/vcs/rom.c +++ b/src/emu/bus/vcs/rom.c @@ -678,41 +678,36 @@ WRITE8_MEMBER(a26_rom_fe_device::write_bank) READ8_MEMBER(a26_rom_3e_device::read_rom) { - if (m_ram && m_ram_enable && offset >= 0x400 && offset < 0x600) - { - offset -= 0x400; - return m_ram[offset + (m_ram_bank * 0x200)]; - } + if (m_ram && m_ram_enable && offset < 0x400) + return m_ram[offset + (m_ram_bank * 0x400)]; if (offset >= 0x800) - return m_rom[offset + (m_num_bank - 1) * 0x800]; + return m_rom[(offset & 0x7ff) + (m_num_bank - 1) * 0x800]; else return m_rom[offset + m_base_bank * 0x800]; } WRITE8_MEMBER(a26_rom_3e_device::write_bank) { - if (offset) // 0x3f + if (offset == 0x3f) { m_base_bank = data & (m_num_bank - 1); m_ram_enable = 0; } - else // 0x3e + else if (offset == 0x3e) { - m_ram_bank = data & 0x3f; + m_ram_bank = data & 0x1f; m_ram_enable = 1; } } WRITE8_MEMBER(a26_rom_3e_device::write_ram) { - if (m_ram && m_ram_enable && offset >= 0x400 && offset < 0x600) - { - offset -= 0x400; - m_ram[offset + (m_ram_bank * 0x200)] = data; - } + if (m_ram && m_ram_enable && offset >= 0x400 && offset < 0x800) + m_ram[(offset & 0x3ff) + (m_ram_bank * 0x400)] = data; } + /*------------------------------------------------- "3F Bankswitch" Carts: write access to 0x00-0x3f determines the 2K ROM bank diff --git a/src/mess/drivers/a2600.c b/src/mess/drivers/a2600.c index c2f2dfea7cc..ab7ac4d4220 100644 --- a/src/mess/drivers/a2600.c +++ b/src/mess/drivers/a2600.c @@ -33,6 +33,7 @@ public: m_joy1(*this, CONTROL1_TAG), m_joy2(*this, CONTROL2_TAG) , m_cartslot(*this, "cartslot"), + m_tia(*this, "tia_video"), m_maincpu(*this, "maincpu"), m_screen(*this, "screen") { } @@ -49,6 +50,7 @@ public: DECLARE_READ8_MEMBER(a2600_get_databus_contents); DECLARE_WRITE16_MEMBER(a2600_tia_vsync_callback); DECLARE_WRITE16_MEMBER(a2600_tia_vsync_callback_pal); + DECLARE_WRITE8_MEMBER(cart_over_tia_w); // investigate how the carts mapped here (Mapper JVP) interact with the RIOT device DECLARE_READ8_MEMBER(cart_over_riot_r); DECLARE_WRITE8_MEMBER(cart_over_riot_w); @@ -57,6 +59,7 @@ protected: required_device m_joy1; required_device m_joy2; required_device m_cartslot; + required_device m_tia; unsigned long detect_2600controllers(); required_device m_maincpu; @@ -246,6 +249,15 @@ WRITE8_MEMBER(a2600_state::cart_over_riot_w) } +WRITE8_MEMBER(a2600_state::cart_over_tia_w) +{ + // Both Cart & TIA see these addresses + if (m_cartslot) + m_cartslot->write_bank(space, offset, data); + + m_tia->write(space, offset, data); +} + MACHINE_START_MEMBER(a2600_state,a2600) { m_current_screen_height = m_screen->height(); @@ -279,11 +291,11 @@ MACHINE_START_MEMBER(a2600_state,a2600) break; case A26_3E: 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)); - m_maincpu->space(AS_PROGRAM).install_write_handler(0x3e, 0x3f, write8_delegate(FUNC(vcs_cart_slot_device::write_bank),(vcs_cart_slot_device*)m_cartslot)); + m_maincpu->space(AS_PROGRAM).install_write_handler(0x00, 0x3f, write8_delegate(FUNC(a2600_state::cart_over_tia_w), this)); break; case A26_3F: 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)); - m_maincpu->space(AS_PROGRAM).install_write_handler(0x00, 0x3f, write8_delegate(FUNC(vcs_cart_slot_device::write_bank),(vcs_cart_slot_device*)m_cartslot)); + m_maincpu->space(AS_PROGRAM).install_write_handler(0x00, 0x3f, write8_delegate(FUNC(a2600_state::cart_over_tia_w), this)); break; case A26_UA: 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));