summaryrefslogtreecommitdiffstatshomepage
path: root/src/emu/diimage.cpp
diff options
context:
space:
mode:
author AJR <ajrhacker@users.noreply.github.com>2017-01-11 13:00:41 -0500
committer AJR <ajrhacker@users.noreply.github.com>2017-01-11 13:00:41 -0500
commit17af0f9c661e0855607703faf66c1e807e888d82 (patch)
tree255a931739f376567f907ee8c5dcefe0f97168b1 /src/emu/diimage.cpp
parentcd79b1a7ece801efc0411e87462a62a28e9834e5 (diff)
Make "requirement" field in softlists actually work (MT 6464)
(nw) MAME's architecture for software loading remains gruesomely overcomplicated, and this makes it even less efficient than it already was. However, I think more invasive cleanups would best be left until later.
Diffstat (limited to 'src/emu/diimage.cpp')
-rw-r--r--src/emu/diimage.cpp47
1 files changed, 32 insertions, 15 deletions
diff --git a/src/emu/diimage.cpp b/src/emu/diimage.cpp
index e4977f2de3d..72b761fbb91 100644
--- a/src/emu/diimage.cpp
+++ b/src/emu/diimage.cpp
@@ -1153,13 +1153,31 @@ image_init_result device_image_interface::load_software(const std::string &softw
bool device_image_interface::open_image_file(emu_options &options)
{
const char* path = options.value(instance_name());
- if (*path != 0)
+ if (*path != 0 && m_software_part_ptr == nullptr)
{
set_init_phase();
if (load_internal(path, false, 0, nullptr, true) == image_init_result::PASS)
{
if (software_entry()==nullptr) return true;
}
+ else
+ m_software_part_ptr = find_software_item(path, true);
+
+ // if we're loading from a software list, check requirements
+ if (m_software_part_ptr != nullptr)
+ {
+ const char *requirement = m_software_part_ptr->feature("requirement");
+ if (requirement != nullptr)
+ {
+ const software_part *req_swpart = find_software_item(requirement, false);
+ if (req_swpart != nullptr)
+ {
+ device_image_interface *req_image = software_list_device::find_mountable_image(device().mconfig(), *req_swpart);
+ if (req_image != nullptr)
+ req_image->m_software_part_ptr = req_swpart;
+ }
+ }
+ }
}
return false;
}
@@ -1429,7 +1447,7 @@ bool device_image_interface::load_software_part(const std::string &identifier, c
#ifdef UNUSED_VARIABLE
// Tell the world which part we actually loaded
- std::string full_sw_name = string_format("%s:%s:%s", swlist.list_name(), swpart->info().shortname(), swpart->name());
+ std::string full_sw_name = string_format("%s:%s:%s", swlist->list_name(), swpart->info().shortname(), swpart->name());
#endif
// check compatibility
@@ -1458,7 +1476,8 @@ bool device_image_interface::load_software_part(const std::string &identifier, c
if (req_image != nullptr)
{
req_image->set_init_phase();
- req_image->load(requirement);
+ if (req_image->load_software(requirement) != image_init_result::PASS)
+ result = false;
}
}
}
@@ -1473,20 +1492,18 @@ bool device_image_interface::load_software_part(const std::string &identifier, c
std::string device_image_interface::software_get_default_slot(const char *default_card_slot) const
{
- const char *path = device().mconfig().options().value(instance_name());
- std::string result;
- if (*path != '\0')
+ if (m_software_part_ptr != nullptr)
{
- result.assign(default_card_slot);
- const software_part *swpart = find_software_item(path, true);
- if (swpart != nullptr)
- {
- const char *slot = swpart->feature("slot");
- if (slot != nullptr)
- result.assign(slot);
- }
+ // use slot value if available
+ const char *slot = m_software_part_ptr->feature("slot");
+ return (slot != nullptr) ? slot : default_card_slot;
}
- return result;
+
+ // necessary for image file creation???
+ if (*device().mconfig().options().value(instance_name()) != '\0')
+ return default_card_slot;
+
+ return std::string();
}
//----------------------------------------------------------------------------