diff --git a/Makefile b/Makefile index 7bab229..836dcee 100644 --- a/Makefile +++ b/Makefile @@ -24,10 +24,11 @@ EMCC_ARGS += --js-library xterm-pty/emscripten-pty.js EMCC_ARGS += --preload-file plexus-sanitized.img EMCC_ARGS += --preload-file U15-MERGED.BIN EMCC_ARGS += --preload-file U17-MERGED.BIN +EMCC_ARGS += -lidbfs.js EMCC_ARGS += -O2 -gsource-map --source-map-base=./ plexem.mjs: $(SRC) - emcc -o $@ $(EMCC_ARGS) $^ -lm + emcc -o $@ $(EMCC_ARGS) $^ emscripten_env.c -lm clean: rm -f $(SRC:.c=.o) diff --git a/emscripten_env.c b/emscripten_env.c new file mode 100644 index 0000000..5ee65c8 --- /dev/null +++ b/emscripten_env.c @@ -0,0 +1,20 @@ +#include "emscripten_env.h" +#include "emscripten.h" + +void emscripten_init() { + EM_ASM( + FS.mkdir("/persist"); + FS.mount(IDBFS, {}, "/persist"); + FS.syncfs(true, function (err) { + assert(!err); + }); + ); +} + +void emscripten_syncfs() { + EM_ASM( + FS.syncfs(false, function (err) { + assert(!err); + }); + ); +} diff --git a/emscripten_env.h b/emscripten_env.h new file mode 100644 index 0000000..735a718 --- /dev/null +++ b/emscripten_env.h @@ -0,0 +1,3 @@ + +void emscripten_init(); +void emscripten_syncfs(); diff --git a/main.c b/main.c index b8f6b46..1457327 100644 --- a/main.c +++ b/main.c @@ -4,6 +4,7 @@ #include #include "emu.h" #include "log.h" +#include "emscripten_env.h" const char *log_str[]={ [LOG_SRC_UART]="uart", @@ -63,14 +64,19 @@ int main(int argc, char **argv) { #ifdef __EMSCRIPTEN__ .u15_rom="U15-MERGED.BIN", .u17_rom="U17-MERGED.BIN", + .cow_dir="persist/cow", + .rtcram="persist/rtcram.bin", .realtime=1, #else .u15_rom="../plexus-p20/ROMs/U15-MERGED.BIN", .u17_rom="../plexus-p20/ROMs/U17-MERGED.BIN", + .rtcram="rtcram.bin", #endif .hd0img="plexus-sanitized.img", - .rtcram="rtcram.bin" }; +#ifdef __EMSCRIPTEN__ + emscripten_init(); +#endif int error=0; for (int i=1; icow_dir) { FILE *f=open_cow_file(hd, lba, "rb"); if (f) { - fread(data, 512, 1, f); - fclose(f); - return; + uint8_t ver[2]; + fread(ver, 2, 1, f); + if (ver[0]==COW_VERSION_MAJOR && ver[1]==COW_VERSION_MINOR) { + fread(data, 512, 1, f); + fclose(f); + return; + } else { + //not the same version; ignore + fclose(f); + } } } fseek(hd->hdfile, lba*512, SEEK_SET); @@ -128,6 +142,9 @@ static void hd_handle_data_out(scsi_dev_t *dev, uint8_t *msg, int len) { for (int i=0; i