1 // license:BSD-3-Clause
2 // copyright-holders:Nicola Salmoria
3 /*************************************************************************
4 
5     taitoio.h
6 
7     Implementation of various Taito custom I/O ICs
8 
9 **************************************************************************/
10 
11 #ifndef MAME_MACHINE_TAITOIO_H
12 #define MAME_MACHINE_TAITOIO_H
13 
14 #pragma once
15 
16 #include "machine/watchdog.h"
17 
18 
19 class tc0040ioc_device : public device_t
20 {
21 public:
22 	tc0040ioc_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock);
23 
read_0_callback()24 	auto read_0_callback() { return m_read_0_cb.bind(); }
read_1_callback()25 	auto read_1_callback() { return m_read_1_cb.bind(); }
read_2_callback()26 	auto read_2_callback() { return m_read_2_cb.bind(); }
read_3_callback()27 	auto read_3_callback() { return m_read_3_cb.bind(); }
write_4_callback()28 	auto write_4_callback() { return m_write_4_cb.bind(); }
read_7_callback()29 	auto read_7_callback() { return m_read_7_cb.bind(); }
30 
31 	u8 read(offs_t offset);
32 	void write(offs_t offset, u8 data);
33 	u8 watchdog_r();
34 	u8 port_r();
35 	void port_w(u8 data);
36 	u8 portreg_r();
37 	void portreg_w(u8 data);
38 
39 protected:
40 	// device-level overrides
41 	virtual void device_start() override;
42 	virtual void device_reset() override;
43 	virtual void device_add_mconfig(machine_config &config) override;
44 
45 private:
46 	// internal state
47 	u8      m_regs[8];
48 	u8      m_port;
49 
50 	required_device<watchdog_timer_device> m_watchdog;
51 
52 	devcb_read8 m_read_0_cb;
53 	devcb_read8 m_read_1_cb;
54 	devcb_read8 m_read_2_cb;
55 	devcb_read8 m_read_3_cb;
56 	devcb_write8 m_write_4_cb;
57 	devcb_read8 m_read_7_cb;
58 };
59 
DECLARE_DEVICE_TYPE(TC0040IOC,tc0040ioc_device)60 DECLARE_DEVICE_TYPE(TC0040IOC, tc0040ioc_device)
61 
62 class tc0220ioc_device : public device_t
63 {
64 public:
65 	tc0220ioc_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock);
66 
67 	auto read_0_callback() { return m_read_0_cb.bind(); }
68 	auto read_1_callback() { return m_read_1_cb.bind(); }
69 	auto read_2_callback() { return m_read_2_cb.bind(); }
70 	auto read_3_callback() { return m_read_3_cb.bind(); }
71 	auto write_3_callback() { return m_write_3_cb.bind(); }
72 	auto write_4_callback() { return m_write_4_cb.bind(); }
73 	auto read_7_callback() { return m_read_7_cb.bind(); }
74 
75 	u8 read(offs_t offset);
76 	void write(offs_t offset, u8 data);
77 
78 protected:
79 	// device-level overrides
80 	virtual void device_start() override;
81 	virtual void device_reset() override;
82 	virtual void device_add_mconfig(machine_config &config) override;
83 
84 private:
85 	// internal state
86 	u8      m_regs[8];
87 
88 	required_device<watchdog_timer_device> m_watchdog;
89 
90 	devcb_read8 m_read_0_cb;
91 	devcb_read8 m_read_1_cb;
92 	devcb_read8 m_read_2_cb;
93 	devcb_read8 m_read_3_cb;
94 	devcb_write8 m_write_3_cb;
95 	devcb_write8 m_write_4_cb;
96 	devcb_read8 m_read_7_cb;
97 };
98 
DECLARE_DEVICE_TYPE(TC0220IOC,tc0220ioc_device)99 DECLARE_DEVICE_TYPE(TC0220IOC, tc0220ioc_device)
100 
101 class tc0510nio_device : public device_t
102 {
103 public:
104 	tc0510nio_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock);
105 
106 	auto read_0_callback() { return m_read_0_cb.bind(); }
107 	auto read_1_callback() { return m_read_1_cb.bind(); }
108 	auto read_2_callback() { return m_read_2_cb.bind(); }
109 	auto read_3_callback() { return m_read_3_cb.bind(); }
110 	auto write_3_callback() { return m_write_3_cb.bind(); }
111 	auto write_4_callback() { return m_write_4_cb.bind(); }
112 	auto read_7_callback() { return m_read_7_cb.bind(); }
113 
114 	u8 read(offs_t offset);
115 	void write(offs_t offset, u8 data);
116 	u16 halfword_r(offs_t offset);
117 	void halfword_w(offs_t offset, u16 data, u16 mem_mask = ~0);
118 	u16 halfword_wordswap_r(offs_t offset);
119 	void halfword_wordswap_w(offs_t offset, u16 data, u16 mem_mask = ~0);
120 
121 protected:
122 	// device-level overrides
123 	virtual void device_start() override;
124 	virtual void device_reset() override;
125 	virtual void device_add_mconfig(machine_config &config) override;
126 
127 private:
128 	// internal state
129 	u8   m_regs[8];
130 
131 	required_device<watchdog_timer_device> m_watchdog;
132 
133 	devcb_read8 m_read_0_cb;
134 	devcb_read8 m_read_1_cb;
135 	devcb_read8 m_read_2_cb;
136 	devcb_read8 m_read_3_cb;
137 	devcb_write8 m_write_3_cb;
138 	devcb_write8 m_write_4_cb;
139 	devcb_read8 m_read_7_cb;
140 };
141 
DECLARE_DEVICE_TYPE(TC0510NIO,tc0510nio_device)142 DECLARE_DEVICE_TYPE(TC0510NIO, tc0510nio_device)
143 
144 class tc0640fio_device : public device_t
145 {
146 public:
147 	tc0640fio_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock);
148 
149 	auto read_0_callback() { return m_read_0_cb.bind(); }
150 	auto read_1_callback() { return m_read_1_cb.bind(); }
151 	auto read_2_callback() { return m_read_2_cb.bind(); }
152 	auto read_3_callback() { return m_read_3_cb.bind(); }
153 	auto write_4_callback() { return m_write_4_cb.bind(); }
154 	auto read_7_callback() { return m_read_7_cb.bind(); }
155 
156 	u8 read(offs_t offset);
157 	void write(offs_t offset, u8 data);
158 	u16 halfword_r(offs_t offset);
159 	void halfword_w(offs_t offset, u16 data, u16 mem_mask = ~0);
160 	u16 halfword_byteswap_r(offs_t offset);
161 	void halfword_byteswap_w(offs_t offset, u16 data, u16 mem_mask = ~0);
162 
163 protected:
164 	// device-level overrides
165 	virtual void device_start() override;
166 	virtual void device_reset() override;
167 	virtual void device_add_mconfig(machine_config &config) override;
168 
169 	private:
170 	// internal state
171 	u8   m_regs[8];
172 
173 	required_device<watchdog_timer_device> m_watchdog;
174 
175 	devcb_read8 m_read_0_cb;
176 	devcb_read8 m_read_1_cb;
177 	devcb_read8 m_read_2_cb;
178 	devcb_read8 m_read_3_cb;
179 	devcb_write8 m_write_4_cb;
180 	devcb_read8 m_read_7_cb;
181 };
182 
183 DECLARE_DEVICE_TYPE(TC0640FIO, tc0640fio_device)
184 
185 #endif // MAME_MACHINE_TAITOIO_H
186