From 09f965e6a9ffc512767ac1e433a20b0098ea12cc Mon Sep 17 00:00:00 2001 From: Thomas Harte Date: Tue, 22 Nov 2016 08:11:57 +0800 Subject: [PATCH] Fixed potential bug whereby inserting a disk into a drive that hadn't been lazily allocated yet but had already been selected wouldn't take effect. --- Machines/Electron/Plus3.cpp | 18 +++++++++++------- Machines/Electron/Plus3.hpp | 3 ++- 2 files changed, 13 insertions(+), 8 deletions(-) diff --git a/Machines/Electron/Plus3.cpp b/Machines/Electron/Plus3.cpp index 809846dcb..4c674e797 100644 --- a/Machines/Electron/Plus3.cpp +++ b/Machines/Electron/Plus3.cpp @@ -12,8 +12,12 @@ using namespace Electron; void Plus3::set_disk(std::shared_ptr disk, int drive) { - if(!_drives[drive]) _drives[drive].reset(new Storage::Disk::Drive); - _drives[drive]->set_disk(disk); + if(!drives_[drive]) + { + drives_[drive].reset(new Storage::Disk::Drive); + if(drive == selected_drive_) set_drive(drives_[drive]); + } + drives_[drive]->set_disk(disk); } void Plus3::set_control_register(uint8_t control) @@ -25,11 +29,11 @@ void Plus3::set_control_register(uint8_t control) // bit 3 => single density select switch(control&3) { - case 0: set_drive(nullptr); break; - default: set_drive(_drives[0]); break; - case 2: set_drive(_drives[1]); break; + case 0: selected_drive_ = -1; set_drive(nullptr); break; + default: selected_drive_ = 0; set_drive(drives_[0]); break; + case 2: selected_drive_ = 1; set_drive(drives_[1]); break; } - if(_drives[0]) _drives[0]->set_head((control & 0x04) ? 1 : 0); - if(_drives[1]) _drives[1]->set_head((control & 0x04) ? 1 : 0); + if(drives_[0]) drives_[0]->set_head((control & 0x04) ? 1 : 0); + if(drives_[1]) drives_[1]->set_head((control & 0x04) ? 1 : 0); set_is_double_density(!(control & 0x08)); } diff --git a/Machines/Electron/Plus3.hpp b/Machines/Electron/Plus3.hpp index e7613367b..d0e36a15c 100644 --- a/Machines/Electron/Plus3.hpp +++ b/Machines/Electron/Plus3.hpp @@ -19,7 +19,8 @@ class Plus3 : public WD::WD1770 { void set_control_register(uint8_t control); private: - std::shared_ptr _drives[2]; + std::shared_ptr drives_[2]; + int selected_drive_; }; }