diff --git a/Machines/Amiga/Chipset.cpp b/Machines/Amiga/Chipset.cpp index 7c2a2cb65..f945eb1db 100644 --- a/Machines/Amiga/Chipset.cpp +++ b/Machines/Amiga/Chipset.cpp @@ -500,6 +500,11 @@ template Chipset::Changes Chipset::run(HalfCycles length) { assert(line_cycle_ < line_length_ * 4); } + // Advance the keyboard's serial output, at + // close enough to 1,000,000 ticks/second. + keyboard_divider_ += changes.duration; + keyboard_.run_for(keyboard_divider_.divide(HalfCycles(14))); + // The CIAs are on the E clock. cia_divider_ += changes.duration; const HalfCycles e_clocks = cia_divider_.divide(HalfCycles(20)); diff --git a/Machines/Amiga/Chipset.hpp b/Machines/Amiga/Chipset.hpp index bcf6fa40f..00e051397 100644 --- a/Machines/Amiga/Chipset.hpp +++ b/Machines/Amiga/Chipset.hpp @@ -103,9 +103,10 @@ class Chipset: private ClockingHint::Observer { private: friend class DMADeviceBase; - // MARK: - E Clock follow along. + // MARK: - E Clock and keyboard dividers. HalfCycles cia_divider_; + HalfCycles keyboard_divider_; // MARK: - Interrupts. diff --git a/Machines/Amiga/Keyboard.hpp b/Machines/Amiga/Keyboard.hpp index dbdc80b0d..2ab026343 100644 --- a/Machines/Amiga/Keyboard.hpp +++ b/Machines/Amiga/Keyboard.hpp @@ -12,6 +12,7 @@ #include #include "../KeyboardMachine.hpp" #include "../../Components/Serial/Line.hpp" +#include "../../ClockReceiver/ClockReceiver.hpp" namespace Amiga { @@ -89,6 +90,10 @@ class Keyboard { void set_key_state(uint16_t, bool); void clear_all_keys(); + void run_for(HalfCycles duration) { + output_.advance_writer(duration); + } + private: enum class ShiftState { Shifting,