Rip out the old approach to soft sector remapping as it wasn't working.

This commit is contained in:
David Given
2022-09-11 17:05:40 +02:00
parent ea1ab029f3
commit 3cb098f9ba
43 changed files with 141 additions and 161 deletions

View File

@@ -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). */

View File

@@ -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 */
}

View File

@@ -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));

View File

@@ -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)

View File

@@ -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 */
}

View File

@@ -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

View File

@@ -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;

View File

@@ -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);

View File

@@ -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)))

View File

@@ -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);

View File

@@ -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];

View File

@@ -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;

View File

@@ -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:

View File

@@ -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);

View File

@@ -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 */

View File

@@ -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()

View File

@@ -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;

View File

@@ -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;

View File

@@ -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++;

View File

@@ -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) {

View File

@@ -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++)

View File

@@ -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();

View File

@@ -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);

View File

@@ -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)

View File

@@ -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{

View File

@@ -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;

View File

@@ -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);
}
}

View File

@@ -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;
}

View File

@@ -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;

View File

@@ -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());

View File

@@ -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,

View File

@@ -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)

View File

@@ -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

View File

@@ -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

View File

@@ -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" ];
}

View File

@@ -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;

View File

@@ -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)

View File

@@ -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 =

View File

@@ -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));
}
}

View File

@@ -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"];
}

View File

@@ -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)

View File

@@ -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
}
}

View File

@@ -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 {}
}