diff --git a/src/lib/formats/imd_dsk.cpp b/src/lib/formats/imd_dsk.cpp index 74d414e27c2..a3d2b68d6f9 100644 --- a/src/lib/formats/imd_dsk.cpp +++ b/src/lib/formats/imd_dsk.cpp @@ -426,7 +426,7 @@ bool imd_format::load(io_generic *io, uint32_t form_factor, const std::vector img(size); io_generic_read(io, &img[0], 0, size); - uint64_t pos; + uint64_t pos, savepos; for(pos=0; pos < size && img[pos] != 0x1a; pos++) {}; pos++; @@ -444,7 +444,67 @@ bool imd_format::load(io_generic *io, uint32_t form_factor, const std::vector maxtrack) + { + maxtrack = track; + } + + pos += sector_count; + if (head & 0x80) + { + pos += sector_count; + } + if (head & 0x40) + { + pos += sector_count; + } + + for (int i = 0; i < sector_count; i++) + { + uint8_t stype = img[pos++]; + if (stype == 0 || stype > 8) + { + } + else + { + if (stype == 2 || stype == 4 || stype == 6 || stype == 8) + { + pos++; + } + else + { + pos += actual_size; + } + } + } + } + + // Check if the drive is HD but we're a 40 track image. + // If so, put the image on even tracks. + for (auto &fmt : variants) + { + if ((maxtrack <= 39) && (fmt == floppy_image::DSHD)) + { + m_trackmult = 2; + break; + } + } + + pos = savepos; while(pos < size) { m_mode.push_back(img[pos++]); m_track.push_back(img[pos++]); @@ -539,9 +599,9 @@ bool imd_format::load(io_generic *io, uint32_t form_factor, const std::vector &variants, flo uint8_t sector_data[50000]; desc_xs sectors[256]; int track_size; - generate_bitstream_from_track(m_track[i], head, 2000, bitstream, track_size, image); + generate_bitstream_from_track(m_track[i]*m_trackmult, head, 2000, bitstream, track_size, image); if (fm) extract_sectors_from_bitstream_fm_pc(bitstream, track_size, sectors, sector_data, sizeof(sector_data)); else