1
0
mirror of https://github.com/TomHarte/CLK.git synced 2024-12-25 03:32:01 +00:00

Merge pull request #1048 from TomHarte/STOPMk2

68000mk2: apply STOP status.
This commit is contained in:
Thomas Harte 2022-06-15 11:07:14 -04:00 committed by GitHub
commit f23c5cc6df
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23

View File

@ -27,6 +27,7 @@ enum ExecutionState: int {
Reset = std::numeric_limits<int>::min(),
Decode,
WaitForDTACK,
WaitForInterrupt,
StoreOperand,
StoreOperand_bw,
@ -377,14 +378,21 @@ void Processor<BusHandler, dtack_is_implicit, permit_overrun, signal_will_perfor
}
MoveToStateSpecific(WaitForDTACK);
// Spin in place until an interrupt arrives.
BeginState(STOP):
IdleBus(1);
// Apply the suffix status.
status_.set_status(prefetch_.w);
did_update_status();
[[fallthrough]];
BeginState(WaitForInterrupt):
// Spin in place until an interrupt arrives.
captured_interrupt_level_ = bus_interrupt_level_;
if(status_.would_accept_interrupt(captured_interrupt_level_)) {
MoveToStateSpecific(DoInterrupt);
}
MoveToStateSpecific(STOP);
IdleBus(1);
CheckOverrun();
MoveToStateSpecific(WaitForInterrupt);
// Perform the RESET exception, which seeds the stack pointer and program
// counter, populates the prefetch queue, and then moves to instruction dispatch.
@ -587,8 +595,12 @@ void Processor<BusHandler, dtack_is_implicit, permit_overrun, signal_will_perfor
if(vpa_) {
temporary_value_.b = uint8_t(InstructionSet::M68k::Exception::InterruptAutovectorBase - 1 + captured_interrupt_level_);
}
if(berr_) {
temporary_value_.b = uint8_t(InstructionSet::M68k::Exception::SpuriousInterrupt);
}
// TODO: if bus error is set, treat interrupt as spurious.
// TODO: check documentation for other potential interrupt outcomes;
// and presumably spin here if DTACK isn't implicit.
IdleBus(3); // n- n