From 53e9168f15193d5abf5eb9399c743aa651b940bc Mon Sep 17 00:00:00 2001 From: Scott Stone Date: Fri, 2 Dec 2016 16:13:45 -0500 Subject: [PATCH] Proper support for Rescue on Fractalus (proto) - No Bankswitch + 2K Mirror RAM. [Mike Saarna] --- hash/a7800.xml | 2 +- src/devices/bus/a7800/a78_carts.h | 1 + src/devices/bus/a7800/a78_slot.cpp | 15 +++++++++-- src/devices/bus/a7800/a78_slot.h | 3 ++- src/devices/bus/a7800/rom.cpp | 40 ++++++++++++++++++++++++++++++ src/devices/bus/a7800/rom.h | 16 ++++++++++++ 6 files changed, 73 insertions(+), 4 deletions(-) diff --git a/hash/a7800.xml b/hash/a7800.xml index 748672acb25..bf24518dd3b 100644 --- a/hash/a7800.xml +++ b/hash/a7800.xml @@ -1806,7 +1806,7 @@ almost nothing like the prototype. - + diff --git a/src/devices/bus/a7800/a78_carts.h b/src/devices/bus/a7800/a78_carts.h index ebf66de8218..e098f104572 100644 --- a/src/devices/bus/a7800/a78_carts.h +++ b/src/devices/bus/a7800/a78_carts.h @@ -17,6 +17,7 @@ static SLOT_INTERFACE_START(a7800_cart) SLOT_INTERFACE_INTERNAL("a78_sg_pokey", A78_ROM_SG_POKEY) SLOT_INTERFACE_INTERNAL("a78_sg_ram", A78_ROM_SG_RAM) SLOT_INTERFACE_INTERNAL("a78_sg9", A78_ROM_SG9) + SLOT_INTERFACE_INTERNAL("a78_mram", A78_ROM_MRAM) SLOT_INTERFACE_INTERNAL("a78_abs", A78_ROM_ABSOLUTE) SLOT_INTERFACE_INTERNAL("a78_act", A78_ROM_ACTIVISION) SLOT_INTERFACE_INTERNAL("a78_hsc", A78_HISCORE) diff --git a/src/devices/bus/a7800/a78_slot.cpp b/src/devices/bus/a7800/a78_slot.cpp index a68e0daeeb0..4bf77f178ae 100644 --- a/src/devices/bus/a7800/a78_slot.cpp +++ b/src/devices/bus/a7800/a78_slot.cpp @@ -306,6 +306,7 @@ static const a78_slot slot_list[] = { A78_TYPE3, "a78_sg_pokey" }, { A78_TYPE6, "a78_sg_ram" }, { A78_TYPEA, "a78_sg9" }, + { A78_TYPE8, "a78_mram" }, { A78_ABSOLUTE, "a78_abs" }, { A78_ACTIVISION, "a78_act" }, { A78_HSC, "a78_hsc" }, @@ -429,6 +430,10 @@ image_init_result a78_cart_slot_device::call_load() m_type = A78_ACTIVISION; else if ((mapper & 0xff00) == 0x0200) m_type = A78_ABSOLUTE; + // (for now) mirror ram implies no bankswitch format is used + else if ((mapper & 0x0080) == 0x0080) + m_type = A78_TYPE8; + logerror("Cart type: 0x%x\n", m_type); @@ -454,7 +459,7 @@ image_init_result a78_cart_slot_device::call_load() m_cart->rom_alloc(len, tag()); fread(m_cart->get_rom_base(), len); - if (m_type == A78_TYPE6) + if (m_type == A78_TYPE6 || m_type == A78_TYPE8) m_cart->ram_alloc(0x4000); if (m_type == A78_MEGACART || (m_type >= A78_VERSABOARD && m_type <= A78_VERSA_POK450)) m_cart->ram_alloc(0x8000); @@ -570,6 +575,8 @@ std::string a78_cart_slot_device::get_default_card_software() type = A78_ACTIVISION; else if ((mapper & 0xff00) == 0x0200) type = A78_ABSOLUTE; + else if ((mapper & 0x0080) == 0x0080) + type = A78_TYPE8; logerror("Cart type: %x\n", type); slot_string = a78_get_slot(type); @@ -706,7 +713,7 @@ WRITE8_MEMBER(a78_cart_slot_device::write_40xx) bit 4 [0x10] - bank 6 at $4000 bit 5 [0x20] - banked RAM at $4000 bit 6 [0x40] - POKEY at $0450 - bit 7 [0x80] - currently unused + bit 7 [0x80] - Mirror RAM at $4000 (byte 53) bit0 set = Absolute mapper (F18 Hornet) @@ -751,6 +758,9 @@ void a78_cart_slot_device::internal_header_logging(uint8_t *header, uint32_t len case 0x0020: cart_mapper.assign("SuperCart Bankswitch + 32K RAM"); break; + case 0x0080: + cart_mapper.assign("No Bankswitch + Mirror RAM"); + break; case 0x0100: cart_mapper.assign("Activision Bankswitch"); break; @@ -809,6 +819,7 @@ void a78_cart_slot_device::internal_header_logging(uint8_t *header, uint32_t len logerror( "\t\tbank6 at $4000: %s\n", BIT(head_mapper, 4) ? "Yes" : "No"); logerror( "\t\tbanked RAM: %s\n", BIT(head_mapper, 5) ? "Yes" : "No"); logerror( "\t\tPOKEY at $450: %s\n", BIT(head_mapper, 6) ? "Yes" : "No"); + logerror( "\t\tmRAM at $4000: %s\n", BIT(head_mapper, 7) ? "Yes" : "No"); logerror( "\t\tSpecial: %s ", (head_mapper & 0xff00) ? "Yes" : "No"); if (head_mapper & 0xff00) { diff --git a/src/devices/bus/a7800/a78_slot.h b/src/devices/bus/a7800/a78_slot.h index bb9f9645651..6b63b8c65f4 100644 --- a/src/devices/bus/a7800/a78_slot.h +++ b/src/devices/bus/a7800/a78_slot.h @@ -19,7 +19,8 @@ enum A78_TYPE2, // Atari SuperGame pcb (8x16K banks with bankswitch) A78_TYPE3, // as TYPE1 + POKEY chip on the PCB A78_TYPE6, // as TYPE1 + RAM IC on the PCB - A78_TYPEA, // Alien Brigade, Crossbow (9x16K banks with diff bankswitch) + A78_TYPE8, // Rescue on Fractalus, as TYPE0 + 2K Mirror RAM IC on the PCB + A78_TYPEA, // Alien Brigade, Crossbow (9x16K banks with diff bankswitch) A78_ABSOLUTE, // F18 Hornet A78_ACTIVISION, // Double Dragon, Rampage A78_HSC, // Atari HighScore cart diff --git a/src/devices/bus/a7800/rom.cpp b/src/devices/bus/a7800/rom.cpp index 3b230e79e56..b55445aa691 100644 --- a/src/devices/bus/a7800/rom.cpp +++ b/src/devices/bus/a7800/rom.cpp @@ -32,6 +32,7 @@ const device_type A78_ROM_POKEY = &device_creator; const device_type A78_ROM_SG_POKEY = &device_creator; const device_type A78_ROM_SG_RAM = &device_creator; const device_type A78_ROM_SG9 = &device_creator; +const device_type A78_ROM_MRAM = &device_creator; const device_type A78_ROM_ABSOLUTE = &device_creator; const device_type A78_ROM_ACTIVISION = &device_creator; @@ -67,6 +68,16 @@ a78_rom_pokey_device::a78_rom_pokey_device(const machine_config &mconfig, const } +a78_rom_mram_device::a78_rom_mram_device(const machine_config &mconfig, device_type type, const char *name, const char *tag, device_t *owner, uint32_t clock, const char *shortname, const char *source) + : a78_rom_device(mconfig, type, name, tag, owner, clock, shortname, source) +{ +} + +a78_rom_mram_device::a78_rom_mram_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock) + : a78_rom_device(mconfig, A78_ROM_MRAM, "Atari 7800 ROM Carts + Mirror RAM", tag, owner, clock, "a78_rom_mram", __FILE__) +{ +} + a78_rom_sg_device::a78_rom_sg_device(const machine_config &mconfig, device_type type, const char *name, const char *tag, device_t *owner, uint32_t clock, const char *shortname, const char *source) : a78_rom_device(mconfig, type, name, tag, owner, clock, shortname, source), m_bank(0) { @@ -261,6 +272,35 @@ machine_config_constructor a78_rom_pokey_device::device_mconfig_additions() cons return MACHINE_CONFIG_NAME( a78_pokey ); } +/*------------------------------------------------- + + Carts with no bankswitch + mRAM chip + The RAM chips are accessed by writing at + 0x4000-0x7fff. + The A8 line of the RAM chip isn't used, to create + mirrors of even pages at odd page locations. + + GAMES: Rescue on Fractalus (proto) + + -------------------------------------------------*/ + + +READ8_MEMBER(a78_rom_mram_device::read_40xx) +{ + if (offset < 0x4000) + return m_ram[offset & 0xfeff]; + if (offset + 0x4000 < m_base_rom) + return 0xff; + else + return m_rom[offset + 0x4000 - m_base_rom]; +} + +WRITE8_MEMBER(a78_rom_mram_device::write_40xx) +{ + if (offset < 0x4000) + m_ram[offset&0xfeff] = data; +} + /*------------------------------------------------- diff --git a/src/devices/bus/a7800/rom.h b/src/devices/bus/a7800/rom.h index 3e64f653e8f..5036b530aae 100644 --- a/src/devices/bus/a7800/rom.h +++ b/src/devices/bus/a7800/rom.h @@ -47,6 +47,21 @@ protected: }; +// ======================> a78_rom_sg_ram_device + +class a78_rom_mram_device : public a78_rom_device +{ +public: + // construction/destruction + a78_rom_mram_device(const machine_config &mconfig, device_type type, const char *name, const char *tag, device_t *owner, uint32_t clock, const char *shortname, const char *source); + a78_rom_mram_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock); + + // reading and writing + virtual DECLARE_READ8_MEMBER(read_40xx) override; + virtual DECLARE_WRITE8_MEMBER(write_40xx) override; +}; + + // ======================> a78_rom_sg_device class a78_rom_sg_device : public a78_rom_device @@ -248,6 +263,7 @@ extern const device_type A78_ROM_SG; extern const device_type A78_ROM_POKEY; extern const device_type A78_ROM_SG_POKEY; extern const device_type A78_ROM_SG_RAM; +extern const device_type A78_ROM_MRAM; extern const device_type A78_ROM_SG9; extern const device_type A78_ROM_ABSOLUTE; extern const device_type A78_ROM_ACTIVISION;