summaryrefslogtreecommitdiffstatshomepage
path: root/src/emu/image.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/emu/image.cpp')
-rw-r--r--src/emu/image.cpp47
1 files changed, 33 insertions, 14 deletions
diff --git a/src/emu/image.cpp b/src/emu/image.cpp
index 5e58758eb89..3839a57549b 100644
--- a/src/emu/image.cpp
+++ b/src/emu/image.cpp
@@ -14,8 +14,11 @@
#include "config.h"
#include "drivenum.h"
#include "emuopts.h"
+#include "fileio.h"
+#include "main.h"
#include "softlist.h"
+// lib/util
#include "corestr.h"
#include "xmlfile.h"
#include "zippath.h"
@@ -37,6 +40,9 @@ image_manager::image_manager(running_machine &machine)
// make sure that any required devices have been allocated
for (device_image_interface &image : image_interface_enumerator(machine.root_device()))
{
+ // see if region-based chds are available
+ image.check_preset_images();
+
// ignore things not user loadable
if (!image.user_loadable())
continue;
@@ -48,27 +54,32 @@ image_manager::image_manager(running_machine &machine)
if (!startup_image.empty())
{
// we do have a startup image specified - load it
- image_init_result result = image_init_result::FAIL;
+ std::pair<std::error_condition, std::string> result(image_error::UNSPECIFIED, std::string());
// try as a softlist
if (software_name_parse(startup_image))
+ {
+ osd_printf_verbose("%s: attempting to load software item %s\n", image.device().tag(), startup_image);
result = image.load_software(startup_image);
+ }
// failing that, try as an image
- if (result != image_init_result::PASS)
+ if (result.first)
+ {
+ osd_printf_verbose("%s: attempting to load media image %s\n", image.device().tag(), startup_image);
result = image.load(startup_image);
+ }
// failing that, try creating it (if appropriate)
- if (result != image_init_result::PASS && image.support_command_line_image_creation())
+ if (result.first && image.support_command_line_image_creation())
+ {
+ osd_printf_verbose("%s: attempting to create media image %s\n", image.device().tag(), startup_image);
result = image.create(startup_image);
+ }
// did the image load fail?
- if (result != image_init_result::PASS)
+ if (result.first)
{
- // retrieve image error message
- std::string image_err = std::string(image.error());
- std::string startup_image_name = startup_image;
-
// unload the bad image
image.unload();
@@ -77,11 +88,18 @@ image_manager::image_manager(running_machine &machine)
if (machine.options().write_config())
write_config(machine.options(), nullptr, &machine.system());
- throw emu_fatalerror(EMU_ERR_DEVICE, "Device %s load (-%s %s) failed: %s",
+ // retrieve image error message
+ throw emu_fatalerror(EMU_ERR_DEVICE,
+ !result.second.empty()
+ ? "Device %1$s load (-%2$s %3$s) failed: %4$s (%5$s:%6$d %7$s)"
+ : "Device %1$s load (-%2$s %3$s) failed: %7$s (%5$s:%6$d)",
image.device().name(),
image.instance_name(),
- startup_image_name,
- image_err);
+ startup_image,
+ result.second,
+ result.first.category().name(),
+ result.first.value(),
+ result.first.message());
}
}
}
@@ -240,13 +258,14 @@ void image_manager::postdevice_init()
/* make sure that any required devices have been allocated */
for (device_image_interface &image : image_interface_enumerator(machine().root_device()))
{
- image_init_result result = image.finish_load();
+ auto [result, image_err] = image.finish_load();
/* did the image load fail? */
- if (result != image_init_result::PASS)
+ if (result)
{
/* retrieve image error message */
- std::string image_err = std::string(image.error());
+ if (image_err.empty())
+ image_err = result.message();
/* unload all images */
unload_all();