summaryrefslogtreecommitdiffstatshomepage
path: root/src/devices/cpu/z80/z80daisy.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/devices/cpu/z80/z80daisy.cpp')
-rw-r--r--src/devices/cpu/z80/z80daisy.cpp110
1 files changed, 63 insertions, 47 deletions
diff --git a/src/devices/cpu/z80/z80daisy.cpp b/src/devices/cpu/z80/z80daisy.cpp
index 6553760160b..9d06fe1c9fc 100644
--- a/src/devices/cpu/z80/z80daisy.cpp
+++ b/src/devices/cpu/z80/z80daisy.cpp
@@ -21,7 +21,8 @@
//-------------------------------------------------
device_z80daisy_interface::device_z80daisy_interface(const machine_config &mconfig, device_t &device)
- : device_interface(device, "z80daisy")
+ : device_interface(device, "z80daisy"),
+ m_daisy_next(nullptr)
{
}
@@ -41,31 +42,61 @@ device_z80daisy_interface::~device_z80daisy_interface()
//**************************************************************************
//-------------------------------------------------
-// z80_daisy_chain - constructor
+// z80_daisy_chain_interface - constructor
//-------------------------------------------------
-z80_daisy_chain::z80_daisy_chain()
- : m_daisy_list(nullptr)
+z80_daisy_chain_interface::z80_daisy_chain_interface(const machine_config &mconfig, device_t &device)
+ : device_interface(device, "z80daisychain"),
+ m_daisy_config(nullptr),
+ m_chain(nullptr)
{
}
//-------------------------------------------------
-// init - allocate the daisy chain based on the
-// provided configuration
+// z80_daisy_chain_interface - destructor
//-------------------------------------------------
+z80_daisy_chain_interface::~z80_daisy_chain_interface()
+{
+}
+
+
+//-------------------------------------------------
+// static_set_daisy_config - configuration helper
+// to set up the daisy chain
+//-------------------------------------------------
+void z80_daisy_chain_interface::static_set_daisy_config(device_t &device, const z80_daisy_config *config)
+{
+ z80_daisy_chain_interface *daisyintf;
+ if (!device.interface(daisyintf))
+ throw emu_fatalerror("MCFG_Z80_DAISY_CHAIN called on device '%s' with no daisy chain interface", device.tag());
+ daisyintf->m_daisy_config = config;
+}
+
+
+//-------------------------------------------------
+// interface_post_start - work to be done after
+// actually starting a device
+//-------------------------------------------------
+
+void z80_daisy_chain_interface::interface_post_start()
+{
+ if (m_daisy_config != nullptr)
+ daisy_init(m_daisy_config);
+}
-void z80_daisy_chain::init(device_t *cpudevice, const z80_daisy_config *daisy)
+void z80_daisy_chain_interface::daisy_init(const z80_daisy_config *daisy)
{
// create a linked list of devices
- daisy_entry **tailptr = &m_daisy_list;
+ device_z80daisy_interface **tailptr = &m_chain;
for ( ; daisy->devname != nullptr; daisy++)
{
// find the device
- device_t *target;
- if ((target = cpudevice->subdevice(daisy->devname)) == nullptr)
+ device_t *target = device().subdevice(daisy->devname);
+ if (target == nullptr)
{
- if ((target = cpudevice->siblingdevice(daisy->devname)) == nullptr)
+ target = device().siblingdevice(daisy->devname);
+ if (target == nullptr)
fatalerror("Unable to locate device '%s'\n", daisy->devname);
}
@@ -75,26 +106,24 @@ void z80_daisy_chain::init(device_t *cpudevice, const z80_daisy_config *daisy)
fatalerror("Device '%s' does not implement the z80daisy interface!\n", daisy->devname);
// append to the end, or overwrite existing entry
- daisy_entry *next = (*tailptr) ? (*tailptr)->m_next : nullptr;
- if (*tailptr != nullptr)
- auto_free(cpudevice->machine(), *tailptr);
- *tailptr = auto_alloc(cpudevice->machine(), daisy_entry(target));
- (*tailptr)->m_next = next;
- tailptr = &(*tailptr)->m_next;
+ device_z80daisy_interface *next = (*tailptr != nullptr) ? (*tailptr)->m_daisy_next : nullptr;
+ *tailptr = intf;
+ (*tailptr)->m_daisy_next = next;
+ tailptr = &(*tailptr)->m_daisy_next;
}
}
//-------------------------------------------------
-// reset - send a reset signal to all chained
-// devices
+// interface_post_reset - work to be done after a
+// device is reset
//-------------------------------------------------
-void z80_daisy_chain::reset()
+void z80_daisy_chain_interface::interface_post_reset()
{
- // loop over all devices and call their reset function
- for (daisy_entry *daisy = m_daisy_list; daisy != nullptr; daisy = daisy->m_next)
- daisy->m_device->reset();
+ // loop over all chained devices and call their reset function
+ for (device_z80daisy_interface *intf = m_chain; intf != nullptr; intf = intf->m_daisy_next)
+ intf->device().reset();
}
@@ -103,13 +132,13 @@ void z80_daisy_chain::reset()
// return assert/clear based on the state
//-------------------------------------------------
-int z80_daisy_chain::update_irq_state()
+int z80_daisy_chain_interface::daisy_update_irq_state()
{
// loop over all devices; dev[0] is highest priority
- for (daisy_entry *daisy = m_daisy_list; daisy != nullptr; daisy = daisy->m_next)
+ for (device_z80daisy_interface *intf = m_chain; intf != nullptr; intf = intf->m_daisy_next)
{
// if this device is asserting the INT line, that's the one we want
- int state = daisy->m_interface->z80daisy_irq_state();
+ int state = intf->z80daisy_irq_state();
if (state & Z80_DAISY_INT)
return ASSERT_LINE;
@@ -126,16 +155,16 @@ int z80_daisy_chain::update_irq_state()
// from a chained device and return the vector
//-------------------------------------------------
-int z80_daisy_chain::call_ack_device()
+int z80_daisy_chain_interface::daisy_call_ack_device()
{
int vector = 0;
// loop over all devices; dev[0] is the highest priority
- for (daisy_entry *daisy = m_daisy_list; daisy != nullptr; daisy = daisy->m_next)
+ for (device_z80daisy_interface *intf = m_chain; intf != nullptr; intf = intf->m_daisy_next)
{
// if this device is asserting the INT line, that's the one we want
- int state = daisy->m_interface->z80daisy_irq_state();
- vector = daisy->m_interface->z80daisy_irq_ack();
+ int state = intf->z80daisy_irq_state();
+ vector = intf->z80daisy_irq_ack();
if (state & Z80_DAISY_INT)
return vector;
}
@@ -149,31 +178,18 @@ int z80_daisy_chain::call_ack_device()
// the chain
//-------------------------------------------------
-void z80_daisy_chain::call_reti_device()
+void z80_daisy_chain_interface::daisy_call_reti_device()
{
// loop over all devices; dev[0] is the highest priority
- for (daisy_entry *daisy = m_daisy_list; daisy != nullptr; daisy = daisy->m_next)
+ for (device_z80daisy_interface *intf = m_chain; intf != nullptr; intf = intf->m_daisy_next)
{
// if this device is asserting the IEO line, that's the one we want
- int state = daisy->m_interface->z80daisy_irq_state();
+ int state = intf->z80daisy_irq_state();
if (state & Z80_DAISY_IEO)
{
- daisy->m_interface->z80daisy_irq_reti();
+ intf->z80daisy_irq_reti();
return;
}
}
//logerror("z80daisy_call_reti_device: failed to find an device to reti!\n");
}
-
-
-//-------------------------------------------------
-// daisy_entry - constructor
-//-------------------------------------------------
-
-z80_daisy_chain::daisy_entry::daisy_entry(device_t *device)
- : m_next(nullptr),
- m_device(device),
- m_interface(nullptr)
-{
- device->interface(m_interface);
-}