Actually start using the new physical sector stuff.

This commit is contained in:
David Given
2022-09-10 20:43:24 +02:00
parent e40e6bd07f
commit 085ad5f2a4
25 changed files with 80 additions and 95 deletions

View File

@@ -206,7 +206,7 @@ public:
std::set<unsigned> 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<unsigned>(trackLayout.logicalSectors.begin(), trackLayout.logicalSectors.end());
}

View File

@@ -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)

View File

@@ -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 <numeric>
@@ -72,6 +73,8 @@ std::shared_ptr<const TrackDataFlux> AbstractDecoder::decodeToSectors(
auto newSector = [&] {
_sector = std::make_shared<Sector>();
_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<const TrackDataFlux> 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);
}
}
}

View File

@@ -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<std::shared_ptr<const Sector>>& 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<const Sector> Image::get(
std::shared_ptr<Sector> 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> sector = std::make_shared<Sector>();
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());
}

View File

@@ -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;
}
}
}

View File

@@ -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);

View File

@@ -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;
}
}

View File

@@ -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);
}
}

View File

@@ -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;
}
}

View File

@@ -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++;

View File

@@ -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;
}
}

View File

@@ -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;
}

View File

@@ -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);

View File

@@ -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;
}
}

View File

@@ -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

View File

@@ -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,

View File

@@ -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);

View File

@@ -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<physicalSectors.size(); i++)
if (physicalSectors[i] == physicalSectorId)
return logicalSectors[i];
Error() << fmt::format("LAYOUT: physical sector {} not recognised", physicalSectorId);
for (int i = 0; i < physicalSectors.size(); i++)
if (physicalSectors[i] == physicalSectorId)
return logicalSectors[i];
Error() << fmt::format(
"LAYOUT: physical sector {} not recognised", physicalSectorId);
throw nullptr;
}
unsigned Layout::logicalSectorToPhysical(unsigned logicalSectorId)
unsigned Layout::logicalSectorToPhysical(unsigned logicalSectorId) const
{
for (int i=0; i<logicalSectors.size(); i++)
if (logicalSectors[i] == logicalSectorId)
return physicalSectors[i];
Error() << fmt::format("LAYOUT: logical sector {} not recognised", logicalSectorId);
for (int i = 0; i < logicalSectors.size(); i++)
if (logicalSectors[i] == logicalSectorId)
return physicalSectors[i];
Error() << fmt::format(
"LAYOUT: logical sector {} not recognised", logicalSectorId);
throw nullptr;
}

View File

@@ -5,6 +5,14 @@
class Layout
{
public:
Layout() {}
private:
/* Can't copy. */
Layout(const Layout&);
Layout& operator=(const Layout&);
public:
static std::vector<std::pair<int, int>> getTrackOrdering(
unsigned guessedTracks = 0, unsigned guessedSides = 0);
@@ -19,8 +27,8 @@ public:
std::vector<unsigned> physicalSectors;
std::vector<unsigned> logicalSectors;
unsigned physicalSectorToLogical(unsigned sectorId);
unsigned logicalSectorToPhysical(unsigned sectorId);
unsigned physicalSectorToLogical(unsigned sectorId) const;
unsigned logicalSectorToPhysical(unsigned sectorId) const;
};
#endif

View File

@@ -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';

View File

@@ -109,7 +109,7 @@ static std::set<std::shared_ptr<const Sector>> 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<Sector>(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<const DiskFlux> readDiskCommand(
"status {}\n",
sector->logicalTrack,
sector->logicalSide,
sector->physicalSector,
sector->logicalSector,
sector->headerStartTime / 1000.0,
sector->clock / 1000.0,
Sector::statusToString(sector->status));

View File

@@ -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));
}

View File

@@ -164,7 +164,7 @@ Filesystem::Filesystem(std::shared_ptr<SectorInterface> 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);
}

View File

@@ -187,21 +187,22 @@ static void readRow(const std::vector<std::string>& 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)

View File

@@ -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<const Sector> 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<const Sector> 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());