diff options
Diffstat (limited to 'src/lib/formats/apridisk.cpp')
-rw-r--r-- | src/lib/formats/apridisk.cpp | 72 |
1 files changed, 40 insertions, 32 deletions
diff --git a/src/lib/formats/apridisk.cpp b/src/lib/formats/apridisk.cpp index a42aa9fa4d4..36ad6018336 100644 --- a/src/lib/formats/apridisk.cpp +++ b/src/lib/formats/apridisk.cpp @@ -1,4 +1,4 @@ -// license:GPL-2.0+ +// license:BSD-3-Clause // copyright-holders:Dirk Best /*************************************************************************** @@ -8,33 +8,39 @@ ***************************************************************************/ -#include "emu.h" -#include "imageutl.h" #include "apridisk.h" +#include "ioprocs.h" +#include "multibyte.h" + +#include "osdcore.h" // osd_printf_error + + apridisk_format::apridisk_format() { } -const char *apridisk_format::name() const +const char *apridisk_format::name() const noexcept { return "apridisk"; } -const char *apridisk_format::description() const +const char *apridisk_format::description() const noexcept { return "APRIDISK disk image"; } -const char *apridisk_format::extensions() const +const char *apridisk_format::extensions() const noexcept { return "dsk"; } -int apridisk_format::identify(io_generic *io, uint32_t form_factor) +int apridisk_format::identify(util::random_read &io, uint32_t form_factor, const std::vector<uint32_t> &variants) const { uint8_t header[APR_HEADER_SIZE]; - io_generic_read(io, header, 0, APR_HEADER_SIZE); + auto const [err, actual] = read_at(io, 0, header, APR_HEADER_SIZE); + if (err || (APR_HEADER_SIZE != actual)) + return 0; const char magic[] = "ACT Apricot disk image\x1a\x04"; @@ -44,35 +50,38 @@ int apridisk_format::identify(io_generic *io, uint32_t form_factor) return 0; } -bool apridisk_format::load(io_generic *io, uint32_t form_factor, floppy_image *image) +bool apridisk_format::load(util::random_read &io, uint32_t form_factor, const std::vector<uint32_t> &variants, floppy_image &image) const { desc_pc_sector sectors[80][2][18]; - uint8_t sector_data[MAX_SECTORS * SECTOR_SIZE]; - uint8_t *data_ptr = sector_data; + std::unique_ptr<uint8_t []> sector_data(new uint8_t [MAX_SECTORS * SECTOR_SIZE]); + uint8_t *data_ptr = sector_data.get(); int track_count = 0, head_count = 0, sector_count = 0; - uint64_t file_size = io_generic_size(io); + uint64_t file_size; + if (io.length(file_size)) + return false; + uint64_t file_offset = APR_HEADER_SIZE; while (file_offset < file_size) { // read sector header uint8_t sector_header[16]; - io_generic_read(io, sector_header, file_offset, 16); + read_at(io, file_offset, sector_header, 16); // FIXME: check for errors and premature EOF - uint32_t type = pick_integer_le(§or_header, 0, 4); - uint16_t compression = pick_integer_le(§or_header, 4, 2); - uint16_t header_size = pick_integer_le(§or_header, 6, 2); - uint32_t data_size = pick_integer_le(§or_header, 8, 4); + uint32_t type = get_u32le(§or_header[0]); + uint16_t compression = get_u16le(§or_header[4]); + uint16_t header_size = get_u16le(§or_header[6]); + uint32_t data_size = get_u32le(§or_header[8]); file_offset += header_size; switch (type) { case APR_SECTOR: - uint8_t head = pick_integer_le(§or_header, 12, 1); - uint8_t sector = pick_integer_le(§or_header, 13, 1); - uint8_t track = (uint8_t) pick_integer_le(§or_header, 14, 2); + uint8_t head = sector_header[12]; + uint8_t sector = sector_header[13]; + uint8_t track = (uint8_t) get_u16le(§or_header[14]); track_count = std::max(track_count, int(unsigned(track))); head_count = std::max(head_count, int(unsigned(head))); @@ -93,22 +102,26 @@ bool apridisk_format::load(io_generic *io, uint32_t form_factor, floppy_image *i case APR_COMPRESSED: { uint8_t comp[3]; - io_generic_read(io, comp, file_offset, 3); - uint16_t length = pick_integer_le(comp, 0, 2); + read_at(io, file_offset, comp, 3); // FIXME: check for errors and premature EOF + uint16_t length = get_u16le(&comp[0]); if (length != SECTOR_SIZE) - fatalerror("apridisk_format: Invalid compression length %04x\n", length); + { + osd_printf_error("apridisk_format: Invalid compression length %04x\n", length); + return false; + } memset(data_ptr, comp[2], SECTOR_SIZE); } break; case APR_UNCOMPRESSED: - io_generic_read(io, data_ptr, file_offset, SECTOR_SIZE); + read_at(io, file_offset, data_ptr, SECTOR_SIZE); // FIXME: check for errors and premature EOF break; default: - fatalerror("apridisk_format: Invalid compression %04x\n", compression); + osd_printf_error("apridisk_format: Invalid compression %04x\n", compression); + return false; } sectors[track][head][sector - 1].data = data_ptr; @@ -135,14 +148,9 @@ bool apridisk_format::load(io_generic *io, uint32_t form_factor, floppy_image *i return true; } -bool apridisk_format::save(io_generic *io, floppy_image *image) -{ - return false; -} - -bool apridisk_format::supports_save() const +bool apridisk_format::supports_save() const noexcept { return false; } -const floppy_format_type FLOPPY_APRIDISK_FORMAT = &floppy_image_format_creator<apridisk_format>; +const apridisk_format FLOPPY_APRIDISK_FORMAT; |