diff options
Diffstat (limited to 'src/lib/formats/hxcmfm_dsk.cpp')
-rw-r--r-- | src/lib/formats/hxcmfm_dsk.cpp | 68 |
1 files changed, 38 insertions, 30 deletions
diff --git a/src/lib/formats/hxcmfm_dsk.cpp b/src/lib/formats/hxcmfm_dsk.cpp index dcc4718c114..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 <assert.h> - #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; |