Hopefully make writing C64 disks work again by fixing the logical:physical

track mapping.
This commit is contained in:
David Given
2021-07-03 12:09:10 +02:00
parent 3447689c19
commit 0092dec49e
3 changed files with 26 additions and 14 deletions

View File

@@ -299,10 +299,8 @@ std::unique_ptr<Fluxmap> Commodore64Encoder::encode(
* stored in a d64 disk image so we have to get it from track 18 which
* contains the BAM.
*/
if ((physicalTrack < 0) || (physicalTrack >= C64_TRACKS_PER_DISK))
return std::unique_ptr<Fluxmap>();
const auto& sectorData = allSectors.get(C64_BAM_TRACK, 0, 0); //Read de BAM to get the DISK ID bytes
const auto& sectorData = allSectors.get(C64_BAM_TRACK*2, 0, 0); //Read de BAM to get the DISK ID bytes
if (sectorData)
{
ByteReader br(sectorData->data);
@@ -313,7 +311,8 @@ std::unique_ptr<Fluxmap> Commodore64Encoder::encode(
else
_formatByte1 = _formatByte2 = 0;
double clockRateUs = clockRateUsForTrack(physicalTrack) * _config.clock_compensation_factor();
int logicalTrack = physicalTrack / 2;
double clockRateUs = clockRateUsForTrack(logicalTrack) * _config.clock_compensation_factor();
int bitsPerRevolution = 200000.0 / clockRateUs;
@@ -323,13 +322,19 @@ std::unique_ptr<Fluxmap> Commodore64Encoder::encode(
fillBitmapTo(bits, cursor, _config.post_index_gap_us() / clockRateUs, { true, false });
lastBit = false;
unsigned numSectors = sectorsForTrack(physicalTrack);
unsigned numSectors = sectorsForTrack(logicalTrack);
unsigned writtenSectors = 0;
for (int sectorId=0; sectorId<numSectors; sectorId++)
{
const auto& sectorData = allSectors.get(physicalTrack, physicalSide, sectorId);
if (sectorData)
{
writeSector(bits, cursor, sectorData);
writtenSectors++;
}
}
if (writtenSectors == 0)
return std::unique_ptr<Fluxmap>();
if (cursor >= bits.size())
Error() << fmt::format("track data overrun by {} bits", cursor - bits.size());

View File

@@ -57,6 +57,7 @@ public:
for (int track = 0; track < 40; track++)
{
int numSectors = sectorsPerTrack(track);
int physicalTrack = track*2;
for (int head = 0; head < numHeads; head++)
{
for (int sectorId = 0; sectorId < numSectors; sectorId++)
@@ -67,19 +68,21 @@ public:
Bytes payload = br.read(256);
offset += 256;
std::unique_ptr<Sector>& sector = sectors.get(track, head, sectorId);
std::unique_ptr<Sector>& sector = sectors.get(physicalTrack, head, sectorId);
sector.reset(new Sector);
sector->status = Sector::OK;
sector->logicalTrack = sector->physicalTrack = track;
sector->logicalTrack = track;
sector->physicalTrack = physicalTrack;
sector->logicalSide = sector->physicalSide = head;
sector->logicalSector = sectorId;
sector->data.writer().append(payload);
} else
{ //no more data in input file. Write sectors with status: DATA_MISSING
std::unique_ptr<Sector>& sector = sectors.get(track, head, sectorId);
std::unique_ptr<Sector>& sector = sectors.get(physicalTrack, head, sectorId);
sector.reset(new Sector);
sector->status = Sector::DATA_MISSING;
sector->logicalTrack = sector->physicalTrack = track;
sector->logicalTrack = track;
sector->physicalTrack = physicalTrack;
sector->logicalSide = sector->physicalSide = head;
sector->logicalSector = sectorId;
}

View File

@@ -23,8 +23,13 @@ public:
Error() << "cannot open input file";
SectorSet sectors;
int trackCount = 0;
for (int track = 0; track < _config.img().tracks(); track++)
{
if (inputFile.eof())
break;
int physicalTrack = track * _config.img().physical_step() + _config.img().physical_offset();
for (int side = 0; side < _config.img().sides(); side++)
{
ImgInputOutputProto::TrackdataProto trackdata;
@@ -35,23 +40,22 @@ public:
Bytes data(trackdata.sector_size());
inputFile.read((char*) data.begin(), data.size());
std::unique_ptr<Sector>& sector = sectors.get(track, side, sectorId);
std::unique_ptr<Sector>& sector = sectors.get(physicalTrack, side, sectorId);
sector.reset(new Sector);
sector->status = Sector::OK;
sector->logicalTrack = track;
sector->physicalTrack = track * _config.img().physical_step() + _config.img().physical_offset();
sector->physicalTrack = physicalTrack;
sector->logicalSide = sector->physicalSide = side;
sector->logicalSector = sectorId;
sector->data = data;
}
}
if (inputFile.eof())
break;
trackCount++;
}
std::cout << fmt::format("reading {} tracks, {} sides, {} kB total\n",
_config.img().tracks(), _config.img().sides(),
trackCount, _config.img().sides(),
inputFile.tellg() / 1024);
return sectors;
}