diff options
author | kdx <kikoodx@paranoici.org> | 2023-04-14 01:42:21 +0200 |
---|---|---|
committer | kdx <kikoodx@paranoici.org> | 2023-04-14 01:42:21 +0200 |
commit | 0a40f97a1eb0de80e38a51d19d6b7c92d766554b (patch) | |
tree | 7e18a8ae6b79285e988841856187534ba3ecebf4 /src | |
parent | 1ea1be987dfe7cf78f7a0eeed02b22820484db49 (diff) | |
download | orga-0a40f97a1eb0de80e38a51d19d6b7c92d766554b.tar.gz |
render to screen
Diffstat (limited to 'src')
-rw-r--r-- | src/orgaemu.c | 56 |
1 files changed, 56 insertions, 0 deletions
diff --git a/src/orgaemu.c b/src/orgaemu.c index b3c712d..4b7630e 100644 --- a/src/orgaemu.c +++ b/src/orgaemu.c @@ -2,15 +2,23 @@ #include "ops.h" #include <stdio.h> #include <stdint.h> +#include <SDL2/SDL.h> #define MEM_SIZE 0xffff static uint16_t *mem = NULL, *stack = NULL, *rstack = NULL; static size_t stack_ptr = 0, rstack_ptr = 0; +static SDL_Window *window = NULL; +static SDL_Renderer *renderer = NULL; static int fail(void) { + if (renderer != NULL) + SDL_DestroyRenderer(renderer); + if (window != NULL) + SDL_DestroyWindow(window); + SDL_Quit(); if (mem != NULL) free(mem); if (stack != NULL) @@ -26,6 +34,42 @@ get_short(const unsigned char *s) return s[0] | (s[1] * 0x0100); } +static int +cycle_events(void) +{ + SDL_Event e; + while (SDL_PollEvent(&e)) { + switch (e.type) { + case SDL_QUIT: + return 1; + default: + break; + } + } + return 0; +} + +static void +render(uint16_t *mem) +{ + SDL_SetRenderDrawColor(renderer, 0, 0, 0, 255); + SDL_RenderClear(renderer); + for (int y = 0; y < 128; y++) { + for (int x = 0; x < 128; x++) { + const uint16_t pixel = mem[x + y * 128]; + if (!pixel) + continue; + const uint16_t r = (pixel & 0x1f) << 3; + const uint16_t g = ((pixel >> 5) & 0x3f) << 2; + const uint16_t b = ((pixel >> 11) & 0x1f) << 3; + SDL_SetRenderDrawColor(renderer, r, g, b, 255); + SDL_RenderDrawPoint(renderer, x, y); + } + } + SDL_RenderPresent(renderer); + SDL_Delay(1000 / 30); +} + static void push(uint16_t v) { @@ -207,6 +251,9 @@ exec_op(uint16_t *mem, long pc) return pc + 1; } case OP_SLP: + if (cycle_events()) + return MEM_SIZE; + render(mem + 0xbfff); return pc + 1; case OP_INC: push(pop() + 1); @@ -280,6 +327,15 @@ main(int argc, char **argv) return fail(); } + if (SDL_Init(SDL_INIT_VIDEO) < 0) { + fprintf(stderr, "%s\n", SDL_GetError()); + return fail(); + } + if (SDL_CreateWindowAndRenderer(128, 128, 0, &window, &renderer) < 0) { + fprintf(stderr, "%s\n", SDL_GetError()); + return fail(); + } + exec_data(mem); return fail(), 0; } |