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; ;;