mirror of
https://github.com/TomHarte/CLK.git
synced 2024-11-26 08:49:37 +00:00
In theory this should 'execute' up to the first unconditional branch.
Where execution means: do very little.
This commit is contained in:
parent
ec0018df79
commit
9b92753e0a
@ -105,6 +105,10 @@ template <
|
||||
and doing any translation as is necessary.
|
||||
*/
|
||||
void set_program_counter(ProgramCounterType address) {
|
||||
// Set flag to terminate any inner loop currently running through
|
||||
// previously-parsed content.
|
||||
has_branched_ = true;
|
||||
|
||||
// Temporary implementation: just interpret.
|
||||
program_.clear();
|
||||
static_cast<Executor *>(this)->parse(address, ProgramCounterType(max_address));
|
||||
@ -118,6 +122,19 @@ template <
|
||||
// }
|
||||
}
|
||||
|
||||
void perform_all() {
|
||||
// TEMPORARY (?). Execute all current instructions, unless
|
||||
// and until one branches.
|
||||
has_branched_ = false;
|
||||
for(auto index: program_) {
|
||||
performers_[index]();
|
||||
if(has_branched_) break;
|
||||
}
|
||||
}
|
||||
|
||||
private:
|
||||
bool has_branched_ = false;
|
||||
|
||||
private:
|
||||
std::vector<PerformerIndex> program_;
|
||||
|
||||
|
@ -27,9 +27,6 @@ Executor::Executor() {
|
||||
performers_[c] = performer_lookup_.performer(instruction.operation, instruction.addressing_mode);
|
||||
}
|
||||
}
|
||||
|
||||
// TODO: read reset vector, etc. This is just the start of ROM.
|
||||
set_program_counter(0x1400);
|
||||
}
|
||||
|
||||
void Executor::set_rom(const std::vector<uint8_t> &rom) {
|
||||
@ -37,11 +34,14 @@ void Executor::set_rom(const std::vector<uint8_t> &rom) {
|
||||
const auto length = std::min(size_t(0x1000), rom.size());
|
||||
memcpy(&memory_[0x2000 - length], rom.data(), length);
|
||||
reset();
|
||||
|
||||
// TEMPORARY: just to test initial wiring.
|
||||
perform_all();
|
||||
}
|
||||
|
||||
void Executor::reset() {
|
||||
// Just jump to the reset vector.
|
||||
set_program_counter(uint16_t(memory_[0x1ffe] | (memory_[0x1fff] << 8)));
|
||||
set_program_counter(uint16_t(memory_[0x1ffe] | (memory_[0x1fff] << 8)) & 0x1fff);
|
||||
}
|
||||
|
||||
template <Operation operation, AddressingMode addressing_mode> void Executor::perform() {
|
||||
|
Loading…
Reference in New Issue
Block a user