diff options
Diffstat (limited to 'src/lib/formats/apridisk.cpp')
-rw-r--r-- | src/lib/formats/apridisk.cpp | 55 |
1 files changed, 29 insertions, 26 deletions
diff --git a/src/lib/formats/apridisk.cpp b/src/lib/formats/apridisk.cpp index aad688167cf..36ad6018336 100644 --- a/src/lib/formats/apridisk.cpp +++ b/src/lib/formats/apridisk.cpp @@ -10,32 +10,37 @@ #include "apridisk.h" -#include "imageutl.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"; @@ -45,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]; 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))); @@ -94,8 +102,8 @@ 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) { @@ -108,7 +116,7 @@ bool apridisk_format::load(io_generic *io, uint32_t form_factor, floppy_image *i 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: @@ -140,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; |