summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorLoic Guegan <loic.guegan@mailbox.org>2023-12-25 10:01:40 +0100
committerLoic Guegan <loic.guegan@mailbox.org>2023-12-25 10:01:40 +0100
commit7642efad5ad58c4aec26eec3c8bb879f69272eaf (patch)
treea8af12fc0f51855b6b1b4008453bc91198c096f8
parent8fd3d27abe8e5da08ce99adcf02616324eef4e79 (diff)
Minor changes
-rw-r--r--roms/logo_chip8.ch8bin0 -> 260 bytes
-rw-r--r--roms/logo_ibm.ch8bin0 -> 132 bytes
-rw-r--r--roms/logo_ibm2.ch8 (renamed from roms/2-ibm-logo.ch8)bin132 -> 132 bytes
-rw-r--r--src/main.c2
-rw-r--r--src/screen.c14
-rw-r--r--src/screen.h4
-rw-r--r--src/vcpu.c19
7 files changed, 31 insertions, 8 deletions
diff --git a/roms/logo_chip8.ch8 b/roms/logo_chip8.ch8
new file mode 100644
index 0000000..8f83105
--- /dev/null
+++ b/roms/logo_chip8.ch8
Binary files differ
diff --git a/roms/logo_ibm.ch8 b/roms/logo_ibm.ch8
new file mode 100644
index 0000000..113338e
--- /dev/null
+++ b/roms/logo_ibm.ch8
Binary files differ
diff --git a/roms/2-ibm-logo.ch8 b/roms/logo_ibm2.ch8
index d60dac8..d60dac8 100644
--- a/roms/2-ibm-logo.ch8
+++ b/roms/logo_ibm2.ch8
Binary files differ
diff --git a/src/main.c b/src/main.c
index 2263245..85dcb2c 100644
--- a/src/main.c
+++ b/src/main.c
@@ -7,7 +7,7 @@ int main(int argc, char *argv[])
// Initialize
MemInit();
- MemLoadROM("../roms/2-ibm-logo.ch8");
+ MemLoadROM("../roms/logo_chip8.ch8");
ScreenInit(800,400);
VCPUInit();
diff --git a/src/screen.c b/src/screen.c
index d312a8d..2744ee1 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(60); // Set game to run at 60 frames-per-second
+ SetTargetFPS(80); // Set game to run at 60 frames-per-second
}
void ScreenClear() {
@@ -40,8 +40,11 @@ void ScreenUpdate(){
EndDrawing();
}
-void ScreenSetPixel(int x, int y, unsigned char state){
- Screen.pixels[x+y*64]=(state==0) ? 0: 1;
+char ScreenPixelApply(int x, int y, unsigned char state){
+ if(Screen.pixels[x+y*64] != 0 && state != 0)
+ return 1;
+ Screen.pixels[x+y*64]=state;
+ return 0;
}
void ScreenPixelFlip(int x, int y){
@@ -51,6 +54,11 @@ void ScreenPixelFlip(int x, int y){
Screen.pixels[x+y*64]=0;
}
+void ScreenWH(int *width, int *height){
+ *width=64;
+ *height=32;
+}
+
void ScreenClose(){
CloseWindow(); // Close window and OpenGL context
}
diff --git a/src/screen.h b/src/screen.h
index 9faf781..7578552 100644
--- a/src/screen.h
+++ b/src/screen.h
@@ -15,7 +15,7 @@ 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);
+char ScreenPixelApply(int x, int y, unsigned char state);
+void ScreenWH(int *width, int *height);
void ScreenUpdate();
void ScreenClose();
diff --git a/src/vcpu.c b/src/vcpu.c
index 45b9aca..80323e3 100644
--- a/src/vcpu.c
+++ b/src/vcpu.c
@@ -8,6 +8,7 @@ VCPU_State State;
void VCPUInit(){
State.PC=ADDR_ROM;
+ State.S=0;
}
void VCPUFetch(){
@@ -54,12 +55,26 @@ void VCPUExecute(){
State.I=State.NNN;
break
;;
- case 0xD:
+ case 0xD: // Draw a sprite
int X=State.V[State.X]%63;
int Y=State.V[State.Y]%31;
State.V[REG_FLAG]=0; // Set flag to 0
+ int width,height;
+ ScreenWH(&width,&height);
for(char row=0;row<State.N;row++){
-
+ // Stop if row out of screen
+ if(Y+row>=height)
+ break;
+ char sprite;
+ MemRead(&sprite,1,State.I+row); // Load sprite
+ // Draw sprite
+ for(int shift=0;shift<8;shift++){
+ // Stop if column is out of screen
+ if(X+shift >= width)
+ break;
+ if(ScreenPixelApply(X+shift,Y+row,(sprite>>(7-shift))&0x1))
+ State.V[REG_FLAG]=1;
+ }
}
break;
;;