aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorkdx <kikoodx@paranoici.org>2023-04-14 01:42:21 +0200
committerkdx <kikoodx@paranoici.org>2023-04-14 01:42:21 +0200
commit0a40f97a1eb0de80e38a51d19d6b7c92d766554b (patch)
tree7e18a8ae6b79285e988841856187534ba3ecebf4
parent1ea1be987dfe7cf78f7a0eeed02b22820484db49 (diff)
downloadorga-0a40f97a1eb0de80e38a51d19d6b7c92d766554b.tar.gz
render to screen
-rw-r--r--README.md4
-rwxr-xr-xbuild.sh8
-rw-r--r--samples/input.orgaasm4
-rw-r--r--samples/screen.orgaasm8
-rw-r--r--src/orgaemu.c56
5 files changed, 70 insertions, 10 deletions
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 <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;
}