mirror of
https://github.com/TomHarte/CLK.git
synced 2025-02-27 00:30:26 +00:00
Ensures updates even when the event queue is empty.
This commit is contained in:
parent
696af5c3a6
commit
2e86dada1d
@ -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) {
|
||||||
|
Loading…
x
Reference in New Issue
Block a user