Add rawread.

This commit is contained in:
David Given
2021-05-17 01:06:09 +02:00
parent 97822bd9a8
commit 22ba38b2e0
5 changed files with 108 additions and 33 deletions

View File

@@ -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));
}
}
}

View File

@@ -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<std::unique_ptr<Track>> readTracks();
extern void readDiskCommand(FluxSource& source, AbstractDecoder& decoder, ImageWriter& writer);
extern void rawReadDiskCommand(FluxSource& source, FluxSink& sink);
#endif

View File

@@ -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 \

86
src/fe-rawread.cc Normal file
View File

@@ -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 <google/protobuf/text_format.h>
#include <fstream>
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<std::string, std::string> 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(FluxSource::create(config.input().flux()));
std::unique_ptr<FluxSink> fluxSink(FluxSink::create(config.output().flux()));
rawReadDiskCommand(*fluxSource, *fluxSink);
return 0;
}

View File

@@ -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<Command> 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<Command> 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<Command> 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<Command> convertables =