From 75d91850279db3e93834b1d38bdf074dd235b3de Mon Sep 17 00:00:00 2001 From: Brad Nelson Date: Sat, 14 Jan 2023 22:53:30 -0800 Subject: [PATCH] Align PARK/UNPARK with THROW/CATCH. --- common/core.h | 2 +- common/tier0_opcodes.h | 10 +++++----- esp32/builtins.cpp | 2 +- web/web.template.js | 22 ++++++++++++++++------ 4 files changed, 23 insertions(+), 13 deletions(-) diff --git a/common/core.h b/common/core.h index 6b3a24e..a4544ee 100644 --- a/common/core.h +++ b/common/core.h @@ -285,9 +285,9 @@ static void forth_init(int argc, char *argv[], g_sys->tib = src; g_sys->ntib = src_len; + *++rp = (cell_t) start; *++rp = (cell_t) fp; *++rp = (cell_t) sp; - *++rp = (cell_t) start; g_sys->rp = rp; g_sys->runner = forth_run; } diff --git a/common/tier0_opcodes.h b/common/tier0_opcodes.h index 0dbb2f8..8b5e1d3 100644 --- a/common/tier0_opcodes.h +++ b/common/tier0_opcodes.h @@ -32,11 +32,11 @@ typedef uintptr_t ucell_t; #define DUP (*++sp = tos) #define PUSH DUP; tos = (cell_t) -#define PARK DUP; *++rp = (cell_t) fp; *++rp = (cell_t) sp; *++rp = (cell_t) ip -#define UNPARK ip = (cell_t *) *rp--; sp = (cell_t *) *rp--; fp = (float *) *rp--; DROP -#define THROWIT(n) rp = *g_sys->throw_handler; *g_sys->throw_handler = (cell_t *) *rp--; \ - sp = (cell_t *) *rp--; fp = (float *) *rp--; ip = (cell_t *) *rp--; \ - NIP; tos = (n); +#define PARK *++rp = (cell_t) ip; *++rp = (cell_t) fp; DUP; *++rp = (cell_t) sp; +#define UNPARK sp = (cell_t *) *rp--; DROP; fp = (float *) *rp--; ip = (cell_t *) *rp--; + +#define THROWIT(n) \ + rp = *g_sys->throw_handler; *g_sys->throw_handler = (cell_t *) *rp--; UNPARK; tos = (n); #define TOFLAGS(xt) ((uint8_t *) (((cell_t *) (xt)) - 1)) #define TONAMELEN(xt) (TOFLAGS(xt) + 1) diff --git a/esp32/builtins.cpp b/esp32/builtins.cpp index 273b254..683478e 100644 --- a/esp32/builtins.cpp +++ b/esp32/builtins.cpp @@ -68,9 +68,9 @@ static void IRAM_ATTR HandleInterrupt(void *arg) { cell_t stack[INTERRUPT_STACK_CELLS]; stack[0] = args->arg; cell_t *rp = rstack; + *++rp = (cell_t) code; *++rp = (cell_t) (fstack + 1); *++rp = (cell_t) (stack + 1); - *++rp = (cell_t) code; forth_run(rp); } diff --git a/web/web.template.js b/web/web.template.js index ed8fe49..11a5f40 100644 --- a/web/web.template.js +++ b/web/web.template.js @@ -340,15 +340,22 @@ function FConvert(pos, n, ret) { function Evaluate1(rp) { var call = 0; var tos, sp, ip, fp; + // UNPARK - ip = i32[rp>>2]; rp -= 4; sp = i32[rp>>2]; rp -= 4; fp = i32[rp>>2]; rp -= 4; tos = i32[sp>>2]; sp -= 4; + sp = i32[rp>>2]; rp -= 4; + tos = i32[sp>>2]; sp -= 4; + fp = i32[rp>>2]; rp -= 4; + ip = i32[rp>>2]; rp -= 4; var name = sp + 8; var len = Parse(32, name); if (len == 0) { // ignore empty sp += 4; i32[sp>>2] = tos; tos = 0; // PARK - sp += 4; i32[sp>>2] = tos; rp += 4; i32[rp>>2] = fp; rp += 4; i32[rp>>2] = sp; rp += 4; i32[rp>>2] = ip; + rp += 4; i32[rp>>2] = ip; + rp += 4; i32[rp>>2] = fp; + sp += 4; i32[sp>>2] = tos; + rp += 4; i32[rp>>2] = sp; return rp; } name = i32[name>>2]; @@ -388,7 +395,10 @@ function Evaluate1(rp) { } sp += 4; i32[sp>>2] = tos; tos = call; // PARK - sp += 4; i32[sp>>2] = tos; rp += 4; i32[rp>>2] = fp; rp += 4; i32[rp>>2] = sp; rp += 4; i32[rp>>2] = ip; + rp += 4; i32[rp>>2] = ip; + rp += 4; i32[rp>>2] = fp; + sp += 4; i32[sp>>2] = tos; + rp += 4; i32[rp>>2] = sp; return rp; } @@ -452,9 +462,9 @@ function Init() { i32[g_sys_ntib>>2] = source_len; i32[g_sys_ntib>>2] = source_len; + rp += 4; i32[rp>>2] = start; rp += 4; i32[rp>>2] = fp; rp += 4; i32[rp>>2] = sp; - rp += 4; i32[rp>>2] = start; i32[g_sys_rp>>2] = rp; } @@ -546,10 +556,10 @@ function VM(stdlib, foreign, heap) { // UNPARK rp = i32[g_sys_rp>>2]|0; - ip = i32[rp>>2]|0; rp = (rp - 4)|0; sp = i32[rp>>2]|0; rp = (rp - 4)|0; - fp = i32[rp>>2]|0; rp = (rp - 4)|0; tos = i32[sp>>2]|0; sp = (sp - 4)|0; + fp = i32[rp>>2]|0; rp = (rp - 4)|0; + ip = i32[rp>>2]|0; rp = (rp - 4)|0; for (;;) { //trace(ip|0, sp|0, tos|0); w = i32[ip>>2]|0;