diff options
Diffstat (limited to 'src/devices/bus/vboy/slot.cpp')
-rw-r--r-- | src/devices/bus/vboy/slot.cpp | 78 |
1 files changed, 42 insertions, 36 deletions
diff --git a/src/devices/bus/vboy/slot.cpp b/src/devices/bus/vboy/slot.cpp index 70dd9e05063..9b9cf4e88ea 100644 --- a/src/devices/bus/vboy/slot.cpp +++ b/src/devices/bus/vboy/slot.cpp @@ -12,10 +12,12 @@ #include "emuopts.h" #include "romload.h" +#include "softlist.h" #include <cstring> //#define VERBOSE 1 +//#define LOG_OUTPUT_FUNC osd_printf_info #include "logmacro.h" @@ -26,13 +28,14 @@ DEFINE_DEVICE_TYPE(VBOY_CART_SLOT, vboy_cart_slot_device, "vboy_cart_slot", "Nintendo Virtual Boy Cartridge Slot") + //************************************************************************** // vboy_cart_slot_device //************************************************************************** vboy_cart_slot_device::vboy_cart_slot_device(machine_config const &mconfig, char const *tag, device_t *owner, u32 clock) : device_t(mconfig, VBOY_CART_SLOT, tag, owner, clock), - device_image_interface(mconfig, *this), + device_cartrom_image_interface(mconfig, *this), device_single_card_slot_interface<device_vboy_cart_interface>(mconfig, *this), m_intcro(*this), m_exp_space(*this, finder_base::DUMMY_TAG, -1, 32), @@ -46,38 +49,36 @@ vboy_cart_slot_device::vboy_cart_slot_device(machine_config const &mconfig, char } -image_init_result vboy_cart_slot_device::call_load() +std::pair<std::error_condition, std::string> vboy_cart_slot_device::call_load() { if (!m_cart) - return image_init_result::PASS; + return std::make_pair(std::error_condition(), std::string()); memory_region *romregion(loaded_through_softlist() ? memregion("rom") : nullptr); if (loaded_through_softlist() && !romregion) - { - seterror(image_error::INVALIDIMAGE, "Software list item has no 'rom' data area"); - return image_init_result::FAIL; - } + return std::make_pair(image_error::BADSOFTWARE, "Software list item has no 'rom' data area"); u32 const len(loaded_through_softlist() ? romregion->bytes() : length()); if ((0x0000'0003 & len) || (0x0100'0000 < len)) - { - seterror(image_error::INVALIDIMAGE, "Unsupported cartridge size (must be a multiple of 4 bytes no larger than 16 MiB)"); - return image_init_result::FAIL; - } + return std::make_pair(image_error::INVALIDLENGTH, "Unsupported cartridge size (must be a multiple of 4 bytes no larger than 16 MiB)"); if (!loaded_through_softlist()) { LOG("Allocating %u byte cartridge ROM region\n", len); - romregion = machine().memory().region_alloc(subtag("rom").c_str(), len, 4, ENDIANNESS_LITTLE); - u32 const cnt(fread(romregion->base(), len)); + romregion = machine().memory().region_alloc(subtag("rom"), len, 4, ENDIANNESS_LITTLE); + u32 *const rombase(reinterpret_cast<u32 *>(romregion->base())); + u32 const cnt(fread(rombase, len)); if (cnt != len) + return std::make_pair(std::errc::io_error, "Error reading cartridge file"); + + if (ENDIANNESS_NATIVE != ENDIANNESS_LITTLE) { - seterror(image_error::UNSPECIFIED, "Error reading cartridge file"); - return image_init_result::FAIL; + for (u32 i = 0; (len / 4) > i; ++i) + rombase[i] = swapendian_int32(rombase[i]); } } - return m_cart->load(); + return std::make_pair(m_cart->load(), std::string()); } @@ -101,12 +102,6 @@ void vboy_cart_slot_device::device_validity_check(validity_checker &valid) const } -void vboy_cart_slot_device::device_resolve_objects() -{ - m_intcro.resolve_safe(); -} - - void vboy_cart_slot_device::device_start() { if (!m_exp_space && ((m_exp_space.finder_tag() != finder_base::DUMMY_TAG) || (m_exp_space.spacenum() >= 0))) @@ -124,27 +119,38 @@ void vboy_cart_slot_device::device_start() std::string vboy_cart_slot_device::get_default_card_software(get_default_card_software_hook &hook) const { - std::string const image_name(mconfig().options().image_option(instance_name()).value()); - software_part const *const part(!image_name.empty() ? find_software_item(image_name, true) : nullptr); - if (part) + if (hook.image_file()) { - //printf("[%s] Found software part for image name '%s'\n", tag(), image_name.c_str()); - for (rom_entry const &entry : part->romdata()) + // TODO: is there a header field or something indicating presence of save RAM? + osd_printf_verbose("[%s] Assuming plain ROM cartridge\n", tag()); + return "flatrom"; + } + else + { + std::string const image_name(mconfig().options().image_option(instance_name()).value()); + software_part const *const part(!image_name.empty() ? find_software_item(image_name, true) : nullptr); + if (part) { - if (ROMENTRY_ISREGION(entry) && (entry.name() == "sram")) + osd_printf_verbose("[%s] Found software part for image name '%s'\n", tag(), image_name); + for (rom_entry const &entry : part->romdata()) { - //printf("[%s] Found 'sram' data area, enabling cartridge backup RAM\n", tag()); - return "flatrom_sram"; + if (ROMENTRY_ISREGION(entry) && (entry.name() == "sram")) + { + osd_printf_verbose("[%s] Found 'sram' data area, enabling cartridge backup RAM\n", tag()); + return "flatrom_sram"; + } } + osd_printf_verbose("[%s] No 'sram' data area found, assuming plain ROM cartridge\n", tag()); + return "flatrom"; + } + else + { + osd_printf_verbose("[%s] No software part found for image name '%s'\n", tag(), image_name); } - } - else - { - //printf("[%s] No software part found for image name '%s'\n", tag(), image_name.c_str()); } - //printf("[%s] Assuming plain ROM cartridge\n", tag()); - return "flatrom"; + // leave the slot empty + return std::string(); } |