Separate last into current and context to progress towards vocabularies.
This commit is contained in:
@ -37,8 +37,9 @@
|
|||||||
: state ( -- a ) 'sys 3 cells + ;
|
: state ( -- a ) 'sys 3 cells + ;
|
||||||
: base ( -- a ) 'sys 4 cells + ;
|
: base ( -- a ) 'sys 4 cells + ;
|
||||||
: 'heap ( -- a ) 'sys 5 cells + ;
|
: 'heap ( -- a ) 'sys 5 cells + ;
|
||||||
: last ( -- a ) 'sys 6 cells + ;
|
: current ( -- a ) 'sys 6 cells + ;
|
||||||
: 'notfound ( -- a ) 'sys 7 cells + ;
|
: context ( -- a ) 'sys 7 cells + ;
|
||||||
|
: 'notfound ( -- a ) 'sys 8 cells + ;
|
||||||
|
|
||||||
( Dictionary )
|
( Dictionary )
|
||||||
: here ( -- a ) 'heap @ ;
|
: here ( -- a ) 'heap @ ;
|
||||||
@ -194,7 +195,7 @@ variable hld
|
|||||||
75 value line-width
|
75 value line-width
|
||||||
: onlines ( n xt -- n xt )
|
: onlines ( n xt -- n xt )
|
||||||
swap dup line-width > if drop 0 cr then over >name nip + 1+ swap ;
|
swap dup line-width > if drop 0 cr then over >name nip + 1+ swap ;
|
||||||
: words 0 last @ begin onlines dup see. >link dup 0= until 2drop cr ;
|
: words 0 context @ @ begin onlines dup see. >link dup 0= until 2drop cr ;
|
||||||
|
|
||||||
( Examine Memory )
|
( Examine Memory )
|
||||||
: dump ( a n -- )
|
: dump ( a n -- )
|
||||||
|
|||||||
@ -11,7 +11,7 @@
|
|||||||
static struct {
|
static struct {
|
||||||
const char *tib;
|
const char *tib;
|
||||||
cell_t ntib, tin, state, base;
|
cell_t ntib, tin, state, base;
|
||||||
cell_t *heap, *last, notfound;
|
cell_t *heap, **current, **context, notfound;
|
||||||
int argc;
|
int argc;
|
||||||
char **argv;
|
char **argv;
|
||||||
cell_t *rp; // spot to park main thread
|
cell_t *rp; // spot to park main thread
|
||||||
@ -45,7 +45,7 @@ static cell_t same(const char *a, const char *b, cell_t len) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
static cell_t find(const char *name, cell_t len) {
|
static cell_t find(const char *name, cell_t len) {
|
||||||
cell_t *pos = g_sys.last;
|
cell_t *pos = *g_sys.context;
|
||||||
cell_t clen = CELL_LEN(len);
|
cell_t clen = CELL_LEN(len);
|
||||||
while (pos) {
|
while (pos) {
|
||||||
if (len == pos[-3] &&
|
if (len == pos[-3] &&
|
||||||
@ -62,9 +62,9 @@ static void create(const char *name, cell_t length, cell_t flags, void *op) {
|
|||||||
for (cell_t n = length; n; --n) { *pos++ = *name++; } // name
|
for (cell_t n = length; n; --n) { *pos++ = *name++; } // name
|
||||||
g_sys.heap += CELL_LEN(length);
|
g_sys.heap += CELL_LEN(length);
|
||||||
*g_sys.heap++ = length; // length
|
*g_sys.heap++ = length; // length
|
||||||
*g_sys.heap++ = (cell_t) g_sys.last; // link
|
*g_sys.heap++ = (cell_t) *g_sys.current; // link
|
||||||
*g_sys.heap++ = flags; // flags
|
*g_sys.heap++ = flags; // flags
|
||||||
g_sys.last = g_sys.heap;
|
*g_sys.current = g_sys.heap;
|
||||||
*g_sys.heap++ = (cell_t) op; // code
|
*g_sys.heap++ = (cell_t) op; // code
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -125,10 +125,12 @@ static cell_t *ueforth_run(cell_t *initrp);
|
|||||||
static void ueforth_init(int argc, char *argv[], void *heap,
|
static void ueforth_init(int argc, char *argv[], void *heap,
|
||||||
const char *src, cell_t src_len) {
|
const char *src, cell_t src_len) {
|
||||||
g_sys.heap = (cell_t *) heap + 4; // Leave a little room.
|
g_sys.heap = (cell_t *) heap + 4; // Leave a little room.
|
||||||
ueforth_run(0);
|
|
||||||
cell_t *sp = g_sys.heap + 1; g_sys.heap += STACK_SIZE;
|
cell_t *sp = g_sys.heap + 1; g_sys.heap += STACK_SIZE;
|
||||||
cell_t *rp = g_sys.heap + 1; g_sys.heap += STACK_SIZE;
|
cell_t *rp = g_sys.heap + 1; g_sys.heap += STACK_SIZE;
|
||||||
g_sys.last[-1] = 1; // Make ; IMMEDIATE
|
g_sys.current = (cell_t **) g_sys.heap;
|
||||||
|
g_sys.context = (cell_t **) g_sys.heap; ++g_sys.heap;
|
||||||
|
ueforth_run(0);
|
||||||
|
(*g_sys.current)[-1] = 1; // Make last word ; IMMEDIATE
|
||||||
g_sys.DOLIT_XT = FIND("DOLIT");
|
g_sys.DOLIT_XT = FIND("DOLIT");
|
||||||
g_sys.DOEXIT_XT = FIND("EXIT");
|
g_sys.DOEXIT_XT = FIND("EXIT");
|
||||||
g_sys.YIELD_XT = FIND("YIELD");
|
g_sys.YIELD_XT = FIND("YIELD");
|
||||||
|
|||||||
@ -9,8 +9,8 @@ typedef uintptr_t ucell_t;
|
|||||||
#define DUP *++sp = tos
|
#define DUP *++sp = tos
|
||||||
#define DROP tos = *sp--
|
#define DROP tos = *sp--
|
||||||
#define COMMA(n) *g_sys.heap++ = (n)
|
#define COMMA(n) *g_sys.heap++ = (n)
|
||||||
#define IMMEDIATE() g_sys.last[-1] |= 1
|
#define IMMEDIATE() (*g_sys.current)[-1] |= 1
|
||||||
#define DOES(ip) *g_sys.last = (cell_t) ADDR_DODOES; g_sys.last[1] = (cell_t) ip
|
#define DOES(ip) **g_sys.current = (cell_t) ADDR_DODOES; (*g_sys.current)[1] = (cell_t) ip
|
||||||
#define PARK DUP; *++rp = (cell_t) sp; *++rp = (cell_t) ip
|
#define PARK DUP; *++rp = (cell_t) sp; *++rp = (cell_t) ip
|
||||||
|
|
||||||
#ifndef SSMOD_FUNC
|
#ifndef SSMOD_FUNC
|
||||||
|
|||||||
@ -39,7 +39,7 @@ variable confirm-old-type
|
|||||||
variable tests-found variable tests-run variable tests-passed
|
variable tests-found variable tests-run variable tests-passed
|
||||||
: test? ( xt -- f ) >name s" test-" startswith? ;
|
: test? ( xt -- f ) >name s" test-" startswith? ;
|
||||||
: for-tests ( xt -- )
|
: for-tests ( xt -- )
|
||||||
last @ begin dup while dup test? if 2dup >r >r swap execute r> r> then >link repeat 2drop ;
|
context @ @ begin dup while dup test? if 2dup >r >r swap execute r> r> then >link repeat 2drop ;
|
||||||
: reset-test-counters 0 tests-found ! 0 tests-run ! 0 tests-passed ! ;
|
: reset-test-counters 0 tests-found ! 0 tests-run ! 0 tests-passed ! ;
|
||||||
: count-test ( xt -- ) drop 1 tests-found +! ;
|
: count-test ( xt -- ) drop 1 tests-found +! ;
|
||||||
: check-fresh depth if }confirm ." DEPTH LEAK! " depth . 1 throw then ;
|
: check-fresh depth if }confirm ." DEPTH LEAK! " depth . 1 throw then ;
|
||||||
|
|||||||
@ -1,6 +1,6 @@
|
|||||||
( Arguments )
|
( Arguments )
|
||||||
: 'argc ( -- a ) 'sys 8 cells + ;
|
: 'argc ( -- a ) 'sys 9 cells + ;
|
||||||
: 'argv ( -- a ) 'sys 9 cells + ;
|
: 'argv ( -- a ) 'sys 10 cells + ;
|
||||||
: argc ( -- n ) 'argc @ ;
|
: argc ( -- n ) 'argc @ ;
|
||||||
: argv ( n -- a n ) cells 'argv @ + @ z>s ;
|
: argv ( n -- a n ) cells 'argv @ + @ z>s ;
|
||||||
|
|
||||||
|
|||||||
@ -519,7 +519,8 @@ C and Forth (by way of a memory region accessed via <code>'SYS</code>):
|
|||||||
BASE --- Numeric base for printing and parsing
|
BASE --- Numeric base for printing and parsing
|
||||||
|
|
||||||
STATE --- State of compiling, -1 for compiling, 0 for interpreting
|
STATE --- State of compiling, -1 for compiling, 0 for interpreting
|
||||||
LAST --- Execution token of last word defined
|
CURRENT --- Pointer to pointer to last word of current vocabulary
|
||||||
|
CONTEXT --- Pointer to pointer to last word of context vocabulary
|
||||||
|
|
||||||
'NOTFOUND --- Execution token of a handler to call on word not found
|
'NOTFOUND --- Execution token of a handler to call on word not found
|
||||||
</pre>
|
</pre>
|
||||||
|
|||||||
@ -20,13 +20,14 @@ var g_tin = g_sys + 2 * 4;
|
|||||||
var g_state = g_sys + 3 * 4;
|
var g_state = g_sys + 3 * 4;
|
||||||
var g_base = g_sys + 4 * 4;
|
var g_base = g_sys + 4 * 4;
|
||||||
var g_heap = g_sys + 5 * 4;
|
var g_heap = g_sys + 5 * 4;
|
||||||
var g_last = g_sys + 6 * 4;
|
var g_current = g_sys + 6 * 4;
|
||||||
var g_notfound = g_sys + 7 * 4;
|
var g_context = g_sys + 7 * 4;
|
||||||
var g_argc = g_sys + 8 * 4;
|
var g_notfound = g_sys + 8 * 4;
|
||||||
var g_argv = g_sys + 9 * 4;
|
var g_argc = g_sys + 9 * 4;
|
||||||
var g_ip = g_sys + 10 * 4;
|
var g_argv = g_sys + 10 * 4;
|
||||||
var g_sp = g_sys + 11 * 4;
|
var g_ip = g_sys + 11 * 4;
|
||||||
var g_rp = g_sys + 12 * 4;
|
var g_sp = g_sys + 12 * 4;
|
||||||
|
var g_rp = g_sys + 13 * 4;
|
||||||
|
|
||||||
function SetEval(sp) {
|
function SetEval(sp) {
|
||||||
var index = i32[sp--];
|
var index = i32[sp--];
|
||||||
@ -72,7 +73,7 @@ function GetName(xt) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
function Find(name) {
|
function Find(name) {
|
||||||
var pos = i32[g_last>>2];
|
var pos = i32[i32[g_context>>2]>>2];
|
||||||
while (pos) {
|
while (pos) {
|
||||||
if (Same(GetName(pos), name)) {
|
if (Same(GetName(pos), name)) {
|
||||||
return pos;
|
return pos;
|
||||||
@ -89,15 +90,15 @@ function create(name, opcode) {
|
|||||||
i32[i32[g_heap>>2]>>2] = name.length; // length
|
i32[i32[g_heap>>2]>>2] = name.length; // length
|
||||||
i32[g_heap>>2] += 4;
|
i32[g_heap>>2] += 4;
|
||||||
|
|
||||||
i32[i32[g_heap>>2]>>2] = i32[g_last>>2]; // link
|
i32[i32[g_heap>>2]>>2] = i32[i32[g_current]>>2]>>2]; // link
|
||||||
i32[g_heap>>2] += 4;
|
i32[g_heap>>2] += 4;
|
||||||
|
|
||||||
i32[i32[g_heap>>2]>>2] = 0; // flags
|
i32[i32[g_heap>>2]>>2] = 0; // flags
|
||||||
i32[g_heap>>2] += 4;
|
i32[g_heap>>2] += 4;
|
||||||
|
|
||||||
i32[g_last>>2] = i32[g_heap>>2];
|
i32[i32[g_current>>2]>>2] = i32[g_heap>>2];
|
||||||
|
|
||||||
i32[i32[g_last>>2]>>2] = opcode; // code
|
i32[i32[i32[g_current>>2]>>2]>>2] = opcode; // code
|
||||||
i32[g_heap>>2] += 4;
|
i32[g_heap>>2] += 4;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -116,7 +117,7 @@ function Init() {
|
|||||||
i32[g_heap>>2] += STACK_SIZE;
|
i32[g_heap>>2] += STACK_SIZE;
|
||||||
i32[g_rp>>2] = i32[g_heap>>2] + 1;
|
i32[g_rp>>2] = i32[g_heap>>2] + 1;
|
||||||
i32[g_heap>>2] += STACK_SIZE;
|
i32[g_heap>>2] += STACK_SIZE;
|
||||||
i32[(g_last - 4)>>2] = 1; // Make ; IMMMEDIATE
|
i32[((i32[g_current]>>2) - 4)>>2] = 1; // Make ; IMMMEDIATE
|
||||||
// Do not need DOLIT_XT, DOEXIT_XT, YIELD_XT (do by convention)
|
// Do not need DOLIT_XT, DOEXIT_XT, YIELD_XT (do by convention)
|
||||||
i32[g_notfound>>2] = Find('DROP');
|
i32[g_notfound>>2] = Find('DROP');
|
||||||
i32[g_ip>>2] = i32[g_heap>>2];
|
i32[g_ip>>2] = i32[g_heap>>2];
|
||||||
|
|||||||
Reference in New Issue
Block a user