From 374439693e572350b5588043a3d17def747a0a92 Mon Sep 17 00:00:00 2001 From: Thomas Harte Date: Sun, 13 Oct 2019 20:41:08 -0400 Subject: [PATCH] Ensures serial lines know their writer's clock rate. --- Components/6850/6850.cpp | 5 ++++- Components/6850/6850.hpp | 2 +- Components/SerialPort/SerialPort.cpp | 4 ++++ Components/SerialPort/SerialPort.hpp | 3 +++ Machines/AtariST/AtariST.cpp | 4 ++-- 5 files changed, 14 insertions(+), 4 deletions(-) diff --git a/Components/6850/6850.cpp b/Components/6850/6850.cpp index 5b20be2cc..eb4e99c2b 100644 --- a/Components/6850/6850.cpp +++ b/Components/6850/6850.cpp @@ -13,7 +13,10 @@ using namespace Motorola::ACIA; -ACIA::ACIA() {} +ACIA::ACIA(int clock_rate) { + transmit.set_writer_clock_rate(clock_rate); + request_to_send.set_writer_clock_rate(clock_rate); +} uint8_t ACIA::read(int address) { if(address&1) { diff --git a/Components/6850/6850.hpp b/Components/6850/6850.hpp index 1b76726a9..a8ea3f96e 100644 --- a/Components/6850/6850.hpp +++ b/Components/6850/6850.hpp @@ -19,7 +19,7 @@ namespace ACIA { class ACIA: public ClockingHint::Source { public: - ACIA(); + ACIA(int clock_rate); /*! Reads from the ACIA. diff --git a/Components/SerialPort/SerialPort.cpp b/Components/SerialPort/SerialPort.cpp index 1b3c388fe..18e1483b1 100644 --- a/Components/SerialPort/SerialPort.cpp +++ b/Components/SerialPort/SerialPort.cpp @@ -10,6 +10,10 @@ using namespace Serial; +void Line::set_writer_clock_rate(int clock_rate) { + clock_rate_ = clock_rate; +} + void Line::advance_writer(int cycles) { remaining_delays_ = std::max(remaining_delays_ - cycles, 0); while(!events_.empty()) { diff --git a/Components/SerialPort/SerialPort.hpp b/Components/SerialPort/SerialPort.hpp index 055eba32d..82eadc2a3 100644 --- a/Components/SerialPort/SerialPort.hpp +++ b/Components/SerialPort/SerialPort.hpp @@ -24,6 +24,8 @@ namespace Serial { */ class Line { public: + void set_writer_clock_rate(int clock_rate); + /// Advances the read position by @c cycles relative to the writer's /// clock rate. void advance_writer(int cycles); @@ -61,6 +63,7 @@ class Line { std::vector events_; int remaining_delays_ = 0; bool level_ = false; + int clock_rate_ = 0; }; /*! diff --git a/Machines/AtariST/AtariST.cpp b/Machines/AtariST/AtariST.cpp index f161cfb8a..5cff738c1 100644 --- a/Machines/AtariST/AtariST.cpp +++ b/Machines/AtariST/AtariST.cpp @@ -39,8 +39,8 @@ class ConcreteMachine: public: ConcreteMachine(const Target &target, const ROMMachine::ROMFetcher &rom_fetcher) : mc68000_(*this), - keyboard_acia_(), - midi_acia_(), + keyboard_acia_(CLOCK_RATE / 10), + midi_acia_(CLOCK_RATE / 10), ay_(audio_queue_), speaker_(ay_) { set_clock_rate(CLOCK_RATE);