From b0326530d627b0af0c20827186edb4d43d01d837 Mon Sep 17 00:00:00 2001 From: Thomas Harte Date: Sun, 19 Jan 2020 21:08:15 -0500 Subject: [PATCH] Allows fuzzy masks to be fed into the FM and MFM encoders. --- Storage/Disk/Encodings/MFM/Encoder.cpp | 23 ++++++++++++----------- Storage/Disk/Encodings/MFM/Encoder.hpp | 11 ++++++----- 2 files changed, 18 insertions(+), 16 deletions(-) diff --git a/Storage/Disk/Encodings/MFM/Encoder.cpp b/Storage/Disk/Encodings/MFM/Encoder.cpp index 71a9487ac..a11c6134d 100644 --- a/Storage/Disk/Encodings/MFM/Encoder.cpp +++ b/Storage/Disk/Encodings/MFM/Encoder.cpp @@ -24,10 +24,10 @@ enum class SurfaceItem { class MFMEncoder: public Encoder { public: - MFMEncoder(std::vector &target) : Encoder(target) {} + MFMEncoder(std::vector &target, std::vector *fuzzy_target = nullptr) : Encoder(target, fuzzy_target) {} virtual ~MFMEncoder() {} - void add_byte(uint8_t input) final { + void add_byte(uint8_t input, uint8_t fuzzy_mask = 0) final { crc_generator_.add(input); uint16_t spread_value = static_cast( @@ -90,9 +90,9 @@ class MFMEncoder: public Encoder { class FMEncoder: public Encoder { // encodes each 16-bit part as clock, data, clock, data [...] public: - FMEncoder(std::vector &target) : Encoder(target) {} + FMEncoder(std::vector &target, std::vector *fuzzy_target = nullptr) : Encoder(target, fuzzy_target) {} - void add_byte(uint8_t input) final { + void add_byte(uint8_t input, uint8_t fuzzy_mask = 0) final { crc_generator_.add(input); output_short( static_cast( @@ -240,11 +240,12 @@ template std::shared_ptr return std::make_shared(std::move(segment)); } -Encoder::Encoder(std::vector &target) : - target_(&target) {} +Encoder::Encoder(std::vector &target, std::vector *fuzzy_target) : + target_(&target), fuzzy_target_(fuzzy_target) {} -void Encoder::reset_target(std::vector &target) { +void Encoder::reset_target(std::vector &target, std::vector *fuzzy_target) { target_ = ⌖ + fuzzy_target_ = fuzzy_target; } void Encoder::output_short(uint16_t value) { @@ -315,10 +316,10 @@ std::shared_ptr Storage::Encodings::MFM::GetMFMTrackWithSe 12500); // unintelligently: double the single-density bytes/rotation (or: 500kbps @ 300 rpm) } -std::unique_ptr Storage::Encodings::MFM::GetMFMEncoder(std::vector &target) { - return std::make_unique(target); +std::unique_ptr Storage::Encodings::MFM::GetMFMEncoder(std::vector &target, std::vector *fuzzy_target) { + return std::make_unique(target, fuzzy_target); } -std::unique_ptr Storage::Encodings::MFM::GetFMEncoder(std::vector &target) { - return std::make_unique(target); +std::unique_ptr Storage::Encodings::MFM::GetFMEncoder(std::vector &target, std::vector *fuzzy_target) { + return std::make_unique(target, fuzzy_target); } diff --git a/Storage/Disk/Encodings/MFM/Encoder.hpp b/Storage/Disk/Encodings/MFM/Encoder.hpp index 48a538ec8..318e821dc 100644 --- a/Storage/Disk/Encodings/MFM/Encoder.hpp +++ b/Storage/Disk/Encodings/MFM/Encoder.hpp @@ -44,11 +44,11 @@ std::shared_ptr GetFMTrackWithSectors(const std::vector &target); + Encoder(std::vector &target, std::vector *fuzzy_target); virtual ~Encoder() {} - virtual void reset_target(std::vector &target); + virtual void reset_target(std::vector &target, std::vector *fuzzy_target = nullptr); - virtual void add_byte(uint8_t input) = 0; + virtual void add_byte(uint8_t input, uint8_t fuzzy_mask = 0) = 0; virtual void add_index_address_mark() = 0; virtual void add_ID_address_mark() = 0; virtual void add_data_address_mark() = 0; @@ -63,10 +63,11 @@ class Encoder { private: std::vector *target_ = nullptr; + std::vector *fuzzy_target_ = nullptr; }; -std::unique_ptr GetMFMEncoder(std::vector &target); -std::unique_ptr GetFMEncoder(std::vector &target); +std::unique_ptr GetMFMEncoder(std::vector &target, std::vector *fuzzy_target = nullptr); +std::unique_ptr GetFMEncoder(std::vector &target, std::vector *fuzzy_target = nullptr); } }