Make Sun keyboard port its own bus [Vas Crabb]

This commit is contained in:
Vas Crabb 2016-07-21 02:24:06 +10:00
parent 9711a68c54
commit 19ce9fd41a
7 changed files with 195 additions and 25 deletions

View File

@ -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

View File

@ -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

View File

@ -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);

View File

@ -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

View File

@ -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::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<device_sun_keyboard_port_interface *>(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<sun_keyboard_port_device *>(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

View File

@ -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 <class Object> static devcb_base &set_rxd_handler(device_t &device, Object object) { return downcast<sun_keyboard_port_device &>(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

View File

@ -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)