home *** CD-ROM | disk | FTP | other *** search
/ CP/M / CPM_CDROM.iso / simtel / cpmug / cpmug017.ark / DENVBAS.ASM < prev    next >
Encoding:
Assembly Source File  |  1984-04-29  |  15.8 KB  |  1,455 lines

  1.     ORG    3
  2. STAK    EQU    7100H
  3. ; TINY BASIC INTERPRETER
  4. ; INTEGER ARITHMETIC
  5. ; WITH RND FUNCTION
  6. STRT:    LXI    SP,STAK
  7.     NOP
  8.     NOP
  9.     NOP
  10.     CALL    INIT    ;INITIALIZE
  11.     LXI    H,TOPL
  12.     MVI    M,1
  13.     SHLD    EFPN
  14. ERNT:    XRA    A
  15.     STA    LNUM
  16.     MVI    E,'?'
  17.     MVI    A,'>'
  18.     CALL    DTIN+8
  19.     CALL    LF
  20.     LXI    H,IBUF
  21.     SHLD    APNT
  22.     CALL    NTST    ;TEST FOR #
  23.     JC    STMT    ;NO #, XCT
  24.     CALL    RPLN    ;EDIT
  25.     JMP    ERNT
  26. ; INITIALIZATION ROUTINE
  27. INIT:    LXI    H,SYMT
  28.     MVI    B,NSYM
  29.     CALL    CLER
  30.     STA    CHCT
  31.     LHLD    EFPN
  32.     INX    H
  33.     SHLD    NMLC
  34.     LXI    H,ASTR
  35.     SHLD    ASTK
  36.     LXI    H,VSTR
  37.     SHLD    VSTK
  38.     LXI    H,RSTR-1
  39.     MOV    M,A
  40.     INX    H
  41.     MOV    M,A
  42.     SHLD    RSTK
  43.     RET
  44. ; ZERO MEMORY
  45. CLER:    XRA    A
  46.     MOV    M,A
  47.     INX    H
  48.     DCR    B
  49.     JNZ    CLER+1
  50.     RET
  51. ; INPUT ROUTINE
  52. DTIN:    MVI    E,'?'
  53.     MOV    A,E
  54.     CALL    TVTO
  55.     MVI    A,' '
  56.     CALL    TVTO
  57. DTN1:    LXI    H,IBUF
  58.     PUSH    H
  59.     MVI    B,IBLN
  60.     CALL    CLER
  61.     POP    H
  62.     MVI    B,IBLN-2
  63. DTN2:    CALL    TVTI
  64.     CMP    E
  65.     JZ    DTN1
  66.     CPI    18H
  67.     JNZ    $+12
  68.     LXI    SP,STAK
  69.     CALL    CRLF
  70.     JMP    ERNT
  71.     MOV    M,A
  72.     CPI    13
  73.     RZ
  74.     DCR    B
  75.     JM    ILTL
  76.     INX    H
  77.     JMP    DTN2
  78. ; TEST INPUT FOR LINE NUMBER
  79. NTST:    CALL    SBLK
  80.     CALL    TSTN
  81.     RC
  82.     MOV    B,H
  83.     MOV    C,L
  84.     CALL    ADEC
  85.     MOV    A,H
  86.     ORA    A
  87.     JNZ    ERRM
  88.     MOV    A,L
  89.     CPI    2
  90.     JC    ERRM
  91.     STA    FNUM
  92.     MOV    H,B
  93.     MOV    L,C
  94.     SHLD    APNT    ;SET APNT
  95.     RET
  96. SBLK:    LHLD    APNT
  97.     MOV    A,M
  98.     CPI    ' '
  99.     RNZ
  100.     INX    H
  101. SBL1:    SHLD    APNT
  102.     JMP    SBLK+3
  103. ; TEST FOR NUMERIC
  104. TSTN:    LHLD    APNT
  105.     MOV    A,M
  106. TSN1:    CPI    '0'
  107.     RC
  108.     CPI    '9'+1
  109.     CMC
  110.     RET
  111. ; CONVERT ASCII TO BINARY
  112. ADEC:    LXI    H,0
  113.     LDAX    B
  114.     CALL    TSN1
  115.     RC
  116.     MOV    D,H
  117.     MOV    E,L
  118.     DAD    H
  119.     DAD    H
  120.     DAD    D
  121.     DAD    H
  122.     SUI    '0'
  123.     MOV    E,A
  124.     MVI    D,0
  125.     DAD    D
  126.     INX    B
  127.     JMP    ADEC+3
  128. ; REPLACE LINE
  129. RPLN:    CALL    LNFD
  130.     JNZ    INSL
  131.     PUSH    H
  132.     PUSH    H
  133.     INX    H
  134.     CALL    NXTL
  135.     POP    D
  136. ; DELETE OLD LINE
  137. RPL1:    MOV    A,M
  138.     STAX    D
  139.     INX    D
  140.     INX    H
  141.     CPI    2
  142.     JNC    RPL1
  143.     DCX    D
  144.     XCHG
  145.     SHLD    EFPN
  146.     POP    D
  147.     LHLD    APNT
  148.     MOV    A,M
  149.     CPI    13
  150.     RZ
  151.     XCHG
  152. ; INSERT NEW LINE - COUNT CHARS IN NEW LINE
  153. INSL:    XCHG
  154.     LHLD    APNT
  155.     LXI    B,1
  156. INS1:    MOV    A,M
  157.     INR    C
  158.     INX    H
  159.     CPI    13
  160.     JNZ    INS1
  161.     LHLD    EFPN
  162.     PUSH    H
  163.     DAD    B
  164.     MOV    A,H
  165.     CPI    MMAX
  166.     JNC    ERMO
  167.     SHLD    EFPN    ;NEW EOF
  168.     POP    B
  169. ; MOV ALL LINES UP
  170. INS2:    LDAX    B
  171.     MOV    M,A
  172.     MOV    A,B
  173.     SUB    D
  174.     DCX    H
  175.     DCX    B
  176.     JNZ    INS2
  177.     MOV    A,C
  178.     INR    A
  179.     SUB    E
  180.     JNZ    INS2
  181. ; INSERT NEW LINE
  182.     LDA    FNUM
  183.     STAX    D
  184.     INX    D
  185.     LHLD    APNT
  186. INS3:    MOV    A,M
  187.     STAX    D
  188.     INX    H
  189.     INX    D
  190.     CPI    13
  191.     JNZ    INS3
  192.     RET
  193. ; LINE FINDER
  194. LNFD:    LXI    H,TOPL
  195.     LDA    FNUM
  196.     MOV    B,A
  197. LNF1:    MOV    A,M
  198.     CPI    2
  199.     RC
  200.     CMP    B
  201.     RNC
  202.     INX    H
  203.     CALL    NXTL
  204.     JMP    LNF1
  205. ; GET NEXT LINE START
  206. NXTL:    MOV    A,M
  207.     INX    H
  208.     CPI    13
  209.     RZ
  210.     JNC    NXTL
  211.     DCX    H
  212.     RET
  213. ; RANDOM NUMBER GENERATOR
  214. RND:    CALL    ASPP
  215.     MOV    A,L
  216.     ORA    H
  217.     JZ    GEN
  218.     STA    LORD
  219.     SHLD    HORD
  220. GEN:    LDA    LORD
  221.     MVI    C,15
  222.     MOV    B,A
  223.     ANI    33    ;BITS 19 AND 24
  224.     JPE    GEN1
  225.     STC
  226. GEN1:    LHLD    HORD
  227.     CALL    HLRS
  228.     SHLD    HORD
  229.     MOV    A,B
  230.     RAR
  231.     DCR    C
  232.     JNZ    GEN+5
  233.     STA    LORD
  234.     MVI    A,7FH
  235.     ANA    H
  236.     MOV    H,A
  237.     CALL    ASPH
  238.     RET
  239. ; HLCM - HL COMPLEMENT
  240. HLCM:    MOV    A,L
  241.     CMA
  242.     MOV    L,A
  243.     MOV    A,H
  244.     CMA
  245.     MOV    H,A
  246.     INX    H
  247.     RET
  248. ; HLLS - HL LEFT SHIFT
  249. HLLS:    MOV    A,L
  250.     RAL
  251.     MOV    L,A
  252.     MOV    A,H
  253.     RAL
  254.     MOV    H,A
  255.     RET
  256. ; HLRS - HL RIGHT SHIFT
  257. HLRS:    MOV    A,H
  258.     RAR
  259.     MOV    H,A
  260.     MOV    A,L
  261.     RAR
  262.     MOV    L,A
  263.     RET
  264. ; BUML - BINARY MULTIPLY
  265. BUML:    PUSH    H
  266.     LXI    H,0
  267.     SHLD    PRD2
  268.     MVI    B,16
  269. BUM1:    LHLD    PRD1
  270.     CALL    HLRS
  271.     SHLD    PRD1
  272.     LHLD    PRD2
  273.     JNC    BUM2
  274.     POP    D
  275.     DAD    D
  276.     PUSH    D
  277. BUM2:    CALL    HLRS
  278.     SHLD    PRD2
  279.     DCR    B
  280.     JNZ    BUM1
  281.     POP    D
  282.     LHLD    PRD1
  283.     CALL    HLRS
  284.     RET
  285. ; BUDV - BINARY DIVIDE
  286. BUDV:    CALL    HLCM
  287.     PUSH    H
  288.     MVI    B,17
  289.     ORA    A
  290. BUD1:    LHLD    DVD2
  291.     CALL    HLLS
  292.     SHLD    DVD2
  293.     DCR    B
  294.     JZ    BUD2
  295.     LHLD    DVD1
  296.     CALL    HLLS
  297.     SHLD    DVD1
  298.     POP    D
  299.     DCX    SP
  300.     DCX    SP
  301.     DAD    D
  302.     JNC    BUD1
  303.     SHLD    DVD1
  304.     JMP    BUD1
  305. BUD2:    POP    D
  306.     RET
  307. ; SPNZ - SPACE TO NEXT ZONE
  308. SPNZ:    LDA    CHCT
  309.     MOV    B,A
  310.     SUI    8
  311.     JZ    $+6
  312.     JNC    SPNZ+4
  313.     MOV    C,A
  314.     DCR    C
  315.     MVI    A,' '
  316. SPN3:    INR    C
  317.     JP    SPN4
  318.     CALL    TVTO
  319.     INR    B
  320.     JMP    SPN3
  321. SPN4:    MOV    A,B
  322.     STA    CHCT
  323.     RET
  324. ; VSIN - INCREMENT VSTK
  325. VSIN:    CALL    STOV
  326.     SHLD    VSTK
  327.     RET
  328. ; STOV - CHECK FOR OVERFLOW
  329. STOV:    LHLD    ASTK
  330.     XCHG
  331.     LHLD    VSTK
  332.     INX    H
  333.     INX    H
  334.     MOV    A,L
  335.     SUB    E
  336.     MOV    A,H
  337.     SBB    D
  338.     JNC    STOF
  339.     RET
  340. ; TAPE INPUT ROUTINE
  341. TPIN:    MVI    C,1
  342.     LXI    D,8
  343.     IN    TAPU
  344.     ANA    C
  345.     JNZ    TPIN+5
  346.     MVI    B,192
  347.     DCR    B
  348.     JNZ    $-1
  349. TPI2:    IN    TAPU
  350.     ANA    C
  351.     ADD    D
  352.     RRC
  353.     MOV    D,A
  354.     MVI    B,128
  355.     DCR    B
  356.     JNZ    $-1
  357.     DCR    E
  358.     JNZ    TPI2
  359.     MOV    M,A
  360.     CMP    C
  361.     RZ    
  362.     INX    H
  363.     JMP    TPIN+2
  364. TVTI:    JMP    3F08H
  365. TVTO:    PUSH    B
  366.     MOV    C,A
  367.     CALL    3809H
  368.     POP    B
  369.     RET
  370. ; END BLOCK 1
  371. ; STMT - STATEMENT PROCESSOR
  372. STMT:    LXI    D,LTMS
  373.     CALL    TST
  374. STM1:    CALL    TSTV
  375.     JC    ERRS
  376.     LXI    D,EQMS
  377.     CALL    TST
  378.     CALL    EXPR
  379.     CALL    DONE
  380.     CALL    STOR
  381.     JMP    NXT
  382. EQMS:    DB    '='+128
  383.     JMP    ERRS
  384. LTMS:    DB    'LE','T'+128
  385.     LXI    D,GOMS
  386.     CALL    TST
  387.     LXI    D,TOMS
  388.     CALL    TST
  389.     CALL    EXPR
  390.     CALL    DONE
  391.     JMP    XFER
  392. TOMS:    DB    'T','O'+128
  393.     LXI    D,SBMS
  394.     CALL    TST
  395.     CALL    EXPR
  396.     CALL    DONE
  397.     CALL    SAV
  398.     JMP    XFER
  399. SBMS:    DB    'SU','B'+128
  400.     JMP    ERRS
  401. GOMS:    DB    'G','O'+128
  402.     LXI    D,PRMS
  403.     CALL    TST
  404. PRT1:    LXI    D,QUMS
  405.     CALL    TST
  406.     CALL    PRS
  407. PRT2:    LXI    D,CMMS
  408.     CALL    TST
  409.     CALL    SPNZ
  410.     JMP    PRT1
  411. CMMS:    DB    ','+128
  412.     LXI    D,SMMS
  413.     CALL    TST
  414.     LHLD    APNT
  415.     MOV    A,M
  416.     CPI    13
  417.     JZ    SMM2
  418.     CPI    ':'
  419.     JNZ    PRT1
  420.     JMP    SMM2
  421. SMMS:    DB    ';'+128
  422.     CALL    CRLF
  423.     XRA    A
  424.     STA    CHCT
  425. SMM2:    CALL    DONE
  426.     JMP    NXT
  427. QUMS:    DB    '"'+128
  428.     LHLD    APNT
  429.     MOV    A,M
  430.     CPI    13
  431.     JZ    SMMS+1
  432.     CPI    ':'
  433.     JZ    SMMS+1
  434.     CALL    EXPR
  435.     CALL    PRNV
  436.     JMP    PRT2
  437. PRMS:    DB    'P','R'+128
  438.     LXI    D,IFMS
  439.     CALL    TST
  440.     CALL    EXPR
  441.     CALL    RELP
  442.     CALL    EXPR
  443.     CALL    CMPR
  444.     JNC    STMT
  445. IFNX:    LHLD    APNT
  446.     CALL    NXTL
  447.     DCX    H
  448.     SHLD    APNT
  449.     JMP    NXT
  450. IFMS:    DB    'I','F'+128
  451.     LXI    D,INMS
  452.     CALL    TST
  453.     XRA    A
  454.     STA    CHCT
  455.     CALL    DTIN
  456. INM1    CALL    TSTV
  457.     JC    ERRS
  458.     CALL    NCOV
  459.     CALL    STOR
  460.     LXI    D,CMM1
  461.     CALL    TST
  462.     JMP    INM1
  463. CMM1:    DB    ','+128
  464.     XRA    A
  465.     STA    CHCT
  466.     CALL    DONE
  467.     JMP    NXT
  468. INMS:    DB    'I','N'+128
  469.     LXI    D,RTMS
  470.     CALL    TST
  471.     CALL    DONE
  472.     JMP    RSTO
  473. RTMS:    DB    'RE','T'+128
  474.     LXI    D,ENMS
  475.     CALL    TST
  476.     JMP    ENDM
  477. ENMS:    DB    'EN','D'+128
  478.     LXI    D,LSMS
  479.     CALL    TST
  480.     JMP    LIST
  481. LSMS:    DB    'LIS','T'+128
  482.     LXI    D,RNMS
  483.     CALL    TST
  484.     CALL    INIT
  485.     LXI    H,TOPL
  486.     MOV    A,M
  487.     CPI    2
  488.     JC    ERRM
  489.     JMP    NXT1-4
  490. RNMS:    DB    'RU','N'+128
  491.     LXI    D,CLMS
  492.     CALL    TST
  493.     JMP    STRT
  494. CLMS:    DB    'CLEA','R'+128
  495.     LXI    D,TPMS
  496.     CALL    TST
  497.     JMP    TAPE
  498. TPMS:    DB    'TAP','E'+128
  499.     LXI    D,LDMS
  500.     CALL    TST
  501.     LXI    H,TOPL
  502.     CALL    TPIN
  503.     SHLD    EFPN
  504.     JMP    ERNT
  505. LDMS:    DB    'LOA','D'+128
  506.     LXI    D,DMSG
  507.     CALL    TST
  508. LDMX:    CALL    TSTV
  509.     JNC    DMER
  510.     LXI    D,DMC2
  511.     CALL    TST
  512.     JMP    LDMX:
  513. DMC2:    DB    ','+128
  514.     CALL    DONE
  515.     JMP    NXT
  516. DMSG:    DB    'DI','M'+128
  517.     LXI    D,SZEM
  518.     CALL    TST
  519.     CALL    SZER
  520.     JMP    ERNT
  521. SZEM:    DB    'SIZ','E'+128
  522.     LXI    D,RMKS
  523.     CALL    TST
  524.     JMP    IFNX
  525. RMKS:    DB    'RE','M'+128
  526.     LXI    D,CLRM
  527.     CALL    TST
  528. ;    CALL    CLRS    ;THIS IS A NO-NO
  529.     NOP
  530.     NOP
  531.     NOP
  532.     XRA    A
  533.     STA    CHCT
  534.     CALL    DONE
  535.     JMP    NXT
  536. CLRM:    DB    'CLR','S'+128
  537. ; END OF STATEMENT PROCESSOR
  538. ; IF NO MORE OPERATIONS ARE ADDED
  539. ; INPUT TESTS HERE
  540. ; DEFAULT IS LET
  541.     JMP    STM1
  542. ; TST ROUTINE - STRING COMPARE
  543. ; ALTERNATE RETURN IF NO MATCH
  544. TST:    MVI    B,1
  545.     LHLD    APNT
  546. TST1:    LDAX    D
  547.     RAL
  548.     JNC    TST2
  549.     DCR    B
  550.     CMC
  551. TST2:    RAR
  552.     CMP    M
  553.     INX    H
  554.     INX    D
  555.     JNZ    TST3
  556.     MOV    A,B
  557.     ORA    A
  558.     JNZ    TST1
  559.     CALL    SBL1
  560.     RET
  561. ; SET ALT. RETURN
  562. TST3:    MOV    A,B
  563.     ORA    A
  564.     JZ    TST5
  565. TST4:    LDAX    D
  566.     INX    D
  567.     RAL
  568.     JNC    TST4
  569. TST5:    XCHG
  570.     POP    D
  571.     PCHL    ;ALT    RETURN
  572. ; DONE - TEST FOR CR OR :
  573. DONE:    CALL    SBLK
  574.     CPI    13
  575.     RZ
  576.     CPI    ':'
  577.     RZ
  578.     JMP    ERRS
  579. ; NXT - SETUP FOR NEXT LINE #
  580. NXT:    LHLD    APNT
  581.     MOV    A,M
  582.     INX    H
  583.     CPI    ':'
  584.     JZ    NXT1
  585.     MOV    A,M
  586.     CPI    2
  587.     JC    EOFR
  588.     STA    LNUM
  589.     INX    H
  590. NXT1:    CALL    SBL1
  591.     JMP    STMT
  592. ; XFER - NEW LINE FOR GO
  593. XFER:    CALL    ASPP
  594.     MOV    A,H
  595.     ORA    A
  596.     JNZ    ERRM
  597.     MOV    A,L
  598.     CPI    2
  599.     JC    ERRM
  600. XFE1:    STA    FNUM
  601.     CALL    LNFD
  602.     JNZ    ERML
  603.     JMP    NXT1-4
  604. ; SAV - SAVE RETURN LINE #
  605. SAV:    CALL    NXTL
  606.     JC    EOFR
  607.     MOV    B,M
  608.     LXI    H,RSTR+8
  609.     XCHG
  610.     LHLD    RSTK
  611.     MOV    A,L
  612.     SUB    E
  613.     MOV    A,H
  614.     SBB    D
  615.     JNC    GSER
  616.     MOV    M,B
  617.     INX    H
  618.     SHLD    RSTK
  619.     RET
  620. ; TSTV - TEST FOR VARIABLE
  621. TSTV:    MVI    C,0
  622.     LHLD    APNT
  623.     MOV    A,M
  624.     CPI    'A'
  625.     RC
  626.     CPI    'Z'+1
  627.     CMC
  628.     RC
  629.     MOV    B,A
  630.     INX    H    
  631.     MOV    A,M
  632.     CPI    '('
  633.     JNZ    $+9
  634.     INX    H
  635.     MVI    C,0E0H
  636.     JMP    TSV1
  637.     CPI    '1'
  638.     JC    TSV1
  639.     CPI    '7'
  640.     JNC    TSV1
  641.     INX    H
  642.     ANI    7
  643.     RRC
  644.     RRC
  645.     RRC
  646.     MOV    C,A
  647. TSV1:    CALL    SBL1
  648.     MVI    A,1FH
  649.     ANA    B
  650.     ORA    C
  651.     MOV    B,A
  652.     MVI    C,-1
  653.     LXI    H,SYMT-1
  654. TSV2:    INX    H
  655.     INR    C
  656.     MOV    A,M
  657.     ORA    A
  658.     JZ    TSV3
  659.     MOV    A,C
  660.     CPI    NSYM
  661.     JNC    SMOE
  662.     MOV    A,M
  663.     CMP    B
  664.     JNZ    TSV2
  665.     INR    A
  666. TSV3:    MOV    M,B
  667.     PUSH    PSW
  668.     PUSH    PSW
  669.     MVI    D,0
  670.     MOV    A,C
  671.     RAL
  672.     MOV    E,A
  673.     LXI    H,VSTR
  674.     DAD    D
  675.     MOV    A,B
  676.     SUI    0E0H
  677.     JNC    TSV4
  678.     CALL    ASPH
  679.     POP    PSW
  680.     CZ    VSIN
  681.     POP    PSW
  682.     RET
  683. ; STOR - STORE VAR. VALUE
  684. STOR:    CALL    ASPP
  685.     PUSH    H
  686.     CALL    ASPP
  687.     POP    D
  688.     MOV    M,E
  689.     INX    H
  690.     MOV    M,D
  691.     RET
  692. ; RSTO - NEW # FOR RETURN
  693. RSTO:    LHLD    RSTK
  694.     DCX    H
  695.     MOV    A,M
  696.     ORA    A
  697.     JZ    RNER
  698.     SHLD    RSTK
  699.     JMP    XFE1
  700. ; PRNV - PRINT VARIABLE
  701. PRNV:    CALL    ASPP
  702.     CALL    DECA
  703.     RET
  704. ; TAPE - OUTPUT TO TAPE
  705. TAPE:    LXI    H,TOPL
  706.     MOV    A,M
  707.     CALL    TAPO
  708.     CPI    2
  709.     JC    ERNT
  710.     INX    H
  711.     JMP    TAPE+3
  712. ; END BLOCK 2
  713. ; ASPH - PUSH HL TO ASTK
  714. ASPH:    PUSH    H
  715.     CALL    STOV
  716.     DCX    D
  717.     POP    H
  718.     MOV    A,L
  719.     STAX    D
  720.     DCX    D
  721.     MOV    A,H
  722.     STAX    D
  723.     XCHG
  724.     SHLD    ASTK
  725.     RET
  726. ; ASPP - POP HL FROM ASTK
  727. ASPP:    LHLD    ASTK
  728.     XCHG
  729.     LXI    H,ASTR
  730.     CALL    HLCM
  731.     DAD    D
  732.     JC    SUFE
  733.     XCHG
  734.     MOV    D,M
  735.     INX    H
  736.     MOV    E,M
  737.     INX    H
  738.     SHLD    ASTK
  739.     XCHG
  740.     RET
  741. ; PRS - PRINT STRING
  742. PRS:    LHLD    APNT
  743.     DCX    H
  744.     MOV    A,M
  745.     CPI    '"'
  746.     JNZ    PRS+3
  747.     INX    H
  748.     LDA    CHCT
  749.     MOV    B,A
  750. PRS1:    MOV    A,M
  751.     INX    H
  752.     CPI    13
  753.     JZ    CRER
  754.     CPI    '"'
  755.     JZ    PRS3
  756.     INR    B
  757.     CALL    TVTO
  758.     JMP    PRS1
  759. PRS3:    MOV    A,B
  760.     STA    CHCT
  761.     CALL    SBL1
  762.     RET
  763. ; DECA $ CNVV - OUTPUT #
  764. DECA:    MOV    A,H
  765.     ORA    A
  766.     JP    DEC1
  767.     MVI    A,'-'
  768.     CALL    TVTO
  769.     LDA    CHCT
  770.     INR    A
  771.     STA    CHCT
  772.     CALL    HLCM
  773. DEC1:    LXI    B,5
  774.     LXI    D,-10000
  775.     CALL    CNVV
  776.     LXI    D,-1000
  777.     CALL    CNVV
  778.     LXI    D,-100
  779.     CALL    CNVV
  780.     LXI    D,-10
  781.     CALL    CNVV
  782.     LXI    D,-1
  783.     CALL    CNVV
  784.     RET
  785. CNVV:    PUSH    B
  786.     MVI    B,'0'-1
  787.     INR    B
  788.     DAD    D
  789.     MOV    A,H
  790.     RAL
  791.     JNC    CNVV+3
  792.     XCHG
  793.     CALL    HLCM
  794.     DAD    D
  795.     MOV    A,B
  796.     POP    B
  797.     CPI    '0'
  798.     JZ    CNV2
  799. CNV1:    DCR    C
  800.     CALL    TVTO
  801.     LDA    CHCT
  802.     INR    A
  803.     STA    CHCT
  804.     MVI    B,128
  805.     RET
  806. CNV2:    ADD    B
  807.     JP    CNV3
  808.     SUB    B
  809.     JMP    CNV1
  810. CNV3:    DCR    C
  811.     JZ    CNV3-4
  812.     RET
  813. ; NCOV - INPUT # TO BINARY
  814. NCOV:    LHLD    APNT
  815.     PUSH    H
  816.     LHLD    TMP1
  817.     LDA    CHCT
  818.     ORA    A
  819.     JNZ    NCO2
  820.     LXI    H,IBUF
  821. NCO2:    CALL    SBL1
  822.     CALL    EXPR
  823.     CALL    SBLK
  824.     INX    H
  825.     SHLD    TMP1
  826.     MOV    A,H
  827.     STA    CHCT
  828.     POP    H
  829.     SHLD    APNT
  830.     RET
  831. ; RELP - RELATIONAL OP TEST
  832. RELP:    LXI    D,M0
  833.     CALL    TST
  834.     MVI    L,0
  835. REL1:    MVI    H,0
  836.     CALL    ASPH
  837.     RET
  838. M0:    DB    '='+128
  839.     LXI    D,M4
  840.     CALL    TST
  841.     LXI    D,M1
  842.     CALL    TST
  843.     MVI    L,2
  844.     JMP    REL1
  845. M1:    DB    '='+128
  846.     LXI    D,M3
  847.     CALL    TST
  848.     MVI    L,3
  849.     JMP    REL1
  850. M3:    DB    '>'+128
  851.     MVI    L,1
  852.     JMP    REL1
  853. M4:    DB    '<'+128
  854.     LXI    D,M41
  855.     CALL    TST
  856.     LXI    D,M5
  857.     CALL    TST
  858.     MVI    L,5
  859.     JMP    REL1
  860. M5:    DB    '='+128
  861.     LXI    D,M6
  862.     CALL    TST
  863.     MVI    L,3
  864.     JMP    REL1
  865. M6:    DB    '<'+128
  866.     MVI    L,4
  867.     JMP    REL1
  868. M41:    DB    '>'+128
  869.     JMP    REER
  870. ; EXPR - EXPRESSION EVALUATOR
  871. ; CAN BE CALLED RECURSIVELY
  872. EXPR:    LXI    D,E0
  873.     CALL    TST
  874.     CALL    TERM
  875.     CALL    ASPP
  876.     CALL    HLCM
  877.     CALL    ASPH
  878.     JMP    E1
  879. E0:    DB    '-'+128
  880.     LXI    D,E01
  881.     CALL    TST
  882.     JMP    E01+1
  883. E01:    DB    '+'+128
  884.     CALL    TERM
  885. E1:    LXI    D,E2
  886.     CALL    TST
  887.     CALL    TERM
  888.     CALL    IADD
  889.     JMP    E1
  890. E2:    DB    '+'+128
  891.     LXI    D,E3
  892.     CALL    TST
  893.     CALL    TERM
  894.     CALL    ISUB
  895.     JMP    E1
  896. E3:    DB    '-'+128
  897.     RET
  898. ; TERM - TERM EVALUATOR
  899. ; CAN BE CALLED RECURSIVELY
  900. TERM:    CALL    FACT
  901.     LXI    D,I1
  902.     CALL    TST
  903.     CALL    FACT
  904.     CALL    MULT
  905.     JMP    TERM+3
  906. I1:    DB    '*'+128
  907.     LXI    D,I2
  908.     CALL    TST
  909.     CALL    FACT
  910.     CALL    DIVD
  911.     JMP    TERM+3
  912. I2:    DB    '/'+128
  913.     RET
  914. ; FACT - GET FACTORS
  915. FACT:    CALL    FNTS
  916.     RNC
  917.     CALL    TSTV
  918.     JC    F0
  919.     JZ    UDVE
  920.     CALL    ASPP
  921.     MOV    E,M
  922.     INX    H
  923.     MOV    D,M
  924.     XCHG
  925. FAC1:    CALL    ASPH
  926.     RET
  927. F0:    CALL    TSTN
  928.     JC    F1
  929.     MOV    B,H
  930.     MOV    C,L
  931.     CALL    ADEC
  932.     MOV    D,B
  933.     MOV    E,C
  934.     XCHG
  935.     CALL    SBL1
  936.     XCHG
  937.     JMP    FAC1
  938. F1:    LXI    D,F11
  939.     CALL    TST    ;TEST FOR (
  940.     CALL    EXPR    ;RECURSIVE CALL
  941.     LXI    D,FE1
  942.     CALL    TST
  943.     RET
  944. FE1:    DB    ')'+128
  945.     JMP    RPER
  946. F11:    DB    '('+128
  947.     JMP    ERRS
  948. ; FNTS - FUNCTION TEST
  949. ; RND ONLY FUNCTION INITIALLY
  950. FNTS:    LXI    D,RNDM
  951.     CALL    TST
  952.     CALL    EXPR    ;RECURSIVE
  953.     CALL    RND
  954.     LXI    D,RPMS
  955.     CALL    TST
  956.     ORA    A
  957.     RET
  958. RPMS:    DB    ')'+128
  959.     JMP    RPER
  960. RNDM:    DB    'RND'
  961.     DB    '('+128
  962.     STC
  963.     RET
  964. ; DIM SETUP AND HANDLING
  965. TSV4:    PUSH    H
  966.     CALL    EXPR
  967.     LXI    D,RPTV
  968.     CALL    TST
  969.     JMP    $+7
  970. RPTV:    DB    ')'+128
  971.     JMP    RPER
  972.     CALL    ASPP
  973.     XRA    A
  974.     ORA    H
  975.     JM    DMER
  976.     ORA    L
  977.     JZ    DMER
  978.     XCHG
  979.     POP    H
  980.     POP    PSW
  981.     JNZ    TSV6
  982. ; NEW VAR
  983.     PUSH    D
  984.     XCHG
  985.     LHLD    NMLC
  986.     XCHG
  987.     MOV    M,E
  988.     INX    H
  989.     MOV    M,D
  990.     POP    H
  991.     DAD    H
  992.     DAD    D
  993.     SHLD    NMLC
  994.     MOV    A,H
  995.     CPI    MMAX
  996.     JNC    ERMO
  997.     POP    PSW
  998.     CALL    VSIN
  999.     STC
  1000.     RET
  1001. ; EXISTING DIM VAR
  1002. TSV6:    DCX    D
  1003.     XCHG
  1004.     DAD    H
  1005.     LDAX    D
  1006.     ADD    L
  1007.     MOV    L,A
  1008.     INX    D
  1009.     LDAX    D
  1010.     ADC    H
  1011.     MOV    H,A
  1012.     CALL    ASPH
  1013.     POP    PSW
  1014.     RET
  1015. ; SIZE COMMAND
  1016. SZER:    LHLD    EFPN
  1017.     XCHG
  1018.     LXI    H,TOPL
  1019.     CALL    HLCM
  1020.     DAD    D
  1021.     CALL    DECA
  1022.     MVI    A,5
  1023.     STA    CHCT
  1024.     CALL    SPNZ
  1025.     MVI    D,MMAX
  1026.     MVI    E,0
  1027.     LHLD    EFPN
  1028.     CALL    HLCM
  1029.     DAD    D
  1030.     CALL    DECA
  1031.     CALL    CRLF
  1032.     RET
  1033. ; END BLOCK 3
  1034. ; CMPR - COMPARE 2 VALUES
  1035. CMPR:    CALL    ASPP
  1036.     PUSH    H
  1037.     CALL    ASPP
  1038.     XCHG
  1039.     POP    H
  1040.     PUSH    D
  1041.     CALL    ASPH
  1042.     CALL    ISUB
  1043.     CALL    ASPP
  1044.     POP    B
  1045. ; HERE WITH X-Y IN HL
  1046.     MOV    A,H
  1047.     ORA    A
  1048.     JNZ    CMP0
  1049.     ORA    L
  1050.     MOV    A,C
  1051.     JZ    CMP2
  1052.     CPI    3
  1053.     RET
  1054. CMP0:    MOV    A,C
  1055.     JP    $-4
  1056.     CPI    1
  1057.     RC
  1058.     CPI    4
  1059.     CMC
  1060.     RET
  1061. CMP2:    CPI    0
  1062.     RZ
  1063.     CPI    2
  1064.     RZ
  1065.     CPI    5
  1066.     RET
  1067. ; ISUB/IADD - ADD - SUBTRACT
  1068. ISUB:    CALL    ASPP
  1069.     CALL    HLCM
  1070.     JMP    IADD+3
  1071. IADD:    CALL    ASPP
  1072.     MOV    A,H
  1073.     ANI    128
  1074.     RAR
  1075.     MOV    B,A
  1076.     PUSH    H
  1077.     CALL    ASPP
  1078.     MOV    A,H
  1079.     ANI    128
  1080.     ADD    B
  1081.     POP    D
  1082.     DAD    D
  1083.     RAR    
  1084.     MOV    B,A
  1085.     MOV    A,H
  1086.     RAL
  1087.     MOV    A,B
  1088.     RAR    
  1089.     CPI    128
  1090.     JZ    AOFE
  1091.     CPI    112
  1092.     JZ    AOFE
  1093.     CALL    ASPH
  1094.     RET
  1095. ; DIVD - INTEGER DIVIDE
  1096. DIVD:    CALL    ASPP
  1097.     MOV    A,L
  1098.     ORA    H
  1099.     JZ    DZER
  1100.     MVI    A,128
  1101.     ANA    H
  1102.     MOV    B,A
  1103.     CM    HLCM
  1104.     PUSH    H
  1105.     CALL    ASPP
  1106.     MVI    A,128
  1107.     ANA    H
  1108.     ADD    B
  1109.     STA    TEMP
  1110.     MOV    A,H
  1111.     ORA    A
  1112.     CM    HLCM
  1113.     SHLD    DVD2
  1114.     LXI    H,0
  1115.     SHLD    DVD1
  1116.     POP    H
  1117.     CALL    BUDV
  1118.     LDA    TEMP
  1119.     ORA    A
  1120.     CNZ    HLCM
  1121.     CALL    ASPH
  1122.     RET
  1123. ; MULT - INTEGER MULTIPLY
  1124. MULT:    CALL    ASPP
  1125.     MVI    A,128
  1126.     ANA    H
  1127.     MOV    B,A
  1128.     CM    HLCM
  1129.     PUSH    H
  1130.     CALL    ASPP    
  1131.     MVI    A,128
  1132.     ANA    H
  1133.     ADD    B
  1134.     STA    TEMP
  1135.     MOV    A,H
  1136.     RAL
  1137.     CC    HLCM
  1138.     SHLD    PRD1
  1139.     POP    H
  1140.     CALL    BUML
  1141.     MOV    A,H
  1142.     RAL
  1143.     JC    MOFE
  1144.     XCHG
  1145.     LHLD    PRD2
  1146.     MOV    A,L
  1147.     ORA    H
  1148.     JNZ    MOFE
  1149.     XCHG
  1150.     LDA    TEMP
  1151.     ORA    A
  1152.     CNZ    HLCM
  1153.     CALL    ASPH
  1154.     RET
  1155. ; TAPO - TAPE OUT ROUTINE
  1156. TAPO:    MVI    C,9
  1157.     ORA    A
  1158.     RAL
  1159. TAP1:    OUT    TAPU
  1160.     MVI    B,128
  1161. TAP2:    DCR    B
  1162.     JNZ    TAP2
  1163.     RAR
  1164.     DCR    C
  1165.     JNZ    TAP1
  1166.     RAR
  1167.     STC
  1168.     RAL
  1169.     OUT    TAPU
  1170.     MVI    B,255
  1171. TAP3:    DCR    B
  1172.     JNZ    TAP3
  1173.     RAR    
  1174.     RET
  1175. ; LIST - LIST FILE ON TVT
  1176. LIST:    MVI    A,1
  1177.     STA    FNUM
  1178.     MVI    A,255
  1179.     STA    LNUM
  1180.     CALL    TSTN
  1181.     JC    LIS1
  1182.     MOV    B,H
  1183.     MOV    C,L
  1184.     CALL    ADEC
  1185.     MOV    A,L
  1186.     STA    FNUM
  1187.     STA    LNUM
  1188.     MOV    H,B
  1189.     MOV    L,C
  1190.     CALL    SBL1
  1191.     CALL    TSTN
  1192.     JC    LIS1
  1193.     MOV    B,H
  1194.     MOV    C,L
  1195.     CALL    ADEC
  1196.     MOV    A,L
  1197.     STA    LNUM
  1198. ;LIS1:    CALL    CLRS
  1199. LIS1:    NOP
  1200.     NOP
  1201.     NOP
  1202.     CALL    LNFD
  1203.     MOV    A,M
  1204.     CPI    2
  1205.     JC    ERNT
  1206.     PUSH    H
  1207.     MVI    H,0
  1208.     MOV    L,A
  1209.     CPI    100
  1210.     JNC    LIS2
  1211.     MVI    A,' '
  1212.     CALL    TVTO
  1213.     MOV    A,L
  1214.     CPI    10
  1215.     JNC    LIS2
  1216.     MVI    A,' '
  1217.     CALL    TVTO
  1218. LIS2:    CALL    DECA
  1219.     POP    H
  1220.     INX    H
  1221. LIS3:    MOV    A,M
  1222.     CALL    TVTO
  1223.     INX    H
  1224.     CPI    13
  1225.     JNZ    LIS3
  1226.     CALL    LF
  1227.     MOV    B,M
  1228.     LDA    LNUM
  1229.     SUB    B
  1230.     JNC    LIS1+6
  1231.     JMP    ERNT
  1232. ; ERRS - ERROR HANDLING
  1233. ERRS:    MVI    L,10
  1234. ERR1:    MVI    H,0
  1235.     LXI    SP,STAK
  1236.     CALL    CRLF
  1237.     CALL    DECA
  1238.     MVI    A,' '
  1239.     CALL    TVTO
  1240.     MVI    A,'A'
  1241.     CALL    TVTO
  1242.     MVI    A,'T'
  1243.     CALL    TVTO
  1244.     MVI    A,' '
  1245.     CALL    TVTO
  1246.     LDA    LNUM
  1247.     MOV    L,A
  1248.     MVI    H,0
  1249.     CALL    DECA
  1250.     CALL    CRLF
  1251.     JMP    ERNT
  1252. ERRM:    MVI    L,15
  1253.     JMP    ERR1
  1254. ERMO:    MVI    L,20
  1255.     JMP    ERR1
  1256. EOFR:    LDA    LNUM
  1257.     ORA    A
  1258.     JZ    ERNT
  1259.     MVI    L,25
  1260.     JMP    ERR1
  1261. ERML:    MVI    L,30
  1262.     JMP    ERR1
  1263. GSER:    MVI    L,35
  1264.     JMP    ERR1
  1265. SMOE:    MVI    L,40
  1266.     JMP    ERR1
  1267. STOF:    MVI    L,45
  1268.     JMP    ERR1
  1269. RNER:    MVI    L,50
  1270.     JMP    ERR1
  1271. CRER:    MVI    L,55
  1272.     JMP    ERR1
  1273. REER:    MVI    L,60
  1274.     JMP    ERR1
  1275. RPER:    MVI    L,65
  1276.     JMP    ERR1
  1277. UDVE:    MVI    L,70
  1278.     JMP    ERR1
  1279. AOFE:    MVI    L,75
  1280.     JMP    ERR1
  1281. MOFE:    MVI    L,80
  1282.     JMP    ERR1
  1283. DZER:    MVI    L,85
  1284.     JMP    ERR1
  1285. ENDM:    MVI    L,90
  1286.     JMP    ERR1
  1287. SUFE:    MVI    L,95
  1288.     JMP    ERR1
  1289. ILTL:    MVI    L,100
  1290.     JMP    ERR1
  1291. DMER:    MVI    L,105
  1292.     JMP    ERR1
  1293. CRLF:    MVI    A,0DH    ;CARRIAGE RETURN
  1294.     CALL    TVTO
  1295. LF:    MVI    A,0AH    ;LINE FEED
  1296.     JMP    TVTO
  1297. ; VARIABLE DEFINITIONS
  1298. TVT    EQU    0
  1299. TAPU    EQU    1
  1300. CLRS    EQU    0E090H
  1301. NSYM    EQU    120
  1302. MMAX    EQU    20H
  1303. IBLN    EQU    74
  1304. ; STORAGE AREAS
  1305. EFPN:    DS    2
  1306. TMP1:    DS    2
  1307. NMLC:    DS    2
  1308. APNT:    DS    2
  1309. LNUM:    DS    1
  1310. FNUM:    DS    1
  1311. ASTK:    DS    2
  1312. VSTK:    DS    2
  1313. RSTK:    DS    2
  1314. PRD1:    DS    2
  1315. PRD2:    DS    2
  1316. CHCT:    DS    1
  1317. TEMP:    DS    1
  1318. DVD1    EQU    PRD1
  1319. DVD2    EQU    PRD2
  1320. HORD:    DS    2
  1321. LORD:    DS    1
  1322.     DS    1
  1323. RSTR:    DS    8
  1324. SYMT:    DS    120
  1325. VSTR:    DS    256
  1326. ASTR    EQU    $
  1327. IBUF:    DS    74
  1328. TOPL    EQU    $
  1329.     END
  1330.