diff --git a/Storage/Disk/Encodings/MFM.cpp b/Storage/Disk/Encodings/MFM.cpp index dfe9330c7..ccace455a 100644 --- a/Storage/Disk/Encodings/MFM.cpp +++ b/Storage/Disk/Encodings/MFM.cpp @@ -11,6 +11,8 @@ #include "../PCMTrack.hpp" #include "../../../NumberTheory/CRC.hpp" +#include + using namespace Storage::Encodings::MFM; class MFMEncoder: public Encoder { @@ -274,13 +276,20 @@ std::shared_ptr Parser::get_sector(uint8_t head, uint8_t track, uint8_t seek_to_track(track); int track_index = get_index(head, track, 0); - // Populate the sector cache if it's not already populated. + // Populate the sector cache if it's not already populated by asking for sectors unless and until + // one is returned that has already been seen. if(decoded_tracks_.find(track_index) == decoded_tracks_.end()) { std::shared_ptr first_sector = get_next_sector(); + std::set visited_sectors; if(first_sector) { while(1) { std::shared_ptr next_sector = get_next_sector(); - if(!next_sector || next_sector->sector == first_sector->sector) break; + if(next_sector) { + if(visited_sectors.find(next_sector->sector) != visited_sectors.end()) { + break; + } + visited_sectors.insert(next_sector->sector); + } } } decoded_tracks_.insert(track_index);