summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorLoic Guegan <loic.guegan@mailbox.org>2023-12-25 09:11:45 +0100
committerLoic Guegan <loic.guegan@mailbox.org>2023-12-25 09:11:45 +0100
commit16f7128a0c81a508940ee1a8e8d1b8fe36f83259 (patch)
tree690523d91c2b66d804e9db98143ff716ef1bba89 /src
parent14e9dd9258eaf62dba3867bb6edc9cd8687125c4 (diff)
Minor changes
Diffstat (limited to 'src')
-rw-r--r--src/main.c9
-rw-r--r--src/mem.c9
-rw-r--r--src/mem.h1
-rw-r--r--src/screen.c10
-rw-r--r--src/screen.h1
-rw-r--r--src/vcpu.c24
-rw-r--r--src/vcpu.h5
7 files changed, 48 insertions, 11 deletions
diff --git a/src/main.c b/src/main.c
index 995f4ed..2263245 100644
--- a/src/main.c
+++ b/src/main.c
@@ -8,13 +8,16 @@ int main(int argc, char *argv[])
// Initialize
MemInit();
MemLoadROM("../roms/2-ibm-logo.ch8");
+
ScreenInit(800,400);
VCPUInit();
-
-
- ScreenSetPixel(0,1,1);
+ // MemDump();
+ int i=0;
while (!WindowShouldClose()){
+ VCPUFetch();
+ VCPUDecode();
+ VCPUExecute();
ScreenUpdate();
}
diff --git a/src/mem.c b/src/mem.c
index c537120..12b039f 100644
--- a/src/mem.c
+++ b/src/mem.c
@@ -22,8 +22,9 @@ void MemCopy(unsigned char *data, int size, int addr){
void MemRead(unsigned char *data, int size, int addr){
int location=addr;
- for(int i=0;i<size;i++)
+ for(int i=0;i<size;i++){
data[i]=memory[addr+i];
+ }
}
void MemLoadROM(char *path){
@@ -38,6 +39,12 @@ void MemLoadROM(char *path){
fclose(ptr);
}
+void MemDump(){
+ for(int addr=0;addr<4096;addr+=2){
+ printf("0x%03x: %02x %02x\n",addr,memory[addr], memory[addr+1]);
+ }
+}
+
unsigned char DEFAULT_FONT[]={
0xF0, 0x90, 0x90, 0x90, 0xF0, // 0
0x20, 0x60, 0x20, 0x20, 0x70, // 1
diff --git a/src/mem.h b/src/mem.h
index eaebc17..3f5eb95 100644
--- a/src/mem.h
+++ b/src/mem.h
@@ -8,3 +8,4 @@ void MemSet(int addr, unsigned char value, int size);
void MemCopy(unsigned char *data, int size, int addr);
void MemRead(unsigned char *data, int size, int addr);
void MemLoadROM(char *path);
+void MemDump();
diff --git a/src/screen.c b/src/screen.c
index 24a1eb8..d312a8d 100644
--- a/src/screen.c
+++ b/src/screen.c
@@ -12,7 +12,8 @@ void ScreenInit(int width, int height){
Screen.originX=(width-64*Screen.pixel)/2;
Screen.originY=(height-32*Screen.pixel)/2;
ScreenClear();
-
+
+ SetTraceLogLevel(LOG_ERROR); // Disable anoying raylib logs
InitWindow(width, height, "Chip-8 Emulator");
SetTargetFPS(60); // Set game to run at 60 frames-per-second
}
@@ -43,6 +44,13 @@ void ScreenSetPixel(int x, int y, unsigned char state){
Screen.pixels[x+y*64]=(state==0) ? 0: 1;
}
+void ScreenPixelFlip(int x, int y){
+ if(Screen.pixels[x+y*64]==0)
+ Screen.pixels[x+y*64]=1;
+ else
+ Screen.pixels[x+y*64]=0;
+}
+
void ScreenClose(){
CloseWindow(); // Close window and OpenGL context
}
diff --git a/src/screen.h b/src/screen.h
index d239c0d..9faf781 100644
--- a/src/screen.h
+++ b/src/screen.h
@@ -16,5 +16,6 @@ typedef struct SCREEN_DATA {
void ScreenInit(int width, int height);
void ScreenClear();
void ScreenSetPixel(int x, int y, unsigned char state);
+void ScreenPixelFlip(int x, int y);
void ScreenUpdate();
void ScreenClose();
diff --git a/src/vcpu.c b/src/vcpu.c
index 3bce28a..e722bb0 100644
--- a/src/vcpu.c
+++ b/src/vcpu.c
@@ -1,7 +1,7 @@
#include "vcpu.h"
#include "mem.h"
#include "screen.h"
-
+#include <stdio.h>
// Current VCPU state
VCPU_State State;
@@ -11,7 +11,11 @@ void VCPUInit(){
}
void VCPUFetch(){
- MemRead((char *)&(State.opcode),2,State.PC);
+ unsigned char byte[2];
+ MemRead(byte,2,State.PC); // Little indian to -1 no +1
+ State.opcode=byte[0];
+ State.opcode=State.opcode<<8;
+ State.opcode=State.opcode | byte[1];
State.PC+=2;
}
@@ -24,7 +28,7 @@ void VCPUDecode(){
}
void VCPUExecute(){
- switch(State.opcode & 0xF){
+ switch(State.opcode >> 12){
case 0x0:
ScreenClear();
break
@@ -45,6 +49,18 @@ void VCPUExecute(){
State.I=State.NNN;
break
;;
-
+ case 0xD:
+ int X=State.V[State.X]%63;
+ int Y=State.V[State.Y]%31;
+ State.V[0xF]=0; // Set flag to 0
+ for(char row=0;row<State.N;row++){
+
+ }
+ break;
+ ;;
}
}
+
+void VCPUDump(){
+ printf("opcode: 0x%04x\n",State.opcode&0xFFFF);
+}
diff --git a/src/vcpu.h b/src/vcpu.h
index c85744d..33a1492 100644
--- a/src/vcpu.h
+++ b/src/vcpu.h
@@ -21,15 +21,16 @@ typedef struct VCPU_State {
unsigned char ST;
// Intruction (opcode + decoded fields)
- short opcode;
+ unsigned short opcode;
char X;
char Y;
char N;
char NN;
- short NNN;
+ unsigned short NNN;
} VCPU_State;
void VCPUInit();
void VCPUFetch();
void VCPUDecode();
void VCPUExecute();
+void VCPUDump();