From 2e9e7047bf371312ec9937b4459a86dff759f0a0 Mon Sep 17 00:00:00 2001 From: Virgil Dupras Date: Wed, 13 May 2020 21:44:46 -0400 Subject: [PATCH] Make INTERPRET break on ASCII EOT This should allow me to simplify LOAD's exit mechanism on block end. --- blk/062 | 4 +++- blk/405 | 6 +++++- blk/406 | 15 ++++++--------- blk/409 | 2 +- blk/411 | 3 +-- blk/429 | 4 ++-- emul/forth.bin | Bin 5862 -> 5936 bytes emul/forth.c | 13 +++---------- 8 files changed, 21 insertions(+), 26 deletions(-) diff --git a/blk/062 b/blk/062 index 6689076..64dcb0d 100644 --- a/blk/062 +++ b/blk/062 @@ -1,5 +1,7 @@ WORD -- a Read one word from buffered input and push its - addr. + addr. Always null terminated. If ASCII EOT is + encountered, a will point to it (it is cons- + idered a word). There are also ascii const emitters: BS CR LF SPC CRLF NL is an indirect word (see B80) that aliases to CRLF by diff --git a/blk/405 b/blk/405 index 9c19033..33eb3ba 100644 --- a/blk/405 +++ b/blk/405 @@ -1,3 +1,7 @@ : WS? 33 < ; +: EOT? 4 = ; ( 4 == ASCII EOT, CTRL+D ) -: TOWORD 0 ( dummy ) BEGIN DROP C< DUP WS? NOT UNTIL ; +: TOWORD + 0 ( dummy ) BEGIN + DROP C< DUP WS? NOT OVER EOT? OR + UNTIL ; diff --git a/blk/406 b/blk/406 index be9cd1f..39b5ee7 100644 --- a/blk/406 +++ b/blk/406 @@ -1,16 +1,13 @@ ( Read word from C<, copy to WORDBUF, null-terminate, and return WORDBUF. ) : WORD - 0x0e RAM+ ( 0e == WORDBUF ) - TOWORD ( a c ) + 0x0e RAM+ TOWORD ( a c ) + DUP EOT? IF OVER ! EXIT THEN BEGIN ( We take advantage of the fact that char MSB is always zero to pre-write our null-termination ) - OVER ! 1+ ( a+1 ) - C< ( a c ) + OVER ! 1+ C< ( a c ) OVER 0x2d ( 2e-1 for NULL ) RAM+ = OVER WS? OR - UNTIL - ( a this point, PS is: a WS ) - ( null-termination is already written ) - 2DROP - 0x0e RAM+ ; + UNTIL ( a c ) + SWAP DROP 0x0e RAM+ ( ws a ) + SWAP EOT? IF 4 OVER ! THEN ; diff --git a/blk/409 b/blk/409 index 36a5086..d2e3917 100644 --- a/blk/409 +++ b/blk/409 @@ -1,6 +1,6 @@ : INTERPRET BEGIN - WORD + WORD DUP C@ EOT? IF DROP EXIT THEN (find) NOT IF (parse) ELSE EXECUTE THEN C point to it ) : (rdln) - (infl) BEGIN (rdlnc) NOT UNTIL + ( EOT or less triggers line flush ) + (infl) BEGIN (rdlnc) 5 < UNTIL LF IN( IN> ! ; - ( And finally, implement C<* ) : RDLN< IN> @ C@ diff --git a/emul/forth.bin b/emul/forth.bin index c26b75ce3b2eb8468cdef761d965ac2a4fe4a471..86dfe1e4d412adb970bcd4aeb0aec734cfa544a2 100644 GIT binary patch delta 1891 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 s8G~oSHvaw{h{DdP=cizW5{16n