home *** CD-ROM | disk | FTP | other *** search
/ Oakland CPM Archive / oakcpm.iso / cpmug / cpmug010.ark / LLLBASIC.ASM < prev    next >
Assembly Source File  |  1984-04-29  |  87KB  |  2,567 lines

  1. ;###S
  2. ;MODIFIED BY A.R.G 10/9/77 FOR CP/M ASSEMBLER.
  3. ;CHANGES ENCLOSED IN ;###S AND ;###E WITH ORIGINAL
  4. ;CODE REMAINING AS COMMENTS.
  5. ;
  6. MEMST    EQU    1800H    ;ACTIVE VAR TABLE.  NOT START OF FREE MEMORY
  7. ;MEMST     EQU    2000Q            ;MUST BE ON PAGE BOUNDARY
  8. ; DEFINE I-O/SP/SUB ADD. JUMP TABLE LOCATIONS
  9. INIT    EQU    1920H    ;INITIALIZATION ROUTINE IN MONITOR
  10. IOJUMP    EQU    1900H
  11. SPNT    EQU    IOJUMP    ;STACK ADDRESS IS FIRST WORD IN IOJUMP TABLE
  12. SUBAD    EQU    IOJUMP+2
  13. CONIN    EQU    IOJUMP+4
  14. CONOUT    EQU    IOJUMP+7
  15. STATUS    EQU    IOJUMP+0AH
  16. HSRDR    EQU    IOJUMP+0DH
  17. FPTBL    EQU    1774H
  18. NORM    EQU    FPTBL
  19. FLOAT    EQU    FPTBL+3
  20. ZROL    EQU    FPTBL+6
  21. LADD    EQU    FPTBL+9H
  22. LMUL    EQU    FPTBL+0CH
  23. LDIV    EQU    FPTBL+0FH
  24. LSUB    EQU    FPTBL+12H
  25. DFXL    EQU    FPTBL+15H
  26. LMCM    EQU    FPTBL+18H
  27. CONV    EQU    FPTBL+1EH
  28. FINPT    EQU    FPTBL+21H
  29. MULT    EQU    FPTBL+24H
  30. PTVAL    EQU    FPTBL+27H
  31. DCOMP    EQU    FPTBL+2AH
  32. MCHK    EQU    FPTBL+2DH
  33. CHAR2    EQU    FPTBL+30H
  34. ;SPNT      EQU    400Q
  35. ;SUBAD     EQU    402Q
  36. ;CONIN     EQU    404Q
  37. ;CONOUT    EQU    407Q
  38. ;STATUS    EQU    412Q
  39. ;HSRDR     EQU    415Q
  40. ;
  41. ;###E
  42. OBUFF     EQU    MEMST            ;INPUT AND OUTPUT BUFFERS OCCUPY
  43. IBUF      EQU    MEMST+1          ;SAME AREA
  44. STLINE    EQU    MEMST+111Q
  45. NLINE     EQU    MEMST+113Q   
  46. NL2       EQU    MEMST+115Q
  47. NL4       EQU    MEMST+117Q
  48. NL6       EQU    MEMST+121Q
  49. KLINE     EQU    MEMST+122Q
  50. KL2       EQU    MEMST+124Q
  51. KL4       EQU    MEMST+126Q
  52. KL6       EQU    MEMST+130Q
  53. PLINE     EQU    MEMST+131Q
  54. PL2       EQU    MEMST+133Q
  55. PL4       EQU    MEMST+135Q
  56. SBSAV     EQU    PL4              ;RETURN ADD. SAVE FOR CALL STMT.
  57. PL6       EQU    MEMST+137Q
  58. KASE      EQU    MEMST+140Q
  59. LEN       EQU    MEMST+141Q
  60. MULT1     EQU    MEMST+142Q
  61. MULT2     EQU    MEMST+144Q
  62. NXTSP     EQU    MEMST+131Q
  63. STSPAC    EQU    MEMST+113Q
  64. ;###S
  65. ;NORM      EQU    113707Q
  66. ;FLOAT     EQU    113712Q
  67. ;ZROL      EQU    113715Q
  68. ;###E
  69. LPNT      EQU    MEMST+122Q
  70. KLEN      EQU    MEMST+130Q
  71. CPNT      EQU    MEMST+133Q
  72. KFPNT     EQU    MEMST+126Q
  73. FREG2     EQU    MEMST+200Q
  74. CREG      EQU    MEMST+204Q
  75. ;###S
  76. ;LADD      EQU    113720Q
  77. ;LMUL      EQU    113723Q
  78. ;LDIV      EQU    113726Q
  79. ;LSUB      EQU    113731Q
  80. ;DFXL      EQU    113734Q
  81. ;LMCM      EQU    113737Q
  82. ;###E
  83. HLINP     EQU    MEMST+206Q
  84. GREG      EQU    MEMST+167Q
  85. FREG1     EQU    MEMST+174Q
  86. SCR       EQU    MEMST+146Q
  87. ;###S
  88. ;CONV      EQU    113745Q
  89. ;###E
  90. MODE      EQU    MEMST+205Q
  91. ;###S
  92. ;FINPT     EQU    113750Q
  93. ;MULT      EQU    113753Q
  94. ;PTVAL     EQU    113756Q
  95. ;DCOMP     EQU    113761Q
  96. ;MCHK      EQU    113764Q
  97. ;CHAR2     EQU    113767Q
  98. ;###E
  99. MESCR     EQU    MEMST+210Q       ;DEFINE MEMORY SCR AREA PNTR
  100. VARAD     EQU    MEMST+212Q       ;TEMP SPACE FOR INP. STMT.
  101. VNAME     EQU    MEMST+214Q       ;TEMP SPACE FOR 'FOR-NEXT'
  102. VLOC      EQU    MEMST+216Q       ;TEMP SPACE FOR 'FOR-NEXT'
  103. FLIMT     EQU    MEMST+220Q       ;TEMP SPACE FOR 'FOR-NEXT'
  104. NEST      EQU    MEMST+224Q       ;NESTING STACK-POINTER
  105. STAC      EQU    MEMST+226Q       ;FOR-NEXT NESTING STACK
  106. ;###S
  107. ;STSIZ     SET    20               ;STACK SIZE, ALLOWS 10 NESTED FOR-NEXT
  108. STSIZ    EQU    20
  109. ;###E
  110. TOPNS     EQU    STAC             ;TOP OF STACK
  111. BOTNS     EQU    STAC+STSIZ       ;BOTTOM OF STACK
  112. VEND      EQU    MEMST+252Q       ;DEF. END OF VAR. STORAGE AREA
  113. ;###S
  114. FWAM    EQU    1923H    ;POINTER TO FREE MEMORY MOVED OUT OF INTERP
  115. ;###E
  116. ;  MAIN ROUTINE--HANDLES ALL USER INPUT
  117. ;###S
  118.     ORG    0100H
  119. ;          ORG    100000Q
  120.     JMP    INIT
  121. ;###E
  122. M1:       LXI    H,OBUFF
  123.           MVI    M,1
  124.           LXI    H,STLINE
  125.           MVI    M,377Q
  126.           INR    L
  127.           MVI    M,377Q
  128.           LHLD   FWAM             ;GET ADDRES OF FWA MEM.
  129.           SHLD   NLINE            ;STORE IN FREE SPACE PNTR.
  130. M1A:      LHLD   SPNT
  131.           SPHL
  132. M2:       LXI    H,ODATA
  133.           CALL   FORM1
  134.           CALL   WRIT
  135. M3:       LHLD   NLINE
  136.           INX    H
  137.           INX    H
  138.           INX    H
  139.           INX    H
  140.           INX    H
  141.           CALL   TTYIN
  142.           MOV    C,A
  143.           CPI    0
  144.           JZ     M3
  145.           CALL   ALPHA
  146.           JC     M4
  147.           CALL   NUMB
  148.           CNC    WHAT
  149.           CALL   INSERT
  150.           JMP    M3
  151. M4:       MVI    A,0
  152.           CALL   SYMSRT
  153. M4A:      INR    A
  154.           CZ     WHAT
  155.           DCR    A
  156.           JZ     RUN
  157.           DCR    A
  158.           CZ     TAPE
  159.           JZ     M2
  160.           DCR    A
  161.           CZ     LIST
  162.           JZ     M2
  163.           DCR    A
  164.           JZ     M1
  165.           DCR    A
  166.           CNZ    WHAT
  167. ; ROUTINE TO INPUT FROM HSR
  168. PTAPE:    CALL   CHAR5
  169.           CPI    0
  170.           JZ     PTAPE
  171. PT1:      CALL   HSRIN
  172.           MOV    C,A
  173.           CPI    0
  174.           JZ     PTAPE
  175.           CALL   ALPHA
  176.           JC     M4
  177.           CALL   INSERT
  178.           CALL   CHAR5
  179.           CPI    0
  180.           JZ     M2
  181.           INX    H
  182.           INX    H
  183.           INX    H
  184.           INX    H
  185.           INX    H
  186.           JMP    PT1
  187. ; ROUTINE TO HANDLE ALL SOURCE LINE INPUT.
  188. ; THIS INCLUDES INSERTION, DELEATION, AND
  189. ; ADDITION OF NEW SOURCE LINES.
  190. INSERT:   DCX    H
  191.           MOV    M,C
  192.           INX    H
  193.           CALL   CVB
  194.           CPI    5
  195.           JC     ISR1A
  196.           CNZ    WHAT
  197.           MOV    A,E
  198.           RAL
  199.           CC     WHAT
  200. ISR1A:   LHLD   NLINE
  201.           MOV    M,D
  202.           INX    H
  203.           MOV    M,E
  204.           LXI    H,NLINE
  205.           CALL   PTVAL
  206.           LHLD   STLINE
  207.           CALL   CHK1
  208.           JNC    ISRT3
  209.           LHLD   NLINE
  210.           SHLD   STLINE
  211. ISRT1:    MVI    D,377Q
  212.           MOV    E,D
  213.           CALL   STPNT
  214.           INX    H
  215. ISRT2:    MOV    A,M
  216.           ADI    5
  217.           LHLD   NLINE
  218.           ADD    L
  219.           MOV    L,A
  220.           MVI    A,0
  221.           ADC    H
  222.           MOV    H,A
  223.           SHLD   NLINE
  224.           RET
  225. ISRT3:    SHLD   KLINE
  226. ISRT4:    LXI    H,KLINE
  227.           CALL   PTVAL
  228.           LXI    H,NL2
  229.           MOV    D,M
  230.           INR    L
  231.           MOV    E,M
  232.           LXI    H,KL2
  233.           MOV    B,M
  234.           INR    L
  235.           MOV    C,M
  236.           CALL   DCOMP
  237.           JZ     ISRT6
  238.           JC     ISR12
  239.           LHLD   KL4
  240.           CALL   CHK1
  241.           JC     ISRT5
  242.           PUSH   H
  243.           LHLD   KLINE
  244.           SHLD   PLINE
  245.           LXI    H,PLINE
  246.           CALL   PTVAL
  247.           POP    H
  248.           SHLD   KLINE
  249.           JMP    ISRT4
  250. ISRT5:    LHLD   NLINE
  251.           CALL   NOLINE
  252.           RZ
  253.           XCHG
  254.           LHLD   KLINE
  255.           CALL   STPNT
  256.           XCHG
  257.           JMP    ISRT1
  258. ISRT6:    LHLD   NLINE
  259.           CALL   NOLINE
  260.           JNZ    ISRT8
  261.           LHLD   STLINE
  262.           XCHG
  263.           LHLD   KLINE
  264.           PUSH   H
  265.           POP    B
  266.           CALL   DCOMP
  267.           LHLD   KL4
  268.           JZ     ISRT7
  269.           XCHG
  270.           LHLD   PLINE
  271.           CALL   STPNT
  272.           RET
  273. ISRT7:    SHLD   STLINE
  274.           RET
  275. ISRT8:    LHLD   KL4
  276.           XCHG
  277.           LHLD   NLINE
  278.           CALL   STPNT
  279. ISRT9:    LHLD   KLINE
  280.           XCHG
  281.           LHLD   STLINE
  282.           PUSH   H
  283.           POP    B
  284.           CALL   DCOMP
  285.           JZ     ISR11
  286.           LHLD   NLINE
  287.           XCHG
  288.           LHLD   PLINE
  289.           CALL   STPNT
  290. ISR10:   LXI    H,NL6
  291.           JMP    ISRT2
  292. ISR11:   LHLD   NLINE
  293.           SHLD   STLINE
  294.           JMP    ISR10
  295. ISR12:   LHLD   KLINE
  296.           XCHG
  297.           LHLD   NLINE
  298.           CALL   NOLINE
  299.           RZ
  300.           CALL   STPNT
  301.           JMP    ISRT9
  302. ; ROUTINE TO STORE POINTERS INTO MEM ARRAY
  303. STPNT:    INX    H
  304.           INX    H
  305.           MOV    M,E
  306.           INX    H
  307.           MOV    M,D
  308.           RET
  309. ; ROUTINE TO CHECK NEW LINE FOR SOURCE STMT.
  310. NOLINE:   PUSH   H
  311.           INX    H
  312.           INX    H
  313.           INX    H
  314.           INX    H
  315.           MOV    C,M
  316.           INX    H
  317.           CALL   LENGTH
  318.           POP    H
  319.           CMP    C
  320.           RET
  321. ; ROUTINE TO RESPOND WITH 'WHAT?' FOR UNIDENTIFIED
  322. ; COMMAND.
  323. WHAT:     LXI    H,ODATA
  324.           CALL   FORM7
  325.           CALL   WRIT
  326.           JMP    M1A
  327. ; ROUTINE TO PUNCH PAPER TAPE OF SOURCE.
  328. TAPE:     PUSH   PSW
  329.           PUSH   B
  330.           LXI    H,ODATA
  331.           CALL   FORM2
  332.           CALL   WRIT
  333.           MVI    A,0
  334.           POP    B
  335.           MVI    B,100Q
  336.           PUSH   PSW
  337.           PUSH   B
  338.           CALL   PAD
  339.           CALL   WRIT
  340.           POP    B
  341.           PUSH   B
  342.           CALL   LIST
  343.           POP    B
  344.           POP    PSW
  345.           CALL   PAD
  346.           CALL   WRIT
  347.           POP    PSW
  348.           RET
  349. ; ROUTINE TO LIST TO TTY THE SOURCE STMTS.
  350. LIST:     LHLD   STLINE
  351.           CALL   CHK1
  352.           JC     M1A
  353.           SHLD   PLINE
  354.           LXI    H,177777Q
  355.           SHLD   KLINE
  356.           DCR    C
  357.           CNZ    BOUND
  358.           LHLD   PLINE
  359. LIS1:     INX    H
  360.           INX    H
  361.           MOV    B,M
  362.           INX    H
  363.           MOV    C,M
  364.           PUSH   B
  365.           INX    H
  366.           CALL   FORM5
  367.           CALL   WRIT
  368.           POP    B
  369.           LHLD   KLINE
  370.           XCHG
  371.           CALL   DCOMP
  372.           RZ
  373.           MOV    L,B
  374.           MOV    H,C
  375.           CALL   QUITT            ;CHECK FOR INTERRUPTION
  376.           JMP    LIS1             ;NONE - CONTINUE
  377. ;THIS ROUTINE CHECKS PORT 2 FOR A CNTRL/S CHARACTER
  378. ;IF ONE IS FOUND THEN EXECUTION IS TO BE INTERRUPTED
  379. ;CONTROL IS PASSED TO M1A
  380. QUITT:    CALL   STATUS            ;TEST FLAG PORT
  381.           RAR                     ;FLAG TO CY
  382.           RNC                     ;NOTHING THERE
  383.           CALL   CONIN            ;FLAG WAS SET, GET DATA
  384. QTCHK:    CPI    223Q             ;WAS IT CNTRL/S?
  385.           JZ     M1A              ;YES
  386.           RET                     ;NO, RETURN
  387. ;  ROUTINES NUMB AND ALPHA CHECK IF CONTENTS OF MEMORY
  388. ;  LOCATION IN HL CONTAIN ASCII NUMERIC OR ALPHBETIC
  389. ; CHARACTER. RETURN CY=1 IF YES, CY=0 IF NO.
  390. NUMB:     PUSH   B
  391.           MVI    B,260Q
  392.           MVI    C,272Q
  393. C1:       MOV    A,M
  394.           CMP    B
  395.           CMC
  396.           JNC    BAC
  397.           CMP    C
  398. BAC:      POP    B
  399.           RET
  400. ALPHA:    PUSH   B
  401.           MVI    B,301Q
  402.           MVI    C,333Q
  403.           JMP    C1
  404. ; ROUTINE TO CONVERT ASCII NUMERIC CHAR. STRING TO
  405. ; EQUIVALENT BINARY NUMBER. RETURNS EQUIVALENT IN
  406. ; DE REG.  LENGTH OF LINE PASSED IN REG C AND
  407. ; RETURNED POINTING TO LAST NUMERIC CHAR. LENGTH
  408. ; OF CHAR STRING RETURNED IN REG A.
  409. CVB:      PUSH   H
  410.           PUSH   B
  411.           CALL   LENGTH
  412.           PUSH   PSW
  413.           PUSH   H
  414.           CPI    0
  415.           JZ     CVB2
  416.           LXI    H,KASE
  417.           MOV    M,A
  418.           INR    L
  419.           MOV    M,C
  420.           LXI    H,10
  421.           SHLD   MULT1
  422.           LXI    H,0
  423.           SHLD   MULT2
  424.           LXI    H,MULT2+1
  425. CVB1:     CALL   MULT
  426.           XTHL
  427.           MOV    A,M
  428.           SBI    260Q
  429.           ADD    D
  430.           MOV    D,A
  431.           MVI    A,0
  432.           ADC    E
  433.           MOV    E,A
  434.           INX    H
  435.           XTHL
  436.           MOV    M,D
  437.           INR    L
  438.           MOV    M,E
  439.           PUSH   H
  440.           LXI    H,LEN
  441.           DCR    M
  442.           DCR    L
  443.           DCR    M
  444.           POP    H
  445.           JNZ    CVB1
  446. CVB2:     POP    H
  447.           POP    PSW
  448.           POP    B
  449.           LXI    H,LEN
  450.           MOV    C,M
  451.           POP    H
  452.           RET
  453. ; ROUTINE TO EVALUATE LENGTH OF ASCII NUMERIC
  454. ; CHAR STRING: PASSED ADD OF FIRST CHAR IN HL REG.
  455. ; RETURNS LENGTH IN REG A.
  456. LENGTH:   PUSH   B
  457.           PUSH   H
  458.           MVI    B,0
  459. NLE1:     CALL   NUMB
  460.           JNC    NLE2
  461.           INX    H
  462.           INR    B
  463.           DCR    C
  464.           JZ     NLE2
  465.           JMP    NLE1
  466. NLE2:     MOV    A,B
  467.           POP    H
  468.           POP    B
  469.           RET
  470. ; ROUTINE TO LOCATE SOURCE LINE IN MEM. PASSED BIN VALUE
  471. ;OF LINE NUMBER IN DE(LOW,HIGH) REG. RETURNS ADDRESS OF
  472. ;SOURCE LINE IN HL REGS.(HIGH,LOW). CY SET=OT FOUND.
  473. NSRCH:    LHLD   STLINE
  474. L2:       CALL   CHK1
  475.           RC
  476.           MOV    B,M
  477.           INX    H
  478.           MOV    C,M
  479.           CALL   DCOMP
  480.           JZ     FOUND
  481.           INX    H
  482.           MOV    A,M
  483.           INX    H
  484.           MOV    H,M
  485.           MOV    L,A
  486.           JMP    L2
  487. FOUND:    DCX    H
  488.           ORA    A
  489.           RET
  490. ; ROUTINE TO COMPARE CONTENTS OF HL TO 177777Q.
  491. ; RETURNS CY=1 IF YES: CY=0 IF NO.
  492. CHK1:     PUSH   B
  493.           PUSH   H
  494.           MVI    B,0
  495.           MVI    C,1
  496.           DAD    B
  497.           POP    H
  498.           POP    B
  499.           RET
  500. ; ROUTINE TO PAD OUTPUT BUFFER WITH CONTENTS OF REG A.
  501. ; REG B CONTAINS NUMBER OF CHAR TO PAD.
  502. PAD:      PUSH   B
  503.           PUSH   D
  504.           PUSH   H
  505.           LXI    H,OBUFF
  506.           MOV    C,L
  507.           MOV    L,M
  508.           MOV    D,A
  509.           MVI    A,73
  510. P1:       CMP    L
  511.           JNZ    P2
  512.           MOV    L,C
  513.           MOV    M,A
  514.           CALL   WRIT
  515.           INR    L
  516. P2:       MOV    M,D
  517.           INR    L
  518.           DCR    B
  519.           JNZ    P1
  520.           MOV    A,D
  521.           MOV    B,L
  522.           MOV    L,C
  523.           MOV    M,B
  524.           POP    H
  525.           POP    D
  526.           POP    B
  527.           RET
  528. ; ROUTINE TO DUMP OUTPUT BUFFER TO TTY.
  529. WRIT:     MVI    D,0
  530. WRIT1:    PUSH   PSW
  531.           PUSH   H
  532.           PUSH   B
  533.           LXI    H,OBUFF
  534.           PUSH   H
  535.           MOV    C,M
  536.           DCR    C
  537.           JZ     W2
  538.           INR    L
  539. W1:       MOV    A,M
  540.           CALL   CONOUT           ;PRINT VIA ODT
  541.           INR    L
  542.           DCR    C
  543.           JNZ    W1
  544.           DCR    D
  545.           JZ     W2
  546.           MVI    A,215Q
  547.           CALL   CONOUT           ;PRINT VIA ODT
  548.           MVI    A,212Q
  549.           CALL   CONOUT           ;PRINT VIA ODT
  550. W2:       POP    H
  551.           MVI    M,1
  552.           POP    B
  553.           POP    H
  554.           POP    PSW
  555.           RET
  556. ; ROUTINE TO LOCATE COMMANDS, KEY WORDS, OPERATORS,
  557. ; AND FUNCTION.  HL CONTAINS ADD OF FIRST CHAR.:
  558. ; REG C CONTAINS LENGTH OF LINE: RETURNS SYMBOL NUMBER
  559. ; IF FOUND IN REG A, 377Q IN A IF NOT FOUND.
  560. SYMSRT:   PUSH   D
  561.           PUSH   B
  562.           PUSH   H
  563.           PUSH   H
  564.           LXI    H,LEN            ;SAVE C IN LEN
  565.           MOV    M,C
  566.           LXI    H,KDATA          ;LOCATE TYPE OF SYMBOL SOUGHT.
  567.           MVI    E,0              ;REG A CONTAINS:
  568.           ADD    L                ; 0 FOR COMMAND
  569.           MOV    L,A              ; 1 FOR KEYWORD
  570.           MOV    L,M              ; 2 FOR OPERATOR AND DELIMITER
  571. S2:       MOV    C,M              ; 3 FOR FUNCTION
  572. S3:       INR    L
  573.           MOV    B,M
  574.           XTHL
  575.           MOV    A,M
  576.           CMP    B
  577.           JNZ    S4
  578.           DCR    C
  579.           JZ     S5
  580.           PUSH   H
  581.           LXI    H,LEN
  582.           DCR    M
  583.           POP    H
  584.           JZ     S4A
  585.           INX    H
  586.           XTHL
  587.           JMP    S3
  588. S4A:      INR    C
  589. S4:       POP    H
  590.           MOV    A,C
  591.           ADD    L
  592.           MOV    D,H
  593.           POP    H
  594.           POP    B
  595.           PUSH   B
  596.           PUSH   H
  597.           PUSH   H
  598.           LXI    H,LEN
  599.           MOV    M,C
  600.           MOV    L,A
  601.           MOV    H,D
  602.           MOV    A,M
  603.           INR    E
  604.           MOV    C,A
  605.           INR    A
  606.           JNZ    S3
  607.           LXI    H,LEN
  608.           INR    M
  609.           MVI    E,377Q
  610. S5:       MOV    A,E              ; MOVE SYMBOL NUMBER INTO REG A
  611.           LXI    H,LEN
  612.           MOV    E,M
  613.           DCR    E
  614.           POP    H
  615.           POP    H
  616.           POP    B
  617.           MOV    C,E              ;MOVE NUMBER OF CHAR. LEFT IN LINE INT
  618.           POP    D
  619.           RET
  620. ;*****************************************************
  621. ;THE CODE FROM HERE TO THE NEXT LINE OF *'S MUST BE ON ONE PAGE
  622. ;THIS MACRO ADDS PARITY BITS TO CHARACTERS
  623. KDATA:    DB     KDAT1 AND 377Q
  624.           DB     KDAT2 AND 377Q
  625.           DB     KDAT3 AND 377Q
  626.           DB     KDAT4 AND 377Q
  627. KDAT1:   DB     3,322Q,325Q,316Q  ;RUN
  628.           DB     3,320Q,314Q,323Q  ;PLS
  629.           DB     3,314Q,311Q,323Q  ;LIS
  630.           DB     3,323Q,303Q,322Q  ;SCR
  631.           DB     3,320Q,324Q,301Q  ;PTA
  632.           DB     377Q
  633. KDAT2:   DB     3,314Q,305Q,324Q  ;LET
  634.           DB     3,320Q,322Q,311Q  ;PRI
  635.           DB     3,322Q,305Q,315Q  ;REM
  636.           DB     3,323Q,324Q,317Q  ;STO
  637.           DB     3,305Q,316Q,304Q  ;END
  638.           DB     3,307Q,317Q,324Q  ;GOT
  639.           DB     2,311Q,306Q       ;IF
  640.           DB     3,311Q,316Q,320Q  ;INP
  641.           DB     3,304Q,311Q,315Q  ;DIM
  642.           DB     3,'C'+200Q       ;CAL
  643.           DB     'A'+200Q
  644.           DB     'L'+200Q
  645.           DB     4,'G'+200Q       ;GOSU
  646.           DB     'O'+200Q
  647.           DB     'S'+200Q
  648.           DB     'U'+200Q
  649.           DB     3,'R'+200Q       ;RET
  650.           DB     'E'+200Q
  651.           DB     'T'+200Q
  652.           DB     3,'F' OR 200Q    ;FOR
  653.           DB     'O' OR 200Q
  654.           DB     'R' OR 200Q
  655.           DB     4,'N' OR 200Q    ;NEXT
  656.           DB     'E' OR 200Q
  657.           DB     'X' OR 200Q
  658.           DB     'T' OR 200Q
  659.           DB     377Q
  660. ;DELIMITERS HAVE FOLLOWING VALUES:
  661. ;
  662. ;         <      0
  663. ;         >      1
  664. ;         ,      2
  665. ;         =      3
  666. ;         )      4
  667. ;         ;      5
  668. ;         THEN   6
  669. ;         TO     7
  670. ;         STEP   8
  671. ;         *      9
  672. ;         /      10
  673. ;         +      11
  674. ;         -      12
  675. ;
  676. KDAT3:   DB     1,274Q,1,276Q    ;'<','>'
  677.           DB     1,254Q,1,275Q    ;',','='
  678.           DB     1,251Q           ;')'
  679.           DB     1,';'+200Q       ;';'
  680.           DB     4                ;THEN
  681.           DB   200Q OR  'T'
  682.           DB   200Q OR 'H'
  683.           DB   200Q OR 'E'
  684.           DB   200Q OR 'N'
  685.           DB     2                ;TO
  686.           DB   200Q OR 'T'
  687.           DB   200Q OR 'O'
  688.           DB     4                ;STEP
  689.           DB   200Q OR 'S'
  690.           DB   200Q OR 'T'
  691.           DB   200Q OR 'E'
  692.           DB   200Q OR 'P'
  693.           DB     1,'*'+200Q       ;'*'
  694.           DB     1,257Q,1,253Q    ;'/','+'
  695.           DB     1,255Q           ;'-'
  696.           DB     377Q
  697. KDAT4:   DB     3,307Q,305Q,324Q  ;GET
  698.           DB     3,320Q,325Q,324Q  ;PUT
  699.           DB     377Q
  700. ;*****************************************************
  701. ; ROUTINE TO INPUT SOURCE LINE FROM TTY. PASSED ADD
  702. ; OF FIRST CHAR IN HL. RETURNS LENGTH OF LINE IN REG A
  703. TTYIN:    PUSH   H
  704.           MVI    B,0
  705. TIN1:     CALL   CHAR2
  706.           CPI    231Q             ;CNTRL Y?
  707.           JZ     TIN5
  708.           CPI    377Q             ;RUBOUT?
  709.           JZ     TIN2
  710.           CPI    337Q             ;BACK ARROW (RUBOUT)?
  711.           JZ     TIN2+3
  712.           CPI    212Q             ;LF?
  713.           JZ     TIN1
  714.           CPI    215Q             ;CR
  715.           JZ     TIN4
  716.           CPI    214Q             ;FORM FEED?
  717.           JZ     TIN1             ;IGNORE
  718.           MOV    M,A
  719.           INX    H
  720.           INR    B
  721.           CALL   MEMFUL
  722.           JMP    TIN1
  723. TIN2:     MVI    A,337Q
  724.           CALL   CONOUT           ;PRINT VIA ODT
  725.           DCX    H
  726.           DCR    B
  727.           JP     TIN1
  728.           POP    H
  729.           XRA    A                ;ZERO A
  730.           RET
  731. TIN5:     MVI    A,334Q
  732.           CALL   CONOUT           ;PRINT VIA ODT
  733. TIN5A:    MVI    A,0
  734.           POP    H
  735.           RET
  736. TIN4:     MVI    A,212Q
  737.           CALL   CONOUT           ;PRINT VIA ODT
  738. TIN4A:    MVI    C,0
  739.           POP    H
  740.           MOV    A,B
  741.           CMP    C
  742.           RZ
  743. ;ROUTINE TO REMOVE BLANKS FROM SOURCE UNLESS ENCLOSED IN EXCLAIM'S
  744.           PUSH   D                ;SAVE REG'S
  745.           PUSH   H
  746.           PUSH   H
  747.           MVI    E,'"'+200Q       ;INIT E FOR COMPARES
  748.           MVI    D,0              ;D=1=>WITHIN QUOTES, LEAVE BLANKS
  749. PK1:      XRA    A                ;CLEAR A
  750.           CMP    D                ;CHECK INPUT MODE
  751.           MOV    A,M              ;GET CHAR
  752.           JNZ    QSTRG            ;WITHIN QUOTE STRING
  753.           CMP    E                ;IS IT 1ST EXCLAIM?
  754.           JNZ    $+7              ;NO - PROCEED
  755.           INR    D                ;YES, SET FLAG
  756.           JMP    QSTR1            ;CONTINUE
  757.           CPI    240Q             ;IS IT A SPACE?
  758.           JZ     PK2              ;YES - LEAVE OUT
  759. QSTRG:    CMP    E                ;2ND "?
  760.           JNZ    $+4              ;NO - CONTINUE
  761.           DCR    D                ;RESET FLAG
  762. QSTR1:    XTHL                    ;GET DESTINATION ADDRESS
  763.           MOV    M,A              ;SAVE
  764.           INX    H                ;BUMP PNTR.
  765.           XTHL                    ;GET SOURCE ADD.
  766.           INR    C                ;BUMP CHAR. CNT
  767. PK2:      INX    H                ;BUMP PNTR.
  768.           DCR    B                ;DCR INPUT LINE CHAR CNT
  769.           JNZ    PK1              ;MORE - GO AGAIN
  770.           MOV    A,C              ;CHAR CNT TO A
  771.           POP    H                ;RESTORE REG'S, RETURN
  772.           POP    H
  773.           POP    D
  774.           RET
  775. ; ROUTINES TO  PAD MESSAGES TO  OUTPUT BUFFER.
  776. ; FOR12 PADS 'UNDERFLOW'
  777. ; FOR11 PADS 'OVERFLOW'
  778. ; FOR10 PADS 'ZERODIVIDE'
  779. ; FORM9 PADS 'INPUT ERROR, TRY AGAIN'
  780. ; FORM8 PADS 'MEMORY FULL'
  781. ; FORM7 PADS 'WHAT?'
  782. ; FORM4 PADS 'IN LINE'
  783. ; FORM3 PADS 'ERROR'
  784. ; FORM2 PADS 'TURN ON PUNCH'
  785. ; FORM1 PADS 'READY'
  786. ; FORM5 PADS SOURCE LINE, PASSED ADDRESS OF
  787. ; LENGTH OF LINE IN HL REGS.
  788. ; FORM6 PADS CHAR STRING, PASSED ADD OF FIRST CHAR IN
  789. ; HL, LENGTH OF STRING IN REG C
  790. FOR12:    INR    L
  791. FOR11:    INR    L
  792. FOR10:    INR    L
  793. FORM9:    INR    L
  794. FORM8:    INR    L
  795. FORM7:    INR    L
  796. FORM4:    INR    L
  797. FORM3:    INR    L
  798. FORM2:    INR    L
  799. FORM1:    MOV    L,M
  800. FORM5:    MOV    C,M
  801.           MOV    A,C
  802.           CPI    0
  803.           RZ
  804. F1:       INX    H
  805. FORM6:    MOV    A,M
  806.           MVI    B,1
  807.           CALL   PAD
  808.           DCR    C
  809.           JNZ    F1
  810.           RET
  811. ;*****************************************************
  812. ;THE CODE FROM HERE TO THE NEXT LINE OF *'S MUST BE ON ONE PAGE
  813. ODATA:    DB     ODAT1 AND 377Q
  814.           DB     ODAT2 AND 377Q
  815.           DB     ODAT3 AND 377Q
  816.           DB     ODAT4 AND 377Q
  817.           DB     ODAT5 AND 377Q
  818.           DB     ODAT6 AND 377Q
  819.           DB     ODAT7 AND 377Q
  820.           DB     ODAT8 AND 377Q
  821.           DB     ODAT9 AND 377Q
  822.           DB     ODA10 AND 377Q
  823. ODAT1:    DB     5,'READY'
  824. ODAT2:    DB     13,'TURN ON PUNCH'
  825. ODAT3:    DB     8,215Q,212Q,'ERROR '
  826. ODAT4:    DB     9,' IN LINE '
  827. ODAT5:    DB     5,'WHAT?'
  828. ODAT6:    DB     14,'MEMORY FULL',215Q,212Q,'?'
  829. ODAT7:    DB     22,'INPUT ERROR, TRY AGAIN'
  830. ODAT8:    DB     10,'INDEFINITE'
  831. ODAT9:    DB     8,'OVERFLOW'
  832. ODA10:    DB     9,'UNDERFLOW'
  833. ;*****************************************************
  834. ; ROUTINE TO INPUT SOURCE LINE FROM HSR. PASSED ADD
  835. ; OF FIRST CHAR IN HL. RETURNS LENGTH OF LINE IN REG A
  836. HSRIN:    PUSH   H
  837.           MVI    B,0
  838.           JMP    PIN1A
  839. PIN1:     CALL   CHAR5
  840. PIN1A:    CPI    231Q             ;CNTRL Y?
  841.           JZ     TIN5A
  842.           CPI    377Q
  843.           JZ     PIN3
  844.           CPI    337Q
  845.           JZ     PIN3
  846.           CPI    212Q
  847.           JZ     TIN4A
  848.           CPI    215Q
  849.           JZ     PIN1
  850.           MOV    M,A
  851.           INX    H
  852.           INR    B
  853.           CALL   MEMFUL
  854.           JMP    PIN1
  855. PIN3:     DCX    H
  856.           DCR    B
  857.           JP     PIN1
  858.           POP    H
  859.           XRA    A                ;ZERO A
  860.           RET
  861. ; ROUTINE TO INPUT CHAR FROM HSR
  862. CHAR5:    PUSH   B
  863.           CALL   HSRDR
  864.           POP    B
  865.           RET
  866. ; ROUTINE TO INSURE SOURCE DOES NOT OVERFLOW MEM SPACE
  867. ; COMPARES CURENT MEM ADDRESS TO SP.
  868. MEMFUL:   PUSH   B
  869.           PUSH   D
  870.           PUSH   H
  871.           MVI    A,50
  872.           ADD    L
  873.           MOV    B,A
  874.           MVI    A,0
  875.           ADC    H
  876.           MOV    C,A
  877.           LXI    H,0
  878.           DAD    SP
  879.           MOV    D,L
  880.           MOV    E,H
  881.           CALL   DCOMP
  882.           POP    H
  883.           POP    D
  884.           POP    B
  885.           RNC
  886.           LXI    H,ODATA
  887.           CALL   FORM8
  888.           CALL   WRIT
  889.           CALL   CHAR2
  890.           CALL   PAD
  891.           CALL   WRIT
  892.           SBI    260Q
  893.           CPI    4
  894.           CZ     WHAT
  895.           LHLD   SPNT
  896.           SPHL
  897.           MVI    C,1
  898.           JMP    M4A
  899. ; ROUTINE TO EVALUATE BOUNDS FOR LIST AND PLIST
  900. ; COMMANDS. RETURNS PLINE AS FIRST LINE, KLINE
  901. ; AS LAST LINE TO BE LISTED.
  902. BOUND:    LHLD   NLINE
  903.           MVI    A,9
  904.           ADD    L
  905.           MOV    L,A
  906.           MVI    A,0
  907.           ADC    H
  908.           MOV    H,A
  909.           PUSH   H
  910.           CALL   NUMB
  911.           CNC    WHAT
  912.           CALL   CVB
  913.           PUSH   PSW
  914.           PUSH   B
  915.           CALL   BND2
  916.           POP    B
  917.           DCX    H
  918.           SHLD   PLINE
  919. BND1:     POP    PSW
  920.           POP    H
  921.           INR    A
  922.           ADD    L
  923.           MOV    L,A
  924.           MVI    A,0
  925.           ADC    H
  926.           MOV    H,A
  927.           MVI    A,0
  928.           CMP    C
  929.           RZ
  930.           DCR    C
  931.           CALL   NUMB
  932.           CNC    WHAT
  933.           PUSH   D
  934.           CALL   CVB
  935.           PUSH   D
  936.           PUSH   B
  937.           CALL   BND2
  938.           POP    B
  939.           INX    H
  940.           MOV    D,M
  941.           INX    H
  942.           MOV    E,M
  943.           XCHG
  944.           SHLD   KLINE
  945.           POP    D
  946.           POP    H
  947.           MOV    A,C
  948.           CPI    0
  949.           JNZ    WHAT
  950.           MOV    B,H
  951.           MOV    C,L
  952.           CALL   DCOMP
  953.           RNC
  954.           JMP    WHAT
  955. BND2:     LHLD   STLINE
  956. BND3:     MOV    B,M
  957.           INX    H
  958.           MOV    C,M
  959.           CALL   DCOMP
  960.           RC
  961.           RZ
  962.           PUSH   H
  963.           INX    H
  964.           MOV    A,M
  965.           INX    H
  966.           MOV    H,M
  967.           MOV    L,A
  968.           CALL   CHK1
  969.           POP    B
  970.           JNC    BND3
  971.           PUSH   B
  972.           POP    H
  973.           RET
  974. ; ROUTINE TO OUTPUT ERROR MSG. TO USER.
  975. ; REG A CONTAINS BCD ERROR NUMBER, HL
  976. ; LOADED WITH VALUE OF KLINE.
  977. ERROR:    LXI    H,M1A            ;RETURN ADDRESS
  978.           PUSH   H                ;PUT ON STACK
  979.           LXI    H,ODATA          ;OUTPUT BUFFER DATA TABLES
  980.           PUSH   H
  981.           MOV    D,A              ;SAVE ERROR NUMB. IN D
  982.           CALL   FORM3            ;PAD 'ERROR '
  983.           MVI    B,1              ;INIT FOR PADS
  984.           MOV    C,B              ;INIT AS CNTR.
  985.           MOV    A,D              ;GET ERROR NUMB.
  986.           RLC                     ;ROTATE HIGH 4 BITS TO LOW 4
  987.           RLC
  988.           RLC
  989.           RLC
  990. ERRR1:    ANI    17Q              ;MASK
  991.           ADI    260Q             ;CONVERT TO ASCII
  992.           CALL   PAD              ;PAD IT
  993.           MOV    A,D              ;GET ERROR NUMB.
  994.           DCR    C                ;ANOTHER PASS?
  995.           JP     ERRR1            ;YES
  996.           POP    H                ;NO-CONTINUE
  997. ERLN:     CALL   FORM4
  998.           LHLD   KLINE
  999.           INX    H
  1000.           INX    H
  1001.           INX    H
  1002.           INX    H
  1003.           MOV    C,M
  1004.           INX    H
  1005.           CALL   LENGTH
  1006.           MOV    C,A
  1007.           CALL   FORM6
  1008.           CALL   WRIT
  1009.           RET
  1010. ;THIS ROUTINE INCREMENTS H AND L AND
  1011. ;DECR. C(CHARS IN LINE) SHOULD C RESULT
  1012. ;IN 0 THEN THE ERROR CORRES. TO ENTRY PNT.
  1013. ;IS GIVEN
  1014. ICP7:     MVI    A,7
  1015.           JMP    INCPT
  1016. ICP8:     MVI    A,8
  1017.           JMP    INCPT
  1018. ICP4:     MVI    A,4
  1019.           JMP    INCPT
  1020. ICP2:     MVI    A,2
  1021. INCPT:    INX    H
  1022.           DCR    C
  1023.           RNZ
  1024.           JMP    ERROR
  1025. ;FSYM FINDS SYMBOLS IN TABLE
  1026. ;B,C CONTAIN SYMBOL
  1027. ;RET WITH B,C,D,E SAME
  1028. ;H AND L PNT TO VALUE (1ST BYTE)
  1029. ;CY=1  =OUND
  1030. ;CY=0  AND A SCALAR VAR. =NSERTED
  1031. ;   AND SET TO 0
  1032. ;CY=0  AND AN ARRAY  =O ACTION,
  1033. ;    H AND L PNT TO LAST ENTRY IN SYMBOL TABLE
  1034. FSYM:     PUSH   D
  1035.           XRA    A
  1036.           ORA    B                ;SET CARRY IF NOT
  1037.           JZ     AR               ;AN ARRAY AND SAVE
  1038.           CMC
  1039. AR:       PUSH   PSW
  1040.           LHLD   NXTSP            ;GET NEXT AVAILABLE
  1041.           PUSH   B                ;SPACE PNTR.
  1042.           MOV    B,H
  1043.           MOV    C,L              ;CHECK TO SEE
  1044.           LHLD   STSPAC           ;IF SYMBOL TABLE
  1045.           MOV    D,H              ;EMPTY
  1046.           MOV    E,L
  1047.           CALL   DCOMP            ;DOUBLE BYTE COMPARE
  1048.           POP    B                ;GET VAR. BACK
  1049.           JZ     NOSYM
  1050. LUKON:    CALL   CHK1             ;CHECK FOR END
  1051.           JC     NOENT
  1052.           MOV    D,H              ;SAVE OLD PNTR
  1053.           MOV    E,L
  1054.           MOV    A,B
  1055.           CMP    M                ;DO VARIABLES MATCH
  1056.           JNZ    NOMAT
  1057.           INX    H
  1058.           MOV    A,C
  1059.           CMP    M
  1060.           JZ     ENTRY
  1061.           DCX    H
  1062. NOMAT:    INX    H                ;NO MATCH GET NEW PNT.
  1063.           INX    H
  1064.           MOV    A,M
  1065.           INX    H
  1066.           MOV    H,M
  1067.           MOV    L,A
  1068.           JMP    LUKON
  1069. ;ARRIVE HERE IF SYMBOL TABLE IS EMPTY
  1070. NOSYM:    DCX    D                ; =STSPAC-2 SO STPNT WORKS RIGHT
  1071.           DCX    D
  1072. ;ARRIVE HERE WHEN NO ENTRY FOUND
  1073. NOENT:    LHLD   NXTSP            ;ADD. OF FREE MEMORY
  1074.           XCHG                    ;TO DE, HL HAVE LAST SYM. TAB. ENTRY
  1075.           POP    PSW              ;ARRAY?
  1076.           JNC    FBAC             ;YES, RETURN
  1077.           CALL   CHKLC            ;CHECK FOR PAGE BOUNDARY CROSSING
  1078.           CALL   STPNT            ;UPDATE PNTR
  1079.           XCHG                    ;NXTSP TO HL
  1080.           MOV    M,B              ;STORE VAR.
  1081.           INX    H
  1082.           MOV    M,C
  1083.           INX    H
  1084.           PUSH   H
  1085.           INX    H                ;STORE NXTSP+8 IN NXTSP
  1086.           INX    H
  1087.           INX    H
  1088.           INX    H
  1089.           INX    H
  1090.           INX    H
  1091.           SHLD   NXTSP
  1092.           CALL   MEMFUL           ;MEMORY FULL?
  1093.           POP    H                ;SET FWD PNT. TO -1
  1094.           MVI    M,377Q
  1095.           INX    H
  1096.           MVI    M,377Q
  1097.           INX    H                ;INIT TO FLT. PNT. 0
  1098.           CALL   ZROL
  1099.           ORA    A                ;CLEAR CY
  1100.           JMP    FBAC             ;RESET CARRY AND RETURN
  1101. ENTRY:    POP    PSW              ;VAR FOUND
  1102.           INX    H                ;MOVE PNT. TO FIRST BYTE
  1103.           INX    H                ;OF FLT. PNT. NO.
  1104.           INX    H
  1105.           STC                     ;SET CY AND RET.
  1106. FBAC:     POP    D                ;RESTORE D
  1107.           RET
  1108. ;
  1109. ;
  1110. ;RUN - THE INTERP.
  1111. ;
  1112. ;
  1113. ;INIT. NXTSP
  1114. RUN:      LHLD   STSPAC
  1115.           XCHG
  1116.           CALL   CKDIM          ; ADJUST START OF SYMBOL TABLE SO
  1117.                                 ; IT STARTS ON AN EVEN 4 WORD BOUNDARY
  1118.           CALL   CHKLC          ; ADJUST START OF SYMBOL TABLE SO IT
  1119.                                 ; DOES NOT CROSS PAGE BOUNDARY
  1120.           XCHG
  1121.           SHLD    STSPAC
  1122.           SHLD   NXTSP
  1123.           LXI    H,BOTNS          ;INIT SP FOR NESTING STACK
  1124.           SHLD   NEST
  1125.           LXI    H,M1A            ;PRECAUTION, IN CASE RETURN IS
  1126.           PUSH   H                ;EXECUTED BEFORE A GOSUB
  1127.           PUSH   H
  1128.           LHLD   STLINE           ;START OF SOURCE
  1129. ILOOP:    CALL   QUITT            ;CHECK FOR INTERRUPTION
  1130.           CALL   CHK1             ;HL=-1 =O MORE SOURCE
  1131.           JNC    SORCE
  1132.           MVI    A,1
  1133.           JMP    ERROR            ;ERROR 1, NO END STMT.
  1134. SORCE:    SHLD   LPNT
  1135.           PUSH   H
  1136.           LXI    H,LPNT           ;DEFINE VALUES OF
  1137.           CALL   PTVAL            ;KBIN,KFPNT,KLEN
  1138.           LDA    KLEN             ;CHAR'S IN LINE TO C
  1139.           MOV    C,A
  1140.           INR    C
  1141.           POP    H                ;MOVE PNTR. TO 1ST CHAR
  1142.           INX    H                ;IN SOURCE REC.
  1143.           INX    H
  1144.           INX    H
  1145.           INX    H
  1146. L1:       CALL   ICP2             ;INCR. H,L DCR C
  1147.           CALL   ALPHA            ;FIND FIRST LETTER
  1148.           JNC    L1
  1149.           XRA    A
  1150.           INR    A                ;LETTER FOUND
  1151.           CALL   SYMSRT           ;DETERMINE KEYWORD
  1152.           CPI    377Q
  1153.           JNZ    GKEY
  1154.           MVI    A,2              ;BAD KEYWORD
  1155.           JMP    ERROR
  1156. GKEY:     SHLD   CPNT
  1157.           LXI    H,JTBL           ;LOAD JUMP TABLE PNTR.
  1158.           ADD    A                ;DOUBLE A
  1159.           MOV    E,A
  1160.           MVI    D,0
  1161.           DAD    D                ;PNT. TO PROPER PROC.
  1162.           MOV    A,M              ;ADD. IN JUMP TABLE
  1163.           INX    H                ;GET PROC. ADD.
  1164.           MOV    H,M
  1165.           MOV    L,A
  1166.           PCHL                    ;INDIRECT JUMP TO PROC.
  1167. JTBL:     DW     LET              ;JMP TABLE
  1168.           DW     PRI
  1169.           DW     IEND             ;REM STMT. - NO ACTION
  1170.           DW     M1A              ;STOP STMT.-RETURN TO EDIT MODE
  1171.           DW     ENDD
  1172.           DW     GOTO
  1173.           DW     IFRT
  1174.           DW     INPUT
  1175.           DW     DIM
  1176.           DW     CALLP
  1177.           DW     GOSUB
  1178.           DW     RETRN
  1179.           DW     FOR
  1180.           DW     NEXT
  1181. ENDD:     LHLD   KFPNT            ;CHECK TO SEE IF MORE
  1182.           CALL   CHK1             ;SOURCE AFTER END
  1183.           JC     M1A
  1184.           MVI    A,3              ;MORE SOURCE ERROR 3
  1185.           JMP    ERROR
  1186. GOTO:     LHLD   CPNT             ;GOTO STMT. PROC.
  1187. GSENT:    INX    H                ;INCREMENT PAST KEYWORD
  1188.           INX    H
  1189.           INX    H
  1190.           CALL   ICP4             ;POSSIBLE ERROR 4
  1191. GTRA:     CALL   CVB              ;GET DESTINATION
  1192.           ORA    A                ;MAKE SURE IT WAS OK
  1193.           JNZ    OKN
  1194.           MVI    A,4
  1195.           JMP    ERROR
  1196. OKN:      CALL   NSRCH            ;GET NEXT LPNT
  1197.           JNC    ILOOP            ;MAKE SURE IT EXISTED
  1198.           MVI    A,5
  1199.           JMP    ERROR            ;NON-EXISTENT
  1200. DIM:      LHLD   CPNT             ;DIM STMT. PROC.
  1201.           INX    H                ;PNT TO FIRST VAR.
  1202.           INX    H
  1203.           INX    H
  1204. DLOOP:    CALL   ALPHA            ;CHECK IF IT IS A VAR.
  1205.           JC     OKLET
  1206. ER6:      MVI    A,6              ;ERROR 6
  1207.           JMP    ERROR
  1208. OKLET:    MOV    B,M
  1209.           CALL   ICP7             ;INCR.CPNT
  1210.           MVI    A,250Q           ;CHECK FOR (
  1211.           CMP    M
  1212.           JNZ    ER6
  1213.           CALL   ICP7             ;INCR. CPNT
  1214.           CALL   CVB              ;CONV. TO BIN NO.
  1215.           ADD    L                ;UPDATE CPNT
  1216.           MOV    L,A              ;ED CONTAIN ARRAY LEN.
  1217.           MVI    A,0
  1218.           ADC    H                ;C CONT. NO. CHARS LEFT
  1219.           MOV    H,A              ;IN LINE
  1220.           MVI    A,251Q           ;CHECK FOR )
  1221.           CMP    M
  1222.           JNZ    ER6
  1223.           PUSH   H
  1224.           PUSH   B                ;SAVE B,C,H,L
  1225.           MOV    C,B              ;SET UP FOR CALL TO FSYM
  1226.           MVI    B,0
  1227.           CALL   FSYM
  1228.           JNC    NDOU
  1229.           POP    B
  1230.           POP    H
  1231.           MVI    A,11H            ;ERROR 11
  1232.           JMP    ERROR            ;DUPLICATE ARRAY DEF.
  1233. NDOU:     PUSH   D                ;SAVE DIM. LENGTH
  1234.           XCHG                    ;ADD. OF LAST SYM. TAB. ENTRY TO DE
  1235.           LHLD   NXTSP            ;GET ADD. OF AVAILABLE MEM.
  1236.           XCHG                    ;SET UP FOR CALL
  1237.           CALL   CKDIM            ; CHECK START OF 'DIM' ARRAY
  1238.           CALL   STPNT            ;STORE NEW PNTR
  1239.           XCHG                    ;NXTSP TO HL
  1240.           POP    D                ;RESTORE D
  1241.           MVI    M,0
  1242.           INX    H                ;INSERT VAR IN SYMB. TAB.
  1243.           MOV    M,C
  1244.           INX    H
  1245.           MVI    M,377Q           ;FPNT TO -1
  1246.           INX    H
  1247.           MVI    M,377Q
  1248.           INX    H                ;PNTS TO FIRST DATA
  1249.           MOV    A,D              ;GET ONE'S COMPLEMENT OF
  1250.           CMA                     ;NUMBER OF ELEMENTS
  1251.           MOV    C,A              ;IN ARRAY TO B,C
  1252.           MOV    A,E
  1253.           CMA
  1254.           MOV    B,A
  1255. CONT:     CALL   ZROL             ;ZEROE OUT ELEMTS.
  1256.           INX    H                ; OF ARRAY
  1257.           INX    H
  1258.           INX    H
  1259.           INX    H
  1260.           INX    B
  1261.           PUSH   H
  1262.           CALL   MEMFUL           ;MEMORY FULL?
  1263.           MOV    H,B
  1264.           MOV    L,C
  1265.           CALL   CHK1
  1266.           POP    H
  1267.           JNC    CONT
  1268.           SHLD   NXTSP            ;NEW VALUE OF NXTSP.
  1269.           POP    B                ;RESTORE REG'S
  1270.           POP    H
  1271.           INX    H
  1272.           DCR    C                ;MORE ELEMTS IN LINE?
  1273.           JZ     IEND
  1274.           DCR    C
  1275.           JZ     ER6
  1276.           MVI    A,254Q           ;NEXT ELEMENT A ,
  1277.           CMP    M
  1278.           INX    H
  1279.           JZ     DLOOP
  1280.           JMP    ER6
  1281. ;ROUTINE TO COPY CONTENTS PNTED TO
  1282. ;BY DE TO LOCATION H,L
  1283. COPDH:    PUSH   PSW              ;SAVE REGISTERS
  1284.           PUSH   B
  1285.           PUSH   D
  1286.           PUSH   H
  1287.           MVI    B,4              ;COUNT
  1288. COPD1:    LDAX   D                ;GET FROM SOURCE
  1289.           MOV    M,A              ;PUT TO DESTINATION
  1290.           INX    D                ;BUMP PNTRS, CNT
  1291.           INX    H
  1292.           DCR    B
  1293.           JNZ    COPD1
  1294.           POP    H                ;RESTORE REGISTERS
  1295.           POP    D
  1296.           POP    B
  1297.           POP    PSW
  1298.           RET
  1299. ;OUTR PADS OUTPUT FROM CONV INTO
  1300. ;OUTPUT BUFFER USING ROUTINE PAD
  1301. ;ALL REG'S MAINTAINED
  1302. OUTR:     PUSH   B                ;SAVE REG B
  1303.           MVI    B,1              ;PAD ONCE
  1304.           CALL   PAD              ;DO IT
  1305.           POP    B                ;RESTORE B AND RET.
  1306.           RET
  1307. ;VALUE RETURNS IN D(H),E(L) PNTR.
  1308. ;TO THE VALUE OF A TOKEN
  1309. ;C,H,L ARE UPDATED
  1310. ;A,B ARE DESTROYED
  1311. VALUE:    CALL   VAR              ;IS IT A VARIABLE?
  1312.           RC                      ;YES - ALL DONE
  1313.           MVI    A,3              ;NO CHEK IF A FUNC.
  1314.           CALL   SYMSRT
  1315.           CPI    377Q
  1316.           JZ     KONT             ;NOT A FUNCTION -
  1317.           CPI    1                ;WAS IT PUT(--)?
  1318.           JNZ    GET              ;NO - OK
  1319.           JMP    ER10             ;ILLEGAL USE OF FUNCTION
  1320. GET:      INX    H                ;OK, IT'S GET(--)
  1321.           INX    H                ;UPDATE H,L
  1322.           INX    H
  1323.           MOV    A,C              ;CHECK FOR PREMATURE EOL
  1324.           ORA    A
  1325.           JZ     ER8
  1326.           MVI    A,250Q           ;CHEK FOR (
  1327.           CMP    M
  1328.           JNZ    ER8
  1329.           CALL   ICP8             ;BUMP PNTR'S
  1330.           CALL   EVAL             ;GET PORT =
  1331.           PUSH   H                ;SAVE REG H,L
  1332.           LXI    H,FREG1
  1333.           CALL   COPDH            ;COPY IT
  1334.           XCHG
  1335.           POP    H                ;RESTORE H,L
  1336.           CALL   FIX              ;FIX IT
  1337.           INX    D
  1338.           INX    D                ;GET LOWEST BYTE TO
  1339.           INX    D                ;REG D
  1340.           LDAX   D
  1341.           MOV    D,A
  1342.           MOV    A,C              ;EOL?
  1343.           ORA    A
  1344.           JZ     ER8
  1345.           MVI    A,251Q           ;CHECK FOR )
  1346.           CMP    M
  1347.           JNZ    ER8
  1348.           INX    H                ;BUMP PNTR'S
  1349.           DCR    C
  1350.           PUSH   H                ;SAVE H,L,B,C
  1351.           PUSH   B                ;STORE PROGRAM SEGMENT
  1352.           LXI    B,GREG           ;IN RAM,START AT GREG
  1353.           LXI    H,RINST          ;ADD. OF INST'S
  1354.           MVI    E,5              ;NUMB. OF BYTES
  1355. V1:       MOV    A,M              ;GET BYTE
  1356.           STAX   B                ;STORE IN RAM
  1357.           INX    H
  1358.           INX    B
  1359.           DCR    E                ;BUMP PNTR'S,DCR CNT
  1360.           JNZ    V1
  1361.           LXI    H,GREG+1         ;STORE PORT =
  1362.           MOV    M,D              ;IN RAM
  1363.           JMP    GREG             ;OK - TRANSFER
  1364. HOME:     LXI    H,GREG+2         ;SET UP FOR FLOAT
  1365.           MOV    M,A              ;STORE AWAY INPUT
  1366.           DCX    H
  1367.           XRA    A                ;ZERO OUT HIGHER BYTES
  1368.           MOV    M,A              ;BUT CHAR. DOESN'T MATTER
  1369.           DCX    H
  1370.           MOV    M,A
  1371.           CALL   DFXL             ;FLOAT IT
  1372.           LXI    D,GREG           ;FIX D,E RESTORE C,H,L
  1373.           POP    B
  1374.           POP    H
  1375.           RET
  1376. RINST:    IN     0                ;RAM INSTRUCTIONS
  1377.           JMP    HOME
  1378. KONT:     CALL   NUMB             ;NUMBER
  1379.           JC     OKK
  1380.           MVI    A,256Q           ;DEC. PNT.?
  1381.           CMP    M
  1382.           JNZ    ER8
  1383. OKK:      MVI    A,1              ;MODE=1, IE. INPUT FROM SOURCE
  1384.           CALL   RDKON            ;READ CONSTANT TO GREG
  1385.           JC     ER9              ;IF ERROR THEN CY=1
  1386.           LXI    D,GREG           ;PNTS. TO CONSTANT
  1387.           RET
  1388. ;THIS ROUTINE READS A CONSTANT INTO GREG FROM ASCII
  1389. ;CHARACTERS POINTED TO BY HL AND C
  1390. ;ENTER WITH A=0 => DATA FROM TTY
  1391. ;ENTER WITH A=1 => DATA FROM SOURCE
  1392. ;RETURN WITH CY=1 => ERROR IN CONVERSION
  1393. RDKON:    STA    MODE             ;SAVE MODE FOR ROUT. INP
  1394.           SHLD   HLINP            ;SAVE HL FOR ROUT. INP
  1395.           MOV    A,C
  1396.           STA    CREG             ;SAVE C FOR ROUT. INP
  1397.           LXI    H,GREG           ;WHER VALUE WILL GO
  1398.           MVI    C,SCR AND 377Q   ;SET UP AND CALL FINPT
  1399.           CALL   FINPT
  1400.           LHLD   HLINP            ;RETORE H,L AND C
  1401.           LDA    CREG
  1402.           MOV    C,A
  1403.           RET                     ;DONE
  1404. ER9:      MVI    A,9
  1405.           JMP    ERROR
  1406. ;VAR DECIDES WHETHER A TOKEN IS
  1407. ;A VARIABLE IF SO CY=1 AND
  1408. ;ADDRESS IS COMPUTED,(SUBSCRIPT IS
  1409. ;EVALUATED ETC.), RETURNS WITH DE PNTING
  1410. ;TO VAR. REFERENCED H,L,C,UPDATED
  1411. ;A,B DESTROYED
  1412. ;IF NOT A VARIBLE CY=0
  1413. ;H,L,C ARE LEFT UNTOUCHED
  1414. VAR:      CALL   ALPHA            ;1ST CHAR A LETTER?
  1415.           RNC                     ;NO-NOT VAR.
  1416.           INX    H                ;BUMP PNTR'S
  1417.           DCR    C
  1418.           JNZ    MORE             ;MORE TO LINE
  1419. SC1:      PUSH   B                ;SAVE B,EOL
  1420.           MVI    C,0              ;SET FOR CALL TO FSYM
  1421.           DCX    H                ;GET SINGLE LETTER
  1422.           MOV    B,M              ;VAR TO B
  1423.           INX    H
  1424.           JMP    SCALR
  1425. MORE:     CALL   ALPHA            ;2ND A LETTER?
  1426.           JNC    SFSG             ;SO FAR SO GOOD
  1427.           PUSH   B                ;SAVE C
  1428.           MVI    A,2              ;CHECK FOR DELIMITER
  1429.           CALL   SYMSRT
  1430.           POP    B                ;RESTORE C
  1431.           INR    A                ;FOUND?
  1432.           JNZ    SC1              ;YES
  1433. BUPT:     INR    C                ;NOT A VAR.
  1434.           DCX    H                ;BACK UP PNTR'S
  1435.           ORA    A                ;CY=0 AND RET
  1436.           RET
  1437. SFSG:     CALL   NUMB             ;TEST FOR NUMBER
  1438.           JNC    ARCK             ;MAYBE AN ARRAY
  1439.           INX    H                ;ITS A SCALAR
  1440.           DCR    C                ;BUMP PNTR'S
  1441.           JZ     SLOAD            ;EOL
  1442.           PUSH   B                ;SAVE C
  1443.           MVI    A,2              ;SET UP FOR SYMSRT
  1444.           CALL   SYMSRT           ;TEST FOR LEGAL
  1445.           POP    B                ;GET C BACK
  1446.           INR    A                ;DELIMITER FOUND?
  1447.           JZ     ER8              ;NO, ERROR
  1448. SLOAD:    DCX    H                ;MOVE BACK,
  1449.           PUSH   B                ;SAVE C,
  1450.           MOV    C,M              ;GET VAR. INTO
  1451.           DCX    H                ;B,C FOR FSYM
  1452.           MOV    B,M
  1453.           INX    H
  1454.           INX    H
  1455. SCALR:    XCHG                    ;SAVE H,L IN D,E
  1456.           CALL   FSYM             ;GET PNTR TO VALUE
  1457.           XCHG                    ;RESTORE H,L PNTR TO DE
  1458.           POP    B                ;GET C REG BACK
  1459.           STC                     ;SET CY,RET
  1460.           RET
  1461. ARCK:     MOV    A,M              ;ARRAY CHEK, GET CHARACTER
  1462.           CPI    250Q             ;IS IT (?
  1463.           JZ     ARYES            ;YES,ITS AN ARRAY
  1464.           MVI    A,2              ;NO-CHEK FOR LEGAL DELIM.
  1465.           PUSH   B                ;SAVE C
  1466.           CALL   SYMSRT
  1467.           POP    B                ;RESTORE C
  1468.           INR    A                ;DELIMITER FOUND?
  1469.           JZ     ER8
  1470.           JMP    SC1              ;1 CHAR. SCALAR VAR.
  1471. ARYES:    DCX    H                ;YES-WE HAVE ARRAY
  1472.           MOV    A,M              ;GET VAR.
  1473.           INX    H
  1474.           PUSH   PSW              ;SAVE VAR.
  1475.           CALL   ICP8             ;BUMP PNTR'S
  1476.           CALL   EVAL             ;EVALUATE SUBSCRIPT
  1477.           PUSH   H                ;SAVE REG H,L
  1478.           LXI    H,FREG1
  1479.           CALL   COPDH            ;COPY IT
  1480.           XCHG
  1481.           POP    H                ;RESTORE H,L
  1482.           CALL   FIX              ;FIX VALUE
  1483.           MVI    A,251Q           ;CHECK FOR )
  1484.           CMP    M
  1485.           JNZ    ER8
  1486.           INX    H
  1487.           DCR    C                ;BUMP PNTR'S
  1488.           INX    D                ;PNT TO LOWER 2 BYTES
  1489.           INX    D
  1490.           LDAX   D
  1491.           MOV    B,A              ;H-BYTE TO B
  1492.           INX    D                ;PNT TO LOW BYTE
  1493.           LDAX   D                ;LOW BYTE TO A
  1494.           ORA    A                ;KILL CY
  1495.           RAL                     ;START MULT OF OFFSET
  1496.           MOV    E,A              ;BY 4(BYTES/FLTPT =)
  1497.           MOV    A,B              ;GET H BYTE
  1498.           RAL
  1499.           MOV    D,A              ;DE IS OFFSET*2
  1500.           MOV    A,E              ;GET LOW
  1501.           ORA    A                ;KILL CARRY
  1502.           RAL
  1503.           MOV    E,A
  1504.           MOV    A,D
  1505.           RAL
  1506.           MOV    D,A
  1507.           POP    PSW              ;DE CONTAIN OFFSET*4
  1508.           PUSH   B                ;GET VAR., SAVE C
  1509.           MOV    C,A
  1510.           MVI    B,0              ;SETUP TO CALL FSYM
  1511.           PUSH   H                ;SAVE H,L
  1512.           CALL   FSYM             ;GET START ADD.
  1513.           JC     AFOND
  1514.           MVI    A,12H            ;ERROR 12
  1515.           JMP    ERROR            ;ARRAY REF. NOT DIM'ED.
  1516. AFOND:    DAD    D                ;H,L NOW PNT TO START OF
  1517.           XCHG                    ;ARRAY, ADD OFFSET, EXCHG
  1518.           POP    H                ;RESTORE PNTR'S AND RET.
  1519.           POP    B
  1520.           STC                     ;SET CY
  1521.           RET
  1522. ;ROUTINE TO FIX FLOATING POINT
  1523. ;NUMBERS, ALL REG'S BUT A ARE
  1524. ;MAINTAINED. DE PNT TO 4 BYTES
  1525. ;OF = TO BE FIXED
  1526. FIX:      PUSH   B
  1527.           PUSH   H
  1528.           PUSH   D                ;SAVE REG'S
  1529.           INX    D
  1530.           INX    D
  1531.           INX    D                ;PNT TO 4TH BYTE
  1532.           LDAX   D
  1533.           PUSH   PSW              ;SAVE CHAR. (FOR SIGN)
  1534.           ANI    177Q
  1535.           RAL                     ;CHEK IF EXP SIGN IS -
  1536.           RAL
  1537.           JC     MINSE
  1538.           RAR
  1539.           RAR                     ;RESTORE CHAR
  1540.           CPI    30Q              ;IS IT TOO BIG?
  1541.           JC     GOOD
  1542.           MVI    A,13H            ;ERROR 13
  1543.           JMP    ERROR            ;FIX = TOO BIG
  1544. MINSE:    RAR
  1545.           RAR
  1546. GOOD:     STAX   D                ;ABSOLUTE VALUE
  1547.           DCX    D
  1548.           DCX    D
  1549.           DCX    D                ;MOV PNTR BACK
  1550.           LXI    H,FREG1
  1551.           CALL   COPDH            ;COPY TO FREG1
  1552.           LXI    H,FREG2          ;STORE .5*2**24 IN
  1553.           LXI    D,FDAT           ;FREG2
  1554.           CALL   COPDH            ;COPY IT
  1555.           LXI    H,FREG1          ;SET UP TO CALL LADD
  1556.           MVI    B,FREG2 AND 377Q
  1557.           MVI    C,SCR AND 377Q
  1558.           CALL   LADD             ;ADD THEM,RESULT IN FREG1
  1559.           LXI    H,FREG1
  1560.           POP    PSW              ;GET SIGN AND ADD.
  1561.           POP    D
  1562.           RAL
  1563.           MVI    A,0              ;GET SIGN ONLY
  1564.           RAR
  1565.           MOV    B,M              ;GET BYTE1
  1566.           STAX   D                ;STORE BYTE 1 OF FIX
  1567.           MOV    A,B
  1568.           ANI    177Q             ;CLEAR HIGH BIT (FROM ADD)
  1569.           INX    D
  1570.           INX    H
  1571.           MOV    B,M              ;GET BYTE 2
  1572.           STAX   D                ;STORE BYTE 2 OF FIX
  1573.           INX    D
  1574.           MOV    A,B
  1575.           INX    H
  1576.           MOV    B,M              ;GET BYTE 3
  1577.           STAX   D                ;STORE BYTE 3 OF FIX
  1578.           MOV    A,B
  1579.           INX    D
  1580.           STAX   D                ;STORE BYTE 4 OF FIX
  1581.           DCX    D                ;FIX D PNTR
  1582.           DCX    D
  1583.           DCX    D
  1584.           POP    H
  1585.           POP    B
  1586.           RET
  1587. FDAT:     DB     200Q,0,0,30Q
  1588. ;INP SAVES ALL REG'S
  1589. ;SERVES AS BUFFER BETWEEN FINPT AND
  1590. ;DATA INPUT. IF MODE=0, DATA COMES FROM TTY
  1591. ;IF MODE=1 DATA COMES FROM SOURCE STMTS.
  1592. ;IN ALL CASES HL,C ARE UPDATED FROM HLINP, AND
  1593. ;CREG AND RETURNED TO THOSE LOCATIONS
  1594. INP:      PUSH   H                ;SAVE ALL REG'S
  1595.           PUSH   D
  1596.           PUSH   B
  1597.           LHLD   HLINP            ;GET PNTR'S
  1598.           LDA    CREG
  1599.           MOV    C,A
  1600.           ORA    A                ;CHECK FOR EOL
  1601.           JNZ    CHKMD            ;NO CHECK MODE
  1602. SPACE:    MVI    A,240Q           ;SEND A SPACE
  1603. IDONE:    POP    B                ;RESTORE REG'S
  1604.           POP    D
  1605.           POP    H
  1606.           RET                     ;AND RETURN
  1607. CHKMD:    LDA    MODE             ;GET MODE
  1608.           DCR    A                ;CHECK IT
  1609.           JZ     MODE1            ;MODE IS 1
  1610.           MOV    A,M              ;MODE 0, GET CHAR.
  1611.           CPI    ',' OR 200Q      ;IS IT A ','?
  1612.           JZ     SPACE            ;YES - SEND A SPACE
  1613.           JMP    BMPTR            ;NO - SEND IT
  1614. MODE1:    CALL   NUMB             ;NUMBER? (ALSO LOADS IT TO A)
  1615.           JC     BMPTR            ;YES - SEND IT AND BUMP PNTR'S
  1616.           CPI    256Q             ;DEC. PNT.?
  1617.           JZ     BMPTR
  1618.           CPI    305Q             ;E?
  1619.           JZ     BMPTR
  1620.           CPI    253Q             ;+?
  1621.           JZ     CHEKE
  1622.           CPI    255Q             ;-?
  1623.           JNZ    SPACE            ;SEND A SPACE
  1624. CHEKE:    MOV    B,A              ;CHEK IF E PRECEDES +,-
  1625.           DCX    H                ;BACK UP AND GET PRE-
  1626.           MOV    A,M              ;CEDING CHARACTER
  1627.           CPI    305Q             ;IS IT E?
  1628.           JNZ    SPACE            ;NO,+OR- WAS DELIMITTER
  1629.           MOV    A,B              ;YES,GET + OR -
  1630.           INX    H                ;RESTORE H,L
  1631. BMPTR:    INX    H                ;BUMP AND STORE PNTR'S
  1632.           DCR    C
  1633.           SHLD   HLINP
  1634.           LXI    H,CREG
  1635.           MOV    M,C
  1636.           JMP    IDONE            ;RESTORE REG'S AND RETURN
  1637. ;THIS ROUTINE WILL EVALUATE UNARY AND/OR
  1638. ;BINARY EXPRESIONS CALLED WITH H AND L
  1639. ;POINTING TO FIRST CHAR. OF EXP.,C CONTAINS
  1640. ;NUMBER OF CHAR'S LEFT IN LINE. RETURNS
  1641. ;D(H) AND E(L) POINTING TO THE ANSWER
  1642. ;THIS ROUTINE CALLS ITSELF RECURSIVELY
  1643. ;IN ORDER TO EVALUATE SUBSCRIPT
  1644. ;EXPRESIONS.  REG A,B DESTROYED
  1645. ;C,H,L ARE UPDATED
  1646. EVAL:     MVI    A,255Q           ;IS IT UNARY -
  1647.           CMP    M                ;Z=1 => YES
  1648.           PUSH   PSW              ;Z=0 => NO
  1649.           JNZ    ECAV
  1650.           CALL   ICP8             ;BUMP POINTER
  1651. ECAV:     CALL   VALUE            ;GET PNTR. TO VALUE
  1652.           PUSH   H                ;GET VALUE TO FREG1
  1653.           LXI    H,FREG1
  1654.           CALL   COPDH
  1655.           XCHG
  1656.           POP    H
  1657.           POP    PSW              ;GET SIGN
  1658.           JNZ    DOL              ;SHALL WE NEGATE?
  1659.           INX    D                ;YES, POINT TO CHAR.
  1660.           INX    D
  1661.           INX    D
  1662.           LDAX   D                ;AND LOAD TO A
  1663.           RAL                     ;ROTATE SIGN TO CY
  1664.           CMC                     ;COMPLEMENT IT
  1665.           RAR                     ;ROTATE BACK
  1666.           STAX   D                ;STORE AWAY
  1667.           DCX    D                ;AND FIX PNTR.
  1668.           DCX    D
  1669.           DCX    D
  1670. DOL:      MOV    A,C              ;IS THIS END OF LINE?
  1671.           ORA    A
  1672.           RZ                      ;YES-RETURN
  1673.           PUSH   B                ;SAVE C
  1674.           MVI    A,2              ;NO SET UP TO CALL
  1675.           CALL   SYMSRT           ;SYMSRT AND CALL
  1676.           POP    B                ;RESTORE C
  1677.           INR    A                ;DELIMITER FOUND?
  1678.           JZ     ER8              ;NO, ERROR
  1679. EOK:      SUI    10               ;CHECK FOR EXPRESSION
  1680.           RC                      ;DELIMITER
  1681.           PUSH   PSW              ;SAVE OVERATION
  1682.           CALL   ICP8             ;BUMP PNTR'S
  1683.           ORA    A                ;CLEAR CY
  1684. AGA:      PUSH   H                ;GET BYTES OF NUMBER
  1685.           LDAX   D                ;AND PLACE ON STACK
  1686.           MOV    L,A
  1687.           INX    D
  1688.           LDAX   D
  1689.           INX    D
  1690.           MOV    H,A              ;2 BYTES TO H,L
  1691.           XTHL                    ;XCHANGE, RESTORES H,L
  1692.           CMC
  1693.           JC     AGA              ;ANOTHER PASS?
  1694.           CALL   VALUE            ;GET 2ND VALUE
  1695.           MOV    A,C              ;CHECK FOR END OF LINE
  1696.           ORA    A                ;IF SO => WELL FORMED
  1697.           JZ     WFOR
  1698.           PUSH   B                ;SAVE C
  1699.           MVI    A,2              ;ELSE CALL SYMSRT TO
  1700.           CALL   SYMSRT           ;CHEK FOR EXP. DEL.
  1701.           POP    B                ;RECOVER IT
  1702.           CPI    10
  1703.           JC     WFOR             ;YES, WELL FORMED
  1704. ER8:      MVI    A,8              ;ILL-FORMED EXP.
  1705.           JMP    ERROR
  1706. WFOR:     PUSH   B                ;SAVE C, AND H,L
  1707.           PUSH   H
  1708.           LXI    H,FREG2          ;COPY 2ND VALUE TO
  1709.           CALL   COPDH            ;FREG2
  1710.           POP    D                ;GET BYTES FROM STACK
  1711.           POP    B
  1712.           POP    H                ;INTO FREG1+2
  1713.           SHLD   FREG1+2
  1714.           POP    H                ;AND NEXT 2 BYTES
  1715.           SHLD   FREG1            ;FROM STACK TO FREG1
  1716.           XCHG
  1717.           POP    PSW              ;GET OPERATION
  1718. ;THIS ROUTINE PERFORMS BINARY OPERATIONS ON OPERANDS IN FREG1 AND FREG2
  1719. ;B,C,H,L ARE LEFT UNDISTURBED. A IS DESTROYED
  1720. ;D,E PNT TO RESULT
  1721. ;OPERATIONS ARE SPECIFIED BY A REGISTER AS FOLLOWS:
  1722. ;
  1723. ;         A=0    =>               FREG1 * FREG2
  1724. ;         A=1    =>               FREG1 / FREG2
  1725. ;         A=2    =>               FREG1 + FREG2
  1726. ;         A=3    =>               FREG1 - FREG2
  1727. ;
  1728. ;IN CASE OF ARITHMETIC ERROR A MESSAGE IS SENT TO USER.
  1729. ;IF A CONTAINS ILLEGAL OPERATION REQUEST ERROR IS SENT TO USER
  1730. ;(ERROR 8) AND THE INTERPRETER IS ABORTED.
  1731. BINOP:    PUSH   B                ;SAVE REG'S
  1732.           PUSH   H
  1733.           LXI    H,FREG1          ;SET UP PNTR'S TO
  1734.           MVI    B,FREG2 AND 377Q ;FREG'S AND SCR AREA
  1735.           MVI    C,SCR AND 377Q   ;AND DO OPERATION
  1736.           DCR    A
  1737.           JM     FMULT            ;0,1=>* OR /
  1738.           JZ     DIV              ;2,3=>+ OR -
  1739.           DCR    A
  1740.           JZ     ADDD
  1741.           DCR    A
  1742.           JZ     SUBB
  1743.           JMP    ER8              ;ILLEGAL OPER.
  1744. ADDD:     CALL   LADD             ;DO ADDITION
  1745. ASBC:     MOV    D,H              ;FIX PNTR'S FOR RET.
  1746.           MOV    E,L
  1747. FPERR:    ORA    A                ;SET FLAGS
  1748.           JZ     NFPER            ;NO ERROR
  1749.           PUSH   D                ;SAVE DE
  1750.           PUSH   PSW              ;SAVE A
  1751.           CALL   WRIT             ;DUMP BUFFER
  1752.           POP    PSW              ;GET A BACK
  1753.           LXI    H,WFPER          ;RETURN ADDRESS
  1754.           PUSH   H                ;SAVE ON STACK
  1755.           LXI    H,ODATA          ;MESSAGE TABLE
  1756.           RAL                     ;UNDERFLOW?
  1757.           JC     FOR12            ;YES
  1758.           RAL                     ;OVERFLOW?
  1759.           JC     FOR11            ;YES
  1760.           JMP    FOR10            ;NO - ITS ZERODIVIDE
  1761. WFPER:    LXI    H,ODATA          ;MESSAGE TABLE
  1762.           CALL   ERLN             ;PRINT 'IN LINE --' (USE PART OF ERROR
  1763.           POP    D                ;RESTORE REG'S
  1764. NFPER:    POP    H
  1765.           POP    B
  1766.           RET
  1767. SUBB:     CALL   LSUB             ;DO SUBTRACTION
  1768.           JMP    ASBC
  1769. FMULT:    CALL   LMUL             ;DO MULT.
  1770.           JMP    MDBC
  1771. DIV:      CALL   LDIV             ;DO DIV.
  1772. MDBC:     MOV    D,H              ;AND FIX PNTR'S FOR RET.
  1773.           MOV    E,C
  1774.           JMP    FPERR            ;CHECK FOR ERROR
  1775. ;PRINT PROCESSOR
  1776. PRI:      LHLD   CPNT
  1777.           INX    H                ;INCR. PAST KEYWORD
  1778.           INX    H
  1779.           INX    H
  1780.           CALL   ICP7
  1781.           INX    H                ;BUMP PNTRS
  1782.           DCR    C
  1783.           MVI    B,0              ;SET CHAR CNT
  1784.           JNZ    PLOOP            ;CONTINUE IF MORE
  1785.           INR    B                ;NOTHING MORE, PAD A NULL
  1786.           MVI    A,0
  1787.           CALL   PAD
  1788.           JMP    PEND             ;WRITE IT AND CONTINUE
  1789. PLOOP:    MOV    A,M              ;GET CHARACTER
  1790.           CPI    '"'+200Q         ;IS IT "?
  1791.           JNZ    EXPRE            ;NO
  1792. QUOTE:    CALL   ICP7             ;GET CHARACTER TO A
  1793.           MOV    A,M
  1794.           CPI    '"'+200Q         ;IS IT "?
  1795.           JZ     QCHEK
  1796. QOTOK:    INR    B                ;INCREMENT CNT
  1797.           MOV    D,B              ;SAVE IN D
  1798.           MVI    B,1              ;PAD ONCE
  1799.           CALL   PAD
  1800.           MOV    B,D              ;RESTORE CNT
  1801.           JMP    QUOTE            ;AGAIN
  1802. QCHEK:    INX    H                ;BUMP PNTRS
  1803.           DCR    C
  1804.           JZ     PEND             ;EOL
  1805.           MOV    A,M
  1806.           CPI    '"'+200Q         ;ANOTHER "?
  1807.           JZ     QOTOK
  1808.           JMP    SCOLN
  1809. EXPRE:    CALL   ALPHA            ;IS IT A LETTER
  1810.           JC     PRTIT            ;YES, EVALUATE AND PRINT
  1811.           CALL   NUMB             ;IS IT A NUMB?
  1812.           JC     PRTIT            ;YES, EVALUATE AND PRINT
  1813.           MOV    A,M
  1814.           CPI    '.'+200Q         ;IS IT A DECIMAL PNT?
  1815.           JZ     PRTIT            ;YES EVALUATE, PRINT
  1816.           CPI    '-'+200Q         ;IS IT A -?
  1817.           JNZ    SCOLN            ;NO, CHECK FOR ;
  1818. PRTIT:    PUSH   B                ;SAVE CNT
  1819.           CALL   EVAL             ;EVALUATE EXPRESION
  1820.           PUSH   B                ;SAVE C,H,L
  1821.           PUSH   H
  1822.           XCHG                    ;DE TO HL
  1823.           MVI    C,SCR AND 377Q   ;SET UP, CONVERT
  1824.           CALL   CONV
  1825.           POP    H                ;RESTORE REG'S
  1826.           POP    B
  1827.           MOV    A,C
  1828.           POP    B
  1829.           MOV    C,A
  1830.           ORA    A                ;CHECK EOL
  1831.           JZ     PEND
  1832.           MVI    A,11             ;UPDATE CNTR
  1833.           ADD    B
  1834.           MOV    B,A
  1835.           MOV    A,M              ;GET CHAR.
  1836. SCOLN:    CPI    ';'+200Q         ;IS IT ;?
  1837.           JZ     SONWD            ;YES
  1838.           CPI    ','+200Q         ;IS IT ,?
  1839.           JNZ    ER6              ;NO-UNEXPECTED CHAR.
  1840.           XRA    A                ;ZERO A
  1841. ADFLD:    ADI    13               ;ADD FIELD LENGTH
  1842.           CMP    B                ;COMPARE TO CNT
  1843.           JZ     $+6
  1844.           JNC    FLDFD
  1845.           CPI    52               ;LAST FLD?
  1846.           JNZ    ADFLD
  1847.           CALL   WRIT             ;YES-WRITE LINE
  1848.           MVI    B,0              ;RESET CNT
  1849. ONWD:     INX    H                ;BUMP PNTRS
  1850.           DCR    C
  1851.           JZ     PEND
  1852.           JMP    PLOOP
  1853. FLDFD:    SUB    B                ;FOUND FIELD
  1854.           MOV    D,B              ;DETERMIN   OF SPACES TO PAD
  1855.           MOV    E,A              ;SET UP TO CALL PAD
  1856.           MOV    B,A
  1857.           MVI    A,240Q
  1858.           CALL   PAD              ;PAD SPACES
  1859.           MOV    A,D
  1860.           ADD    E                ;NEW CNT
  1861.           MOV    B,A              ;SAVE IN B
  1862. SONWD:    INX    H                ;CHECK EOL
  1863.           DCR    C
  1864.           JNZ    PLOOP
  1865.           MVI    D,1              ;SUPPRESS CR/LF
  1866.           CALL   WRIT1
  1867.           JMP    $+6
  1868. PEND:     CALL   WRIT             ;DUMP BUFFER, CONTINUE
  1869.           JMP    IEND
  1870. ;INPUT PROCESSOR - READS VALUES FROM TTY
  1871. ;THEY MUST BE DELIMITED BY COMMAS ONLY
  1872. INPUT:    MOV    A,C              ;IN CASE OF ERROR
  1873.           STA    PL6              ;SAVE
  1874. INPER:    LHLD   CPNT             ;INPUT LINE (V-STRING) PNTR
  1875.           INX    H                ;ADJUST PNTR'S
  1876.           INX    H
  1877.           INX    H
  1878.           CALL   ICP7
  1879.           CALL   ICP7
  1880. PRMPT:    PUSH   B                ;SAVE PNTR'S
  1881.           PUSH   H
  1882.           MVI    B,1              ;SEND PROMPT
  1883.           MVI    A,':'
  1884.           MOV    D,B              ;TO SUPPRESS CR/LF
  1885.           CALL   PAD              ;PAD IT
  1886.           CALL   WRIT1            ;WRITE IT
  1887.           LXI    H,IBUF           ;ADD. OF INPUT BUFFER
  1888.           CALL   TTYIN            ;READ A LINE
  1889.           XCHG                    ;ADD. OF K-STRING TO DE
  1890.           POP    H                ;ADD. OF V-STRING
  1891.           POP    B                ;V-STRING CNT TO C
  1892.           MOV    B,A              ;K-STRING CNT TO B
  1893.           CALL   STRIN            ;TRANSFER CONSTANTS TO VARIBLES
  1894.           JZ     INPOK            ;NO ERROR
  1895.           LXI    H,ODATA          ;SEND ERROR MESSAGE
  1896.           CALL   FORM9
  1897.           CALL   WRIT
  1898.           LDA    PL6              ;GET V-STRING CNT
  1899.           MOV    C,A
  1900.           JMP    INPER            ;START AGAIN
  1901. INPOK:    JC     PRMPT            ;NEED MORE CONSTANTS
  1902. IEND:     LHLD   KFPNT            ;ALL OK - GET NEW PNTR.
  1903.           JMP    ILOOP            ;CONTINUE
  1904. ;THIS ROUTINE TRANSFERS THE FLOATING POINT VALUES
  1905. ;OF AN ASCII STRING OF CONSTANTS TO THE LOCATIONS
  1906. ;SPECIFIED BY AN ASCII STRING OF VARIBLES
  1907. ;POINTER AND LINE CNT OF VAR. STRING ARE IN HL,C
  1908. ;POINTER AND LINE CNT OF CONST. STRING ARE IN DE,B
  1909. ;ON RETURN:
  1910. ;          Z=0 AND CY=0   ALL OK
  1911. ;          Z=0 AND CY=1   NEED MORE CONSTANTS
  1912. ;          Z=1            ERROR IN CONVERSION
  1913. ;ALL POINTERS AND LINE CNT'S ARE RETURNED UPDATED
  1914. STRIN:    MOV    A,C              ;GET V-STRING CNT
  1915.           ORA    A                ;TEST FOR EOL
  1916.           RZ                      ;DONE, CY=0 => ALL OK
  1917.           MOV    A,M              ;GET CHAR.
  1918.           CPI    ',' OR 200Q      ;IS IT A ,?
  1919.           JNZ    STOKV            ;IT'S NOT A ,
  1920.           INX    H                ;COMMA, BUMP PNTR'S
  1921.           DCR    C
  1922.           JZ     ERRET            ;POSSIBLE ERROR (IF EOL)
  1923. STOKV:    MOV    A,B              ;GET K-STRING LENGTH
  1924.           ORA    A                ;TEST FOR EOL
  1925.           STC                     ;IN CASE IT'S EOL
  1926.           RZ                      ;RET, CY=1 =EED MORE CONSTANTS
  1927.           LDAX   D                ;GET CHAR
  1928.           CPI    ',' OR 200Q      ;TEST FOR ,
  1929.           JNZ    STOKK            ;NOT A , - READY TO GO
  1930.           INX    D                ;BUMP PNTR'S
  1931.           DCR    B
  1932.           JZ     ERRET            ;POSSIBLE ERROR (IF EOL)
  1933. STOKK:    PUSH   B                ;SAVE K-STRING CNT
  1934.           PUSH   D                ;SAVE K-STRING PNTR
  1935.           CALL   VAR              ;ADD. TO VARIBLE TO DE
  1936.           XCHG                    ;VAR. ADD TO H,L
  1937.           SHLD   VARAD            ;SAVE
  1938.           POP    H                ;ADDRESS OF K-STRING
  1939.           MOV    A,C              ;V-STRING CNT TO A
  1940.           POP    B                ;K-STRING CNT TO B
  1941.           MOV    C,B              ;K-STRING CNT TO C
  1942.           PUSH   PSW              ;SAVE V-STRING CNT
  1943.           PUSH   D                ;SAVE V-STRING ADD.
  1944.           MVI    A,0              ;A=0 =ATA FROM TTY
  1945.           CALL   RDKON            ;GET CONSTANT TO GREG
  1946.           JNC    STNER
  1947.           POP    H                ;EMPTY STACK
  1948.           POP    H
  1949. ERRET:    XRA    A                ;ERROR
  1950.           INR    A
  1951.           RET
  1952. STNER:    PUSH   H                ;SAVE K-STRING PNTR.
  1953.           LHLD   VARAD            ;GET VAR. ADD
  1954.           LXI    D,GREG           ;ADD. TO CONST.
  1955.           CALL   COPDH            ;COPY IT TO VARIABLE LOC.
  1956.           POP    D                ;K-STING PNTR. TO DE
  1957.           MOV    B,C              ;K-STRING LENGTH TO B
  1958.           POP    H                ;V-STRING PNTR. TO HL
  1959.           POP    PSW              ;V-STRING LENGTH TO C
  1960.           MOV    C,A
  1961.           JMP    STRIN            ;LOOP
  1962. ;LET STMT. PROCESSOR
  1963. LET:      LHLD   CPNT             ;GET PNTR.
  1964.           INX    H                ;FIX PNTR.
  1965.           INX    H
  1966.           INX    H
  1967.           MOV    A,C              ;CHECK FOR EOL
  1968.           ORA    A
  1969.           JNZ    LOK
  1970. ER7:      MVI    A,7
  1971.           JMP    ERROR
  1972. LOK:      CALL   VAR              ;GET ADDRESS TO VAR.
  1973.           JC     SAVV             ;IT'S A VARIABLE
  1974.           MVI    A,3              ;NO-CHEK FOR FUNC.
  1975.           CALL   SYMSRT
  1976.           CPI    377Q
  1977.           JZ     ER8              ;DON'T KNOW WHAT IT IS
  1978.           DCR    A
  1979.           JNZ    ER10             ;ILLEGAL USE OF FUNC.
  1980.           INX    H                ;IT'S PUT,UPDATE H,L
  1981.           INX    H
  1982.           INX    H
  1983.           MOV    A,C              ;EOL CHK
  1984.           ORA    A
  1985.           JZ     ER8
  1986.           MOV    A,M              ;CHEK FOR (
  1987.           CPI    250Q
  1988.           JNZ    ER8
  1989.           CALL   ICP8             ;BUMP PNTRS
  1990.           CALL   EVAL             ;EVALUATE AND FIX
  1991.           PUSH   H                ;SAVE H,L
  1992.           LXI    H,FREG1
  1993.           CALL   COPDH            ;COPY IT
  1994.           XCHG
  1995.           POP    H
  1996.           CALL   FIX
  1997.           INX    D
  1998.           INX    D
  1999.           INX    D
  2000.           LDAX   D                ;GET LOWEST BYTE
  2001.           PUSH   PSW              ;PORT = IS SAVED
  2002.           MOV    A,M
  2003.           CPI    251Q             ;CHECK FOR )
  2004.           JNZ    ER8
  2005.           CALL   ICP8             ;BUMP PNTR'S
  2006.           MVI    D,377Q
  2007.           MOV    E,D
  2008. SAVV:     PUSH   D                ;KEEP ADDRESS
  2009.           MOV    A,M              ;CHEK FOR =
  2010.           CPI    275Q
  2011.           JNZ    ER8
  2012.           CALL   ICP8             ;BUMP PNTRS
  2013.           CALL   EVAL             ;EVALUATE EXPRESSION
  2014.           POP    H                ;GET ADDRESS
  2015.           CALL   CHK1
  2016.           JC     PTFIN            ;IT WAS A PUT
  2017.           CALL   COPDH            ;COPY TO ADDRESS
  2018.           JMP    IEND             ;CONTINUE
  2019. PTFIN:    LXI    H,FREG1          ;COPY VALUE TO FREG1
  2020.           CALL   COPDH
  2021.           XCHG
  2022.           CALL   FIX              ;FIX THE VALUE
  2023.           INX    D
  2024.           INX    D
  2025.           INX    D
  2026.           LDAX   D
  2027.           MOV    C,A              ;SAVE IN C
  2028.           LXI    H,PINST          ;ADD OF BYTES TO GO TO
  2029.           LXI    D,GREG           ;RAM AT GREG
  2030.           MVI    B,5              ;BYTE CNT
  2031. PRI1:     MOV    A,M              ;STORE PROG. SEG. IN
  2032.           STAX   D                ;RAM
  2033.           INX    H
  2034.           INX    D
  2035.           DCR    B
  2036.           JNZ    PRI1
  2037.           POP    PSW              ;GET PORT =
  2038.           LXI    H,GREG+1
  2039.           MOV    M,A              ;STORE
  2040.           MOV    A,C              ;GET DATA OUT TO A
  2041.           DCX    H                ;TRANSFER
  2042.           PCHL
  2043. PINST:    OUT    0                ;RAM INSTRUCTIONS
  2044.           JMP    IEND
  2045. ER10:     MVI    A,10H
  2046.           JMP    ERROR
  2047. ;IF STMT. PROCESSOR
  2048. IFRT:     LHLD   CPNT             ;GET PNTR., ADJUST
  2049.           INX    H
  2050.           INR    C                ;CHECK EOL
  2051.           CALL   ICP7
  2052.           CALL   EVAL             ;EVALUATE EXPRESSION
  2053.           MOV    A,C
  2054.           ORA    A                ;CHECK EOL
  2055.           JZ     ER7
  2056. IAGA:     PUSH   H                ;SAVE H,L, PUT VALUE ON STK
  2057.           LDAX   D
  2058.           INX    D
  2059.           MOV    L,A
  2060.           LDAX   D
  2061.           INX    D
  2062.           MOV    H,A
  2063.           XTHL                    ;RESTORE H,L
  2064.           CMC
  2065.           JC     IAGA             ;ANOTHER PASS?
  2066.           MVI    A,2
  2067.           CALL   SYMSRT           ;CHEK TYPE OF RELATION
  2068.           CPI    4                ;WAS IT LEGAL?
  2069.           JC     II1
  2070. ER14:     MVI    A,14H
  2071.           JMP    ERROR
  2072. II1:      CPI    2                ;WAS IT A ,?
  2073.           JZ     ER14
  2074.           INR    A                ;ALL OK, INC,SAVE
  2075.           PUSH   PSW
  2076.           INR    C
  2077.           CALL   ICP7             ;BUMP PNTRS
  2078.           MVI    A,2              ;CALL SYMSRT
  2079.           CALL   SYMSRT
  2080.           CPI    377Q             ;FOUND ANYTHING?
  2081.           JZ     RELAT            ;DONE
  2082.           CPI    2
  2083.           JZ     ER14             ;IT WAS A ,
  2084.           CPI    4
  2085.           JNC    ER14             ;NOT LEGAL
  2086.           INR    A
  2087.           MOV    B,A
  2088.           INR    C
  2089.           CALL   ICP7
  2090.           POP    PSW              ;GET SECOND RELATION
  2091.           ADD    B                ;ADD THEM
  2092.           PUSH   PSW              ;AND SAVE
  2093.           CPI    10Q              ;TEST FOR ==
  2094.           JZ     ER14
  2095. ;RELATION IS STORED ON TOP OF STACK (PUSH PSW) ACCORDING TO
  2096. ;THE FOLLOWING
  2097. ;
  2098. ;         1 =>   <
  2099. ;         2 =>   >
  2100. ;         3 =>   <>
  2101. ;         4 =>   =
  2102. ;         5 =>   <=
  2103. ;         6 =>   >=
  2104. ;
  2105. RELAT:    CALL   EVAL             ;EVALUATE
  2106.           PUSH   H                ;SAVE H,L
  2107.           LXI    H,FREG2          ;COPY TO FREG2
  2108.           CALL   COPDH
  2109.           POP    H                ;GET H,L
  2110.           POP    PSW              ;AND RELATION
  2111.           XTHL                    ;GET 2ND 2 BYTES
  2112.           SHLD   FREG1+2          ;STORE
  2113.           POP    H                ;GET 1ST 2 BYTES,STORE
  2114.           XTHL
  2115.           SHLD   FREG1
  2116.           PUSH   B
  2117.           PUSH   PSW              ;SAVE A,B,C
  2118.           CALL   FCOMP            ;COMPARE NUMBERS
  2119.           MOV    D,A              ;SAVE RESULT IN D
  2120.           POP    PSW              ;GET RELATION,B,C
  2121.           POP    B
  2122.           CMP    D                ;SAME?
  2123.           JZ     TRUE             ;YES
  2124.           SUI    4
  2125.           JP     NOT3             ;NOT RELATION 3
  2126.           INR    A                ;IS IT RELATION 3?
  2127.           JNZ    FALSE            ;NO, ITS FALSE
  2128.           MVI    A,4              ;IT IS, CHECK FOR INEQUALITY
  2129.           CMP    D
  2130.           JNZ    TRUE
  2131.           JMP    FALSE
  2132. NOT3:     CMP    D                ;RELATION 5,6 TRUE?
  2133.           JZ     TRUE             ;YES
  2134.           MVI    A,4              ;IT WAS, CHECK FOR EQUALITY
  2135.           CMP    D
  2136.           JZ     TRUE
  2137. FALSE:    POP    H                ;CONTINUE
  2138.           JMP    IEND
  2139. TRUE:     POP    H
  2140.           MVI    B,4
  2141. THEN:     CALL   ICP7             ;INCREMENT PAST THEN
  2142.           DCR    B
  2143.           JNZ    THEN
  2144.           JMP    GTRA             ;TRANSFER TO GOTO
  2145. ;ROUTINE FCOMP COMPARES 2 FLOATING POINT ='S.  THEY ARE ASSUMED
  2146. ;TO BE IN FREG1 AND FREG2.
  2147. ;ALL REGISTERS ARE DESTROYED.
  2148. ;THE VALUE RETURNED IN REG A IS RESULT OF COMPARISON.
  2149. ;RESULTS ARE AS FOLLOWS:
  2150. ;
  2151. ;         A=1    =>     FREG1 < FREG2
  2152. ;         A=2    =>     FREG1 > FREG2
  2153. ;         A=4    =>     FREG1 = FREG2
  2154. ;
  2155. FCOMP:    LXI    H,FREG1+3        ;PNTS TO CHAR OF 1ST
  2156.           LXI    D,FREG2+3        ;PNTS TO CHAR OF 2ND
  2157.           MOV    A,M              ;GET  1 CHAR
  2158.           MVI    B,200Q           ;MASK TO B
  2159.           ANA    B                ;GET SIGN,  1
  2160.           MOV    C,A              ;SAVE IN C
  2161.           LDAX   D                ;GET CHAR  2
  2162.           ANA    B                ;GET SIGN  2
  2163.           XRA    C
  2164.           JZ     SINEQ            ;SAME SIGNS
  2165.           MOV    A,C              ;OPPISITE SIGNS,GET  1 SIGN
  2166.           RAL                     ;ROTATE TO CY
  2167.           MVI    A,1
  2168.           RC                      ;FREG1 < FREG2 => A=1
  2169.           INR    A                ;ELSE FREG1 > FREG2
  2170.           RET                     ;AND A=2
  2171. SINEQ:    PUSH   B                ;SAVE SIGN
  2172.           DCX    H                ;PNTR TO  1 IN H,L
  2173.           DCX    H
  2174.           DCX    H
  2175.           MOV    B,E              ;PNTR TO  2 IN B
  2176.           DCR    B
  2177.           DCR    B
  2178.           DCR    B
  2179.           CALL   LMCM             ;COMPARE MAGNITUDES
  2180. ;AT THIS POINT Z=1 => =, CY=1 => 1<2
  2181.           POP    B                ;GET SIGN BACK
  2182.           JNZ    $+6
  2183.           MVI    A,4              ;EQUAL => A=4
  2184.           RET
  2185.           MOV    A,C              ;GET SIGN TO A
  2186.           INR    A                ;SET SIGN BIT
  2187.           MVI    A,1
  2188.           JM     $+6              ;SIGN IS NEGATIVE
  2189.           RC                      ;SIGN=+ AND ABS(FREG1)<ABS(FREG2)
  2190.           INR    A                ;ABS(FREG1)>ABS(FREG2)
  2191.           RET
  2192.           RNC                     ;SIGN=- AND ABS(FREG1)>ABS(FREG2)
  2193.           INR    A                ;ABS(FREG1)<ABS(FREG2)
  2194.           RET
  2195. ;CALL PROCESSOR
  2196. CALLP:    LXI    H,IEND           ;INIT RETURN ADDRESS
  2197.           PUSH   H
  2198.           LHLD   CPNT             ;INIT POINTERS
  2199.           INX    H
  2200.           INX    H
  2201.           INX    H
  2202.           CALL   ICP7
  2203.           MOV    A,M              ;GET CHAR
  2204.           CPI    '('+200Q         ;IS IT A (?
  2205.           JNZ    ER7              ;BAD
  2206.           CALL   ICP7             ;BUMP PNTRS
  2207.           CALL   CVB              ;GET SUB
  2208.           ADD    L                ;UPDATA H,L
  2209.           MOV    L,A
  2210.           MVI    A,0
  2211.           ADC    H
  2212.           MOV    H,A              ;D NOW CONTAINS SUB
  2213.           PUSH   H                ;SAVE HL
  2214.           LHLD   SUBAD           ;GET START OF SUB TABLE
  2215. NUSUB:    MOV    A,M              ;GET ENTRY
  2216.           CMP    D                ;COMPARE
  2217.           JZ     FNDSB            ;FOUND IT
  2218.           INX    H                ;PNT TO NEXT ENTRY
  2219.           INX    H
  2220.           INX    H
  2221.           INR    A                ;CHECK TO SEE IF LAST WAS 377Q
  2222.           JNZ    NUSUB
  2223.           MVI    A,15H            ;ER 15 - NO SUB BY THIS =
  2224.           JMP    ERROR
  2225. FNDSB:    INX    H                ;FOUND IT,GET STARTING ADD.
  2226.           MOV    E,M
  2227.           INX    H
  2228.           MOV    H,M
  2229.           MOV    L,E              ;AND SAVE IT
  2230.           SHLD   SBSAV
  2231.           LHLD   NXTSP            ;INIT MEMORY SCRATCH AREA
  2232.           SHLD   MESCR
  2233.           POP    H                ;GET SOURCE PNTR BACK
  2234. PARLP:    MOV    A,M              ;GET CHAR
  2235.           CPI    ')'+200Q         ;IS IT )?
  2236.           JZ     CLSUB            ;YES - GO CALL SUB
  2237.           CPI    ','+200Q         ;DO WE HAVE A ,?
  2238.           JNZ    ER6              ;UEXPECTED CHARACTER
  2239.           CALL   ICP7             ;BUMP PNTRS
  2240.           CALL   VAR              ;DO WE HAVE A VARIABLE
  2241.           JNC    PREXP            ;NO
  2242.           PUSH   D                ;YES - SAVE ADDRESS
  2243.           JMP    PARLP            ;CONTINUE
  2244. PREXP:    CALL   EVAL             ;EVALUATE EXPRESSION
  2245.           PUSH   H                ;SAVE H,L
  2246.           LHLD   MESCR            ;GET SCRATCH AREA
  2247.           CALL   COPDH            ;AND COPY TO IT
  2248.           POP    D                ;HL TO DE
  2249.           PUSH   H                ;SAVE ADDRESS
  2250.           INX    H                ;UPDATE MESCR
  2251.           INX    H
  2252.           INX    H
  2253.           INX    H
  2254.           SHLD   MESCR            ;SAVE IT
  2255.           XCHG                    ;GET H,L BACK
  2256.           JMP    PARLP            ;CONTINUE
  2257. CLSUB:    LHLD   SBSAV            ;START OF ROUTINE
  2258.           PCHL                    ;TRANSFER
  2259. ;GOSUB PROCESSOR
  2260. GOSUB:    LXI    H,ILOOP          ;FOR RETURN STMT.
  2261.           PUSH   H                ;TO STACK
  2262.           LHLD   KFPNT            ;PNTR. TO NEXT STMT.
  2263.           PUSH   H                ;SAVE ON STACK
  2264.           LHLD   NXTSP            ;CHECK MEMORY
  2265.           CALL   MEMFUL
  2266.           LHLD   CPNT             ;GET CHAR. PNTR
  2267.           INX    H
  2268.           JMP    GSENT            ;PART OF GOTO TO FINISH
  2269. ;RETURN STMT. PROCESSOR
  2270. RETRN:    POP    H                ;GET RETURN ADD. FROM STACK
  2271.           RET                     ;CONTINUE
  2272. ;FOR STATEMENT PROCESSOR
  2273. FOR:      LHLD   CPNT             ;FIX PNTRS
  2274.           INR    C
  2275.           INX    H
  2276.           INX    H
  2277.           CALL   ICP7
  2278.           CALL   ALPHA            ;LETTER?
  2279.           JNC    ER21             ;NO
  2280.           MOV    B,M              ;GET IT TO B
  2281.           CALL   ICP7             ;BUMP PNTR'S
  2282.           MOV    D,C              ;SAVE C
  2283.           MVI    C,0              ;INIT C TO 0
  2284.           CALL   NUMB             ;NUMBER?
  2285.           JNC    $+9              ;NO
  2286.           MOV    C,M              ;YES, GET IT
  2287.           INX    H                ;BUMP PNTR'S
  2288.           DCR    D
  2289.           JZ     ER7              ;PREMATURE EOL
  2290.           PUSH   H                ;SAVE H,L
  2291.           CALL   FSYM             ;GET VAR. LOCATION
  2292.           XTHL                    ;PUT ON STACK, GET H,L
  2293.           MOV    E,C              ;VARIABLE TO D,E
  2294.           MOV    C,D              ;RESTORE C
  2295.           MOV    D,B
  2296.           XCHG                    ;SAVE VAR NAME
  2297.           SHLD   VNAME
  2298.           XCHG                    ;RESTORE H,L
  2299.           MOV    A,M              ;LOOK FOR =
  2300.           CPI    '=' OR 200Q
  2301.           JNZ    ER16
  2302.           CALL   ICP7             ;BUMP PNTR'S
  2303.           CALL   EVAL             ;EVALUATE EXPRESSION
  2304.           XTHL                    ;VARIABLE LOCATION
  2305.           CALL   COPDH            ;WRITE VALUE
  2306.           SHLD   VLOC             ;SAVE PNTR TO VARIABLE LOCATION
  2307.           POP    H                ;GET H,L BACK
  2308.           MOV    A,C              ;CHECK EOL
  2309.           ORA    A
  2310.           JZ     ER7
  2311.           MVI    A,2              ;CHECK FOR 'TO'
  2312.           CALL   SYMSRT
  2313.           CPI    7
  2314.           JNZ    ER17
  2315.           INX    H                ;BUMB PNTR'S
  2316.           INX    H
  2317.           MOV    A,C              ;CHECK EOL
  2318.           ORA    A
  2319.           JZ     ER7
  2320.           CALL   EVAL             ;EVALUATE LIMIT
  2321.           PUSH   H                ;SAVE H,L
  2322.           LXI    H,FLIMT          ;SAVE LIMIT VALUE
  2323.           CALL   COPDH
  2324.           MOV    A,C              ;CHECK EOL
  2325.           ORA    A
  2326.           JNZ    STP
  2327.           LXI    D,FONE           ;DEFAULT STEP=1
  2328.           POP    H                ;RESTORE H,L
  2329.           JMP    FBILD
  2330. STP:      POP    H                ;GET H,L
  2331.           MVI    A,2              ;LOOK FOR 'STEP'
  2332.           CALL   SYMSRT
  2333.           CPI    8
  2334.           JNZ    ER17
  2335.           INX    H                ;FIX H,L
  2336.           INX    H
  2337.           INX    H
  2338.           INR    C                ;CHECK EOL
  2339.           CALL   ICP7
  2340.           CALL   EVAL             ;GET STEP SIZE
  2341. ;AT THIS POINT:
  2342. ;VARIABLE NAME IS IN LOCATION VNAME
  2343. ;VARIABLE ADDRESS IS IN LOCATION VLOC
  2344. ;VARIBLE HAS BEEN INITIALIZED
  2345. ;LIMIT IS IN 4 BYTE LOCATION FLIMT
  2346. ;STEP IS POINTED TO BY D,E
  2347. ;H,L,C ARE POINTER, COUNTER AS USUAL
  2348. FBILD:    PUSH   D                ;SAVE PNTR TO STEP
  2349.           LHLD   VNAME            ;GET VARIABLE NAME
  2350.           MVI    A,77Q            ;MASK
  2351.           ANA    H                ;MASK OFF TOP 2 BITS
  2352.           MOV    B,A              ;SET UP TO CALL FSYM
  2353.           MOV    C,L
  2354.           CALL   FSYM             ;FIND ENTRY
  2355.           JC     FEXST            ;IT WAS THERE
  2356.           PUSH   H                ;IT WASN'T, SAVE H,L
  2357.           LHLD   NXTSP            ;UPDATE NXTSP
  2358.           MVI    A,8              ;ADD 8 TO H,L
  2359.           ADD    L
  2360.           MOV    L,A
  2361.           MVI    A,0
  2362.           ADC    H
  2363.           MOV    H,A
  2364.           SHLD   NXTSP            ;NEW VALUE OF NXTSP
  2365.           CALL   MEMFUL           ;CHECK MEMORY
  2366.           POP    H                ;GET ADD. IN DATA BLOCK
  2367. FEXST:    POP    D                ;ADDRESS OF STEP SIZE
  2368.           CALL   COPDH            ;STORE IT
  2369.           INX    H                ;PNT TO WHERE VAR. PNTR GOES
  2370.           INX    H
  2371.           INX    H
  2372.           INX    H
  2373.           LDA    VLOC             ;FIRST BYTE
  2374.           MOV    M,A              ;STORE IT
  2375.           INX    H
  2376.           LDA    VLOC+1           ;SECOND BYTE
  2377.           MOV    M,A
  2378.           INX    H                ;PNT TO WHERE LIMIT GOES
  2379.           LXI    D,FLIMT          ;WHERE IT IS NOW
  2380.           CALL   COPDH            ;COPY IT
  2381.           INX    H                ;PNT TO WHERE KFPNT GOES
  2382.           INX    H
  2383.           INX    H
  2384.           INX    H
  2385.           LDA    KFPNT            ;1ST BYTE
  2386.           MOV    M,A
  2387.           INX    H
  2388.           LDA    KFPNT+1          ;2ND BYTE
  2389.           MOV    M,A
  2390. ;PUT CURRENT VNAME ON NESTING STACK
  2391.           LXI    H,0              ;GET STACK-POINTER
  2392.           DAD    SP
  2393.           SHLD   VLOC             ;SAVE IT
  2394.           LHLD   NEST             ;GET NEST SP
  2395.           MOV    A,L              ;COMPARE WITH STACK LIMIT
  2396.           CPI    TOPNS AND 377Q   ;NEED ONLY COMPARE PAGE LOCATION
  2397.           JZ     ER18             ;FOR'S NEXTED TOO DEEPLY
  2398. NSTOK:    SPHL                    ;LOAD NEW SP
  2399.           XCHG                    ;SAVE NEST SP
  2400.           LHLD   VNAME            ;GET INDEX NAME
  2401.           PUSH   H                ;SAVE IT
  2402.           DCX    D                ;UPDATE NEST SP
  2403.           DCX    D
  2404.           XCHG                    ;SAVE IT
  2405.           SHLD   NEST
  2406.           LHLD   VLOC             ;RESTORE OLD SP
  2407.           SPHL
  2408.           JMP    IEND             ;ALL DONE
  2409. FONE:     DB     200Q,0,0,001Q    ;FLOATING PNT ONE
  2410. ;NEXT STATEMENT PROCESSOR
  2411. NEXT:     LHLD   CPNT             ;FIX PNTR'S
  2412.           INX    H
  2413.           INX    H
  2414.           INX    H
  2415.           INR    C
  2416.           CALL   ICP7
  2417.           CALL   ALPHA            ;LETTER?
  2418.           JNC    ER21             ;NO, ERROR
  2419.           MOV    B,M              ;YES, GET IT
  2420.           MOV    D,C              ;SAVE C
  2421.           MVI    C,0              ;INIT C TO 0
  2422.           INX    H                ;BUMP PNTR'S
  2423.           DCR    D
  2424.           JZ     NEXT1
  2425.           CALL   NUMB             ;NUMBER?
  2426.           JNC    ER21             ;NO, ERROR
  2427.           MOV    C,M              ;YES, GET IT
  2428.           DCR    D                ;SHOULD BE EOL
  2429.           JNZ    ER21
  2430. NEXT1:    LXI    H,0              ;GET SP
  2431.           DAD    SP
  2432.           SHLD   VLOC             ;SAVE IT
  2433.           LHLD   NEST             ;GET NEST SP
  2434.           MOV    A,L              ;COMPARE WITH BOTTOM
  2435.           CPI    BOTNS AND 377Q
  2436.           JZ     ER19             ;NEXT BEFORE FOR
  2437.           SPHL                    ;LOAD SP
  2438.           POP    H                ;GET LAST INDEX
  2439.           MOV    A,B              ;COMPARE TO CURRENT
  2440.           CMP    H
  2441.           JNZ    ER20             ;NESTING ERROR
  2442.           MOV    A,C
  2443.           CMP    L
  2444.           JNZ    ER20
  2445.           LHLD   VLOC             ;ALL OK, RESTORE OLD SP
  2446.           SPHL
  2447.           MVI    A,77Q            ;MASK
  2448.           ANA    B                ;MASK OUT TOP 2 BITS
  2449.           MOV    B,A
  2450.           CALL   FSYM             ;FIND SYMBOL
  2451.           XCHG                    ;ADDRESS TO D,E
  2452.           LXI    H,FREG1          ;COPY STEP TO FREG1
  2453.           CALL   COPDH
  2454.           INX    D                ;PNT TO CHARACTERISTIC OF STEP
  2455.           INX    D
  2456.           INX    D
  2457.           LDAX   D                ;GET IT
  2458.           ANI    200Q             ;GET SIGN
  2459.           RAL                     ;ROTATE IT INTO CARRY
  2460.           CMC                     ;COMPLEMENT IT
  2461.           MVI    A,0              ;MAKE SURE A=0
  2462.           RAL                     ;ROTATE TO LSB
  2463.           INR    A                ;BUMP BY ONE
  2464.           STA    VLOC             ;SAVE IT, ITS =1 IF - STEP, ELSE = 2
  2465.           INX    D                ;PNT TO VARIABLE PNTR
  2466.           XCHG                    ;GET IT TO DE
  2467.           MOV    E,M
  2468.           INX    H
  2469.           MOV    D,M
  2470.           INX    H
  2471.           PUSH   H                ;SAVE DATA BLOCK PNTR.
  2472.           LXI    H,FREG2          ;COPY VARIBLE VALUE TO FREG2
  2473.           CALL   COPDH            ;SAVE VARIABLE LOCATION IN H,L
  2474.           XCHG
  2475.           MVI    A,2              ;SET UP TO ADD
  2476.           CALL   BINOP            ;AND DO IT
  2477.           CALL   COPDH            ;COPY TO VARIABLE
  2478.           LXI    H,FREG1          ;AND TO FREG1 FOR COMPARE
  2479.           CALL   COPDH
  2480.           POP    D                ;PNT TO LIMIT
  2481.           LXI    H,FREG2          ;COPY TO FREG2
  2482.           CALL   COPDH
  2483.           PUSH   D                ;SAVE DATA BLOCK PNTR
  2484.           CALL   FCOMP            ;COMPARE
  2485.           LXI    H,VLOC           ;COMPARE WITH STEP TYPE
  2486.           CMP    M
  2487.           POP    H                ;GET DATA BLOCK PNTR.
  2488.           JZ     NXTDN            ;YES => LOOP DONE
  2489.           INX    H                ;LOOP NOT DONE
  2490.           INX    H                ;PNT TO TRANSFER ADD.
  2491.           INX    H
  2492.           INX    H
  2493.           MOV    E,M              ;GET IT TO H,L
  2494.           INX    H
  2495.           MOV    D,M
  2496.           XCHG
  2497.           JMP    ILOOP
  2498. NXTDN:    LXI    H,NEST           ;POP NEST STACK
  2499.           INR    M
  2500.           INR    M
  2501.           JMP    IEND             ;CONTINUE
  2502. ER16:     MVI    A,16H            ;'=' EXPECTED(NOTE: NO ARRAY ELEMENTS
  2503.           JMP    ERROR            ;FOR INDICES)
  2504. ER17:     MVI    A,17H            ;BAD SYNTAX NEAR 'TO' OR 'STEP'
  2505.           JMP    ERROR            ;IN FOR STATEMENT
  2506. ER18:     MVI    A,18H            ;FOR'S NESTED TOO DEEPLY
  2507.           JMP    ERROR
  2508. ER19:     MVI    A,19H            ;'NEXT' EXECUTED BEFORE A 'FOR'
  2509.           JMP    ERROR
  2510. ER20:     MVI    A,20H            ;NESTING ERROR, 'FOR'-'NEXT'
  2511.           JMP    ERROR
  2512. ER21:     MVI    A,21H            ;BAD INDEX IN FOR-NEXT
  2513.           JMP    ERROR
  2514. ;
  2515. ; THIS SUB CHECKS FOR PAGE BOUNDARY CROSSING
  2516. ; OF VARIABLE STORAGE BEFORE UPDATING
  2517. ; FORWARD POINTER
  2518. ;    D-E  POINT TO CURRENT LOCATION OF NEXT VARIABLE
  2519. ;    H-L  POINT TO PREVIOUS VARIABLE LOCATION
  2520. ;
  2521. ;  MODIFY D-E ( IF NECESSARY ) SO VARIABLE WILL NOT CROSS PAGE BOUNDARY
  2522. ;
  2523. CHKLC:
  2524.           PUSH    PSW
  2525.           PUSH    D              ; SEE IF CURRENT VARIABLE
  2526.           MVI     A,7            ; STORAGE 8 WORD BLOCK
  2527.           ADD     E              ; WILL CROSS PAGE BOUNDARY
  2528.           JC      CH0VL
  2529. ;  OK  -  DOES NOT CROSS PAGE
  2530.           POP     D
  2531.           POP     PSW
  2532.           RET
  2533. ;  PAGE BOUNDARY CROSSED  -  SET D-E TO START OF NEXT PAGE
  2534. CH0VL:
  2535.           POP     D
  2536.           INR     D
  2537.           MVI     E,0
  2538.           POP     PSW
  2539.           RET
  2540. ;
  2541. ;  THIS SUB IS CALLED FROM 'DIM' PROCESSOR
  2542. ;  REGS. 'D-E' POINT TO NEXT AVAILABLE WORD OF VARIABLE STORAGE
  2543. ;  THIS SUB MAKES SURE THAT STORAGE STARTS ON A 4-WORD
  2544. ;  BOUNDARY SO FLT. PT. NUMBER WILL NOT CROSS PAGE
  2545. ;
  2546. CKDIM:
  2547.           MOV    A,E
  2548.           ANI    3
  2549.           RZ
  2550.           MOV    A,E
  2551.           ANI    374Q
  2552.           ADI    4
  2553.           MOV    E,A
  2554.           MOV    A,D
  2555.           ACI    0
  2556.           MOV    D,A
  2557.           RET
  2558.  
  2559. ; CALL ROUTINES
  2560.  
  2561. ;###S
  2562. ;FWAM:    DW VEND             ;DEFINE FWAM POINTER
  2563. ;###E
  2564.  
  2565.          END
  2566.  
  2567.