diff --git a/Machines/Acorn/Electron/Electron.cpp b/Machines/Acorn/Electron/Electron.cpp index 511fbe7a6..eb69eced0 100644 --- a/Machines/Acorn/Electron/Electron.cpp +++ b/Machines/Acorn/Electron/Electron.cpp @@ -687,6 +687,9 @@ template <bool has_scsi_bus> class ConcreteMachine: } inline void signal_interrupt(Interrupt interrupt) { + if(!interrupt) { + return; + } interrupt_status_ |= interrupt; evaluate_interrupts(); } diff --git a/Machines/Acorn/Electron/Video.cpp b/Machines/Acorn/Electron/Video.cpp index b5e743764..71ba7dc2c 100644 --- a/Machines/Acorn/Electron/Video.cpp +++ b/Machines/Acorn/Electron/Video.cpp @@ -237,18 +237,27 @@ void VideoOutput::run_for(const Cycles cycles) { const auto start_position = output_position_; output_position_ = (output_position_ + number_of_cycles) % cycles_per_frame; - if( - (start_position < real_time_clock_interrupt_1 && output_position_ >= real_time_clock_interrupt_1) || - (start_position < real_time_clock_interrupt_2 && output_position_ >= real_time_clock_interrupt_2) - ) { - interrupts_ = Electron::Interrupt(interrupts_ | Electron::Interrupt::RealTimeClock); - } + const auto test_range = [&](int start, int end) { + if( + (start < real_time_clock_interrupt_1 && end >= real_time_clock_interrupt_1) || + (start < real_time_clock_interrupt_2 && end >= real_time_clock_interrupt_2) + ) { + interrupts_ = Electron::Interrupt(interrupts_ | Electron::Interrupt::RealTimeClock); + } - if( - (start_position < display_end_interrupt_1 && output_position_ >= display_end_interrupt_1) || - (start_position < display_end_interrupt_2 && output_position_ >= display_end_interrupt_2) - ) { - interrupts_ = Electron::Interrupt(interrupts_ | Electron::Interrupt::DisplayEnd); + if( + (start < display_end_interrupt_1 && end >= display_end_interrupt_1) || + (start < display_end_interrupt_2 && end >= display_end_interrupt_2) + ) { + interrupts_ = Electron::Interrupt(interrupts_ | Electron::Interrupt::DisplayEnd); + } + }; + + if(output_position_ >= start_position) { + test_range(start_position, output_position_); + } else { + test_range(start_position, cycles_per_frame); + test_range(0, output_position_); } while(number_of_cycles) {