home *** CD-ROM | disk | FTP | other *** search
/ CP/M / CPM_CDROM.iso / simtel / sigm / vols000 / vol070 / forth110.asm < prev    next >
Encoding:
Assembly Source File  |  1985-02-10  |  62.0 KB  |  4,108 lines

  1.  
  2.     TITLE    '8080 FIG-FORTH 1.1 VERSION A0 17SEP79'
  3. ;
  4. ;    FIG-FORTH  RELEASE 1.1  FOR THE 8080 PROCESSOR
  5. ;
  6. ;    ALL PUBLICATIONS OF THE FORTH INTEREST GROUP
  7. ;    ARE PUBLIC DOMAIN.  THEY MAY BE FURTHER
  8. ;    DISTRIBUTED BY THE INCLUSION OF THIS CREDIT
  9. ;    NOTICE:
  10. ;
  11. ;    THIS PUBLICATION HAS BEEN MADE AVAILABLE BY THE
  12. ;             FORTH INTEREST GROUP
  13. ;             P. O. BOX 1105
  14. ;             SAN CARLOS, CA 94070
  15. ;
  16. ;    IMPLEMENTATION BY:
  17. ;        JOHN CASSADY
  18. ;                FOR THE FORTH IMPLEMENTATION TEAM (FIT) MARCH 1979
  19. ;    MODIFIED for CP/M by:
  20. ;           KIM HARRIS
  21. ;               FIT LIBRARIAN SEPT 1979
  22. ;    ACKNOWLEDGEMENTS:
  23. ;        GEORGE FLAMMER
  24. ;        ROBT. D. VILLWOCK
  25. ;               Microsystems inc. Pasadena Ca.
  26. ;
  27. ;        DISTRIBUTED BY    FORTH POWER
  28. ;               P.O. BOX 2455 SAN RAFAEL CA
  29. ;               94902   415-471-1762
  30. ;               SUPPORT, SYSTEMS PROGRAMMING, 
  31. ;               APPLICATIONS PROGRAMMING
  32. ;
  33. ;  UNLESS OTHERWISE INDICATED, THIS DISTRIBUTION IS SUPPORTED
  34. ;  SOLELY BY THE FORTH INTEREST GROUP (LISTINGS) AND BY
  35. ;  FORTH POWER (MACHINE READABLE COPIES AND EXTENSIONS).
  36. ;
  37. ;   COPYRIGHT AND TRADEMARK NOTICES:
  38. ;   FORTH (C) 1974,1975,1976,1977,1978,1979 FORTH INC.
  39. ;   FIST (C) 1979 FORTH INTERNATIONAL STANDARDS TEAM
  40. ;   FIG, FORTH DIMENSIONS, FIT, (C) 1978, 1979 FORTH INTEREST GROUP
  41. ;   FORTH POWER (C) 1978, 1979 MARIN SERVICES, INC.
  42. ;   FORTH 77, FORTH 78, FORTH 79, STANDARD FORTH, FORTH INTERNATIONAL
  43. ;   STANDARD, (C) 1976, 1977, 1978, 1979, FIST
  44. ;   MULTI-FORTH (C) 1978, 1979 CREATIVE SOLUTIONS
  45. ;   CP/M (C) 1979 DIGITAL RESEARCH INC.
  46. ;   MOST ANYTHING WITH AN 11 IN IT (C) DIGITAL EQUIPMENT CORP
  47. ;   THERE MAY BE OTHERS ! !
  48. ;   MINIFORTH, MICROFORTH, POLYFORTH, FORTH  TM FORTH INC.
  49. ;   FIG-FORTH (C) 1978 1979 FORTH INTEREST GROUP
  50. ;   ALL RIGHTS RESERVED EXCEPT AS EXPRESSLY INDICATED !
  51. ;
  52. ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
  53. ;
  54. ;               UPDATES, PATCHES, BUG REPORTS, EXTENSIONS
  55. ;               FOR THIS SOFTWARE IN  FORTH DIMENSIONS  
  56. ;               NEWSLETTER OF FORTH INTEREST GROUP (FIG)
  57. ;               6 issues $5.00 includes fig membership
  58. ;
  59. ;          DOCUMENTATION FROM FIG or FORTH POWER
  60. ;        
  61. ;               FORTH PRIMER (240pp) Richard Stevens
  62. ;               KITT PEAK NATIONAL OBSERVATORY    $20.00
  63. ;    
  64. ;               FORTH IMPLEMENTATION TEAM LANGUAGE MODEL, EDITOR SOURCE,
  65. ;               LANGUAGE GLOSSARY, AND IMPLEMENTATION GUIDE  $10.00
  66. ;
  67. ;               FORTH FOR MICROCOMPUTERS by JOHN S JAMES
  68. ;               reprint from DDJ #25          $2.00
  69. ;
  70. ;               FORTH POCKET PROGRAMMERS CARD  FREE W/ S.A.S.E.
  71. ;
  72. ;               SOURCE CODE FOR TI990, 6502, 6800, PDP11, PACE,
  73. ;               8080 (included here)    $10.00/ LISTING
  74. ;
  75. ;          DOCUMENTATION FROM FIG
  76. ;
  77. ;               USING FORTH by ELIZABETH RATHER (200pp)
  78. ;               FORTH INC. 1979               $20.00
  79. ;
  80. ;          DOCUMENTATION FROM FORTH POWER
  81. ;               
  82. ;
  83. ;               CP/M MULTI-FORTH USERS MANUAL  $20.00
  84. ;               FORTH 79 INTERNATIONAL STANDARD 
  85. ;
  86. ;               CP/M 8080 FORTH BY FIG 8" DISKETT IBM STD.
  87. ;               WITH EDITOR AND ASSEMBLER, COPY AND PRINT,
  88. ;               AND USERS GUIDE                $65.00
  89. ;
  90. ;               also on 5" CP/M, 5 & 8 Northstar DOS
  91. ;
  92. ;               CP/M Multi-Forth, Full 79 International
  93. ;               Standard with extensions, Strings, Prom burner,
  94. ;               Real time clock, VIDEO EDITOR, UTILITIES
  95. ;               A PROFESSIONAL LEVEL PRODUCT    $150.00
  96. ;               includes manual
  97. ;
  98. ;               PDP 11 FORTH by JOHN S. JAMES
  99. ;               8" RX01 diskett or 9 track 800 bpi DOS tape
  100. ;               runs under OS or stand alone
  101. ;               WITH USERS GUIDE                $150.00
  102. ;
  103. ;               FIG TRS 80 FORTH cassette or diskette
  104. ;               WRITE FOR PRICES
  105. ;
  106. ;               APPLE FORTH BY CapN' SOFTWARE   $40.00
  107. ;               EASYWRITER (word processor for APPLE
  108. ;               by CapN' SOFTWARE)        $100.00
  109. ;
  110. ;               APPLE FORTH BY UNIVERSITY OF UTRECHT,
  111. ;               includes floating pt and many extensions
  112. ;               A PROFESSIONAL LEVEL PRODUCT  $100.00
  113. ;
  114. ;               FORTH FOR MICROPROSSOR DEVELOPMENT SYSTEMS,
  115. ;               FORTH FOR D.G., VAX 11, INTERDATA, Series 1,
  116. ;               C.A., HONEYWELL LEVEL 6, and others,   Write for prices
  117. ;
  118. ;          DOCUMENTATION FROM CALTECH
  119. ;                CALTECH FORTH MANUAL $6.00
  120. ;               CAL TECH BOOKSTORE PASADENA CA
  121. ;               by MARTIN S. EWING 100pp postpaid
  122. ;
  123. ;  CALL FOR PAPERS, ARTICLES, SPEAKERS: FOR FORTH DIMENSIONS
  124. ;   AND TRADE PUBLICATIONS SEND TO FIG.  FOR SPEAKERS, WORKSHOPS,
  125. ;   SHOWS AND CONVENTIONS CONTACT FIG.  FIG SOLICITES FORTH SOFTWARE
  126. ;   FOR INCLUSION IN THIS EFFORT.
  127. ;               FORTH INTERNATIONAL STANDARDS TEAM (FIT)
  128. ;              FORTH 79 INTERNATIONAL STANDARD, REQUIRED AND
  129. ;              RESERVED WORD GLOSSARY, AND STANDARDS ACTIVITY
  130. ;              DISTRIBUTION.  $30.00 TO FIT c/o FIG or to
  131. ;
  132. ;              CAROLYN ROSENBERG, FIT SECRETARY
  133. ;              c/o FORTH INC. MANHATTAN BEACH CA.
  134. ;
  135. ;
  136. ;-----------------------------------------------------
  137. ;    LABELS USED WHICH DIFFER FROM FIG-FORTH PUBLISHED
  138. ;    8080 LISTING 1.0:
  139. ;
  140. ;    REL 1.1        REL 1.0
  141. ;    -------        -------
  142. ;    ANDD        AND
  143. ;    CSPP        CSP
  144. ;    ELSEE        ELSE
  145. ;    ENDD        END
  146. ;    ENDIFF        ENDIF
  147. ;    ERASEE        ERASE
  148. ;    IDO        I
  149. ;    IFF        IF
  150. ;    INN        IN
  151. ;    MODD        MOD
  152. ;    ORR        OR
  153. ;    OUTT        OUT
  154. ;    RR        R
  155. ;    RPP        RP
  156. ;    SUBB        SUB
  157. ;    XORR        XOR
  158. ;
  159. ;    SEE ALSO:
  160. ;        RELEASE & VERSION NUMBERS
  161. ;        ASCII CHARACTER EQUATES
  162. ;        MEMORY ALLOCATION
  163. ;        DISK INTERFACE
  164. ;        CONSOLE & PRINTER INTERFACE
  165. ;
  166.     PAGE
  167. ;
  168. ;----------------------------------------------------------
  169. ;
  170. ;    RELEASE & VERSION NUMBERS
  171. ;
  172. FIGREL    EQU    1    ; FIG RELEASE #
  173. FIGREV    EQU    1    ; FIG REVISION #
  174. USRVER    EQU    0    ; USER VERSION #
  175. ;
  176. ;    ASCII CHARACTERS USED
  177. ;
  178. ABL    EQU    20H    ; SPACE
  179. ACR    EQU    0DH    ; CARRIAGE RETURN
  180. ADOT    EQU    02EH    ; PERIOD
  181. BELL    EQU    07H    ; (^G)
  182. BSIN    EQU    7FH    ; INPUT BACKSPACE CHR = RUBOUT
  183. BSOUT    EQU    08H    ; OUTPUT BACKSPACE (^H)
  184. DLE    EQU    10H    ; (^P)
  185. LF    EQU    0AH    ; LINE FEED
  186. FF    EQU    0CH    ; FORM FEED (^L)
  187. ;
  188. ;    MEMORY ALLOCATION
  189. ;
  190. EM    EQU    4000H    ; TOP OF MEMORY + 1 = LIMIT
  191. NSCR    EQU    1    ; NUMBER OF 1024 BYTE SCREENS
  192. KBBUF    EQU    128    ; DATA BYTES PER DISK BUFFER
  193. US    EQU    40H    ; USER VARIABLES SPACE
  194. RTS    EQU    0A0H    ; RETURN STACK & TERM BUFF SPACE
  195. ;
  196. CO    EQU    KBBUF+4    ; DISK BUFFER + 2 HEADER + 2 TAIL
  197. NBUF    EQU    NSCR*400H/KBBUF    ; NUMBER OF BUFFERS
  198. BUF1    EQU    EM-CO*NBUF    ; ADDR FIRST DISK BUFFER
  199. INITR0    EQU    BUF1-US        ; (R0)
  200. INITS0    EQU    INITR0-RTS    ; (S0)
  201. ;
  202.     PAGE
  203. ;
  204. ;-------------------------------------------------------
  205. ;
  206.     ORG    100H
  207. ORIG    NOP
  208.     JMP    CLD    ; VECTOR TO COLD START
  209.     NOP
  210.     JMP    WRM    ; VECTOR TO WARM START
  211.     DB    FIGREL    ; FIG RELEASE #
  212.     DB    FIGREV    ; FIG REVISION #
  213.     DB    USRVER    ; USER VERSION #
  214.     DB    0EH    ; IMPLEMENTATION ATTRIBUTES
  215.     DW    TASK-7  ; TOPMOST WORD IN FORTH VOCABULARY
  216.     DW    BSIN    ; BKSPACE CHARACTER
  217.     DW    INITR0    ; INIT (UP)
  218. ;<<<<<< FOLLOWING USED BY COLD;
  219. ;    MUST BE IN SAME ORDER AS USER VARIABLES
  220.     DW    INITS0    ; INIT (S0)
  221.     DW    INITR0    ; INIT (R0)
  222.     DW    INITS0    ; INIT (TIB)
  223.     DW    20H        ; INIT (WIDTH)
  224.     DW    0        ; INIT (WARNING)
  225.     DW    INITDP        ; INIT (FENCE)
  226.     DW    INITDP        ; INIT (DP)
  227.     DW    FORTH+6        ; INIT (VOC-LINK)
  228. ;<<<<<< END DATA USED BY COLD
  229.     DW    5H,0B320H    ; CPU NAME    ( HW,LW )
  230. ;                  ( 32 BIT, BASE 36 INTEGER )
  231. ;
  232. ;
  233. ;            +---------------+
  234. ;    B +ORIGIN    | . . .W:I.E.B.A|    IMPLEMENTATION
  235. ;            +---------------+    ATTRIBUTES
  236. ;                   ^ ^ ^ ^ ^
  237. ;                   | | | | +-- PROCESSOR ADDR =
  238. ;                   | | | |     { 0 BYTE | 1 WORD }
  239. ;                   | | | +---- HIGH BYTE AT
  240. ;                   | | |       { 0 LOW ADDR |
  241. ;                   | | |         1 HIGH ADDR }
  242. ;                   | | +------ ADDR MUST BE EVEN
  243. ;                   | |       { 0 YES | 1 NO }
  244. ;                   | +-------- INTERPRETER IS
  245. ;                   |       { 0 PRE | 1 POST }
  246. ;                   |       INCREMENTING
  247. ;                   +---------- { 0 ABOVE SUFFICIENT
  248. ;                         | 1 OTHER DIFFER-
  249. ;                         ENCES EXIST }
  250. ;
  251.     PAGE
  252. ;
  253. ;------------------------------------------------------
  254. ;
  255. ;    FORTH REGISTERS
  256. ;
  257. ;    FORTH    8080    FORTH PRESERVATION RULES
  258. ;    -----    ----    ------------------------------------------------------------------------HH+    ;    IP    BC    SHOULD BE PRESERVED ACROSS
  259. ;              FORTH WORDS
  260. ;    W    DE    SOMETIMES OUTPUT FROM NEXT
  261. ;            MAY BE ALTERED BEFORE JMP'ING TO NEXT
  262. ;            INPUT ONLY WHEN 'DPUSH' CALLED
  263. ;    SP    SP    SHOULD BE USED ONLY AS DATA STACK
  264. ;              ACROSS FORTH WORDS
  265. ;            MAY BE USED WITHIN FORTH WORDS
  266. ;              IF RESTORED BEFORE 'NEXT'
  267. ;        HL    NEVER OUTPUT FROM NEXT
  268. ;            INPUT ONLY WHEN 'HPUSH' CALLED
  269. ;
  270. UP    DW    INITR0    ; USER AREA POINTER
  271. RPP    DW    INITR0    ; RETURN STACK POINTER
  272. ;
  273. ;------------------------------------------------------
  274. ;
  275. ;    COMMENT CONVENTIONS:
  276. ;
  277. ;    =    MEANS    "IS EQUAL TO"
  278. ;    <-    MEANS    ASSIGNMENT
  279. ;
  280. ;    NAME    =    ADDRESS OF NAME
  281. ;    (NAME)    =    CONTENTS AT NAME
  282. ;    ((NAME))=    INDIRECT CONTENTS
  283. ;
  284. ;    CFA    =    ADDRESS OF CODE FIELD
  285. ;    LFA    =    ADDRESS OF LINK FIELD
  286. ;    NFA    =    ADDR OF START OF NAME FIELD
  287. ;    PFA    =    ADDR OF START OF PARAMETER FIELD
  288. ;
  289. ;    S1    =    ADDR OF 1ST WORD OF PARAMETER STACK
  290. ;    S2    =    ADDR OF 2ND WORD OF PARAMETER STACK
  291. ;    R1    =    ADDR OF 1ST WORD OF RETURN STACK
  292. ;    R2    =    ADDR OF 2ND WORD OF RETURN STACK
  293. ;    ( ABOVE STACK POSITIONS VALID BEFORE & AFTER EXECUTION
  294. ;    OF ANY WORD, NOT DURING. )
  295. ;
  296. ;    LSB    =    LEAST SIGNIFICANT BIT
  297. ;    MSB    =    MOST SIGNIFICANT BIT
  298. ;    LB    =    LOW BYTE
  299. ;    HB    =    HIGH BYTE
  300. ;    LW    =    LOW WORD
  301. ;    HW    =    HIGH WORD
  302. ;    ( MAY BE USED AS SUFFIX TO ABOVE NAMES )
  303. ;
  304.     PAGE
  305. ;
  306. ;---------------------------------------------------
  307. ;    DEBUG SUPPORT
  308. ;
  309. ;    TO USE:
  310. ;    (1)    SET 'BIP' TO IP VALUE TO HALT, CANNOT BE CFA
  311. ;    (2)    SET MONITOR'S BREAKPOINT PC TO 'BREAK'
  312. ;            OR PATCH 'HLT' INSTR. THERE
  313. ;    (3)    PATCH A 'JMP TNEXT' AT 'NEXT'
  314. ;    WHEN (IP) = (BIP) CPU WILL HALT
  315. ;
  316. BIP    DW    0    ; BREAKPOINT ON IP VALUE
  317. ;
  318. TNEXT    LXI    H,BIP
  319.     MOV    A,M    ; LB
  320.     CMP    C
  321.     JNZ    TNEXT1
  322.     INX    H
  323.     MOV    A,M    ; HB
  324.     CMP    B
  325.     JNZ    TNEXT1
  326. BREAK    NOP        ; PLACE BREAKPOINT HERE
  327.     NOP
  328.     NOP
  329. TNEXT1    LDAX    B
  330.     INX    B
  331.     MOV    L,A
  332.     JMP    NEXT+3
  333. ;
  334. ;--------------------------------------------------
  335. ;
  336. ;    NEXT, THE FORTH ADDRESS INTERPRETER
  337. ;      ( POST INCREMENTING VERSION )
  338. ;
  339. DPUSH    PUSH    D
  340. HPUSH    PUSH    H
  341. NEXT    LDAX    B    ;(W) <- ((IP))
  342.     INX    B    ;(IP) <- (IP)+2
  343.     MOV    L,A
  344.     LDAX    B
  345.     INX    B
  346.     MOV    H,A    ; (HL) <- CFA
  347. NEXT1:    MOV    E,M    ;(PC) <- ((W))
  348.     INX    H
  349.     MOV    D,M
  350.     XCHG
  351.     PCHL        ; NOTE: (DE) = CFA+1
  352. ;
  353.     PAGE
  354. ;
  355. ;        FORTH DICTIONARY
  356. ;
  357. ;
  358. ;    DICTIONARY FORMAT:
  359. ;
  360. ;                BYTE
  361. ;    ADDRESS    NAME        CONTENTS
  362. ;    ------- ----        --------
  363. ;                      ( MSB=1
  364. ;                      ( P=PRECEDENCE BIT
  365. ;                      ( S=SMUDGE BIT
  366. ;    NFA    NAME FIELD    1PS<LEN>  < NAME LENGTH
  367. ;                0<1CHAR>  MSB=0, NAME'S 1ST CHAR
  368. ;                0<2CHAR>
  369. ;                  ...
  370. ;                1<LCHAR>  MSB=1, NAME'S LAST CHR
  371. ;    LFA    LINK FIELD    <LINKLB>  = PREVIOUS WORD'S NFA
  372. ;                <LINKHB>
  373. ;LABEL:    CFA    CODE FIELD    <CODELB>  = ADDR CPU CODE
  374. ;                <CODEHB>
  375. ;    PFA    PARAMETER    <1PARAM>  1ST PARAMETER BYTE
  376. ;        FIELD        <2PARAM>
  377. ;                  ...
  378. ;
  379. ;
  380. DP0:    DB    83H    ; LIT
  381.     DB    'LI'
  382.     DB    'T'+80H
  383.     DW    0    ; (LFA)=0 MARKS END OF DICTIONARY
  384. LIT    DW    $+2    ;(S1) <- ((IP))
  385.     LDAX    B    ; (HL) <- ((IP)) = LITERAL
  386.     INX    B    ; (IP) <- (IP) + 2
  387.     MOV    L,A    ; LB
  388.     LDAX    B    ; HB
  389.     INX    B
  390.     MOV    H,A
  391.     JMP    HPUSH    ; (S1) <- (HL)
  392.  ;
  393.     DB    87H    ; EXECUTE
  394.     DB    'EXECUT'
  395.     DB    'E'+80H
  396.     DW    LIT-6
  397. EXEC    DW    $+2
  398.     POP    H    ; (HL) <- (S1) = CFA
  399.     JMP    NEXT1
  400. ;
  401.     DB    86H    ; BRANCH
  402.     DB    'BRANC'
  403.     DB    'H'+80H
  404.     DW    EXEC-0AH
  405. BRAN    DW    $+2    ;(IP) <- (IP) + ((IP))
  406. BRAN1    MOV    H,B    ; (HL) <- (IP)
  407.     MOV    L,C
  408.     MOV    E,M    ; (DE) <- ((IP)) = BRANCH OFFSET
  409.     INX    H
  410.     MOV    D,M
  411.     DCX    H
  412.     DAD    D    ; (HL) <- (HL) + ((IP))
  413.     MOV    C,L    ; (IP) <- (HL)
  414.     MOV    B,H
  415.     JMP    NEXT
  416. ;
  417.     DB    87H    ; 0BRANCH
  418.     DB    '0BRANC'
  419.     DB    'H'+80H
  420.     DW    BRAN-9
  421. ZBRAN    DW    $+2
  422.     POP    H
  423.     MOV    A,L
  424.     ORA    H
  425.     JZ    BRAN1    ; IF (S1)=0 THEN BRANCH
  426.     INX    B    ; ELSE SKIP BRANCH OFFSET
  427.     INX    B
  428.     JMP    NEXT
  429. ;
  430.     DB    86H    ; (LOOP)
  431.     DB    '(LOOP'
  432.     DB    ')'+80H
  433.     DW    ZBRAN-0AH
  434. XLOOP    DW    $+2
  435.     LXI    D,1    ; (DE) <- INCREMENT
  436. XLOO1    LHLD    RPP    ; ((HL)) = INDEX
  437.     MOV    A,M    ; INDEX <- INDEX + INCR
  438.     ADD    E
  439.     MOV    M,A
  440.     MOV    E,A
  441.     INX    H
  442.     MOV    A,M
  443.     ADC    D
  444.     MOV    M,A
  445.     INX    H    ; ((HL)) = LIMIT
  446.     INR    D
  447.     DCR    D
  448.     MOV    D,A    ; (DE) <- NEW INDEX
  449.     JM    XLOO2    ; IF INCR > 0
  450.     MOV    A,E
  451.     SUB    M    ; THEN (A) <- INDEX - LIMIT
  452.     MOV    A,D
  453.     INX    H
  454.     SBB    M
  455.     JMP    XLOO3
  456. XLOO2    MOV    A,M    ; ELSE (A) <- LIMIT - INDEX
  457.     SUB    E
  458.     INX    H
  459.     MOV    A,M
  460.     SBB    D
  461. ;            ; IF (A) < 0
  462. XLOO3    JM    BRAN1    ; THEN LOOP AGAIN
  463.     INX    H    ; ELSE DONE
  464.     SHLD    RPP    ; DISCARD R1 & R2
  465.     INX    B    ; SKIP BRANCH OFFSET
  466.     INX    B
  467.     JMP    NEXT
  468. ;
  469.     DB    87H    ; (+LOOP)
  470.     DB    '(+LOOP'
  471.     DB    ')'+80H
  472.     DW    XLOOP-9
  473. XPLOO    DW    $+2
  474.     POP    D    ; (DE) <- INCR
  475.     JMP    XLOO1
  476. ;
  477.     DB    84H    ; (DO)
  478.     DB    '(DO'
  479.     DB    ')'+80H
  480.     DW    XPLOO-0AH
  481. XDO    DW    $+2
  482.     LHLD    RPP    ; (RP) <- (RP) - 4
  483.     DCX    H
  484.     DCX    H
  485.     DCX    H
  486.     DCX    H
  487.     SHLD    RPP
  488.     POP    D    ; (R1) <- (S1) = INIT INDEX
  489.     MOV    M,E
  490.     INX    H
  491.     MOV    M,D
  492.     POP    D    ; (R2) <- (S2) = LIMIT
  493.     INX    H
  494.     MOV    M,E
  495.     INX    H
  496.     MOV    M,D
  497.     JMP    NEXT
  498. ;
  499.     DB    81H    ; I
  500.     DB    'I'+80H
  501.     DW    XDO-7
  502. IDO    DW    $+2    ;(S1) <- (R1) , (R1) UNCHANGED
  503.     LHLD    RPP
  504.     MOV    E,M    ; (DE) <- (R1)
  505.     INX    H
  506.     MOV    D,M
  507.     PUSH    D    ; (S1) <- (DE)
  508.     JMP    NEXT
  509. ;
  510.     DB    85H    ; DIGIT
  511.     DB    'DIGI'
  512.     DB    'T'+80H
  513.     DW    IDO-4
  514. DIGIT    DW    $+2
  515.     POP    H    ; (L) <- (S1)LB = ASCII CHR TO BE
  516. ;             CONVERTED
  517.     POP    D    ; (DE) <- (S2) = BASE VALUE
  518.     MOV    A,E
  519.     SUI    30H    ; IF CHR > "0"
  520.     JM    DIGI2
  521.     CPI    0AH    ; AND IF CHR > "9"
  522.     JM    DIGI1
  523.     SUI    7
  524.     CPI    0AH    ; AND IF CHR >= "A"
  525.     JM    DIGI2
  526. ;            ; THEN VALID NUMERIC OR ALPHA CHR
  527. DIGI1    CMP    L    ; IF < BASE VALUE
  528.     JP    DIGI2
  529. ;            ; THEN VALID DIGIT CHR
  530.     MOV    E,A    ; (S2) <- (DE) = CONVERTED DIGIT
  531.     LXI    H,1    ; (S1) <- TRUE
  532.     JMP    DPUSH
  533. ;            ; ELSE INVALID DIGIT CHR
  534. DIGI2    MOV    L,H    ; (HL) <- FALSE
  535.     JMP    HPUSH    ; (S1) <- FALSE
  536. ;
  537.     DB    86H    ; (FIND)  (2-1)FAILURE
  538.     DB    '(FIND'    ; (2-3)SUCCESS
  539.     DB    ')'+80H
  540.     DW    DIGIT-8
  541. PFIND    DW    $+2
  542.     POP    D    ; (DE) <- NFA
  543. PFIN1    POP    H    ; (HL) <- STRING ADDR
  544.     PUSH    H    ; SAVE STRING ADDR FOR NEXT ITERATION
  545.     LDAX    D
  546.     XRA    M    ; CHECK LENGTHS & SMUDGE BIT
  547.     ANI    3FH
  548.     JNZ    PFIN4    ; LENGTHS DIFFERENT
  549. ;            ; LENGTHS MATCH, CHECK EACH CHR
  550. PFIN2    INX    H    ; (HL) <- ADDR NEXT CHR IN STRING
  551.     INX    D    ; (DE) <- ADDR NEXT CHR IN NF
  552.     LDAX    D
  553.     XRA    M    ; IGNORE MSB
  554.     ADD    A
  555.     JNZ    PFIN3    ; NO MATCH
  556.     JNC    PFIN2    ; MATCH SO FAR, LOOP AGAIN
  557.     LXI    H,5    ; STRING MATCHES
  558.     DAD    D    ; ((SP)) <- PFA
  559.     XTHL
  560. ;            ; BACK UP TO LENGTH BYTE OF NF = NFA
  561. PFIN6    DCX    D
  562.     LDAX    D
  563.     ORA    A
  564.     JP    PFIN6    ; IF MSB = 1 THEN (DE) = NFA
  565.     MOV    E,A    ; (DE) <- LENGTH BYTE
  566.     MVI    D,0
  567.     LXI    H,1    ; (HL) <- TRUE
  568.     JMP    DPUSH  ; RETURN, NF FOUND
  569. ;    ABOVE NF NOT A MATCH, TRY ANOTHER
  570. PFIN3    JC    PFIN5    ; IF NOT END OF NF
  571. PFIN4    INX    D    ; THEN FIND END OF NF
  572.     LDAX    D
  573.     ORA    A
  574.     JP    PFIN4
  575. PFIN5    INX    D    ; (DE) <- LFA
  576.     XCHG
  577.     MOV    E,M    ; (DE) <- (LFA)
  578.     INX    H
  579.     MOV    D,M
  580.     MOV    A,D
  581.     ORA    E    ; IF (LFA) <> 0
  582.     JNZ    PFIN1    ; THEN TRY PREVIOUS DICT. DEF.
  583. ;            ; ELSE END OF DICTIONARY
  584.     POP    H    ; DISCARD STRING ADDR
  585.     LXI    H,0    ; (HL) <- FALSE
  586.     JMP    HPUSH      ; RETURN, NO MATCH FOUND
  587. ;
  588.     DB    87H    ; ENCLOSE
  589.     DB    'ENCLOS'
  590.     DB    'E'+80H
  591.     DW    PFIND-9
  592. ENCL    DW    $+2
  593.     POP    D    ; (DE) <- (S1) = DELIMITER CHAR
  594.     POP    H    ; (HL) <- (S2) = ADDR TEXT TO SCAN
  595.     PUSH    H    ; (S4) <- ADDR
  596.     MOV    A,E
  597.     MOV    D,A    ; (D) <- DELIM CHR
  598.     MVI    E,-1    ; INITIALIZE CHR OFFSET COUNTER
  599.     DCX    H    ; (HL) <- ADDR-1
  600. ;            ; SKIP OVER LEADING DELIMITER CHRS
  601. ENCL1    INX    H
  602.     INR    E
  603.     CMP    M    ; IF TEXT CHR = DELIM CHR
  604.     JZ    ENCL1    ; THEN LOOP AGAIN
  605. ;            ; ELSE NON-DELIM CHR FOUND
  606.     MVI    D,0    ; (S3) <- (E) = OFFSET TO 1ST NON-DELIM
  607.     PUSH    D
  608.     MOV    D,A    ; (D) <- DELIM CHR
  609.     MOV    A,M    ; IF 1ST NON-DELIM = NULL
  610.     ANA    A
  611.     JNZ    ENCL2
  612.     MVI    D,0    ; THEN (S2) <- OFFSET TO BYTE
  613.     INR    E    ;   FOLLOWING NULL
  614.     PUSH    D
  615.     DCR    E    ; (S1) <- OFFSET TO NULL
  616.     PUSH    D
  617.     JMP    NEXT
  618. ;            ; ELSE TEXT CONTAINS NON-DELIM &
  619. ;              NON-NULL CHR
  620. ENCL2    MOV    A,D    ; (A) <- DELIM CHR
  621.     INX    H    ; (HL) <- ADDR NEXT CHR
  622.     INR    E    ; (E) <- OFFSET TO NEXT CHR
  623.     CMP    M    ; IF NEXT CHR <> DELIM CHR
  624.     JZ    ENCL4
  625.     MOV    A,M    ; AND IF NEXT CHR <> NULL
  626.     ANA    A
  627.     JNZ    ENCL2    ; THEN CONTINUE SCAN
  628. ;            ; ELSE CHR = NULL
  629. ENCL3    MVI    D,0    ; (S2) <- OFFSET TO NULL
  630.     PUSH    D
  631.     PUSH    D    ; (S1) <- OFFSET TO NULL
  632.     JMP    NEXT
  633. ;            ; ELSE CHR = DELIM CHR
  634. ENCL4    MVI    D,0    ; (S2) <- OFFSET TO BYTE
  635. ;              FOLLOWING TEXT
  636.     PUSH    D
  637.     INR    E    ; (S1) <- OFFSET TO 2 BYTES AFTER
  638. ;                END OF WORD
  639.     PUSH    D
  640.     JMP    NEXT
  641. ;
  642.     DB    84H    ; EMIT
  643.     DB    'EMI'
  644.     DB    'T'+80H
  645.     DW    ENCL-0AH
  646. EMIT    DW    DOCOL
  647.     DW    PEMIT
  648.     DW    ONE,OUTT
  649.     DW    PSTOR,SEMIS
  650. ;
  651.     DB    83H    ; KEY
  652.     DB    'KE'
  653.     DB    'Y'+80H
  654.     DW    EMIT-7
  655. KEY    DW    $+2
  656.     JMP    PKEY
  657. ;
  658.     DB    89H    ; ?TERMINAL
  659.     DB    '?TERMINA'
  660.     DB    'L'+80H
  661.     DW    KEY-6
  662. QTERM    DW    $+2
  663.     LXI    H,0
  664.     JMP    PQTER
  665. ;
  666.     DB    82H    ; CR
  667.     DB    'C'
  668.     DB    'R'+80H
  669.     DW    QTERM-0CH
  670. CR    DW    $+2
  671.     JMP    PCR
  672. ;
  673.     DB    85H    ; CMOVE
  674.     DB    'CMOV'
  675.     DB    'E'+80H
  676.     DW    CR-5
  677. CMOVE    DW    $+2
  678.     MOV    L,C    ; (HL) <- (IP)
  679.     MOV    H,B
  680.     POP    B    ; (BC) <- (S1) = #CHRS
  681.     POP    D    ; (DE) <- (S2) = DEST ADDR
  682.     XTHL        ; (HL) <- (S3) = SOURCE ADDR
  683. ;            ; (S1) <- (IP)
  684.     JMP    CMOV2    ; RETURN IF #CHRS = 0
  685. CMOV1    MOV    A,M    ; ((DE)) <- ((HL))
  686.     INX    H    ; INC SOURCE ADDR
  687.     STAX    D
  688.     INX    D    ; INC DEST ADDR
  689.     DCX    B    ; DEC #CHRS
  690. CMOV2    MOV    A,B
  691.     ORA    C
  692.     JNZ    CMOV1    ; REPEAT IF #CHRS <> 0
  693.     POP    B    ; RESTORE (IP) FROM (S1)
  694.     JMP    NEXT
  695. ;
  696.     DB    82H    ; U*    16X16 UNSIGNED MULTIPLY
  697.     DB    'U'    ; AVG EXECUUION TIME = 994 CYCLES
  698.     DB    '*'+80H
  699.     DW    CMOVE-8
  700. USTAR    DW    $+2
  701.     POP    D    ; (DE) <- MPLIER
  702.     POP    H    ; (HL) <- MPCAND
  703.     PUSH    B    ; SAVE IP
  704.     MOV    B,H
  705.     MOV    A,L    ; (BA) <- MPCAND
  706.     CALL    MPYX    ; (AHL)1 <- MPCAND.LB * MPLIER
  707. ;                   1ST PARTIAL PRODUCT
  708.     PUSH    H    ; SAVE (HL)1
  709.     MOV    H,A
  710.     MOV    A,B
  711.     MOV    B,H    ; SAVE (A)1
  712.     CALL    MPYX    ; (AHL)2 <- MPCAND.HB * MPLIER
  713. ;                   2ND PARTIAL PRODUCT
  714.     POP    D    ; (DE) <- (HL)1
  715.     MOV    C,D    ; (BC) <- (AH)1
  716. ;    FORM SUM OF PARTIALS:
  717. ;               (AHL) 1
  718. ;            + (AHL)  2
  719. ;            --------
  720. ;              (AHLE)
  721.     DAD    B    ; (HL) <- (HL)2 + (AH)1
  722.     ACI    0    ; (AHLE) <- (BA) * (DE)
  723.     MOV    D,L
  724.     MOV    L,H
  725.     MOV    H,A    ; (HLDE) <- MPLIER * MPCAND
  726.     POP    B    ; RESTORE IP
  727.     PUSH    D    ; (S2) <- PRODUCT.LW
  728.     JMP    HPUSH    ; (S1) <- PRODUCT.HW
  729. ;
  730. ;    MULTIPLY PRIMITIVE
  731. ;        (AHL) <- (A) * (DE)
  732. ;    #BITS =     24      8    16
  733. MPYX    LXI    H,0    ; (HL) <- 0 = PARTIAL PRODUCT.LW
  734.     MVI    C,8    ; LOOP COUNTER
  735. MPYX1    DAD    H    ; LEFT SHIFT (AHL) 24 BITS
  736.     RAL
  737.     JNC    MPYX2    ; IF NEXT MPLIER BIT = 1
  738.     DAD    D    ; THEN ADD MPCAND
  739.     ACI    0
  740. MPYX2    DCR    C    ; IF NOT LAST MPLIER BIT
  741.     JNZ    MPYX1    ; THEN LOOP AGAIN
  742.     RET        ; ELSE DONE
  743. ;
  744.     DB    82H    ; U/
  745.     DB    'U'
  746.     DB    '/'+80H
  747.     DW    USTAR-5
  748. USLAS    DW    $+2
  749.     LXI    H,4
  750.     DAD    SP    ; ((HL)) <- NUMERATOR.LW
  751.     MOV    E,M    ; (DE) <- NUMER.LW
  752.     MOV    M,C    ; SAVE IP ON STACK
  753.     INX    H
  754.     MOV    D,M
  755.     MOV    M,B
  756.     POP    B    ; (BC) <- DENOMINATOR
  757.     POP    H    ; (HL) <- NUMER.HW
  758.     MOV    A,L
  759.     SUB    C    ; IF NUMER >= DENOM
  760.     MOV    A,H
  761.     SBB    B
  762.     JC    USLA1
  763.     LXI    H,0FFFFH    ; THEN OVERFLOW
  764.     LXI    D,0FFFFH    ; SET REM & QUOT TO MAX
  765.     JMP    USLA7
  766. USLA1    MVI    A,16    ; LOOP COUNTER
  767. USLA2    DAD    H    ; LEFT SHIFT (HLDE) THRU CARRY
  768.     RAL
  769.     XCHG
  770.     DAD    H
  771.     JNC    USLA3
  772.     INX    D
  773.     ANA    A
  774. USLA3    XCHG        ; SHIFT DONE
  775.     RAR        ; RESTORE 1ST CARRY
  776.     PUSH    PSW    ; SAVE COUNTER
  777.     JNC    USLA4    ; IF CARRY = 1
  778.     MOV    A,L    ; THEN (HL) <- (HL) - (BC)
  779.     SUB    C
  780.     MOV    L,A
  781.     MOV    A,H
  782.     SBB    B
  783.     MOV    H,A
  784.     JMP    USLA5
  785. USLA4    MOV    A,L    ; ELSE TRY (HL) <- (HL) - (BC)
  786.     SUB    C
  787.     MOV    L,A
  788.     MOV    A,H
  789.     SBB    B    ; (HL) <- PARTIAL REMAINDER
  790.     MOV    H,A
  791.     JNC    USLA5
  792.     DAD    B    ; UNDERFLOW, RESTORE
  793.     DCX    D
  794. USLA5    INX    D    ; INC QUOT
  795. USLA6    POP    PSW    ; RESTORE COUNTER
  796.     DCR    A    ; IF COUNTER > 0
  797.     JNZ    USLA2    ; THEN LOOP AGAIN
  798. USLA7    POP    B    ; ELSE DONE, RESTORE IP
  799.     PUSH    H    ; (S2) <- REMAINDER
  800.     PUSH    D    ; (S1) <- QUOTIENT
  801.     JMP    NEXT
  802. ;
  803.     DB    83H    ; AND
  804.     DB    'AN'
  805.     DB    'D'+80H
  806.     DW    USLAS-5
  807. ANDD    DW    $+2    ; (S1) <- (S1) AND (S2)
  808.     POP    D
  809.     POP    H
  810.     MOV    A,E
  811.     ANA    L
  812.     MOV    L,A
  813.     MOV    A,D
  814.     ANA    H
  815.     MOV    H,A
  816.     JMP    HPUSH
  817. ;
  818.     DB    82H    ; OR
  819.     DB    'O'
  820.     DB    'V'+80H
  821.     DW    ANDD-6
  822. ORR    DW    $+2    ; (S1) <- (S1) OR (S2)
  823.     POP    D
  824.     POP    H
  825.     MOV    A,E
  826.     ORA    L
  827.     MOV    L,A
  828.     MOV    A,D
  829.     ORA    H
  830.     MOV    H,A
  831.     JMP    HPUSH
  832. ;
  833.     DB    83H    ; XOR
  834.     DB    'XO'
  835.     DB    'R'+80H
  836.     DW    ORR-5
  837. XORR    DW    $+2    ; (S1) <- (S1) XOR (S2)
  838.     POP    D
  839.     POP    H
  840.     MOV    A,E
  841.     XRA    L
  842.     MOV    L,A
  843.     MOV    A,D
  844.     XRA    H
  845.     MOV    H,A
  846.     JMP    HPUSH
  847. ;
  848.     DB    83H    ; SP@
  849.     DB    'SP'
  850.     DB    '@'+80H
  851.     DW    XORR-6
  852. SPAT    DW    $+2    ;(S1) <- (SP)
  853.     LXI    H,0
  854.     DAD    SP    ; (HL) <- (SP)
  855.     JMP    HPUSH    ; (S1) <- (HL)
  856. ;
  857.     DB    83H    ; STACK POINTER STORE
  858.     DB    'SP'
  859.     DB    '!'+80H
  860.     DW    SPAT-6
  861. SPSTO    DW    $+2    ;(SP) <- (S0) ( USER VARIABLE )
  862.     LHLD    UP    ; (HL) <- USER VAR BASE ADDR
  863.     LXI    D,6
  864.     DAD    D    ; (HL) <- S0
  865.     MOV    E,M    ; (DE) <- (S0)
  866.     INX    H
  867.     MOV    D,M
  868.     XCHG
  869.     SPHL        ; (SP) <- (S0)
  870.     JMP    NEXT
  871. ;
  872.     DB    83H    ; RP@
  873.     DB    'RP'
  874.     DB    '@'+80H
  875.     DW    SPSTO-6
  876. RPAT    DW    $+2    ;(S1) <- (RP)
  877.     LHLD    RPP
  878.     JMP    HPUSH
  879. ;
  880.     DB    83H    ; RETURN STACK POINTER STORE
  881.     DB    'RP'
  882.     DB    '!'+80H
  883.     DW    RPAT-6
  884. RPSTO    DW    $+2    ;(RP) <- (R0) ( USER VARIABLE )
  885.     LHLD    UP    ; (HL) <- USER VARIABLE BASE ADDR
  886.     LXI    D,8
  887.     DAD    D    ; (HL) <- R0
  888.     MOV    E,M    ; (DE) <- (R0)
  889.     INX    H
  890.     MOV    D,M
  891.     XCHG
  892.     SHLD    RPP    ; (RP) <- (R0)
  893.     JMP    NEXT
  894. ;
  895.     DB    82H    ; ;S
  896.     DB    ';'
  897.     DB    'S'+80H
  898.     DW    RPSTO-6
  899. SEMIS    DW    $+2    ;(IP) <- (R1)
  900.     LHLD    RPP
  901.     MOV    C,M    ; (BC) <- (R1)
  902.     INX    H
  903.     MOV    B,M
  904.     INX    H
  905.     SHLD    RPP    ; (RP) <- (RP) + 2
  906.     JMP    NEXT
  907. ;
  908.     DB    85H    ; LEAVE
  909.     DB    'LEAV'
  910.     DB    'E'+80H
  911.     DW    SEMIS-5
  912. LEAVE    DW    $+2    ;LIMIT <- INDEX
  913.     LHLD    RPP
  914.     MOV    E,M    ; (DE) <- (R1) = INDEX
  915.     INX    H
  916.     MOV    D,M
  917.     INX    H
  918.     MOV    M,E    ; (R2) <- (DE) = LIMIT
  919.     INX    H
  920.     MOV    M,D
  921.     JMP    NEXT
  922. ;
  923.     DB    82H    ; >R
  924.     DB    '>'
  925.     DB    'R'+80H
  926.     DW    LEAVE-8
  927. TOR    DW    $+2    ;(R1) <- (S1)
  928.     POP    D    ; (DE) <- (S1)
  929.     LHLD    RPP
  930.     DCX    H    ; (RP) <- (RP) - 2
  931.     DCX    H
  932.     SHLD    RPP
  933.     MOV    M,E    ; ((HL)) <- (DE)
  934.     INX    H
  935.     MOV    M,D
  936.     JMP    NEXT
  937. ;
  938.     DB    82H    ; R>
  939.     DB    'R'
  940.     DB    '>'+80H
  941.     DW    TOR-5
  942. FROMR    DW    $+2    ;(S1) <- (R1)
  943.     LHLD    RPP
  944.     MOV    E,M    ; (DE) <- (R1)
  945.     INX    H
  946.     MOV    D,M
  947.     INX    H
  948.     SHLD    RPP    ; (RP) <- (RP) + 2
  949.     PUSH    D    ; (S1) <- (DE)
  950.     JMP    NEXT
  951. ;
  952.     DB    81H    ; R
  953.     DB    'R'+80H
  954.     DW    FROMR-5
  955. RR    DW    IDO+2
  956. ;
  957.     DB    82H    ; 0=
  958.     DB    '0'
  959.     DB    '='+80H
  960.     DW    RR-4
  961. ZEQU    DW    $+2
  962.     POP    H    ; (HL) <- (S1)
  963.     MOV    A,L
  964.     ORA    H    ; IF (HL) = 0
  965.     LXI    H,0    ; THEN (HL) <- FALSE
  966.     JNZ    ZEQU1
  967.     INX    H    ; ELSE (HL) <- TRUE
  968. ZEQU1    JMP    HPUSH    ; (S1) <- (HL)
  969. ;
  970.     DB    82H    ; 0<
  971.     DB    '0'
  972.     DB    '<'+80H
  973.     DW    ZEQU-5
  974. ZLESS    DW    $+2
  975.     POP    H    ; (HL) <- (S1)
  976.     DAD    H    ; IF (HL) >= 0
  977.     LXI    H,0    ; THEN (HL) <- FALSE
  978.     JNC    ZLES1
  979.     INX    H    ; ELSE (HL) <- TRUE
  980. ZLES1    JMP    HPUSH    ; (S1) <- (HL)
  981. ;
  982.     DB    81H    ; +
  983.     DB    '+'+80H
  984.     DW    ZLESS-5
  985. PLUS    DW    $+2    ;(S1) <- (S1) + (S2)
  986.     POP    D
  987.     POP    H
  988.     DAD    D
  989.     JMP    HPUSH
  990. ;
  991.     DB    82H    ; D+    (4-2)
  992.     DB    'D'    ; XLW XHW  YLW YHW  ---  SLW SHW
  993.     DB    '+'+80H    ; S4  S3   S2  S1        S2  S1
  994.     DW    PLUS-4
  995. DPLUS    DW    $+2
  996.     LXI    H,6
  997.     DAD    SP    ; ((HL)) = XLW
  998.     MOV    E,M    ; (DE) = XLW
  999.     MOV    M,C    ; SAVE IP ON STACK
  1000.     INX    H
  1001.     MOV    D,M
  1002.     MOV    M,B
  1003.     POP    B    ; (BC) <- YHW
  1004.     POP    H    ; (HL) <- YLW
  1005.     DAD    D
  1006.     XCHG        ; (DE) <- YLW + XLW = SUM.LW
  1007.     POP    H    ; (HL) <- XHW
  1008.     MOV    A,L
  1009.     ADC    C
  1010.     MOV    L,A    ; (HL) <- YHW + XHW + CARRY
  1011.     MOV    A,H
  1012.     ADC    B
  1013.     MOV    H,A
  1014.     POP    B    ; RESTORE IP
  1015.     PUSH    D    ; (S2) <- SUM.LW
  1016.     JMP    HPUSH    ; (S1) <- SUM.HW
  1017. ;
  1018.     DB    85H    ; MINUS
  1019.     DB    'MINU'
  1020.     DB    'S'+80H
  1021.     DW    DPLUS-5
  1022. MINUS    DW    $+2    ;(S1) <- -(S1)    ( 2'S COMPLEMENT )
  1023.     POP    H
  1024.     MOV    A,L
  1025.     CMA
  1026.     MOV    L,A
  1027.     MOV    A,H
  1028.     CMA
  1029.     MOV    H,A
  1030.     INX    H
  1031.     JMP    HPUSH
  1032. ;
  1033.     DB    86H    ; DMINUS
  1034.     DB    'DMINU'
  1035.     DB    'S'+80H
  1036.     DW    MINUS-8
  1037. DMINU    DW    $+2
  1038.     POP    H    ; (HL) <- HW
  1039.     POP    D    ; (DE) <- LW
  1040.     SUB    A
  1041.     SUB    E    ; (DE) <- 0 - (DE)
  1042.     MOV    E,A
  1043.     MVI    A,0
  1044.     SBB    D
  1045.     MOV    D,A
  1046.     MVI    A,0
  1047.     SBB    L    ; (HL) <- 0 - (HL)
  1048.     MOV    L,A
  1049.     MVI    A,0
  1050.     SBB    H
  1051.     MOV    H,A
  1052.     PUSH    D    ; (S2) <- LW
  1053.     JMP    HPUSH    ; (S1) <- HW
  1054. ;
  1055.     DB    84H    ; OVER
  1056.     DB    'OVE'
  1057.     DB    'R'+80H
  1058.     DW    DMINU-9
  1059. OVER    DW    $+2
  1060.     POP    D
  1061.     POP    H
  1062.     PUSH    H
  1063.     JMP    DPUSH
  1064. ;
  1065.     DB    84H    ; DROP
  1066.     DB    'DRO'
  1067.     DB    'P'+80H
  1068.     DW    OVER-7
  1069. DROP    DW    $+2
  1070.     POP    H
  1071.     JMP    NEXT
  1072. ;
  1073.     DB    84H    ; SWAP
  1074.     DB    'SWA'
  1075.     DB    'P'+80H
  1076.     DW    DROP-7
  1077. SWAP    DW    $+2
  1078.     POP    H
  1079.     XTHL
  1080.     JMP    HPUSH
  1081. ;
  1082.     DB    83H    ; DUP
  1083.     DB    'DU'
  1084.     DB    'P'+80H
  1085.     DW    SWAP-7
  1086. DUP    DW    $+2
  1087.     POP    H
  1088.     PUSH    H
  1089.     JMP    HPUSH
  1090. ;
  1091.     DB    84H    ; 2DUP
  1092.     DB    '2DU'
  1093.     DB    'P'+80H
  1094.     DW    DUP-6
  1095. TDUP    DW    $+2
  1096.     POP    H
  1097.     POP    D
  1098.     PUSH    D
  1099.     PUSH    H
  1100.     JMP    DPUSH
  1101. ;
  1102.     DB    82H    ; PLUS STORE
  1103.     DB    '+'
  1104.     DB    '!'+80H
  1105.     DW    TDUP-7
  1106. PSTOR    DW    $+2    ;((S1)) <- ((S1)) + (S2)
  1107.     POP    H    ; (HL) <- (S1) = ADDR
  1108.     POP    D    ; (DE) <- (S2) = INCR
  1109.     MOV    A,M    ; ((HL)) <- ((HL)) + (DE)
  1110.     ADD    E
  1111.     MOV    M,A
  1112.     INX    H
  1113.     MOV    A,M
  1114.     ADC    D
  1115.     MOV    M,A
  1116.     JMP    NEXT
  1117. ;
  1118.     DB    86H    ; TOGGLE
  1119.     DB    'TOGGL'
  1120.     DB    'E'+80H
  1121.     DW    PSTOR-5
  1122. TOGGL    DW    $+2    ;((S2)) <- ((S2)) XOR (S1)LB
  1123.     POP    D    ; (E) <- BYTE MASK
  1124.     POP    H    ; (HL) <- ADDR
  1125.     MOV    A,M
  1126.     XRA    E
  1127.     MOV    M,A    ; (ADDR) <- (ADDR) XOR (E)
  1128.     JMP    NEXT
  1129. ;
  1130.     DB    81H    ; @
  1131.     DB    '@'+80H
  1132.     DW    TOGGL-9
  1133. AT    DW    $+2    ;(S1) <- ((S1))
  1134.     POP    H    ; (HL) <- ADDR
  1135.     MOV    E,M    ; (DE) <- (ADDR)
  1136.     INX    H
  1137.     MOV    D,M
  1138.     PUSH    D    ; (S1) <- (DE)
  1139.     JMP    NEXT
  1140. ;
  1141.     DB    82H    ; C@
  1142.     DB    'C'
  1143.     DB    '@'+80H
  1144.     DW    AT-4
  1145. CAT    DW    $+2    ;(S1) <- ((S1))LB
  1146.     POP    H    ; (HL) <- ADDR
  1147.     MOV    L,M    ; (HL) <- (ADDR)LB
  1148.     MVI    H,0
  1149.     JMP    HPUSH
  1150. ;
  1151.     DB    82H    ; 2@
  1152.     DB    '2'
  1153.     DB    '@'+80H
  1154.     DW    CAT-5
  1155. TAT    DW    $+2
  1156.     POP    H    ; (HL) <- ADDR HW
  1157.     LXI    D,2
  1158.     DAD    D    ; (HL) <- ADDR LW
  1159.     MOV    E,M    ; (DE) <- LW
  1160.     INX    H
  1161.     MOV    D,M
  1162.     PUSH    D    ; (S2) <- LW
  1163.     LXI    D,-3    ; (HL) <- ADDR HW
  1164.     DAD    D
  1165.     MOV    E,M    ; (DE) <- HW
  1166.     INX    H
  1167.     MOV    D,M
  1168.     PUSH    D    ; (S1) <- HW
  1169.     JMP    NEXT
  1170. ;
  1171.     DB    81H    ; STORE
  1172.     DB    '!'+80H
  1173.     DW    TAT-5
  1174. STORE    DW    $+2    ;((S1)) <- (S2)
  1175.     POP    H    ; (HL) <- (S1) = ADDR
  1176.     POP    D    ; (DE) <- (S2) = VALUE
  1177.     MOV    M,E    ; ((HL)) <- (DE)
  1178.     INX    H
  1179.     MOV    M,D
  1180.     JMP    NEXT
  1181. ;
  1182.     DB    82H    ; C STORE
  1183.     DB    'C'
  1184.     DB    '!'+80H
  1185.     DW    STORE-4
  1186. CSTOR    DW    $+2    ;((S1))LB <- (S2)LB
  1187.     POP    H    ; (HL) <- (S1) = ADDR
  1188.     POP    D    ; (DE) <- (S2) = BYTE
  1189.     MOV    M,E    ; ((HL))LB <- (E)
  1190.     JMP    NEXT
  1191. ;
  1192.     DB    82H    ; 2 STORE
  1193.     DB    '2'
  1194.     DB    '!'+80H
  1195.     DW    CSTOR-5
  1196. TSTOR    DW    $+2
  1197.     POP    H    ; (HL) <- ADDR
  1198.     POP    D    ; (DE) <- HW
  1199.     MOV    M,E    ; (ADDR) <- HW
  1200.     INX    H
  1201.     MOV    M,D
  1202.     INX    H    ; (HL) <- ADDR LW
  1203.     POP    D    ; (DE) <- LW
  1204.     MOV    M,E    ; (ADDR+2) <- LW
  1205.     INX    H
  1206.     MOV    M,D
  1207.     JMP    NEXT
  1208. ;
  1209.     DB    0C1H    ; :
  1210.     DB    ':'+80H
  1211.     DW    TSTOR-5
  1212. COLON    DW    DOCOL
  1213.     DW    QEXEC
  1214.     DW    SCSP
  1215.     DW    CURR
  1216.     DW    AT
  1217.     DW    CONT
  1218.     DW    STORE
  1219.     DW    CREAT
  1220.     DW    RBRAC
  1221.     DW    PSCOD
  1222. DOCOL    LHLD    RPP
  1223.     DCX    H    ; (R1) <- (IP)
  1224.     MOV    M,B
  1225.     DCX    H    ; (RP) <- (RP) - 2
  1226.     MOV    M,C
  1227.     SHLD    RPP
  1228.     INX    D    ; (DE) <- CFA+2 = (W)
  1229.     MOV    C,E    ; (IP) <- (DE) = (W)
  1230.     MOV    B,D
  1231.     JMP    NEXT
  1232. ;
  1233.     DB    0C1H    ; ;
  1234.     DB    ';'+80H
  1235.     DW    COLON-4
  1236. SEMI    DW    DOCOL
  1237.     DW    QCSP
  1238.     DW    COMP
  1239.     DW    SEMIS
  1240.     DW    SMUDG
  1241.     DW    LBRAC
  1242.     DW    SEMIS
  1243. ;
  1244.     DB    84H    ; NOOP
  1245.     DB    'NOO'
  1246.     DB    'P'+80H
  1247.     DW    SEMI-4
  1248. NOOP    DW    DOCOL
  1249.     DW    SEMIS
  1250.  ;
  1251.     DB    88H    ; CONSTANT
  1252.     DB    'CONSTAN'
  1253.     DB    'T'+80H
  1254.     DW    NOOP-7
  1255. CON    DW    DOCOL
  1256.     DW    CREAT
  1257.     DW    SMUDG
  1258.     DW    COMMA
  1259.     DW    PSCOD
  1260. DOCON    INX    D    ; (DE) <- PFA
  1261.     XCHG
  1262.     MOV    E,M    ; (DE) <- (PFA)
  1263.     INX    H
  1264.     MOV    D,M
  1265.     PUSH    D    ; (S1) <- (PFA)
  1266.     JMP    NEXT
  1267. ;
  1268.     DB    88H    ; VARIABLE
  1269.     DB    'VARIABL'
  1270.     DB    'E'+80H
  1271.     DW    CON-0BH
  1272. VAR    DW    DOCOL
  1273.     DW    CON
  1274.     DW    PSCOD
  1275. DOVAR    INX    D    ; (DE) <- PFA
  1276.     PUSH    D    ; (S1) <- PFA
  1277.     JMP    NEXT
  1278. ;
  1279.     DB    84H    ; USER
  1280.     DB    'USE'
  1281.     DB    'R'+80H
  1282.     DW    VAR-0BH
  1283. USER    DW    DOCOL
  1284.     DW    CON
  1285.     DW    PSCOD
  1286. DOUSE    INX    D    ; (DE) <- PFA
  1287.     XCHG
  1288.     MOV    E,M    ; (DE) <- USER VARIABLE OFFSET
  1289.     MVI    D,0
  1290.     LHLD    UP    ; (HL) <- USER VARIABLE BASE ADDR
  1291.     DAD    D    ; (HL) <- (HL) + (DE)
  1292.     JMP    HPUSH    ; (S1) <- BASE + OFFSET
  1293. ;
  1294.     DB    81H    ; 0
  1295.     DB    '0'+80H
  1296.     DW    USER-7
  1297. ZERO    DW    DOCON
  1298.     DW    0
  1299. ;
  1300.     DB    81H    ; 1
  1301.     DB    '1'+80H
  1302.     DW    ZERO-4
  1303. ONE    DW    DOCON
  1304.     DW    1
  1305. ;
  1306.     DB    81H    ; 2
  1307.     DB    '2'+80H
  1308.     DW    ONE-4
  1309. TWO    DW    DOCON
  1310.     DW    2
  1311. ;
  1312.     DB    81H    ; 3
  1313.     DB    '3'+80H
  1314.     DW    TWO-4
  1315. THREE    DW    DOCON
  1316.     DW    3
  1317. ;
  1318.     DB    82H    ; BL
  1319.     DB    'B'
  1320.     DB    'L'+80H
  1321.     DW    THREE-4
  1322. BL    DW    DOCON
  1323.     DW    20H
  1324. ;
  1325.     DB    83H    ; C/L ( CHARACTERS/LINE )
  1326.     DB    'C/'
  1327.     DB    'L'+80H
  1328.     DW    BL-5
  1329. CSLL    DW    DOCON
  1330.     DW    64
  1331. ;
  1332.     DB    85H    ; FIRST
  1333.     DB    'FIRS'
  1334.     DB    'T'+80H
  1335.     DW    CSLL-6
  1336. FIRST    DW    DOCON
  1337.     DW    BUF1
  1338. ;
  1339.     DB    85H    ; LIMIT
  1340.     DB    'LIMI'
  1341.     DB    'T'+80H
  1342.     DW    FIRST-8
  1343. LIMIT    DW    DOCON
  1344.     DW    EM
  1345. ;
  1346.     DB    85H    ; B/BUF ( BYTES/BUFFER )
  1347.     DB    'B/BU'
  1348.     DB    'F'+80H
  1349.     DW    LIMIT-8
  1350. BBUF    DW    DOCON
  1351.     DW    KBBUF
  1352. ;
  1353.     DB    85H    ; B/SCR ( BUFFERS/SCREEN )
  1354.     DB    'B/SC'
  1355.     DB    'R'+80H
  1356.     DW    BBUF-8
  1357. BSCR    DW    DOCON
  1358.     DW    400H/KBBUF
  1359. ;
  1360.     DB    87H    ; +ORIGIN
  1361.     DB    '+ORIGI'
  1362.     DB    'N'+80H
  1363.     DW    BSCR-8
  1364. PORIG    DW    DOCOL
  1365.     DW    LIT
  1366.     DW    ORIG
  1367.     DW    PLUS
  1368.     DW    SEMIS
  1369. ;
  1370. ;    USER VARIABLES
  1371. ;
  1372.     DB    82H    ; S0
  1373.     DB    'S'
  1374.     DB    '0'+80H
  1375.     DW    PORIG-0AH
  1376. SZERO    DW    DOUSE
  1377.     DW    6
  1378. ;
  1379.     DB    82H    ; R0
  1380.     DB    'R'
  1381.     DB    '0'+80H
  1382.     DW    SZERO-5
  1383. RZERO    DW    DOUSE
  1384.     DW    8
  1385. ;
  1386.     DB    83H    ; TIB
  1387.     DB    'TI'
  1388.     DB    'B'+80H
  1389.     DW    RZERO-5
  1390. TIB    DW    DOUSE
  1391.     DB    0AH
  1392. ;
  1393.     DB    85H    ; WIDTH
  1394.     DB    'WIDT'
  1395.     DB    'H'+80H
  1396.     DW    TIB-6
  1397. WIDTH    DW    DOUSE
  1398.     DB    0CH
  1399. ;
  1400.     DB    87H    ; WARNING
  1401.     DB    'WARNIN'
  1402.     DB    'G'+80H
  1403.     DW    WIDTH-8
  1404. WARN    DW    DOUSE
  1405.     DB    0EH
  1406. ;
  1407.     DB    85H    ; FENCE
  1408.     DB    'FENC'
  1409.     DB    'E'+80H
  1410.     DW    WARN-0AH
  1411. FENCE    DW    DOUSE
  1412.     DB    10H
  1413. ;
  1414.     DB    82H    ; DP
  1415.     DB    'D'
  1416.     DB    'P'+80H
  1417.     DW    FENCE-8
  1418. DP    DW    DOUSE
  1419.     DB    12H
  1420. ;
  1421.     DB    88H    ; VOC-LINK
  1422.     DB    'VOC-LIN'
  1423.     DB    'K'+80H
  1424.     DW    DP-5
  1425. VOCL    DW    DOUSE
  1426.     DW    14H
  1427. ;
  1428.     DB    83H    ; BLK
  1429.     DB    'BL'
  1430.     DB    'K'+80H
  1431.     DW    VOCL-0BH
  1432. BLK    DW    DOUSE
  1433.     DB    16H
  1434. ;
  1435.     DB    82H    ; IN
  1436.     DB    'I'
  1437.     DB    'N'+80H
  1438.     DW    BLK-6
  1439. INN    DW    DOUSE
  1440.     DB    18H
  1441. ;
  1442.     DB    83H    ; OUT
  1443.     DB    'OU'
  1444.     DB    'T'+80H
  1445.     DW    INN-5
  1446. OUTT    DW    DOUSE
  1447.     DB    1AH
  1448. ;
  1449.     DB    83H    ; SCR
  1450.     DB    'SC'
  1451.     DB    'R'+80H
  1452.     DW    OUTT-6
  1453. SCR    DW    DOUSE
  1454.     DB    1CH
  1455. ;
  1456.     DB    86H    ; OFFSET
  1457.     DB    'OFFSE'
  1458.     DB    'T'+80H
  1459.     DW    SCR-6
  1460. OFSET    DW    DOUSE
  1461.     DB    1EH
  1462. ;
  1463.     DB    87H    ; CONTEXT
  1464.     DB    'CONTEX'
  1465.     DB    'T'+80H
  1466.     DW    OFSET-9
  1467. CONT    DW    DOUSE
  1468.     DB    20H
  1469. ;
  1470.     DB    87H    ; CURRENT
  1471.     DB    'CURREN'
  1472.     DB    'T'+80H
  1473.     DW    CONT-0AH
  1474. CURR    DW    DOUSE
  1475.     DB    22H
  1476. ;
  1477.     DB    85H    ; STATE
  1478.     DB    'STAT'
  1479.     DB    'E'+80H
  1480.     DW    CURR-0AH
  1481. STATE    DW    DOUSE
  1482.     DB    24H
  1483. ;
  1484.     DB    84H    ; BASE
  1485.     DB    'BAS'
  1486.     DB    'E'+80H
  1487.     DW    STATE-8
  1488. BASE    DW    DOUSE
  1489.     DB    26H
  1490. ;
  1491.     DB    83H    ; DPL
  1492.     DB    'DP'
  1493.     DB    'L'+80H
  1494.     DW    BASE-7
  1495. DPL    DW    DOUSE
  1496.     DB    28H
  1497. ;
  1498.     DB    83H    ; FLD
  1499.     DB    'FL'
  1500.     DB    'D'+80H
  1501.     DW    DPL-6
  1502. FLD    DW    DOUSE
  1503.     DB    2AH
  1504. ;
  1505.     DB    83H    ; CSP
  1506.     DB    'CS'
  1507.     DB    'P'+80H
  1508.     DW    FLD-6
  1509. CSPP    DW    DOUSE
  1510.     DB    2CH
  1511. ;
  1512.     DB    82H    ; R#
  1513.     DB    'R'
  1514.     DB    '#'+80H
  1515.     DW    CSPP-6
  1516. RNUM    DW    DOUSE
  1517.     DB    2EH
  1518. ;
  1519.     DB    83H    ; HLD
  1520.     DB    'HL'
  1521.     DB    'D'+80H
  1522.     DW    RNUM-5
  1523. HLD    DW    DOUSE
  1524.     DW    30H
  1525. ;
  1526. ;    END OF USER VARIABLES
  1527. ;
  1528.     DB    82H    ; 1+
  1529.     DB    '1'
  1530.     DB    '+'+80H
  1531.     DW    HLD-6
  1532. ONEP    DW    DOCOL
  1533.     DW    ONE
  1534.     DW    PLUS
  1535.     DW    SEMIS
  1536. ;
  1537.     DB    82H    ; 2+
  1538.     DB    '2'
  1539.     DB    '+'+80H
  1540.     DW    ONEP-5
  1541. TWOP    DW    DOCOL
  1542.     DW    TWO
  1543.     DW    PLUS
  1544.     DW    SEMIS
  1545. ;
  1546.     DB    84H    ; HERE
  1547.     DB    'HER'
  1548.     DB    'E'+80H
  1549.     DW    TWOP-5
  1550. HERE    DW    DOCOL
  1551.     DW    DP
  1552.     DW    AT
  1553.     DW    SEMIS
  1554. ;
  1555.     DB    85H    ; ALLOT
  1556.     DB    'ALLO'
  1557.     DB    'T'+80H
  1558.     DW    HERE-7
  1559. ALLOT    DW    DOCOL
  1560.     DW    DP
  1561.     DW    PSTOR
  1562.     DW    SEMIS
  1563. ;
  1564.     DB    81H    ; ,
  1565.     DB    ','+80H
  1566.     DW    ALLOT-8
  1567. COMMA    DW    DOCOL
  1568.     DW    HERE
  1569.     DW    STORE
  1570.     DW    TWO
  1571.     DW    ALLOT
  1572.     DW    SEMIS
  1573. ;
  1574.     DB    82H    ; C,
  1575.     DB    'C'
  1576.     DB    ','+80H
  1577.     DW    COMMA-4
  1578. CCOMM    DW    DOCOL
  1579.     DW    HERE
  1580.     DW    CSTOR
  1581.     DW    ONE
  1582.     DW    ALLOT
  1583.     DW    SEMIS
  1584. ;
  1585. ;    SUBROUTINE USED BY - AND <
  1586. ;            ; (HL) <- (HL) - (DE)
  1587. SSUB    MOV    A,L    ; LB
  1588.     SUB    E
  1589.     MOV    L,A
  1590.     MOV    A,H    ; HB
  1591.     SBB    D
  1592.     MOV    H,A
  1593.     RET
  1594. ;
  1595.     DB    81H    ; -
  1596.     DB    '-'+80H
  1597.     DW    CCOMM-5
  1598. SUBB    DW    $+2
  1599.     POP    D    ; (DE) <- (S1) = Y
  1600.     POP    H    ; (HL) <- (S2) = X
  1601.     CALL    SSUB
  1602.     JMP    HPUSH    ; (S1) <- X - Y
  1603. ;
  1604.     DB    81H    ; =
  1605.     DB    '='+80H
  1606.     DW    SUBB-4
  1607. EQUAL    DW    DOCOL
  1608.     DW    SUBB
  1609.     DW    ZEQU
  1610.     DW    SEMIS
  1611. ;
  1612.     DB    81H    ; <
  1613.     DB    '<'+80H        ; X  <  Y
  1614.     DW    EQUAL-4        ; S2    S1
  1615. LESS    DW    $+2
  1616.     POP    D    ; (DE) <- (S1) = Y
  1617.     POP    H    ; (HL) <- (S2) = X
  1618.     MOV    A,D    ; IF X & Y HAVE SAME SIGNS
  1619.     XRA    H
  1620.     JM    LES1
  1621.     CALL    SSUB    ; (HL) <- X - Y
  1622. LES1    INR    H    ; IF (HL) >= 0
  1623.     DCR    H
  1624.     JM    LES2
  1625.     LXI    H,0    ; THEN X >= Y
  1626.     JMP    HPUSH    ; (S1) <- FALSE
  1627. LES2    LXI    H,1    ; ELSE X < Y
  1628.     JMP    HPUSH    ; (S1) <- TRUE
  1629. ;
  1630.     DB    82H    ; U< ( UNSIGNED < )
  1631.     DB    'U'
  1632.     DB    '<'+80H
  1633.     DW    LESS-4
  1634. ULESS    DW    DOCOL,TDUP
  1635.     DW    XORR,ZLESS
  1636.     DW    ZBRAN,ULES1-$    ; IF
  1637.     DW    DROP,ZLESS
  1638.     DW    ZEQU
  1639.     DW    BRAN,ULES2-$
  1640. ULES1    DW    SUBB,ZLESS    ; ELSE
  1641. ULES2    DW    SEMIS        ; ENDIF
  1642. ;
  1643.     DB    81H    ; >
  1644.     DB    '>'+80H
  1645.     DW    ULESS-5
  1646. GREAT    DW    DOCOL
  1647.     DW    SWAP
  1648.     DW    LESS
  1649.     DW    SEMIS
  1650. ;
  1651.     DB    83H    ; ROT
  1652.     DB    'RO'
  1653.     DB    'T'+80H
  1654.     DW    GREAT-4
  1655. ROT    DW    $+2
  1656.     POP    D
  1657.     POP    H
  1658.     XTHL
  1659.     JMP    DPUSH
  1660. ;
  1661.     DB    85H    ; SPACE
  1662.     DB    'SPAC'
  1663.     DB    'E'+80H
  1664.     DW    ROT-6
  1665. SPACE    DW    DOCOL
  1666.     DW    BL
  1667.     DW    EMIT
  1668.     DW    SEMIS
  1669. ;
  1670.     DB    84H    ; -DUP
  1671.     DB    '-DU'
  1672.     DB    'P'+80H
  1673.     DW    SPACE-8
  1674. DDUP    DW    DOCOL
  1675.     DW    DUP
  1676.     DW    ZBRAN    ; IF
  1677.     DW    DDUP1-$
  1678.     DW    DUP    ; ENDIF
  1679. DDUP1    DW    SEMIS
  1680. ;
  1681.     DB    88H    ; TRAVERSE
  1682.     DB    'TRAVERS'
  1683.     DB    'E'+80H
  1684.     DW    DDUP-7
  1685. TRAV    DW    DOCOL
  1686.     DW    SWAP
  1687. TRAV1    DW    OVER    ; BEGIN
  1688.     DW    PLUS
  1689.     DW    LIT
  1690.     DW    7FH
  1691.     DW    OVER
  1692.     DW    CAT
  1693.     DW    LESS
  1694.     DW    ZBRAN    ; UNTIL
  1695.     DW    TRAV1-$
  1696.     DW    SWAP
  1697.     DW    DROP
  1698.     DW    SEMIS
  1699. ;
  1700.     DB    86H    ; LATEST
  1701.     DB    'LATES'
  1702.     DB    'T'+80H
  1703.     DW    TRAV-0BH
  1704. LATES    DW    DOCOL
  1705.     DW    CURR
  1706.     DW    AT
  1707.     DW    AT
  1708.     DW    SEMIS
  1709. ;
  1710.     DB    83H    ; LFA
  1711.     DB    'LF'
  1712.     DB    'A'+80H
  1713.     DW    LATES-9
  1714. LFA    DW    DOCOL
  1715.     DW    LIT
  1716.     DW    4
  1717.     DW    SUBB
  1718.     DW    SEMIS
  1719. ;
  1720.     DB    83H    ; CFA
  1721.     DB    'CF'
  1722.     DB    'A'+80H
  1723.     DW    LFA-6
  1724. CFA    DW    DOCOL
  1725.     DW    TWO
  1726.     DW    SUBB
  1727.     DW    SEMIS
  1728. ;
  1729.     DB    83H    ; NFA
  1730.     DB    'NF'
  1731.     DB    'A'+80H
  1732.     DW    CFA-6
  1733. NFA    DW    DOCOL
  1734.     DW    LIT
  1735.     DW    5
  1736.     DW    SUBB
  1737.     DW    LIT
  1738.     DW    -1
  1739.     DW    TRAV
  1740.     DW    SEMIS
  1741. ;
  1742.     DB    83H    ; PFA
  1743.     DB    'PF'
  1744.     DB    'A'+80H
  1745.     DW    NFA-6
  1746. PFA    DW    DOCOL
  1747.     DW    ONE
  1748.     DW    TRAV
  1749.     DW    LIT
  1750.     DW    5
  1751.     DW    PLUS
  1752.     DW    SEMIS
  1753. ;
  1754.     DB    84H    ; STORE CSP
  1755.     DB    '!CS'
  1756.     DB    'P'+80H
  1757.     DW    PFA-6
  1758. SCSP    DW    DOCOL
  1759.     DW    SPAT
  1760.     DW    CSPP
  1761.     DW    STORE
  1762.     DW    SEMIS
  1763. ;
  1764.     DB    86H    ; ?ERROR
  1765.     DB    '?ERRO'
  1766.     DB    'R'+80H
  1767.     DW    SCSP-7
  1768. QERR    DW    DOCOL
  1769.     DW    SWAP
  1770.     DW    ZBRAN    ; IF
  1771.     DW    QERR1-$
  1772.     DW    ERROR
  1773.     DW    BRAN    ; ELSE
  1774.     DW    QERR2-$
  1775. QERR1    DW    DROP    ; ENDIF
  1776. QERR2    DW    SEMIS
  1777. ;
  1778.     DB    85H    ; ?COMP
  1779.     DB    '?COM'
  1780.     DB    'P'+80H
  1781.     DW    QERR-9
  1782. QCOMP    DW    DOCOL
  1783.     DW    STATE
  1784.     DW    AT
  1785.     DW    ZEQU
  1786.     DW    LIT
  1787.     DW    11H
  1788.     DW    QERR
  1789.     DW    SEMIS
  1790. ;
  1791.     DB    85H    ; ?EXEC
  1792.     DB    '?EXE'
  1793.     DB    'C'+80H
  1794.     DW    QCOMP-8
  1795. QEXEC    DW    DOCOL
  1796.     DW    STATE
  1797.     DW    AT
  1798.     DW    LIT
  1799.     DW    12H
  1800.     DW    QERR
  1801.     DW    SEMIS
  1802. ;
  1803.     DB    86H    ; ?PAIRS
  1804.     DB    '?PAIR'
  1805.     DB    'S'+80H
  1806.     DW    QEXEC-8
  1807. QPAIR    DW    DOCOL
  1808.     DW    SUBB
  1809.     DW    LIT
  1810.     DW    13H
  1811.     DW    QERR
  1812.     DW    SEMIS
  1813. ;
  1814.     DB    84H    ; ?CSP
  1815.     DB    '?CS'
  1816.     DB    'P'+80H
  1817.     DW    QPAIR-9
  1818. QCSP    DW    DOCOL
  1819.     DW    SPAT
  1820.     DW    CSPP
  1821.     DW    AT
  1822.     DW    SUBB
  1823.     DW    LIT
  1824.     DW    14H
  1825.     DW    QERR
  1826.     DW    SEMIS
  1827. ;
  1828.     DB    88H    ; ?LOADING
  1829.     DB    '?LOADIN'
  1830.     DB    'G'+80H
  1831.     DW    QCSP-7
  1832. QLOAD    DW    DOCOL
  1833.     DW    BLK
  1834.     DW    AT
  1835.     DW    ZEQU
  1836.     DW    LIT
  1837.     DW    16H
  1838.     DW    QERR
  1839.     DW    SEMIS
  1840. ;
  1841.     DB    87H    ; COMPILE
  1842.     DB    'COMPIL'
  1843.     DB    'E'+80H
  1844.     DW    QLOAD-0BH
  1845. COMP    DW    DOCOL
  1846.     DW    QCOMP
  1847.     DW    FROMR
  1848.     DW    DUP
  1849.     DW    TWOP
  1850.     DW    TOR
  1851.     DW    AT
  1852.     DW    COMMA
  1853.     DW    SEMIS
  1854. ;
  1855.     DB    0C1H    ; [
  1856.     DB    '['+80H
  1857.     DW    COMP-0AH
  1858. LBRAC    DW    DOCOL
  1859.     DW    ZERO
  1860.     DW    STATE
  1861.     DW    STORE
  1862.     DW    SEMIS
  1863. ;
  1864.     DB    81H    ; ]
  1865.     DB    ']'+80H
  1866.     DW    LBRAC-4
  1867. RBRAC    DW    DOCOL
  1868.     DW    LIT,0C0H
  1869.     DW    STATE,STORE
  1870.     DW    SEMIS
  1871. ;
  1872.     DB    86H    ; SMUDGE
  1873.     DB    'SMUDG'
  1874.     DB    'E'+80H
  1875.     DW    RBRAC-4
  1876. SMUDG    DW    DOCOL
  1877.     DW    LATES
  1878.     DW    LIT
  1879.     DW    20H
  1880.     DW    TOGGL
  1881.     DW    SEMIS
  1882. ;
  1883.     DB    83H    ; HEX
  1884.     DB    'HE'
  1885.     DB    'X'+80H
  1886.     DW    SMUDG-9
  1887. HEX    DW    DOCOL
  1888.     DW    LIT
  1889.     DW    10H
  1890.     DW    BASE
  1891.     DW    STORE
  1892.     DW    SEMIS
  1893. ;
  1894.     DB    87H    ; DECIMAL
  1895.     DB    'DECIMA'
  1896.     DB    'L'+80H
  1897.     DW    HEX-6
  1898. DEC    DW    DOCOL
  1899.     DW    LIT
  1900.     DW    0AH
  1901.     DW    BASE
  1902.     DW    STORE
  1903.     DW    SEMIS
  1904. ;
  1905.     DB    87H    ; (;CODE)
  1906.     DB    '(;CODE'
  1907.     DB    ')'+80H
  1908.     DW    DEC-0AH
  1909. PSCOD    DW    DOCOL
  1910.     DW    FROMR
  1911.     DW    LATES
  1912.     DW    PFA
  1913.     DW    CFA
  1914.     DW    STORE
  1915.     DW    SEMIS
  1916. ;
  1917.     DB    0C5H    ; ;CODE
  1918.     DB    ';COD'
  1919.     DB    'E'+80H
  1920.     DW    PSCOD-0AH
  1921. SEMIC    DW    DOCOL
  1922.     DW    QCSP
  1923.     DW    COMP
  1924.     DW    PSCOD
  1925.     DW    LBRAC
  1926. SEMI1    DW    NOOP    ; ( ASSEMBLER )
  1927.     DW    SEMIS
  1928. ;
  1929.     DB    87H    ; <BUILDS
  1930.     DB    '<BUILD'
  1931.     DB    'S'+80H
  1932.     DW    SEMIC-8
  1933. BUILD    DW    DOCOL
  1934.     DW    ZERO
  1935.     DW    CON
  1936.     DW    SEMIS
  1937. ;
  1938.     DB    85H    ; DOES>
  1939.     DB    'DOES'
  1940.     DB    '>'+80H
  1941.     DW    BUILD-0AH
  1942. DOES    DW    DOCOL
  1943.     DW    FROMR
  1944.     DW    LATES
  1945.     DW    PFA
  1946.     DW    STORE
  1947.     DW    PSCOD
  1948. DODOE    LHLD    RPP    ; (HL) <- (RP)
  1949.     DCX    H
  1950.     MOV    M,B    ; (R1) <- (IP) = PFA = (SUBSTITUTE CFA)
  1951.     DCX    H
  1952.     MOV    M,C
  1953.     SHLD    RPP    ; (RP) <- (RP) - 2
  1954.     INX    D    ; (DE) <- PFA = (SUBSTITUTE CFA)
  1955.     XCHG
  1956.     MOV    C,M    ; (IP) <- (SUBSTITUTE CFA)
  1957.     INX    H
  1958.     MOV    B,M
  1959.     INX    H
  1960.     JMP    HPUSH    ; (S1) <- PFA+2 = SUBSTITUTE PFA
  1961. ;
  1962.     DB    85H    ; COUNT
  1963.     DB    'COUN'
  1964.     DB    'T'+80H
  1965.     DW    DOES-8
  1966. COUNT    DW    DOCOL
  1967.     DW    DUP
  1968.     DW    ONEP
  1969.     DW    SWAP
  1970.     DW    CAT
  1971.     DW    SEMIS
  1972. ;
  1973.     DB    84H    ; TYPE
  1974.     DB    'TYP'
  1975.     DB    'E'+80H
  1976.     DW    COUNT-8
  1977. TYPE    DW    DOCOL
  1978.     DW    DDUP
  1979.     DW    ZBRAN    ; IF
  1980.     DW    TYPE1-$
  1981.     DW    OVER
  1982.     DW    PLUS
  1983.     DW    SWAP
  1984.     DW    XDO    ; DO
  1985. TYPE2    DW    IDO
  1986.     DW    CAT
  1987.     DW    EMIT
  1988.     DW    XLOOP    ; LOOP
  1989.     DW    TYPE2-$
  1990.     DW    BRAN    ; ELSE
  1991.     DW    TYPE3-$
  1992. TYPE1    DW    DROP    ; ENDIF
  1993. TYPE3    DW    SEMIS
  1994. ;
  1995.     DB    89H    ; -TRAILING
  1996.     DB    '-TRAILIN'
  1997.     DB    'G'+80H
  1998.     DW    TYPE-7
  1999. DTRAI    DW    DOCOL
  2000.     DW    DUP
  2001.     DW    ZERO
  2002.     DW    XDO    ; DO
  2003. DTRA1    DW    OVER
  2004.     DW    OVER
  2005.     DW    PLUS
  2006.     DW    ONE
  2007.     DW    SUBB
  2008.     DW    CAT
  2009.     DW    BL
  2010.     DW    SUBB
  2011.     DW    ZBRAN    ; IF
  2012.     DW    DTRA2-$
  2013.     DW    LEAVE
  2014.     DW    BRAN    ; ELSE
  2015.     DW    DTRA3-$
  2016. DTRA2    DW    ONE
  2017.     DW    SUBB    ; ENDIF
  2018. DTRA3    DW    XLOOP    ; LOOP
  2019.     DW    DTRA1-$
  2020.     DW    SEMIS
  2021. ;
  2022.     DB    84H    ; (.")
  2023.     DB    '(."'
  2024.     DB    ')'+80H
  2025.     DW    DTRAI-0CH
  2026. PDOTQ    DW    DOCOL
  2027.     DW    RR
  2028.     DW    COUNT
  2029.     DW    DUP
  2030.     DW    ONEP
  2031.     DW    FROMR
  2032.     DW    PLUS
  2033.     DW    TOR
  2034.     DW    TYPE
  2035.     DW    SEMIS
  2036. ;
  2037.     DB    0C2H    ; ."
  2038.     DB    '.'
  2039.     DB    '"'+80H
  2040.     DW    PDOTQ-7
  2041. DOTQ    DW    DOCOL
  2042.     DW    LIT
  2043.     DW    22H
  2044.     DW    STATE
  2045.     DW    AT
  2046.     DW    ZBRAN    ; IF
  2047.     DW    DOTQ1-$
  2048.     DW    COMP
  2049.     DW    PDOTQ
  2050.     DW    WORD
  2051.     DW    HERE
  2052.     DW    CAT
  2053.     DW    ONEP
  2054.     DW    ALLOT
  2055.     DW    BRAN    ; ELSE
  2056.     DW    DOTQ2-$
  2057. DOTQ1    DW    WORD
  2058.     DW    HERE
  2059.     DW    COUNT
  2060.     DW    TYPE    ; ENDIF
  2061. DOTQ2    DW    SEMIS
  2062. ;
  2063.     DB    86H    ; EXPECT
  2064.     DB    'EXPEC'
  2065.     DB    'T'+80H
  2066.     DW    DOTQ-5
  2067. EXPEC    DW    DOCOL
  2068.     DW    OVER
  2069.     DW    PLUS
  2070.     DW    OVER
  2071.     DW    XDO    ; DO
  2072. EXPE1    DW    KEY
  2073.     DW    DUP
  2074.     DW    LIT
  2075.     DW    0EH
  2076.     DW    PORIG
  2077.     DW    AT
  2078.     DW    EQUAL
  2079.     DW    ZBRAN    ; IF
  2080.     DW    EXPE2-$
  2081.     DW    DROP
  2082.     DW    DUP
  2083.     DW    IDO
  2084.     DW    EQUAL
  2085.     DW    DUP
  2086.     DW    FROMR
  2087.     DW    TWO
  2088.     DW    SUBB
  2089.     DW    PLUS
  2090.     DW    TOR
  2091.     DW    ZBRAN    ; IF
  2092.     DW    EXPE6-$
  2093.     DW    LIT
  2094.     DW    BELL
  2095.     DW    BRAN    ; ELSE
  2096.     DW    EXPE7-$
  2097. EXPE6    DW    LIT
  2098.     DW    BSOUT    ; ENDIF
  2099. EXPE7    DW    BRAN    ; ELSE
  2100.     DW    EXPE3-$
  2101. EXPE2    DW    DUP
  2102.     DW    LIT
  2103.     DW    0DH
  2104.     DW    EQUAL
  2105.     DW    ZBRAN    ; IF
  2106.     DW    EXPE4-$
  2107.     DW    LEAVE
  2108.     DW    DROP
  2109.     DW    BL
  2110.     DW    ZERO
  2111.     DW    BRAN    ; ELSE
  2112.     DW    EXPE5-$
  2113. EXPE4    DW    DUP    ; ENDIF
  2114. EXPE5    DW    IDO
  2115.     DW    CSTOR
  2116.     DW    ZERO
  2117.     DW    IDO
  2118.     DW    ONEP
  2119.     DW    STORE    ; ENDIF
  2120. EXPE3    DW    EMIT
  2121.     DW    XLOOP    ; LOOP
  2122.     DW    EXPE1-$
  2123.     DW    DROP
  2124.     DW    SEMIS
  2125. ;
  2126.     DB    85H    ; QUERY
  2127.     DB    'QUER'
  2128.     DB    'Y'+80H
  2129.     DW    EXPEC-9
  2130. QUERY    DW    DOCOL
  2131.     DW    TIB
  2132.     DW    AT
  2133.     DW    LIT
  2134.     DW    50H
  2135.     DW    EXPEC
  2136.     DW    ZERO
  2137.     DW    INN
  2138.     DW    STORE
  2139.     DW    SEMIS
  2140. ;
  2141.     DB    0C1H    ; 0 (NULL)
  2142.     DB    80H
  2143.     DW    QUERY-8
  2144. NULL    DW    DOCOL
  2145.     DW    BLK
  2146.     DW    AT
  2147.     DW    ZBRAN    ; IF
  2148.     DW    NULL1-$
  2149.     DW    ONE
  2150.     DW    BLK
  2151.     DW    PSTOR
  2152.     DW    ZERO
  2153.     DW    INN
  2154.     DW    STORE
  2155.     DW    BLK
  2156.     DW    AT
  2157.     DW    BSCR
  2158.     DW    ONE
  2159.     DW    SUBB
  2160.     DW    ANDD
  2161.     DW    ZEQU
  2162.     DW    ZBRAN    ; IF
  2163.     DW    NULL2-$
  2164.     DW    QEXEC
  2165.     DW    FROMR
  2166.     DW    DROP    ; ENDIF
  2167. NULL2    DW    BRAN    ; ELSE
  2168.     DW    NULL3-$
  2169. NULL1    DW    FROMR
  2170.     DW    DROP    ; ENDIF
  2171. NULL3    DW    SEMIS
  2172. ;
  2173.     DB    84H    ; FILL
  2174.     DB    'FIL'
  2175.     DB    'L'+80H
  2176.     DW    NULL-4
  2177. FILL    DW    $+2
  2178.     MOV    L,C
  2179.     MOV    H,B
  2180.     POP    D
  2181.     POP    B
  2182.     XTHL
  2183.     XCHG
  2184. FILL1    MOV    A,B    ; BEGIN
  2185.     ORA    C
  2186.     JZ    FILL2    ; WHILE
  2187.     MOV    A,L
  2188.     STAX    D
  2189.     INX    D
  2190.     DCX    B
  2191.     JMP    FILL1    ; REPEAT
  2192. FILL2    POP    B
  2193.     JMP    NEXT
  2194. ;
  2195.     DB    85H    ; ERASE
  2196.     DB    'ERAS'
  2197.     DB    'E'+80H
  2198.     DW    FILL-7
  2199. ERASEE    DW    DOCOL
  2200.     DW    ZERO
  2201.     DW    FILL
  2202.     DW    SEMIS
  2203. ;
  2204.     DB    86H    ; BLANKS
  2205.     DB    'BLANK'
  2206.     DB    'S'+80H
  2207.     DW    ERASEE-8
  2208. BLANK    DW    DOCOL
  2209.     DW    BL
  2210.     DW    FILL
  2211.     DW    SEMIS
  2212. ;
  2213.     DB    84H    ; HOLD
  2214.     DB    'HOL'
  2215.     DB    'D'+80H
  2216.     DW    BLANK-9
  2217. HOLD    DW    DOCOL
  2218.     DW    LIT
  2219.     DW    -1
  2220.     DW    HLD
  2221.     DW    PSTOR
  2222.     DW    HLD
  2223.     DW    AT
  2224.     DW    CSTOR
  2225.     DW    SEMIS
  2226. ;
  2227.     DB    83H    ; PAD
  2228.     DB    'PA'
  2229.     DB    'D'+80H
  2230.     DW    HOLD-7
  2231. PAD    DW    DOCOL
  2232.     DW    HERE
  2233.     DW    LIT
  2234.     DW    44H
  2235.     DW    PLUS
  2236.     DW    SEMIS
  2237. ;
  2238.     DB    84H    ; WORD
  2239.     DB    'WOR'
  2240.     DB    'D'+80H
  2241.     DW    PAD-6
  2242. WORD    DW    DOCOL
  2243.     DW    BLK
  2244.     DW    AT
  2245.     DW    ZBRAN    ; IF
  2246.     DW    WORD1-$
  2247.     DW    BLK
  2248.     DW    AT
  2249.     DW    BLOCK
  2250.     DW    BRAN    ; ELSE
  2251.     DW    WORD2-$
  2252. WORD1    DW    TIB
  2253.     DW    AT    ; ENDIF
  2254. WORD2    DW    INN
  2255.     DW    AT
  2256.     DW    PLUS
  2257.     DW    SWAP
  2258.     DW    ENCL
  2259.     DW    HERE
  2260.     DW    LIT
  2261.     DW    22H
  2262.     DW    BLANK
  2263.     DW    INN
  2264.     DW    PSTOR
  2265.     DW    OVER
  2266.     DW    SUBB
  2267.     DW    TOR
  2268.     DW    RR
  2269.     DW    HERE
  2270.     DW    CSTOR
  2271.     DW    PLUS
  2272.     DW    HERE
  2273.     DW    ONEP
  2274.     DW    FROMR
  2275.     DW    CMOVE
  2276.     DW    SEMIS
  2277. ;
  2278.     DB    88H    ; (NUMBER)
  2279.     DB    '(NUMBER'
  2280.     DB    ')'+80H
  2281.     DW    WORD-7
  2282. PNUMB    DW    DOCOL
  2283. PNUM1    DW    ONEP    ; BEGIN
  2284.     DW    DUP
  2285.     DW    TOR
  2286.     DW    CAT
  2287.     DW    BASE
  2288.     DW    AT
  2289.     DW    DIGIT
  2290.     DW    ZBRAN    ; WHILE
  2291.     DW    PNUM2-$
  2292.     DW    SWAP
  2293.     DW    BASE
  2294.     DW    AT
  2295.     DW    USTAR
  2296.     DW    DROP
  2297.     DW    ROT
  2298.     DW    BASE
  2299.     DW    AT
  2300.     DW    USTAR
  2301.     DW    DPLUS
  2302.     DW    DPL
  2303.     DW    AT
  2304.     DW    ONEP
  2305.     DW    ZBRAN    ; IF
  2306.     DW    PNUM3-$
  2307.     DW    ONE
  2308.     DW    DPL
  2309.     DW    PSTOR    ; ENDIF
  2310. PNUM3    DW    FROMR
  2311.     DW    BRAN    ; REPEAT
  2312.     DW    PNUM1-$
  2313. PNUM2    DW    FROMR
  2314.     DW    SEMIS
  2315. ;
  2316.     DB    86H    ; NUMBER
  2317.     DB    'NUMBE'
  2318.     DB    'R'+80H
  2319.     DW    PNUMB-0BH
  2320. NUMB    DW    DOCOL
  2321.     DW    ZERO
  2322.     DW    ZERO
  2323.     DW    ROT
  2324.     DW    DUP
  2325.     DW    ONEP
  2326.     DW    CAT
  2327.     DW    LIT
  2328.     DW    2DH
  2329.     DW    EQUAL
  2330.     DW    DUP
  2331.     DW    TOR
  2332.     DW    PLUS
  2333.     DW    LIT
  2334.     DW    -1
  2335. NUMB1    DW    DPL    ; BEGIN
  2336.     DW    STORE
  2337.     DW    PNUMB
  2338.     DW    DUP
  2339.     DW    CAT
  2340.     DW    BL
  2341.     DW    SUBB
  2342.     DW    ZBRAN    ; WHILE
  2343.     DW    NUMB2-$
  2344.     DW    DUP
  2345.     DW    CAT
  2346.     DW    LIT
  2347.     DW    2EH
  2348.     DW    SUBB
  2349.     DW    ZERO
  2350.     DW    QERR
  2351.     DW    ZERO
  2352.     DW    BRAN    ; REPEAT
  2353.     DW    NUMB1-$
  2354. NUMB2    DW    DROP
  2355.     DW    FROMR
  2356.     DW    ZBRAN    ; IF
  2357.     DW    NUMB3-$
  2358.     DW    DMINU    ; ENDIF
  2359. NUMB3    DW    SEMIS
  2360. ;
  2361.     DB    85H    ; -FIND    (0-3) SUCCESS
  2362.     DB    '-FIN'    ; (0-1) FAILURE
  2363.     DB    'D'+80H
  2364.     DW    NUMB-9
  2365. DFIND    DW    DOCOL
  2366.     DW    BL
  2367.     DW    WORD
  2368.     DW    HERE
  2369.     DW    CONT
  2370.     DW    AT
  2371.     DW    AT
  2372.     DW    PFIND
  2373.     DW    DUP
  2374.     DW    ZEQU
  2375.     DW    ZBRAN    ; IF
  2376.     DW    DFIN1-$
  2377.     DW    DROP
  2378.     DW    HERE
  2379.     DW    LATES
  2380.     DW    PFIND    ; ENDIF
  2381. DFIN1    DW    SEMIS
  2382. ;
  2383.     DB    87H    ; (ABORT)
  2384.     DB    '(ABORT'
  2385.     DB    ')'+80H
  2386.     DW    DFIND-8
  2387. PABOR    DW    DOCOL
  2388.     DW    ABORT
  2389.     DW    SEMIS
  2390. ;
  2391.     DB    85H    ; ERROR
  2392.     DB    'ERRO'
  2393.     DB    'R'+80H
  2394.     DW    PABOR-0AH
  2395. ERROR    DW    DOCOL
  2396.     DW    WARN
  2397.     DW    AT
  2398.     DW    ZLESS
  2399.     DW    ZBRAN    ; IF
  2400.     DW    ERRO1-$
  2401.     DW    PABOR    ; ENDIF
  2402. ERRO1    DW    HERE
  2403.     DW    COUNT
  2404.     DW    TYPE
  2405.     DW    PDOTQ
  2406.     DB    2
  2407.     DB    '? '
  2408.     DW    MESS
  2409.     DW    SPSTO
  2410. ;    CHANGE FROM FIG MODEL
  2411. ;    DW    INN,AT,BLK,AT
  2412.     DW    BLK,AT
  2413.     DW    DDUP
  2414.     DW    ZBRAN,ERRO2-$    ; IF
  2415.     DW    INN,AT
  2416.     DW    SWAP        ; ENDIF
  2417. ERRO2    DW    QUIT
  2418. ;
  2419.     DB    83H    ; ID.
  2420.     DB    'ID'
  2421.     DB    '.'+80H
  2422.     DW    ERROR-8
  2423. IDDOT    DW    DOCOL
  2424.     DW    PAD
  2425.     DW    LIT
  2426.     DW    20H
  2427.     DW    LIT
  2428.     DW    5FH
  2429.     DW    FILL
  2430.     DW    DUP
  2431.     DW    PFA
  2432.     DW    LFA
  2433.     DW    OVER
  2434.     DW    SUBB
  2435.     DW    PAD
  2436.     DW    SWAP
  2437.     DW    CMOVE
  2438.     DW    PAD
  2439.     DW    COUNT
  2440.     DW    LIT
  2441.     DW    1FH
  2442.     DW    ANDD
  2443.     DW    TYPE
  2444.     DW    SPACE
  2445.     DW    SEMIS
  2446. ;
  2447.     DB    86H    ; CREATE
  2448.     DB    'CREAT'
  2449.     DB    'E'+80H
  2450.     DW    IDDOT-6
  2451. CREAT    DW    DOCOL
  2452.     DW    DFIND
  2453.     DW    ZBRAN    ; IF
  2454.     DW    CREA1-$
  2455.     DW    DROP
  2456.     DW    NFA
  2457.     DW    IDDOT
  2458.     DW    LIT
  2459.     DW    4
  2460.     DW    MESS
  2461.     DW    SPACE    ; ENDIF
  2462. CREA1    DW    HERE
  2463.     DW    DUP
  2464.     DW    CAT
  2465.     DW    WIDTH
  2466.     DW    AT
  2467.     DW    MIN
  2468.     DW    ONEP
  2469.     DW    ALLOT
  2470.     DW    DUP
  2471.     DW    LIT
  2472.     DW    0A0H
  2473.     DW    TOGGL
  2474.     DW    HERE
  2475.     DW    ONE
  2476.     DW    SUBB
  2477.     DW    LIT
  2478.     DW    80H
  2479.     DW    TOGGL
  2480.     DW    LATES
  2481.     DW    COMMA
  2482.     DW    CURR
  2483.     DW    AT
  2484.     DW    STORE
  2485.     DW    HERE
  2486.     DW    TWOP
  2487.     DW    COMMA
  2488.     DW    SEMIS
  2489. ;
  2490.     DB    0C9H    ; [COMPILE]
  2491.     DB    '[COMPILE'
  2492.     DB    ']'+80H
  2493.     DW    CREAT-9
  2494. BCOMP    DW    DOCOL
  2495.     DW    DFIND
  2496.     DW    ZEQU
  2497.     DW    ZERO
  2498.     DW    QERR
  2499.     DW    DROP
  2500.     DW    CFA
  2501.     DW    COMMA
  2502.     DW    SEMIS
  2503. ;
  2504.     DB    0C7H    ; LITERAL
  2505.     DB    'LITERA'
  2506.     DB    'L'+80H
  2507.     DW    BCOMP-0CH
  2508. LITER    DW    DOCOL
  2509.     DW    STATE
  2510.     DW    AT
  2511.     DW    ZBRAN    ; IF
  2512.     DW    LITE1-$
  2513.     DW    COMP
  2514.     DW    LIT
  2515.     DW    COMMA    ; ENDIF
  2516. LITE1    DW    SEMIS
  2517. ;
  2518.     DB    0C8H    ; DLITERAL
  2519.     DB    'DLITERA'
  2520.     DB    'L'+80H
  2521.     DW    LITER-0AH
  2522. DLITE    DW    DOCOL
  2523.     DW    STATE
  2524.     DW    AT
  2525.     DW    ZBRAN    ; IF
  2526.     DW    DLIT1-$
  2527.     DW    SWAP
  2528.     DW    LITER
  2529.     DW    LITER    ; ENDIF
  2530. DLIT1    DW    SEMIS
  2531. ;
  2532.     DB    86H    ; ?STACK
  2533.     DB    '?STAC'
  2534.     DB    'K'+80H
  2535.     DW    DLITE-0BH
  2536. QSTAC    DW    DOCOL
  2537.     DW    SPAT
  2538.     DW    SZERO
  2539.     DW    AT
  2540.     DW    SWAP
  2541.     DW    ULESS
  2542.     DW    ONE
  2543.     DW    QERR
  2544.     DW    SPAT
  2545.     DW    HERE
  2546.     DW    LIT
  2547.     DW    80H
  2548.     DW    PLUS
  2549.     DW    ULESS
  2550.     DW    LIT
  2551.     DW    7
  2552.     DW    QERR
  2553.     DW    SEMIS
  2554. ;
  2555.     DB    89H    ; INTERPRET
  2556.     DB    'INTERPRE'
  2557.     DB    'T'+80H
  2558.     DW    QSTAC-9
  2559. INTER    DW    DOCOL
  2560. INTE1    DW    DFIND    ; BEGIN
  2561.     DW    ZBRAN    ; IF
  2562.     DW    INTE2-$
  2563.     DW    STATE
  2564.     DW    AT
  2565.     DW    LESS
  2566.     DW    ZBRAN    ; IF
  2567.     DW    INTE3-$
  2568.     DW    CFA
  2569.     DW    COMMA
  2570.     DW    BRAN    ; ELSE
  2571.     DW    INTE4-$
  2572. INTE3    DW    CFA
  2573.     DW    EXEC    ; ENDIF
  2574. INTE4    DW    QSTAC
  2575.     DW    BRAN    ; ELSE
  2576.     DW    INTE5-$
  2577. INTE2    DW    HERE
  2578.     DW    NUMB
  2579.     DW    DPL
  2580.     DW    AT
  2581.     DW    ONEP
  2582.     DW    ZBRAN    ; IF
  2583.     DW    INTE6-$
  2584.     DW    DLITE
  2585.     DW    BRAN    ; ELSE
  2586.     DW    INTE7-$
  2587. INTE6    DW    DROP
  2588.     DW    LITER    ; ENDIF
  2589. INTE7    DW    QSTAC    ; ENDIF
  2590. INTE5    DW    BRAN    ; AGAIN
  2591.     DW    INTE1-$
  2592. ;
  2593.     DB    89H    ; IMMEDIATE
  2594.     DB    'IMMEDIAT'
  2595.     DB    'E'+80H
  2596.     DW    INTER-0CH
  2597. IMMED    DW    DOCOL
  2598.     DW    LATES
  2599.     DW    LIT
  2600.     DW    40H
  2601.     DW    TOGGL
  2602.     DW    SEMIS
  2603. ;
  2604.     DB    8AH    ; VOCABULARY
  2605.     DB    'VOCABULAR'
  2606.     DB    'Y'+80H
  2607.     DW    IMMED-0CH
  2608. VOCAB    DW    DOCOL
  2609.     DW    BUILD
  2610.     DW    LIT
  2611.     DW    0A081H
  2612.     DW    COMMA
  2613.     DW    CURR
  2614.     DW    AT
  2615.     DW    CFA
  2616.     DW    COMMA
  2617.     DW    HERE
  2618.     DW    VOCL
  2619.     DW    AT
  2620.     DW    COMMA
  2621.     DW    VOCL
  2622.     DW    STORE
  2623.     DW    DOES
  2624. DOVOC    DW    TWOP
  2625.     DW    CONT
  2626.     DW    STORE
  2627.     DW    SEMIS
  2628. ;
  2629.     DB    0C5H    ; FORTH
  2630.     DB    'FORT'
  2631.     DB    'H'+80H
  2632.     DW    VOCAB-0DH
  2633. FORTH    DW    DODOE
  2634.     DW    DOVOC
  2635.     DW    0A081H
  2636.     DW    TASK-7    ; COLD START VALUE ONLY
  2637. ;              CHANGED EACH TIME A DEF IS APPENDED
  2638. ;              TO THE FORTH VOCABULARY
  2639.     DW    0    ; END OF VOCABULARY LIST
  2640. ;
  2641.     DB    8BH    ; DEFINITIONS
  2642.     DB    'DEFINITION'
  2643.     DB    'S'+80H
  2644.     DW    FORTH-8
  2645. DEFIN    DW    DOCOL
  2646.     DW    CONT
  2647.     DW    AT
  2648.     DW    CURR
  2649.     DW    STORE
  2650.     DW    SEMIS
  2651. ;
  2652.     DB    0C1H    ; (
  2653.     DB    '('+80H
  2654.     DW    DEFIN-0EH
  2655. PAREN    DW    DOCOL
  2656.     DW    LIT
  2657.     DW    29H
  2658.     DW    WORD
  2659.     DW    SEMIS
  2660. ;
  2661.     DB    84H    ; QUIT
  2662.     DB    'QUI'
  2663.     DB    'T'+80H
  2664.     DW    PAREN-4
  2665. QUIT    DW    DOCOL
  2666.     DW    ZERO
  2667.     DW    BLK
  2668.     DW    STORE
  2669.     DW    LBRAC
  2670. QUIT1    DW    RPSTO    ; BEGIN
  2671.     DW    CR
  2672.     DW    QUERY
  2673.     DW    INTER
  2674.     DW    STATE
  2675.     DW    AT
  2676.     DW    ZEQU
  2677.     DW    ZBRAN    ; IF
  2678.     DW    QUIT2-$
  2679.     DW    PDOTQ
  2680.     DB    2
  2681.     DB    'OK'    ; ENDIF
  2682. QUIT2    DW    BRAN    ; AGAIN
  2683.     DW    QUIT1-$
  2684. ;
  2685.     DB    85H    ; ABORT
  2686.     DB    'ABOR'
  2687.     DB    'T'+80H
  2688.     DW    QUIT-7
  2689. ABORT    DW    DOCOL
  2690.     DW    SPSTO
  2691.     DW    DEC
  2692.     DW    QSTAC
  2693.     DW    CR
  2694.     DW    DOTCPU
  2695.     DW    PDOTQ
  2696.     DB    0DH
  2697.     DB    'fig-FORTH '
  2698.     DB    FIGREL+30H,ADOT,FIGREV+30H
  2699.     DW    FORTH
  2700.     DW    DEFIN
  2701.     DW    QUIT
  2702. ;
  2703. WRM    LXI    B,WRM1
  2704.     JMP    NEXT
  2705. WRM1    DW    WARM
  2706. ;
  2707.     DB    84H    ; WARM
  2708.     DB    'WAR'
  2709.     DB    'M'+80H
  2710.     DW    ABORT-8
  2711. WARM    DW    DOCOL
  2712.     DW    MTBUF
  2713.     DW    ABORT
  2714. ;
  2715. CLD    LXI    B,CLD1
  2716.     LHLD    ORIG+12H
  2717.     SPHL
  2718.     JMP    NEXT
  2719. CLD1    DW    COLD
  2720. ;
  2721.     DB    84H    ; COLD
  2722.     DB    'COL'
  2723.     DB    'D'+80H
  2724.     DW    WARM-7
  2725. COLD    DW    DOCOL
  2726.     DW    MTBUF
  2727.     DW    ZERO,DENSTY
  2728.     DW    STORE
  2729.     DW    LIT,BUF1
  2730.     DW    USE,STORE
  2731.     DW    LIT,BUF1
  2732.     DW    PREV,STORE
  2733.     DW    DRZER
  2734.     DW    LIT,0
  2735.     DW    LIT,EPRINT
  2736.     DW    STORE
  2737. ;
  2738.     DW    LIT
  2739.     DW    ORIG+12H
  2740.     DW    LIT
  2741.     DW    UP
  2742.     DW    AT
  2743.     DW    LIT
  2744.     DW    6
  2745.     DW    PLUS
  2746.     DW    LIT
  2747.     DW    10H
  2748.     DW    CMOVE
  2749.     DW    LIT
  2750.     DW    ORIG+0CH
  2751.     DW    AT
  2752.     DW    LIT
  2753.     DW    FORTH+6
  2754.     DW    STORE
  2755.     DW    ABORT
  2756. ;
  2757.     DB    84H    ; S->D
  2758.     DB    'S->'
  2759.     DB    'D'+80H
  2760.     DW    COLD-7
  2761. STOD    DW    $+2
  2762.     POP    D
  2763.     LXI    H,0
  2764.     MOV    A,D
  2765.     ANI    80H
  2766.     JZ    STOD1
  2767.     DCX    H
  2768. STOD1    JMP    DPUSH
  2769. ;
  2770.     DB    82H    ; +-
  2771.     DB    '+'
  2772.     DB    '-'+80H
  2773.     DW    STOD-7
  2774. PM    DW    DOCOL
  2775.     DW    ZLESS
  2776.     DW    ZBRAN    ; IF
  2777.     DW    PM1-$
  2778.     DW    MINUS    ; ENDIF
  2779. PM1    DW    SEMIS
  2780. ;
  2781.     DB    83H    ; D+-
  2782.     DB    'D+'
  2783.     DB    '-'+80H
  2784.     DW    PM-5
  2785. DPM    DW    DOCOL
  2786.     DW    ZLESS
  2787.     DW    ZBRAN    ; IF
  2788.     DW    DPM1-$
  2789.     DW    DMINU    ; ENDIF
  2790. DPM1    DW    SEMIS
  2791. ;
  2792.     DB    83H    ; ABS
  2793.     DB    'AB'
  2794.     DB    'S'+80H
  2795.     DW    DPM-6
  2796. ABS    DW    DOCOL
  2797.     DW    DUP
  2798.     DW    PM
  2799.     DW    SEMIS
  2800. ;
  2801.     DB    84H    ; DABS
  2802.     DB    'DAB'
  2803.     DB    'S'+80H
  2804.     DW    ABS-6
  2805. DABS    DW    DOCOL
  2806.     DW    DUP
  2807.     DW    DPM
  2808.     DW    SEMIS
  2809. ;
  2810.     DB    83H    ; MIN
  2811.     DB    'MI'
  2812.     DB    'N'+80H
  2813.     DW    DABS-7
  2814. MIN    DW    DOCOL,TDUP
  2815.     DW    GREAT
  2816.     DW    ZBRAN    ; IF
  2817.     DW    MIN1-$
  2818.     DW    SWAP    ; ENDIF
  2819. MIN1    DW    DROP
  2820.     DW    SEMIS
  2821. ;
  2822.     DB    83H    ; MAX
  2823.     DB    'MA'
  2824.     DB    'X'+80H
  2825.     DW    MIN-6
  2826. MAX    DW    DOCOL,TDUP
  2827.     DW    LESS
  2828.     DW    ZBRAN    ; IF
  2829.     DW    MAX1-$
  2830.     DW    SWAP    ; ENDIF
  2831. MAX1    DW    DROP
  2832.     DW    SEMIS
  2833. ;
  2834.     DB    82H    ; M*
  2835.     DB    'M'
  2836.     DB    '*'+80H
  2837.     DW    MAX-6
  2838. MSTAR    DW    DOCOL,TDUP
  2839.     DW    XORR
  2840.     DW    TOR
  2841.     DW    ABS
  2842.     DW    SWAP
  2843.     DW    ABS
  2844.     DW    USTAR
  2845.     DW    FROMR
  2846.     DW    DPM
  2847.     DW    SEMIS
  2848. ;
  2849.     DB    82H    ; M/
  2850.     DB    'M'
  2851.     DB    '/'+80H
  2852.     DW    MSTAR-5
  2853. MSLAS    DW    DOCOL
  2854.     DW    OVER
  2855.     DW    TOR
  2856.     DW    TOR
  2857.     DW    DABS
  2858.     DW    RR
  2859.     DW    ABS
  2860.     DW    USLAS
  2861.     DW    FROMR
  2862.     DW    RR
  2863.     DW    XORR
  2864.     DW    PM
  2865.     DW    SWAP
  2866.     DW    FROMR
  2867.     DW    PM
  2868.     DW    SWAP
  2869.     DW    SEMIS
  2870. ;
  2871.     DB    81H    ; *
  2872.     DB    '*'+80H
  2873.     DW    MSLAS-5
  2874. STAR    DW    DOCOL
  2875.     DW    MSTAR
  2876.     DW    DROP
  2877.     DW    SEMIS
  2878. ;
  2879.     DB    84H    ; /MOD
  2880.     DB    '/MO'
  2881.     DB    'D'+80H
  2882.     DW    STAR-4
  2883. SLMOD    DW    DOCOL
  2884.     DW    TOR
  2885.     DW    STOD
  2886.     DW    FROMR
  2887.     DW    MSLAS
  2888.     DW    SEMIS
  2889. ;
  2890.     DB    81H    ; /
  2891.     DB    '/'+80H
  2892.     DW    SLMOD-7
  2893. SLASH    DW    DOCOL
  2894.     DW    SLMOD
  2895.     DW    SWAP
  2896.     DW    DROP
  2897.     DW    SEMIS
  2898. ;
  2899.     DB    83H    ; MOD
  2900.     DB    'MO'
  2901.     DB    'D'+80H
  2902.     DW    SLASH-4
  2903. MODD    DW    DOCOL
  2904.     DW    SLMOD
  2905.     DW    DROP
  2906.     DW    SEMIS
  2907. ;
  2908.     DB    85H    ; */MOD
  2909.     DB    '*/MO'
  2910.     DB    'D'+80H
  2911.     DW    MODD-6
  2912. SSMOD    DW    DOCOL
  2913.     DW    TOR
  2914.     DW    MSTAR
  2915.     DW    FROMR
  2916.     DW    MSLAS
  2917.     DW    SEMIS
  2918. ;
  2919.     DB    82H    ; */
  2920.     DB    '*'
  2921.     DB    '/'+80H
  2922.     DW    SSMOD-8
  2923. SSLA    DW    DOCOL
  2924.     DW    SSMOD
  2925.     DW    SWAP
  2926.     DW    DROP
  2927.     DW    SEMIS
  2928. ;
  2929.     DB    85H    ; M/MOD
  2930.     DB    'M/MO'
  2931.     DB    'D'+80H
  2932.     DW    SSLA-5
  2933. MSMOD    DW    DOCOL
  2934.     DW    TOR
  2935.     DW    ZERO
  2936.     DW    RR
  2937.     DW    USLAS
  2938.     DW    FROMR
  2939.     DW    SWAP
  2940.     DW    TOR
  2941.     DW    USLAS
  2942.     DW    FROMR
  2943.     DW    SEMIS
  2944. ;
  2945. ;    BLOCK MOVED DOWN 2 PAGES
  2946. ;
  2947. ;
  2948.     DB    86H    ; (LINE)
  2949.     DB    '(LINE'
  2950.     DB    ')'+80H
  2951.     DW    MSMOD-8
  2952. PLINE    DW    DOCOL
  2953.     DW    TOR
  2954.     DW    LIT
  2955.     DW    40H
  2956.     DW    BBUF
  2957.     DW    SSMOD
  2958.     DW    FROMR
  2959.     DW    BSCR
  2960.     DW    STAR
  2961.     DW    PLUS
  2962.     DW    BLOCK
  2963.     DW    PLUS
  2964.     DW    LIT
  2965.     DW    40H
  2966.     DW    SEMIS
  2967. ;
  2968.     DB    85H    ; .LINE
  2969.     DB    '.LIN'
  2970.     DB    'E'+80H
  2971.     DW    PLINE-9
  2972. DLINE    DW    DOCOL
  2973.     DW    PLINE
  2974.     DW    DTRAI
  2975.     DW    TYPE
  2976.     DW    SEMIS
  2977. ;
  2978.     DB    87H    ; MESSAGE
  2979.     DB    'MESSAG'
  2980.     DB    'E'+80H
  2981.     DW    DLINE-8
  2982. MESS    DW    DOCOL
  2983.     DW    WARN
  2984.     DW    AT
  2985.     DW    ZBRAN    ; IF
  2986.     DW    MESS1-$
  2987.     DW    DDUP
  2988.     DW    ZBRAN    ; IF
  2989.     DW    MESS2-$
  2990.     DW    LIT
  2991.     DW    4
  2992.     DW    OFSET
  2993.     DW    AT
  2994.     DW    BSCR
  2995.     DW    SLASH
  2996.     DW    SUBB
  2997.     DW    DLINE
  2998.     DW    SPACE    ; ENDIF
  2999. MESS2    DW    BRAN    ; ELSE
  3000.     DW    MESS3-$
  3001. MESS1    DW    PDOTQ
  3002.     DB    6
  3003.     DB    'MSG # '
  3004.     DW    DOT    ; ENDIF
  3005. MESS3    DW    SEMIS
  3006.     PAGE
  3007. ;------------------------------------------
  3008. ;
  3009. ;    8080 PORT FETCH AND STORE
  3010. ;    ( SELF MODIFYING CODE, NOT REENTRANT )
  3011. ;
  3012.     DB    82H    ; P@ "PORT @"
  3013.     DB    'P'
  3014.     DB    '@'+80H
  3015.     DW    MESS-0AH
  3016. PTAT:    DW    $+2
  3017.     POP    D    ;E <- PORT#
  3018.     LXI    H,$+5
  3019.     MOV    M,E
  3020.     IN    0    ;( PORT# MODIFIED )
  3021.     MOV    L,A    ;L <- (PORT#)
  3022.     MVI    H,0
  3023.     JMP    HPUSH
  3024. ;
  3025.     DB    82H    ; "PORT STORE"
  3026.     DB    'P'
  3027.     DB    '!'+80H
  3028.     DW    PTAT-5
  3029. PTSTO:    DW    $+2
  3030.     POP    D    ;E <- PORT#
  3031.     LXI    H,$+7
  3032.     MOV    M,E
  3033.     POP    H    ;H <- CDATA
  3034.     MOV    A,L
  3035.     OUT    0    ;( PORT# MODIFIED )
  3036.     JMP    NEXT
  3037.     PAGE
  3038. ;--------------------------------------------------
  3039. ;    CP/M DISK INTERFACE
  3040. ;
  3041. ;    CP/M BIOS CALLS USED
  3042. ;    ( NOTE EQU'S ARE 3 LOWER THAN DOCUMENTED OFFSETS
  3043. ;      BECAUSE BASE ADDR IS BIOS+3 )
  3044. ;
  3045. RITSEC    EQU    39
  3046. RDSEC    EQU    36
  3047. SETDMA    EQU    33
  3048. SETSEC    EQU    30
  3049. SETTRK    EQU    27
  3050. SETDSK    EQU    24
  3051. ;
  3052. ;    DOUBLE DENSITY 8" FLOPPY CAPACITIES
  3053. SPT2    EQU    52    ; SECTORS PER TRACK
  3054. TRKS2    EQU    77    ; NUMBER OF TRACKS
  3055. SPDRV2    EQU    SPT2*TRKS2    ; SECTORS/DRIVE
  3056. ;    SINGLE DENSITY 8" FLOPPY CAPACITIES
  3057. SPT1    EQU    26    ; SECTORS/TRACK
  3058. TRKS1    EQU    77    ; # TRACKS
  3059. SPDRV1    EQU    SPT1*TRKS1    ; SECTORS/DRIVE
  3060. ;
  3061. BPS    EQU    128    ; BYTES PER SECTOR
  3062. MXDRV    EQU    2    ; MAX # DRIVES
  3063. ;
  3064. ;    FORTH VARIABLES AND CONSTANTS USED IN DISK INTERFACE
  3065. ;
  3066.     DB    85H    ; DRIVE ( CURRENT DRIVE # )
  3067.     DB    'DRIV'
  3068.     DB    'E'+80H
  3069.     DW    PTSTO-5
  3070. DRIVE    DW    DOVAR,0
  3071. ;
  3072.     DB    83H    ; SEC    ( SECTOR # )
  3073.     DB    'SE'
  3074.     DB    'C'+80H
  3075.     DW    DRIVE-8
  3076. SEC:    DW    DOVAR
  3077.     DW    0
  3078. ;
  3079.     DB    85H    ; TRACK    ( TRACK # )
  3080.     DB    'TRAC'
  3081.     DB    'K'+80H
  3082.     DW    SEC-6
  3083. TRACK:    DW    DOVAR,0
  3084. ;
  3085.     DB    83H    ; USE    ( ADDR OF NEXT BUFFER TO USE )
  3086.     DB    'US'
  3087.     DB    'E'+80H
  3088.     DW    TRACK-8
  3089. USE:    DW    DOVAR
  3090.     DW    BUF1
  3091. ;
  3092.     DB    84H    ; PREV
  3093. ;            ( ADDR OF PREVIOUSLY USED BUFFER )
  3094.     DB    'PRE'
  3095.     DB    'V'+80H
  3096.     DW    USE-6
  3097. PREV    DW    DOVAR
  3098.     DW    BUF1
  3099. ;
  3100.     DB    87H    ; SEC/BLK ( # SECTORS/BLOCK )
  3101.     DB    'SEC/BL'
  3102.     DB    'K'+80H
  3103.     DW    PREV-7
  3104. SPBLK    DW    DOCON
  3105.     DW    KBBUF/BPS
  3106. ;
  3107.     DB    85H    ; #BUFF  ( NUMBER OF BUFFERS )
  3108.     DB    '#BUF'
  3109.     DB    'F'+80H
  3110.     DW    SPBLK-10
  3111. NOBUF    DW    DOCON,NBUF
  3112. ;
  3113.     DB    87H    ; DENSITY ( 0 = SINGLE , 1 = DOUBLE )
  3114.     DB    'DENSIT'
  3115.     DB    'Y'+80H
  3116.     DW    NOBUF-8
  3117. DENSTY    DW    DOVAR
  3118.     DW    0
  3119. ;
  3120.     DB    8AH    ; DISK-ERROR  ( DISK ERROR STATUS )
  3121.     DB    'DISK-ERRO'
  3122.     DB    'R'+80H
  3123.     DW    DENSTY-10
  3124. DSKERR    DW    DOVAR,0
  3125. ;
  3126. ;    DISK INTERFACE HIGH-LEVEL ROUTINES
  3127. ;
  3128.     DB    84H    ; +BUF    ( ADVANCE BUFFER )
  3129.     DB    '+BU'
  3130.     DB    'F'+80H
  3131.     DW    DSKERR-13
  3132. PBUF    DW    DOCOL
  3133.     DW    LIT,CO
  3134.     DW    PLUS,DUP
  3135.     DW    LIMIT,EQUAL
  3136.     DW    ZBRAN,PBUF1-$
  3137.     DW    DROP,FIRST
  3138. PBUF1:    DW    DUP,PREV
  3139.     DW    AT,SUBB
  3140.     DW    SEMIS
  3141. ;
  3142.     DB    86H    ; UPDATE
  3143.     DB    'UPDAT'
  3144.     DB    'E'+80H
  3145.     DW    PBUF-7
  3146. UPDAT    DW    DOCOL,PREV
  3147.     DW    AT,AT
  3148.     DW    LIT,8000H
  3149.     DW    ORR
  3150.     DW    PREV,AT
  3151.     DW    STORE,SEMIS
  3152. ;
  3153.     DB    8DH    ; EMPTY-BUFFERS
  3154.     DB    'EMPTY-BUFFER'
  3155.     DB    'S'+80H
  3156.     DW    UPDAT-9
  3157. MTBUF    DW    DOCOL,FIRST
  3158.     DW    LIMIT,OVER
  3159.     DW    SUBB,ERASEE
  3160.     DW    SEMIS
  3161. ;
  3162.     DB    83H    ; DR0
  3163.     DB    'DR'
  3164.     DB    '0'+80H
  3165.     DW    MTBUF-16
  3166. DRZER    DW    DOCOL,ZERO
  3167.     DW    OFSET,STORE
  3168.     DW    SEMIS
  3169. ;
  3170.     DB    83H    ; DR1
  3171.     DB    'DR'
  3172.     DB    '1'+80H
  3173.     DW    ERZER-6
  3174. DRONE    DW    DOCOL
  3175.     DW    DENSTY,AT
  3176.     DW    ZBRAN,DRON1-$
  3177.     DW    LIT,SPDRV2
  3178.     DW    BRAN,DRON2-$
  3179. DRON1    DW    LIT,SPDRV1
  3180. DRON2    DW    OFSET,STORE
  3181.     DW    SEMIS
  3182. ;
  3183.     DB    86H    ; BUFFER
  3184.     DB    'BUFFE'
  3185.     DB    'R'+80H
  3186.     DW    DRONE-6
  3187. BUFFE:    DW    DOCOL,USE
  3188.     DW    AT,DUP
  3189.     DW    TOR
  3190. BUFF1    DW    PBUF        ; WON'T WORK IF SINGLE BUFFER
  3191.     DW    ZBRAN,BUFF1-$
  3192.     DW    USE,STORE
  3193.     DW    RR,AT
  3194.     DW    ZLESS
  3195.     DW    ZBRAN,BUFF2-$
  3196.     DW    RR,TWOP
  3197.     DW    RR,AT
  3198.     DW    LIT,7FFFH
  3199.     DW    ANDD,ZERO
  3200.     DW    RSLW
  3201. BUFF2    DW    RR,STORE
  3202.     DW    RR,PREV
  3203.     DW    STORE,FROMR
  3204.     DW    TWOP,SEMIS
  3205. ;
  3206.     DB    85H    ; BLOCK
  3207.     DB    'BLOC'
  3208.     DB    'K'+80H
  3209.     DW    BUFFE-9
  3210. BLOCK    DW    DOCOL,OFSET
  3211.     DW    AT,PLUS
  3212.     DW    TOR,PREV
  3213.     DW    AT,DUP
  3214.     DW    AT,RR
  3215.     DW    SUBB
  3216.     DW    DUP,PLUS
  3217.     DW    ZBRAN,BLOC1-$
  3218. BLOC2    DW    PBUF,ZEQU
  3219.     DW    ZBRAN,BLOC3-$
  3220.     DW    DROP,RR
  3221.     DW    BUFFE,DUP
  3222.     DW    RR,ONE
  3223.     DW    RSLW
  3224.     DW    TWO,SUBB
  3225. BLOC3    DW    DUP,AT
  3226.     DW    RR,SUBB
  3227.     DW    DUP,PLUS
  3228.     DW    ZEQU
  3229.     DW    ZBRAN,BLOC2-$
  3230.     DW    DUP,PREV
  3231.     DW    STORE
  3232. BLOC1    DW    FROMR,DROP
  3233.     DW    TWOP,SEMIS
  3234. ;
  3235. ;
  3236. ;    CP/M INTERFACE ROUTINES
  3237. ;
  3238. ;        SERVICE REQUEST
  3239. ;
  3240. IOS    LHLD    1    ; (HL) <- BIOS TABLE ADDR+3
  3241.     DAD    D    ; + SERVICE REQUEST OFFSET
  3242.     PCHL        ; EXECUTE REQUEST
  3243. ;    RET FUNCTION PROVIDED BY CP/M
  3244. ;
  3245.     DB    86H    ; SET-IO
  3246. ;            ( ASSIGN SECTOR, TRACK FOR BDOS )
  3247.     DB    'SET-I'
  3248.     DB    'O'+80H
  3249.     DW    BLOCK-8
  3250. SETIO:    DW    $+2
  3251.     PUSH    B    ; SAVE (IP)
  3252.     LHLD    USE+2    ; (BC) <- ADDR BUFFER
  3253.     MOV    B,H
  3254.     MOV    C,L
  3255.     LXI    D,SETDMA ; SEND BUFFER ADDR TO CP/M
  3256.     CALL    IOS
  3257. ;
  3258.     LHLD    SEC+2    ; (BC) <- (SEC) = SECTOR #
  3259.     MOV    C,L
  3260.     LXI    D,SETSEC    ; SEND SECTOR # TO CP/M
  3261.     CALL    IOS
  3262. ;
  3263.     LHLD    TRACK+2    ; (BC) <- (TRACK) = TRACK #
  3264.     MOV    B,H
  3265.     MOV    C,L
  3266.     LXI    D,SETTRK
  3267.     CALL    IOS
  3268. ;
  3269.     POP    B    ; RESTORE (IP)
  3270.     JMP    NEXT
  3271. ;
  3272.     DB    89H    ; SET-DRIVE
  3273.     DB    'SET-DRIV'
  3274.     DB    'E'+80H
  3275.     DW    SETIO-9
  3276. SETDRV:    DW    $+2
  3277.     PUSH    B    ; SAVE (IP)
  3278.     LDA    DRIVE+2    ; (C) <- (DRIVE) = DRIVE #
  3279.     MOV    C,A
  3280.     LXI    D,SETDSK    ; SEND DRIVE # TO CP/M
  3281.     CALL    IOS
  3282.     POP    B    ; RESTORE (IP)
  3283.     JMP    NEXT
  3284. ;
  3285. ;    T&SCALC        ( CALCULATES DRIVE#, TRACK#, & SECTOR# )
  3286. ;    STACK INPUT: SECTOR-DISPLACEMENT = BLK# * SEC/BLK
  3287. ;    OUTPUT: VARIABLES DRIVE, TRACK, & SEC
  3288. ;
  3289.     DB    87H    ; T&SCALC
  3290.     DB    'T&SCAL'
  3291.     DB    'C'+80H
  3292.     DW    SETDRV-12
  3293. TSCALC:    DW    DOCOL,DENSTY
  3294.     DW    AT
  3295.     DW    ZBRAN,TSCALS-$
  3296.     DW    LIT,SPDRV2
  3297.     DW    SLMOD
  3298.     DW    LIT,MXDRV
  3299.     DW    MIN
  3300.     DW    DUP,DRIVE
  3301.     DW    AT,EQUAL
  3302.     DW    ZBRAN,TSCAL1-$
  3303.     DW    DROP
  3304.     DW    BRAN,TSCAL2-$
  3305. TSCAL1    DW    DRIVE,STORE
  3306.     DW    SETDRV
  3307. TSCAL2    DW    LIT,SPT2
  3308.     DW    SLMOD,TRACK
  3309.     DW    STORE,ONEP
  3310.     DW    SEC,STORE
  3311.     DW    SEMIS
  3312. ;    SINGLE DENSITY
  3313. TSCALS    DW    LIT,SPDRV1
  3314.     DW    SLMOD
  3315.     DW    LIT,MXDRV
  3316. DW    MIN
  3317.     DW    DUP,DRIVE
  3318.     DW    AT,EQUAL
  3319.     DW    ZBRAN,TSCAL3-$
  3320.     DW    DROP
  3321.     DW    BRAN,TSCAL4-$
  3322. TSCAL3    DW    DRIVE,STORE
  3323.     DW    SETDRV
  3324. TSCAL4    DW    LIT,SPT1
  3325.     DW    SLMOD,TRACK
  3326.     DW    STORE,ONEP
  3327.     DW    SEC,STORE
  3328.     DW    SEMIS
  3329. ;
  3330. ;    SEC-READ
  3331. ;    ( READ A SECTOR SETUP BY 'SET-DRIVE' & 'SETIO' )
  3332. ;
  3333.     DB    88H    ; SEC-READ
  3334.     DB    'SEC-REA'
  3335.     DB    'D'+80H
  3336.     DW    TSCALC-10
  3337. SECRD    DW    $+2
  3338.     PUSH    B    ; SAVE (IP)
  3339.     LXI    D,RDSEC    ; ASK CP/M TO READ SECTOR
  3340.     CALL    IOS
  3341.     STA    DSKERR+2    ; (DSKERR) <- ERROR STATUS
  3342.     POP    B    ; RESTORE (IP)
  3343.     JMP    NEXT
  3344. ;
  3345. ;    SEC-WRITE
  3346. ;    ( WRITE A SECTOR SETUP BY 'SET-DRIVE' & 'SETIO' )
  3347. ;
  3348.     DB    89H    ; SEC-WRITE
  3349.     DB    'SEC-WRIT'
  3350.     DB    'E'+80H
  3351.     DW    SECRD-11
  3352. SECWT    DW    $+2
  3353.     PUSH    B    ; SAVE (IP)
  3354.     LXI    D,RITSEC    ; ASK CP/M TO WRITE SECTOR
  3355.     CALL    IOS
  3356.     STA    DSKERR+2    ; (DSKERR) <- ERROR STATUS
  3357.     POP    B    ; RESTORE (IP)
  3358.     JMP    NEXT
  3359. ;
  3360.     DB    83H    ; R/W    ( FORTH DISK PRIMATIVE )
  3361.     DB    'R/'
  3362.     DB    'W'+80H
  3363.     DW    SECWT-12
  3364. RSLW    DW    DOCOL
  3365.     DW    USE,AT
  3366.     DW    TOR
  3367.     DW    SWAP,SPBLK
  3368.     DW    STAR,ROT
  3369.     DW    USE,STORE
  3370.     DW    SPBLK,ZERO
  3371.     DW    XDO
  3372. RSLW1    DW    OVER,OVER
  3373.     DW    TSCALC,SETIO
  3374.     DW    ZBRAN,RSLW2-$
  3375.     DW    SECRD
  3376.     DW    BRAN,RSLW3-$
  3377. RSLW2    DW    SECWT
  3378. RSLW3    DW    ONEP
  3379.     DW    LIT,80H
  3380.     DW    USE,PSTOR
  3381.     DW    XLOOP,RSLW1-$
  3382.     DW    DROP,DROP
  3383.     DW    FROMR,USE
  3384.     DW    STORE,SEMIS
  3385. ;
  3386. ;--------------------------------------------------------
  3387. ;
  3388. ;    ALTERNATIVE R/W FOR NO DISK INTERFACE
  3389. ;
  3390. ;RSLW    DW    DOCOL,DROP,DROP,DROP,SEMIS
  3391. ;
  3392. ;--------------------------------------------------------
  3393. ;
  3394.     DB    85H    ; FLUSH
  3395.     DB    'FLUS'
  3396.     DB    'H'+80H
  3397.     DW    RSLW-6
  3398. FLUSH    DW    DOCOL
  3399.     DW    NOBUF,ONEP
  3400.     DW    ZERO,XDO
  3401. FLUS1    DW    ZERO,BUFFE
  3402.     DW    DROP
  3403.     DW    XLOOP,FLUS1-$
  3404.     DW    SEMIS
  3405. ;
  3406.     DB    84H    ; LOAD
  3407.     DB    'LOA'
  3408.     DB    'D'+80H
  3409.     DW    FLUSH-8
  3410. LOAD    DW    DOCOL,BLK
  3411.     DW    AT,TOR
  3412.     DW    INN,AT
  3413.     DW    TOR,ZERO
  3414.     DW    INN,STORE
  3415.     DW    BSCR,STAR
  3416.     DW    BLK,STORE    ; BLK <- SCR * B/SCR
  3417.     DW    INTER        ; INTERPRET FROM OTHER SCREEN
  3418.     DW    FROMR,INN
  3419.     DW    STORE
  3420.     DW    FROMR,BLK
  3421.     DW    STORE
  3422.     DW    SEMIS
  3423. ;
  3424.     DB    0C3H    ; -->
  3425.     DB    '--'
  3426.     DB    '>'+80H
  3427.     DW    LOAD-7
  3428. ARROW    DW    DOCOL
  3429.     DW    QLOAD
  3430.     DW    ZERO
  3431.     DW    INN
  3432.     DW    STORE
  3433.     DW    BSCR
  3434.     DW    BLK
  3435.     DW    AT
  3436.     DW    OVER
  3437.     DW    MODD
  3438.     DW    SUBB
  3439.     DW    BLK
  3440.     DW    PSTOR
  3441.     DW    SEMIS
  3442. ;
  3443.     PAGE
  3444. ;-------------------------------------------------
  3445. ;
  3446. ;    CP/M CONSOLE & PRINTER INTERFACE
  3447. ;
  3448. ;    CP/M BIOS CALLS USED
  3449. ;    ( NOTE: BELOW OFFSETS ARE 3 LOWER THAN CP/M
  3450. ;      DOCUMENTATION SINCE BASE ADDR = BIOS+3 )
  3451. ;
  3452. KCSTAT    EQU    3    ; CONSOLE STATUS
  3453. KCIN    EQU    6    ; CONSOLE INPUT
  3454. KCOUT    EQU    9    ; CONSOLE OUTPUT
  3455. KPOUT    EQU    0CH    ; PRINTER OUTPUT
  3456. ;
  3457. EPRINT    DW    0    ; ENABLE PRINTER VARIABLE
  3458. ;            ; 0 = DISABLED, 1 = ENABLED
  3459. ;
  3460. ;    BELOW BIOS CALLS USE 'IOS' IN DISK INTERFACE
  3461. ;
  3462. CSTAT    PUSH    B    ; CONSOLE STATUS
  3463.     LXI    D,KCSTAT  ; CHECK IF ANY CHR HAS BEEN TYPED
  3464.     CALL    IOS
  3465.     POP    B    ; IF CHR TYPED THEN (A) <- 0FFH
  3466.     RET        ; ELSE (A) <- 0
  3467. ;            ; CHR IGNORED
  3468. ;
  3469. CIN    PUSH    B    ; CONSOLE INPUT
  3470.     LXI    D,KCIN    ; WAIT FOR CHR TO BE TYPED
  3471.     CALL    IOS    ; (A) <- CHR, (MSB) <- 0
  3472.     POP    B
  3473.     RET
  3474. ;
  3475. COUT    PUSH    H    ; CONSOLE OUTPUT
  3476.     LXI    D,KCOUT    ; WAIT UNTIL READY
  3477.     CALL    IOS    ; THEN OUTPUT (C)
  3478.     POP    H
  3479.     RET
  3480. ;
  3481. POUT    LXI    D,KPOUT    ; PRINTER OUTPUT
  3482.     CALL    IOS    ; WAIT UNTIL READY
  3483.     RET        ; THEN OUTPUT (C)
  3484. ;
  3485. CPOUT    CALL    COUT    ; OUTPUT (C) TO CONSOLE
  3486.     XCHG
  3487.     LXI    H,EPRINT
  3488.     MOV    A,M    ; IF (EPRINT) <> 0
  3489.     ORA    A
  3490.     JZ    CPOU1
  3491.     MOV    C,E    ; THEN OUTPUT (C) TO PRINTER
  3492.     CALL    POUT
  3493. CPOU1    RET
  3494. ;
  3495. ;    FORTH TO CP/M SERIAL IO INTERFACE
  3496. ;
  3497. PQTER    CALL    CSTAT    ; IF CHR TYPED
  3498.     LXI    H,0
  3499.     ORA    A
  3500.     JZ    PQTE1
  3501.     INR    L    ; THEN (S1) <- TRUE
  3502. PQTE1    JMP    HPUSH    ; ELSE (S1) <- FALSE
  3503. ;
  3504. PKEY    CALL    CIN    ; READ CHR FROM CONSOLE
  3505.     CPI    DLE    ; IF CHR = (^P)
  3506.     MOV    E,A
  3507.     JNZ    PKEY1
  3508.     LXI    H,EPRINT  ; THEN TOGGLE (EPRINT)LSB
  3509.     MVI    E,ABL    ; CHR <- BLANK
  3510.     MOV    A,M
  3511.     XRI    1
  3512.     MOV    M,A
  3513. PKEY1    MOV    L,E
  3514.     MVI    H,0
  3515.     JMP    HPUSH    ; (S1)LB <- CHR
  3516. ;
  3517. PEMIT    DW    $+2    ; (EMIT)    ORPHAN
  3518.     POP    H    ; (L) <- (S1)LB = CHR
  3519.     PUSH    B    ; SAVE (IP)
  3520.     MOV    C,L
  3521.     CALL    CPOUT    ; OUTPUT CHR TO CONSOLE
  3522. ;            ; & MAYBE PRINTER
  3523.     POP    B    ; RESTORE (IP)
  3524.     JMP    NEXT
  3525. ;
  3526. PCR    PUSH    B    ; SAVE (IP)
  3527.     MVI    C,ACR    ; OUTPUT (CR) TO CONSOLE
  3528.     MOV    L,C
  3529.     CALL    CPOUT    ; & MAYBE TO PRINTER
  3530.     MVI    C,LF    ; OUTPUT (LF) TO CONSOLE
  3531.     MOV    L,C
  3532.     CALL    CPOUT    ; & MAYBE TO PRINTER
  3533.     POP    B    ; RESTORE (IP)
  3534.     JMP    NEXT
  3535. ;
  3536. ;----------------------------------------------------
  3537.     PAGE
  3538. ;
  3539.     DB    0C1H    ; '    ( TICK )
  3540.     DB    0A7H
  3541.     DW    ARROW-6
  3542. TICK    DW    DOCOL
  3543.     DW    DFIND
  3544.     DW    ZEQU
  3545.     DW    ZERO
  3546.     DW    QERR
  3547.     DW    DROP
  3548.     DW    LITER
  3549.     DW    SEMIS
  3550. ;
  3551.     DB    86H    ; FORGET
  3552.     DB    'FORGE'
  3553.     DB    'T'+80H
  3554.     DW    TICK-4
  3555. FORG    DW    DOCOL
  3556.     DW    CURR
  3557.     DW    AT
  3558.     DW    CONT
  3559.     DW    AT
  3560.     DW    SUBB
  3561.     DW    LIT
  3562.     DW    18H
  3563.     DW    QERR
  3564.     DW    TICK
  3565.     DW    DUP
  3566.     DW    FENCE
  3567.     DW    AT
  3568.     DW    LESS
  3569.     DW    LIT
  3570.     DW    15H
  3571.     DW    QERR
  3572.     DW    DUP
  3573.     DW    NFA
  3574.     DW    DP
  3575.     DW    STORE
  3576.     DW    LFA
  3577.     DW    AT
  3578.     DW    CONT
  3579.     DW    AT
  3580.     DW    STORE
  3581.     DW    SEMIS
  3582. ;
  3583.     DB    84H    ; BACK
  3584.     DB    'BAC'
  3585.     DB    'K'+80H
  3586.     DW    FORG-9
  3587. BACK    DW    DOCOL
  3588.     DW    HERE
  3589.     DW    SUBB
  3590.     DW    COMMA
  3591.     DW    SEMIS
  3592. ;
  3593.     DB    0C5H    ; BEGIN
  3594.     DB    'BEGI'
  3595.     DB    'N'+80H
  3596.     DW    BACK-7
  3597. BEGIN    DW    DOCOL
  3598.     DW    QCOMP
  3599.     DW    HERE
  3600.     DW    ONE
  3601.     DW    SEMIS
  3602. ;
  3603.     DB    0C5H    ; ENDIF
  3604.     DB    'ENDI'
  3605.     DB    'F'+80H
  3606.     DW    BEGIN-8
  3607. ENDIFF    DW    DOCOL
  3608.     DW    QCOMP
  3609.     DW    TWO
  3610.     DW    QPAIR
  3611.     DW    HERE
  3612.     DW    OVER
  3613.     DW    SUBB
  3614.     DW    SWAP
  3615.     DW    STORE
  3616.     DW    SEMIS
  3617. ;
  3618.     DB    0C4H    ; THEN
  3619.     DB    'THE'
  3620.     DB    'N'+80H
  3621.     DW    ENDIFF-8
  3622. THEN    DW    DOCOL
  3623.     DW    ENDIFF
  3624.     DW    SEMIS
  3625. ;
  3626.     DB    0C2H    ; DO
  3627.     DB    'D'
  3628.     DB    'O'+80H
  3629.     DW    THEN-7
  3630. DO    DW    DOCOL
  3631.     DW    COMP
  3632.     DW    XDO
  3633.     DW    HERE
  3634.     DW    THREE
  3635.     DW    SEMIS
  3636. ;
  3637.     DB    0C4H    ; LOOP
  3638.     DB    'LOO'
  3639.     DB    'P'+80H
  3640.     DW    DO-5
  3641. LOOP    DW    DOCOL
  3642.     DW    THREE
  3643.     DW    QPAIR
  3644.     DW    COMP
  3645.     DW    XLOOP
  3646.     DW    BACK
  3647.     DW    SEMIS
  3648. ;
  3649.     DB    0C5H    ; +LOOP
  3650.     DB    '+LOO'
  3651.     DB    'P'+80H
  3652.     DW    LOOP-7
  3653. PLOOP    DW    DOCOL
  3654.     DW    THREE
  3655.     DW    QPAIR
  3656.     DW    COMP
  3657.     DW    XPLOO
  3658.     DW    BACK
  3659.     DW    SEMIS
  3660. ;
  3661.     DB    0C5H    ; UNTIL
  3662.     DB    'UNTI'
  3663.     DB    'L'+80H
  3664.     DW    PLOOP-8
  3665. UNTIL    DW    DOCOL
  3666.     DW    ONE
  3667.     DW    QPAIR
  3668.     DW    COMP
  3669.     DW    ZBRAN
  3670.     DW    BACK
  3671.     DW    SEMIS
  3672. ;
  3673.     DB    0C3H    ; END
  3674.     DB    'EN'
  3675.     DB    'D'+80H
  3676.     DW    UNTIL-8
  3677. ENDD    DW    DOCOL
  3678.     DW    UNTIL
  3679.     DW    SEMIS
  3680. ;
  3681.     DB    0C5H    ; AGAIN
  3682.     DB    'AGAI'
  3683.     DB    'N'+80H
  3684.     DW    ENDD-6
  3685. AGAIN    DW    DOCOL
  3686.     DW    ONE
  3687.     DW    QPAIR
  3688.     DW    COMP
  3689.     DW    BRAN
  3690.     DW    BACK
  3691.     DW    SEMIS
  3692. ;
  3693.     DB    0C6H    ; REPEAT
  3694.     DB    'REPEA'
  3695.     DB    'T'+80H
  3696.     DW    AGAIN-8
  3697. REPEA    DW    DOCOL
  3698.     DW    TOR
  3699.     DW    TOR
  3700.     DW    AGAIN
  3701.     DW    FROMR
  3702.     DW    FROMR
  3703.     DW    TWO
  3704.     DW    SUBB
  3705.     DW    ENDIFF
  3706.     DW    SEMIS
  3707. ;
  3708.     DB    0C2H    ; IF
  3709.     DB    'I'
  3710.     DB    'F'+80H
  3711.     DW    REPEA-9
  3712. IFF    DW    DOCOL
  3713.     DW    COMP
  3714.     DW    ZBRAN
  3715.     DW    HERE
  3716.     DW    ZERO
  3717.     DW    COMMA
  3718.     DW    TWO
  3719.     DW    SEMIS
  3720. ;
  3721.     DB    0C4H    ; ELSE
  3722.     DB    'ELS'
  3723.     DB    'E'+80H
  3724.     DW    IFF-5
  3725. ELSEE    DW    DOCOL
  3726.     DW    TWO
  3727.     DW    QPAIR
  3728.     DW    COMP
  3729.     DW    BRAN
  3730.     DW    HERE
  3731.     DW    ZERO
  3732.     DW    COMMA
  3733.     DW    SWAP
  3734.     DW    TWO
  3735.     DW    ENDIFF
  3736.     DW    TWO
  3737.     DW    SEMIS
  3738. ;
  3739.     DB    0C5H    ; WHILE
  3740.     DB    'WHIL'
  3741.     DB    'E'+80H
  3742.     DW    ELSEE-7
  3743. WHILE    DW    DOCOL
  3744.     DW    IFF
  3745.     DW    TWOP
  3746.     DW    SEMIS
  3747. ;
  3748.     DB    86H    ; SPACES
  3749.     DB    'SPACE'
  3750.     DB    'S'+80H
  3751.     DW    WHILE-8
  3752. SPACS    DW    DOCOL
  3753.     DW    ZERO
  3754.     DW    MAX
  3755.     DW    DDUP
  3756.     DW    ZBRAN    ; IF
  3757.     DW    SPAX1-$
  3758.     DW    ZERO
  3759.     DW    XDO    ; DO
  3760. SPAX2    DW    SPACE
  3761.     DW    XLOOP    ; LOOP    ENDIF
  3762.     DW    SPAX2-$
  3763. SPAX1    DW    SEMIS
  3764. ;
  3765.     DB    82H    ; <#
  3766.     DB    '<'
  3767.     DB    '#'+80H
  3768.     DW    SPACS-9
  3769. BDIGS    DW    DOCOL
  3770.     DW    PAD
  3771.     DW    HLD
  3772.     DW    STORE
  3773.     DW    SEMIS
  3774. ;
  3775.     DB    82H    ; #>
  3776.     DB    '#'
  3777.     DB    '>'+80H
  3778.     DW    BDIGS-5
  3779. EDIGS    DW    DOCOL
  3780.     DW    DROP
  3781.     DW    DROP
  3782.     DW    HLD
  3783.     DW    AT
  3784.     DW    PAD
  3785.     DW    OVER
  3786.     DW    SUBB
  3787.     DW    SEMIS
  3788. ;
  3789.     DB    84H    ; SIGN
  3790.     DB    'SIG'
  3791.     DB    'N'+80H
  3792.     DW    EDIGS-5
  3793. SIGN    DW    DOCOL
  3794.     DW    ROT
  3795.     DW    ZLESS
  3796.     DW    ZBRAN    ; IF
  3797.     DW    SIGN1-$
  3798.     DW    LIT
  3799.     DW    2DH
  3800.     DW    HOLD    ; ENDIF
  3801. SIGN1    DW    SEMIS
  3802. ;
  3803.     DB    81H    ; #
  3804.     DB    '#'+80H
  3805.     DW    SIGN-7
  3806. DIG    DW    DOCOL
  3807.     DW    BASE
  3808.     DW    AT
  3809.     DW    MSMOD
  3810.     DW    ROT
  3811.     DW    LIT
  3812.     DW    9
  3813.     DW    OVER
  3814.     DW    LESS
  3815.     DW    ZBRAN    ; IF
  3816.     DW    DIG1-$
  3817.     DW    LIT
  3818.     DW    7
  3819.     DW    PLUS    ; ENDIF
  3820. DIG1    DW    LIT
  3821.     DW    30H
  3822.     DW    PLUS
  3823.     DW    HOLD
  3824.     DW    SEMIS
  3825. ;
  3826.     DB    82H    ; #S
  3827.     DB    '#'
  3828.     DB    'S'+80H
  3829.     DW    DIG-4
  3830. DIGS    DW    DOCOL
  3831. DIGS1    DW    DIG    ; BEGIN
  3832.     DW    OVER
  3833.     DW    OVER
  3834.     DW    ORR
  3835.     DW    ZEQU
  3836.     DW    ZBRAN    ; UNTIL
  3837.     DW    DIGS1-$
  3838.     DW    SEMIS
  3839. ;
  3840.     DB    83H    ; D.R
  3841.     DB    'D.'
  3842.     DB    'R'+80H
  3843.     DW    DIGS-5
  3844. DDOTR    DW    DOCOL
  3845.     DW    TOR
  3846.     DW    SWAP
  3847.     DW    OVER
  3848.     DW    DABS
  3849.     DW    BDIGS
  3850.     DW    DIGS
  3851.     DW    SIGN
  3852.     DW    EDIGS
  3853.     DW    FROMR
  3854.     DW    OVER
  3855.     DW    SUBB
  3856.     DW    SPACS
  3857.     DW    TYPE
  3858.     DW    SEMIS
  3859. ;
  3860.     DB    82H    ; .R
  3861.     DB    '.'
  3862.     DB    'R'+80H
  3863.     DW    DDOTR-6
  3864. DOTR    DW    DOCOL
  3865.     DW    TOR
  3866.     DW    STOD
  3867.     DW    FROMR
  3868.     DW    DDOTR
  3869.     DW    SEMIS
  3870. ;
  3871.     DB    82H    ; D.
  3872.     DB    'D'
  3873.     DB    '.'+80H
  3874.     DW    DOTR-5
  3875. DDOT    DW    DOCOL
  3876.     DW    ZERO
  3877.     DW    DDOTR
  3878.     DW    SPACE
  3879.     DW    SEMIS
  3880. ;
  3881.     DB    81H    ; .
  3882.     DB    '.'+80H
  3883.     DW    DDOT-5
  3884. DOT    DW    DOCOL
  3885.     DW    STOD
  3886.     DW    DDOT
  3887.     DW    SEMIS
  3888. ;
  3889.     DB    81H    ; ?
  3890.     DB    '?'+80H
  3891.     DW    DOT-4
  3892. QUES    DW    DOCOL
  3893.     DW    AT
  3894.     DW    DOT
  3895.     DW    SEMIS
  3896. ;
  3897.     DB    82H    ; U.
  3898.     DB    'U'
  3899.     DB    '.'+80H
  3900.     DW    QUES-4
  3901. UDOT    DW    DOCOL
  3902.     DW    ZERO
  3903.     DW    DDOT
  3904.     DW    SEMIS
  3905. ;
  3906.     DB    85H    ; VLIST
  3907.     DB    'VLIS'
  3908.     DB    'T'+80H
  3909.     DW    UDOT-5
  3910. VLIST    DW    DOCOL
  3911.     DW    LIT
  3912.     DW    80H
  3913.     DW    OUTT
  3914.     DW    STORE
  3915.     DW    CONT
  3916.     DW    AT
  3917.     DW    AT
  3918. VLIS1    DW    OUTT    ; BEGIN
  3919.     DW    AT
  3920.     DW    CSLL
  3921.     DW    GREAT
  3922.     DW    ZBRAN    ; IF
  3923.     DW    VLIS2-$
  3924.     DW    CR
  3925.     DW    ZERO
  3926.     DW    OUTT
  3927.     DW    STORE    ; ENDIF
  3928. VLIS2    DW    DUP
  3929.     DW    IDDOT
  3930.     DW    SPACE
  3931.     DW    SPACE
  3932.     DW    PFA
  3933.     DW    LFA
  3934.     DW    AT
  3935.     DW    DUP
  3936.     DW    ZEQU
  3937.     DW    QTERM
  3938.     DW    ORR
  3939.     DW    ZBRAN    ; UNTIL
  3940.     DW    VLIS1-$
  3941.     DW    DROP
  3942.     DW    SEMIS
  3943. ;
  3944. ;------ EXIT CP/M  -----------------------
  3945. ;
  3946.     DB    83H    ; BYE
  3947.     DB    'BY'
  3948.     DB    'E'+80H
  3949.     DW    VLIST-8
  3950. BYE    DW    $+2
  3951.     JMP    0
  3952. ;-----------------------------------------------
  3953. ;
  3954.     DB    84H    ; LIST
  3955.     DB    'LIS'
  3956.     DB    'T'+80H
  3957.     DW    BYE-6
  3958. LIST    DW    DOCOL,DEC
  3959.     DW    CR,DUP
  3960.     DW    SCR,STORE
  3961.     DW    PDOTQ
  3962.     DB    6,'SCR # '
  3963.     DW    DOT
  3964.     DW    LIT,10H
  3965.     DW    ZERO,XDO
  3966. LIST1    DW    CR,IDO
  3967.     DW    LIT,3
  3968.     DW    DOTR,SPACE
  3969.     DW    IDO,SCR
  3970.     DW    AT,DLINE
  3971.     DW    QTERM        ; ?TERMINAL
  3972.     DW    ZBRAN,LIST2-$    ; IF
  3973.     DW    LEAVE        ; LEAVE
  3974. LIST2    DW    XLOOP,LIST1-$    ; ENDIF
  3975.     DW    CR,SEMIS
  3976. ;
  3977.     DB    85H    ; INDEX
  3978.     DB    'INDE'
  3979.     DB    'X'+80H
  3980.     DW    LIST-7
  3981. INDEX    DW    DOCOL
  3982.     DW    LIT,FF
  3983.     DW    EMIT,CR
  3984.     DW    ONEP,SWAP
  3985.     DW    XDO
  3986. INDE1    DW    CR,IDO
  3987.     DW    LIT,3
  3988.     DW    DOTR,SPACE
  3989.     DW    ZERO,IDO
  3990.     DW    DLINE,QTERM
  3991.     DW    ZBRAN,INDE2-$
  3992.     DW    LEAVE
  3993. INDE2    DW    XLOOP,INDE1-$
  3994.     DW    SEMIS
  3995. ;
  3996.     DB    85H    ; TRIAD
  3997.     DB    'TRIA'
  3998.     DB    'D'+80H
  3999.     DW    INDEX-8
  4000. TRIAD    DW    DOCOL
  4001.     DW    LIT,FF
  4002.     DW    EMIT
  4003.     DW    LIT,3
  4004.     DW    SLASH
  4005.     DW    LIT,3
  4006.     DW    STAR
  4007.     DW    LIT,3
  4008.     DW    OVER,PLUS
  4009.     DW    SWAP,XDO
  4010. TRIA1    DW    CR,IDO
  4011.     DW    LIST
  4012.     DW    QTERM        ; ?TERMINAL
  4013.     DW    ZBRAN,TRIA2-$    ; IF
  4014.     DW    LEAVE        ; LEAVE
  4015. TRIA2    DW    XLOOP,TRIA1-$    ; ENDIF
  4016.     DW    CR
  4017.     DW    LIT,15
  4018.     DW    MESS,CR
  4019.     DW    SEMIS
  4020. ;
  4021.     DB    84H    ; .CPU
  4022.     DB    '.CP'
  4023.     DB    'U'+80H
  4024.     DW    TRIAD-8
  4025. DOTCPU    DW    DOCOL
  4026.     DW    BASE,AT
  4027.     DW    LIT,36
  4028.     DW    BASE,STORE
  4029.     DW    LIT,22H
  4030.     DW    PORIG,TAT
  4031.     DW    DDOT
  4032.     DW    BASE,STORE
  4033.     DW    SEMIS
  4034. ;
  4035.     DB    84H    ; TASK
  4036.     DB    'TAS'
  4037.     DB    'K'+80H
  4038.     DW    DOTCPU-7
  4039. TASK    DW    DOCOL
  4040.     DW    SEMIS
  4041. ;
  4042. INITDP:    DS    EM-$    ;CONSUME MEMORY TO LIMIT
  4043. ;
  4044.     PAGE
  4045. ;
  4046. ;        MEMORY MAP
  4047. ;    ( THE FOLLOWING EQUATES ARE NOT REFERENCED ELSEWHERE )
  4048. ;
  4049. ;        LOCATION    CONTENTS
  4050. ;        --------    --------
  4051. MCOLD    EQU     ORIG        ;JMP TO COLD START
  4052. MWARM    EQU    ORIG+4        ;JMP TO WARM START
  4053. MA2    EQU    ORIG+8        ;COLD START PARAMETERS
  4054. MUP    EQU    UP        ;USER VARIABLES' BASE 'REG'
  4055. MRP    EQU    RPP        ;RETURN STACK 'REGISTER'
  4056. ;
  4057. MBIP    EQU    BIP        ;DEBUG SUPPORT
  4058. MDPUSH    EQU    DPUSH        ;ADDRESS INTERPRETER
  4059. MHPUSH    EQU    HPUSH
  4060. MNEXT    EQU    NEXT
  4061. ;
  4062. MDP0    EQU    DP0        ;START FORTH DICTIONARY
  4063. MDIO    EQU    DRIVE          ;CP/M DISK INTERFACE
  4064. MCIO    EQU    EPRINT          ;CONSOLE & PRINTER INTERFACE
  4065. MIDP    EQU    INITDP        ;END INITIAL FORTH DICTIONARY
  4066. ;                  = COLD (DP) VALUE
  4067. ;                  = COLD (FENCE) VALUE
  4068. ;                  |  NEW
  4069. ;                  |  DEFINITIONS
  4070. ;                  V
  4071. ;
  4072. ;                  ^
  4073. ;                  |  DATA
  4074. ;                  |  STACK
  4075. MIS0    EQU    INITS0        ;  = COLD (SP) VALUE = (S0)
  4076. ;                   = (TIB)
  4077. ;                  |  TERMINAL INPUT
  4078. ;                  |  BUFFER
  4079. ;                  V
  4080. ;
  4081. ;                  ^
  4082. ;                  |  RETURN
  4083. ;                  |  STACK
  4084. MIR0    EQU    INITR0        ;START USER VARIABLES
  4085. ;                  = COLD (RP) VALUE = (R0)
  4086. ;                  = (UP)
  4087. ;                ;END USER VARIABLES
  4088. MFIRST    EQU    BUF1        ;START DISK BUFFERS
  4089. ;                  = FIRST
  4090. MEND    EQU    EM-1        ;END DISK BUFFERS
  4091. MLIMIT    EQU    EM        ;LAST MEMORY LOC USED + 1
  4092. ;                  = LIMIT
  4093. ;
  4094. ;
  4095.     END    ORIG
  4096. HHHHDT=0        LEAVE        ; LEAVE
  4097. TRIA2    DW    XLOOP,TRIA1-$    ; ENDIF
  4098.     DW    CR
  4099.     DW    LIT,15
  4100.     DW    MESS,CR
  4101.     DW    SEMIS
  4102. ;
  4103.     DB    84H    ; .CPU
  4104.     DB    '.CP'
  4105.     DB    'U'+80H
  4106.     DW    TRIAD-8
  4107. DOTCPUPPORT
  4108. MDPUSH    EQU    DPUSH        ;ADDRESS INTERPR