implemented keypad
This commit is contained in:
@@ -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;
|
||||
|
||||
Reference in New Issue
Block a user