summaryrefslogtreecommitdiffstatshomepage
path: root/src/devices/bus/acorn
diff options
context:
space:
mode:
Diffstat (limited to 'src/devices/bus/acorn')
-rw-r--r--src/devices/bus/acorn/atom/discpack.cpp1
-rw-r--r--src/devices/bus/acorn/atom/econet.cpp1
-rw-r--r--src/devices/bus/acorn/atom/sid.cpp1
-rw-r--r--src/devices/bus/acorn/bus.cpp42
-rw-r--r--src/devices/bus/acorn/bus.h35
-rw-r--r--src/devices/bus/acorn/cms/4080term.cpp1
-rw-r--r--src/devices/bus/acorn/cms/fdc.cpp3
-rw-r--r--src/devices/bus/acorn/cms/hires.cpp1
-rw-r--r--src/devices/bus/acorn/system/32k.cpp1
-rw-r--r--src/devices/bus/acorn/system/8k.cpp1
-rw-r--r--src/devices/bus/acorn/system/econet.cpp1
-rw-r--r--src/devices/bus/acorn/system/fdc.cpp1
-rw-r--r--src/devices/bus/acorn/system/vdu40.cpp1
-rw-r--r--src/devices/bus/acorn/system/vdu80.cpp1
-rw-r--r--src/devices/bus/acorn/system/vib.cpp1
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()));