summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorLoic Guegan <loic.guegan@mailbox.org>2023-12-25 21:21:20 +0100
committerLoic Guegan <loic.guegan@mailbox.org>2023-12-25 21:21:20 +0100
commitc50ed6ba7358f49b61ef32558630f37f257cb365 (patch)
treef430feaae22ad4bd72620a91962c015868be06b5
parent309e9921f84406947fcb4f3e57f6b23e00906836 (diff)
Minor changes
-rw-r--r--src/Makefile2
-rw-r--r--src/keypad.c28
-rw-r--r--src/keypad.h6
-rw-r--r--src/main.c6
-rw-r--r--src/screen.c2
-rw-r--r--src/vcpu.c13
6 files changed, 51 insertions, 6 deletions
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 <stdio.h>
#include <stdlib.h>
#include <time.h>
@@ -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: