forth: Forth-ify "WORD"
This commit is contained in:
parent
6e3b47f4a4
commit
8b7947bc6a
Binary file not shown.
@ -121,6 +121,7 @@ NUMBER:
|
|||||||
LIT:
|
LIT:
|
||||||
.dw litWord
|
.dw litWord
|
||||||
.dw INITIAL_SP
|
.dw INITIAL_SP
|
||||||
|
.dw WORDBUF
|
||||||
|
|
||||||
; *** Code ***
|
; *** Code ***
|
||||||
forthMain:
|
forthMain:
|
||||||
@ -179,7 +180,7 @@ INTERPRET:
|
|||||||
.dw DROP
|
.dw DROP
|
||||||
.dw EXECUTE
|
.dw EXECUTE
|
||||||
|
|
||||||
.fill 58
|
.fill 56
|
||||||
|
|
||||||
; STABLE ABI
|
; STABLE ABI
|
||||||
; Offset: 00cd
|
; Offset: 00cd
|
||||||
@ -890,65 +891,10 @@ TOWORD:
|
|||||||
.dw TOWORD
|
.dw TOWORD
|
||||||
.dw EXIT
|
.dw EXIT
|
||||||
|
|
||||||
; Read word from C<, copy to WORDBUF, null-terminate, and return, make
|
.fill 73
|
||||||
; HL point to WORDBUF.
|
|
||||||
.db "WORD"
|
|
||||||
.dw $-TOWORD
|
|
||||||
.db 4
|
|
||||||
; STABLE ABI
|
|
||||||
; Offset: 04f7
|
|
||||||
.out $
|
|
||||||
WORD:
|
|
||||||
.dw compiledWord
|
|
||||||
.dw NUMBER ; ( a )
|
|
||||||
.dw WORDBUF
|
|
||||||
.dw TOWORD ; ( a c )
|
|
||||||
; branch mark
|
|
||||||
.dw OVER ; ( a c a )
|
|
||||||
.dw STORE ; ( a )
|
|
||||||
.dw NUMBER ; ( a 1 )
|
|
||||||
.dw 1
|
|
||||||
.dw PLUS ; ( a+1 )
|
|
||||||
.dw CIN ; ( a c )
|
|
||||||
.dw DUP ; ( a c c )
|
|
||||||
.dw ISWS ; ( a c f )
|
|
||||||
.dw CSKIP ; ( a c )
|
|
||||||
; I'm not sure why, I can't seem to successfully change this into
|
|
||||||
; a (br). I'll get rid of the (fbr) and (bbr) words when I'm done
|
|
||||||
; Forth-ifying "WORD"
|
|
||||||
.dw BBR
|
|
||||||
.db 20 ; here - mark
|
|
||||||
; at this point, we have ( a WS )
|
|
||||||
.dw DROP
|
|
||||||
.dw NUMBER
|
|
||||||
.dw 0
|
|
||||||
.dw SWAP ; ( 0 a )
|
|
||||||
.dw STORE ; ()
|
|
||||||
.dw NUMBER
|
|
||||||
.dw WORDBUF
|
|
||||||
.dw EXIT
|
|
||||||
|
|
||||||
.wcpy:
|
|
||||||
.dw nativeWord
|
|
||||||
ld de, WORDBUF
|
|
||||||
push de ; we already have our result
|
|
||||||
.loop:
|
|
||||||
ld a, (hl)
|
|
||||||
cp ' '+1
|
|
||||||
jr c, .loopend
|
|
||||||
ld (de), a
|
|
||||||
inc hl
|
|
||||||
inc de
|
|
||||||
jr .loop
|
|
||||||
.loopend:
|
|
||||||
; null-terminate the string.
|
|
||||||
xor a
|
|
||||||
ld (de), a
|
|
||||||
jp next
|
|
||||||
|
|
||||||
|
|
||||||
.db "(parsed)"
|
.db "(parsed)"
|
||||||
.dw $-WORD
|
.dw $-TOWORD
|
||||||
.db 8
|
.db 8
|
||||||
PARSED:
|
PARSED:
|
||||||
.dw nativeWord
|
.dw nativeWord
|
||||||
|
@ -51,25 +51,6 @@
|
|||||||
|
|
||||||
: ABORT _c (resSP) QUIT ;
|
: ABORT _c (resSP) QUIT ;
|
||||||
|
|
||||||
: INTERPRET
|
|
||||||
BEGIN
|
|
||||||
WORD
|
|
||||||
(find)
|
|
||||||
IF
|
|
||||||
1 FLAGS !
|
|
||||||
EXECUTE
|
|
||||||
0 FLAGS !
|
|
||||||
ELSE
|
|
||||||
(parse*) @ EXECUTE
|
|
||||||
THEN
|
|
||||||
AGAIN
|
|
||||||
;
|
|
||||||
|
|
||||||
: BOOT
|
|
||||||
LIT< (c<$) (find) IF EXECUTE ELSE DROP THEN
|
|
||||||
_c INTERPRET
|
|
||||||
;
|
|
||||||
|
|
||||||
( This is only the "early parser" in earlier stages. No need
|
( This is only the "early parser" in earlier stages. No need
|
||||||
for an abort message )
|
for an abort message )
|
||||||
: (parse)
|
: (parse)
|
||||||
@ -97,6 +78,26 @@
|
|||||||
HERE @ 1 + HERE !
|
HERE @ 1 + HERE !
|
||||||
;
|
;
|
||||||
|
|
||||||
|
( Read word from C<, copy to WORDBUF, null-terminate, and
|
||||||
|
return, make HL point to WORDBUF. )
|
||||||
|
: WORD
|
||||||
|
( JTBL+30 == WORDBUF )
|
||||||
|
[ JTBL 30 + @ LITN ] ( a )
|
||||||
|
TOWORD ( a c )
|
||||||
|
BEGIN
|
||||||
|
( We take advantage of the fact that char MSB is
|
||||||
|
always zero to pre-write our null-termination )
|
||||||
|
OVER ! ( a )
|
||||||
|
1 + ( a+1 )
|
||||||
|
C< ( a c )
|
||||||
|
DUP WS?
|
||||||
|
UNTIL
|
||||||
|
( a this point, PS is: a WS )
|
||||||
|
( null-termination is already written )
|
||||||
|
DROP DROP
|
||||||
|
[ JTBL 30 + @ LITN ]
|
||||||
|
;
|
||||||
|
|
||||||
: LITN
|
: LITN
|
||||||
( JTBL+24 == NUMBER )
|
( JTBL+24 == NUMBER )
|
||||||
JTBL 24 + ,
|
JTBL 24 + ,
|
||||||
@ -105,7 +106,7 @@
|
|||||||
|
|
||||||
: (entry)
|
: (entry)
|
||||||
HERE @ ( h )
|
HERE @ ( h )
|
||||||
WORD ( h s )
|
_c WORD ( h s )
|
||||||
SCPY ( h )
|
SCPY ( h )
|
||||||
( Adjust HERE -1 because SCPY copies the null )
|
( Adjust HERE -1 because SCPY copies the null )
|
||||||
HERE @ 1 _c - ( h h' )
|
HERE @ 1 _c - ( h h' )
|
||||||
@ -118,6 +119,25 @@
|
|||||||
HERE @ CURRENT !
|
HERE @ CURRENT !
|
||||||
;
|
;
|
||||||
|
|
||||||
|
: INTERPRET
|
||||||
|
BEGIN
|
||||||
|
_c WORD
|
||||||
|
(find)
|
||||||
|
IF
|
||||||
|
1 FLAGS !
|
||||||
|
EXECUTE
|
||||||
|
0 FLAGS !
|
||||||
|
ELSE
|
||||||
|
(parse*) @ EXECUTE
|
||||||
|
THEN
|
||||||
|
AGAIN
|
||||||
|
;
|
||||||
|
|
||||||
|
: BOOT
|
||||||
|
LIT< (c<$) (find) IF EXECUTE ELSE DROP THEN
|
||||||
|
_c INTERPRET
|
||||||
|
;
|
||||||
|
|
||||||
( : and ; have to be defined last because it can't be
|
( : and ; have to be defined last because it can't be
|
||||||
executed now also, they can't have their real name
|
executed now also, they can't have their real name
|
||||||
right away )
|
right away )
|
||||||
@ -128,7 +148,7 @@
|
|||||||
issues. JTBL+24 == NUMBER JTBL+6 == compiledWord )
|
issues. JTBL+24 == NUMBER JTBL+6 == compiledWord )
|
||||||
[ JTBL 24 + , JTBL 6 + , ] ,
|
[ JTBL 24 + , JTBL 6 + , ] ,
|
||||||
BEGIN
|
BEGIN
|
||||||
WORD
|
_c WORD
|
||||||
(find)
|
(find)
|
||||||
( is word )
|
( is word )
|
||||||
IF DUP _c IMMED? IF EXECUTE ELSE , THEN
|
IF DUP _c IMMED? IF EXECUTE ELSE , THEN
|
||||||
|
Loading…
Reference in New Issue
Block a user