From 7642efad5ad58c4aec26eec3c8bb879f69272eaf Mon Sep 17 00:00:00 2001
From: Loic Guegan <loic.guegan@mailbox.org>
Date: Mon, 25 Dec 2023 10:01:40 +0100
Subject: [PATCH] Minor changes

---
 roms/logo_chip8.ch8                    | Bin 0 -> 260 bytes
 roms/logo_ibm.ch8                      | Bin 0 -> 132 bytes
 roms/{2-ibm-logo.ch8 => logo_ibm2.ch8} | Bin
 src/main.c                             |   2 +-
 src/screen.c                           |  14 +++++++++++---
 src/screen.h                           |   4 ++--
 src/vcpu.c                             |  19 +++++++++++++++++--
 7 files changed, 31 insertions(+), 8 deletions(-)
 create mode 100644 roms/logo_chip8.ch8
 create mode 100644 roms/logo_ibm.ch8
 rename roms/{2-ibm-logo.ch8 => logo_ibm2.ch8} (100%)

diff --git a/roms/logo_chip8.ch8 b/roms/logo_chip8.ch8
new file mode 100644
index 0000000000000000000000000000000000000000..8f831056643461a686ba5fa4d66fb798f3332af0
GIT binary patch
literal 260
zcmZR0kjR+8u_)kze1gEDcpxdUC=W;~EUE>P8jE^>q`{)u7vvKKfT~sjc>;@e0!fKQ
zCxE2FqU%6XW6?7pX|U+)1$iMqekKrLV34;jeDL(aiv_$|8X6i53=%tbSXkKaXOLXF
zci~(H1|C^iMqb&ujK?)KHPsmye*8Ii3<wxJy*xdv85kHCnVFdxKNw74U}ymH{vB^_
zZa((s`2!#*w3laKU<X-YX#oU4QyCZxy(%57??M3s!vYJ11rq1}{5Wvs&XJ=G3<fSL
lBFP__+1b_8l?xddH2PMoSaz-*XhHkGKMV{B6FxK)004?nWD@`Y

literal 0
HcmV?d00001

diff --git a/roms/logo_ibm.ch8 b/roms/logo_ibm.ch8
new file mode 100644
index 0000000000000000000000000000000000000000..113338e67097e0a2ad227e5b79b3a5d1a586a660
GIT binary patch
literal 132
zcmZR0ut+O`Cz0cVd;#Yo%M0?0JPJT;mPO$}l4DUCm@K^@FQoCG;Xi{76av{Gt_6cV
z5Ly6P{~H({0AT|Vg6SU&e;Dk5a@Gu%3_lotFf*_-@H6aZ_|5Q{;W2|VOes`300ZwW
A9{>OV

literal 0
HcmV?d00001

diff --git a/roms/2-ibm-logo.ch8 b/roms/logo_ibm2.ch8
similarity index 100%
rename from roms/2-ibm-logo.ch8
rename to roms/logo_ibm2.ch8
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;
     ;;