mirror of
https://github.com/davidgiven/fluxengine.git
synced 2025-10-24 11:11:02 -07:00
Distinguish between filesystem track ordering and image track ordering
(although currently only the filesystem ordering is used).
This commit is contained in:
@@ -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;
|
||||
|
||||
|
||||
@@ -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
|
||||
{
|
||||
|
||||
@@ -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" ];
|
||||
}
|
||||
|
||||
@@ -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;
|
||||
|
||||
@@ -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(
|
||||
|
||||
@@ -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(
|
||||
|
||||
@@ -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;
|
||||
|
||||
@@ -93,7 +93,7 @@ public:
|
||||
auto physical = layoutdata->mutable_physical();
|
||||
|
||||
for (int sectorInTrack = 0; sectorInTrack < currentSectorsInTrack;
|
||||
sectorInTrack++)
|
||||
sectorInTrack++)
|
||||
{
|
||||
Bytes sectorHeader(0x10);
|
||||
inputFile.read(
|
||||
|
||||
@@ -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");
|
||||
|
||||
@@ -13,7 +13,7 @@ class ImageReader
|
||||
{
|
||||
public:
|
||||
ImageReader(const ImageReaderProto& config);
|
||||
virtual ~ImageReader(){};
|
||||
virtual ~ImageReader() {};
|
||||
|
||||
public:
|
||||
static std::unique_ptr<ImageReader> create(Config& config);
|
||||
|
||||
@@ -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
|
||||
];
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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;
|
||||
|
||||
@@ -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)
|
||||
|
||||
@@ -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");
|
||||
|
||||
|
||||
@@ -9,7 +9,7 @@ class ImageWriter
|
||||
{
|
||||
public:
|
||||
ImageWriter(const ImageWriterProto& config);
|
||||
virtual ~ImageWriter(){};
|
||||
virtual ~ImageWriter() {};
|
||||
|
||||
public:
|
||||
static std::unique_ptr<ImageWriter> create(Config& config);
|
||||
|
||||
@@ -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
|
||||
];
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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;
|
||||
|
||||
@@ -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)
|
||||
|
||||
@@ -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++)
|
||||
|
||||
@@ -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;
|
||||
|
||||
|
||||
@@ -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();
|
||||
|
||||
@@ -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;
|
||||
|
||||
@@ -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 {
|
||||
|
||||
@@ -124,7 +124,8 @@ option {
|
||||
layoutdata {
|
||||
sector_size: 275
|
||||
}
|
||||
order: HCS
|
||||
filesystem_track_order: HCS
|
||||
image_track_order: HCS
|
||||
}
|
||||
|
||||
decoder {
|
||||
|
||||
@@ -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
|
||||
|
||||
Reference in New Issue
Block a user