From f398f6f12c740473812a378ef13e03c95f884a77 Mon Sep 17 00:00:00 2001 From: Sergey Svishchev Date: Sat, 11 Oct 2025 14:24:31 +0300 Subject: [PATCH 1/3] qbus: serial ports for BK and DVK --- scripts/src/bus.lua | 4 + src/devices/bus/qbus/bk_irps.cpp | 106 +++++++++++++++++ src/devices/bus/qbus/bk_irps.h | 19 +++ src/devices/bus/qbus/dvk_ktlk.cpp | 185 ++++++++++++++++++++++++++++++ src/devices/bus/qbus/dvk_ktlk.h | 19 +++ src/devices/bus/qbus/qbus.cpp | 8 ++ 6 files changed, 341 insertions(+) create mode 100644 src/devices/bus/qbus/bk_irps.cpp create mode 100644 src/devices/bus/qbus/bk_irps.h create mode 100644 src/devices/bus/qbus/dvk_ktlk.cpp create mode 100644 src/devices/bus/qbus/dvk_ktlk.h 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..187012647dff2 --- /dev/null +++ b/src/devices/bus/qbus/bk_irps.cpp @@ -0,0 +1,106 @@ +// 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-level overrides + virtual void device_start() override; + virtual void device_add_mconfig(machine_config &config) override; + + // 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..90654200a2961 --- /dev/null +++ b/src/devices/bus/qbus/dvk_ktlk.cpp @@ -0,0 +1,185 @@ +// 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); + + uint16_t read(offs_t offset); + void write(offs_t offset, uint16_t data); + +protected: + // device-level overrides + virtual void device_start() override; + virtual void device_reset() override; + virtual void device_add_mconfig(machine_config &config) override; + + // device_z80daisy_interface overrides + virtual int z80daisy_irq_state() override; + virtual int z80daisy_irq_ack() override; + virtual void z80daisy_irq_reti() override {}; + +private: + 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, "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); From e38c78ca342998afe63d794894f547266b709729 Mon Sep 17 00:00:00 2001 From: Vas Crabb Date: Mon, 13 Oct 2025 01:42:01 +1100 Subject: [PATCH 2/3] bus/qbus/bk_irps.cpp: Superfluous semicolons, cold attributes, nonsensiacal comments. --- src/devices/bus/qbus/bk_irps.cpp | 17 ++++++++--------- 1 file changed, 8 insertions(+), 9 deletions(-) diff --git a/src/devices/bus/qbus/bk_irps.cpp b/src/devices/bus/qbus/bk_irps.cpp index 187012647dff2..de3710ccd9cdf 100644 --- a/src/devices/bus/qbus/bk_irps.cpp +++ b/src/devices/bus/qbus/bk_irps.cpp @@ -37,14 +37,14 @@ class bk_irps_device : public device_t, bk_irps_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock); protected: - // device-level overrides - virtual void device_start() override; - virtual void device_add_mconfig(machine_config &config) override; + // 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 { }; + 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; @@ -91,9 +91,8 @@ void bk_irps_device::device_add_mconfig(machine_config &config) 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)) - ); + emu::rw_delegate(m_sart, FUNC(k1801vp065_device::read)), + emu::rw_delegate(m_sart, FUNC(k1801vp065_device::write))); } } // anonymous namespace From 049483be04a241a2d142da30784d4efcbad04f27 Mon Sep 17 00:00:00 2001 From: Vas Crabb Date: Mon, 13 Oct 2025 01:48:12 +1100 Subject: [PATCH 3/3] bus/qbus/dvk_ktlk.cpp: More of the same cleanup --- src/devices/bus/qbus/dvk_ktlk.cpp | 23 ++++++++++++----------- 1 file changed, 12 insertions(+), 11 deletions(-) diff --git a/src/devices/bus/qbus/dvk_ktlk.cpp b/src/devices/bus/qbus/dvk_ktlk.cpp index 90654200a2961..00ade8d884875 100644 --- a/src/devices/bus/qbus/dvk_ktlk.cpp +++ b/src/devices/bus/qbus/dvk_ktlk.cpp @@ -34,21 +34,21 @@ class dvk_ktlk_device : public device_t, // construction/destruction dvk_ktlk_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock); - uint16_t read(offs_t offset); - void write(offs_t offset, uint16_t data); - protected: - // device-level overrides - virtual void device_start() override; - virtual void device_reset() override; - virtual void device_add_mconfig(machine_config &config) override; + // 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 {}; + 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; @@ -124,8 +124,9 @@ 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_bus->install_device(0176560, 0176637, + read16sm_delegate(*this, FUNC(dvk_ktlk_device::read)), + write16sm_delegate(*this, FUNC(dvk_ktlk_device::write))); m_installed = true; } } @@ -182,4 +183,4 @@ int dvk_ktlk_device::z80daisy_irq_ack() // DEVICE DEFINITIONS //************************************************************************** -DEFINE_DEVICE_TYPE_PRIVATE(DVK_KTLK, device_qbus_card_interface, dvk_ktlk_device, "ktlk", "DVK KTLK 6-port serial"); +DEFINE_DEVICE_TYPE_PRIVATE(DVK_KTLK, device_qbus_card_interface, dvk_ktlk_device, "dvk_ktlk", "DVK KTLK 6-port serial");