diff options
-rw-r--r-- | .gitignore | 3 | ||||
-rw-r--r-- | Makefile | 19 | ||||
-rw-r--r-- | test.c | 117 |
3 files changed, 113 insertions, 26 deletions
@@ -1,2 +1,5 @@ gb.c *.o +test +*.gb +out.png diff --git a/Makefile b/Makefile new file mode 100644 index 0000000..79cc3c5 --- /dev/null +++ b/Makefile @@ -0,0 +1,19 @@ +OBJS=gb.o test.o lodepng.o +CFLAGS=-W -Wall -pedantic -Werror -Wextra -std=c11 -O3 +APP=./test + +.PHONY=all clean test + +all: $(APP) + +gb.c: ops.yaml + ./gen.rb > gb.c + +$(APP): $(OBJS) + $(CC) -o $(APP) $(OBJS) + +%.o: %.c gb.h + $(CC) -c $(CFLAGS) $< + +clean: + $(RM) $(OBJS) $(APP) @@ -10,6 +10,7 @@ #include "gb.h" #define NUM_FRAMES 600 +#define NUM_STEPS 100 static uint32_t file_size( @@ -60,35 +61,99 @@ load( // buffer for rendered frames static uint8_t frames[NUM_FRAMES * GB_FRAME_SIZE]; -int main(int argc, char *argv[]) { - for (int i = 1; i < argc; i++) { - uint32_t rom_size = 0; - const uint8_t *rom_data = load(argv[i], &rom_size); - fprintf(stderr, "loaded \"%s\" (%u bytes)\n", argv[i], rom_size); - - gb_t ctx; - gb_init(&ctx, rom_data, rom_size); - fprintf(stderr, "gb context initialized\n"); - - // render several frames - for (size_t j = 0; j < NUM_FRAMES; j++) { - // render frame - gb_frame(&ctx); - - // copy frame to buffer - memcpy(frames + GB_FRAME_SIZE * j, gb_get_rgb_frame(&ctx), GB_FRAME_SIZE); - } +static void +test_render_frames( + const char * const png_path, + const char * const rom_path +) { + // load rom data + uint32_t rom_size = 0; + const uint8_t *rom_data = load(rom_path, &rom_size); + fprintf(stderr, "loaded \"%s\" (%u bytes)\n", rom_path, rom_size); + + // init context + gb_t ctx; + gb_init(&ctx, rom_data, rom_size); + fprintf(stderr, "gb context initialized\n"); + + // render frames + for (size_t j = 0; j < NUM_FRAMES; j++) { + // render frame + gb_frame(&ctx); + + // copy frame to buffer + memcpy(frames + GB_FRAME_SIZE * j, gb_get_rgb_frame(&ctx), GB_FRAME_SIZE); + } - // save png - if (lodepng_encode24_file("out.png", frames, 160, 144 * NUM_FRAMES)) { - fprintf(stderr, "lode_png_encode24_file() failed\n"); - return EXIT_FAILURE; - } + // save png + if (lodepng_encode24_file(png_path, frames, 160, 144 * NUM_FRAMES)) { + fprintf(stderr, "lode_png_encode24_file() failed\n"); + exit(EXIT_FAILURE); + } + fprintf(stderr, "%d frames rendered\n", NUM_FRAMES); - fprintf(stderr, "%d frames rendered\n", NUM_FRAMES); + // free rom data + free((void*) rom_data); +} - // free rom data - free((void*) rom_data); +const char * const RWS[] = { + "AF", + "BC", + "DE", + "HL", + "SP", + "PC", + NULL +}; + +static void +gb_dump_context( + const gb_t * const ctx +) { + for (int i = 0; RWS[i]; i++) { + printf("%s%s: 0x%04x", (!i) ? "" : ", ", RWS[i], ctx->cpu.rs[i]); + } + printf("\n"); +} + +static void +test_execute_steps( + const char * const rom_path +) { + // load rom data + uint32_t rom_size = 0; + const uint8_t *rom_data = load(rom_path, &rom_size); + fprintf(stderr, "loaded \"%s\" (%u bytes)\n", rom_path, rom_size); + + // init context + gb_t ctx; + gb_init(&ctx, rom_data, rom_size); + fprintf(stderr, "gb context initialized\n"); + + // render frames + for (size_t j = 0; j < NUM_STEPS; j++) { + // render frame + gb_step(&ctx); + + // render frame + gb_dump_context(&ctx); + } + + // free rom data + free((void*) rom_data); +} + +int main(int argc, char *argv[]) { + // render 600 frames + for (int i = 2; i < argc; i++) { + if (argv[1][0] == 'f') { + test_render_frames("out.png", argv[i]); + } else if (argv[1][0] == 'e') { + test_execute_steps(argv[i]); + } else { + fprintf(stderr, "unknown test: %s\n", argv[i]); + exit(EXIT_FAILURE); + } } // return success |