Align PARK/UNPARK with THROW/CATCH.
This commit is contained in:
@ -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;
|
||||||
}
|
}
|
||||||
|
|||||||
@ -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)
|
||||||
|
|||||||
@ -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);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@ -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;
|
||||||
|
|||||||
Reference in New Issue
Block a user