summaryrefslogtreecommitdiffstatshomepage
path: root/src/devices/imagedev/harddriv.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/devices/imagedev/harddriv.cpp')
-rw-r--r--src/devices/imagedev/harddriv.cpp218
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);
+}
+