mirror of
https://github.com/TomHarte/CLK.git
synced 2025-01-11 08:30:55 +00:00
Provide function codes. TODO: optionally.
This commit is contained in:
parent
5ab5e1270e
commit
539932dc56
@ -27,8 +27,8 @@ enum class FunctionCode {
|
||||
};
|
||||
|
||||
struct BusHandler {
|
||||
template <typename IntT> void write(uint32_t address, IntT value);
|
||||
template <typename IntT> IntT read(uint32_t address);
|
||||
template <typename IntT> void write(uint32_t address, IntT value, FunctionCode function);
|
||||
template <typename IntT> IntT read(uint32_t address, FunctionCode function);
|
||||
};
|
||||
|
||||
/// Ties together the decoder, sequencer and performer to provide an executor for 680x0 instruction streams.
|
||||
@ -92,7 +92,7 @@ template <Model model, typename BusHandler> class Executor {
|
||||
|
||||
void read(DataSize size, uint32_t address, CPU::SlicedInt32 &value);
|
||||
void write(DataSize size, uint32_t address, CPU::SlicedInt32 value);
|
||||
template <typename IntT> IntT read(uint32_t address);
|
||||
template <typename IntT> IntT read(uint32_t address, bool is_from_pc = false);
|
||||
template <typename IntT> void write(uint32_t address, IntT value);
|
||||
|
||||
template <typename IntT> IntT read_pc();
|
||||
|
@ -37,15 +37,17 @@ void Executor<model, BusHandler>::reset() {
|
||||
|
||||
template <Model model, typename BusHandler>
|
||||
template <typename IntT>
|
||||
IntT Executor<model, BusHandler>::read(uint32_t address) {
|
||||
IntT Executor<model, BusHandler>::read(uint32_t address, bool is_from_pc) {
|
||||
// TODO: check for an alignment exception, both here and in write.
|
||||
return bus_handler_.template read<IntT>(address);
|
||||
//
|
||||
// TODO: omit generation of the FunctionCode if the BusHandler doesn't receive it.
|
||||
return bus_handler_.template read<IntT>(address, FunctionCode((status_.is_supervisor_ << 2) | 1 << int(is_from_pc)));
|
||||
}
|
||||
|
||||
template <Model model, typename BusHandler>
|
||||
template <typename IntT>
|
||||
void Executor<model, BusHandler>::write(uint32_t address, IntT value) {
|
||||
bus_handler_.template write<IntT>(address, value);
|
||||
bus_handler_.template write<IntT>(address, value, FunctionCode((status_.is_supervisor_ << 2) | 1));
|
||||
}
|
||||
|
||||
template <Model model, typename BusHandler>
|
||||
@ -68,7 +70,7 @@ void Executor<model, BusHandler>::write(DataSize size, uint32_t address, CPU::Sl
|
||||
|
||||
template <Model model, typename BusHandler>
|
||||
template <typename IntT> IntT Executor<model, BusHandler>::read_pc() {
|
||||
const IntT result = read<IntT>(program_counter_.l);
|
||||
const IntT result = read<IntT>(program_counter_.l, true);
|
||||
|
||||
if constexpr (sizeof(IntT) == 4) {
|
||||
program_counter_.l += 4;
|
||||
|
@ -227,7 +227,7 @@
|
||||
// Initial test-case implementation:
|
||||
// do a very sedate read and write.
|
||||
|
||||
template <typename IntT> IntT read(uint32_t address) {
|
||||
template <typename IntT> IntT read(uint32_t address, InstructionSet::M68k::FunctionCode) {
|
||||
if constexpr (sizeof(IntT) == 1) {
|
||||
return IntT(ram[address & 0xffffff]);
|
||||
}
|
||||
@ -250,7 +250,7 @@
|
||||
return 0;
|
||||
}
|
||||
|
||||
template <typename IntT> void write(uint32_t address, IntT value) {
|
||||
template <typename IntT> void write(uint32_t address, IntT value, InstructionSet::M68k::FunctionCode) {
|
||||
if constexpr (sizeof(IntT) == 1) {
|
||||
ram[address & 0xffffff] = uint8_t(value);
|
||||
}
|
||||
|
Loading…
x
Reference in New Issue
Block a user