diff options
author | Dirk Best <mail@dirk-best.de> | 2016-07-30 10:54:01 +0200 |
---|---|---|
committer | Dirk Best <mail@dirk-best.de> | 2016-07-30 11:17:07 +0200 |
commit | c597f40d83f099bb0bad601bf4787541b8f7ba09 (patch) | |
tree | fa49e2c1cdfcf2f67724792d704c0eea7da1a3a6 | |
parent | 412ca1644c63a6ec9f02786d7755f7f019f5a0b6 (diff) |
apricot: create bus interface for the keyboard interface, make hle keyboard emulation a bus device
-rw-r--r-- | scripts/src/bus.lua | 17 | ||||
-rw-r--r-- | scripts/target/mame/mess.lua | 3 | ||||
-rw-r--r-- | src/devices/bus/apricot/keyboard/hle.cpp (renamed from src/mame/machine/apricotkb_hle.cpp) | 10 | ||||
-rw-r--r-- | src/devices/bus/apricot/keyboard/hle.h (renamed from src/mame/machine/apricotkb_hle.h) | 28 | ||||
-rw-r--r-- | src/devices/bus/apricot/keyboard/keyboard.cpp | 105 | ||||
-rw-r--r-- | src/devices/bus/apricot/keyboard/keyboard.h | 109 | ||||
-rw-r--r-- | src/mame/drivers/apricot.cpp | 10 |
7 files changed, 248 insertions, 34 deletions
diff --git a/scripts/src/bus.lua b/scripts/src/bus.lua index 95cbd15ac47..1997bdf0cf5 100644 --- a/scripts/src/bus.lua +++ b/scripts/src/bus.lua @@ -153,7 +153,7 @@ end --------------------------------------------------- -- ---@src/devices/bus/apricot/expansion.h,BUSES["APRICOT_EXPANSION"] = true +--@src/devices/bus/apricot/expansion/expansion.h,BUSES["APRICOT_EXPANSION"] = true --------------------------------------------------- if (BUSES["APRICOT_EXPANSION"]~=null) then @@ -170,6 +170,21 @@ end --------------------------------------------------- -- +--@src/devices/bus/apricot/keyboard/keyboard.h,BUSES["APRICOT_KEYBOARD"] = true +--------------------------------------------------- + +if (BUSES["APRICOT_KEYBOARD"]~=null) then + files { + MAME_DIR .. "src/devices/bus/apricot/keyboard/keyboard.cpp", + MAME_DIR .. "src/devices/bus/apricot/keyboard/keyboard.h", + MAME_DIR .. "src/devices/bus/apricot/keyboard/hle.cpp", + MAME_DIR .. "src/devices/bus/apricot/keyboard/hle.h", + } +end + + +--------------------------------------------------- +-- --@src/devices/bus/arcadia/slot.h,BUSES["ARCADIA"] = true --------------------------------------------------- diff --git a/scripts/target/mame/mess.lua b/scripts/target/mame/mess.lua index 2695224e692..e78baadfdc6 100644 --- a/scripts/target/mame/mess.lua +++ b/scripts/target/mame/mess.lua @@ -602,6 +602,7 @@ BUSES["ADAM"] = true BUSES["ADAMNET"] = true BUSES["APF"] = true BUSES["APRICOT_EXPANSION"] = true +BUSES["APRICOT_KEYBOARD"] = true BUSES["ARCADIA"] = true BUSES["ASTROCADE"] = true BUSES["BBC_ANALOGUE"] = true @@ -1133,8 +1134,6 @@ files { MAME_DIR .. "src/mame/drivers/apricotp.cpp", MAME_DIR .. "src/mame/machine/apricotkb.cpp", MAME_DIR .. "src/mame/machine/apricotkb.h", - MAME_DIR .. "src/mame/machine/apricotkb_hle.cpp", - MAME_DIR .. "src/mame/machine/apricotkb_hle.h", MAME_DIR .. "src/mame/drivers/victor9k.cpp", MAME_DIR .. "src/mame/includes/victor9k.h", MAME_DIR .. "src/mame/machine/victor9kb.cpp", diff --git a/src/mame/machine/apricotkb_hle.cpp b/src/devices/bus/apricot/keyboard/hle.cpp index 7bf5531454c..c940b269233 100644 --- a/src/mame/machine/apricotkb_hle.cpp +++ b/src/devices/bus/apricot/keyboard/hle.cpp @@ -44,7 +44,7 @@ ***************************************************************************/ -#include "apricotkb_hle.h" +#include "hle.h" //************************************************************************** @@ -190,8 +190,8 @@ ioport_constructor apricot_keyboard_hle_device::device_input_ports() const apricot_keyboard_hle_device::apricot_keyboard_hle_device(const machine_config &mconfig, const char *tag, device_t *owner, UINT32 clock) : device_t(mconfig, APRICOT_KEYBOARD_HLE, "Apricot Keyboard (HLE)", tag, owner, clock, "apricotkb_hle", __FILE__), + device_apricot_keyboard_interface(mconfig, *this), device_serial_interface(mconfig, *this), - m_txd_handler(*this), m_rxd(1), m_data_in(0), m_data_out(0) @@ -204,8 +204,6 @@ apricot_keyboard_hle_device::apricot_keyboard_hle_device(const machine_config &m void apricot_keyboard_hle_device::device_start() { - // resolve callbacks - m_txd_handler.resolve_safe(); } //------------------------------------------------- @@ -233,7 +231,7 @@ void apricot_keyboard_hle_device::device_timer(emu_timer &timer, device_timer_id void apricot_keyboard_hle_device::tra_callback() { - m_txd_handler(transmit_register_get_data_bit()); + m_host->in_w(transmit_register_get_data_bit()); } void apricot_keyboard_hle_device::tra_complete() @@ -260,7 +258,7 @@ void apricot_keyboard_hle_device::rcv_complete() // transmit_register_setup(0xfb); } -WRITE_LINE_MEMBER( apricot_keyboard_hle_device::rxd_w ) +void apricot_keyboard_hle_device::out_w(int state) { m_rxd = state; device_serial_interface::rx_w(m_rxd); diff --git a/src/mame/machine/apricotkb_hle.h b/src/devices/bus/apricot/keyboard/hle.h index 5a5189c9247..e6ce8ee9df5 100644 --- a/src/mame/machine/apricotkb_hle.h +++ b/src/devices/bus/apricot/keyboard/hle.h @@ -8,20 +8,11 @@ #pragma once -#ifndef __APRICOTKB_HLE__ -#define __APRICOTKB_HLE__ +#ifndef __APRICOT_KEYBOARD_HLE_H__ +#define __APRICOT_KEYBOARD_HLE_H__ #include "emu.h" - -//************************************************************************** -// INTERFACE CONFIGURATION MACROS -//************************************************************************** - -#define MCFG_APRICOT_KEYBOARD_ADD(_tag) \ - MCFG_DEVICE_ADD(_tag, APRICOT_KEYBOARD_HLE, 0) - -#define MCFG_APRICOT_KEYBOARD_TXD_HANDLER(_write) \ - devcb = &apricot_keyboard_hle_device::set_txd_handler(*device, DEVCB_##_write); +#include "keyboard.h" //************************************************************************** @@ -30,18 +21,17 @@ // ======================> apricot_keyboard_hle_device -class apricot_keyboard_hle_device : public device_t, public device_serial_interface +class apricot_keyboard_hle_device : public device_t, public device_apricot_keyboard_interface, public device_serial_interface { public: // construction/destruction apricot_keyboard_hle_device(const machine_config &mconfig, const char *tag, device_t *owner, UINT32 clock); - template<class _Object> static devcb_base &set_txd_handler(device_t &device, _Object object) - { return downcast<apricot_keyboard_hle_device &>(device).m_txd_handler.set_callback(object); } - - DECLARE_WRITE_LINE_MEMBER(rxd_w); DECLARE_INPUT_CHANGED_MEMBER(key_callback); + // from host + virtual void out_w(int state) override; + protected: // device_t overrides virtual ioport_constructor device_input_ports() const override; @@ -57,8 +47,6 @@ protected: virtual void device_timer(emu_timer &timer, device_timer_id id, int param, void *ptr) override; private: - devcb_write_line m_txd_handler; - int m_rxd; UINT8 m_data_in; @@ -70,4 +58,4 @@ private: extern const device_type APRICOT_KEYBOARD_HLE; -#endif // __APRICOTKB_HLE__ +#endif // __APRICOT_KEYBOARD_HLE_H__ diff --git a/src/devices/bus/apricot/keyboard/keyboard.cpp b/src/devices/bus/apricot/keyboard/keyboard.cpp new file mode 100644 index 00000000000..d970f187c4f --- /dev/null +++ b/src/devices/bus/apricot/keyboard/keyboard.cpp @@ -0,0 +1,105 @@ +// license:GPL-2.0+ +// copyright-holders:Dirk Best +/*************************************************************************** + + ACT Apricot Keyboard Interface + +***************************************************************************/ + +#include "keyboard.h" +#include "hle.h" + + +//************************************************************************** +// DEVICE DEFINITIONS +//************************************************************************** + +const device_type APRICOT_KEYBOARD_INTERFACE = &device_creator<apricot_keyboard_device>; + + +//************************************************************************** +// SLOT DEVICE +//************************************************************************** + +//------------------------------------------------- +// apricot_keyboard_device - constructor +//------------------------------------------------- + +apricot_keyboard_device::apricot_keyboard_device(const machine_config &mconfig, const char *tag, device_t *owner, UINT32 clock) : + device_t(mconfig, APRICOT_KEYBOARD_INTERFACE, "Apricot Keyboard Interface", tag, owner, clock, "apricot_kbd", __FILE__), + device_slot_interface(mconfig, *this), + m_kbd(nullptr), + m_in_handler(*this) +{ +} + +//------------------------------------------------- +// apricot_keyboard_device - destructor +//------------------------------------------------- + +apricot_keyboard_device::~apricot_keyboard_device() +{ +} + +//------------------------------------------------- +// device_start - device-specific startup +//------------------------------------------------- + +void apricot_keyboard_device::device_start() +{ + // get connected keyboard + m_kbd = dynamic_cast<device_apricot_keyboard_interface *>(get_card_device()); + + // resolve callbacks + m_in_handler.resolve_safe(); +} + +//------------------------------------------------- +// device_reset - device-specific reset +//------------------------------------------------- + +void apricot_keyboard_device::device_reset() +{ +} + +//------------------------------------------------- +// host to module interface +//------------------------------------------------- + +WRITE_LINE_MEMBER( apricot_keyboard_device::out_w ) +{ + if (m_kbd) + m_kbd->out_w(state); +} + + +//************************************************************************** +// KEYBOARD INTERFACE +//************************************************************************** + +//------------------------------------------------- +// device_apricot_keyboard_interface - constructor +//------------------------------------------------- + +device_apricot_keyboard_interface::device_apricot_keyboard_interface(const machine_config &mconfig, device_t &device) : + device_slot_card_interface(mconfig, device) +{ + m_host = dynamic_cast<apricot_keyboard_device *>(device.owner()); +} + +//------------------------------------------------- +// ~device_apricot_keyboard_interface - destructor +//------------------------------------------------- + +device_apricot_keyboard_interface::~device_apricot_keyboard_interface() +{ +} + + +//************************************************************************** +// SLOT INTERFACE +//************************************************************************** + +SLOT_INTERFACE_START( apricot_keyboard_devices ) + SLOT_INTERFACE("hle", APRICOT_KEYBOARD_HLE) +SLOT_INTERFACE_END diff --git a/src/devices/bus/apricot/keyboard/keyboard.h b/src/devices/bus/apricot/keyboard/keyboard.h new file mode 100644 index 00000000000..851ea954b3b --- /dev/null +++ b/src/devices/bus/apricot/keyboard/keyboard.h @@ -0,0 +1,109 @@ +// license:GPL-2.0+ +// copyright-holders:Dirk Best +/*************************************************************************** + + ACT Apricot Keyboard Interface + + Host interface: 9-pin D-SUB + + 1 +12V + 2 OUT + 3 IN + 4 N/C + 5 N/C + 6 GND + 7 -12V + 8 0V + 9 N/C + + Keyboard interface: + + A 0V + B +12V + C -12V + D N/C + E OUT + F IN + +***************************************************************************/ + +#pragma once + +#ifndef __APRICOT_KEYBOARD_H__ +#define __APRICOT_KEYBOARD_H__ + +#include "emu.h" + + +//************************************************************************** +// INTERFACE CONFIGURATION MACROS +//************************************************************************** + +#define MCFG_APRICOT_KEYBOARD_INTERFACE_ADD(_tag, _def_slot) \ + MCFG_DEVICE_ADD(_tag, APRICOT_KEYBOARD_INTERFACE, 0) \ + MCFG_DEVICE_SLOT_INTERFACE(apricot_keyboard_devices, _def_slot, false) + +#define MCFG_APRICOT_KEYBOARD_IN_HANDLER(_devcb) \ + devcb = &apricot_keyboard_device::set_in_handler(*device, DEVCB_##_devcb); + + +//************************************************************************** +// TYPE DEFINITIONS +//************************************************************************** + +class device_apricot_keyboard_interface; + +// ======================> apricot_keyboard_device + +class apricot_keyboard_device : public device_t, public device_slot_interface +{ +public: + // construction/destruction + apricot_keyboard_device(const machine_config &mconfig, const char *tag, device_t *owner, UINT32 clock); + virtual ~apricot_keyboard_device(); + + // callbacks + template<class _Object> static devcb_base &set_in_handler(device_t &device, _Object object) + { return downcast<apricot_keyboard_device &>(device).m_in_handler.set_callback(object); } + + // called from keyboard + DECLARE_WRITE_LINE_MEMBER( in_w ) { m_in_handler(state); } + + // called from host + DECLARE_WRITE_LINE_MEMBER( out_w ); + +protected: + // device-level overrides + virtual void device_start() override; + virtual void device_reset() override; + +private: + device_apricot_keyboard_interface *m_kbd; + + devcb_write_line m_in_handler; +}; + +// ======================> device_apricot_keyboard_interface + +class device_apricot_keyboard_interface : public device_slot_card_interface +{ +public: + // construction/destruction + device_apricot_keyboard_interface(const machine_config &mconfig, device_t &device); + virtual ~device_apricot_keyboard_interface(); + + virtual void out_w(int state) {}; + +protected: + apricot_keyboard_device *m_host; +}; + + +// device type definition +extern const device_type APRICOT_KEYBOARD_INTERFACE; + +// supported devices +SLOT_INTERFACE_EXTERN( apricot_keyboard_devices ); + + +#endif // __APRICOT_KEYBOARD_H__ diff --git a/src/mame/drivers/apricot.cpp b/src/mame/drivers/apricot.cpp index 0c6d084f090..a390d2ce32f 100644 --- a/src/mame/drivers/apricot.cpp +++ b/src/mame/drivers/apricot.cpp @@ -19,12 +19,12 @@ #include "machine/wd_fdc.h" #include "video/mc6845.h" #include "sound/sn76496.h" -#include "machine/apricotkb_hle.h" #include "imagedev/flopdrv.h" #include "formats/apridisk.h" #include "bus/centronics/ctronics.h" #include "bus/rs232/rs232.h" #include "bus/apricot/expansion/expansion.h" +#include "bus/apricot/keyboard/keyboard.h" //************************************************************************** @@ -434,7 +434,7 @@ static MACHINE_CONFIG_START( apricot, apricot_state ) MCFG_Z80DART_OUT_DTRA_CB(DEVWRITELINE("rs232", rs232_port_device, write_dtr)) MCFG_Z80DART_OUT_RTSA_CB(DEVWRITELINE("rs232", rs232_port_device, write_rts)) MCFG_Z80DART_OUT_WRDYA_CB(DEVWRITELINE("ic71", i8089_device, drq2_w)) - MCFG_Z80DART_OUT_TXDB_CB(DEVWRITELINE("keyboard", apricot_keyboard_hle_device, rxd_w)) + MCFG_Z80DART_OUT_TXDB_CB(DEVWRITELINE("kbd", apricot_keyboard_device, out_w)) MCFG_Z80DART_OUT_DTRB_CB(WRITELINE(apricot_state, data_selector_dtr_w)) MCFG_Z80DART_OUT_RTSB_CB(WRITELINE(apricot_state, data_selector_rts_w)) MCFG_Z80DART_OUT_INT_CB(DEVWRITELINE("ic31", pic8259_device, ir5_w)) @@ -448,9 +448,9 @@ static MACHINE_CONFIG_START( apricot, apricot_state ) MCFG_RS232_DSR_HANDLER(DEVWRITELINE("ic15", z80sio0_device, synca_w)) MCFG_RS232_CTS_HANDLER(DEVWRITELINE("ic15", z80sio0_device, ctsa_w)) - // keyboard (hle) - MCFG_APRICOT_KEYBOARD_ADD("keyboard") - MCFG_APRICOT_KEYBOARD_TXD_HANDLER(DEVWRITELINE("ic15", z80sio0_device, rxb_w)) + // keyboard + MCFG_APRICOT_KEYBOARD_INTERFACE_ADD("kbd", "hle") + MCFG_APRICOT_KEYBOARD_IN_HANDLER(DEVWRITELINE("ic15", z80sio0_device, rxb_w)) // centronics printer MCFG_CENTRONICS_ADD("centronics", centronics_devices, "printer") |