diff --git a/hash/a7800.xml b/hash/a7800.xml index 0a632e3b307..f0ed4015de6 100644 --- a/hash/a7800.xml +++ b/hash/a7800.xml @@ -2449,9 +2449,9 @@ almost nothing like the prototype. - - - + + + @@ -2464,9 +2464,9 @@ almost nothing like the prototype. - - - + + + diff --git a/src/emu/bus/a7800/a78_carts.h b/src/emu/bus/a7800/a78_carts.h index 87b2c36da18..da15f59c698 100644 --- a/src/emu/bus/a7800/a78_carts.h +++ b/src/emu/bus/a7800/a78_carts.h @@ -1,12 +1,12 @@ #ifndef __A78_CARTS_H #define __A78_CARTS_H - #include "emu.h" #include "rom.h" #include "xboard.h" #include "hiscore.h" +#include "cpuwiz.h" static SLOT_INTERFACE_START(a7800_cart) SLOT_INTERFACE_INTERNAL("a78_rom", A78_ROM) @@ -14,15 +14,16 @@ static SLOT_INTERFACE_START(a7800_cart) SLOT_INTERFACE_INTERNAL("a78_sg", A78_ROM_SG) SLOT_INTERFACE_INTERNAL("a78_sg_pokey", A78_ROM_SG_POKEY) SLOT_INTERFACE_INTERNAL("a78_sg_ram", A78_ROM_SG_RAM) - // not sure which dev cart support banked ram, nor whether there shall be a 9banks or a non-sg version of this... - SLOT_INTERFACE_INTERNAL("a78_bankram", A78_ROM_BANKRAM) - SLOT_INTERFACE_INTERNAL("a78_sg9", A78_ROM_SG_9BANKS) - SLOT_INTERFACE_INTERNAL("a78_xmc", A78_ROM_XM) // carts compatible with the expansions below (basically a 9Banks+POKEY) + SLOT_INTERFACE_INTERNAL("a78_sg9", A78_ROM_SG9) + SLOT_INTERFACE_INTERNAL("a78_sg9_pokey",A78_ROM_SG9_POKEY) // carts compatible with the expansions below (basically a 9Banks+POKEY) SLOT_INTERFACE_INTERNAL("a78_abs", A78_ROM_ABSOLUTE) SLOT_INTERFACE_INTERNAL("a78_act", A78_ROM_ACTIVISION) SLOT_INTERFACE_INTERNAL("a78_hsc", A78_HISCORE) SLOT_INTERFACE_INTERNAL("a78_xboard", A78_XBOARD) // the actual XBoarD expansion (as passthru) SLOT_INTERFACE_INTERNAL("a78_xm", A78_XM) // the actual XM expansion (as passthru) + SLOT_INTERFACE_INTERNAL("a78_megacart", A78_ROM_MEGACART) + SLOT_INTERFACE_INTERNAL("a78_versa", A78_ROM_VERSABOARD) + SLOT_INTERFACE_INTERNAL("a78_versap", A78_ROM_VERSAPOKEY) // For debugging purposes SLOT_INTERFACE_END diff --git a/src/emu/bus/a7800/a78_slot.c b/src/emu/bus/a7800/a78_slot.c index cbd29a33626..48166572e90 100644 --- a/src/emu/bus/a7800/a78_slot.c +++ b/src/emu/bus/a7800/a78_slot.c @@ -170,20 +170,22 @@ struct a78_slot // Here, we take the feature attribute from .xml (i.e. the PCB name) and we assign a unique ID to it static const a78_slot slot_list[] = { - { A78_TYPE0, "a78_rom" }, - { A78_TYPE1, "a78_pokey" }, - { A78_TYPE2, "a78_sg" }, - { A78_TYPE3, "a78_sg_pokey" }, - { A78_TYPE6, "a78_sg_ram" }, - { A78_TYPEA, "a78_sg9" }, - { A78_TYPEB, "a78_xmc" }, - { A78_ABSOLUTE, "a78_abs" }, + { A78_TYPE0, "a78_rom" }, + { A78_TYPE1, "a78_pokey" }, + { A78_TYPE2, "a78_sg" }, + { A78_TYPE3, "a78_sg_pokey" }, + { A78_TYPE6, "a78_sg_ram" }, + { A78_TYPEA, "a78_sg9" }, + { A78_TYPEB, "a78_sg9_pokey" }, + { A78_ABSOLUTE, "a78_abs" }, { A78_ACTIVISION, "a78_act" }, - { A78_HSC, "a78_hsc" }, - { A78_BANKRAM, "a78_bankram" }, - { A78_XB_BOARD, "a78_xboard" }, - { A78_XM_BOARD, "a78_xm" }, - { A78_NOCART, "empty" }, + { A78_HSC, "a78_hsc" }, + { A78_XB_BOARD, "a78_xboard" }, + { A78_XM_BOARD, "a78_xm" }, + { A78_MEGACART, "a78_megacart" }, + { A78_VERSABOARD, "a78_versa" }, + { A78_VERSAPOKEY, "a78_versap" }, + { A78_NOCART, "empty" }, // the code should never get here, of course... }; static int a78_get_pcb_id(const char *slot) @@ -269,7 +271,13 @@ bool a78_cart_slot_device::call_load() m_type = A78_TYPEB; break; case 0x0020: - m_type = A78_BANKRAM; + if (len > 0x40000) + m_type = A78_MEGACART; + else + m_type = A78_VERSABOARD; + break; + case 0x0021: + m_type = A78_VERSAPOKEY; break; case 0x0100: m_type = A78_ACTIVISION; @@ -291,7 +299,7 @@ bool a78_cart_slot_device::call_load() if (m_type == A78_TYPE6) m_cart->ram_alloc(0x4000); - if (m_type == A78_BANKRAM) + if (m_type == A78_MEGACART || m_type == A78_VERSABOARD || m_type == A78_VERSAPOKEY) m_cart->ram_alloc(0x8000); if (m_type == A78_XB_BOARD || m_type == A78_XM_BOARD) m_cart->ram_alloc(0x20000); @@ -394,7 +402,13 @@ void a78_cart_slot_device::get_default_card_software(astring &result) type = A78_TYPEB; break; case 0x0020: - m_type = A78_BANKRAM; + if (core_fsize(m_file) > 0x40000) + type = A78_MEGACART; + else + type = A78_VERSABOARD; + break; + case 0x0021: + type = A78_VERSAPOKEY; break; case 0x0100: type = A78_ACTIVISION; diff --git a/src/emu/bus/a7800/a78_slot.h b/src/emu/bus/a7800/a78_slot.h index cd8fce8cc2e..cc01f7eef2c 100644 --- a/src/emu/bus/a7800/a78_slot.h +++ b/src/emu/bus/a7800/a78_slot.h @@ -16,13 +16,15 @@ enum 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_TYPEB, // Cart exploiting the XB board, but possibly also compatible with non-expanded A7800 A78_ABSOLUTE, // F18 Hornet A78_ACTIVISION, // Double Dragon, Rampage A78_HSC, // Atari HighScore cart - A78_BANKRAM, // SuperGame + 32K RAM banked (untested) A78_XB_BOARD, // A7800 Expansion Board (it shall more or less apply to the Expansion Module too, but this is not officially released yet) A78_XM_BOARD, // A7800 XM Expansion Module (theoretical specs only, since this is not officially released yet) - A78_TYPEB, // Cart exploiting the XB board, but possibly also compatible with non-expanded A7800 + A78_MEGACART, // Homebrew by CPUWIZ, consists of SuperGame bank up to 512K + 32K RAM banked + A78_VERSABOARD, // Homebrew by CPUWIZ, consists of SuperGame bank up to 256K + 32K RAM banked + A78_VERSAPOKEY, // For debugging purpose, same as VersaBoard + SG 9 Banks + POKEY at 0x0450 A78_NOCART }; diff --git a/src/emu/bus/a7800/rom.c b/src/emu/bus/a7800/rom.c index a9829c7884a..ca05895bebe 100644 --- a/src/emu/bus/a7800/rom.c +++ b/src/emu/bus/a7800/rom.c @@ -26,9 +26,8 @@ const device_type A78_ROM_SG = &device_creator; 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_BANKRAM = &device_creator; -const device_type A78_ROM_SG_9BANKS = &device_creator; -const device_type A78_ROM_XM = &device_creator; +const device_type A78_ROM_SG9 = &device_creator; +const device_type A78_ROM_SG9_POKEY = &device_creator; const device_type A78_ROM_ABSOLUTE = &device_creator; const device_type A78_ROM_ACTIVISION = &device_creator; @@ -75,25 +74,19 @@ a78_rom_sg_ram_device::a78_rom_sg_ram_device(const machine_config &mconfig, cons } -a78_rom_bankram_device::a78_rom_bankram_device(const machine_config &mconfig, const char *tag, device_t *owner, UINT32 clock) - : a78_rom_sg_device(mconfig, A78_ROM_BANKRAM, "Atari 7800 ROM Carts w/SuperGame Bankswitch + Banked RAM", tag, owner, clock, "a78_rom_bankram", __FILE__) -{ -} - - -a78_rom_sg_9banks_device::a78_rom_sg_9banks_device(const machine_config &mconfig, device_type type, const char *name, const char *tag, device_t *owner, UINT32 clock, const char *shortname, const char *source) +a78_rom_sg9_device::a78_rom_sg9_device(const machine_config &mconfig, device_type type, const char *name, const char *tag, device_t *owner, UINT32 clock, const char *shortname, const char *source) : a78_rom_sg_device(mconfig, type, name, tag, owner, clock, shortname, source) { } -a78_rom_sg_9banks_device::a78_rom_sg_9banks_device(const machine_config &mconfig, const char *tag, device_t *owner, UINT32 clock) - : a78_rom_sg_device(mconfig, A78_ROM_SG_9BANKS, "Atari 7800 ROM Carts w/SuperGame 9Banks", tag, owner, clock, "a78_rom_sg9", __FILE__) +a78_rom_sg9_device::a78_rom_sg9_device(const machine_config &mconfig, const char *tag, device_t *owner, UINT32 clock) + : a78_rom_sg_device(mconfig, A78_ROM_SG9, "Atari 7800 ROM Carts w/SuperGame 9Banks", tag, owner, clock, "a78_rom_sg9", __FILE__) { } -a78_rom_xm_device::a78_rom_xm_device(const machine_config &mconfig, const char *tag, device_t *owner, UINT32 clock) - : a78_rom_sg_9banks_device(mconfig, A78_ROM_XM, "Atari 7800 ROM Carts w/SuperGame 9Banks + POKEY (XM demo)", tag, owner, clock, "a78_rom_xm", __FILE__), +a78_rom_sg9_pokey_device::a78_rom_sg9_pokey_device(const machine_config &mconfig, const char *tag, device_t *owner, UINT32 clock) + : a78_rom_sg9_device(mconfig, A78_ROM_SG9_POKEY, "Atari 7800 ROM Carts w/SuperGame 9Banks + POKEY", tag, owner, clock, "a78_rom_sg9p", __FILE__), m_pokey(*this, "pokey") { } @@ -130,18 +123,6 @@ void a78_rom_sg_device::device_reset() m_bank = 0; } -void a78_rom_bankram_device::device_start() -{ - save_item(NAME(m_bank)); - save_item(NAME(m_ram_bank)); -} - -void a78_rom_bankram_device::device_reset() -{ - m_bank = 0; - m_ram_bank = 0; -} - void a78_rom_abs_device::device_start() { save_item(NAME(m_bank)); @@ -300,38 +281,6 @@ WRITE8_MEMBER(a78_rom_sg_ram_device::write_40xx) } -/*------------------------------------------------- - - Carts with SuperGame bankswitch + 32K RAM: - RAM bank is selected by writing with bit5 enabled - in 0x4000-0x7fff range (bit0-bit4 give the ROM bank) - - GAMES: - - -------------------------------------------------*/ - -READ8_MEMBER(a78_rom_bankram_device::read_40xx) -{ - if (offset < 0x4000) - return m_ram[offset + (m_ram_bank * 0x4000)]; - else if (offset < 0x8000) - return m_rom[(offset & 0x3fff) + (m_bank * 0x4000)]; - else - return m_rom[(offset & 0x3fff) + (m_bank_mask * 0x4000)]; // last bank -} - -WRITE8_MEMBER(a78_rom_bankram_device::write_40xx) -{ - if (offset < 0x4000) - m_ram[offset] = data; - else if (offset < 0x8000) - { - m_bank = data & m_bank_mask; - m_ram_bank = BIT(data, 5); - } -} - - /*------------------------------------------------- Carts with SuperGame bankswitch 9banks: @@ -342,7 +291,7 @@ WRITE8_MEMBER(a78_rom_bankram_device::write_40xx) -------------------------------------------------*/ -READ8_MEMBER(a78_rom_sg_9banks_device::read_40xx) +READ8_MEMBER(a78_rom_sg9_device::read_40xx) { if (offset < 0x4000) return m_rom[(offset & 0x3fff)]; @@ -352,7 +301,7 @@ READ8_MEMBER(a78_rom_sg_9banks_device::read_40xx) return m_rom[(offset & 0x3fff) + ((m_bank_mask + 1) * 0x4000)]; // last bank } -WRITE8_MEMBER(a78_rom_sg_9banks_device::write_40xx) +WRITE8_MEMBER(a78_rom_sg9_device::write_40xx) { if (offset >= 0x4000 && offset < 0x8000) m_bank = (data & m_bank_mask) + 1; @@ -360,24 +309,29 @@ WRITE8_MEMBER(a78_rom_sg_9banks_device::write_40xx) /*------------------------------------------------- - Carts using XM expansion module or XBoarD expansion - The only game using this (Donkey Kong XM demo) is - 144K + POKEY, so that it's like the above with the - addition of the POKEY. + Carts with SuperGame bankswitch 9banks + POKEY: + This was not used in any commercial game released + during A7800 lifespan, but it is used by Donkey + Kong XM demo and by Bentley Bear's Crystal Quest + for use with XM expansion module or XBoarD expansion - GAMES: Donkey Kong XM demo + GAMES: Donkey Kong XM demo, Bentley Bear's Crystal + Quest -------------------------------------------------*/ -WRITE8_MEMBER(a78_rom_xm_device::write_40xx) +WRITE8_MEMBER(a78_rom_sg9_pokey_device::write_40xx) { if (offset < 0x4000) + { + printf("write offs 0x%X data 0x%X\n", offset, data); m_pokey->write(space, offset & 0x0f, data); + } else if (offset < 0x8000) m_bank = (data & m_bank_mask) + 1; } -machine_config_constructor a78_rom_xm_device::device_mconfig_additions() const +machine_config_constructor a78_rom_sg9_pokey_device::device_mconfig_additions() const { return MACHINE_CONFIG_NAME( a78_pokey ); } diff --git a/src/emu/bus/a7800/rom.h b/src/emu/bus/a7800/rom.h index 2554e67d37e..335c8aba1d9 100644 --- a/src/emu/bus/a7800/rom.h +++ b/src/emu/bus/a7800/rom.h @@ -98,35 +98,14 @@ public: }; -// ======================> a78_rom_bankram_device +// ======================> a78_rom_sg9_device -class a78_rom_bankram_device : public a78_rom_sg_device +class a78_rom_sg9_device : public a78_rom_sg_device { public: // construction/destruction - a78_rom_bankram_device(const machine_config &mconfig, const char *tag, device_t *owner, UINT32 clock); - - // device-level overrides - virtual void device_start(); - virtual void device_reset(); - - // reading and writing - virtual DECLARE_READ8_MEMBER(read_40xx); - virtual DECLARE_WRITE8_MEMBER(write_40xx); - -protected: - int m_ram_bank; -}; - - -// ======================> a78_rom_sg_9banks_device - -class a78_rom_sg_9banks_device : public a78_rom_sg_device -{ -public: - // construction/destruction - a78_rom_sg_9banks_device(const machine_config &mconfig, device_type type, const char *name, const char *tag, device_t *owner, UINT32 clock, const char *shortname, const char *source); - a78_rom_sg_9banks_device(const machine_config &mconfig, const char *tag, device_t *owner, UINT32 clock); + a78_rom_sg9_device(const machine_config &mconfig, device_type type, const char *name, const char *tag, device_t *owner, UINT32 clock, const char *shortname, const char *source); + a78_rom_sg9_device(const machine_config &mconfig, const char *tag, device_t *owner, UINT32 clock); // reading and writing virtual DECLARE_READ8_MEMBER(read_40xx); @@ -134,13 +113,13 @@ public: }; -// ======================> a78_rom_xm_device +// ======================> a78_rom_sg9_pokey_device -class a78_rom_xm_device : public a78_rom_sg_9banks_device +class a78_rom_sg9_pokey_device : public a78_rom_sg9_device { public: // construction/destruction - a78_rom_xm_device(const machine_config &mconfig, const char *tag, device_t *owner, UINT32 clock); + a78_rom_sg9_pokey_device(const machine_config &mconfig, const char *tag, device_t *owner, UINT32 clock); // device-level overrides virtual machine_config_constructor device_mconfig_additions() const; @@ -201,9 +180,8 @@ 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_BANKRAM; -extern const device_type A78_ROM_SG_9BANKS; -extern const device_type A78_ROM_XM; +extern const device_type A78_ROM_SG9; +extern const device_type A78_ROM_SG9_POKEY; extern const device_type A78_ROM_ABSOLUTE; extern const device_type A78_ROM_ACTIVISION; diff --git a/src/emu/bus/a7800/xboard.c b/src/emu/bus/a7800/xboard.c index 9e0fb5b5fa0..cd93f2a23a2 100644 --- a/src/emu/bus/a7800/xboard.c +++ b/src/emu/bus/a7800/xboard.c @@ -121,7 +121,7 @@ static MACHINE_CONFIG_FRAGMENT( a78_xm ) MCFG_SOUND_ADD("xb_pokey", POKEY, XTAL_14_31818MHz/8) MCFG_SOUND_ROUTE(ALL_OUTPUTS, "xb_speaker", 1.00) - MCFG_SOUND_ADD("xm_ym2151", YM2151, XTAL_14_31818MHz/8) + MCFG_SOUND_ADD("xm_ym2151", YM2151, XTAL_14_31818MHz/4) MCFG_SOUND_ROUTE(ALL_OUTPUTS, "xb_speaker", 1.00) MACHINE_CONFIG_END @@ -228,6 +228,7 @@ WRITE8_MEMBER(a78_xm_device::write_04xx) m_xbslot->write_04xx(space, offset - 0x10, data); // access second POKEY else if (offset >= 0x70 && offset < 0x80) { + //printf("regs 0x%X\n", data); if (data == 0x84) m_ym_enabled = 1; m_reg = data; diff --git a/src/emu/bus/bus.mak b/src/emu/bus/bus.mak index 044791dad01..16e9ac36970 100644 --- a/src/emu/bus/bus.mak +++ b/src/emu/bus/bus.mak @@ -25,6 +25,7 @@ BUSOBJS += $(BUSOBJ)/a7800/a78_slot.o BUSOBJS += $(BUSOBJ)/a7800/rom.o BUSOBJS += $(BUSOBJ)/a7800/hiscore.o BUSOBJS += $(BUSOBJ)/a7800/xboard.o +BUSOBJS += $(BUSOBJ)/a7800/cpuwiz.o endif diff --git a/src/mess/drivers/a7800.c b/src/mess/drivers/a7800.c index 352b934e638..7fa3e422a2a 100644 --- a/src/mess/drivers/a7800.c +++ b/src/mess/drivers/a7800.c @@ -1323,6 +1323,7 @@ void a7800_state::machine_start() 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)); break; case A78_XB_BOARD: + case A78_VERSAPOKEY: // POKEY and RAM regs at 0x400-0x47f 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)); break;