diff --git a/common/core.h b/common/core.h index f3bdb91..ce0b710 100644 --- a/common/core.h +++ b/common/core.h @@ -189,11 +189,14 @@ static cell_t parse(cell_t sep, cell_t *ret) { return len; } -static cell_t *evaluate1(cell_t *sp, float **fp) { +static cell_t *evaluate1(cell_t *rp) { cell_t call = 0; + cell_t tos, *sp, *ip; + float *fp; + UNPARK; cell_t name; cell_t len = parse(' ', &name); - if (len == 0) { *++sp = 0; return sp; } // ignore empty + if (len == 0) { DUP; tos = 0; PARK; return rp; } // ignore empty cell_t xt = find((const char *) name, len); if (xt) { if (g_sys->state && !(((cell_t *) xt)[-1] & IMMEDIATE)) { @@ -208,7 +211,7 @@ static cell_t *evaluate1(cell_t *sp, float **fp) { *g_sys->heap++ = g_sys->DOLIT_XT; *g_sys->heap++ = n; } else { - *++sp = n; + PUSH n; } } else { float f; @@ -217,7 +220,7 @@ static cell_t *evaluate1(cell_t *sp, float **fp) { *g_sys->heap++ = g_sys->DOFLIT_XT; *(float *) g_sys->heap++ = f; } else { - *++(*fp) = f; + *++fp = f; } } else { #if PRINT_ERRORS @@ -225,15 +228,16 @@ static cell_t *evaluate1(cell_t *sp, float **fp) { fwrite((void *) name, 1, len, stderr); fprintf(stderr, "\n"); #endif - *++sp = name; - *++sp = len; + PUSH name; + PUSH len; *++sp = -1; call = g_sys->notfound; } } } - *++sp = call; - return sp; + PUSH call; + PARK; + return rp; } static cell_t *forth_run(cell_t *initrp); diff --git a/common/opcodes.h b/common/opcodes.h index ece43b4..8f36648 100644 --- a/common/opcodes.h +++ b/common/opcodes.h @@ -140,16 +140,14 @@ typedef struct { XV(forth, "CONSTANT", CONSTANT, DUP; DUP; tos = parse(32, sp); \ create((const char *) *sp, tos, 0, ADDROF(DOCON)); \ DROPn(2); COMMA(tos); DROP) \ - X("DOES>", DOES, DOES(ip); ip = (cell_t *) *rp; --rp) \ - Y(IMMEDIATE, DOIMMEDIATE()) \ + XV(forth, "DOES>", DOES, DOES(ip); ip = (cell_t *) *rp; --rp) \ + XV(forth, "IMMEDIATE", IMMEDIATE, DOIMMEDIATE()) \ XV(internals, "'SYS", SYS, DUP; tos = (cell_t) g_sys) \ YV(internals, YIELD, PARK; return rp) \ X(":", COLON, DUP; DUP; tos = parse(32, sp); \ create((const char *) *sp, tos, SMUDGE, ADDROF(DOCOL)); \ g_sys->state = -1; --sp; DROP) \ - YV(internals, EVALUATE1, DUP; float *tfp = fp; \ - sp = evaluate1(sp, &tfp); \ - fp = tfp; w = *sp--; DROP; if (w) JMPW) \ + YV(internals, EVALUATE1, PARK; rp = evaluate1(rp); UNPARK; w = tos; DROP; if (w) JMPW) \ Y(EXIT, ip = (cell_t *) *rp--) \ XV(internals, "'builtins", TBUILTINS, DUP; tos = (cell_t) &g_sys->builtins->code) \ XV(forth_immediate, ";", SEMICOLON, COMMA(g_sys->DOEXIT_XT); UNSMUDGE(); g_sys->state = 0) diff --git a/web/fuse_web.js b/web/fuse_web.js index 68ea16b..5f240ef 100755 --- a/web/fuse_web.js +++ b/web/fuse_web.js @@ -88,7 +88,7 @@ cases = ReplaceAll(cases, 'COMMA(tos)', 'COMMA(tos|0)'); cases = ReplaceAll(cases, /find\(([^\n]+)\);/, 'find($1)|0;'); cases = ReplaceAll(cases, 'tos = parse(tos, sp)', 'tos = parse(tos|0, sp|0)|0'); cases = ReplaceAll(cases, 'tos = parse(32, sp)', 'tos = parse(32, sp|0)|0'); -cases = ReplaceAll(cases, 'sp = evaluate1(sp)', 'sp = evaluate1(sp|0)|0'); +cases = ReplaceAll(cases, 'rp = evaluate1(rp)', 'rp = evaluate1(rp|0)|0'); cases = ReplaceAll(cases, /convert\(([^\n]+), sp\)/, 'convert($1, sp|0)|0'); cases = ReplaceAll(cases, 'DOES(ip)', 'DOES(ip|0)'); cases = ReplaceAll(cases, 'PARK;', ''); // TODO