1
0
mirror of https://github.com/hsoft/collapseos.git synced 2024-11-02 08:30:55 +11:00

Compare commits

..

3 Commits

Author SHA1 Message Date
Virgil Dupras
80d730318a Simplify LOAD's INTERPRET exit mechanism 2020-05-13 22:55:52 -04:00
Virgil Dupras
2e9e7047bf Make INTERPRET break on ASCII EOT
This should allow me to simplify LOAD's exit mechanism on block
end.
2020-05-13 21:44:46 -04:00
Virgil Dupras
052d59a3a2 TOWORD: tiny optimization
My mind is getting forthy.
2020-05-13 20:59:00 -04:00
11 changed files with 21 additions and 53 deletions

View File

@ -2,4 +2,3 @@ INTERPRET -- Get a line from stdin, compile it in tmp memory,
then execute the compiled contents. then execute the compiled contents.
LEAVE -- In a DO..LOOP, exit at the next LOOP call. LEAVE -- In a DO..LOOP, exit at the next LOOP call.
QUIT -- Return to interpreter prompt immediately QUIT -- Return to interpreter prompt immediately
EXIT! -- Exit current INTERPRET loop.

View File

@ -1,5 +1,7 @@
WORD -- a Read one word from buffered input and push its 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: There are also ascii const emitters:
BS CR LF SPC CRLF BS CR LF SPC CRLF
NL is an indirect word (see B80) that aliases to CRLF by NL is an indirect word (see B80) that aliases to CRLF by

10
blk/405
View File

@ -1,9 +1,7 @@
: WS? 33 < ; : WS? 33 < ;
: EOT? 4 = ; ( 4 == ASCII EOT, CTRL+D )
: TOWORD : TOWORD
BEGIN 0 ( dummy ) BEGIN
C< DUP WS? NOT IF EXIT THEN DROP DROP C< DUP WS? NOT OVER EOT? OR
AGAIN UNTIL ;
;

15
blk/406
View File

@ -1,16 +1,13 @@
( Read word from C<, copy to WORDBUF, null-terminate, and ( Read word from C<, copy to WORDBUF, null-terminate, and
return WORDBUF. ) return WORDBUF. )
: WORD : WORD
0x0e RAM+ ( 0e == WORDBUF ) 0x0e RAM+ TOWORD ( a c )
TOWORD ( a c ) DUP EOT? IF OVER ! EXIT THEN
BEGIN BEGIN
( We take advantage of the fact that char MSB is ( We take advantage of the fact that char MSB is
always zero to pre-write our null-termination ) always zero to pre-write our null-termination )
OVER ! 1+ ( a+1 ) OVER ! 1+ C< ( a c )
C< ( a c )
OVER 0x2d ( 2e-1 for NULL ) RAM+ = OVER WS? OR OVER 0x2d ( 2e-1 for NULL ) RAM+ = OVER WS? OR
UNTIL UNTIL ( a c )
( a this point, PS is: a WS ) SWAP DROP 0x0e RAM+ ( ws a )
( null-termination is already written ) SWAP EOT? IF 4 OVER ! THEN ;
2DROP
0x0e RAM+ ;

11
blk/409
View File

@ -1,16 +1,7 @@
: INTERPRET : INTERPRET
BEGIN BEGIN
WORD WORD DUP C@ EOT? IF DROP EXIT THEN
(find) (find)
NOT IF (parse) ELSE EXECUTE THEN NOT IF (parse) ELSE EXECUTE THEN
C<? NOT IF LIT< (ok) (find) IF EXECUTE THEN THEN C<? NOT IF LIT< (ok) (find) IF EXECUTE THEN THEN
AGAIN ; AGAIN ;
( Drop RSP until I-2 == INTERPRET. )
: EXIT!
['] INTERPRET ( I )
BEGIN ( I )
DUP ( I I )
R> DROP I 2- @ ( I I a )
= UNTIL
DROP ;

View File

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

View File

@ -1,8 +1,8 @@
( Read one line in input buffer and make IN> point to it ) ( Read one line in input buffer and make IN> point to it )
: (rdln) : (rdln)
(infl) BEGIN (rdlnc) NOT UNTIL ( EOT or less triggers line flush )
(infl) BEGIN (rdlnc) 5 < UNTIL
LF IN( IN> ! ; LF IN( IN> ! ;
( And finally, implement C<* ) ( And finally, implement C<* )
: RDLN< : RDLN<
IN> @ C@ IN> @ C@

11
blk/432
View File

@ -1,14 +1,3 @@
: _
(boot<)
DUP 4 = IF
( We drop our char, but also "a" from WORD: it won't
have the opportunity to balance PSP because we're
EXIT!ing. )
2DROP
( We're finished interpreting )
EXIT!
THEN
;
( pre-comment for tight LOAD: The 0x08==I check after INTERPRET ( pre-comment for tight LOAD: The 0x08==I check after INTERPRET
is to check whether we're restoring to "_", the word above. is to check whether we're restoring to "_", the word above.
if yes, then we're in a nested load. Also, the 1 in 0x06 is if yes, then we're in a nested load. Also, the 1 in 0x06 is

View File

@ -5,7 +5,7 @@
0x2e RAM+ @ >R ( boot ptr ) 0x2e RAM+ @ >R ( boot ptr )
BLK@ BLK@
BLK( 0x2e RAM+ ! ( Point to beginning of BLK ) BLK( 0x2e RAM+ ! ( Point to beginning of BLK )
['] _ 0x08 RAM+ ! ['] (boot<) 0x08 RAM+ !
1 0x06 RAM+ ! ( 06 == C<? ) 1 0x06 RAM+ ! ( 06 == C<? )
INTERPRET INTERPRET
R> 0x2e RAM+ ! R> 0x06 RAM+ ! R> 0x2e RAM+ ! R> 0x06 RAM+ !

Binary file not shown.

View File

@ -17,7 +17,6 @@
#define BLK_PORT 0x03 #define BLK_PORT 0x03
#define BLKDATA_PORT 0x04 #define BLKDATA_PORT 0x04
static int running;
static FILE *fp; static FILE *fp;
static FILE *blkfp; static FILE *blkfp;
static int retcode = 0; static int retcode = 0;
@ -27,18 +26,14 @@ static uint8_t iord_stdio()
{ {
int c = getc(fp); int c = getc(fp);
if (c == EOF) { if (c == EOF) {
running = 0; c = 4; // ASCII EOT
} }
return (uint8_t)c; return (uint8_t)c;
} }
static void iowr_stdio(uint8_t val) static void iowr_stdio(uint8_t val)
{ {
if (val == 0x04) { // CTRL+D putchar(val);
running = 0;
} else {
putchar(val);
}
} }
static void iowr_ret(uint8_t val) static void iowr_ret(uint8_t val)
@ -123,9 +118,7 @@ int main(int argc, char *argv[])
} }
// Run! // Run!
running = 1; while (emul_step());
while (running && emul_step());
if (tty) { if (tty) {
printf("\nDone!\n"); printf("\nDone!\n");