From a55d88393e61caec00e43e5a522a5cdef8f36ddd Mon Sep 17 00:00:00 2001 From: Justin Kerk Date: Wed, 11 Oct 2017 19:13:59 -0700 Subject: Fix crash loading 80-track .mfm dumps of 40-track disks on 40-track drives. [Justin Kerk] --- src/lib/formats/hxcmfm_dsk.cpp | 30 +++++++++++++++++++++--------- 1 file changed, 21 insertions(+), 9 deletions(-) diff --git a/src/lib/formats/hxcmfm_dsk.cpp b/src/lib/formats/hxcmfm_dsk.cpp index 274c8a7695f..dcc4718c114 100644 --- a/src/lib/formats/hxcmfm_dsk.cpp +++ b/src/lib/formats/hxcmfm_dsk.cpp @@ -75,19 +75,31 @@ bool mfm_format::load(io_generic *io, uint32_t form_factor, floppy_image *image) // read header io_generic_read(io, &header, 0, sizeof(header)); + + int drivecyl, driveheads; + image->get_maximal_geometry(drivecyl, driveheads); + bool skip_odd = (drivecyl < 50 && header.number_of_track >= 80); + int counter = 0; std::vector trackbuf; for(int track=0; track < header.number_of_track; track++) { for(int side=0; side < header.number_of_side; side++) { - // read location of - io_generic_read(io, &trackdesc,(header.mfmtracklistoffset)+( counter *sizeof(trackdesc)),sizeof(trackdesc)); - - trackbuf.resize(trackdesc.mfmtracksize); - - // actual data read - io_generic_read(io, &trackbuf[0], trackdesc.mfmtrackoffset, trackdesc.mfmtracksize); - - generate_track_from_bitstream(track, side, &trackbuf[0], trackdesc.mfmtracksize*8, image); + if (!skip_odd || track%2 == 0) { + // read location of + io_generic_read(io, &trackdesc,(header.mfmtracklistoffset)+( counter *sizeof(trackdesc)),sizeof(trackdesc)); + + trackbuf.resize(trackdesc.mfmtracksize); + + // actual data read + io_generic_read(io, &trackbuf[0], trackdesc.mfmtrackoffset, trackdesc.mfmtracksize); + + if (skip_odd) { + generate_track_from_bitstream(track/2, side, &trackbuf[0], trackdesc.mfmtracksize*8, image); + } + else { + generate_track_from_bitstream(track, side, &trackbuf[0], trackdesc.mfmtracksize*8, image); + } + } counter++; } -- cgit v1.2.3