summaryrefslogtreecommitdiffstatshomepage
path: root/src/mame/machine/taitoio.h
blob: 1d864c18b78054c5831e1ef952aca659aadbb853 (plain) (blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
// license:BSD-3-Clause
// copyright-holders:Nicola Salmoria
/*************************************************************************

    taitoio.h

    Implementation of various Taito custom I/O ICs

**************************************************************************/

#ifndef MAME_MACHINE_TAITOIO_H
#define MAME_MACHINE_TAITOIO_H

#pragma once

#include "machine/watchdog.h"


class tc0040ioc_device : public device_t
{
public:
	tc0040ioc_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock);

	auto read_0_callback() { return m_read_0_cb.bind(); }
	auto read_1_callback() { return m_read_1_cb.bind(); }
	auto read_2_callback() { return m_read_2_cb.bind(); }
	auto read_3_callback() { return m_read_3_cb.bind(); }
	auto write_4_callback() { return m_write_4_cb.bind(); }
	auto read_7_callback() { return m_read_7_cb.bind(); }

	u8 read(offs_t offset);
	void write(offs_t offset, u8 data);
	u8 watchdog_r();
	u8 port_r();
	void port_w(u8 data);
	u8 portreg_r();
	void portreg_w(u8 data);

protected:
	// device-level overrides
	virtual void device_start() override;
	virtual void device_reset() override;
	virtual void device_add_mconfig(machine_config &config) override;

private:
	// internal state
	u8      m_regs[8];
	u8      m_port;

	required_device<watchdog_timer_device> m_watchdog;

	devcb_read8 m_read_0_cb;
	devcb_read8 m_read_1_cb;
	devcb_read8 m_read_2_cb;
	devcb_read8 m_read_3_cb;
	devcb_write8 m_write_4_cb;
	devcb_read8 m_read_7_cb;
};

DECLARE_DEVICE_TYPE(TC0040IOC, tc0040ioc_device)

class tc0220ioc_device : public device_t
{
public:
	tc0220ioc_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock);

	auto read_0_callback() { return m_read_0_cb.bind(); }
	auto read_1_callback() { return m_read_1_cb.bind(); }
	auto read_2_callback() { return m_read_2_cb.bind(); }
	auto read_3_callback() { return m_read_3_cb.bind(); }
	auto write_3_callback() { return m_write_3_cb.bind(); }
	auto write_4_callback() { return m_write_4_cb.bind(); }
	auto read_7_callback() { return m_read_7_cb.bind(); }

	u8 read(offs_t offset);
	void write(offs_t offset, u8 data);

protected:
	// device-level overrides
	virtual void device_start() override;
	virtual void device_reset() override;
	virtual void device_add_mconfig(machine_config &config) override;

private:
	// internal state
	u8      m_regs[8];

	required_device<watchdog_timer_device> m_watchdog;

	devcb_read8 m_read_0_cb;
	devcb_read8 m_read_1_cb;
	devcb_read8 m_read_2_cb;
	devcb_read8 m_read_3_cb;
	devcb_write8 m_write_3_cb;
	devcb_write8 m_write_4_cb;
	devcb_read8 m_read_7_cb;
};

DECLARE_DEVICE_TYPE(TC0220IOC, tc0220ioc_device)

class tc0510nio_device : public device_t
{
public:
	tc0510nio_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock);

	auto read_0_callback() { return m_read_0_cb.bind(); }
	auto read_1_callback() { return m_read_1_cb.bind(); }
	auto read_2_callback() { return m_read_2_cb.bind(); }
	auto read_3_callback() { return m_read_3_cb.bind(); }
	auto write_3_callback() { return m_write_3_cb.bind(); }
	auto write_4_callback() { return m_write_4_cb.bind(); }
	auto read_7_callback() { return m_read_7_cb.bind(); }

	u8 read(offs_t offset);
	void write(offs_t offset, u8 data);
	u16 halfword_r(offs_t offset);
	void halfword_w(offs_t offset, u16 data, u16 mem_mask = ~0);
	u16 halfword_wordswap_r(offs_t offset);
	void halfword_wordswap_w(offs_t offset, u16 data, u16 mem_mask = ~0);

protected:
	// device-level overrides
	virtual void device_start() override;
	virtual void device_reset() override;
	virtual void device_add_mconfig(machine_config &config) override;

private:
	// internal state
	u8   m_regs[8];

	required_device<watchdog_timer_device> m_watchdog;

	devcb_read8 m_read_0_cb;
	devcb_read8 m_read_1_cb;
	devcb_read8 m_read_2_cb;
	devcb_read8 m_read_3_cb;
	devcb_write8 m_write_3_cb;
	devcb_write8 m_write_4_cb;
	devcb_read8 m_read_7_cb;
};

DECLARE_DEVICE_TYPE(TC0510NIO, tc0510nio_device)

class tc0640fio_device : public device_t
{
public:
	tc0640fio_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock);

	auto read_0_callback() { return m_read_0_cb.bind(); }
	auto read_1_callback() { return m_read_1_cb.bind(); }
	auto read_2_callback() { return m_read_2_cb.bind(); }
	auto read_3_callback() { return m_read_3_cb.bind(); }
	auto write_4_callback() { return m_write_4_cb.bind(); }
	auto read_7_callback() { return m_read_7_cb.bind(); }

	u8 read(offs_t offset);
	void write(offs_t offset, u8 data);
	u16 halfword_r(offs_t offset);
	void halfword_w(offs_t offset, u16 data, u16 mem_mask = ~0);
	u16 halfword_byteswap_r(offs_t offset);
	void halfword_byteswap_w(offs_t offset, u16 data, u16 mem_mask = ~0);

protected:
	// device-level overrides
	virtual void device_start() override;
	virtual void device_reset() override;
	virtual void device_add_mconfig(machine_config &config) override;

	private:
	// internal state
	u8   m_regs[8];

	required_device<watchdog_timer_device> m_watchdog;

	devcb_read8 m_read_0_cb;
	devcb_read8 m_read_1_cb;
	devcb_read8 m_read_2_cb;
	devcb_read8 m_read_3_cb;
	devcb_write8 m_write_4_cb;
	devcb_read8 m_read_7_cb;
};

DECLARE_DEVICE_TYPE(TC0640FIO, tc0640fio_device)

#endif // MAME_MACHINE_TAITOIO_H