summaryrefslogtreecommitdiffstatshomepage
path: root/src/emu/bus/abcbus
diff options
context:
space:
mode:
author Curt Coder <curtcoder@mail.com>2013-10-20 19:31:44 +0000
committer Curt Coder <curtcoder@mail.com>2013-10-20 19:31:44 +0000
commitd2236708b3ca7fc0472e9e4915e0ba4dd01c4089 (patch)
treece3f33a76988eabd3981048a76c9a3871c0f5a56 /src/emu/bus/abcbus
parentcc9274b5bad0cdb997e7db8e9f73a78277bc9308 (diff)
(MESS) abcbus: Moved under emu/bus. (nw)
Diffstat (limited to 'src/emu/bus/abcbus')
-rw-r--r--src/emu/bus/abcbus/abc890.c280
-rw-r--r--src/emu/bus/abcbus/abc890.h107
-rw-r--r--src/emu/bus/abcbus/abcbus.c315
-rw-r--r--src/emu/bus/abcbus/abcbus.h201
-rw-r--r--src/emu/bus/abcbus/dos.c146
-rw-r--r--src/emu/bus/abcbus/dos.h56
-rw-r--r--src/emu/bus/abcbus/fd2.c236
-rw-r--r--src/emu/bus/abcbus/fd2.h67
-rw-r--r--src/emu/bus/abcbus/hdc.c163
-rw-r--r--src/emu/bus/abcbus/hdc.h63
-rw-r--r--src/emu/bus/abcbus/lux10828.c705
-rw-r--r--src/emu/bus/abcbus/lux10828.h121
-rw-r--r--src/emu/bus/abcbus/lux21046.c792
-rw-r--r--src/emu/bus/abcbus/lux21046.h131
-rw-r--r--src/emu/bus/abcbus/sio.c199
-rw-r--r--src/emu/bus/abcbus/sio.h53
-rw-r--r--src/emu/bus/abcbus/slutprov.c79
-rw-r--r--src/emu/bus/abcbus/slutprov.h44
-rw-r--r--src/emu/bus/abcbus/turbo.c174
-rw-r--r--src/emu/bus/abcbus/turbo.h63
-rw-r--r--src/emu/bus/abcbus/uni800.c110
-rw-r--r--src/emu/bus/abcbus/uni800.h44
-rw-r--r--src/emu/bus/abcbus/xebec.c156
-rw-r--r--src/emu/bus/abcbus/xebec.h63
24 files changed, 4368 insertions, 0 deletions
diff --git a/src/emu/bus/abcbus/abc890.c b/src/emu/bus/abcbus/abc890.c
new file mode 100644
index 00000000000..f7f91c292dc
--- /dev/null
+++ b/src/emu/bus/abcbus/abc890.c
@@ -0,0 +1,280 @@
+// license:BSD-3-Clause
+// copyright-holders:Curt Coder
+/**********************************************************************
+
+ Luxor ABC 890 bus expander emulation
+
+ Copyright MESS Team.
+ Visit http://mamedev.org for licensing and usage restrictions.
+
+*********************************************************************/
+
+#include "abc890.h"
+
+
+
+//**************************************************************************
+// DEVICE DEFINITIONS
+//**************************************************************************
+
+const device_type ABC890 = &device_creator<abc890_device>;
+const device_type ABC894 = &device_creator<abc894_device>;
+const device_type ABC850 = &device_creator<abc850_device>;
+
+
+//-------------------------------------------------
+// MACHINE_DRIVER( abc890 )
+//-------------------------------------------------
+
+static MACHINE_CONFIG_FRAGMENT( abc890 )
+ MCFG_ABCBUS_SLOT_ADD("io1", abcbus_cards, NULL)
+ MCFG_ABCBUS_SLOT_ADD("io2", abcbus_cards, NULL)
+ MCFG_ABCBUS_SLOT_ADD("io3", abcbus_cards, NULL)
+ MCFG_ABCBUS_SLOT_ADD("io4", abcbus_cards, NULL)
+ MCFG_ABCBUS_SLOT_ADD("mem1", abcbus_cards, NULL)
+ MCFG_ABCBUS_SLOT_ADD("mem2", abcbus_cards, NULL)
+ MCFG_ABCBUS_SLOT_ADD("mem3", abcbus_cards, NULL)
+MACHINE_CONFIG_END
+
+
+//-------------------------------------------------
+// machine_config_additions - device-specific
+// machine configurations
+//-------------------------------------------------
+
+machine_config_constructor abc890_device::device_mconfig_additions() const
+{
+ return MACHINE_CONFIG_NAME( abc890 );
+}
+
+
+//-------------------------------------------------
+// MACHINE_DRIVER( abc894 )
+//-------------------------------------------------
+
+static MACHINE_CONFIG_FRAGMENT( abc894 )
+ MCFG_ABCBUS_SLOT_ADD("io1", abcbus_cards, NULL)
+ MCFG_ABCBUS_SLOT_ADD("io2", abcbus_cards, NULL)
+ MCFG_ABCBUS_SLOT_ADD("io3", abcbus_cards, NULL)
+MACHINE_CONFIG_END
+
+
+//-------------------------------------------------
+// machine_config_additions - device-specific
+// machine configurations
+//-------------------------------------------------
+
+machine_config_constructor abc894_device::device_mconfig_additions() const
+{
+ return MACHINE_CONFIG_NAME( abc894 );
+}
+
+
+//-------------------------------------------------
+// MACHINE_DRIVER( abc850 )
+//-------------------------------------------------
+
+static MACHINE_CONFIG_FRAGMENT( abc850 )
+ MCFG_ABCBUS_SLOT_ADD("io1", abcbus_cards, "fast")
+ MCFG_DEVICE_CARD_DEVICE_INPUT_DEFAULTS("fast", abc850_fast)
+ MCFG_ABCBUS_SLOT_ADD("io2", abcbus_cards, "hdc")
+ MCFG_ABCBUS_SLOT_ADD("io3", abcbus_cards, NULL)
+ MCFG_ABCBUS_SLOT_ADD("io4", abcbus_cards, NULL)
+ MCFG_ABCBUS_SLOT_ADD("io5", abcbus_cards, NULL)
+ MCFG_ABCBUS_SLOT_ADD("io6", abcbus_cards, NULL)
+ MCFG_ABCBUS_SLOT_ADD("io7", abcbus_cards, NULL)
+MACHINE_CONFIG_END
+
+
+//-------------------------------------------------
+// machine_config_additions - device-specific
+// machine configurations
+//-------------------------------------------------
+
+machine_config_constructor abc850_device::device_mconfig_additions() const
+{
+ return MACHINE_CONFIG_NAME( abc850 );
+}
+
+
+
+//**************************************************************************
+// LIVE DEVICE
+//**************************************************************************
+
+//-------------------------------------------------
+// abc890_device - constructor
+//-------------------------------------------------
+
+abc890_device::abc890_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)
+ : device_t(mconfig, type, name, tag, owner, clock, shortname, source),
+ device_abcbus_card_interface(mconfig, *this)
+{
+}
+
+abc890_device::abc890_device(const machine_config &mconfig, const char *tag, device_t *owner, UINT32 clock)
+ : device_t(mconfig, ABC890, "ABC 890", tag, owner, clock, "abc890", __FILE__),
+ device_abcbus_card_interface(mconfig, *this),
+ m_slots(7)
+{
+}
+
+abc894_device::abc894_device(const machine_config &mconfig, const char *tag, device_t *owner, UINT32 clock)
+ : abc890_device(mconfig, ABC894, "ABC 894", tag, owner, clock, "abc894", __FILE__)
+{
+ m_slots = 3;
+}
+
+abc850_device::abc850_device(const machine_config &mconfig, const char *tag, device_t *owner, UINT32 clock)
+ : abc890_device(mconfig, ABC850, "ABC 850", tag, owner, clock, "abc850", __FILE__)
+{
+ m_slots = 7;
+}
+
+
+//-------------------------------------------------
+// device_start - device-specific startup
+//-------------------------------------------------
+
+void abc890_device::device_start()
+{
+ // find devices
+ m_expansion_slot[0] = dynamic_cast<abcbus_slot_device *>(subdevice("io1"));
+ m_expansion_slot[1] = dynamic_cast<abcbus_slot_device *>(subdevice("io2"));
+ m_expansion_slot[2] = dynamic_cast<abcbus_slot_device *>(subdevice("io3"));
+ m_expansion_slot[3] = dynamic_cast<abcbus_slot_device *>(subdevice("io4"));
+ m_expansion_slot[4] = dynamic_cast<abcbus_slot_device *>(subdevice("mem1"));
+ m_expansion_slot[5] = dynamic_cast<abcbus_slot_device *>(subdevice("mem2"));
+ m_expansion_slot[6] = dynamic_cast<abcbus_slot_device *>(subdevice("mem3"));
+}
+
+void abc894_device::device_start()
+{
+ // find devices
+ m_expansion_slot[0] = dynamic_cast<abcbus_slot_device *>(subdevice("io1"));
+ m_expansion_slot[1] = dynamic_cast<abcbus_slot_device *>(subdevice("io2"));
+ m_expansion_slot[2] = dynamic_cast<abcbus_slot_device *>(subdevice("io3"));
+}
+
+void abc850_device::device_start()
+{
+ // find devices
+ m_expansion_slot[0] = dynamic_cast<abcbus_slot_device *>(subdevice("io1"));
+ m_expansion_slot[1] = dynamic_cast<abcbus_slot_device *>(subdevice("io2"));
+ m_expansion_slot[2] = dynamic_cast<abcbus_slot_device *>(subdevice("io3"));
+ m_expansion_slot[3] = dynamic_cast<abcbus_slot_device *>(subdevice("io4"));
+ m_expansion_slot[4] = dynamic_cast<abcbus_slot_device *>(subdevice("io5"));
+ m_expansion_slot[5] = dynamic_cast<abcbus_slot_device *>(subdevice("io6"));
+ m_expansion_slot[6] = dynamic_cast<abcbus_slot_device *>(subdevice("io7"));
+}
+
+
+//-------------------------------------------------
+// device_reset - device-specific reset
+//-------------------------------------------------
+
+void abc890_device::device_reset()
+{
+ for (int i = 0; i < m_slots; i++)
+ {
+ m_expansion_slot[i]->reset();
+ }
+}
+
+
+
+//**************************************************************************
+// ABC BUS INTERFACE
+//**************************************************************************
+
+void abc890_device::abcbus_cs(UINT8 data)
+{
+ for (int i = 0; i < m_slots; i++)
+ {
+ m_expansion_slot[i]->cs_w(data);
+ }
+}
+
+UINT8 abc890_device::abcbus_inp()
+{
+ UINT8 data = 0xff;
+
+ for (int i = 0; i < m_slots; i++)
+ {
+ data &= m_expansion_slot[i]->inp_r();
+ }
+
+ return data;
+}
+
+void abc890_device::abcbus_utp(UINT8 data)
+{
+ for (int i = 0; i < m_slots; i++)
+ {
+ m_expansion_slot[i]->utp_w(data);
+ }
+}
+
+UINT8 abc890_device::abcbus_stat()
+{
+ UINT8 data = 0xff;
+
+ for (int i = 0; i < m_slots; i++)
+ {
+ data &= m_expansion_slot[i]->stat_r();
+ }
+
+ return data;
+}
+
+void abc890_device::abcbus_c1(UINT8 data)
+{
+ for (int i = 0; i < m_slots; i++)
+ {
+ m_expansion_slot[i]->c1_w(data);
+ }
+}
+
+void abc890_device::abcbus_c2(UINT8 data)
+{
+ for (int i = 0; i < m_slots; i++)
+ {
+ m_expansion_slot[i]->c2_w(data);
+ }
+}
+
+void abc890_device::abcbus_c3(UINT8 data)
+{
+ for (int i = 0; i < m_slots; i++)
+ {
+ m_expansion_slot[i]->c3_w(data);
+ }
+}
+
+void abc890_device::abcbus_c4(UINT8 data)
+{
+ for (int i = 0; i < m_slots; i++)
+ {
+ m_expansion_slot[i]->c4_w(data);
+ }
+}
+
+UINT8 abc890_device::abcbus_xmemfl(offs_t offset)
+{
+ UINT8 data = 0xff;
+
+ for (int i = 0; i < m_slots; i++)
+ {
+ data &= m_expansion_slot[i]->xmemfl_r(offset);
+ }
+
+ return data;
+}
+
+void abc890_device::abcbus_xmemw(offs_t offset, UINT8 data)
+{
+ for (int i = 0; i < m_slots; i++)
+ {
+ m_expansion_slot[i]->xmemw_w(offset, data);
+ }
+}
diff --git a/src/emu/bus/abcbus/abc890.h b/src/emu/bus/abcbus/abc890.h
new file mode 100644
index 00000000000..d1b271a7f5e
--- /dev/null
+++ b/src/emu/bus/abcbus/abc890.h
@@ -0,0 +1,107 @@
+// license:BSD-3-Clause
+// copyright-holders:Curt Coder
+/**********************************************************************
+
+ Luxor ABC 890 bus expander emulation
+
+ Copyright MESS Team.
+ Visit http://mamedev.org for licensing and usage restrictions.
+
+*********************************************************************/
+
+#pragma once
+
+#ifndef __ABC890__
+#define __ABC890__
+
+#include "emu.h"
+#include "abcbus.h"
+
+
+
+//**************************************************************************
+// MACROS/CONSTANTS
+//**************************************************************************
+
+#define MAX_SLOTS 8
+
+
+
+//**************************************************************************
+// TYPE DEFINITIONS
+//**************************************************************************
+
+// ======================> abc890_device
+
+class abc890_device : public device_t,
+ public device_abcbus_card_interface
+{
+public:
+ // construction/destruction
+ abc890_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);
+ abc890_device(const machine_config &mconfig, const char *tag, device_t *owner, UINT32 clock);
+
+ // optional information overrides
+ virtual machine_config_constructor device_mconfig_additions() const;
+
+protected:
+ // device-level overrides
+ virtual void device_start();
+ virtual void device_reset();
+
+ // device_abcbus_interface overrides
+ virtual void abcbus_cs(UINT8 data);
+ virtual UINT8 abcbus_inp();
+ virtual void abcbus_utp(UINT8 data);
+ virtual UINT8 abcbus_stat();
+ virtual void abcbus_c1(UINT8 data);
+ virtual void abcbus_c2(UINT8 data);
+ virtual void abcbus_c3(UINT8 data);
+ virtual void abcbus_c4(UINT8 data);
+ virtual UINT8 abcbus_xmemfl(offs_t offset);
+ virtual void abcbus_xmemw(offs_t offset, UINT8 data);
+
+ int m_slots;
+
+ abcbus_slot_device *m_expansion_slot[MAX_SLOTS];
+};
+
+
+class abc894_device : public abc890_device
+{
+public:
+ // construction/destruction
+ abc894_device(const machine_config &mconfig, const char *tag, device_t *owner, UINT32 clock);
+
+ // optional information overrides
+ virtual machine_config_constructor device_mconfig_additions() const;
+
+protected:
+ // device-level overrides
+ virtual void device_start();
+};
+
+
+class abc850_device : public abc890_device
+{
+public:
+ // construction/destruction
+ abc850_device(const machine_config &mconfig, const char *tag, device_t *owner, UINT32 clock);
+
+ // optional information overrides
+ virtual machine_config_constructor device_mconfig_additions() const;
+
+protected:
+ // device-level overrides
+ virtual void device_start();
+};
+
+
+// device type definition
+extern const device_type ABC890;
+extern const device_type ABC894;
+extern const device_type ABC850;
+
+
+
+#endif
diff --git a/src/emu/bus/abcbus/abcbus.c b/src/emu/bus/abcbus/abcbus.c
new file mode 100644
index 00000000000..80760bd3f1f
--- /dev/null
+++ b/src/emu/bus/abcbus/abcbus.c
@@ -0,0 +1,315 @@
+// license:BSD-3-Clause
+// copyright-holders:Curt Coder
+/**********************************************************************
+
+ Luxor ABC (Databoard 4680) Bus emulation
+
+ Copyright MESS Team.
+ Visit http://mamedev.org for licensing and usage restrictions.
+
+**********************************************************************/
+
+#include "abcbus.h"
+
+
+
+//**************************************************************************
+// GLOBAL VARIABLES
+//**************************************************************************
+
+const device_type ABCBUS_SLOT = &device_creator<abcbus_slot_device>;
+
+
+
+//**************************************************************************
+// DEVICE ABCBUS CARD INTERFACE
+//**************************************************************************
+
+//-------------------------------------------------
+// device_abcbus_card_interface - constructor
+//-------------------------------------------------
+
+device_abcbus_card_interface::device_abcbus_card_interface(const machine_config &mconfig, device_t &device)
+ : device_slot_card_interface(mconfig, device)
+{
+ m_slot = dynamic_cast<abcbus_slot_device *>(device.owner());
+}
+
+
+
+//**************************************************************************
+// LIVE DEVICE
+//**************************************************************************
+
+//-------------------------------------------------
+// abcbus_slot_device - constructor
+//-------------------------------------------------
+
+abcbus_slot_device::abcbus_slot_device(const machine_config &mconfig, const char *tag, device_t *owner, UINT32 clock) :
+ device_t(mconfig, ABCBUS_SLOT, "ABC bus slot", tag, owner, clock, "abcbus_slot", __FILE__),
+ device_slot_interface(mconfig, *this),
+ m_write_int(*this),
+ m_write_nmi(*this),
+ m_write_rdy(*this),
+ m_write_resin(*this)
+{
+}
+
+
+//-------------------------------------------------
+// device_start - device-specific startup
+//-------------------------------------------------
+
+void abcbus_slot_device::device_start()
+{
+ m_card = dynamic_cast<device_abcbus_card_interface *>(get_card_device());
+
+ // resolve callbacks
+ m_write_int.resolve_safe();
+ m_write_nmi.resolve_safe();
+ m_write_rdy.resolve_safe();
+ m_write_resin.resolve_safe();
+}
+
+
+//-------------------------------------------------
+// device_reset - device-specific reset
+//-------------------------------------------------
+
+void abcbus_slot_device::device_reset()
+{
+ if (m_card != NULL)
+ {
+ get_card_device()->reset();
+ }
+}
+
+
+//-------------------------------------------------
+// cs_w -
+//-------------------------------------------------
+
+void abcbus_slot_device::cs_w(UINT8 data)
+{
+ if (m_card != NULL)
+ {
+ m_card->abcbus_cs(data);
+ }
+}
+
+WRITE8_MEMBER( abcbus_slot_device::cs_w )
+{
+ cs_w(data);
+}
+
+
+//-------------------------------------------------
+// rst_r -
+//-------------------------------------------------
+
+UINT8 abcbus_slot_device::rst_r()
+{
+ device_reset();
+
+ return 0xff;
+}
+
+READ8_MEMBER( abcbus_slot_device::rst_r )
+{
+ return rst_r();
+}
+
+
+//-------------------------------------------------
+// inp_r -
+//-------------------------------------------------
+
+UINT8 abcbus_slot_device::inp_r()
+{
+ UINT8 data = 0xff;
+
+ if (m_card != NULL)
+ {
+ data &= m_card->abcbus_inp();
+ }
+
+ return data;
+}
+
+READ8_MEMBER( abcbus_slot_device::inp_r )
+{
+ return inp_r();
+}
+
+
+//-------------------------------------------------
+// utp_w -
+//-------------------------------------------------
+
+void abcbus_slot_device::utp_w(UINT8 data)
+{
+ if (m_card != NULL)
+ {
+ m_card->abcbus_utp(data);
+ }
+}
+
+WRITE8_MEMBER( abcbus_slot_device::utp_w )
+{
+ utp_w(data);
+}
+
+
+//-------------------------------------------------
+// stat_r -
+//-------------------------------------------------
+
+UINT8 abcbus_slot_device::stat_r()
+{
+ UINT8 data = 0xff;
+
+ if (m_card != NULL)
+ {
+ data &= m_card->abcbus_stat();
+ }
+
+ return data;
+}
+
+READ8_MEMBER( abcbus_slot_device::stat_r )
+{
+ return stat_r();
+}
+
+
+//-------------------------------------------------
+// c1_w -
+//-------------------------------------------------
+
+void abcbus_slot_device::c1_w(UINT8 data)
+{
+ if (m_card != NULL)
+ {
+ m_card->abcbus_c1(data);
+ }
+}
+
+WRITE8_MEMBER( abcbus_slot_device::c1_w )
+{
+ c1_w(data);
+}
+
+
+//-------------------------------------------------
+// c2_w -
+//-------------------------------------------------
+
+void abcbus_slot_device::c2_w(UINT8 data)
+{
+ if (m_card != NULL)
+ {
+ m_card->abcbus_c2(data);
+ }
+}
+
+WRITE8_MEMBER( abcbus_slot_device::c2_w )
+{
+ c2_w(data);
+}
+
+
+//-------------------------------------------------
+// c3_w -
+//-------------------------------------------------
+
+void abcbus_slot_device::c3_w(UINT8 data)
+{
+ if (m_card != NULL)
+ {
+ m_card->abcbus_c3(data);
+ }
+}
+
+WRITE8_MEMBER( abcbus_slot_device::c3_w )
+{
+ c3_w(data);
+}
+
+
+//-------------------------------------------------
+// c4_w -
+//-------------------------------------------------
+
+void abcbus_slot_device::c4_w(UINT8 data)
+{
+ if (m_card != NULL)
+ {
+ m_card->abcbus_c4(data);
+ }
+}
+
+WRITE8_MEMBER( abcbus_slot_device::c4_w )
+{
+ c4_w(data);
+}
+
+
+//-------------------------------------------------
+// xmemfl_r -
+//-------------------------------------------------
+
+UINT8 abcbus_slot_device::xmemfl_r(offs_t offset)
+{
+ UINT8 data = 0xff;
+
+ if (m_card != NULL)
+ {
+ data &= m_card->abcbus_xmemfl(offset);
+ }
+
+ return data;
+}
+
+READ8_MEMBER( abcbus_slot_device::xmemfl_r )
+{
+ return xmemfl_r(offset);
+}
+
+
+//-------------------------------------------------
+// xmemw_w -
+//-------------------------------------------------
+
+void abcbus_slot_device::xmemw_w(offs_t offset, UINT8 data)
+{
+ if (m_card != NULL)
+ {
+ m_card->abcbus_xmemw(offset, data);
+ }
+}
+
+WRITE8_MEMBER( abcbus_slot_device::xmemw_w )
+{
+ xmemw_w(offset, data);
+}
+
+
+//-------------------------------------------------
+// SLOT_INTERFACE( abcbus_cards )
+//-------------------------------------------------
+
+SLOT_INTERFACE_START( abcbus_cards )
+ SLOT_INTERFACE("exp", ABC890)
+ SLOT_INTERFACE("exp3", ABC894)
+ SLOT_INTERFACE("hdc", ABC_HDC)
+ SLOT_INTERFACE("hdd", ABC850)
+ SLOT_INTERFACE("dos", ABC_DOS)
+ SLOT_INTERFACE("fd2", ABC_FD2)
+ SLOT_INTERFACE("sio", ABC_SIO)
+ SLOT_INTERFACE("slow", LUXOR_55_10828)
+ SLOT_INTERFACE("fast", LUXOR_55_21046)
+ SLOT_INTERFACE("uni800", ABC_UNI800)
+ SLOT_INTERFACE("slutprov", ABC_SLUTPROV)
+ SLOT_INTERFACE("turbo", TURBO_KONTROLLER)
+ SLOT_INTERFACE("xebec", ABC_XEBEC)
+SLOT_INTERFACE_END
diff --git a/src/emu/bus/abcbus/abcbus.h b/src/emu/bus/abcbus/abcbus.h
new file mode 100644
index 00000000000..2508dea6003
--- /dev/null
+++ b/src/emu/bus/abcbus/abcbus.h
@@ -0,0 +1,201 @@
+// license:BSD-3-Clause
+// copyright-holders:Curt Coder
+/**********************************************************************
+
+ Luxor ABC (Databoard 4680) Bus emulation
+
+ Copyright MESS Team.
+ Visit http://mamedev.org for licensing and usage restrictions.
+
+**********************************************************************
+
+ a b
+ -12 V <-- * 1 * --> -12V
+ 0 V --- * 2 * --- 0 V
+ RESIN_ --> * 3 * --> XMEMWR_
+ 0 V --- * 4 * --> XMEMFL_
+ INT_ --> * 5 * --> phi
+ D7 <-> * 6 * --- 0 V
+ D6 <-> * 7 * --- 0 V
+ D5 <-> * 8 * --- 0 V
+ D4 <-> * 9 * --- 0 V
+ D3 <-> * 10 * --- 0 V
+ D2 <-> * 11 * --- 0 V
+ D1 <-> * 12 * --- 0 V
+ D0 <-> * 13 * --- 0 V
+ * 14 * --> A15
+ RST_ <-- * 15 * --> A14
+ IN1 <-- * 16 * --> A13
+ IN0 <-- * 17 * --> A12
+ OUT5 <-- * 18 * --> A11
+ OUT4 <-- * 19 * --> A10
+ OUT3 <-- * 20 * --> A9
+ OUT2 <-- * 21 * --> A8
+ OUT0 <-- * 22 * --> A7
+ OUT1 <-- * 23 * --> A6
+ NMI_ --> * 24 * --> A5
+ INP2_ <-- * 25 * --> A4
+ XINPSTB_ <-- * 26 * --> A3
+ XOUTPSTB_ <-- * 27 * --> A2
+ XM_ --> * 28 * --> A1
+ RFSH_ <-- * 29 * --> A0
+ RDY --> * 30 * --> MEMRQ_
+ +5 V <-- * 31 * --> +5 V
+ +12 V <-- * 32 * --> +12 V
+
+**********************************************************************/
+
+/*
+
+ OUT 0 _OUT data output
+ OUT 1 _CS card select
+ OUT 2 _C1 command 1
+ OUT 3 _C2 command 2
+ OUT 4 _C3 command 3
+ OUT 5 _C4 command 4
+
+ IN 0 _INP data input
+ IN 1 _STAT status in
+ IN 7 RST reset
+
+*/
+
+#pragma once
+
+#ifndef __ABCBUS__
+#define __ABCBUS__
+
+#include "emu.h"
+
+
+//**************************************************************************
+// CONSTANTS
+//**************************************************************************
+
+#define ABCBUS_TAG "bus"
+
+
+
+//**************************************************************************
+// INTERFACE CONFIGURATION MACROS
+//**************************************************************************
+
+#define MCFG_ABCBUS_SLOT_ADD(_tag, _slot_intf, _def_slot) \
+ MCFG_DEVICE_ADD(_tag, ABCBUS_SLOT, 0) \
+ MCFG_DEVICE_SLOT_INTERFACE(_slot_intf, _def_slot, false)
+
+
+
+//**************************************************************************
+// TYPE DEFINITIONS
+//**************************************************************************
+
+// ======================> abcbus_slot_device
+
+class device_abcbus_card_interface;
+
+class abcbus_slot_device : public device_t,
+ public device_slot_interface
+{
+public:
+ // construction/destruction
+ abcbus_slot_device(const machine_config &mconfig, const char *tag, device_t *owner, UINT32 clock);
+
+ // computer interface
+ void cs_w(UINT8 data);
+ UINT8 rst_r();
+ UINT8 inp_r();
+ void utp_w(UINT8 data);
+ UINT8 stat_r();
+ void c1_w(UINT8 data);
+ void c2_w(UINT8 data);
+ void c3_w(UINT8 data);
+ void c4_w(UINT8 data);
+ UINT8 xmemfl_r(offs_t offset);
+ void xmemw_w(offs_t offset, UINT8 data);
+
+ DECLARE_WRITE8_MEMBER( cs_w );
+ DECLARE_READ8_MEMBER( rst_r );
+ DECLARE_READ8_MEMBER( inp_r );
+ DECLARE_WRITE8_MEMBER( utp_w );
+ DECLARE_READ8_MEMBER( stat_r );
+ DECLARE_WRITE8_MEMBER( c1_w );
+ DECLARE_WRITE8_MEMBER( c2_w );
+ DECLARE_WRITE8_MEMBER( c3_w );
+ DECLARE_WRITE8_MEMBER( c4_w );
+ DECLARE_READ8_MEMBER( xmemfl_r );
+ DECLARE_WRITE8_MEMBER( xmemw_w );
+
+ // peripheral interface
+ DECLARE_WRITE_LINE_MEMBER( int_w ) { m_write_int(state); }
+ DECLARE_WRITE_LINE_MEMBER( nmi_w ) { m_write_nmi(state); }
+ DECLARE_WRITE_LINE_MEMBER( rdy_w ) { m_write_rdy(state); }
+ DECLARE_WRITE_LINE_MEMBER( resin_w ) { m_write_resin(state); }
+
+protected:
+ // device-level overrides
+ virtual void device_start();
+ virtual void device_reset();
+
+private:
+ devcb2_write_line m_write_int;
+ devcb2_write_line m_write_nmi;
+ devcb2_write_line m_write_rdy;
+ devcb2_write_line m_write_resin;
+
+ device_abcbus_card_interface *m_card;
+};
+
+
+// ======================> device_abcbus_card_interface
+
+// class representing interface-specific live abcbus card
+class device_abcbus_card_interface : public device_slot_card_interface
+{
+ friend class abcbus_slot_device;
+
+public:
+ // construction/destruction
+ device_abcbus_card_interface(const machine_config &mconfig, device_t &device);
+
+ // required operation overrides
+ virtual void abcbus_cs(UINT8 data) = 0;
+
+ // optional operation overrides
+ virtual UINT8 abcbus_inp() { return 0xff; };
+ virtual void abcbus_utp(UINT8 data) { };
+ virtual UINT8 abcbus_stat() { return 0xff; };
+ virtual void abcbus_c1(UINT8 data) { };
+ virtual void abcbus_c2(UINT8 data) { };
+ virtual void abcbus_c3(UINT8 data) { };
+ virtual void abcbus_c4(UINT8 data) { };
+ virtual UINT8 abcbus_xmemfl(offs_t offset) { return 0xff; };
+ virtual void abcbus_xmemw(offs_t offset, UINT8 data) { };
+
+public:
+ abcbus_slot_device *m_slot;
+};
+
+
+// device type definition
+extern const device_type ABCBUS_SLOT;
+
+
+// slot devices
+#include "abc890.h"
+#include "dos.h"
+#include "fd2.h"
+#include "hdc.h"
+#include "lux10828.h"
+#include "lux21046.h"
+#include "uni800.h"
+#include "sio.h"
+#include "slutprov.h"
+#include "turbo.h"
+#include "xebec.h"
+
+SLOT_INTERFACE_EXTERN( abcbus_cards );
+
+
+
+#endif
diff --git a/src/emu/bus/abcbus/dos.c b/src/emu/bus/abcbus/dos.c
new file mode 100644
index 00000000000..d35f588358b
--- /dev/null
+++ b/src/emu/bus/abcbus/dos.c
@@ -0,0 +1,146 @@
+// license:BSD-3-Clause
+// copyright-holders:Curt Coder
+/**********************************************************************
+
+ Luxor ABC DOS card emulation
+
+ Copyright MESS Team.
+ Visit http://mamedev.org for licensing and usage restrictions.
+
+*********************************************************************/
+
+/*
+
+PCB Layout
+----------
+
+55 10762-01
+
+|-----------------------------------|
+| |
+| |
+| |
+| |
+| ROM3 ROM2 |
+| |
+| |
+| |
+| |
+| |
+| ROM1 ROM0 |
+| |
+| |
+| |
+| |
+| |
+| |
+| LS02 LS139 |
+| |
+| |
+| |
+| LS367 LS241 LS241 |
+| |
+| |
+| |
+| |
+|--|-----------------------------|--|
+ |------------CON1-------------|
+
+Notes:
+ All IC's shown.
+
+ ROM0 - Synertek C55022 4Kx8 ROM "DOSDD80"
+ ROM1 - Motorola MCM2708C 1Kx8 EPROM "9704"
+ ROM2 - empty socket
+ ROM3 - empty socket
+ CON1 - ABC bus connector
+
+*/
+
+#include "dos.h"
+
+
+
+//**************************************************************************
+// DEVICE DEFINITIONS
+//**************************************************************************
+
+const device_type ABC_DOS = &device_creator<abc_dos_device>;
+
+
+//-------------------------------------------------
+// ROM( abc_dos )
+//-------------------------------------------------
+
+ROM_START( abc_dos )
+ ROM_REGION( 0x2000, "dos", ROMREGION_ERASEFF )
+ ROM_DEFAULT_BIOS("ufd20")
+ ROM_SYSTEM_BIOS( 0, "abcdos", "ABC-DOS" ) // Scandia Metric FD2
+ ROMX_LOAD( "abcdos.3d", 0x0000, 0x1000, CRC(2cb2192f) SHA1(a6b3a9587714f8db807c05bee6c71c0684363744), ROM_BIOS(1) )
+ ROM_SYSTEM_BIOS( 1, "dosdd80", "ABC-DOS DD" ) // ABC 830
+ ROMX_LOAD( "dosdd80.3d", 0x0000, 0x1000, CRC(36db4c15) SHA1(ae462633f3a9c142bb029beb14749a84681377fa), ROM_BIOS(2) )
+ ROM_SYSTEM_BIOS( 2, "ufd20", "UFD-DOS v.20" ) // ABC 830
+ ROMX_LOAD( "ufddos20.3d", 0x0000, 0x1000, CRC(69b09c0b) SHA1(403997a06cf6495b8fa13dc74eff6a64ef7aa53e), ROM_BIOS(3) )
+ ROM_LOAD( "printer.4c", 0x1000, 0x400, NO_DUMP )
+ //ROM_LOAD( "spare.4a", 0x1400, 0x400, NO_DUMP )
+ ROM_LOAD( "9704.3c", 0x1800, 0x400, NO_DUMP )
+ //ROM_LOAD( "spare.3a", 0x1c00, 0x400, NO_DUMP )
+ROM_END
+
+
+//-------------------------------------------------
+// rom_region - device-specific ROM region
+//-------------------------------------------------
+
+const rom_entry *abc_dos_device::device_rom_region() const
+{
+ return ROM_NAME( abc_dos );
+}
+
+
+
+//**************************************************************************
+// LIVE DEVICE
+//**************************************************************************
+
+//-------------------------------------------------
+// abc_dos_device - constructor
+//-------------------------------------------------
+
+abc_dos_device::abc_dos_device(const machine_config &mconfig, const char *tag, device_t *owner, UINT32 clock)
+ : device_t(mconfig, ABC_DOS, "ABC DOS", tag, owner, clock, "abc_dos", __FILE__),
+ device_abcbus_card_interface(mconfig, *this),
+ m_rom(*this, "dos")
+{
+}
+
+
+//-------------------------------------------------
+// device_start - device-specific startup
+//-------------------------------------------------
+
+void abc_dos_device::device_start()
+{
+}
+
+
+
+//**************************************************************************
+// ABC BUS INTERFACE
+//**************************************************************************
+
+//-------------------------------------------------
+// abcbus_xmemfl -
+//-------------------------------------------------
+
+UINT8 abc_dos_device::abcbus_xmemfl(offs_t offset)
+{
+ UINT8 data = 0xff;
+
+ if (offset >= 0x6000 && offset < 0x8000)
+ {
+ data = m_rom->base()[offset & 0x1fff];
+ }
+
+ return data;
+}
diff --git a/src/emu/bus/abcbus/dos.h b/src/emu/bus/abcbus/dos.h
new file mode 100644
index 00000000000..56d78622ad4
--- /dev/null
+++ b/src/emu/bus/abcbus/dos.h
@@ -0,0 +1,56 @@
+// license:BSD-3-Clause
+// copyright-holders:Curt Coder
+/**********************************************************************
+
+ Scandia Metric DOS floppy controller emulation
+
+ Copyright MESS Team.
+ Visit http://mamedev.org for licensing and usage restrictions.
+
+*********************************************************************/
+
+#pragma once
+
+#ifndef __ABC_DOS__
+#define __ABC_DOS__
+
+#include "emu.h"
+#include "abcbus.h"
+
+
+
+//**************************************************************************
+// TYPE DEFINITIONS
+//**************************************************************************
+
+// ======================> abc_dos_device
+
+class abc_dos_device : public device_t,
+ public device_abcbus_card_interface
+{
+public:
+ // construction/destruction
+ abc_dos_device(const machine_config &mconfig, const char *tag, device_t *owner, UINT32 clock);
+
+ // optional information overrides
+ virtual const rom_entry *device_rom_region() const;
+
+protected:
+ // device-level overrides
+ virtual void device_start();
+
+ // device_abcbus_interface overrides
+ virtual void abcbus_cs(UINT8 data) { };
+ virtual UINT8 abcbus_xmemfl(offs_t offset);
+
+private:
+ required_memory_region m_rom;
+};
+
+
+// device type definition
+extern const device_type ABC_DOS;
+
+
+
+#endif
diff --git a/src/emu/bus/abcbus/fd2.c b/src/emu/bus/abcbus/fd2.c
new file mode 100644
index 00000000000..365b012ceee
--- /dev/null
+++ b/src/emu/bus/abcbus/fd2.c
@@ -0,0 +1,236 @@
+// license:BSD-3-Clause
+// copyright-holders:Curt Coder
+/**********************************************************************
+
+ Scandia Metric FD2 floppy controller emulation
+
+ Copyright MESS Team.
+ Visit http://mamedev.org for licensing and usage restrictions.
+
+*********************************************************************/
+
+/*
+
+PCB Layout
+----------
+
+ |-------------------------------------------|
+|-| |
+|-| ROM0 4MHz |
+|-| |
+|-| Z80PIO |
+|-| CN1|
+|-| FD1771 2114 |
+|-| 2114 |
+|-| Z80 ROM1 |
+|-| |
+ |-------------------------------------------|
+
+Notes:
+ Relevant IC's shown.
+
+ ROM0 - AMI 8005SAJ 1Kx8 EPROM
+ ROM1 - Motorola MCM2708C 1Kx8 EPROM
+ Z80 - Zilog Z-80 CPU
+ Z80PIO - Zilog Z-80A PIO
+ FD1771 - FD1771-B01
+ 2114 - National Semiconductor MM2114N 1Kx4 Static RAM
+ CN1 - 2x17 pin PCB header
+
+*/
+
+#include "fd2.h"
+
+
+
+//**************************************************************************
+// MACROS / CONSTANTS
+//**************************************************************************
+
+#define Z80_TAG "2e"
+#define Z80PIO_TAG "2c"
+#define FD1771_TAG "2d"
+
+
+
+//**************************************************************************
+// DEVICE DEFINITIONS
+//**************************************************************************
+
+const device_type ABC_FD2 = &device_creator<abc_fd2_device>;
+
+
+//-------------------------------------------------
+// ROM( abc_fd2 )
+//-------------------------------------------------
+
+ROM_START( abc_fd2 )
+ ROM_REGION( 0x400, Z80_TAG, 0 )
+ ROM_LOAD( "1.02.3f", 0x000, 0x400, NO_DUMP )
+
+ ROM_REGION( 0x400, "abc80", 0 )
+ ROM_LOAD( "ami 8005saj.1a", 0x000, 0x400, NO_DUMP )
+ROM_END
+
+
+//-------------------------------------------------
+// rom_region - device-specific ROM region
+//-------------------------------------------------
+
+const rom_entry *abc_fd2_device::device_rom_region() const
+{
+ return ROM_NAME( abc_fd2 );
+}
+
+
+//-------------------------------------------------
+// ADDRESS_MAP( abc_fd2_mem )
+//-------------------------------------------------
+
+static ADDRESS_MAP_START( abc_fd2_mem, AS_PROGRAM, 8, abc_fd2_device )
+ AM_RANGE(0x0000, 0x03ff) AM_ROM AM_REGION(Z80_TAG, 0)
+ADDRESS_MAP_END
+
+
+//-------------------------------------------------
+// ADDRESS_MAP( abc_fd2_io )
+//-------------------------------------------------
+
+static ADDRESS_MAP_START( abc_fd2_io, AS_IO, 8, abc_fd2_device )
+ADDRESS_MAP_END
+
+
+//-------------------------------------------------
+// Z80PIO_INTERFACE( pio_intf )
+//-------------------------------------------------
+
+static Z80PIO_INTERFACE( pio_intf )
+{
+ DEVCB_NULL,
+ DEVCB_NULL,
+ DEVCB_NULL,
+ DEVCB_NULL,
+ DEVCB_NULL,
+ DEVCB_NULL,
+ DEVCB_NULL
+};
+
+
+//-------------------------------------------------
+// z80_daisy_config daisy_chain
+//-------------------------------------------------
+
+static const z80_daisy_config daisy_chain[] =
+{
+ { Z80PIO_TAG },
+ { NULL }
+};
+
+
+//-------------------------------------------------
+// SLOT_INTERFACE( abc_fd2_floppies )
+//-------------------------------------------------
+
+static SLOT_INTERFACE_START( abc_fd2_floppies )
+ SLOT_INTERFACE( "525sssd", FLOPPY_525_SSSD )
+SLOT_INTERFACE_END
+
+
+//-------------------------------------------------
+// MACHINE_DRIVER( abc_fd2 )
+//-------------------------------------------------
+
+static MACHINE_CONFIG_FRAGMENT( abc_fd2 )
+ MCFG_CPU_ADD(Z80_TAG, Z80, XTAL_4MHz/2) // ?
+ MCFG_CPU_PROGRAM_MAP(abc_fd2_mem)
+ MCFG_CPU_IO_MAP(abc_fd2_io)
+ MCFG_CPU_CONFIG(daisy_chain)
+
+ MCFG_Z80PIO_ADD(Z80PIO_TAG, XTAL_4MHz/2, pio_intf) // ?
+ MCFG_FD1771x_ADD(FD1771_TAG, XTAL_4MHz/2) // ?
+
+ MCFG_FLOPPY_DRIVE_ADD(FD1771_TAG":0", abc_fd2_floppies, "525sssd", floppy_image_device::default_floppy_formats)
+ MCFG_FLOPPY_DRIVE_ADD(FD1771_TAG":1", abc_fd2_floppies, "525sssd", floppy_image_device::default_floppy_formats)
+MACHINE_CONFIG_END
+
+
+//-------------------------------------------------
+// machine_config_additions - device-specific
+// machine configurations
+//-------------------------------------------------
+
+machine_config_constructor abc_fd2_device::device_mconfig_additions() const
+{
+ return MACHINE_CONFIG_NAME( abc_fd2 );
+}
+
+
+
+//**************************************************************************
+// LIVE DEVICE
+//**************************************************************************
+
+//-------------------------------------------------
+// abc_fd2_device - constructor
+//-------------------------------------------------
+
+abc_fd2_device::abc_fd2_device(const machine_config &mconfig, const char *tag, device_t *owner, UINT32 clock)
+ : device_t(mconfig, ABC_FD2, "ABC FD2", tag, owner, clock, "abc_fd2", __FILE__),
+ device_abcbus_card_interface(mconfig, *this),
+ m_maincpu(*this, Z80_TAG),
+ m_pio(*this, Z80PIO_TAG),
+ m_fdc(*this, FD1771_TAG),
+ m_floppy0(*this, FD1771_TAG":0"),
+ m_floppy1(*this, FD1771_TAG":1"),
+ m_rom(*this, "dos")
+{
+}
+
+
+//-------------------------------------------------
+// device_start - device-specific startup
+//-------------------------------------------------
+
+void abc_fd2_device::device_start()
+{
+}
+
+
+//-------------------------------------------------
+// device_reset - device-specific reset
+//-------------------------------------------------
+
+void abc_fd2_device::device_reset()
+{
+}
+
+
+
+//**************************************************************************
+// ABC BUS INTERFACE
+//**************************************************************************
+
+//-------------------------------------------------
+// abcbus_cs -
+//-------------------------------------------------
+
+void abc_fd2_device::abcbus_cs(UINT8 data)
+{
+}
+
+
+//-------------------------------------------------
+// abcbus_xmemfl -
+//-------------------------------------------------
+
+UINT8 abc_fd2_device::abcbus_xmemfl(offs_t offset)
+{
+ UINT8 data = 0xff;
+
+ if (offset >= 0x6000 && offset < 0x6400) // TODO is this mirrored?
+ {
+ data = m_rom->base()[offset & 0x3ff];
+ }
+
+ return data;
+}
diff --git a/src/emu/bus/abcbus/fd2.h b/src/emu/bus/abcbus/fd2.h
new file mode 100644
index 00000000000..fdb89809254
--- /dev/null
+++ b/src/emu/bus/abcbus/fd2.h
@@ -0,0 +1,67 @@
+// license:BSD-3-Clause
+// copyright-holders:Curt Coder
+/**********************************************************************
+
+ Scandia Metric FD2 floppy controller emulation
+
+ Copyright MESS Team.
+ Visit http://mamedev.org for licensing and usage restrictions.
+
+*********************************************************************/
+
+#pragma once
+
+#ifndef __ABC_FD2__
+#define __ABC_FD2__
+
+#include "emu.h"
+#include "abcbus.h"
+#include "cpu/z80/z80.h"
+#include "cpu/z80/z80daisy.h"
+#include "machine/wd_fdc.h"
+#include "machine/z80pio.h"
+
+
+
+//**************************************************************************
+// TYPE DEFINITIONS
+//**************************************************************************
+
+// ======================> abc_fd2_device
+
+class abc_fd2_device : public device_t,
+ public device_abcbus_card_interface
+{
+public:
+ // construction/destruction
+ abc_fd2_device(const machine_config &mconfig, const char *tag, device_t *owner, UINT32 clock);
+
+ // optional information overrides
+ virtual const rom_entry *device_rom_region() const;
+ virtual machine_config_constructor device_mconfig_additions() const;
+
+protected:
+ // device-level overrides
+ virtual void device_start();
+ virtual void device_reset();
+
+ // device_abcbus_interface overrides
+ virtual void abcbus_cs(UINT8 data);
+ virtual UINT8 abcbus_xmemfl(offs_t offset);
+
+private:
+ required_device<cpu_device> m_maincpu;
+ required_device<z80pio_device> m_pio;
+ required_device<fd1771_t> m_fdc;
+ required_device<floppy_connector> m_floppy0;
+ required_device<floppy_connector> m_floppy1;
+ required_memory_region m_rom;
+};
+
+
+// device type definition
+extern const device_type ABC_FD2;
+
+
+
+#endif
diff --git a/src/emu/bus/abcbus/hdc.c b/src/emu/bus/abcbus/hdc.c
new file mode 100644
index 00000000000..4d316d0ef55
--- /dev/null
+++ b/src/emu/bus/abcbus/hdc.c
@@ -0,0 +1,163 @@
+// license:BSD-3-Clause
+// copyright-holders:Curt Coder
+/**********************************************************************
+
+ Luxor ABC 850 Winchester controller card emulation
+
+ Copyright MESS Team.
+ Visit http://mamedev.org for licensing and usage restrictions.
+
+*********************************************************************/
+
+#include "hdc.h"
+
+
+
+//**************************************************************************
+// MACROS / CONSTANTS
+//**************************************************************************
+
+#define Z80_TAG "z80"
+#define SASIBUS_TAG "sasi"
+
+
+
+//**************************************************************************
+// DEVICE DEFINITIONS
+//**************************************************************************
+
+const device_type ABC_HDC = &device_creator<abc_hdc_device>;
+
+
+//-------------------------------------------------
+// ROM( abc_hdc )
+//-------------------------------------------------
+
+ROM_START( abc_hdc )
+ ROM_REGION( 0x1000, Z80_TAG, 0 )
+ // ABC 850
+ ROM_SYSTEM_BIOS(0, "ro202", "Rodime RO202 (CHS: 321,4,17,512)" )
+ ROMX_LOAD( "rodi202.bin", 0x0000, 0x0800, CRC(337b4dcf) SHA1(791ebeb4521ddc11fb9742114018e161e1849bdf), ROM_BIOS(1) ) // Rodime RO202 (http://stason.org/TULARC/pc/hard-drives-hdd/rodime/RO202-11MB-5-25-FH-MFM-ST506.html)
+ ROM_SYSTEM_BIOS(1, "basf6185", "BASF 6185 (CHS: 440,6,32,256)" )
+ ROMX_LOAD( "basf6185.bin", 0x0000, 0x0800, CRC(06f8fe2e) SHA1(e81f2a47c854e0dbb096bee3428d79e63591059d), ROM_BIOS(2) ) // BASF 6185 (http://stason.org/TULARC/pc/hard-drives-hdd/basf-magnetics/6185-22MB-5-25-FH-MFM-ST412.html)
+ // ABC 852
+ ROM_SYSTEM_BIOS(2, "nec5126", "NEC 5126 (CHS: 615,4,17,512)" )
+ ROMX_LOAD( "nec5126.bin", 0x0000, 0x1000, CRC(17c247e7) SHA1(7339738b87751655cb4d6414422593272fe72f5d), ROM_BIOS(3) ) // NEC 5126 (http://stason.org/TULARC/pc/hard-drives-hdd/nec/D5126-20MB-5-25-HH-MFM-ST506.html)
+ // ABC 856
+ ROM_SYSTEM_BIOS(3, "micr1325", "Micropolis 1325 (CHS: 1024,8,33,256)" )
+ ROMX_LOAD( "micr1325.bin", 0x0000, 0x0800, CRC(084af409) SHA1(342b8e214a8c4c2b014604e53c45ef1bd1c69ea3), ROM_BIOS(4) ) // Micropolis 1325 (http://stason.org/TULARC/pc/hard-drives-hdd/micropolis/1325-69MB-5-25-FH-MFM-ST506.html)
+ROM_END
+
+
+//-------------------------------------------------
+// rom_region - device-specific ROM region
+//-------------------------------------------------
+
+const rom_entry *abc_hdc_device::device_rom_region() const
+{
+ return ROM_NAME( abc_hdc );
+}
+
+
+//-------------------------------------------------
+// ADDRESS_MAP( abc_hdc_mem )
+//-------------------------------------------------
+
+static ADDRESS_MAP_START( abc_hdc_mem, AS_PROGRAM, 8, abc_hdc_device )
+ AM_RANGE(0x0000, 0x0fff) AM_ROM AM_REGION(Z80_TAG, 0)
+ADDRESS_MAP_END
+
+
+//-------------------------------------------------
+// ADDRESS_MAP( abc_hdc_io )
+//-------------------------------------------------
+
+static ADDRESS_MAP_START( abc_hdc_io, AS_IO, 8, abc_hdc_device )
+ADDRESS_MAP_END
+
+
+//-------------------------------------------------
+// z80_daisy_config daisy_chain
+//-------------------------------------------------
+
+static const z80_daisy_config daisy_chain[] =
+{
+ { NULL }
+};
+
+
+//-------------------------------------------------
+// MACHINE_DRIVER( abc_hdc )
+//-------------------------------------------------
+
+static MACHINE_CONFIG_FRAGMENT( abc_hdc )
+ MCFG_CPU_ADD(Z80_TAG, Z80, 4000000)
+ MCFG_CPU_PROGRAM_MAP(abc_hdc_mem)
+ MCFG_CPU_IO_MAP(abc_hdc_io)
+ MCFG_CPU_CONFIG(daisy_chain)
+
+ MCFG_SCSIBUS_ADD(SASIBUS_TAG)
+ MCFG_SCSIDEV_ADD(SASIBUS_TAG ":harddisk0", SCSIHD, SCSI_ID_0)
+ MCFG_SCSICB_ADD(SASIBUS_TAG ":host")
+MACHINE_CONFIG_END
+
+
+//-------------------------------------------------
+// machine_config_additions - device-specific
+// machine configurations
+//-------------------------------------------------
+
+machine_config_constructor abc_hdc_device::device_mconfig_additions() const
+{
+ return MACHINE_CONFIG_NAME( abc_hdc );
+}
+
+
+
+//**************************************************************************
+// LIVE DEVICE
+//**************************************************************************
+
+//-------------------------------------------------
+// abc_hdc_device - constructor
+//-------------------------------------------------
+
+abc_hdc_device::abc_hdc_device(const machine_config &mconfig, const char *tag, device_t *owner, UINT32 clock)
+ : device_t(mconfig, ABC_HDC, "ABC HDC", tag, owner, clock, "abc_hdc", __FILE__),
+ device_abcbus_card_interface(mconfig, *this),
+ m_maincpu(*this, Z80_TAG),
+ m_sasibus(*this, SASIBUS_TAG)
+{
+}
+
+
+//-------------------------------------------------
+// device_start - device-specific startup
+//-------------------------------------------------
+
+void abc_hdc_device::device_start()
+{
+}
+
+
+//-------------------------------------------------
+// device_reset - device-specific reset
+//-------------------------------------------------
+
+void abc_hdc_device::device_reset()
+{
+}
+
+
+
+//**************************************************************************
+// ABC BUS INTERFACE
+//**************************************************************************
+
+//-------------------------------------------------
+// abcbus_cs -
+//-------------------------------------------------
+
+void abc_hdc_device::abcbus_cs(UINT8 data)
+{
+}
diff --git a/src/emu/bus/abcbus/hdc.h b/src/emu/bus/abcbus/hdc.h
new file mode 100644
index 00000000000..ec7d9612ccf
--- /dev/null
+++ b/src/emu/bus/abcbus/hdc.h
@@ -0,0 +1,63 @@
+// license:BSD-3-Clause
+// copyright-holders:Curt Coder
+/**********************************************************************
+
+ Luxor ABC 850 Winchester controller card emulation
+
+ Copyright MESS Team.
+ Visit http://mamedev.org for licensing and usage restrictions.
+
+*********************************************************************/
+
+#pragma once
+
+#ifndef __ABC_HDC__
+#define __ABC_HDC__
+
+#include "emu.h"
+#include "abcbus.h"
+#include "cpu/z80/z80.h"
+#include "cpu/z80/z80daisy.h"
+#include "machine/scsibus.h"
+#include "machine/scsicb.h"
+#include "machine/scsihd.h"
+
+
+
+//**************************************************************************
+// TYPE DEFINITIONS
+//**************************************************************************
+
+// ======================> abc_hdc_device
+
+class abc_hdc_device : public device_t,
+ public device_abcbus_card_interface
+{
+public:
+ // construction/destruction
+ abc_hdc_device(const machine_config &mconfig, const char *tag, device_t *owner, UINT32 clock);
+
+ // optional information overrides
+ virtual const rom_entry *device_rom_region() const;
+ virtual machine_config_constructor device_mconfig_additions() const;
+
+protected:
+ // device-level overrides
+ virtual void device_start();
+ virtual void device_reset();
+
+ // device_abcbus_interface overrides
+ virtual void abcbus_cs(UINT8 data);
+
+private:
+ required_device<cpu_device> m_maincpu;
+ required_device<scsibus_device> m_sasibus;
+};
+
+
+// device type definition
+extern const device_type ABC_HDC;
+
+
+
+#endif
diff --git a/src/emu/bus/abcbus/lux10828.c b/src/emu/bus/abcbus/lux10828.c
new file mode 100644
index 00000000000..9515f7f1e91
--- /dev/null
+++ b/src/emu/bus/abcbus/lux10828.c
@@ -0,0 +1,705 @@
+// license:BSD-3-Clause
+// copyright-holders:Curt Coder
+/**********************************************************************
+
+ Luxor 55-10828 "slow" floppy disk controller emulation
+
+ Copyright MESS Team.
+ Visit http://mamedev.org for licensing and usage restrictions.
+
+*********************************************************************/
+
+/*
+
+Luxor Conkort
+
+PCB Layout
+----------
+
+55 10900-01
+
+|-----------------------------------|
+| LD1 SW1 LS132 CON2 |
+| S |
+| 4MHz S240 N8T97N |
+| S |
+| 7404 MC1458 4024 |
+| S |
+| 74276 S |
+| S S |
+| LS32 S C140E LS273 |
+| |
+| |
+| MB8876 ROM |
+| |
+| |
+| S LS32 LS156 TC5514 |
+| |
+| TC5514 |
+| Z80 |
+| LS273 |
+| |
+| LS373 |
+| Z80PIO |
+| LS245 |
+| S1 |
+| LS125 LS124 S20 DM8131 |
+| |
+|--|-----------------------------|--|
+ |------------CON1-------------|
+
+Notes:
+ All IC's shown.
+
+ ROM - Hitachi HN462716 2Kx8 EPROM "MPI02"
+ Z80 - Sharp LH0080A Z80A CPU
+ Z80PIO - SGS Z8420AB1 Z80A PIO
+ MB8876 - Mitsubishi MB8876 Floppy Disc Controller (FD1791 compatible)
+ TC5514 - Toshiba TC5514AP-2 1Kx4 bit Static RAM
+ DM8131 - National Semiconductor DM8131N 6-Bit Unified Bus Comparator
+ C140E - Ferranti 2C140E "copy protection device"
+ N8T97N - SA N8T97N ?
+ CON1 - ABC bus connector
+ CON2 - 25-pin D sub floppy connector (AMP4284)
+ SW1 - Disk drive type (SS/DS, SD/DD)
+ S1 - ABC bus card address bit 0
+ S2 -
+ S3 -
+ S4 -
+ S5 -
+ S6 -
+ S7 -
+ S8 -
+ S9 -
+ LD1 - LED
+
+*/
+
+/*
+
+ TODO:
+
+ - Z80 IN instruction needs to halt in mid air for this controller to ever work (the first data byte of disk sector is read too early)
+
+ wd17xx_command_w $88 READ_SEC
+ wd17xx_data_r: (no new data) $00 (data_count 0)
+ WAIT
+ wd179x: Read Sector callback.
+ sector found! C:$00 H:$00 R:$0b N:$01
+ wd17xx_data_r: $FF (data_count 256)
+ WAIT
+
+ - copy protection device (sends sector header bytes to CPU? DDEN is serial clock? code checks for either $b6 or $f7)
+
+ 06F8: ld a,$2F ; SEEK
+ 06FA: out ($BC),a
+ 06FC: push af
+ 06FD: push bc
+ 06FE: ld bc,$0724
+ 0701: push bc
+ 0702: ld b,$07
+ 0704: rr a
+ 0706: call $073F
+ 073F: DB 7E in a,($7E) ; PIO PORT B
+ 0741: EE 08 xor $08 ; DDEN
+ 0743: D3 7E out ($7E),a
+ 0745: EE 08 xor $08
+ 0747: D3 7E out ($7E),a
+ 0749: DB 7E in a,($7E)
+ 074B: 1F rra
+ 074C: 1F rra
+ 074D: 1F rra
+ 074E: CB 11 rl c
+ 0750: 79 ld a,c
+ 0751: C9 ret
+ 0709: djnz $0703 <-- jumps to middle of instruction!
+ 0703: rlca
+ 0704: rr a
+ 0706: call $073F
+
+ - S2-S5 jumpers
+ - ABC80 ERR 48 on boot
+ - side select makes controller go crazy and try to WRITE_TRK
+
+*/
+
+#include "lux10828.h"
+
+
+
+//**************************************************************************
+// MACROS / CONSTANTS
+//**************************************************************************
+
+#define Z80_TAG "5a"
+#define Z80PIO_TAG "3a"
+#define MB8876_TAG "7a"
+
+
+
+//**************************************************************************
+// DEVICE DEFINITIONS
+//**************************************************************************
+
+const device_type LUXOR_55_10828 = &device_creator<luxor_55_10828_device>;
+
+
+//-------------------------------------------------
+// ROM( luxor_55_10828 )
+//-------------------------------------------------
+
+ROM_START( luxor_55_10828 )
+ ROM_REGION( 0x800, Z80_TAG, 0 )
+ ROM_DEFAULT_BIOS("mpi02n")
+ // ABC 830
+ ROM_SYSTEM_BIOS(0, "basf6106", "BASF 6106/08" )
+ ROMX_LOAD( "basf .02.7c", 0x000, 0x800, CRC(5daba200) SHA1(7881933760bed3b94f27585c0a6fc43e5d5153f5), ROM_BIOS(1) )
+ ROM_SYSTEM_BIOS(1, "mpi02", "MPI 51" )
+ ROMX_LOAD( "mpi .02.7c", 0x000, 0x800, CRC(2aac9296) SHA1(c01a62e7933186bdf7068d2e9a5bc36590544349), ROM_BIOS(2) )
+ ROM_SYSTEM_BIOS(2, "mpi02n", "MPI 51 (newer)" )
+ ROMX_LOAD( "new mpi .02.7c", 0x000, 0x800, CRC(ab788171) SHA1(c8e29965c04c85f2f2648496ea10c9c7ff95392f), ROM_BIOS(3) )
+ // ABC 832
+ ROM_SYSTEM_BIOS(3, "micr1015", "Micropolis 1015 (v1.4)" )
+ ROMX_LOAD( "micr 1.4.7c", 0x000, 0x800, CRC(a7bc05fa) SHA1(6ac3e202b7ce802c70d89728695f1cb52ac80307), ROM_BIOS(4) )
+ ROM_SYSTEM_BIOS(4, "micr1115", "Micropolis 1115 (v2.3)" )
+ ROMX_LOAD( "micr 2.3.7c", 0x000, 0x800, CRC(f2fc5ccc) SHA1(86d6baadf6bf1d07d0577dc1e092850b5ff6dd1b), ROM_BIOS(5) )
+ ROM_SYSTEM_BIOS(5, "basf6118", "BASF 6118 (v1.2)" )
+ ROMX_LOAD( "basf 1.2.7c", 0x000, 0x800, CRC(9ca1a1eb) SHA1(04973ad69de8da403739caaebe0b0f6757e4a6b1), ROM_BIOS(6) )
+ // ABC 838
+ ROM_SYSTEM_BIOS(6, "basf6104", "BASF 6104, BASF 6115 (v1.0)" )
+ ROMX_LOAD( "basf 8 1.0.7c", 0x000, 0x800, NO_DUMP, ROM_BIOS(7) )
+ROM_END
+
+
+//-------------------------------------------------
+// rom_region - device-specific ROM region
+//-------------------------------------------------
+
+const rom_entry *luxor_55_10828_device::device_rom_region() const
+{
+ return ROM_NAME( luxor_55_10828 );
+}
+
+
+//-------------------------------------------------
+// ADDRESS_MAP( luxor_55_10828_mem )
+//-------------------------------------------------
+
+static ADDRESS_MAP_START( luxor_55_10828_mem, AS_PROGRAM, 8, luxor_55_10828_device )
+ ADDRESS_MAP_GLOBAL_MASK(0x1fff)
+ AM_RANGE(0x0000, 0x07ff) AM_MIRROR(0x0800) AM_ROM AM_REGION(Z80_TAG, 0)
+ AM_RANGE(0x1000, 0x13ff) AM_MIRROR(0x0c00) AM_RAM
+ADDRESS_MAP_END
+
+
+//-------------------------------------------------
+// ADDRESS_MAP( luxor_55_10828_io )
+//-------------------------------------------------
+
+static ADDRESS_MAP_START( luxor_55_10828_io, AS_IO, 8, luxor_55_10828_device )
+ ADDRESS_MAP_GLOBAL_MASK(0xff)
+ AM_RANGE(0x70, 0x73) AM_MIRROR(0x0c) AM_DEVREADWRITE(Z80PIO_TAG, z80pio_device, read_alt, write_alt)
+ AM_RANGE(0xb0, 0xb3) AM_MIRROR(0x0c) AM_READWRITE(fdc_r, fdc_w)
+ AM_RANGE(0xd0, 0xd0) AM_MIRROR(0x0f) AM_WRITE(status_w)
+ AM_RANGE(0xe0, 0xe0) AM_MIRROR(0x0f) AM_WRITE(ctrl_w)
+ADDRESS_MAP_END
+
+
+//-------------------------------------------------
+// Z80PIO_INTERFACE( pio_intf )
+//-------------------------------------------------
+
+READ8_MEMBER( luxor_55_10828_device::pio_pa_r )
+{
+ return m_data;
+}
+
+WRITE8_MEMBER( luxor_55_10828_device::pio_pa_w )
+{
+ m_data = data;
+}
+
+READ8_MEMBER( luxor_55_10828_device::pio_pb_r )
+{
+ /*
+
+ bit description
+
+ 0 !(_DS0 & _DS1) single/double sided (0=SS, 1=DS)
+ 1 !(_DD0 & _DD1) single/double density (0=DS, 1=DD)
+ 2 8B pin 10
+ 3 FDC _DDEN double density enable
+ 4 _R/BS radial/binary drive select
+ 5 FDC HLT head load timing
+ 6 FDC _HDLD head loaded
+ 7 FDC IRQ interrupt request
+
+ */
+
+ UINT8 data = 0x04;
+
+ // single/double sided drive
+ UINT8 sw1 = m_sw1->read() & 0x0f;
+ int ds0 = m_sel0 ? BIT(sw1, 0) : 1;
+ int ds1 = m_sel1 ? BIT(sw1, 1) : 1;
+ data |= !(ds0 & ds1);
+
+ // single/double density drive
+ int dd0 = m_sel0 ? BIT(sw1, 2) : 1;
+ int dd1 = m_sel1 ? BIT(sw1, 3) : 1;
+ data |= !(dd0 & dd1) << 1;
+
+ // radial/binary drive select
+ data |= 0x10;
+
+ // head load
+ data |= m_fdc->hld_r() << 6;
+ data |= 0x40; // TODO remove
+
+ // FDC interrupt request
+ data |= m_fdc_irq << 7;
+
+ return data;
+}
+
+WRITE8_MEMBER( luxor_55_10828_device::pio_pb_w )
+{
+ /*
+
+ bit signal description
+
+ 0 !(_DS0 & _DS1) single/double sided (0=SS, 1=DS)
+ 1 !(_DD0 & _DD1) single/double density (0=DS, 1=DD)
+ 2 8B pin 10
+ 3 FDC _DDEN double density enable
+ 4 _R/BS radial/binary drive select
+ 5 FDC HLT head load timing
+ 6 FDC _HDLD head loaded
+ 7 FDC IRQ interrupt request
+
+ */
+
+ // double density enable
+ m_fdc->dden_w(BIT(data, 3));
+
+ // head load timing
+ m_fdc->hlt_w(BIT(data, 5));
+}
+
+static Z80PIO_INTERFACE( pio_intf )
+{
+ DEVCB_CPU_INPUT_LINE(Z80_TAG, INPUT_LINE_IRQ0),
+ DEVCB_DEVICE_MEMBER(DEVICE_SELF_OWNER, luxor_55_10828_device, pio_pa_r),
+ DEVCB_DEVICE_MEMBER(DEVICE_SELF_OWNER, luxor_55_10828_device, pio_pa_w),
+ DEVCB_NULL,
+ DEVCB_DEVICE_MEMBER(DEVICE_SELF_OWNER, luxor_55_10828_device, pio_pb_r),
+ DEVCB_DEVICE_MEMBER(DEVICE_SELF_OWNER, luxor_55_10828_device, pio_pb_w),
+ DEVCB_NULL
+};
+
+
+//-------------------------------------------------
+// z80_daisy_config daisy_chain
+//-------------------------------------------------
+
+static const z80_daisy_config daisy_chain[] =
+{
+ { Z80PIO_TAG },
+ { NULL }
+};
+
+
+//-------------------------------------------------
+// wd17xx_interface fdc_intf
+//-------------------------------------------------
+
+static SLOT_INTERFACE_START( abc_floppies )
+ SLOT_INTERFACE( "525sssd", FLOPPY_525_SSSD )
+ SLOT_INTERFACE( "525sd", FLOPPY_525_SD )
+ SLOT_INTERFACE( "525ssdd", FLOPPY_525_SSDD )
+ SLOT_INTERFACE( "525dd", FLOPPY_525_DD )
+ SLOT_INTERFACE( "8dsdd", FLOPPY_8_DSDD )
+SLOT_INTERFACE_END
+
+void luxor_55_10828_device::fdc_intrq_w(bool state)
+{
+ m_fdc_irq = state;
+ m_pio->port_b_write(state << 7);
+
+ if (state) m_maincpu->set_input_line(Z80_INPUT_LINE_WAIT, CLEAR_LINE);
+}
+
+void luxor_55_10828_device::fdc_drq_w(bool state)
+{
+ m_fdc_drq = state;
+
+ if (state) m_maincpu->set_input_line(Z80_INPUT_LINE_WAIT, CLEAR_LINE);
+}
+
+
+//-------------------------------------------------
+// MACHINE_DRIVER( luxor_55_10828 )
+//-------------------------------------------------
+
+static MACHINE_CONFIG_FRAGMENT( luxor_55_10828 )
+ MCFG_CPU_ADD(Z80_TAG, Z80, XTAL_4MHz/2)
+ MCFG_CPU_PROGRAM_MAP(luxor_55_10828_mem)
+ MCFG_CPU_IO_MAP(luxor_55_10828_io)
+ MCFG_CPU_CONFIG(daisy_chain)
+
+ MCFG_Z80PIO_ADD(Z80PIO_TAG, XTAL_4MHz/2, pio_intf)
+ MCFG_MB8876x_ADD(MB8876_TAG, XTAL_4MHz/2)
+
+ MCFG_FLOPPY_DRIVE_ADD(MB8876_TAG":0", abc_floppies, "525dd", floppy_image_device::default_floppy_formats)
+ MCFG_FLOPPY_DRIVE_ADD(MB8876_TAG":1", abc_floppies, "525dd", floppy_image_device::default_floppy_formats)
+MACHINE_CONFIG_END
+
+
+//-------------------------------------------------
+// machine_config_additions - device-specific
+// machine configurations
+//-------------------------------------------------
+
+machine_config_constructor luxor_55_10828_device::device_mconfig_additions() const
+{
+ return MACHINE_CONFIG_NAME( luxor_55_10828 );
+}
+
+
+//-------------------------------------------------
+// INPUT_PORTS( luxor_55_10828 )
+//-------------------------------------------------
+
+INPUT_PORTS_START( luxor_55_10828 )
+ PORT_START("SW1")
+ PORT_DIPNAME( 0x01, 0x01, "Drive 0 Sided" ) PORT_DIPLOCATION("SW1:1")
+ PORT_DIPSETTING( 0x01, DEF_STR( Single ) )
+ PORT_DIPSETTING( 0x00, "Double" )
+ PORT_DIPNAME( 0x02, 0x02, "Drive 1 Sided" ) PORT_DIPLOCATION("SW1:2")
+ PORT_DIPSETTING( 0x02, DEF_STR( Single ) )
+ PORT_DIPSETTING( 0x00, "Double" )
+ PORT_DIPNAME( 0x04, 0x00, "Drive 0 Density" ) PORT_DIPLOCATION("SW1:3")
+ PORT_DIPSETTING( 0x04, DEF_STR( Single ) )
+ PORT_DIPSETTING( 0x00, "Double" )
+ PORT_DIPNAME( 0x08, 0x00, "Drive 1 Density" ) PORT_DIPLOCATION("SW1:4")
+ PORT_DIPSETTING( 0x08, DEF_STR( Single ) )
+ PORT_DIPSETTING( 0x00, "Double" )
+
+ PORT_START("S1")
+ PORT_DIPNAME( 0x01, 0x01, "Card Address" ) PORT_DIPLOCATION("S1:1")
+ PORT_DIPSETTING( 0x00, "44 (ABC 832/834/850)" )
+ PORT_DIPSETTING( 0x01, "45 (ABC 830)" )
+INPUT_PORTS_END
+
+
+//-------------------------------------------------
+// input_ports - device-specific input ports
+//-------------------------------------------------
+
+ioport_constructor luxor_55_10828_device::device_input_ports() const
+{
+ return INPUT_PORTS_NAME( luxor_55_10828 );
+}
+
+
+
+//**************************************************************************
+// LIVE DEVICE
+//**************************************************************************
+
+//-------------------------------------------------
+// luxor_55_10828_device - constructor
+//-------------------------------------------------
+
+luxor_55_10828_device::luxor_55_10828_device(const machine_config &mconfig, const char *tag, device_t *owner, UINT32 clock)
+ : device_t(mconfig, LUXOR_55_10828, "Luxor 55 10828", tag, owner, clock, "lux10828", __FILE__),
+ device_abcbus_card_interface(mconfig, *this),
+ m_maincpu(*this, Z80_TAG),
+ m_pio(*this, Z80PIO_TAG),
+ m_fdc(*this, MB8876_TAG),
+ m_floppy0(*this, MB8876_TAG":0"),
+ m_floppy1(*this, MB8876_TAG":1"),
+ m_sw1(*this, "SW1"),
+ m_s1(*this, "S1"),
+ m_cs(false),
+ m_fdc_irq(0),
+ m_fdc_drq(0),
+ m_wait_enable(0),
+ m_sel0(0),
+ m_sel1(0)
+{
+}
+
+
+//-------------------------------------------------
+// device_start - device-specific startup
+//-------------------------------------------------
+
+void luxor_55_10828_device::device_start()
+{
+ // floppy callbacks
+ m_fdc->setup_intrq_cb(wd_fdc_t::line_cb(FUNC(luxor_55_10828_device::fdc_intrq_w), this));
+ m_fdc->setup_drq_cb(wd_fdc_t::line_cb(FUNC(luxor_55_10828_device::fdc_drq_w), this));
+
+ // state saving
+ save_item(NAME(m_cs));
+ save_item(NAME(m_status));
+ save_item(NAME(m_data));
+ save_item(NAME(m_fdc_irq));
+ save_item(NAME(m_fdc_drq));
+ save_item(NAME(m_wait_enable));
+ save_item(NAME(m_sel0));
+ save_item(NAME(m_sel1));
+
+ // patch out protection checks
+ UINT8 *rom = memregion(Z80_TAG)->base();
+ rom[0x00fa] = 0xff;
+ rom[0x0336] = 0xff;
+ rom[0x0718] = 0xff;
+ rom[0x072c] = 0xff;
+ rom[0x0771] = 0xff;
+ rom[0x0788] = 0xff;
+}
+
+
+//-------------------------------------------------
+// device_reset - device-specific reset
+//-------------------------------------------------
+
+void luxor_55_10828_device::device_reset()
+{
+ m_cs = false;
+}
+
+
+
+//**************************************************************************
+// ABC BUS INTERFACE
+//**************************************************************************
+
+//-------------------------------------------------
+// abcbus_cs -
+//-------------------------------------------------
+
+void luxor_55_10828_device::abcbus_cs(UINT8 data)
+{
+ UINT8 address = 0x2c | BIT(m_s1->read(), 0);
+
+ m_cs = (data == address);
+}
+
+
+//-------------------------------------------------
+// abcbus_stat -
+//-------------------------------------------------
+
+UINT8 luxor_55_10828_device::abcbus_stat()
+{
+ UINT8 data = 0xff;
+
+ if (m_cs)
+ {
+ data = (m_status & 0xfe) | m_pio->rdy_a();
+ }
+
+ return data;
+}
+
+
+//-------------------------------------------------
+// abcbus_inp -
+//-------------------------------------------------
+
+UINT8 luxor_55_10828_device::abcbus_inp()
+{
+ UINT8 data = 0xff;
+
+ if (m_cs)
+ {
+ if (!BIT(m_status, 6))
+ {
+ data = m_data;
+ }
+
+ m_pio->strobe_a(0);
+ m_pio->strobe_a(1);
+ }
+
+ return data;
+}
+
+
+//-------------------------------------------------
+// abcbus_utp -
+//-------------------------------------------------
+
+void luxor_55_10828_device::abcbus_utp(UINT8 data)
+{
+ if (!m_cs) return;
+
+ if (BIT(m_status, 6))
+ {
+ m_data = data;
+ }
+
+ m_pio->strobe_a(0);
+ m_pio->strobe_a(1);
+}
+
+
+//-------------------------------------------------
+// abcbus_c1 -
+//-------------------------------------------------
+
+void luxor_55_10828_device::abcbus_c1(UINT8 data)
+{
+ if (m_cs)
+ {
+ m_maincpu->set_input_line(INPUT_LINE_NMI, ASSERT_LINE);
+ m_maincpu->set_input_line(INPUT_LINE_NMI, CLEAR_LINE);
+ }
+}
+
+
+//-------------------------------------------------
+// abcbus_c3 -
+//-------------------------------------------------
+
+void luxor_55_10828_device::abcbus_c3(UINT8 data)
+{
+ if (m_cs)
+ {
+ m_maincpu->reset();
+ }
+}
+
+
+
+//**************************************************************************
+// IMPLEMENTATION
+//**************************************************************************
+
+//-------------------------------------------------
+// ctrl_w -
+//-------------------------------------------------
+
+WRITE8_MEMBER( luxor_55_10828_device::ctrl_w )
+{
+ /*
+
+ bit signal description
+
+ 0 SEL 0
+ 1 SEL 1
+ 2 SEL 2
+ 3 _MOT ON
+ 4 SIDE
+ 5 _PRECOMP ON
+ 6 _WAIT ENABLE
+ 7 FDC _MR
+
+ */
+
+ // drive selection
+ m_sel0 = BIT(data, 0);
+ m_sel1 = BIT(data, 1);
+
+ floppy_image_device *floppy = NULL;
+
+ if (BIT(data, 0)) floppy = m_floppy0->get_device();
+ if (BIT(data, 1)) floppy = m_floppy1->get_device();
+
+ m_fdc->set_floppy(floppy);
+
+ if (floppy)
+ {
+ // motor enable
+ floppy->mon_w(BIT(data, 3));
+
+ // side select
+ floppy->ss_w(BIT(data, 4));
+ }
+
+ // wait enable
+ m_wait_enable = BIT(data, 6);
+
+ // FDC master reset
+ if (!BIT(data, 7)) m_fdc->reset();
+}
+
+
+//-------------------------------------------------
+// status_w -
+//-------------------------------------------------
+
+WRITE8_MEMBER( luxor_55_10828_device::status_w )
+{
+ /*
+
+ bit description
+
+ 0 _INT to main Z80
+ 1
+ 2
+ 3
+ 4
+ 5
+ 6 LS245 DIR
+ 7
+
+ */
+
+ m_status = data & 0xfe;
+
+ // interrupt
+ m_slot->int_w(BIT(data, 0) ? CLEAR_LINE : ASSERT_LINE);
+}
+
+
+//-------------------------------------------------
+// fdc_r -
+//-------------------------------------------------
+
+READ8_MEMBER( luxor_55_10828_device::fdc_r )
+{
+ if (!m_wait_enable && !m_fdc_irq && !m_fdc_drq)
+ {
+ fatalerror("Z80 WAIT not supported by MAME core\n");
+
+ m_maincpu->set_input_line(Z80_INPUT_LINE_WAIT, ASSERT_LINE);
+ }
+
+ return m_fdc->gen_r(offset);
+}
+
+
+//-------------------------------------------------
+// fdc_w -
+//-------------------------------------------------
+
+WRITE8_MEMBER( luxor_55_10828_device::fdc_w )
+{
+ if (!m_wait_enable && !m_fdc_irq && !m_fdc_drq)
+ {
+ fatalerror("Z80 WAIT not supported by MAME core\n");
+
+ m_maincpu->set_input_line(Z80_INPUT_LINE_WAIT, ASSERT_LINE);
+ }
+
+ m_fdc->gen_w(offset, data);
+}
+
+
+
+//**************************************************************************
+// LUXOR 55 10828 DEVICE INPUT DEFAULTS
+//**************************************************************************
+
+//-------------------------------------------------
+// DEVICE_INPUT_DEFAULTS( abc830_slow )
+//-------------------------------------------------
+
+DEVICE_INPUT_DEFAULTS_START( abc830_slow )
+ DEVICE_INPUT_DEFAULTS("SW1", 0x0f, 0x03)
+ DEVICE_INPUT_DEFAULTS("S1", 0x01, 0x01)
+DEVICE_INPUT_DEFAULTS_END
diff --git a/src/emu/bus/abcbus/lux10828.h b/src/emu/bus/abcbus/lux10828.h
new file mode 100644
index 00000000000..843d62a1b8f
--- /dev/null
+++ b/src/emu/bus/abcbus/lux10828.h
@@ -0,0 +1,121 @@
+// license:BSD-3-Clause
+// copyright-holders:Curt Coder
+/**********************************************************************
+
+ Luxor 55-10828 "slow" floppy disk controller emulation
+
+ Copyright MESS Team.
+ Visit http://mamedev.org for licensing and usage restrictions.
+
+*********************************************************************/
+
+#pragma once
+
+#ifndef __LUXOR_55_10828__
+#define __LUXOR_55_10828__
+
+#include "emu.h"
+#include "abcbus.h"
+#include "cpu/z80/z80.h"
+#include "cpu/z80/z80daisy.h"
+#include "machine/wd_fdc.h"
+#include "machine/z80pio.h"
+
+
+
+//**************************************************************************
+// MACROS / CONSTANTS
+//**************************************************************************
+
+#define ADDRESS_ABC830 45
+#define ADDRESS_ABC832 44
+#define ADDRESS_ABC834 44
+#define ADDRESS_ABC850 44
+
+
+#define DRIVE_TEAC_FD55F 0x01
+#define DRIVE_BASF_6138 0x02
+#define DRIVE_MICROPOLIS_1015F 0x03
+#define DRIVE_BASF_6118 0x04
+#define DRIVE_MICROPOLIS_1115F 0x05
+#define DRIVE_BASF_6106_08 0x08
+#define DRIVE_MPI_51 0x09
+#define DRIVE_BASF_6105 0x0e
+#define DRIVE_BASF_6106 0x0f
+
+
+
+//**************************************************************************
+// TYPE DEFINITIONS
+//**************************************************************************
+
+// ======================> luxor_55_10828_device
+
+class luxor_55_10828_device : public device_t,
+ public device_abcbus_card_interface
+{
+public:
+ // construction/destruction
+ luxor_55_10828_device(const machine_config &mconfig, const char *tag, device_t *owner, UINT32 clock);
+
+ DECLARE_WRITE8_MEMBER( ctrl_w );
+ DECLARE_WRITE8_MEMBER( status_w );
+ DECLARE_READ8_MEMBER( fdc_r );
+ DECLARE_WRITE8_MEMBER( fdc_w );
+
+ DECLARE_READ8_MEMBER( pio_pa_r );
+ DECLARE_WRITE8_MEMBER( pio_pa_w );
+ DECLARE_READ8_MEMBER( pio_pb_r );
+ DECLARE_WRITE8_MEMBER( pio_pb_w );
+
+ void fdc_intrq_w(bool state);
+ void fdc_drq_w(bool state);
+
+ // optional information overrides
+ virtual const rom_entry *device_rom_region() const;
+ virtual machine_config_constructor device_mconfig_additions() const;
+ virtual ioport_constructor device_input_ports() const;
+
+protected:
+ // device-level overrides
+ virtual void device_start();
+ virtual void device_reset();
+
+ // device_abcbus_interface overrides
+ virtual void abcbus_cs(UINT8 data);
+ virtual UINT8 abcbus_inp();
+ virtual void abcbus_utp(UINT8 data);
+ virtual UINT8 abcbus_stat();
+ virtual void abcbus_c1(UINT8 data);
+ virtual void abcbus_c3(UINT8 data);
+
+private:
+ required_device<cpu_device> m_maincpu;
+ required_device<z80pio_device> m_pio;
+ required_device<mb8876_t> m_fdc;
+ required_device<floppy_connector> m_floppy0;
+ required_device<floppy_connector> m_floppy1;
+ required_ioport m_sw1;
+ required_ioport m_s1;
+
+ bool m_cs; // card selected
+ UINT8 m_status; // ABC BUS status
+ UINT8 m_data; // ABC BUS data
+ bool m_fdc_irq; // floppy interrupt
+ bool m_fdc_drq; // floppy data request
+ int m_wait_enable; // wait enable
+ int m_sel0; // drive select 0
+ int m_sel1; // drive select 1
+};
+
+
+// device type definition
+extern const device_type LUXOR_55_10828;
+
+
+// default input ports
+extern const input_device_default DEVICE_INPUT_DEFAULTS_NAME( abc830_slow )[];
+
+
+
+#endif
diff --git a/src/emu/bus/abcbus/lux21046.c b/src/emu/bus/abcbus/lux21046.c
new file mode 100644
index 00000000000..4da64534a4a
--- /dev/null
+++ b/src/emu/bus/abcbus/lux21046.c
@@ -0,0 +1,792 @@
+// license:BSD-3-Clause
+// copyright-holders:Curt Coder
+/**********************************************************************
+
+ Luxor 55-21046 "fast" floppy disk controller emulation
+
+ Copyright MESS Team.
+ Visit http://mamedev.org for licensing and usage restrictions.
+
+*********************************************************************/
+
+/*
+
+Luxor Conkort
+
+PCB Layout
+----------
+
+55 11046-03
+
+|-----------------------------------|
+| LD1 SW1 CON2 |
+| |
+| CON3 S8 |
+| S9 |
+| LS240 LS174 7406 7406 |
+| |
+| LS174 FDC9229 LS107 LS266 |
+| |
+| |
+| SAB1793 |
+| LS368 16MHz |
+| S6 |
+| Z80DMA ROM |
+| |
+| |
+| Z80 TC5565 |
+| |
+| |
+| LS138 LS174 SW2 74374 |
+| |
+| LS10 LS266 S5 LS374 |
+| S3 |
+| S1 LS240 |
+| |
+| LS244 SW3 DM8131 |
+| |
+| |
+|--|-----------------------------|--|
+ |------------CON1-------------|
+
+Notes:
+ All IC's shown.
+
+ ROM - Toshiba TMM27128D-20 16Kx8 EPROM "CNTR 1.07 6490318-07"
+ TC5565 - Toshiba TC5565PL-15 8Kx8 bit Static RAM
+ Z80 - Zilog Z8400APS Z80A CPU
+ Z80DMA - Zilog Z8410APS Z80A DMA
+ SAB1793 - Siemens SAB1793-02P Floppy Disc Controller
+ FDC9229 - SMC FDC9229BT Floppy Disc Interface Circuit
+ DM8131 - National Semiconductor DM8131N 6-Bit Unified Bus Comparator
+ CON1 - ABC bus connector
+ CON2 - 25-pin D sub floppy connector (AMP4284)
+ CON3 - 34-pin header floppy connector
+ SW1 - Disk drive type (SS/DS, SD/DD)
+ SW2 - Disk drive model
+ SW3 - ABC bus address
+ S1 - Interface type (A:? B:ABCBUS)
+ S3 - Interface type (A:? B:ABCBUS)
+ S5 - Interface type (A:? B:ABCBUS)
+ S6 - Amount of RAM installed (A:2KB, B:8KB)
+ S7 - Number of drives connected (0:3, 1:2) *located on solder side
+ S8 - Disk drive type (0:8", 1:5.25")
+ S9 - Location of RDY signal (A:8" P2-6, B:5.25" P2-34)
+ LD1 - LED
+
+*/
+
+#include "lux21046.h"
+
+
+
+//**************************************************************************
+// MACROS / CONSTANTS
+//**************************************************************************
+
+#define Z80_TAG "5ab"
+#define Z80DMA_TAG "6ab"
+#define SAB1793_TAG "7ab"
+#define FDC9229_TAG "8b"
+
+
+
+//**************************************************************************
+// DEVICE DEFINITIONS
+//**************************************************************************
+
+const device_type LUXOR_55_21046 = &device_creator<luxor_55_21046_device>;
+
+
+//-------------------------------------------------
+// ROM( luxor_55_21046 )
+//-------------------------------------------------
+
+ROM_START( luxor_55_21046 )
+ ROM_REGION( 0x4000, Z80_TAG, 0 ) // A13 is always high, thus loading at 0x2000
+ ROM_DEFAULT_BIOS( "v107" )
+ ROM_SYSTEM_BIOS( 0, "v107", "Luxor v1.07 (1985-07-03)" )
+ ROMX_LOAD( "cntr 1.07 6490318-07.6cd", 0x0000, 0x4000, CRC(db8c1c0e) SHA1(8bccd5bc72124984de529ee058df779f06d2c1d5), ROM_BIOS(1) )
+ ROM_SYSTEM_BIOS( 1, "v108", "Luxor v1.08 (1986-03-12)" )
+ ROMX_LOAD( "cntr 108.6cd", 0x2000, 0x2000, CRC(229764cb) SHA1(a2e2f6f49c31b827efc62f894de9a770b65d109d), ROM_BIOS(2) )
+ ROM_SYSTEM_BIOS( 2, "v207", "DiAB v2.07 (1987-06-24)" )
+ ROMX_LOAD( "diab 207.6cd", 0x2000, 0x2000, CRC(86622f52) SHA1(61ad271de53152c1640c0b364fce46d1b0b4c7e2), ROM_BIOS(3) )
+ROM_END
+
+
+//-------------------------------------------------
+// rom_region - device-specific ROM region
+//-------------------------------------------------
+
+const rom_entry *luxor_55_21046_device::device_rom_region() const
+{
+ return ROM_NAME( luxor_55_21046 );
+}
+
+
+//-------------------------------------------------
+// ADDRESS_MAP( luxor_55_21046_mem )
+//-------------------------------------------------
+
+static ADDRESS_MAP_START( luxor_55_21046_mem, AS_PROGRAM, 8, luxor_55_21046_device )
+ ADDRESS_MAP_UNMAP_HIGH
+ ADDRESS_MAP_GLOBAL_MASK(0x3fff)
+ AM_RANGE(0x0000, 0x1fff) AM_ROM AM_REGION(Z80_TAG, 0x2000)
+ AM_RANGE(0x2000, 0x3fff) AM_RAM
+ADDRESS_MAP_END
+
+
+//-------------------------------------------------
+// ADDRESS_MAP( luxor_55_21046_io )
+//-------------------------------------------------
+
+static ADDRESS_MAP_START( luxor_55_21046_io, AS_IO, 8, luxor_55_21046_device )
+ ADDRESS_MAP_UNMAP_HIGH
+ AM_RANGE(0x00, 0x00) AM_MIRROR(0xff0f) AM_READ(_3d_r)
+ AM_RANGE(0x10, 0x10) AM_MIRROR(0xff0f) AM_WRITE(_4d_w)
+ AM_RANGE(0x20, 0x20) AM_MIRROR(0xff0f) AM_WRITE(_4b_w)
+ AM_RANGE(0x30, 0x30) AM_MIRROR(0xff0f) AM_WRITE(_9b_w)
+ AM_RANGE(0x40, 0x40) AM_MIRROR(0xff0f) AM_WRITE(_8a_w)
+ AM_RANGE(0x50, 0x50) AM_MIRROR(0xff0f) AM_MASK(0xff00) AM_READ(_9a_r)
+ AM_RANGE(0x60, 0x63) AM_MIRROR(0xff0c) AM_DEVREAD(SAB1793_TAG, fd1793_t, read)
+ AM_RANGE(0x70, 0x73) AM_MIRROR(0xff0c) AM_DEVWRITE(SAB1793_TAG, fd1793_t, write)
+ AM_RANGE(0x80, 0x80) AM_MIRROR(0xff0f) AM_DEVREADWRITE_LEGACY(Z80DMA_TAG, z80dma_r, z80dma_w)
+ADDRESS_MAP_END
+
+
+//-------------------------------------------------
+// Z80DMA_INTERFACE( dma_intf )
+//-------------------------------------------------
+
+/*
+
+ DMA Transfer Programs
+
+ READ DAM
+ --------
+ 7D 45 21 05 00 C3 14 28 95 6B 02 8A CF 01 AF CF 87
+
+ 7D transfer mode, port A -> port B, port A starting address follows, block length follows
+ 45 port A starting address low byte = 45
+ 21 port A starting address high byte = 21
+ 05 block length low byte = 05
+ 00 block length high byte = 00
+ C3 reset
+ 14 port A is memory, port A address increments
+ 28 port B is I/O, port B address fixed
+ 95 byte mode, port B starting address low byte follows, interrupt control byte follows
+ 6B port B starting address low byte = 6B (FDC DATA read)
+ 02 interrupt at end of block
+ 8A ready active high
+ CF load
+ 01 transfer B->A
+ AF disable interrupts
+ CF load
+ 87 enable DMA
+
+ WRITE TO DISK
+ -------------
+ C3 14 28 95 7B 02 8A CF 05 AF CF 87
+
+ C3 reset
+ 14 port A is memory, port A address increments
+ 28 port B is I/O, port B address fixed
+ 95 byte mode, port B starting address low follows, interrupt control byte follows
+ 7B port B starting address 0x007B (FDC DATA write)
+ 02 interrupt at end of block
+ 8A ready active high
+ CF load
+ 05 transfer A->B
+ AF disable interrupts
+ CF load
+ 87 enable DMA
+
+ ??
+ --
+ C3 91 40 8A AB
+
+ C3 reset
+ 91 byte mode, interrupt control byte follows
+ 40 interrupt on RDY
+ 8A _CE only, ready active high, stop on end of block
+ AB enable interrupts
+
+*/
+
+WRITE_LINE_MEMBER( luxor_55_21046_device::dma_int_w )
+{
+ m_dma_irq = state;
+
+ // FDC and DMA interrupts are wire-ORed to the Z80
+ m_maincpu->set_input_line(INPUT_LINE_IRQ0, m_fdc_irq || m_dma_irq);
+}
+
+READ8_MEMBER(luxor_55_21046_device::memory_read_byte)
+{
+ address_space& prog_space = m_maincpu->space(AS_PROGRAM);
+ return prog_space.read_byte(offset);
+}
+
+WRITE8_MEMBER(luxor_55_21046_device::memory_write_byte)
+{
+ address_space& prog_space = m_maincpu->space(AS_PROGRAM);
+ return prog_space.write_byte(offset, data);
+}
+
+READ8_MEMBER(luxor_55_21046_device::io_read_byte)
+{
+ address_space& prog_space = m_maincpu->space(AS_IO);
+ return prog_space.read_byte(offset);
+}
+
+WRITE8_MEMBER(luxor_55_21046_device::io_write_byte)
+{
+ address_space& prog_space = m_maincpu->space(AS_IO);
+ return prog_space.write_byte(offset, data);
+}
+
+static Z80DMA_INTERFACE( dma_intf )
+{
+ DEVCB_CPU_INPUT_LINE(Z80_TAG, INPUT_LINE_HALT),
+ DEVCB_DEVICE_LINE_MEMBER(DEVICE_SELF_OWNER, luxor_55_21046_device, dma_int_w),
+ DEVCB_NULL,
+ DEVCB_DEVICE_MEMBER(DEVICE_SELF_OWNER, luxor_55_21046_device, memory_read_byte),
+ DEVCB_DEVICE_MEMBER(DEVICE_SELF_OWNER, luxor_55_21046_device, memory_write_byte),
+ DEVCB_DEVICE_MEMBER(DEVICE_SELF_OWNER, luxor_55_21046_device, io_read_byte),
+ DEVCB_DEVICE_MEMBER(DEVICE_SELF_OWNER, luxor_55_21046_device, io_write_byte),
+};
+
+
+//-------------------------------------------------
+// wd17xx_interface fdc_intf
+//-------------------------------------------------
+
+static SLOT_INTERFACE_START( abc_floppies )
+ SLOT_INTERFACE( "525sssd", FLOPPY_525_SSSD )
+ SLOT_INTERFACE( "525sd", FLOPPY_525_SD )
+ SLOT_INTERFACE( "525ssdd", FLOPPY_525_SSDD )
+ SLOT_INTERFACE( "525dd", FLOPPY_525_DD )
+ SLOT_INTERFACE( "8dsdd", FLOPPY_8_DSDD )
+SLOT_INTERFACE_END
+
+void luxor_55_21046_device::fdc_intrq_w(bool state)
+{
+ m_fdc_irq = state;
+
+ // FDC and DMA interrupts are wire-ORed to the Z80
+ m_maincpu->set_input_line(INPUT_LINE_IRQ0, m_fdc_irq || m_dma_irq);
+}
+
+void luxor_55_21046_device::fdc_drq_w(bool state)
+{
+ m_dma->rdy_w(state);
+}
+
+
+//-------------------------------------------------
+// MACHINE_DRIVER( luxor_55_21046 )
+//-------------------------------------------------
+
+static MACHINE_CONFIG_FRAGMENT( luxor_55_21046 )
+ MCFG_CPU_ADD(Z80_TAG, Z80, XTAL_16MHz/4)
+ MCFG_CPU_PROGRAM_MAP(luxor_55_21046_mem)
+ MCFG_CPU_IO_MAP(luxor_55_21046_io)
+
+ MCFG_Z80DMA_ADD(Z80DMA_TAG, XTAL_16MHz/4, dma_intf)
+ MCFG_FD1793x_ADD(SAB1793_TAG, XTAL_16MHz/8)
+
+ MCFG_FLOPPY_DRIVE_ADD(SAB1793_TAG":0", abc_floppies, "525dd", floppy_image_device::default_floppy_formats)
+ MCFG_FLOPPY_DRIVE_ADD(SAB1793_TAG":1", abc_floppies, "525dd", floppy_image_device::default_floppy_formats)
+MACHINE_CONFIG_END
+
+
+//-------------------------------------------------
+// machine_config_additions - device-specific
+// machine configurations
+//-------------------------------------------------
+
+machine_config_constructor luxor_55_21046_device::device_mconfig_additions() const
+{
+ return MACHINE_CONFIG_NAME( luxor_55_21046 );
+}
+
+
+//-------------------------------------------------
+// INPUT_PORTS( luxor_55_21046 )
+//-------------------------------------------------
+
+INPUT_PORTS_START( luxor_55_21046 )
+ PORT_START("SW1")
+ // ABC 838
+ PORT_DIPNAME( 0x0f, 0x00, DEF_STR( Unused ) ) PORT_DIPLOCATION("SW1:1,2,3,4") PORT_CONDITION("SW3", 0x7f, EQUALS, 0x2e)
+ PORT_DIPSETTING( 0x00, DEF_STR( Unused ) ) PORT_CONDITION("SW3", 0x7f, EQUALS, 0x2e)
+ // ABC 830
+ PORT_DIPNAME( 0x01, 0x00, "Drive 0 Sided" ) PORT_DIPLOCATION("SW1:1") PORT_CONDITION("SW3", 0x7f, EQUALS, 0x2d)
+ PORT_DIPSETTING( 0x00, DEF_STR( Single ) )
+ PORT_DIPSETTING( 0x01, "Double" )
+ PORT_DIPNAME( 0x02, 0x00, "Drive 1 Sided" ) PORT_DIPLOCATION("SW1:2") PORT_CONDITION("SW3", 0x7f, EQUALS, 0x2d)
+ PORT_DIPSETTING( 0x00, DEF_STR( Single ) )
+ PORT_DIPSETTING( 0x02, "Double" )
+ PORT_DIPNAME( 0x04, 0x00, "Drive 0 Density" ) PORT_DIPLOCATION("SW1:3") PORT_CONDITION("SW3", 0x7f, EQUALS, 0x2d)
+ PORT_DIPSETTING( 0x00, DEF_STR( Single ) )
+ PORT_DIPSETTING( 0x04, "Double" )
+ PORT_DIPNAME( 0x08, 0x00, "Drive 1 Density" ) PORT_DIPLOCATION("SW1:4") PORT_CONDITION("SW3", 0x7f, EQUALS, 0x2d)
+ PORT_DIPSETTING( 0x00, DEF_STR( Single ) )
+ PORT_DIPSETTING( 0x08, "Double" )
+ // ABC 832/834/850
+ PORT_DIPNAME( 0x01, 0x01, "Drive 0 Sided" ) PORT_DIPLOCATION("SW1:1") PORT_CONDITION("SW3", 0x7f, EQUALS, 0x2c)
+ PORT_DIPSETTING( 0x00, DEF_STR( Single ) )
+ PORT_DIPSETTING( 0x01, "Double" )
+ PORT_DIPNAME( 0x02, 0x02, "Drive 1 Sided" ) PORT_DIPLOCATION("SW1:2") PORT_CONDITION("SW3", 0x7f, EQUALS, 0x2c)
+ PORT_DIPSETTING( 0x00, DEF_STR( Single ) )
+ PORT_DIPSETTING( 0x02, "Double" )
+ PORT_DIPNAME( 0x04, 0x00, "Drive 0 Tracks" ) PORT_DIPLOCATION("SW1:3") PORT_CONDITION("SW3", 0x7f, EQUALS, 0x2c)
+ PORT_DIPSETTING( 0x00, "80" )
+ PORT_DIPSETTING( 0x04, "40" )
+ PORT_DIPNAME( 0x08, 0x00, "Drive 1 Tracks" ) PORT_DIPLOCATION("SW1:4") PORT_CONDITION("SW3", 0x7f, EQUALS, 0x2c)
+ PORT_DIPSETTING( 0x00, "80" )
+ PORT_DIPSETTING( 0x08, "40" )
+
+ PORT_START("SW2")
+ PORT_DIPNAME( 0x0f, 0x01, "Drive Type" ) PORT_DIPLOCATION("SW2:1,2,3,4")
+ PORT_DIPSETTING( 0x01, "TEAC FD55F (ABC 834)" ) PORT_CONDITION("SW3", 0x7f, EQUALS, 0x2c) // 230 7802-01
+ PORT_DIPSETTING( 0x02, "BASF 6138 (ABC 850)" ) PORT_CONDITION("SW3", 0x7f, EQUALS, 0x2c) // 230 8440-15
+ PORT_DIPSETTING( 0x03, "Micropolis 1015F (ABC 832)" ) PORT_CONDITION("SW3", 0x7f, EQUALS, 0x2c) // 190 9711-15
+ PORT_DIPSETTING( 0x04, "BASF 6118 (ABC 832)" ) PORT_CONDITION("SW3", 0x7f, EQUALS, 0x2c) // 190 9711-16
+ PORT_DIPSETTING( 0x05, "Micropolis 1115F (ABC 832)" ) PORT_CONDITION("SW3", 0x7f, EQUALS, 0x2c) // 190 9711-17
+ PORT_DIPSETTING( 0x08, "BASF 6106/08 (ABC 830)" ) PORT_CONDITION("SW3", 0x7f, EQUALS, 0x2d) // 190 9206-16
+ PORT_DIPSETTING( 0x09, "MPI 51 (ABC 830)" ) PORT_CONDITION("SW3", 0x7f, EQUALS, 0x2d) // 190 9206-16
+ PORT_DIPSETTING( 0x0e, "BASF 6105 (ABC 838)" ) PORT_CONDITION("SW3", 0x7f, EQUALS, 0x2e)
+ PORT_DIPSETTING( 0x0f, "BASF 6106 (ABC 838)" ) PORT_CONDITION("SW3", 0x7f, EQUALS, 0x2e) // 230 8838-15
+
+ PORT_START("SW3")
+ PORT_DIPNAME( 0x7f, 0x2c, "Card Address" ) PORT_DIPLOCATION("SW3:1,2,3,4,5,6,7")
+ PORT_DIPSETTING( 0x2c, "44 (ABC 832/834/850)" )
+ PORT_DIPSETTING( 0x2d, "45 (ABC 830)" )
+ PORT_DIPSETTING( 0x2e, "46 (ABC 838)" )
+
+ PORT_START("S6")
+ PORT_DIPNAME( 0x01, 0x01, "RAM Size" ) PORT_DIPLOCATION("S6:1")
+ PORT_DIPSETTING( 0x00, "2 KB" )
+ PORT_DIPSETTING( 0x01, "8 KB" )
+
+ PORT_START("S8")
+ PORT_DIPNAME( 0x01, 0x01, "Drive Type" ) PORT_DIPLOCATION("S8:1")
+ PORT_DIPSETTING( 0x00, "8\"" )
+ PORT_DIPSETTING( 0x01, "5.25\"" )
+
+ PORT_START("S9")
+ PORT_DIPNAME( 0x01, 0x01, "RDY Pin" ) PORT_DIPLOCATION("S9:1")
+ PORT_DIPSETTING( 0x00, "P2-6 (8\")" )
+ PORT_DIPSETTING( 0x01, "P2-34 (5.25\")" )
+INPUT_PORTS_END
+
+
+//-------------------------------------------------
+// input_ports - device-specific input ports
+//-------------------------------------------------
+
+ioport_constructor luxor_55_21046_device::device_input_ports() const
+{
+ return INPUT_PORTS_NAME( luxor_55_21046 );
+}
+
+
+
+//**************************************************************************
+// LIVE DEVICE
+//**************************************************************************
+
+//-------------------------------------------------
+// luxor_55_21046_device - constructor
+//-------------------------------------------------
+
+luxor_55_21046_device::luxor_55_21046_device(const machine_config &mconfig, const char *tag, device_t *owner, UINT32 clock)
+ : device_t(mconfig, LUXOR_55_21046, "Luxor 55 21046", tag, owner, clock, "lux21046", __FILE__),
+ device_abcbus_card_interface(mconfig, *this),
+ m_maincpu(*this, Z80_TAG),
+ m_dma(*this, Z80DMA_TAG),
+ m_fdc(*this, SAB1793_TAG),
+ m_floppy0(*this, SAB1793_TAG":0"),
+ m_floppy1(*this, SAB1793_TAG":1"),
+ m_floppy(NULL),
+ m_sw1(*this, "SW1"),
+ m_sw2(*this, "SW2"),
+ m_sw3(*this, "SW3"),
+ m_cs(false),
+ m_fdc_irq(0),
+ m_dma_irq(0),
+ m_busy(0),
+ m_force_busy(0)
+{
+}
+
+
+//-------------------------------------------------
+// device_start - device-specific startup
+//-------------------------------------------------
+
+void luxor_55_21046_device::device_start()
+{
+ // floppy callbacks
+ m_fdc->setup_intrq_cb(wd_fdc_t::line_cb(FUNC(luxor_55_21046_device::fdc_intrq_w), this));
+ m_fdc->setup_drq_cb(wd_fdc_t::line_cb(FUNC(luxor_55_21046_device::fdc_drq_w), this));
+
+ // state saving
+ save_item(NAME(m_cs));
+ save_item(NAME(m_status));
+ save_item(NAME(m_data_in));
+ save_item(NAME(m_data_out));
+ save_item(NAME(m_fdc_irq));
+ save_item(NAME(m_dma_irq));
+ save_item(NAME(m_busy));
+ save_item(NAME(m_force_busy));
+}
+
+
+//-------------------------------------------------
+// device_reset - device-specific reset
+//-------------------------------------------------
+
+void luxor_55_21046_device::device_reset()
+{
+ m_cs = false;
+ m_data_in = 0;
+}
+
+
+
+//**************************************************************************
+// ABC BUS INTERFACE
+//**************************************************************************
+
+//-------------------------------------------------
+// abcbus_cs -
+//-------------------------------------------------
+
+void luxor_55_21046_device::abcbus_cs(UINT8 data)
+{
+ m_cs = (data == m_sw3->read());
+}
+
+
+//-------------------------------------------------
+// abcbus_stat -
+//-------------------------------------------------
+
+UINT8 luxor_55_21046_device::abcbus_stat()
+{
+ UINT8 data = 0;
+
+ if (m_cs)
+ {
+ data = (m_status & 0xce) | m_busy;
+ }
+
+ // LS240 inverts the data
+ return data ^ 0xff;
+}
+
+
+//-------------------------------------------------
+// abcbus_inp -
+//-------------------------------------------------
+
+UINT8 luxor_55_21046_device::abcbus_inp()
+{
+ UINT8 data = 0xff;
+
+ if (m_cs)
+ {
+ data = m_data_out;
+ m_busy = 1;
+ }
+
+ return data;
+}
+
+
+//-------------------------------------------------
+// abcbus_utp -
+//-------------------------------------------------
+
+void luxor_55_21046_device::abcbus_utp(UINT8 data)
+{
+ if (m_cs)
+ {
+ m_data_in = data;
+ m_busy = 1;
+ }
+}
+
+
+//-------------------------------------------------
+// abcbus_c1 -
+//-------------------------------------------------
+
+void luxor_55_21046_device::abcbus_c1(UINT8 data)
+{
+ if (m_cs)
+ {
+ m_maincpu->set_input_line(INPUT_LINE_NMI, ASSERT_LINE);
+ m_maincpu->set_input_line(INPUT_LINE_NMI, CLEAR_LINE);
+ }
+}
+
+
+//-------------------------------------------------
+// abcbus_c3 -
+//-------------------------------------------------
+
+void luxor_55_21046_device::abcbus_c3(UINT8 data)
+{
+ if (m_cs)
+ {
+ m_maincpu->reset();
+ }
+}
+
+
+
+//**************************************************************************
+// IMPLEMENTATION
+//**************************************************************************
+
+//-------------------------------------------------
+// 3d_r -
+//-------------------------------------------------
+
+READ8_MEMBER( luxor_55_21046_device::_3d_r )
+{
+ if (BIT(m_status, 0))
+ {
+ m_busy = 0;
+ }
+
+ return m_data_in;
+}
+
+
+//-------------------------------------------------
+// 4d_w -
+//-------------------------------------------------
+
+WRITE8_MEMBER( luxor_55_21046_device::_4d_w )
+{
+ if (BIT(m_status, 0))
+ {
+ m_busy = 0;
+ }
+
+ m_data_out = data;
+}
+
+
+//-------------------------------------------------
+// 4b_w -
+//-------------------------------------------------
+
+WRITE8_MEMBER( luxor_55_21046_device::_4b_w )
+{
+ /*
+
+ bit description
+
+ 0 force busy
+ 1
+ 2
+ 3
+ 4 N/C
+ 5 N/C
+ 6
+ 7
+
+ */
+
+ m_status = data;
+
+ // busy
+ if (!BIT(m_status, 0))
+ {
+ m_busy = 1;
+ }
+}
+
+
+//-------------------------------------------------
+// 9b_w -
+//-------------------------------------------------
+
+WRITE8_MEMBER( luxor_55_21046_device::_9b_w )
+{
+ /*
+
+ bit signal description
+
+ 0 DS0 drive select 0
+ 1 DS1 drive select 1
+ 2 DS2 drive select 2
+ 3 MTRON motor on
+ 4 TG43 track > 43
+ 5 SIDE1 side 1 select
+ 6
+ 7
+
+ */
+
+ // drive select
+ m_floppy = NULL;
+
+ if (!BIT(data, 0)) m_floppy = m_floppy0->get_device();
+ if (!BIT(data, 1)) m_floppy = m_floppy1->get_device();
+
+ m_fdc->set_floppy(m_floppy);
+
+ if (m_floppy)
+ {
+ // motor enable
+ m_floppy->mon_w(!BIT(data, 3));
+
+ // side select
+ m_floppy->ss_w(BIT(data, 5));
+ }
+}
+
+
+//-------------------------------------------------
+// 8a_w -
+//-------------------------------------------------
+
+WRITE8_MEMBER( luxor_55_21046_device::_8a_w )
+{
+ /*
+
+ bit signal description
+
+ 0 FD1793 _MR FDC master reset
+ 1 FD1793 _DDEN, FDC9229 DENS density select
+ 2 FDC9229 MINI
+ 3 READY signal polarity (0=inverted)
+ 4 FDC9229 P2
+ 5 FDC9229 P1
+ 6
+ 7
+
+ FDC9229 P0 is grounded
+
+ */
+
+ // FDC master reset
+ if (!BIT(data, 0)) m_fdc->reset();
+
+ // density select
+ m_fdc->dden_w(BIT(data, 1));
+}
+
+
+//-------------------------------------------------
+// 9a_r -
+//-------------------------------------------------
+
+READ8_MEMBER( luxor_55_21046_device::_9a_r )
+{
+ /*
+
+ bit signal description
+
+ 0 busy controller busy
+ 1 _FD2S double-sided disk
+ 2 SW2
+ 3 _DCG disk changed
+ 4 SW1-1
+ 5 SW1-2
+ 6 SW1-3
+ 7 SW1-4
+
+ */
+
+ UINT8 data = 0;
+
+ // busy
+ data |= m_busy;
+
+ // floppy
+ data |= (m_floppy ? m_floppy->twosid_r() : 1) << 1;
+ data |= (m_floppy ? m_floppy->dskchg_r() : 1) << 3;
+
+ // SW2
+ UINT8 sw2 = m_sw2->read() & 0x0f;
+
+ // TTL inputs float high so DIP switch in off position equals 1
+ int sw2_1 = BIT(sw2, 0) ? 1 : BIT(offset, 8);
+ int sw2_2 = BIT(sw2, 1) ? 1 : BIT(offset, 9);
+ int sw2_3 = BIT(sw2, 2) ? 1 : BIT(offset, 10);
+ int sw2_4 = BIT(sw2, 3) ? 1 : BIT(offset, 11);
+ int sw2_data = !(sw2_1 & sw2_2 & !(sw2_3 ^ sw2_4));
+
+ data |= sw2_data << 2;
+
+ // SW1
+ data |= (m_sw1->read() & 0x0f) << 4;
+
+ return data ^ 0xff;
+}
+
+
+//**************************************************************************
+// LUXOR 55 21046 DEVICE INPUT DEFAULTS
+//**************************************************************************
+
+//-------------------------------------------------
+// DEVICE_INPUT_DEFAULTS( abc830_fast_intf )
+//-------------------------------------------------
+
+DEVICE_INPUT_DEFAULTS_START( abc830_fast )
+ DEVICE_INPUT_DEFAULTS("SW1", 0x0f, 0x03)
+ DEVICE_INPUT_DEFAULTS("SW2", 0x0f, DRIVE_BASF_6106_08)
+ DEVICE_INPUT_DEFAULTS("SW3", 0x7f, ADDRESS_ABC830)
+DEVICE_INPUT_DEFAULTS_END
+
+
+//-------------------------------------------------
+// DEVICE_INPUT_DEFAULTS( abc832_fast )
+//-------------------------------------------------
+
+DEVICE_INPUT_DEFAULTS_START( abc832_fast )
+ DEVICE_INPUT_DEFAULTS("SW1", 0x0f, 0x03)
+ DEVICE_INPUT_DEFAULTS("SW2", 0x0f, DRIVE_TEAC_FD55F)
+ DEVICE_INPUT_DEFAULTS("SW3", 0x7f, ADDRESS_ABC832)
+DEVICE_INPUT_DEFAULTS_END
+
+
+//-------------------------------------------------
+// DEVICE_INPUT_DEFAULTS( abc834_fast )
+//-------------------------------------------------
+
+DEVICE_INPUT_DEFAULTS_START( abc834_fast )
+ DEVICE_INPUT_DEFAULTS("SW1", 0x0f, 0x03)
+ DEVICE_INPUT_DEFAULTS("SW2", 0x0f, DRIVE_TEAC_FD55F)
+ DEVICE_INPUT_DEFAULTS("SW3", 0x7f, ADDRESS_ABC832)
+DEVICE_INPUT_DEFAULTS_END
+
+
+//-------------------------------------------------
+// DEVICE_INPUT_DEFAULTS( abc838_fast )
+//-------------------------------------------------
+
+DEVICE_INPUT_DEFAULTS_START( abc838_fast )
+ DEVICE_INPUT_DEFAULTS("SW1", 0x0f, 0x03)
+ DEVICE_INPUT_DEFAULTS("SW2", 0x0f, DRIVE_BASF_6105)
+ DEVICE_INPUT_DEFAULTS("SW3", 0x7f, ADDRESS_ABC838)
+DEVICE_INPUT_DEFAULTS_END
+
+
+//-------------------------------------------------
+// DEVICE_INPUT_DEFAULTS( abc850_fast )
+//-------------------------------------------------
+
+DEVICE_INPUT_DEFAULTS_START( abc850_fast )
+ DEVICE_INPUT_DEFAULTS("SW1", 0x0f, 0x03)
+ DEVICE_INPUT_DEFAULTS("SW2", 0x0f, DRIVE_BASF_6138)
+ DEVICE_INPUT_DEFAULTS("SW3", 0x7f, ADDRESS_ABC830)
+DEVICE_INPUT_DEFAULTS_END
diff --git a/src/emu/bus/abcbus/lux21046.h b/src/emu/bus/abcbus/lux21046.h
new file mode 100644
index 00000000000..a641b86b4d2
--- /dev/null
+++ b/src/emu/bus/abcbus/lux21046.h
@@ -0,0 +1,131 @@
+// license:BSD-3-Clause
+// copyright-holders:Curt Coder
+/**********************************************************************
+
+ Luxor 55-21046 "fast" floppy disk controller emulation
+
+ Copyright MESS Team.
+ Visit http://mamedev.org for licensing and usage restrictions.
+
+*********************************************************************/
+
+#pragma once
+
+#ifndef __LUXOR_55_21046__
+#define __LUXOR_55_21046__
+
+#include "emu.h"
+#include "abcbus.h"
+#include "cpu/z80/z80.h"
+#include "cpu/z80/z80daisy.h"
+#include "machine/wd_fdc.h"
+#include "machine/z80dma.h"
+
+
+
+//**************************************************************************
+// MACROS / CONSTANTS
+//**************************************************************************
+
+#define ADDRESS_ABC832 44
+#define ADDRESS_ABC830 45
+#define ADDRESS_ABC838 46
+
+
+#define DRIVE_TEAC_FD55F 0x01
+#define DRIVE_BASF_6138 0x02
+#define DRIVE_MICROPOLIS_1015F 0x03
+#define DRIVE_BASF_6118 0x04
+#define DRIVE_MICROPOLIS_1115F 0x05
+#define DRIVE_BASF_6106_08 0x08
+#define DRIVE_MPI_51 0x09
+#define DRIVE_BASF_6105 0x0e
+#define DRIVE_BASF_6106 0x0f
+
+
+
+//**************************************************************************
+// TYPE DEFINITIONS
+//**************************************************************************
+
+// ======================> luxor_55_21046_device
+
+class luxor_55_21046_device : public device_t,
+ public device_abcbus_card_interface
+{
+public:
+ // construction/destruction
+ luxor_55_21046_device(const machine_config &mconfig, const char *tag, device_t *owner, UINT32 clock);
+
+ // optional information overrides
+ virtual const rom_entry *device_rom_region() const;
+ virtual machine_config_constructor device_mconfig_additions() const;
+ virtual ioport_constructor device_input_ports() const;
+
+ // not really public
+ DECLARE_READ8_MEMBER( _3d_r );
+ DECLARE_WRITE8_MEMBER( _4d_w );
+ DECLARE_WRITE8_MEMBER( _4b_w );
+ DECLARE_WRITE8_MEMBER( _9b_w );
+ DECLARE_WRITE8_MEMBER( _8a_w );
+ DECLARE_READ8_MEMBER( _9a_r );
+
+ DECLARE_WRITE_LINE_MEMBER( dma_int_w );
+
+ DECLARE_READ8_MEMBER(memory_read_byte);
+ DECLARE_WRITE8_MEMBER(memory_write_byte);
+ DECLARE_READ8_MEMBER(io_read_byte);
+ DECLARE_WRITE8_MEMBER(io_write_byte);
+
+ void fdc_intrq_w(bool state);
+ void fdc_drq_w(bool state);
+
+protected:
+ // device-level overrides
+ virtual void device_start();
+ virtual void device_reset();
+
+ // device_abcbus_interface overrides
+ virtual void abcbus_cs(UINT8 data);
+ virtual UINT8 abcbus_inp();
+ virtual void abcbus_utp(UINT8 data);
+ virtual UINT8 abcbus_stat();
+ virtual void abcbus_c1(UINT8 data);
+ virtual void abcbus_c3(UINT8 data);
+
+private:
+ required_device<cpu_device> m_maincpu;
+ required_device<z80dma_device> m_dma;
+ required_device<fd1793_t> m_fdc;
+ required_device<floppy_connector> m_floppy0;
+ required_device<floppy_connector> m_floppy1;
+ floppy_image_device *m_floppy;
+ required_ioport m_sw1;
+ required_ioport m_sw2;
+ required_ioport m_sw3;
+
+ bool m_cs; // card selected
+ UINT8 m_status; // ABC BUS status
+ UINT8 m_data_in; // ABC BUS data in
+ UINT8 m_data_out; // ABC BUS data out
+ bool m_fdc_irq; // FDC interrupt
+ int m_dma_irq; // DMA interrupt
+ int m_busy; // busy bit
+ int m_force_busy; // force busy bit
+};
+
+
+// device type definition
+extern const device_type LUXOR_55_21046;
+
+
+// default input ports
+extern const input_device_default DEVICE_INPUT_DEFAULTS_NAME( abc830_fast )[];
+extern const input_device_default DEVICE_INPUT_DEFAULTS_NAME( abc832_fast )[];
+extern const input_device_default DEVICE_INPUT_DEFAULTS_NAME( abc834_fast )[];
+extern const input_device_default DEVICE_INPUT_DEFAULTS_NAME( abc838_fast )[];
+extern const input_device_default DEVICE_INPUT_DEFAULTS_NAME( abc850_fast )[];
+
+
+
+#endif
diff --git a/src/emu/bus/abcbus/sio.c b/src/emu/bus/abcbus/sio.c
new file mode 100644
index 00000000000..2ea28e36237
--- /dev/null
+++ b/src/emu/bus/abcbus/sio.c
@@ -0,0 +1,199 @@
+// license:BSD-3-Clause
+// copyright-holders:Curt Coder
+/*
+ABC SIO
+
+PCB Layout
+----------
+
+ |-------------------------------------------|
+|-| |
+|-| |
+|-| Z80SIO CN2 |
+|-| |
+|-| 4.9152MHz |
+|-| |
+|-| ROM0 Z80CTC |
+|-| CN1 |
+|-| ROM1 |
+ |-------------------------------------------|
+
+Notes:
+ Relevant IC's shown.
+
+ ROM0 - Hitachi HN462716 2Kx8 EPROM "SYN 1.6"
+ ROM1 - Mitsubishi MB8516 2Kx8 EPROM "T80 1.3"
+ Z80SIO - Zilog Z-80A SIO/0
+ Z80CTC - Zilog Z-80A CTC
+ CN1 - DB9 serial connector
+ CN2 - DB25 serial connector
+
+*/
+
+#include "sio.h"
+
+
+
+//**************************************************************************
+// MACROS / CONSTANTS
+//**************************************************************************
+
+#define Z80CTC_TAG "z80ctc"
+#define Z80SIO_TAG "z80sio"
+
+
+
+//**************************************************************************
+// DEVICE DEFINITIONS
+//**************************************************************************
+
+const device_type ABC_SIO = &device_creator<abc_sio_device>;
+
+
+//-------------------------------------------------
+// ROM( abc_sio )
+//-------------------------------------------------
+
+ROM_START( abc_sio )
+ ROM_REGION( 0x1000, "abc80", 0 )
+ ROM_LOAD( "t80 1.3", 0x000, 0x800, CRC(f20ff827) SHA1(a1c4af1c374184a14872d7253d6f9e470603117f) )
+ ROM_LOAD( "syn 1.6", 0x800, 0x800, CRC(7bd96b75) SHA1(d1f9b16530be28b03eeddb3f6ee4fa9e1cc9458e) )
+ROM_END
+
+
+//-------------------------------------------------
+// rom_region - device-specific ROM region
+//-------------------------------------------------
+
+const rom_entry *abc_sio_device::device_rom_region() const
+{
+ return ROM_NAME( abc_sio );
+}
+
+
+//-------------------------------------------------
+// Z80CTC_INTERFACE( ctc_intf )
+//-------------------------------------------------
+
+static Z80CTC_INTERFACE( ctc_intf )
+{
+ DEVCB_NULL,
+ DEVCB_NULL,
+ DEVCB_NULL,
+ DEVCB_NULL
+};
+
+
+//-------------------------------------------------
+// Z80DART_INTERFACE( sio_intf )
+//-------------------------------------------------
+
+static Z80DART_INTERFACE( sio_intf )
+{
+ 0, 0, 0, 0,
+
+ DEVCB_NULL,
+ DEVCB_NULL,
+ DEVCB_NULL,
+ DEVCB_NULL,
+ DEVCB_NULL,
+ DEVCB_NULL,
+
+ DEVCB_NULL,
+ DEVCB_NULL,
+ DEVCB_NULL,
+ DEVCB_NULL,
+ DEVCB_NULL,
+ DEVCB_NULL,
+
+ DEVCB_NULL
+};
+
+
+//-------------------------------------------------
+// MACHINE_DRIVER( abc_sio )
+//-------------------------------------------------
+
+static MACHINE_CONFIG_FRAGMENT( abc_sio )
+ MCFG_Z80CTC_ADD(Z80CTC_TAG, XTAL_4_9152MHz, ctc_intf)
+ MCFG_Z80DART_ADD(Z80SIO_TAG, 0, sio_intf)
+MACHINE_CONFIG_END
+
+
+//-------------------------------------------------
+// machine_config_additions - device-specific
+// machine configurations
+//-------------------------------------------------
+
+machine_config_constructor abc_sio_device::device_mconfig_additions() const
+{
+ return MACHINE_CONFIG_NAME( abc_sio );
+}
+
+
+
+//**************************************************************************
+// LIVE DEVICE
+//**************************************************************************
+
+//-------------------------------------------------
+// abc_sio_device - constructor
+//-------------------------------------------------
+
+abc_sio_device::abc_sio_device(const machine_config &mconfig, const char *tag, device_t *owner, UINT32 clock)
+ : device_t(mconfig, ABC_SIO, "ABC SIO", tag, owner, clock, "abcsio", __FILE__),
+ device_abcbus_card_interface(mconfig, *this),
+ m_ctc(*this, Z80CTC_TAG),
+ m_sio(*this, Z80SIO_TAG),
+ m_rom(*this, "abc80")
+{
+}
+
+
+//-------------------------------------------------
+// device_start - device-specific startup
+//-------------------------------------------------
+
+void abc_sio_device::device_start()
+{
+}
+
+
+//-------------------------------------------------
+// device_reset - device-specific reset
+//-------------------------------------------------
+
+void abc_sio_device::device_reset()
+{
+}
+
+
+
+//**************************************************************************
+// ABC BUS INTERFACE
+//**************************************************************************
+
+//-------------------------------------------------
+// abcbus_cs -
+//-------------------------------------------------
+
+void abc_sio_device::abcbus_cs(UINT8 data)
+{
+}
+
+
+//-------------------------------------------------
+// abcbus_xmemfl -
+//-------------------------------------------------
+
+UINT8 abc_sio_device::abcbus_xmemfl(offs_t offset)
+{
+ UINT8 data = 0xff;
+
+ if (offset >= 0x4000 && offset < 0x5000) // TODO where is this mapped?
+ {
+ data = m_rom->base()[offset & 0xfff];
+ }
+
+ return data;
+}
diff --git a/src/emu/bus/abcbus/sio.h b/src/emu/bus/abcbus/sio.h
new file mode 100644
index 00000000000..6ad8b90df0e
--- /dev/null
+++ b/src/emu/bus/abcbus/sio.h
@@ -0,0 +1,53 @@
+// license:BSD-3-Clause
+// copyright-holders:Curt Coder
+#pragma once
+
+#ifndef __ABC_SIO__
+#define __ABC_SIO__
+
+#include "emu.h"
+#include "abcbus.h"
+#include "machine/z80ctc.h"
+#include "machine/z80dart.h"
+
+
+
+//**************************************************************************
+// TYPE DEFINITIONS
+//**************************************************************************
+
+// ======================> abc_sio_device
+
+class abc_sio_device : public device_t,
+ public device_abcbus_card_interface
+{
+public:
+ // construction/destruction
+ abc_sio_device(const machine_config &mconfig, const char *tag, device_t *owner, UINT32 clock);
+
+ // optional information overrides
+ virtual const rom_entry *device_rom_region() const;
+ virtual machine_config_constructor device_mconfig_additions() const;
+
+protected:
+ // device-level overrides
+ virtual void device_start();
+ virtual void device_reset();
+
+ // device_abcbus_interface overrides
+ virtual void abcbus_cs(UINT8 data);
+ virtual UINT8 abcbus_xmemfl(offs_t offset);
+
+private:
+ required_device<z80ctc_device> m_ctc;
+ required_device<z80dart_device> m_sio;
+ required_memory_region m_rom;
+};
+
+
+// device type definition
+extern const device_type ABC_SIO;
+
+
+
+#endif
diff --git a/src/emu/bus/abcbus/slutprov.c b/src/emu/bus/abcbus/slutprov.c
new file mode 100644
index 00000000000..bd1184c15c5
--- /dev/null
+++ b/src/emu/bus/abcbus/slutprov.c
@@ -0,0 +1,79 @@
+// license:BSD-3-Clause
+// copyright-holders:Curt Coder
+#include "slutprov.h"
+
+
+
+//**************************************************************************
+// DEVICE DEFINITIONS
+//**************************************************************************
+
+const device_type ABC_SLUTPROV = &device_creator<abc_slutprov_device>;
+
+
+//-------------------------------------------------
+// ROM( abc_slutprov )
+//-------------------------------------------------
+
+ROM_START( abc_slutprov )
+ ROM_REGION( 0x800, "slutprov", 0 )
+ ROM_LOAD( "slutprov.bin", 0x0000, 0x0800, CRC(a5bb56f4) SHA1(f97cb6526a1d10b189164f26157522e382ca6bc6) )
+ROM_END
+
+
+//-------------------------------------------------
+// rom_region - device-specific ROM region
+//-------------------------------------------------
+
+const rom_entry *abc_slutprov_device::device_rom_region() const
+{
+ return ROM_NAME( abc_slutprov );
+}
+
+
+
+//**************************************************************************
+// LIVE DEVICE
+//**************************************************************************
+
+//-------------------------------------------------
+// abc_slutprov_device - constructor
+//-------------------------------------------------
+
+abc_slutprov_device::abc_slutprov_device(const machine_config &mconfig, const char *tag, device_t *owner, UINT32 clock)
+ : device_t(mconfig, ABC_SLUTPROV, "Slutprov", tag, owner, clock, "slutprov", __FILE__),
+ device_abcbus_card_interface(mconfig, *this)
+{
+}
+
+
+//-------------------------------------------------
+// device_start - device-specific startup
+//-------------------------------------------------
+
+void abc_slutprov_device::device_start()
+{
+}
+
+
+//-------------------------------------------------
+// device_reset - device-specific reset
+//-------------------------------------------------
+
+void abc_slutprov_device::device_reset()
+{
+}
+
+
+
+//**************************************************************************
+// ABC BUS INTERFACE
+//**************************************************************************
+
+//-------------------------------------------------
+// abcbus_cs -
+//-------------------------------------------------
+
+void abc_slutprov_device::abcbus_cs(UINT8 data)
+{
+}
diff --git a/src/emu/bus/abcbus/slutprov.h b/src/emu/bus/abcbus/slutprov.h
new file mode 100644
index 00000000000..99d0f8bcc3a
--- /dev/null
+++ b/src/emu/bus/abcbus/slutprov.h
@@ -0,0 +1,44 @@
+// license:BSD-3-Clause
+// copyright-holders:Curt Coder
+#pragma once
+
+#ifndef __ABC_SLUTPROV__
+#define __ABC_SLUTPROV__
+
+#include "emu.h"
+#include "abcbus.h"
+
+
+
+//**************************************************************************
+// TYPE DEFINITIONS
+//**************************************************************************
+
+// ======================> abc_slutprov_device
+
+class abc_slutprov_device : public device_t,
+ public device_abcbus_card_interface
+{
+public:
+ // construction/destruction
+ abc_slutprov_device(const machine_config &mconfig, const char *tag, device_t *owner, UINT32 clock);
+
+ // optional information overrides
+ virtual const rom_entry *device_rom_region() const;
+
+protected:
+ // device-level overrides
+ virtual void device_start();
+ virtual void device_reset();
+
+ // device_abcbus_interface overrides
+ virtual void abcbus_cs(UINT8 data);
+};
+
+
+// device type definition
+extern const device_type ABC_SLUTPROV;
+
+
+
+#endif
diff --git a/src/emu/bus/abcbus/turbo.c b/src/emu/bus/abcbus/turbo.c
new file mode 100644
index 00000000000..d5c2f49e784
--- /dev/null
+++ b/src/emu/bus/abcbus/turbo.c
@@ -0,0 +1,174 @@
+// license:BSD-3-Clause
+// copyright-holders:Curt Coder
+/**********************************************************************
+
+ MyAB Turbo-Kontroller disk controller emulation
+
+ Copyright MESS Team.
+ Visit http://mamedev.org for licensing and usage restrictions.
+
+*********************************************************************/
+
+#include "turbo.h"
+
+
+
+//**************************************************************************
+// MACROS / CONSTANTS
+//**************************************************************************
+
+#define Z80_TAG "z80"
+
+
+
+//**************************************************************************
+// DEVICE DEFINITIONS
+//**************************************************************************
+
+const device_type TURBO_KONTROLLER = &device_creator<turbo_kontroller_device>;
+
+
+//-------------------------------------------------
+// ROM( turbo_kontroller )
+//-------------------------------------------------
+
+ROM_START( turbo_kontroller )
+ ROM_REGION( 0x1000, Z80_TAG, 0 )
+ ROM_SYSTEM_BIOS( 0, "525", "5\" 25-pin" )
+ ROMX_LOAD( "unidis5d.bin", 0x0000, 0x1000, CRC(569dd60c) SHA1(47b810bcb5a063ffb3034fd7138dc5e15d243676), ROM_BIOS(1) )
+ ROM_SYSTEM_BIOS( 1, "534", "5\" 34-pin" )
+ ROMX_LOAD( "unidiskh.bin", 0x0000, 0x1000, CRC(5079ad85) SHA1(42bb91318f13929c3a440de3fa1f0491a0b90863), ROM_BIOS(2) )
+ ROM_SYSTEM_BIOS( 2, "8", "8\"" )
+ ROMX_LOAD( "unidisk8.bin", 0x0000, 0x1000, CRC(d04e6a43) SHA1(8db504d46ff0355c72bd58fd536abeb17425c532), ROM_BIOS(3) )
+ROM_END
+
+
+//-------------------------------------------------
+// rom_region - device-specific ROM region
+//-------------------------------------------------
+
+const rom_entry *turbo_kontroller_device::device_rom_region() const
+{
+ return ROM_NAME( turbo_kontroller );
+}
+
+
+//-------------------------------------------------
+// ADDRESS_MAP( turbo_kontroller_mem )
+//-------------------------------------------------
+
+static ADDRESS_MAP_START( turbo_kontroller_mem, AS_PROGRAM, 8, turbo_kontroller_device )
+ AM_RANGE(0x0000, 0x0fff) AM_ROM AM_REGION(Z80_TAG, 0)
+ADDRESS_MAP_END
+
+
+//-------------------------------------------------
+// ADDRESS_MAP( turbo_kontroller_io )
+//-------------------------------------------------
+
+static ADDRESS_MAP_START( turbo_kontroller_io, AS_IO, 8, turbo_kontroller_device )
+ADDRESS_MAP_END
+
+
+//-------------------------------------------------
+// z80_daisy_config daisy_chain
+//-------------------------------------------------
+
+static const z80_daisy_config daisy_chain[] =
+{
+ { NULL }
+};
+
+
+//-------------------------------------------------
+// floppy_interface unidisk_floppy_interface
+//-------------------------------------------------
+
+static const floppy_interface unidisk_floppy_interface =
+{
+ DEVCB_NULL,
+ DEVCB_NULL,
+ DEVCB_NULL,
+ DEVCB_NULL,
+ DEVCB_NULL,
+ FLOPPY_STANDARD_5_25_DSDD,
+ LEGACY_FLOPPY_OPTIONS_NAME(default),
+ "floppy_5_25",
+ NULL
+};
+
+
+//-------------------------------------------------
+// MACHINE_DRIVER( turbo_kontroller )
+//-------------------------------------------------
+
+static MACHINE_CONFIG_FRAGMENT( turbo_kontroller )
+ MCFG_CPU_ADD(Z80_TAG, Z80, 4000000)
+ MCFG_CPU_PROGRAM_MAP(turbo_kontroller_mem)
+ MCFG_CPU_IO_MAP(turbo_kontroller_io)
+ MCFG_CPU_CONFIG(daisy_chain)
+
+ MCFG_LEGACY_FLOPPY_2_DRIVES_ADD(unidisk_floppy_interface)
+MACHINE_CONFIG_END
+
+
+//-------------------------------------------------
+// machine_config_additions - device-specific
+// machine configurations
+//-------------------------------------------------
+
+machine_config_constructor turbo_kontroller_device::device_mconfig_additions() const
+{
+ return MACHINE_CONFIG_NAME( turbo_kontroller );
+}
+
+
+
+//**************************************************************************
+// LIVE DEVICE
+//**************************************************************************
+
+//-------------------------------------------------
+// turbo_kontroller_device - constructor
+//-------------------------------------------------
+
+turbo_kontroller_device::turbo_kontroller_device(const machine_config &mconfig, const char *tag, device_t *owner, UINT32 clock)
+ : device_t(mconfig, TURBO_KONTROLLER, "Turbo-Kontroller", tag, owner, clock, "unidisk", __FILE__),
+ device_abcbus_card_interface(mconfig, *this),
+ m_maincpu(*this, Z80_TAG),
+ m_image0(*this, FLOPPY_0),
+ m_image1(*this, FLOPPY_1)
+{
+}
+
+
+//-------------------------------------------------
+// device_start - device-specific startup
+//-------------------------------------------------
+
+void turbo_kontroller_device::device_start()
+{
+}
+
+
+//-------------------------------------------------
+// device_reset - device-specific reset
+//-------------------------------------------------
+
+void turbo_kontroller_device::device_reset()
+{
+}
+
+
+
+//**************************************************************************
+// ABC BUS INTERFACE
+//**************************************************************************
+
+//-------------------------------------------------
+// abcbus_cs -
+//-------------------------------------------------
+
+void turbo_kontroller_device::abcbus_cs(UINT8 data)
+{
+}
diff --git a/src/emu/bus/abcbus/turbo.h b/src/emu/bus/abcbus/turbo.h
new file mode 100644
index 00000000000..5100ef761f6
--- /dev/null
+++ b/src/emu/bus/abcbus/turbo.h
@@ -0,0 +1,63 @@
+// license:BSD-3-Clause
+// copyright-holders:Curt Coder
+/**********************************************************************
+
+ MyAB Turbo-Kontroller disk controller emulation
+
+ Copyright MESS Team.
+ Visit http://mamedev.org for licensing and usage restrictions.
+
+*********************************************************************/
+
+#pragma once
+
+#ifndef __TURBO_KONTROLLER__
+#define __TURBO_KONTROLLER__
+
+#include "emu.h"
+#include "abcbus.h"
+#include "cpu/z80/z80.h"
+#include "cpu/z80/z80daisy.h"
+#include "formats/basicdsk.h"
+#include "imagedev/flopdrv.h"
+
+
+
+//**************************************************************************
+// TYPE DEFINITIONS
+//**************************************************************************
+
+// ======================> turbo_kontroller_device
+
+class turbo_kontroller_device : public device_t,
+ public device_abcbus_card_interface
+{
+public:
+ // construction/destruction
+ turbo_kontroller_device(const machine_config &mconfig, const char *tag, device_t *owner, UINT32 clock);
+
+ // optional information overrides
+ virtual const rom_entry *device_rom_region() const;
+ virtual machine_config_constructor device_mconfig_additions() const;
+
+protected:
+ // device-level overrides
+ virtual void device_start();
+ virtual void device_reset();
+
+ // device_abcbus_interface overrides
+ virtual void abcbus_cs(UINT8 data);
+
+private:
+ required_device<cpu_device> m_maincpu;
+ required_device<legacy_floppy_image_device> m_image0;
+ required_device<legacy_floppy_image_device> m_image1;
+};
+
+
+// device type definition
+extern const device_type TURBO_KONTROLLER;
+
+
+
+#endif
diff --git a/src/emu/bus/abcbus/uni800.c b/src/emu/bus/abcbus/uni800.c
new file mode 100644
index 00000000000..9d22dc0a6cd
--- /dev/null
+++ b/src/emu/bus/abcbus/uni800.c
@@ -0,0 +1,110 @@
+// license:BSD-3-Clause
+// copyright-holders:Curt Coder
+/*
+UNI-800
+
+PCB Layout
+----------
+
+8120 821025 REV.3
+
+|-------------------------------------------|
+| |
+| 4164 PROM0 CN3 |
+| 4164 |
+| 4164 |
+| 4164 |
+| 4164 |
+| 4164 |
+|CN1 4164 CN2 |
+| 4164 |
+|-------------------------------------------|
+
+Notes:
+ Relevant IC's shown.
+
+ 4164 - Hitachi HM4864P-2 64Kx1 RAM
+ PROM0 - Philips 82S129 256x4 Bipolar PROM ".800 1.2"
+ CN1 - 2x6 pin PCB header
+ CN2 - 2x10 pin PCB header
+ CN3 - 2x10 pin PCB header
+
+*/
+
+#include "uni800.h"
+
+
+
+//**************************************************************************
+// DEVICE DEFINITIONS
+//**************************************************************************
+
+const device_type ABC_UNI800 = &device_creator<abc_uni800_device>;
+
+
+//-------------------------------------------------
+// ROM( abc_uni800 )
+//-------------------------------------------------
+
+ROM_START( abc_uni800 )
+ ROM_REGION( 0x100, "uni800", 0 )
+ ROM_LOAD( ".800 1.2.bin", 0x0000, 0x0100, CRC(df4897f8) SHA1(0c641f4cf321f0003da3fbd435edb138a9b949b4) )
+ROM_END
+
+
+//-------------------------------------------------
+// rom_region - device-specific ROM region
+//-------------------------------------------------
+
+const rom_entry *abc_uni800_device::device_rom_region() const
+{
+ return ROM_NAME( abc_uni800 );
+}
+
+
+
+//**************************************************************************
+// LIVE DEVICE
+//**************************************************************************
+
+//-------------------------------------------------
+// abc_uni800_device - constructor
+//-------------------------------------------------
+
+abc_uni800_device::abc_uni800_device(const machine_config &mconfig, const char *tag, device_t *owner, UINT32 clock)
+ : device_t(mconfig, ABC_UNI800, "UNI-800", tag, owner, clock, "uni800", __FILE__),
+ device_abcbus_card_interface(mconfig, *this)
+{
+}
+
+
+//-------------------------------------------------
+// device_start - device-specific startup
+//-------------------------------------------------
+
+void abc_uni800_device::device_start()
+{
+}
+
+
+//-------------------------------------------------
+// device_reset - device-specific reset
+//-------------------------------------------------
+
+void abc_uni800_device::device_reset()
+{
+}
+
+
+
+//**************************************************************************
+// ABC BUS INTERFACE
+//**************************************************************************
+
+//-------------------------------------------------
+// abcbus_cs -
+//-------------------------------------------------
+
+void abc_uni800_device::abcbus_cs(UINT8 data)
+{
+}
diff --git a/src/emu/bus/abcbus/uni800.h b/src/emu/bus/abcbus/uni800.h
new file mode 100644
index 00000000000..37ed2e0917b
--- /dev/null
+++ b/src/emu/bus/abcbus/uni800.h
@@ -0,0 +1,44 @@
+// license:BSD-3-Clause
+// copyright-holders:Curt Coder
+#pragma once
+
+#ifndef __ABC_UNI800__
+#define __ABC_UNI800__
+
+#include "emu.h"
+#include "abcbus.h"
+
+
+
+//**************************************************************************
+// TYPE DEFINITIONS
+//**************************************************************************
+
+// ======================> abc_uni800_device
+
+class abc_uni800_device : public device_t,
+ public device_abcbus_card_interface
+{
+public:
+ // construction/destruction
+ abc_uni800_device(const machine_config &mconfig, const char *tag, device_t *owner, UINT32 clock);
+
+ // optional information overrides
+ virtual const rom_entry *device_rom_region() const;
+
+protected:
+ // device-level overrides
+ virtual void device_start();
+ virtual void device_reset();
+
+ // device_abcbus_interface overrides
+ virtual void abcbus_cs(UINT8 data);
+};
+
+
+// device type definition
+extern const device_type ABC_UNI800;
+
+
+
+#endif
diff --git a/src/emu/bus/abcbus/xebec.c b/src/emu/bus/abcbus/xebec.c
new file mode 100644
index 00000000000..7d698b83158
--- /dev/null
+++ b/src/emu/bus/abcbus/xebec.c
@@ -0,0 +1,156 @@
+// license:BSD-3-Clause
+// copyright-holders:Curt Coder
+/**********************************************************************
+
+ Unknown Xebec Winchester controller card emulation
+
+ Copyright MESS Team.
+ Visit http://mamedev.org for licensing and usage restrictions.
+
+*********************************************************************/
+
+#include "xebec.h"
+
+
+
+//**************************************************************************
+// MACROS / CONSTANTS
+//**************************************************************************
+
+#define Z80_TAG "z80"
+#define SASIBUS_TAG "sasi"
+
+
+
+//**************************************************************************
+// DEVICE DEFINITIONS
+//**************************************************************************
+
+const device_type ABC_XEBEC = &device_creator<abc_xebec_device>;
+
+
+//-------------------------------------------------
+// ROM( abc_xebec )
+//-------------------------------------------------
+
+ROM_START( abc_xebec )
+ ROM_REGION( 0x800, Z80_TAG, 0 )
+ ROM_SYSTEM_BIOS( 0, "st4038", "Seagate ST4038 (CHS: 733,5,17,512)" )
+ ROMX_LOAD( "st4038.bin", 0x000, 0x800, CRC(4c803b87) SHA1(1141bb51ad9200fc32d92a749460843dc6af8953), ROM_BIOS(1) ) // Seagate ST4038 (http://stason.org/TULARC/pc/hard-drives-hdd/seagate/ST4038-1987-31MB-5-25-FH-MFM-ST412.html)
+ ROM_SYSTEM_BIOS( 1, "st225", "Seagate ST225 (CHS: 615,4,17,512)" )
+ ROMX_LOAD( "st225.bin", 0x000, 0x800, CRC(c9f68f81) SHA1(7ff8b2a19f71fe0279ab3e5a0a5fffcb6030360c), ROM_BIOS(2) ) // Seagate ST225 (http://stason.org/TULARC/pc/hard-drives-hdd/seagate/ST225-21MB-5-25-HH-MFM-ST412.html)
+ROM_END
+
+
+//-------------------------------------------------
+// rom_region - device-specific ROM region
+//-------------------------------------------------
+
+const rom_entry *abc_xebec_device::device_rom_region() const
+{
+ return ROM_NAME( abc_xebec );
+}
+
+
+//-------------------------------------------------
+// ADDRESS_MAP( abc_xebec_mem )
+//-------------------------------------------------
+
+static ADDRESS_MAP_START( abc_xebec_mem, AS_PROGRAM, 8, abc_xebec_device )
+ AM_RANGE(0x0000, 0x07ff) AM_ROM AM_REGION(Z80_TAG, 0)
+ADDRESS_MAP_END
+
+
+//-------------------------------------------------
+// ADDRESS_MAP( abc_xebec_io )
+//-------------------------------------------------
+
+static ADDRESS_MAP_START( abc_xebec_io, AS_IO, 8, abc_xebec_device )
+ADDRESS_MAP_END
+
+
+//-------------------------------------------------
+// z80_daisy_config daisy_chain
+//-------------------------------------------------
+
+static const z80_daisy_config daisy_chain[] =
+{
+ { NULL }
+};
+
+
+//-------------------------------------------------
+// MACHINE_DRIVER( abc_xebec )
+//-------------------------------------------------
+
+static MACHINE_CONFIG_FRAGMENT( abc_xebec )
+ MCFG_CPU_ADD(Z80_TAG, Z80, 4000000)
+ MCFG_CPU_PROGRAM_MAP(abc_xebec_mem)
+ MCFG_CPU_IO_MAP(abc_xebec_io)
+ MCFG_CPU_CONFIG(daisy_chain)
+
+ MCFG_SCSIBUS_ADD(SASIBUS_TAG)
+ MCFG_SCSIDEV_ADD(SASIBUS_TAG ":harddisk0", SCSIHD, SCSI_ID_0)
+ MCFG_SCSICB_ADD(SASIBUS_TAG ":host")
+MACHINE_CONFIG_END
+
+
+//-------------------------------------------------
+// machine_config_additions - device-specific
+// machine configurations
+//-------------------------------------------------
+
+machine_config_constructor abc_xebec_device::device_mconfig_additions() const
+{
+ return MACHINE_CONFIG_NAME( abc_xebec );
+}
+
+
+
+//**************************************************************************
+// LIVE DEVICE
+//**************************************************************************
+
+//-------------------------------------------------
+// abc_xebec_device - constructor
+//-------------------------------------------------
+
+abc_xebec_device::abc_xebec_device(const machine_config &mconfig, const char *tag, device_t *owner, UINT32 clock)
+ : device_t(mconfig, ABC_XEBEC, "ABC XEBEC", tag, owner, clock, "abc_xebec", __FILE__),
+ device_abcbus_card_interface(mconfig, *this),
+ m_maincpu(*this, Z80_TAG),
+ m_sasibus(*this, SASIBUS_TAG)
+{
+}
+
+
+//-------------------------------------------------
+// device_start - device-specific startup
+//-------------------------------------------------
+
+void abc_xebec_device::device_start()
+{
+}
+
+
+//-------------------------------------------------
+// device_reset - device-specific reset
+//-------------------------------------------------
+
+void abc_xebec_device::device_reset()
+{
+}
+
+
+
+//**************************************************************************
+// ABC BUS INTERFACE
+//**************************************************************************
+
+//-------------------------------------------------
+// abcbus_cs -
+//-------------------------------------------------
+
+void abc_xebec_device::abcbus_cs(UINT8 data)
+{
+}
diff --git a/src/emu/bus/abcbus/xebec.h b/src/emu/bus/abcbus/xebec.h
new file mode 100644
index 00000000000..5679466b8a6
--- /dev/null
+++ b/src/emu/bus/abcbus/xebec.h
@@ -0,0 +1,63 @@
+// license:BSD-3-Clause
+// copyright-holders:Curt Coder
+/**********************************************************************
+
+ Unknown Xebec Winchester controller card emulation
+
+ Copyright MESS Team.
+ Visit http://mamedev.org for licensing and usage restrictions.
+
+*********************************************************************/
+
+#pragma once
+
+#ifndef __ABC_XEBEC__
+#define __ABC_XEBEC__
+
+#include "emu.h"
+#include "abcbus.h"
+#include "cpu/z80/z80.h"
+#include "cpu/z80/z80daisy.h"
+#include "machine/scsibus.h"
+#include "machine/scsicb.h"
+#include "machine/scsihd.h"
+
+
+
+//**************************************************************************
+// TYPE DEFINITIONS
+//**************************************************************************
+
+// ======================> abc_xebec_device
+
+class abc_xebec_device : public device_t,
+ public device_abcbus_card_interface
+{
+public:
+ // construction/destruction
+ abc_xebec_device(const machine_config &mconfig, const char *tag, device_t *owner, UINT32 clock);
+
+ // optional information overrides
+ virtual const rom_entry *device_rom_region() const;
+ virtual machine_config_constructor device_mconfig_additions() const;
+
+protected:
+ // device-level overrides
+ virtual void device_start();
+ virtual void device_reset();
+
+ // device_abcbus_interface overrides
+ virtual void abcbus_cs(UINT8 data);
+
+private:
+ required_device<cpu_device> m_maincpu;
+ required_device<scsibus_device> m_sasibus;
+};
+
+
+// device type definition
+extern const device_type ABC_XEBEC;
+
+
+
+#endif