From ad3a930c6aeb840ed9eb14eb1a002d2d78b9caad Mon Sep 17 00:00:00 2001 From: David Given Date: Sun, 9 Feb 2020 23:56:20 +0100 Subject: [PATCH] Do the boilerplate of the IBM encoder. --- arch/ibm/encoder.cc | 15 +++++++ arch/ibm/ibm.h | 63 +++++++++++------------------ mkninja.sh | 2 + src/fe-writeibm.cc | 97 +++++++++++++++++++++++++++++++++++++++++++++ src/fluxengine.cc | 2 + 5 files changed, 139 insertions(+), 40 deletions(-) create mode 100644 arch/ibm/encoder.cc create mode 100644 src/fe-writeibm.cc diff --git a/arch/ibm/encoder.cc b/arch/ibm/encoder.cc new file mode 100644 index 00000000..bb8359d2 --- /dev/null +++ b/arch/ibm/encoder.cc @@ -0,0 +1,15 @@ +#include "globals.h" +#include "record.h" +#include "decoders/decoders.h" +#include "encoders/encoders.h" +#include "ibm.h" +#include "crc.h" +#include "sectorset.h" +#include "writer.h" + +std::unique_ptr IbmEncoder::encode( + int physicalTrack, int physicalSide, const SectorSet& allSectors) +{ + return std::unique_ptr(); +} + diff --git a/arch/ibm/ibm.h b/arch/ibm/ibm.h index f8cf93cc..51f6facc 100644 --- a/arch/ibm/ibm.h +++ b/arch/ibm/ibm.h @@ -2,6 +2,7 @@ #define IBM_H #include "decoders/decoders.h" +#include "encoders/encoders.h" /* IBM format (i.e. ordinary PC floppies). */ @@ -47,52 +48,34 @@ private: unsigned _currentHeaderLength; }; -#if 0 -class AbstractIbmDecoder : public AbstractSoftSectorDecoder +struct IbmParameters +{ + int sectorsPerTrack; + int sectorSize; + bool emitIam; + int startSectorId; + int clockSpeedKhz; + bool useFm; + int gap1; + int gap3; + uint8_t damByte; + std::string sectorSkew; +}; + +class IbmEncoder : public AbstractEncoder { public: - AbstractIbmDecoder(unsigned sectorIdBase): - _sectorIdBase(sectorIdBase) - {} - virtual ~AbstractIbmDecoder() {} + IbmEncoder(const IbmParameters& parameters): + parameters(parameters) + {} - SectorVector decodeToSectors(const RawRecordVector& rawRecords, unsigned physicalTrack, unsigned physicalSide); + virtual ~IbmEncoder() {} -protected: - virtual int skipHeaderBytes() const = 0; +public: + std::unique_ptr encode(int physicalTrack, int physicalSide, const SectorSet& allSectors); private: - unsigned _sectorIdBase; + IbmParameters parameters; }; -class IbmFmDecoder : public AbstractIbmDecoder -{ -public: - IbmFmDecoder(unsigned sectorIdBase): - AbstractIbmDecoder(sectorIdBase) - {} - - int recordMatcher(uint64_t fifo) const; - -protected: - int skipHeaderBytes() const - { return 0; } -}; - -class IbmMfmDecoder : public AbstractIbmDecoder -{ -public: - IbmMfmDecoder(unsigned sectorIdBase): - AbstractIbmDecoder(sectorIdBase) - {} - - nanoseconds_t guessClock(Fluxmap& fluxmap) const; - int recordMatcher(uint64_t fifo) const; - -protected: - int skipHeaderBytes() const - { return 3; } -}; -#endif - #endif diff --git a/mkninja.sh b/mkninja.sh index a428797e..43be6b69 100644 --- a/mkninja.sh +++ b/mkninja.sh @@ -168,6 +168,7 @@ buildlibrary libbackend.a \ arch/f85/decoder.cc \ arch/fb100/decoder.cc \ arch/ibm/decoder.cc \ + arch/ibm/encoder.cc \ arch/macintosh/decoder.cc \ arch/mx/decoder.cc \ arch/victor9k/decoder.cc \ @@ -232,6 +233,7 @@ buildlibrary libfrontend.a \ src/fe-upgradefluxfile.cc \ src/fe-writeamiga.cc \ src/fe-writebrother.cc \ + src/fe-writeibm.cc \ src/fe-writeflux.cc \ src/fe-writetestpattern.cc \ src/fluxengine.cc \ diff --git a/src/fe-writeibm.cc b/src/fe-writeibm.cc new file mode 100644 index 00000000..061493b5 --- /dev/null +++ b/src/fe-writeibm.cc @@ -0,0 +1,97 @@ +#include "globals.h" +#include "flags.h" +#include "decoders/decoders.h" +#include "encoders/encoders.h" +#include "ibm/ibm.h" +#include "writer.h" +#include "fmt/format.h" +#include "image.h" +#include + +static FlagGroup flags { &writerFlags }; + +static IntFlag sectorsPerTrack( + { "--ibm-sectors-per-track" }, + "Number of sectors per track to write.", + 0); + +static IntFlag sectorSize( + { "--ibm-sector-size" }, + "Size of the sectors to write (bytes).", + 0); + +static BoolFlag emitIam( + { "--ibm-emit-iam" }, + "Whether to emit an IAM record at the start of the track.", + false); + +static IntFlag startSectorId( + { "--ibm-start-sector-id" }, + "Sector ID of first sector.", + 1); + +static IntFlag clockSpeedKhz( + { "--ibm-clock-rate-khz" }, + "Clock rate of data to write.", + 0); + +static BoolFlag useFm( + { "--ibm-use-fm" }, + "Write in FM mode, rather than MFM.", + false); + +static IntFlag gap1( + { "--ibm-gap1-bytes" }, + "Size of gap 1.", + 0); + +static IntFlag gap3( + { "--ibm-gap3-bytes" }, + "Size of gap 3.", + 0); + +static IntFlag damByte( + { "--ibm-dam-byte" }, + "Value of DAM byte to emit.", + 0xf8); + +static StringFlag sectorSkew( + { "--ibm-sector-skew" }, + "Order to emit sectors.", + ""); + +static ActionFlag preset1440( + { "--ibm-preset-1440" }, + "Preset parameters to a 3.5\" 1440kB disk.", + [] { + sectorsPerTrack.setDefaultValue(18); + sectorSize.setDefaultValue(512); + emitIam.setDefaultValue(true); + clockSpeedKhz.setDefaultValue(500); + gap1.setDefaultValue(0x1b); + gap3.setDefaultValue(0x6c); + sectorSkew.setDefaultValue("123456789abcdefghi"); + }); + +int mainWriteIbm(int argc, const char* argv[]) +{ + setWriterDefaultInput(":c=80:h=2:s=18:b=512"); + setWriterDefaultDest(":d=0:t=0-79:s=2"); + flags.parseFlags(argc, argv); + + IbmParameters parameters; + parameters.sectorsPerTrack = sectorsPerTrack; + parameters.sectorSize = sectorSize; + parameters.emitIam = emitIam; + parameters.clockSpeedKhz = clockSpeedKhz; + parameters.useFm = useFm; + parameters.gap1 = gap1; + parameters.gap3 = gap3; + parameters.damByte = (uint8_t) damByte; + + IbmEncoder encoder(parameters); + writeDiskCommand(encoder); + + return 0; +} + diff --git a/src/fluxengine.cc b/src/fluxengine.cc index d901c0f4..ebb9ece8 100644 --- a/src/fluxengine.cc +++ b/src/fluxengine.cc @@ -31,6 +31,7 @@ extern command_cb mainTestVoltages; extern command_cb mainUpgradeFluxFile; extern command_cb mainWriteAmiga; extern command_cb mainWriteBrother; +extern command_cb mainWriteIbm; extern command_cb mainWriteFlux; extern command_cb mainWriteTestPattern; @@ -84,6 +85,7 @@ 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.", }, }; static std::vector convertables =