From 7691afaa9066625ff9bb4c8693368c56968c40f6 Mon Sep 17 00:00:00 2001 From: Brad Nelson Date: Mon, 4 Jan 2021 22:53:18 -0800 Subject: [PATCH] Improving web. --- ueforth/common/opcodes.h | 22 +++++++++++----------- ueforth/web/fuse_web.js | 20 ++++++++++++++++++++ 2 files changed, 31 insertions(+), 11 deletions(-) diff --git a/ueforth/common/opcodes.h b/ueforth/common/opcodes.h index a21d4cc..24b51c7 100644 --- a/ueforth/common/opcodes.h +++ b/ueforth/common/opcodes.h @@ -20,16 +20,16 @@ typedef uint64_t udcell_t; #define OPCODE_LIST \ X("0=", OP_ZEQUAL, tos = !tos ? -1 : 0) \ X("0<", OP_ZLESS, tos = tos < 0 ? -1 : 0) \ - X("+", OP_PLUS, tos += *sp--) \ + X("+", OP_PLUS, tos += *sp; --sp) \ X("UM/MOD", OP_UMSMOD, ud = *(udcell_t *) &sp[-1]; \ - *--sp = (cell_t) (ud % tos); \ + --sp; *sp = (cell_t) (ud % tos); \ tos = (cell_t) (ud / tos)) \ X("*/MOD", OP_SSMOD, d = (dcell_t) *sp * (dcell_t) sp[-1]; \ - *--sp = (cell_t) (d % tos); \ + --sp; *sp = (cell_t) (d % tos); \ tos = (cell_t) (d / tos)) \ - X("AND", OP_AND, tos &= *sp--) \ - X("OR", OP_OR, tos |= *sp--) \ - X("XOR", OP_XOR, tos ^= *sp--) \ + X("AND", OP_AND, tos = tos & *sp; --sp) \ + 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("OVER", OP_OVER, DUP; tos = sp[-1]) \ @@ -46,14 +46,14 @@ typedef uint64_t udcell_t; X("SP!", OP_SPSTORE, sp = (cell_t *) tos; DROP) \ X("RP@", OP_RPAT, DUP; tos = (cell_t) rp) \ X("RP!", OP_RPSTORE, rp = (cell_t *) tos; DROP) \ - X(">R", OP_TOR, *++rp = tos; DROP) \ - X("R>", OP_FROMR, DUP; tos = *rp--) \ + X(">R", OP_TOR, ++rp; *rp = tos; DROP) \ + X("R>", OP_FROMR, DUP; tos = *rp; --rp) \ X("R@", OP_RAT, DUP; tos = *rp) \ X("EXECUTE", OP_EXECUTE, w = tos; DROP; goto **(void **) w) \ 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, if ((*rp)--) ip = (cell_t *) *ip; else (--rp, ++ip)) \ - X("DOLIT", OP_DOLIT, DUP; tos = *(cell_t *) ip++) \ + 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("ALITERAL", OP_ALITERAL, *g_sys.heap++ = g_sys.DOLIT_XT; \ *g_sys.heap++ = tos; DROP) \ X("CELL", OP_CELL, DUP; tos = sizeof(cell_t)) \ @@ -74,6 +74,6 @@ typedef uint64_t udcell_t; X("EVALUATE1", OP_EVALUATE1, DUP; sp = evaluate1(sp, &tmp); \ DROP; if (tmp) (w = tmp); \ if (tmp) goto **(void **) w) \ - X("EXIT", OP_EXIT, ip = (void *) *rp--) \ + X("EXIT", OP_EXIT, ip = (void *) *rp; --rp) \ X(";", OP_SEMICOLON, *g_sys.heap++ = g_sys.DOEXIT_XT; g_sys.state = 0) \ diff --git a/ueforth/web/fuse_web.js b/ueforth/web/fuse_web.js index 022560d..acdd69d 100755 --- a/ueforth/web/fuse_web.js +++ b/ueforth/web/fuse_web.js @@ -16,6 +16,26 @@ function ReplaceAll(haystack, needle, replacement) { } } +cases = ReplaceAll(cases, 'DROP', 'tos = i32[sp>>2]; sp = (sp - 4) | 0'); +cases = ReplaceAll(cases, 'DUP', 'sp = (sp + 4) | 0; i32[sp>>2] = tos'); +cases = ReplaceAll(cases, '*(cell_t *) tos', 'i32[tos>>2]'); +cases = ReplaceAll(cases, '*(int32_t *) tos', 'i32[tos>>2]'); +cases = ReplaceAll(cases, '*(uint8_t *) tos', 'u8[tos]'); +cases = ReplaceAll(cases, '*sp', 'i32[sp>>2]'); +cases = ReplaceAll(cases, '*rp', 'i32[rp>>2]'); +cases = ReplaceAll(cases, '*ip', 'i32[ip>>2]'); +cases = ReplaceAll(cases, 'sp[-1]', 'i32[(sp - 4)>>2]'); +cases = ReplaceAll(cases, '++ip', 'ip = (ip + 4) | 0'); +cases = ReplaceAll(cases, '++sp', 'sp = (sp + 4) | 0'); +cases = ReplaceAll(cases, '++rp', 'rp = (rp + 4) | 0'); +cases = ReplaceAll(cases, '--sp', 'sp = (sp - 4) | 0'); +cases = ReplaceAll(cases, '--rp', 'rp = (rp - 4) | 0'); +cases = ReplaceAll(cases, 'sizeof(cell_t) ', '4'); +cases = ReplaceAll(cases, '(void *) ', ''); +cases = ReplaceAll(cases, '(const char *) ', ''); +cases = ReplaceAll(cases, '(cell_t *) ', ''); +cases = ReplaceAll(cases, '(cell_t) ', ''); + code = code.replace('{{boot}}', function() { return boot; }); code = code.replace('{{dict}}', function() { return dict; }); code = code.replace('{{cases}}', function() { return cases; });