255 lines
3.8 KiB
Forth
255 lines
3.8 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 ) )
|
|
|
|
\ 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 10 - 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 @ /
|
|
DUP 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
|
|
|
|
\ Misc utilities
|
|
|
|
: NIP SWAP DROP ;
|
|
|
|
: HEX 16 BASE ! ;
|
|
|
|
: DECIMAL 10 BASE ! ;
|
|
|
|
: '
|
|
WORD FIND DUP 0<> IF
|
|
>CFA
|
|
ELSE
|
|
DROP WNFHOOK EXECUTE
|
|
THEN
|
|
;
|
|
|
|
: [COMPILE] ' , ; IMMEDIATE
|
|
|
|
\ Constants, variables and values
|
|
|
|
: CONSTANT
|
|
WORD CREATE
|
|
DOCOL ,
|
|
LIT LIT ,
|
|
,
|
|
LIT EXIT ,
|
|
;
|
|
|
|
: VARIABLE
|
|
WORD CREATE
|
|
DOVAR ,
|
|
0 ,
|
|
;
|
|
|
|
: VALUE
|
|
WORD CREATE
|
|
DOVAL , ,
|
|
;
|
|
|
|
: TO
|
|
' 4+
|
|
STATE @ IF
|
|
LIT LIT , ,
|
|
LIT ! ,
|
|
ELSE
|
|
!
|
|
THEN
|
|
; IMMEDIATE
|
|
|
|
\ Peripheral register addresses
|
|
|
|
HEX
|
|
|
|
000 CONSTANT TXBUF
|
|
080 CONSTANT RXBUF
|
|
100 CONSTANT TXHEAD
|
|
104 CONSTANT TXTAIL
|
|
108 CONSTANT RXHEAD
|
|
10C CONSTANT RXTAIL
|
|
110 CONSTANT SYSREADY
|
|
114 CONSTANT SYSINTER
|
|
|
|
DECIMAL
|
|
|
|
\ A better word-not-found handler
|
|
|
|
: ANY-RX? RXHEAD AC@ RXTAIL AC@ <> ;
|
|
|
|
: WNF-HANDLER
|
|
." Unknown word: "
|
|
WORDBUF SWAP TYPE CR
|
|
STATE @ IF
|
|
\ Remove incomplete definition and switch back to interpret mode
|
|
LATEST @ HERE !
|
|
LATEST @ @ LATEST !
|
|
[COMPILE] [
|
|
THEN
|
|
\ We only consume to the next newline if there is RX data available,
|
|
\ because if the offending word was at the end of the line then the
|
|
\ newline would have already been consumed by WORD.
|
|
ANY-RX? IF BEGIN KEY 10 = UNTIL THEN
|
|
QUIT
|
|
;
|
|
|
|
' WNF-HANDLER TO WNFHOOK
|
|
|
|
\ Version number
|
|
|
|
0 CONSTANT VERSION-MAJOR
|
|
2 CONSTANT VERSION-MINOR
|
|
2 CONSTANT VERSION-PATCH
|
|
|
|
: PRINT-VERSION
|
|
CHAR v EMIT VERSION-MAJOR .
|
|
CHAR . EMIT VERSION-MINOR .
|
|
CHAR . EMIT VERSION-PATCH .
|
|
;
|
|
|
|
\ Welcome banner
|
|
|
|
: BANNER
|
|
." _ __ " CR
|
|
." _ __(_)__ ___ / / " CR
|
|
." | |/|/ / / _ \_ (_-./ _ \" CR
|
|
." |__,__/_/ .__(_)___/_//_/" CR
|
|
." /_/ " CR
|
|
CR
|
|
." Welcome to Wipforth " PRINT-VERSION ." !" CR
|
|
." Copyright (c) Camden Dixie O'Brien" CR
|
|
CR
|
|
." Wipforth is freely available to use, modify and distribute for personal use" CR
|
|
." under the Komorebi license, version 2.0.0." CR
|
|
CR
|
|
;
|
|
|
|
\ Set SYSREADY high and wait until interactive
|
|
1 SYSREADY AC!
|
|
SYSINTER WAIT DROP
|
|
|
|
BANNER
|