decoupled timers from interpreter tick rate
This commit is contained in:
@@ -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();
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user