|
|
@ -56,7 +56,7 @@ |
|
|
|
|
|
|
|
|
;C >IN -- a-addr holds offset into TIB |
|
|
;C >IN -- a-addr holds offset into TIB |
|
|
; 2 USER >IN |
|
|
; 2 USER >IN |
|
|
head TOIN,3,>IN,douser |
|
|
|
|
|
|
|
|
head TOIN,3,!>IN,douser |
|
|
dw 2 |
|
|
dw 2 |
|
|
|
|
|
|
|
|
;C BASE -- a-addr holds conversion radix |
|
|
;C BASE -- a-addr holds conversion radix |
|
|
@ -132,7 +132,7 @@ TICKSOURCE: call douser ; in name! |
|
|
|
|
|
|
|
|
;C S>D n -- d single -> double prec. |
|
|
;C S>D n -- d single -> double prec. |
|
|
; DUP 0< ; |
|
|
; DUP 0< ; |
|
|
head STOD,3,S>D,docolon |
|
|
|
|
|
|
|
|
head STOD,3,S!>D,docolon |
|
|
dw DUP,ZEROLESS,EXIT |
|
|
dw DUP,ZEROLESS,EXIT |
|
|
|
|
|
|
|
|
;Z ?NEGATE n1 n2 -- n3 negate n1 if n2 negative |
|
|
;Z ?NEGATE n1 n2 -- n3 negate n1 if n2 negative |
|
|
@ -254,7 +254,7 @@ MIN1: dw DROP,EXIT |
|
|
;C 2! x1 x2 a-addr -- store 2 cells |
|
|
;C 2! x1 x2 a-addr -- store 2 cells |
|
|
; SWAP OVER ! CELL+ ! ; |
|
|
; SWAP OVER ! CELL+ ! ; |
|
|
; the top of stack is stored at the lower adrs |
|
|
; the top of stack is stored at the lower adrs |
|
|
head TWOSTORE,2,2!,docolon |
|
|
|
|
|
|
|
|
head TWOSTORE,2,2!!,docolon |
|
|
dw SWOP,OVER,STORE,CELLPLUS,STORE,EXIT |
|
|
dw SWOP,OVER,STORE,CELLPLUS,STORE,EXIT |
|
|
|
|
|
|
|
|
;C 2DROP x1 x2 -- drop 2 cells |
|
|
;C 2DROP x1 x2 -- drop 2 cells |
|
|
@ -348,25 +348,25 @@ TYP5: DW EXIT |
|
|
|
|
|
|
|
|
;Z (S") -- c-addr u run-time code for S" |
|
|
;Z (S") -- c-addr u run-time code for S" |
|
|
; R> COUNT 2DUP + ALIGNED >R ; |
|
|
; R> COUNT 2DUP + ALIGNED >R ; |
|
|
head XSQUOTE,4,(S"),docolon |
|
|
|
|
|
|
|
|
head XSQUOTE,4,(S""!),docolon |
|
|
DW RFROM,COUNT,TWODUP,PLUS,ALIGNED,TOR |
|
|
DW RFROM,COUNT,TWODUP,PLUS,ALIGNED,TOR |
|
|
DW EXIT |
|
|
DW EXIT |
|
|
|
|
|
|
|
|
;C S" -- compile in-line string |
|
|
;C S" -- compile in-line string |
|
|
; COMPILE (S") [ HEX ] |
|
|
; COMPILE (S") [ HEX ] |
|
|
; 22 WORD C@ 1+ ALIGNED ALLOT ; IMMEDIATE |
|
|
; 22 WORD C@ 1+ ALIGNED ALLOT ; IMMEDIATE |
|
|
immed SQUOTE,2,S",docolon |
|
|
|
|
|
|
|
|
immed SQUOTE,2,S"",docolon |
|
|
DW LIT,XSQUOTE,COMMAXT |
|
|
DW LIT,XSQUOTE,COMMAXT |
|
|
DW LIT,22H,WORD,CFETCH,ONEPLUS |
|
|
DW LIT,22H,WORD,CFETCH,ONEPLUS |
|
|
DW ALIGNED,ALLOT,EXIT |
|
|
DW ALIGNED,ALLOT,EXIT |
|
|
|
|
|
|
|
|
;C ." -- compile string to print |
|
|
;C ." -- compile string to print |
|
|
; POSTPONE S" POSTPONE TYPE ; IMMEDIATE |
|
|
; POSTPONE S" POSTPONE TYPE ; IMMEDIATE |
|
|
immed DOTQUOTE,2,.",docolon |
|
|
|
|
|
|
|
|
immed DOTQUOTE,2,."",docolon |
|
|
DW SQUOTE |
|
|
DW SQUOTE |
|
|
DW LIT,TYPE,COMMAXT |
|
|
DW LIT,TYPE,COMMAXT |
|
|
DW EXIT |
|
|
DW EXIT |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
; NUMERIC OUTPUT ================================ |
|
|
; NUMERIC OUTPUT ================================ |
|
|
; Numeric conversion is done l.s.digit first, so |
|
|
; Numeric conversion is done l.s.digit first, so |
|
|
; the output buffer is built backwards in memory. |
|
|
; the output buffer is built backwards in memory. |
|
|
@ -394,12 +394,12 @@ TYP5: DW EXIT |
|
|
|
|
|
|
|
|
;C <# -- begin numeric conversion |
|
|
;C <# -- begin numeric conversion |
|
|
; PAD HP ! ; (initialize Hold Pointer) |
|
|
; PAD HP ! ; (initialize Hold Pointer) |
|
|
head LESSNUM,2,<#,docolon |
|
|
|
|
|
|
|
|
head LESSNUM,2,!<#,docolon |
|
|
DW PAD,HP,STORE,EXIT |
|
|
DW PAD,HP,STORE,EXIT |
|
|
|
|
|
|
|
|
;Z >digit n -- c convert to 0..9A..Z |
|
|
;Z >digit n -- c convert to 0..9A..Z |
|
|
; [ HEX ] DUP 9 > 7 AND + 30 + ; |
|
|
; [ HEX ] DUP 9 > 7 AND + 30 + ; |
|
|
head TODIGIT,6,>DIGIT,docolon |
|
|
|
|
|
|
|
|
head TODIGIT,6,!>DIGIT,docolon |
|
|
DW DUP,LIT,9,GREATER,LIT,7,AND,PLUS |
|
|
DW DUP,LIT,9,GREATER,LIT,7,AND,PLUS |
|
|
DW LIT,30H,PLUS,EXIT |
|
|
DW LIT,30H,PLUS,EXIT |
|
|
|
|
|
|
|
|
@ -417,7 +417,7 @@ NUMS1: DW NUM,TWODUP,OR,ZEROEQUAL,qbranch,NUMS1 |
|
|
|
|
|
|
|
|
;C #> ud1 -- c-addr u end conv., get string |
|
|
;C #> ud1 -- c-addr u end conv., get string |
|
|
; 2DROP HP @ PAD OVER - ; |
|
|
; 2DROP HP @ PAD OVER - ; |
|
|
head NUMGREATER,2,#>,docolon |
|
|
|
|
|
|
|
|
head NUMGREATER,2,#!>,docolon |
|
|
DW TWODROP,HP,FETCH,PAD,OVER,MINUS,EXIT |
|
|
DW TWODROP,HP,FETCH,PAD,OVER,MINUS,EXIT |
|
|
|
|
|
|
|
|
;C SIGN n -- add minus sign if n<0 |
|
|
;C SIGN n -- add minus sign if n<0 |
|
|
@ -434,7 +434,7 @@ SIGN1: DW EXIT |
|
|
|
|
|
|
|
|
;C . n -- display n signed |
|
|
;C . n -- display n signed |
|
|
; <# DUP ABS 0 #S ROT SIGN #> TYPE SPACE ; |
|
|
; <# DUP ABS 0 #S ROT SIGN #> TYPE SPACE ; |
|
|
head DOT,1,'.',docolon |
|
|
|
|
|
|
|
|
head DOT,1,.,docolon |
|
|
DW LESSNUM,DUP,ABS,LIT,0,NUMS |
|
|
DW LESSNUM,DUP,ABS,LIT,0,NUMS |
|
|
DW ROT,SIGN,NUMGREATER,TYPE,SPACE,EXIT |
|
|
DW ROT,SIGN,NUMGREATER,TYPE,SPACE,EXIT |
|
|
|
|
|
|
|
|
@ -465,12 +465,12 @@ SIGN1: DW EXIT |
|
|
|
|
|
|
|
|
;C , x -- append cell to dict |
|
|
;C , x -- append cell to dict |
|
|
; HERE ! 1 CELLS ALLOT ; |
|
|
; HERE ! 1 CELLS ALLOT ; |
|
|
head COMMA,1,',',docolon |
|
|
|
|
|
|
|
|
head COMMA,1,!,,docolon |
|
|
dw HERE,STORE,lit,1,CELLS,ALLOT,EXIT |
|
|
dw HERE,STORE,lit,1,CELLS,ALLOT,EXIT |
|
|
|
|
|
|
|
|
;C C, char -- append char to dict |
|
|
;C C, char -- append char to dict |
|
|
; HERE C! 1 CHARS ALLOT ; |
|
|
; HERE C! 1 CHARS ALLOT ; |
|
|
head CCOMMA,2,'C,',docolon |
|
|
|
|
|
|
|
|
head CCOMMA,2,C!,,docolon |
|
|
dw HERE,CSTORE,lit,1,CHARS,ALLOT,EXIT |
|
|
dw HERE,CSTORE,lit,1,CHARS,ALLOT,EXIT |
|
|
|
|
|
|
|
|
; INTERPRETER =================================== |
|
|
; INTERPRETER =================================== |
|
|
@ -491,7 +491,7 @@ SIGN1: DW EXIT |
|
|
|
|
|
|
|
|
;Z >counted src n dst -- copy to counted str |
|
|
;Z >counted src n dst -- copy to counted str |
|
|
; 2DUP C! CHAR+ SWAP CMOVE ; |
|
|
; 2DUP C! CHAR+ SWAP CMOVE ; |
|
|
head TOCOUNTED,8,>COUNTED,docolon |
|
|
|
|
|
|
|
|
head TOCOUNTED,8,!>COUNTED,docolon |
|
|
DW TWODUP,CSTORE,CHARPLUS,SWOP,CMOVE,EXIT |
|
|
DW TWODUP,CSTORE,CHARPLUS,SWOP,CMOVE,EXIT |
|
|
|
|
|
|
|
|
;C WORD char -- c-addr n word delim'd by char |
|
|
;C WORD char -- c-addr n word delim'd by char |
|
|
@ -516,12 +516,12 @@ WORD1: DW RFROM,RFROM,ROT,MINUS,TOIN,PLUSSTORE |
|
|
|
|
|
|
|
|
;Z NFA>LFA nfa -- lfa name adr -> link field |
|
|
;Z NFA>LFA nfa -- lfa name adr -> link field |
|
|
; 3 - ; |
|
|
; 3 - ; |
|
|
head NFATOLFA,7,NFA>LFA,docolon |
|
|
|
|
|
|
|
|
head NFATOLFA,7,NFA!>LFA,docolon |
|
|
DW LIT,3,MINUS,EXIT |
|
|
DW LIT,3,MINUS,EXIT |
|
|
|
|
|
|
|
|
;Z NFA>CFA nfa -- cfa name adr -> code field |
|
|
;Z NFA>CFA nfa -- cfa name adr -> code field |
|
|
; COUNT 7F AND + ; mask off 'smudge' bit |
|
|
; COUNT 7F AND + ; mask off 'smudge' bit |
|
|
head NFATOCFA,7,NFA>CFA,docolon |
|
|
|
|
|
|
|
|
head NFATOCFA,7,NFA!>CFA,docolon |
|
|
DW COUNT,LIT,07FH,AND,PLUS,EXIT |
|
|
DW COUNT,LIT,07FH,AND,PLUS,EXIT |
|
|
|
|
|
|
|
|
;Z IMMED? nfa -- f fetch immediate flag |
|
|
;Z IMMED? nfa -- f fetch immediate flag |
|
|
@ -599,7 +599,7 @@ QSIGN1: DW EXIT |
|
|
; R> M+ 2SWAP |
|
|
; R> M+ 2SWAP |
|
|
; 1 /STRING |
|
|
; 1 /STRING |
|
|
; REPEAT ; |
|
|
; REPEAT ; |
|
|
head TONUMBER,7,>NUMBER,docolon |
|
|
|
|
|
|
|
|
head TONUMBER,7,!>NUMBER,docolon |
|
|
TONUM1: DW DUP,qbranch,TONUM3 |
|
|
TONUM1: DW DUP,qbranch,TONUM3 |
|
|
DW OVER,CFETCH,DIGITQ |
|
|
DW OVER,CFETCH,DIGITQ |
|
|
DW ZEROEQUAL,qbranch,TONUM2,DROP,EXIT |
|
|
DW ZEROEQUAL,qbranch,TONUM2,DROP,EXIT |
|
|
@ -701,7 +701,7 @@ QABO1: DW TWODROP,EXIT |
|
|
;C ABORT" i*x 0 -- i*x R: j*x -- j*x x1=0 |
|
|
;C ABORT" i*x 0 -- i*x R: j*x -- j*x x1=0 |
|
|
;C i*x x1 -- R: j*x -- x1<>0 |
|
|
;C i*x x1 -- R: j*x -- x1<>0 |
|
|
; POSTPONE S" POSTPONE ?ABORT ; IMMEDIATE |
|
|
; POSTPONE S" POSTPONE ?ABORT ; IMMEDIATE |
|
|
immed ABORTQUOTE,6,ABORT",docolon |
|
|
|
|
|
|
|
|
immed ABORTQUOTE,6,ABORT"",docolon |
|
|
DW SQUOTE |
|
|
DW SQUOTE |
|
|
DW LIT,QABORT,COMMAXT |
|
|
DW LIT,QABORT,COMMAXT |
|
|
DW EXIT |
|
|
DW EXIT |
|
|
@ -753,14 +753,14 @@ TICK: call docolon |
|
|
; R> adrs of headless DOES> def'n |
|
|
; R> adrs of headless DOES> def'n |
|
|
; LATEST @ NFA>CFA code field to fix up |
|
|
; LATEST @ NFA>CFA code field to fix up |
|
|
; !CF ; |
|
|
; !CF ; |
|
|
head XDOES,7,(DOES>),docolon |
|
|
|
|
|
|
|
|
head XDOES,7,(DOES!>),docolon |
|
|
DW RFROM,LATEST,FETCH,NFATOCFA,STORECF |
|
|
DW RFROM,LATEST,FETCH,NFATOCFA,STORECF |
|
|
DW EXIT |
|
|
DW EXIT |
|
|
|
|
|
|
|
|
;C DOES> -- change action of latest def'n |
|
|
;C DOES> -- change action of latest def'n |
|
|
; COMPILE (DOES>) |
|
|
; COMPILE (DOES>) |
|
|
; dodoes ,CF ; IMMEDIATE |
|
|
; dodoes ,CF ; IMMEDIATE |
|
|
immed DOES,5,DOES>,docolon |
|
|
|
|
|
|
|
|
immed DOES,5,DOES!>,docolon |
|
|
DW LIT,XDOES,COMMAXT |
|
|
DW LIT,XDOES,COMMAXT |
|
|
DW LIT,dodoes,COMMACF,EXIT |
|
|
DW LIT,dodoes,COMMACF,EXIT |
|
|
|
|
|
|
|
|
@ -807,7 +807,7 @@ TICK: call docolon |
|
|
;C ; |
|
|
;C ; |
|
|
; REVEAL ,EXIT |
|
|
; REVEAL ,EXIT |
|
|
; POSTPONE [ ; IMMEDIATE |
|
|
; POSTPONE [ ; IMMEDIATE |
|
|
immed SEMICOLON,1,';',docolon |
|
|
|
|
|
|
|
|
immed SEMICOLON,1,!;,docolon |
|
|
DW REVEAL,CEXIT |
|
|
DW REVEAL,CEXIT |
|
|
DW LEFTBRACKET,EXIT |
|
|
DW LEFTBRACKET,EXIT |
|
|
|
|
|
|
|
|
@ -911,12 +911,12 @@ POST2: DW EXIT |
|
|
|
|
|
|
|
|
;Z >L x -- L: -- x move to leave stack |
|
|
;Z >L x -- L: -- x move to leave stack |
|
|
; CELL LP +! LP @ ! ; (L stack grows up) |
|
|
; CELL LP +! LP @ ! ; (L stack grows up) |
|
|
head TOL,2,>L,docolon |
|
|
|
|
|
|
|
|
head TOL,2,!>L,docolon |
|
|
DW CELL,LP,PLUSSTORE,LP,FETCH,STORE,EXIT |
|
|
DW CELL,LP,PLUSSTORE,LP,FETCH,STORE,EXIT |
|
|
|
|
|
|
|
|
;Z L> -- x L: x -- move from leave stack |
|
|
;Z L> -- x L: x -- move from leave stack |
|
|
; LP @ @ CELL NEGATE LP +! ; |
|
|
; LP @ @ CELL NEGATE LP +! ; |
|
|
head LFROM,2,L>,docolon |
|
|
|
|
|
|
|
|
head LFROM,2,L!>,docolon |
|
|
DW LP,FETCH,FETCH |
|
|
DW LP,FETCH,FETCH |
|
|
DW CELL,NEGATE,LP,PLUSSTORE,EXIT |
|
|
DW CELL,NEGATE,LP,PLUSSTORE,EXIT |
|
|
|
|
|
|
|
|
@ -1020,7 +1020,7 @@ DOTS2: DW EXIT |
|
|
DW UINIT,U0,NINIT,CMOVE |
|
|
DW UINIT,U0,NINIT,CMOVE |
|
|
; DW LIT,80h,COUNT,INTERPRET |
|
|
; DW LIT,80h,COUNT,INTERPRET |
|
|
DW XSQUOTE |
|
|
DW XSQUOTE |
|
|
DB 55,'Z80 CamelForth v1.02 25 Jan 1995, ROMWBW 10 Nov 2018' |
|
|
|
|
|
|
|
|
DB 55,'Z80 CamelForth v1.02 25 Jan 1995, ROMWBW 19 Oct 2019' |
|
|
DB 0dh,0ah |
|
|
DB 0dh,0ah |
|
|
DW TYPE,ABORT ; ABORT never returns |
|
|
DW TYPE,ABORT ; ABORT never returns |
|
|
; DON'T FORGET TO UPDATE THE BYTE COUNT IF YOU CHANCGE THE SIZE OF THE BOOT MSG |
|
|
; DON'T FORGET TO UPDATE THE BYTE COUNT IF YOU CHANCGE THE SIZE OF THE BOOT MSG |
|
|
|