forth: transform (find) into FIND which is an indirect call
You'll see where I'm going with this...
This commit is contained in:
parent
b162ef84f5
commit
243c70a4b7
Binary file not shown.
@ -6,7 +6,7 @@
|
||||
: LITS LIT SCPY ;
|
||||
: LIT< WORD LITS ; IMMEDIATE
|
||||
: _err LIT< word-not-found (print) ABORT ;
|
||||
: ' WORD (find) NOT (?br) [ 4 , ] _err ;
|
||||
: ' WORD FIND NOT (?br) [ 4 , ] _err ;
|
||||
: ['] ' LITN ; IMMEDIATE
|
||||
: COMPILE ' LITN ['] , , ; IMMEDIATE
|
||||
: [COMPILE] ' , ; IMMEDIATE
|
||||
@ -106,16 +106,16 @@
|
||||
|
||||
: (sysv)
|
||||
( Get new sysv addr )
|
||||
( RAM+46 (2e) == SYSVNXT )
|
||||
46 RAM+ @
|
||||
( RAM+48 (30) == SYSVNXT )
|
||||
48 RAM+ @
|
||||
CONSTANT
|
||||
( increase current sysv counter )
|
||||
2 46 RAM+ +!
|
||||
2 48 RAM+ +!
|
||||
;
|
||||
|
||||
( Set up initial SYSVNXT value, which is 2 bytes after its
|
||||
own address )
|
||||
46 RAM+ DUP 2 + SWAP !
|
||||
48 RAM+ DUP 2 + SWAP !
|
||||
|
||||
: ."
|
||||
LIT
|
||||
|
@ -32,8 +32,6 @@ directly, but as part of another word.
|
||||
"*I*" in description indicates an IMMEDIATE word.
|
||||
|
||||
*** Defining words ***
|
||||
(find) a -- a f Read at a and find it in dict. If found, f=1 and
|
||||
a = wordref. If not found, f=0 and a = string addr.
|
||||
: x ... -- Define a new word
|
||||
; R:I -- Exit a colon definition
|
||||
, n -- Write n in HERE and advance it.
|
||||
@ -49,6 +47,8 @@ CREATE x -- Create cell named x. Doesn't allocate a PF.
|
||||
COMPILE x -- Meta compiles. Kind of blows the mind. See below.
|
||||
CONSTANT x n -- Creates cell x that when called pushes its value
|
||||
DOES> -- See description at top of file
|
||||
FIND a -- a f Read at a and find it in dict. If found, f=1 and
|
||||
a = wordref. If not found, f=0 and a = string addr.
|
||||
IMMED? a -- f Checks whether wordref at a is immediate.
|
||||
IMMEDIATE -- Flag the latest defined word as immediate.
|
||||
LITN n -- Write number n as a literal.
|
||||
|
@ -130,6 +130,11 @@
|
||||
LIT< stack-underflow _c (print) _c ABORT
|
||||
;
|
||||
|
||||
: FIND
|
||||
( 0e == FINDPTR )
|
||||
0x0e _c RAM+ _c @ EXECUTE
|
||||
;
|
||||
|
||||
: C<
|
||||
( 0c == CINPTR )
|
||||
0x0c _c RAM+ _c @ EXECUTE
|
||||
@ -159,8 +164,8 @@
|
||||
( Read word from C<, copy to WORDBUF, null-terminate, and
|
||||
return, make HL point to WORDBUF. )
|
||||
: WORD
|
||||
( 0e == WORDBUF )
|
||||
0x0e _c RAM+ ( a )
|
||||
( 10 == WORDBUF )
|
||||
0x10 _c RAM+ ( a )
|
||||
_c TOWORD ( a c )
|
||||
BEGIN
|
||||
( We take advantage of the fact that char MSB is
|
||||
@ -173,7 +178,7 @@
|
||||
( a this point, PS is: a WS )
|
||||
( null-termination is already written )
|
||||
_c 2DROP
|
||||
0x0e _c RAM+
|
||||
0x10 _c RAM+
|
||||
;
|
||||
|
||||
: (entry)
|
||||
@ -194,7 +199,7 @@
|
||||
: INTERPRET
|
||||
BEGIN
|
||||
_c WORD
|
||||
_c (find)
|
||||
_c FIND
|
||||
IF
|
||||
1 _c FLAGS _c !
|
||||
EXECUTE
|
||||
@ -206,12 +211,16 @@
|
||||
;
|
||||
|
||||
: BOOT
|
||||
LIT< (parse) _c (find) _c DROP _c (parse*) _c !
|
||||
LIT< (c<) _c (find) _c
|
||||
NOT IF LIT< KEY _c (find) _c DROP THEN
|
||||
( write (find) in PARSEPTR, RAM+0e )
|
||||
( a bit wasteful, but otherwise I have bootstrap
|
||||
issues with "," )
|
||||
LIT< (find) _c (find) _c DROP 0x0e _c RAM+ _c !
|
||||
LIT< (parse) _c FIND _c DROP _c (parse*) _c !
|
||||
LIT< (c<) _c FIND _c
|
||||
NOT IF LIT< KEY _c FIND _c DROP THEN
|
||||
( 0c == CINPTR )
|
||||
0x0c _c RAM+ _c !
|
||||
LIT< (c<$) _c (find) IF EXECUTE ELSE _c DROP THEN
|
||||
LIT< (c<$) _c FIND IF EXECUTE ELSE _c DROP THEN
|
||||
_c INTERPRET
|
||||
;
|
||||
|
||||
@ -234,7 +243,7 @@
|
||||
[ 32 H@ ! 2 ALLOT 14 H@ ! 2 ALLOT ] _c ,
|
||||
BEGIN
|
||||
_c WORD
|
||||
_c (find)
|
||||
_c FIND
|
||||
( is word )
|
||||
IF _c DUP _c IMMED? IF EXECUTE ELSE _c , THEN
|
||||
( maybe number )
|
||||
|
@ -85,9 +85,10 @@ RAMSTART INITIAL_SP
|
||||
+08 FLAGS
|
||||
+0a PARSEPTR
|
||||
+0c CINPTR
|
||||
+0e WORDBUF
|
||||
+2e SYSVNXT
|
||||
+4e RAMEND
|
||||
+0e FINDPTR
|
||||
+10 WORDBUF
|
||||
+30 SYSVNXT
|
||||
+50 RAMEND
|
||||
|
||||
INITIAL_SP holds the initial Stack Pointer value so that we know where to reset
|
||||
it on ABORT
|
||||
@ -104,6 +105,8 @@ PARSEPTR holds routine address called on (parse)
|
||||
|
||||
CINPTR holds routine address called on C<
|
||||
|
||||
FINDPTR holds routine address called on FIND
|
||||
|
||||
WORDBUF is the buffer used by WORD
|
||||
|
||||
SYSVNXT is the buffer+tracker used by (sysv)
|
||||
|
Loading…
Reference in New Issue
Block a user