Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
4 changes: 4 additions & 0 deletions scripts/src/bus.lua
Original file line number Diff line number Diff line change
Expand Up @@ -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",
Expand All @@ -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",
Expand Down
105 changes: 105 additions & 0 deletions src/devices/bus/qbus/bk_irps.cpp
Original file line number Diff line number Diff line change
@@ -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<k1801vp065_device> m_sart;
required_device<rs232_port_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")
19 changes: 19 additions & 0 deletions src/devices/bus/qbus/bk_irps.h
Original file line number Diff line number Diff line change
@@ -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
186 changes: 186 additions & 0 deletions src/devices/bus/qbus/dvk_ktlk.cpp
Original file line number Diff line number Diff line change
@@ -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<k1801vp065_device, 6> m_sart;
required_device_array<rs232_port_device, 6> 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");
19 changes: 19 additions & 0 deletions src/devices/bus/qbus/dvk_ktlk.h
Original file line number Diff line number Diff line change
@@ -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
8 changes: 8 additions & 0 deletions src/devices/bus/qbus/qbus.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -11,6 +11,8 @@
#include "qbus.h"

// Peripheral boards

// storage
#include "bk_kmd.h"
#include "dsd4432.h"
#include "dvk_kgd.h"
Expand All @@ -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);
Expand Down
Loading