1 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
3 ;; based on AberSoft FIG-Forth v1.1A
4 ;; restored & partially rewritten by Ketmar
5 ;; distribution terms: GNU GPL v3
6 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
8 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
9 ;; excuse me my English, i'm not a native speaker
10 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
11 ;; the code has to be optimized!!!
12 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
15 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
24 ;; bit 5: SMUDGE flag (=1: word definition isn't finished)
25 ;; bit 6: IMMEDIATE flag (=1: true)
27 ;; the last byte of the name always has bit 7 set
29 ;; for CODE words: cfa points to the body
30 ;; for FORTH words: cfa points to "_doforth"
31 ;; for CONST words: cfa points to "_doconst"
32 ;; for VAR words: cfa points to "_dovar"
33 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
35 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
38 ;; BC: address interpreter insrtuction pointer
40 ;; IY: used by ROM, do not change
41 ;; all other regs are free
44 ;; data stack: machine stask (PUSH/POP)
45 ;; exec stack: address with f_curRP (last item)
46 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
50 ;; start address: #6000
53 jp run_0 ;; DO NOT CHANGE THIS TO JR!
61 ; save byte at #C000 for 48K
72 out (c),a ;; now #C000 should be the screen page #5
73 ld (#C000),a ;; trash it
75 out (c),a ;; and go back (just in case) %-)
77 or a ;; now check if we really trashed the scrren
98 ;;;;;;;;;;;;;;; VARIABLES
103 f_curRP: defw #D7AE ;; ???
105 ;; address of the first "user" variable (def: run_cold-64)
106 f_userBASE: defw #D7B0
112 defw #D600 ;; S0: starting SP. SP grows to addr #0000
113 defw #D7AE ;; R0: starting RP. RP grows to addr #0000
117 defw latest_byte ;; FENCE
118 defw latest_byte ;; DP
119 defw forth_voc_link ;; VOC-LINK
120 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
122 ;;; address interpreter
143 ;;; end of address interpreter
146 $FORTH_CONST (.NEXT) i_next
147 $FORTH_CONST (.PUSHHL) i_pushhl
148 $FORTH_CONST (.PUSHDEHL) i_pushde
149 $FORTH_CONST (@CUR-RP) f_curRP
150 $FORTH_CONST (@CUR-BASE) f_userBASE
151 $FORTH_CONST (LAST-7FFD) f_cur7FFD
154 ;; 6x8 printing driver
162 ;;;; return to BASIC?
170 $FORTH_END_CODE_WORD BYE
172 $FORTH_CODE_WORD 128K?
178 $FORTH_END_CODE_WORD 128K?
180 $FORTH_CODE_WORD 48K?
187 $FORTH_END_CODE_WORD 48K?
191 (.") ~\n48K/128K dsFORTH v0.0.1\n~
192 (.") ~original version: \x7F Abersoft, 1983\n~
193 (.") ~modifications by Ketmar//Invisible Vector\n~
194 ;; (.") ~distribution terms: GNU GPL\n~
196 $FORTH_END_WORD .CREDITZ
207 $FORTH_END_CODE_WORD LIT
209 $FORTH_CODE_WORD EXECUTE
214 $FORTH_END_CODE_WORD EXECUTE
216 $FORTH_CODE_WORD BRANCH FBRANCH
229 $FORTH_END_CODE_WORD BRANCH
231 $FORTH_CODE_WORD 0BRANCH FBRANCH
241 $FORTH_END_CODE_WORD 0BRANCH
243 $FORTH_CODE_WORD TBRANCH FBRANCH
250 $FORTH_END_CODE_WORD TBRANCH
252 $FORTH_CODE_WORD (LOOP) FBRANCH
289 $FORTH_END_CODE_WORD (LOOP)
291 $FORTH_CODE_WORD (+LOOP) FBRANCH
295 $FORTH_END_CODE_WORD (+LOOP)
297 $FORTH_CODE_WORD (DO)
315 $FORTH_END_CODE_WORD (DO)
325 $FORTH_END_CODE_WORD I
337 $FORTH_END_CODE_WORD I'
351 $FORTH_END_CODE_WORD J
353 $FORTH_CODE_WORD DIGIT
374 $FORTH_END_CODE_WORD DIGIT
376 $FORTH_CODE_WORD (FIND)
378 ;; ( addr l addr2 -- pfa b tf ok)
379 ;; ( addr l addr2 -- ff bad)
427 $FORTH_END_CODE_WORD (FIND)
429 $FORTH_CODE_WORD ENCLOSE
431 ;; ( addr delimeter -- addr w_start_ofs w_end_ofs next_scan_ofs )
432 pop de ;; E=delimeter
441 ;; here: E=word len; A=delim; HL=addr
450 push de ;; store # of delimiters before the word
452 ld d,a ;; D=delimiter
453 ;; check for "end of buffer" (#0)
458 ;; oops... no more blondies on the island
461 push de ;; store full length
464 push de ;; store position of the next char to scan
467 ;; here: E=word len; D=delim; HL=addr
469 ;; now collect the word itself
474 jr z,enclose2 ;; word ends?
475 ;; no, check "end of buffer"
480 ;; oops... no more blondies on the island
482 push de ;; store full length
483 push de ;; store position of the next char to scan (???)
488 push de ;; store full length
490 push de ;; store position of the next char to scan
492 $FORTH_END_CODE_WORD ENCLOSE
494 ;; check if BREAK is pressed
495 $FORTH_CODE_WORD ?BREAK
499 call #1F54 ;; uses only A
504 $FORTH_END_CODE_WORD ?BREAK
506 $FORTH_CODE_WORD PAGE-CMOVE
508 ;; CMOVE with page swapping
509 ;; ( from to len destpage -- )
510 ;; addr must be >= #C000
513 ;;AND #07 ; we can have much more memory
514 ; get other args and save BC
519 ex (sp),hl ; save BC and get src
535 $FORTH_END_CODE_WORD PAGE-CMOVE
537 $FORTH_CODE_WORD CMOVE
539 ;; ( from to len -- )
552 $FORTH_END_CODE_WORD CMOVE
554 $FORTH_CODE_WORD FILL
574 $FORTH_END_CODE_WORD FILL
576 ;; include "fastmuldiv.zas"
577 include "fastmuldiv_small.zas"
587 $FORTH_END_CODE_WORD <<
597 $FORTH_END_CODE_WORD >>
599 $FORTH_CODE_WORD 256*
606 $FORTH_END_CODE_WORD 256*
620 $FORTH_END_CODE_WORD and
634 $FORTH_END_CODE_WORD or
648 $FORTH_END_CODE_WORD xor
657 $FORTH_END_CODE_WORD SP@
667 $FORTH_END_CODE_WORD sp!
675 $FORTH_END_CODE_WORD RP@
684 $FORTH_END_CODE_WORD RP!
686 ;; end of "colon" word
697 $FORTH_END_CODE_WORD ;S
699 ;; DO/LOOP will stop on the next iteration
700 $FORTH_CODE_WORD LEAVE
712 $FORTH_END_CODE_WORD LEAVE
714 ;; move value from paremeter stack to execution stack
727 $FORTH_END_CODE_WORD >R
729 ;; move value from execution stack to paremeter stack
740 $FORTH_END_CODE_WORD R>
742 ;; copy value from execution stack to paremeter stack
752 $FORTH_END_CODE_WORD R@
754 $FORTH_CODE_WORD RDROP
761 $FORTH_END_CODE_WORD RDROP
776 $FORTH_END_CODE_WORD 0=
782 $FORTH_END_CODE_WORD NOT
795 $FORTH_END_CODE_WORD 0<
816 $FORTH_END_CODE_WORD <
821 2DUP XOR 0< 0BRANCH uless0
822 DROP 0< 0= BRANCH uless1
871 $FORTH_END_CODE_WORD 1+
879 $FORTH_END_CODE_WORD 2+
889 $FORTH_END_CODE_WORD 4+
896 $FORTH_END_CODE_WORD 1-
904 $FORTH_END_CODE_WORD 2-
914 $FORTH_END_CODE_WORD 4-
923 $FORTH_END_CODE_WORD +
933 $FORTH_END_CODE_WORD -
954 $FORTH_END_CODE_WORD d+
957 ;; TODO: error on -32768?
958 $FORTH_CODE_WORD NEGATE
966 $FORTH_END_CODE_WORD NEGATE
969 ;; TODO: error on MAXLONGINT?
970 $FORTH_CODE_WORD DNEGATE
989 $FORTH_END_CODE_WORD DNEGATE
991 $FORTH_CODE_WORD DROP
997 $FORTH_END_CODE_WORD DROP
999 $FORTH_CODE_WORD 2DROP
1004 $FORTH_END_CODE_WORD 2DROP
1006 $FORTH_CODE_WORD OVER
1008 ;; ( n0 n1 -- n0 n1 n0 )
1013 $FORTH_END_CODE_WORD OVER
1017 ;; ( d0 d1 -- d0 d1 d0 )
1018 ;; k8: rewrite on asm?
1019 2SWAP 2DUP >R >R 2SWAP R> R> ;S
1020 $FORTH_END_WORD 2OVER
1022 $FORTH_CODE_WORD SWAP
1024 ;; ( n0 n1 -- n1 n0 )
1028 $FORTH_END_CODE_WORD SWAP
1032 ;; ( d0 d1 -- d1 d0 )
1033 ;; k8: rewrite on asm?
1035 $FORTH_END_WORD 2SWAP
1037 $FORTH_CODE_WORD dup
1043 $FORTH_END_CODE_WORD dup
1045 $FORTH_CODE_WORD -dup
1047 ;; ( n -- n n ) if n is not 0
1048 ;; ( n -- n ) if n is 0
1055 $FORTH_END_CODE_WORD -dup
1057 $FORTH_CODE_WORD 2DUP
1065 $FORTH_END_CODE_WORD 2DUP
1067 $FORTH_CODE_WORD ROT
1069 ;; ( n0 n1 n2 -- n1 n2 n0 )
1074 $FORTH_END_CODE_WORD ROT
1089 $FORTH_END_CODE_WORD +!
1091 $FORTH_CODE_WORD TOGGLE
1100 $FORTH_END_CODE_WORD TOGGLE
1119 $FORTH_END_CODE_WORD 2@
1128 $FORTH_END_CODE_WORD C@
1139 $FORTH_END_CODE_WORD @
1155 $FORTH_END_CODE_WORD 2!
1164 $FORTH_END_CODE_WORD c!
1175 $FORTH_END_CODE_WORD !
1177 $FORTH_CODE_WORD 0C!
1183 $FORTH_END_CODE_WORD 0C!
1193 $FORTH_END_CODE_WORD 0!
1195 $FORTH_CODE_WORD 1C!
1201 $FORTH_END_CODE_WORD 1C!
1211 $FORTH_END_CODE_WORD 1!
1214 $FORTH_CODE_WORD FORTH-WORD?
1231 $FORTH_END_CODE_WORD FORTH-WORD?
1236 ?EXEC !CSP CURRENT @ CONTEXT ! CREATE ]
1258 $FORTH_WORD CONSTANT
1262 $FORTH_END_WORD CONSTANT
1273 $FORTH_WORD VARIABLE
1276 $FORTH_END_WORD VARIABLE
1281 $FORTH_WORD 2CONSTANT
1283 CREATE SMUDGE HERE 2! 4 ALLOT
1285 $FORTH_END_WORD 2CONSTANT
1302 $FORTH_WORD 2VARIABLE
1306 $FORTH_END_WORD 2VARIABLE
1316 $FORTH_END_WORD USER
1327 ;;;;;;;;;;;;;; some speedup constants
1335 $FORTH_CONST c/l #40
1339 $FORTH_END_WORD +ORIGIN
1341 ;; these ones will be inited by COLD with the predefined values
1345 $FORTH_USER WIDTH #0C
1346 $FORTH_USER WARNING #0E
1347 $FORTH_USER FENCE #10
1349 $FORTH_USER VOC-LINK #14
1350 ;; these ones will not be inited by COLD
1353 $FORTH_USER READ-ONLY #1A
1355 ;; OFFSET is the offset for BLOCK operation
1356 ;; i.e. actual block number will be n+OFFSET
1357 $FORTH_USER OFFSET #1E
1358 $FORTH_USER CONTEXT #20
1359 $FORTH_USER CURRENT #22
1360 $FORTH_USER STATE #24
1361 $FORTH_USER BASE #26
1367 ;; new var for TLOAD
1368 $FORTH_USER TLOAD-Y #32
1369 $FORTH_USER SHOW-HIDDEN #34
1375 $FORTH_END_WORD HERE
1380 SP@ LIT 32 - DP @ U< 0BRANCH allot0 (.") ~ALLOT: out of memory!~ CR ABORT ;; "
1384 $FORTH_END_WORD ALLOT
1397 $FORTH_WORD TRAVERSE
1401 OVER + LIT 127 OVER C@ <
1404 $FORTH_END_WORD TRAVERSE
1410 $FORTH_END_WORD LATEST
1424 LIT 5 - LIT -1 TRAVERSE ;S
1429 1 TRAVERSE LIT 5 + ;S
1436 $FORTH_END_WORD !CSP
1441 SWAP 0BRANCH qerror0
1442 ERROR BRANCH qerror1
1447 $FORTH_END_WORD ?ERROR
1451 STATE @ 0= LIT 17 ?ERROR ;S
1452 $FORTH_END_WORD ?COMP
1456 STATE @ LIT 18 ?ERROR ;S
1457 $FORTH_END_WORD ?EXEC
1462 $FORTH_END_WORD ?PAIRS
1466 SP@ CSP @ - LIT 20 ?ERROR ;S
1467 $FORTH_END_WORD ?CSP
1469 $FORTH_WORD ?LOADING
1471 BLK @ 0= LIT 22 ?ERROR ;S
1472 $FORTH_END_WORD ?LOADING
1476 ?COMP R> dup 2+ >R @ , ;S
1477 $FORTH_END_WORD COMPILE
1491 LATEST LIT #20 TOGGLE ;S
1492 $FORTH_END_WORD SMUDGE
1502 $FORTH_END_WORD DECIMAL
1506 R> LATEST PFA CFA ! ;S
1507 $FORTH_END_WORD (;CODE)
1509 $FORTH_WORD ;CODE IMM
1511 ?CSP COMPILE (;CODE)
1513 $FORTH_END_WORD ;CODE
1518 $FORTH_END_WORD <BUILDS
1524 $FORTH_END_WORD DOES>
1544 $FORTH_END_WORD COUNT
1546 $FORTH_WORD -TRAILING
1550 OVER OVER + 1- C@ BL - 0BRANCH ntrailing1
1551 LEAVE BRANCH ntrailing2
1557 $FORTH_END_WORD -TRAILING
1560 $FORTH_WORD ." IMM ;;"
1562 LIT 34 STATE @ 0BRANCH dotq0
1564 WORD C@ 1+ ALLOT BRANCH dotq1
1571 $FORTH_CODE_WORD (")
1582 $FORTH_END_CODE_WORD (") ;;"
1584 $FORTH_WORD " IMM ;; "
1587 ;; compile string into the current definition
1588 ;; or place it at PAD (depends of current STATE)
1589 LIT 34 STATE @ 0BRANCH dots0
1591 WORD C@ 1+ ALLOT BRANCH dots1
1596 $FORTH_END_WORD " ;;"
1598 include "editstr.zas"
1603 1- (EDITSTR-MAXLEN) ! (EDITSTR-ADDR) !
1604 (EDITSTR-LEN) 0! (EDITSTR-cp) 0!
1606 $FORTH_END_WORD EXPECT
1610 TIB @ LIT 80 EXPECT in 0! ;S
1611 $FORTH_END_WORD QUERY
1613 ;; ~ will be changed to char with code 0 by ZASM
1614 ;; this word will be called by INTERPRET
1615 ;; when it meets the end of line marker (0x00)
1616 ;; zwb: break INTERPRET
1617 ;; zw2: continue INTERPRETING
1618 $FORTH_WORD ~ IMM ;; #0
1620 TLOAD-Y @ 0BRANCH zwx
1621 FREADLN 0BRANCH zwx1 ;; no more lines
1622 DROP TIB ! in 0! BRANCH zw2
1624 TLOAD-Y 0! LIT f_userDEF 4+ @ dup 0! TIB ! in 0!
1629 1 BLK +! in 0! BLK @ b/SCR 1- and 0= 0BRANCH zw0
1644 $FORTH_END_WORD ERASE
1650 $FORTH_END_WORD BLANKS
1656 LIT -1 HLD +! HLD @ c! ;S
1657 $FORTH_END_WORD HOLD
1666 ;; read next word from the input stream
1667 ;; place it at HERE as the counted string
1670 ;; ( delimeter -- here )
1671 BLK @ 0BRANCH word0 ;; not LOADing?
1672 BLK @ BLOCK BRANCH word1 ;; else -- load block & get it's address
1677 ;; ENCLOSE: ( addr delimeter -- addr w_start_ofs w_end_ofs next_scan_ofs )
1680 in +! ;; ( addr w_start_ofs w_end_ofs )
1681 OVER - ;; ( addr w_start_ofs w_len )
1682 dup >R HERE c! ;; length stored; ( addr w_start_ofs | w_len )
1685 $FORTH_END_WORD WORD
1687 $FORTH_WORD (NUMBER)
1690 1+ dup >R C@ BASE @ DIGIT 0BRANCH xnumber2
1691 SWAP BASE @ U* DROP ROT BASE @ U* d+ DPL @ 1+ 0BRANCH xnumber1
1697 $FORTH_END_WORD (NUMBER)
1701 0 0 ROT dup 1+ C@ LIT 45 = dup >R + LIT -1
1703 DPL ! (NUMBER) dup C@ BL - 0BRANCH number1
1704 dup C@ LIT 46 - 0 ?ERROR 0
1707 DROP R> 0BRANCH number2
1711 $FORTH_END_WORD NUMBER
1713 ;; read next word from the input stream
1714 ;; search it in the dictionary
1717 ;; ( -- pfa b tf ok)
1719 BL WORD CONTEXT @ @ (FIND)
1720 dup 0= 0BRANCH nfind0
1721 DROP HERE LATEST (FIND)
1724 $FORTH_END_WORD -FIND
1730 $FORTH_END_WORD (ABORT)
1736 WARNING @ 0< 0BRANCH error0
1739 HERE COUNT TYPE (.") ~? ~ MESSAGE ;; "
1740 sp! BLK @ -dup 0BRANCH error1
1743 LIT f_userDEF 4+ @ TIB !
1745 $FORTH_END_WORD ERROR
1750 PAD LIT 32 LIT 95 FILL
1751 dup PFA LFA OVER - PAD SWAP CMOVE
1752 PAD COUNT LIT 31 and 2DUP + 1- dup @ LIT #FF7F and SWAP !
1758 -FIND 0BRANCH create0
1759 DROP NFA ID. 4 MESSAGE SPACE
1761 HERE dup C@ WIDTH @ MIN 1+ ALLOT dup
1762 LIT #A0 TOGGLE HERE 1- LIT #80 TOGGLE
1763 LATEST , CURRENT @ ! HERE 2+ , ;S
1764 $FORTH_END_WORD CREATE
1766 $FORTH_WORD [COMPILE] IMM
1768 -FIND 0= 0 ?ERROR DROP CFA , ;S
1769 $FORTH_END_WORD [COMPILE]
1771 $FORTH_WORD LITERAL IMM
1773 STATE @ 0BRANCH literal0
1777 $FORTH_END_WORD LITERAL
1779 $FORTH_WORD DLITERAL IMM
1781 STATE @ 0BRANCH dliteral0
1782 SWAP LITERAL LITERAL
1785 $FORTH_END_WORD DLITERAL
1789 SP@ S0 @ SWAP U< 1 ?ERROR SP@ HERE LIT 128 + U< LIT 7 ?ERROR ;S
1790 $FORTH_END_WORD ?STACK
1792 $FORTH_WORD INTERPRET
1795 -FIND 0BRANCH interpret3
1796 STATE @ < 0BRANCH interpret1
1797 CFA , BRANCH interpret2
1801 ?STACK BRANCH interpret6
1803 HERE NUMBER DPL @ 1+ 0BRANCH interpret4
1804 DLITERAL BRANCH interpret5
1811 $FORTH_END_WORD INTERPRET
1813 $FORTH_WORD IMMEDIATE
1815 LATEST LIT #40 TOGGLE ;S
1816 $FORTH_END_WORD IMMEDIATE
1818 $FORTH_WORD DEFINITIONS
1820 CONTEXT @ CURRENT ! ;S
1821 $FORTH_END_WORD DEFINITIONS
1832 RP! CR QUERY INTERPRET STATE @ 0= 0BRANCH quit1
1836 $FORTH_END_WORD QUIT
1841 sp! DECIMAL ?STACK .CREDITZ
1843 FORTH DEFINITIONS QUIT
1844 $FORTH_END_WORD ABORT
1849 ;; 8 1 16384 TR-SREAD
1852 $FORTH_END_WORD WARM
1857 FIRST BUF-USE ! FIRST BUF-PREV ! DR0
1858 ;; the first USER is at f_userBASE+6
1859 LIT f_userDEF LIT f_userBASE @ LIT 6 + LIT 16 CMOVE
1861 LIT f_userBASE @ LIT #1A + 0! ;; READ-ONLY
1862 LIT f_userBASE @ LIT #34 + 0! ;; SHOW-HIDDEN
1863 LIT latest_word LIT forth_voc_latest !
1864 LIT f_cur7FFD C@ LIT #7FFD OUTP
1866 $FORTH_END_WORD COLD
1869 ;; convert normal singed number to double
1870 $FORTH_CODE_WORD S->d
1881 $FORTH_END_CODE_WORD S->d
1907 $FORTH_END_WORD DABS
1930 2DUP xor >R ABS SWAP ABS U* R> d+- ;S
1935 OVER >R >R DABS R@ ABS U/MOD R> R@ xor +- SWAP R> +- SWAP ;S
1946 $FORTH_END_WORD /MOD
1961 $FORTH_END_WORD */MOD
1970 >R 0 R@ U/MOD R> SWAP >R U/MOD R> ;S
1971 $FORTH_END_WORD m/MOD
1974 ;; show warning message
1978 ;; show warning text?
1979 WARNING @ 0BRANCH message1
1980 ;; message #0 is "word?" show no warning text
1981 -dup 0BRANCH message0
1982 ;; show message line
1983 4 OFFSET @ b/SCR / - .LINE SPACE
1990 $FORTH_END_WORD MESSAGE
1993 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
1994 ;; buffers, blocks, etc...
1995 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
1997 include "blocks.zas"
1998 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
1999 ;; end of buffers, blocks, etc...
2000 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
2005 -FIND 0= 0 ?ERROR DROP LITERAL ;S
2011 $FORTH_END_WORD BACK
2013 $FORTH_WORD BEGIN IMM
2016 $FORTH_END_WORD BEGIN
2018 $FORTH_WORD ENDIF IMM
2020 ?COMP 2 ?PAIRS HERE OVER - SWAP ! ;S
2021 $FORTH_END_WORD ENDIF
2023 $FORTH_WORD THEN IMM
2026 $FORTH_END_WORD THEN
2034 $FORTH_WORD LOOP IMM
2036 3 ?PAIRS COMPILE (LOOP)
2038 $FORTH_END_WORD LOOP
2040 $FORTH_WORD +LOOP IMM
2042 3 ?PAIRS COMPILE (+LOOP)
2044 $FORTH_END_WORD +LOOP
2046 $FORTH_WORD UNTIL IMM
2048 1 ?PAIRS COMPILE 0BRANCH
2050 $FORTH_END_WORD UNTIL
2057 $FORTH_WORD AGAIN IMM
2059 1 ?PAIRS COMPILE BRANCH
2061 $FORTH_END_WORD AGAIN
2063 $FORTH_WORD REPEAT IMM
2065 >R >R AGAIN R> R> 2- ENDIF ;S
2066 $FORTH_END_WORD REPEAT
2074 $FORTH_WORD IFNOT IMM
2078 $FORTH_END_WORD IFNOT
2080 $FORTH_WORD ELSE IMM
2082 2 ?PAIRS COMPILE BRANCH
2083 HERE 0 , SWAP 2 ENDIF 2 ;S
2084 $FORTH_END_WORD ELSE
2086 $FORTH_WORD WHILE IMM
2089 $FORTH_END_WORD WHILE
2098 DROP DROP HLD @ PAD OVER - ;S
2103 ROT 0< 0BRANCH sign0
2107 $FORTH_END_WORD SIGN
2111 BASE @ m/MOD ROT LIT 9 OVER < 0BRANCH sharp0
2120 # OVER OVER or 0= 0BRANCH ns0
2126 >R SWAP OVER DABS <# #S SIGN #> R> OVER - SPACES TYPE ;S
2161 SHOW-HIDDEN @ 0= 0BRANCH vlist0_1
2162 ;; check if hidden word
2163 dup 1+ C@ LIT 40 - 0BRANCH vlist4
2166 dup C@ LIT 31 and R@ SWAP - dup 0< 0BRANCH vlist1
2167 CR DROP dup C@ LIT 31 and CONWIDTH SWAP -
2173 COUNT LIT 31 and -dup 0BRANCH vlistT9
2176 dup C@ LIT 127 and EMIT 1+
2181 R@ 0= 0BRANCH vlist2
2182 CR RDROP CONWIDTH BRANCH vlist3
2189 PFA LFA @ dup 0= ?BREAK or
2192 $FORTH_END_WORD WORDS
2197 DECIMAL CR dup SCR ! (.") ~SCR #~ . ;; "
2200 CR I 3 .R SPACE I SCR @ .LINE ?BREAK 0BRANCH list1
2205 $FORTH_END_WORD LIST
2207 ;; read next word from the input stream
2208 ;; place it at PAD as the counted string
2213 WORD PAD c/l 1+ CMOVE ;S
2214 $FORTH_END_WORD TEXT
2218 dup LIT #FFF0 and LIT 23 ?ERROR SCR @ (LINE) DROP ;S
2219 $FORTH_END_WORD LINE
2224 $FORTH_END_WORD SIZE
2229 $FORTH_END_WORD FREE
2233 CURRENT @ CONTEXT @ - LIT 24 ?ERROR
2234 ' DUP FENCE @ U< LIT 21 ?ERROR
2235 dup NFA DP ! LFA @ CURRENT @ ! ;S
2236 $FORTH_END_WORD FORGET
2246 $FORTH_END_WORD EXIT
2248 $FORTH_WORD CASE IMM
2250 ?COMP CSP @ !CSP 4 ;S
2251 $FORTH_END_WORD CASE
2255 4 ?PAIRS COMPILE OVER
2258 HERE 0 , COMPILE DROP
2262 $FORTH_WORD ENDOF IMM
2264 LIT 5 ?PAIRS COMPILE BRANCH
2265 HERE 0 , SWAP 2 ENDIF 4 ;S
2266 $FORTH_END_WORD ENDOF
2268 $FORTH_WORD OTHERWISE IMM
2270 ;; part of CASE: OTHERWISE ( val ) ... ENDOF
2275 $FORTH_END_WORD OTHERWISE
2277 $FORTH_WORD ENDCASE IMM
2289 $FORTH_END_WORD ENDCASE
2293 $FORTH_DOES FORTH voc_does IMM
2297 defw latest_word ;; prev voc latest
2299 defw 0 ;; prev voc-link
2301 $FORTH_WORD VOCABULARY
2303 <BUILDS LIT #A081 , CURRENT @ CFA , HERE VOC-LINK @ , VOC-LINK ! DOES>
2306 $FORTH_END_WORD VOCABULARY
2315 include "textfile.zas"
2319 ;;;;;;;;;;;;;;;;;;;; INSERT YOUR WORDS BELOW ;;;;;;;;;;;;;;;;;;;;
2322 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
2324 ;;!!!!!! THIS LABEL SHOULD BE JUST BEFORE THE LAST DEFINED WORD
2326 ;;!!!!!! DO NOT REMOVE THIS WORD! THE SYSTEM USES IT
2329 $FORTH_END_WORD NOOP
2331 latest_byte: defw 666