From ba170f2aae33ee4043e65ad6c4ada3ba1e8981e1 Mon Sep 17 00:00:00 2001 From: Toni Date: Sat, 12 Jul 2025 14:59:45 +0200 Subject: [PATCH] keyboard --- chip8.c | 28 ++++++++++++++++++++++------ 1 file changed, 22 insertions(+), 6 deletions(-) diff --git a/chip8.c b/chip8.c index 6dc6569..d5bb7ed 100644 --- a/chip8.c +++ b/chip8.c @@ -1,5 +1,4 @@ // http://devernay.free.fr/hacks/chip8/C8TECH10.HTM -// TODO: keyboard // TODO: buzzer #include #include @@ -21,6 +20,11 @@ fprintf(stderr, "unrecognized instruction\n"); \ exit(1) +static const uint8_t keyboard_map[] = {KEY_ONE, KEY_TWO, KEY_THREE, KEY_FOUR, + KEY_FIVE, KEY_SIX, KEY_SEVEN, KEY_EIGHT, + KEY_NINE, KEY_Q, KEY_W, KEY_E, + KEY_R, KEY_T, KEY_Y, KEY_U}; + typedef struct CHIP8 { uint8_t *memory; uint16_t pc; @@ -330,10 +334,14 @@ void chip8_step(CHIP8 *c) { case 0xE: { switch (kk) { case 0x9E: - printf("TODO: SKP V%x\n", x); + if (IsKeyDown(keyboard_map[c->reg[x]])) { + c->pc += 2; + } break; case 0xA1: - printf("TODO: SKNP V%x\n", x); + if (!IsKeyDown(keyboard_map[c->reg[x]])) { + c->pc += 2; + } break; default: BAD_INS(); @@ -344,9 +352,17 @@ void chip8_step(CHIP8 *c) { case 0x07: c->reg[x] = c->delay_timer; break; - case 0x0A: - printf("TODO: LD V%x, K\n", x); - break; + case 0x0A: { + bool key_pressed = false; + while (!key_pressed && WindowShouldClose()) { + for (size_t i = 0; i < 16; i++) { + if (IsKeyDown(keyboard_map[i])) { + key_pressed = true; + break; + } + } + } + } break; case 0x15: c->delay_timer = c->reg[x]; break;