summaryrefslogtreecommitdiffstatshomepage
path: root/src/lib/formats/imd_dsk.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/lib/formats/imd_dsk.cpp')
-rw-r--r--src/lib/formats/imd_dsk.cpp68
1 files changed, 64 insertions, 4 deletions
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<ui
std::vector<uint8_t> 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<ui
m_head.clear();
m_sector_count.clear();
m_ssize.clear();
+ m_trackmult = 1;
+ // we have to walk the whole file to find out the number of tracks
+ savepos = pos;
+ uint8_t maxtrack = 0;
+ while(pos < size)
+ {
+ pos++; // skip mode
+ uint8_t track = img[pos++];
+ uint8_t head = img[pos++];
+ uint8_t sector_count = img[pos++];
+ uint8_t sector_size = img[pos++];
+ int actual_size = sector_size < 7 ? 128 << sector_size : 8192;
+
+ if (track > 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<ui
if(m_sector_count.back()) {
if(fm) {
- build_pc_track_fm(m_track.back(), head, image, cell_count, m_sector_count.back(), sects, gap_3);
+ build_pc_track_fm(m_track.back()*m_trackmult, head, image, cell_count, m_sector_count.back(), sects, gap_3);
} else {
- build_pc_track_mfm(m_track.back(), head, image, cell_count, m_sector_count.back(), sects, gap_3);
+ build_pc_track_mfm(m_track.back()*m_trackmult, head, image, cell_count, m_sector_count.back(), sects, gap_3);
}
}
@@ -599,7 +659,7 @@ bool imd_format::save(io_generic *io, const std::vector<uint32_t> &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