1
0
mirror of https://github.com/TomHarte/CLK.git synced 2025-02-27 00:30:26 +00:00

Factor out would-accept-interrupt test, per uncertainty re: level 7.

This commit is contained in:
Thomas Harte 2022-06-03 08:31:35 -04:00
parent 6fcaf3571e
commit 02b6ea6c46
3 changed files with 12 additions and 5 deletions

View File

@ -53,7 +53,7 @@ void Executor<model, BusHandler>::signal_bus_error(FunctionCode code, uint32_t a
template <Model model, typename BusHandler> template <Model model, typename BusHandler>
void Executor<model, BusHandler>::set_interrupt_level(int level) { void Executor<model, BusHandler>::set_interrupt_level(int level) {
state_.interrupt_input_ = level; state_.interrupt_input_ = level;
state_.stopped &= state_.interrupt_input_ <= state_.status.interrupt_level; state_.stopped &= !state_.status.would_accept_interrupt(level);
} }
template <Model model, typename BusHandler> template <Model model, typename BusHandler>
@ -324,7 +324,7 @@ template <Model model, typename BusHandler>
void Executor<model, BusHandler>::State::run(int &count) { void Executor<model, BusHandler>::State::run(int &count) {
while(count--) { while(count--) {
// Check for a new interrupt. // Check for a new interrupt.
if(interrupt_input > status.interrupt_level) { if(status.would_accept_interrupt(interrupt_input)) {
const int vector = bus_handler_.acknowlege_interrupt(interrupt_input); const int vector = bus_handler_.acknowlege_interrupt(interrupt_input);
if(vector >= 0) { if(vector >= 0) {
raise_exception<false>(vector); raise_exception<false>(vector);

View File

@ -113,7 +113,7 @@ struct Status {
} }
/// Evaluates @c condition. /// Evaluates @c condition.
bool evaluate_condition(Condition condition) { constexpr bool evaluate_condition(Condition condition) const {
switch(condition) { switch(condition) {
default: default:
case Condition::True: return true; case Condition::True: return true;
@ -138,6 +138,13 @@ struct Status {
return !zero_result || (negative_flag && !overflow_flag) || (!negative_flag && overflow_flag); return !zero_result || (negative_flag && !overflow_flag) || (!negative_flag && overflow_flag);
} }
} }
/// @returns @c true if an interrupt at level @c level should be accepted; @c false otherwise.
constexpr bool would_accept_interrupt(int level) const {
// TODO: is level seven really non-maskable? If so then what mechanism prevents
// rapid stack overflow upon a level-seven interrupt?
return level > interrupt_level;
}
}; };
} }

View File

@ -354,7 +354,7 @@ void Processor<BusHandler, dtack_is_implicit, permit_overrun, signal_will_perfor
BeginState(STOP): BeginState(STOP):
IdleBus(1); IdleBus(1);
captured_interrupt_level_ = bus_interrupt_level_; captured_interrupt_level_ = bus_interrupt_level_;
if(captured_interrupt_level_ > status_.interrupt_level) { if(status_.would_accept_interrupt(captured_interrupt_level_)) {
MoveToStateSpecific(DoInterrupt); MoveToStateSpecific(DoInterrupt);
} }
MoveToStateSpecific(STOP); MoveToStateSpecific(STOP);
@ -596,7 +596,7 @@ void Processor<BusHandler, dtack_is_implicit, permit_overrun, signal_will_perfor
ReloadInstructionAddress(); ReloadInstructionAddress();
// Head off into an interrupt if one is found. // Head off into an interrupt if one is found.
if(captured_interrupt_level_ > status_.interrupt_level) { if(status_.would_accept_interrupt(captured_interrupt_level_)) {
MoveToStateSpecific(DoInterrupt); MoveToStateSpecific(DoInterrupt);
} }