diff --git a/lib/imagereader/d64imagereader.cc b/lib/imagereader/d64imagereader.cc index ee29780c..068f0d95 100644 --- a/lib/imagereader/d64imagereader.cc +++ b/lib/imagereader/d64imagereader.cc @@ -5,6 +5,7 @@ #include "fmt/format.h" #include "image.h" #include "logger.h" +#include "mapper.h" #include "proto.h" #include #include @@ -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++) diff --git a/lib/imagereader/d88imagereader.cc b/lib/imagereader/d88imagereader.cc index 18d5d373..a27a762d 100644 --- a/lib/imagereader/d88imagereader.cc +++ b/lib/imagereader/d88imagereader.cc @@ -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 @@ -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(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); diff --git a/lib/imagereader/dimimagereader.cc b/lib/imagereader/dimimagereader.cc index 06a01550..5927ca7a 100644 --- a/lib/imagereader/dimimagereader.cc +++ b/lib/imagereader/dimimagereader.cc @@ -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; diff --git a/lib/imagereader/diskcopyimagereader.cc b/lib/imagereader/diskcopyimagereader.cc index 19f883b8..2ecfc371 100644 --- a/lib/imagereader/diskcopyimagereader.cc +++ b/lib/imagereader/diskcopyimagereader.cc @@ -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 @@ -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); diff --git a/lib/imagereader/fdiimagereader.cc b/lib/imagereader/fdiimagereader.cc index 27b43a92..6e322ce5 100644 --- a/lib/imagereader/fdiimagereader.cc +++ b/lib/imagereader/fdiimagereader.cc @@ -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 @@ -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; diff --git a/lib/imagereader/imdimagereader.cc b/lib/imagereader/imdimagereader.cc index cf49bae4..1524eee6 100644 --- a/lib/imagereader/imdimagereader.cc +++ b/lib/imagereader/imdimagereader.cc @@ -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 @@ -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]); } diff --git a/lib/imagereader/imgimagereader.cc b/lib/imagereader/imgimagereader.cc index 34bb0097..da523a59 100644 --- a/lib/imagereader/imgimagereader.cc +++ b/lib/imagereader/imgimagereader.cc @@ -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; diff --git a/lib/imagereader/jv3imagereader.cc b/lib/imagereader/jv3imagereader.cc index 04176e6e..549a6643 100644 --- a/lib/imagereader/jv3imagereader.cc +++ b/lib/imagereader/jv3imagereader.cc @@ -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; diff --git a/lib/imagereader/nfdimagereader.cc b/lib/imagereader/nfdimagereader.cc index 14a97130..df51bbcb 100644 --- a/lib/imagereader/nfdimagereader.cc +++ b/lib/imagereader/nfdimagereader.cc @@ -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 @@ -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; diff --git a/lib/imagereader/nsiimagereader.cc b/lib/imagereader/nsiimagereader.cc index 2f2f74cb..8693e600 100644 --- a/lib/imagereader/nsiimagereader.cc +++ b/lib/imagereader/nsiimagereader.cc @@ -7,6 +7,7 @@ #include "image.h" #include "fmt/format.h" #include "logger.h" +#include "mapper.h" #include "lib/imagereader/imagereader.pb.h" #include #include @@ -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; diff --git a/lib/imagereader/td0imagereader.cc b/lib/imagereader/td0imagereader.cc index dcb81bdc..9d00a675 100644 --- a/lib/imagereader/td0imagereader.cc +++ b/lib/imagereader/td0imagereader.cc @@ -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" diff --git a/lib/mapper.cc b/lib/mapper.cc index b2dfc8b1..384fe726 100644 --- a/lib/mapper.cc +++ b/lib/mapper.cc @@ -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 Mapper::computeLocations() -{ - std::set 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 Mapper::computeLocations() +{ + std::set locations; + + unsigned track_step = getTrackStep(); for (unsigned logicalTrack : iterate(config.tracks())) { for (unsigned head : iterate(config.heads()))