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