diff --git a/ueforth/common/core.h b/ueforth/common/core.h index d4c0c34..05f87ee 100644 --- a/ueforth/common/core.h +++ b/ueforth/common/core.h @@ -121,7 +121,7 @@ static void ueforth(int argc, char *argv[], void *heap, g_sys.heap = (cell_t *) heap; register cell_t *sp = g_sys.heap; g_sys.heap += STACK_SIZE; register cell_t *rp = g_sys.heap; g_sys.heap += STACK_SIZE; - register cell_t tos = 0, *ip, t, w; + register cell_t tos = 0, *ip, w; dcell_t d; udcell_t ud; cell_t tmp; diff --git a/ueforth/common/opcodes.h b/ueforth/common/opcodes.h index 83045e6..cc8c0bc 100644 --- a/ueforth/common/opcodes.h +++ b/ueforth/common/opcodes.h @@ -34,7 +34,7 @@ typedef uint64_t udcell_t; X("OR", OP_OR, tos = tos | *sp; --sp) \ X("XOR", OP_XOR, tos = tos ^ *sp; --sp) \ X("DUP", OP_DUP, DUP) \ - X("SWAP", OP_SWAP, t = tos; tos = *sp; *sp = t) \ + X("SWAP", OP_SWAP, w = tos; tos = *sp; *sp = w) \ X("OVER", OP_OVER, DUP; tos = sp[-1]) \ X("DROP", OP_DROP, DROP) \ X("@", OP_AT, tos = *(cell_t *) tos) \ @@ -56,22 +56,22 @@ typedef uint64_t udcell_t; X("BRANCH", OP_BRANCH, ip = (cell_t *) *ip) \ X("0BRANCH", OP_ZBRANCH, if (!tos) ip = (cell_t *) *ip; else ++ip; DROP) \ X("DONEXT", OP_DONEXT, *rp = (*rp - 1) | 0; if (*rp) ip = (cell_t *) *ip; else (--rp, ++ip)) \ - X("DOLIT", OP_DOLIT, DUP; tos = *(cell_t *) ip; ++ip) \ + X("DOLIT", OP_DOLIT, DUP; tos = *ip; ++ip) \ X("ALITERAL", OP_ALITERAL, COMMA(g_sys.DOLIT_XT); COMMA(tos); DROP) \ X("CELL", OP_CELL, DUP; tos = sizeof(cell_t)) \ X("FIND", OP_FIND, tos = find((const char *) *sp, tos); --sp) \ X("PARSE", OP_PARSE, DUP; tos = parse(tos, sp)) \ X("S>NUMBER?", OP_CONVERT, tos = convert((const char *) *sp, tos, sp); \ if (!tos) --sp) \ - X("CREATE", OP_CREATE, t = parse(32, &tmp); \ - create((const char *) tmp, t, 0, && OP_DOCREATE); \ - COMMA(0)) \ + X("CREATE", OP_CREATE, DUP; DUP; tos = parse(32, sp); \ + create((const char *) *sp, tos, 0, && OP_DOCREATE); \ + COMMA(0); --sp; DROP) \ X("DOES>", OP_DOES, DOES(ip); ip = (void *) *rp; --rp) \ X("IMMEDIATE", OP_IMMEDIATE, g_sys.last[-1] |= 1) \ X("'SYS", OP_SYS, DUP; tos = (cell_t) &g_sys) \ - X(":", OP_COLON, t = parse(32, &tmp); \ - create((const char *) tmp, t, 0, && OP_DOCOL); \ - g_sys.state = -1) \ + X(":", OP_COLON, DUP; DUP; tos = parse(32, sp); \ + create((const char *) *sp, tos, 0, && OP_DOCOL); \ + g_sys.state = -1; --sp; DROP) \ X("EVALUATE1", OP_EVALUATE1, DUP; sp = evaluate1(sp, &tmp); \ DROP; if (tmp) (w = tmp); \ if (tmp) goto **(void **) w) \ diff --git a/ueforth/web/web.template.js b/ueforth/web/web.template.js index 277e0a9..98e55f9 100644 --- a/ueforth/web/web.template.js +++ b/ueforth/web/web.template.js @@ -43,43 +43,16 @@ function Interpreter(stdlib, foreign, heap) { var imul = stdlib.Math.imul; var Call = foreign.Call; + var COMMA = foreign.COMMA; + var IMMEDIATE = foreign.IMMEDIATE; + var find = foreign.parse; + var parse = foreign.parse; + var convert = foreign.convert; + var evaluate1 = foreign.evaluate1; var u8 = new stdlib.Uint8Array(heap); var i32 = new stdlib.Int32Array(heap); - function convert(pos, n, ret) { - pos = pos | 0; - n = n | 0; - ret = ret | 0; - var negate = 0; - var d = 0; - - i32[ret>>2] = 0; - if (!n) { return 0; } - if (u8[pos] == '-') { negate = -1; pos = (pos + 1) | 0; n = (n - 1) | 0; } - for (; n; n = (n - 1) | 0) { - d = (u8[pos] - 48) | 0; - if ((d >>> 0) > 9) { - d = ((d & 59) - 7) | 0; - if (d < 10) { return 0; } - } - if ((d >>> 0) >= (i32[g_base] >>> 0)) { return 0; } - ret = ((imul(ret, i32[g_base]) >>> 0) + d) | 0; - pos = (pos + 1) | 0; - } - if (negate) { i32[ret] = (-i32[ret]) | 0; } - return -1; - } - - function same(a, b, len) { - a = a | 0; - b = b | 0; - len = len | 0; - for (;len && (i32[a] & 95) == (i32[b] & 95); - len = (len - 1) | 0, a = (a + 1) | 0, b = (b + 1) | 0); - return len | 0; - } - function run(initrp) { initrp = initrp | 0; var tos = 0;