From 96005261c7686ce73b0f82198f5efce8ce80a693 Mon Sep 17 00:00:00 2001 From: Thomas Harte Date: Fri, 2 Aug 2019 16:26:23 -0400 Subject: [PATCH] Adds activity lights for Macintosh disk activity. Prompting a quick fix to drives not spinning down. --- Components/DiskII/IWM.cpp | 5 +++++ Components/DiskII/IWM.hpp | 7 +++++++ Components/DiskII/MacintoshDoubleDensityDrive.cpp | 4 +++- Machines/Apple/Macintosh/Macintosh.cpp | 9 ++++++++- 4 files changed, 23 insertions(+), 2 deletions(-) diff --git a/Components/DiskII/IWM.cpp b/Components/DiskII/IWM.cpp index 93a513511..d8accbc71 100644 --- a/Components/DiskII/IWM.cpp +++ b/Components/DiskII/IWM.cpp @@ -399,3 +399,8 @@ void IWM::set_component_prefers_clocking(ClockingHint::Source *component, Clocki drive_is_rotating_[1] = is_rotating; } } + +void IWM::set_activity_observer(Activity::Observer *observer) { + if(drives_[0]) drives_[0]->set_activity_observer(observer, "Internal Drive", true); + if(drives_[1]) drives_[1]->set_activity_observer(observer, "External Drive", true); +} diff --git a/Components/DiskII/IWM.hpp b/Components/DiskII/IWM.hpp index dd49b2563..04c1d5739 100644 --- a/Components/DiskII/IWM.hpp +++ b/Components/DiskII/IWM.hpp @@ -9,8 +9,11 @@ #ifndef IWM_hpp #define IWM_hpp +#include "../../Activity/Observer.hpp" + #include "../../ClockReceiver/ClockReceiver.hpp" #include "../../ClockReceiver/ClockingHintSource.hpp" + #include "../../Storage/Disk/Drive.hpp" #include @@ -67,6 +70,10 @@ class IWM: /// Connects a drive to the IWM. void set_drive(int slot, IWMDrive *drive); + /// Registers the currently-connected drives as @c Activity::Sources ; + /// the first will be declared 'Internal', the second 'External'. + void set_activity_observer(Activity::Observer *observer); + private: // Storage::Disk::Drive::EventDelegate. void process_event(const Storage::Disk::Drive::Event &event) override; diff --git a/Components/DiskII/MacintoshDoubleDensityDrive.cpp b/Components/DiskII/MacintoshDoubleDensityDrive.cpp index 9f5a04b32..a45221eb3 100644 --- a/Components/DiskII/MacintoshDoubleDensityDrive.cpp +++ b/Components/DiskII/MacintoshDoubleDensityDrive.cpp @@ -71,7 +71,9 @@ void DoubleDensityDrive::set_rotation_speed(float revolutions_per_minute) { // MARK: - Control input/output. -void DoubleDensityDrive::set_enabled(bool) { +void DoubleDensityDrive::set_enabled(bool enabled) { + // Disabling a drive also stops its motor. + if(!enabled) set_motor_on(false); } void DoubleDensityDrive::set_control_lines(int lines) { diff --git a/Machines/Apple/Macintosh/Macintosh.cpp b/Machines/Apple/Macintosh/Macintosh.cpp index 0146d13a2..ad54d73b6 100644 --- a/Machines/Apple/Macintosh/Macintosh.cpp +++ b/Machines/Apple/Macintosh/Macintosh.cpp @@ -16,6 +16,7 @@ #include "RealTimeClock.hpp" #include "Video.hpp" +#include "../../../Activity/Source.hpp" #include "../../CRTMachine.hpp" #include "../../KeyboardMachine.hpp" #include "../../MediaTarget.hpp" @@ -55,7 +56,8 @@ template class ConcreteMachin public MouseMachine::Machine, public CPU::MC68000::BusHandler, public KeyboardMachine::MappedMachine, - public Zilog::SCC::z8530::Delegate { + public Zilog::SCC::z8530::Delegate, + public Activity::Source { public: using Target = Analyser::Static::Macintosh::Target; @@ -460,6 +462,11 @@ template class ConcreteMachin } } + // MARK: - Activity Source + void set_activity_observer(Activity::Observer *observer) override { + iwm_.iwm.set_activity_observer(observer); + } + private: void update_video() { video_.run_for(time_since_video_update_.flush());