From b575aa3871177e894253e386d8acf28c31923425 Mon Sep 17 00:00:00 2001 From: Brad Nelson Date: Wed, 13 Jan 2021 23:50:52 -0800 Subject: [PATCH] Improve web. --- ueforth/common/core.h | 2 +- ueforth/web/web.template.js | 69 +++++++++++++++++++++++++++++++++---- 2 files changed, 64 insertions(+), 7 deletions(-) diff --git a/ueforth/common/core.h b/ueforth/common/core.h index afe40ad..a9ac434 100644 --- a/ueforth/common/core.h +++ b/ueforth/common/core.h @@ -15,8 +15,8 @@ static struct { cell_t *heap, *last, notfound; int argc; char **argv; - cell_t DOLIT_XT, DOEXIT_XT, YIELD_XT; cell_t *ip, *sp, *rp; // Parked alternates + cell_t DOLIT_XT, DOEXIT_XT, YIELD_XT; } g_sys; static cell_t convert(const char *pos, cell_t n, cell_t *ret) { diff --git a/ueforth/web/web.template.js b/ueforth/web/web.template.js index 2f5174d..c79ed6d 100644 --- a/ueforth/web/web.template.js +++ b/ueforth/web/web.template.js @@ -14,6 +14,20 @@ var heap = new ArrayBuffer(HEAP_SIZE); var i32 = new Int32Array(heap); var u8 = new Uint8Array(heap); var objects = [SetEval]; +var g_sys = 256; // Placed past a gap. +var g_tib = g_sys + 0 * 4; +var g_ntib = g_sys + 1 * 4; +var g_tin = g_sys + 2 * 4; +var g_state = g_sys + 3 * 4; +var g_base = g_sys + 4 * 4; +var g_heap = g_sys + 5 * 4; +var g_last = g_sys + 6 * 4; +var g_notfound = g_sys + 7 * 4; +var g_argc = g_sys + 8 * 4; +var g_argv = g_sys + 9 * 4; +var g_ip = g_sys + 10 * 4; +var g_sp = g_sys + 11 * 4; +var g_rp = g_sys + 12 * 4; function SetEval(sp) { var index = i32[sp--]; @@ -30,6 +44,13 @@ function Call(sp, tos) { return objects[tos](sp); } +function Load(addr, content) { + for (var i = 0; i < content.length; ++i) { + u8[addr++] = content.charCodeAt(i); + } + return addr; +} + function create(name, opcode) { } @@ -37,6 +58,36 @@ function InitDictionary() { {{dict}} } +function Init() { + i32[g_heap>>2] = g_sys + 16 * 4; + var source = g_heap; + i32[g_heap>>2] = Load(i32[g_heap>>2], boot); + var source_len = g_heap - source; + + i32[g_ip>>2] = 0; + InitDictionary(); + i32[g_sp>>2] = i32[g_heap>>2] + 1; + i32[g_heap>>2] += STACK_SIZE; + i32[g_rp>>2] = i32[g_heap>>2] + 1; + i32[g_heap>>2] += STACK_SIZE; + i32[(g_last - 4)>>2] = 1; // Make ; IMMMEDIATE + g_DOLIT_XT = Find('DOLIT'); + g_DOEXIT_XT = Find('EXIT'); + g_YIELD_XT = Find('YIELD'); + i32[g_notfound>>2] = Find('DROP'); + i32[g_ip>>2] = i32[g_heap>>2]; + i32[g_heap>>2] = Find('EVALUATE1'); + i32[g_heap>>2] += 4; + i32[g_heap>>2] = Find('BRANCH'); + i32[g_heap>>2] += 4; + i32[g_heap>>2] = g_ip; + // argc, argv would have gone here. + i32[g_heap>>2] += 4; + i32[g_base>>2] = 10; + i32[g_tib>>2] = source; + i32[g_ntib>>2] = source_len; +} + function VM(stdlib, foreign, heap) { "use asm"; @@ -58,19 +109,21 @@ function VM(stdlib, foreign, heap) { var u8 = new stdlib.Uint8Array(heap); var i32 = new stdlib.Int32Array(heap); - var g_sys = 128; + var g_sys = 256; + var g_ip = g_sys + 10 * 4; + var g_sp = g_sys + 11 * 4; + var g_rp = g_sys + 12 * 4; - function run(initrp) { - initrp = initrp | 0; + function run() { var tos = 0; var ip = 0; var sp = 0; var rp = 0; var w = 0; var ir = 0; - rp = initrp; - ip = i32[rp>>2]|0; rp = (rp - 4)|0; - sp = i32[rp>>2]|0; rp = (rp - 4)|0; + sp = i32[g_sp>>2]|0; + rp = i32[g_rp>>2]|0; + ip = i32[g_ip>>2]|0; tos = i32[sp>>2]|0; sp = (sp - 4)|0; for (;;) { w = i32[ip>>2]|0; @@ -123,5 +176,9 @@ var ffi = { heap[128 + 6] = 256 * 4; // set g_sys.heap = 256 * 4; var module = VM(window, ffi, heap); +Init(); +setTimeout(function() { + module.run(); +}, 10); })();