From f7c31281e0a96d9b1b09d3dbf02c44aac23c6081 Mon Sep 17 00:00:00 2001 From: David Given Date: Sat, 15 May 2021 00:25:32 +0200 Subject: [PATCH] Convert the C64 decoder to the new configuration scheme. Also convert all the imagewriters. --- arch/c64/c64.h | 2 ++ arch/c64/c64.proto | 4 +++ lib/config.proto | 17 ++--------- lib/decoders/decoders.cc | 4 +++ lib/decoders/decoders.proto | 2 ++ .../{img.proto => imagereader.proto} | 7 +++++ lib/imagewriter/imagewriter.cc | 20 ++++++++++--- lib/imagewriter/imagewriter.proto | 18 ++++++++++++ mkninja.sh | 6 ++-- src/fe-readc64.cc | 27 ----------------- src/readables/c64.textpb | 29 +++++++++++++++++++ 11 files changed, 88 insertions(+), 48 deletions(-) create mode 100644 arch/c64/c64.proto rename lib/imagereader/{img.proto => imagereader.proto} (75%) create mode 100644 lib/imagewriter/imagewriter.proto delete mode 100644 src/fe-readc64.cc create mode 100644 src/readables/c64.textpb diff --git a/arch/c64/c64.h b/arch/c64/c64.h index 15d246a9..6d7f11ab 100644 --- a/arch/c64/c64.h +++ b/arch/c64/c64.h @@ -7,10 +7,12 @@ class Sector; class Fluxmap; +class Commodore64InputProto; class Commodore64Decoder : public AbstractDecoder { public: + Commodore64Decoder(const Commodore64InputProto&) {} virtual ~Commodore64Decoder() {} RecordType advanceToNextRecord(); diff --git a/arch/c64/c64.proto b/arch/c64/c64.proto new file mode 100644 index 00000000..f804f21e --- /dev/null +++ b/arch/c64/c64.proto @@ -0,0 +1,4 @@ +syntax = "proto2"; + +message Commodore64InputProto {} + diff --git a/lib/config.proto b/lib/config.proto index 9b6ee1d2..d1d0f190 100644 --- a/lib/config.proto +++ b/lib/config.proto @@ -2,18 +2,12 @@ syntax = "proto2"; import "lib/decoders/decoders.proto"; import "lib/encoders/encoders.proto"; -import "lib/imagereader/img.proto"; +import "lib/imagereader/imagereader.proto"; +import "lib/imagewriter/imagewriter.proto"; import "lib/fluxsource/fluxsource.proto"; import "lib/usb/usb.proto"; import "lib/common.proto"; -message InputFileProto { - optional string filename = 1; - oneof format { - ImgInputOutputProto img = 2; - } -} - message InputDiskProto { oneof source { string fluxfile = 1; @@ -22,13 +16,6 @@ message InputDiskProto { } } -message OutputFileProto { - optional string filename = 1; - oneof format { - ImgInputOutputProto img = 2; - } -} - message OutputDiskProto { oneof dest { string fluxfile = 1; diff --git a/lib/decoders/decoders.cc b/lib/decoders/decoders.cc index 0a3f7a7b..8ee49980 100644 --- a/lib/decoders/decoders.cc +++ b/lib/decoders/decoders.cc @@ -6,6 +6,7 @@ #include "arch/aeslanier/aeslanier.h" #include "arch/amiga/amiga.h" #include "arch/brother/brother.h" +#include "arch/c64/c64.h" #include "arch/ibm/ibm.h" #include "decoders/fluxmapreader.h" #include "record.h" @@ -30,6 +31,9 @@ std::unique_ptr AbstractDecoder::create(const DecoderProto& con case DecoderProto::kBrother: return std::unique_ptr(new BrotherDecoder(config.brother())); + case DecoderProto::kC64: + return std::unique_ptr(new Commodore64Decoder(config.c64())); + case DecoderProto::kIbm: return std::unique_ptr(new IbmDecoder(config.ibm())); diff --git a/lib/decoders/decoders.proto b/lib/decoders/decoders.proto index 458a84a8..db420b30 100644 --- a/lib/decoders/decoders.proto +++ b/lib/decoders/decoders.proto @@ -3,6 +3,7 @@ syntax = "proto2"; import "arch/aeslanier/aeslanier.proto"; import "arch/amiga/amiga.proto"; import "arch/brother/brother.proto"; +import "arch/c64/c64.proto"; import "arch/ibm/ibm.proto"; message DecoderProto { @@ -16,6 +17,7 @@ message DecoderProto { BrotherInputProto brother = 6; AesLanierInputProto aeslanier = 7; AmigaInputProto amiga = 8; + Commodore64InputProto c64 = 9; } } diff --git a/lib/imagereader/img.proto b/lib/imagereader/imagereader.proto similarity index 75% rename from lib/imagereader/img.proto rename to lib/imagereader/imagereader.proto index 9f5ac06a..77518a28 100644 --- a/lib/imagereader/img.proto +++ b/lib/imagereader/imagereader.proto @@ -14,3 +14,10 @@ message ImgInputOutputProto { optional int32 sides = 6 [default=2]; } +message InputFileProto { + optional string filename = 1; + oneof format { + ImgInputOutputProto img = 2; + } +} + diff --git a/lib/imagewriter/imagewriter.cc b/lib/imagewriter/imagewriter.cc index 3bd4825c..d418a087 100644 --- a/lib/imagewriter/imagewriter.cc +++ b/lib/imagewriter/imagewriter.cc @@ -25,10 +25,22 @@ std::map ImageWriter::formats = std::unique_ptr ImageWriter::create(const OutputFileProto& config) { - if (config.has_img()) - return ImageWriter::createImgImageWriter(config); - else - Error() << "bad output image config"; + switch (config.format_case()) + { + case OutputFileProto::kImg: + return ImageWriter::createImgImageWriter(config); + + case OutputFileProto::kD64: + return ImageWriter::createD64ImageWriter(config); + + case OutputFileProto::kLdbs: + return ImageWriter::createLDBSImageWriter(config); + + case OutputFileProto::kDiskcopy: + return ImageWriter::createDiskCopyImageWriter(config); + } + Error() << "bad output image config"; + return std::unique_ptr(); } //void ImageWriter::verifyImageSpec(const ImageSpec& spec) diff --git a/lib/imagewriter/imagewriter.proto b/lib/imagewriter/imagewriter.proto new file mode 100644 index 00000000..b2efcb15 --- /dev/null +++ b/lib/imagewriter/imagewriter.proto @@ -0,0 +1,18 @@ +syntax = "proto2"; + +import "lib/imagereader/imagereader.proto"; + +message D64OutputProto {} +message LDBSOutputProto {} +message DiskCopyOutputProto {} + +message OutputFileProto { + optional string filename = 1; + oneof format { + ImgInputOutputProto img = 2; + D64OutputProto d64 = 3; + LDBSOutputProto ldbs = 4; + DiskCopyOutputProto diskcopy = 5; + } +} + diff --git a/mkninja.sh b/mkninja.sh index 80eb345e..786d0ee1 100644 --- a/mkninja.sh +++ b/mkninja.sh @@ -252,13 +252,15 @@ buildproto libproto.a \ arch/amiga/amiga.proto \ arch/aeslanier/aeslanier.proto \ arch/brother/brother.proto \ + arch/c64/c64.proto \ arch/ibm/ibm.proto \ lib/common.proto \ lib/config.proto \ lib/decoders/decoders.proto \ lib/encoders/encoders.proto \ lib/fluxsource/fluxsource.proto \ - lib/imagereader/img.proto \ + lib/imagereader/imagereader.proto \ + lib/imagewriter/imagewriter.proto \ lib/usb/usb.proto \ buildlibrary libbackend.a \ @@ -334,6 +336,7 @@ READABLES="\ acornadfs \ acorndfs \ brother \ + c64 \ ibm \ " @@ -386,7 +389,6 @@ buildlibrary libfrontend.a \ # src/fe-readampro.cc \ # src/fe-readapple2.cc \ # src/fe-readatarist.cc \ -# src/fe-readc64.cc \ # src/fe-readf85.cc \ # src/fe-readfb100.cc \ # src/fe-readibm.cc \ diff --git a/src/fe-readc64.cc b/src/fe-readc64.cc deleted file mode 100644 index 30281b27..00000000 --- a/src/fe-readc64.cc +++ /dev/null @@ -1,27 +0,0 @@ -#include "globals.h" -#include "flags.h" -#include "reader.h" -#include "fluxmap.h" -#include "decoders/decoders.h" -#include "c64/c64.h" -#include "sector.h" -#include "sectorset.h" -#include "record.h" -#include "fmt/format.h" -#include - -static FlagGroup flags { &readerFlags }; - -int mainReadC64(int argc, const char* argv[]) -{ - setReaderDefaultSource(":t=0-79x2:s=0"); - setReaderDefaultOutput("c64.d64"); - setReaderRevolutions(2); - flags.parseFlags(argc, argv); - - Commodore64Decoder decoder; - readDiskCommand(decoder); - - return 0; -} - diff --git a/src/readables/c64.textpb b/src/readables/c64.textpb new file mode 100644 index 00000000..a1f20537 --- /dev/null +++ b/src/readables/c64.textpb @@ -0,0 +1,29 @@ +input { + disk { + drive {} + } +} + +output { + file { + filename: "c64.d64" + d64 {} + } +} + +decoder { + c64 {} +} + +cylinders { + start: 0 + end: 79 + step: 2 +} + +heads { + start: 0 + end: 0 +} + +