diff --git a/hash/a7800.xml b/hash/a7800.xml
index 641934c513f..3061a049fcd 100644
--- a/hash/a7800.xml
+++ b/hash/a7800.xml
@@ -2436,41 +2436,11 @@ almost nothing like the prototype.
-
-
- Donkey Kong (homebrew, XM enhanced, HSC support) (Demo)
+ Donkey Kong (PAL, Demo, XM enhanced)
2012
- <homebrew>
-
-
-
-
-
-
-
-
-
-
-
- Donkey Kong (homebrew, XM enhanced, HSC support) (Demo) (NTSC)
- 2012
- <homebrew>
-
-
-
-
-
-
-
-
-
-
-
- Donkey Kong (homebrew, XM enhanced) (Demo)
- 2012
- <homebrew>
+ <homebrew>
+
@@ -2482,9 +2452,10 @@ almost nothing like the prototype.
- Donkey Kong (homebrew, XM enhanced) (Demo) (NTSC)
+ Donkey Kong (NTSC, Demo, XM enhanced)
2012
- <homebrew>
+ <homebrew>
+
diff --git a/src/emu/bus/a7800/xboard.c b/src/emu/bus/a7800/xboard.c
index 5a29d6b2af9..8a6c1ce90e3 100644
--- a/src/emu/bus/a7800/xboard.c
+++ b/src/emu/bus/a7800/xboard.c
@@ -37,8 +37,6 @@
TODO:
- verify what happens when 2 POKEYs are present
- - understand why high score in XM is not written to NVRAM
- - add Yamaha YM2151 when more clear specs are available
***********************************************************************************************************/
@@ -73,7 +71,8 @@ a78_xboard_device::a78_xboard_device(const machine_config &mconfig, const char *
a78_xm_device::a78_xm_device(const machine_config &mconfig, const char *tag, device_t *owner, UINT32 clock)
- : a78_xboard_device(mconfig, A78_XM, "Atari 7800 XM expansion module", tag, owner, clock, "a78_xm", __FILE__)
+ : a78_xboard_device(mconfig, A78_XM, "Atari 7800 XM expansion module", tag, owner, clock, "a78_xm", __FILE__),
+ m_ym(*this, "xm_ym2151")
{
}
@@ -90,6 +89,20 @@ void a78_xboard_device::device_reset()
m_ram_bank = 0;
}
+void a78_xm_device::device_start()
+{
+ save_item(NAME(m_reg));
+ save_item(NAME(m_ram_bank));
+ save_item(NAME(m_ym_enabled));
+}
+
+void a78_xm_device::device_reset()
+{
+ m_reg = 0;
+ m_ram_bank = 0;
+ m_ym_enabled = 0;
+}
+
static MACHINE_CONFIG_FRAGMENT( a78_xb )
MCFG_A78_CARTRIDGE_ADD("xb_slot", a7800_cart, NULL)
@@ -100,11 +113,27 @@ static MACHINE_CONFIG_FRAGMENT( a78_xb )
MCFG_SOUND_ROUTE(ALL_OUTPUTS, "xb_speaker", 1.00)
MACHINE_CONFIG_END
+static MACHINE_CONFIG_FRAGMENT( a78_xm )
+ MCFG_A78_CARTRIDGE_ADD("xb_slot", a7800_cart, NULL)
+
+ MCFG_SPEAKER_STANDARD_MONO("xb_speaker")
+
+ 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_ROUTE(ALL_OUTPUTS, "xb_speaker", 1.00)
+MACHINE_CONFIG_END
+
machine_config_constructor a78_xboard_device::device_mconfig_additions() const
{
return MACHINE_CONFIG_NAME( a78_xb );
}
+machine_config_constructor a78_xm_device::device_mconfig_additions() const
+{
+ return MACHINE_CONFIG_NAME( a78_xm );
+}
/*-------------------------------------------------
mapper specific handlers
@@ -177,3 +206,32 @@ READ8_MEMBER(a78_xm_device::read_30xx)
return m_rom[offset];
}
+READ8_MEMBER(a78_xm_device::read_04xx)
+{
+ if (BIT(m_reg, 4) && offset >= 0x50 && offset < 0x60)
+ return m_pokey->read(space, offset & 0x0f);
+ else if (m_ym_enabled && offset >= 0x60 && offset <= 0x61)
+ return m_ym->read(space, offset & 1);
+ else if (BIT(m_reg, 4) && offset >= 0x60 && offset < 0x70)
+ return m_xbslot->read_04xx(space, offset - 0x10); // access second POKEY
+ else
+ return 0xff;
+}
+
+WRITE8_MEMBER(a78_xm_device::write_04xx)
+{
+ if (BIT(m_reg, 4) && offset >= 0x50 && offset < 0x60)
+ m_pokey->write(space, offset & 0x0f, data);
+ else if (m_ym_enabled && offset >= 0x60 && offset <= 0x61)
+ m_ym->write(space, offset & 1, data);
+ else if (BIT(m_reg, 4) && offset >= 0x60 && offset < 0x70)
+ m_xbslot->write_04xx(space, offset - 0x10, data); // access second POKEY
+ else if (offset >= 0x70 && offset < 0x80)
+ {
+ if (data == 0x84)
+ m_ym_enabled = 1;
+ m_reg = data;
+ m_ram_bank = m_reg & 7;
+ }
+}
+
diff --git a/src/emu/bus/a7800/xboard.h b/src/emu/bus/a7800/xboard.h
index 011894b56ef..f8c843d35c1 100644
--- a/src/emu/bus/a7800/xboard.h
+++ b/src/emu/bus/a7800/xboard.h
@@ -4,6 +4,7 @@
#include "a78_slot.h"
#include "rom.h"
#include "sound/pokey.h"
+#include "sound/2151intf.h"
// ======================> a78_xboard_device
@@ -41,10 +42,21 @@ public:
// construction/destruction
a78_xm_device(const machine_config &mconfig, const char *tag, device_t *owner, UINT32 clock);
+ // device-level overrides
+ virtual void device_start();
+ virtual machine_config_constructor device_mconfig_additions() const;
+ virtual void device_reset();
+
// reading and writing
+ virtual DECLARE_READ8_MEMBER(read_04xx);
+ virtual DECLARE_WRITE8_MEMBER(write_04xx);
virtual DECLARE_READ8_MEMBER(read_10xx);
virtual DECLARE_WRITE8_MEMBER(write_10xx);
virtual DECLARE_READ8_MEMBER(read_30xx);
+
+protected:
+ required_device m_ym;
+ int m_ym_enabled;
};