From 18631399ad3e6987cf4c85c543dce2f969f87b12 Mon Sep 17 00:00:00 2001 From: Thomas Harte Date: Tue, 5 Oct 2021 15:38:56 -0700 Subject: [PATCH] Attempts to clock the disk controller. --- Machines/Amiga/Chipset.cpp | 18 ++++++++++++++++++ Machines/Amiga/Chipset.hpp | 11 +++++++++-- 2 files changed, 27 insertions(+), 2 deletions(-) diff --git a/Machines/Amiga/Chipset.cpp b/Machines/Amiga/Chipset.cpp index 6c64cfff5..1853ead29 100644 --- a/Machines/Amiga/Chipset.cpp +++ b/Machines/Amiga/Chipset.cpp @@ -15,6 +15,7 @@ #include #include + using namespace Amiga; namespace { @@ -43,6 +44,7 @@ Chipset::Chipset(MemoryMap &map, int input_clock_rate) : cia_b_handler_(disk_controller_), cia_a(cia_a_handler_), cia_b(cia_b_handler_) { + disk_controller_.set_clocking_hint_observer(this); } Chipset::Changes Chipset::run_for(HalfCycles length) { @@ -412,10 +414,19 @@ template Chipset::Changes Chipset::run(HalfCycles length) { cia_b.run_for(e_clocks); } + // Propagate TOD updates to the CIAs, and feed their new interrupt + // outputs back to here. cia_a.advance_tod(vsyncs); cia_b.advance_tod(hsyncs); set_cia_interrupts(cia_a.get_interrupt_line(), cia_b.get_interrupt_line()); + // Update the disk controller, if any drives are active. + if(!disk_controller_is_sleeping_) { + disk_controller_.run_for(changes.duration.cycles()); + } + + // Record the interrupt level. + // TODO: is this useful? changes.interrupt_level = interrupt_level_; return changes; } @@ -994,6 +1005,13 @@ uint8_t Chipset::CIABHandler::get_port_input(MOS::MOS6526::Port) { return 0xff; } +// MARK: - ClockingHintObserver. + +void Chipset::set_component_prefers_clocking(ClockingHint::Source *, ClockingHint::Preference preference) { + disk_controller_is_sleeping_ = preference == ClockingHint::Preference::None; + LOG("Disk controller is " << (disk_controller_is_sleeping_ ? "sleeping" : "awake")); +} + // MARK: - Disk Controller. Chipset::DiskController::DiskController(Cycles clock_rate) : diff --git a/Machines/Amiga/Chipset.hpp b/Machines/Amiga/Chipset.hpp index 675461941..88e589e3e 100644 --- a/Machines/Amiga/Chipset.hpp +++ b/Machines/Amiga/Chipset.hpp @@ -13,6 +13,7 @@ #include #include "../../Activity/Source.hpp" +#include "../../ClockReceiver/ClockingHintSource.hpp" #include "../../Components/6526/6526.hpp" #include "../../Outputs/CRT/CRT.hpp" #include "../../Processors/68000/68000.hpp" @@ -59,7 +60,7 @@ enum class DMAFlag: uint16_t { BlitterBusy = 1 << 14, }; -class Chipset { +class Chipset: private ClockingHint::Observer { public: Chipset(MemoryMap &memory_map, int input_clock_rate); @@ -218,13 +219,17 @@ class Chipset { // MARK: - Disk drives. - class DiskController: private Storage::Disk::Controller { + class DiskController: public Storage::Disk::Controller { public: DiskController(Cycles clock_rate); void set_mtr_sel_side_dir_step(uint8_t); uint8_t get_rdy_trk0_wpro_chng(); + void run_for(Cycles duration) { + Storage::Disk::Controller::run_for(duration); + } + private: void process_input_bit(int value) final; void process_index_hole() final; @@ -235,6 +240,8 @@ class Chipset { uint32_t previous_select_ = 0; } disk_controller_; + void set_component_prefers_clocking(ClockingHint::Source *, ClockingHint::Preference) final; + bool disk_controller_is_sleeping_ = false; class DiskDMA: public DMADevice<1> { public: