1
0
mirror of https://github.com/TomHarte/CLK.git synced 2024-07-19 10:29:08 +00:00

Ensures updates even when the event queue is empty.

This commit is contained in:
Thomas Harte 2019-10-17 23:59:43 -04:00
parent 9ab49065cd
commit e095a622d3

View File

@ -16,30 +16,33 @@ void Line::set_writer_clock_rate(int clock_rate) {
void Line::advance_writer(int cycles) { void Line::advance_writer(int cycles) {
remaining_delays_ = std::max(remaining_delays_ - cycles, 0); remaining_delays_ = std::max(remaining_delays_ - cycles, 0);
while(!events_.empty()) { if(events_.empty()) {
if(events_.front().delay < cycles) { write_cycles_since_delegate_call_ += cycles;
cycles -= events_.front().delay; if(write_cycles_since_delegate_call_ > 256) update_delegate(level_);
write_cycles_since_delegate_call_ += events_.front().delay; } else {
const auto old_level = level_; while(!events_.empty()) {
if(events_.front().delay < cycles) {
cycles -= events_.front().delay;
write_cycles_since_delegate_call_ += events_.front().delay;
const auto old_level = level_;
auto iterator = events_.begin() + 1; auto iterator = events_.begin() + 1;
while(iterator != events_.end() && iterator->type != Event::Delay) { while(iterator != events_.end() && iterator->type != Event::Delay) {
level_ = iterator->type == Event::SetHigh; level_ = iterator->type == Event::SetHigh;
++iterator; ++iterator;
} }
events_.erase(events_.begin(), iterator); events_.erase(events_.begin(), iterator);
if(old_level != level_) { if(old_level != level_) {
update_delegate(old_level); update_delegate(old_level);
}
} else {
events_.front().delay -= cycles;
write_cycles_since_delegate_call_ += cycles;
break;
} }
} else {
events_.front().delay -= cycles;
write_cycles_since_delegate_call_ += cycles;
break;
} }
} }
// TODO: some sort of ongoing update_delegate() ?
} }
void Line::write(bool level) { void Line::write(bool level) {