summaryrefslogtreecommitdiffstatshomepage
path: root/src/lib/formats/hxcmfm_dsk.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/lib/formats/hxcmfm_dsk.cpp')
-rw-r--r--src/lib/formats/hxcmfm_dsk.cpp68
1 files changed, 38 insertions, 30 deletions
diff --git a/src/lib/formats/hxcmfm_dsk.cpp b/src/lib/formats/hxcmfm_dsk.cpp
index 390e07ff3f8..d9fda047dea 100644
--- a/src/lib/formats/hxcmfm_dsk.cpp
+++ b/src/lib/formats/hxcmfm_dsk.cpp
@@ -1,10 +1,14 @@
// license:BSD-3-Clause
// copyright-holders:Olivier Galibert
-#include <cassert>
-
#include "hxcmfm_dsk.h"
+#include "ioprocs.h"
+
+#include <cstring>
+#include <tuple>
+
+
#define MFM_FORMAT_HEADER "HXCMFM"
#pragma pack(1)
@@ -37,47 +41,51 @@ mfm_format::mfm_format() : floppy_image_format_t()
{
}
-const char *mfm_format::name() const
+const char *mfm_format::name() const noexcept
{
return "mfm";
}
-const char *mfm_format::description() const
+const char *mfm_format::description() const noexcept
{
return "HxCFloppyEmulator floppy disk image";
}
-const char *mfm_format::extensions() const
+const char *mfm_format::extensions() const noexcept
{
return "mfm";
}
-bool mfm_format::supports_save() const
+bool mfm_format::supports_save() const noexcept
{
return true;
}
-int mfm_format::identify(io_generic *io, uint32_t form_factor)
+int mfm_format::identify(util::random_read &io, uint32_t form_factor, const std::vector<uint32_t> &variants) const
{
uint8_t header[7];
-
- io_generic_read(io, &header, 0, sizeof(header));
- if ( memcmp( header, MFM_FORMAT_HEADER, 6 ) ==0) {
- return 100;
+ auto const [err, actual] = read_at(io, 0, &header, sizeof(header)); // FIXME: does this really need to read 7 bytes? only 6 are checked. also check for premature EOF
+ if (err) {
+ return 0;
+ }
+ if (!memcmp(header, MFM_FORMAT_HEADER, 6)) {
+ return FIFID_SIGN;
}
return 0;
}
-bool mfm_format::load(io_generic *io, uint32_t form_factor, floppy_image *image)
+bool mfm_format::load(util::random_read &io, uint32_t form_factor, const std::vector<uint32_t> &variants, floppy_image &image) const
{
+ std::error_condition err;
+ size_t actual;
MFMIMG header;
MFMTRACKIMG trackdesc;
// read header
- io_generic_read(io, &header, 0, sizeof(header));
+ std::tie(err, actual) = read_at(io, 0, &header, sizeof(header)); // FIXME: check for errors and premature EOF
int drivecyl, driveheads;
- image->get_maximal_geometry(drivecyl, driveheads);
+ image.get_maximal_geometry(drivecyl, driveheads);
bool skip_odd = (drivecyl < 50 && header.number_of_track >= 80);
int counter = 0;
@@ -86,12 +94,12 @@ bool mfm_format::load(io_generic *io, uint32_t form_factor, floppy_image *image)
for(int side=0; side < header.number_of_side; side++) {
if (!skip_odd || track%2 == 0) {
// read location of
- io_generic_read(io, &trackdesc,(header.mfmtracklistoffset)+( counter *sizeof(trackdesc)),sizeof(trackdesc));
+ std::tie(err, actual) = read_at(io, header.mfmtracklistoffset + (counter * sizeof(trackdesc)), &trackdesc, sizeof(trackdesc)); // FIXME: check for errors and premature EOF
trackbuf.resize(trackdesc.mfmtracksize);
// actual data read
- io_generic_read(io, &trackbuf[0], trackdesc.mfmtrackoffset, trackdesc.mfmtracksize);
+ std::tie(err, actual) = read_at(io, trackdesc.mfmtrackoffset, &trackbuf[0], trackdesc.mfmtracksize); // FIXME: check for errors and premature EOF
if (skip_odd) {
generate_track_from_bitstream(track/2, side, &trackbuf[0], trackdesc.mfmtracksize*8, image);
@@ -105,16 +113,16 @@ bool mfm_format::load(io_generic *io, uint32_t form_factor, floppy_image *image)
}
}
- image->set_variant(floppy_image::DSDD);
+ image.set_variant(floppy_image::DSDD);
return true;
}
-bool mfm_format::save(io_generic *io, floppy_image *image)
+bool mfm_format::save(util::random_read_write &io, const std::vector<uint32_t> &variants, const floppy_image &image) const
{
// TODO: HD support
MFMIMG header;
int track_count, head_count;
- image->get_actual_geometry(track_count, head_count);
+ image.get_actual_geometry(track_count, head_count);
memcpy(&header.headername, MFM_FORMAT_HEADER, 7);
header.number_of_track = track_count;
@@ -124,34 +132,34 @@ bool mfm_format::save(io_generic *io, floppy_image *image)
header.floppyiftype = 4;
header.mfmtracklistoffset = sizeof(MFMIMG);
- io_generic_write(io, &header, 0, sizeof(MFMIMG));
+ write_at(io, 0, &header, sizeof(MFMIMG)); // FIXME: check for errors
int tpos = sizeof(MFMIMG);
int dpos = tpos + track_count*head_count*sizeof(MFMTRACKIMG);
- uint8_t trackbuf[150000/8];
-
for(int track=0; track < track_count; track++) {
for(int side=0; side < head_count; side++) {
- int track_size;
- generate_bitstream_from_track(track, side, 2000, trackbuf, track_size, image);
- track_size = (track_size+7)/8;
+ auto trackbuf = generate_bitstream_from_track(track, side, 2000, image);
+ std::vector<uint8_t> packed((trackbuf.size() + 7) >> 3, 0);
+ for(uint32_t i = 0; i != trackbuf.size(); i++)
+ if(trackbuf[i])
+ packed[i >> 3] |= 0x80 >> (i & 7);
MFMTRACKIMG trackdesc;
trackdesc.track_number = track;
trackdesc.side_number = side;
- trackdesc.mfmtracksize = track_size;
+ trackdesc.mfmtracksize = packed.size();
trackdesc.mfmtrackoffset = dpos;
- io_generic_write(io, &trackdesc, tpos, sizeof(MFMTRACKIMG));
- io_generic_write(io, trackbuf, dpos, track_size);
+ write_at(io, tpos, &trackdesc, sizeof(MFMTRACKIMG)); // FIXME: check for errors
+ write_at(io, dpos, packed.data(), packed.size()); // FIXME: check for errors
tpos += sizeof(MFMTRACKIMG);
- dpos += track_size;
+ dpos += packed.size();
}
}
return true;
}
-const floppy_format_type FLOPPY_MFM_FORMAT = &floppy_image_format_creator<mfm_format>;
+const mfm_format FLOPPY_MFM_FORMAT;