mirror of
https://github.com/TomHarte/CLK.git
synced 2024-07-06 01:28:57 +00:00
76 lines
1.9 KiB
C++
76 lines
1.9 KiB
C++
//
|
|
// State.cpp
|
|
// Clock Signal
|
|
//
|
|
// Created by Thomas Harte on 14/05/2020.
|
|
// Copyright © 2020 Thomas Harte. All rights reserved.
|
|
//
|
|
|
|
#include "State.hpp"
|
|
|
|
using namespace CPU::MC68000;
|
|
|
|
State::State(const ProcessorBase &src): State() {
|
|
// Registers.
|
|
for(int c = 0; c < 7; ++c) {
|
|
registers.address[c] = src.address_[c].full;
|
|
registers.data[c] = src.data_[c].full;
|
|
}
|
|
registers.data[7] = src.data_[7].full;
|
|
registers.user_stack_pointer = src.is_supervisor_ ? src.stack_pointers_[0].full : src.address_[7].full;
|
|
registers.supervisor_stack_pointer = src.is_supervisor_ ? src.address_[7].full : src.stack_pointers_[1].full;
|
|
registers.status = src.get_status();
|
|
registers.program_counter = src.program_counter_.full;
|
|
registers.prefetch = src.prefetch_queue_.full;
|
|
|
|
// Inputs.
|
|
inputs.bus_interrupt_level = uint8_t(src.bus_interrupt_level_);
|
|
inputs.dtack = src.dtack_;
|
|
inputs.is_peripheral_address = src.is_peripheral_address_;
|
|
inputs.bus_error = src.bus_error_;
|
|
inputs.bus_request = src.bus_request_;
|
|
inputs.bus_grant = false; // TODO (within the 68000).
|
|
inputs.halt = src.halt_;
|
|
}
|
|
|
|
void State::apply(ProcessorBase &target) {
|
|
}
|
|
|
|
// Boilerplate follows here, to establish 'reflection'.
|
|
State::State() {
|
|
if(needs_declare()) {
|
|
DeclareField(registers);
|
|
DeclareField(execution_state);
|
|
DeclareField(inputs);
|
|
}
|
|
}
|
|
|
|
State::Registers::Registers() {
|
|
if(needs_declare()) {
|
|
DeclareField(data);
|
|
DeclareField(address);
|
|
DeclareField(user_stack_pointer);
|
|
DeclareField(supervisor_stack_pointer);
|
|
DeclareField(status);
|
|
DeclareField(program_counter);
|
|
DeclareField(prefetch);
|
|
}
|
|
}
|
|
|
|
State::Inputs::Inputs() {
|
|
if(needs_declare()) {
|
|
DeclareField(bus_interrupt_level);
|
|
DeclareField(dtack);
|
|
DeclareField(is_peripheral_address);
|
|
DeclareField(bus_error);
|
|
DeclareField(bus_request);
|
|
DeclareField(bus_grant);
|
|
DeclareField(halt);
|
|
}
|
|
}
|
|
|
|
State::ExecutionState::ExecutionState() {
|
|
if(needs_declare()) {
|
|
}
|
|
}
|