From 0a40f97a1eb0de80e38a51d19d6b7c92d766554b Mon Sep 17 00:00:00 2001 From: kdx Date: Fri, 14 Apr 2023 01:42:21 +0200 Subject: render to screen --- README.md | 4 +--- build.sh | 8 +++++--- samples/input.orgaasm | 4 ---- samples/screen.orgaasm | 8 ++++++++ src/orgaemu.c | 56 ++++++++++++++++++++++++++++++++++++++++++++++++++ 5 files changed, 70 insertions(+), 10 deletions(-) delete mode 100644 samples/input.orgaasm create mode 100644 samples/screen.orgaasm diff --git a/README.md b/README.md index 1ee758b..a887cc1 100644 --- a/README.md +++ b/README.md @@ -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 diff --git a/build.sh b/build.sh index c8b9b9f..85d04c6 100755 --- a/build.sh +++ b/build.sh @@ -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 #include +#include #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; } -- cgit v1.2.3