Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Fix and expand the layout support to allow libdsk altback layouts. #796

Open
wants to merge 5 commits into
base: master
Choose a base branch
from
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
6 changes: 3 additions & 3 deletions lib/algorithms/readerwriter.cc
Original file line number Diff line number Diff line change
Expand Up @@ -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});
Expand Down Expand Up @@ -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;

Expand Down Expand Up @@ -734,7 +734,7 @@ void readDiskCommand(
if (globalConfig()->decoder().has_write_csv_to())
writer.writeCsv(
*diskflux->image, globalConfig()->decoder().write_csv_to());
writer.writeMappedImage(*diskflux->image);
writer.writeImage(*diskflux->image);
}

void rawReadDiskCommand(FluxSource& fluxsource, FluxSink& fluxsink)
Expand Down
2 changes: 1 addition & 1 deletion lib/config/flags.h
Original file line number Diff line number Diff line change
Expand Up @@ -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
{
Expand Down
13 changes: 8 additions & 5 deletions lib/config/layout.proto
Original file line number Diff line number Diff line change
Expand Up @@ -22,8 +22,9 @@ message LayoutProto
enum Order
{
UNDEFINED = 0;
CHS = 1;
HCS = 2;
CHS = 1; // sort by cylinder, then head, then sector -- libdsk 'alt'
HCS = 2; // sort by head, then cylinder, then sector -- libdsk 'outout'
HCS_RH1 = 3; // as HCS, except the cylinder count for head 1 is reversed -- libdsk 'outback'
}

message LayoutdataProto
Expand Down Expand Up @@ -54,10 +55,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" ];
}
4 changes: 3 additions & 1 deletion lib/data/image.cc
Original file line number Diff line number Diff line change
Expand Up @@ -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() {}

Expand All @@ -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;
Expand Down
28 changes: 21 additions & 7 deletions lib/data/layout.cc
Original file line number Diff line number Diff line change
Expand Up @@ -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;
}
Expand All @@ -132,16 +132,30 @@ 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;
}

case LayoutProto::HCS_RH1:
{
for (int side = 0; side < sides; side++)
{
if (side == 0)
for (int track = 0; track < tracks; track++)
trackList.push_back(std::make_pair(track, side));
if (side == 1)
for (int track = tracks; track >= 0; track--)
trackList.push_back(std::make_pair(track - 1, side));
}
break;
}

default:
error("LAYOUT: invalid track ordering");
error("LAYOUT: invalid track trackList");
}

return ordering;
return trackList;
}

std::vector<unsigned> Layout::expandSectorList(
Expand Down
5 changes: 4 additions & 1 deletion lib/data/layout.h
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,7 @@
#define LAYOUT_H

#include "lib/data/flux.h"
#include "lib/config/layout.pb.h"

class SectorListProto;
class TrackInfo;
Expand Down Expand Up @@ -39,7 +40,9 @@ class Layout
/* 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(
Expand Down
4 changes: 2 additions & 2 deletions lib/decoders/decoders.h
Original file line number Diff line number Diff line change
Expand Up @@ -98,10 +98,10 @@ class Decoder
}

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;
Expand Down
2 changes: 1 addition & 1 deletion lib/imagereader/d88imagereader.cc
Original file line number Diff line number Diff line change
Expand Up @@ -93,7 +93,7 @@ class D88ImageReader : public ImageReader
auto physical = layoutdata->mutable_physical();

for (int sectorInTrack = 0; sectorInTrack < currentSectorsInTrack;
sectorInTrack++)
sectorInTrack++)
{
Bytes sectorHeader(0x10);
inputFile.read(
Expand Down
23 changes: 0 additions & 23 deletions lib/imagereader/imagereader.cc
Original file line number Diff line number Diff line change
Expand Up @@ -63,26 +63,3 @@ std::unique_ptr<ImageReader> ImageReader::create(const ImageReaderProto& config)
}

ImageReader::ImageReader(const ImageReaderProto& config): _config(config) {}

std::unique_ptr<Image> ImageReader::readMappedImage()
{
auto rawImage = readImage();

if (!_config.filesystem_sector_order())
return rawImage;

log("READER: converting from filesystem sector order to disk order");
std::set<std::shared_ptr<const Sector>> sectors;
for (const auto& e : *rawImage)
{
auto trackLayout =
Layout::getLayoutOfTrack(e->logicalTrack, e->logicalSide);
auto newSector = std::make_shared<Sector>();
*newSector = *e;
newSector->logicalSector =
trackLayout->filesystemToNaturalSectorMap.at(e->logicalSector);
sectors.insert(newSector);
}

return std::make_unique<Image>(sectors);
}
9 changes: 2 additions & 7 deletions lib/imagereader/imagereader.h
Original file line number Diff line number Diff line change
Expand Up @@ -13,7 +13,7 @@ class ImageReader
{
public:
ImageReader(const ImageReaderProto& config);
virtual ~ImageReader(){};
virtual ~ImageReader() {};

public:
static std::unique_ptr<ImageReader> create(Config& config);
Expand Down Expand Up @@ -51,15 +51,10 @@ class ImageReader
return _extraConfig;
}

/* Directly reads the image. */
/* Reads the image. */

virtual std::unique_ptr<Image> readImage() = 0;

/* Reads the image, and then applies any optional mapping to go from
* filesystem ordering to disk ordering. */

std::unique_ptr<Image> readMappedImage();

protected:
const ImageReaderProto& _config;
ConfigProto _extraConfig;
Expand Down
15 changes: 8 additions & 7 deletions lib/imagereader/imagereader.proto
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,12 @@ syntax = "proto2";

import "lib/config/common.proto";

message ImgInputOutputProto {}
message ImgInputOutputProto {
optional bool filesystem_sector_order = 1 [
(help) = "read/write sector image in filesystem order",
default = false
];
}

message DiskCopyInputProto {}
message ImdInputProto {}
Expand All @@ -15,16 +20,12 @@ message FdiInputProto {}
message D88InputProto {}
message NfdInputProto {}

// NEXT_TAG: 15
// 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
];

