summaryrefslogtreecommitdiffstatshomepage
path: root/src/devices/bus/plus4/exp.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/devices/bus/plus4/exp.cpp')
-rw-r--r--src/devices/bus/plus4/exp.cpp75
1 files changed, 21 insertions, 54 deletions
diff --git a/src/devices/bus/plus4/exp.cpp b/src/devices/bus/plus4/exp.cpp
index 83e8ad4277a..b475875145c 100644
--- a/src/devices/bus/plus4/exp.cpp
+++ b/src/devices/bus/plus4/exp.cpp
@@ -36,15 +36,11 @@ DEFINE_DEVICE_TYPE(PLUS4_EXPANSION_SLOT, plus4_expansion_slot_device, "plus4_exp
//-------------------------------------------------
device_plus4_expansion_card_interface::device_plus4_expansion_card_interface(const machine_config &mconfig, device_t &device) :
- device_slot_card_interface(mconfig, device),
- m_c1l(*this, "c1l"),
- m_c1h(*this, "c1h"),
- m_c2l(*this, "c2l"),
- m_c2h(*this, "c2h"),
- m_c1l_mask(0),
- m_c1h_mask(0),
- m_c2l_mask(0),
- m_c2h_mask(0)
+ device_interface(device, "plus4exp"),
+ m_c1l_size(0),
+ m_c1h_size(0),
+ m_c2l_size(0),
+ m_c2h_size(0)
{
m_slot = dynamic_cast<plus4_expansion_slot_device *>(device.owner());
}
@@ -70,61 +66,24 @@ device_plus4_expansion_card_interface::~device_plus4_expansion_card_interface()
plus4_expansion_slot_device::plus4_expansion_slot_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock) :
device_t(mconfig, PLUS4_EXPANSION_SLOT, tag, owner, clock),
- device_slot_interface(mconfig, *this),
- device_image_interface(mconfig, *this),
+ device_single_card_slot_interface<device_plus4_expansion_card_interface>(mconfig, *this),
+ device_cartrom_image_interface(mconfig, *this),
m_write_irq(*this),
- m_read_dma_cd(*this),
+ m_read_dma_cd(*this, 0xff),
m_write_dma_cd(*this),
- m_write_aec(*this), m_card(nullptr)
+ m_write_aec(*this),
+ m_card(nullptr)
{
}
//-------------------------------------------------
-// device_validity_check -
-//-------------------------------------------------
-
-void plus4_expansion_slot_device::device_validity_check(validity_checker &valid) const
-{
- device_t *const carddev = get_card_device();
- if (carddev && !dynamic_cast<device_plus4_expansion_card_interface *>(carddev))
- osd_printf_error("Card device %s (%s) does not implement device_plus4_expansion_card_interface\n", carddev->tag(), carddev->name());
-}
-
-
-//-------------------------------------------------
// device_start - device-specific startup
//-------------------------------------------------
void plus4_expansion_slot_device::device_start()
{
- device_t *const carddev = get_card_device();
- m_card = dynamic_cast<device_plus4_expansion_card_interface *>(carddev);
- if (carddev && !m_card)
- fatalerror("Card device %s (%s) does not implement device_plus4_expansion_card_interface\n", carddev->tag(), carddev->name());
-
- // resolve callbacks
- m_write_irq.resolve_safe();
- m_read_dma_cd.resolve_safe(0xff);
- m_write_dma_cd.resolve_safe();
- m_write_aec.resolve_safe();
-
- // inherit bus clock
- if (clock() == 0)
- {
- plus4_expansion_slot_device *root = machine().device<plus4_expansion_slot_device>(PLUS4_EXPANSION_SLOT_TAG);
- assert(root);
- set_unscaled_clock(root->clock());
- }
-}
-
-
-//-------------------------------------------------
-// device_reset - device-specific reset
-//-------------------------------------------------
-
-void plus4_expansion_slot_device::device_reset()
-{
+ m_card = get_card_device();
}
@@ -132,13 +91,14 @@ void plus4_expansion_slot_device::device_reset()
// call_load -
//-------------------------------------------------
-image_init_result plus4_expansion_slot_device::call_load()
+std::pair<std::error_condition, std::string> plus4_expansion_slot_device::call_load()
{
if (m_card)
{
if (!loaded_through_softlist())
{
// TODO
+ return std::make_pair(image_error::UNSUPPORTED, "Plus/4 Expansion software must be loaded from the software list");
}
else
{
@@ -146,10 +106,17 @@ image_init_result plus4_expansion_slot_device::call_load()
load_software_region("c1h", m_card->m_c1h);
load_software_region("c2l", m_card->m_c2l);
load_software_region("c2h", m_card->m_c2h);
+ m_card->m_c1l_size = get_software_region_length("c1l");
+ m_card->m_c1h_size = get_software_region_length("c1h");
+ m_card->m_c2l_size = get_software_region_length("c2l");
+ m_card->m_c2h_size = get_software_region_length("c2h");
+
+ if ((m_card->m_c1l_size & (m_card->m_c1l_size - 1)) || (m_card->m_c1h_size & (m_card->m_c1h_size - 1)) || (m_card->m_c2l_size & (m_card->m_c2l_size - 1)) || (m_card->m_c2h_size & (m_card->m_c2h_size - 1)))
+ return std::make_pair(image_error::INVALIDLENGTH, "All ROM sizes must be powers of 2");
}
}
- return image_init_result::PASS;
+ return std::make_pair(std::error_condition(), std::string());
}