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