implemented keypad

This commit is contained in:
2025-03-15 01:58:27 -04:00
parent 19506dd218
commit bba46296b1
6 changed files with 83 additions and 13 deletions

View File

@@ -139,13 +139,37 @@ void Interpreter::tick() {
case 0xD000: // DXYN - draw
executeDraw(mvReg[iRegDst], mvReg[iRegSrc], opcode);
break;
case 0xE000: // EX9E, EXA1 - keypad access
case 0xE000: // keypad access
switch(inst & 0xF0FF) {
case 0xE09E: // EX9E - skip if key pressed
if(mrKeypad.isKeyPressed(mvReg[iRegDst])) {
mvSpecialReg[SR_PC] += 2;
}
break;
case 0xE0A1: // EXA1 - skip if key not pressed
if(!mrKeypad.isKeyPressed(mvReg[iRegDst])) {
mvSpecialReg[SR_PC] += 2;
}
break;
default:
throw std::invalid_argument("not implemented");
break;
}
break;
case 0xF000: // several unique instructions
switch(inst & 0xF0FF) {
case 0xF007: // FX07 - read timer register
mvReg[iRegDst] = mrDelayTimer.get();
break;
case 0xF00A: // FX0A - wait for a keypress
mvSpecialReg[SR_PC] -= 2;
for(int i = KEY_0; i < KEY_0 + KEY_COUNT; i++) {
if(mrKeypad.isKeyPressed(i)) {
mvSpecialReg[SR_PC] += 2;
break;
}
}
break;
case 0xF015: // FX15 - set timer register
mrDelayTimer.set(mvReg[iRegDst]);
break;