summaryrefslogtreecommitdiffstatshomepage
path: root/src/devices/bus/cpc/cpc_rom.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/devices/bus/cpc/cpc_rom.cpp')
-rw-r--r--src/devices/bus/cpc/cpc_rom.cpp27
1 files changed, 13 insertions, 14 deletions
diff --git a/src/devices/bus/cpc/cpc_rom.cpp b/src/devices/bus/cpc/cpc_rom.cpp
index e8d17b61623..fee8cf3fdca 100644
--- a/src/devices/bus/cpc/cpc_rom.cpp
+++ b/src/devices/bus/cpc/cpc_rom.cpp
@@ -9,6 +9,9 @@
#include "emu.h"
#include "cpc_rom.h"
+#include <tuple>
+
+
DEFINE_DEVICE_TYPE(CPC_ROM, cpc_rom_device, "cpc_rom", "CPC ROM Box")
void cpc_exp_cards(device_slot_interface &device);
@@ -103,20 +106,16 @@ void cpc_rom_image_device::device_start()
-------------------------------------------------*/
std::pair<std::error_condition, std::string> cpc_rom_image_device::call_load()
{
- uint64_t const size = length();
-
- m_base = std::make_unique<uint8_t[]>(16384);
- if(size <= 16384)
- {
- fread(m_base, size);
- }
- else
- {
- fseek(size - 16384, SEEK_SET);
- fread(m_base, 16384);
- }
-
- return std::make_pair(std::error_condition(), std::string());
+ uint64_t const total = length();
+ size_t const size = std::min<uint64_t>(total, 16384);
+
+ std::error_condition err;
+ size_t actual;
+ std::tie(err, m_base, actual) = read_at(image_core_file(), total - size, size);
+ if (!err && (actual != size))
+ err = std::errc::io_error;
+
+ return std::make_pair(err, std::string());
}