move to raylib
This commit is contained in:
2
build.sh
2
build.sh
@@ -1,3 +1,3 @@
|
|||||||
#!/bin/bash
|
#!/bin/bash
|
||||||
set -xe
|
set -xe
|
||||||
cc -O3 -o chip8 chip8.c -lSDL2
|
cc -O3 -o chip8 chip8.c -L/usr/local/lib/libraylib.a -lraylib -lm
|
||||||
44
chip8.c
44
chip8.c
@@ -1,8 +1,11 @@
|
|||||||
// http://devernay.free.fr/hacks/chip8/C8TECH10.HTM
|
// http://devernay.free.fr/hacks/chip8/C8TECH10.HTM
|
||||||
#include <SDL2/SDL.h>
|
// TODO: keyboard
|
||||||
|
// TODO: buzzer
|
||||||
|
#include <raylib.h>
|
||||||
#include <stdint.h>
|
#include <stdint.h>
|
||||||
#include <stdio.h>
|
#include <stdio.h>
|
||||||
#include <stdlib.h>
|
#include <stdlib.h>
|
||||||
|
#include <string.h>
|
||||||
|
|
||||||
#define READ_INS() \
|
#define READ_INS() \
|
||||||
uint8_t low = c->memory[c->pc++]; \
|
uint8_t low = c->memory[c->pc++]; \
|
||||||
@@ -200,6 +203,13 @@ void chip8_disassemble(CHIP8 *c, size_t ins_count) {
|
|||||||
|
|
||||||
void chip8_step(CHIP8 *c) {
|
void chip8_step(CHIP8 *c) {
|
||||||
do {
|
do {
|
||||||
|
if (c->delay_timer > 0) {
|
||||||
|
c->delay_timer--;
|
||||||
|
}
|
||||||
|
if (c->sound_timer > 0) {
|
||||||
|
c->sound_timer--;
|
||||||
|
}
|
||||||
|
|
||||||
READ_INS();
|
READ_INS();
|
||||||
|
|
||||||
switch ((ins >> 12) & 0xF) {
|
switch ((ins >> 12) & 0xF) {
|
||||||
@@ -213,7 +223,9 @@ void chip8_step(CHIP8 *c) {
|
|||||||
c->sp--;
|
c->sp--;
|
||||||
break;
|
break;
|
||||||
default:
|
default:
|
||||||
c->pc = nnn;
|
// >This instruction is only used on the old computers on which Chip-8
|
||||||
|
// >was originally implemented. It is ignored by modern interpreters.
|
||||||
|
break;
|
||||||
}
|
}
|
||||||
} break;
|
} break;
|
||||||
case 0x1: {
|
case 0x1: {
|
||||||
@@ -394,33 +406,25 @@ int main(int argc, char *argv[]) {
|
|||||||
c.memory[0x200 + i] = buffer[i];
|
c.memory[0x200 + i] = buffer[i];
|
||||||
}
|
}
|
||||||
|
|
||||||
SDL_Init(SDL_INIT_VIDEO);
|
InitWindow(640, 320, "CHIP-8");
|
||||||
SDL_Window *window =
|
SetTargetFPS(60);
|
||||||
SDL_CreateWindow("CHIP-8", SDL_WINDOWPOS_UNDEFINED,
|
|
||||||
SDL_WINDOWPOS_UNDEFINED, 640, 320, SDL_WINDOW_SHOWN);
|
|
||||||
SDL_Surface *surface = SDL_GetWindowSurface(window);
|
|
||||||
|
|
||||||
while (1) {
|
|
||||||
SDL_Event e;
|
|
||||||
while (SDL_PollEvent(&e)) {
|
|
||||||
if (e.type == SDL_QUIT) {
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
|
while (!WindowShouldClose()) {
|
||||||
|
for (int i = 0; i < 25; i++) {
|
||||||
chip8_step(&c);
|
chip8_step(&c);
|
||||||
|
}
|
||||||
|
|
||||||
SDL_FillRect(surface, NULL, SDL_MapRGB(surface->format, 0xFF, 0xFF, 0xFF));
|
BeginDrawing();
|
||||||
|
|
||||||
|
ClearBackground(WHITE);
|
||||||
for (size_t y = 0; y < 32; y++) {
|
for (size_t y = 0; y < 32; y++) {
|
||||||
for (size_t x = 0; x < 64; x++) {
|
for (size_t x = 0; x < 64; x++) {
|
||||||
if (c.display[x + y * 64] == 1) {
|
if (c.display[x + y * 64] == 1) {
|
||||||
SDL_Rect rect = {x * 10, y * 10, 10, 10};
|
DrawRectangle(x * 10, y * 10, 10, 10, BLACK);
|
||||||
SDL_FillRect(surface, &rect,
|
|
||||||
SDL_MapRGB(surface->format, 0x00, 0x00, 0x00));
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
SDL_UpdateWindowSurface(window);
|
EndDrawing();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
Reference in New Issue
Block a user