174 lines
2.5 KiB
Forth
174 lines
2.5 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
|
|
;
|
|
|
|
: TYPE ( addr len -- )
|
|
BEGIN
|
|
DUP 0= IF 2DROP EXIT THEN
|
|
SWAP DUP C@ EMIT 1+
|
|
SWAP 1-
|
|
AGAIN
|
|
;
|
|
|
|
: C, HERE @ C! 1 HERE +! ;
|
|
|
|
: ."
|
|
STATE @ IF
|
|
LIT BRANCH , \ Compile BRANCH for jumping over string data
|
|
HERE @ 0 , \ Compile placeholder offset and push offset cell address
|
|
0 BEGIN
|
|
KEY
|
|
DUP CHAR " = IF
|
|
DROP
|
|
HERE @ ALIGN HERE ! \ Pad to alignment
|
|
SWAP DUP HERE @ SWAP - \ Compute offset
|
|
OVER ! \ Update branch offset to skip data
|
|
4+ LIT LIT , , \ Append LIT <addr>
|
|
LIT LIT , , \ Append LIT <len>
|
|
LIT TYPE , \ Append TYPE
|
|
EXIT
|
|
THEN
|
|
C, 1+ \ Write byte and increment length
|
|
AGAIN
|
|
ELSE
|
|
BEGIN
|
|
KEY
|
|
DUP CHAR " = IF DROP EXIT THEN
|
|
EMIT
|
|
AGAIN
|
|
THEN
|
|
; IMMEDIATE
|
|
|
|
CHAR . EMIT
|
|
|
|
\ Version number
|
|
|
|
: VERSION-MAJOR 0 ;
|
|
: VERSION-MINOR 1 ;
|
|
: VERSION-PATCH 0 ;
|
|
|
|
: VERSION-PRINT
|
|
." v" VERSION-MAJOR .
|
|
." ." VERSION-MINOR .
|
|
." ." VERSION-PATCH .
|
|
;
|
|
|
|
\ Welcome banner
|
|
|
|
: BANNER
|
|
." _ __ " CR
|
|
." _ __(_)__ ___ / / " CR
|
|
." | |/|/ / / _ \_ (_-./ _ \" CR
|
|
." |__,__/_/ .__(_)___/_//_/" CR
|
|
." /_/ " CR
|
|
CR
|
|
." Wipforth " VERSION-PRINT CR
|
|
CR
|
|
;
|
|
|
|
BANNER
|
|
|
|
\ Set SYSREADY high to indicate prelude has finished and enable user
|
|
\ input on the JS side.
|
|
|
|
1 SYSREADY AC!
|