diff options
| -rw-r--r-- | .gitignore | 3 | ||||
| -rw-r--r-- | bld.proj | 13 | ||||
| -rw-r--r-- | main.myr | 30 | ||||
| -rw-r--r-- | sdl.glue.c | 73 | ||||
| -rw-r--r-- | sdl.myr | 36 |
5 files changed, 153 insertions, 2 deletions
@@ -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 @@ -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) +;; |