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