decoupled timers from interpreter tick rate

This commit is contained in:
2025-03-14 20:41:08 -04:00
parent 22526c1b90
commit 19506dd218
7 changed files with 67 additions and 32 deletions

View File

@@ -44,13 +44,14 @@ constexpr uint8_t gcvLowResFontData[80] = {
0xF0, 0x80, 0xF0, 0x80, 0x80
};
Interpreter::Interpreter(unsigned ticksPerSecond, Display &display, Buzzer &buzzer, Keypad &keypad):
Interpreter::Interpreter(Display &display, Buzzer &buzzer, Keypad &keypad, CountdownTimer &delayTimer, CountdownTimer &soundTimer):
mvMemory(scMemorySize),
mCallStack{},
mrDisplay{display},
mrBuzzer{buzzer},
mrKeypad{keypad},
mcTicksPerSecond{ticksPerSecond},
mrDelayTimer(delayTimer),
mrSoundTimer(soundTimer),
mvSpecialReg{},
mvReg{},
mIsHighResMode{false} {
@@ -143,16 +144,16 @@ void Interpreter::tick() {
case 0xF000: // several unique instructions
switch(inst & 0xF0FF) {
case 0xF007: // FX07 - read timer register
mvReg[iRegDst] = (mvSpecialReg[SR_T1] * scTimerFreq + (mcTicksPerSecond - 1)) / mcTicksPerSecond;
mvReg[iRegDst] = mrDelayTimer.get();
break;
case 0xF015: // FX15 - set timer register
mvSpecialReg[SR_T1] = (mcTicksPerSecond * mvReg[iRegDst]) / scTimerFreq;
mrDelayTimer.set(mvReg[iRegDst]);
break;
case 0xF018: // FX18 - set sound timer register
if(mvSpecialReg[SR_T2] == 0 && mvReg[iRegDst] != 0) {
if(mvReg[iRegDst] != 0) {
mrBuzzer.on();
}
mvSpecialReg[SR_T2] = (mcTicksPerSecond * mvReg[iRegDst]) / scTimerFreq;
mrSoundTimer.set(mvReg[iRegDst]);
break;
case 0xF01E: // FX1E - add to I
mvSpecialReg[SR_I] += mvReg[iRegDst];
@@ -182,15 +183,8 @@ void Interpreter::tick() {
break;
}
// decrement timers
if(mvSpecialReg[SR_T1] > 0) {
mvSpecialReg[SR_T1] -= 1;
}
if(mvSpecialReg[SR_T2] > 0) {
mvSpecialReg[SR_T2] -= 1;
if(mvSpecialReg[SR_T2] == 0) {
mrBuzzer.off();
}
if(mrSoundTimer.get() == 0) {
mrBuzzer.off();
}
}