summaryrefslogtreecommitdiffstatshomepage
path: root/src
diff options
context:
space:
mode:
author Justin Kerk <dopefishjustin@gmail.com>2017-10-11 19:13:59 -0700
committer Justin Kerk <dopefishjustin@gmail.com>2017-10-11 19:13:59 -0700
commita55d88393e61caec00e43e5a522a5cdef8f36ddd (patch)
tree3d7a649de506a72d66a3f7869adb347c280c03c9 /src
parent4e089ae32e8335034b2412a2d478e278fd29832d (diff)
Fix crash loading 80-track .mfm dumps of 40-track disks on 40-track drives. [Justin Kerk]
Diffstat (limited to 'src')
-rw-r--r--src/lib/formats/hxcmfm_dsk.cpp30
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++;
}