home *** CD-ROM | disk | FTP | other *** search
/ Oakland CPM Archive / oakcpm.iso / sigm / vol116 / forth130.asm < prev    next >
Encoding:
Assembly Source File  |  1984-04-29  |  66.6 KB  |  5,054 lines

  1.     TITLE    '8080 FIG-FORTH 1.3 VERSION 0  18JUL81'
  2. ;    FIG-FORTH  RELEASE 1.3  FOR THE 8080 PROCESSOR
  3. ;
  4. ;    ALL PUBLICATIONS OF THE FORTH INTEREST GROUP
  5. ;    ARE PUBLIC DOMAIN.  THEY MAY BE FURTHER
  6. ;    DISTRIBUTED BY THE INCLUSION OF THIS CREDIT
  7. ;    NOTICE:
  8. ;
  9. ;    THIS PUBLICATION HAS BEEN MADE AVAILABLE BY THE
  10. ;             FORTH INTEREST GROUP
  11. ;             P. O. BOX 1105
  12. ;             SAN CARLOS, CA 94070
  13. ;
  14. ;    IMPLEMENTATION BY:    ( 790528 )
  15. ;        JOHN CASSADY
  16. ;        339 15TH STREET
  17. ;        OAKLAND,CA 94612
  18. ;    MODIFIED BY:
  19. ;           KIM HARRIS
  20.      Bill McGee 30 Mar 83 for Apple ][
  21. ;    ACKNOWLEDGEMENTS:
  22. ;        GEORGE SHAW
  23. ;        TERRY HOLMES
  24. ;        MIKE PERRY
  25. ;        DON COLBURN
  26. ;        GEORGE FLAMMER
  27. ;        ROBT. D. VILLWOCK
  28. ;
  29.     PAGE
  30. ;
  31. ;----------------------------------------------------------
  32. ;
  33. ;    RELEASE & VERSION NUMBERS
  34. ;
  35. FIGREL    EQU    1    ; FIG RELEASE #
  36. FIGREV    EQU    3    ; FIG REVISION #
  37. USRVER    EQU    1    ; USER VERSION #
  38. ;
  39. ;    ASCII CHARACTERS USED
  40. ;
  41. ABL    EQU    20H    ; SPACE
  42. ACR    EQU    0DH    ; CARRIAGE RETURN
  43. ADOT    EQU    02EH    ; PERIOD
  44. BELL    EQU    07H    ; (^G)
  45. BSIN    EQU    08H    ; INPUT BACKSPACE
  46. BSOUT    EQU    08H    ; OUTPUT BACKSPACE (^H)
  47. DLE    EQU    10H    ; (^P)
  48. LF    EQU    0AH    ; LINE FEED
  49. FF    EQU    0CH    ; FORM FEED (^L)
  50. ;
  51. ;    MEMORY ALLOCATION
  52. ;
  53. EM    EQU    0A000H
  54. NSCR    EQU    4    ; NUMBER OF 1024 BYTE SCREENS
  55. KBBUF    EQU    1024    ; DATA BYTES PER DISK BUFFER
  56. US    EQU    40H    ; USER VARIABLES SPACE
  57. RTS    EQU    0A0H    ; RETURN STACK & TERM BUFF SPACE
  58. ;
  59. CO    EQU    KBBUF+4    ; DISK BUFFER + 2 HEADER + 2 TAIL
  60. NBUF    EQU    NSCR*1024/KBBUF    ; NUMBER OF BUFFERS
  61. BUF1    EQU    EM-CO*NBUF    ; ADDR FIRST DISK BUFFER
  62. INITR0    EQU    BUF1-US        ; (R0)
  63. INITS0    EQU    INITR0-RTS    ; (S0)
  64. ;
  65.     PAGE
  66. ;
  67. ;-------------------------------------------------------
  68. ;
  69. APPLE    EQU    TRUE
  70.     ORG    100H
  71. ; ENTRY FOR INITIAL EXECUTION AND COLD START
  72. ORIG    NOP
  73.     JMP    CLD    ; VECTOR TO COLD START
  74. ; ENTRY FOR WARM START
  75.     NOP
  76.     JMP    WRM    ; VECTOR TO WARM START
  77. ;
  78.     DB    FIGREL    ; FIG RELEASE #
  79.     DB    FIGREV    ; FIG REVISION #
  80.     DB    USRVER    ; USER VERSION #
  81.     DB    0EH    ; IMPLEMENTATION ATTRIBUTES
  82. OFOR    DW    FLAST    ; TOPMOST WORD IN FORTH VOCABULARY
  83.     DW    BSIN    ; BKSPACE CHARACTER
  84.     DW    INITR0    ; INIT (UP)
  85. ;<<<<<< FOLLOWING USED BY COLD;
  86. ;    MUST BE IN SAME ORDER AS USER VARIABLES
  87. OCLD0    DW    INITS0    ; INIT (S0)
  88.     DW    INITR0    ; INIT (R0)
  89.     DW    INITS0    ; INIT (TIB)
  90.     DW    31        ; INIT (WIDTH)
  91.     DW    0        ; INIT (WARNING)
  92.     DW    FLAST        ; INIT (FENCE)
  93.     DW    INITDP        ; INIT (DP)
  94.     DW    FORTH+6        ; INIT (VOC-LINK)
  95. OCLD1    EQU    $
  96. ;<<<<<< END DATA USED BY COLD
  97.     DW    5H,0B320H    ; CPU NAME    ( HW,LW )
  98. ;                  ( 32 BIT, BASE 36 INTEGER )
  99. OED    DW    ELAST    ; LAST EDITOR DEF.
  100. ;OASM    DW    ALAST    ; SAME FOR ASSEMBLER IF RESIDENT
  101. ;
  102. ;
  103. ;            +---------------+
  104. ;    B +ORIGIN    | . . .W:I.E.B.A|    IMPLEMENTATION
  105. ;            +---------------+    ATTRIBUTES
  106. ;                   ^ ^ ^ ^ ^
  107. ;                   | | | | +-- PROCESSOR ADDR =
  108. ;                   | | | |     { 0 BYTE | 1 WORD }
  109. ;                   | | | +---- HIGH BYTE AT
  110. ;                   | | |       { 0 LOW ADDR |
  111. ;                   | | |         1 HIGH ADDR }
  112. ;                   | | +------ ADDR MUST BE EVEN
  113. ;                   | |       { 0 YES | 1 NO }
  114. ;                   | +-------- INTERPRETER IS
  115. ;                   |       { 0 PRE | 1 POST }
  116. ;                   |       INCREMENTING
  117. ;                   +---------- { 0 ABOVE SUFFICIENT
  118. ;                         | 1 OTHER DIFFER-
  119. ;                         ENCES EXIST }
  120. ;
  121.     PAGE
  122. ;
  123. ;------------------------------------------------------
  124. ;
  125. ;    FORTH REGISTERS
  126. ;
  127. ;    FORTH    8080    FORTH PRESERVATION RULES
  128. ;    -----    ----    ------------------------
  129. ;    IP    BC    SHOULD BE PRESERVED ACROSS
  130. ;              FORTH WORDS
  131. ;    W    DE    SOMETIMES OUTPUT FROM NEXT
  132. ;            MAY BE ALTERED BEFORE JMP'ING TO NEXT
  133. ;            INPUT ONLY WHEN 'DPUSH' CALLED
  134. ;    SP    SP    SHOULD BE USED ONLY AS DATA STACK
  135. ;              ACROSS FORTH WORDS
  136. ;            MAY BE USED WITHIN FORTH WORDS
  137. ;              IF RESTORED BEFORE 'NEXT'
  138. ;        HL    NEVER OUTPUT FROM NEXT
  139. ;            INPUT ONLY WHEN 'HPUSH' CALLED
  140. ;
  141. UP    DW    INITR0    ; USER AREA POINTER
  142. RPP    DW    INITR0    ; RETURN STACK POINTER
  143. ;
  144. ;------------------------------------------------------
  145. ;
  146. ;    COMMENT CONVENTIONS:
  147. ;
  148. ;    =    MEANS    "IS EQUAL TO"
  149. ;    <-    MEANS    ASSIGNMENT
  150. ;
  151. ;    NAME    =    ADDRESS OF NAME
  152. ;    (NAME)    =    CONTENTS AT NAME
  153. ;    ((NAME))=    INDIRECT CONTENTS
  154. ;
  155. ;    CFA    =    ADDRESS OF CODE FIELD
  156. ;    LFA    =    ADDRESS OF LINK FIELD
  157. ;    NFA    =    ADDR OF START OF NAME FIELD
  158. ;    PFA    =    ADDR OF START OF PARAMETER FIELD
  159. ;
  160. ;    S1    =    ADDR OF 1ST WORD OF PARAMETER STACK
  161. ;    S2    =    ADDR OF 2ND WORD OF PARAMETER STACK
  162. ;    R1    =    ADDR OF 1ST WORD OF RETURN STACK
  163. ;    R2    =    ADDR OF 2ND WORD OF RETURN STACK
  164. ;    ( ABOVE STACK POSITIONS VALID BEFORE & AFTER EXECUTION
  165. ;    OF ANY WORD, NOT DURING. )
  166. ;
  167. ;    LSB    =    LEAST SIGNIFICANT BIT
  168. ;    MSB    =    MOST SIGNIFICANT BIT
  169. ;    LB    =    LOW BYTE
  170. ;    HB    =    HIGH BYTE
  171. ;    LW    =    LOW WORD
  172. ;    HW    =    HIGH WORD
  173. ;    ( MAY BE USED AS SUFFIX TO ABOVE NAMES )
  174. ;
  175.     PAGE
  176. ;
  177. ;---------------------------------------------------
  178. ;    DEBUG SUPPORT
  179. ;
  180. ;    TO USE:
  181. ;    (1)    SET 'BIP' TO IP VALUE TO HALT, CANNOT BE CFA
  182. ;    (2)    SET MONITOR'S BREAKPOINT PC TO 'BREAK'
  183. ;            OR PATCH 'HLT' INSTR. THERE
  184. ;    (3)    PATCH A 'JMP TNEXT' AT 'NEXT'
  185. ;    WHEN (IP) = (BIP) CPU WILL HALT
  186. ;
  187. BIP    DW    0    ; BREAKPOINT ON IP VALUE
  188. ;
  189. TNEXT    LXI    H,BIP
  190.     MOV    A,M    ; LB
  191.     CMP    C
  192.     JNZ    TNEXT1
  193.     INX    H
  194.     MOV    A,M    ; HB
  195.     CMP    B
  196.     JNZ    TNEXT1
  197. BREAK    NOP        ; PLACE BREAKPOINT HERE
  198.     NOP
  199.     NOP
  200. TNEXT1    LDAX    B
  201.     INX    B
  202.     MOV    L,A
  203.     JMP    NEXT+3
  204. ;
  205. ;--------------------------------------------------
  206. ;
  207. ;    NEXT, THE FORTH ADDRESS INTERPRETER
  208. ;      ( POST INCREMENTING VERSION )
  209. ;
  210. DPUSH    PUSH    D
  211. HPUSH    PUSH    H
  212. NEXT    LDAX    B    ;(W) <- ((IP))
  213.     INX    B    ;(IP) <- (IP)+2
  214.     MOV    L,A
  215.     LDAX    B
  216.     INX    B
  217.     MOV    H,A    ; (HL) <- CFA
  218. NEXT1:    MOV    E,M    ;(PC) <- ((W))
  219.     INX    H
  220.     MOV    D,M
  221.     XCHG
  222.     PCHL        ; NOTE: (DE) = CFA+1
  223. ;
  224.     PAGE
  225. ;
  226. ;        FORTH DICTIONARY
  227. ;
  228. ;
  229. ;    DICTIONARY FORMAT:
  230. ;
  231. ;                BYTE
  232. ;    ADDRESS    NAME        CONTENTS
  233. ;    ------- ----        --------
  234. ;                      ( MSB=1
  235. ;                      ( P=PRECEDENCE BIT
  236. ;                      ( S=SMUDGE BIT
  237. ;    NFA    NAME FIELD    1PS<LEN>  < NAME LENGTH
  238. ;                0<1CHAR>  MSB=0, NAME'S 1ST CHAR
  239. ;                0<2CHAR>
  240. ;                  ...
  241. ;                1<LCHAR>  MSB=1, NAME'S LAST CHR
  242. ;    LFA    LINK FIELD    <LINKLB>  = PREVIOUS WORD'S NFA
  243. ;                <LINKHB>
  244. ;LABEL:    CFA    CODE FIELD    <CODELB>  = ADDR CPU CODE
  245. ;                <CODEHB>
  246. ;    PFA    PARAMETER    <1PARAM>  1ST PARAMETER BYTE
  247. ;        FIELD        <2PARAM>
  248. ;                  ...
  249. ;
  250. ;
  251. DP0    DB    83H    ; LIT
  252.     DB    'LI'
  253.     DB    'T'+80H
  254.     DW    0    ; (LFA)=0 MARKS END OF DICTIONARY
  255. LIT    DW    $+2    ;(S1) <- ((IP))
  256.     LDAX    B    ; (HL) <- ((IP)) = LITERAL
  257.     INX    B    ; (IP) <- (IP) + 2
  258.     MOV    L,A    ; LB
  259.     LDAX    B    ; HB
  260.     INX    B
  261.     MOV    H,A
  262.     JMP    HPUSH    ; (S1) <- (HL)
  263.  ;
  264.     DB    87H    ; EXECUTE
  265.     DB    'EXECUT'
  266.     DB    'E'+80H
  267.     DW    LIT-6
  268. EXEC    DW    $+2
  269.     POP    H    ; (HL) <- (S1) = CFA
  270.     JMP    NEXT1
  271. ;
  272.     DB    86H    ; BRANCH
  273.     DB    'BRANC'
  274.     DB    'H'+80H
  275.     DW    EXEC-0AH
  276. BRAN    DW    $+2    ;(IP) <- (IP) + ((IP))
  277. BRAN1    MOV    H,B    ; (HL) <- (IP)
  278.     MOV    L,C
  279.     MOV    E,M    ; (DE) <- ((IP)) = BRANCH OFFSET
  280.     INX    H
  281.     MOV    D,M
  282.     DCX    H
  283.     DAD    D    ; (HL) <- (HL) + ((IP))
  284.     MOV    C,L    ; (IP) <- (HL)
  285.     MOV    B,H
  286.     JMP    NEXT
  287. ;
  288.     DB    87H    ; 0BRANCH
  289.     DB    '0BRANC'
  290.     DB    'H'+80H
  291.     DW    BRAN-9
  292. ZBRAN    DW    $+2
  293.     POP    H
  294.     MOV    A,L
  295.     ORA    H
  296.     JZ    BRAN1    ; IF (S1)=0 THEN BRANCH
  297.     INX    B    ; ELSE SKIP BRANCH OFFSET
  298.     INX    B
  299.     JMP    NEXT
  300. ;
  301.     DB    86H    ; (LOOP)    1.3
  302.     DB    '(LOOP'
  303.     DB    ')'+80H
  304.     DW    ZBRAN-0AH
  305. XLOOP    DW    $+2
  306.     LHLD    RPP    ; ((HL)) = INDEX = (R1)
  307.     MOV    E,M    ; (DE) <- INDEX
  308.     INX    H
  309.     MOV    D,M
  310.     INX    D    ; INDEX <- INDEX + 1
  311.     MOV    M,D    ; (R1) <- NEW INDEX
  312.     DCX    H
  313.     MOV    M,E
  314.     INX    H
  315.     INX    H    ; ((HL)) = LIMIT
  316.     MOV    A,E    ; IF INDEX < LIMIT
  317.     SUB    M
  318.     MOV    A,D
  319.     INX    H
  320.     SBB    M
  321.     JM    BRAN1    ; THEN LOOP AGAIN
  322.     INX    H    ; ELSE DONE
  323.     SHLD    RPP    ; DISCARD R1 & R2
  324.     INX    B    ; SKIP BRANCH OFFSET
  325.     INX    B
  326.     JMP    NEXT
  327. ;
  328.     DB    87H    ; (+LOOP)    1.3
  329.     DB    '(+LOOP'
  330.     DB    ')'+80H
  331.     DW    XLOOP-9
  332. XPLOO    DW    $+2
  333.     POP    D    ; (DE) <- INCR
  334.     LHLD    RPP    ; ((HL)) = INDEX
  335.     MOV    A,M    ; INDEX <- INDEX + INCR
  336.     ADD    E
  337.     MOV    M,A
  338.     MOV    E,A
  339.     INX    H
  340.     MOV    A,M
  341.     ADC    D
  342.     MOV    M,A
  343.     INX    H    ; ((HL)) = LIMIT
  344.     INR    D
  345.     DCR    D
  346.     MOV    D,A    ; (DE) <- NEW INDEX
  347.     JM    XLOO2    ; IF INCR > 0
  348.     MOV    A,E    ; THEN (A) <- INDEX - LIMIT
  349.     SUB    M
  350.     MOV    A,D
  351.     INX    H
  352.     SBB    M
  353.     JMP    XLOO3
  354. XLOO2    MOV    A,M    ; ELSE (A) <- LIMIT - INDEX
  355.     SUB    E
  356.     INX    H
  357.     MOV    A,M
  358.     SBB    D
  359. ;              IF (A) < 0
  360. XLOO3    JM    BRAN1    ; THEN LOOP AGAIN
  361.     INX    H    ; ELSE DONE
  362.     SHLD    RPP    ; DROP R1 AND R2
  363.     INX    B    ; SKIP BRANCH OFFSET
  364.     INX    B
  365.     JMP    NEXT
  366. ;
  367.     DB    84H    ; (DO)
  368.     DB    '(DO'
  369.     DB    ')'+80H
  370.     DW    XPLOO-0AH
  371. XDO    DW    $+2
  372.     LHLD    RPP    ; (RP) <- (RP) - 4
  373.     DCX    H
  374.     DCX    H
  375.     DCX    H
  376.     DCX    H
  377.     SHLD    RPP
  378.     POP    D    ; (R1) <- (S1) = INIT INDEX
  379.     MOV    M,E
  380.     INX    H
  381.     MOV    M,D
  382.     POP    D    ; (R2) <- (S2) = LIMIT
  383.     INX    H
  384.     MOV    M,E
  385.     INX    H
  386.     MOV    M,D
  387.     JMP    NEXT
  388. ;
  389.     DB    81H    ; I    1.3
  390.     DB    'I'+80H
  391.     DW    XDO-7
  392. IDO    DW    $+2    ;(S1) <- (R1) , (R1) UNCHANGED
  393.     LHLD    RPP
  394. IDO1    MOV    E,M    ; (DE) <- (R1)
  395.     INX    H
  396.     MOV    D,M
  397.     PUSH    D    ; (S1) <- (DE)
  398.     JMP    NEXT
  399. ;
  400.     DB    82H    ; I'    1.3
  401.     DB    'I'
  402.     DB    27H+80H
  403.     DW    IDO-4
  404. IPRIM    DW    $+2
  405.     LHLD    RPP
  406.     INX    H
  407.     INX    H    ; ((HL)) = (R2)
  408.     JMP    IDO1
  409. ;
  410.     DB    81H    ; J    1.3
  411.     DB    'J'+80H
  412.     DW    IPRIM-5
  413. J    DW    $+2
  414.     LHLD    RPP
  415.     INX    H
  416.     INX    H
  417.     INX    H
  418.     INX    H    ; ((HL)) = (R3)
  419.     JMP    IDO1
  420. ;
  421.     DB    85H    ; DIGIT        1.3
  422.     DB    'DIGI'
  423.     DB    'T'+80H
  424.     DW    IDO-4
  425. DIGIT    DW    $+2
  426.     POP    H    ; (L) <- (S1)LB = ASCII CHR TO BE
  427. ;             CONVERTED
  428.     MVI    H,0
  429.     POP    D    ; (DE) <- (S2) = BASE VALUE
  430.     MOV    A,E    ; (BASE) < 255 ASSUMED
  431.     SUI    30H    ; IF CHR > "0"
  432.     CPI    0AH    ; AND IF CHR > "9"
  433.     JC    DIGI1    ; THEN GO TEST BASE
  434.     SUI    7
  435.     CPI    0AH    ; OR IF CHR >= "A"
  436.     JC    DIGI2
  437. ;            ; THEN VALID NUMERIC OR ALPHA CHR
  438. DIGI1    CMP    L    ; IF DIGIT VALUE < BASE VALUE
  439.     MOV    E,A    ; (E) <- CONVERTED DIGIT
  440.     MVI    L,1    ; (L) <- TRUE
  441.     JC    DPUSH    ; THEN SUCCESSFUL
  442. ;              (S2) <- CONVERTED DIGIT
  443. ;              (S1) <- TRUE
  444. ;            ; ELSE INVALID DIGIT CHR
  445. DIGI2    MOV    L,H    ; (HL) <- FALSE
  446.     JMP    HPUSH    ; (S1) <- FALSE
  447. ;
  448.     DB    86H    ; (FIND)    1.3
  449.     DB    '(FIND'    ;
  450.     DB    ')'+80H
  451.     DW    DIGIT-8
  452. PFIND    DW    $+2
  453.     POP    D    ; (DE) <- NFA
  454. PFIN1    POP    H    ; (HL) <- STRING ADDR
  455.     PUSH    H    ; SAVE STRING ADDR FOR NEXT ITERATION
  456.     LDAX    D
  457.     XRA    M    ; CHECK LENGTHS & SMUDGE BIT
  458.     ANI    3FH
  459.     JNZ    PFIN4    ; LENGTHS DIFFERENT
  460. ;            ; LENGTHS MATCH, CHECK EACH CHR
  461. PFIN2    INX    H    ; (HL) <- ADDR NEXT CHR IN STRING
  462.     INX    D    ; (DE) <- ADDR NEXT CHR IN NF
  463.     LDAX    D
  464.     XRA    M    ; IGNORE MSB
  465.     JZ    PFIN2    ; MATCH SO FAR, LOOP AGAIN
  466.     ADD    A
  467.     JNZ    PFIN3    ; NO MATCH
  468.     LXI    H,5    ; STRING MATCHES
  469.     DAD    D    ; ((SP)) <- PFA
  470.     XTHL
  471. ;            ; BACK UP TO LENGTH BYTE OF NF = NFA
  472. PFIN6    DCX    D
  473.     LDAX    D
  474.     ORA    A
  475.     JP    PFIN6    ; IF MSB = 1 THEN (DE) = NFA
  476.     MOV    E,A    ; (DE) <- LENGTH BYTE
  477.     MVI    D,0
  478.     LXI    H,1    ; (HL) <- TRUE
  479.     JMP    DPUSH  ; RETURN, NF FOUND
  480. ;    ABOVE NF NOT A MATCH, TRY ANOTHER
  481. PFIN3    JC    PFIN5    ; IF NOT END OF NF
  482. PFIN4    INX    D    ; THEN FIND END OF NF
  483.     LDAX    D
  484.     ORA    A
  485.     JP    PFIN4
  486. PFIN5    INX    D    ; (DE) <- LFA
  487.     XCHG
  488.     MOV    E,M    ; (DE) <- (LFA)
  489.     INX    H
  490.     MOV    D,M
  491.     MOV    A,D
  492.     ORA    E    ; IF (LFA) <> 0
  493.     JNZ    PFIN1    ; THEN TRY PREVIOUS DICT. DEF.
  494. ;            ; ELSE END OF DICTIONARY
  495.     POP    H    ; DISCARD STRING ADDR
  496.     PUSH    D    ; (S1) <- FALSE
  497.     JMP    NEXT
  498. ;
  499.     DB    87H    ; ENCLOSE    1.3
  500.     DB    'ENCLOS'
  501.     DB    'E'+80H
  502.     DW    PFIND-9
  503. ENCL    DW    $+2
  504.     POP    D    ; (DE) <- (S1) = DELIMITER CHAR
  505.     POP    H    ; (HL) <- (S2) = ADDR TEXT TO SCAN
  506.     PUSH    H    ; (S4) <- ADDR
  507.     MOV    A,E    ; (E) <- DELIM CHR
  508.     LXI    D,-1    ; INIT CHR OFFSET COUNTER
  509.     DCX    H    ; (HL) <- ADDR-1
  510. ;            ; SKIP OVER LEADING DELIMITER CHRS
  511. ENCL1    INX    H
  512.     INX    D
  513.     CMP    M    ; IF TEXT CHR = DELIM CHR
  514.     JZ    ENCL1    ; THEN LOOP AGAIN
  515. ;            ; ELSE NON-DELIM CHR FOUND
  516.     PUSH    D    ; (S3) <- (DE) = OFFSET TO 1ST NON-DELIM
  517.     MOV    D,A    ; SAVE A
  518.     MOV    A,M    ; IF 1ST NON-DELIM = NULL
  519.     ANA    A
  520.     MOV    A,D    ; RESTORE A
  521.     POP    D
  522.     PUSH    D
  523.     JNZ    ENCL2
  524.     INX    D    ; THEN (S2) <- OFFSET TO BYTE
  525.     PUSH    D    ;   FOLLOWING NULL
  526.     DCX    D    ; (S1) <- OFFSET TO NULL
  527.     PUSH    D
  528.     JMP    NEXT
  529. ;            ; ELSE TEXT CONTAINS NON-DELIM &
  530. ;              NON-NULL CHR
  531. ENCL2    PUSH    B    ; SAVE IP
  532.     MOV    B,A    ; (B) <- DELIM CHR
  533. ENCL5    INX    H    ; (HL) <- ADDR NEXT CHR
  534.     INX    D    ; (DE) <- OFFSET TO NEXT CHR
  535.     MOV    A,M    ; IF NEXT CHR <> DELIM CHR
  536.     CMP    B
  537.     JZ    ENCL4
  538.     ANA    A    ; AND IF NEXT CHR <> NULL
  539.     JNZ    ENCL5    ; THEN CONTINUE SCAN
  540. ;            ; ELSE CHR = NULL
  541. ENCL3    POP    B    ; RESTORE IP
  542.     PUSH    D    ; (S2) <- OFFSET TO NULL
  543.     PUSH    D    ; (S1) <- OFFSET TO NULL
  544.     JMP    NEXT
  545. ;            ; ELSE CHR = DELIM CHR
  546. ENCL4    POP    B    ; RESTORE IP
  547.     PUSH    D    ; (S2) <- OFFSET TO BYTE
  548. ;              FOLLOWING TEXT
  549.     INX    D    ; (S1) <- OFFSET TO 2 BYTES AFTER
  550. ;                END OF WORD
  551.     PUSH    D
  552.     JMP    NEXT
  553. ;
  554.     DB    84H    ; EMIT
  555.     DB    'EMI'
  556.     DB    'T'+80H
  557.     DW    ENCL-0AH
  558. EMIT    DW    DOCOL
  559.     DW    PEMIT
  560.     DW    ONE,OUTT
  561.     DW    PSTOR,SEMIS
  562. ;
  563.     DB    83H    ; KEY
  564.     DB    'KE'
  565.     DB    'Y'+80H
  566.     DW    EMIT-7
  567. KEY    DW    $+2
  568.     JMP    PKEY
  569. ;
  570.     DB    89H    ; ?TERMINAL
  571.     DB    '?TERMINA'
  572.     DB    'L'+80H
  573.     DW    KEY-6
  574. QTERM    DW    $+2
  575.     LXI    H,0
  576.     JMP    PQTER
  577. ;
  578.     DB    82H    ; CR
  579.     DB    'C'
  580.     DB    'R'+80H
  581.     DW    QTERM-0CH
  582. CR    DW    $+2
  583.     JMP    PCR
  584. ;
  585.     DB    85H    ; CMOVE
  586.     DB    'CMOV'
  587.     DB    'E'+80H
  588.     DW    CR-5
  589. CMOVE    DW    $+2
  590.     MOV    L,C    ; (HL) <- (IP)
  591.     MOV    H,B
  592.     POP    B    ; (BC) <- (S1) = #CHRS
  593.     POP    D    ; (DE) <- (S2) = DEST ADDR
  594.     XTHL        ; (HL) <- (S3) = SOURCE ADDR
  595. ;            ; (S1) <- (IP)
  596.     JMP    CMOV2    ; RETURN IF #CHRS = 0
  597. CMOV1    MOV    A,M    ; ((DE)) <- ((HL))
  598.     INX    H    ; INC SOURCE ADDR
  599.     STAX    D
  600.     INX    D    ; INC DEST ADDR
  601.     DCX    B    ; DEC #CHRS
  602. CMOV2    MOV    A,B
  603.     ORA    C
  604.     JNZ    CMOV1    ; REPEAT IF #CHRS <> 0
  605.     POP    B    ; RESTORE (IP) FROM (S1)
  606.     JMP    NEXT
  607. ;
  608.     DB    86H    ; >CMOVE    1.3
  609.     DB    '>CMOV'
  610.     DB    'E'+80H
  611.     DW    CMOVE-8
  612. GCMOV    DW    $+2
  613.     MOV    L,C    ; (HL) <- (IP)
  614.     MOV    H,B
  615.     POP     B    ; (BC) <- (S1) = #CHRS
  616.     POP    D    ; (DE) <- (S2) = DEST ADDR
  617.     XTHL        ; (HL) <- (S3) = SOURCE ADDR
  618. ;              (S1) <- (IP) TEMP.
  619.     DAD    B    ; (HL) <- END SOURCE ADDR
  620.     DCX    H
  621.     XCHG
  622.     DAD    B
  623.     DCX    H
  624.     XCHG        ; (DE) <- END DEST ADDR
  625.     JMP    GCMOV2    ; RETURN IF #CHRS = 0
  626. GCMOV1    MOV    A,M    ; ((DE)) <- ((HL))
  627.     DCX    H    ; DECR SOURCE ADDR
  628.     STAX    D
  629.     DCX    D    ; DECR DEST ADDR
  630.     DCX    B    ; DECR #CHRS
  631. GCMOV2    MOV    A,B    ; IF #CHRS LEFT <> 0
  632.     ORA    C
  633.     JNZ    GCMOV1    ; THEN LOOP AGAIN
  634.     POP    B    ; RESTORE IP
  635.     JMP    NEXT
  636. ;
  637.     DB    82H    ; U*        1.3
  638. ;                16X16 UNSIGNED MULTIPLY
  639.     DB    'U'    ; AVG EXECUTION TIME = 880 CYCLES
  640.     DB    '*'+80H
  641.     DW    GCMOV-9
  642. USTAR    DW    $+2
  643.     POP    D    ; (DE) <- MPLIER
  644.     POP    H    ; (HL) <- MPCAND
  645.     PUSH    B    ; SAVE IP
  646.     MOV    B,H
  647.     MOV    A,L    ; (BA) <- MPCAND
  648.     CALL    MPYX    ; (AHL)1 <- MPCAND.LB * MPLIER
  649. ;                   1ST PARTIAL PRODUCT
  650.     PUSH    H    ; SAVE (HL)1
  651.     MOV    H,A
  652.     MOV    A,B
  653.     MOV    B,H    ; SAVE (A)1
  654.     CALL    MPYX    ; (AHL)2 <- MPCAND.HB * MPLIER
  655. ;                   2ND PARTIAL PRODUCT
  656.     POP    D    ; (DE) <- (HL)1
  657.     MOV    C,D    ; (BC) <- (AH)1
  658. ;    FORM SUM OF PARTIALS:
  659. ;               (AHL) 1
  660. ;            + (AHL)  2
  661. ;            --------
  662. ;              (AHLE)
  663.     DAD    B    ; (HL) <- (HL)2 + (AH)1
  664.     ACI    0    ; (AHLE) <- (BA) * (DE)
  665.     MOV    D,L
  666.     MOV    L,H
  667.     MOV    H,A    ; (HLDE) <- MPLIER * MPCAND
  668.     POP    B    ; RESTORE IP
  669.     PUSH    D    ; (S2) <- PRODUCT.LW
  670.     JMP    HPUSH    ; (S1) <- PRODUCT.HW
  671. ;
  672. ;    MULTIPLY PRIMITIVE
  673. ;        (AHL) <- (A) * (DE)
  674. ;    #BITS =     24      8    16
  675. MPYX    LXI    H,0    ; (HL) <- 0 = PARTIAL PRODUCT.LW
  676.     MVI    C,4    ; LOOP COUNTER
  677. MPYX1    DAD    H    ; LEFT SHIFT (AHL) 24 BITS
  678.     RAL
  679.     JNC    MPYX2    ; IF NEXT MPLIER BIT = 1
  680.     DAD    D    ; THEN ADD MPCAND
  681.     ACI    0
  682. MPYX2    DAD    H
  683.     RAL
  684.     JNC    MPYX3
  685.     DAD    D
  686.     ACI    0
  687. MPYX3    DCR    C    ; IF NOT LAST MPLIER BIT
  688.     JNZ    MPYX1    ; THEN LOOP AGAIN
  689.     RET        ; ELSE DONE
  690. ;
  691.     DB    82H    ; U/        1.3
  692.     DB    'U'
  693.     DB    '/'+80H
  694.     DW    USTAR-5
  695. USLAS    DW    $+2
  696.     MOV    H,B
  697.     MOV    L,C    ; (HL) <- (IP)
  698.     POP    B    ; (BC) <- (S1) = DENOMINATOR
  699.     POP    D    ; (DE) <- (S2) = NUMERATOR.HIGH
  700.     XTHL        ; (S1) <- (IP)
  701.     XCHG        ; (HLDE) = NUMERATOR, 32 BITS
  702.     MOV    A,L
  703.     SUB    C
  704.     MOV    A,H    ; IF OVERFLOW
  705.     SBB    B
  706.     JNC    USBAD    ; THEN RETURN BAD VALUE
  707.     MOV    A,H
  708.     MOV    H,L
  709.     MOV    L,D    ; (AHL) <- 24 BITS OF NUMERATOR
  710.     MVI    D,8    ; (D) <- INIT COUNTER
  711.     PUSH    D    ; SAVE D & E
  712.     CALL    USLA    ; PARTIAL DIVISION
  713.     POP    D    ; RESTORE COUNTER & NUM.MSBYTE
  714.     PUSH    H    ; (S1) <- (L) = BYTE OF QUOTIENT
  715.     MOV    L,E
  716.     CALL    USLA
  717.     MOV    D,A
  718.     MOV    E,H    ; (DE) <- REMAINDER
  719.     POP    B    ; RESTORE QUOTIENT.HIGH
  720.     MOV    H,C    ; (HL) <- QUOTIENT
  721.     POP    B    ; RESTORE (IP)
  722.     JMP    DPUSH    ; SUCCESSFULLY DONE
  723. ;
  724. USL0    MOV    E,A
  725.     MOV    A,H
  726.     SUB    C
  727.     MOV    H,A
  728.     MOV    A,E
  729.     SBB    B
  730.     JNC    USL1    ; IF CARRY
  731.     MOV    A,H    ; THEN ADD (BC) INTO (AH)
  732.     ADD    C
  733.     MOV    H,A
  734.     MOV    A,E
  735.     DCR    D
  736.     RZ        ; RETURN FROM USLA
  737. ;
  738. USLA    DAD    H    ; 24BIT LEFT-SHIFT ( *2 )
  739.     RAL
  740.     JNC    USL0    ; SUBTRACT & TEST
  741.     MOV    E,A
  742.     MOV    A,H
  743.     SUB    C    ; (AH) <- (AH) - (BC)
  744.     MOV    H,A
  745.     MOV    A,E
  746.     SBB    B
  747. USL1    INR    L    ; 1 BIT OF QUOT INTO RIGHT SIDE
  748.     DCR    D    ;   OF (AHL)
  749.     JNZ    USLA    ; CONTINUE DIVISION
  750.     RET        ; ALL 8 TRIAL COMPLETE
  751. ;
  752. USBAD    LXI    H,-1    ; OVERFLOW, RETURN 32BIT -1
  753.     POP    B    ; RESTORE (IP)
  754.     PUSH    H
  755.     JMP    HPUSH
  756. ;
  757.     DB    85H    ; U/MOD        1.3
  758.     DB    'U/MO'    ; SAME AS U/
  759.     DB    'D'+80H
  760.     DW    USLAS-5
  761. USLMD    DW    USLAS+2
  762. ;
  763.     DB    83H    ; AND
  764.     DB    'AN'
  765.     DB    'D'+80H
  766.     DW    USLMD-8
  767. ANDD    DW    $+2    ; (S1) <- (S1) AND (S2)
  768.     POP    D
  769.     POP    H
  770.     MOV    A,E
  771.     ANA    L
  772.     MOV    L,A
  773.     MOV    A,D
  774.     ANA    H
  775.     MOV    H,A
  776.     JMP    HPUSH
  777. ;
  778.     DB    82H    ; OR
  779.     DB    'O'
  780.     DB    'R'+80H
  781.     DW    ANDD-6
  782. ORR    DW    $+2    ; (S1) <- (S1) OR (S2)
  783.     POP    D
  784.     POP    H
  785.     MOV    A,E
  786.     ORA    L
  787.     MOV    L,A
  788.     MOV    A,D
  789.     ORA    H
  790.     MOV    H,A
  791.     JMP    HPUSH
  792. ;
  793.     DB    83H    ; XOR
  794.     DB    'XO'
  795.     DB    'R'+80H
  796.     DW    ORR-5
  797. XORR    DW    $+2    ; (S1) <- (S1) XOR (S2)
  798.     POP    D
  799.     POP    H
  800.     MOV    A,E
  801.     XRA    L
  802.     MOV    L,A
  803.     MOV    A,D
  804.     XRA    H
  805.     MOV    H,A
  806.     JMP    HPUSH
  807. ;
  808.     DB    83H    ; SP@
  809.     DB    'SP'
  810.     DB    '@'+80H
  811.     DW    XORR-6
  812. SPAT    DW    $+2    ;(S1) <- (SP)
  813.     LXI    H,0
  814.     DAD    SP    ; (HL) <- (SP)
  815.     JMP    HPUSH    ; (S1) <- (HL)
  816. ;
  817.     DB    83H    ; STACK POINTER STORE
  818.     DB    'SP'
  819.     DB    '!'+80H
  820.     DW    SPAT-6
  821. SPSTO    DW    $+2    ;(SP) <- (S0) ( USER VARIABLE )
  822.     LHLD    UP    ; (HL) <- USER VAR BASE ADDR
  823.     LXI    D,6
  824.     DAD    D    ; (HL) <- S0
  825.     MOV    E,M    ; (DE) <- (S0)
  826.     INX    H
  827.     MOV    D,M
  828.     XCHG
  829.     SPHL        ; (SP) <- (S0)
  830.     JMP    NEXT
  831. ;
  832.     DB    83H    ; RP@
  833.     DB    'RP'
  834.     DB    '@'+80H
  835.     DW    SPSTO-6
  836. RPAT    DW    $+2    ;(S1) <- (RP)
  837.     LHLD    RPP
  838.     JMP    HPUSH
  839. ;
  840.     DB    83H    ; RETURN STACK POINTER STORE
  841.     DB    'RP'
  842.     DB    '!'+80H
  843.     DW    RPAT-6
  844. RPSTO    DW    $+2    ;(RP) <- (R0) ( USER VARIABLE )
  845.     LHLD    UP    ; (HL) <- USER VARIABLE BASE ADDR
  846.     LXI    D,8
  847.     DAD    D    ; (HL) <- R0
  848.     MOV    E,M    ; (DE) <- (R0)
  849.     INX    H
  850.     MOV    D,M
  851.     XCHG
  852.     SHLD    RPP    ; (RP) <- (R0)
  853.     JMP    NEXT
  854. ;
  855.     DB    82H    ; ;S
  856.     DB    ';'
  857.     DB    'S'+80H
  858.     DW    RPSTO-6
  859. SEMIS    DW    $+2    ;(IP) <- (R1)
  860.     LHLD    RPP
  861.     MOV    C,M    ; (BC) <- (R1)
  862.     INX    H
  863.     MOV    B,M
  864.     INX    H
  865.     SHLD    RPP    ; (RP) <- (RP) + 2
  866.     JMP    NEXT
  867. ;
  868.     DB    84H    ; EXIT        1.3
  869.     DB    'EXI'
  870.     DB    'T'+80H
  871.     DW    SEMIS-5
  872. EXIT    DW    SEMIS+2
  873. ;
  874.     DB    85H    ; LEAVE
  875.     DB    'LEAV'
  876.     DB    'E'+80H
  877.     DW    EXIT-7
  878. LEAVE    DW    $+2    ;LIMIT <- INDEX
  879.     LHLD    RPP
  880.     MOV    E,M    ; (DE) <- (R1) = INDEX
  881.     INX    H
  882.     MOV    D,M
  883.     INX    H
  884.     MOV    M,E    ; (R2) <- (DE) = LIMIT
  885.     INX    H
  886.     MOV    M,D
  887.     JMP    NEXT
  888. ;
  889.     DB    82H    ; >R
  890.     DB    '>'
  891.     DB    'R'+80H
  892.     DW    LEAVE-8
  893. TOR    DW    $+2    ;(R1) <- (S1)
  894.     POP    D    ; (DE) <- (S1)
  895.     LHLD    RPP
  896.     DCX    H    ; (RP) <- (RP) - 2
  897.     DCX    H
  898.     SHLD    RPP
  899.     MOV    M,E    ; ((HL)) <- (DE)
  900.     INX    H
  901.     MOV    M,D
  902.     JMP    NEXT
  903. ;
  904.     DB    82H    ; R>
  905.     DB    'R'
  906.     DB    '>'+80H
  907.     DW    TOR-5
  908. FROMR    DW    $+2    ;(S1) <- (R1)
  909.     LHLD    RPP
  910.     MOV    E,M    ; (DE) <- (R1)
  911.     INX    H
  912.     MOV    D,M
  913.     INX    H
  914.     SHLD    RPP    ; (RP) <- (RP) + 2
  915.     PUSH    D    ; (S1) <- (DE)
  916.     JMP    NEXT
  917. ;
  918.     DB    81H    ; R
  919.     DB    'R'+80H
  920.     DW    FROMR-5
  921. RR    DW    IDO+2
  922. ;
  923.     DB    82H    ; R@        1.3
  924.     DB    'R'
  925.     DB    '@'+80H
  926.     DW    RR-4
  927. RAT    DW    IDO+2
  928. ;
  929.     DB    82H    ; 0=
  930.     DB    '0'
  931.     DB    '='+80H
  932.     DW    RAT-5
  933. ZEQU    DW    $+2
  934.     POP    H    ; (HL) <- (S1)
  935.     MOV    A,L
  936.     ORA    H    ; IF (HL) = 0
  937.     LXI    H,0    ; THEN (HL) <- FALSE
  938.     JNZ    ZEQU1
  939.     INX    H    ; ELSE (HL) <- TRUE
  940. ZEQU1    JMP    HPUSH    ; (S1) <- (HL)
  941. ;
  942.     DB    83H    ; NOT        1.3
  943.     DB    'NO'
  944.     DB    'T'+80H
  945.     DW    ZEQU-5
  946. NOTT    DW    ZEQU+2
  947. ;
  948.     DB    82H    ; 0<
  949.     DB    '0'
  950.     DB    '<'+80H
  951.     DW    NOTT-6
  952. ZLESS    DW    $+2
  953.     POP    PSW    ; (A) <- (S1.HIGH)
  954.     ORA    A    ; IF (A) < 0
  955.     LXI    H,0
  956.     JP    HPUSH    ; THEN (S1) <- FALSE
  957.     INR    L
  958.     JMP    HPUSH    ; ELSE (S1) <- TRUE
  959. ;
  960.     DB    81H    ; +
  961.     DB    '+'+80H
  962.     DW    ZLESS-5
  963. PLUS    DW    $+2    ;(S1) <- (S1) + (S2)
  964.     POP    D
  965.     POP    H
  966.     DAD    D
  967.     JMP    HPUSH
  968. ;
  969.     DB    82H    ; D+    (4-2)
  970.     DB    'D'    ; XLW XHW  YLW YHW  ---  SLW SHW
  971.     DB    '+'+80H    ; S4  S3   S2  S1        S2  S1
  972.     DW    PLUS-4
  973. DPLUS    DW    $+2
  974.     LXI    H,6
  975.     DAD    SP    ; ((HL)) = XLW
  976.     MOV    E,M    ; (DE) = XLW
  977.     MOV    M,C    ; SAVE IP ON STACK
  978.     INX    H
  979.     MOV    D,M
  980.     MOV    M,B
  981.     POP    B    ; (BC) <- YHW
  982.     POP    H    ; (HL) <- YLW
  983.     DAD    D
  984.     XCHG        ; (DE) <- YLW + XLW = SUM.LW
  985.     POP    H    ; (HL) <- XHW
  986.     MOV    A,L
  987.     ADC    C
  988.     MOV    L,A    ; (HL) <- YHW + XHW + CARRY
  989.     MOV    A,H
  990.     ADC    B
  991.     MOV    H,A
  992.     POP    B    ; RESTORE IP
  993.     PUSH    D    ; (S2) <- SUM.LW
  994.     JMP    HPUSH    ; (S1) <- SUM.HW
  995. ;
  996.     DB    85H    ; MINUS
  997.     DB    'MINU'
  998.     DB    'S'+80H
  999.     DW    DPLUS-5
  1000. MINUS    DW    $+2    ;(S1) <- -(S1)    ( 2'S COMPLEMENT )
  1001.     POP    H
  1002.     MOV    A,L
  1003.     CMA
  1004.     MOV    L,A
  1005.     MOV    A,H
  1006.     CMA
  1007.     MOV    H,A
  1008.     INX    H
  1009.     JMP    HPUSH
  1010. ;
  1011.     DB    86H    ; NEGATE    1.3
  1012.     DB    'NEGAT'
  1013.     DB    'E'+80H
  1014.     DW    MINUS-8
  1015. NEG    DW    MINUS+2
  1016. ;
  1017.     DB    86H    ; DMINUS
  1018.     DB    'DMINU'
  1019.     DB    'S'+80H
  1020.     DW    NEG-9
  1021. DMINU    DW    $+2
  1022.     POP    H    ; (HL) <- HW
  1023.     POP    D    ; (DE) <- LW
  1024.     SUB    A
  1025.     SUB    E    ; (DE) <- 0 - (DE)
  1026.     MOV    E,A
  1027.     MVI    A,0
  1028.     SBB    D
  1029.     MOV    D,A
  1030.     MVI    A,0
  1031.     SBB    L    ; (HL) <- 0 - (HL)
  1032.     MOV    L,A
  1033.     MVI    A,0
  1034.     SBB    H
  1035.     MOV    H,A
  1036.     PUSH    D    ; (S2) <- LW
  1037.     JMP    HPUSH    ; (S1) <- HW
  1038. ;
  1039.     DB    84H    ; OVER
  1040.     DB    'OVE'
  1041.     DB    'R'+80H
  1042.     DW    DMINU-9
  1043. OVER    DW    $+2
  1044.     POP    D
  1045.     POP    H
  1046.     PUSH    H
  1047.     JMP    DPUSH
  1048. ;
  1049.     DB    84H    ; DROP
  1050.     DB    'DRO'
  1051.     DB    'P'+80H
  1052.     DW    OVER-7
  1053. DROP    DW    $+2
  1054.     POP    H
  1055.     JMP    NEXT
  1056. ;
  1057.     DB    84H    ; SWAP
  1058.     DB    'SWA'
  1059.     DB    'P'+80H
  1060.     DW    DROP-7
  1061. SWAP    DW    $+2
  1062.     POP    H
  1063.     XTHL
  1064.     JMP    HPUSH
  1065. ;
  1066.     DB    83H    ; DUP
  1067.     DB    'DU'
  1068.     DB    'P'+80H
  1069.     DW    SWAP-7
  1070. DUP    DW    $+2
  1071.     POP    H
  1072.     PUSH    H
  1073.     JMP    HPUSH
  1074. ;
  1075.     DB    84H    ; 2DUP
  1076.     DB    '2DU'
  1077.     DB    'P'+80H
  1078.     DW    DUP-6
  1079. TDUP    DW    $+2
  1080.     POP    H
  1081.     POP    D
  1082.     PUSH    D
  1083.     PUSH    H
  1084.     JMP    DPUSH
  1085. ;
  1086.     DB    85H    ; 2DROP        1.3
  1087.     DB    '2DRO'
  1088.     DB    'P'+80H
  1089.     DW    TDUP-7
  1090. TDROP    DW    $+2
  1091.     POP    H
  1092.     POP    H
  1093.     JMP    NEXT
  1094. ;
  1095.     DB    85H    ; 2SWAP        1.3
  1096.     DB    '2SWA'
  1097.     DB    'P'+80H
  1098.     DW    TDROP-8
  1099. TSWAP    DW    $+2
  1100. ;            NOTE: THIS WON'T WORK WITH INTERRUPTS
  1101.     POP    H    ; (HL) <- (S1)
  1102.     POP    D    ; (DE) <- (S2)
  1103.     XTHL        ; (HL) <- (S3)
  1104. ;            ; (S3) <- (HL)
  1105.     XCHG        ; (DE) <- (HL)
  1106. ;            ; (HL) <- (DE)
  1107.     INX    SP
  1108.     INX    SP
  1109.     XTHL        ; (HL) <- (S4)
  1110. ;            ; (S4) <- (HL)
  1111.     DCX    SP
  1112.     DCX    SP
  1113.     XCHG        ; (DE) <- (HL)
  1114. ;            ; (HL) <- (DE)
  1115.     JMP    DPUSH    ; (S1) <- (HL)
  1116. ;            ; (S2) <- (DE)
  1117. ;
  1118.     DB    85H    ; 2OVER
  1119.     DB    '2OVE'
  1120.     DB    'R'+80H
  1121.     DW    TSWAP-8
  1122. TOVER    DW    $+2
  1123. ;        NOTE: THIS WON'T WORK WITH INTERRUPTS
  1124.     INX    SP
  1125.     INX    SP
  1126.     INX    SP
  1127.     INX    SP
  1128.     POP    H    ; (HL) <- (S3)
  1129.     PUSH    H
  1130.     INX    SP
  1131.     INX    SP
  1132.     POP    D    ; (DE) <- (S4)
  1133.     PUSH    D
  1134.     DCX    SP
  1135.     DCX    SP
  1136.     DCX    SP
  1137.     DCX    SP
  1138.     DCX    SP
  1139.     DCX    SP
  1140.     JMP    DPUSH    ; (S1) <- (HL)
  1141. ;            ; (S2) <- (DE)
  1142. ;
  1143.     DB    82H    ; PLUS STORE
  1144.     DB    '+'
  1145.     DB    '!'+80H
  1146.     DW    TOVER-8
  1147. PSTOR    DW    $+2    ;((S1)) <- ((S1)) + (S2)
  1148.     POP    H    ; (HL) <- (S1) = ADDR
  1149.     POP    D    ; (DE) <- (S2) = INCR
  1150.     MOV    A,M    ; ((HL)) <- ((HL)) + (DE)
  1151.     ADD    E
  1152.     MOV    M,A
  1153.     INX    H
  1154.     MOV    A,M
  1155.     ADC    D
  1156.     MOV    M,A
  1157.     JMP    NEXT
  1158. ;
  1159.     DB    86H    ; TOGGLE
  1160.     DB    'TOGGL'
  1161.     DB    'E'+80H
  1162.     DW    PSTOR-5
  1163. TOGGL    DW    $+2    ;((S2)) <- ((S2)) XOR (S1)LB
  1164.     POP    D    ; (E) <- BYTE MASK
  1165.     POP    H    ; (HL) <- ADDR
  1166.     MOV    A,M
  1167.     XRA    E
  1168.     MOV    M,A    ; (ADDR) <- (ADDR) XOR (E)
  1169.     JMP    NEXT
  1170. ;
  1171.     DB    81H    ; @
  1172.     DB    '@'+80H
  1173.     DW    TOGGL-9
  1174. AT    DW    $+2    ;(S1) <- ((S1))
  1175.     POP    H    ; (HL) <- ADDR
  1176.     MOV    E,M    ; (DE) <- (ADDR)
  1177.     INX    H
  1178.     MOV    D,M
  1179.     PUSH    D    ; (S1) <- (DE)
  1180.     JMP    NEXT
  1181. ;
  1182.     DB    82H    ; C@
  1183.     DB    'C'
  1184.     DB    '@'+80H
  1185.     DW    AT-4
  1186. CAT    DW    $+2    ;(S1) <- ((S1))LB
  1187.     POP    H    ; (HL) <- ADDR
  1188.     MOV    L,M    ; (HL) <- (ADDR)LB
  1189.     MVI    H,0
  1190.     JMP    HPUSH
  1191. ;
  1192.     DB    82H    ; 2@
  1193.     DB    '2'
  1194.     DB    '@'+80H
  1195.     DW    CAT-5
  1196. TAT    DW    $+2
  1197.     POP    H    ; (HL) <- ADDR HW
  1198.     LXI    D,2
  1199.     DAD    D    ; (HL) <- ADDR LW
  1200.     MOV    E,M    ; (DE) <- LW
  1201.     INX    H
  1202.     MOV    D,M
  1203.     PUSH    D    ; (S2) <- LW
  1204.     LXI    D,-3    ; (HL) <- ADDR HW
  1205.     DAD    D
  1206.     MOV    E,M    ; (DE) <- HW
  1207.     INX    H
  1208.     MOV    D,M
  1209.     PUSH    D    ; (S1) <- HW
  1210.     JMP    NEXT
  1211. ;
  1212.     DB    81H    ; STORE
  1213.     DB    '!'+80H
  1214.     DW    TAT-5
  1215. STORE    DW    $+2    ;((S1)) <- (S2)
  1216.     POP    H    ; (HL) <- (S1) = ADDR
  1217.     POP    D    ; (DE) <- (S2) = VALUE
  1218.     MOV    M,E    ; ((HL)) <- (DE)
  1219.     INX    H
  1220.     MOV    M,D
  1221.     JMP    NEXT
  1222. ;
  1223.     DB    82H    ; C STORE
  1224.     DB    'C'
  1225.     DB    '!'+80H
  1226.     DW    STORE-4
  1227. CSTOR    DW    $+2    ;((S1))LB <- (S2)LB
  1228.     POP    H    ; (HL) <- (S1) = ADDR
  1229.     POP    D    ; (DE) <- (S2) = BYTE
  1230.     MOV    M,E    ; ((HL))LB <- (E)
  1231.     JMP    NEXT
  1232. ;
  1233.     DB    82H    ; 2 STORE
  1234.     DB    '2'
  1235.     DB    '!'+80H
  1236.     DW    CSTOR-5
  1237. TSTOR    DW    $+2
  1238.     POP    H    ; (HL) <- ADDR
  1239.     POP    D    ; (DE) <- HW
  1240.     MOV    M,E    ; (ADDR) <- HW
  1241.     INX    H
  1242.     MOV    M,D
  1243.     INX    H    ; (HL) <- ADDR LW
  1244.     POP    D    ; (DE) <- LW
  1245.     MOV    M,E    ; (ADDR+2) <- LW
  1246.     INX    H
  1247.     MOV    M,D
  1248.     JMP    NEXT
  1249. ;
  1250.     DB    0C1H    ; :
  1251.     DB    ':'+80H
  1252.     DW    TSTOR-5
  1253. COLON    DW    DOCOL
  1254.     DW    QEXEC
  1255.     DW    SCSP
  1256.     DW    CURR
  1257.     DW    AT
  1258.     DW    CONT
  1259.     DW    STORE
  1260.     DW    CREAT
  1261.     DW    RBRAC
  1262.     DW    PSCOD
  1263. ;            EXECUTION-TIME CODE:
  1264. DOCOL    LHLD    RPP    ;        1.3
  1265.     DCX    H    ; (RP) <- (RP) - 2
  1266.     DCX    H
  1267.     SHLD    RPP
  1268.     MOV    M,C
  1269.     INX    H
  1270.     MOV    M,B    ; (R1) <- (IP)
  1271.     INX    D    ; (DE) <- CFA+2 = (W)
  1272.     MOV    C,E    ; (IP) <- (DE) = (W)
  1273.     MOV    B,D
  1274.     JMP    NEXT
  1275. ;
  1276.     DB    0C1H    ; ;
  1277.     DB    ';'+80H
  1278.     DW    COLON-4
  1279. SEMI    DW    DOCOL
  1280.     DW    QCSP
  1281.     DW    COMP
  1282.     DW    SEMIS
  1283.     DW    SMUDG
  1284.     DW    LBRAC
  1285.     DW    SEMIS
  1286. ;
  1287.     DB    84H    ; NOOP
  1288.     DB    'NOO'
  1289.     DB    'P'+80H
  1290.     DW    SEMI-4
  1291. NOOP    DW    DOCOL
  1292.     DW    SEMIS
  1293.  ;
  1294.     DB    88H    ; CONSTANT
  1295.     DB    'CONSTAN'
  1296.     DB    'T'+80H
  1297.     DW    NOOP-7
  1298. CON    DW    DOCOL
  1299.     DW    CREAT
  1300.     DW    SMUDG
  1301.     DW    COMMA
  1302.     DW    PSCOD
  1303. DOCON    INX    D    ; (DE) <- PFA
  1304.     XCHG
  1305.     MOV    E,M    ; (DE) <- (PFA)
  1306.     INX    H
  1307.     MOV    D,M
  1308.     PUSH    D    ; (S1) <- (PFA)
  1309.     JMP    NEXT
  1310. ;
  1311.     DB    88H    ; VARIABLE
  1312.     DB    'VARIABL'
  1313.     DB    'E'+80H
  1314.     DW    CON-0BH
  1315. VAR    DW    DOCOL
  1316.     DW    CON
  1317.     DW    PSCOD
  1318. DOVAR    INX    D    ; (DE) <- PFA
  1319.     PUSH    D    ; (S1) <- PFA
  1320.     JMP    NEXT
  1321. ;
  1322.     DB    84H    ; USER
  1323.     DB    'USE'
  1324.     DB    'R'+80H
  1325.     DW    VAR-0BH
  1326. USER    DW    DOCOL
  1327.     DW    CON
  1328.     DW    PSCOD
  1329. DOUSE    INX    D    ; (DE) <- PFA
  1330.     XCHG
  1331.     MOV    E,M    ; (DE) <- USER VARIABLE OFFSET
  1332.     MVI    D,0
  1333.     LHLD    UP    ; (HL) <- USER VARIABLE BASE ADDR
  1334.     DAD    D    ; (HL) <- (HL) + (DE)
  1335.     JMP    HPUSH    ; (S1) <- BASE + OFFSET
  1336. ;
  1337.     DB    81H    ; 0
  1338.     DB    '0'+80H
  1339.     DW    USER-7
  1340. ZERO    DW    DOCON
  1341.     DW    0
  1342. ;
  1343.     DB    81H    ; 1
  1344.     DB    '1'+80H
  1345.     DW    ZERO-4
  1346. ONE    DW    DOCON
  1347.     DW    1
  1348. ;
  1349.     DB    81H    ; 2
  1350.     DB    '2'+80H
  1351.     DW    ONE-4
  1352. TWO    DW    DOCON
  1353.     DW    2
  1354. ;
  1355.     DB    81H    ; 3
  1356.     DB    '3'+80H
  1357.     DW    TWO-4
  1358. THREE    DW    DOCON
  1359.     DW    3
  1360. ;
  1361.     DB    82H    ; BL
  1362.     DB    'B'
  1363.     DB    'L'+80H
  1364.     DW    THREE-4
  1365. BL    DW    DOCON
  1366.     DW    20H
  1367. ;
  1368.     DB    83H    ; C/L ( CHARACTERS/LINE )
  1369.     DB    'C/'
  1370.     DB    'L'+80H
  1371.     DW    BL-5
  1372. CSLL    DW    DOCON
  1373.     DW    64
  1374. ;
  1375.     DB    85H    ; FIRST
  1376.     DB    'FIRS'
  1377.     DB    'T'+80H
  1378.     DW    CSLL-6
  1379. FIRST    DW    DOCON
  1380.     DW    BUF1
  1381. ;
  1382.     DB    85H    ; LIMIT
  1383.     DB    'LIMI'
  1384.     DB    'T'+80H
  1385.     DW    FIRST-8
  1386. LIMIT    DW    DOCON
  1387.     DW    EM
  1388. ;
  1389.     DB    85H    ; B/BUF ( BYTES/BUFFER )
  1390.     DB    'B/BU'
  1391.     DB    'F'+80H
  1392.     DW    LIMIT-8
  1393. BBUF    DW    DOCON
  1394.     DW    KBBUF
  1395. ;
  1396.     DB    85H    ; B/SCR ( BUFFERS/SCREEN )
  1397.     DB    'B/SC'
  1398.     DB    'R'+80H
  1399.     DW    BBUF-8
  1400. BSCR    DW    DOCON
  1401.     DW    1024/KBBUF    ; 1024 BYTES/SCREEN
  1402. ;
  1403.     DB    87H    ; +ORIGIN
  1404.     DB    '+ORIGI'
  1405.     DB    'N'+80H
  1406.     DW    BSCR-8
  1407. PORIG    DW    DOCOL
  1408.     DW    LIT
  1409.     DW    ORIG
  1410.     DW    PLUS
  1411.     DW    SEMIS
  1412. ;
  1413. ;    USER VARIABLES
  1414. ;
  1415.     DB    82H    ; S0
  1416.     DB    'S'
  1417.     DB    '0'+80H
  1418.     DW    PORIG-0AH
  1419. SZERO    DW    DOUSE
  1420.     DB    6
  1421. ;
  1422.     DB    82H    ; R0
  1423.     DB    'R'
  1424.     DB    '0'+80H
  1425.     DW    SZERO-5
  1426. RZERO    DW    DOUSE
  1427.     DB    8
  1428. ;
  1429.     DB    83H    ; TIB
  1430.     DB    'TI'
  1431.     DB    'B'+80H
  1432.     DW    RZERO-5
  1433. TIB    DW    DOUSE
  1434.     DB    0AH
  1435. ;
  1436.     DB    85H    ; WIDTH
  1437.     DB    'WIDT'
  1438.     DB    'H'+80H
  1439.     DW    TIB-6
  1440. WIDTH    DW    DOUSE
  1441.     DB    0CH
  1442. ;
  1443.     DB    87H    ; WARNING
  1444.     DB    'WARNIN'
  1445.     DB    'G'+80H
  1446.     DW    WIDTH-8
  1447. WARN    DW    DOUSE
  1448.     DB    0EH
  1449. ;
  1450.     DB    85H    ; FENCE
  1451.     DB    'FENC'
  1452.     DB    'E'+80H
  1453.     DW    WARN-0AH
  1454. FENCE    DW    DOUSE
  1455.     DB    10H
  1456. ;
  1457.     DB    82H    ; DP
  1458.     DB    'D'
  1459.     DB    'P'+80H
  1460.     DW    FENCE-8
  1461. DP    DW    DOUSE
  1462.     DB    12H
  1463. ;
  1464.     DB    88H    ; VOC-LINK
  1465.     DB    'VOC-LIN'
  1466.     DB    'K'+80H
  1467.     DW    DP-5
  1468. VOCL    DW    DOUSE
  1469.     DB    14H
  1470. ;
  1471.     DB    83H    ; BLK
  1472.     DB    'BL'
  1473.     DB    'K'+80H
  1474.     DW    VOCL-0BH
  1475. BLK    DW    DOUSE
  1476.     DB    16H
  1477. ;
  1478.     DB    82H    ; IN
  1479.     DB    'I'
  1480.     DB    'N'+80H
  1481.     DW    BLK-6
  1482. INN    DW    DOUSE
  1483.     DB    18H
  1484. ;
  1485.     DB    83H    ; OUT
  1486.     DB    'OU'
  1487.     DB    'T'+80H
  1488.     DW    INN-5
  1489. OUTT    DW    DOUSE
  1490.     DB    1AH
  1491. ;
  1492.     DB    83H    ; SCR
  1493.     DB    'SC'
  1494.     DB    'R'+80H
  1495.     DW    OUTT-6
  1496. SCR    DW    DOUSE
  1497.     DB    1CH
  1498. ;
  1499.     DB    86H    ; OFFSET
  1500.     DB    'OFFSE'
  1501.     DB    'T'+80H
  1502.     DW    SCR-6
  1503. OFSET    DW    DOUSE
  1504.     DB    1EH
  1505. ;
  1506.     DB    87H    ; CONTEXT
  1507.     DB    'CONTEX'
  1508.     DB    'T'+80H
  1509.     DW    OFSET-9
  1510. CONT    DW    DOUSE
  1511.     DB    20H
  1512. ;
  1513.     DB    87H    ; CURRENT
  1514.     DB    'CURREN'
  1515.     DB    'T'+80H
  1516.     DW    CONT-0AH
  1517. CURR    DW    DOUSE
  1518.     DB    22H
  1519. ;
  1520.     DB    85H    ; STATE
  1521.     DB    'STAT'
  1522.     DB    'E'+80H
  1523.     DW    CURR-0AH
  1524. STATE    DW    DOUSE
  1525.     DB    24H
  1526. ;
  1527.     DB    84H    ; BASE
  1528.     DB    'BAS'
  1529.     DB    'E'+80H
  1530.     DW    STATE-8
  1531. BASE    DW    DOUSE
  1532.     DB    26H
  1533. ;
  1534.     DB    83H    ; DPL
  1535.     DB    'DP'
  1536.     DB    'L'+80H
  1537.     DW    BASE-7
  1538. DPL    DW    DOUSE
  1539.     DB    28H
  1540. ;
  1541.     DB    83H    ; FLD
  1542.     DB    'FL'
  1543.     DB    'D'+80H
  1544.     DW    DPL-6
  1545. FLD    DW    DOUSE
  1546.     DB    2AH
  1547. ;
  1548.     DB    83H    ; CSP
  1549.     DB    'CS'
  1550.     DB    'P'+80H
  1551.     DW    FLD-6
  1552. CSPP    DW    DOUSE
  1553.     DB    2CH
  1554. ;
  1555.     DB    82H    ; R#
  1556.     DB    'R'
  1557.     DB    '#'+80H
  1558.     DW    CSPP-6
  1559. RNUM    DW    DOUSE
  1560.     DB    2EH
  1561. ;
  1562.     DB    83H    ; HLD
  1563.     DB    'HL'
  1564.     DB    'D'+80H
  1565.     DW    RNUM-5
  1566. HLD    DW    DOUSE
  1567.     DB    30H
  1568. ;
  1569. ;    END OF USER VARIABLES
  1570. ;
  1571.     DB    82H    ; 1+
  1572.     DB    '1'
  1573.     DB    '+'+80H
  1574.     DW    HLD-6
  1575. ONEP    DW    $+2
  1576.     POP    H
  1577.     INX    H
  1578.     JMP    HPUSH
  1579. ;
  1580.     DB    82H    ; 2+
  1581.     DB    '2'
  1582.     DB    '+'+80H
  1583.     DW    ONEP-5
  1584. TWOP    DW    $+2
  1585.     POP    H
  1586.     INX    H
  1587.     INX    H
  1588.     JMP    HPUSH
  1589. ;
  1590.     DB    82H    ; 1-        1.3
  1591.     DB    '1'
  1592.     DB    '-'+80H
  1593.     DW    TWOP-5
  1594. ONEM    DW    $+2
  1595.     POP    H
  1596.     DCX    H
  1597.     JMP    HPUSH
  1598. ;
  1599.     DB    82H    ; 2-        1.3
  1600.     DB    '2'
  1601.     DB    '-'+80H
  1602.     DW    ONEM-5
  1603. TWOM    DW    $+2
  1604.     POP    H
  1605.     DCX    H
  1606.     DCX    H
  1607.     JMP    HPUSH
  1608. ;
  1609.     DB    82H    ; 2*        1.3
  1610.     DB    '2'
  1611.     DB    '*'+80H
  1612.     DW    TWOM-5
  1613. TWOT    DW    $+2
  1614.     POP    H
  1615.     STC
  1616.     CMC
  1617.     MOV    A,L
  1618.     RAL    
  1619.     MOV    L,A
  1620.     MOV    A,H
  1621.     RAL
  1622.     MOV    H,A
  1623.     JMP    HPUSH
  1624. ;
  1625.     DB    82H    ; 2/        1.3
  1626.     DB    '2'
  1627.     DB    '/'+80H
  1628.     DW    TWOT-5
  1629. TWOD    DW    $+2
  1630.     POP    H
  1631.     MOV    A,H
  1632.     RLC
  1633.     RRC
  1634.     RAR
  1635.     MOV    H,A
  1636.     MOV    A,L
  1637.     RAR
  1638.     MOV    L,A
  1639.     JMP    HPUSH
  1640. ;
  1641.     DB    84H    ; HERE
  1642.     DB    'HER'
  1643.     DB    'E'+80H
  1644.     DW    TWOD-5
  1645. HERE    DW    DOCOL
  1646.     DW    DP
  1647.     DW    AT
  1648.     DW    SEMIS
  1649. ;
  1650.     DB    85H    ; ALLOT
  1651.     DB    'ALLO'
  1652.     DB    'T'+80H
  1653.     DW    HERE-7
  1654. ALLOT    DW    DOCOL
  1655.     DW    DP
  1656.     DW    PSTOR
  1657.     DW    SEMIS
  1658. ;
  1659.     DB    81H    ; ,
  1660.     DB    ','+80H
  1661.     DW    ALLOT-8
  1662. COMMA    DW    DOCOL
  1663.     DW    HERE
  1664.     DW    STORE
  1665.     DW    TWO
  1666.     DW    ALLOT
  1667.     DW    SEMIS
  1668. ;
  1669.     DB    82H    ; C,
  1670.     DB    'C'
  1671.     DB    ','+80H
  1672.     DW    COMMA-4
  1673. CCOMM    DW    DOCOL
  1674.     DW    HERE
  1675.     DW    CSTOR
  1676.     DW    ONE
  1677.     DW    ALLOT
  1678.     DW    SEMIS
  1679. ;
  1680. ;    SUBROUTINE USED BY - AND <
  1681. ;            ; (HL) <- (HL) - (DE)
  1682. SSUB    MOV    A,L    ; LB
  1683.     SUB    E
  1684.     MOV    L,A
  1685.     MOV    A,H    ; HB
  1686.     SBB    D
  1687.     MOV    H,A
  1688.     RET
  1689. ;
  1690.     DB    81H    ; -
  1691.     DB    '-'+80H
  1692.     DW    CCOMM-5
  1693. SUBB    DW    $+2
  1694.     POP    D    ; (DE) <- (S1) = Y
  1695.     POP    H    ; (HL) <- (S2) = X
  1696.     CALL    SSUB
  1697.     JMP    HPUSH    ; (S1) <- X - Y
  1698. ;
  1699.     DB    81H    ; =
  1700.     DB    '='+80H
  1701.     DW    SUBB-4
  1702. EQUAL    DW    DOCOL
  1703.     DW    SUBB
  1704.     DW    ZEQU
  1705.     DW    SEMIS
  1706. ;
  1707.     DB    82H    ; <>        1.3
  1708.     DB    '<'
  1709.     DB    '>'+80H
  1710.     DW    EQUAL-4
  1711. NEQU    DW    DOCOL
  1712.     DW    SUBB
  1713.     DW    ZEQU
  1714.     DW    ZEQU
  1715.     DW    SEMIS
  1716. ;
  1717.     DB    84H    ; =NOT        1.3
  1718.     DB    '=NO'
  1719.     DB    'T'+80H
  1720.     DW    NEQU-5
  1721. ENOT    DW    DOCOL
  1722.     DW    NEQU
  1723.     DW    SEMIS
  1724. ;
  1725.     DB    81H    ; <
  1726.     DB    '<'+80H        ; X  <  Y
  1727.     DW    ENOT-7        ; S2    S1
  1728. LESS    DW    $+2
  1729.     POP    D    ; (DE) <- (S1) = Y
  1730.     POP    H    ; (HL) <- (S2) = X
  1731.     MOV    A,D    ; IF X & Y HAVE SAME SIGNS
  1732.     XRA    H
  1733.     JM    LES1
  1734.     CALL    SSUB    ; (HL) <- X - Y
  1735. LES1    INR    H    ; IF (HL) >= 0
  1736.     DCR    H
  1737.     JM    LES2
  1738.     LXI    H,0    ; THEN X >= Y
  1739.     JMP    HPUSH    ; (S1) <- FALSE
  1740. LES2    LXI    H,1    ; ELSE X < Y
  1741.     JMP    HPUSH    ; (S1) <- TRUE
  1742. ;
  1743.     DB    82H    ; U< ( UNSIGNED < )
  1744.     DB    'U'
  1745.     DB    '<'+80H
  1746.     DW    LESS-4
  1747. ULESS    DW    DOCOL,TDUP
  1748.     DW    XORR,ZLESS
  1749.     DW    ZBRAN,ULES1-$    ; IF
  1750.     DW    DROP,ZLESS
  1751.     DW    ZEQU
  1752.     DW    BRAN,ULES2-$
  1753. ULES1    DW    SUBB,ZLESS    ; ELSE
  1754. ULES2    DW    SEMIS        ; ENDIF
  1755. ;
  1756.     DB    81H    ; >
  1757.     DB    '>'+80H
  1758.     DW    ULESS-5
  1759. GREAT    DW    DOCOL
  1760.     DW    SWAP
  1761.     DW    LESS
  1762.     DW    SEMIS
  1763. ;
  1764.     DB    82H    ; 0>        1.3
  1765.     DB    '0'
  1766.     DB    '>'+80H
  1767.     DW    GREAT-4
  1768. ZGREA    DW    DOCOL
  1769.     DW    ZERO,GREAT
  1770.     DW    SEMIS
  1771. ;
  1772.     DB    83H    ; ROT
  1773.     DB    'RO'
  1774.     DB    'T'+80H
  1775.     DW    ZGREA-5
  1776. ROT    DW    $+2
  1777.     POP    D
  1778.     POP    H
  1779.     XTHL
  1780.     JMP    DPUSH
  1781. ;
  1782.     DB    84H    ; -ROT        1.3
  1783.     DB    '-RO'
  1784.     DB    'T'+80H
  1785.     DW    ROT-6
  1786. DROT    DW    DOCOL
  1787.     DW    ROT,ROT
  1788.     DW    SEMIS
  1789. ;
  1790.     DB    85H    ; SPACE
  1791.     DB    'SPAC'
  1792.     DB    'E'+80H
  1793.     DW    DROT-7
  1794. SPACE    DW    DOCOL
  1795.     DW    BL
  1796.     DW    EMIT
  1797.     DW    SEMIS
  1798. ;
  1799.     DB    84H    ; -DUP
  1800.     DB    '-DU'
  1801.     DB    'P'+80H
  1802.     DW    SPACE-8
  1803. DDUP    DW    DOCOL
  1804.     DW    DUP
  1805.     DW    ZBRAN    ; IF
  1806.     DW    DDUP1-$
  1807.     DW    DUP    ; ENDIF
  1808. DDUP1    DW    SEMIS
  1809. ;
  1810.     DB    84H    ; ?DUP        1.3
  1811.     DB    '?DU'
  1812.     DB    'P'+80H
  1813.     DW    DDUP-7
  1814. QDUP    DW    DDUP+2
  1815. ;
  1816.     DB    88H    ; TRAVERSE
  1817.     DB    'TRAVERS'
  1818.     DB    'E'+80H
  1819.     DW    QDUP-7
  1820. TRAV    DW    DOCOL
  1821.     DW    SWAP
  1822. TRAV1    DW    OVER    ; BEGIN
  1823.     DW    PLUS
  1824.     DW    LIT
  1825.     DW    7FH
  1826.     DW    OVER
  1827.     DW    CAT
  1828.     DW    LESS
  1829.     DW    ZBRAN    ; UNTIL
  1830.     DW    TRAV1-$
  1831.     DW    SWAP
  1832.     DW    DROP
  1833.     DW    SEMIS
  1834. ;
  1835.     DB    86H    ; LATEST
  1836.     DB    'LATES'
  1837.     DB    'T'+80H
  1838.     DW    TRAV-0BH
  1839. LATES    DW    DOCOL
  1840.     DW    CURR
  1841.     DW    AT
  1842.     DW    AT
  1843.     DW    SEMIS
  1844. ;
  1845.     DB    83H    ; LFA
  1846.     DB    'LF'
  1847.     DB    'A'+80H
  1848.     DW    LATES-9
  1849. LFA    DW    DOCOL
  1850.     DW    LIT
  1851.     DW    4
  1852.     DW    SUBB
  1853.     DW    SEMIS
  1854. ;
  1855.     DB    83H    ; CFA
  1856.     DB    'CF'
  1857.     DB    'A'+80H
  1858.     DW    LFA-6
  1859. CFA    DW    DOCOL
  1860.     DW    TWO
  1861.     DW    SUBB
  1862.     DW    SEMIS
  1863. ;
  1864.     DB    83H    ; NFA
  1865.     DB    'NF'
  1866.     DB    'A'+80H
  1867.     DW    CFA-6
  1868. NFA    DW    DOCOL
  1869.     DW    LIT
  1870.     DW    5
  1871.     DW    SUBB
  1872.     DW    LIT
  1873.     DW    -1
  1874.     DW    TRAV
  1875.     DW    SEMIS
  1876. ;
  1877.     DB    83H    ; PFA
  1878.     DB    'PF'
  1879.     DB    'A'+80H
  1880.     DW    NFA-6
  1881. PFA    DW    DOCOL
  1882.     DW    ONE
  1883.     DW    TRAV
  1884.     DW    LIT
  1885.     DW    5
  1886.     DW    PLUS
  1887.     DW    SEMIS
  1888. ;
  1889.     DB    84H    ; STORE CSP
  1890.     DB    '!CS'
  1891.     DB    'P'+80H
  1892.     DW    PFA-6
  1893. SCSP    DW    DOCOL
  1894.     DW    SPAT
  1895.     DW    CSPP
  1896.     DW    STORE
  1897.     DW    SEMIS
  1898. ;
  1899.     DB    86H    ; ?ERROR
  1900.     DB    '?ERRO'
  1901.     DB    'R'+80H
  1902.     DW    SCSP-7
  1903. QERR    DW    DOCOL
  1904.     DW    SWAP
  1905.     DW    ZBRAN    ; IF
  1906.     DW    QERR1-$
  1907.     DW    ERROR
  1908.     DW    BRAN    ; ELSE
  1909.     DW    QERR2-$
  1910. QERR1    DW    DROP    ; ENDIF
  1911. QERR2    DW    SEMIS
  1912. ;
  1913.     DB    85H    ; ?COMP
  1914.     DB    '?COM'
  1915.     DB    'P'+80H
  1916.     DW    QERR-9
  1917. QCOMP    DW    DOCOL
  1918.     DW    STATE
  1919.     DW    AT
  1920.     DW    ZEQU
  1921.     DW    LIT
  1922.     DW    11H
  1923.     DW    QERR
  1924.     DW    SEMIS
  1925. ;
  1926.     DB    85H    ; ?EXEC
  1927.     DB    '?EXE'
  1928.     DB    'C'+80H
  1929.     DW    QCOMP-8
  1930. QEXEC    DW    DOCOL
  1931.     DW    STATE
  1932.     DW    AT
  1933.     DW    LIT
  1934.     DW    12H
  1935.     DW    QERR
  1936.     DW    SEMIS
  1937. ;
  1938.     DB    86H    ; ?PAIRS
  1939.     DB    '?PAIR'
  1940.     DB    'S'+80H
  1941.     DW    QEXEC-8
  1942. QPAIR    DW    DOCOL
  1943.     DW    SUBB
  1944.     DW    LIT
  1945.     DW    13H
  1946.     DW    QERR
  1947.     DW    SEMIS
  1948. ;
  1949.     DB    84H    ; ?CSP
  1950.     DB    '?CS'
  1951.     DB    'P'+80H
  1952.     DW    QPAIR-9
  1953. QCSP    DW    DOCOL
  1954.     DW    SPAT
  1955.     DW    CSPP
  1956.     DW    AT
  1957.     DW    SUBB
  1958.     DW    LIT
  1959.     DW    14H
  1960.     DW    QERR
  1961.     DW    SEMIS
  1962. ;
  1963.     DB    88H    ; ?LOADING
  1964.     DB    '?LOADIN'
  1965.     DB    'G'+80H
  1966.     DW    QCSP-7
  1967. QLOAD    DW    DOCOL
  1968.     DW    BLK
  1969.     DW    AT
  1970.     DW    ZEQU
  1971.     DW    LIT
  1972.     DW    16H
  1973.     DW    QERR
  1974.     DW    SEMIS
  1975. ;
  1976.     DB    87H    ; COMPILE
  1977.     DB    'COMPIL'
  1978.     DB    'E'+80H
  1979.     DW    QLOAD-0BH
  1980. COMP    DW    DOCOL
  1981.     DW    QCOMP
  1982.     DW    FROMR
  1983.     DW    DUP
  1984.     DW    TWOP
  1985.     DW    TOR
  1986.     DW    AT
  1987.     DW    COMMA
  1988.     DW    SEMIS
  1989. ;
  1990.     DB    0C1H    ; [
  1991.     DB    '['+80H
  1992.     DW    COMP-0AH
  1993. LBRAC    DW    DOCOL
  1994.     DW    ZERO
  1995.     DW    STATE
  1996.     DW    STORE
  1997.     DW    SEMIS
  1998. ;
  1999.     DB    81H    ; ]
  2000.     DB    ']'+80H
  2001.     DW    LBRAC-4
  2002. RBRAC    DW    DOCOL
  2003.     DW    LIT,0C0H
  2004.     DW    STATE,STORE
  2005.     DW    SEMIS
  2006. ;
  2007.     DB    86H    ; SMUDGE
  2008.     DB    'SMUDG'
  2009.     DB    'E'+80H
  2010.     DW    RBRAC-4
  2011. SMUDG    DW    DOCOL
  2012.     DW    LATES
  2013.     DW    LIT
  2014.     DW    20H
  2015.     DW    TOGGL
  2016.     DW    SEMIS
  2017. ;
  2018.     DB    83H    ; HEX
  2019.     DB    'HE'
  2020.     DB    'X'+80H
  2021.     DW    SMUDG-9
  2022. HEX    DW    DOCOL
  2023.     DW    LIT
  2024.     DW    10H
  2025.     DW    BASE
  2026.     DW    STORE
  2027.     DW    SEMIS
  2028. ;
  2029.     DB    87H    ; DECIMAL
  2030.     DB    'DECIMA'
  2031.     DB    'L'+80H
  2032.     DW    HEX-6
  2033. DEC    DW    DOCOL
  2034.     DW    LIT
  2035.     DW    0AH
  2036.     DW    BASE
  2037.     DW    STORE
  2038.     DW    SEMIS
  2039. ;
  2040.     DB    86H    ; BINARY    1.3
  2041.     DB    'BINAR'
  2042.     DB    'Y'+80H
  2043.     DW    DEC-10
  2044. BIN    DW    DOCOL
  2045.     DW    LIT,2
  2046.     DW    BASE,STORE
  2047.     DW    SEMIS
  2048. ;
  2049.     DB    87H    ; (;CODE)
  2050.     DB    '(;CODE'
  2051.     DB    ')'+80H
  2052.     DW    BIN-9
  2053. PSCOD    DW    DOCOL
  2054.     DW    FROMR
  2055.     DW    LATES
  2056.     DW    PFA
  2057.     DW    CFA
  2058.     DW    STORE
  2059.     DW    SEMIS
  2060. ;
  2061.     DB    0C5H    ; ;CODE
  2062.     DB    ';COD'
  2063.     DB    'E'+80H
  2064.     DW    PSCOD-0AH
  2065. SEMIC    DW    DOCOL
  2066.     DW    QCSP
  2067.     DW    COMP
  2068.     DW    PSCOD
  2069.     DW    LBRAC
  2070. SEMI1    DW    NOOP    ; ( ASSEMBLER )
  2071.     DW    SEMIS
  2072. ;
  2073.     DB    87H    ; <BUILDS
  2074.     DB    '<BUILD'
  2075.     DB    'S'+80H
  2076.     DW    SEMIC-8
  2077. BUILD    DW    DOCOL
  2078.     DW    ZERO
  2079.     DW    CON
  2080.     DW    SEMIS
  2081. ;
  2082.     DB    85H    ; DOES>
  2083.     DB    'DOES'
  2084.     DB    '>'+80H
  2085.     DW    BUILD-0AH
  2086. DOES    DW    DOCOL
  2087.     DW    FROMR
  2088.     DW    LATES
  2089.     DW    PFA
  2090.     DW    STORE
  2091.     DW    PSCOD
  2092. DODOE    LHLD    RPP    ; (HL) <- (RP)
  2093.     DCX    H
  2094.     MOV    M,B    ; (R1) <- (IP) = PFA = (SUBSTITUTE CFA)
  2095.     DCX    H
  2096.     MOV    M,C
  2097.     SHLD    RPP    ; (RP) <- (RP) - 2
  2098.     INX    D    ; (DE) <- PFA = (SUBSTITUTE CFA)
  2099.     XCHG
  2100.     MOV    C,M    ; (IP) <- (SUBSTITUTE CFA)
  2101.     INX    H
  2102.     MOV    B,M
  2103.     INX    H
  2104.     JMP    HPUSH    ; (S1) <- PFA+2 = SUBSTITUTE PFA
  2105. ;
  2106.     DB    85H    ; COUNT
  2107.     DB    'COUN'
  2108.     DB    'T'+80H
  2109.     DW    DOES-8
  2110. COUNT    DW    DOCOL
  2111.     DW    DUP
  2112.     DW    ONEP
  2113.     DW    SWAP
  2114.     DW    CAT
  2115.     DW    SEMIS
  2116. ;
  2117.     DB    84H    ; TYPE
  2118.     DB    'TYP'
  2119.     DB    'E'+80H
  2120.     DW    COUNT-8
  2121. TYPE    DW    DOCOL
  2122.     DW    DDUP
  2123.     DW    ZBRAN    ; IF
  2124.     DW    TYPE1-$
  2125.     DW    OVER
  2126.     DW    PLUS
  2127.     DW    SWAP
  2128.     DW    XDO    ; DO
  2129. TYPE2    DW    IDO
  2130.     DW    CAT
  2131.     DW    EMIT
  2132.     DW    XLOOP    ; LOOP
  2133.     DW    TYPE2-$
  2134.     DW    BRAN    ; ELSE
  2135.     DW    TYPE3-$
  2136. TYPE1    DW    DROP    ; ENDIF
  2137. TYPE3    DW    SEMIS
  2138. ;
  2139.     DB    89H    ; -TRAILING
  2140.     DB    '-TRAILIN'
  2141.     DB    'G'+80H
  2142.     DW    TYPE-7
  2143. DTRAI    DW    DOCOL
  2144.     DW    DUP
  2145.     DW    ZERO
  2146.     DW    XDO    ; DO
  2147. DTRA1    DW    OVER
  2148.     DW    OVER
  2149.     DW    PLUS
  2150.     DW    ONE
  2151.     DW    SUBB
  2152.     DW    CAT
  2153.     DW    BL
  2154.     DW    SUBB
  2155.     DW    ZBRAN    ; IF
  2156.     DW    DTRA2-$
  2157.     DW    LEAVE
  2158.     DW    BRAN    ; ELSE
  2159.     DW    DTRA3-$
  2160. DTRA2    DW    ONE
  2161.     DW    SUBB    ; ENDIF
  2162. DTRA3    DW    XLOOP    ; LOOP
  2163.     DW    DTRA1-$
  2164.     DW    SEMIS
  2165. ;
  2166.     DB    84H    ; (.")
  2167.     DB    '(."'
  2168.     DB    ')'+80H
  2169.     DW    DTRAI-0CH
  2170. PDOTQ    DW    DOCOL
  2171.     DW    RR
  2172.     DW    COUNT
  2173.     DW    DUP
  2174.     DW    ONEP
  2175.     DW    FROMR
  2176.     DW    PLUS
  2177.     DW    TOR
  2178.     DW    TYPE
  2179.     DW    SEMIS
  2180. ;
  2181.     DB    0C2H    ; ."
  2182.     DB    '.'
  2183.     DB    '"'+80H
  2184.     DW    PDOTQ-7
  2185. DOTQ    DW    DOCOL
  2186.     DW    LIT
  2187.     DW    22H
  2188.     DW    STATE
  2189.     DW    AT
  2190.     DW    ZBRAN    ; IF
  2191.     DW    DOTQ1-$
  2192.     DW    COMP
  2193.     DW    PDOTQ
  2194.     DW    WORD
  2195.     DW    HERE
  2196.     DW    CAT
  2197.     DW    ONEP
  2198.     DW    ALLOT
  2199.     DW    BRAN    ; ELSE
  2200.     DW    DOTQ2-$
  2201. DOTQ1    DW    WORD
  2202.     DW    HERE
  2203.     DW    COUNT
  2204.     DW    TYPE    ; ENDIF
  2205. DOTQ2    DW    SEMIS
  2206. ;
  2207.     DB    86H    ; EXPECT
  2208.     DB    'EXPEC'
  2209.     DB    'T'+80H
  2210.     DW    DOTQ-5
  2211. EXPEC    DW    DOCOL
  2212.     DW    OVER
  2213.     DW    PLUS
  2214.     DW    OVER
  2215.     DW    XDO    ; DO
  2216. EXPE1    DW    KEY
  2217.     DW    DUP
  2218.     DW    LIT
  2219.     DW    0EH
  2220.     DW    PORIG
  2221.     DW    AT
  2222.     DW    EQUAL
  2223.     DW    ZBRAN    ; IF
  2224.     DW    EXPE2-$
  2225.     DW    DROP
  2226.     DW    DUP
  2227.     DW    IDO
  2228.     DW    EQUAL
  2229.     DW    DUP
  2230.     DW    FROMR
  2231.     DW    TWO
  2232.     DW    SUBB
  2233.     DW    PLUS
  2234.     DW    TOR
  2235.     DW    ZBRAN    ; IF
  2236.     DW    EXPE6-$
  2237.     DW    LIT
  2238.     DW    BELL
  2239.     DW    BRAN    ; ELSE
  2240.     DW    EXPE7-$
  2241. EXPE6    DW    LIT
  2242.     DW    BSOUT    ; ENDIF
  2243. EXPE7    DW    BRAN    ; ELSE
  2244.     DW    EXPE3-$
  2245. EXPE2    DW    DUP
  2246.     DW    LIT
  2247.     DW    0DH
  2248.     DW    EQUAL
  2249.     DW    ZBRAN    ; IF
  2250.     DW    EXPE4-$
  2251.     DW    LEAVE
  2252.     DW    DROP
  2253.     DW    BL
  2254.     DW    ZERO
  2255.     DW    BRAN    ; ELSE
  2256.     DW    EXPE5-$
  2257. EXPE4    DW    DUP    ; ENDIF
  2258. EXPE5    DW    IDO
  2259.     DW    CSTOR
  2260.     DW    ZERO
  2261.     DW    IDO
  2262.     DW    ONEP
  2263.     DW    STORE    ; ENDIF
  2264. EXPE3    DW    EMIT
  2265.     DW    XLOOP    ; LOOP
  2266.     DW    EXPE1-$
  2267.     DW    DROP
  2268.     DW    SEMIS
  2269. ;
  2270.     DB    85H    ; QUERY
  2271.     DB    'QUER'
  2272.     DB    'Y'+80H
  2273.     DW    EXPEC-9
  2274. QUERY    DW    DOCOL
  2275.     DW    TIB
  2276.     DW    AT
  2277.     DW    LIT
  2278.     DW    50H
  2279.     DW    EXPEC
  2280.     DW    ZERO
  2281.     DW    INN
  2282.     DW    STORE
  2283.     DW    SEMIS
  2284. ;
  2285. ;              THE NULL WORD
  2286. ;          LISTED AS   X   IN FORTH SOURCE
  2287.     DB    0C1H    ; 0
  2288.     DB    80H
  2289.     DW    QUERY-8
  2290. NULL    DW    DOCOL
  2291.     DW    BLK
  2292.     DW    AT
  2293.     DW    ZBRAN    ; IF
  2294.     DW    NULL1-$
  2295. ;    FOLLOWING NOT NEEDED IF KBBUF = 1024
  2296. ;    DW    ONE
  2297. ;    DW    BLK
  2298. ;    DW    PSTOR
  2299. ;    DW    ZERO
  2300. ;    DW    INN
  2301. ;    DW    STORE
  2302. ;    DW    BLK
  2303. ;    DW    AT
  2304. ;    DW    BSCR
  2305. ;    DW    ONE
  2306. ;    DW    SUBB
  2307. ;    DW    ANDD
  2308. ;    DW    ZEQU
  2309. ;    DW    ZBRAN    ; IF
  2310. ;    DW    NULL2-$
  2311. ;
  2312.     DW    QEXEC
  2313. ;
  2314. ;    DW    FROMR
  2315. ;    DW    DROP    ; ENDIF
  2316. ;NULL2    DW    BRAN    ; ELSE
  2317. ;    DW    NULL3-$
  2318. ;
  2319. NULL1    DW    FROMR
  2320.     DW    DROP    ; ENDIF
  2321. NULL3    DW    SEMIS
  2322. ;
  2323.     DB    84H    ; FILL
  2324.     DB    'FIL'
  2325.     DB    'L'+80H
  2326.     DW    NULL-4
  2327. FILL    DW    $+2
  2328.     MOV    L,C
  2329.     MOV    H,B
  2330.     POP    D
  2331.     POP    B
  2332.     XTHL
  2333.     XCHG
  2334. FILL1    MOV    A,B    ; BEGIN
  2335.     ORA    C
  2336.     JZ    FILL2    ; WHILE
  2337.     MOV    A,L
  2338.     STAX    D
  2339.     INX    D
  2340.     DCX    B
  2341.     JMP    FILL1    ; REPEAT
  2342. FILL2    POP    B
  2343.     JMP    NEXT
  2344. ;
  2345.     DB    85H    ; ERASE
  2346.     DB    'ERAS'
  2347.     DB    'E'+80H
  2348.     DW    FILL-7
  2349. ERASEE    DW    DOCOL
  2350.     DW    ZERO
  2351.     DW    FILL
  2352.     DW    SEMIS
  2353. ;
  2354.     DB    86H    ; BLANKS
  2355.     DB    'BLANK'
  2356.     DB    'S'+80H
  2357.     DW    ERASEE-8
  2358. BLANK    DW    DOCOL
  2359.     DW    BL
  2360.     DW    FILL
  2361.     DW    SEMIS
  2362. ;
  2363.     DB    84H    ; HOLD
  2364.     DB    'HOL'
  2365.     DB    'D'+80H
  2366.     DW    BLANK-9
  2367. HOLD    DW    DOCOL
  2368.     DW    LIT
  2369.     DW    -1
  2370.     DW    HLD
  2371.     DW    PSTOR
  2372.     DW    HLD
  2373.     DW    AT
  2374.     DW    CSTOR
  2375.     DW    SEMIS
  2376. ;
  2377.     DB    83H    ; PAD
  2378.     DB    'PA'
  2379.     DB    'D'+80H
  2380.     DW    HOLD-7
  2381. PAD    DW    DOCOL
  2382.     DW    HERE
  2383.     DW    LIT
  2384.     DW    44H
  2385.     DW    PLUS
  2386.     DW    SEMIS
  2387. ;
  2388.     DB    84H    ; WORD
  2389.     DB    'WOR'
  2390.     DB    'D'+80H
  2391.     DW    PAD-6
  2392. WORD    DW    DOCOL
  2393.     DW    BLK
  2394.     DW    AT
  2395.     DW    ZBRAN    ; IF
  2396.     DW    WORD1-$
  2397.     DW    BLK
  2398.     DW    AT
  2399.     DW    BLOCK
  2400.     DW    BRAN    ; ELSE
  2401.     DW    WORD2-$
  2402. WORD1    DW    TIB
  2403.     DW    AT    ; ENDIF
  2404. WORD2    DW    INN
  2405.     DW    AT
  2406.     DW    PLUS
  2407.     DW    SWAP
  2408.     DW    ENCL
  2409.     DW    HERE
  2410.     DW    LIT
  2411.     DW    22H
  2412.     DW    BLANK
  2413.     DW    INN
  2414.     DW    PSTOR
  2415.     DW    OVER
  2416.     DW    SUBB
  2417.     DW    TOR
  2418.     DW    RR
  2419.     DW    HERE
  2420.     DW    CSTOR
  2421.     DW    PLUS
  2422.     DW    HERE
  2423.     DW    ONEP
  2424.     DW    FROMR
  2425.     DW    CMOVE
  2426.     DW    SEMIS
  2427. ;
  2428.     DB    88H    ; (NUMBER)
  2429.     DB    '(NUMBER'
  2430.     DB    ')'+80H
  2431.     DW    WORD-7
  2432. PNUMB    DW    DOCOL
  2433. PNUM1    DW    ONEP    ; BEGIN
  2434.     DW    DUP
  2435.     DW    TOR
  2436.     DW    CAT
  2437.     DW    BASE
  2438.     DW    AT
  2439.     DW    DIGIT
  2440.     DW    ZBRAN    ; WHILE
  2441.     DW    PNUM2-$
  2442.     DW    SWAP
  2443.     DW    BASE
  2444.     DW    AT
  2445.     DW    USTAR
  2446.     DW    DROP
  2447.     DW    ROT
  2448.     DW    BASE
  2449.     DW    AT
  2450.     DW    USTAR
  2451.     DW    DPLUS
  2452.     DW    DPL
  2453.     DW    AT
  2454.     DW    ONEP
  2455.     DW    ZBRAN    ; IF
  2456.     DW    PNUM3-$
  2457.     DW    ONE
  2458.     DW    DPL
  2459.     DW    PSTOR    ; ENDIF
  2460. PNUM3    DW    FROMR
  2461.     DW    BRAN    ; REPEAT
  2462.     DW    PNUM1-$
  2463. PNUM2    DW    FROMR
  2464.     DW    SEMIS
  2465. ;
  2466.     DB    86H    ; NUMBER
  2467.     DB    'NUMBE'
  2468.     DB    'R'+80H
  2469.     DW    PNUMB-0BH
  2470. NUMB    DW    DOCOL
  2471.     DW    ZERO
  2472.     DW    ZERO
  2473.     DW    ROT
  2474.     DW    DUP
  2475.     DW    ONEP
  2476.     DW    CAT
  2477.     DW    LIT
  2478.     DW    2DH
  2479.     DW    EQUAL
  2480.     DW    DUP
  2481.     DW    TOR
  2482.     DW    PLUS
  2483.     DW    LIT
  2484.     DW    -1
  2485. NUMB1    DW    DPL    ; BEGIN
  2486.     DW    STORE
  2487.     DW    PNUMB
  2488.     DW    DUP
  2489.     DW    CAT
  2490.     DW    BL
  2491.     DW    SUBB
  2492.     DW    ZBRAN    ; WHILE
  2493.     DW    NUMB2-$
  2494.     DW    DUP
  2495.     DW    CAT
  2496.     DW    LIT
  2497.     DW    2EH
  2498.     DW    SUBB
  2499.     DW    ZERO
  2500.     DW    QERR
  2501.     DW    ZERO
  2502.     DW    BRAN    ; REPEAT
  2503.     DW    NUMB1-$
  2504. NUMB2    DW    DROP
  2505.     DW    FROMR
  2506.     DW    ZBRAN    ; IF
  2507.     DW    NUMB3-$
  2508.     DW    DMINU    ; ENDIF
  2509. NUMB3    DW    SEMIS
  2510. ;
  2511.     DB    85H    ; -FIND    (0-3) SUCCESS
  2512.     DB    '-FIN'    ; (0-1) FAILURE
  2513.     DB    'D'+80H
  2514.     DW    NUMB-9
  2515. DFIND    DW    DOCOL
  2516.     DW    BL
  2517.     DW    WORD
  2518.     DW    HERE
  2519.     DW    CONT
  2520.     DW    AT
  2521.     DW    AT
  2522.     DW    PFIND
  2523.     DW    DUP
  2524.     DW    ZEQU
  2525.     DW    ZBRAN    ; IF
  2526.     DW    DFIN1-$
  2527.     DW    DROP
  2528.     DW    HERE
  2529.     DW    LATES
  2530.     DW    PFIND    ; ENDIF
  2531. DFIN1    DW    SEMIS
  2532. ;
  2533.     DB    87H    ; (ABORT)
  2534.     DB    '(ABORT'
  2535.     DB    ')'+80H
  2536.     DW    DFIND-8
  2537. PABOR    DW    DOCOL
  2538.     DW    ABORT
  2539.     DW    SEMIS
  2540. ;
  2541.     DB    85H    ; ERROR
  2542.     DB    'ERRO'
  2543.     DB    'R'+80H
  2544.     DW    PABOR-0AH
  2545. ERROR    DW    DOCOL
  2546.     DW    WARN
  2547.     DW    AT
  2548.     DW    ZLESS
  2549.     DW    ZBRAN    ; IF
  2550.     DW    ERRO1-$
  2551.     DW    PABOR    ; ENDIF
  2552. ERRO1    DW    HERE
  2553.     DW    COUNT
  2554.     DW    TYPE
  2555.     DW    PDOTQ
  2556.     DB    2
  2557.     DB    '? '
  2558.     DW    MESS
  2559.     DW    SPSTO
  2560. ;    CHANGE FROM FIG MODEL
  2561. ;    DW    INN,AT,BLK,AT
  2562.     DW    BLK,AT
  2563.     DW    DDUP
  2564.     DW    ZBRAN,ERRO2-$    ; IF
  2565.     DW    INN,AT
  2566.     DW    SWAP
  2567.     DW    WHERE        ; THEN
  2568. ERRO2    DW    QUIT
  2569. ;
  2570.     DB    83H    ; ID.
  2571.     DB    'ID'
  2572.     DB    '.'+80H
  2573.     DW    ERROR-8
  2574. IDDOT    DW    DOCOL
  2575.     DW    PAD
  2576.     DW    LIT
  2577.     DW    20H
  2578.     DW    LIT
  2579.     DW    5FH
  2580.     DW    FILL
  2581.     DW    DUP
  2582.     DW    PFA
  2583.     DW    LFA
  2584.     DW    OVER
  2585.     DW    SUBB
  2586.     DW    PAD
  2587.     DW    SWAP
  2588.     DW    CMOVE
  2589.     DW    PAD
  2590.     DW    COUNT
  2591.     DW    LIT
  2592.     DW    1FH
  2593.     DW    ANDD
  2594.     DW    TYPE
  2595.     DW    SPACE
  2596.     DW    SEMIS
  2597. ;
  2598.     DB    86H    ; CREATE
  2599.     DB    'CREAT'
  2600.     DB    'E'+80H
  2601.     DW    IDDOT-6
  2602. CREAT    DW    DOCOL
  2603.     DW    DFIND
  2604.     DW    ZBRAN    ; IF
  2605.     DW    CREA1-$
  2606.     DW    DROP
  2607.     DW    NFA
  2608.     DW    IDDOT
  2609.     DW    LIT
  2610.     DW    4
  2611.     DW    MESS
  2612.     DW    SPACE    ; ENDIF
  2613. CREA1    DW    HERE
  2614.     DW    DUP
  2615.     DW    CAT
  2616.     DW    WIDTH
  2617.     DW    AT
  2618.     DW    MIN
  2619.     DW    ONEP
  2620.     DW    ALLOT
  2621.     DW    DUP
  2622.     DW    LIT
  2623.     DW    0A0H
  2624.     DW    TOGGL
  2625.     DW    HERE
  2626.     DW    ONE
  2627.     DW    SUBB
  2628.     DW    LIT
  2629.     DW    80H
  2630.     DW    TOGGL
  2631.     DW    LATES
  2632.     DW    COMMA
  2633.     DW    CURR
  2634.     DW    AT
  2635.     DW    STORE
  2636.     DW    HERE
  2637.     DW    TWOP
  2638.     DW    COMMA
  2639.     DW    SEMIS
  2640. ;
  2641.     DB    0C9H    ; [COMPILE]
  2642.     DB    '[COMPILE'
  2643.     DB    ']'+80H
  2644.     DW    CREAT-9
  2645. BCOMP    DW    DOCOL
  2646.     DW    DFIND
  2647.     DW    ZEQU
  2648.     DW    ZERO
  2649.     DW    QERR
  2650.     DW    DROP
  2651.     DW    CFA
  2652.     DW    COMMA
  2653.     DW    SEMIS
  2654. ;
  2655.     DB    0C7H    ; LITERAL
  2656.     DB    'LITERA'
  2657.     DB    'L'+80H
  2658.     DW    BCOMP-0CH
  2659. LITER    DW    DOCOL
  2660.     DW    STATE
  2661.     DW    AT
  2662.     DW    ZBRAN    ; IF
  2663.     DW    LITE1-$
  2664.     DW    COMP
  2665.     DW    LIT
  2666.     DW    COMMA    ; ENDIF
  2667. LITE1    DW    SEMIS
  2668. ;
  2669.     DB    0C8H    ; DLITERAL
  2670.     DB    'DLITERA'
  2671.     DB    'L'+80H
  2672.     DW    LITER-0AH
  2673. DLITE    DW    DOCOL
  2674.     DW    STATE
  2675.     DW    AT
  2676.     DW    ZBRAN    ; IF
  2677.     DW    DLIT1-$
  2678.     DW    SWAP
  2679.     DW    LITER
  2680.     DW    LITER    ; ENDIF
  2681. DLIT1    DW    SEMIS
  2682. ;
  2683.     DB    86H    ; ?STACK
  2684.     DB    '?STAC'
  2685.     DB    'K'+80H
  2686.     DW    DLITE-0BH
  2687. QSTAC    DW    DOCOL
  2688.     DW    SPAT
  2689.     DW    SZERO
  2690.     DW    AT
  2691.     DW    SWAP
  2692.     DW    ULESS
  2693.     DW    ONE
  2694.     DW    QERR
  2695.     DW    SPAT
  2696.     DW    HERE
  2697.     DW    LIT
  2698.     DW    80H
  2699.     DW    PLUS
  2700.     DW    ULESS
  2701.     DW    LIT
  2702.     DW    7
  2703.     DW    QERR
  2704.     DW    SEMIS
  2705. ;
  2706.     DB    89H    ; INTERPRET
  2707.     DB    'INTERPRE'
  2708.     DB    'T'+80H
  2709.     DW    QSTAC-9
  2710. INTER    DW    DOCOL
  2711. INTE1    DW    DFIND    ; BEGIN
  2712.     DW    ZBRAN    ; IF
  2713.     DW    INTE2-$
  2714.     DW    STATE
  2715.     DW    AT
  2716.     DW    LESS
  2717.     DW    ZBRAN    ; IF
  2718.     DW    INTE3-$
  2719.     DW    CFA
  2720.     DW    COMMA
  2721.     DW    BRAN    ; ELSE
  2722.     DW    INTE4-$
  2723. INTE3    DW    CFA
  2724.     DW    EXEC    ; ENDIF
  2725. INTE4    DW    QSTAC
  2726.     DW    BRAN    ; ELSE
  2727.     DW    INTE5-$
  2728. INTE2    DW    HERE
  2729.     DW    NUMB
  2730.     DW    DPL
  2731.     DW    AT
  2732.     DW    ONEP
  2733.     DW    ZBRAN    ; IF
  2734.     DW    INTE6-$
  2735.     DW    DLITE
  2736.     DW    BRAN    ; ELSE
  2737.     DW    INTE7-$
  2738. INTE6    DW    DROP
  2739.     DW    LITER    ; ENDIF
  2740. INTE7    DW    QSTAC    ; ENDIF
  2741. INTE5    DW    BRAN    ; AGAIN
  2742.     DW    INTE1-$
  2743. ;
  2744.     DB    89H    ; IMMEDIATE
  2745.     DB    'IMMEDIAT'
  2746.     DB    'E'+80H
  2747.     DW    INTER-0CH
  2748. IMMED    DW    DOCOL
  2749.     DW    LATES
  2750.     DW    LIT
  2751.     DW    40H
  2752.     DW    TOGGL
  2753.     DW    SEMIS
  2754. ;
  2755.     DB    8AH    ; VOCABULARY
  2756.     DB    'VOCABULAR'
  2757.     DB    'Y'+80H
  2758.     DW    IMMED-0CH
  2759. VOCAB    DW    DOCOL
  2760.     DW    BUILD
  2761.     DW    LIT
  2762.     DW    0A081H
  2763.     DW    COMMA
  2764.     DW    CURR
  2765.     DW    AT
  2766.     DW    CFA
  2767.     DW    COMMA
  2768.     DW    HERE
  2769.     DW    VOCL
  2770.     DW    AT
  2771.     DW    COMMA
  2772.     DW    VOCL
  2773.     DW    STORE
  2774.     DW    DOES
  2775. DOVOC    DW    TWOP
  2776.     DW    CONT
  2777.     DW    STORE
  2778.     DW    SEMIS
  2779. ;
  2780.     DB    0C5H    ; FORTH
  2781.     DB    'FORT'
  2782.     DB    'H'+80H
  2783.     DW    VOCAB-0DH
  2784. FORTH    DW    DODOE
  2785.     DW    DOVOC
  2786.     DW    0A081H
  2787. FORTHP    DW    FLAST    ; COLD START VALUE ONLY
  2788. ;              CHANGED EACH TIME A DEF IS APPENDED
  2789. ;              TO THE FORTH VOCABULARY
  2790.     DW    0    ; END OF VOCABULARY LIST
  2791. ;
  2792.     DB    8BH    ; DEFINITIONS
  2793.     DB    'DEFINITION'
  2794.     DB    'S'+80H
  2795.     DW    FORTH-8
  2796. DEFIN    DW    DOCOL
  2797.     DW    CONT
  2798.     DW    AT
  2799.     DW    CURR
  2800.     DW    STORE
  2801.     DW    SEMIS
  2802. ;
  2803.     DB    0C1H    ; (
  2804.     DB    '('+80H
  2805.     DW    DEFIN-0EH
  2806. PAREN    DW    DOCOL
  2807.     DW    LIT
  2808.     DW    29H
  2809.     DW    WORD
  2810.     DW    SEMIS
  2811. ;
  2812.     DB    84H    ; QUIT
  2813.     DB    'QUI'
  2814.     DB    'T'+80H
  2815.     DW    PAREN-4
  2816. QUIT    DW    DOCOL
  2817.     DW    ZERO
  2818.     DW    BLK
  2819.     DW    STORE
  2820.     DW    LBRAC
  2821. QUIT1    DW    RPSTO    ; BEGIN
  2822.     DW    CR
  2823.     DW    QUERY
  2824.     DW    INTER
  2825.     DW    STATE
  2826.     DW    AT
  2827.     DW    ZEQU
  2828.     DW    ZBRAN    ; IF
  2829.     DW    QUIT2-$
  2830.     DW    PDOTQ
  2831.     DB    2
  2832.     DB    'OK'    ; ENDIF
  2833. QUIT2    DW    BRAN    ; AGAIN
  2834.     DW    QUIT1-$
  2835. ;
  2836.     DB    85H    ; ABORT
  2837.     DB    'ABOR'
  2838.     DB    'T'+80H
  2839.     DW    QUIT-7
  2840. ABORT    DW    DOCOL
  2841.     DW    SPSTO
  2842.     DW    DEC
  2843.     DW    QSTAC
  2844.     DW    CR
  2845.     DW    DOTCPU
  2846.     DW    PDOTQ
  2847.     DB    0DH
  2848.     DB    'fig-FORTH '
  2849.     DB    FIGREL+30H,ADOT,FIGREV+30H
  2850.     DW    FORTH
  2851.     DW    DEFIN
  2852.     DW    QUIT
  2853. ;
  2854. WRM    LXI    B,WRM1
  2855.     JMP    NEXT
  2856. WRM1    DW    WARM
  2857. ;
  2858.     DB    84H    ; WARM
  2859.     DB    'WAR'
  2860.     DB    'M'+80H
  2861.     DW    ABORT-8
  2862. WARM    DW    DOCOL
  2863.     DW    MTBUF
  2864.     DW    ABORT
  2865. ;
  2866. CLD    LXI    B,CLD1
  2867.     LHLD    ORIG+12H
  2868.     SPHL
  2869.     JMP    NEXT
  2870. CLD1    DW    COLD
  2871. ;
  2872.     DB    84H    ; COLD        1.3
  2873.     DB    'COL'
  2874.     DB    'D'+80H
  2875.     DW    WARM-7
  2876. COLD    DW    DOCOL
  2877.     DW    MTBUF
  2878.     DW    ZERO,DENSTY
  2879.     DW    STORE
  2880.     DW    FIRST
  2881.     DW    USE,STORE
  2882.     DW    FIRST
  2883.     DW    PREV,STORE
  2884.     DW    DRZER
  2885.     DW    LIT,0
  2886.     DW    LIT,EPRINT
  2887.     DW    STORE
  2888. ;
  2889. ;            INIT SOME USER VARIABLES
  2890.     DW    LIT
  2891.     DW    OCLD0
  2892.     DW    LIT
  2893.     DW    UP
  2894.     DW    AT
  2895.     DW    LIT
  2896.     DW    6
  2897.     DW    PLUS
  2898.     DW    LIT
  2899.     DW    OCLD1-OCLD0
  2900.     DW    CMOVE
  2901. ;
  2902. ;            INIT VOCAB POINTERS
  2903.     DW    LIT
  2904.     DW    OFOR
  2905.     DW    AT
  2906.     DW    LIT
  2907.     DW    FORTHP
  2908.     DW    STORE
  2909.     DW    LIT,OED
  2910.     DW    AT
  2911.     DW    LIT,EDITP
  2912.     DW    STORE
  2913. ;    SAME FOR ASSEMBLER IF RESIDENT
  2914. ;
  2915.     DW    ABORT
  2916. ;
  2917.     DB    84H    ; S->D
  2918.     DB    'S->'
  2919.     DB    'D'+80H
  2920.     DW    COLD-7
  2921. STOD    DW    $+2
  2922.     POP    D
  2923.     LXI    H,0
  2924.     MOV    A,D
  2925.     ANI    80H
  2926.     JZ    STOD1
  2927.     DCX    H
  2928. STOD1    JMP    DPUSH
  2929. ;
  2930.     DB    82H    ; +-
  2931.     DB    '+'
  2932.     DB    '-'+80H
  2933.     DW    STOD-7
  2934. PM    DW    DOCOL
  2935.     DW    ZLESS
  2936.     DW    ZBRAN    ; IF
  2937.     DW    PM1-$
  2938.     DW    MINUS    ; ENDIF
  2939. PM1    DW    SEMIS
  2940. ;
  2941.     DB    83H    ; D+-
  2942.     DB    'D+'
  2943.     DB    '-'+80H
  2944.     DW    PM-5
  2945. DPM    DW    DOCOL
  2946.     DW    ZLESS
  2947.     DW    ZBRAN    ; IF
  2948.     DW    DPM1-$
  2949.     DW    DMINU    ; ENDIF
  2950. DPM1    DW    SEMIS
  2951. ;
  2952.     DB    83H    ; ABS
  2953.     DB    'AB'
  2954.     DB    'S'+80H
  2955.     DW    DPM-6
  2956. ABS    DW    DOCOL
  2957.     DW    DUP
  2958.     DW    PM
  2959.     DW    SEMIS
  2960. ;
  2961.     DB    84H    ; DABS
  2962.     DB    'DAB'
  2963.     DB    'S'+80H
  2964.     DW    ABS-6
  2965. DABS    DW    DOCOL
  2966.     DW    DUP
  2967.     DW    DPM
  2968.     DW    SEMIS
  2969. ;
  2970.     DB    83H    ; MIN
  2971.     DB    'MI'
  2972.     DB    'N'+80H
  2973.     DW    DABS-7
  2974. MIN    DW    DOCOL,TDUP
  2975.     DW    GREAT
  2976.     DW    ZBRAN    ; IF
  2977.     DW    MIN1-$
  2978.     DW    SWAP    ; ENDIF
  2979. MIN1    DW    DROP
  2980.     DW    SEMIS
  2981. ;
  2982.     DB    83H    ; MAX
  2983.     DB    'MA'
  2984.     DB    'X'+80H
  2985.     DW    MIN-6
  2986. MAX    DW    DOCOL,TDUP
  2987.     DW    LESS
  2988.     DW    ZBRAN    ; IF
  2989.     DW    MAX1-$
  2990.     DW    SWAP    ; ENDIF
  2991. MAX1    DW    DROP
  2992.     DW    SEMIS
  2993. ;
  2994.     DB    82H    ; M*
  2995.     DB    'M'
  2996.     DB    '*'+80H
  2997.     DW    MAX-6
  2998. MSTAR    DW    DOCOL,TDUP
  2999.     DW    XORR
  3000.     DW    TOR
  3001.     DW    ABS
  3002.     DW    SWAP
  3003.     DW    ABS
  3004.     DW    USTAR
  3005.     DW    FROMR
  3006.     DW    DPM
  3007.     DW    SEMIS
  3008. ;
  3009.     DB    82H    ; M/
  3010.     DB    'M'
  3011.     DB    '/'+80H
  3012.     DW    MSTAR-5
  3013. MSLAS    DW    DOCOL
  3014.     DW    OVER
  3015.     DW    TOR
  3016.     DW    TOR
  3017.     DW    DABS
  3018.     DW    RR
  3019.     DW    ABS
  3020.     DW    USLAS
  3021.     DW    FROMR
  3022.     DW    RR
  3023.     DW    XORR
  3024.     DW    PM
  3025.     DW    SWAP
  3026.     DW    FROMR
  3027.     DW    PM
  3028.     DW    SWAP
  3029.     DW    SEMIS
  3030. ;
  3031.     DB    81H    ; *
  3032.     DB    '*'+80H
  3033.     DW    MSLAS-5
  3034. STAR    DW    DOCOL
  3035.     DW    MSTAR
  3036.     DW    DROP
  3037.     DW    SEMIS
  3038. ;
  3039.     DB    84H    ; /MOD
  3040.     DB    '/MO'
  3041.     DB    'D'+80H
  3042.     DW    STAR-4
  3043. SLMOD    DW    DOCOL
  3044.     DW    TOR
  3045.     DW    STOD
  3046.     DW    FROMR
  3047.     DW    MSLAS
  3048.     DW    SEMIS
  3049. ;
  3050.     DB    81H    ; /
  3051.     DB    '/'+80H
  3052.     DW    SLMOD-7
  3053. SLASH    DW    DOCOL
  3054.     DW    SLMOD
  3055.     DW    SWAP
  3056.     DW    DROP
  3057.     DW    SEMIS
  3058. ;
  3059.     DB    83H    ; MOD
  3060.     DB    'MO'
  3061.     DB    'D'+80H
  3062.     DW    SLASH-4
  3063. MODD    DW    DOCOL
  3064.     DW    SLMOD
  3065.     DW    DROP
  3066.     DW    SEMIS
  3067. ;
  3068.     DB    85H    ; */MOD
  3069.     DB    '*/MO'
  3070.     DB    'D'+80H
  3071.     DW    MODD-6
  3072. SSMOD    DW    DOCOL
  3073.     DW    TOR
  3074.     DW    MSTAR
  3075.     DW    FROMR
  3076.     DW    MSLAS
  3077.     DW    SEMIS
  3078. ;
  3079.     DB    82H    ; */
  3080.     DB    '*'
  3081.     DB    '/'+80H
  3082.     DW    SSMOD-8
  3083. SSLA    DW    DOCOL
  3084.     DW    SSMOD
  3085.     DW    SWAP
  3086.     DW    DROP
  3087.     DW    SEMIS
  3088. ;
  3089.     DB    85H    ; M/MOD
  3090.     DB    'M/MO'
  3091.     DB    'D'+80H
  3092.     DW    SSLA-5
  3093. MSMOD    DW    DOCOL
  3094.     DW    TOR
  3095.     DW    ZERO
  3096.     DW    RR
  3097.     DW    USLAS
  3098.     DW    FROMR
  3099.     DW    SWAP
  3100.     DW    TOR
  3101.     DW    USLAS
  3102.     DW    FROMR
  3103.     DW    SEMIS
  3104. ;
  3105. ;    BLOCK MOVED DOWN 2 PAGES
  3106. ;
  3107. ;
  3108.     DB    86H    ; (LINE)
  3109.     DB    '(LINE'
  3110.     DB    ')'+80H
  3111.     DW    MSMOD-8
  3112. PLINE    DW    DOCOL
  3113.     DW    TOR
  3114.     DW    LIT
  3115.     DW    40H
  3116.     DW    BBUF
  3117.     DW    SSMOD
  3118.     DW    FROMR
  3119.     DW    BSCR
  3120.     DW    STAR
  3121.     DW    PLUS
  3122.     DW    BLOCK
  3123.     DW    PLUS
  3124.     DW    LIT
  3125.     DW    40H
  3126.     DW    SEMIS
  3127. ;
  3128.     DB    85H    ; .LINE
  3129.     DB    '.LIN'
  3130.     DB    'E'+80H
  3131.     DW    PLINE-9
  3132. DLINE    DW    DOCOL
  3133.     DW    PLINE
  3134.     DW    DTRAI
  3135.     DW    TYPE
  3136.     DW    SEMIS
  3137. ;
  3138.     DB    87H    ; MESSAGE
  3139.     DB    'MESSAG'
  3140.     DB    'E'+80H
  3141.     DW    DLINE-8
  3142. MESS    DW    DOCOL
  3143.     DW    WARN
  3144.     DW    AT
  3145.     DW    ZBRAN    ; IF
  3146.     DW    MESS1-$
  3147.     DW    DDUP
  3148.     DW    ZBRAN    ; IF
  3149.     DW    MESS2-$
  3150.     DW    LIT
  3151.     DW    4
  3152.     DW    OFSET
  3153.     DW    AT
  3154.     DW    BSCR
  3155.     DW    SLASH
  3156.     DW    SUBB
  3157.     DW    DLINE
  3158.     DW    SPACE    ; ENDIF
  3159. MESS2    DW    BRAN    ; ELSE
  3160.     DW    MESS3-$
  3161. MESS1    DW    PDOTQ
  3162.     DB    6
  3163.     DB    'MSG # '
  3164.     DW    DOT    ; ENDIF
  3165. MESS3    DW    SEMIS
  3166.     PAGE
  3167. ;------------------------------------------
  3168. ;
  3169. ;    8080 PORT FETCH AND STORE
  3170. ;    ( SELF MODIFYING CODE, NOT REENTRANT
  3171. ;        OR ROM-ABLE )
  3172. ;
  3173.     DB    82H    ; P@ "PORT @"
  3174.     DB    'P'
  3175.     DB    '@'+80H
  3176.     DW    MESS-0AH
  3177. PTAT    DW    $+2
  3178.     POP    D    ;E <- PORT#
  3179.     LXI    H,$+5
  3180.     MOV    M,E
  3181.     IF NOT APPLE
  3182.     IN    0    ;( PORT# MODIFIED )
  3183.     ENDIF
  3184.     IF APPLE
  3185.     LDA    0E000H
  3186.     ENDIF
  3187.     MOV    L,A    ;L <- (PORT#)
  3188.     MVI    H,0
  3189.     JMP    HPUSH
  3190. ;
  3191.     DB    82H    ; "PORT STORE"
  3192.     DB    'P'
  3193.     DB    '!'+80H
  3194.     DW    PTAT-5
  3195. PTSTO    DW    $+2
  3196.     POP    D    ;E <- PORT#
  3197.     LXI    H,$+7
  3198.     MOV    M,E
  3199.     POP    H    ;H <- CDATA
  3200.     MOV    A,L
  3201.     IF NOT APPLE
  3202.     OUT    0    ;( PORT# MODIFIED )
  3203.     ENDIF
  3204.     IF APPLE
  3205.     STA    0E010H
  3206.     ENDIF
  3207.     JMP    NEXT
  3208.     PAGE
  3209. ;------------------------------------------------------
  3210. ;    FORTH DISK INTERFACE
  3211. ;
  3212. ;    MAPPING DISK SECTORS ONTO FORTH BUFFERS & SCREENS
  3213. ;       ( THE FOLLOWING DIAGRAM IS ONLY AN EXAMPLE )
  3214. ;
  3215. ;    DISK                       MEMORY
  3216. ;
  3217. ;  =============+   ----^-------^-------^----    +============
  3218. ;     SECTOR I    I    I    I    I
  3219. ;         ===+    I    I  SECTORS/BUF    I  BUFFER
  3220. ;      TRACK    I    I    I    I    I
  3221. ;         ===+   ----I-------I-------V----   +====  SCREEN
  3222. ;        I    I    I        I
  3223. ;    ========+    I  SECTORS/SCREEN    I
  3224. ;        I    I    I        I
  3225. ;         ===+   ----I-------V------------    +============
  3226. ;  D        I    I            I
  3227. ;  R         ===+    SCREENS            I
  3228. ;  I        I    -------            I
  3229. ;  V    ========+     DRIVE            +====
  3230. ;  E        I    I            I
  3231. ;         ===+    I            I
  3232. ;        I    I            I
  3233. ;         ===+   ----V--------------------   +============
  3234. ;    ////////// I   <----- NOT USED BY FORTH
  3235. ;  =============+
  3236. ;
  3237. ;----------------------------------------------------
  3238. BPS    EQU    128        ; BYTES PER SECTOR
  3239. MXDRV    EQU    2        ; MAX # DRIVES
  3240. ;
  3241.     IF NOT APPLE
  3242. ;    SINGLE DENSITY 8" FLOPPY CAPACITIES
  3243. SEPTR1    EQU    26        ; SECTORS/TRACK
  3244. TRPDR1    EQU    77        ; TRACKS/DRIVE
  3245.     ENDIF
  3246.     IF APPLE    ;5-1/4
  3247. SEPTR1    EQU    16
  3248. TRPDR1    EQU    35
  3249.     ENDIF
  3250. SEPDR1    EQU    SEPTR1*TRPDR1    ; SECTORS/DRIVE
  3251. SEPBU1    EQU    KBBUF/BPS    ; SECTORS/BUFFER
  3252. BUPSC1    EQU    1024/KBBUF    ; BUFFERS/SCREEN
  3253. SEPSC1    EQU    SEPBU1*BUPSC1    ; SECTORS/SCREEN
  3254. SCPDR1    EQU    SEPDR1/SEPSC1    ; SCREENS/DRIVE
  3255. BUPDR1    EQU    BUPSC1*SCPDR1    ; BUFFERS/DRIVE
  3256. USPDR1    EQU    SCPDR1*SEPSC1    ; USABLE SEC/DRV
  3257. ;
  3258. ;    DOUBLE DENSITY 8" FLOPPY CAPACITIES
  3259.     IF NOT APPLE
  3260. SEPTR2    EQU    52        ; SECTORS/TRACK
  3261. TRPDR2    EQU    77        ; TRACKS/DRIVE
  3262.     ENDIF
  3263.     IF APPLE
  3264. SEPTR2    EQU    16
  3265. TRPDR2    EQU    35
  3266.     ENDIF
  3267. SEPDR2    EQU    SEPTR2*TRPDR2    ; SECTORS/DRIVE
  3268. SEPBU2    EQU    KBBUF/BPS    ; SECTORS/BUFFER
  3269. BUPSC2    EQU    1024/KBBUF    ; BUFFERS/SCREEN
  3270. SEPSC2    EQU    SEPBU2*BUPSC2    ; SECTORS/SCREEN
  3271. SCPDR2    EQU    SEPDR2/SEPSC2    ; SCREENS/DRIVE
  3272. BUPDR2    EQU    BUPSC2*SCPDR2    ; BUFFERS/DRIVE
  3273. USPDR2    EQU    SCPDR2*SEPSC2    ; USABLE SEC/DRV
  3274.     PAGE
  3275. ;-------------------------------------------------------
  3276. ;    CP/M DISK INTERFACE
  3277. ;
  3278. ;    CP/M BIOS CALLS USED
  3279. ;    ( NOTE EQU'S ARE 3 LOWER THAN DOCUMENTED OFFSETS
  3280. ;      BECAUSE BASE ADDR IS BIOS+3 )
  3281. ;
  3282. RITSEC    EQU    39
  3283. RDSEC    EQU    36
  3284. SETDMA    EQU    33
  3285. SETSEC    EQU    30
  3286. SETTRK    EQU    27
  3287. SETDSK    EQU    24
  3288. ;
  3289. ;
  3290. ;    FORTH VARIABLES AND CONSTANTS USED IN DISK INTERFACE
  3291. ;
  3292.     DB    85H    ; DRIVE ( CURRENT DRIVE # )
  3293.     DB    'DRIV'
  3294.     DB    'E'+80H
  3295.     DW    PTSTO-5
  3296. DRIVE    DW    DOVAR,0
  3297. ;
  3298.     DB    83H    ; SEC    ( SECTOR # )
  3299.     DB    'SE'
  3300.     DB    'C'+80H
  3301.     DW    DRIVE-8
  3302. SEC:    DW    DOVAR
  3303.     DW    0
  3304. ;
  3305.     DB    85H    ; TRACK    ( TRACK # )
  3306.     DB    'TRAC'
  3307.     DB    'K'+80H
  3308.     DW    SEC-6
  3309. TRACK:    DW    DOVAR,0
  3310. ;
  3311.     DB    83H    ; USE    ( ADDR OF NEXT BUFFER
  3312. ;                TO BE REPLACED )
  3313.     DB    'US'
  3314.     DB    'E'+80H
  3315.     DW    TRACK-8
  3316. USE:    DW    DOVAR
  3317.     DW    BUF1
  3318. ;
  3319.     DB    84H    ; PREV
  3320. ;    ( ADDR OF BUFFER PREVIOUSLY ACCESSED BY CPU )
  3321.     DB    'PRE'
  3322.     DB    'V'+80H
  3323.     DW    USE-6
  3324. PREV    DW    DOVAR
  3325.     DW    BUF1
  3326. ;
  3327.     DB    87H    ; SEC/BLK ( # SECTORS/BLOCK )
  3328.     DB    'SEC/BL'
  3329.     DB    'K'+80H
  3330.     DW    PREV-7
  3331. SPBLK    DW    DOCON
  3332.     DW    KBBUF/BPS
  3333. ;
  3334.     DB    85H    ; #BUFF  ( NUMBER OF BUFFERS )
  3335.     DB    '#BUF'
  3336.     DB    'F'+80H
  3337.     DW    SPBLK-10
  3338. NOBUF    DW    DOCON,NBUF
  3339. ;
  3340.     DB    88H    ; #SCR/DRV   ( # SCREENS/DRIVE )   1.3
  3341.     DB    '#SCR/DR'
  3342.     DB    'V'+80H
  3343.     DW    NOBUF-8
  3344. NSCRD    DW    DOCOL
  3345.     DW    DENSTY,AT
  3346.     DW    ZBRAN,NSCR1-$
  3347.     DW    LIT,SCPDR2
  3348.     DW    BRAN,NSCR2-$
  3349. NSCR1    DW    LIT,SCPDR1
  3350. NSCR2    DW    SEMIS
  3351. ;
  3352.     DB    87H    ; DENSITY ( 0 = SINGLE , 1 = DOUBLE )
  3353.     DB    'DENSIT'
  3354.     DB    'Y'+80H
  3355.     DW    NSCRD-11
  3356. DENSTY    DW    DOVAR
  3357.     DW    0
  3358. ;
  3359.     DB    8AH    ; DISK-ERROR  ( DISK ERROR STATUS )
  3360.     DB    'DISK-ERRO'
  3361.     DB    'R'+80H
  3362.     DW    DENSTY-10
  3363. DSKERR    DW    DOVAR,0
  3364. ;
  3365. ;    DISK INTERFACE HIGH-LEVEL ROUTINES
  3366. ;
  3367.     DB    84H    ; +BUF    ( ADVANCE BUFFER )
  3368.     DB    '+BU'
  3369.     DB    'F'+80H
  3370.     DW    DSKERR-13
  3371. PBUF    DW    DOCOL
  3372.     DW    LIT,CO
  3373.     DW    PLUS,DUP
  3374.     DW    LIMIT,EQUAL
  3375.     DW    ZBRAN,PBUF1-$
  3376.     DW    DROP,FIRST
  3377. PBUF1:    DW    DUP,PREV
  3378.     DW    AT,SUBB
  3379.     DW    SEMIS
  3380. ;
  3381.     DB    86H    ; UPDATE
  3382.     DB    'UPDAT'
  3383.     DB    'E'+80H
  3384.     DW    PBUF-7
  3385. UPDAT    DW    DOCOL,PREV
  3386.     DW    AT,AT
  3387.     DW    LIT,8000H
  3388.     DW    ORR
  3389.     DW    PREV,AT
  3390.     DW    STORE,SEMIS
  3391. ;
  3392.     DB    8DH    ; EMPTY-BUFFERS
  3393.     DB    'EMPTY-BUFFER'
  3394.     DB    'S'+80H
  3395.     DW    UPDAT-9
  3396. MTBUF    DW    DOCOL,FIRST
  3397.     DW    LIMIT,OVER
  3398.     DW    SUBB,ERASEE
  3399.     DW    SEMIS
  3400. ;
  3401.     DB    83H    ; DR0
  3402.     DB    'DR'
  3403.     DB    '0'+80H
  3404.     DW    MTBUF-16
  3405. DRZER    DW    DOCOL,ZERO
  3406.     DW    OFSET,STORE
  3407.     DW    SEMIS
  3408. ;
  3409.     DB    83H    ; DR1
  3410.     DB    'DR'
  3411.     DB    '1'+80H
  3412.     DW    DRZER-6
  3413. DRONE    DW    DOCOL
  3414.     DW    DENSTY,AT
  3415.     DW    ZBRAN,DRON1-$
  3416.     DW    LIT,BUPDR2
  3417.     DW    BRAN,DRON2-$
  3418. DRON1    DW    LIT,BUPDR1
  3419. DRON2    DW    OFSET,STORE
  3420.     DW    SEMIS
  3421. ;
  3422.     DB    86H    ; BUFFER
  3423.     DB    'BUFFE'
  3424.     DB    'R'+80H
  3425.     DW    DRONE-6
  3426. BUFFE:    DW    DOCOL,USE
  3427.     DW    AT,DUP
  3428.     DW    TOR
  3429. BUFF1    DW    PBUF        ; WON'T WORK IF SINGLE BUFFER
  3430.     DW    ZBRAN,BUFF1-$
  3431.     DW    USE,STORE
  3432.     DW    RR,AT
  3433.     DW    ZLESS
  3434.     DW    ZBRAN,BUFF2-$
  3435.     DW    RR,TWOP
  3436.     DW    RR,AT
  3437.     DW    LIT,7FFFH
  3438.     DW    ANDD,ZERO
  3439.     DW    RSLW
  3440. BUFF2    DW    RR,STORE
  3441.     DW    RR,PREV
  3442.     DW    STORE,FROMR
  3443.     DW    TWOP,SEMIS
  3444. ;
  3445.     DB    85H    ; BLOCK
  3446.     DB    'BLOC'
  3447.     DB    'K'+80H
  3448.     DW    BUFFE-9
  3449. BLOCK    DW    DOCOL,OFSET
  3450.     DW    AT,PLUS
  3451.     DW    TOR,PREV
  3452.     DW    AT,DUP
  3453.     DW    AT,RR
  3454.     DW    SUBB
  3455.     DW    DUP,PLUS
  3456.     DW    ZBRAN,BLOC1-$
  3457. BLOC2    DW    PBUF,ZEQU
  3458.     DW    ZBRAN,BLOC3-$
  3459.     DW    DROP,RR
  3460.     DW    BUFFE,DUP
  3461.     DW    RR,ONE
  3462.     DW    RSLW
  3463.     DW    TWO,SUBB
  3464. BLOC3    DW    DUP,AT
  3465.     DW    RR,SUBB
  3466.     DW    DUP,PLUS
  3467.     DW    ZEQU
  3468.     DW    ZBRAN,BLOC2-$
  3469.     DW    DUP,PREV
  3470.     DW    STORE
  3471. BLOC1    DW    FROMR,DROP
  3472.     DW    TWOP,SEMIS
  3473. ;
  3474. ;
  3475. ;    CP/M INTERFACE ROUTINES
  3476. ;
  3477. ;        SERVICE REQUEST
  3478. ;
  3479. IOS    LHLD    1    ; (HL) <- BIOS TABLE ADDR+3
  3480.     DAD    D    ; + SERVICE REQUEST OFFSET
  3481.     PCHL        ; EXECUTE REQUEST
  3482. ;    RET FUNCTION PROVIDED BY CP/M
  3483. ;
  3484.     DB    86H    ; SET-IO    1.3
  3485. ;            ( ASSIGN SECTOR, TRACK FOR BDOS )
  3486.     DB    'SET-I'
  3487.     DB    'O'+80H
  3488.     DW    BLOCK-8
  3489. SETIO:    DW    $+2
  3490.     PUSH    B    ; SAVE (IP)
  3491.     LHLD    USE+2    ; (BC) <- ADDR BUFFER
  3492.     MOV    B,H
  3493.     MOV    C,L
  3494.     LXI    D,SETDMA ; SEND BUFFER ADDR TO CP/M
  3495.     CALL    IOS
  3496. ;
  3497.     LHLD    SEC+2    ; (BC) <- (SEC) = SECTOR #
  3498.     MOV    C,L
  3499.     LXI    D,SETSEC    ; SEND SECTOR # TO CP/M
  3500.     CALL    IOS
  3501. ;
  3502.     LHLD    TRACK+2    ; (BC) <- (TRACK) = TRACK #
  3503.     MOV    B,H
  3504.     MOV    C,L
  3505.     LXI    D,SETTRK
  3506.     CALL    IOS
  3507. ;
  3508.     POP    B    ; RESTORE (IP)
  3509.     JMP    NEXT
  3510. ;
  3511.     DB    89H    ; SET-DRIVE
  3512.     DB    'SET-DRIV'
  3513.     DB    'E'+80H
  3514.     DW    SETIO-9
  3515. SETDRV:    DW    $+2
  3516.     PUSH    B    ; SAVE (IP)
  3517.     LDA    DRIVE+2    ; (C) <- (DRIVE) = DRIVE #
  3518.     MOV    C,A
  3519.     LXI    D,SETDSK    ; SEND DRIVE # TO CP/M
  3520.     CALL    IOS
  3521.     POP    B    ; RESTORE (IP)
  3522.     JMP    NEXT
  3523. ;
  3524. ;    T&SCALC        ( CALCULATES DRIVE#, TRACK#, & SECTOR# )
  3525. ;    STACK INPUT: SECTOR-DISPLACEMENT = BLK# * SEC/BLK
  3526. ;    OUTPUT: VARIABLES DRIVE, TRACK, & SEC
  3527. ;
  3528.     DB    87H    ; T&SCALC
  3529.     DB    'T&SCAL'
  3530.     DB    'C'+80H
  3531.     DW    SETDRV-12
  3532. TSCALC:    DW    DOCOL,DENSTY
  3533.     DW    AT
  3534.     DW    ZBRAN,TSCALS-$
  3535. ;    DOUBLE DENSITY
  3536.     DW    LIT,USPDR2
  3537.     DW    SLMOD
  3538.     DW    LIT,MXDRV-1
  3539.     DW    MIN
  3540.     DW    DUP,DRIVE
  3541.     DW    AT,EQUAL
  3542.     DW    ZBRAN,TSCAL1-$
  3543.     DW    DROP
  3544.     DW    BRAN,TSCAL2-$
  3545. TSCAL1    DW    DRIVE,STORE
  3546.     DW    SETDRV
  3547. TSCAL2    DW    LIT,SEPTR2
  3548.     DW    SLMOD,TRACK
  3549.     IF NOT APPLE
  3550.     DW    STORE,ONEP
  3551.     ENDIF
  3552.     IF APPLE
  3553.     DW    STORE
  3554.     ENDIF
  3555.     DW    SEC,STORE
  3556.     DW    SEMIS
  3557. ;    SINGLE DENSITY
  3558. TSCALS    DW    LIT,USPDR1
  3559.     DW    SLMOD
  3560.     DW    LIT,MXDRV-1
  3561.     DW    MIN
  3562.     DW    DUP,DRIVE
  3563.     DW    AT,EQUAL
  3564.     DW    ZBRAN,TSCAL3-$
  3565.     DW    DROP
  3566.     DW    BRAN,TSCAL4-$
  3567. TSCAL3    DW    DRIVE,STORE
  3568.     DW    SETDRV
  3569. TSCAL4    DW    LIT,SEPTR1
  3570.     DW    SLMOD,TRACK
  3571.     IF NOT APPLE
  3572.     DW    STORE,ONEP
  3573.     ENDIF
  3574.     IF APPLE
  3575.     DW    STORE
  3576.     ENDIF
  3577.     DW    SEC,STORE
  3578.     DW    SEMIS
  3579. ;
  3580. ;    SEC-READ
  3581. ;    ( READ A SECTOR SETUP BY 'SET-DRIVE' & 'SETIO' )
  3582. ;
  3583.     DB    88H    ; SEC-READ
  3584.     DB    'SEC-REA'
  3585.     DB    'D'+80H
  3586.     DW    TSCALC-10
  3587. SECRD    DW    $+2
  3588.     PUSH    B    ; SAVE (IP)
  3589.     LXI    D,RDSEC    ; ASK CP/M TO READ SECTOR
  3590.     CALL    IOS
  3591.     STA    DSKERR+2    ; (DSKERR) <- ERROR STATUS
  3592.     POP    B    ; RESTORE (IP)
  3593.     JMP    NEXT
  3594. ;
  3595. ;    SEC-WRITE
  3596. ;    ( WRITE A SECTOR SETUP BY 'SET-DRIVE' & 'SETIO' )
  3597. ;
  3598.     DB    89H    ; SEC-WRITE
  3599.     DB    'SEC-WRIT'
  3600.     DB    'E'+80H
  3601.     DW    SECRD-11
  3602. SECWT    DW    $+2
  3603.     PUSH    B    ; SAVE (IP)
  3604.     LXI    D,RITSEC    ; ASK CP/M TO WRITE SECTOR
  3605.     CALL    IOS
  3606.     STA    DSKERR+2    ; (DSKERR) <- ERROR STATUS
  3607.     POP    B    ; RESTORE (IP)
  3608.     JMP    NEXT
  3609. ;
  3610.     DB    86H    ; +TRACK  ( ADVANCE TRACK )    1.3
  3611.     DB    '+TRAC'
  3612.     DB    'K'+80H
  3613.     DW    SECWT-12
  3614. PTRAC    DW    $+2
  3615.     LDA    DENSTY+2    ; GET #SECTORS/DRIVE
  3616.     ORA    A        ; IF DENSITY = 0
  3617.     MVI    A,SEPTR1+1    ; THEN SINGLE DENSITY
  3618.     JZ    PTRA1
  3619.     MVI    A,SEPTR2+1    ; ELSE DOUBLE
  3620. PTRA1    LHLD    SEC+2        ; IF NOT AT END OF TRACK
  3621.     CMP    L
  3622.     JNZ    NEXT        ; THEN DONE
  3623.     MVI    A,1        ; ELSE RESET SECTOR #
  3624.     STA    SEC+2
  3625.     LDA    TRACK+2        ;   AND INCR TRACK #
  3626.     INR    A
  3627.     STA    TRACK+2
  3628.     JMP    NEXT
  3629. ;
  3630.     DB    87H    ; +SECTOR ( ADVANCE SECTOR )    1.3
  3631.     DB    '+SECTO'
  3632.     DB    'R'+80H
  3633.     DW    PTRAC-9
  3634. PSEC    DW    $+2
  3635.     LDA    SEC+2    ; INCR SECTOR #
  3636.     INR    A
  3637.     STA    SEC+2
  3638.     PUSH    D    ; SAVE W
  3639.     LHLD    USE+2    ; INCR USE
  3640.     LXI    D,BPS
  3641.     DAD    D
  3642.     SHLD    USE+2
  3643.     POP    D    ; RESTORE W
  3644.     JMP    NEXT
  3645. ;
  3646.     DB    84H    ; SELECT READ OR WRITE        1.3
  3647.     DB    '?R/'    ;   ( F --- F )
  3648.     DB    'W'+80H
  3649.     DW    PSEC-10
  3650. QRW    DW    $+2
  3651.     XTHL        ; (HL) <- (S1) = R/W FLAG
  3652.     MOV    A,L    ; IF FLAG = 1
  3653.     ORA    H
  3654.     XTHL
  3655.     JZ    QRW1
  3656. ;              THEN READ SECTOR
  3657.     PUSH    B    ; SAVE IP
  3658.     LXI    D,RDSEC
  3659.     CALL    IOS
  3660.     STA    DSKERR+2
  3661.     POP    B    ; RESTORE IP
  3662.     JMP    NEXT
  3663. ;              ELSE WRITE SECTOR
  3664. QRW1    PUSH    B    ; SAVE IP
  3665.     LXI    D,RITSEC
  3666.     CALL    IOS
  3667.     STA    DSKERR+2
  3668.     POP    B    ; RESTORE IP
  3669.     JMP    NEXT
  3670. ;
  3671.     DB    83H    ; R/W    ( FORTH DISK PRIMITIVE ) 1.3
  3672.     DB    'R/'
  3673.     DB    'W'+80H
  3674.     DW    QRW-7
  3675. RSLW    DW    DOCOL
  3676.     DW    USE,AT
  3677.     DW    TOR
  3678.     DW    SWAP,SPBLK
  3679.     DW    STAR,ROT
  3680.     DW    USE,STORE
  3681.     DW    TSCALC
  3682.     DW    SPBLK,ZERO
  3683.     DW    XDO        ; DO
  3684. RSLW1    DW    SETIO        ; SET-IO
  3685.     DW    QRW        ; ?R/W
  3686.     DW    PTRAC        ; +TRACK
  3687.     DW    PSEC        ; +SECTOR
  3688.     DW    XLOOP,RSLW1-$        ; LOOP
  3689.     DW    DROP
  3690.     DW    FROMR,USE
  3691.     DW    STORE,SEMIS
  3692. ;
  3693. ;--------------------------------------------------------
  3694. ;
  3695. ;    ALTERNATIVE R/W FOR NO DISK INTERFACE
  3696. ;
  3697. ;RSLW    DW    DOCOL,DROP,DROP,DROP,SEMIS
  3698. ;
  3699. ;--------------------------------------------------------
  3700. ;
  3701.     DB    85H    ; FLUSH
  3702.     DB    'FLUS'
  3703.     DB    'H'+80H
  3704.     DW    RSLW-6
  3705. FLUSH    DW    DOCOL
  3706.     DW    NOBUF,ONEP
  3707.     DW    ZERO,XDO
  3708. FLUS1    DW    ZERO,BUFFE
  3709.     DW    DROP
  3710.     DW    XLOOP,FLUS1-$
  3711.     DW    SEMIS
  3712. ;
  3713.     DB    84H    ; SAVE        1.3
  3714.     DB    'SAV'
  3715.     DB    'E'+80H
  3716.     DW    FLUSH-8
  3717. SAVE    DW    DOCOL
  3718.     DW    FLUSH
  3719.     DW    SEMIS
  3720. ;
  3721.     DB    84H    ; LOAD
  3722.     DB    'LOA'
  3723.     DB    'D'+80H
  3724.     DW    SAVE-7
  3725. LOAD    DW    DOCOL,BLK
  3726.     DW    AT,TOR
  3727.     DW    INN,AT
  3728.     DW    TOR,ZERO
  3729.     DW    INN,STORE
  3730.     DW    BSCR,STAR
  3731.     DW    BLK,STORE    ; BLK <- SCR * B/SCR
  3732.     DW    INTER        ; INTERPRET FROM OTHER SCREEN
  3733.     DW    FROMR,INN
  3734.     DW    STORE
  3735.     DW    FROMR,BLK
  3736.     DW    STORE
  3737.     DW    SEMIS
  3738. ;
  3739.     DB    0C3H    ; -->
  3740.     DB    '--'
  3741.     DB    '>'+80H
  3742.     DW    LOAD-7
  3743. ARROW    DW    DOCOL
  3744.     DW    QLOAD
  3745.     DW    ZERO
  3746.     DW    INN
  3747.     DW    STORE
  3748.     DW    BSCR
  3749.     DW    BLK
  3750.     DW    AT
  3751.     DW    OVER
  3752.     DW    MODD
  3753.     DW    SUBB
  3754.     DW    BLK
  3755.     DW    PSTOR
  3756.     DW    SEMIS
  3757. ;
  3758.     DB    84H    ; THRU        1.3
  3759.     DB    'THR'
  3760.     DB    'U'+80H
  3761.     DW    ARROW-6
  3762. THRU    DW    DOCOL
  3763.     DW    ONEP,SWAP
  3764.     DW    XDO        ; DO
  3765. THRU1    DW    IDO,LOAD
  3766.     DW    XLOOP,THRU1-$    ; LOOP
  3767.     DW    SEMIS
  3768. ;
  3769.     PAGE
  3770. ;-------------------------------------------------
  3771. ;
  3772. ;    CP/M CONSOLE & PRINTER INTERFACE
  3773. ;
  3774. ;    CP/M BIOS CALLS USED
  3775. ;    ( NOTE: BELOW OFFSETS ARE 3 LOWER THAN CP/M
  3776. ;      DOCUMENTATION SINCE BASE ADDR = BIOS+3 )
  3777. ;
  3778. KCSTAT    EQU    3    ; CONSOLE STATUS
  3779. KCIN    EQU    6    ; CONSOLE INPUT
  3780. KCOUT    EQU    9    ; CONSOLE OUTPUT
  3781. KPOUT    EQU    0CH    ; PRINTER OUTPUT
  3782. ;
  3783. EPRINT    DW    0    ; ENABLE PRINTER VARIABLE
  3784. ;            ; 0 = DISABLED, 1 = ENABLED
  3785. ;
  3786. ;    BELOW BIOS CALLS USE 'IOS' IN DISK INTERFACE
  3787. ;
  3788. CSTAT    PUSH    B    ; CONSOLE STATUS
  3789.     LXI    D,KCSTAT  ; CHECK IF ANY CHR HAS BEEN TYPED
  3790.     CALL    IOS
  3791.     POP    B    ; IF CHR TYPED THEN (A) <- 0FFH
  3792.     RET        ; ELSE (A) <- 0
  3793. ;            ; CHR IGNORED
  3794. ;
  3795. CIN    PUSH    B    ; CONSOLE INPUT
  3796.     LXI    D,KCIN    ; WAIT FOR CHR TO BE TYPED
  3797.     CALL    IOS    ; (A) <- CHR, (MSB) <- 0
  3798.     POP    B
  3799.     RET
  3800. ;
  3801. COUT    PUSH    H    ; CONSOLE OUTPUT
  3802.     LXI    D,KCOUT    ; WAIT UNTIL READY
  3803.     CALL    IOS    ; THEN OUTPUT (C)
  3804.     POP    H
  3805.     RET
  3806. ;
  3807. POUT    LXI    D,KPOUT    ; PRINTER OUTPUT
  3808.     CALL    IOS    ; WAIT UNTIL READY
  3809.     RET        ; THEN OUTPUT (C)
  3810. ;
  3811. CPOUT    CALL    COUT    ; OUTPUT (C) TO CONSOLE
  3812.     XCHG
  3813.     LXI    H,EPRINT
  3814.     MOV    A,M    ; IF (EPRINT) <> 0
  3815.     ORA    A
  3816.     JZ    CPOU1
  3817.     MOV    C,E    ; THEN OUTPUT (C) TO PRINTER
  3818.     CALL    POUT
  3819. CPOU1    RET
  3820. ;
  3821. ;    FORTH TO CP/M SERIAL IO INTERFACE
  3822. ;
  3823. PQTER    CALL    CSTAT    ; IF CHR TYPED
  3824.     LXI    H,0
  3825.     ORA    A
  3826.     JZ    PQTE1
  3827.     INR    L    ; THEN (S1) <- TRUE
  3828. PQTE1    JMP    HPUSH    ; ELSE (S1) <- FALSE
  3829. ;
  3830. PKEY    CALL    CIN    ; READ CHR FROM CONSOLE
  3831.     CPI    DLE    ; IF CHR = (^P)
  3832.     MOV    E,A
  3833.     JNZ    PKEY1
  3834.     LXI    H,EPRINT  ; THEN TOGGLE (EPRINT)LSB
  3835.     MVI    E,ABL    ; CHR <- BLANK
  3836.     MOV    A,M
  3837.     XRI    1
  3838.     MOV    M,A
  3839. PKEY1    MOV    L,E
  3840.     MVI    H,0
  3841.     JMP    HPUSH    ; (S1)LB <- CHR
  3842. ;
  3843. PEMIT    DW    $+2    ; (EMIT)    ORPHAN
  3844.     POP    H    ; (L) <- (S1)LB = CHR
  3845.     PUSH    B    ; SAVE (IP)
  3846.     MOV    C,L
  3847.     CALL    CPOUT    ; OUTPUT CHR TO CONSOLE
  3848. ;            ; & MAYBE PRINTER
  3849.     POP    B    ; RESTORE (IP)
  3850.     JMP    NEXT
  3851. ;
  3852. PCR    PUSH    B    ; SAVE (IP)
  3853.     MVI    C,ACR    ; OUTPUT (CR) TO CONSOLE
  3854.     MOV    L,C
  3855.     CALL    CPOUT    ; & MAYBE TO PRINTER
  3856.     MVI    C,LF    ; OUTPUT (LF) TO CONSOLE
  3857.     MOV    L,C
  3858.     CALL    CPOUT    ; & MAYBE TO PRINTER
  3859.     POP    B    ; RESTORE (IP)
  3860.     JMP    NEXT
  3861. ;
  3862. ;----------------------------------------------------
  3863.     PAGE
  3864. ;
  3865.     DB    0C1H    ; '    ( TICK )
  3866.     DB    0A7H
  3867.     DW    THRU-7
  3868. TICK    DW    DOCOL
  3869.     DW    DFIND
  3870.     DW    ZEQU
  3871.     DW    ZERO
  3872.     DW    QERR
  3873.     DW    DROP
  3874.     DW    LITER
  3875.     DW    SEMIS
  3876. ;
  3877.     DB    86H    ; FORGET    1.3
  3878.     DB    'FORGE'
  3879.     DB    'T'+80H
  3880.     DW    TICK-4
  3881. FORG    DW    DOCOL
  3882.     DW    CURR
  3883.     DW    AT
  3884.     DW    CONT
  3885.     DW    AT
  3886.     DW    SUBB
  3887.     DW    LIT
  3888.     DW    18H
  3889.     DW    QERR
  3890.     DW    TICK
  3891.     DW    DUP
  3892.     DW    FENCE
  3893.     DW    AT
  3894.     DW    ULESS
  3895.     DW    LIT
  3896.     DW    15H
  3897.     DW    QERR
  3898.     DW    DUP
  3899.     DW    NFA
  3900.     DW    DP
  3901.     DW    STORE
  3902.     DW    LFA
  3903.     DW    AT
  3904.     DW    CONT
  3905.     DW    AT
  3906.     DW    STORE
  3907.     DW    SEMIS
  3908. ;
  3909.     DB    84H    ; BACK
  3910.     DB    'BAC'
  3911.     DB    'K'+80H
  3912.     DW    FORG-9
  3913. BACK    DW    DOCOL
  3914.     DW    HERE
  3915.     DW    SUBB
  3916.     DW    COMMA
  3917.     DW    SEMIS
  3918. ;
  3919.     DB    0C5H    ; BEGIN
  3920.     DB    'BEGI'
  3921.     DB    'N'+80H
  3922.     DW    BACK-7
  3923. BEGIN    DW    DOCOL
  3924.     DW    QCOMP
  3925.     DW    HERE
  3926.     DW    ONE
  3927.     DW    SEMIS
  3928. ;
  3929.     DB    0C5H    ; ENDIF
  3930.     DB    'ENDI'
  3931.     DB    'F'+80H
  3932.     DW    BEGIN-8
  3933. ENDIFF    DW    DOCOL
  3934.     DW    QCOMP
  3935.     DW    TWO
  3936.     DW    QPAIR
  3937.     DW    HERE
  3938.     DW    OVER
  3939.     DW    SUBB
  3940.     DW    SWAP
  3941.     DW    STORE
  3942.     DW    SEMIS
  3943. ;
  3944.     DB    0C4H    ; THEN
  3945.     DB    'THE'
  3946.     DB    'N'+80H
  3947.     DW    ENDIFF-8
  3948. THEN    DW    DOCOL
  3949.     DW    ENDIFF
  3950.     DW    SEMIS
  3951. ;
  3952.     DB    0C2H    ; DO
  3953.     DB    'D'
  3954.     DB    'O'+80H
  3955.     DW    THEN-7
  3956. DO    DW    DOCOL
  3957.     DW    COMP
  3958.     DW    XDO
  3959.     DW    HERE
  3960.     DW    THREE
  3961.     DW    SEMIS
  3962. ;
  3963.     DB    0C4H    ; LOOP
  3964.     DB    'LOO'
  3965.     DB    'P'+80H
  3966.     DW    DO-5
  3967. LOOP    DW    DOCOL
  3968.     DW    THREE
  3969.     DW    QPAIR
  3970.     DW    COMP
  3971.     DW    XLOOP
  3972.     DW    BACK
  3973.     DW    SEMIS
  3974. ;
  3975.     DB    0C5H    ; +LOOP
  3976.     DB    '+LOO'
  3977.     DB    'P'+80H
  3978.     DW    LOOP-7
  3979. PLOOP    DW    DOCOL
  3980.     DW    THREE
  3981.     DW    QPAIR
  3982.     DW    COMP
  3983.     DW    XPLOO
  3984.     DW    BACK
  3985.     DW    SEMIS
  3986. ;
  3987.     DB    0C5H    ; UNTIL
  3988.     DB    'UNTI'
  3989.     DB    'L'+80H
  3990.     DW    PLOOP-8
  3991. UNTIL    DW    DOCOL
  3992.     DW    ONE
  3993.     DW    QPAIR
  3994.     DW    COMP
  3995.     DW    ZBRAN
  3996.     DW    BACK
  3997.     DW    SEMIS
  3998. ;
  3999.     DB    0C3H    ; END
  4000.     DB    'EN'
  4001.     DB    'D'+80H
  4002.     DW    UNTIL-8
  4003. ENDD    DW    DOCOL
  4004.     DW    UNTIL
  4005.     DW    SEMIS
  4006. ;
  4007.     DB    0C5H    ; AGAIN
  4008.     DB    'AGAI'
  4009.     DB    'N'+80H
  4010.     DW    ENDD-6
  4011. AGAIN    DW    DOCOL
  4012.     DW    ONE
  4013.     DW    QPAIR
  4014.     DW    COMP
  4015.     DW    BRAN
  4016.     DW    BACK
  4017.     DW    SEMIS
  4018. ;
  4019.     DB    0C6H    ; REPEAT
  4020.     DB    'REPEA'
  4021.     DB    'T'+80H
  4022.     DW    AGAIN-8
  4023. REPEA    DW    DOCOL
  4024.     DW    TOR
  4025.     DW    TOR
  4026.     DW    AGAIN
  4027.     DW    FROMR
  4028.     DW    FROMR
  4029.     DW    TWO
  4030.     DW    SUBB
  4031.     DW    ENDIFF
  4032.     DW    SEMIS
  4033. ;
  4034.     DB    0C2H    ; IF
  4035.     DB    'I'
  4036.     DB    'F'+80H
  4037.     DW    REPEA-9
  4038. IFF    DW    DOCOL
  4039.     DW    COMP
  4040.     DW    ZBRAN
  4041.     DW    HERE
  4042.     DW    ZERO
  4043.     DW    COMMA
  4044.     DW    TWO
  4045.     DW    SEMIS
  4046. ;
  4047.     DB    0C4H    ; ELSE
  4048.     DB    'ELS'
  4049.     DB    'E'+80H
  4050.     DW    IFF-5
  4051. ELSEE    DW    DOCOL
  4052.     DW    TWO
  4053.     DW    QPAIR
  4054.     DW    COMP
  4055.     DW    BRAN
  4056.     DW    HERE
  4057.     DW    ZERO
  4058.     DW    COMMA
  4059.     DW    SWAP
  4060.     DW    TWO
  4061.     DW    ENDIFF
  4062.     DW    TWO
  4063.     DW    SEMIS
  4064. ;
  4065.     DB    0C5H    ; WHILE
  4066.     DB    'WHIL'
  4067.     DB    'E'+80H
  4068.     DW    ELSEE-7
  4069. WHILE    DW    DOCOL
  4070.     DW    IFF
  4071.     DW    TWOP
  4072.     DW    SEMIS
  4073. ;
  4074.     DB    86H    ; SPACES
  4075.     DB    'SPACE'
  4076.     DB    'S'+80H
  4077.     DW    WHILE-8
  4078. SPACS    DW    DOCOL
  4079.     DW    ZERO
  4080.     DW    MAX
  4081.     DW    DDUP
  4082.     DW    ZBRAN    ; IF
  4083.     DW    SPAX1-$
  4084.     DW    ZERO
  4085.     DW    XDO    ; DO
  4086. SPAX2    DW    SPACE
  4087.     DW    XLOOP    ; LOOP    ENDIF
  4088.     DW    SPAX2-$
  4089. SPAX1    DW    SEMIS
  4090. ;
  4091.     DB    82H    ; <#
  4092.     DB    '<'
  4093.     DB    '#'+80H
  4094.     DW    SPACS-9
  4095. BDIGS    DW    DOCOL
  4096.     DW    PAD
  4097.     DW    HLD
  4098.     DW    STORE
  4099.     DW    SEMIS
  4100. ;
  4101.     DB    82H    ; #>
  4102.     DB    '#'
  4103.     DB    '>'+80H
  4104.     DW    BDIGS-5
  4105. EDIGS    DW    DOCOL
  4106.     DW    DROP
  4107.     DW    DROP
  4108.     DW    HLD
  4109.     DW    AT
  4110.     DW    PAD
  4111.     DW    OVER
  4112.     DW    SUBB
  4113.     DW    SEMIS
  4114. ;
  4115.     DB    84H    ; SIGN
  4116.     DB    'SIG'
  4117.     DB    'N'+80H
  4118.     DW    EDIGS-5
  4119. SIGN    DW    DOCOL
  4120.     DW    ROT
  4121.     DW    ZLESS
  4122.     DW    ZBRAN    ; IF
  4123.     DW    SIGN1-$
  4124.     DW    LIT
  4125.     DW    2DH
  4126.     DW    HOLD    ; ENDIF
  4127. SIGN1    DW    SEMIS
  4128. ;
  4129.     DB    81H    ; #
  4130.     DB    '#'+80H
  4131.     DW    SIGN-7
  4132. DIG    DW    DOCOL
  4133.     DW    BASE
  4134.     DW    AT
  4135.     DW    MSMOD
  4136.     DW    ROT
  4137.     DW    LIT
  4138.     DW    9
  4139.     DW    OVER
  4140.     DW    LESS
  4141.     DW    ZBRAN    ; IF
  4142.     DW    DIG1-$
  4143.     DW    LIT
  4144.     DW    7
  4145.     DW    PLUS    ; ENDIF
  4146. DIG1    DW    LIT
  4147.     DW    30H
  4148.     DW    PLUS
  4149.     DW    HOLD
  4150.     DW    SEMIS
  4151. ;
  4152.     DB    82H    ; #S
  4153.     DB    '#'
  4154.     DB    'S'+80H
  4155.     DW    DIG-4
  4156. DIGS    DW    DOCOL
  4157. DIGS1    DW    DIG    ; BEGIN
  4158.     DW    TDUP
  4159.     DW    ORR
  4160.     DW    ZEQU
  4161.     DW    ZBRAN    ; UNTIL
  4162.     DW    DIGS1-$
  4163.     DW    SEMIS
  4164. ;
  4165.     DB    83H    ; D.R
  4166.     DB    'D.'
  4167.     DB    'R'+80H
  4168.     DW    DIGS-5
  4169. DDOTR    DW    DOCOL
  4170.     DW    TOR
  4171.     DW    SWAP
  4172.     DW    OVER
  4173.     DW    DABS
  4174.     DW    BDIGS
  4175.     DW    DIGS
  4176.     DW    SIGN
  4177.     DW    EDIGS
  4178.     DW    FROMR
  4179.     DW    OVER
  4180.     DW    SUBB
  4181.     DW    SPACS
  4182.     DW    TYPE
  4183.     DW    SEMIS
  4184. ;
  4185.     DB    82H    ; .R
  4186.     DB    '.'
  4187.     DB    'R'+80H
  4188.     DW    DDOTR-6
  4189. DOTR    DW    DOCOL
  4190.     DW    TOR
  4191.     DW    STOD
  4192.     DW    FROMR
  4193.     DW    DDOTR
  4194.     DW    SEMIS
  4195. ;
  4196.     DB    82H    ; D.
  4197.     DB    'D'
  4198.     DB    '.'+80H
  4199.     DW    DOTR-5
  4200. DDOT    DW    DOCOL
  4201.     DW    ZERO
  4202.     DW    DDOTR
  4203.     DW    SPACE
  4204.     DW    SEMIS
  4205. ;
  4206.     DB    81H    ; .
  4207.     DB    '.'+80H
  4208.     DW    DDOT-5
  4209. DOT    DW    DOCOL
  4210.     DW    STOD
  4211.     DW    DDOT
  4212.     DW    SEMIS
  4213. ;
  4214.     DB    81H    ; ?
  4215.     DB    '?'+80H
  4216.     DW    DOT-4
  4217. QUES    DW    DOCOL
  4218.     DW    AT
  4219.     DW    DOT
  4220.     DW    SEMIS
  4221. ;
  4222.     DB    82H    ; U.
  4223.     DB    'U'
  4224.     DB    '.'+80H
  4225.     DW    QUES-4
  4226. UDOT    DW    DOCOL
  4227.     DW    ZERO
  4228.     DW    DDOT
  4229.     DW    SEMIS
  4230. ;
  4231.     DB    85H    ; VLIST
  4232.     DB    'VLIS'
  4233.     DB    'T'+80H
  4234.     DW    UDOT-5
  4235. VLIST    DW    DOCOL
  4236.     DW    LIT
  4237.     DW    80H
  4238.     DW    OUTT
  4239.     DW    STORE
  4240.     DW    CONT
  4241.     DW    AT
  4242.     DW    AT
  4243. VLIS1    DW    OUTT    ; BEGIN
  4244.     DW    AT
  4245.     DW    CSLL
  4246.     DW    GREAT
  4247.     DW    ZBRAN    ; IF
  4248.     DW    VLIS2-$
  4249.     DW    CR
  4250.     DW    ZERO
  4251.     DW    OUTT
  4252.     DW    STORE    ; ENDIF
  4253. VLIS2    DW    DUP
  4254.     DW    IDDOT
  4255.     DW    SPACE
  4256.     DW    SPACE
  4257.     DW    PFA
  4258.     DW    LFA
  4259.     DW    AT
  4260.     DW    DUP
  4261.     DW    QTERM
  4262.     DW    ZBRAN    ; IF
  4263.     DW    VLIS3-$
  4264.     DW    KEY
  4265.     DW    LIT
  4266.     DW    13H
  4267.     DW    EQUAL
  4268.     DW    ZBRAN    ; IF
  4269.     DW    VLIS9-$
  4270.     DW    KEY
  4271.     DW    LIT
  4272.     DW    11H
  4273.     DW    EQUAL
  4274.     DW    ZEQU
  4275.     DW    ZBRAN    ; IF
  4276.     DW    VLIS3-$
  4277.     DW    SPSTO
  4278.     DW    QUIT    ;THEN
  4279.     DW    BRAN
  4280.     DW    VLIS3-$    ; ELSE
  4281. VLIS9    DW    SPSTO
  4282.     DW    QUIT    ; THEN
  4283. VLIS3    DW    ZEQU
  4284.     DW    ZBRAN    ; UNTIL
  4285.     DW    VLIS1-$
  4286.     DW    DROP
  4287.     DW    SEMIS
  4288. ;
  4289. ;------ EXIT CP/M  -----------------------
  4290. ;
  4291.     DB    83H    ; BYE
  4292.     DB    'BY'
  4293.     DB    'E'+80H
  4294.     DW    VLIST-8
  4295. BYE    DW    $+2
  4296.     JMP    0
  4297. ;-----------------------------------------------
  4298. ;
  4299.     DB    84H    ; PAGE        1.3
  4300.     DB    'PAG'
  4301.     DB    'E'+80H
  4302.     DW    BYE-6
  4303. PAG    DW    DOCOL
  4304.     DW    LIT,FF
  4305.     DW    EMIT,CR
  4306.     DW    SEMIS
  4307. ;
  4308.     DB    84H    ; LIST        1.3
  4309.     DB    'LIS'
  4310.     DB    'T'+80H
  4311.     DW    PAG-7
  4312. LIST    DW    DOCOL
  4313.     DW    CR,DUP
  4314.     DW    SCR,STORE
  4315.     DW    PDOTQ
  4316.     DB    6,'SCR # '
  4317.     DW    DOT
  4318.     DW    LIT,10H
  4319.     DW    ZERO,XDO
  4320. LIST1    DW    CR,IDO
  4321.     DW    LIT,3
  4322.     DW    DOTR,SPACE
  4323.     DW    IDO,SCR
  4324.     DW    AT,DLINE
  4325.     DW    QTERM        ; ?TERMINAL
  4326.     DW    ZBRAN,LIST2-$    ; IF
  4327.     DW    LEAVE        ; LEAVE
  4328. LIST2    DW    XLOOP,LIST1-$    ; ENDIF
  4329.     DW    CR,SEMIS
  4330. ;
  4331.     DB    85H    ; INDEX        1.3
  4332.     DB    'INDE'
  4333.     DB    'X'+80H
  4334.     DW    LIST-7
  4335. INDEX    DW    DOCOL
  4336.     DW    PAG
  4337.     DW    ONEP,SWAP
  4338.     DW    XDO
  4339. INDE1    DW    CR,IDO
  4340.     DW    LIT,3
  4341.     DW    DOTR,SPACE
  4342.     DW    ZERO,IDO
  4343.     DW    DLINE,QTERM
  4344.     DW    ZBRAN,INDE2-$
  4345.     DW    LEAVE
  4346. INDE2    DW    XLOOP,INDE1-$
  4347.     DW    SEMIS
  4348. ;
  4349.     DB    85H    ; TRIAD        1.3
  4350.     DB    'TRIA'
  4351.     DB    'D'+80H
  4352.     DW    INDEX-8
  4353. TRIAD    DW    DOCOL
  4354.     DW    PAG
  4355.     DW    LIT,3
  4356.     DW    SLASH
  4357.     DW    LIT,3
  4358.     DW    STAR
  4359.     DW    LIT,3
  4360.     DW    OVER,PLUS
  4361.     DW    SWAP,XDO
  4362. TRIA1    DW    CR,IDO
  4363.     DW    LIST
  4364.     DW    QTERM        ; ?TERMINAL
  4365.     DW    ZBRAN,TRIA2-$    ; IF
  4366.     DW    LEAVE        ; LEAVE
  4367. TRIA2    DW    XLOOP,TRIA1-$    ; ENDIF
  4368.     DW    CR
  4369.     DW    LIT,15
  4370.     DW    MESS,CR
  4371.     DW    SEMIS
  4372. ;
  4373.     DB    84H    ; SHOW        1.3
  4374.     DB    'SHO'
  4375.     DB    'W'+80H
  4376.     DW    TRIAD-8
  4377. SHOW    DW    DOCOL
  4378.     DW    ONEP,SWAP
  4379.     DW    XDO
  4380. SHOW1    DW    PAG,IDO
  4381.     DW    TRIAD
  4382.     DW    LIT,3
  4383.     DW    XPLOO,SHOW1-$
  4384.     DW    SEMIS
  4385. ;
  4386.     DB    84H    ; .CPU
  4387.     DB    '.CP'
  4388.     DB    'U'+80H
  4389.     DW    SHOW-7
  4390. DOTCPU    DW    DOCOL
  4391.     DW    BASE,AT
  4392.     DW    LIT,36
  4393.     DW    BASE,STORE
  4394.     DW    LIT,22H
  4395.     DW    PORIG,TAT
  4396.     DW    DDOT
  4397.     DW    BASE,STORE
  4398.     DW    SEMIS
  4399. ;
  4400.     DB    85H    ; MATCH
  4401.     DB    'MATC'
  4402.     DB    'H'+80H
  4403.     DW    DOTCPU-7
  4404. MATCH:    DW    $+2
  4405.     MOV    L,C    ; (HL) <-- (BC)
  4406.     MOV    H,B
  4407.     POP    B    ; (BC) <-- (0,N)
  4408.     MOV    A,C
  4409.     POP    D    ; (DE) <-- PAD
  4410.     POP    B    ; (BC) <-- (0,LENGTH)
  4411.     MOV    B,A    ; (BC) <-- (N,LEN)
  4412.     XTHL        ; (S1) <-- (IP)
  4413.             ; (HL) <-- (CURSOR)
  4414.     PUSH    H    ; SAVE CURSOR OVER IP
  4415.     PUSH    B    ; SAVE N,LEN
  4416.     INR    C
  4417.     DCX    H
  4418. MATCH1:    DCR    C
  4419.     MOV    A,C
  4420.     CMP    B    ; LEN < N ?
  4421.     JM    MATCH4    ; FAIL
  4422.     INX    H
  4423.     LDAX    D
  4424.     XRA    M    ; (PAD) = (CURSAD) ?
  4425.     JNZ    MATCH1    ; TRY AGAIN
  4426.     PUSH    H    ; SAVE CURSOR+I
  4427.     PUSH    D    ; SAVE PAD
  4428.     PUSH    B    ; SAVE N,LEN-I
  4429.     MVI    C,1    ; J=MATCH COUNT=1
  4430. MATCH2:    INR    C
  4431.     MOV    A,B
  4432.     CMP    C    ; J > N ?
  4433.     JM    MATCH5    ; SUCCEED
  4434.     INX    D
  4435.     INX    H
  4436.     LDAX    D
  4437.     XRA    M    ; MATCH ?
  4438.     JZ    MATCH2    ; NEXT CHAR
  4439.     POP    B    ; RESTORE PARAMS
  4440.     POP    D
  4441.     POP    H
  4442.     JMP    MATCH1
  4443. ;
  4444. MATCH4:    POP    D    ; (DE) <-- N,LEN
  4445.     POP    H    ; CURSAD
  4446.     POP    B    ; IP
  4447.     MVI    D,0
  4448.     XCHG
  4449.     LXI    D,0    ; FAIL
  4450.     JMP    DPUSH
  4451. ;
  4452. MATCH5:    POP    B    ; N,LEN-I
  4453.     POP    D    ; PAD
  4454.     POP    H    ; CURSAD+I
  4455.     POP    B    ; N,LEN
  4456.     POP    D    ; CURSAD
  4457.     MOV    A,L
  4458.     SUB    E
  4459.     MOV    L,A
  4460.     MOV    A,H
  4461.     SBB    D
  4462.     MOV    H,A    ; (HL) <-- I
  4463.     MOV    E,B
  4464.     MVI    D,0
  4465.     DAD    D    ; (HL) <-- I+N
  4466.     POP    B    ; IP
  4467.     LXI    D,1    ; SUCCEED
  4468.     JMP    DPUSH
  4469. ;
  4470.     DB    85H        ; DEPTH = NUMBER
  4471.     DB    'DEPT'        ; OF WORDS
  4472.     DB    'H'+80H        ; ON STACK
  4473.     DW    MATCH-8
  4474. DEPTH    DW    DOCOL
  4475.     DW    SPAT
  4476.     DW    SZERO
  4477.     DW    AT
  4478.     DW    SWAP
  4479.     DW    SUBB
  4480.     DW    TWO
  4481.     DW    SLASH
  4482.     DW    SEMIS
  4483. ;
  4484.     DB    84H    ; TEXT
  4485.     DB    'TEX'
  4486.     DB    'T'+80H
  4487.     DW    DEPTH-8
  4488. TEXT:    DW    DOCOL
  4489.     DW    HERE
  4490.     DW    CSLL
  4491.     DW    ONEP
  4492.     DW    BLANK
  4493.     DW    WORD
  4494.     DW    HERE
  4495.     DW    PAD
  4496.     DW    CSLL
  4497.     DW    ONEP
  4498.     DW    CMOVE
  4499.     DW    SEMIS
  4500. ;
  4501.     DB    84H    ; LINE
  4502.     DB    'LIN'
  4503.     DB    'E'+80H
  4504.     DW    TEXT-7
  4505. LINE:    DW    DOCOL
  4506.     DW    DUP
  4507.     DW    LIT
  4508.     DW    0FFF0H
  4509.     DW    ANDD
  4510.     DW    LIT
  4511.     DW    17H
  4512.     DW    QERR
  4513.     DW    SCR
  4514.     DW    AT
  4515.     DW    PLINE
  4516.     DW    DROP
  4517.     DW    SEMIS
  4518. ;
  4519.     DB    0C6H    ; EDITOR
  4520.     DB    'EDITO'
  4521.     DB    'R'+80H
  4522.     DW    LINE-7
  4523. EDITOR:    DW    DODOE
  4524.     DW    DOVOC
  4525.     DW    0A081H
  4526. EDITP    DW    ELAST    ; COLD START VALUE ONLY
  4527. ;        CHANGED WHEN NEW EDITOR DEF ADDED
  4528.  
  4529.     DW    0
  4530. ;
  4531.     DB    85H    ; WHERE
  4532.     DB    'WHER'
  4533.     DB    'E'+80H
  4534.     DW    EDITOR-9
  4535. WHERE:    DW    DOCOL
  4536.     DW    DUP
  4537.     DW    BSCR
  4538.     DW    SLASH
  4539.     DW    DUP
  4540.     DW    SCR
  4541.     DW    STORE
  4542.     DW    PDOTQ
  4543.     DB    6
  4544.     DB    'SCR # '
  4545.     DW    DEC
  4546.     DW    DOT
  4547.     DW    SWAP
  4548.     DW    CSLL
  4549.     DW    SLMOD
  4550.     DW    CSLL
  4551.     DW    STAR
  4552.     DW    ROT
  4553.     DW    BLOCK
  4554.     DW    PLUS
  4555.     DW    CR
  4556.     DW    CSLL
  4557.     DW    TYPE
  4558.     DW    CR
  4559.     DW    HERE
  4560.     DW    CAT
  4561.     DW    SUBB
  4562.     DW    SPACS
  4563.     DW    LIT
  4564.     DW    5EH
  4565.     DW    EMIT
  4566.     DW    BCOMP
  4567.     DW    EDITOR
  4568.     DW    QUIT
  4569.     DW    SEMIS
  4570.     PAGE
  4571. ;
  4572. ;    EDITOR DEFINITIONS
  4573. ;
  4574.     DB    83H    ; TOP
  4575.     DB    'TO'
  4576.     DB    'P'+80H
  4577.     DW    FORTH+4    ; CHAIN EDITOR VOCAB TO FORTH VOCAB
  4578. TOP    DW    DOCOL
  4579.     DW    ZERO
  4580.     DW    RNUM
  4581.     DW    STORE
  4582.     DW    SEMIS
  4583. ;
  4584.     DB    87H    ; #LOCATE
  4585.     DB    '#LOCAT'
  4586.     DB    'E'+80H    ; LEAVE CURSOR
  4587.     DW    TOP-6    ; OFFSET,LINE
  4588. NLOCAT    DW    DOCOL
  4589.     DW    RNUM
  4590.     DW    AT
  4591.     DW    CSLL
  4592.     DW    SLMOD
  4593.     DW    SEMIS
  4594. ;
  4595.     DB    85H    ; #LEAD
  4596.     DB    '#LEA'
  4597.     DB    'D'+80H    ; LINE ADDR,
  4598.     DW    NLOCAT-0AH
  4599. NLEAD    DW    DOCOL    ; OFFSET
  4600.     DW    NLOCAT
  4601.     DW    LINE
  4602.     DW    SWAP
  4603.     DW    SEMIS
  4604. ;
  4605.     DB    84H    ; #LAG
  4606.     DB    '#LA'    ; CURSOR ADDR,
  4607.     DB    'G'+80H    ; COUNT AFTER
  4608.     DW    NLEAD-8    ; CURSOR
  4609. NLAG    DW    DOCOL
  4610.     DW    NLEAD
  4611.     DW    DUP
  4612.     DW    TOR
  4613.     DW    PLUS
  4614.     DW    CSLL
  4615.     DW    FROMR
  4616.     DW    SUBB
  4617.     DW    SEMIS
  4618. ;
  4619.     DB    85H    ; -MOVE
  4620.     DB    '-MOV'    ; 
  4621.     DB    'E'+80H
  4622.     DW    NLAG-7
  4623. DMOVE    DW    DOCOL
  4624.     DW    LINE
  4625.     DW    CSLL
  4626.     DW    CMOVE
  4627.     DW    UPDAT
  4628.     DW    SEMIS
  4629. ;
  4630.     DB    81H    ; H
  4631.     DB    'H'+80H
  4632.     DW    DMOVE-8
  4633. EDH    DW    DOCOL
  4634.     DW    LINE
  4635.     DW    PAD
  4636.     DW    ONEP
  4637.     DW    CSLL
  4638.     DW    DUP
  4639.     DW    PAD
  4640.     DW    CSTOR
  4641.     DW    CMOVE
  4642.     DW    SEMIS
  4643. ;
  4644.     DB    81H    ; E
  4645.     DB    'E'+80H
  4646.     DW    EDH-4
  4647. EDE    DW    DOCOL
  4648.     DW    LINE
  4649.     DW    CSLL
  4650.     DW    BLANK
  4651.     DW    UPDAT
  4652.     DW    SEMIS
  4653. ;
  4654.     DB    81H    ; S
  4655.     DB    'S'+80H
  4656.     DW    EDE-4
  4657. EDS    DW    DOCOL
  4658.     DW    DUP
  4659.     DW    ONE
  4660.     DW    SUBB
  4661.     DW    LIT
  4662.     DW    0EH
  4663.     DW    XDO
  4664. EDS1    DW    IDO
  4665.     DW    LINE
  4666.     DW    IDO
  4667.     DW    ONEP
  4668.     DW    DMOVE
  4669.     DW    LIT
  4670.     DW    -1H
  4671.     DW    XPLOO
  4672.     DW    EDS1-$
  4673.     DW    EDE
  4674.     DW    SEMIS
  4675. ;
  4676.     DB    81H    ; D
  4677.     DB    'D'+80H
  4678.     DW    EDS-4
  4679. EDD    DW    DOCOL
  4680.     DW    DUP
  4681.     DW    EDH
  4682.     DW    LIT
  4683.     DW    0FH
  4684.     DW    DUP
  4685.     DW    ROT
  4686.     DW    XDO
  4687. EDD1    DW    IDO
  4688.     DW    ONEP
  4689.     DW    LINE
  4690.     DW    IDO
  4691.     DW    DMOVE
  4692.     DW    XLOOP
  4693.     DW    EDD1-$
  4694.     DW    EDE
  4695.     DW    SEMIS
  4696. ;
  4697.     DB    81H    ; M
  4698.     DB    'M'+80H
  4699.     DW    EDD-4
  4700. EDM    DW    DOCOL
  4701.     DW    RNUM
  4702.     DW    PSTOR
  4703.     DW    CR
  4704.     DW    NLOCAT
  4705.     DW    LIT
  4706.     DW    3
  4707.     DW    DOTR
  4708.     DW    SPACE
  4709.     DW    DROP
  4710.     DW    NLEAD
  4711.     DW    TYPE
  4712.     DW    LIT
  4713.     DW    5EH
  4714.     DW    EMIT
  4715.     DW    NLAG
  4716.     DW    TYPE
  4717.     DW    SEMIS
  4718. ;
  4719.     DB    81H    ; T
  4720.     DB    'T'+80H
  4721.     DW    EDM-4
  4722. EDT    DW    DOCOL
  4723.     DW    DUP
  4724.     DW    CSLL
  4725.     DW    STAR
  4726.     DW    RNUM
  4727.     DW    STORE
  4728.     DW    DUP
  4729.     DW    EDH
  4730.     DW    ZERO
  4731.     DW    EDM
  4732.     DW    SEMIS
  4733. ;
  4734.     DB    81H    ; L
  4735.     DB    'L'+80H
  4736.     DW    EDT-4
  4737. EDL    DW    DOCOL
  4738.     DW    SCR
  4739.     DW    AT
  4740.     DW    LIST
  4741.     DW    ZERO
  4742.     DW    EDM
  4743.     DW    SEMIS
  4744. ;
  4745.     DB    85H    ; CLEAR
  4746.     DB    'CLEA'
  4747.     DB    'R'+80H
  4748.     DW    EDL-4
  4749. CLEAR    DW    DOCOL
  4750.     DW    SCR
  4751.     DW    STORE
  4752.     DW    LIT
  4753.     DW    10H
  4754.     DW    ZERO
  4755.     DW    XDO
  4756. CLEA1    DW    IDO
  4757.     DW    EDE
  4758.     DW    XLOOP
  4759.     DW    CLEA1-$
  4760.     DW    SEMIS
  4761. ;
  4762.     DB    84H    ; COPY
  4763.     DB    'COP'
  4764.     DB    'Y'+80H
  4765.     DW    CLEAR-8
  4766. COPY    DW    DOCOL
  4767.     DW    BSCR
  4768.     DW    STAR
  4769.     DW    OFSET
  4770.     DW    AT
  4771.     DW    PLUS
  4772.     DW    SWAP
  4773.     DW    BSCR
  4774.     DW    STAR
  4775.     DW    BSCR
  4776.     DW    OVER
  4777.     DW    PLUS
  4778.     DW    SWAP
  4779.     DW    XDO
  4780. COP1    DW    DUP
  4781.     DW    IDO
  4782.     DW    BLOCK
  4783.     DW    TWO
  4784.     DW    SUBB
  4785.     DW    STORE
  4786.     DW    ONEP
  4787.     DW    UPDAT
  4788.     DW    XLOOP
  4789.     DW    COP1-$
  4790.     DW    DROP
  4791.     DW    FLUSH
  4792.     DW    SEMIS
  4793. ;
  4794.     DB    85H    ; 1LINE
  4795.     DB    '1LIN'
  4796.     DB    'E'+80H
  4797.     DW    COPY-7
  4798. ONELN    DW    DOCOL
  4799.     DW    NLAG
  4800.     DW    PAD
  4801.     DW    COUNT
  4802.     DW    MATCH
  4803.     DW    RNUM
  4804.     DW    PSTOR
  4805.     DW    SEMIS
  4806. ;
  4807.     DB    84H    ; FIND
  4808.     DB    'FIN'
  4809.     DB    'D'+80H
  4810.     DW    ONELN-8
  4811. FIND    DW    DOCOL    ; BEGIN
  4812. FIN1    DW    LIT
  4813.     DW    3FFH
  4814.     DW    RNUM
  4815.     DW    AT
  4816.     DW    LESS
  4817.     DW    ZBRAN    ; IF
  4818.     DW    FIN2-$
  4819.     DW    TOP
  4820.     DW    PAD
  4821.     DW    HERE
  4822.     DW    CSLL
  4823.     DW    ONEP
  4824.     DW    CMOVE
  4825.     DW    ZERO
  4826.     DW    ERROR    ; ENDIF
  4827. FIN2    DW    ONELN
  4828.     DW    ZBRAN    ; UNTIL
  4829.     DW    FIN1-$
  4830.     DW    SEMIS
  4831. ;
  4832.     DB    86H    ; DELETE
  4833.     DB    'DELET'
  4834.     DB    'E'+80H
  4835.     DW    FIND-7
  4836. DELETE    DW    DOCOL
  4837.     DW    TOR
  4838.     DW    NLAG
  4839.     DW    PLUS
  4840.     DW    RR
  4841.     DW    SUBB
  4842.     DW    NLAG
  4843.     DW    RR
  4844.     DW    MINUS
  4845.     DW    RNUM
  4846.     DW    PSTOR
  4847.     DW    NLEAD
  4848.     DW    PLUS
  4849.     DW    SWAP
  4850.     DW    CMOVE
  4851.     DW    FROMR
  4852.     DW    BLANK
  4853.     DW    UPDAT
  4854.     DW    SEMIS
  4855. ;
  4856.     DB    81H    ; R
  4857.     DB    'R'+80H
  4858.     DW    DELETE-9
  4859. EDR    DW    DOCOL
  4860.     DW    PAD
  4861.     DW    ONEP
  4862.     DW    SWAP
  4863.     DW    DMOVE
  4864.     DW    SEMIS
  4865. ;
  4866.     DB    81H    ; P
  4867.     DB    'P'+80H
  4868.     DW    EDR-4
  4869. EDP    DW    DOCOL
  4870.     DW    ONE
  4871.     DW    TEXT
  4872.     DW    EDR
  4873.     DW    SEMIS
  4874. ;
  4875.     DB    81H    ; I
  4876.     DB    'I'+80H
  4877.     DW    EDP-4
  4878. EDI    DW    DOCOL
  4879.     DW    DUP
  4880.     DW    EDS
  4881.     DW    EDR
  4882.     DW    SEMIS
  4883. ;
  4884.     DB    81H    ; N
  4885.     DB    'N'+80H
  4886.     DW    EDI-4
  4887. EDN    DW    DOCOL
  4888.     DW    FIND
  4889.     DW    ZERO
  4890.     DW    EDM
  4891.     DW    SEMIS
  4892. ;
  4893.     DB    81H    ; F
  4894.     DB    'F'+80H
  4895.     DW    EDN-4
  4896. EDF    DW    DOCOL
  4897.     DW    ONE
  4898.     DW    TEXT
  4899.     DW    EDN
  4900.     DW    SEMIS
  4901. ;
  4902.     DB    81H    ; B
  4903.     DB    'B'+80H
  4904.     DW    EDF-4
  4905. EDB    DW    DOCOL
  4906.     DW    PAD
  4907.     DW    CAT
  4908.     DW    MINUS
  4909.     DW    EDM
  4910.     DW    SEMIS
  4911. ;
  4912.     DB    81H    ; X
  4913.     DB    'X'+80H
  4914.     DW    EDB-4
  4915. EDX    DW    DOCOL
  4916.     DW    ONE
  4917.     DW    TEXT
  4918.     DW    FIND
  4919.     DW    PAD
  4920.     DW    CAT
  4921.     DW    DELETE
  4922.     DW    ZERO
  4923.     DW    EDM
  4924.     DW    SEMIS
  4925. ;
  4926.     DB    84H    ; TILL
  4927.     DB    'TIL'
  4928.     DB    'L'+80H
  4929.     DW    EDX-4
  4930. TILL    DW    DOCOL
  4931.     DW    NLEAD
  4932.     DW    PLUS
  4933.     DW    ONE
  4934.     DW    TEXT
  4935.     DW    ONELN
  4936.     DW    ZEQU
  4937.     DW    ZERO
  4938.     DW    QERR
  4939.     DW    NLEAD
  4940.     DW    PLUS
  4941.     DW    SWAP
  4942.     DW    SUBB
  4943.     DW    DELETE
  4944.     DW    ZERO
  4945.     DW    EDM
  4946.     DW    SEMIS
  4947. ;
  4948.     DB    83H    ; PUT
  4949.     DB    'PU'
  4950.     DB    'T'+80H
  4951.     DW    TILL-7
  4952. EPUT    DW    DOCOL
  4953.     DW    PAD
  4954.     DW    COUNT
  4955.     DW    NLAG
  4956.     DW    ROT
  4957.     DW    OVER
  4958.     DW    MIN
  4959.     DW    TOR
  4960.     DW    RR
  4961.     DW    RNUM
  4962.     DW    PSTOR
  4963.     DW    RR
  4964.     DW    SUBB
  4965.     DW    TOR
  4966.     DW    DUP
  4967.     DW    HERE
  4968.     DW    RR
  4969.     DW    CMOVE
  4970.     DW    HERE
  4971.     DW    NLEAD
  4972.     DW    PLUS
  4973.     DW    FROMR
  4974.     DW    CMOVE
  4975.     DW    FROMR
  4976.     DW    CMOVE
  4977.     DW    UPDAT
  4978.     DW    ZERO
  4979.     DW    EDM
  4980.     DW    SEMIS
  4981. ;
  4982. ELAST    DB    81H    ; C
  4983.     DB    'C'+80H
  4984.     DW    EPUT-6
  4985. EDC    DW    DOCOL
  4986.     DW    ONE
  4987.     DW    TEXT
  4988.     DW    EPUT
  4989.     DW    SEMIS
  4990. ;
  4991. ;    FORTH DEFINITIONS ( CONTINUED )
  4992. ;
  4993. FLAST    DB    84H    ; TASK
  4994.     DB    'TAS'
  4995.     DB    'K'+80H
  4996.     DW    WHERE-8
  4997. TASK    DW    DOCOL
  4998.     DW    SEMIS
  4999. ;
  5000. INITDP    DS    EM-$    ;CONSUME MEMORY TO LIMIT
  5001. ;
  5002.     PAGE
  5003. ;
  5004. ;        MEMORY MAP
  5005. ;    ( THE FOLLOWING EQUATES ARE NOT REFERENCED ELSEWHERE )
  5006. ;
  5007. ;        LOCATION    CONTENTS
  5008. ;        --------    --------
  5009. MCOLD    EQU     ORIG        ;JMP TO COLD START
  5010. MWARM    EQU    ORIG+4        ;JMP TO WARM START
  5011. MA2    EQU    ORIG+8        ;COLD START PARAMETERS
  5012. MUP    EQU    UP        ;USER VARIABLES' BASE 'REG'
  5013. MRP    EQU    RPP        ;RETURN STACK 'REGISTER'
  5014. ;
  5015. MBIP    EQU    BIP        ;DEBUG SUPPORT
  5016. MDPUSH    EQU    DPUSH        ;ADDRESS INTERPRETER
  5017. MHPUSH    EQU    HPUSH
  5018. MNEXT    EQU    NEXT
  5019. ;
  5020. MDP0    EQU    DP0        ;START FORTH DICTIONARY
  5021. MDIO    EQU    DRIVE          ;CP/M DISK INTERFACE
  5022. MCIO    EQU    EPRINT          ;CONSOLE & PRINTER INTERFACE
  5023. MIDP    EQU    INITDP        ;END INITIAL FORTH DICTIONARY
  5024. ;                  = COLD (DP) VALUE
  5025. ;                  = COLD (FENCE) VALUE
  5026. ;                  |  NEW
  5027. ;                  |  DEFINITIONS
  5028. ;                  V
  5029. ;
  5030. ;                  ^
  5031. ;                  |  DATA
  5032. ;                  |  STACK
  5033. MIS0    EQU    INITS0        ;  = COLD (SP) VALUE = (S0)
  5034. ;                   = (TIB)
  5035. ;                  |  TERMINAL INPUT
  5036. ;                  |  BUFFER
  5037. ;                  V
  5038. ;
  5039. ;                  ^
  5040. ;                  |  RETURN
  5041. ;                  |  STACK
  5042. MIR0    EQU    INITR0        ;START USER VARIABLES
  5043. ;                  = COLD (RP) VALUE = (R0)
  5044. ;                  = (UP)
  5045. ;                ;END USER VARIABLES
  5046. MFIRST    EQU    BUF1        ;START DISK BUFFERS
  5047. ;                  = FIRST
  5048. MEND    EQU    EM-1        ;END DISK BUFFERS
  5049. MLIMIT    EQU    EM        ;LAST MEMORY LOC USED + 1
  5050. ;                  = LIMIT
  5051. ;
  5052. ;
  5053.     END    ORIG
  5054.