diff options
Diffstat (limited to 'src/lib/formats/cqm_dsk.cpp')
-rw-r--r-- | src/lib/formats/cqm_dsk.cpp | 78 |
1 files changed, 39 insertions, 39 deletions
diff --git a/src/lib/formats/cqm_dsk.cpp b/src/lib/formats/cqm_dsk.cpp index e2bde8fcf8c..850d223da7a 100644 --- a/src/lib/formats/cqm_dsk.cpp +++ b/src/lib/formats/cqm_dsk.cpp @@ -2,15 +2,20 @@ // copyright-holders:Miodrag Milanovic /********************************************************************* - formats/cqm_dsk.c + formats/cqm_dsk.cpp CopyQM disk images *********************************************************************/ -#include <string.h> -#include <assert.h> -#include "flopimg.h" +#include "cqm_dsk.h" +#include "flopimg_legacy.h" + +#include "ioprocs.h" +#include "multibyte.h" + +#include <cstring> + #define CQM_HEADER_SIZE 133 @@ -181,7 +186,7 @@ FLOPPY_CONSTRUCT( cqm_dsk_construct ) floppy_image_read(floppy, header, 0, CQM_HEADER_SIZE); - tag->sector_size = (header[0x04] << 8) + header[0x03]; + tag->sector_size = get_u16le(&header[0x03]); tag->sector_per_track = header[0x10]; tag->heads = header[0x12]; tag->tracks = header[0x5b]; @@ -231,61 +236,52 @@ FLOPPY_CONSTRUCT( cqm_dsk_construct ) - -/********************************************************************* - - formats/cqm_dsk.c - - CopyQM disk images - -*********************************************************************/ - -#include "cqm_dsk.h" - cqm_format::cqm_format() { } -const char *cqm_format::name() const +const char *cqm_format::name() const noexcept { return "cqm"; } -const char *cqm_format::description() const +const char *cqm_format::description() const noexcept { return "CopyQM disk image"; } -const char *cqm_format::extensions() const +const char *cqm_format::extensions() const noexcept { return "cqm,cqi,dsk"; } -int cqm_format::identify(io_generic *io, uint32_t form_factor) +int cqm_format::identify(util::random_read &io, uint32_t form_factor, const std::vector<uint32_t> &variants) const { uint8_t h[3]; - io_generic_read(io, h, 0, 3); + auto const [err, actual] = read_at(io, 0, h, 3); + if (err || (3 != actual)) + return 0; if (h[0] == 'C' && h[1] == 'Q' && h[2] == 0x14) - return 100; + return FIFID_SIGN; return 0; } -bool cqm_format::load(io_generic *io, uint32_t form_factor, floppy_image *image) +bool cqm_format::load(util::random_read &io, uint32_t form_factor, const std::vector<uint32_t> &variants, floppy_image &image) const { const int max_size = 4*1024*1024; // 4MB ought to be large enough for any floppy std::vector<uint8_t> imagebuf(max_size); uint8_t header[CQM_HEADER_SIZE]; - io_generic_read(io, header, 0, CQM_HEADER_SIZE); + read_at(io, 0, header, CQM_HEADER_SIZE); // FIXME: check for errors and premature EOF - int sector_size = (header[0x04] << 8) | header[0x03]; - int sector_per_track = (header[0x11] << 8) | header[0x10]; - int heads = (header[0x13] << 8) | header[0x12]; + int sector_size = get_u16le(&header[0x03]); + int sector_per_track = get_u16le(&header[0x10]); + int heads = get_u16le(&header[0x12]); int tracks = header[0x5b]; // int blind = header[0x58]; // 0=DOS, 1=blind, 2=HFS int density = header[0x59]; // 0=DD, 1=HD, 2=ED - int comment_size = (header[0x70] << 8) | header[0x6f]; + int comment_size = get_u16le(&header[0x6f]); int sector_base = header[0x71] + 1; // int interleave = header[0x74]; // TODO // int skew = header[0x75]; // TODO @@ -295,19 +291,20 @@ bool cqm_format::load(io_generic *io, uint32_t form_factor, floppy_image *image) { case 0: if (form_factor == floppy_image::FF_525 && tracks > 50) - image->set_variant(heads == 1 ? floppy_image::SSQD : floppy_image::DSQD); + image.set_variant(heads == 1 ? floppy_image::SSQD : floppy_image::DSQD); else - image->set_variant(heads == 1 ? floppy_image::SSDD : floppy_image::DSDD); + image.set_variant(heads == 1 ? floppy_image::SSDD : floppy_image::DSDD); break; case 1: if (heads == 1) return false; // single side HD ? - image->set_variant(floppy_image::DSHD); + image.set_variant(floppy_image::DSHD); break; case 2: if (heads == 1) return false; // single side ED ? - image->set_variant(floppy_image::DSED); + image.set_variant(floppy_image::DSED); + break; default: return false; } @@ -317,14 +314,17 @@ bool cqm_format::load(io_generic *io, uint32_t form_factor, floppy_image *image) int rpm = form_factor == floppy_image::FF_8 || (form_factor == floppy_image::FF_525 && rate >= 300000) ? 360 : 300; int base_cell_count = rate*60/rpm; - int cqm_size = io_generic_size(io); - std::vector<uint8_t> cqmbuf(cqm_size); - io_generic_read(io, &cqmbuf[0], 0, cqm_size); + uint64_t cqm_size; + if (io.length(cqm_size)) + return false; + auto const [err, cqmbuf, actual] = read_at(io, 0, cqm_size); + if (err || (actual != cqm_size)) + return false; // decode the RLE data for (int s = 0, pos = CQM_HEADER_SIZE + comment_size; pos < cqm_size; ) { - int16_t len = (cqmbuf[pos + 1] << 8) | cqmbuf[pos]; + int16_t len = get_s16le(&cqmbuf[pos]); pos += 2; if(len < 0) { @@ -368,14 +368,14 @@ bool cqm_format::load(io_generic *io, uint32_t form_factor, floppy_image *image) return true; } -bool cqm_format::save(io_generic *io, floppy_image *image) +bool cqm_format::save(util::random_read_write &io, const std::vector<uint32_t> &variants, const floppy_image &image) const { return false; } -bool cqm_format::supports_save() const +bool cqm_format::supports_save() const noexcept { return false; } -const floppy_format_type FLOPPY_CQM_FORMAT = &floppy_image_format_creator<cqm_format>; +const cqm_format FLOPPY_CQM_FORMAT; |