108 lines
1.4 KiB
Forth
108 lines
1.4 KiB
Forth
: \ KEY 10 = 0BRANCH [ -20 , ] ; IMMEDIATE \ Now we have line comments :)
|
|
|
|
\ Conditionals
|
|
|
|
: IF
|
|
LIT 0BRANCH ,
|
|
HERE @ 0 ,
|
|
; IMMEDIATE
|
|
|
|
: THEN
|
|
DUP HERE @ SWAP -
|
|
SWAP !
|
|
; IMMEDIATE
|
|
|
|
: ELSE
|
|
LIT BRANCH ,
|
|
HERE @ 0 ,
|
|
SWAP
|
|
DUP HERE @ SWAP -
|
|
SWAP !
|
|
; IMMEDIATE
|
|
|
|
\ Loops
|
|
|
|
: BEGIN HERE @ ; IMMEDIATE
|
|
|
|
: UNTIL
|
|
LIT 0BRANCH ,
|
|
HERE @ - ,
|
|
; IMMEDIATE
|
|
|
|
: AGAIN
|
|
LIT BRANCH ,
|
|
HERE @ - ,
|
|
; IMMEDIATE
|
|
|
|
\ Recursive calls
|
|
|
|
: RECURSE LATEST @ >CFA , ; IMMEDIATE
|
|
|
|
\ Block comments (with nesting)
|
|
|
|
: (
|
|
BEGIN
|
|
KEY DUP
|
|
40 = IF RECURSE THEN
|
|
41 =
|
|
UNTIL
|
|
; IMMEDIATE
|
|
|
|
( ( Take that, C ) )
|
|
|
|
\ Peripheral register addresses
|
|
|
|
: TXBUF 0 ;
|
|
: RXBUF 32 ;
|
|
: TXHEAD 64 ;
|
|
: TXTAIL 65 ;
|
|
: RXHEAD 66 ;
|
|
: RXTAIL 67 ;
|
|
: SYSREADY 68 ;
|
|
|
|
\ Printing utilities
|
|
|
|
: CR 10 EMIT ;
|
|
: SPACE 32 EMIT ;
|
|
|
|
: CHAR
|
|
KEY
|
|
STATE @ 0<> IF
|
|
LIT LIT , , \ Append LIT <key> to definition if compiling
|
|
THEN
|
|
; IMMEDIATE
|
|
|
|
: EMIT-DIGIT
|
|
DUP 10 < IF CHAR 0 ELSE CHAR A THEN
|
|
+ EMIT
|
|
;
|
|
|
|
: .
|
|
\ Handle negatives
|
|
DUP 0< IF CHAR - EMIT NEGATE THEN
|
|
|
|
\ Determine starting place value
|
|
1 BEGIN BASE @ * 2DUP / 0= UNTIL
|
|
|
|
\ Print leading non-zero digits
|
|
BEGIN
|
|
BASE @ /
|
|
2DUP / EMIT-DIGIT
|
|
TUCK MOD SWAP
|
|
OVER 0=
|
|
UNTIL
|
|
|
|
\ Print any trailing zeros
|
|
BASE @ /
|
|
DUP 0<> IF
|
|
BEGIN CHAR 0 EMIT BASE @ / 0= UNTIL
|
|
THEN
|
|
|
|
2DROP
|
|
;
|
|
|
|
\ Set SYSREADY high to indicate prelude has finished and enable user
|
|
\ input on the JS side.
|
|
|
|
1 SYSREADY AC!
|