From bf8a4b7efe901d4f8e792927dbaee9413929c3f7 Mon Sep 17 00:00:00 2001 From: Thomas Harte Date: Mon, 4 Dec 2023 12:28:29 -0500 Subject: [PATCH] Ensure sector cache is cleared upon disk change. --- Machines/PCCompatible/PCCompatible.cpp | 29 +++++++++++++++++++------- 1 file changed, 21 insertions(+), 8 deletions(-) diff --git a/Machines/PCCompatible/PCCompatible.cpp b/Machines/PCCompatible/PCCompatible.cpp index 02720448f..905dd7997 100644 --- a/Machines/PCCompatible/PCCompatible.cpp +++ b/Machines/PCCompatible/PCCompatible.cpp @@ -269,13 +269,13 @@ class FloppyController { } void set_disk(std::shared_ptr disk, int drive) { - if(drives_[drive].disk) { - // TODO: drive should only transition to unready if it was ready in the first place. - drives_[drive].status = uint8_t(Intel::i8272::Status0::BecameNotReady); - drives_[drive].raised_interrupt = true; - pic_.apply_edge<6>(true); - } - drives_[drive].disk = disk; +// if(drives_[drive].has_disk()) { +// // TODO: drive should only transition to unready if it was ready in the first place. +// drives_[drive].status = uint8_t(Intel::i8272::Status0::BecameNotReady); +// drives_[drive].raised_interrupt = true; +// pic_.apply_edge<6>(true); +// } + drives_[drive].set_disk(disk); } private: @@ -317,7 +317,14 @@ class FloppyController { bool motor = false; bool exists = true; - std::shared_ptr disk; + bool has_disk() const { + return bool(disk); + } + + void set_disk(std::shared_ptr image) { + disk = image; + cached.clear(); + } Storage::Encodings::MFM::SectorMap §ors(bool side) { if(cached.track == track && cached.side == side) { @@ -356,7 +363,13 @@ class FloppyController { uint8_t track = 0xff; bool side; Storage::Encodings::MFM::SectorMap sectors; + + void clear() { + track = 0xff; + sectors.clear(); + } } cached; + std::shared_ptr disk; } drives_[4];