Browse Source

Make INTERPRET break on ASCII EOT

This should allow me to simplify LOAD's exit mechanism on block
end.
pull/102/head
Virgil Dupras 4 years ago
parent
commit
2e9e7047bf
8 changed files with 21 additions and 26 deletions
  1. +3
    -1
      blk/062
  2. +5
    -1
      blk/405
  3. +6
    -9
      blk/406
  4. +1
    -1
      blk/409
  5. +1
    -2
      blk/411
  6. +2
    -2
      blk/429
  7. BIN
      emul/forth.bin
  8. +3
    -10
      emul/forth.c

+ 3
- 1
blk/062 View File

@@ -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


+ 5
- 1
blk/405 View File

@@ -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 ;

+ 6
- 9
blk/406 View File

@@ -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 ;

+ 1
- 1
blk/409 View File

@@ -1,6 +1,6 @@
: INTERPRET
BEGIN
WORD
WORD DUP C@ EOT? IF DROP EXIT THEN
(find)
NOT IF (parse) ELSE EXECUTE THEN
C<? NOT IF LIT< (ok) (find) IF EXECUTE THEN THEN


+ 1
- 2
blk/411 View File

@@ -9,6 +9,5 @@
['] (boot<) 0x0c RAM+ !
( boot< always has a char waiting. 06 == C<?* )
1 0x06 RAM+ !
INTERPRET
;
INTERPRET BYE ;


+ 2
- 2
blk/429 View File

@@ -1,8 +1,8 @@
( Read one line in input buffer and make IN> 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@


BIN
emul/forth.bin View File


+ 3
- 10
emul/forth.c View File

@@ -17,7 +17,6 @@
#define BLK_PORT 0x03
#define BLKDATA_PORT 0x04

static int running;
static FILE *fp;
static FILE *blkfp;
static int retcode = 0;
@@ -27,18 +26,14 @@ static uint8_t iord_stdio()
{
int c = getc(fp);
if (c == EOF) {
running = 0;
c = 4; // ASCII EOT
}
return (uint8_t)c;
}

static void iowr_stdio(uint8_t val)
{
if (val == 0x04) { // CTRL+D
running = 0;
} else {
putchar(val);
}
putchar(val);
}

static void iowr_ret(uint8_t val)
@@ -123,9 +118,7 @@ int main(int argc, char *argv[])
}

// Run!
running = 1;

while (running && emul_step());
while (emul_step());

if (tty) {
printf("\nDone!\n");


Loading…
Cancel
Save