From 6c6cda3db5f75c0291a022305b1fdf4973dd0545 Mon Sep 17 00:00:00 2001 From: Thomas Harte Date: Tue, 9 Apr 2024 22:22:03 -0400 Subject: [PATCH] Use clocking hints. --- .../Archimedes/InputOutputController.hpp | 43 +++++++++++-------- 1 file changed, 26 insertions(+), 17 deletions(-) diff --git a/Machines/Acorn/Archimedes/InputOutputController.hpp b/Machines/Acorn/Archimedes/InputOutputController.hpp index 2974ffdce..c4ffb14d7 100644 --- a/Machines/Acorn/Archimedes/InputOutputController.hpp +++ b/Machines/Acorn/Archimedes/InputOutputController.hpp @@ -16,6 +16,7 @@ #include "../../../Outputs/Log.hpp" #include "../../../Activity/Observer.hpp" +#include "../../../ClockReceiver/ClockingHintSource.hpp" namespace Archimedes { @@ -58,7 +59,24 @@ namespace InterruptRequests { }; template -struct InputOutputController { +struct InputOutputController: public ClockingHint::Observer { + InputOutputController(InterruptObserverT &observer, ClockRateObserverT &clock_observer, const uint8_t *ram) : + observer_(observer), + keyboard_(serial_), + floppy_(*this), + sound_(*this, ram), + video_(*this, clock_observer, sound_, ram) + { + irq_a_.status = IRQA::Force | IRQA::PowerOnReset; + irq_b_.status = 0x00; + fiq_.status = FIQ::Force; + + floppy_.set_clocking_hint_observer(this); + + i2c_.add_peripheral(&cmos_, 0xa0); + update_interrupts(); + } + int interrupt_mask() const { return ((irq_a_.request() | irq_b_.request()) ? InterruptRequests::IRQ : 0) | @@ -113,7 +131,9 @@ struct InputOutputController { } void tick_floppy() { - floppy_.run_for(Cycles(1)); + if(floppy_clocking_ != ClockingHint::Preference::None) { + floppy_.run_for(Cycles(1)); + } } void set_disk(std::shared_ptr disk, size_t drive) { @@ -453,21 +473,6 @@ struct InputOutputController { return true; } - InputOutputController(InterruptObserverT &observer, ClockRateObserverT &clock_observer, const uint8_t *ram) : - observer_(observer), - keyboard_(serial_), - floppy_(*this), - sound_(*this, ram), - video_(*this, clock_observer, sound_, ram) - { - irq_a_.status = IRQA::Force | IRQA::PowerOnReset; - irq_b_.status = 0x00; - fiq_.status = FIQ::Force; - - i2c_.add_peripheral(&cmos_, 0xa0); - update_interrupts(); - } - auto &sound() { return sound_; } const auto &sound() const { return sound_; } auto &video() { return video_; } @@ -541,6 +546,10 @@ private: // The floppy disc interface. FloppyDisc floppy_; + ClockingHint::Preference floppy_clocking_ = ClockingHint::Preference::None; + void set_component_prefers_clocking(ClockingHint::Source *, ClockingHint::Preference clocking) override { + floppy_clocking_ = clocking; + } // The I2C bus. I2C::Bus i2c_;