1 // license:BSD-3-Clause
2 // copyright-holders:Curt Coder
3 /**********************************************************************
4 
5     Luxor ABC-55/77 keyboard emulation
6 
7 *********************************************************************/
8 
9 #ifndef MAME_BUS_ABCKB_ABC77_H
10 #define MAME_BUS_ABCKB_ABC77_H
11 
12 #pragma once
13 
14 #include "abckb.h"
15 
16 #include "cpu/mcs48/mcs48.h"
17 #include "machine/watchdog.h"
18 #include "sound/discrete.h"
19 #include "sound/spkrdev.h"
20 
21 
22 
23 //**************************************************************************
24 //  TYPE DEFINITIONS
25 //**************************************************************************
26 
27 // ======================> abc77_device
28 
29 class abc77_device :  public device_t, public abc_keyboard_interface
30 {
31 public:
32 	// construction/destruction
33 	abc77_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock);
34 
35 	DECLARE_INPUT_CHANGED_MEMBER( keyboard_reset );
36 
37 protected:
38 	abc77_device(const machine_config &mconfig, device_type type, const char *tag, device_t *owner, uint32_t clock);
39 
40 	// device-level overrides
41 	virtual void device_start() override;
42 	virtual void device_reset() override;
43 	virtual void device_timer(emu_timer &timer, device_timer_id id, int param, void *ptr) override;
44 
45 	// optional information overrides
46 	virtual const tiny_rom_entry *device_rom_region() const override;
47 	virtual void device_add_mconfig(machine_config &config) override;
48 	virtual ioport_constructor device_input_ports() const override;
49 
50 	// abc_keyboard_interface overrides
51 	virtual void txd_w(int state) override;
52 
53 private:
54 	enum
55 	{
56 		TIMER_SERIAL,
57 		TIMER_RESET
58 	};
59 
60 	inline void serial_output(int state);
61 	inline void serial_clock();
62 	inline void key_down(int state);
63 
64 	required_device<i8035_device> m_maincpu;
65 	required_device<watchdog_timer_device> m_watchdog;
66 	required_device<discrete_sound_device> m_discrete;
67 	required_ioport_array<12> m_x;
68 	required_ioport m_dsw;
69 
70 	int m_txd;                      // transmit data
71 	int m_keylatch;                 // keyboard row latch
72 	int m_keydown;                  // key down
73 	int m_clock;                    // transmit clock
74 	int m_hys;                      // hysteresis
75 	int m_stb;                      // strobe
76 	uint8_t m_j3;
77 
78 	// timers
79 	emu_timer *m_serial_timer;
80 	emu_timer *m_reset_timer;
81 
82 	uint8_t p1_r();
83 	void p2_w(uint8_t data);
84 	DECLARE_READ_LINE_MEMBER( t1_r );
85 	DECLARE_WRITE_LINE_MEMBER( prog_w );
86 	void j3_w(uint8_t data);
87 
88 	void abc77_io(address_map &map);
89 	void abc77_map(address_map &map);
90 };
91 
92 
93 class abc55_device :  public abc77_device
94 {
95 public:
96 	// construction/destruction
97 	abc55_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock);
98 
99 	// optional information overrides
100 	virtual ioport_constructor device_input_ports() const override;
101 };
102 
103 
104 // device type definition
105 DECLARE_DEVICE_TYPE(ABC77, abc77_device)
106 DECLARE_DEVICE_TYPE(ABC55, abc55_device)
107 
108 
109 #endif // MAME_BUS_ABCKB_ABC77_H
110