1 // license:BSD-3-Clause
2 // copyright-holders:Vas Crabb
3 /***************************************************************************
4 
5     Amiga 2000 Keyboard
6 
7  ***************************************************************************/
8 
9 #ifndef MAME_BUS_AMIGA_KEYBOARD_A2000_H
10 #define MAME_BUS_AMIGA_KEYBOARD_A2000_H
11 
12 #pragma once
13 
14 #include "keyboard.h"
15 
16 
17 namespace bus { namespace amiga { namespace keyboard {
18 
19 //**************************************************************************
20 //  TYPE DECLARATIONS
21 //**************************************************************************
22 
23 // ======================> a2000_kbd_g80_device
24 
25 class a2000_kbd_g80_device : public device_t, public device_amiga_keyboard_interface
26 {
27 public:
28 	// from host
29 	virtual DECLARE_WRITE_LINE_MEMBER(kdat_w) override;
30 
31 protected:
32 	// construction/destruction
33 	a2000_kbd_g80_device(machine_config const &mconfig, device_type type, char const *tag, device_t *owner, uint32_t clock);
34 
35 	// MCU I/O
36 	u8 mcu_bus_r(offs_t offset);
37 	void mcu_p1_w(u8 data);
38 	void mcu_p2_w(u8 data);
39 
40 	virtual const tiny_rom_entry *device_rom_region() const override;
41 	virtual void device_add_mconfig(machine_config &config) override;
42 
43 	virtual void device_start() override;
44 	virtual void device_reset() override;
45 
46 	void program_map(address_map &map);
47 	void ext_map(address_map &map);
48 
49 private:
50 	required_ioport_array<13>   m_rows;
51 	required_device<cpu_device> m_mcu;
52 	output_finder<>             m_led_kbd_caps;
53 
54 	uint16_t                    m_row_drive;
55 	bool                        m_host_kdat, m_mcu_kdat, m_mcu_kclk;
56 };
57 
58 // ======================> a2000_kbd_g80_us_device
59 
60 class a2000_kbd_g80_us_device : public a2000_kbd_g80_device
61 {
62 public:
63 	a2000_kbd_g80_us_device(machine_config const &mconfig, char const *tag, device_t *owner, uint32_t clock);
64 
65 protected:
66 	virtual ioport_constructor device_input_ports() const override;
67 };
68 
69 // ======================> a2000_kbd_g80_de_device
70 
71 class a2000_kbd_g80_de_device : public a2000_kbd_g80_device
72 {
73 public:
74 	a2000_kbd_g80_de_device(machine_config const &mconfig, char const *tag, device_t *owner, uint32_t clock);
75 
76 protected:
77 	virtual ioport_constructor device_input_ports() const override;
78 };
79 
80 // ======================> a2000_kbd_g80_se_device
81 
82 class a2000_kbd_g80_se_device : public a2000_kbd_g80_device
83 {
84 public:
85 	a2000_kbd_g80_se_device(machine_config const &mconfig, char const *tag, device_t *owner, uint32_t clock);
86 
87 protected:
88 	virtual ioport_constructor device_input_ports() const override;
89 };
90 
91 // ======================> a2000_kbd_g80_dk_device
92 
93 class a2000_kbd_g80_dk_device : public a2000_kbd_g80_device
94 {
95 public:
96 	a2000_kbd_g80_dk_device(machine_config const &mconfig, char const *tag, device_t *owner, uint32_t clock);
97 
98 protected:
99 	virtual ioport_constructor device_input_ports() const override;
100 };
101 
102 // ======================> a2000_kbd_g80_gb_device
103 
104 class a2000_kbd_g80_gb_device : public a2000_kbd_g80_device
105 {
106 public:
107 	a2000_kbd_g80_gb_device(machine_config const &mconfig, char const *tag, device_t *owner, uint32_t clock);
108 
109 protected:
110 	virtual ioport_constructor device_input_ports() const override;
111 };
112 
113 } } } // namespace bus::amiga::keyboard
114 
115 
116 //**************************************************************************
117 //  GLOBAL VARIABLES
118 //**************************************************************************
119 
120 DECLARE_DEVICE_TYPE_NS(A2000_KBD_G80_US, bus::amiga::keyboard, a2000_kbd_g80_us_device)
121 DECLARE_DEVICE_TYPE_NS(A2000_KBD_G80_DE, bus::amiga::keyboard, a2000_kbd_g80_de_device)
122 DECLARE_DEVICE_TYPE_NS(A2000_KBD_G80_SE, bus::amiga::keyboard, a2000_kbd_g80_se_device)
123 DECLARE_DEVICE_TYPE_NS(A2000_KBD_G80_DK, bus::amiga::keyboard, a2000_kbd_g80_dk_device)
124 DECLARE_DEVICE_TYPE_NS(A2000_KBD_G80_GB, bus::amiga::keyboard, a2000_kbd_g80_gb_device)
125 
126 #endif // MAME_BUS_AMIGA_KEYBOARD_A2000_H
127