diff --git a/scripts/src/bus.lua b/scripts/src/bus.lua index a5d235b748a98..fea5f6e94fd21 100644 --- a/scripts/src/bus.lua +++ b/scripts/src/bus.lua @@ -4917,6 +4917,8 @@ end if (BUSES["QBUS"]~=null) then files { + MAME_DIR .. "src/devices/bus/qbus/bk_irps.cpp", + MAME_DIR .. "src/devices/bus/qbus/bk_irps.h", MAME_DIR .. "src/devices/bus/qbus/bk_kmd.cpp", MAME_DIR .. "src/devices/bus/qbus/bk_kmd.h", MAME_DIR .. "src/devices/bus/qbus/dsd4432.cpp", @@ -4925,6 +4927,8 @@ if (BUSES["QBUS"]~=null) then MAME_DIR .. "src/devices/bus/qbus/dvk_kgd.h", MAME_DIR .. "src/devices/bus/qbus/dvk_kmd.cpp", MAME_DIR .. "src/devices/bus/qbus/dvk_kmd.h", + MAME_DIR .. "src/devices/bus/qbus/dvk_ktlk.cpp", + MAME_DIR .. "src/devices/bus/qbus/dvk_ktlk.h", MAME_DIR .. "src/devices/bus/qbus/dvk_mx.cpp", MAME_DIR .. "src/devices/bus/qbus/dvk_mx.h", MAME_DIR .. "src/devices/bus/qbus/pc11.cpp", diff --git a/src/devices/bus/qbus/bk_irps.cpp b/src/devices/bus/qbus/bk_irps.cpp new file mode 100644 index 0000000000000..de3710ccd9cdf --- /dev/null +++ b/src/devices/bus/qbus/bk_irps.cpp @@ -0,0 +1,105 @@ +// license:BSD-3-Clause +// copyright-holders:Sergey Svishchev +/*************************************************************************** + + BK serial port adapter (decimal 2.165.001) + + CSR 176560, vector base 360. + + Has software support in FOCAL ROM 084. + + To do: break detection, periodic timer outputs, DIP switch block + +***************************************************************************/ + +#include "emu.h" +#include "bk_irps.h" + +#include "bus/rs232/rs232.h" +#include "machine/dl11.h" +#include "machine/pdp11.h" + + +namespace { + +/*************************************************************************** + TYPE DEFINITIONS +***************************************************************************/ + +// ======================> bk_irps_device + +class bk_irps_device : public device_t, + public device_qbus_card_interface, + public device_z80daisy_interface +{ +public: + // construction/destruction + bk_irps_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock); + +protected: + // device_t implementation + virtual void device_start() override ATTR_COLD; + virtual void device_add_mconfig(machine_config &config) override ATTR_COLD; + + // device_z80daisy_interface overrides + virtual int z80daisy_irq_state() override { return m_sart->z80daisy_irq_state(); } + virtual int z80daisy_irq_ack() override { return m_sart->z80daisy_irq_ack(); } + virtual void z80daisy_irq_reti() override { } + + required_device m_sart; + required_device m_rs232; +}; + + +//************************************************************************** +// LIVE DEVICE +//************************************************************************** + +//------------------------------------------------- +// bk_irps_device - constructor +//------------------------------------------------- + +bk_irps_device::bk_irps_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock) + : device_t(mconfig, BK_IRPS, tag, owner, clock) + , device_qbus_card_interface(mconfig, *this) + , device_z80daisy_interface(mconfig, *this) + , m_sart(*this, "sart") + , m_rs232(*this, "rs232") +{ +} + +void bk_irps_device::device_add_mconfig(machine_config &config) +{ + K1801VP065(config, m_sart, XTAL(4'608'000)); + m_sart->set_rxc(9600); + m_sart->set_txc(9600); + m_sart->set_rxvec(0360); + m_sart->set_txvec(0364); + m_sart->txd_wr_callback().set(m_rs232, FUNC(rs232_port_device::write_txd)); + m_sart->txrdy_wr_callback().set([this](int state) { m_bus->birq4_w(state); }); + m_sart->rxrdy_wr_callback().set([this](int state) { m_bus->birq4_w(state); }); + + RS232_PORT(config, m_rs232, default_rs232_devices, "null_modem"); + m_rs232->rxd_handler().set(m_sart, FUNC(k1801vp065_device::rx_w)); +} + + +//------------------------------------------------- +// device_start - device-specific startup +//------------------------------------------------- + +void bk_irps_device::device_start() +{ + m_bus->install_device(0176560, 0176567, + emu::rw_delegate(m_sart, FUNC(k1801vp065_device::read)), + emu::rw_delegate(m_sart, FUNC(k1801vp065_device::write))); +} + +} // anonymous namespace + + +//************************************************************************** +// DEVICE DEFINITIONS +//************************************************************************** + +DEFINE_DEVICE_TYPE_PRIVATE(BK_IRPS, device_qbus_card_interface, bk_irps_device, "bk_irps", "BK serial port") diff --git a/src/devices/bus/qbus/bk_irps.h b/src/devices/bus/qbus/bk_irps.h new file mode 100644 index 0000000000000..d39545fc6ac53 --- /dev/null +++ b/src/devices/bus/qbus/bk_irps.h @@ -0,0 +1,19 @@ +// license:BSD-3-Clause +// copyright-holders:Sergey Svishchev +/*************************************************************************** + + BK serial port adapter (decimal 2.165.001) + +***************************************************************************/ + +#ifndef MAME_BUS_QBUS_BK_IRPS_H +#define MAME_BUS_QBUS_BK_IRPS_H + +#pragma once + +#include "qbus.h" + + +DECLARE_DEVICE_TYPE(BK_IRPS, device_qbus_card_interface) + +#endif diff --git a/src/devices/bus/qbus/dvk_ktlk.cpp b/src/devices/bus/qbus/dvk_ktlk.cpp new file mode 100644 index 0000000000000..00ade8d884875 --- /dev/null +++ b/src/devices/bus/qbus/dvk_ktlk.cpp @@ -0,0 +1,186 @@ +// license:BSD-3-Clause +// copyright-holders:Sergey Svishchev +/*************************************************************************** + + 6-port serial card, decimal 3.057.119 + + CSR 176560, vector base 320 (factory default). + + CSR, vector base, frame format and port speed are configurable via + DIP switches, this is not implemented. + +***************************************************************************/ + +#include "emu.h" +#include "dvk_ktlk.h" + +#include "bus/rs232/rs232.h" +#include "machine/dl11.h" + + +namespace { + +/*************************************************************************** + TYPE DEFINITIONS +***************************************************************************/ + +// ======================> dvk_ktlk_device + +class dvk_ktlk_device : public device_t, + public device_qbus_card_interface, + public device_z80daisy_interface +{ +public: + // construction/destruction + dvk_ktlk_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock); + +protected: + // device_t implementation + virtual void device_start() override ATTR_COLD; + virtual void device_reset() override ATTR_COLD; + virtual void device_add_mconfig(machine_config &config) override ATTR_COLD; + + // device_z80daisy_interface overrides + virtual int z80daisy_irq_state() override; + virtual int z80daisy_irq_ack() override; + virtual void z80daisy_irq_reti() override { } + +private: + uint16_t read(offs_t offset); + void write(offs_t offset, uint16_t data); + + required_device_array m_sart; + required_device_array m_rs232; + + bool m_installed; +}; + + + +//************************************************************************** +// LIVE DEVICE +//************************************************************************** + +//------------------------------------------------- +// dvk_ktlk_device - constructor +//------------------------------------------------- + +dvk_ktlk_device::dvk_ktlk_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock) + : device_t(mconfig, DVK_KTLK, tag, owner, clock) + , device_qbus_card_interface(mconfig, *this) + , device_z80daisy_interface(mconfig, *this) + , m_sart(*this, "sart%u", 1U) + , m_rs232(*this, "port%u", 1U) + , m_installed(false) +{ +} + +static DEVICE_INPUT_DEFAULTS_START( host_rs232_defaults ) + DEVICE_INPUT_DEFAULTS( "RS232_TXBAUD", 0xff, RS232_BAUD_9600 ) + DEVICE_INPUT_DEFAULTS( "RS232_RXBAUD", 0xff, RS232_BAUD_9600 ) + DEVICE_INPUT_DEFAULTS( "RS232_DATABITS", 0xff, RS232_DATABITS_8 ) + DEVICE_INPUT_DEFAULTS( "RS232_PARITY", 0xff, RS232_PARITY_NONE ) + DEVICE_INPUT_DEFAULTS( "RS232_STOPBITS", 0xff, RS232_STOPBITS_2 ) + DEVICE_INPUT_DEFAULTS( "FLOW_CONTROL", 0x01, 0x01 ) +DEVICE_INPUT_DEFAULTS_END + +void dvk_ktlk_device::device_add_mconfig(machine_config &config) +{ + for (int i = 0; i < 6; i++) + { + K1801VP065(config, m_sart[i], XTAL(4'608'000)); + m_sart[i]->set_rxc(9600); + m_sart[i]->set_txc(9600); + m_sart[i]->set_rxvec(0320 + (010 * i)); + m_sart[i]->set_txvec(0324 + (010 * i)); + m_sart[i]->txd_wr_callback().set(m_rs232[i], FUNC(rs232_port_device::write_txd)); + m_sart[i]->rts_wr_callback().set(m_rs232[i], FUNC(rs232_port_device::write_rts)); + m_sart[i]->txrdy_wr_callback().set([this](int state) { m_bus->birq4_w(state); }); + m_sart[i]->rxrdy_wr_callback().set([this](int state) { m_bus->birq4_w(state); }); + + RS232_PORT(config, m_rs232[i], default_rs232_devices, "loopback"); + m_rs232[i]->rxd_handler().set(m_sart[i], FUNC(k1801vp065_device::rx_w)); + m_rs232[i]->set_option_device_input_defaults("loopback", DEVICE_INPUT_DEFAULTS_NAME(host_rs232_defaults)); + } +} + +//------------------------------------------------- +// device_start - device-specific startup +//------------------------------------------------- + +void dvk_ktlk_device::device_start() +{ + save_item(NAME(m_installed)); + + m_installed = false; +} + + +//------------------------------------------------- +// device_reset - device-specific reset +//------------------------------------------------- + +void dvk_ktlk_device::device_reset() +{ + if (!m_installed) + { + m_bus->install_device(0176560, 0176637, + read16sm_delegate(*this, FUNC(dvk_ktlk_device::read)), + write16sm_delegate(*this, FUNC(dvk_ktlk_device::write))); + m_installed = true; + } +} + + +//------------------------------------------------- +// read - register read +//------------------------------------------------- + +uint16_t dvk_ktlk_device::read(offs_t offset) +{ + uint16_t data = m_sart[offset >> 2]->read(offset % 4); + return data; +} + + +//------------------------------------------------- +// write - register write +//------------------------------------------------- + +void dvk_ktlk_device::write(offs_t offset, uint16_t data) +{ + m_sart[offset >> 2]->write(offset % 4, data); +} + + +int dvk_ktlk_device::z80daisy_irq_state() +{ + int irq = 0; + for (int i = 0; i < 6; i++) + { + irq |= m_sart[i]->z80daisy_irq_state(); + } + return irq; +} + +int dvk_ktlk_device::z80daisy_irq_ack() +{ + int vec = -1; + + for (int i = 0; i < 6; i++) + { + vec = m_sart[i]->z80daisy_irq_ack(); + if (vec > -1) return vec; + } + + return vec; +} + +} // anonymous namespace + + +//************************************************************************** +// DEVICE DEFINITIONS +//************************************************************************** + +DEFINE_DEVICE_TYPE_PRIVATE(DVK_KTLK, device_qbus_card_interface, dvk_ktlk_device, "dvk_ktlk", "DVK KTLK 6-port serial"); diff --git a/src/devices/bus/qbus/dvk_ktlk.h b/src/devices/bus/qbus/dvk_ktlk.h new file mode 100644 index 0000000000000..ec5e792a7ec9b --- /dev/null +++ b/src/devices/bus/qbus/dvk_ktlk.h @@ -0,0 +1,19 @@ +// license:BSD-3-Clause +// copyright-holders:Sergey Svishchev +/*************************************************************************** + + 6-port serial card, decimal 3.057.119 + +***************************************************************************/ + +#ifndef MAME_BUS_QBUS_DVK_KTLK_H +#define MAME_BUS_QBUS_DVK_KTLK_H + +#pragma once + +#include "qbus.h" + + +DECLARE_DEVICE_TYPE(DVK_KTLK, device_qbus_card_interface) + +#endif diff --git a/src/devices/bus/qbus/qbus.cpp b/src/devices/bus/qbus/qbus.cpp index 1d7bb37aa04f6..0399e06f1a27f 100644 --- a/src/devices/bus/qbus/qbus.cpp +++ b/src/devices/bus/qbus/qbus.cpp @@ -11,6 +11,8 @@ #include "qbus.h" // Peripheral boards + +// storage #include "bk_kmd.h" #include "dsd4432.h" #include "dvk_kgd.h" @@ -22,13 +24,19 @@ #include "tdl12.h" #include "uknc_kmd.h" +// serial ports +#include "bk_irps.h" +#include "dvk_ktlk.h" + void qbus_cards(device_slot_interface &device) { device.option_add("pc11", DEC_PC11); /* Paper tape reader and punch */ device.option_add("qts1", TTI_QTS1); device.option_add("dsd4432", DSD4432); + device.option_add("irps", BK_IRPS); device.option_add("kgd", DVK_KGD); + device.option_add("ktlk", DVK_KTLK); device.option_add("mx", DVK_MX); device.option_add("my", DVK_KMD); device.option_add("mz", UKNC_KMD);