From 98918d160a8af299cacf4a5a28e4f641a81b5dee Mon Sep 17 00:00:00 2001 From: David Given Date: Sun, 11 Jul 2021 16:12:34 +0200 Subject: [PATCH] Convert the ZilogMcz decoder. --- arch/zilogmcz/decoder.cc | 72 ++++++++++++++++++++++++---------------- arch/zilogmcz/zilogmcz.h | 14 -------- lib/decoders/decoders.cc | 17 +--------- 3 files changed, 44 insertions(+), 59 deletions(-) diff --git a/arch/zilogmcz/decoder.cc b/arch/zilogmcz/decoder.cc index a7692050..6e97a461 100644 --- a/arch/zilogmcz/decoder.cc +++ b/arch/zilogmcz/decoder.cc @@ -14,35 +14,49 @@ static const FluxPattern SECTOR_START_PATTERN(16, 0xaaab); -AbstractDecoder::RecordType ZilogMczDecoder::advanceToNextRecord() +class ZilogMczDecoder : public AbstractDecoder { - const FluxMatcher* matcher = nullptr; - _fmr->seekToIndexMark(); - _sector->clock = _fmr->seekToPattern(SECTOR_START_PATTERN, matcher); - if (matcher == &SECTOR_START_PATTERN) - return SECTOR_RECORD; - return UNKNOWN_RECORD; +public: + ZilogMczDecoder(const DecoderProto& config): + AbstractDecoder(config) + {} + + RecordType advanceToNextRecord() + { + const FluxMatcher* matcher = nullptr; + _fmr->seekToIndexMark(); + _sector->clock = _fmr->seekToPattern(SECTOR_START_PATTERN, matcher); + if (matcher == &SECTOR_START_PATTERN) + return SECTOR_RECORD; + return UNKNOWN_RECORD; + } + + void decodeSectorRecord() + { + readRawBits(14); + + auto rawbits = readRawBits(140*16); + auto bytes = decodeFmMfm(rawbits).slice(0, 140); + ByteReader br(bytes); + + _sector->logicalSector = br.read_8() & 0x1f; + _sector->logicalSide = 0; + _sector->logicalTrack = br.read_8() & 0x7f; + if (_sector->logicalSector > 31) + return; + if (_sector->logicalTrack > 80) + return; + + _sector->data = br.read(132); + uint16_t wantChecksum = br.read_be16(); + uint16_t gotChecksum = crc16(MODBUS_POLY, 0x0000, bytes.slice(0, 134)); + + _sector->status = (wantChecksum == gotChecksum) ? Sector::OK : Sector::BAD_CHECKSUM; + } +}; + +std::unique_ptr createZilogMczDecoder(const DecoderProto& config) +{ + return std::unique_ptr(new ZilogMczDecoder(config)); } -void ZilogMczDecoder::decodeSectorRecord() -{ - readRawBits(14); - - auto rawbits = readRawBits(140*16); - auto bytes = decodeFmMfm(rawbits).slice(0, 140); - ByteReader br(bytes); - - _sector->logicalSector = br.read_8() & 0x1f; - _sector->logicalSide = 0; - _sector->logicalTrack = br.read_8() & 0x7f; - if (_sector->logicalSector > 31) - return; - if (_sector->logicalTrack > 80) - return; - - _sector->data = br.read(132); - uint16_t wantChecksum = br.read_be16(); - uint16_t gotChecksum = crc16(MODBUS_POLY, 0x0000, bytes.slice(0, 134)); - - _sector->status = (wantChecksum == gotChecksum) ? Sector::OK : Sector::BAD_CHECKSUM; -} diff --git a/arch/zilogmcz/zilogmcz.h b/arch/zilogmcz/zilogmcz.h index c3070398..4e8a0181 100644 --- a/arch/zilogmcz/zilogmcz.h +++ b/arch/zilogmcz/zilogmcz.h @@ -1,20 +1,6 @@ #ifndef ZILOGMCZ_H #define ZILOGMCZ_H -class Sector; -class Fluxmap; -class ZilogMczDecoderProto; - -class ZilogMczDecoder : public AbstractDecoder -{ -public: - ZilogMczDecoder(const ZilogMczDecoderProto&) {} - virtual ~ZilogMczDecoder() {} - - RecordType advanceToNextRecord(); - void decodeSectorRecord(); -}; - extern std::unique_ptr createZilogMczDecoder(const DecoderProto& config); #endif diff --git a/lib/decoders/decoders.cc b/lib/decoders/decoders.cc index 37139860..d3b6b616 100644 --- a/lib/decoders/decoders.cc +++ b/lib/decoders/decoders.cc @@ -47,6 +47,7 @@ std::unique_ptr AbstractDecoder::create(const DecoderProto& con { DecoderProto::kNorthstar, createNorthstarDecoder }, { DecoderProto::kTids990, createTids990Decoder }, { DecoderProto::kVictor9K, createVictor9kDecoder }, + { DecoderProto::kZilogmcz, createZilogMczDecoder }, }; auto decoder = decoders.find(config.format_case()); @@ -56,22 +57,6 @@ std::unique_ptr AbstractDecoder::create(const DecoderProto& con return (decoder->second)(config); } -#if 0 -std::unique_ptr AbstractDecoder::create(const DecoderProto& config) -{ - switch (config.format_case()) - { - case DecoderProto::kZilogmcz: - return std::unique_ptr(new ZilogMczDecoder(config.zilogmcz())); - - default: - Error() << "no input disk format specified"; - } - - return std::unique_ptr(); -} -#endif - void AbstractDecoder::decodeToSectors(Track& track) { Sector sector;