Change the readers to correctly set the physical track for each sector using

the mapper (where appropriate).
This commit is contained in:
David Given
2022-03-25 20:50:57 +01:00
parent 86c5cccb08
commit 29f181f9bf
12 changed files with 47 additions and 31 deletions

View File

@@ -5,6 +5,7 @@
#include "fmt/format.h"
#include "image.h"
#include "logger.h"
#include "mapper.h"
#include "proto.h"
#include <algorithm>
#include <iostream>
@@ -55,7 +56,7 @@ public:
for (int track = 0; track < 40; track++)
{
int numSectors = sectorsPerTrack(track);
int physicalTrack = track * 2;
int physicalTrack = Mapper::remapTrackLogicalToPhysical(track);
for (int head = 0; head < numHeads; head++)
{
for (int sectorId = 0; sectorId < numSectors; sectorId++)

View File

@@ -5,6 +5,7 @@
#include "image.h"
#include "proto.h"
#include "logger.h"
#include "mapper.h"
#include "lib/config.pb.h"
#include "fmt/format.h"
#include <algorithm>
@@ -62,21 +63,23 @@ public:
Logger() << "D88: overriding configured format";
auto ibm = config.mutable_encoder()->mutable_ibm();
int physicalStep = 1;
int clockRate = 500;
if (mediaFlag == 0x20)
{
Logger() << "D88: high density mode";
if (!config.drive().has_drive())
config.mutable_drive()->set_high_density(true);
if (!config.has_tpi())
config.set_tpi(96);
}
else
{
Logger() << "D88: single/double density mode";
physicalStep = 2;
clockRate = 300;
if (!config.drive().has_drive())
config.mutable_drive()->set_high_density(false);
if (!config.has_tpi())
config.set_tpi(48);
}
std::unique_ptr<Image> image(new Image);
@@ -146,7 +149,7 @@ public:
trackSectorSize = sectorSize;
// this is the first sector we've read, use it settings for
// per-track data
trackdata->set_track(track * physicalStep);
trackdata->set_track(track);
trackdata->set_head(head);
trackdata->set_sector_size(sectorSize);
trackdata->set_use_fm(fm);
@@ -176,11 +179,10 @@ public:
}
Bytes data(sectorSize);
inputFile.read((char*)data.begin(), data.size());
const auto& sector =
image->put(track * physicalStep, head, sectorId);
const auto& sector = image->put(track, head, sectorId);
sector->status = Sector::OK;
sector->logicalTrack = track;
sector->physicalTrack = track * physicalStep;
sector->physicalTrack = Mapper::remapTrackLogicalToPhysical(track);
sector->logicalSide = sector->physicalHead = head;
sector->logicalSector = sectorId;
sector->data = data;
@@ -188,7 +190,7 @@ public:
sectors->add_sector(sectorId);
}
if (physicalStep == 2)
if (mediaFlag != 0x20)
{
auto trackdata = ibm->add_trackdata();
trackdata->set_clock_rate_khz(clockRate);

View File

@@ -4,6 +4,7 @@
#include "imagereader/imagereader.h"
#include "image.h"
#include "logger.h"
#include "mapper.h"
#include "proto.h"
#include "lib/config.pb.h"
#include "fmt/format.h"
@@ -71,7 +72,6 @@ public:
{
if (inputFile.eof())
break;
int physicalTrack = track;
for (int side = 0; side < 2; side++)
{
@@ -84,11 +84,10 @@ public:
Bytes data(sectorSize);
inputFile.read((char*)data.begin(), data.size());
const auto& sector =
image->put(physicalTrack, side, sectorId);
const auto& sector = image->put(track, side, sectorId);
sector->status = Sector::OK;
sector->logicalTrack = track;
sector->physicalTrack = physicalTrack;
sector->physicalTrack = Mapper::remapTrackLogicalToPhysical(track);
sector->logicalSide = sector->physicalHead = side;
sector->logicalSector = sectorId;
sector->data = data;

View File

@@ -4,6 +4,7 @@
#include "imagereader/imagereader.h"
#include "image.h"
#include "logger.h"
#include "mapper.h"
#include "lib/config.pb.h"
#include "fmt/format.h"
#include <algorithm>
@@ -109,7 +110,8 @@ public:
const auto& sector = image->put(track, head, sectorId);
sector->status = Sector::OK;
sector->logicalTrack = sector->physicalTrack = track;
sector->logicalTrack = track;
sector->physicalTrack = Mapper::remapTrackLogicalToPhysical(track);
sector->logicalSide = sector->physicalHead = head;
sector->logicalSector = sectorId;
sector->data.writer().append(payload).append(tag);

View File

@@ -5,6 +5,7 @@
#include "image.h"
#include "proto.h"
#include "logger.h"
#include "mapper.h"
#include "lib/config.pb.h"
#include "fmt/format.h"
#include <algorithm>
@@ -50,7 +51,6 @@ public:
{
if (inputFile.eof())
break;
int physicalTrack = track;
for (int side = 0; side < sides; side++)
{
@@ -64,10 +64,10 @@ public:
inputFile.read((char*)data.begin(), data.size());
const auto& sector =
image->put(physicalTrack, side, sectorId);
image->put(track, side, sectorId);
sector->status = Sector::OK;
sector->logicalTrack = track;
sector->physicalTrack = physicalTrack;
sector->physicalTrack = Mapper::remapTrackLogicalToPhysical(track);
sector->logicalSide = sector->physicalHead = side;
sector->logicalSector = sectorId;
sector->data = data;

View File

@@ -5,6 +5,7 @@
#include "image.h"
#include "proto.h"
#include "logger.h"
#include "mapper.h"
#include "lib/config.pb.h"
#include "fmt/format.h"
#include <algorithm>
@@ -218,7 +219,8 @@ public:
Error() << fmt::format("don't understand IMD disks with sector status {}", Status_Sector);
}
sector->status = Sector::OK;
sector->logicalTrack = sector->physicalTrack = header.track;
sector->logicalTrack = header.track;
sector->physicalTrack = Mapper::remapTrackLogicalToPhysical(header.track);
sector->logicalSide = sector->physicalHead = header.Head;
sector->logicalSector = (sector_map[s]);
}

View File

@@ -4,6 +4,7 @@
#include "imagereader/imagereader.h"
#include "image.h"
#include "logger.h"
#include "mapper.h"
#include "lib/config.pb.h"
#include "imginputoutpututils.h"
#include "fmt/format.h"
@@ -47,7 +48,7 @@ public:
const auto& sector = image->put(track, side, sectorId);
sector->status = Sector::OK;
sector->logicalTrack = track;
sector->physicalTrack = track;
sector->physicalTrack = Mapper::remapTrackLogicalToPhysical(track);
sector->logicalSide = sector->physicalHead = side;
sector->logicalSector = sectorId;
sector->data = data;

View File

@@ -3,6 +3,7 @@
#include "sector.h"
#include "imagereader/imagereader.h"
#include "image.h"
#include "mapper.h"
#include "logger.h"
#include "fmt/format.h"
#include "lib/config.pb.h"
@@ -123,8 +124,8 @@ public:
const auto& sector =
image->put(header.track, head, header.sector);
sector->status = Sector::OK;
sector->logicalTrack = sector->physicalTrack =
header.track;
sector->logicalTrack = header.track;
sector->physicalTrack = Mapper::remapTrackLogicalToPhysical(header.track);
sector->logicalSide = sector->physicalHead = head;
sector->logicalSector = header.sector;
sector->data = data;

View File

@@ -5,6 +5,7 @@
#include "image.h"
#include "proto.h"
#include "logger.h"
#include "mapper.h"
#include "lib/config.pb.h"
#include "fmt/format.h"
#include <algorithm>
@@ -142,7 +143,7 @@ public:
const auto& sector = image->put(track, head, sectorId);
sector->status = Sector::OK;
sector->logicalTrack = track;
sector->physicalTrack = track;
sector->physicalTrack = Mapper::remapTrackLogicalToPhysical(track);
sector->logicalSide = sector->physicalHead = head;
sector->logicalSector = sectorId;
sector->data = data;

View File

@@ -7,6 +7,7 @@
#include "image.h"
#include "fmt/format.h"
#include "logger.h"
#include "mapper.h"
#include "lib/imagereader/imagereader.pb.h"
#include <algorithm>
#include <iostream>
@@ -99,7 +100,8 @@ public:
const auto& sector = image->put(track, head, sectorId);
sector->status = Sector::OK;
sector->logicalTrack = sector->physicalTrack = track;
sector->logicalTrack = track;
sector->physicalTrack = Mapper::remapTrackLogicalToPhysical(track);
sector->logicalSide = sector->physicalHead = head;
sector->logicalSector = sectorId;
sector->data = data;

View File

@@ -5,6 +5,7 @@
#include "image.h"
#include "crc.h"
#include "logger.h"
#include "mapper.h"
#include "fmt/format.h"
#include "lib/config.pb.h"
#include "fmt/format.h"

View File

@@ -111,23 +111,27 @@ unsigned Mapper::remapTrackPhysicalToLogical(unsigned ptrack)
config.drive().head_width();
}
unsigned Mapper::remapTrackLogicalToPhysical(unsigned ltrack)
static unsigned getTrackStep()
{
Error() << "not working yet";
return config.drive().head_bias() + ltrack * config.drive().head_width();
}
std::set<Location> Mapper::computeLocations()
{
std::set<Location> locations;
unsigned track_step =
(config.tpi() == 0) ? 1 : (config.drive().tpi() / config.tpi());
if (track_step == 0)
Error()
<< "this drive can't write this image, because the head is too big";
return track_step;
}
unsigned Mapper::remapTrackLogicalToPhysical(unsigned ltrack)
{
return config.drive().head_bias() + ltrack*getTrackStep();
}
std::set<Location> Mapper::computeLocations()
{
std::set<Location> locations;
unsigned track_step = getTrackStep();
for (unsigned logicalTrack : iterate(config.tracks()))
{
for (unsigned head : iterate(config.heads()))