mirror of
https://github.com/davidgiven/fluxengine.git
synced 2025-10-31 11:17:01 -07:00
Rip out the old approach to soft sector remapping as it wasn't working.
This commit is contained in:
@@ -47,7 +47,7 @@ public:
|
||||
|
||||
_sector->logicalTrack = reversed[1];
|
||||
_sector->logicalSide = 0;
|
||||
_sector->physicalSector = reversed[2];
|
||||
_sector->logicalSector = reversed[2];
|
||||
|
||||
/* Check header 'checksum' (which seems far too simple to mean much). */
|
||||
|
||||
|
||||
@@ -66,7 +66,7 @@ public:
|
||||
return;
|
||||
|
||||
_sector->logicalTrack = bytes[1] >> 1;
|
||||
_sector->physicalSector = bytes[2];
|
||||
_sector->logicalSector = bytes[2];
|
||||
_sector->logicalSide = bytes[1] & 1;
|
||||
_sector->status = Sector::DATA_MISSING; /* unintuitive but correct */
|
||||
}
|
||||
|
||||
@@ -52,7 +52,7 @@ public:
|
||||
|
||||
_sector->logicalTrack = header[1] >> 1;
|
||||
_sector->logicalSide = header[1] & 1;
|
||||
_sector->physicalSector = header[2];
|
||||
_sector->logicalSector = header[2];
|
||||
|
||||
uint32_t wantedheaderchecksum = amigaDeinterleave(ptr, 4).reader().read_be32();
|
||||
uint32_t gotheaderchecksum = amigaChecksum(rawbytes.slice(0, 40));
|
||||
|
||||
@@ -85,8 +85,8 @@ static void write_sector(std::vector<bool>& bits,
|
||||
checksum = 0;
|
||||
Bytes header = {0xff, /* Amiga 1.0 format byte */
|
||||
(uint8_t)((sector->logicalTrack << 1) | sector->logicalSide),
|
||||
(uint8_t)sector->physicalSector,
|
||||
(uint8_t)(AMIGA_SECTORS_PER_TRACK - sector->physicalSector)};
|
||||
(uint8_t)sector->logicalSector,
|
||||
(uint8_t)(AMIGA_SECTORS_PER_TRACK - sector->logicalSector)};
|
||||
write_interleaved_bytes(header);
|
||||
Bytes recoveryInfo(16);
|
||||
if (sector->data.size() == 528)
|
||||
|
||||
@@ -88,12 +88,12 @@ public:
|
||||
|
||||
uint8_t volume = combine(br.read_be16());
|
||||
_sector->logicalTrack = combine(br.read_be16());
|
||||
_sector->physicalSector = combine(br.read_be16());
|
||||
_sector->logicalSector = combine(br.read_be16());
|
||||
uint8_t checksum = combine(br.read_be16());
|
||||
|
||||
// If the checksum is correct, upgrade the sector from MISSING
|
||||
// to DATA_MISSING in anticipation of its data record
|
||||
if (checksum == (volume ^ _sector->logicalTrack ^ _sector->physicalSector))
|
||||
if (checksum == (volume ^ _sector->logicalTrack ^ _sector->logicalSector))
|
||||
_sector->status = Sector::DATA_MISSING; /* unintuitive but correct */
|
||||
}
|
||||
|
||||
|
||||
@@ -148,15 +148,15 @@ private:
|
||||
//
|
||||
// In standard formatting, the first logical sector apparently gets
|
||||
// extra padding.
|
||||
write_ff40(sector.physicalSector == 0 ? 32 : 8);
|
||||
write_ff40(sector.logicalSector == 0 ? 32 : 8);
|
||||
|
||||
// Write address field: APPLE2_SECTOR_RECORD + sector identifier +
|
||||
// DE AA EB
|
||||
write_bits(APPLE2_SECTOR_RECORD, 24);
|
||||
write_gcr44(volume_id);
|
||||
write_gcr44(sector.logicalTrack);
|
||||
write_gcr44(sector.physicalSector);
|
||||
write_gcr44(volume_id ^ sector.logicalTrack ^ sector.physicalSector);
|
||||
write_gcr44(sector.logicalSector);
|
||||
write_gcr44(volume_id ^ sector.logicalTrack ^ sector.logicalSector);
|
||||
write_bits(0xDEAAEB, 24);
|
||||
|
||||
// Write data syncing leader: FF40 + APPLE2_DATA_RECORD + sector
|
||||
|
||||
@@ -74,11 +74,11 @@ public:
|
||||
|
||||
ByteReader br(bytes);
|
||||
_sector->logicalTrack = decode_header_gcr(br.read_be16());
|
||||
_sector->physicalSector = decode_header_gcr(br.read_be16());
|
||||
_sector->logicalSector = decode_header_gcr(br.read_be16());
|
||||
|
||||
/* Sanity check the values read; there's no header checksum and
|
||||
* occasionally we get garbage due to bit errors. */
|
||||
if (_sector->physicalSector > 11)
|
||||
if (_sector->logicalSector > 11)
|
||||
return;
|
||||
if (_sector->logicalTrack > 79)
|
||||
return;
|
||||
|
||||
@@ -169,7 +169,7 @@ public:
|
||||
|
||||
fillBitmapTo(bits, cursor, headerCursor, {true, false});
|
||||
write_sector_header(
|
||||
bits, cursor, sectorData->logicalTrack, sectorData->physicalSector);
|
||||
bits, cursor, sectorData->logicalTrack, sectorData->logicalSector);
|
||||
fillBitmapTo(bits, cursor, dataCursor, {true, false});
|
||||
write_sector_data(bits, cursor, sectorData->data);
|
||||
|
||||
|
||||
@@ -72,7 +72,7 @@ public:
|
||||
const auto& bytes = decode(bits).slice(0, 5);
|
||||
|
||||
uint8_t checksum = bytes[0];
|
||||
_sector->physicalSector = bytes[1];
|
||||
_sector->logicalSector = bytes[1];
|
||||
_sector->logicalSide = 0;
|
||||
_sector->logicalTrack = bytes[2] - 1;
|
||||
if (checksum == xorBytes(bytes.slice(1, 4)))
|
||||
|
||||
@@ -269,7 +269,7 @@ private:
|
||||
* 06-07 - $0F ("off" bytes)
|
||||
*/
|
||||
uint8_t encodedTrack = ((sector->logicalTrack) + 1); // C64 track numbering starts with 1. Fluxengine with 0.
|
||||
uint8_t encodedSector = sector->physicalSector;
|
||||
uint8_t encodedSector = sector->logicalSector;
|
||||
// uint8_t formatByte1 = C64_FORMAT_ID_BYTE1;
|
||||
// uint8_t formatByte2 = C64_FORMAT_ID_BYTE2;
|
||||
uint8_t headerChecksum = (encodedTrack ^ encodedSector ^ _formatByte1 ^ _formatByte2);
|
||||
|
||||
@@ -74,7 +74,7 @@ public:
|
||||
|
||||
const auto& bytes = decode(readRawBits(6*10));
|
||||
|
||||
_sector->physicalSector = bytes[2];
|
||||
_sector->logicalSector = bytes[2];
|
||||
_sector->logicalSide = 0;
|
||||
_sector->logicalTrack = bytes[0];
|
||||
|
||||
|
||||
@@ -129,7 +129,7 @@ public:
|
||||
uint8_t abssector = id[2];
|
||||
_sector->logicalTrack = abssector >> 1;
|
||||
_sector->logicalSide = 0;
|
||||
_sector->physicalSector = abssector & 1;
|
||||
_sector->logicalSector = abssector & 1;
|
||||
_sector->data.writer().append(id.slice(5, 12)).append(payload);
|
||||
|
||||
_sector->status = (wantPayloadCrc == gotPayloadCrc) ? Sector::OK : Sector::BAD_CHECKSUM;
|
||||
|
||||
@@ -144,7 +144,7 @@ public:
|
||||
|
||||
_sector->logicalTrack = br.read_8();
|
||||
_sector->logicalSide = br.read_8();
|
||||
_sector->physicalSector = br.read_8();
|
||||
_sector->logicalSector = br.read_8();
|
||||
_currentSectorSize = 1 << (br.read_8() + 7);
|
||||
uint16_t gotCrc = crc16(CCITT_POLY, bytes.slice(0, br.pos));
|
||||
uint16_t wantCrc = br.read_be16();
|
||||
@@ -159,7 +159,7 @@ public:
|
||||
_sector->logicalTrack = _sector->physicalTrack;
|
||||
|
||||
for (int sector : trackdata.ignore_sector())
|
||||
if (_sector->physicalSector == sector)
|
||||
if (_sector->logicalSector == sector)
|
||||
{
|
||||
_sector->status = Sector::MISSING;
|
||||
break;
|
||||
@@ -207,7 +207,7 @@ public:
|
||||
std::set<unsigned> requiredSectors(const Location& location) const override
|
||||
{
|
||||
auto& trackLayout = Layout::getLayoutOfTrack(location.logicalTrack, location.head);
|
||||
return std::set<unsigned>(trackLayout.logicalSectors.begin(), trackLayout.logicalSectors.end());
|
||||
return std::set<unsigned>(trackLayout.logicalSectorOrder.begin(), trackLayout.logicalSectorOrder.end());
|
||||
}
|
||||
|
||||
private:
|
||||
|
||||
@@ -118,11 +118,10 @@ public:
|
||||
Layout::getLayoutOfTrack(location.logicalTrack, location.head);
|
||||
|
||||
int logicalSide = location.head ^ trackdata.swap_sides();
|
||||
for (unsigned physicalSectorId : trackLayout.physicalSectors)
|
||||
for (unsigned sectorId : trackLayout.diskSectorOrder)
|
||||
{
|
||||
unsigned logicalSectorId = trackLayout.physicalSectorToLogical(physicalSectorId);
|
||||
const auto& sector =
|
||||
image.get(location.logicalTrack, logicalSide, logicalSectorId);
|
||||
image.get(location.logicalTrack, logicalSide, sectorId);
|
||||
if (sector)
|
||||
sectors.push_back(sector);
|
||||
}
|
||||
@@ -226,7 +225,7 @@ public:
|
||||
bw.write_8(idamUnencoded);
|
||||
bw.write_8(sectorData->logicalTrack);
|
||||
bw.write_8(sectorData->logicalSide);
|
||||
bw.write_8(sectorData->physicalSector);
|
||||
bw.write_8(sectorData->logicalSector);
|
||||
bw.write_8(sectorSize);
|
||||
uint16_t crc = crc16(CCITT_POLY, header);
|
||||
bw.write_be16(crc);
|
||||
|
||||
@@ -157,7 +157,7 @@ public:
|
||||
|
||||
_sector->logicalTrack = _sector->physicalTrack;
|
||||
_sector->logicalSide = decode_side(encodedSide);
|
||||
_sector->physicalSector = encodedSector;
|
||||
_sector->logicalSector = encodedSector;
|
||||
uint8_t gotsum = (encodedTrack ^ encodedSector ^ encodedSide ^ formatByte) & 0x3f;
|
||||
if (wantedsum == gotsum)
|
||||
_sector->status = Sector::DATA_MISSING; /* unintuitive but correct */
|
||||
|
||||
@@ -181,7 +181,7 @@ static void write_sector(std::vector<bool>& bits,
|
||||
write_bits(bits, cursor, MAC_SECTOR_RECORD, 3 * 8);
|
||||
|
||||
uint8_t encodedTrack = sector->logicalTrack & 0x3f;
|
||||
uint8_t encodedSector = sector->physicalSector;
|
||||
uint8_t encodedSector = sector->logicalSector;
|
||||
uint8_t encodedSide =
|
||||
encode_side(sector->logicalTrack, sector->logicalSide);
|
||||
uint8_t formatByte = MAC_FORMAT_BYTE;
|
||||
@@ -197,7 +197,7 @@ static void write_sector(std::vector<bool>& bits,
|
||||
write_bits(bits, cursor, 0xdeaaff, 3 * 8);
|
||||
write_bits(bits, cursor, 0xff3fcff3fcffLL, 6 * 8); /* sync */
|
||||
write_bits(bits, cursor, MAC_DATA_RECORD, 3 * 8);
|
||||
write_bits(bits, cursor, encode_data_gcr(sector->physicalSector), 1 * 8);
|
||||
write_bits(bits, cursor, encode_data_gcr(sector->logicalSector), 1 * 8);
|
||||
|
||||
Bytes wireData;
|
||||
wireData.writer()
|
||||
|
||||
@@ -128,8 +128,8 @@ public:
|
||||
|
||||
_sector->logicalTrack = br.read_8();
|
||||
_sector->logicalSide = _sector->physicalHead;
|
||||
_sector->physicalSector = br.read_8();
|
||||
if (_sector->physicalSector > 15)
|
||||
_sector->logicalSector = br.read_8();
|
||||
if (_sector->logicalSector > 15)
|
||||
return;
|
||||
if (_sector->logicalTrack > 76)
|
||||
return;
|
||||
|
||||
@@ -31,7 +31,7 @@ static void write_sector(std::vector<bool>& bits,
|
||||
micropolisChecksum(sector->data.slice(1, 2 + 266));
|
||||
if (wantChecksum != gotChecksum)
|
||||
std::cerr << "Warning: checksum incorrect. Sector: "
|
||||
<< sector->physicalSector << std::endl;
|
||||
<< sector->logicalSector << std::endl;
|
||||
sectorData = sector->data;
|
||||
}
|
||||
else
|
||||
@@ -39,7 +39,7 @@ static void write_sector(std::vector<bool>& bits,
|
||||
ByteWriter writer(sectorData);
|
||||
writer.write_8(0xff); /* Sync */
|
||||
writer.write_8(sector->logicalTrack);
|
||||
writer.write_8(sector->physicalSector);
|
||||
writer.write_8(sector->logicalSector);
|
||||
for (int i = 0; i < 10; i++)
|
||||
writer.write_8(0); /* Padding */
|
||||
writer += sector->data;
|
||||
|
||||
@@ -67,7 +67,7 @@ public:
|
||||
|
||||
_sector->logicalTrack = _sector->physicalTrack;
|
||||
_sector->logicalSide = _sector->physicalHead;
|
||||
_sector->physicalSector = _currentSector;
|
||||
_sector->logicalSector = _currentSector;
|
||||
_sector->data = bytes.slice(0, SECTOR_SIZE).swab();
|
||||
_sector->status = (gotChecksum == wantChecksum) ? Sector::OK : Sector::BAD_CHECKSUM;
|
||||
_currentSector++;
|
||||
|
||||
@@ -151,7 +151,7 @@ public:
|
||||
ByteReader br(bytes);
|
||||
|
||||
_sector->logicalSide = _sector->physicalHead;
|
||||
_sector->physicalSector = _hardSectorId;
|
||||
_sector->logicalSector = _hardSectorId;
|
||||
_sector->logicalTrack = _sector->physicalTrack;
|
||||
|
||||
if (headerSize == NORTHSTAR_HEADER_SIZE_DD) {
|
||||
|
||||
@@ -89,7 +89,7 @@ static void write_sector(std::vector<bool>& bits,
|
||||
for (uint8_t b : sectorData)
|
||||
fullSector->push_back(b);
|
||||
|
||||
if (sector->physicalSector != 9)
|
||||
if (sector->logicalSector != 9)
|
||||
{
|
||||
/* sector postamble */
|
||||
for (int i = 0; i < gapFillSize; i++)
|
||||
|
||||
@@ -66,7 +66,7 @@ public:
|
||||
_sector->logicalSide = br.read_8() >> 3;
|
||||
_sector->logicalTrack = br.read_8();
|
||||
br.read_8(); /* number of sectors per track */
|
||||
_sector->physicalSector = br.read_8();
|
||||
_sector->logicalSector = br.read_8();
|
||||
br.read_be16(); /* sector size */
|
||||
uint16_t wantChecksum = br.read_be16();
|
||||
|
||||
|
||||
@@ -116,7 +116,7 @@ public:
|
||||
bw.write_8(sectorData->logicalSide << 3);
|
||||
bw.write_8(sectorData->logicalTrack);
|
||||
bw.write_8(_config.sector_count());
|
||||
bw.write_8(sectorData->physicalSector);
|
||||
bw.write_8(sectorData->logicalSector);
|
||||
bw.write_be16(sectorData->data.size());
|
||||
uint16_t crc = crc16(CCITT_POLY, header);
|
||||
bw.write_be16(crc);
|
||||
|
||||
@@ -76,13 +76,13 @@ public:
|
||||
auto bytes = decode(readRawBits(3*10)).slice(0, 3);
|
||||
|
||||
uint8_t rawTrack = bytes[0];
|
||||
_sector->physicalSector = bytes[1];
|
||||
_sector->logicalSector = bytes[1];
|
||||
uint8_t gotChecksum = bytes[2];
|
||||
|
||||
_sector->logicalTrack = rawTrack & 0x7f;
|
||||
_sector->logicalSide = rawTrack >> 7;
|
||||
uint8_t wantChecksum = bytes[0] + bytes[1];
|
||||
if ((_sector->physicalSector > 20) || (_sector->logicalTrack > 85) || (_sector->logicalSide > 1))
|
||||
if ((_sector->logicalSector > 20) || (_sector->logicalTrack > 85) || (_sector->logicalSide > 1))
|
||||
return;
|
||||
|
||||
if (wantChecksum == gotChecksum)
|
||||
|
||||
@@ -112,7 +112,7 @@ static void write_sector(std::vector<bool>& bits,
|
||||
write_bits(bits, cursor, VICTOR9K_SECTOR_RECORD, 10);
|
||||
|
||||
uint8_t encodedTrack = sector.logicalTrack | (sector.logicalSide << 7);
|
||||
uint8_t encodedSector = sector.physicalSector;
|
||||
uint8_t encodedSector = sector.logicalSector;
|
||||
write_bytes(bits,
|
||||
cursor,
|
||||
Bytes{
|
||||
|
||||
@@ -34,10 +34,10 @@ public:
|
||||
auto bytes = decodeFmMfm(rawbits).slice(0, 140);
|
||||
ByteReader br(bytes);
|
||||
|
||||
_sector->physicalSector = br.read_8() & 0x1f;
|
||||
_sector->logicalSector = br.read_8() & 0x1f;
|
||||
_sector->logicalSide = 0;
|
||||
_sector->logicalTrack = br.read_8() & 0x7f;
|
||||
if (_sector->physicalSector > 31)
|
||||
if (_sector->logicalSector > 31)
|
||||
return;
|
||||
if (_sector->logicalTrack > 80)
|
||||
return;
|
||||
|
||||
@@ -137,7 +137,6 @@ std::shared_ptr<const TrackDataFlux> AbstractDecoder::decodeToSectors(
|
||||
if (_sector->status != Sector::MISSING)
|
||||
{
|
||||
auto& trackLayout = Layout::getLayoutOfTrack(_sector->logicalTrack, _sector->logicalSide);
|
||||
_sector->logicalSector = trackLayout.physicalSectorToLogical(_sector->physicalSector);
|
||||
_trackdata->sectors.push_back(_sector);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -31,7 +31,7 @@ void Image::createBlankImage()
|
||||
unsigned side = trackAndHead.second;
|
||||
auto& trackLayout = Layout::getLayoutOfTrack(track, side);
|
||||
Bytes blank(trackLayout.sectorSize);
|
||||
for (unsigned sectorId : trackLayout.logicalSectors)
|
||||
for (unsigned sectorId : trackLayout.logicalSectorOrder)
|
||||
put(track, side, sectorId)->data = blank;
|
||||
}
|
||||
}
|
||||
@@ -70,7 +70,6 @@ std::shared_ptr<Sector> Image::put(
|
||||
sector->logicalSector = sectorid;
|
||||
sector->physicalTrack = Layout::remapTrackLogicalToPhysical(track);
|
||||
sector->physicalHead = side;
|
||||
sector->physicalSector = trackLayout.logicalSectorToPhysical(sectorid);
|
||||
_sectors[key] = sector;
|
||||
return sector;
|
||||
}
|
||||
|
||||
@@ -16,8 +16,13 @@ message FdiInputProto {}
|
||||
message D88InputProto {}
|
||||
message NFDInputProto {}
|
||||
|
||||
// NEXT_TAG: 14
|
||||
message ImageReaderProto {
|
||||
optional string filename = 1 [(help) = "filename of input sector image"];
|
||||
optional bool filesystem_sector_order = 13 [
|
||||
(help) = "read/write sector image in filesystem order",
|
||||
default = false ];
|
||||
|
||||
oneof format {
|
||||
ImgInputOutputProto img = 2;
|
||||
DiskCopyInputProto diskcopy = 3;
|
||||
|
||||
@@ -40,7 +40,7 @@ public:
|
||||
break;
|
||||
|
||||
auto& trackLayout = Layout::getLayoutOfTrack(track, side);
|
||||
for (int sectorId : trackLayout.logicalSectors)
|
||||
for (int sectorId : trackLayout.logicalSectorOrder)
|
||||
{
|
||||
Bytes data(trackLayout.sectorSize);
|
||||
inputFile.read((char*)data.begin(), data.size());
|
||||
|
||||
@@ -89,10 +89,9 @@ void ImageWriter::writeCsv(const Image& image, const std::string& filename)
|
||||
|
||||
f << "\"Physical track\","
|
||||
"\"Physical side\","
|
||||
"\"Physical sector\","
|
||||
"\"Logical sector\","
|
||||
"\"Logical track\","
|
||||
"\"Logical side\","
|
||||
"\"Logical sector\","
|
||||
"\"Clock (ns)\","
|
||||
"\"Header start (ns)\","
|
||||
"\"Header end (ns)\","
|
||||
@@ -105,13 +104,12 @@ void ImageWriter::writeCsv(const Image& image, const std::string& filename)
|
||||
|
||||
for (const auto& sector : image)
|
||||
{
|
||||
f << fmt::format("{},{},{},{},{},{},{},{},{},{},{},{},{},{}\n",
|
||||
f << fmt::format("{},{},{},{},{},{},{},{},{},{},{},{},{}\n",
|
||||
sector->physicalTrack,
|
||||
sector->physicalHead,
|
||||
sector->physicalSector,
|
||||
sector->logicalSector,
|
||||
sector->logicalTrack,
|
||||
sector->logicalSide,
|
||||
sector->logicalSector,
|
||||
sector->clock,
|
||||
sector->headerStartTime,
|
||||
sector->headerEndTime,
|
||||
|
||||
@@ -37,7 +37,7 @@ public:
|
||||
int side = p.second;
|
||||
|
||||
auto& trackLayout = Layout::getLayoutOfTrack(track, side);
|
||||
for (int sectorId : trackLayout.logicalSectors)
|
||||
for (int sectorId : trackLayout.logicalSectorOrder)
|
||||
{
|
||||
const auto& sector = image.get(track, side, sectorId);
|
||||
if (sector)
|
||||
|
||||
@@ -109,9 +109,10 @@ std::vector<std::pair<int, int>> Layout::getTrackOrdering(
|
||||
return ordering;
|
||||
}
|
||||
|
||||
static void expandSectors(const LayoutProto::SectorsProto& sectorsProto,
|
||||
std::vector<unsigned>& sectors)
|
||||
std::vector<unsigned> Layout::expandSectorList(const SectorListProto& sectorsProto)
|
||||
{
|
||||
std::vector<unsigned> sectors;
|
||||
|
||||
if (sectorsProto.has_count())
|
||||
{
|
||||
if (sectorsProto.sector_size() != 0)
|
||||
@@ -129,6 +130,8 @@ static void expandSectors(const LayoutProto::SectorsProto& sectorsProto,
|
||||
}
|
||||
else
|
||||
Error() << "LAYOUT: no sectors in track!";
|
||||
|
||||
return sectors;
|
||||
}
|
||||
|
||||
const Layout& Layout::getLayoutOfTrack(unsigned track, unsigned side)
|
||||
@@ -155,39 +158,20 @@ const Layout& Layout::getLayoutOfTrack(unsigned track, unsigned side)
|
||||
layout->numTracks = config.layout().tracks();
|
||||
layout->numSides = config.layout().sides();
|
||||
layout->sectorSize = layoutdata.sector_size();
|
||||
expandSectors(layoutdata.physical(), layout->physicalSectors);
|
||||
if (layoutdata.has_logical())
|
||||
expandSectors(layoutdata.logical(), layout->logicalSectorsOnDisk);
|
||||
else
|
||||
layout->logicalSectorsOnDisk = layout->physicalSectors;
|
||||
|
||||
if (layout->logicalSectorsOnDisk.size() !=
|
||||
layout->physicalSectors.size())
|
||||
Error() << fmt::format(
|
||||
"LAYOUT: physical and logical sectors lists are different "
|
||||
"sizes in {}.{}",
|
||||
track,
|
||||
side);
|
||||
|
||||
layout->logicalSectors = layout->logicalSectorsOnDisk;
|
||||
std::sort(layout->logicalSectors.begin(), layout->logicalSectors.end());
|
||||
layout->numSectors = layout->logicalSectors.size();
|
||||
|
||||
if ((layout->numSectors != layout->logicalSectorsOnDisk.size()) ||
|
||||
(layout->numSectors != layout->physicalSectors.size()))
|
||||
Error() << fmt::format(
|
||||
"LAYOUT: duplicate sector ID in specification for {}.{}",
|
||||
track,
|
||||
side);
|
||||
layout->diskSectorOrder = expandSectorList(layoutdata.physical());
|
||||
layout->logicalSectorOrder = layout->diskSectorOrder;
|
||||
std::sort(layout->diskSectorOrder.begin(), layout->diskSectorOrder.end());
|
||||
layout->numSectors = layout->logicalSectorOrder.size();
|
||||
}
|
||||
|
||||
return *layout;
|
||||
}
|
||||
|
||||
#if 0
|
||||
unsigned Layout::physicalSectorToLogical(unsigned physicalSectorId) const
|
||||
{
|
||||
for (int i = 0; i < physicalSectors.size(); i++)
|
||||
if (physicalSectors[i] == physicalSectorId)
|
||||
for (int i = 0; i < diskSectorOrder.size(); i++)
|
||||
if (diskSectorOrder[i] == physicalSectorId)
|
||||
return logicalSectorsOnDisk[i];
|
||||
Error() << fmt::format(
|
||||
"LAYOUT: physical sector {} not recognised", physicalSectorId);
|
||||
@@ -198,8 +182,9 @@ unsigned Layout::logicalSectorToPhysical(unsigned logicalSectorId) const
|
||||
{
|
||||
for (int i = 0; i < logicalSectorsOnDisk.size(); i++)
|
||||
if (logicalSectorsOnDisk[i] == logicalSectorId)
|
||||
return physicalSectors[i];
|
||||
return diskSectorOrder[i];
|
||||
Error() << fmt::format(
|
||||
"LAYOUT: logical sector {} not recognised", logicalSectorId);
|
||||
throw nullptr;
|
||||
}
|
||||
#endif
|
||||
|
||||
17
lib/layout.h
17
lib/layout.h
@@ -3,6 +3,8 @@
|
||||
|
||||
#include "lib/flux.h"
|
||||
|
||||
class SectorListProto;
|
||||
|
||||
class Layout
|
||||
{
|
||||
public:
|
||||
@@ -40,6 +42,9 @@ public:
|
||||
static const Layout& getLayoutOfTrack(
|
||||
unsigned logicalTrack, unsigned logicalHead);
|
||||
|
||||
/* Expand a SectorList into the actual sector IDs. */
|
||||
static std::vector<unsigned> expandSectorList(const SectorListProto& sectorsProto);
|
||||
|
||||
public:
|
||||
unsigned numTracks;
|
||||
unsigned numSides;
|
||||
@@ -47,16 +52,10 @@ public:
|
||||
unsigned sectorSize;
|
||||
|
||||
/* Physical sector IDs in disk order. */
|
||||
std::vector<unsigned> physicalSectors;
|
||||
std::vector<unsigned> diskSectorOrder;
|
||||
|
||||
/* Logical sector IDs in disk order. */
|
||||
std::vector<unsigned> logicalSectorsOnDisk;
|
||||
|
||||
/* Logical sector IDs in filesystem order. */
|
||||
std::vector<unsigned> logicalSectors;
|
||||
|
||||
unsigned physicalSectorToLogical(unsigned sectorId) const;
|
||||
unsigned logicalSectorToPhysical(unsigned sectorId) const;
|
||||
/* Physical sector IDs in dlogical order. */
|
||||
std::vector<unsigned> logicalSectorOrder;
|
||||
};
|
||||
|
||||
#endif
|
||||
|
||||
@@ -2,6 +2,18 @@ syntax = "proto2";
|
||||
|
||||
import "lib/common.proto";
|
||||
|
||||
message SectorListProto
|
||||
{
|
||||
/* either */
|
||||
repeated int32 sector = 1 [ (help) = "sector ID" ];
|
||||
|
||||
/* or */
|
||||
optional int32 start_sector = 2
|
||||
[ (help) = "first sector of a continuous run" ];
|
||||
optional int32 count = 3
|
||||
[ (help) = "number of sectors in a continuous run" ];
|
||||
}
|
||||
|
||||
message LayoutProto
|
||||
{
|
||||
enum Order
|
||||
@@ -11,18 +23,6 @@ message LayoutProto
|
||||
HCS = 2;
|
||||
}
|
||||
|
||||
message SectorsProto
|
||||
{
|
||||
/* either */
|
||||
repeated int32 sector = 1 [ (help) = "sector ID" ];
|
||||
|
||||
/* or */
|
||||
optional int32 start_sector = 2
|
||||
[ (help) = "first sector of a continuous run" ];
|
||||
optional int32 count = 3
|
||||
[ (help) = "number of sectors in a continuous run" ];
|
||||
}
|
||||
|
||||
message LayoutdataProto
|
||||
{
|
||||
optional int32 track = 1
|
||||
@@ -35,9 +35,9 @@ message LayoutProto
|
||||
optional int32 sector_size = 3
|
||||
[ default = 512, (help) = "number of bytes per sector" ];
|
||||
|
||||
optional SectorsProto physical = 4
|
||||
optional SectorListProto physical = 4
|
||||
[ (help) = "physical order of sectors on disk" ];
|
||||
optional SectorsProto logical = 6
|
||||
optional SectorListProto logical = 6
|
||||
[ (help) = "logical order of sectors in filesystem" ];
|
||||
}
|
||||
|
||||
|
||||
@@ -38,7 +38,6 @@ public:
|
||||
nanoseconds_t dataEndTime = 0;
|
||||
unsigned physicalTrack = 0;
|
||||
unsigned physicalHead = 0;
|
||||
unsigned physicalSector = 0;
|
||||
unsigned logicalTrack = 0;
|
||||
unsigned logicalSide = 0;
|
||||
unsigned logicalSector = 0;
|
||||
|
||||
@@ -91,7 +91,7 @@ public:
|
||||
dev.devType = DEVTYPE_FLOPDD;
|
||||
dev.cylinders = config.layout().tracks();
|
||||
dev.heads = config.layout().sides();
|
||||
dev.sectors = Layout::getLayoutOfTrack(0, 0).logicalSectors.size();
|
||||
dev.sectors = Layout::getLayoutOfTrack(0, 0).numSectors;
|
||||
adfInitDevice(&dev, nullptr, false);
|
||||
int res = adfCreateFlop(&dev, (char*)volumeName.c_str(), 0);
|
||||
if (res != RC_OK)
|
||||
|
||||
@@ -70,7 +70,7 @@ public:
|
||||
* a time. */
|
||||
|
||||
if (!imageContainsAllSectorsOf(
|
||||
_changedSectors, track, side, trackLayout.logicalSectors))
|
||||
_changedSectors, track, side, trackLayout.logicalSectorOrder))
|
||||
{
|
||||
/* If we don't have any loaded sectors for this track, pre-read
|
||||
* it. */
|
||||
@@ -81,7 +81,7 @@ public:
|
||||
/* Now merge the loaded track with the changed one, and write
|
||||
* the result back. */
|
||||
|
||||
for (unsigned sectorId : trackLayout.logicalSectors)
|
||||
for (unsigned sectorId : trackLayout.logicalSectorOrder)
|
||||
{
|
||||
if (!_changedSectors.contains(track, side, sectorId))
|
||||
_changedSectors.put(track, side, sectorId)->data =
|
||||
|
||||
@@ -165,11 +165,11 @@ Filesystem::Filesystem(std::shared_ptr<SectorInterface> sectors):
|
||||
int side = p.second;
|
||||
|
||||
auto& trackLayout = Layout::getLayoutOfTrack(track, side);
|
||||
if (trackLayout.logicalSectors.empty())
|
||||
if (trackLayout.numSectors == 0)
|
||||
Error() << "FS: filesystem support cannot be used without concrete "
|
||||
"layout information";
|
||||
|
||||
for (int sectorId : trackLayout.logicalSectors)
|
||||
for (int sectorId : trackLayout.logicalSectorOrder)
|
||||
_locations.push_back(std::make_tuple(track, side, sectorId));
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1,6 +1,7 @@
|
||||
syntax = "proto2";
|
||||
|
||||
import "lib/common.proto";
|
||||
import "lib/layout.proto";
|
||||
|
||||
message AcornDfsProto
|
||||
{
|
||||
@@ -58,6 +59,7 @@ message CbmfsProto
|
||||
|
||||
message ProdosProto {}
|
||||
|
||||
// NEXT_TAG: 10
|
||||
message FilesystemProto
|
||||
{
|
||||
oneof filesystem
|
||||
@@ -71,4 +73,6 @@ message FilesystemProto
|
||||
CbmfsProto cbmfs = 7;
|
||||
ProdosProto prodos = 8;
|
||||
}
|
||||
|
||||
optional SectorListProto sector_order = 9 [(help) = "specify the filesystem order of sectors"];
|
||||
}
|
||||
|
||||
@@ -97,7 +97,7 @@ void visualiseSectorsToFile(const Image& image, const std::string& filename)
|
||||
for (const auto& sector : image)
|
||||
{
|
||||
if ((sector->physicalHead == side) && (sector->physicalTrack == physicalTrack)
|
||||
&& (sector->physicalSector == alignWithSector))
|
||||
&& (sector->logicalSector == alignWithSector))
|
||||
{
|
||||
offset = sector->headerStartTime;
|
||||
if (!offset)
|
||||
@@ -189,20 +189,19 @@ static void readRow(const std::vector<std::string>& row, Image& image)
|
||||
|
||||
int logicalTrack = std::stoi(row[3]);
|
||||
int logicalSide = std::stoi(row[4]);
|
||||
int logicalSector = std::stoi(row[5]);
|
||||
int logicalSector = std::stoi(row[2]);
|
||||
|
||||
const auto& sector = image.put(logicalTrack, logicalSide, logicalSector);
|
||||
sector->physicalTrack = std::stoi(row[0]);
|
||||
sector->physicalHead = std::stoi(row[1]);
|
||||
sector->physicalSector = std::stoi(row[2]);
|
||||
sector->logicalTrack = logicalTrack;
|
||||
sector->logicalSide = logicalSide;
|
||||
sector->logicalSector = logicalSector;
|
||||
sector->clock = std::stod(row[6]);
|
||||
sector->headerStartTime = std::stod(row[7]);
|
||||
sector->headerEndTime = std::stod(row[8]);
|
||||
sector->dataStartTime = std::stod(row[9]);
|
||||
sector->dataEndTime = std::stod(row[10]);
|
||||
sector->clock = std::stod(row[5]);
|
||||
sector->headerStartTime = std::stod(row[6]);
|
||||
sector->headerEndTime = std::stod(row[7]);
|
||||
sector->dataStartTime = std::stod(row[8]);
|
||||
sector->dataEndTime = std::stod(row[9]);
|
||||
sector->status = status;
|
||||
}
|
||||
catch (const std::invalid_argument& e)
|
||||
|
||||
@@ -1,25 +1,23 @@
|
||||
comment: 'Applies standard AppleDOS soft sector skew to the Apple II format'
|
||||
is_extension: true
|
||||
|
||||
layout {
|
||||
layoutdata {
|
||||
logical {
|
||||
sector: 0
|
||||
sector: 7
|
||||
sector: 14
|
||||
sector: 6
|
||||
sector: 13
|
||||
sector: 5
|
||||
sector: 12
|
||||
sector: 4
|
||||
sector: 11
|
||||
sector: 3
|
||||
sector: 10
|
||||
sector: 2
|
||||
sector: 9
|
||||
sector: 1
|
||||
sector: 8
|
||||
sector: 15
|
||||
}
|
||||
filesystem {
|
||||
sector_order {
|
||||
sector: 0
|
||||
sector: 7
|
||||
sector: 14
|
||||
sector: 6
|
||||
sector: 13
|
||||
sector: 5
|
||||
sector: 12
|
||||
sector: 4
|
||||
sector: 11
|
||||
sector: 3
|
||||
sector: 10
|
||||
sector: 2
|
||||
sector: 9
|
||||
sector: 1
|
||||
sector: 8
|
||||
sector: 15
|
||||
}
|
||||
}
|
||||
|
||||
@@ -2,30 +2,26 @@
|
||||
comment: 'Applies standard ProDOS soft sector skew to the Apple II format'
|
||||
is_extension: true
|
||||
|
||||
layout {
|
||||
layoutdata {
|
||||
logical {
|
||||
sector: 0
|
||||
sector: 8
|
||||
sector: 1
|
||||
sector: 9
|
||||
sector: 2
|
||||
sector: 10
|
||||
sector: 3
|
||||
sector: 11
|
||||
sector: 4
|
||||
sector: 12
|
||||
sector: 5
|
||||
sector: 13
|
||||
sector: 6
|
||||
sector: 14
|
||||
sector: 7
|
||||
sector: 15
|
||||
}
|
||||
filesystem {
|
||||
prodos {}
|
||||
|
||||
sector_order {
|
||||
sector: 0
|
||||
sector: 8
|
||||
sector: 1
|
||||
sector: 9
|
||||
sector: 2
|
||||
sector: 10
|
||||
sector: 3
|
||||
sector: 11
|
||||
sector: 4
|
||||
sector: 12
|
||||
sector: 5
|
||||
sector: 13
|
||||
sector: 6
|
||||
sector: 14
|
||||
sector: 7
|
||||
sector: 15
|
||||
}
|
||||
}
|
||||
|
||||
filesystem {
|
||||
prodos {}
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user