705d68deec
With KEY and EMIT being switch words, most of the high layer can be defined before drivers. In addition to this change, I've compacted core blocks which were becoming quite sparse.
16 lines
559 B
Plaintext
16 lines
559 B
Plaintext
: (rdlnc) ( -- c )
|
|
( buffer overflow? same as if we typed a newline )
|
|
IN> @ IN) = IF 0x0a ELSE KEY THEN ( c )
|
|
DUP 0x0a = IF DROP 0xd THEN ( lf? same as cr )
|
|
( backspace? handle and exit )
|
|
DUP BS? IF _bs EXIT THEN
|
|
( echo back )
|
|
DUP EMIT ( c )
|
|
( write and advance )
|
|
DUP ( keep as result ) ( c c )
|
|
( We take advantage of the fact that c's MSB is always zero and
|
|
thus ! automatically null-terminates our string )
|
|
IN> @ ! 1 IN> +! ( c )
|
|
( if newline, replace with zero to indicate EOL )
|
|
DUP 0xd = IF DROP 0 THEN ;
|