From 22ba38b2e05c317095aa011cab84192f2ee56623 Mon Sep 17 00:00:00 2001 From: David Given Date: Mon, 17 May 2021 01:06:09 +0200 Subject: [PATCH] Add rawread. --- lib/reader.cc | 15 +++++++++ lib/reader.h | 2 ++ mkninja.sh | 1 + src/fe-rawread.cc | 86 +++++++++++++++++++++++++++++++++++++++++++++++ src/fluxengine.cc | 37 +++----------------- 5 files changed, 108 insertions(+), 33 deletions(-) create mode 100644 src/fe-rawread.cc diff --git a/lib/reader.cc b/lib/reader.cc index 8c859244..792eda5e 100644 --- a/lib/reader.cc +++ b/lib/reader.cc @@ -226,3 +226,18 @@ void readDiskCommand(FluxSource& fluxsource, AbstractDecoder& decoder, ImageWrit if (failures) std::cerr << "Warning: some sectors could not be decoded." << std::endl; } + +void rawReadDiskCommand(FluxSource& fluxsource, FluxSink& fluxsink) +{ + for (int cylinder : iterate(config.cylinders())) + { + for (int head : iterate(config.heads())) + { + Track track(cylinder, head); + track.fluxsource = &fluxsource; + track.readFluxmap(); + + fluxsink.writeFlux(cylinder, head, *(track.fluxmap)); + } + } +} diff --git a/lib/reader.h b/lib/reader.h index f7089828..450ad3b7 100644 --- a/lib/reader.h +++ b/lib/reader.h @@ -2,6 +2,7 @@ #define READER_H class AbstractDecoder; +class FluxSink; class FluxSource; class Fluxmap; class ImageWriter; @@ -10,5 +11,6 @@ class Track; extern std::vector> readTracks(); extern void readDiskCommand(FluxSource& source, AbstractDecoder& decoder, ImageWriter& writer); +extern void rawReadDiskCommand(FluxSource& source, FluxSink& sink); #endif diff --git a/mkninja.sh b/mkninja.sh index 1b1b398a..a1ee0890 100644 --- a/mkninja.sh +++ b/mkninja.sh @@ -418,6 +418,7 @@ buildlibrary libfrontend.a \ src/fe-fluxtovcd.cc \ src/fe-image.cc \ src/fe-inspect.cc \ + src/fe-rawread.cc \ src/fe-rawwrite.cc \ src/fe-read.cc \ src/fe-rpm.cc \ diff --git a/src/fe-rawread.cc b/src/fe-rawread.cc new file mode 100644 index 00000000..ff1da6e7 --- /dev/null +++ b/src/fe-rawread.cc @@ -0,0 +1,86 @@ +#include "globals.h" +#include "flags.h" +#include "reader.h" +#include "fluxmap.h" +#include "decoders/decoders.h" +#include "macintosh/macintosh.h" +#include "sector.h" +#include "sectorset.h" +#include "record.h" +#include "proto.h" +#include "dataspec.h" +#include "fluxsink/fluxsink.h" +#include "fluxsource/fluxsource.h" +#include "arch/brother/brother.h" +#include "arch/ibm/ibm.h" +#include "imagewriter/imagewriter.h" +#include "fmt/format.h" +#include +#include + +static FlagGroup flags; + +static StringFlag sourceFlux( + { "-s", "--source" }, + "flux file to read from", + "", + [](const auto& value) + { + config.mutable_input()->mutable_flux()->set_fluxfile(value); + }); + +static IntFlag sourceDrive( + { "-D", "--drive" }, + "drive to read from", + 0, + [](const auto& value) + { + config.mutable_input()->mutable_flux()->mutable_drive()->set_drive(value); + }); + +static StringFlag destFlux( + { "-d", "--dest" }, + "destination flux file to write to", + "", + [](const auto& value) + { + config.mutable_output()->mutable_flux()->set_fluxfile(value); + }); + +static StringFlag srcCylinders( + { "--cylinders", "-c" }, + "cylinders to read from", + "", + [](const auto& value) + { + setRange(config.mutable_cylinders(), value); + }); + +static StringFlag srcHeads( + { "--heads", "-h" }, + "heads to read from", + "", + [](const auto& value) + { + setRange(config.mutable_heads(), value); + }); + +extern const std::map readables; + +int mainRawRead(int argc, const char* argv[]) +{ + flags.parseFlagsWithConfigFiles(argc, argv, readables); + + if (!config.input().has_flux() || !config.output().has_flux()) + Error() << "incomplete config (did you remember to specify the format?)"; + if (config.output().flux().has_drive()) + Error() << "you can't use rawread to write to hardware"; + + std::unique_ptr fluxSource(FluxSource::create(config.input().flux())); + std::unique_ptr fluxSink(FluxSink::create(config.output().flux())); + + rawReadDiskCommand(*fluxSource, *fluxSink); + + return 0; +} + diff --git a/src/fluxengine.cc b/src/fluxengine.cc index 28b61155..9a4cbb56 100644 --- a/src/fluxengine.cc +++ b/src/fluxengine.cc @@ -11,6 +11,7 @@ extern command_cb mainConvertFluxToVcd; extern command_cb mainConvertImage; extern command_cb mainConvertScpToFlux; extern command_cb mainInspect; +extern command_cb mainRawRead; extern command_cb mainRawWrite; extern command_cb mainRead; extern command_cb mainRpm; @@ -37,43 +38,13 @@ static std::vector commands = { "inspect", mainInspect, "Low-level analysis and inspection of a disk." }, { "analyse", mainAnalyse, "Disk and drive analysis tools." }, { "read", mainRead, "Reads a disk, producing a sector image.", }, + { "write", mainWrite, "Writes a sector image to a disk.", }, + { "rawread", mainRawRead, "Reads raw flux from a disk. Warning: you can't use this to copy disks.", }, + { "rawwrite", mainRawWrite, "Writes a flux file to a disk. Warning: you can't use this to copy disks.", }, { "rpm", mainRpm, "Measures the disk rotational speed.", }, { "seek", mainSeek, "Moves the disk head.", }, { "test", mainTest, "Various testing commands.", }, { "upgradefluxfile", mainUpgradeFluxFile, "Upgrades a flux file from a previous version of this software.", }, - { "write", mainWrite, "Writes a sector image to a disk.", }, - { "rawwrite", mainRawWrite, "Writes a flux file to a disk. Warning: you can't use this to copy disks.", }, -}; - -static std::vector readables = -{ -// { "adfs", mainReadADFS, "Reads Acorn ADFS disks.", }, -// { "aeslanier", mainReadAESLanier, "Reads AES Lanier disks.", }, -// { "amiga", mainReadAmiga, "Reads Commodore Amiga disks.", }, -// { "ampro", mainReadAmpro, "Reads Ampro disks.", }, -// { "apple2", mainReadApple2, "Reads Apple II disks.", }, -// { "atarist", mainReadAtariST, "Reads Atari ST disks.", }, -// { "brother", mainReadBrother, "Reads 120kB and 240kB Brother word processor disks.", }, -// { "c64", mainReadC64, "Reads Commodore 64 disks.", }, -// { "dfs", mainReadDFS, "Reads Acorn DFS disks.", }, -// { "f85", mainReadF85, "Reads Durango F85 disks.", }, -// { "fb100", mainReadFB100, "Reads FB100 disks.", }, -// { "ibm", mainReadIBM, "Reads the ubiquitous IBM format disks.", }, -// { "mac", mainReadMac, "Reads Apple Macintosh disks.", }, -// { "micropolis", mainReadMicropolis, "Reads Micropolis disks.", }, -// { "mx", mainReadMx, "Reads MX disks.", }, -// { "tids990", mainReadTiDs990, "Reads Texas Instruments DS990 disks.", }, -// { "victor9k", mainReadVictor9K, "Reads Victor 9000 disks.", }, -// { "zilogmcz", mainReadZilogMCZ, "Reads Zilog MCZ disks.", }, -}; - -static std::vector writeables = -{ -// { "amiga", mainWriteAmiga, "Writes Amiga disks.", }, -// { "brother", mainWriteBrother, "Writes 120kB and 240kB Brother word processor disks.", }, -// { "ibm", mainWriteIbm, "Writes the ubiquitous IBM format disks.", }, -// { "mac", mainWriteMac, "Writes Apple Macintosh disks.", }, -// { "tids990", mainWriteTiDs990, "Writes Texas Instruments DS990 disks.", }, }; static std::vector convertables =