summaryrefslogtreecommitdiffstatshomepage
diff options
context:
space:
mode:
author npwoods <npwoods@alumni.cmu.edu>2017-06-04 03:35:05 -0400
committer Vas Crabb <cuavas@users.noreply.github.com>2017-06-04 17:35:05 +1000
commitd00079702a90a5316de199e82042cca53035bd47 (patch)
treebb7aa253e352b99cc4ae98331af22783b20de095
parent0609fd6091d4e4c090470993efde410fb56a6510 (diff)
[CoCo] Changed device_cococart_interface implementations to do dynamic_casts at config completion (#2356)
This should be considered part of the CoCo cartridge overhaul. Vas (correctly) suggested that dynamic_casts should be done in interface_config_complete() to avoid calling them at runtime. This was actually happening inconsistently in the various implementations, and consolidating them is a good cleanup.
-rw-r--r--src/devices/bus/coco/coco_fdc.h6
-rw-r--r--src/devices/bus/coco/coco_multi.cpp7
-rw-r--r--src/devices/bus/coco/coco_pak.cpp1
-rw-r--r--src/devices/bus/coco/coco_t4426.cpp5
-rw-r--r--src/devices/bus/coco/cococart.cpp36
-rw-r--r--src/devices/bus/coco/cococart.h11
6 files changed, 41 insertions, 25 deletions
diff --git a/src/devices/bus/coco/coco_fdc.h b/src/devices/bus/coco/coco_fdc.h
index dfd78f813f8..6a69cfc8a1f 100644
--- a/src/devices/bus/coco/coco_fdc.h
+++ b/src/devices/bus/coco/coco_fdc.h
@@ -37,7 +37,6 @@ protected:
: device_t(mconfig, type, tag, owner, clock)
, device_cococart_interface(mconfig, *this)
{
- m_owner = dynamic_cast<cococart_slot_device *>(owner);
};
// device-level overrides
@@ -51,7 +50,7 @@ protected:
// wrapper for setting the cart line
void cart_set_line(cococart_slot_device::line which, cococart_slot_device::line_value value)
{
- m_owner->set_line_value(which, value);
+ owning_slot().set_line_value(which, value);
}
void cart_set_line(cococart_slot_device::line which, bool value)
{
@@ -65,9 +64,6 @@ protected:
void set_dskreg(uint8_t data) { m_dskreg = data; }
private:
- // internal state
- cococart_slot_device *m_owner;
-
// registers
uint8_t m_dskreg;
bool m_intrq;
diff --git a/src/devices/bus/coco/coco_multi.cpp b/src/devices/bus/coco/coco_multi.cpp
index cacb78f1bb5..4ee333131c3 100644
--- a/src/devices/bus/coco/coco_multi.cpp
+++ b/src/devices/bus/coco/coco_multi.cpp
@@ -117,7 +117,6 @@ namespace
uint8_t m_select;
// internal accessors
- cococart_slot_device &owning_slot();
int active_scs_slot_number() const;
int active_cts_slot_number() const;
cococart_slot_device &slot(int slot_number);
@@ -233,12 +232,6 @@ void coco_multipak_device::device_reset()
// INTERNAL ACCESSORS
//**************************************************************************
-cococart_slot_device &coco_multipak_device::owning_slot()
-{
- return *dynamic_cast<cococart_slot_device *>(owner());
-}
-
-
//-------------------------------------------------
// active_scs_slot_number
//-------------------------------------------------
diff --git a/src/devices/bus/coco/coco_pak.cpp b/src/devices/bus/coco/coco_pak.cpp
index b47a6060150..fb9e2c0b9fc 100644
--- a/src/devices/bus/coco/coco_pak.cpp
+++ b/src/devices/bus/coco/coco_pak.cpp
@@ -69,7 +69,6 @@ coco_pak_device::coco_pak_device(const machine_config &mconfig, const char *tag,
void coco_pak_device::device_start()
{
m_cart = dynamic_cast<device_image_interface *>(owner());
- m_owner = dynamic_cast<cococart_slot_device *>(owner());
}
diff --git a/src/devices/bus/coco/coco_t4426.cpp b/src/devices/bus/coco/coco_t4426.cpp
index 262ff8b49ce..06632286c29 100644
--- a/src/devices/bus/coco/coco_t4426.cpp
+++ b/src/devices/bus/coco/coco_t4426.cpp
@@ -111,7 +111,6 @@ namespace
// internal state
device_image_interface *m_cart;
- cococart_slot_device *m_owner;
uint8_t m_select;
optional_ioport m_autostart;
@@ -189,7 +188,6 @@ coco_t4426_device::coco_t4426_device(const machine_config &mconfig, device_type
: device_t(mconfig, type, tag, owner, clock)
, device_cococart_interface(mconfig, *this)
, m_cart(nullptr)
- , m_owner(nullptr)
, m_select(0)
, m_autostart(*this, CART_AUTOSTART_TAG)
, m_uart(*this, UART_TAG)
@@ -210,7 +208,6 @@ void coco_t4426_device::device_start()
{
LOG("%s()\n", FUNCNAME );
m_cart = dynamic_cast<device_image_interface *>(owner());
- m_owner = dynamic_cast<cococart_slot_device *>(owner());
}
@@ -242,7 +239,7 @@ void coco_t4426_device::device_reset()
{
LOG("%s()\n", FUNCNAME );
auto cart_line = cococart_slot_device::line_value::Q;
- m_owner->set_line_value(cococart_slot_device::line::CART, cart_line);
+ set_line_value(cococart_slot_device::line::CART, cart_line);
}
/*-------------------------------------------------
diff --git a/src/devices/bus/coco/cococart.cpp b/src/devices/bus/coco/cococart.cpp
index 199e4ee8d31..7da71acfc1b 100644
--- a/src/devices/bus/coco/cococart.cpp
+++ b/src/devices/bus/coco/cococart.cpp
@@ -429,6 +429,8 @@ std::string cococart_slot_device::get_default_card_software(get_default_card_sof
device_cococart_interface::device_cococart_interface(const machine_config &mconfig, device_t &device)
: device_slot_card_interface(mconfig, device)
+ , m_owning_slot(nullptr)
+ , m_host(nullptr)
{
}
@@ -443,6 +445,32 @@ device_cococart_interface::~device_cococart_interface()
//-------------------------------------------------
+// interface_config_complete
+//-------------------------------------------------
+
+void device_cococart_interface::interface_config_complete()
+{
+ m_owning_slot = dynamic_cast<cococart_slot_device *>(device().owner());
+ m_host = m_owning_slot
+ ? dynamic_cast<device_cococart_host_interface *>(m_owning_slot->owner())
+ : nullptr;
+}
+
+
+//-------------------------------------------------
+// interface_pre_start
+//-------------------------------------------------
+
+void device_cococart_interface::interface_pre_start()
+{
+ if (!m_owning_slot)
+ throw emu_fatalerror("Expected device().owner() to be of type cococart_slot_device");
+ if (!m_host)
+ throw emu_fatalerror("Expected m_owning_slot->owner() to be of type device_cococart_host_interface");
+}
+
+
+//-------------------------------------------------
// scs_read - Signifies a read where the SCS pin
// on the cartridge slot was asserted ($FF40-5F)
//-------------------------------------------------
@@ -509,13 +537,7 @@ void device_cococart_interface::cart_base_changed(void)
address_space &device_cococart_interface::cartridge_space()
{
- // sanity check - our parent should always be a cococart_slot_device
- assert(dynamic_cast<cococart_slot_device *>(device().owner()));
-
- // get my owner's owner - it had better implement device_cococart_host_interface
- device_cococart_host_interface *host = dynamic_cast<device_cococart_host_interface *>(device().owner()->owner());
- assert(host);
- return host->cartridge_space();
+ return host().cartridge_space();
}
diff --git a/src/devices/bus/coco/cococart.h b/src/devices/bus/coco/cococart.h
index 107894c6d23..56da91cb897 100644
--- a/src/devices/bus/coco/cococart.h
+++ b/src/devices/bus/coco/cococart.h
@@ -193,11 +193,18 @@ public:
virtual uint8_t* get_cart_base();
void set_cart_base_update(cococart_base_update_delegate update);
+ virtual void interface_config_complete() override;
+ virtual void interface_pre_start() override;
+
protected:
device_cococart_interface(const machine_config &mconfig, device_t &device);
void cart_base_changed(void);
+ // accessors for containers
+ cococart_slot_device &owning_slot() { assert(m_owning_slot); return *m_owning_slot; }
+ device_cococart_host_interface &host() { assert(m_host); return *m_host; }
+
// CoCo cartridges can read directly from the address bus. This is used by a number of
// cartridges (e.g. - Orch-90, Multi-Pak interface) for their control registers, independently
// of the SCS or CTS lines
@@ -210,7 +217,9 @@ protected:
void set_line_value(cococart_slot_device::line line, cococart_slot_device::line_value value);
private:
- cococart_base_update_delegate m_update;
+ cococart_base_update_delegate m_update;
+ cococart_slot_device * m_owning_slot;
+ device_cococart_host_interface * m_host;
};