mirror of
https://github.com/davidgiven/fluxengine.git
synced 2025-10-31 11:17:01 -07:00
Add rawread.
This commit is contained in:
@@ -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));
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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
86
src/fe-rawread.cc
Normal 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;
|
||||
}
|
||||
|
||||
@@ -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 =
|
||||
|
||||
Reference in New Issue
Block a user