Added Yield and rentrancy.

This commit is contained in:
Brad Nelson
2021-01-07 19:20:05 -08:00
parent 11347df9e5
commit 3384da882f
2 changed files with 38 additions and 27 deletions

View File

@ -16,6 +16,7 @@ static struct {
int argc;
char **argv;
cell_t DOLIT_XT, DOEXIT_XT;
cell_t *ip, *sp, *rp; // Parked alternates
} g_sys;
static cell_t convert(const char *pos, cell_t n, cell_t *ret) {
@ -117,33 +118,16 @@ static cell_t *evaluate1(cell_t *sp) {
return sp;
}
static void ueforth(int argc, char *argv[], void *heap,
const char *src, cell_t src_len) {
memset(&g_sys, 0, sizeof(g_sys));
g_sys.heap = (cell_t *) heap;
register cell_t *sp = g_sys.heap; g_sys.heap += STACK_SIZE;
register cell_t *rp = g_sys.heap; g_sys.heap += STACK_SIZE;
register cell_t tos = 0, *ip, w;
dcell_t d;
udcell_t ud;
static void ueforth_run() {
if (!g_sys.ip) {
#define X(name, op, code) create(name, sizeof(name) - 1, name[0] == ';', && OP_ ## op);
PLATFORM_OPCODE_LIST
OPCODE_LIST
PLATFORM_OPCODE_LIST
OPCODE_LIST
#undef X
g_sys.last[-1] = 1; // Make ; IMMEDIATE
g_sys.DOLIT_XT = FIND("DOLIT");
g_sys.DOEXIT_XT = FIND("EXIT");
g_sys.notfound = FIND("DROP");
ip = g_sys.heap;
*g_sys.heap++ = FIND("EVALUATE1");
*g_sys.heap++ = FIND("BRANCH");
*g_sys.heap++ = (cell_t) ip;
g_sys.argc = argc;
g_sys.argv = argv;
g_sys.base = 10;
g_sys.tib = src;
g_sys.ntib = src_len;
NEXT;
return;
}
register cell_t *ip = g_sys.ip, *rp = g_sys.rp, *sp = g_sys.sp, tos, w;
DROP; NEXT;
#define X(name, op, code) OP_ ## op: { code; } NEXT;
PLATFORM_OPCODE_LIST
OPCODE_LIST
@ -153,3 +137,28 @@ static void ueforth(int argc, char *argv[], void *heap,
OP_DODOES: DUP; tos = w + sizeof(cell_t) * 2;
++rp; *rp = (cell_t) ip; ip = (cell_t *) *(cell_t *) (w + sizeof(cell_t)); NEXT;
}
static void ueforth(int argc, char *argv[], void *heap,
const char *src, cell_t src_len) {
memset(&g_sys, 0, sizeof(g_sys));
g_sys.heap = (cell_t *) heap;
ueforth_run();
g_sys.sp = g_sys.heap + sizeof(cell_t); g_sys.heap += STACK_SIZE;
g_sys.rp = g_sys.heap; g_sys.heap += STACK_SIZE;
g_sys.last[-1] = 1; // Make ; IMMEDIATE
g_sys.DOLIT_XT = FIND("DOLIT");
g_sys.DOEXIT_XT = FIND("EXIT");
g_sys.notfound = FIND("DROP");
g_sys.ip = g_sys.heap;
*g_sys.heap++ = FIND("EVALUATE1");
*g_sys.heap++ = FIND("BRANCH");
*g_sys.heap++ = (cell_t) g_sys.ip;
g_sys.argc = argc;
g_sys.argv = argv;
g_sys.base = 10;
g_sys.tib = src;
g_sys.ntib = src_len;
for (;;) {
ueforth_run();
}
}

View File

@ -19,12 +19,13 @@ typedef uint64_t udcell_t;
#define COMMA(n) *g_sys.heap++ = (n)
#define IMMEDIATE() g_sys.last[-1] |= 1
#define DOES(ip) *g_sys.last = (cell_t) && OP_DODOES; g_sys.last[1] = (cell_t) ip
#define UMSMOD ud = *(udcell_t *) &sp[-1]; \
#define UMSMOD udcell_t ud = *(udcell_t *) &sp[-1]; \
--sp; *sp = (cell_t) (ud % tos); \
tos = (cell_t) (ud / tos)
#define SSMOD d = (dcell_t) *sp * (dcell_t) sp[-1]; \
#define SSMOD dcell_t d = (dcell_t) *sp * (dcell_t) sp[-1]; \
--sp; *sp = (cell_t) (((udcell_t) d) % tos); \
tos = (cell_t) (d < 0 ? ~(~d / tos) : d / tos)
#define PARK DUP; g_sys.ip = ip; g_sys.rp = rp; g_sys.sp = sp
#define OPCODE_LIST \
X("0=", ZEQUAL, tos = !tos ? -1 : 0) \
@ -73,6 +74,7 @@ typedef uint64_t udcell_t;
X("DOES>", DOES, DOES((cell_t *) ((cell_t) ip|0)); ip = (cell_t *) (*rp | 0); --rp) \
X("IMMEDIATE", IMMEDIATE, IMMEDIATE()) \
X("'SYS", SYS, DUP; tos = (cell_t) &g_sys) \
X("YIELD", YIELD, PARK; return) \
X(":", COLON, DUP; DUP; tos = parse(32, (cell_t *) ((cell_t) sp | 0))|0; \
create((const char *) (*sp | 0), tos|0, 0, && OP_DOCOLON); \
g_sys.state = -1; --sp; DROP) \