mirror of
https://github.com/TomHarte/CLK.git
synced 2025-02-06 13:31:55 +00:00
Merge pull request #1333 from TomHarte/DeferredSwitches
Apple II: Apply deferred video actions before getting vapour value.
This commit is contained in:
commit
a758112084
@ -73,6 +73,11 @@ template <typename TimeUnit> 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 {
|
||||
|
@ -13,7 +13,7 @@
|
||||
using namespace Apple::ADB;
|
||||
|
||||
namespace {
|
||||
Log::Logger<Log::Source::ADBDevice> logger;
|
||||
[[maybe_unused]] Log::Logger<Log::Source::ADBDevice> logger;
|
||||
}
|
||||
|
||||
ReactiveDevice::ReactiveDevice(Apple::ADB::Bus &bus, uint8_t adb_device_id) :
|
||||
|
@ -742,6 +742,11 @@ template <Analyser::Static::AppleII::Target::Model model, bool has_mockingboard>
|
||||
// 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 <Analyser::Static::AppleII::Target::Model model, bool has_mockingboard>
|
||||
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 <Analyser::Static::AppleII::Target::Model model, bool has_mockingboard>
|
||||
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;
|
||||
|
@ -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 BusHandler, bool is_iie> 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:
|
||||
|
@ -247,6 +247,10 @@ template <typename TimeUnit> class VideoSwitches {
|
||||
}
|
||||
}
|
||||
|
||||
bool has_deferred_actions() const {
|
||||
return !deferrer_.empty();
|
||||
}
|
||||
|
||||
protected:
|
||||
GraphicsMode graphics_mode(int row) const {
|
||||
if(
|
||||
|
Loading…
x
Reference in New Issue
Block a user