optional ImageReaderWriterType type = 14
optional ImageReaderWriterType type = 13
[default = IMAGETYPE_NOT_SET, (help) = "input image type"];

optional ImgInputOutputProto img = 2;
Expand Down
2 changes: 1 addition & 1 deletion lib/imagereader/imdimagereader.cc
Original file line number Diff line number Diff line change
Expand Up @@ -301,7 +301,7 @@ class IMDImageReader : public ImageReader

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
Expand Down
8 changes: 7 additions & 1 deletion lib/imagereader/imgimagereader.cc
Original file line number Diff line number Diff line change
Expand Up @@ -31,8 +31,11 @@ class ImgImageReader : public ImageReader
"IMG: bad configuration; did you remember to set the "
"tracks, sides and trackdata fields in the layout?");

bool in_filesystem_order = _config.img().filesystem_sector_order();
std::unique_ptr<Image> image(new Image);
for (const auto& p : Layout::getTrackOrdering())
for (const auto& p : Layout::getTrackOrdering(
in_filesystem_order ? layout.filesystem_track_order()
: layout.image_track_order()))
{
int track = p.first;
int side = p.second;
Expand All @@ -46,6 +49,9 @@ class ImgImageReader : public ImageReader
Bytes data(trackLayout->sectorSize);
inputFile.read((char*)data.begin(), data.size());

if (in_filesystem_order)
sectorId =
trackLayout->filesystemToNaturalSectorMap.at(sectorId);
const auto& sector = image->put(track, side, sectorId);
sector->status = Sector::OK;
sector->data = data;
Expand Down
6 changes: 3 additions & 3 deletions lib/imagewriter/d88imagewriter.cc
Original file line number Diff line number Diff line change
Expand Up @@ -65,15 +65,15 @@ class D88ImageWriter : public ImageWriter
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)
Expand Down
24 changes: 0 additions & 24 deletions lib/imagewriter/imagewriter.cc
Original file line number Diff line number Diff line change
Expand Up @@ -173,27 +173,3 @@ void ImageWriter::printMap(const Image& image)
<< std::endl;
}
}

void ImageWriter::writeMappedImage(const Image& image)
{
if (_config.filesystem_sector_order())
{
log("WRITER: converting from disk sector order to filesystem order");

std::set<std::shared_ptr<const Sector>> sectors;
for (const auto& e : image)
{
auto trackLayout =
Layout::getLayoutOfTrack(e->logicalTrack, e->logicalSide);
auto newSector = std::make_shared<Sector>();
*newSector = *e;
newSector->logicalSector =
trackLayout->naturalToFilesystemSectorMap.at(e->logicalSector);
sectors.insert(newSector);
}

writeImage(Image(sectors));
}
else
writeImage(image);
}
7 changes: 2 additions & 5 deletions lib/imagewriter/imagewriter.h
Original file line number Diff line number Diff line change
Expand Up @@ -9,7 +9,7 @@ class ImageWriter
{
public:
ImageWriter(const ImageWriterProto& config);
virtual ~ImageWriter(){};
virtual ~ImageWriter() {};

public:
static std::unique_ptr<ImageWriter> create(Config& config);
Expand Down Expand Up @@ -37,11 +37,8 @@ class ImageWriter
void writeCsv(const Image& sectors, const std::string& filename);

/* Writes a raw image. */
virtual void writeImage(const Image& sectors) = 0;

/* Writes an image applying any optional mapping from disk sector numbering
* to filesystem sector numbering. */
void writeMappedImage(const Image& sectors);
virtual void writeImage(const Image& sectors) = 0;

protected:
const ImageWriterProto& _config;
Expand Down
6 changes: 1 addition & 5 deletions lib/imagewriter/imagewriter.proto
Original file line number Diff line number Diff line change
Expand Up @@ -67,12 +67,8 @@ message ImdOutputProto
message ImageWriterProto
{
optional string filename = 1 [ (help) = "filename of output sector image" ];
optional bool filesystem_sector_order = 10 [
(help) = "read/write sector image in filesystem order",
default = false
];

optional ImageReaderWriterType type = 11
optional ImageReaderWriterType type = 10
[ default = IMAGETYPE_NOT_SET, (help) = "image writer type" ];

optional ImgInputOutputProto img = 2;
Expand Down
Loading
Loading