mirror of
https://github.com/davidgiven/fluxengine.git
synced 2025-10-31 11:17:01 -07:00
D88: Add 2D (40 track double density) support.
This assumes a 360rpm drive, and double stepping. If fluxengine supports the concept of 40 vs 80 track drives in the future, it might make sense for this to assume a 300rpm drive instead.
This commit is contained in:
@@ -58,10 +58,11 @@ public:
|
|||||||
ByteReader trackTableReader(trackTable);
|
ByteReader trackTableReader(trackTable);
|
||||||
|
|
||||||
if (config.encoder().format_case() != EncoderProto::FormatCase::FORMAT_NOT_SET)
|
if (config.encoder().format_case() != EncoderProto::FormatCase::FORMAT_NOT_SET)
|
||||||
std::cout << "D88: overriding configured format";
|
std::cout << "D88: overriding configured format\n";
|
||||||
|
|
||||||
auto ibm = config.mutable_encoder()->mutable_ibm();
|
auto ibm = config.mutable_encoder()->mutable_ibm();
|
||||||
config.mutable_cylinders()->set_end(0);
|
int physicalStep = 1;
|
||||||
|
int clockRate = 500;
|
||||||
if (mediaFlag == 0x20) {
|
if (mediaFlag == 0x20) {
|
||||||
std::cout << "D88: high density mode\n";
|
std::cout << "D88: high density mode\n";
|
||||||
if (config.flux_sink().dest_case() == FluxSinkProto::DestCase::kDrive) {
|
if (config.flux_sink().dest_case() == FluxSinkProto::DestCase::kDrive) {
|
||||||
@@ -69,6 +70,8 @@ public:
|
|||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
std::cout << "D88: single/double density mode\n";
|
std::cout << "D88: single/double density mode\n";
|
||||||
|
physicalStep = 2;
|
||||||
|
clockRate = 300;
|
||||||
if (config.flux_sink().dest_case() == FluxSinkProto::DestCase::kDrive) {
|
if (config.flux_sink().dest_case() == FluxSinkProto::DestCase::kDrive) {
|
||||||
config.mutable_flux_sink()->mutable_drive()->set_high_density(false);
|
config.mutable_flux_sink()->mutable_drive()->set_high_density(false);
|
||||||
}
|
}
|
||||||
@@ -87,7 +90,7 @@ public:
|
|||||||
int trackMfm = -1;
|
int trackMfm = -1;
|
||||||
|
|
||||||
auto trackdata = ibm->add_trackdata();
|
auto trackdata = ibm->add_trackdata();
|
||||||
trackdata->set_clock_rate_khz(500);
|
trackdata->set_clock_rate_khz(clockRate);
|
||||||
trackdata->set_track_length_ms(167);
|
trackdata->set_track_length_ms(167);
|
||||||
auto sectors = trackdata->mutable_sectors();
|
auto sectors = trackdata->mutable_sectors();
|
||||||
|
|
||||||
@@ -124,7 +127,7 @@ public:
|
|||||||
if (trackSectorSize < 0) {
|
if (trackSectorSize < 0) {
|
||||||
trackSectorSize = sectorSize;
|
trackSectorSize = sectorSize;
|
||||||
// this is the first sector we've read, use it settings for per-track data
|
// this is the first sector we've read, use it settings for per-track data
|
||||||
trackdata->set_cylinder(cylinder);
|
trackdata->set_cylinder(cylinder * physicalStep);
|
||||||
trackdata->set_head(head);
|
trackdata->set_head(head);
|
||||||
trackdata->set_sector_size(sectorSize);
|
trackdata->set_sector_size(sectorSize);
|
||||||
trackdata->set_use_fm(fm);
|
trackdata->set_use_fm(fm);
|
||||||
@@ -147,17 +150,21 @@ public:
|
|||||||
}
|
}
|
||||||
Bytes data(sectorSize);
|
Bytes data(sectorSize);
|
||||||
inputFile.read((char*) data.begin(), data.size());
|
inputFile.read((char*) data.begin(), data.size());
|
||||||
const auto& sector = image->put(cylinder, head, sectorId);
|
const auto& sector = image->put(cylinder * physicalStep, head, sectorId);
|
||||||
sector->status = Sector::OK;
|
sector->status = Sector::OK;
|
||||||
sector->logicalTrack = cylinder;
|
sector->logicalTrack = cylinder;
|
||||||
sector->physicalCylinder = cylinder;
|
sector->physicalCylinder = cylinder * physicalStep;
|
||||||
sector->logicalSide = sector->physicalHead = head;
|
sector->logicalSide = sector->physicalHead = head;
|
||||||
sector->logicalSector = sectorId;
|
sector->logicalSector = sectorId;
|
||||||
sector->data = data;
|
sector->data = data;
|
||||||
|
|
||||||
sectors->add_sector(sectorId);
|
sectors->add_sector(sectorId);
|
||||||
if (config.cylinders().end() < cylinder)
|
}
|
||||||
config.mutable_cylinders()->set_end(cylinder);
|
|
||||||
|
if (physicalStep == 2) {
|
||||||
|
auto trackdata = ibm->add_trackdata();
|
||||||
|
trackdata->set_clock_rate_khz(clockRate);
|
||||||
|
trackdata->set_track_length_ms(167);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user