From 19ce9fd41a0a9d5cdd1ae52693e76b9c63fca4be Mon Sep 17 00:00:00 2001 From: Vas Crabb Date: Thu, 21 Jul 2016 02:24:06 +1000 Subject: [PATCH] Make Sun keyboard port its own bus [Vas Crabb] --- scripts/src/bus.lua | 16 +++- scripts/target/mame/mess.lua | 1 + .../bus/{rs232 => sunkbd}/sparckbd.cpp | 8 +- src/devices/bus/{rs232 => sunkbd}/sparckbd.h | 10 +-- src/devices/bus/sunkbd/sunkbd.cpp | 87 +++++++++++++++++++ src/devices/bus/sunkbd/sunkbd.h | 79 +++++++++++++++++ src/mame/drivers/sun4.cpp | 19 ++-- 7 files changed, 195 insertions(+), 25 deletions(-) rename src/devices/bus/{rs232 => sunkbd}/sparckbd.cpp (99%) rename src/devices/bus/{rs232 => sunkbd}/sparckbd.h (90%) create mode 100644 src/devices/bus/sunkbd/sunkbd.cpp create mode 100644 src/devices/bus/sunkbd/sunkbd.h diff --git a/scripts/src/bus.lua b/scripts/src/bus.lua index f5283748490..84d0ed09f8f 100644 --- a/scripts/src/bus.lua +++ b/scripts/src/bus.lua @@ -1662,8 +1662,6 @@ if (BUSES["RS232"]~=null) then MAME_DIR .. "src/devices/bus/rs232/pty.h", MAME_DIR .. "src/devices/bus/rs232/ser_mouse.cpp", MAME_DIR .. "src/devices/bus/rs232/ser_mouse.h", - MAME_DIR .. "src/devices/bus/rs232/sparckbd.cpp", - MAME_DIR .. "src/devices/bus/rs232/sparckbd.h", MAME_DIR .. "src/devices/bus/rs232/terminal.cpp", MAME_DIR .. "src/devices/bus/rs232/terminal.h", MAME_DIR .. "src/devices/bus/rs232/xvd701.cpp", @@ -2575,6 +2573,20 @@ if (BUSES["ZORRO"]~=null) then } end +--------------------------------------------------- +-- +--@src/devices/bus/sunkbd/sunkbd.h,BUSES["SUNKBD"] = true +--------------------------------------------------- + +if (BUSES["SUNKBD"]~=null) then + files { + MAME_DIR .. "src/devices/bus/sunkbd/sparckbd.cpp", + MAME_DIR .. "src/devices/bus/sunkbd/sparckbd.h", + MAME_DIR .. "src/devices/bus/sunkbd/sunkbd.cpp", + MAME_DIR .. "src/devices/bus/sunkbd/sunkbd.h", + } +end + --------------------------------------------------- -- --@src/devices/bus/ql/exp.h,BUSES["QL"] = true diff --git a/scripts/target/mame/mess.lua b/scripts/target/mame/mess.lua index 41b1659dca1..44b95bf5615 100644 --- a/scripts/target/mame/mess.lua +++ b/scripts/target/mame/mess.lua @@ -677,6 +677,7 @@ BUSES["SMS_EXP"] = true BUSES["SNES"] = true BUSES["SNES_CTRL"] = true BUSES["SPC1000"] = true +BUSES["SUNKBD"] = true BUSES["SVI_EXPANDER"] = true BUSES["SVI_SLOT"] = true BUSES["TI99PEB"] = true diff --git a/src/devices/bus/rs232/sparckbd.cpp b/src/devices/bus/sunkbd/sparckbd.cpp similarity index 99% rename from src/devices/bus/rs232/sparckbd.cpp rename to src/devices/bus/sunkbd/sparckbd.cpp index 21e570cb189..d9c8c29c732 100644 --- a/src/devices/bus/rs232/sparckbd.cpp +++ b/src/devices/bus/sunkbd/sparckbd.cpp @@ -296,7 +296,7 @@ sparc_keyboard_device::sparc_keyboard_device( char const *source) : device_t(mconfig, type, name, tag, owner, clock, shortname, source) , device_serial_interface(mconfig, *this) - , device_rs232_port_interface(mconfig, *this) + , device_sun_keyboard_port_interface(mconfig, *this) , m_scan_timer(nullptr) , m_click_timer(nullptr) , m_dips(*this, "DIP") @@ -372,12 +372,8 @@ void sparc_keyboard_device::device_reset() receive_register_reset(); transmit_register_reset(); - // set device_rs232_port_interface lines - note that only RxD is physically present + // set device_sun_keyboard_port_interface lines output_rxd(1); - output_dcd(0); - output_dsr(0); - output_ri(0); - output_cts(0); // send reset response send_byte(0xffU); diff --git a/src/devices/bus/rs232/sparckbd.h b/src/devices/bus/sunkbd/sparckbd.h similarity index 90% rename from src/devices/bus/rs232/sparckbd.h rename to src/devices/bus/sunkbd/sparckbd.h index cbe22d941f0..2247e7b9d18 100644 --- a/src/devices/bus/rs232/sparckbd.h +++ b/src/devices/bus/sunkbd/sparckbd.h @@ -1,15 +1,15 @@ // license:BSD-3-Clause // copyright-holders:Vas Crabb -#ifndef MAME_DEVICES_RS232_SPARCKBD_H -#define MAME_DEVICES_RS232_SPARCKBD_H +#ifndef MAME_DEVICES_SUNKBD_SPARCKBD_H +#define MAME_DEVICES_SUNKBD_SPARCKBD_H #pragma once -#include "rs232.h" +#include "sunkbd.h" #include "sound/beep.h" -class sparc_keyboard_device : public device_t, public device_serial_interface, public device_rs232_port_interface +class sparc_keyboard_device : public device_t, public device_serial_interface, public device_sun_keyboard_port_interface { public: sparc_keyboard_device(machine_config const &mconfig, char const *tag, device_t *owner, UINT32 clock); @@ -80,4 +80,4 @@ private: extern const device_type SPARC_KEYBOARD; -#endif // MAME_DEVICES_RS232_SPARCKBD_H +#endif // MAME_DEVICES_SUNKBD_SPARCKBD_H diff --git a/src/devices/bus/sunkbd/sunkbd.cpp b/src/devices/bus/sunkbd/sunkbd.cpp new file mode 100644 index 00000000000..745a63cacf0 --- /dev/null +++ b/src/devices/bus/sunkbd/sunkbd.cpp @@ -0,0 +1,87 @@ +// license:BSD-3-Clause +// copyright-holders:Vas Crabb + +#include "sunkbd.h" + + +device_type const SUNKBD_PORT = &device_creator; + + +sun_keyboard_port_device::sun_keyboard_port_device( + machine_config const &mconfig, + char const *tag, + device_t *owner, + UINT32 clock) + : sun_keyboard_port_device(mconfig, SUNKBD_PORT, "Sun Keyboard Port", tag, owner, clock, "sunkbd", __FILE__) +{ +} + + +sun_keyboard_port_device::sun_keyboard_port_device( + machine_config const &mconfig, + device_type type, + char const *name, + char const *tag, + device_t *owner, + UINT32 clock, + char const *shortname, + char const *source) + : device_t(mconfig, type, name, tag, owner, clock, shortname, source) + , device_slot_interface(mconfig, *this) + , m_rxd(0) + , m_rxd_handler(*this) + , m_dev(nullptr) +{ +} + + +sun_keyboard_port_device::~sun_keyboard_port_device() +{ +} + + +void sun_keyboard_port_device::device_config_complete() +{ + m_dev = dynamic_cast(get_card_device()); +} + + +void sun_keyboard_port_device::device_start() +{ + m_rxd_handler.resolve_safe(); + + save_item(NAME(m_rxd)); + + m_rxd = 1; + + m_rxd_handler(m_rxd); +} + + +WRITE_LINE_MEMBER( sun_keyboard_port_device::write_txd ) +{ + if(m_dev) + m_dev->input_txd(state); +} + + + +device_sun_keyboard_port_interface::device_sun_keyboard_port_interface(machine_config const &mconfig, device_t &device) + : device_slot_card_interface(mconfig, device) + , m_port(dynamic_cast(device.owner())) +{ +} + + +device_sun_keyboard_port_interface::~device_sun_keyboard_port_interface() +{ +} + + + +#include "sparckbd.h" + + +SLOT_INTERFACE_START( default_sun_keyboard_devices ) + SLOT_INTERFACE("sparckbd", SPARC_KEYBOARD) +SLOT_INTERFACE_END diff --git a/src/devices/bus/sunkbd/sunkbd.h b/src/devices/bus/sunkbd/sunkbd.h new file mode 100644 index 00000000000..006d914dff0 --- /dev/null +++ b/src/devices/bus/sunkbd/sunkbd.h @@ -0,0 +1,79 @@ +// license:BSD-3-Clause +// copyright-holders:Vas Crabb +#ifndef MAME_DEVICES_SUNKBD_SUNKBD_H +#define MAME_DEVICES_SUNKBD_SUNKBD_H + +#pragma once + +#include "emu.h" + + +#define MCFG_SUNKBD_PORT_ADD(tag, slot_intf, def_slot) \ + MCFG_DEVICE_ADD(tag, SUNKBD_PORT, 0) \ + MCFG_DEVICE_SLOT_INTERFACE(slot_intf, def_slot, false) + +#define MCFG_SUNKBD_RXD_HANDLER(cb) \ + devcb = &sun_keyboard_port_device::set_rxd_handler(*device, DEVCB_##cb); + + +class device_sun_keyboard_port_interface; + + +class sun_keyboard_port_device : public device_t, public device_slot_interface +{ + friend class device_sun_keyboard_port_interface; + +public: + sun_keyboard_port_device(machine_config const &mconfig, char const *tag, device_t *owner, UINT32 clock); + sun_keyboard_port_device(machine_config const &mconfig, device_type type, char const *name, char const *tag, device_t *owner, UINT32 clock, char const *shortname, char const *source); + virtual ~sun_keyboard_port_device(); + + // static configuration helpers + template static devcb_base &set_rxd_handler(device_t &device, Object object) { return downcast(device).m_rxd_handler.set_callback(object); } + + DECLARE_WRITE_LINE_MEMBER( write_txd ); + + DECLARE_READ_LINE_MEMBER( rxd_r ) { return m_rxd; } + +protected: + virtual void device_start() override; + virtual void device_config_complete() override; + + int m_rxd; + + devcb_write_line m_rxd_handler; + +private: + device_sun_keyboard_port_interface *m_dev; +}; + + +class device_sun_keyboard_port_interface : public device_slot_card_interface +{ + friend class sun_keyboard_port_device; + +public: + device_sun_keyboard_port_interface(machine_config const &mconfig, device_t &device); + virtual ~device_sun_keyboard_port_interface() override; + + virtual DECLARE_WRITE_LINE_MEMBER( input_txd ) { } + + DECLARE_WRITE_LINE_MEMBER( output_rxd ) { m_port->m_rxd = state; m_port->m_rxd_handler(state); } + +protected: + sun_keyboard_port_device *m_port; + + static constexpr int START_BIT_COUNT = 1; + static constexpr int DATA_BIT_COUNT = 8; + static constexpr device_serial_interface::parity_t PARITY = device_serial_interface::PARITY_NONE; + static constexpr device_serial_interface::stop_bits_t STOP_BITS = device_serial_interface::STOP_BITS_1; + static constexpr int BAUD = 1'200; +}; + + +extern device_type const SUNKBD_PORT; + + +SLOT_INTERFACE_EXTERN( default_sun_keyboard_devices ); + +#endif // MAME_DEVICES_SUNKBD_SUNKBD_H diff --git a/src/mame/drivers/sun4.cpp b/src/mame/drivers/sun4.cpp index 1487420fdb1..e46538582af 100644 --- a/src/mame/drivers/sun4.cpp +++ b/src/mame/drivers/sun4.cpp @@ -417,7 +417,7 @@ #include "machine/bankdev.h" #include "machine/nvram.h" #include "bus/rs232/rs232.h" -#include "bus/rs232/sparckbd.h" +#include "bus/sunkbd/sunkbd.h" #include "machine/timekpr.h" #include "machine/upd765.h" #include "formats/pc_dsk.h" @@ -485,11 +485,6 @@ const sparc_disassembler::asi_desc_map::value_type sun4c_asi_desc[] = { { 0x0d, { nullptr, "Flush Cache (Page)" } }, { 0x0e, { nullptr, "Flush Cache (Context)" } } }; - -// TODO: put this somewhere common when sun4m, sun4d, sun4u, etc. are split out -SLOT_INTERFACE_START(keyboard_devices) - SLOT_INTERFACE("keyboard", SPARC_KEYBOARD) -SLOT_INTERFACE_END } enum @@ -1609,10 +1604,10 @@ static MACHINE_CONFIG_START( sun4, sun4_state ) // Keyboard/mouse MCFG_SCC8530_ADD(SCC1_TAG, XTAL_4_9152MHz, 0, 0, 0, 0) MCFG_Z80SCC_OUT_INT_CB(WRITELINE(sun4_state, scc1_int)) - MCFG_Z80SCC_OUT_TXDA_CB(DEVWRITELINE(KEYBOARD_TAG, rs232_port_device, write_txd)) + MCFG_Z80SCC_OUT_TXDA_CB(DEVWRITELINE(KEYBOARD_TAG, sun_keyboard_port_device, write_txd)) - MCFG_RS232_PORT_ADD(KEYBOARD_TAG, keyboard_devices, "keyboard") - MCFG_RS232_RXD_HANDLER(DEVWRITELINE(SCC1_TAG, z80scc_device, rxa_w)) + MCFG_SUNKBD_PORT_ADD(KEYBOARD_TAG, default_sun_keyboard_devices, "sparckbd") + MCFG_SUNKBD_RXD_HANDLER(DEVWRITELINE(SCC1_TAG, z80scc_device, rxa_w)) // RS232 serial ports MCFG_SCC8530_ADD(SCC2_TAG, XTAL_4_9152MHz, 0, 0, 0, 0) @@ -1663,10 +1658,10 @@ static MACHINE_CONFIG_START( sun4c, sun4_state ) // Keyboard/mouse MCFG_SCC8530_ADD(SCC1_TAG, XTAL_4_9152MHz, 0, 0, 0, 0) MCFG_Z80SCC_OUT_INT_CB(WRITELINE(sun4_state, scc1_int)) - MCFG_Z80SCC_OUT_TXDA_CB(DEVWRITELINE(KEYBOARD_TAG, rs232_port_device, write_txd)) + MCFG_Z80SCC_OUT_TXDA_CB(DEVWRITELINE(KEYBOARD_TAG, sun_keyboard_port_device, write_txd)) - MCFG_RS232_PORT_ADD(KEYBOARD_TAG, keyboard_devices, "keyboard") - MCFG_RS232_RXD_HANDLER(DEVWRITELINE(SCC1_TAG, z80scc_device, rxa_w)) + MCFG_SUNKBD_PORT_ADD(KEYBOARD_TAG, default_sun_keyboard_devices, "sparckbd") + MCFG_SUNKBD_RXD_HANDLER(DEVWRITELINE(SCC1_TAG, z80scc_device, rxa_w)) // RS232 serial ports MCFG_SCC8530_ADD(SCC2_TAG, XTAL_4_9152MHz, 0, 0, 0, 0)