summaryrefslogtreecommitdiffstatshomepage
path: root/src/devices/bus/tiki100/exp.h
blob: e41b18e7831268e043fdc3e3a3a6c8dd854489a5 (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
// license:BSD-3-Clause
// copyright-holders:Curt Coder
/**********************************************************************

    TIKI-100 expansion bus emulation

**********************************************************************


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

#pragma once

#ifndef __TIKI100_BUS__
#define __TIKI100_BUS__

#include "emu.h"
#include "cpu/z80/z80daisy.h"



//**************************************************************************
//  CONSTANTS
//**************************************************************************

#define TIKI100_BUS_TAG      "tiki100bus"



//**************************************************************************
//  INTERFACE CONFIGURATION MACROS
//**************************************************************************

#define MCFG_TIKI100_BUS_ADD() \
	MCFG_DEVICE_ADD(TIKI100_BUS_TAG, TIKI100_BUS, 0)

#define MCFG_TIKI100_BUS_SLOT_ADD(_tag, _def_slot) \
	MCFG_DEVICE_ADD(_tag, TIKI100_BUS_SLOT, 0) \
	MCFG_DEVICE_SLOT_INTERFACE(tiki100_cards, _def_slot, false)


#define MCFG_TIKI100_BUS_IRQ_CALLBACK(_write) \
	devcb = &tiki100_bus_t::set_irq_wr_callback(*device, DEVCB_##_write);

#define MCFG_TIKI100_BUS_NMI_CALLBACK(_write) \
	devcb = &tiki100_bus_t::set_nmi_wr_callback(*device, DEVCB_##_write);

#define MCFG_TIKI100_BUS_BUSRQ_CALLBACK(_write) \
	devcb = &tiki100_bus_t::set_busrq_wr_callback(*device, DEVCB_##_write);

#define MCFG_TIKI100_BUS_IN_MREQ_CALLBACK(_read) \
	devcb = &tiki100_bus_t::set_mrq_rd_callback(*device, DEVCB_##_read);

#define MCFG_TIKI100_BUS_OUT_MREQ_CALLBACK(_write) \
	devcb = &tiki100_bus_t::set_mrq_wr_callback(*device, DEVCB_##_write);



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

// ======================> tiki100_bus_slot_t

class tiki100_bus_t;
class tiki100_bus_slot_t;


// ======================> device_tiki100bus_card_interface

class device_tiki100bus_card_interface : public device_slot_card_interface
{
	friend class tiki100_bus_t;

public:
	// construction/destruction
	device_tiki100bus_card_interface(const machine_config &mconfig, device_t &device);
	virtual ~device_tiki100bus_card_interface() { }

	device_tiki100bus_card_interface *next() const { return m_next; }

	// memory access
	virtual UINT8 mrq_r(address_space &space, offs_t offset, UINT8 data, bool &mdis) { mdis = 1; return data; };
	virtual void mrq_w(address_space &space, offs_t offset, UINT8 data) { };

	// I/O access
	virtual UINT8 iorq_r(address_space &space, offs_t offset, UINT8 data) { return data; };
	virtual void iorq_w(address_space &space, offs_t offset, UINT8 data) { };

	virtual void busak_w(int state) { m_busak = state; };

	// Z80 daisy chain
	virtual int z80daisy_irq_state() { return 0; }
	virtual int z80daisy_irq_ack() { return 0; }
	virtual void z80daisy_irq_reti() { }

	tiki100_bus_t  *m_bus;
	tiki100_bus_slot_t *m_slot;
	int m_busak;

	device_tiki100bus_card_interface *m_next;
};


// ======================> tiki100_bus_slot_t

class tiki100_bus_slot_t : public device_t,
							public device_slot_interface,
							public device_z80daisy_interface
{
public:
	// construction/destruction
	tiki100_bus_slot_t(const machine_config &mconfig, const char *tag, device_t *owner, UINT32 clock);

	// device-level overrides
	virtual void device_start();

protected:
	// device_z80daisy_interface overrides
	virtual int z80daisy_irq_state() { return get_card_device() ? m_card->z80daisy_irq_state() : 0; }
	virtual int z80daisy_irq_ack() { return get_card_device() ? m_card->z80daisy_irq_ack() : 0; }
	virtual void z80daisy_irq_reti() { if (get_card_device()) m_card->z80daisy_irq_reti(); }

private:
	// configuration
	tiki100_bus_t  *m_bus;
	device_tiki100bus_card_interface *m_card;
};


// device type definition
extern const device_type TIKI100_BUS_SLOT;


// ======================> tiki100_bus_t

class tiki100_bus_t : public device_t
{
public:
	// construction/destruction
	tiki100_bus_t(const machine_config &mconfig, const char *tag, device_t *owner, UINT32 clock);
	~tiki100_bus_t() { m_device_list.detach_all(); }

	template<class _Object> static devcb_base &set_irq_wr_callback(device_t &device, _Object object) { return downcast<tiki100_bus_t &>(device).m_irq_cb.set_callback(object); }
	template<class _Object> static devcb_base &set_nmi_wr_callback(device_t &device, _Object object) { return downcast<tiki100_bus_t &>(device).m_nmi_cb.set_callback(object); }
	template<class _Object> static devcb_base &set_busrq_wr_callback(device_t &device, _Object object) { return downcast<tiki100_bus_t &>(device).m_busrq_cb.set_callback(object); }
	template<class _Object> static devcb_base &set_mrq_rd_callback(device_t &device, _Object object) { return downcast<tiki100_bus_t &>(device).m_in_mrq_cb.set_callback(object); }
	template<class _Object> static devcb_base &set_mrq_wr_callback(device_t &device, _Object object) { return downcast<tiki100_bus_t &>(device).m_out_mrq_cb.set_callback(object); }

	void add_card(device_tiki100bus_card_interface *card);

	// computer interface
	UINT8 mrq_r(address_space &space, offs_t offset, UINT8 data, bool &mdis);
	DECLARE_WRITE8_MEMBER( mrq_w );

	UINT8 iorq_r(address_space &space, offs_t offset, UINT8 data);
	DECLARE_WRITE8_MEMBER( iorq_w );

	DECLARE_WRITE_LINE_MEMBER( busak_w );

	// peripheral interface
	DECLARE_WRITE_LINE_MEMBER( irq_w ) { m_irq_cb(state); }
	DECLARE_WRITE_LINE_MEMBER( nmi_w ) { m_nmi_cb(state); }
	DECLARE_WRITE_LINE_MEMBER( busrq_w ) { m_busrq_cb(state); }
	DECLARE_READ8_MEMBER( exin_mrq_r ) { return m_in_mrq_cb(offset); }
	DECLARE_WRITE8_MEMBER( exin_mrq_w ) { m_out_mrq_cb(offset, data); }

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

private:
	devcb_write_line   m_irq_cb;
	devcb_write_line   m_nmi_cb;
	devcb_write_line   m_busrq_cb;
	devcb_read8        m_in_mrq_cb;
	devcb_write8       m_out_mrq_cb;

	simple_list<device_tiki100bus_card_interface> m_device_list;
};


// device type definition
extern const device_type TIKI100_BUS;




SLOT_INTERFACE_EXTERN( tiki100_cards );



#endif