diff options
author | 2017-10-11 19:13:59 -0700 | |
---|---|---|
committer | 2017-10-11 19:13:59 -0700 | |
commit | a55d88393e61caec00e43e5a522a5cdef8f36ddd (patch) | |
tree | 3d7a649de506a72d66a3f7869adb347c280c03c9 | |
parent | 4e089ae32e8335034b2412a2d478e278fd29832d (diff) |
Fix crash loading 80-track .mfm dumps of 40-track disks on 40-track drives. [Justin Kerk]
-rw-r--r-- | src/lib/formats/hxcmfm_dsk.cpp | 30 |
1 files 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<uint8_t> 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++; } |