diff options
author | 2013-10-20 19:31:44 +0000 | |
---|---|---|
committer | 2013-10-20 19:31:44 +0000 | |
commit | d2236708b3ca7fc0472e9e4915e0ba4dd01c4089 (patch) | |
tree | ce3f33a76988eabd3981048a76c9a3871c0f5a56 /src/emu/bus/abcbus | |
parent | cc9274b5bad0cdb997e7db8e9f73a78277bc9308 (diff) |
(MESS) abcbus: Moved under emu/bus. (nw)
Diffstat (limited to 'src/emu/bus/abcbus')
-rw-r--r-- | src/emu/bus/abcbus/abc890.c | 280 | ||||
-rw-r--r-- | src/emu/bus/abcbus/abc890.h | 107 | ||||
-rw-r--r-- | src/emu/bus/abcbus/abcbus.c | 315 | ||||
-rw-r--r-- | src/emu/bus/abcbus/abcbus.h | 201 | ||||
-rw-r--r-- | src/emu/bus/abcbus/dos.c | 146 | ||||
-rw-r--r-- | src/emu/bus/abcbus/dos.h | 56 | ||||
-rw-r--r-- | src/emu/bus/abcbus/fd2.c | 236 | ||||
-rw-r--r-- | src/emu/bus/abcbus/fd2.h | 67 | ||||
-rw-r--r-- | src/emu/bus/abcbus/hdc.c | 163 | ||||
-rw-r--r-- | src/emu/bus/abcbus/hdc.h | 63 | ||||
-rw-r--r-- | src/emu/bus/abcbus/lux10828.c | 705 | ||||
-rw-r--r-- | src/emu/bus/abcbus/lux10828.h | 121 | ||||
-rw-r--r-- | src/emu/bus/abcbus/lux21046.c | 792 | ||||
-rw-r--r-- | src/emu/bus/abcbus/lux21046.h | 131 | ||||
-rw-r--r-- | src/emu/bus/abcbus/sio.c | 199 | ||||
-rw-r--r-- | src/emu/bus/abcbus/sio.h | 53 | ||||
-rw-r--r-- | src/emu/bus/abcbus/slutprov.c | 79 | ||||
-rw-r--r-- | src/emu/bus/abcbus/slutprov.h | 44 | ||||
-rw-r--r-- | src/emu/bus/abcbus/turbo.c | 174 | ||||
-rw-r--r-- | src/emu/bus/abcbus/turbo.h | 63 | ||||
-rw-r--r-- | src/emu/bus/abcbus/uni800.c | 110 | ||||
-rw-r--r-- | src/emu/bus/abcbus/uni800.h | 44 | ||||
-rw-r--r-- | src/emu/bus/abcbus/xebec.c | 156 | ||||
-rw-r--r-- | src/emu/bus/abcbus/xebec.h | 63 |
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 |