Align PARK/UNPARK with THROW/CATCH.

This commit is contained in:
Brad Nelson
2023-01-14 22:53:30 -08:00
parent 2f79192ea0
commit 75d9185027
4 changed files with 23 additions and 13 deletions

View File

@ -285,9 +285,9 @@ static void forth_init(int argc, char *argv[],
g_sys->tib = src; g_sys->tib = src;
g_sys->ntib = src_len; g_sys->ntib = src_len;
*++rp = (cell_t) start;
*++rp = (cell_t) fp; *++rp = (cell_t) fp;
*++rp = (cell_t) sp; *++rp = (cell_t) sp;
*++rp = (cell_t) start;
g_sys->rp = rp; g_sys->rp = rp;
g_sys->runner = forth_run; g_sys->runner = forth_run;
} }

View File

@ -32,11 +32,11 @@ typedef uintptr_t ucell_t;
#define DUP (*++sp = tos) #define DUP (*++sp = tos)
#define PUSH DUP; tos = (cell_t) #define PUSH DUP; tos = (cell_t)
#define PARK DUP; *++rp = (cell_t) fp; *++rp = (cell_t) sp; *++rp = (cell_t) ip #define PARK *++rp = (cell_t) ip; *++rp = (cell_t) fp; DUP; *++rp = (cell_t) sp;
#define UNPARK ip = (cell_t *) *rp--; sp = (cell_t *) *rp--; fp = (float *) *rp--; DROP #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--; \
sp = (cell_t *) *rp--; fp = (float *) *rp--; ip = (cell_t *) *rp--; \ #define THROWIT(n) \
NIP; tos = (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 TOFLAGS(xt) ((uint8_t *) (((cell_t *) (xt)) - 1))
#define TONAMELEN(xt) (TOFLAGS(xt) + 1) #define TONAMELEN(xt) (TOFLAGS(xt) + 1)

View File

@ -68,9 +68,9 @@ static void IRAM_ATTR HandleInterrupt(void *arg) {
cell_t stack[INTERRUPT_STACK_CELLS]; cell_t stack[INTERRUPT_STACK_CELLS];
stack[0] = args->arg; stack[0] = args->arg;
cell_t *rp = rstack; cell_t *rp = rstack;
*++rp = (cell_t) code;
*++rp = (cell_t) (fstack + 1); *++rp = (cell_t) (fstack + 1);
*++rp = (cell_t) (stack + 1); *++rp = (cell_t) (stack + 1);
*++rp = (cell_t) code;
forth_run(rp); forth_run(rp);
} }

View File

@ -340,15 +340,22 @@ function FConvert(pos, n, ret) {
function Evaluate1(rp) { function Evaluate1(rp) {
var call = 0; var call = 0;
var tos, sp, ip, fp; var tos, sp, ip, fp;
// UNPARK // 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 name = sp + 8;
var len = Parse(32, name); var len = Parse(32, name);
if (len == 0) { // ignore empty if (len == 0) { // ignore empty
sp += 4; i32[sp>>2] = tos; tos = 0; sp += 4; i32[sp>>2] = tos; tos = 0;
// PARK // 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; return rp;
} }
name = i32[name>>2]; name = i32[name>>2];
@ -388,7 +395,10 @@ function Evaluate1(rp) {
} }
sp += 4; i32[sp>>2] = tos; tos = call; sp += 4; i32[sp>>2] = tos; tos = call;
// PARK // 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; return rp;
} }
@ -452,9 +462,9 @@ function Init() {
i32[g_sys_ntib>>2] = source_len; i32[g_sys_ntib>>2] = source_len;
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] = fp;
rp += 4; i32[rp>>2] = sp; rp += 4; i32[rp>>2] = sp;
rp += 4; i32[rp>>2] = start;
i32[g_sys_rp>>2] = rp; i32[g_sys_rp>>2] = rp;
} }
@ -546,10 +556,10 @@ function VM(stdlib, foreign, heap) {
// UNPARK // UNPARK
rp = i32[g_sys_rp>>2]|0; 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; 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; 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 (;;) { for (;;) {
//trace(ip|0, sp|0, tos|0); //trace(ip|0, sp|0, tos|0);
w = i32[ip>>2]|0; w = i32[ip>>2]|0;