1
0
mirror of https://github.com/TomHarte/CLK.git synced 2024-06-26 10:29:31 +00:00

Corrects performer population, lookup, calls.

This commit is contained in:
Thomas Harte 2021-01-18 17:53:14 -05:00
parent 9b92753e0a
commit a601ac0cab
3 changed files with 22 additions and 14 deletions

View File

@ -127,7 +127,8 @@ template <
// and until one branches.
has_branched_ = false;
for(auto index: program_) {
performers_[index]();
const auto performer = performers_[index];
(static_cast<Executor *>(this)->*performer)();
if(has_branched_) break;
}
}

View File

@ -144,7 +144,7 @@ template <Operation operation, AddressingMode addressing_mode> void Executor::pe
}
template <Operation operation> void Executor::perform(uint8_t *operand [[maybe_unused]]) {
switch(operation) {
default: assert(false);
}
// switch(operation) {
// default: assert(false);
// }
}

View File

@ -20,7 +20,7 @@ namespace InstructionSet {
namespace M50740 {
class Executor;
using CachingExecutor = CachingExecutor<Executor, 0x1fff, 256, Instruction, false>;
using CachingExecutor = CachingExecutor<Executor, 0x1fff, 255, Instruction, false>;
class Executor: public CachingExecutor {
public:
@ -58,28 +58,35 @@ class Executor: public CachingExecutor {
class PerformerLookup {
public:
PerformerLookup() {
fill<int(MinOperation), int(MinAddressingMode)>(performers);
fill<int(MinOperation)>(performers_);
}
Performer performer(Operation operation, AddressingMode addressing_mode) {
return performers[int(addressing_mode) * (MaxOperation - MinOperation) + int(operation) - MinOperation];
const auto index =
(int(operation) - MinOperation) * (1 + MaxAddressingMode - MinAddressingMode) +
(int(addressing_mode) - MinAddressingMode);
assert(index < decltype(index)(sizeof(performers_)/sizeof(*performers_)));
return performers_[index];
}
private:
Performer performers[(MaxAddressingMode - MinAddressingMode) * (MaxOperation - MinOperation)];
Performer performers_[(1 + MaxAddressingMode - MinAddressingMode) * (1 + MaxOperation - MinOperation)];
template<int operation, int addressing_mode> void fill_operation(Performer *target) {
*target = &Executor::perform<Operation(operation), AddressingMode(addressing_mode)>;
if constexpr (addressing_mode+1 < MaxAddressingMode) {
if constexpr (addressing_mode+1 <= MaxAddressingMode) {
fill_operation<operation, addressing_mode+1>(target + 1);
}
}
template<int operation, int addressing_mode> void fill(Performer *target) {
fill_operation<operation, addressing_mode>(target);
target += MaxOperation - MinOperation;
if constexpr (operation+1 < MaxOperation) {
fill<operation+1, addressing_mode>(target);
template<int operation> void fill(Performer *target) {
fill_operation<operation, int(MinAddressingMode)>(target);
target += 1 + MaxAddressingMode - MinAddressingMode;
if constexpr (operation+1 <= MaxOperation) {
fill<operation+1>(target);
}
}
};