From 46a93d2e12d054f0ccf5fc3517d660271fa1605a Mon Sep 17 00:00:00 2001 From: Thomas Harte Date: Wed, 28 Dec 2016 19:48:46 -0500 Subject: [PATCH] Fixed errors to ensure that FM disks, at least, follow the same CRC generation rules when being built from sectors and when being parsed. --- Storage/Disk/Encodings/MFM.cpp | 32 +++++++++++++++++++++++++------- 1 file changed, 25 insertions(+), 7 deletions(-) diff --git a/Storage/Disk/Encodings/MFM.cpp b/Storage/Disk/Encodings/MFM.cpp index 60799bc4c..0fa77b9ff 100644 --- a/Storage/Disk/Encodings/MFM.cpp +++ b/Storage/Disk/Encodings/MFM.cpp @@ -201,7 +201,9 @@ void Encoder::output_short(uint16_t value) void Encoder::add_crc() { - output_short(crc_generator_.get_value()); + uint16_t crc_value = crc_generator_.get_value(); + add_byte(crc_value >> 8); + add_byte(crc_value & 0xff); } std::shared_ptr Storage::Encodings::MFM::GetFMTrackWithSectors(const std::vector §ors) @@ -325,17 +327,25 @@ std::shared_ptr Parser::get_next_sector() while(shift_register_ == Storage::Encodings::MFM::MFMSync) { uint8_t mark = get_next_byte(); - if(mark == Storage::Encodings::MFM::MFMIDAddressByte) break; + if(mark == Storage::Encodings::MFM::MFMIDAddressByte) + { + crc_generator_.set_value(MFMPostSyncCRCValue); + break; + } } } else { - if(shift_register_ == Storage::Encodings::MFM::FMIDAddressMark) break; + if(shift_register_ == Storage::Encodings::MFM::FMIDAddressMark) + { + crc_generator_.reset(); + break; + } } if(index_count_ >= 2) return nullptr; } - crc_generator_.reset(); + crc_generator_.add(MFMIDAddressByte); sector->track = get_next_byte(); sector->side = get_next_byte(); sector->sector = get_next_byte(); @@ -353,21 +363,29 @@ std::shared_ptr Parser::get_next_sector() while(shift_register_ == Storage::Encodings::MFM::MFMSync) { uint8_t mark = get_next_byte(); - if(mark == Storage::Encodings::MFM::MFMDataAddressByte) break; + if(mark == Storage::Encodings::MFM::MFMDataAddressByte) + { + crc_generator_.set_value(MFMPostSyncCRCValue); + break; + } if(mark == Storage::Encodings::MFM::MFMIDAddressByte) return nullptr; } } else { - if(shift_register_ == Storage::Encodings::MFM::FMDataAddressMark) break; + if(shift_register_ == Storage::Encodings::MFM::FMDataAddressMark) + { + crc_generator_.reset(); + break; + } if(shift_register_ == Storage::Encodings::MFM::FMIDAddressMark) return nullptr; } if(index_count_ >= 2) return nullptr; } + crc_generator_.add(MFMDataAddressByte); size_t data_size = (size_t)(128 << size); sector->data.reserve(data_size); - crc_generator_.reset(); for(size_t c = 0; c < data_size; c++) { sector->data.push_back(get_next_byte());