diff --git a/cpu.cpp b/cpu.cpp index 03c74d9..43111c9 100644 --- a/cpu.cpp +++ b/cpu.cpp @@ -289,6 +289,8 @@ void cpu::queue_interrupt(const uint8_t level, const uint8_t vector) it->second.insert(vector); + qi_cv.notify_all(); + DOLOG(debug, true, "Queueing interrupt vector %o (IPL %d, current: %d), n: %zu", vector, level, getPSW_spl(), it->second.size()); } @@ -1485,6 +1487,14 @@ bool cpu::misc_operations(const uint16_t instr) return true; case 0b0000000000000001: // WAIT + { + std::unique_lock lck(qi_lock); + + qi_cv.wait(lck); + } + + DOLOG(debug, false, "WAIT returned"); + return true; case 0b0000000000000010: // RTI diff --git a/cpu.h b/cpu.h index 11163ae..6eca542 100644 --- a/cpu.h +++ b/cpu.h @@ -1,8 +1,9 @@ -// (C) 2018-2022 by Folkert van Heusden +// (C) 2018-2023 by Folkert van Heusden // Released under Apache License v2.0 #pragma once #include +#include #include #include #include @@ -39,7 +40,8 @@ private: // level, vector std::map > queued_interrupts; - std::mutex qi_lock; + std::mutex qi_lock; + std::condition_variable qi_cv; std::set breakpoints;