summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJakob L. Kreuze <zerodaysfordays@sdf.lonestar.org>2020-01-01 12:38:35 -0500
committerJakob L. Kreuze <zerodaysfordays@sdf.lonestar.org>2020-01-01 12:59:36 -0500
commit4d42144c4dc35a8e7e7ce544e90b34eb440ed1c5 (patch)
tree0e150434928c1fdf2446ad8cd8d77cdac5aef892
parentbf47e7499c649c55ef1045738b0ba5c163701500 (diff)
Add initial SDL bindings.
-rw-r--r--.gitignore3
-rw-r--r--bld.proj13
-rw-r--r--main.myr30
-rw-r--r--sdl.glue.c73
-rw-r--r--sdl.myr36
5 files changed, 153 insertions, 2 deletions
diff --git a/.gitignore b/.gitignore
index b980033..2416a67 100644
--- a/.gitignore
+++ b/.gitignore
@@ -1,2 +1 @@
-*.o
-*.use
+obj/
diff --git a/bld.proj b/bld.proj
new file mode 100644
index 0000000..69d740a
--- /dev/null
+++ b/bld.proj
@@ -0,0 +1,13 @@
+bin asm =
+ asm.myr
+;;
+
+bin chip =
+ main.myr
+ lib sdl
+;;
+
+lib sdl =
+ sdl.myr
+ sdl.glue.c
+;;
diff --git a/main.myr b/main.myr
new file mode 100644
index 0000000..a2a54be
--- /dev/null
+++ b/main.myr
@@ -0,0 +1,30 @@
+use std
+use sdl
+
+const main = {
+ var win, r, tex
+ var pixels : uint8[64 * 32]
+ sdl.init(sdl.INIT_VIDEO)
+ win = sdl.mkwin(("chip\0" : byte#), sdl.WIN_POS_UNSPEC, sdl.WIN_POS_UNSPEC, 640, 480, sdl.WIN_OPENGL)
+ r = sdl.mkrenderer(win, -1, sdl.RENDERER_ACCEL)
+ tex = sdl.mktexture(r, sdl.PIXFMT_RGB332, sdl.TEXACCESS_STREAM, 64, 32)
+
+ var i
+ for i = 0; i < 64 * 32; i++;
+ if std.rand(0, 2) == 1
+ pixels[i] = 255
+ else
+ pixels[i] = 0
+ ;;
+ ;;
+
+ sdl.update(tex, (pixels[:] : void#), 64)
+ sdl.copy(r, tex)
+ sdl.present(r)
+
+ sdl.delay(10000)
+
+ sdl.freerenderer(r)
+ sdl.freewin(win)
+ sdl.quit()
+}
diff --git a/sdl.glue.c b/sdl.glue.c
new file mode 100644
index 0000000..18eceee
--- /dev/null
+++ b/sdl.glue.c
@@ -0,0 +1,73 @@
+/* CFLAGS: -Wall -Wextra */
+/* LIBS: c SDL2 */
+
+#include <stdint.h>
+
+#include <SDL2/SDL.h>
+
+int sdl$init(uint32_t flags)
+{
+ return SDL_Init(flags);
+}
+
+void sdl$quit(void)
+{
+ SDL_Quit();
+}
+
+void *sdl$mkwin(const char *title, int x, int y, int w, int h, uint32_t flags)
+{
+ return (void *) SDL_CreateWindow(title, x, y, w, h, flags);
+}
+
+void sdl$freewin(void *win)
+{
+ return SDL_DestroyWindow((SDL_Window *) win);
+}
+
+void *sdl$mkrenderer(void *win, int index, uint32_t flags)
+{
+ return (void *) SDL_CreateRenderer((SDL_Window *) win, index, flags);
+}
+
+int sdl$copy(void *r, void *tex)
+{
+ return SDL_RenderCopy((SDL_Renderer *) r, (SDL_Texture *) tex, NULL, NULL);
+}
+
+void sdl$present(void *r)
+{
+ SDL_RenderPresent((SDL_Renderer *) r);
+}
+
+void sdl$freerenderer(void *r)
+{
+ return SDL_DestroyRenderer((SDL_Renderer *) r);
+}
+
+void *sdl$mktexture(void *r, uint32_t fmt, int access, int w, int h)
+{
+ return (void *) SDL_CreateTexture((SDL_Renderer *) r, fmt, access, w, h);
+}
+
+int sdl$update(void *tex, void *pixels, int pitch)
+{
+ return SDL_UpdateTexture((SDL_Texture *) tex, NULL, pixels, pitch);
+}
+void sdl$freetexture(void *tex)
+{
+ return SDL_DestroyTexture((SDL_Texture *) tex);
+}
+
+void sdl$delay(uint32_t ms)
+{
+ SDL_Delay(ms);
+}
+
+// SDL_GetKeyboardState
+// SDL_SCANCODE_{}
+
+// 1 2 3 C 1 2 3 4
+// 4 5 6 D This is emulated with these Q W E R
+// 7 8 9 E keyboard keys --> A S D F
+// A 0 B F Z X C V
diff --git a/sdl.myr b/sdl.myr
new file mode 100644
index 0000000..31026c0
--- /dev/null
+++ b/sdl.myr
@@ -0,0 +1,36 @@
+use std
+
+pkg sdl =
+ const INIT_VIDEO : uint32 = 32
+
+ extern const init : (flags : uint32 -> int)
+ extern const quit : (-> void)
+
+ type win = void#
+
+ const WIN_POS_UNSPEC : int = 536805376
+ const WIN_OPENGL : uint32 = 2
+
+ extern const mkwin : (title : byte#, x : int, y : int, w : int, h : int, flags : uint32 -> win)
+ extern const freewin : (win : win -> void)
+
+ type renderer = void#
+
+ const RENDERER_ACCEL : uint32 = 2
+
+ extern const mkrenderer : (win : win, index : int, flags: uint32 -> renderer)
+ extern const copy : (r : renderer, tex : texture -> int)
+ extern const present : (r : renderer -> void)
+ extern const freerenderer : (r : renderer -> void)
+
+ type texture = void#
+
+ const PIXFMT_RGB332 : uint32 = 336660481
+ const TEXACCESS_STREAM : int = 1
+
+ extern const mktexture : (r : renderer, fmt : uint32, access : int, w : int, h : int -> texture)
+ extern const update : (tex : texture, pixels : void#, pitch : int -> int)
+ extern const freetexture : (tex : texture -> void)
+
+ extern const delay : (ms : uint32 -> void)
+;;