RL02 tweaks

This commit is contained in:
folkert van heusden 2024-04-17 17:15:13 +02:00
parent 829c94a456
commit e99d1bb6d0
Signed by untrusted user who does not match committer: folkert
GPG key ID: 6B6455EDFEED3BD1
3 changed files with 23 additions and 6 deletions

22
cpu.cpp
View file

@ -327,7 +327,21 @@ void cpu::setPSW_flags_nzv(const uint16_t value, const word_mode_t word_mode)
setPSW_v(false); setPSW_v(false);
} }
bool cpu::check_queued_interrupts() bool cpu::check_pending_interrupts() const
{
uint8_t start_level = getPSW_spl() + 1;
for(uint8_t i=start_level; i < 8; i++) {
auto interrupts = queued_interrupts.find(i);
if (interrupts->second.empty() == false)
return true;
}
return false;
}
bool cpu::execute_any_pending_interrupt()
{ {
#if defined(BUILD_FOR_RP2040) #if defined(BUILD_FOR_RP2040)
xSemaphoreTake(qi_lock, portMAX_DELAY); xSemaphoreTake(qi_lock, portMAX_DELAY);
@ -380,7 +394,7 @@ void cpu::queue_interrupt(const uint8_t level, const uint8_t vector)
#endif #endif
auto it = queued_interrupts.find(level); auto it = queued_interrupts.find(level);
assert(it != queued_interrupts.end());
it->second.insert(vector); it->second.insert(vector);
#if defined(BUILD_FOR_RP2040) #if defined(BUILD_FOR_RP2040)
@ -1573,12 +1587,14 @@ bool cpu::misc_operations(const uint16_t instr)
case 0b0000000000000001: // WAIT case 0b0000000000000001: // WAIT
{ {
uint64_t start = get_us(); uint64_t start = get_us();
#if defined(BUILD_FOR_RP2040) #if defined(BUILD_FOR_RP2040)
uint8_t rc = 0; uint8_t rc = 0;
xQueueReceive(qi_q, &rc, 0); xQueueReceive(qi_q, &rc, 0);
#else #else
std::unique_lock<std::mutex> lck(qi_lock); std::unique_lock<std::mutex> lck(qi_lock);
if (check_pending_interrupts() == false)
qi_cv.wait(lck); qi_cv.wait(lck);
#endif #endif
uint64_t end = get_us(); uint64_t end = get_us();
@ -2285,7 +2301,7 @@ void cpu::step()
if (!b->isMMR1Locked()) if (!b->isMMR1Locked())
b->clearMMR1(); b->clearMMR1();
if (any_queued_interrupts && check_queued_interrupts()) { if (any_queued_interrupts && execute_any_pending_interrupt()) {
if (!b->isMMR1Locked()) if (!b->isMMR1Locked())
b->clearMMR1(); b->clearMMR1();
} }

3
cpu.h
View file

@ -75,7 +75,8 @@ private:
std::atomic_uint32_t *const event { nullptr }; std::atomic_uint32_t *const event { nullptr };
bool check_queued_interrupts(); bool check_pending_interrupts() const; // needs the 'qi_lock'-lock
bool execute_any_pending_interrupt();
uint16_t addRegister(const int nr, const rm_selection_t mode_selection, const uint16_t value); uint16_t addRegister(const int nr, const rm_selection_t mode_selection, const uint16_t value);

View file

@ -155,7 +155,7 @@ void rl02::writeWord(const uint16_t addr, uint16_t v)
if (registers[(RL02_CSR - RL02_BASE) / 2] & 64) { // interrupt enable? if (registers[(RL02_CSR - RL02_BASE) / 2] & 64) { // interrupt enable?
DOLOG(debug, false, "RL02 triggering interrupt"); DOLOG(debug, false, "RL02 triggering interrupt");
b->getCpu()->queue_interrupt(5, 0160); b->getCpu()->queue_interrupt(4, 0160);
} }
*disk_read_acitivity = false; *disk_read_acitivity = false;