summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--Tupfile.emcc3
-rw-r--r--audio.c9
-rw-r--r--fe.c7
-rw-r--r--main.c74
-rw-r--r--render.c2
-rw-r--r--sdl_init.c2
6 files changed, 66 insertions, 31 deletions
diff --git a/Tupfile.emcc b/Tupfile.emcc
index 8df6ebf..66b5166 100644
--- a/Tupfile.emcc
+++ b/Tupfile.emcc
@@ -1,8 +1,9 @@
CC = emcc
CFLAGS = -s USE_SDL=2 -s USE_SDL_IMAGE=2 -DEMCC -Os -std=c99 `sdl2-config --cflags`
+LDFLAGS = -s EXIT_RUNTIME
LIBS = -lm `sdl2-config --libs` -lSDL2_image
.gitignore
: beep.wav |> cembed -s -t beep_info -o %o %f |> beep.c
: foreach *.c |> $(CC) $(CFLAGS) -c -o %o %f |> %B.o
-: *.o |> $(CC) -o scr16.html %f $(LIBS) |> scr16.html scr16.wasm scr16.js
+: *.o |> $(CC) $(LDFLAGS) -o scr16.html %f $(LIBS) |> scr16.html scr16.wasm scr16.js
diff --git a/audio.c b/audio.c
index 78c6456..42e1759 100644
--- a/audio.c
+++ b/audio.c
@@ -24,6 +24,9 @@ static void audio_callback(void *udata, unsigned char *stream, int size)
int audio_init(void)
{
+#ifdef EMCC
+ return 0;
+#endif
audio_mutex = SDL_CreateMutex();
if (audio_mutex == NULL) {
dx_log_error("%s", SDL_GetError());
@@ -51,6 +54,9 @@ int audio_init(void)
void audio_deinit(void)
{
+#ifdef EMCC
+ return;
+#endif
if (dev != 0) {
SDL_CloseAudioDevice(dev);
dev = 0;
@@ -63,6 +69,9 @@ void audio_deinit(void)
cm_Source *audio_load(unsigned char *data, size_t size)
{
+#ifdef EMCC
+ return NULL;
+#endif
cm_Source *const snd = cm_new_source_from_mem(data, size);
if (snd == NULL) {
dx_log_error("%s", cm_get_error());
diff --git a/fe.c b/fe.c
index 19770e5..243a71b 100644
--- a/fe.c
+++ b/fe.c
@@ -21,6 +21,7 @@
*/
#include "fe.h"
+#include "dx_log.h"
#include <string.h>
#define unused(x) ((void)(x))
@@ -119,11 +120,11 @@ void fe_error(fe_Context *ctx, const char *msg)
ctx->handlers.error(ctx, msg, cl);
}
/* error handler returned -- print error and traceback, exit */
- fprintf(stderr, "error: %s\n", msg);
+ dx_log_error("%s", msg);
for (; !isnil(cl); cl = cdr(cl)) {
char buf[64];
fe_tostring(ctx, car(cl), buf, sizeof(buf));
- fprintf(stderr, "=> %s\n", buf);
+ dx_log_error("=> %s", buf);
}
exit(EXIT_FAILURE);
}
@@ -978,7 +979,7 @@ static char buf[64000];
static void onerror(fe_Context *ctx, const char *msg, fe_Object *cl)
{
unused(ctx), unused(cl);
- fprintf(stderr, "error: %s\n", msg);
+ dx_log_error("%s", msg);
longjmp(toplevel, -1);
}
diff --git a/main.c b/main.c
index 3ef6cbd..9386ef3 100644
--- a/main.c
+++ b/main.c
@@ -12,12 +12,19 @@
#include <math.h>
#include <stdio.h>
#include <string.h>
+#ifdef EMCC
+#include "emscripten.h"
+#endif
FILE *fp = NULL;
static void *data = NULL;
static fe_Context *ctx = NULL;
static cm_Source *beep = NULL;
+static int gc = 0, stop = 0;
+static fe_Object *update_sym = NULL;
+static fe_Object *draw_sym = NULL;
+static void run_frame(void);
static int init(void);
static int deinit(void);
static int cycle_events(void);
@@ -55,7 +62,7 @@ int main(int argc, char **argv)
return deinit();
}
- int gc = fe_savegc(ctx);
+ gc = fe_savegc(ctx);
for (;;) {
fe_Object *const obj = fe_readfp(ctx, fp);
if (obj == NULL)
@@ -70,32 +77,47 @@ int main(int argc, char **argv)
fe_eval(ctx, fe_list(ctx, &init_sym, 1));
fe_restoregc(ctx, gc);
- fe_Object *update_sym = fe_symbol(ctx, "_update");
- fe_Object *draw_sym = fe_symbol(ctx, "_draw");
+ update_sym = fe_symbol(ctx, "_update");
+ draw_sym = fe_symbol(ctx, "_draw");
while (!cycle_events()) {
- static int cleaned = 0;
- fe_eval(ctx, fe_list(ctx, &update_sym, 1));
- fe_restoregc(ctx, gc);
- if (r_draw_begin()) {
- dx_log_error("r_draw_begin failed");
- return deinit();
- }
- if (!cleaned) {
- r_cls();
- cleaned = 1;
- }
- fe_eval(ctx, fe_list(ctx, &draw_sym, 1));
- fe_restoregc(ctx, gc);
- if (r_draw_end()) {
- dx_log_error("r_draw_end failed");
- return deinit();
- }
+#ifdef EMCC
+ emscripten_set_main_loop(run_frame, 0, 0);
+#else
+ run_frame();
+#endif
+ if (stop)
+ return 1;
}
deinit();
return 0;
}
+static void run_frame(void)
+{
+ static int cleaned = 0;
+ fe_eval(ctx, fe_list(ctx, &update_sym, 1));
+ fe_restoregc(ctx, gc);
+ if (r_draw_begin()) {
+ dx_log_error("r_draw_begin failed");
+ deinit();
+ stop = 1;
+ return;
+ }
+ if (!cleaned) {
+ r_cls();
+ cleaned = 1;
+ }
+ fe_eval(ctx, fe_list(ctx, &draw_sym, 1));
+ fe_restoregc(ctx, gc);
+ if (r_draw_end()) {
+ dx_log_error("r_draw_end failed");
+ deinit();
+ stop = 1;
+ return;
+ }
+}
+
static int init(void)
{
const size_t size = 1024 * 1024;
@@ -114,10 +136,8 @@ static int init(void)
return 1;
}
beep = audio_load(beep_info[0].data, beep_info[0].size);
- if (beep == NULL) {
- dx_log_error("audio_load failed");
- return 1;
- }
+ if (beep == NULL)
+ dx_log_warn("audio_load failed");
fe_set(ctx, fe_symbol(ctx, "floor"), fe_cfunc(ctx, cf_floor));
fe_set(ctx, fe_symbol(ctx, "ceil"), fe_cfunc(ctx, cf_ceil));
fe_set(ctx, fe_symbol(ctx, "round"), fe_cfunc(ctx, cf_round));
@@ -274,7 +294,9 @@ CFUNC(cf_keypress)
CFUNC(cf_beep)
{
(void)ctx, (void)arg;
- cm_stop(beep);
- cm_play(beep);
+ if (beep != NULL) {
+ cm_stop(beep);
+ cm_play(beep);
+ }
return NULL;
}
diff --git a/render.c b/render.c
index 52817eb..56fe17b 100644
--- a/render.c
+++ b/render.c
@@ -20,7 +20,7 @@ int r_init(void)
return 1;
}
SDL_SetHint(SDL_HINT_RENDER_SCALE_QUALITY, 0);
- window = SDL_CreateWindow("enefe", SDL_WINDOWPOS_UNDEFINED,
+ window = SDL_CreateWindow("scr16", SDL_WINDOWPOS_UNDEFINED,
SDL_WINDOWPOS_UNDEFINED, 256, 256,
SDL_WINDOW_RESIZABLE);
if (window == NULL) {
diff --git a/sdl_init.c b/sdl_init.c
index 7752a2a..acb1671 100644
--- a/sdl_init.c
+++ b/sdl_init.c
@@ -9,10 +9,12 @@ int sdl_init(void)
dx_log_error("%s", SDL_GetError());
return 1;
}
+#ifndef EMCC
if (IMG_Init(IMG_INIT_PNG) == 0) {
dx_log_error("%s", IMG_GetError());
return 1;
}
+#endif
return 0;
}