From e878c6eef60a68103da806dad05e8c3d8c2f7450 Mon Sep 17 00:00:00 2001 From: David Given Date: Fri, 29 Nov 2024 21:24:32 +0100 Subject: [PATCH 1/5] Remove the unused sector_order field from FilesystemProto. --- lib/vfs/vfs.proto | 3 --- 1 file changed, 3 deletions(-) diff --git a/lib/vfs/vfs.proto b/lib/vfs/vfs.proto index 24acb7f9..cb334bd4 100644 --- a/lib/vfs/vfs.proto +++ b/lib/vfs/vfs.proto @@ -154,7 +154,4 @@ message FilesystemProto optional MicrodosProto microdos = 15; optional ZDosProto zdos = 16; optional RolandFsProto roland = 17; - - optional SectorListProto sector_order = 9 - [ (help) = "specify the filesystem order of sectors" ]; } From 2bda78fb402756861fd3e151ae3be2aa03adef5f Mon Sep 17 00:00:00 2001 From: David Given Date: Fri, 29 Nov 2024 22:07:58 +0100 Subject: [PATCH 2/5] Distinguish between filesystem track ordering and image track ordering (although currently only the filesystem ordering is used). --- lib/algorithms/readerwriter.cc | 4 ++-- lib/config/flags.h | 2 +- lib/config/layout.proto | 8 +++++--- lib/data/image.cc | 4 +++- lib/data/layout.cc | 14 +++++++------- lib/data/layout.h | 5 ++++- lib/decoders/decoders.h | 4 ++-- lib/imagereader/d88imagereader.cc | 2 +- lib/imagereader/imagereader.cc | 2 +- lib/imagereader/imagereader.h | 2 +- lib/imagereader/imagereader.proto | 2 +- lib/imagereader/imdimagereader.cc | 2 +- lib/imagereader/imgimagereader.cc | 3 ++- lib/imagewriter/d88imagewriter.cc | 6 +++--- lib/imagewriter/imagewriter.cc | 2 +- lib/imagewriter/imagewriter.h | 2 +- lib/imagewriter/imagewriter.proto | 2 +- lib/imagewriter/imdimagewriter.cc | 6 +++--- lib/imagewriter/imgimagewriter.cc | 3 ++- lib/imagewriter/ldbsimagewriter.cc | 4 ++-- lib/imagewriter/nsiimagewriter.cc | 2 +- lib/imagewriter/rawimagewriter.cc | 2 +- lib/vfs/cbmfs.cc | 2 +- lib/vfs/vfs.cc | 4 ++-- src/formats/apple2.textpb | 15 ++++++++------- src/formats/micropolis.textpb | 3 ++- src/formats/psos.textpb | 3 ++- 27 files changed, 61 insertions(+), 49 deletions(-) diff --git a/lib/algorithms/readerwriter.cc b/lib/algorithms/readerwriter.cc index 2c8d485a..f21f7a59 100644 --- a/lib/algorithms/readerwriter.cc +++ b/lib/algorithms/readerwriter.cc @@ -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; diff --git a/lib/config/flags.h b/lib/config/flags.h index 4757b046..67be675f 100644 --- a/lib/config/flags.h +++ b/lib/config/flags.h @@ -46,7 +46,7 @@ class Flag { public: Flag(const std::vector& names, const std::string helptext); - virtual ~Flag(){}; + virtual ~Flag() {}; void checkInitialised() const { diff --git a/lib/config/layout.proto b/lib/config/layout.proto index 1499809a..94ec350b 100644 --- a/lib/config/layout.proto +++ b/lib/config/layout.proto @@ -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" ]; } diff --git a/lib/data/image.cc b/lib/data/image.cc index 9de32250..df7dc57a 100644 --- a/lib/data/image.cc +++ b/lib/data/image.cc @@ -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; diff --git a/lib/data/layout.cc b/lib/data/layout.cc index 89bec9ed..5d89220c 100644 --- a/lib/data/layout.cc +++ b/lib/data/layout.cc @@ -108,21 +108,21 @@ void Layout::getBounds( } std::vector> 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> ordering; - switch (layout.order()) + std::vector> 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> 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 Layout::expandSectorList( diff --git a/lib/data/layout.h b/lib/data/layout.h index 34447139..1cbdcc77 100644 --- a/lib/data/layout.h +++ b/lib/data/layout.h @@ -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 @@ class Layout /* Returns a series of pairs representing the filesystem * ordering of the disk, in logical numbers. */ static std::vector> 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 getLayoutOfTrack( diff --git a/lib/decoders/decoders.h b/lib/decoders/decoders.h index ce2606f2..f689b898 100644 --- a/lib/decoders/decoders.h +++ b/lib/decoders/decoders.h @@ -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 _trackdata; diff --git a/lib/imagereader/d88imagereader.cc b/lib/imagereader/d88imagereader.cc index 9d568203..9accd64b 100644 --- a/lib/imagereader/d88imagereader.cc +++ b/lib/imagereader/d88imagereader.cc @@ -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( diff --git a/lib/imagereader/imagereader.cc b/lib/imagereader/imagereader.cc index 73cd95d7..19aa8179 100644 --- a/lib/imagereader/imagereader.cc +++ b/lib/imagereader/imagereader.cc @@ -68,7 +68,7 @@ std::unique_ptr 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"); diff --git a/lib/imagereader/imagereader.h b/lib/imagereader/imagereader.h index c4855919..70d63d8a 100644 --- a/lib/imagereader/imagereader.h +++ b/lib/imagereader/imagereader.h @@ -13,7 +13,7 @@ class ImageReader { public: ImageReader(const ImageReaderProto& config); - virtual ~ImageReader(){}; + virtual ~ImageReader() {}; public: static std::unique_ptr create(Config& config); diff --git a/lib/imagereader/imagereader.proto b/lib/imagereader/imagereader.proto index 6feaad47..7b838f01 100644 --- a/lib/imagereader/imagereader.proto +++ b/lib/imagereader/imagereader.proto @@ -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 ]; diff --git a/lib/imagereader/imdimagereader.cc b/lib/imagereader/imdimagereader.cc index 7875837f..b844f36a 100644 --- a/lib/imagereader/imdimagereader.cc +++ b/lib/imagereader/imdimagereader.cc @@ -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 diff --git a/lib/imagereader/imgimagereader.cc b/lib/imagereader/imgimagereader.cc index 42e747b2..d9ba43ed 100644 --- a/lib/imagereader/imgimagereader.cc +++ b/lib/imagereader/imgimagereader.cc @@ -32,7 +32,8 @@ class ImgImageReader : public ImageReader "tracks, sides and trackdata fields in the layout?"); std::unique_ptr 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; diff --git a/lib/imagewriter/d88imagewriter.cc b/lib/imagewriter/d88imagewriter.cc index 818db027..161acd46 100644 --- a/lib/imagewriter/d88imagewriter.cc +++ b/lib/imagewriter/d88imagewriter.cc @@ -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> 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) diff --git a/lib/imagewriter/imagewriter.cc b/lib/imagewriter/imagewriter.cc index f0fd463b..50bd14fc 100644 --- a/lib/imagewriter/imagewriter.cc +++ b/lib/imagewriter/imagewriter.cc @@ -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"); diff --git a/lib/imagewriter/imagewriter.h b/lib/imagewriter/imagewriter.h index 9d754534..79c49bb1 100644 --- a/lib/imagewriter/imagewriter.h +++ b/lib/imagewriter/imagewriter.h @@ -9,7 +9,7 @@ class ImageWriter { public: ImageWriter(const ImageWriterProto& config); - virtual ~ImageWriter(){}; + virtual ~ImageWriter() {}; public: static std::unique_ptr create(Config& config); diff --git a/lib/imagewriter/imagewriter.proto b/lib/imagewriter/imagewriter.proto index c2b42daf..a8370912 100644 --- a/lib/imagewriter/imagewriter.proto +++ b/lib/imagewriter/imagewriter.proto @@ -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 ]; diff --git a/lib/imagewriter/imdimagewriter.cc b/lib/imagewriter/imdimagewriter.cc index 1a2537e7..c0478190 100644 --- a/lib/imagewriter/imdimagewriter.cc +++ b/lib/imagewriter/imdimagewriter.cc @@ -354,7 +354,7 @@ class ImdImageWriter : public ImageWriter // 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 @@ class ImdImageWriter : public ImageWriter // 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 @@ class ImdImageWriter : public ImageWriter } 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 diff --git a/lib/imagewriter/imgimagewriter.cc b/lib/imagewriter/imgimagewriter.cc index 631059fd..b4678fbd 100644 --- a/lib/imagewriter/imgimagewriter.cc +++ b/lib/imagewriter/imgimagewriter.cc @@ -31,7 +31,8 @@ class ImgImageWriter : public ImageWriter 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; diff --git a/lib/imagewriter/ldbsimagewriter.cc b/lib/imagewriter/ldbsimagewriter.cc index 728244d1..f1a4c778 100644 --- a/lib/imagewriter/ldbsimagewriter.cc +++ b/lib/imagewriter/ldbsimagewriter.cc @@ -62,7 +62,7 @@ class LDBSImageWriter : public ImageWriter 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 @@ class LDBSImageWriter : public ImageWriter 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) diff --git a/lib/imagewriter/nsiimagewriter.cc b/lib/imagewriter/nsiimagewriter.cc index 038cfbe2..4ea7b980 100644 --- a/lib/imagewriter/nsiimagewriter.cc +++ b/lib/imagewriter/nsiimagewriter.cc @@ -44,7 +44,7 @@ class NsiImageWriter : public ImageWriter 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++) diff --git a/lib/imagewriter/rawimagewriter.cc b/lib/imagewriter/rawimagewriter.cc index f7a9c5a5..66d3f075 100644 --- a/lib/imagewriter/rawimagewriter.cc +++ b/lib/imagewriter/rawimagewriter.cc @@ -38,7 +38,7 @@ class RawImageWriter : public ImageWriter unsigned sectorFileOffset; for (int track = 0; track < geometry.numTracks * geometry.numSides; - track++) + track++) { int side = (track < geometry.numTracks) ? 0 : 1; diff --git a/lib/vfs/cbmfs.cc b/lib/vfs/cbmfs.cc index 5ac64fb6..0b4fc303 100644 --- a/lib/vfs/cbmfs.cc +++ b/lib/vfs/cbmfs.cc @@ -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(); diff --git a/lib/vfs/vfs.cc b/lib/vfs/vfs.cc index 50340539..95ac0d12 100644 --- a/lib/vfs/vfs.cc +++ b/lib/vfs/vfs.cc @@ -160,8 +160,8 @@ Filesystem::Filesystem(std::shared_ptr 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; diff --git a/src/formats/apple2.textpb b/src/formats/apple2.textpb index 7461b464..0a91d459 100644 --- a/src/formats/apple2.textpb +++ b/src/formats/apple2.textpb @@ -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 { diff --git a/src/formats/micropolis.textpb b/src/formats/micropolis.textpb index dd445c62..268b0cd4 100644 --- a/src/formats/micropolis.textpb +++ b/src/formats/micropolis.textpb @@ -124,7 +124,8 @@ option { layoutdata { sector_size: 275 } - order: HCS + filesystem_track_order: HCS + image_track_order: HCS } decoder { diff --git a/src/formats/psos.textpb b/src/formats/psos.textpb index 4bf9afaa..19668efa 100644 --- a/src/formats/psos.textpb +++ b/src/formats/psos.textpb @@ -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 From 0fcb2075e0b39f9d3555b04ab687fcb02ebc7f4e Mon Sep 17 00:00:00 2001 From: David Given Date: Fri, 29 Nov 2024 22:30:33 +0100 Subject: [PATCH 3/5] Move filesystem_track_ordering from ImageReaderProto/ImageWriterProto to ImgInputOutputProto; it now only applies to img files. Make it honour the appropriate track layout setting too. --- lib/algorithms/readerwriter.cc | 2 +- lib/imagereader/imagereader.cc | 23 ----------------------- lib/imagereader/imagereader.h | 7 +------ lib/imagereader/imagereader.proto | 15 ++++++++------- lib/imagereader/imgimagereader.cc | 9 +++++++-- lib/imagewriter/imagewriter.cc | 24 ------------------------ lib/imagewriter/imagewriter.h | 5 +---- lib/imagewriter/imagewriter.proto | 6 +----- lib/imagewriter/imgimagewriter.cc | 10 +++++++++- lib/vfs/imagesectorinterface.cc | 4 ++-- src/fe-write.cc | 2 +- src/formats/apple2.textpb | 24 ++++++++++++++++++------ src/gui/imagerpanel.cc | 4 ++-- 13 files changed, 51 insertions(+), 84 deletions(-) diff --git a/lib/algorithms/readerwriter.cc b/lib/algorithms/readerwriter.cc index f21f7a59..681887f2 100644 --- a/lib/algorithms/readerwriter.cc +++ b/lib/algorithms/readerwriter.cc @@ -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) diff --git a/lib/imagereader/imagereader.cc b/lib/imagereader/imagereader.cc index 19aa8179..03b1e56b 100644 --- a/lib/imagereader/imagereader.cc +++ b/lib/imagereader/imagereader.cc @@ -63,26 +63,3 @@ std::unique_ptr ImageReader::create(const ImageReaderProto& config) } ImageReader::ImageReader(const ImageReaderProto& config): _config(config) {} - -std::unique_ptr ImageReader::readMappedImage() -{ - auto rawImage = readImage(); - - if (!_config.filesystem_track_order()) - return rawImage; - - log("READER: converting from filesystem sector order to disk order"); - std::set> sectors; - for (const auto& e : *rawImage) - { - auto trackLayout = - Layout::getLayoutOfTrack(e->logicalTrack, e->logicalSide); - auto newSector = std::make_shared(); - *newSector = *e; - newSector->logicalSector = - trackLayout->filesystemToNaturalSectorMap.at(e->logicalSector); - sectors.insert(newSector); - } - - return std::make_unique(sectors); -} diff --git a/lib/imagereader/imagereader.h b/lib/imagereader/imagereader.h index 70d63d8a..0cc48fcc 100644 --- a/lib/imagereader/imagereader.h +++ b/lib/imagereader/imagereader.h @@ -51,15 +51,10 @@ class ImageReader return _extraConfig; } - /* Directly reads the image. */ + /* Reads the image. */ virtual std::unique_ptr readImage() = 0; - /* Reads the image, and then applies any optional mapping to go from - * filesystem ordering to disk ordering. */ - - std::unique_ptr readMappedImage(); - protected: const ImageReaderProto& _config; ConfigProto _extraConfig; diff --git a/lib/imagereader/imagereader.proto b/lib/imagereader/imagereader.proto index 7b838f01..6622d8c7 100644 --- a/lib/imagereader/imagereader.proto +++ b/lib/imagereader/imagereader.proto @@ -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 {} @@ -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; diff --git a/lib/imagereader/imgimagereader.cc b/lib/imagereader/imgimagereader.cc index d9ba43ed..2246f303 100644 --- a/lib/imagereader/imgimagereader.cc +++ b/lib/imagereader/imgimagereader.cc @@ -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(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; @@ -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; diff --git a/lib/imagewriter/imagewriter.cc b/lib/imagewriter/imagewriter.cc index 50bd14fc..bb6601be 100644 --- a/lib/imagewriter/imagewriter.cc +++ b/lib/imagewriter/imagewriter.cc @@ -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> sectors; - for (const auto& e : image) - { - auto trackLayout = - Layout::getLayoutOfTrack(e->logicalTrack, e->logicalSide); - auto newSector = std::make_shared(); - *newSector = *e; - newSector->logicalSector = - trackLayout->naturalToFilesystemSectorMap.at(e->logicalSector); - sectors.insert(newSector); - } - - writeImage(Image(sectors)); - } - else - writeImage(image); -} diff --git a/lib/imagewriter/imagewriter.h b/lib/imagewriter/imagewriter.h index 79c49bb1..e2f9f16d 100644 --- a/lib/imagewriter/imagewriter.h +++ b/lib/imagewriter/imagewriter.h @@ -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; diff --git a/lib/imagewriter/imagewriter.proto b/lib/imagewriter/imagewriter.proto index a8370912..8b8d05a1 100644 --- a/lib/imagewriter/imagewriter.proto +++ b/lib/imagewriter/imagewriter.proto @@ -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; diff --git a/lib/imagewriter/imgimagewriter.cc b/lib/imagewriter/imgimagewriter.cc index b4678fbd..1215b3d0 100644 --- a/lib/imagewriter/imgimagewriter.cc +++ b/lib/imagewriter/imgimagewriter.cc @@ -31,8 +31,12 @@ 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; @@ -40,6 +44,10 @@ class ImgImageWriter : public ImageWriter 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) diff --git a/lib/vfs/imagesectorinterface.cc b/lib/vfs/imagesectorinterface.cc index 87d8df15..c8f0e460 100644 --- a/lib/vfs/imagesectorinterface.cc +++ b/lib/vfs/imagesectorinterface.cc @@ -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(); diff --git a/src/fe-write.cc b/src/fe-write.cc index d9e0a854..8492032f 100644 --- a/src/fe-write.cc +++ b/src/fe-write.cc @@ -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 = reader->readMappedImage(); + std::shared_ptr image = reader->readImage(); auto encoder = Arch::createEncoder(globalConfig()); auto fluxSink = FluxSink::create(globalConfig()); diff --git a/src/formats/apple2.textpb b/src/formats/apple2.textpb index 0a91d459..32e4a8bf 100644 --- a/src/formats/apple2.textpb +++ b/src/formats/apple2.textpb @@ -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 { @@ -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 { @@ -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 { diff --git a/src/gui/imagerpanel.cc b/src/gui/imagerpanel.cc index 45aefa5b..7dae4029 100644 --- a/src/gui/imagerpanel.cc +++ b/src/gui/imagerpanel.cc @@ -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(); @@ -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) From cc169d414fdc0ffcf6668455c6bd5ba8944da41e Mon Sep 17 00:00:00 2001 From: David Given Date: Fri, 29 Nov 2024 22:39:34 +0100 Subject: [PATCH 4/5] Add experimental support for libdsk 'altback' mode layouts. --- lib/config/layout.proto | 5 +++-- lib/data/layout.cc | 14 ++++++++++++++ 2 files changed, 17 insertions(+), 2 deletions(-) diff --git a/lib/config/layout.proto b/lib/config/layout.proto index 94ec350b..dcb91f41 100644 --- a/lib/config/layout.proto +++ b/lib/config/layout.proto @@ -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 diff --git a/lib/data/layout.cc b/lib/data/layout.cc index 5d89220c..929ee5c0 100644 --- a/lib/data/layout.cc +++ b/lib/data/layout.cc @@ -137,6 +137,20 @@ std::vector> Layout::getTrackOrdering( 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 trackList"); } From 36b120bdbeed6abddf2de7758508608e12d996a8 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?M=C3=A4rt=20P=C3=B5der?= Date: Sat, 30 Nov 2024 15:31:24 +0200 Subject: [PATCH 5/5] Add Juku 5104 floppies with a new `filesystem_track_order` option --- src/formats/build.py | 1 + src/formats/juku.textpb | 99 +++++++++++++++++++++++++++++++++++++++++ 2 files changed, 100 insertions(+) create mode 100644 src/formats/juku.textpb diff --git a/src/formats/build.py b/src/formats/build.py index c1f67a14..eb8ce196 100644 --- a/src/formats/build.py +++ b/src/formats/build.py @@ -23,6 +23,7 @@ "hplif", "ibm", "icl30", + "juku", "mac", "micropolis", "ms2000", diff --git a/src/formats/juku.textpb b/src/formats/juku.textpb new file mode 100644 index 00000000..b8cf04c1 --- /dev/null +++ b/src/formats/juku.textpb @@ -0,0 +1,99 @@ +shortname: 'Juku E5104' +comment: 'CP/M' + +documentation: +<<< +Juku E5104 is an Estonian school computer from late 1980s and +early 1990s. It was designed by EKTA in 1985, and starting +from 1988 produced in Narva "Baltijets" factory. Arguably +the school computer was technically outdated already when +released, but still occupies a precious spot in the memories +of a whole generation of Estonian IT professionals. + +The system uses dual 5.25 inch ИЗОТ ЕС5323 (IZOT ES5323) +diskette drive with regular MFM encoded DSDD. The disks have +a sector skew factor 2 and tracks start from outside of the +diskette _for both sides_, which is a combination that somewhat +complicates reading CP/M filesystem content with common tools. + +Mostly 800kB (786kB) DSDD disks were used, but there are also +400kB (386kB) SSDD floppies in circulation. + +## References (all in Estonian) + + - [How to read the content of Juku disks?](https://github.com/infoaed/juku3000/blob/master/docs/kettad.md) + - [List of recovered Juku software](https://github.com/infoaed/juku3000/blob/master/docs/tarkvara-kataloog.md) + - [System disks for E5104](https://elektroonikamuuseum.ee/juku_arvuti_tarkvara.html) +>>> + +image_reader { + filename: "image.juk" + type: IMAGETYPE_IMG +} + +image_writer { + filename: "image.juk" + type: IMAGETYPE_IMG +} + +encoder { + ibm {} +} + +decoder { + ibm {} +} + +layout { + format_type: FORMATTYPE_80TRACK + tracks: 80 + sides: 2 + filesystem_track_order: HCS + layoutdata { + sector_size: 512 + physical { + start_sector: 1 + count: 10 + } + filesystem { + start_sector: 1 + count: 10 + skew: 2 + } + + } +} + +option_group { + comment: "$formats" + + option { + name: "800" + comment: '800kB 80-track 10-sector DSDD' + set_by_default: true + } + + option { + name: "400" + comment: '400kB 80-track 10-sector SSDD' + + config { + layout { + sides: 1 + } + } + } + +} + +filesystem { + type: CPMFS + cpmfs { + filesystem_start { + side: 0 + track: 2 + } + block_size: 4096 + dir_entries: 128 + } +}