diff options
Diffstat (limited to 'src/devices/imagedev/harddriv.cpp')
-rw-r--r-- | src/devices/imagedev/harddriv.cpp | 218 |
1 files changed, 128 insertions, 90 deletions
diff --git a/src/devices/imagedev/harddriv.cpp b/src/devices/imagedev/harddriv.cpp index ff623d58150..14f4337f9d8 100644 --- a/src/devices/imagedev/harddriv.cpp +++ b/src/devices/imagedev/harddriv.cpp @@ -17,9 +17,11 @@ #include "harddriv.h" #include "emuopts.h" +#include "fileio.h" #include "harddisk.h" #include "romload.h" +#include "multibyte.h" #include "opresolv.h" @@ -39,6 +41,16 @@ static char const *const hd_option_spec = DEFINE_DEVICE_TYPE(HARDDISK, harddisk_image_device, "harddisk_image", "Harddisk") //------------------------------------------------- +// harddisk_image_base_device - constructor +//------------------------------------------------- + +harddisk_image_base_device::harddisk_image_base_device(const machine_config &mconfig, device_type type, const char *tag, device_t *owner, uint32_t clock) + : device_t(mconfig, type, tag, owner, clock) + , device_image_interface(mconfig, *this) +{ +} + +//------------------------------------------------- // harddisk_image_device - constructor //------------------------------------------------- @@ -50,14 +62,14 @@ harddisk_image_device::harddisk_image_device(const machine_config &mconfig, cons //------------------------------------------------- // harddisk_image_device - constructor for subclasses //------------------------------------------------- + harddisk_image_device::harddisk_image_device(const machine_config &mconfig, device_type type, const char *tag, device_t *owner, uint32_t clock) - : device_t(mconfig, type, tag, owner, clock), - device_image_interface(mconfig, *this), - m_chd(nullptr), - m_hard_disk_handle(nullptr), - m_device_image_load(*this), - m_device_image_unload(*this), - m_interface(nullptr) + : harddisk_image_base_device(mconfig, type, tag, owner, clock) + , m_chd(nullptr) + , m_hard_disk_handle() + , m_device_image_load(*this) + , m_device_image_unload(*this) + , m_interface(nullptr) { } @@ -96,44 +108,32 @@ void harddisk_image_device::device_start() m_chd = nullptr; - // try to locate the CHD from a DISK_REGION - chd_file *handle = machine().rom_load().get_disk_handle(tag()); - if (handle != nullptr) - { - m_hard_disk_handle = hard_disk_open(handle); - } + if (has_preset_images()) + setup_current_preset_image(); else - { - m_hard_disk_handle = nullptr; - } + m_hard_disk_handle.reset(); } void harddisk_image_device::device_stop() { - if (m_hard_disk_handle != nullptr) - { - hard_disk_close(m_hard_disk_handle); - m_hard_disk_handle = nullptr; - } + m_hard_disk_handle.reset(); } -image_init_result harddisk_image_device::call_load() +std::pair<std::error_condition, std::string> harddisk_image_device::call_load() { - image_init_result our_result; + std::error_condition our_result = internal_load_hd(); - our_result = internal_load_hd(); - - /* Check if there is an image_load callback defined */ - if (!m_device_image_load.isnull()) + // Check if there is an image_load callback defined + if (!our_result && !m_device_image_load.isnull()) { - /* Let the override do some additional work/checks */ + // Let the override do some additional work/checks our_result = m_device_image_load(*this); } - return our_result; + return std::make_pair(our_result, std::string()); } -image_init_result harddisk_image_device::call_create(int create_format, util::option_resolution *create_args) +std::pair<std::error_condition, std::string> harddisk_image_device::call_create(int create_format, util::option_resolution *create_args) { if (!create_args) throw emu_fatalerror("harddisk_image_device::call_create: Expected create_args to not be nullptr"); @@ -146,36 +146,38 @@ image_init_result harddisk_image_device::call_create(int create_format, util::op const uint32_t totalsectors = cylinders * heads * sectors; - /* create the CHD file */ + // create the CHD file chd_codec_type compression[4] = { CHD_CODEC_NONE }; util::core_file::ptr proxy; std::error_condition err = util::core_file::open_proxy(image_core_file(), proxy); if (!err) err = m_origchd.create(std::move(proxy), uint64_t(totalsectors) * uint64_t(sectorsize), hunksize, sectorsize, compression); if (err) - return image_init_result::FAIL; + return std::make_pair(err, std::string()); - /* if we created the image and hence, have metadata to set, set the metadata */ + // if we created the image and hence, have metadata to set, set the metadata err = m_origchd.write_metadata(HARD_DISK_METADATA_TAG, 0, string_format(HARD_DISK_METADATA_FORMAT, cylinders, heads, sectors, sectorsize)); m_origchd.close(); if (err) - return image_init_result::FAIL; + return std::make_pair(err, std::string()); + + return std::make_pair(internal_load_hd(), std::string()); +} - return internal_load_hd(); +void harddisk_image_device::setup_current_preset_image() +{ + chd_file *chd = current_preset_image_chd(); + m_hard_disk_handle.reset(new hard_disk_file(chd)); } void harddisk_image_device::call_unload() { - /* Check if there is an image_unload callback defined */ + // Check if there is an image_unload callback defined if (!m_device_image_unload.isnull()) m_device_image_unload(*this); - if (m_hard_disk_handle) - { - hard_disk_close(m_hard_disk_handle); - m_hard_disk_handle = nullptr; - } + m_hard_disk_handle.reset(); if (m_chd) { @@ -228,19 +230,21 @@ static std::error_condition open_disk_diff(emu_options &options, const char *nam return std::errc::no_such_file_or_directory; } -image_init_result harddisk_image_device::internal_load_hd() +std::error_condition harddisk_image_device::internal_load_hd() { + if (has_preset_images()) + { + setup_current_preset_image(); + return std::error_condition(); + } + std::error_condition err; m_chd = nullptr; uint8_t header[64]; - if (m_hard_disk_handle) - { - hard_disk_close(m_hard_disk_handle); - m_hard_disk_handle = nullptr; - } + m_hard_disk_handle.reset(); - /* open the CHD file */ + // open the CHD file if (loaded_through_softlist()) { m_chd = machine().rom_load().get_disk_handle(device().subtag("harddriv").c_str()); @@ -282,67 +286,101 @@ image_init_result harddisk_image_device::internal_load_hd() if (m_chd) { - /* open the hard disk file */ - m_hard_disk_handle = hard_disk_open(m_chd); - if (m_hard_disk_handle) - return image_init_result::PASS; + // open the hard disk file + try + { + m_hard_disk_handle.reset(new hard_disk_file(m_chd)); + if (m_hard_disk_handle) + return std::error_condition(); + } + catch (...) + { + err = image_error::INVALIDIMAGE; + } + } + else if (!is_open()) + { + err = image_error::UNSPECIFIED; } else { - if (is_open()) - { - uint32_t skip = 0; + uint32_t skip = 0; - // check for 2MG format - if (!memcmp(header, "2IMG", 4)) + if (!memcmp(header, "2IMG", 4)) // check for 2MG format + { + skip = get_u32le(&header[0x18]); + osd_printf_verbose("harddriv: detected 2MG, creator is %c%c%c%c, data at %08x\n", header[4], header[5], header[6], header[7], skip); + } + else if (is_filetype("hdi")) // check for HDI format + { + skip = get_u32le(&header[0x8]); + uint32_t data_size = get_u32le(&header[0xc]); + if (data_size == length() - skip) { - skip = header[0x18] | (header[0x19] << 8) | (header[0x1a] << 16) | (header[0x1b] << 24); - osd_printf_verbose("harddriv: detected 2MG, creator is %c%c%c%c, data at %08x\n", header[4], header[5], header[6], header[7], skip); + osd_printf_verbose("harddriv: detected Anex86 HDI, data at %08x\n", skip); } - // check for HDI format - else if (is_filetype("hdi")) + else { - skip = header[0x8] | (header[0x9] << 8) | (header[0xa] << 16) | (header[0xb] << 24); - uint32_t data_size = header[0xc] | (header[0xd] << 8) | (header[0xe] << 16) | (header[0xf] << 24); - if (data_size == length() - skip) - { - osd_printf_verbose("harddriv: detected Anex86 HDI, data at %08x\n", skip); - } - else - { - skip = 0; - } + skip = 0; } + } - m_hard_disk_handle = hard_disk_open(image_core_file(), skip); + try + { + m_hard_disk_handle.reset(new hard_disk_file(image_core_file(), skip)); if (m_hard_disk_handle) - return image_init_result::PASS; + return std::error_condition(); + } + catch (...) + { + err = image_error::INVALIDIMAGE; } - - return image_init_result::FAIL; } /* if we had an error, close out the CHD */ - m_origchd.close(); m_diffchd.close(); + m_origchd.close(); m_chd = nullptr; - seterror(err, nullptr); - return image_init_result::FAIL; + if (err) + return err; + else + return image_error::UNSPECIFIED; } -/************************************* - * - * Get the CHD file (from the src/chd.c core) - * after an image has been opened with the hd core - * - *************************************/ +const hard_disk_file::info &harddisk_image_device::get_info() const +{ + return m_hard_disk_handle->get_info(); +} -chd_file *harddisk_image_device::get_chd_file() +bool harddisk_image_device::read(uint32_t lbasector, void *buffer) { - chd_file *result = nullptr; - hard_disk_file *hd_file = get_hard_disk_file(); - if (hd_file) - result = hard_disk_get_chd(hd_file); - return result; + return m_hard_disk_handle->read(lbasector, buffer); } + +bool harddisk_image_device::write(uint32_t lbasector, const void *buffer) +{ + return m_hard_disk_handle->write(lbasector, buffer); +} + + +bool harddisk_image_device::set_block_size(uint32_t blocksize) +{ + return m_hard_disk_handle->set_block_size(blocksize); +} + +std::error_condition harddisk_image_device::get_inquiry_data(std::vector<uint8_t> &data) const +{ + return m_hard_disk_handle->get_inquiry_data(data); +} + +std::error_condition harddisk_image_device::get_cis_data(std::vector<uint8_t> &data) const +{ + return m_hard_disk_handle->get_cis_data(data); +} + +std::error_condition harddisk_image_device::get_disk_key_data(std::vector<uint8_t> &data) const +{ + return m_hard_disk_handle->get_disk_key_data(data); +} + |