From 8860d0ff513d03988a7e3d9a0543adf455e32f4f Mon Sep 17 00:00:00 2001 From: Thomas Harte Date: Sat, 16 Jan 2021 22:06:16 -0500 Subject: [PATCH] Starts to establish the CachingExecutor. --- InstructionSets/CachingExecutor.cpp | 9 ++++++ InstructionSets/CachingExecutor.hpp | 26 +++++++++++++++++ InstructionSets/M50740/Executor.cpp | 7 ++--- InstructionSets/M50740/Executor.hpp | 28 +++++++++++-------- .../Clock Signal.xcodeproj/project.pbxproj | 10 +++++++ 5 files changed, 64 insertions(+), 16 deletions(-) create mode 100644 InstructionSets/CachingExecutor.cpp create mode 100644 InstructionSets/CachingExecutor.hpp diff --git a/InstructionSets/CachingExecutor.cpp b/InstructionSets/CachingExecutor.cpp new file mode 100644 index 000000000..9a0b59e02 --- /dev/null +++ b/InstructionSets/CachingExecutor.cpp @@ -0,0 +1,9 @@ +// +// CachingExecutor.cpp +// Clock Signal +// +// Created by Thomas Harte on 16/01/2021. +// Copyright © 2021 Thomas Harte. All rights reserved. +// + +#include "CachingExecutor.hpp" diff --git a/InstructionSets/CachingExecutor.hpp b/InstructionSets/CachingExecutor.hpp new file mode 100644 index 000000000..ebd555b19 --- /dev/null +++ b/InstructionSets/CachingExecutor.hpp @@ -0,0 +1,26 @@ +// +// CachingExecutor.hpp +// Clock Signal +// +// Created by Thomas Harte on 16/01/2021. +// Copyright © 2021 Thomas Harte. All rights reserved. +// + +#ifndef CachingExecutor_hpp +#define CachingExecutor_hpp + +namespace InstructionSet { + +template class CachingExecutor { + public: + + protected: + AddressType program_counter_; + + private: + Action actions_[100]; // TODO: just a test declaration; these actually need to be bucketed by page, etc. +}; + +} + +#endif /* CachingExecutor_hpp */ diff --git a/InstructionSets/M50740/Executor.cpp b/InstructionSets/M50740/Executor.cpp index 71a39913a..52d4d612a 100644 --- a/InstructionSets/M50740/Executor.cpp +++ b/InstructionSets/M50740/Executor.cpp @@ -16,9 +16,6 @@ template void Executor::perform(uint8_t *operand [[maybe_u template void Executor::perform(Executor *) { } -Executor::Action Executor::action_for(Instruction instruction) { - Action action { - .perform = performer_lookup_.performer(instruction.operation, instruction.addressing_mode) - }; - return action; +Action Executor::action_for(Instruction instruction) { + return Action(performer_lookup_.performer(instruction.operation, instruction.addressing_mode)); } diff --git a/InstructionSets/M50740/Executor.hpp b/InstructionSets/M50740/Executor.hpp index 5709732f0..4f56cadd4 100644 --- a/InstructionSets/M50740/Executor.hpp +++ b/InstructionSets/M50740/Executor.hpp @@ -11,26 +11,31 @@ #include "Instruction.hpp" #include "Parser.hpp" +#include "../CachingExecutor.hpp" namespace InstructionSet { namespace M50740 { class Executor; -class Executor { - public: - /*! - M50740 actions require no further context; the addressing mode and operation is baked in, - so using the Executor to enquire of memory and the program counter is sufficient. - */ - struct Action { - using Performer = void (*)(Executor *); - Performer perform = nullptr; - }; +/*! + M50740 actions require no further context; the addressing mode and operation is baked in, + so using the Executor to enquire of memory and the program counter is sufficient. +*/ +struct Action { + using Performer = void (*)(Executor *); + Performer perform = nullptr; - Action action_for(Instruction); + inline Action(Performer performer) noexcept : perform(performer) {} +}; + +class Executor: public CachingExecutor { + public: private: + friend CachingExecutor; + Action action_for(Instruction); + /*! Performs @c operation using @c operand as the value fetched from memory, if any. */ @@ -74,6 +79,7 @@ class Executor { }; inline static PerformerLookup performer_lookup_; + uint8_t memory_[0x2000]; }; } diff --git a/OSBindings/Mac/Clock Signal.xcodeproj/project.pbxproj b/OSBindings/Mac/Clock Signal.xcodeproj/project.pbxproj index 275346a9e..4f2dc667e 100644 --- a/OSBindings/Mac/Clock Signal.xcodeproj/project.pbxproj +++ b/OSBindings/Mac/Clock Signal.xcodeproj/project.pbxproj @@ -934,6 +934,9 @@ 4BEDA43025B3C700000C2DBD /* Executor.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 4BEDA42F25B3C700000C2DBD /* Executor.cpp */; }; 4BEDA43125B3C700000C2DBD /* Executor.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 4BEDA42F25B3C700000C2DBD /* Executor.cpp */; }; 4BEDA43225B3C700000C2DBD /* Executor.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 4BEDA42F25B3C700000C2DBD /* Executor.cpp */; }; + 4BEDA43D25B3DE66000C2DBD /* CachingExecutor.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 4BEDA43B25B3DE66000C2DBD /* CachingExecutor.cpp */; }; + 4BEDA43E25B3DE66000C2DBD /* CachingExecutor.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 4BEDA43B25B3DE66000C2DBD /* CachingExecutor.cpp */; }; + 4BEDA43F25B3DE66000C2DBD /* CachingExecutor.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 4BEDA43B25B3DE66000C2DBD /* CachingExecutor.cpp */; }; 4BEE0A6F1D72496600532C7B /* Cartridge.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 4BEE0A6A1D72496600532C7B /* Cartridge.cpp */; }; 4BEE0A701D72496600532C7B /* PRG.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 4BEE0A6D1D72496600532C7B /* PRG.cpp */; }; 4BEE149A227FC0EA00133682 /* IWM.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 4BEE1498227FC0EA00133682 /* IWM.cpp */; }; @@ -1947,6 +1950,8 @@ 4BEDA42925B3C26B000C2DBD /* AccessType.hpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.h; path = AccessType.hpp; sourceTree = ""; }; 4BEDA42E25B3C613000C2DBD /* Executor.hpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.h; path = Executor.hpp; sourceTree = ""; }; 4BEDA42F25B3C700000C2DBD /* Executor.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = Executor.cpp; sourceTree = ""; }; + 4BEDA43B25B3DE66000C2DBD /* CachingExecutor.cpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; path = CachingExecutor.cpp; sourceTree = ""; }; + 4BEDA43C25B3DE66000C2DBD /* CachingExecutor.hpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.h; path = CachingExecutor.hpp; sourceTree = ""; }; 4BEE0A6A1D72496600532C7B /* Cartridge.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = Cartridge.cpp; sourceTree = ""; }; 4BEE0A6B1D72496600532C7B /* Cartridge.hpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.h; path = Cartridge.hpp; sourceTree = ""; }; 4BEE0A6D1D72496600532C7B /* PRG.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = PRG.cpp; sourceTree = ""; }; @@ -4365,7 +4370,9 @@ 4BEDA3B225B25563000C2DBD /* InstructionSets */ = { isa = PBXGroup; children = ( + 4BEDA43B25B3DE66000C2DBD /* CachingExecutor.cpp */, 4BEDA42925B3C26B000C2DBD /* AccessType.hpp */, + 4BEDA43C25B3DE66000C2DBD /* CachingExecutor.hpp */, 4BEDA3B625B25563000C2DBD /* README.md */, 4BEDA40925B2844B000C2DBD /* M50740 */, 4BEDA3B325B25563000C2DBD /* PowerPC */, @@ -5086,6 +5093,7 @@ 4B4B1A3D200198CA00A0F866 /* KonamiSCC.cpp in Sources */, 4B055AC31FAE9AE80060FFFF /* AmstradCPC.cpp in Sources */, 4B055A9E1FAE85DA0060FFFF /* G64.cpp in Sources */, + 4BEDA43F25B3DE66000C2DBD /* CachingExecutor.cpp in Sources */, 4B055AB81FAE860F0060FFFF /* ZX80O81P.cpp in Sources */, 4B055AB01FAE86070060FFFF /* PulseQueuedTape.cpp in Sources */, 4B055AAC1FAE85FD0060FFFF /* PCMSegment.cpp in Sources */, @@ -5279,6 +5287,7 @@ 4B3FE75E1F3CF68B00448EE4 /* CPM.cpp in Sources */, 4B2BFDB21DAEF5FF001A68B8 /* Video.cpp in Sources */, 4BEDA3BF25B25563000C2DBD /* Decoder.cpp in Sources */, + 4BEDA43D25B3DE66000C2DBD /* CachingExecutor.cpp in Sources */, 4B4DC82B1D2C27A4003C5BF8 /* SerialBus.cpp in Sources */, 4BBFFEE61F7B27F1005F3FEB /* TrackSerialiser.cpp in Sources */, 4BAE49582032881E004BE78E /* CSZX8081.mm in Sources */, @@ -5459,6 +5468,7 @@ 4B778F5523A5F2A70000D260 /* Keyboard.cpp in Sources */, 4B778F5D23A5F3230000D260 /* Commodore.cpp in Sources */, 4B98A05F1FFAD62400ADF63B /* CSROMFetcher.mm in Sources */, + 4BEDA43E25B3DE66000C2DBD /* CachingExecutor.cpp in Sources */, 4BC0CB282446BC7B00A79DBB /* OPLTests.mm in Sources */, 4BC9E1EE1D23449A003FCEE4 /* 6502InterruptTests.swift in Sources */, 4BEF6AAA1D35CE9E00E73575 /* DigitalPhaseLockedLoopBridge.mm in Sources */,