|
|
@ -115,8 +115,8 @@ N(mod, "mod", &w_ndiv) { sp[1] %= sp[0]; ++sp; NEXT; }
|
|
|
|
N(and, "and", &w_mod) { sp[1] &= sp[0]; ++sp; NEXT; }
|
|
|
|
N(and, "and", &w_mod) { sp[1] &= sp[0]; ++sp; NEXT; }
|
|
|
|
N(or, "or", &w_and) { sp[1] |= sp[0]; ++sp; NEXT; }
|
|
|
|
N(or, "or", &w_and) { sp[1] |= sp[0]; ++sp; NEXT; }
|
|
|
|
N(xor, "xor", &w_or) { sp[1] ^= sp[0]; ++sp; NEXT; }
|
|
|
|
N(xor, "xor", &w_or) { sp[1] ^= sp[0]; ++sp; NEXT; }
|
|
|
|
N(eq, "=", &w_xor) { sp[1] = sp[0] == sp[1]; ++sp; NEXT; }
|
|
|
|
N(eq, "=", &w_xor) { sp[1] = sp[0] == sp[1] ? -1 : 0; ++sp; NEXT; }
|
|
|
|
N(lt, "<", &w_eq) { sp[1] = sp[0] > sp[1]; ++sp; NEXT; }
|
|
|
|
N(lt, "<", &w_eq) { sp[1] = sp[0] > sp[1] ? -1 : 0; ++sp; NEXT; }
|
|
|
|
N(compname, "_c", &w_lt) ;
|
|
|
|
N(compname, "_c", &w_lt) ;
|
|
|
|
C(intr, "[", &w_compname) { STATE = 0; NEXT; }
|
|
|
|
C(intr, "[", &w_compname) { STATE = 0; NEXT; }
|
|
|
|
N(comp, "]", &w_intr) { STATE = -1; NEXT; }
|
|
|
|
N(comp, "]", &w_intr) { STATE = -1; NEXT; }
|
|
|
@ -165,7 +165,7 @@ N(pushr2, "2>r", &w_popr) { *--rp = (intptr_t **)sp[1];
|
|
|
|
N(popr2, "2r>", &w_pushr2) { *--sp = (intptr_t)rp[1];
|
|
|
|
N(popr2, "2r>", &w_pushr2) { *--sp = (intptr_t)rp[1];
|
|
|
|
*--sp = (intptr_t)rp[0]; rp += 2; NEXT; }
|
|
|
|
*--sp = (intptr_t)rp[0]; rp += 2; NEXT; }
|
|
|
|
N(rpeek, "r@", &w_popr2) { *--sp = (intptr_t)*rp; NEXT; }
|
|
|
|
N(rpeek, "r@", &w_popr2) { *--sp = (intptr_t)*rp; NEXT; }
|
|
|
|
N(i, "i", &w_rpeek) { *--sp = (intptr_t)*rp; NEXT; }
|
|
|
|
N(i, "i", &w_rpeek) { goto *&rpeek; }
|
|
|
|
I(fdo, "do", &w_i) LIT(pushr2), comma, FTH(begin), END
|
|
|
|
I(fdo, "do", &w_i) LIT(pushr2), comma, FTH(begin), END
|
|
|
|
I(loop, "loop", &w_fdo) LIT(popr), comma,
|
|
|
|
I(loop, "loop", &w_fdo) LIT(popr), comma,
|
|
|
|
LIT(enter), comma,
|
|
|
|
LIT(enter), comma,
|
|
|
@ -180,9 +180,9 @@ I(loop, "loop", &w_fdo) LIT(popr), comma,
|
|
|
|
LIT(drop), comma, LIT(drop), comma, END
|
|
|
|
LIT(drop), comma, LIT(drop), comma, END
|
|
|
|
W(immediate, "immediate", &w_loop) FTH(latest), LIT(2 * sizeof(intptr_t)), add,
|
|
|
|
W(immediate, "immediate", &w_loop) FTH(latest), LIT(2 * sizeof(intptr_t)), add,
|
|
|
|
LIT(ATTR_IMMEDIATE), over, cpeek, or, swap, cpoke, END
|
|
|
|
LIT(ATTR_IMMEDIATE), over, cpeek, or, swap, cpoke, END
|
|
|
|
#define LATEST_INIT &w_immediate
|
|
|
|
// Be sure to update LATEST_INIT in foci.h!
|
|
|
|
|
|
|
|
|
|
|
|
void enter_forth(const void *ptr)
|
|
|
|
static void enter_forth(void *ptr)
|
|
|
|
{
|
|
|
|
{
|
|
|
|
STASH;
|
|
|
|
STASH;
|
|
|
|
sp = saved_sp;
|
|
|
|
sp = saved_sp;
|
|
|
@ -281,7 +281,7 @@ static void parse_word(const char *start, const char *end)
|
|
|
|
*here++ = (intptr_t)l->body[0];
|
|
|
|
*here++ = (intptr_t)l->body[0];
|
|
|
|
}
|
|
|
|
}
|
|
|
|
} else {
|
|
|
|
} else {
|
|
|
|
enter_forth(l->body);
|
|
|
|
enter_forth((void *)l->body);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
@ -333,9 +333,9 @@ int compiling(void)
|
|
|
|
return STATE;
|
|
|
|
return STATE;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
void define(struct word_t *w)
|
|
|
|
void define(const struct word_t *w)
|
|
|
|
{
|
|
|
|
{
|
|
|
|
w->prev = (struct word_t *)LATEST;
|
|
|
|
//w->prev = (struct word_t *)LATEST;
|
|
|
|
LATEST = (intptr_t)w;
|
|
|
|
LATEST = (intptr_t)w;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|