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