diff --git a/roms/logo_chip8.ch8 b/roms/logo_chip8.ch8 new file mode 100644 index 0000000..8f83105 Binary files /dev/null and b/roms/logo_chip8.ch8 differ diff --git a/roms/logo_ibm.ch8 b/roms/logo_ibm.ch8 new file mode 100644 index 0000000..113338e Binary files /dev/null and b/roms/logo_ibm.ch8 differ 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=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; ;;