Skip to content

Commit

Permalink
Move filesystem_track_ordering from ImageReaderProto/ImageWriterProto to
Browse files Browse the repository at this point in the history
ImgInputOutputProto; it now only applies to img files. Make it honour the
appropriate track layout setting too.
  • Loading branch information
davidgiven committed Nov 29, 2024
1 parent 2bda78f commit 0fcb207
Show file tree
Hide file tree
Showing 13 changed files with 51 additions and 84 deletions.
2 changes: 1 addition & 1 deletion lib/algorithms/readerwriter.cc
Original file line number Diff line number Diff line change
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
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_track_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);
}
7 changes: 1 addition & 6 deletions lib/imagereader/imagereader.h
Original file line number Diff line number Diff line change
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_track_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
9 changes: 7 additions & 2 deletions lib/imagereader/imgimagereader.cc
Original file line number Diff line number Diff line change
Expand Up @@ -31,9 +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(layout.filesystem_track_order()))
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 @@ -47,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
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_track_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);
}
5 changes: 1 addition & 4 deletions lib/imagewriter/imagewriter.h
Original file line number Diff line number Diff line change
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_track_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
10 changes: 9 additions & 1 deletion lib/imagewriter/imgimagewriter.cc
Original file line number Diff line number Diff line change
Expand Up @@ -31,15 +31,23 @@ class ImgImageWriter : public ImageWriter
if (!outputFile.is_open())
error("cannot open output file");

bool in_filesystem_order = _config.img().filesystem_sector_order();
for (const auto& p : Layout::getTrackOrdering(
layout.filesystem_track_order(), tracks, sides))
in_filesystem_order ? layout.filesystem_track_order()
: layout.image_track_order(),
tracks,
sides))
{
int track = p.first;
int side = p.second;

auto trackLayout = Layout::getLayoutOfTrack(track, side);
for (int sectorId : trackLayout->naturalSectorOrder)
{
if (in_filesystem_order)
sectorId =
trackLayout->filesystemToNaturalSectorMap.at(sectorId);

const auto& sector = image.get(track, side, sectorId);
if (sector)
sector->data.slice(0, trackLayout->sectorSize)
Expand Down
4 changes: 2 additions & 2 deletions lib/vfs/imagesectorinterface.cc
Original file line number Diff line number Diff line change
Expand Up @@ -44,14 +44,14 @@ class ImageSectorInterface : public SectorInterface

void flushChanges() override
{
_writer->writeMappedImage(*_image);
_writer->writeImage(*_image);
_changed = false;
}

void discardChanges() override
{
if (_reader)
_image = _reader->readMappedImage();
_image = _reader->readImage();
else
{
_image = std::make_shared<Image>();
Expand Down
2 changes: 1 addition & 1 deletion src/fe-write.cc
Original file line number Diff line number Diff line change
Expand Up @@ -68,7 +68,7 @@ int mainWrite(int argc, const char* argv[])
flags.parseFlagsWithConfigFiles(argc, argv, formats);

auto reader = ImageReader::create(globalConfig());
std::shared_ptr<Image> image = reader->readMappedImage();
std::shared_ptr<Image> image = reader->readImage();

auto encoder = Arch::createEncoder(globalConfig());
auto fluxSink = FluxSink::create(globalConfig());
Expand Down
24 changes: 18 additions & 6 deletions src/formats/apple2.textpb
Original file line number Diff line number Diff line change
Expand Up @@ -137,11 +137,15 @@ option_group {

config {
image_reader {
filesystem_track_order: true
img {
filesystem_sector_order: true
}
}

image_writer {
filesystem_track_order: true
img {
filesystem_sector_order: true
}
}

filesystem {
Expand Down Expand Up @@ -180,11 +184,15 @@ option_group {

config {
image_reader {
filesystem_track_order: true
img {
filesystem_sector_order: true
}
}

image_writer {
filesystem_track_order: true
img {
filesystem_sector_order: true
}
}

filesystem {
Expand Down Expand Up @@ -222,11 +230,15 @@ option_group {

config {
image_reader {
filesystem_track_order: true
img {
filesystem_sector_order: true
}
}

image_writer {
filesystem_track_order: true
img {
filesystem_sector_order: true
}
}

filesystem {
Expand Down
4 changes: 2 additions & 2 deletions src/gui/imagerpanel.cc
Original file line number Diff line number Diff line change
Expand Up @@ -142,7 +142,7 @@ class ImagerPanelImpl : public ImagerPanelGen, public ImagerPanel, JobQueue
[this]()
{
auto image =
GetContext().GetImageReader()->readMappedImage();
GetContext().GetImageReader()->readImage();
auto* encoder = GetContext().GetEncoder();
auto* fluxSink = GetContext().GetFluxSink();

Expand Down Expand Up @@ -260,7 +260,7 @@ class ImagerPanelImpl : public ImagerPanelGen, public ImagerPanel, JobQueue
QueueJob(
[image, this]()
{
GetContext().GetImageWriter()->writeMappedImage(*image);
GetContext().GetImageWriter()->writeImage(*image);
});
}
catch (const ErrorException& e)
Expand Down

0 comments on commit 0fcb207

Please sign in to comment.