summaryrefslogtreecommitdiffstatshomepage
path: root/src/devices/bus/bml3/bml3bus.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/devices/bus/bml3/bml3bus.cpp')
-rw-r--r--src/devices/bus/bml3/bml3bus.cpp86
1 files changed, 53 insertions, 33 deletions
diff --git a/src/devices/bus/bml3/bml3bus.cpp b/src/devices/bus/bml3/bml3bus.cpp
index 9acb1b9acb5..8c564cc2bb8 100644
--- a/src/devices/bus/bml3/bml3bus.cpp
+++ b/src/devices/bus/bml3/bml3bus.cpp
@@ -66,7 +66,9 @@ bml3bus_slot_device::bml3bus_slot_device(const machine_config &mconfig, const ch
bml3bus_slot_device::bml3bus_slot_device(const machine_config &mconfig, device_type type, const char *tag, device_t *owner, uint32_t clock) :
device_t(mconfig, type, tag, owner, clock),
- device_slot_interface(mconfig, *this), m_bml3bus_tag(nullptr), m_bml3bus_slottag(nullptr)
+ device_single_card_slot_interface<device_bml3bus_card_interface>(mconfig, *this),
+ m_bml3bus(*this, finder_base::DUMMY_TAG),
+ m_bml3bus_slottag(nullptr)
{
}
@@ -76,9 +78,9 @@ bml3bus_slot_device::bml3bus_slot_device(const machine_config &mconfig, device_t
void bml3bus_slot_device::device_start()
{
- device_bml3bus_card_interface *dev = dynamic_cast<device_bml3bus_card_interface *>(get_card_device());
-
- if (dev) dev->set_bml3bus_tag(m_bml3bus_tag, m_bml3bus_slottag);
+ device_bml3bus_card_interface *const dev = get_card_device();
+ if (dev)
+ dev->set_bml3bus(*m_bml3bus, m_bml3bus_slottag);
}
//**************************************************************************
@@ -102,11 +104,15 @@ bml3bus_device::bml3bus_device(const machine_config &mconfig, const char *tag, d
bml3bus_device::bml3bus_device(const machine_config &mconfig, device_type type, const char *tag, device_t *owner, uint32_t clock) :
device_t(mconfig, type, tag, owner, clock),
- m_space(*this, finder_base::DUMMY_TAG, -1, 8),
m_out_nmi_cb(*this),
m_out_irq_cb(*this),
m_out_firq_cb(*this)
{
+ // clear slots
+ for (auto & elem : m_device_list)
+ {
+ elem = nullptr;
+ }
}
//-------------------------------------------------
@@ -115,16 +121,6 @@ bml3bus_device::bml3bus_device(const machine_config &mconfig, device_type type,
void bml3bus_device::device_start()
{
- // resolve callbacks
- m_out_nmi_cb.resolve_safe();
- m_out_irq_cb.resolve_safe();
- m_out_firq_cb.resolve_safe();
-
- // clear slots
- for (auto & elem : m_device_list)
- {
- elem = nullptr;
- }
}
//-------------------------------------------------
@@ -145,9 +141,27 @@ device_bml3bus_card_interface *bml3bus_device::get_bml3bus_card(int slot)
return m_device_list[slot];
}
-void bml3bus_device::add_bml3bus_card(int slot, device_bml3bus_card_interface *card)
+void bml3bus_device::add_bml3bus_card(int slot, device_bml3bus_card_interface &card)
{
- m_device_list[slot] = card;
+ m_device_list[slot] = &card;
+}
+
+void bml3bus_device::map_exrom(address_space_installer &space)
+{
+ for (auto & elem : m_device_list)
+ {
+ if (elem != nullptr)
+ elem->map_exrom(space);
+ }
+}
+
+void bml3bus_device::map_io(address_space_installer &space)
+{
+ for (auto & elem : m_device_list)
+ {
+ if (elem != nullptr)
+ elem->map_io(space);
+ }
}
void bml3bus_device::set_nmi_line(int state)
@@ -166,9 +180,9 @@ void bml3bus_device::set_firq_line(int state)
}
// interrupt request from bml3bus card
-WRITE_LINE_MEMBER( bml3bus_device::nmi_w ) { m_out_nmi_cb(state); }
-WRITE_LINE_MEMBER( bml3bus_device::irq_w ) { m_out_irq_cb(state); }
-WRITE_LINE_MEMBER( bml3bus_device::firq_w ) { m_out_firq_cb(state); }
+void bml3bus_device::nmi_w(int state) { m_out_nmi_cb(state); }
+void bml3bus_device::irq_w(int state) { m_out_irq_cb(state); }
+void bml3bus_device::firq_w(int state) { m_out_firq_cb(state); }
//**************************************************************************
// DEVICE CONFIG BML3BUS CARD INTERFACE
@@ -183,10 +197,10 @@ WRITE_LINE_MEMBER( bml3bus_device::firq_w ) { m_out_firq_cb(state); }
// device_bml3bus_card_interface - constructor
//-------------------------------------------------
-device_bml3bus_card_interface::device_bml3bus_card_interface(const machine_config &mconfig, device_t &device)
- : device_slot_card_interface(mconfig, device),
- m_bml3bus(nullptr),
- m_bml3bus_tag(nullptr), m_bml3bus_slottag(nullptr), m_slot(0), m_next(nullptr)
+device_bml3bus_card_interface::device_bml3bus_card_interface(const machine_config &mconfig, device_t &device) :
+ device_interface(device, "bml3bus"),
+ m_bml3bus(nullptr),
+ m_slot(0)
{
}
@@ -199,18 +213,24 @@ device_bml3bus_card_interface::~device_bml3bus_card_interface()
{
}
-void device_bml3bus_card_interface::set_bml3bus_device()
+void device_bml3bus_card_interface::interface_pre_start()
{
- // extract the slot number from the last digit of the slot tag
- int tlen = strlen(m_bml3bus_slottag);
+ if (!m_bml3bus)
+ throw device_missing_dependencies();
+}
- m_slot = (m_bml3bus_slottag[tlen-1] - '1');
+void device_bml3bus_card_interface::set_bml3bus(bml3bus_device &bus, const char *slottag)
+{
+ assert(!m_bml3bus);
+ assert(!device().started());
+
+ // extract the slot number from the last digit of the slot tag
+ int tlen = strlen(slottag);
+ m_slot = (slottag[tlen - 1] - '1');
if (m_slot < 0 || m_slot >= BML3BUS_MAX_SLOTS)
- {
- fatalerror("Slot %x out of range for Hitachi MB-6890 Bus\n", m_slot);
- }
+ fatalerror("Slot %d out of range for Hitachi MB-6890 Bus\n", m_slot);
- m_bml3bus = dynamic_cast<bml3bus_device *>(device().machine().device(m_bml3bus_tag));
- m_bml3bus->add_bml3bus_card(m_slot, this);
+ m_bml3bus = &bus;
+ m_bml3bus->add_bml3bus_card(m_slot, *this);
}