summaryrefslogtreecommitdiffstatshomepage
path: root/src/devices/bus/nubus/nubus_image.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/devices/bus/nubus/nubus_image.cpp')
-rw-r--r--src/devices/bus/nubus/nubus_image.cpp38
1 files changed, 18 insertions, 20 deletions
diff --git a/src/devices/bus/nubus/nubus_image.cpp b/src/devices/bus/nubus/nubus_image.cpp
index bcf072338a6..3d17b2500a1 100644
--- a/src/devices/bus/nubus/nubus_image.cpp
+++ b/src/devices/bus/nubus/nubus_image.cpp
@@ -40,19 +40,16 @@ public:
// construction/destruction
messimg_disk_image_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock);
- // image-level overrides
- virtual iodevice_t image_type() const noexcept override { return IO_QUICKLOAD; }
-
+ // device_image_interface implementation
virtual bool is_readable() const noexcept override { return true; }
virtual bool is_writeable() const noexcept override { return true; }
virtual bool is_creatable() const noexcept override { return false; }
- virtual bool must_be_loaded() const noexcept override { return false; }
virtual bool is_reset_on_load() const noexcept override { return false; }
virtual const char *file_extensions() const noexcept override { return "img"; }
- virtual const char *custom_instance_name() const noexcept override { return "disk"; }
- virtual const char *custom_brief_instance_name() const noexcept override { return "disk"; }
+ virtual const char *image_type_name() const noexcept override { return "disk"; }
+ virtual const char *image_brief_type_name() const noexcept override { return "disk"; }
- virtual image_init_result call_load() override;
+ virtual std::pair<std::error_condition, std::string> call_load() override;
virtual void call_unload() override;
protected:
@@ -92,22 +89,24 @@ void nubus_image_device::messimg_disk_image_device::device_start()
}
}
-image_init_result nubus_image_device::messimg_disk_image_device::call_load()
+std::pair<std::error_condition, std::string> nubus_image_device::messimg_disk_image_device::call_load()
{
- fseek(0, SEEK_END);
- m_size = uint32_t(ftell());
+ m_size = length();
if (m_size > (256*1024*1024))
{
- osd_printf_error("Mac image too large: must be 256MB or less!\n");
m_size = 0;
- return image_init_result::FAIL;
+ return std::make_pair(image_error::INVALIDLENGTH, "Image file is too large (must be no more than 256MB)");
}
+ m_data.reset(new (std::nothrow) uint8_t [m_size]);
+ if (!m_data)
+ return std::make_pair(std::errc::not_enough_memory, "Error allocating memory for volume image");
+
fseek(0, SEEK_SET);
- fread(m_data, m_size);
+ fread(m_data.get(), m_size);
m_ejected = false;
- return image_init_result::PASS;
+ return std::make_pair(std::error_condition(), std::string());
}
void nubus_image_device::messimg_disk_image_device::call_unload()
@@ -186,7 +185,7 @@ void nubus_image_device::device_start()
uint32_t slotspace;
uint32_t superslotspace;
- install_declaration_rom(this, IMAGE_ROM_REGION);
+ install_declaration_rom(IMAGE_ROM_REGION);
slotspace = get_slotspace();
superslotspace = get_super_slotspace();
@@ -245,8 +244,8 @@ uint32_t nubus_image_device::image_r()
void nubus_image_device::image_super_w(offs_t offset, uint32_t data, uint32_t mem_mask)
{
uint32_t *image = (uint32_t*)m_image->m_data.get();
- data = ((data & 0xff) << 24) | ((data & 0xff00) << 8) | ((data & 0xff0000) >> 8) | ((data & 0xff000000) >> 24);
- mem_mask = ((mem_mask & 0xff) << 24) | ((mem_mask & 0xff00) << 8) | ((mem_mask & 0xff0000) >> 8) | ((mem_mask & 0xff000000) >> 24);
+ data = swapendian_int32(data);
+ mem_mask = swapendian_int32(mem_mask);
COMBINE_DATA(&image[offset]);
}
@@ -254,13 +253,12 @@ void nubus_image_device::image_super_w(offs_t offset, uint32_t data, uint32_t me
uint32_t nubus_image_device::image_super_r(offs_t offset, uint32_t mem_mask)
{
uint32_t *image = (uint32_t*)m_image->m_data.get();
- uint32_t data = image[offset];
- return ((data & 0xff) << 24) | ((data & 0xff00) << 8) | ((data & 0xff0000) >> 8) | ((data & 0xff000000) >> 24);
+ return swapendian_int32(image[offset]);
}
void nubus_image_device::file_cmd_w(uint32_t data)
{
-// data = ((data & 0xff) << 24) | ((data & 0xff00) << 8) | ((data & 0xff0000) >> 8) | ((data & 0xff000000) >> 24);
+// data = swapendian_int32(data);
filectx.curcmd = data;
switch (data) {
case kFileCmdGetDir: