1 // license:GPL-2.0+
2 // copyright-holders:Dirk Best
3 /***************************************************************************
4 
5     ACT Apricot Keyboard Interface
6 
7     Host interface: 9-pin D-SUB
8 
9     1  +12V
10     2  OUT
11     3  IN
12     4  N/C
13     5  N/C
14     6  GND
15     7  -12V
16     8  0V
17     9  N/C
18 
19     Keyboard interface:
20 
21     A  0V
22     B  +12V
23     C  -12V
24     D  N/C
25     E  OUT
26     F  IN
27 
28 ***************************************************************************/
29 
30 #ifndef MAME_BUS_APRICOT_KEYBOARD_KEYBOARD_H
31 #define MAME_BUS_APRICOT_KEYBOARD_KEYBOARD_H
32 
33 #pragma once
34 
35 
36 
37 //**************************************************************************
38 //  TYPE DEFINITIONS
39 //**************************************************************************
40 
41 class device_apricot_keyboard_interface;
42 
43 // ======================> apricot_keyboard_bus_device
44 
45 class apricot_keyboard_bus_device : public device_t, public device_single_card_slot_interface<device_apricot_keyboard_interface>
46 {
47 public:
48 	// construction/destruction
49 	template <typename T>
apricot_keyboard_bus_device(const machine_config & mconfig,const char * tag,device_t * owner,T && opts,const char * dflt)50 	apricot_keyboard_bus_device(const machine_config &mconfig, const char *tag, device_t *owner, T &&opts, const char *dflt)
51 		: apricot_keyboard_bus_device(mconfig, tag, owner, 0)
52 	{
53 		option_reset();
54 		opts(*this);
55 		set_default_option(dflt);
56 		set_fixed(false);
57 	}
58 	apricot_keyboard_bus_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock);
59 	virtual ~apricot_keyboard_bus_device();
60 
61 	// callbacks
in_handler()62 	auto in_handler() { return m_in_handler.bind(); }
63 
64 	// called from keyboard
DECLARE_WRITE_LINE_MEMBER(in_w)65 	DECLARE_WRITE_LINE_MEMBER( in_w ) { m_in_handler(state); }
66 
67 	// called from host
68 	DECLARE_WRITE_LINE_MEMBER( out_w );
69 
70 protected:
71 	// device-level overrides
72 	virtual void device_start() override;
73 
74 private:
75 	device_apricot_keyboard_interface *m_kbd;
76 
77 	devcb_write_line m_in_handler;
78 };
79 
80 // ======================> device_apricot_keyboard_interface
81 
82 class device_apricot_keyboard_interface : public device_interface
83 {
84 public:
85 	// construction/destruction
86 	virtual ~device_apricot_keyboard_interface();
87 
88 	virtual void out_w(int state) = 0;
89 
90 protected:
91 	device_apricot_keyboard_interface(const machine_config &mconfig, device_t &device);
92 
93 	apricot_keyboard_bus_device *m_host;
94 };
95 
96 
97 // device type definition
98 DECLARE_DEVICE_TYPE(APRICOT_KEYBOARD_INTERFACE, apricot_keyboard_bus_device)
99 
100 // supported devices
101 void apricot_keyboard_devices(device_slot_interface &device);
102 
103 
104 #endif // MAME_BUS_APRICOT_KEYBOARD_KEYBOARD_H
105