diff --git a/.github/workflows/ccpp.yml b/.github/workflows/ccpp.yml index e83efdb5..e758c67f 100644 --- a/.github/workflows/ccpp.yml +++ b/.github/workflows/ccpp.yml @@ -10,7 +10,7 @@ jobs: with: fetch-depth: 1 - name: apt - run: sudo apt install libusb-1.0-0-dev libsqlite3-dev ninja-build + run: sudo apt update && sudo apt install libusb-1.0-0-dev libsqlite3-dev ninja-build - name: make run: make diff --git a/doc/using.md b/doc/using.md index 839d1e6e..0e365c96 100644 --- a/doc/using.md +++ b/doc/using.md @@ -177,7 +177,8 @@ directory. These all take an optional `--write-flux` option which will cause the raw flux to be written to the specified file as well as the normal decode. There are various `--dump` options for showing raw data during the decode - process. + process, and `--write-csv` will write a copious CSV report of the state of + every sector in the file in machine-readable format. - `fluxengine write *`: writes various formats of disk. Again, see the per-format documentation [in the index page](../README.md). diff --git a/lib/image.cc b/lib/image.cc deleted file mode 100644 index 37fd33b0..00000000 --- a/lib/image.cc +++ /dev/null @@ -1,25 +0,0 @@ -#include "globals.h" -#include "image.h" -#include "flags.h" -#include "dataspec.h" -#include "sector.h" -#include "sectorset.h" -#include "imagereader/imagereader.h" -#include "imagewriter/imagewriter.h" -#include "fmt/format.h" -#include -#include -#include - -SectorSet readSectorsFromFile(const ImageSpec& spec) -{ - return ImageReader::create(spec)->readImage(); -} - -void writeSectorsToFile(const SectorSet& sectors, const ImageSpec& spec) -{ - std::unique_ptr writer(ImageWriter::create(sectors, spec)); - writer->adjustGeometry(); - writer->printMap(); - writer->writeImage(); -} diff --git a/lib/image.h b/lib/image.h deleted file mode 100644 index f1d6dd6f..00000000 --- a/lib/image.h +++ /dev/null @@ -1,14 +0,0 @@ -#ifndef IMAGE_H -#define IMAGE_H - -class SectorSet; -class ImageSpec; - -extern SectorSet readSectorsFromFile( - const ImageSpec& filename); - -extern void writeSectorsToFile( - const SectorSet& sectors, - const ImageSpec& filename); - -#endif diff --git a/lib/imagereader/imagereader.cc b/lib/imagereader/imagereader.cc index c0a1ede7..170629b4 100644 --- a/lib/imagereader/imagereader.cc +++ b/lib/imagereader/imagereader.cc @@ -1,5 +1,4 @@ #include "globals.h" -#include "image.h" #include "flags.h" #include "dataspec.h" #include "sector.h" diff --git a/lib/imagereader/imgimagereader.cc b/lib/imagereader/imgimagereader.cc index 9a1311a8..be194e88 100644 --- a/lib/imagereader/imgimagereader.cc +++ b/lib/imagereader/imgimagereader.cc @@ -1,5 +1,4 @@ #include "globals.h" -#include "image.h" #include "flags.h" #include "dataspec.h" #include "sector.h" diff --git a/lib/imagewriter/d64imagewriter.cc b/lib/imagewriter/d64imagewriter.cc index 01ab7efa..6b840568 100644 --- a/lib/imagewriter/d64imagewriter.cc +++ b/lib/imagewriter/d64imagewriter.cc @@ -1,5 +1,4 @@ #include "globals.h" -#include "image.h" #include "flags.h" #include "dataspec.h" #include "sector.h" diff --git a/lib/imagewriter/imagewriter.cc b/lib/imagewriter/imagewriter.cc index 4f91f2ea..35ce7043 100644 --- a/lib/imagewriter/imagewriter.cc +++ b/lib/imagewriter/imagewriter.cc @@ -1,11 +1,12 @@ #include "globals.h" -#include "image.h" #include "flags.h" #include "dataspec.h" #include "sector.h" #include "sectorset.h" #include "imagewriter/imagewriter.h" #include "fmt/format.h" +#include +#include std::map ImageWriter::formats = { @@ -63,6 +64,56 @@ void ImageWriter::adjustGeometry() } } +void ImageWriter::writeCsv(const std::string& filename) +{ + std::ofstream f(filename, std::ios::out); + if (!f.is_open()) + Error() << "cannot open CSV report file"; + + f << "\"Physical track\"," + "\"Physical side\"," + "\"Logical track\"," + "\"Logical side\"," + "\"Logical sector\"," + "\"Clock (ns)\"," + "\"Header start (ns)\"," + "\"Header end (ns)\"," + "\"Data start (ns)\"," + "\"Data end (ns)\"," + "\"Raw data address (bytes)\"," + "\"User payload length (bytes)\"," + "\"Status\"" + "\n"; + + for (int track = 0; track < spec.cylinders; track++) + { + for (int head = 0; head < spec.heads; head++) + { + for (int sectorId = 0; sectorId < spec.sectors; sectorId++) + { + f << fmt::format("{},{},", track, head); + const auto& sector = sectors.get(track, head, sectorId); + if (!sector) + f << fmt::format(",,{},,,,,,,,MISSING\n", sectorId); + else + f << fmt::format("{},{},{},{},{},{},{},{},{},{},{}\n", + sector->logicalTrack, + sector->logicalSide, + sector->logicalSector, + sector->clock, + sector->headerStartTime, + sector->headerEndTime, + sector->dataStartTime, + sector->dataEndTime, + sector->position.bytes, + sector->data.size(), + Sector::statusToString(sector->status) + ); + } + } + } +} + void ImageWriter::printMap() { int badSectors = 0; diff --git a/lib/imagewriter/imagewriter.h b/lib/imagewriter/imagewriter.h index d2940666..7d40e1f8 100644 --- a/lib/imagewriter/imagewriter.h +++ b/lib/imagewriter/imagewriter.h @@ -35,6 +35,7 @@ class ImageWriter public: virtual void adjustGeometry(); void printMap(); + void writeCsv(const std::string& filename); virtual void writeImage() = 0; protected: diff --git a/lib/imagewriter/imgimagewriter.cc b/lib/imagewriter/imgimagewriter.cc index e18cdd85..2542e3e6 100644 --- a/lib/imagewriter/imgimagewriter.cc +++ b/lib/imagewriter/imgimagewriter.cc @@ -1,5 +1,4 @@ #include "globals.h" -#include "image.h" #include "flags.h" #include "dataspec.h" #include "sector.h" diff --git a/lib/imagewriter/ldbsimagewriter.cc b/lib/imagewriter/ldbsimagewriter.cc index 87f9a4a9..d9410fb1 100644 --- a/lib/imagewriter/ldbsimagewriter.cc +++ b/lib/imagewriter/ldbsimagewriter.cc @@ -1,5 +1,4 @@ #include "globals.h" -#include "image.h" #include "flags.h" #include "dataspec.h" #include "sector.h" diff --git a/lib/reader.cc b/lib/reader.cc index 5b2f8de5..59980270 100644 --- a/lib/reader.cc +++ b/lib/reader.cc @@ -12,12 +12,13 @@ #include "sectorset.h" #include "visualiser.h" #include "record.h" -#include "image.h" #include "bytes.h" #include "decoders/rawbits.h" #include "track.h" #include "imagewriter/imagewriter.h" #include "fmt/format.h" +#include +#include FlagGroup readerFlags { @@ -68,6 +69,11 @@ static SettableFlag highDensityFlag( { "--high-density", "--hd" }, "set the drive to high density mode"); +static StringFlag csvFile( + { "--write-csv" }, + "write a CSV report of the disk state", + ""); + static std::unique_ptr outputFluxSink; void setReaderDefaultSource(const std::string& source) @@ -85,6 +91,16 @@ void setReaderRevolutions(int revolutions) setHardwareFluxSourceRevolutions(revolutions); } +static void writeSectorsToFile(const SectorSet& sectors, const ImageSpec& spec) +{ + std::unique_ptr writer(ImageWriter::create(sectors, spec)); + writer->adjustGeometry(); + writer->printMap(); + if (!csvFile.get().empty()) + writer->writeCsv(csvFile.get()); + writer->writeImage(); +} + void Track::readFluxmap() { std::cout << fmt::format("{0:>3}.{1}: ", physicalTrack, physicalSide) << std::flush; @@ -280,7 +296,7 @@ void readDiskCommand(AbstractDecoder& decoder) if (!visualise.get().empty()) visualiseSectorsToFile(allSectors, visualise.get()); - + writeSectorsToFile(allSectors, outputSpec); if (failures) std::cerr << "Warning: some sectors could not be decoded." << std::endl; diff --git a/lib/sectorset.cc b/lib/sectorset.cc index ee16e7c8..fc059ada 100644 --- a/lib/sectorset.cc +++ b/lib/sectorset.cc @@ -1,5 +1,4 @@ #include "globals.h" -#include "image.h" #include "sector.h" #include "sectorset.h" diff --git a/lib/visualiser.cc b/lib/visualiser.cc index 0e5b40a1..591d866f 100644 --- a/lib/visualiser.cc +++ b/lib/visualiser.cc @@ -1,6 +1,5 @@ #define _USE_MATH_DEFINES #include "globals.h" -#include "image.h" #include "sector.h" #include "sectorset.h" #include "visualiser.h" diff --git a/lib/writer.cc b/lib/writer.cc index 3877411b..f079cfd5 100644 --- a/lib/writer.cc +++ b/lib/writer.cc @@ -9,9 +9,9 @@ #include "encoders/encoders.h" #include "fluxsource/fluxsource.h" #include "fluxsink/fluxsink.h" +#include "imagereader/imagereader.h" #include "fmt/format.h" #include "record.h" -#include "image.h" #include "sector.h" #include "sectorset.h" @@ -43,6 +43,11 @@ void setWriterDefaultInput(const std::string& input) ::input.set(input); } +static SectorSet readSectorsFromFile(const ImageSpec& spec) +{ + return ImageReader::create(spec)->readImage(); +} + void writeTracks( const std::function(int track, int side)> producer) { diff --git a/mkninja.sh b/mkninja.sh index 95ab72e4..e6c1e1b2 100644 --- a/mkninja.sh +++ b/mkninja.sh @@ -192,7 +192,6 @@ buildlibrary libbackend.a \ lib/fluxsource/streamfluxsource.cc \ lib/globals.cc \ lib/hexdump.cc \ - lib/image.cc \ lib/ldbs.cc \ lib/reader.cc \ lib/sector.cc \ diff --git a/src/fe-inspect.cc b/src/fe-inspect.cc index b781ff8a..012de083 100644 --- a/src/fe-inspect.cc +++ b/src/fe-inspect.cc @@ -4,7 +4,6 @@ #include "fluxmap.h" #include "decoders/fluxmapreader.h" #include "decoders/decoders.h" -#include "image.h" #include "protocol.h" #include "decoders/rawbits.h" #include "record.h" diff --git a/src/fe-readadfs.cc b/src/fe-readadfs.cc index 6497c22c..6fca542c 100644 --- a/src/fe-readadfs.cc +++ b/src/fe-readadfs.cc @@ -3,7 +3,6 @@ #include "reader.h" #include "fluxmap.h" #include "decoders/decoders.h" -#include "image.h" #include "sector.h" #include "sectorset.h" #include "record.h" diff --git a/src/fe-readaeslanier.cc b/src/fe-readaeslanier.cc index 9abbbc01..b1890acb 100644 --- a/src/fe-readaeslanier.cc +++ b/src/fe-readaeslanier.cc @@ -3,7 +3,6 @@ #include "reader.h" #include "fluxmap.h" #include "decoders/decoders.h" -#include "image.h" #include "sector.h" #include "sectorset.h" #include "record.h" diff --git a/src/fe-readamiga.cc b/src/fe-readamiga.cc index c4e8ecf9..c6e8e6d4 100644 --- a/src/fe-readamiga.cc +++ b/src/fe-readamiga.cc @@ -6,7 +6,6 @@ #include "amiga/amiga.h" #include "sector.h" #include "sectorset.h" -#include "image.h" #include "record.h" #include "fmt/format.h" #include diff --git a/src/fe-readampro.cc b/src/fe-readampro.cc index df7f9d2b..283fcb5f 100644 --- a/src/fe-readampro.cc +++ b/src/fe-readampro.cc @@ -3,7 +3,6 @@ #include "reader.h" #include "fluxmap.h" #include "decoders/decoders.h" -#include "image.h" #include "sector.h" #include "sectorset.h" #include "record.h" diff --git a/src/fe-readapple2.cc b/src/fe-readapple2.cc index 9055b7a7..2a2be666 100644 --- a/src/fe-readapple2.cc +++ b/src/fe-readapple2.cc @@ -6,7 +6,6 @@ #include "apple2/apple2.h" #include "sector.h" #include "sectorset.h" -#include "image.h" #include "record.h" #include "fmt/format.h" #include diff --git a/src/fe-readbrother.cc b/src/fe-readbrother.cc index a3fc29fb..9dcde0f0 100644 --- a/src/fe-readbrother.cc +++ b/src/fe-readbrother.cc @@ -7,7 +7,6 @@ #include "brother/brother.h" #include "sector.h" #include "sectorset.h" -#include "image.h" #include "record.h" #include "fmt/format.h" #include diff --git a/src/fe-readc64.cc b/src/fe-readc64.cc index db4c44d0..30281b27 100644 --- a/src/fe-readc64.cc +++ b/src/fe-readc64.cc @@ -6,7 +6,6 @@ #include "c64/c64.h" #include "sector.h" #include "sectorset.h" -#include "image.h" #include "record.h" #include "fmt/format.h" #include diff --git a/src/fe-readdfs.cc b/src/fe-readdfs.cc index 8534f916..121d064f 100644 --- a/src/fe-readdfs.cc +++ b/src/fe-readdfs.cc @@ -3,7 +3,6 @@ #include "reader.h" #include "fluxmap.h" #include "decoders/decoders.h" -#include "image.h" #include "sector.h" #include "sectorset.h" #include "record.h" diff --git a/src/fe-readf85.cc b/src/fe-readf85.cc index 135dd95d..45a98134 100644 --- a/src/fe-readf85.cc +++ b/src/fe-readf85.cc @@ -6,7 +6,6 @@ #include "f85/f85.h" #include "sector.h" #include "sectorset.h" -#include "image.h" #include "record.h" #include "fmt/format.h" #include diff --git a/src/fe-readfb100.cc b/src/fe-readfb100.cc index 92d5907f..108c23b5 100644 --- a/src/fe-readfb100.cc +++ b/src/fe-readfb100.cc @@ -3,7 +3,6 @@ #include "reader.h" #include "fluxmap.h" #include "decoders/decoders.h" -#include "image.h" #include "sector.h" #include "sectorset.h" #include "record.h" diff --git a/src/fe-readibm.cc b/src/fe-readibm.cc index 3a999420..6a26f4fe 100644 --- a/src/fe-readibm.cc +++ b/src/fe-readibm.cc @@ -3,7 +3,6 @@ #include "reader.h" #include "fluxmap.h" #include "decoders/decoders.h" -#include "image.h" #include "sector.h" #include "sectorset.h" #include "record.h" diff --git a/src/fe-readmac.cc b/src/fe-readmac.cc index b0e09eec..5adcbe1e 100644 --- a/src/fe-readmac.cc +++ b/src/fe-readmac.cc @@ -6,7 +6,6 @@ #include "macintosh/macintosh.h" #include "sector.h" #include "sectorset.h" -#include "image.h" #include "record.h" #include "fmt/format.h" #include diff --git a/src/fe-readmx.cc b/src/fe-readmx.cc index 4d534b8b..4abd3b3b 100644 --- a/src/fe-readmx.cc +++ b/src/fe-readmx.cc @@ -4,7 +4,6 @@ #include "fluxmap.h" #include "decoders/decoders.h" #include "mx/mx.h" -#include "image.h" #include "sector.h" #include "sectorset.h" #include "record.h" diff --git a/src/fe-readvictor9k.cc b/src/fe-readvictor9k.cc index 1ac91add..3cb17931 100644 --- a/src/fe-readvictor9k.cc +++ b/src/fe-readvictor9k.cc @@ -6,7 +6,6 @@ #include "victor9k/victor9k.h" #include "sector.h" #include "sectorset.h" -#include "image.h" #include "record.h" #include "fmt/format.h" #include diff --git a/src/fe-readzilogmcz.cc b/src/fe-readzilogmcz.cc index e9fd8c9f..faf77428 100644 --- a/src/fe-readzilogmcz.cc +++ b/src/fe-readzilogmcz.cc @@ -3,7 +3,6 @@ #include "reader.h" #include "fluxmap.h" #include "decoders/decoders.h" -#include "image.h" #include "sector.h" #include "sectorset.h" #include "record.h" diff --git a/src/fe-writeamiga.cc b/src/fe-writeamiga.cc index da13c1d9..76a56d82 100644 --- a/src/fe-writeamiga.cc +++ b/src/fe-writeamiga.cc @@ -4,7 +4,6 @@ #include "amiga/amiga.h" #include "writer.h" #include "fmt/format.h" -#include "image.h" #include static FlagGroup flags { &writerFlags, &amigaEncoderFlags }; diff --git a/src/fe-writebrother.cc b/src/fe-writebrother.cc index 19e79d47..c308b988 100644 --- a/src/fe-writebrother.cc +++ b/src/fe-writebrother.cc @@ -5,7 +5,6 @@ #include "brother/brother.h" #include "writer.h" #include "fmt/format.h" -#include "image.h" #include static FlagGroup flags { &writerFlags, &brotherEncoderFlags }; diff --git a/src/fe-writeibm.cc b/src/fe-writeibm.cc index 4f1f81f7..16717b35 100644 --- a/src/fe-writeibm.cc +++ b/src/fe-writeibm.cc @@ -5,7 +5,6 @@ #include "ibm/ibm.h" #include "writer.h" #include "fmt/format.h" -#include "image.h" #include static FlagGroup flags { &writerFlags };