summaryrefslogtreecommitdiffstatshomepage
diff options
context:
space:
mode:
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
commitc597f40d83f099bb0bad601bf4787541b8f7ba09 (patch)
treefa49e2c1cdfcf2f67724792d704c0eea7da1a3a6
parent412ca1644c63a6ec9f02786d7755f7f019f5a0b6 (diff)
apricot: create bus interface for the keyboard interface, make hle keyboard emulation a bus device
-rw-r--r--scripts/src/bus.lua17
-rw-r--r--scripts/target/mame/mess.lua3
-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.cpp105
-rw-r--r--src/devices/bus/apricot/keyboard/keyboard.h109
-rw-r--r--src/mame/drivers/apricot.cpp10
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")