1 // license:BSD-3-Clause
2 // copyright-holders:Curt Coder
3 /**********************************************************************
4 
5     TIKI-100 expansion bus emulation
6 
7 **********************************************************************/
8 
9 #include "emu.h"
10 #include "exp.h"
11 
12 
13 //**************************************************************************
14 //  DEVICE DEFINITIONS
15 //**************************************************************************
16 
17 DEFINE_DEVICE_TYPE(TIKI100_BUS,      tiki100_bus_device,      "tiki100bus",      "TIKI-100 expansion bus")
18 DEFINE_DEVICE_TYPE(TIKI100_BUS_SLOT, tiki100_bus_slot_device, "tiki100bus_slot", "TIKI-100 expansion bus slot")
19 
20 
21 
22 //**************************************************************************
23 //  LIVE DEVICE
24 //**************************************************************************
25 
26 //-------------------------------------------------
27 //  tiki100_bus_slot_device - constructor
28 //-------------------------------------------------
29 
tiki100_bus_slot_device(const machine_config & mconfig,const char * tag,device_t * owner,uint32_t clock)30 tiki100_bus_slot_device::tiki100_bus_slot_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock) :
31 	device_t(mconfig, TIKI100_BUS_SLOT, tag, owner, clock),
32 	device_single_card_slot_interface<device_tiki100bus_card_interface>(mconfig, *this),
33 	device_z80daisy_interface(mconfig, *this),
34 	m_bus(*this, finder_base::DUMMY_TAG),
35 	m_card(nullptr)
36 {
37 }
38 
39 
40 //-------------------------------------------------
41 //  device_start - device-specific startup
42 //-------------------------------------------------
43 
device_start()44 void tiki100_bus_slot_device::device_start()
45 {
46 	m_card = get_card_device();
47 	if (m_card)
48 		m_bus->add_card(*m_card);
49 }
50 
51 
52 //-------------------------------------------------
53 //  tiki100_bus_device - constructor
54 //-------------------------------------------------
55 
tiki100_bus_device(const machine_config & mconfig,const char * tag,device_t * owner,uint32_t clock)56 tiki100_bus_device::tiki100_bus_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock) :
57 	device_t(mconfig, TIKI100_BUS, tag, owner, clock),
58 	m_irq_cb(*this),
59 	m_nmi_cb(*this),
60 	m_busrq_cb(*this),
61 	m_in_mrq_cb(*this),
62 	m_out_mrq_cb(*this)
63 {
64 }
65 
66 
67 //-------------------------------------------------
68 //  device_start - device-specific startup
69 //-------------------------------------------------
70 
device_start()71 void tiki100_bus_device::device_start()
72 {
73 	// resolve callbacks
74 	m_irq_cb.resolve_safe();
75 	m_nmi_cb.resolve_safe();
76 	m_busrq_cb.resolve_safe();
77 	m_in_mrq_cb.resolve();
78 	m_out_mrq_cb.resolve();
79 }
80 
81 
82 //-------------------------------------------------
83 //  add_card - add card
84 //-------------------------------------------------
85 
add_card(device_tiki100bus_card_interface & card)86 void tiki100_bus_device::add_card(device_tiki100bus_card_interface &card)
87 {
88 	m_device_list.append(card);
89 
90 	card.m_bus = this;
91 }
92 
93 
94 //-------------------------------------------------
95 //  mrq_r - memory read
96 //-------------------------------------------------
97 
mrq_r(offs_t offset,uint8_t data,bool & mdis)98 uint8_t tiki100_bus_device::mrq_r(offs_t offset, uint8_t data, bool &mdis)
99 {
100 	device_tiki100bus_card_interface *entry = m_device_list.first();
101 
102 	while (entry)
103 	{
104 		data &= entry->mrq_r(offset, data, mdis);
105 		entry = entry->next();
106 	}
107 
108 	return data;
109 }
110 
111 
112 //-------------------------------------------------
113 //  mrq_w - memory write
114 //-------------------------------------------------
115 
mrq_w(offs_t offset,uint8_t data)116 void tiki100_bus_device::mrq_w(offs_t offset, uint8_t data)
117 {
118 	device_tiki100bus_card_interface *entry = m_device_list.first();
119 
120 	while (entry)
121 	{
122 		entry->mrq_w(offset, data);
123 		entry = entry->next();
124 	}
125 }
126 
127 
128 //-------------------------------------------------
129 //  iorq_r - I/O read
130 //-------------------------------------------------
131 
iorq_r(offs_t offset,uint8_t data)132 uint8_t tiki100_bus_device::iorq_r(offs_t offset, uint8_t data)
133 {
134 	device_tiki100bus_card_interface *entry = m_device_list.first();
135 
136 	while (entry)
137 	{
138 		data &= entry->iorq_r(offset, data);
139 		entry = entry->next();
140 	}
141 
142 	return data;
143 }
144 
145 
146 //-------------------------------------------------
147 //  iorq_w - I/O write
148 //-------------------------------------------------
149 
iorq_w(offs_t offset,uint8_t data)150 void tiki100_bus_device::iorq_w(offs_t offset, uint8_t data)
151 {
152 	device_tiki100bus_card_interface *entry = m_device_list.first();
153 
154 	while (entry)
155 	{
156 		entry->iorq_w(offset, data);
157 		entry = entry->next();
158 	}
159 }
160 
161 
162 //-------------------------------------------------
163 //  busak_w - bus acknowledge write
164 //-------------------------------------------------
165 
WRITE_LINE_MEMBER(tiki100_bus_device::busak_w)166 WRITE_LINE_MEMBER( tiki100_bus_device::busak_w )
167 {
168 	device_tiki100bus_card_interface *entry = m_device_list.first();
169 
170 	while (entry)
171 	{
172 		entry->busak_w(state);
173 		entry = entry->next();
174 	}
175 }
176 
177 
178 
179 //**************************************************************************
180 //  DEVICE TIKI-100 BUS CARD INTERFACE
181 //**************************************************************************
182 
183 //-------------------------------------------------
184 //  device_tiki100bus_card_interface - constructor
185 //-------------------------------------------------
186 
device_tiki100bus_card_interface(const machine_config & mconfig,device_t & device)187 device_tiki100bus_card_interface::device_tiki100bus_card_interface(const machine_config &mconfig, device_t &device) :
188 	device_interface(device, "tiki100bus"),
189 	m_bus(nullptr),
190 	m_busak(CLEAR_LINE),
191 	m_next(nullptr)
192 {
193 	m_slot = dynamic_cast<tiki100_bus_slot_device *>(device.owner());
194 }
195 
196 
interface_pre_start()197 void device_tiki100bus_card_interface::interface_pre_start()
198 {
199 	if (!m_bus)
200 		throw device_missing_dependencies();
201 }
202 
203 
204 //-------------------------------------------------
205 //  SLOT_INTERFACE( tiki100_cards )
206 //-------------------------------------------------
207 
208 // slot devices
209 #include "8088.h"
210 #include "hdc.h"
211 
tiki100_cards(device_slot_interface & device)212 void tiki100_cards(device_slot_interface &device)
213 {
214 	device.option_add("8088", TIKI100_8088);
215 	device.option_add("hdc", TIKI100_HDC);
216 }
217