1
0
mirror of https://github.com/TomHarte/CLK.git synced 2025-01-31 18:31:12 +00:00

Allows fuzzy masks to be fed into the FM and MFM encoders.

This commit is contained in:
Thomas Harte 2020-01-19 21:08:15 -05:00
parent c2bd5be51a
commit b0326530d6
2 changed files with 18 additions and 16 deletions

View File

@ -24,10 +24,10 @@ enum class SurfaceItem {
class MFMEncoder: public Encoder {
public:
MFMEncoder(std::vector<bool> &target) : Encoder(target) {}
MFMEncoder(std::vector<bool> &target, std::vector<bool> *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<uint16_t>(
@ -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<bool> &target) : Encoder(target) {}
FMEncoder(std::vector<bool> &target, std::vector<bool> *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<uint16_t>(
@ -240,11 +240,12 @@ template<class T> std::shared_ptr<Storage::Disk::Track>
return std::make_shared<Storage::Disk::PCMTrack>(std::move(segment));
}
Encoder::Encoder(std::vector<bool> &target) :
target_(&target) {}
Encoder::Encoder(std::vector<bool> &target, std::vector<bool> *fuzzy_target) :
target_(&target), fuzzy_target_(fuzzy_target) {}
void Encoder::reset_target(std::vector<bool> &target) {
void Encoder::reset_target(std::vector<bool> &target, std::vector<bool> *fuzzy_target) {
target_ = &target;
fuzzy_target_ = fuzzy_target;
}
void Encoder::output_short(uint16_t value) {
@ -315,10 +316,10 @@ std::shared_ptr<Storage::Disk::Track> Storage::Encodings::MFM::GetMFMTrackWithSe
12500); // unintelligently: double the single-density bytes/rotation (or: 500kbps @ 300 rpm)
}
std::unique_ptr<Encoder> Storage::Encodings::MFM::GetMFMEncoder(std::vector<bool> &target) {
return std::make_unique<MFMEncoder>(target);
std::unique_ptr<Encoder> Storage::Encodings::MFM::GetMFMEncoder(std::vector<bool> &target, std::vector<bool> *fuzzy_target) {
return std::make_unique<MFMEncoder>(target, fuzzy_target);
}
std::unique_ptr<Encoder> Storage::Encodings::MFM::GetFMEncoder(std::vector<bool> &target) {
return std::make_unique<FMEncoder>(target);
std::unique_ptr<Encoder> Storage::Encodings::MFM::GetFMEncoder(std::vector<bool> &target, std::vector<bool> *fuzzy_target) {
return std::make_unique<FMEncoder>(target, fuzzy_target);
}

View File

@ -44,11 +44,11 @@ std::shared_ptr<Storage::Disk::Track> GetFMTrackWithSectors(const std::vector<co
class Encoder {
public:
Encoder(std::vector<bool> &target);
Encoder(std::vector<bool> &target, std::vector<bool> *fuzzy_target);
virtual ~Encoder() {}
virtual void reset_target(std::vector<bool> &target);
virtual void reset_target(std::vector<bool> &target, std::vector<bool> *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<bool> *target_ = nullptr;
std::vector<bool> *fuzzy_target_ = nullptr;
};
std::unique_ptr<Encoder> GetMFMEncoder(std::vector<bool> &target);
std::unique_ptr<Encoder> GetFMEncoder(std::vector<bool> &target);
std::unique_ptr<Encoder> GetMFMEncoder(std::vector<bool> &target, std::vector<bool> *fuzzy_target = nullptr);
std::unique_ptr<Encoder> GetFMEncoder(std::vector<bool> &target, std::vector<bool> *fuzzy_target = nullptr);
}
}