From 9601cf683fbfce4ec6e18350037a69309cb9871a Mon Sep 17 00:00:00 2001 From: Thomas Daede Date: Mon, 15 Aug 2022 22:49:44 -0700 Subject: [PATCH] D88: Support multiple sector sizes in a single track. --- arch/ibm/encoder.cc | 15 +++++++++++++++ lib/image.cc | 4 ++-- lib/image.h | 3 ++- lib/imagereader/d88imagereader.cc | 7 +------ 4 files changed, 20 insertions(+), 9 deletions(-) diff --git a/arch/ibm/encoder.cc b/arch/ibm/encoder.cc index 73eb48971..cbc8a8c73 100644 --- a/arch/ibm/encoder.cc +++ b/arch/ibm/encoder.cc @@ -215,6 +215,17 @@ class IbmEncoder : public AbstractEncoder bool first = true; for (const auto& sectorData : sectors) { + if (image.getGeometry().variableSectorSize) + { + sectorSize = 0; + int s = sectorData->data.size() >> 7; + while (s > 1) + { + s >>= 1; + sectorSize += 1; + } + } + if (!first) writeFillerRawBytes(trackdata.gap3(), gapFill); first = false; @@ -274,6 +285,10 @@ class IbmEncoder : public AbstractEncoder Bytes truncatedData = sectorData->data.slice(0, trackdata.sector_size()); + if (image.getGeometry().variableSectorSize) { + truncatedData = sectorData->data; + } + bw += truncatedData; uint16_t crc = crc16(CCITT_POLY, data); bw.write_be16(crc); diff --git a/lib/image.cc b/lib/image.cc index d8b9ede62..85180bd9c 100644 --- a/lib/image.cc +++ b/lib/image.cc @@ -37,7 +37,7 @@ std::shared_ptr Image::put(unsigned track, unsigned side, unsigned secto return sector; } -void Image::calculateSize() +void Image::calculateSize(bool variableSectorSize) { _geometry = {}; unsigned maxSector = 0; @@ -53,6 +53,6 @@ void Image::calculateSize() _geometry.sectorSize = std::max(_geometry.sectorSize, (unsigned)sector->data.size()); } } + _geometry.variableSectorSize = variableSectorSize; _geometry.numSectors = maxSector - _geometry.firstSector + 1; } - diff --git a/lib/image.h b/lib/image.h index 8c1d599ca..ba6610565 100644 --- a/lib/image.h +++ b/lib/image.h @@ -9,6 +9,7 @@ struct Geometry unsigned numSectors = 0; unsigned sectorSize = 0; bool irregular = false; + bool variableSectorSize = false; }; class Image @@ -37,7 +38,7 @@ class Image }; public: - void calculateSize(); + void calculateSize(bool variableSectorSize = false); std::shared_ptr get(unsigned track, unsigned side, unsigned sectorId) const; std::shared_ptr put(unsigned track, unsigned side, unsigned sectorId); diff --git a/lib/imagereader/d88imagereader.cc b/lib/imagereader/d88imagereader.cc index b262692d1..91009c328 100644 --- a/lib/imagereader/d88imagereader.cc +++ b/lib/imagereader/d88imagereader.cc @@ -181,11 +181,6 @@ class D88ImageReader : public ImageReader } } } - else if (trackSectorSize != sectorSize) - { - Error() << "D88: multiple sector sizes per track are " - "currently unsupported"; - } Bytes data(sectorSize); inputFile.read((char*)data.begin(), data.size()); const auto& sector = image->put(track, head, sectorId); @@ -207,7 +202,7 @@ class D88ImageReader : public ImageReader } } - image->calculateSize(); + image->calculateSize(true); const Geometry& geometry = image->getGeometry(); Logger() << fmt::format("D88: read {} tracks, {} sides", geometry.numTracks,