diff --git a/ClockReceiver/DeferredQueue.hpp b/ClockReceiver/DeferredQueue.hpp index 5dfbfd0ea..c639ea411 100644 --- a/ClockReceiver/DeferredQueue.hpp +++ b/ClockReceiver/DeferredQueue.hpp @@ -73,6 +73,11 @@ template class DeferredQueue { } } + /// @returns @c true if no actions are enqueued; @c false otherwise. + bool empty() const { + return pending_actions_.empty(); + } + private: // The list of deferred actions. struct DeferredAction { diff --git a/Machines/Apple/ADB/ReactiveDevice.cpp b/Machines/Apple/ADB/ReactiveDevice.cpp index 1ba80f462..04579459c 100644 --- a/Machines/Apple/ADB/ReactiveDevice.cpp +++ b/Machines/Apple/ADB/ReactiveDevice.cpp @@ -13,7 +13,7 @@ using namespace Apple::ADB; namespace { -Log::Logger logger; +[[maybe_unused]] Log::Logger logger; } ReactiveDevice::ReactiveDevice(Apple::ADB::Bus &bus, uint8_t adb_device_id) : diff --git a/Machines/Apple/AppleII/AppleII.cpp b/Machines/Apple/AppleII/AppleII.cpp index 210e592be..4ca222a3d 100644 --- a/Machines/Apple/AppleII/AppleII.cpp +++ b/Machines/Apple/AppleII/AppleII.cpp @@ -742,6 +742,11 @@ template // actor, but this will actually be the result most of the time so it's not // too terrible. if(isReadOperation(operation) && address != 0xc000) { + // Ensure any enqueued video changes are applied before grabbing the + // vapour value. + if(video_.has_deferred_actions()) { + update_video(); + } *value = video_.get_last_read_value(cycles_since_video_update_); } @@ -826,19 +831,19 @@ template case 0xc000: case 0xc001: update_video(); - video_.set_80_store(!!(address&1)); + video_.set_80_store(address&1); break; case 0xc00c: case 0xc00d: update_video(); - video_.set_80_columns(!!(address&1)); + video_.set_80_columns(address&1); break; case 0xc00e: case 0xc00f: update_video(); - video_.set_alternative_character_set(!!(address&1)); + video_.set_alternative_character_set(address&1); break; } } @@ -851,7 +856,7 @@ template case 0xc050: case 0xc051: update_video(); - video_.set_text(!!(address&1)); + video_.set_text(address&1); break; case 0xc052: update_video(); video_.set_mixed(false); break; case 0xc053: update_video(); video_.set_mixed(true); break; diff --git a/Machines/Apple/AppleII/Video.hpp b/Machines/Apple/AppleII/Video.hpp index 26e230b1d..fe6ce1504 100644 --- a/Machines/Apple/AppleII/Video.hpp +++ b/Machines/Apple/AppleII/Video.hpp @@ -10,7 +10,6 @@ #include "../../../Outputs/CRT/CRT.hpp" #include "../../../ClockReceiver/ClockReceiver.hpp" -#include "../../../ClockReceiver/DeferredQueue.hpp" #include "VideoSwitches.hpp" @@ -124,7 +123,8 @@ template class Video: public VideoBase { bus_handler_(bus_handler) {} /*! - Obtains the last value the video read prior to time now+offset. + Obtains the last value the video read prior to time now+offset, according to the *current* + video mode, i.e. not allowing for any changes still enqueued. */ uint8_t get_last_read_value(Cycles offset) { // Rules of generation: diff --git a/Machines/Apple/AppleII/VideoSwitches.hpp b/Machines/Apple/AppleII/VideoSwitches.hpp index 159cd0491..6763d642b 100644 --- a/Machines/Apple/AppleII/VideoSwitches.hpp +++ b/Machines/Apple/AppleII/VideoSwitches.hpp @@ -247,6 +247,10 @@ template class VideoSwitches { } } + bool has_deferred_actions() const { + return !deferrer_.empty(); + } + protected: GraphicsMode graphics_mode(int row) const { if(