Distinguish between filesystem track ordering and image track ordering

(although currently only the filesystem ordering is used).
This commit is contained in:
David Given
2024-11-29 22:07:58 +01:00
parent e878c6eef6
commit 2bda78fb40
27 changed files with 61 additions and 49 deletions

View File

@@ -347,7 +347,7 @@ ReadResult readGroup(FluxSourceIteratorHolder& fluxSourceIteratorHolder,
ReadResult result = BAD_AND_CAN_NOT_RETRY;
for (unsigned offset = 0; offset < trackInfo->groupSize;
offset += Layout::getHeadWidth())
offset += Layout::getHeadWidth())
{
log(BeginReadOperationLogMessage{
trackInfo->physicalTrack + offset, trackInfo->physicalSide});
@@ -404,7 +404,7 @@ void writeTracks(FluxSink& fluxSink,
for (;;)
{
for (int offset = 0; offset < trackInfo->groupSize;
offset += Layout::getHeadWidth())
offset += Layout::getHeadWidth())
{
unsigned physicalTrack = trackInfo->physicalTrack + offset;

View File

@@ -46,7 +46,7 @@ class Flag
{
public:
Flag(const std::vector<std::string>& names, const std::string helptext);
virtual ~Flag(){};
virtual ~Flag() {};
void checkInitialised() const
{

View File

@@ -54,10 +54,12 @@ message LayoutProto
[ default = 0, (help) = "number of tracks in image" ];
optional int32 sides = 3
[ default = 0, (help) = "number of sides in image" ];
optional Order order = 4
optional Order filesystem_track_order = 4
[ default = CHS, (help) = "the order of sectors in the filesystem" ];
optional bool swap_sides = 5
optional Order image_track_order = 5
[ default = CHS, (help) = "the order of sectors in disk images" ];
optional bool swap_sides = 6
[ default = false, (help) = "the sides are inverted on this disk" ];
optional FormatType format_type = 6
optional FormatType format_type = 7
[ default = FORMATTYPE_UNKNOWN, (help) = "Format type of image" ];
}

View File

@@ -2,6 +2,7 @@
#include "lib/data/sector.h"
#include "lib/data/image.h"
#include "lib/data/layout.h"
#include "lib/config/config.h"
Image::Image() {}
@@ -25,7 +26,8 @@ void Image::clear()
void Image::createBlankImage()
{
clear();
for (const auto& trackAndHead : Layout::getTrackOrdering())
for (const auto& trackAndHead : Layout::getTrackOrdering(
globalConfig()->layout().filesystem_track_order()))
{
unsigned track = trackAndHead.first;
unsigned side = trackAndHead.second;

View File

@@ -108,21 +108,21 @@ void Layout::getBounds(
}
std::vector<std::pair<int, int>> Layout::getTrackOrdering(
unsigned guessedTracks, unsigned guessedSides)
LayoutProto::Order ordering, unsigned guessedTracks, unsigned guessedSides)
{
auto layout = globalConfig()->layout();
int tracks = layout.has_tracks() ? layout.tracks() : guessedTracks;
int sides = layout.has_sides() ? layout.sides() : guessedSides;
std::vector<std::pair<int, int>> ordering;
switch (layout.order())
std::vector<std::pair<int, int>> trackList;
switch (ordering)
{
case LayoutProto::CHS:
{
for (int track = 0; track < tracks; track++)
{
for (int side = 0; side < sides; side++)
ordering.push_back(std::make_pair(track, side));
trackList.push_back(std::make_pair(track, side));
}
break;
}
@@ -132,16 +132,16 @@ std::vector<std::pair<int, int>> Layout::getTrackOrdering(
for (int side = 0; side < sides; side++)
{
for (int track = 0; track < tracks; track++)
ordering.push_back(std::make_pair(track, side));
trackList.push_back(std::make_pair(track, side));
}
break;
}
default:
error("LAYOUT: invalid track ordering");
error("LAYOUT: invalid track trackList");
}
return ordering;
return trackList;
}
std::vector<unsigned> Layout::expandSectorList(

View File

@@ -2,6 +2,7 @@
#define LAYOUT_H
#include "lib/data/flux.h"
#include "lib/config/layout.pb.h"
class SectorListProto;
class TrackInfo;
@@ -39,7 +40,9 @@ public:
/* Returns a series of <track, side> pairs representing the filesystem
* ordering of the disk, in logical numbers. */
static std::vector<std::pair<int, int>> getTrackOrdering(
unsigned guessedTracks = 0, unsigned guessedSides = 0);
LayoutProto::Order ordering,
unsigned guessedTracks = 0,
unsigned guessedSides = 0);
/* Returns the layout of a given track. */
static std::shared_ptr<const TrackInfo> getLayoutOfTrack(

View File

@@ -98,10 +98,10 @@ public:
}
protected:
virtual void beginTrack(){};
virtual void beginTrack() {};
virtual nanoseconds_t advanceToNextRecord() = 0;
virtual void decodeSectorRecord() = 0;
virtual void decodeDataRecord(){};
virtual void decodeDataRecord() {};
const DecoderProto& _config;
std::shared_ptr<TrackDataFlux> _trackdata;

View File

@@ -93,7 +93,7 @@ public:
auto physical = layoutdata->mutable_physical();
for (int sectorInTrack = 0; sectorInTrack < currentSectorsInTrack;
sectorInTrack++)
sectorInTrack++)
{
Bytes sectorHeader(0x10);
inputFile.read(

View File

@@ -68,7 +68,7 @@ std::unique_ptr<Image> ImageReader::readMappedImage()
{
auto rawImage = readImage();
if (!_config.filesystem_sector_order())
if (!_config.filesystem_track_order())
return rawImage;
log("READER: converting from filesystem sector order to disk order");

View File

@@ -13,7 +13,7 @@ class ImageReader
{
public:
ImageReader(const ImageReaderProto& config);
virtual ~ImageReader(){};
virtual ~ImageReader() {};
public:
static std::unique_ptr<ImageReader> create(Config& config);

View File

@@ -19,7 +19,7 @@ message NfdInputProto {}
message ImageReaderProto
{
optional string filename = 1 [ (help) = "filename of input sector image" ];
optional bool filesystem_sector_order = 13 [
optional bool filesystem_track_order = 13 [
(help) = "read/write sector image in filesystem order",
default = false
];

View File

@@ -301,7 +301,7 @@ public:
switch (Status_Sector)
{
// clang-format off
// clang-format off
/* fluxengine knows of a few sector statussen but not all of the statussen in IMD.
* // the statussen are in sector.h. Translation to fluxengine is as follows:
* Statussen fluxengine | Status IMD

View File

@@ -32,7 +32,8 @@ public:
"tracks, sides and trackdata fields in the layout?");
std::unique_ptr<Image> image(new Image);
for (const auto& p : Layout::getTrackOrdering())
for (const auto& p :
Layout::getTrackOrdering(layout.filesystem_track_order()))
{
int track = p.first;
int side = p.second;

View File

@@ -65,15 +65,15 @@ public:
uint32_t trackOffset = 688;
for (int track = 0; track < geometry.numTracks * geometry.numSides;
track++)
track++)
{
headerWriter.seek(0x20 + 4 * track);
headerWriter.write_le32(trackOffset);
int side = track & 1;
std::vector<std::shared_ptr<const Sector>> sectors;
for (int sectorId = geometry.firstSector;
sectorId <= geometry.numSectors;
sectorId++)
sectorId <= geometry.numSectors;
sectorId++)
{
const auto& sector = image.get(track >> 1, side, sectorId);
if (sector)

View File

@@ -176,7 +176,7 @@ void ImageWriter::printMap(const Image& image)
void ImageWriter::writeMappedImage(const Image& image)
{
if (_config.filesystem_sector_order())
if (_config.filesystem_track_order())
{
log("WRITER: converting from disk sector order to filesystem order");

View File

@@ -9,7 +9,7 @@ class ImageWriter
{
public:
ImageWriter(const ImageWriterProto& config);
virtual ~ImageWriter(){};
virtual ~ImageWriter() {};
public:
static std::unique_ptr<ImageWriter> create(Config& config);

View File

@@ -67,7 +67,7 @@ message ImdOutputProto
message ImageWriterProto
{
optional string filename = 1 [ (help) = "filename of output sector image" ];
optional bool filesystem_sector_order = 10 [
optional bool filesystem_track_order = 10 [
(help) = "read/write sector image in filesystem order",
default = false
];

View File

@@ -354,7 +354,7 @@ public:
// determine how the optional cylinder map looks like
// write the corresponding logical ID
for (int sectorId = 0; sectorId < numSectorsinTrack;
sectorId++)
sectorId++)
{
// const auto& sector = sectors.get(track, head,
// sectorId);
@@ -372,7 +372,7 @@ public:
// determine how the optional head map looks like
// write the corresponding logical ID
for (int sectorId = 0; sectorId < numSectorsinTrack;
sectorId++)
sectorId++)
{
// const auto& sector = sectors.get(track, head,
// sectorId);
@@ -440,7 +440,7 @@ public:
}
switch (sector->status)
{
// clang-format off
// clang-format off
/* fluxengine knows of a few sector statussen but not all of the statussen in IMD.
* // the statussen are in sector.h. Translation to fluxengine is as follows:
* Statussen fluxengine | Status IMD

View File

@@ -31,7 +31,8 @@ public:
if (!outputFile.is_open())
error("cannot open output file");
for (const auto& p : Layout::getTrackOrdering(tracks, sides))
for (const auto& p : Layout::getTrackOrdering(
layout.filesystem_track_order(), tracks, sides))
{
int track = p.first;
int side = p.second;

View File

@@ -62,7 +62,7 @@ public:
int actualSectors = 0;
for (int sectorId = 0; sectorId < geometry.numSectors;
sectorId++)
sectorId++)
{
const auto& sector = image.get(track, side, sectorId);
if (sector)
@@ -81,7 +81,7 @@ public:
trackHeaderWriter.write_le16(0); /* approximate track length */
for (int sectorId = 0; sectorId < geometry.numSectors;
sectorId++)
sectorId++)
{
const auto& sector = image.get(track, side, sectorId);
if (sector)

View File

@@ -44,7 +44,7 @@ public:
unsigned sectorFileOffset;
for (int track = 0; track < geometry.numTracks * geometry.numSides;
track++)
track++)
{
int side = (track < geometry.numTracks) ? 0 : 1;
for (int sectorId = 0; sectorId < geometry.numSectors; sectorId++)

View File

@@ -38,7 +38,7 @@ public:
unsigned sectorFileOffset;
for (int track = 0; track < geometry.numTracks * geometry.numSides;
track++)
track++)
{
int side = (track < geometry.numTracks) ? 0 : 1;

View File

@@ -128,7 +128,7 @@ class CbmfsFilesystem : public Filesystem
usedBlocks = 0;
unsigned block = 0;
for (int track = 0; track < globalConfig()->layout().tracks();
track++)
track++)
{
uint8_t blocks = br.read_8();
uint32_t bitmap = br.read_le24();

View File

@@ -160,8 +160,8 @@ Filesystem::Filesystem(std::shared_ptr<SectorInterface> sectors):
"information");
unsigned block = 0;
for (const auto& p :
Layout::getTrackOrdering(layout.tracks(), layout.sides()))
for (const auto& p : Layout::getTrackOrdering(
layout.filesystem_track_order(), layout.tracks(), layout.sides()))
{
int track = p.first;
int side = p.second;

View File

@@ -96,7 +96,8 @@ option_group {
format_type: FORMATTYPE_80TRACK
tracks: 80
sides: 2
order: HCS
image_track_order: HCS
filesystem_track_order: HCS
layoutdata {
sector_size: 256
physical {
@@ -136,11 +137,11 @@ option_group {
config {
image_reader {
filesystem_sector_order: true
filesystem_track_order: true
}
image_writer {
filesystem_sector_order: true
filesystem_track_order: true
}
filesystem {
@@ -179,11 +180,11 @@ option_group {
config {
image_reader {
filesystem_sector_order: true
filesystem_track_order: true
}
image_writer {
filesystem_sector_order: true
filesystem_track_order: true
}
filesystem {
@@ -221,11 +222,11 @@ option_group {
config {
image_reader {
filesystem_sector_order: true
filesystem_track_order: true
}
image_writer {
filesystem_sector_order: true
filesystem_track_order: true
}
filesystem {

View File

@@ -124,7 +124,8 @@ option {
layoutdata {
sector_size: 275
}
order: HCS
filesystem_track_order: HCS
image_track_order: HCS
}
decoder {

View File

@@ -38,7 +38,8 @@ layout {
format_type: FORMATTYPE_80TRACK
tracks: 80
sides: 2
order: HCS
image_track_order: HCS
filesystem_track_order: HCS
swap_sides: true
layoutdata {
sector_size: 1024