From ac5bcbe9e76676e442780462b2d3098debd76b69 Mon Sep 17 00:00:00 2001 From: Brad Nelson Date: Thu, 14 Jan 2021 00:27:58 -0800 Subject: [PATCH] More asm.js --- ueforth/web/web.template.js | 56 ++++++++++++++++++++++++++++++------- 1 file changed, 46 insertions(+), 10 deletions(-) diff --git a/ueforth/web/web.template.js b/ueforth/web/web.template.js index c79ed6d..be951c7 100644 --- a/ueforth/web/web.template.js +++ b/ueforth/web/web.template.js @@ -3,8 +3,7 @@ (function() { const HEAP_SIZE = (1024 * 1024); -const DSTACK_SIZE = 4096; -const RSTACK_SIZE = 4096; +const STACK_SIZE = 4096; const boot = ` {{boot}} @@ -41,7 +40,7 @@ function SetEval(sp) { } function Call(sp, tos) { - return objects[tos](sp); + return objects[tos](sp); } function Load(addr, content) { @@ -51,7 +50,46 @@ function Load(addr, content) { return addr; } +function Same(a, b) { + if (a.length != b.length) { + return false; + } + for (var i = 0; i < a.length; ++i) { + if ((a.charCodeAt(i) & 95) != (b.charCodeAt(i) & 95)) { + return false; + } + } + return true; +} + +function GetName(xt) { + var clen = i32[(xt - 3*4)>>2]; + var ret = ''; + for (var i = 0; i < clen; ++i) { + ret += String.fromCharCode(u8[xt - 3 * 4 - clen + i]); + } + return ret; +} + +function Find(name) { + var pos = i32[g_last>>2]; + while (pos) { + if (Same(GetName(pos), name)) { + return pos; + } + pos = i32[(pos - 2*4)>>2]; + } + return 0; +} + function create(name, opcode) { + i32[g_heap>>2] = Load(i32[g_heap>>2], name); // name + g_heap = (g_heap + 3) & ~3; + i32[g_heap>>2] = name.length; // length + i32[g_heap>>2] = i32[g_last>>2]; // link + i32[g_heap>>2] = 0; // flags + i32[g_last>>2] = i32[g_heap>>2]; + i32[g_last>>2] = opcode; // code } function InitDictionary() { @@ -71,9 +109,7 @@ function Init() { 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'); + // Do not need DOLIT_XT, DOEXIT_XT, YIELD_XT (do by convention) i32[g_notfound>>2] = Find('DROP'); i32[g_ip>>2] = i32[g_heap>>2]; i32[g_heap>>2] = Find('EVALUATE1'); @@ -109,10 +145,10 @@ function VM(stdlib, foreign, heap) { var u8 = new stdlib.Uint8Array(heap); var i32 = new stdlib.Int32Array(heap); - 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; + const g_sys = 256; + const g_ip = 296; // g_sys + 10 * 4 + const g_sp = 300; // g_sys + 11 * 4 + const g_rp = 304; // g_sys + 12 * 4 function run() { var tos = 0;