summaryrefslogtreecommitdiff
path: root/test.c
diff options
context:
space:
mode:
authorPaul Duncan <pabs@pablotron.org>2018-06-20 18:29:22 -0400
committerPaul Duncan <pabs@pablotron.org>2018-06-20 18:29:22 -0400
commit2ce21e092161fcc41fa51b365aeb4dd071d7e949 (patch)
treeeb54c217ea33dd6b7787856ecf9fe9ac633b48bb /test.c
parent4f058726584b60a8c976715a35f488875cac7aa8 (diff)
downloadgb-c-2ce21e092161fcc41fa51b365aeb4dd071d7e949.tar.bz2
gb-c-2ce21e092161fcc41fa51b365aeb4dd071d7e949.zip
add gb.h, add gb_init(), gb_get_rgb_frame(), disable bios
Diffstat (limited to 'test.c')
-rw-r--r--test.c96
1 files changed, 96 insertions, 0 deletions
diff --git a/test.c b/test.c
new file mode 100644
index 0000000..32f0474
--- /dev/null
+++ b/test.c
@@ -0,0 +1,96 @@
+#include <stdint.h>
+#include <stdbool.h>
+#include <unistd.h>
+#include <stdlib.h>
+#include <stdio.h>
+#include <sys/types.h>
+#include <sys/stat.h>
+#include <string.h>
+#include "lodepng.h"
+#include "gb.h"
+
+#define NUM_FRAMES 600
+
+static uint32_t
+file_size(
+ const char * const path
+) {
+ struct stat st;
+
+ if (stat(path, &st)) {
+ perror("stat():");
+ exit(EXIT_FAILURE);
+ }
+
+ return st.st_size;
+}
+
+static const uint8_t *
+load(
+ const char * const path,
+ uint32_t * const r_file_size
+) {
+ const uint32_t rom_size = file_size(path);
+ uint8_t *rom_data = malloc(rom_size);
+ if (!rom_data) {
+ perror("malloc():");
+ exit(EXIT_FAILURE);
+ }
+
+ FILE *fh = fopen(path, "rb");
+ if (!fh) {
+ perror("fopen():");
+ exit(EXIT_FAILURE);
+ }
+
+ if (!fread(rom_data, rom_size, 1, fh)) {
+ perror("fread():");
+ exit(EXIT_FAILURE);
+ }
+
+ fclose(fh);
+
+ if (r_file_size) {
+ *r_file_size = (uint32_t) rom_size;
+ }
+
+ return rom_data;
+}
+
+// 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);
+ }
+
+ // save png
+ if (lodepng_encode24_file("out.png", frames, 160, 144 * NUM_FRAMES)) {
+ fprintf(stderr, "lode_png_encode24_file() failed\n");
+ return EXIT_FAILURE;
+ }
+
+ fprintf(stderr, "%d frames rendered\n", NUM_FRAMES);
+
+ // free rom data
+ free((void*) rom_data);
+ }
+
+ // return success
+ return 0;
+}