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 | |
parent | 1ea1be987dfe7cf78f7a0eeed02b22820484db49 (diff) | |
download | orga-0a40f97a1eb0de80e38a51d19d6b7c92d766554b.tar.gz |
render to screen
-rw-r--r-- | README.md | 4 | ||||
-rwxr-xr-x | build.sh | 8 | ||||
-rw-r--r-- | samples/input.orgaasm | 4 | ||||
-rw-r--r-- | samples/screen.orgaasm | 8 | ||||
-rw-r--r-- | src/orgaemu.c | 56 |
5 files changed, 70 insertions, 10 deletions
@@ -7,9 +7,7 @@ input data is a single short at __0xbffe__ -screen data is 8-bit indexed on two layers -(one short is two pixels, one for each layer), and located -__from 0xbfff to 0xffff__ +screen data is r5g6b5 __from 0xbfff to 0xffff__ # OPS @@ -1,4 +1,6 @@ #!/bin/sh -CFLAGS='-std=c99 -Wall -Wextra' -tcc $CFLAGS -o orgaasm src/orgaasm.c -tcc $CFLAGS -o orgaemu src/orgaemu.c +CFLAGS='-std=c99 -Wall -Wextra -O2' +printf 'orgaasm\n' +gcc $CFLAGS -o orgaasm src/orgaasm.c +printf 'orgaemu\n' +gcc $CFLAGS -o orgaemu src/orgaemu.c -lSDL2 diff --git a/samples/input.orgaasm b/samples/input.orgaasm deleted file mode 100644 index a97f70c..0000000 --- a/samples/input.orgaasm +++ /dev/null @@ -1,4 +0,0 @@ - SLP -@loop - LIT ,Input LDA DBG POP - JMP ,loop diff --git a/samples/screen.orgaasm b/samples/screen.orgaasm new file mode 100644 index 0000000..7b16d71 --- /dev/null +++ b/samples/screen.orgaasm @@ -0,0 +1,8 @@ + LIT ,Screen +@loop + DUP DUP STA ( draw pixel ) + INC DUP ( overflow check ) + JNZ ,loop +@infinite + SLP + JMP ,infinite 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; } |