From c2646a415f86c4659820354096aac506913b19d9 Mon Sep 17 00:00:00 2001 From: Thomas Harte Date: Mon, 9 Dec 2019 19:23:08 -0500 Subject: [PATCH] Switch to faster timer implementation; it seems to work. --- Components/68901/MFP68901.cpp | 27 +++++++-------------------- 1 file changed, 7 insertions(+), 20 deletions(-) diff --git a/Components/68901/MFP68901.cpp b/Components/68901/MFP68901.cpp index b68b8be9b..f61fffffa 100644 --- a/Components/68901/MFP68901.cpp +++ b/Components/68901/MFP68901.cpp @@ -178,28 +178,15 @@ void MFP68901::write(int address, uint8_t value) { void MFP68901::run_for(HalfCycles time) { cycles_left_ += time; - // TODO: this is the stupidest possible implementation. Improve. - int cycles = int(cycles_left_.flush().as_integral()); - while(cycles--) { - for(int c = 0; c < 4; ++c) { - if(timers_[c].mode >= TimerMode::Delay) { - --timers_[c].divisor; - if(!timers_[c].divisor) { - timers_[c].divisor = timers_[c].prescale; - decrement_timer(c, 1); - } - } + const int cycles = int(cycles_left_.flush().as_integral()); + for(int c = 0; c < 4; ++c) { + if(timers_[c].mode >= TimerMode::Delay) { + const int dividend = (cycles + timers_[c].prescale - timers_[c].divisor); + const int decrements = dividend / timers_[c].prescale; + timers_[c].divisor = timers_[c].prescale - (dividend % timers_[c].prescale); + if(decrements) decrement_timer(c, decrements); } } -// const int cycles = int(cycles_left_.flush().as_integral()); -// for(int c = 0; c < 4; ++c) { -// if(timers_[c].mode >= TimerMode::Delay) { -// const int dividend = (cycles + timers_[c].prescale - timers_[c].divisor); -// const int decrements = dividend / timers_[c].prescale; -// timers_[c].divisor = timers_[c].prescale - (dividend % timers_[c].prescale); -// if(decrements) decrement_timer(c, decrements); -// } -// } } HalfCycles MFP68901::get_next_sequence_point() {