diff options
Diffstat (limited to 'src/devices/bus/bml3/bml3bus.cpp')
-rw-r--r-- | src/devices/bus/bml3/bml3bus.cpp | 86 |
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); } |