From 1392b241ccd12563685a998fac2825a490055cec Mon Sep 17 00:00:00 2001 From: arbee Date: Tue, 2 Jan 2018 16:49:05 -0500 Subject: [PATCH] mac: preliminary support for AE Quadralink 4-port serial [R. Belmont, Al Kossow] --- scripts/src/bus.lua | 2 + src/devices/bus/nubus/quadralink.cpp | 193 +++++++++++++++++++++++++++ src/devices/bus/nubus/quadralink.h | 46 +++++++ src/mame/drivers/mac.cpp | 2 + 4 files changed, 243 insertions(+) create mode 100644 src/devices/bus/nubus/quadralink.cpp create mode 100644 src/devices/bus/nubus/quadralink.h diff --git a/scripts/src/bus.lua b/scripts/src/bus.lua index 23672aca0a3..8782b49b2a1 100644 --- a/scripts/src/bus.lua +++ b/scripts/src/bus.lua @@ -1837,6 +1837,8 @@ if (BUSES["NUBUS"]~=null) then MAME_DIR .. "src/devices/bus/nubus/nubus_wsportrait.h", MAME_DIR .. "src/devices/bus/nubus/bootbug.cpp", MAME_DIR .. "src/devices/bus/nubus/bootbug.h", + MAME_DIR .. "src/devices/bus/nubus/quadralink.cpp", + MAME_DIR .. "src/devices/bus/nubus/quadralink.h", MAME_DIR .. "src/devices/bus/nubus/pds30_cb264.cpp", MAME_DIR .. "src/devices/bus/nubus/pds30_cb264.h", MAME_DIR .. "src/devices/bus/nubus/pds30_procolor816.cpp", diff --git a/src/devices/bus/nubus/quadralink.cpp b/src/devices/bus/nubus/quadralink.cpp new file mode 100644 index 00000000000..bd6541bc9a5 --- /dev/null +++ b/src/devices/bus/nubus/quadralink.cpp @@ -0,0 +1,193 @@ +// license:BSD-3-Clause +// copyright-holders:R. Belmont +/*************************************************************************** + + Applied Engineering Quadralink 4-port serial card + +***************************************************************************/ + +#include "emu.h" +#include "quadralink.h" +#include "bus/rs232/rs232.h" +#include "bus/rs232/terminal.h" +#include "bus/rs232/null_modem.h" +#include "screen.h" + +static SLOT_INTERFACE_START(isa_com) + SLOT_INTERFACE("terminal", SERIAL_TERMINAL) + SLOT_INTERFACE("null_modem", NULL_MODEM) +SLOT_INTERFACE_END + +#define QUADRALINK_ROM_REGION "qdlink_rom" + +ROM_START( quadralink ) + ROM_REGION(0x4000, QUADRALINK_ROM_REGION, 0) + ROM_LOAD( "ql_2.2.bin", 0x000000, 0x004000, CRC(88c323b8) SHA1(d70bc32ad50ceb5cb75c6251293cacd65d8313aa) ) +ROM_END + +//************************************************************************** +// GLOBAL VARIABLES +//************************************************************************** + +DEFINE_DEVICE_TYPE(NUBUS_QUADRALINK, nubus_quadralink_device, "nb_qdlink", "Applied Engineering Quadralink serial card") + + +//------------------------------------------------- +// device_add_mconfig - add device configuration +//------------------------------------------------- + +MACHINE_CONFIG_MEMBER( nubus_quadralink_device::device_add_mconfig ) + MCFG_SCC8530_ADD("scc1", XTAL_3_6864MHz, 0, 0, 0, 0) + MCFG_Z80SCC_OUT_TXDA_CB(DEVWRITELINE("serport0", rs232_port_device, write_txd)) + MCFG_Z80SCC_OUT_TXDB_CB(DEVWRITELINE("serport1", rs232_port_device, write_txd)) + + MCFG_SCC8530_ADD("scc2", XTAL_3_6864MHz, 0, 0, 0, 0) + MCFG_Z80SCC_OUT_TXDA_CB(DEVWRITELINE("serport2", rs232_port_device, write_txd)) + MCFG_Z80SCC_OUT_TXDB_CB(DEVWRITELINE("serport3", rs232_port_device, write_txd)) + + MCFG_RS232_PORT_ADD( "serport0", isa_com, nullptr ) + MCFG_RS232_RXD_HANDLER(DEVWRITELINE("scc1", z80scc_device, rxa_w)) + MCFG_RS232_DCD_HANDLER(DEVWRITELINE("scc1", z80scc_device, dcda_w)) + MCFG_RS232_CTS_HANDLER(DEVWRITELINE("scc1", z80scc_device, ctsa_w)) + + MCFG_RS232_PORT_ADD( "serport1", isa_com, nullptr ) + MCFG_RS232_RXD_HANDLER(DEVWRITELINE("scc1", z80scc_device, rxb_w)) + MCFG_RS232_DCD_HANDLER(DEVWRITELINE("scc1", z80scc_device, dcdb_w)) + MCFG_RS232_CTS_HANDLER(DEVWRITELINE("scc1", z80scc_device, ctsb_w)) + + MCFG_RS232_PORT_ADD( "serport2", isa_com, nullptr ) + MCFG_RS232_RXD_HANDLER(DEVWRITELINE("scc2", z80scc_device, rxa_w)) + MCFG_RS232_DCD_HANDLER(DEVWRITELINE("scc2", z80scc_device, dcda_w)) + MCFG_RS232_CTS_HANDLER(DEVWRITELINE("scc2", z80scc_device, ctsa_w)) + + MCFG_RS232_PORT_ADD( "serport3", isa_com, nullptr ) + MCFG_RS232_RXD_HANDLER(DEVWRITELINE("scc2", z80scc_device, rxb_w)) + MCFG_RS232_DCD_HANDLER(DEVWRITELINE("scc2", z80scc_device, dcdb_w)) + MCFG_RS232_CTS_HANDLER(DEVWRITELINE("scc2", z80scc_device, ctsb_w)) +MACHINE_CONFIG_END + +//------------------------------------------------- +// rom_region - device-specific ROM region +//------------------------------------------------- + +const tiny_rom_entry *nubus_quadralink_device::device_rom_region() const +{ + return ROM_NAME( quadralink ); +} + +//************************************************************************** +// LIVE DEVICE +//************************************************************************** + +//------------------------------------------------- +// nubus_quadralink_device - constructor +//------------------------------------------------- + +nubus_quadralink_device::nubus_quadralink_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock) : + nubus_quadralink_device(mconfig, NUBUS_QUADRALINK, tag, owner, clock) +{ +} + +nubus_quadralink_device::nubus_quadralink_device(const machine_config &mconfig, device_type type, const char *tag, device_t *owner, uint32_t clock) : + device_t(mconfig, type, tag, owner, clock), + device_nubus_card_interface(mconfig, *this), + m_scc1(*this, "scc1"), + m_scc2(*this, "scc2") +{ +} + +//------------------------------------------------- +// device_start - device-specific startup +//------------------------------------------------- + +void nubus_quadralink_device::device_start() +{ + uint32_t slotspace; + + // set_nubus_device makes m_slot valid + set_nubus_device(); + install_declaration_rom(this, QUADRALINK_ROM_REGION); + + slotspace = get_slotspace(); + + m_nubus->install_device(slotspace, slotspace+0xefffff, read32_delegate(FUNC(nubus_quadralink_device::dev_r), this), write32_delegate(FUNC(nubus_quadralink_device::dev_w), this)); +} + +//------------------------------------------------- +// device_reset - device-specific reset +//------------------------------------------------- + +void nubus_quadralink_device::device_reset() +{ +} + +WRITE32_MEMBER( nubus_quadralink_device::dev_w ) +{ + //printf("write %x to QL space @ %x, mask %08x\n", data, offset, mem_mask); + switch (offset) + { + case 0x0000: // SCC 2 A control + m_scc2->ca_w(space, 0, data & 0xff); + break; + + case 0x0002: // SCC 2 A data + m_scc2->da_w(space, 0, data & 0xff); + break; + + case 0x0004: // SCC 2 B control + m_scc2->cb_w(space, 0, data & 0xff); + break; + + case 0x0006: // SCC 2 B data + m_scc2->db_w(space, 0, data & 0xff); + break; + + case 0x10000: // SCC 1 A control + m_scc1->ca_w(space, 0, data & 0xff); + break; + + case 0x10002: // SCC 1 A data + m_scc1->da_w(space, 0, data & 0xff); + break; + + case 0x10004: // SCC 1 B control + m_scc1->cb_w(space, 0, data & 0xff); + break; + + case 0x10006: // SCC 1 B data + m_scc1->db_w(space, 0, data & 0xff); + break; + } +} + +READ32_MEMBER( nubus_quadralink_device::dev_r ) +{ + //printf("read QL space @ %x, mask %08x\n", offset, mem_mask); + switch (offset) + { + case 0x0000: + return m_scc2->ca_r(space, 0); + + case 0x0002: + return m_scc2->da_r(space, 0); + + case 0x0004: + return m_scc2->cb_r(space, 0); + + case 0x0006: + return m_scc2->db_r(space, 0); + + case 0x10000: + return m_scc1->ca_r(space, 0); + + case 0x10002: + return m_scc1->da_r(space, 0); + + case 0x10004: + return m_scc1->cb_r(space, 0); + + case 0x10006: + return m_scc1->db_r(space, 0); + } + return 0xffffffff; +} diff --git a/src/devices/bus/nubus/quadralink.h b/src/devices/bus/nubus/quadralink.h new file mode 100644 index 00000000000..28f3eadbf47 --- /dev/null +++ b/src/devices/bus/nubus/quadralink.h @@ -0,0 +1,46 @@ +// license:BSD-3-Clause +// copyright-holders:R. Belmont +#ifndef MAME_BUS_NUBUS_QUADRALINK_H +#define MAME_BUS_NUBUS_QUADRALINK_H + +#pragma once + +#include "nubus.h" +#include "machine/z80scc.h" + +//************************************************************************** +// TYPE DEFINITIONS +//************************************************************************** + +// ======================> nubus_quadralink_device + +class nubus_quadralink_device : + public device_t, + public device_nubus_card_interface +{ +public: + // construction/destruction + nubus_quadralink_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock); + +protected: + nubus_quadralink_device(const machine_config &mconfig, device_type type, const char *tag, device_t *owner, uint32_t clock); + + required_device m_scc1, m_scc2; + + // device-level overrides + virtual void device_start() override; + virtual void device_reset() override; + + // optional information overrides + virtual void device_add_mconfig(machine_config &config) override; + virtual const tiny_rom_entry *device_rom_region() const override; + +private: + DECLARE_READ32_MEMBER(dev_r); + DECLARE_WRITE32_MEMBER(dev_w); +}; + +// device type definition +DECLARE_DEVICE_TYPE(NUBUS_QUADRALINK, nubus_quadralink_device) + +#endif // MAME_BUS_NUBUS_QUADRALINK_H diff --git a/src/mame/drivers/mac.cpp b/src/mame/drivers/mac.cpp index 7dc1d14c485..55acf706bfc 100644 --- a/src/mame/drivers/mac.cpp +++ b/src/mame/drivers/mac.cpp @@ -72,6 +72,7 @@ #include "bus/nubus/nubus_image.h" #include "bus/nubus/nubus_m2video.h" #include "bus/nubus/bootbug.h" +#include "bus/nubus/quadralink.h" #include "bus/nubus/pds30_cb264.h" #include "bus/nubus/pds30_procolor816.h" #include "bus/nubus/pds30_sigmalview.h" @@ -880,6 +881,7 @@ static SLOT_INTERFACE_START(mac_nubus_cards) SLOT_INTERFACE("portrait", NUBUS_WSPORTRAIT) /* Apple Macintosh II Portrait video card */ SLOT_INTERFACE("enetnb", NUBUS_APPLEENET) /* Apple NuBus Ethernet */ SLOT_INTERFACE("bootbug", NUBUS_BOOTBUG) /* Brigent BootBug debugger card */ + SLOT_INTERFACE("quadralink", NUBUS_QUADRALINK) /* AE Quadralink serial card */ SLOT_INTERFACE_END static SLOT_INTERFACE_START(mac_pds030_cards)