From c50ed6ba7358f49b61ef32558630f37f257cb365 Mon Sep 17 00:00:00 2001 From: Loic Guegan Date: Mon, 25 Dec 2023 21:21:20 +0100 Subject: [PATCH] Minor changes --- src/Makefile | 2 +- src/keypad.c | 28 ++++++++++++++++++++++++++++ src/keypad.h | 6 ++++++ src/main.c | 6 ++++-- src/screen.c | 2 +- src/vcpu.c | 13 +++++++++++-- 6 files changed, 51 insertions(+), 6 deletions(-) create mode 100644 src/keypad.c create mode 100644 src/keypad.h diff --git a/src/Makefile b/src/Makefile index a55169e..d4e52d0 100644 --- a/src/Makefile +++ b/src/Makefile @@ -1,7 +1,7 @@ EXEC=chip-8 -$(EXEC): main.c screen.c mem.c vcpu.c +$(EXEC): main.c screen.c mem.c vcpu.c keypad.c gcc -lraylib $^ -o $@ clean: diff --git a/src/keypad.c b/src/keypad.c new file mode 100644 index 0000000..30b4479 --- /dev/null +++ b/src/keypad.c @@ -0,0 +1,28 @@ +#include "keypad.h" + +int map[]={ + KEY_X, // 0 + KEY_ONE, // 1 + KEY_TWO, // 2 + KEY_THREE, // 3 + KEY_Q, // 4 + KEY_W, // 5 + KEY_E, // 6 + KEY_A, // 7 + KEY_S, // 8 + KEY_D, // 9 + KEY_Z, // A + KEY_C, // B + KEY_FOUR, // C + KEY_R, // D + KEY_F, // E + KEY_V // F +}; + +int KeypadIsPressed(unsigned char c){ + if(c<=0xF){ + if(IsKeyPressed(map[c])) + return 1; + } + return 0; +} diff --git a/src/keypad.h b/src/keypad.h new file mode 100644 index 0000000..d762be4 --- /dev/null +++ b/src/keypad.h @@ -0,0 +1,6 @@ +#pragma once + +#include "raylib.h" + +int KeypadIsPressed(unsigned char c); + diff --git a/src/main.c b/src/main.c index a25ac8f..3c6baed 100644 --- a/src/main.c +++ b/src/main.c @@ -13,7 +13,7 @@ int main(int argc, char *argv[]) // Initialize MemInit(); - MemLoadROM("../roms/chiptest.ch8"); + MemLoadROM("../roms/chip8-test-suite/5-quirks.ch8"); ScreenInit(800,400); VCPUInit(); @@ -21,9 +21,11 @@ int main(int argc, char *argv[]) int i=0; while (!WindowShouldClose()){ + for(int i=0;i<500;i++){ VCPUFetch(); VCPUDecode(); - VCPUExecute(); + VCPUExecute(); + } ScreenUpdate(); } diff --git a/src/screen.c b/src/screen.c index fa4a9c4..b706c4a 100644 --- a/src/screen.c +++ b/src/screen.c @@ -15,7 +15,7 @@ void ScreenInit(int width, int height){ SetTraceLogLevel(LOG_ERROR); // Disable anoying raylib logs InitWindow(width, height, "Chip-8 Emulator"); - SetTargetFPS(200); // Set game to run at 60 frames-per-second + SetTargetFPS(500); // Set game to run at 60 frames-per-second } void ScreenClear() { diff --git a/src/vcpu.c b/src/vcpu.c index 7de8a71..504aa7a 100644 --- a/src/vcpu.c +++ b/src/vcpu.c @@ -1,6 +1,8 @@ #include "vcpu.h" #include "mem.h" #include "screen.h" +#include "keypad.h" + #include #include #include @@ -201,7 +203,14 @@ void VCPUExecute(){ break; case 0xE: - // TODO + if(State.NN==0x9E){ // Skip if keypress in VX + if(KeypadIsPressed(State.V[State.X]&0x0F)){ + State.PC+=2; + } + }else if(State.NN==0xA1){ // Skip if not keypress in VX + if(!KeypadIsPressed(State.V[State.X]&0x0F)) + State.PC+=2; + } break; case 0xF: @@ -236,7 +245,7 @@ void VCPUExecute(){ MemStore(&hundreds,1,State.I); MemStore(&tens,1,State.I+1); MemStore(&units,1,State.I+2); - // printf("hundreds:%d tens:%d units:%d byte:%d\n",hundreds,tens,units,State.V[State.X]); + //printf("hundreds:%d tens:%d units:%d byte:%d\n",hundreds,tens,units,State.V[State.X]); break; case 0x55: