summaryrefslogtreecommitdiffstatshomepage
path: root/src/devices/bus/rc2014/rc2014.h
blob: 5dc190b805a6d477eb335e336499fefa154ea713 (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
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
// license:BSD-3-Clause
// copyright-holders:Miodrag Milanovic
/***************************************************************************

    RC2014 Bus Device

===========================================================================
 Standard Bus|        Extended Bus        |        RC80 RC2014 Bus
=============|============================|================================
 Pin Signal  |Pin Signal       Pin Signal |Pin #  Signal   Pin Signal
=============|============================|================================
 1   A15     |1   Not used     1   A15    |41  #41 (custom)  1   A15
 2   A14     |2   Not used     2   A14    |42  #42 (custom)  2   A14
 3   A13     |3   Not used     3   A13    |43  #43 (custom)  3   A13
 4   A12     |4   Not used     4   A12    |44  #44 (custom)  4   A12
 5   A11     |5   Not used     5   A11    |45  #45 (custom)  5   A11
 6   A10     |6   Not used     6   A10    |46  #46 (custom)  6   A10
 7   A9      |7   Not used     7   A9     |47  #47 (custom)  7   A9
 8   A8      |8   Not used     8   A8     |48  #48 (custom)  8   A8
 9   A7      |9   Not used     9   A7     |49  A23           9   A7
 10  A6      |10  Not used     10  A6     |50  A22           10  A6
 11  A5      |11  Not used     11  A5     |51  A21           11  A5
 12  A4      |12  Not used     12  A4     |52  A20           12  A4
 13  A3      |13  Not used     13  A3     |53  A19           13  A3
 14  A2      |14  Not used     14  A2     |54  A18           14  A2
 15  A1      |15  Not used     15  A1     |55  A17           15  A1
 16  A0      |16  Not used     16  A0     |56  A16           16  A0
 17  GND     |17  GND          17  GND    |57  GND           17  GND
 18  5V      |18  5V           18  5V     |58  5V            18  5V
 19  /M1     |19  /RFSH        19  /M1    |59  /RFSH         19  /M1
 20  /RESET  |20  PAGE(/RESET2)20  /RESET |60  PAGE          20  /RESET
 21  CLK     |21  CLK2         21  CLK    |61  CLK2          21  CLK
 22  /INT    |22  /BUSAK       22  /INT   |62  /BUSAK        22  /INT
 23  /MREQ   |23  /HALT        23  /MREQ  |63  /HALT         23  /MREQ
 24  /WR     |24  /BUSRQ       24  /WR    |64  /BUSRQ        24  /WR
 25  /RD     |25  /WAIT        25  /RD    |65  /WAIT         25  /RD
 26  /IORQ   |26  /NMI         26  /IORQ  |66  /NMI          26  /IORQ
 27  D0      |27  D8           27  D0     |67  #67 (custom)  27  D0
 28  D1      |28  D9           28  D1     |68  #68 (custom)  28  D1
 29  D2      |29  D10          29  D2     |69  #69 (custom)  29  D2
 30  D3      |30  D11          30  D3     |70  #70 (custom)  30  D3
 31  D4      |31  D12          31  D4     |71  #71 (custom)  31  D4
 32  D5      |32  D13          32  D5     |72  #72 (custom)  32  D5
 33  D6      |33  D14          33  D6     |73  #73 (custom)  33  D6
 34  D7      |34  D15          34  D7     |74  #74 (custom)  34  D7
 35  TX      |35  TX2          35  TX     |75  TX2           35  TX
 36  RX      |36  RX2          36  RX     |76  RX2           36  RX
 37  USER1   |37  USER5        37  USER1  |77  USER5         37  USER1
 38  USER2   |38  USER6        38  USER2  |78  USER6         38  USER2
 39  USER3   |39  USER7        39  USER3  |79  USER7         39  USER3
 40  USER4   |40  USER8        40  USER4  |80  USER8(IEI)    40  USER4(IEO)
===========================================================================

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

#ifndef MAME_BUS_RC2014_RC2014_H
#define MAME_BUS_RC2014_RC2014_H

#pragma once

#include "machine/z80daisy.h"

//**************************************************************************
//  TYPE DEFINITIONS
//**************************************************************************

//**************************************************************************
//  RC2014 Standard Bus
//**************************************************************************

// ======================> rc2014_bus_device

class rc2014_bus_device : public device_t
{
public:
	// construction/destruction
	rc2014_bus_device(const machine_config &mconfig, const char *tag, device_t *owner, const XTAL &clock);
	virtual ~rc2014_bus_device();

	auto clk_callback() { return m_clk.bind(); }
	auto int_callback() { return m_int.bind(); }
	auto tx_callback() { return m_tx.bind(); }
	auto rx_callback() { return m_rx.bind(); }
	auto user1_callback() { return m_user1.bind(); }
	auto user2_callback() { return m_user2.bind(); }
	auto user3_callback() { return m_user3.bind(); }
	auto user4_callback() { return m_user4.bind(); }

	DECLARE_WRITE_LINE_MEMBER( clk_w ) { m_clk(state); }
	DECLARE_WRITE_LINE_MEMBER( int_w ) { m_int(state); }
	DECLARE_WRITE_LINE_MEMBER( tx_w ) { m_tx(state); }
	DECLARE_WRITE_LINE_MEMBER( rx_w ) { m_rx(state); }
	DECLARE_WRITE_LINE_MEMBER( user1_w ) { m_user1(state); }
	DECLARE_WRITE_LINE_MEMBER( user2_w ) { m_user2(state); }
	DECLARE_WRITE_LINE_MEMBER( user3_w ) { m_user3(state); }
	DECLARE_WRITE_LINE_MEMBER( user4_w ) { m_user4(state); }

	void set_bus_clock(u32 clock);
	void set_bus_clock(const XTAL &xtal) { set_bus_clock(xtal.value()); }
	void assign_installer(int index, address_space_installer *installer);
	address_space_installer *installer(int index) const;
	void add_to_daisy_chain(std::string tag) { m_daisy.push_back(tag); }
	const z80_daisy_config* get_daisy_chain();

protected:
	rc2014_bus_device(const machine_config &mconfig, device_type type, const char *tag, device_t *owner, const XTAL &clock);
	// device-level overrides
	virtual void device_start() override;
	virtual void device_reset() override;

private:
	address_space_installer *m_installer[4];
	devcb_write_line m_clk;
	devcb_write_line m_int;
	devcb_write_line m_tx;
	devcb_write_line m_rx;
	devcb_write_line m_user1;
	devcb_write_line m_user2;
	devcb_write_line m_user3;
	devcb_write_line m_user4;
	std::vector<std::string> m_daisy;
	char **m_daisy_chain;
};

// ======================> device_rc2014_card_interface

class rc2014_slot_device;

class device_rc2014_card_interface : public device_interface
{
	friend class rc2014_slot_device;

public:
	// construction/destruction
	device_rc2014_card_interface(const machine_config &mconfig, device_t &device);
protected:
	void set_bus_device(rc2014_bus_device *bus_device);

	rc2014_bus_device  *m_bus;
};

// ======================> rc2014_slot_device

class rc2014_slot_device : public device_t, public device_slot_interface
{
public:
	rc2014_slot_device(machine_config const &mconfig, char const *tag, device_t *owner, const XTAL &clock);

	template <typename T, typename U>
	rc2014_slot_device(machine_config const &mconfig, char const *tag, device_t *owner, T &&bus_tag, U &&slot_options, char const *default_option, bool fixed = false)
		: rc2014_slot_device(mconfig, tag, owner, DERIVED_CLOCK(1,1))
	{
		m_bus.set_tag(std::forward<T>(bus_tag));
		option_reset();
		slot_options(*this);
		set_default_option(default_option);
		set_fixed(fixed);
	}

protected:
	rc2014_slot_device(machine_config const &mconfig, device_type type, char const *tag, device_t *owner, const XTAL &clock);
	// device-level overrides
	virtual void device_start() override;
	virtual void device_resolve_objects() override;

	required_device<rc2014_bus_device> m_bus;
};

//**************************************************************************
//  RC2014 Extended Bus
//**************************************************************************

// ======================> rc2014_ext_bus_device

class rc2014_ext_bus_device : public rc2014_bus_device
{
public:
	// construction/destruction
	rc2014_ext_bus_device(const machine_config &mconfig, const char *tag, device_t *owner, const XTAL &clock);

	auto clk2_callback() { return m_clk2.bind(); }
	auto page_callback() { return m_page.bind(); }
	auto nmi_callback() { return m_nmi.bind(); }
	auto tx2_callback() { return m_tx2.bind(); }
	auto rx2_callback() { return m_rx2.bind(); }
	auto user5_callback() { return m_user5.bind(); }
	auto user6_callback() { return m_user6.bind(); }
	auto user7_callback() { return m_user7.bind(); }
	auto user8_callback() { return m_user8.bind(); }

	DECLARE_WRITE_LINE_MEMBER( clk2_w ) { m_clk2(state); }
	DECLARE_WRITE_LINE_MEMBER( page_w ) { m_page(state); }
	DECLARE_WRITE_LINE_MEMBER( nmi_w ) { m_nmi(state); }
	DECLARE_WRITE_LINE_MEMBER( tx2_w ) { m_tx2(state); }
	DECLARE_WRITE_LINE_MEMBER( rx2_w ) { m_rx2(state); }
	DECLARE_WRITE_LINE_MEMBER( user5_w ) { m_user5(state); }
	DECLARE_WRITE_LINE_MEMBER( user6_w ) { m_user6(state); }
	DECLARE_WRITE_LINE_MEMBER( user7_w ) { m_user7(state); }
	DECLARE_WRITE_LINE_MEMBER( user8_w ) { m_user8(state); }

protected:
	rc2014_ext_bus_device(const machine_config &mconfig, device_type type, const char *tag, device_t *owner, const XTAL &clock);
	// device-level overrides
	virtual void device_start() override;

private:
	devcb_write_line m_clk2;
	devcb_write_line m_page;
	devcb_write_line m_nmi;
	devcb_write_line m_tx2;
	devcb_write_line m_rx2;
	devcb_write_line m_user5;
	devcb_write_line m_user6;
	devcb_write_line m_user7;
	devcb_write_line m_user8;
};

// ======================> device_rc2014_ext_card_interface

class rc2014_ext_slot_device;

class device_rc2014_ext_card_interface : public device_rc2014_card_interface
{
	friend class rc2014_ext_slot_device;

protected:
	// construction/destruction
	device_rc2014_ext_card_interface(const machine_config &mconfig, device_t &device);

	void set_bus_device(rc2014_ext_bus_device *bus_device);

	rc2014_ext_bus_device  *m_bus;
};

// ======================> rc2014_ext_slot_device

class rc2014_ext_slot_device : public rc2014_slot_device
{
public:
	rc2014_ext_slot_device(machine_config const &mconfig, char const *tag, device_t *owner, const XTAL &clock);

	template <typename T, typename U>
	rc2014_ext_slot_device(machine_config const &mconfig, char const *tag, device_t *owner, T &&bus_tag, U &&slot_options, char const *default_option, bool fixed = false)
		: rc2014_ext_slot_device(mconfig, tag, owner, DERIVED_CLOCK(1,1))
	{
		m_bus.set_tag(std::forward<T>(bus_tag));
		option_reset();
		slot_options(*this);
		set_default_option(default_option);
		set_fixed(fixed);
	}

protected:
	rc2014_ext_slot_device(machine_config const &mconfig, device_type type, char const *tag, device_t *owner, const XTAL &clock);
	// device-level overrides
	virtual void device_start() override;
	virtual void device_resolve_objects() override;
};

//**************************************************************************
//  RC2014 RC80 Bus
//**************************************************************************

// ======================> rc2014_rc80_bus_device

class rc2014_rc80_bus_device : public rc2014_ext_bus_device
{
public:
	// construction/destruction
	rc2014_rc80_bus_device(const machine_config &mconfig, const char *tag, device_t *owner, const XTAL &clock);

protected:
	rc2014_rc80_bus_device(const machine_config &mconfig, device_type type, const char *tag, device_t *owner, const XTAL &clock);
	// device-level overrides
	virtual void device_start() override;
};

// ======================> device_rc2014_rc80_card_interface

class rc2014_rc80_slot_device;

class device_rc2014_rc80_card_interface : public device_rc2014_ext_card_interface
{
	friend class rc2014_rc80_slot_device;

protected:
	// construction/destruction
	device_rc2014_rc80_card_interface(const machine_config &mconfig, device_t &device);

	void set_bus_device(rc2014_rc80_bus_device *bus_device);

	rc2014_rc80_bus_device  *m_bus;
};

// ======================> rc2014_rc80_slot_device

class rc2014_rc80_slot_device : public rc2014_ext_slot_device
{
public:
	rc2014_rc80_slot_device(machine_config const &mconfig, char const *tag, device_t *owner, const XTAL &clock);

	template <typename T, typename U>
	rc2014_rc80_slot_device(machine_config const &mconfig, char const *tag, device_t *owner, T &&bus_tag, U &&slot_options, char const *default_option, bool fixed = false)
		: rc2014_rc80_slot_device(mconfig, tag, owner, DERIVED_CLOCK(1,1))
	{
		m_bus.set_tag(std::forward<T>(bus_tag));
		option_reset();
		slot_options(*this);
		set_default_option(default_option);
		set_fixed(fixed);
	}

protected:
	// device-level overrides
	virtual void device_start() override;
	virtual void device_resolve_objects() override;
};

// device type definition
DECLARE_DEVICE_TYPE(RC2014_BUS,  rc2014_bus_device)
DECLARE_DEVICE_TYPE(RC2014_SLOT, rc2014_slot_device)

DECLARE_DEVICE_TYPE(RC2014_EXT_BUS,  rc2014_ext_bus_device)
DECLARE_DEVICE_TYPE(RC2014_EXT_SLOT, rc2014_ext_slot_device)

DECLARE_DEVICE_TYPE(RC2014_RC80_BUS,  rc2014_rc80_bus_device)
DECLARE_DEVICE_TYPE(RC2014_RC80_SLOT, rc2014_rc80_slot_device)

#endif // MAME_BUS_RC2014_RC2014_H