diff options
Diffstat (limited to 'src/devices/bus/cpc/cpc_rom.cpp')
-rw-r--r-- | src/devices/bus/cpc/cpc_rom.cpp | 27 |
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()); } |