summaryrefslogtreecommitdiffstatshomepage
path: root/src/lib/formats/cqm_dsk.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/lib/formats/cqm_dsk.cpp')
-rw-r--r--src/lib/formats/cqm_dsk.cpp76
1 files changed, 38 insertions, 38 deletions
diff --git a/src/lib/formats/cqm_dsk.cpp b/src/lib/formats/cqm_dsk.cpp
index c38f06bde1c..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 "cqm_dsk.h"
+#include "flopimg_legacy.h"
+
+#include "ioprocs.h"
+#include "multibyte.h"
+
#include <cstring>
-#include <cassert>
-#include "flopimg.h"
+
#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;