From 085ad5f2a4ee6332edcaa068f1941d7a9b92fec8 Mon Sep 17 00:00:00 2001 From: David Given Date: Sat, 10 Sep 2022 20:43:24 +0200 Subject: [PATCH] Actually start using the new physical sector stuff. --- arch/ibm/decoder.cc | 2 +- arch/ibm/encoder.cc | 4 ++-- lib/decoders/decoders.cc | 7 +++++++ lib/image.cc | 23 ++++++++++++--------- lib/imagereader/d64imagereader.cc | 6 ------ lib/imagereader/d88imagereader.cc | 4 ---- lib/imagereader/dimimagereader.cc | 4 ---- lib/imagereader/diskcopyimagereader.cc | 4 ---- lib/imagereader/fdiimagereader.cc | 4 ---- lib/imagereader/imdimagereader.cc | 1 - lib/imagereader/imgimagereader.cc | 7 +------ lib/imagereader/jv3imagereader.cc | 4 ---- lib/imagereader/nfdimagereader.cc | 4 ---- lib/imagereader/nsiimagereader.cc | 4 ---- lib/imagewriter/d88imagewriter.cc | 2 +- lib/imagewriter/imagewriter.cc | 6 ++++-- lib/imagewriter/imgimagewriter.cc | 2 +- lib/layout.cc | 28 ++++++++++++++------------ lib/layout.h | 12 +++++++++-- lib/logger.cc | 2 +- lib/readerwriter.cc | 12 +++++------ lib/vfs/fluxsectorinterface.cc | 4 ++-- lib/vfs/vfs.cc | 4 ++-- src/fe-analyselayout.cc | 19 ++++++++--------- src/gui/fluxviewercontrol.cc | 6 +++--- 25 files changed, 80 insertions(+), 95 deletions(-) diff --git a/arch/ibm/decoder.cc b/arch/ibm/decoder.cc index eebb4a57..db0e8179 100644 --- a/arch/ibm/decoder.cc +++ b/arch/ibm/decoder.cc @@ -206,7 +206,7 @@ public: std::set requiredSectors(const Location& location) const override { - auto trackLayout = Layout::getLayoutOfTrack(location.logicalTrack, location.head); + auto& trackLayout = Layout::getLayoutOfTrack(location.logicalTrack, location.head); return std::set(trackLayout.logicalSectors.begin(), trackLayout.logicalSectors.end()); } diff --git a/arch/ibm/encoder.cc b/arch/ibm/encoder.cc index e2abd546..8d7baab3 100644 --- a/arch/ibm/encoder.cc +++ b/arch/ibm/encoder.cc @@ -115,7 +115,7 @@ public: IbmEncoderProto::TrackdataProto trackdata; getEncoderTrackData(trackdata, location.logicalTrack, location.head); - auto trackLayout = + auto& trackLayout = Layout::getLayoutOfTrack(location.logicalTrack, location.head); int logicalSide = location.head ^ trackdata.swap_sides(); @@ -138,7 +138,7 @@ public: IbmEncoderProto::TrackdataProto trackdata; getEncoderTrackData(trackdata, location.logicalTrack, location.head); - auto trackLayout = + auto& trackLayout = Layout::getLayoutOfTrack(location.logicalTrack, location.head); auto writeBytes = [&](const Bytes& bytes) diff --git a/lib/decoders/decoders.cc b/lib/decoders/decoders.cc index 633ad594..33a574c3 100644 --- a/lib/decoders/decoders.cc +++ b/lib/decoders/decoders.cc @@ -26,6 +26,7 @@ #include "sector.h" #include "image.h" #include "lib/decoders/decoders.pb.h" +#include "lib/layout.h" #include "fmt/format.h" #include @@ -72,6 +73,8 @@ std::shared_ptr AbstractDecoder::decodeToSectors( auto newSector = [&] { _sector = std::make_shared(); _sector->status = Sector::MISSING; + _sector->logicalTrack = location.logicalTrack; + _sector->logicalSide = location.head; _sector->physicalTrack = location.physicalTrack; _sector->physicalHead = location.head; }; @@ -132,7 +135,11 @@ std::shared_ptr AbstractDecoder::decodeToSectors( } if (_sector->status != Sector::MISSING) + { + auto& trackLayout = Layout::getLayoutOfTrack(_sector->logicalTrack, _sector->logicalSide); + _sector->logicalSector = trackLayout.physicalSectorToLogical(_sector->physicalSector); _trackdata->sectors.push_back(_sector); + } } } diff --git a/lib/image.cc b/lib/image.cc index a8d17a23..8382e4d4 100644 --- a/lib/image.cc +++ b/lib/image.cc @@ -1,7 +1,8 @@ -#include "globals.h" -#include "sector.h" -#include "image.h" -#include "layout.h" +#include "lib/globals.h" +#include "lib/sector.h" +#include "lib/image.h" +#include "lib/layout.h" +#include "lib/mapper.h" Image::Image() {} @@ -10,7 +11,7 @@ Image::Image(std::set>& sectors) for (auto& sector : sectors) { key_t key = std::make_tuple( - sector->logicalTrack, sector->logicalSide, sector->physicalSector); + sector->logicalTrack, sector->logicalSide, sector->logicalSector); _sectors[key] = sector; } calculateSize(); @@ -29,7 +30,7 @@ void Image::createBlankImage() { unsigned track = trackAndHead.first; unsigned side = trackAndHead.second; - auto trackLayout = Layout::getLayoutOfTrack(track, side); + auto& trackLayout = Layout::getLayoutOfTrack(track, side); Bytes blank(trackLayout.sectorSize); for (unsigned sectorId : trackLayout.logicalSectors) put(track, side, sectorId)->data = blank; @@ -62,11 +63,15 @@ std::shared_ptr Image::get( std::shared_ptr Image::put( unsigned track, unsigned side, unsigned sectorid) { + auto& trackLayout = Layout::getLayoutOfTrack(track, side); key_t key = std::make_tuple(track, side, sectorid); std::shared_ptr sector = std::make_shared(); sector->logicalTrack = track; sector->logicalSide = side; - sector->physicalSector = sectorid; + sector->logicalSector = sectorid; + sector->physicalTrack = Mapper::remapTrackLogicalToPhysical(track); + sector->physicalHead = side; + sector->physicalSector = trackLayout.logicalSectorToPhysical(sectorid); _sectors[key] = sector; return sector; } @@ -100,8 +105,8 @@ void Image::calculateSize() _geometry.numSides = std::max(_geometry.numSides, (unsigned)sector->logicalSide + 1); _geometry.firstSector = std::min( - _geometry.firstSector, (unsigned)sector->physicalSector); - maxSector = std::max(maxSector, (unsigned)sector->physicalSector); + _geometry.firstSector, (unsigned)sector->logicalSector); + maxSector = std::max(maxSector, (unsigned)sector->logicalSector); _geometry.sectorSize = std::max(_geometry.sectorSize, (unsigned)sector->data.size()); } diff --git a/lib/imagereader/d64imagereader.cc b/lib/imagereader/d64imagereader.cc index 7f4d31a9..7068b105 100644 --- a/lib/imagereader/d64imagereader.cc +++ b/lib/imagereader/d64imagereader.cc @@ -69,20 +69,14 @@ public: offset += 256; sector->status = Sector::OK; - sector->logicalTrack = track; sector->physicalTrack = physicalTrack; - sector->logicalSide = sector->physicalHead = head; - sector->physicalSector = sectorId; sector->data.writer().append(payload); } else { // no more data in input file. Write sectors with status: // DATA_MISSING sector->status = Sector::DATA_MISSING; - sector->logicalTrack = track; sector->physicalTrack = physicalTrack; - sector->logicalSide = sector->physicalHead = head; - sector->physicalSector = sectorId; } } } diff --git a/lib/imagereader/d88imagereader.cc b/lib/imagereader/d88imagereader.cc index 339fddf2..4e4ee67e 100644 --- a/lib/imagereader/d88imagereader.cc +++ b/lib/imagereader/d88imagereader.cc @@ -197,10 +197,6 @@ public: inputFile.read((char*)data.begin(), data.size()); const auto& sector = image->put(track, head, sectorId); sector->status = Sector::OK; - sector->logicalTrack = track; - sector->physicalTrack = Mapper::remapTrackLogicalToPhysical(track); - sector->logicalSide = sector->physicalHead = head; - sector->physicalSector = sectorId; sector->data = data; physical->add_sector(sectorId); diff --git a/lib/imagereader/dimimagereader.cc b/lib/imagereader/dimimagereader.cc index 3f4ac26b..53d490ac 100644 --- a/lib/imagereader/dimimagereader.cc +++ b/lib/imagereader/dimimagereader.cc @@ -86,10 +86,6 @@ public: const auto& sector = image->put(track, side, sectorId); sector->status = Sector::OK; - sector->logicalTrack = track; - sector->physicalTrack = Mapper::remapTrackLogicalToPhysical(track); - sector->logicalSide = sector->physicalHead = side; - sector->physicalSector = sectorId; sector->data = data; } } diff --git a/lib/imagereader/diskcopyimagereader.cc b/lib/imagereader/diskcopyimagereader.cc index b4faf4f8..495cd65b 100644 --- a/lib/imagereader/diskcopyimagereader.cc +++ b/lib/imagereader/diskcopyimagereader.cc @@ -110,10 +110,6 @@ public: const auto& sector = image->put(track, head, sectorId); sector->status = Sector::OK; - sector->logicalTrack = track; - sector->physicalTrack = Mapper::remapTrackLogicalToPhysical(track); - sector->logicalSide = sector->physicalHead = head; - sector->physicalSector = sectorId; sector->data.writer().append(payload).append(tag); } } diff --git a/lib/imagereader/fdiimagereader.cc b/lib/imagereader/fdiimagereader.cc index a61ddd6d..e66847e1 100644 --- a/lib/imagereader/fdiimagereader.cc +++ b/lib/imagereader/fdiimagereader.cc @@ -66,10 +66,6 @@ public: const auto& sector = image->put(track, side, sectorId); sector->status = Sector::OK; - sector->logicalTrack = track; - sector->physicalTrack = Mapper::remapTrackLogicalToPhysical(track); - sector->logicalSide = sector->physicalHead = side; - sector->physicalSector = sectorId; sector->data = data; } } diff --git a/lib/imagereader/imdimagereader.cc b/lib/imagereader/imdimagereader.cc index fcf702a5..79147218 100644 --- a/lib/imagereader/imdimagereader.cc +++ b/lib/imagereader/imdimagereader.cc @@ -264,7 +264,6 @@ public: int SectorID; SectorID = sector_skew[s]; const auto& sector = image->put(header.track, header.Head, SectorID); - sector->physicalSector = SectorID; //read the status of the sector unsigned int Status_Sector = br.read_8(); headerPtr++; diff --git a/lib/imagereader/imgimagereader.cc b/lib/imagereader/imgimagereader.cc index 3d6c4aa4..4a6aa551 100644 --- a/lib/imagereader/imgimagereader.cc +++ b/lib/imagereader/imgimagereader.cc @@ -40,7 +40,7 @@ public: if (inputFile.eof()) break; - auto trackLayout = Layout::getLayoutOfTrack(track, side); + auto& trackLayout = Layout::getLayoutOfTrack(track, side); for (int sectorId : trackLayout.logicalSectors) { Bytes data(trackLayout.sectorSize); @@ -48,11 +48,6 @@ public: const auto& sector = image->put(track, side, sectorId); sector->status = Sector::OK; - sector->logicalTrack = track; - sector->physicalTrack = - Mapper::remapTrackLogicalToPhysical(track); - sector->logicalSide = sector->physicalHead = side; - sector->physicalSector = sectorId; sector->data = data; } } diff --git a/lib/imagereader/jv3imagereader.cc b/lib/imagereader/jv3imagereader.cc index 69a5d2bb..1da05ba5 100644 --- a/lib/imagereader/jv3imagereader.cc +++ b/lib/imagereader/jv3imagereader.cc @@ -124,10 +124,6 @@ public: const auto& sector = image->put(header.track, head, header.sector); sector->status = Sector::OK; - sector->logicalTrack = header.track; - sector->physicalTrack = Mapper::remapTrackLogicalToPhysical(header.track); - sector->logicalSide = sector->physicalHead = head; - sector->physicalSector = header.sector; sector->data = data; } diff --git a/lib/imagereader/nfdimagereader.cc b/lib/imagereader/nfdimagereader.cc index debf9c67..027b8b95 100644 --- a/lib/imagereader/nfdimagereader.cc +++ b/lib/imagereader/nfdimagereader.cc @@ -147,10 +147,6 @@ public: inputFile.read((char*)data.begin(), data.size()); const auto& sector = image->put(track, head, sectorId); sector->status = Sector::OK; - sector->logicalTrack = track; - sector->physicalTrack = Mapper::remapTrackLogicalToPhysical(track); - sector->logicalSide = sector->physicalHead = head; - sector->physicalSector = sectorId; sector->data = data; physical->add_sector(sectorId); diff --git a/lib/imagereader/nsiimagereader.cc b/lib/imagereader/nsiimagereader.cc index 86441ae3..8144f52f 100644 --- a/lib/imagereader/nsiimagereader.cc +++ b/lib/imagereader/nsiimagereader.cc @@ -100,10 +100,6 @@ public: const auto& sector = image->put(track, head, sectorId); sector->status = Sector::OK; - sector->logicalTrack = track; - sector->physicalTrack = Mapper::remapTrackLogicalToPhysical(track); - sector->logicalSide = sector->physicalHead = head; - sector->physicalSector = sectorId; sector->data = data; } } diff --git a/lib/imagewriter/d88imagewriter.cc b/lib/imagewriter/d88imagewriter.cc index 80d34e00..1a19ae2b 100644 --- a/lib/imagewriter/d88imagewriter.cc +++ b/lib/imagewriter/d88imagewriter.cc @@ -82,7 +82,7 @@ public: ByteWriter sectorWriter(sectorBytes); sectorWriter.write_8(sector->logicalTrack); sectorWriter.write_8(sector->logicalSide); - sectorWriter.write_8(sector->physicalSector); + sectorWriter.write_8(sector->logicalSector); sectorWriter.write_8(24 - countl_zero(uint32_t(sector->data.size()))); sectorWriter.write_le16(sectors.size()); sectorWriter.write_8(0x00); // always write mfm diff --git a/lib/imagewriter/imagewriter.cc b/lib/imagewriter/imagewriter.cc index aabea209..2493ebe2 100644 --- a/lib/imagewriter/imagewriter.cc +++ b/lib/imagewriter/imagewriter.cc @@ -89,6 +89,7 @@ void ImageWriter::writeCsv(const Image& image, const std::string& filename) f << "\"Physical track\"," "\"Physical side\"," + "\"Physical sector\"," "\"Logical track\"," "\"Logical side\"," "\"Logical sector\"," @@ -104,12 +105,13 @@ void ImageWriter::writeCsv(const Image& image, const std::string& filename) for (const auto& sector : image) { - f << fmt::format("{},{},{},{},{},{},{},{},{},{},{},{},{}\n", + f << fmt::format("{},{},{},{},{},{},{},{},{},{},{},{},{},{}\n", sector->physicalTrack, sector->physicalHead, + sector->physicalSector, sector->logicalTrack, sector->logicalSide, - sector->physicalSector, + sector->logicalSector, sector->clock, sector->headerStartTime, sector->headerEndTime, diff --git a/lib/imagewriter/imgimagewriter.cc b/lib/imagewriter/imgimagewriter.cc index 2c1051cb..e4f273cb 100644 --- a/lib/imagewriter/imgimagewriter.cc +++ b/lib/imagewriter/imgimagewriter.cc @@ -36,7 +36,7 @@ public: int track = p.first; int side = p.second; - auto trackLayout = Layout::getLayoutOfTrack(track, side); + auto& trackLayout = Layout::getLayoutOfTrack(track, side); for (int sectorId : trackLayout.logicalSectors) { const auto& sector = image.get(track, side, sectorId); diff --git a/lib/layout.cc b/lib/layout.cc index cf99c78f..8b3e51f6 100644 --- a/lib/layout.cc +++ b/lib/layout.cc @@ -69,7 +69,7 @@ const Layout& Layout::getLayoutOfTrack(unsigned track, unsigned side) auto& layout = layoutCache[std::make_pair(track, side)]; if (!layout) { - layout.reset(new Layout); + layout.reset(new Layout()); LayoutProto::LayoutdataProto layoutdata; for (const auto& f : config.layout().layoutdata()) @@ -105,20 +105,22 @@ const Layout& Layout::getLayoutOfTrack(unsigned track, unsigned side) return *layout; } -unsigned Layout::physicalSectorToLogical(unsigned physicalSectorId) +unsigned Layout::physicalSectorToLogical(unsigned physicalSectorId) const { - for (int i=0; i> getTrackOrdering( unsigned guessedTracks = 0, unsigned guessedSides = 0); @@ -19,8 +27,8 @@ public: std::vector physicalSectors; std::vector logicalSectors; - unsigned physicalSectorToLogical(unsigned sectorId); - unsigned logicalSectorToPhysical(unsigned sectorId); + unsigned physicalSectorToLogical(unsigned sectorId) const; + unsigned logicalSectorToPhysical(unsigned sectorId) const; }; #endif diff --git a/lib/logger.cc b/lib/logger.cc index 25e6eb1d..bdfa2173 100644 --- a/lib/logger.cc +++ b/lib/logger.cc @@ -120,7 +120,7 @@ std::string Logger::toString(const AnyLogMessage& message) stream << fmt::format(" {}.{}.{}{}", sector->logicalTrack, sector->logicalSide, - sector->physicalSector, + sector->logicalSector, Sector::statusToChar(sector->status)); stream << '\n'; diff --git a/lib/readerwriter.cc b/lib/readerwriter.cc index 5f108799..8811af9b 100644 --- a/lib/readerwriter.cc +++ b/lib/readerwriter.cc @@ -109,7 +109,7 @@ static std::set> collectSectors( for (const auto& sector : track_sectors) { key_t sectorid = { - sector->logicalTrack, sector->logicalSide, sector->physicalSector}; + sector->logicalTrack, sector->logicalSide, sector->logicalSector}; sectors.insert({sectorid, sector}); } @@ -166,7 +166,7 @@ BadSectorsState combineRecordAndSectors( for (unsigned logical_sector : decoder.requiredSectors(trackFlux.location)) { auto sector = std::make_shared(location); - sector->physicalSector = logical_sector; + sector->logicalSector = logical_sector; sector->status = Sector::MISSING; track_sectors.insert(sector); } @@ -344,14 +344,14 @@ void writeTracksAndVerify(FluxSink& fluxSink, wanted .put(sector->logicalTrack, sector->logicalSide, - sector->physicalSector) + sector->logicalSector) ->data = sector->data; for (const auto& sector : trackFlux->sectors) { const auto s = wanted.get(sector->logicalTrack, sector->logicalSide, - sector->physicalSector); + sector->logicalSector); if (!s) { Logger() << "spurious sector on verify"; @@ -364,7 +364,7 @@ void writeTracksAndVerify(FluxSink& fluxSink, } wanted.erase(sector->logicalTrack, sector->logicalSide, - sector->physicalSector); + sector->logicalSector); } if (!wanted.empty()) { @@ -524,7 +524,7 @@ std::shared_ptr readDiskCommand( "status {}\n", sector->logicalTrack, sector->logicalSide, - sector->physicalSector, + sector->logicalSector, sector->headerStartTime / 1000.0, sector->clock / 1000.0, Sector::statusToString(sector->status)); diff --git a/lib/vfs/fluxsectorinterface.cc b/lib/vfs/fluxsectorinterface.cc index 76680379..3ca0e9fa 100644 --- a/lib/vfs/fluxsectorinterface.cc +++ b/lib/vfs/fluxsectorinterface.cc @@ -63,7 +63,7 @@ public: { unsigned track = trackid.first; unsigned side = trackid.second; - auto trackLayout = Layout::getLayoutOfTrack(track, side); + auto& trackLayout = Layout::getLayoutOfTrack(track, side); locations.insert(Mapper::computeLocationFor(track, side)); /* If we don't have all the sectors of this track, we may need to @@ -131,7 +131,7 @@ private: auto trackdata = readAndDecodeTrack(*_fluxSource, *_decoder, location); for (const auto& sector : trackdata->sectors) - *_loadedSectors.put(track, side, sector->physicalSector) = *sector; + *_loadedSectors.put(track, side, sector->logicalSector) = *sector; _loadedTracks.insert(trackid_t(track, side)); } diff --git a/lib/vfs/vfs.cc b/lib/vfs/vfs.cc index 6bf11d2a..58fe42a8 100644 --- a/lib/vfs/vfs.cc +++ b/lib/vfs/vfs.cc @@ -164,7 +164,7 @@ Filesystem::Filesystem(std::shared_ptr sectors): int track = p.first; int side = p.second; - auto trackLayout = Layout::getLayoutOfTrack(track, side); + auto& trackLayout = Layout::getLayoutOfTrack(track, side); if (trackLayout.logicalSectors.empty()) Error() << "FS: filesystem support cannot be used without concrete " "layout information"; @@ -268,7 +268,7 @@ Bytes Filesystem::getLogicalSector(uint32_t number, uint32_t count) int track = std::get<0>(it); int side = std::get<1>(it); int sector = std::get<2>(it); - auto trackLayout = Layout::getLayoutOfTrack(track, side); + auto& trackLayout = Layout::getLayoutOfTrack(track, side); bw += _sectors->get(track, side, sector) ->data.slice(0, trackLayout.sectorSize); } diff --git a/src/fe-analyselayout.cc b/src/fe-analyselayout.cc index 3c622db3..e8992c5d 100644 --- a/src/fe-analyselayout.cc +++ b/src/fe-analyselayout.cc @@ -187,21 +187,22 @@ static void readRow(const std::vector& row, Image& image) if (status == Sector::Status::MISSING) return; - int logicalTrack = std::stoi(row[2]); - int logicalSide = std::stoi(row[3]); - int logicalSector = std::stoi(row[4]); + int logicalTrack = std::stoi(row[3]); + int logicalSide = std::stoi(row[4]); + int logicalSector = std::stoi(row[5]); const auto& sector = image.put(logicalTrack, logicalSide, logicalSector); sector->physicalTrack = std::stoi(row[0]); sector->physicalHead = std::stoi(row[1]); + sector->physicalSector = std::stoi(row[2]); sector->logicalTrack = logicalTrack; sector->logicalSide = logicalSide; - sector->physicalSector = logicalSector; - sector->clock = std::stod(row[5]); - sector->headerStartTime = std::stod(row[6]); - sector->headerEndTime = std::stod(row[7]); - sector->dataStartTime = std::stod(row[8]); - sector->dataEndTime = std::stod(row[9]); + sector->logicalSector = logicalSector; + sector->clock = std::stod(row[6]); + sector->headerStartTime = std::stod(row[7]); + sector->headerEndTime = std::stod(row[8]); + sector->dataStartTime = std::stod(row[9]); + sector->dataEndTime = std::stod(row[10]); sector->status = status; } catch (const std::invalid_argument& e) diff --git a/src/gui/fluxviewercontrol.cc b/src/gui/fluxviewercontrol.cc index f93239ef..7374e993 100644 --- a/src/gui/fluxviewercontrol.cc +++ b/src/gui/fluxviewercontrol.cc @@ -237,7 +237,7 @@ void FluxViewerControl::OnPaint(wxPaintEvent&) wxDCClipper clipper(dc, rect); auto text = fmt::format("c{}.h{}.s{} {}", - sector->logicalTrack, sector->logicalSide, sector->physicalSector, + sector->logicalTrack, sector->logicalSide, sector->logicalSector, Sector::statusToString(sector->status)); auto size = dc.GetTextExtent(text); dc.DrawText(text, { x+sp+BORDER, t1y - size.GetHeight()/2 }); @@ -438,7 +438,7 @@ void FluxViewerControl::DisplayDecodedData(std::shared_ptr sector) std::stringstream s; auto title = fmt::format("User data for c{}.h{}.s{}", - sector->logicalTrack, sector->logicalSide, sector->physicalSector); + sector->logicalTrack, sector->logicalSide, sector->logicalSector); s << title << '\n'; dumpSectorMetadata(s, sector); s << '\n'; @@ -453,7 +453,7 @@ void FluxViewerControl::DisplayRawData(std::shared_ptr sector) std::stringstream s; auto title = fmt::format("Raw data for c{}.h{}.s{}", - sector->logicalTrack, sector->logicalSide, sector->physicalSector); + sector->logicalTrack, sector->logicalSide, sector->logicalSector); s << title << '\n'; dumpSectorMetadata(s, sector); s << fmt::format("Number of records: {}\n", sector->records.size());