mirror of
https://github.com/davidgiven/fluxengine.git
synced 2025-10-31 11:17:01 -07:00
Hopefully make writing C64 disks work again by fixing the logical:physical
track mapping.
This commit is contained in:
@@ -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());
|
||||
|
||||
@@ -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;
|
||||
}
|
||||
|
||||
@@ -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;
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user