diff options
Diffstat (limited to 'src/devices/bus/acorn')
-rw-r--r-- | src/devices/bus/acorn/atom/discpack.cpp | 1 | ||||
-rw-r--r-- | src/devices/bus/acorn/atom/econet.cpp | 1 | ||||
-rw-r--r-- | src/devices/bus/acorn/atom/sid.cpp | 1 | ||||
-rw-r--r-- | src/devices/bus/acorn/bus.cpp | 42 | ||||
-rw-r--r-- | src/devices/bus/acorn/bus.h | 35 | ||||
-rw-r--r-- | src/devices/bus/acorn/cms/4080term.cpp | 1 | ||||
-rw-r--r-- | src/devices/bus/acorn/cms/fdc.cpp | 3 | ||||
-rw-r--r-- | src/devices/bus/acorn/cms/hires.cpp | 1 | ||||
-rw-r--r-- | src/devices/bus/acorn/system/32k.cpp | 1 | ||||
-rw-r--r-- | src/devices/bus/acorn/system/8k.cpp | 1 | ||||
-rw-r--r-- | src/devices/bus/acorn/system/econet.cpp | 1 | ||||
-rw-r--r-- | src/devices/bus/acorn/system/fdc.cpp | 1 | ||||
-rw-r--r-- | src/devices/bus/acorn/system/vdu40.cpp | 1 | ||||
-rw-r--r-- | src/devices/bus/acorn/system/vdu80.cpp | 1 | ||||
-rw-r--r-- | src/devices/bus/acorn/system/vib.cpp | 1 |
15 files changed, 43 insertions, 49 deletions
diff --git a/src/devices/bus/acorn/atom/discpack.cpp b/src/devices/bus/acorn/atom/discpack.cpp index 5c357d22136..8d795e5ac4b 100644 --- a/src/devices/bus/acorn/atom/discpack.cpp +++ b/src/devices/bus/acorn/atom/discpack.cpp @@ -83,7 +83,6 @@ atom_discpack_device::atom_discpack_device(const machine_config &mconfig, const void atom_discpack_device::device_start() { - set_acorn_bus_device(); address_space &space = m_bus->memspace(); space.install_device(0x0a00, 0x0a03, *m_fdc, &i8271_device::map); diff --git a/src/devices/bus/acorn/atom/econet.cpp b/src/devices/bus/acorn/atom/econet.cpp index 32bfe0ab0c9..58f2fedee90 100644 --- a/src/devices/bus/acorn/atom/econet.cpp +++ b/src/devices/bus/acorn/atom/econet.cpp @@ -56,7 +56,6 @@ atom_econet_device::atom_econet_device(const machine_config &mconfig, const char void atom_econet_device::device_start() { - set_acorn_bus_device(); address_space &space = m_bus->memspace(); space.install_readwrite_handler(0xb400, 0xb403, read8_delegate(FUNC(mc6854_device::read), m_adlc.target()), write8_delegate(FUNC(mc6854_device::write), m_adlc.target())); diff --git a/src/devices/bus/acorn/atom/sid.cpp b/src/devices/bus/acorn/atom/sid.cpp index a72b924ddfc..950f4de2c58 100644 --- a/src/devices/bus/acorn/atom/sid.cpp +++ b/src/devices/bus/acorn/atom/sid.cpp @@ -53,7 +53,6 @@ atom_sid_device::atom_sid_device(const machine_config &mconfig, const char *tag, void atom_sid_device::device_start() { - set_acorn_bus_device(); address_space &space = m_bus->memspace(); space.install_readwrite_handler(0xbdc0, 0xbddf, read8_delegate(FUNC(mos6581_device::read), m_sid.target()), write8_delegate(FUNC(mos6581_device::write), m_sid.target())); diff --git a/src/devices/bus/acorn/bus.cpp b/src/devices/bus/acorn/bus.cpp index 83cf01ed051..ed759be82af 100644 --- a/src/devices/bus/acorn/bus.cpp +++ b/src/devices/bus/acorn/bus.cpp @@ -34,17 +34,33 @@ acorn_bus_slot_device::acorn_bus_slot_device(const machine_config &mconfig, cons } //------------------------------------------------- +// device_validity_check - device-specific checks +//------------------------------------------------- + +void acorn_bus_slot_device::device_validity_check(validity_checker &valid) const +{ + device_t *const card(get_card_device()); + if (card && !dynamic_cast<device_acorn_bus_interface *>(card)) + osd_printf_error("acorn_bus_slot_device: card device %s (%s) does not implement device_acorn_bus_interface\n", card->tag(), card->name()); +} + +//------------------------------------------------- // device_start - device-specific startup //------------------------------------------------- void acorn_bus_slot_device::device_start() { - device_acorn_bus_interface *const dev = dynamic_cast<device_acorn_bus_interface *>(get_card_device()); - if (dev) - dev->set_acorn_bus(m_bus); + device_t *const card(get_card_device()); + if (card) + { + device_acorn_bus_interface *const intf(dynamic_cast<device_acorn_bus_interface *>(card)); + if (!intf) + throw emu_fatalerror("acorn_bus_slot_device: card device %s (%s) does not implement device_acorn_bus_interface\n", card->tag(), card->name()); + intf->set_acorn_bus(*m_bus); + } // tell acorn bus that there is one slot with the specified tag - downcast<acorn_bus_device &>(*m_bus).add_slot(tag()); + m_bus->add_slot(*this); } @@ -71,16 +87,9 @@ acorn_bus_device::acorn_bus_device(const machine_config &mconfig, const char *ta } -void acorn_bus_device::add_slot(const char *tag) -{ - device_t *dev = subdevice(tag); - - add_slot(dynamic_cast<device_slot_interface *>(dev)); -} - -void acorn_bus_device::add_slot(device_slot_interface *slot) +void acorn_bus_device::add_slot(acorn_bus_slot_device &slot) { - m_slot_list.push_front(slot); + m_slot_list.push_front(&slot); } @@ -125,8 +134,6 @@ WRITE_LINE_MEMBER(acorn_bus_device::nmi_w) { m_out_nmi_cb(state); } device_acorn_bus_interface::device_acorn_bus_interface(const machine_config &mconfig, device_t &device) : device_slot_card_interface(mconfig, device) , m_bus(nullptr) - , m_bus_dev(nullptr) - , m_next(nullptr) { } @@ -139,9 +146,10 @@ device_acorn_bus_interface::~device_acorn_bus_interface() { } -void device_acorn_bus_interface::set_acorn_bus_device() +void device_acorn_bus_interface::interface_pre_start() { - m_bus = dynamic_cast<acorn_bus_device *>(m_bus_dev); + if (!m_bus) + throw device_missing_dependencies(); } diff --git a/src/devices/bus/acorn/bus.h b/src/devices/bus/acorn/bus.h index ea7014100b5..9ebcafdad73 100644 --- a/src/devices/bus/acorn/bus.h +++ b/src/devices/bus/acorn/bus.h @@ -15,10 +15,16 @@ //************************************************************************** -// TYPE DEFINITIONS +// FORWARD DECLARATIONS //************************************************************************** class acorn_bus_device; +class device_acorn_bus_interface; + + +//************************************************************************** +// TYPE DEFINITIONS +//************************************************************************** class acorn_bus_slot_device : public device_t, public device_slot_interface { @@ -38,17 +44,17 @@ public: protected: // device-level overrides + virtual void device_validity_check(validity_checker &valid) const override; virtual void device_start() override; // configuration - required_device<device_t> m_bus; + required_device<acorn_bus_device> m_bus; }; // device type definition DECLARE_DEVICE_TYPE(ACORN_BUS_SLOT, acorn_bus_slot_device) -class device_acorn_bus_interface; // ======================> acorn_bus_device class acorn_bus_device : public device_t @@ -67,8 +73,7 @@ public: DECLARE_WRITE_LINE_MEMBER(irq_w); DECLARE_WRITE_LINE_MEMBER(nmi_w); - void add_slot(const char *tag); - void add_slot(device_slot_interface *slot); + void add_slot(acorn_bus_slot_device &slot); protected: // device-level overrides @@ -81,7 +86,7 @@ protected: devcb_write_line m_out_irq_cb; devcb_write_line m_out_nmi_cb; - std::forward_list<device_slot_interface *> m_slot_list; + std::forward_list<acorn_bus_slot_device *> m_slot_list; }; @@ -93,27 +98,21 @@ DECLARE_DEVICE_TYPE(ACORN_BUS, acorn_bus_device) // class representing interface-specific live acorn bus card class device_acorn_bus_interface : public device_slot_card_interface { - friend class acorn_bus_device; - template <class ElementType> friend class simple_list; public: + friend class acorn_bus_device; + // construction/destruction virtual ~device_acorn_bus_interface(); - device_acorn_bus_interface *next() const { return m_next; } - - void set_acorn_bus_device(); - // inline configuration - void set_acorn_bus(device_t *acorn_bus_device) { m_bus_dev = acorn_bus_device; } + void set_acorn_bus(acorn_bus_device &bus) { m_bus = &bus; } -public: +protected: device_acorn_bus_interface(const machine_config &mconfig, device_t &device); - acorn_bus_device *m_bus; - device_t *m_bus_dev; + virtual void interface_pre_start() override; -private: - device_acorn_bus_interface *m_next; + acorn_bus_device *m_bus; }; diff --git a/src/devices/bus/acorn/cms/4080term.cpp b/src/devices/bus/acorn/cms/4080term.cpp index c282715b7ae..d4e5514629d 100644 --- a/src/devices/bus/acorn/cms/4080term.cpp +++ b/src/devices/bus/acorn/cms/4080term.cpp @@ -143,7 +143,6 @@ cms_4080term_device::cms_4080term_device(const machine_config &mconfig, const ch void cms_4080term_device::device_start() { - set_acorn_bus_device(); address_space &space = m_bus->memspace(); space.install_readwrite_handler(0xfd20, 0xfd2f, read8_delegate(FUNC(ef9345_device::data_r), m_ef9345.target()), write8_delegate(FUNC(ef9345_device::data_w), m_ef9345.target())); diff --git a/src/devices/bus/acorn/cms/fdc.cpp b/src/devices/bus/acorn/cms/fdc.cpp index f58e45f9c05..fc9afd47fa4 100644 --- a/src/devices/bus/acorn/cms/fdc.cpp +++ b/src/devices/bus/acorn/cms/fdc.cpp @@ -73,7 +73,6 @@ cms_fdc_device::cms_fdc_device(const machine_config &mconfig, const char *tag, d void cms_fdc_device::device_start() { - set_acorn_bus_device(); address_space &space = m_bus->memspace(); space.install_readwrite_handler(0xfc50, 0xfc5f, read8_delegate(FUNC(cms_fdc_device::wd1770_state_r), this), write8_delegate(FUNC(cms_fdc_device::wd1770_control_w), this)); @@ -122,4 +121,4 @@ WRITE_LINE_MEMBER(cms_fdc_device::bus_nmi_w) WRITE_LINE_MEMBER(cms_fdc_device::bus_irq_w) { m_bus->irq_w(state); -}
\ No newline at end of file +} diff --git a/src/devices/bus/acorn/cms/hires.cpp b/src/devices/bus/acorn/cms/hires.cpp index 35ef26fd598..d15032bd30c 100644 --- a/src/devices/bus/acorn/cms/hires.cpp +++ b/src/devices/bus/acorn/cms/hires.cpp @@ -68,7 +68,6 @@ cms_hires_device::cms_hires_device(const machine_config &mconfig, const char *ta void cms_hires_device::device_start() { - set_acorn_bus_device(); address_space &space = m_bus->memspace(); space.install_readwrite_handler(0xfc10, 0xfc1f, read8_delegate(FUNC(ef9365_device::data_r), m_gdp.target()), write8_delegate(FUNC(ef9365_device::data_w), m_gdp.target())); diff --git a/src/devices/bus/acorn/system/32k.cpp b/src/devices/bus/acorn/system/32k.cpp index bc131f60091..c74d60cc863 100644 --- a/src/devices/bus/acorn/system/32k.cpp +++ b/src/devices/bus/acorn/system/32k.cpp @@ -81,7 +81,6 @@ void acorn_32k_device::device_start() void acorn_32k_device::device_reset() { - set_acorn_bus_device(); address_space &space = m_bus->memspace(); if (m_links->read()) diff --git a/src/devices/bus/acorn/system/8k.cpp b/src/devices/bus/acorn/system/8k.cpp index 5ac32c1a82f..071ceceeddb 100644 --- a/src/devices/bus/acorn/system/8k.cpp +++ b/src/devices/bus/acorn/system/8k.cpp @@ -109,7 +109,6 @@ void acorn_8k_device::device_start() void acorn_8k_device::device_reset() { - set_acorn_bus_device(); address_space &space = m_bus->memspace(); uint16_t ram_addr = (m_links->read() & 0x0f) << 13; diff --git a/src/devices/bus/acorn/system/econet.cpp b/src/devices/bus/acorn/system/econet.cpp index 01b4c6010be..9c731593baa 100644 --- a/src/devices/bus/acorn/system/econet.cpp +++ b/src/devices/bus/acorn/system/econet.cpp @@ -66,7 +66,6 @@ void acorn_econet_device::device_start() void acorn_econet_device::device_reset() { - set_acorn_bus_device(); address_space &space = m_bus->memspace(); space.install_readwrite_handler(0x1940, 0x1943, read8_delegate(FUNC(mc6854_device::read), m_adlc.target()), write8_delegate(FUNC(mc6854_device::write), m_adlc.target())); diff --git a/src/devices/bus/acorn/system/fdc.cpp b/src/devices/bus/acorn/system/fdc.cpp index ef4046c9555..61fd022f335 100644 --- a/src/devices/bus/acorn/system/fdc.cpp +++ b/src/devices/bus/acorn/system/fdc.cpp @@ -84,7 +84,6 @@ void acorn_fdc_device::device_start() void acorn_fdc_device::device_reset() { - set_acorn_bus_device(); address_space &space = m_bus->memspace(); space.install_device(0x0a00, 0x0a03, *m_fdc, &i8271_device::map); diff --git a/src/devices/bus/acorn/system/vdu40.cpp b/src/devices/bus/acorn/system/vdu40.cpp index 535250ef081..93d54819fa5 100644 --- a/src/devices/bus/acorn/system/vdu40.cpp +++ b/src/devices/bus/acorn/system/vdu40.cpp @@ -78,7 +78,6 @@ void acorn_vdu40_device::device_start() void acorn_vdu40_device::device_reset() { - set_acorn_bus_device(); address_space &space = m_bus->memspace(); space.install_ram(0x0400, 0x07ff, m_videoram.get()); diff --git a/src/devices/bus/acorn/system/vdu80.cpp b/src/devices/bus/acorn/system/vdu80.cpp index 77fd4d7a629..25184492bf7 100644 --- a/src/devices/bus/acorn/system/vdu80.cpp +++ b/src/devices/bus/acorn/system/vdu80.cpp @@ -145,7 +145,6 @@ void acorn_vdu80_device::device_start() void acorn_vdu80_device::device_reset() { - set_acorn_bus_device(); address_space &space = m_bus->memspace(); if (m_links->read() & 0x01) diff --git a/src/devices/bus/acorn/system/vib.cpp b/src/devices/bus/acorn/system/vib.cpp index c0d739fcbc4..89d48b6fedb 100644 --- a/src/devices/bus/acorn/system/vib.cpp +++ b/src/devices/bus/acorn/system/vib.cpp @@ -91,7 +91,6 @@ void acorn_vib_device::device_start() void acorn_vib_device::device_reset() { - set_acorn_bus_device(); address_space &space = m_bus->memspace(); space.install_readwrite_handler(0x0c00, 0x0c0f, 0, 0x10, 0, read8_delegate(FUNC(via6522_device::read), m_via6522.target()), write8_delegate(FUNC(via6522_device::write), m_via6522.target())); |