diff --git a/Machines/Enterprise/Dave.cpp b/Machines/Enterprise/Dave.cpp index f3b7938cf..81b0f64da 100644 --- a/Machines/Enterprise/Dave.cpp +++ b/Machines/Enterprise/Dave.cpp @@ -234,12 +234,14 @@ void TimedInterruptSource::write(uint16_t address, uint8_t value) { } } +// TODO: don't muck about with update_channel if channels have a reload value of 0. + void TimedInterruptSource::update_channel(int c, bool is_linked, int decrement) { if(channels_[c].sync) { channels_[c].value = channels_[c].reload; } else { channels_[c].value -= decrement; - if(channels_[c].value < 0) { + while(channels_[c].value < 0) { channels_[c].value += channels_[c].reload + 1; if(is_linked) { @@ -248,7 +250,7 @@ void TimedInterruptSource::update_channel(int c, bool is_linked, int decrement) } programmable_level_ = channels_[c].level; } - channels_[c].value ^= true; + channels_[c].level ^= true; } } diff --git a/Machines/Enterprise/Dave.hpp b/Machines/Enterprise/Dave.hpp index cf3d518ea..b0d986e1f 100644 --- a/Machines/Enterprise/Dave.hpp +++ b/Machines/Enterprise/Dave.hpp @@ -147,7 +147,7 @@ class TimedInterruptSource { } rate_ = InterruptRate::OnekHz; struct Channel { - uint16_t value = 100, reload = 100; + int value = 100, reload = 100; bool sync = false; bool level = false; } channels_[2]; diff --git a/Machines/Enterprise/Enterprise.cpp b/Machines/Enterprise/Enterprise.cpp index 87ecbe20a..bf2baff9f 100644 --- a/Machines/Enterprise/Enterprise.cpp +++ b/Machines/Enterprise/Enterprise.cpp @@ -399,10 +399,6 @@ template class ConcreteMachine: interrupt_mask_ = *cycle.value & 0x55; interrupt_state_ &= ~*cycle.value; update_interrupts(); - - if(interrupt_mask_ & 0x41) { - printf("Unimplemented interrupts requested: %02x\n", interrupt_mask_ & 0x45); - } break; case 0xb5: active_key_line_ = *cycle.value & 0xf;