diff --git a/Interpreter.cpp b/Interpreter.cpp index 2992a86..213a162 100644 --- a/Interpreter.cpp +++ b/Interpreter.cpp @@ -145,16 +145,16 @@ void Interpreter::tick() { case 0xF000: // several unique instructions switch(inst & 0xF0FF) { case 0xF007: // FX07 - read timer register - mvReg[iRegDst] = (mvSpecialReg[SR_T1] + mcTicksPerSecond - 1) / mcTicksPerSecond; + mvReg[iRegDst] = (mvSpecialReg[SR_T1] * scTimerFreq + (mcTicksPerSecond - 1)) / mcTicksPerSecond; break; case 0xF015: // FX15 - set timer register - mvSpecialReg[SR_T1] = mcTicksPerSecond * mvReg[iRegDst]; + mvSpecialReg[SR_T1] = (mcTicksPerSecond * mvReg[iRegDst]) / scTimerFreq; break; case 0xF018: // FX18 - set sound timer register - if(mvSpecialReg[SR_T1] == 0 && mvReg[iRegDst] != 0) { + if(mvSpecialReg[SR_T2] == 0 && mvReg[iRegDst] != 0) { mrBuzzer.on(); } - mvSpecialReg[SR_T1] = mcTicksPerSecond * mvReg[iRegDst]; + mvSpecialReg[SR_T2] = (mcTicksPerSecond * mvReg[iRegDst]) / scTimerFreq; break; case 0xF01E: // FX1E - add to I mvSpecialReg[SR_I] += mvReg[iRegDst]; diff --git a/Interpreter.hpp b/Interpreter.hpp index 83c38d2..362da0c 100644 --- a/Interpreter.hpp +++ b/Interpreter.hpp @@ -16,6 +16,7 @@ private: public: constexpr static sreg_t scLowRestFontAddr = 0x0000; constexpr static sreg_t scResetVector = 0x0200; + constexpr static sreg_t scTimerFreq = 60; constexpr static size_t scMemorySize = 4096; enum {