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;