summaryrefslogtreecommitdiffstatshomepage
diff options
context:
space:
mode:
author AJR <ajrhacker@users.noreply.github.com>2019-05-29 16:56:46 -0400
committer AJR <ajrhacker@users.noreply.github.com>2019-05-29 16:56:46 -0400
commitb6301261370ecd5c7221dd3144f5ad51af49dff9 (patch)
tree927a96f599ab1b9bfc80ca1539969aa1b90a013e
parent84b924a1f714db9e928c133bd4c3d977d5f80bfe (diff)
sbus: Eliminate tag hacking (nw)
-rw-r--r--src/devices/bus/sbus/sbus.cpp18
-rw-r--r--src/devices/bus/sbus/sbus.h8
-rw-r--r--src/mame/drivers/sun4.cpp6
3 files changed, 15 insertions, 17 deletions
diff --git a/src/devices/bus/sbus/sbus.cpp b/src/devices/bus/sbus/sbus.cpp
index f8363194c5a..dce9053b3a4 100644
--- a/src/devices/bus/sbus/sbus.cpp
+++ b/src/devices/bus/sbus/sbus.cpp
@@ -44,11 +44,15 @@ sbus_slot_device::sbus_slot_device(const machine_config &mconfig, device_type ty
: device_t(mconfig, type, tag, owner, clock)
, device_slot_interface(mconfig, *this)
, m_sbus(*this, finder_base::DUMMY_TAG)
+ , m_slot(-1)
{
}
void sbus_slot_device::device_validity_check(validity_checker &valid) const
{
+ if (m_slot < 0 || m_slot > 2)
+ osd_printf_error("Slot %d out of range for Sun SBus\n", m_slot);
+
device_t *const card(get_card_device());
if (card && !dynamic_cast<device_sbus_card_interface *>(card))
osd_printf_error("Card device %s (%s) does not implement device_sbus_card_interface\n", card->tag(), card->name());
@@ -58,7 +62,7 @@ void sbus_slot_device::device_resolve_objects()
{
device_sbus_card_interface *const sbus_card(dynamic_cast<device_sbus_card_interface *>(get_card_device()));
if (sbus_card)
- sbus_card->set_sbus(m_sbus, tag());
+ sbus_card->set_sbus(m_sbus, m_slot);
}
void sbus_slot_device::device_start()
@@ -169,7 +173,6 @@ device_sbus_card_interface::device_sbus_card_interface(const machine_config &mco
: device_slot_card_interface(mconfig, device)
, m_sbus_finder(device, finder_base::DUMMY_TAG)
, m_sbus(nullptr)
- , m_sbus_slottag(nullptr)
, m_slot(-1)
, m_base(0)
{
@@ -201,20 +204,13 @@ void device_sbus_card_interface::interface_pre_start()
if (!m_sbus->started())
throw device_missing_dependencies();
- // extract the slot number from the last digit of the slot tag
- size_t const tlen = strlen(m_sbus_slottag);
-
- m_slot = (m_sbus_slottag[tlen - 1] - '1');
- if (m_slot < 0 || m_slot > 2)
- fatalerror("Slot %x out of range for Sun SBus\n", m_slot);
-
m_base = m_slot << 25;
m_sbus->add_sbus_card(m_slot, this);
}
}
-void device_sbus_card_interface::set_sbus(sbus_device *sbus, const char *slottag)
+void device_sbus_card_interface::set_sbus(sbus_device *sbus, int slot)
{
m_sbus = sbus;
- m_sbus_slottag = slottag;
+ m_slot = slot;
}
diff --git a/src/devices/bus/sbus/sbus.h b/src/devices/bus/sbus/sbus.h
index 5349c2c8e42..fb9f2a508d5 100644
--- a/src/devices/bus/sbus/sbus.h
+++ b/src/devices/bus/sbus/sbus.h
@@ -21,7 +21,7 @@ class sbus_slot_device : public device_t, public device_slot_interface
public:
// construction/destruction
template <typename T, typename U>
- sbus_slot_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock, T &&sbus_tag, U &&opts, const char *dflt, bool fixed = false)
+ sbus_slot_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock, T &&sbus_tag, int slot, U &&opts, const char *dflt, bool fixed = false)
: sbus_slot_device(mconfig, tag, owner, clock)
{
option_reset();
@@ -29,6 +29,7 @@ public:
set_default_option(dflt);
set_fixed(fixed);
m_sbus.set_tag(std::forward<T>(sbus_tag));
+ m_slot = slot;
}
sbus_slot_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock);
@@ -42,6 +43,7 @@ protected:
// configuration
required_device<sbus_device> m_sbus;
+ int m_slot;
DECLARE_READ32_MEMBER(timeout_r);
DECLARE_WRITE32_MEMBER(timeout_w);
@@ -131,8 +133,8 @@ public:
virtual ~device_sbus_card_interface();
// inline configuration
- void set_sbus(sbus_device *sbus, const char *slottag);
- template <typename T> void set_onboard(T &&sbus) { m_sbus_finder.set_tag(std::forward<T>(sbus)); m_sbus_slottag = device().tag(); }
+ void set_sbus(sbus_device *sbus, int slot);
+ template <typename T> void set_onboard(T &&sbus, int slot) { m_sbus_finder.set_tag(std::forward<T>(sbus)); m_slot = slot; }
virtual void mem_map(address_map &map) = 0;
diff --git a/src/mame/drivers/sun4.cpp b/src/mame/drivers/sun4.cpp
index 50d7016544c..92dad1ae2da 100644
--- a/src/mame/drivers/sun4.cpp
+++ b/src/mame/drivers/sun4.cpp
@@ -2017,9 +2017,9 @@ void sun4_state::sun4c(machine_config &config)
// SBus
SBUS(config, m_sbus, 20'000'000, "maincpu", "type1");
- SBUS_SLOT(config, m_sbus_slot[0], 20'000'000, m_sbus, sbus_cards, nullptr);
- SBUS_SLOT(config, m_sbus_slot[1], 20'000'000, m_sbus, sbus_cards, nullptr);
- SBUS_SLOT(config, m_sbus_slot[2], 20'000'000, m_sbus, sbus_cards, nullptr);
+ SBUS_SLOT(config, m_sbus_slot[0], 20'000'000, m_sbus, 0, sbus_cards, nullptr);
+ SBUS_SLOT(config, m_sbus_slot[1], 20'000'000, m_sbus, 1, sbus_cards, nullptr);
+ SBUS_SLOT(config, m_sbus_slot[2], 20'000'000, m_sbus, 2, sbus_cards, nullptr);
}
void sun4_state::sun4_20(machine_config &config)