home *** CD-ROM | disk | FTP | other *** search
/ C/C++ Interactive Guide / c-cplusplus-interactive-guide.iso / c_ref / csource4 / 284_01 / basic.asm < prev    next >
Assembly Source File  |  1989-03-13  |  12KB  |  1,129 lines

  1. ;
  2. ;    PALO ALTO TINY BASIC
  3. ;    "PORTABLE 8080" VERSION
  4. ;
  5.  
  6. ;    MEMORY CONFIGURATION
  7. ITOP    EQU    0000H
  8. LTOP    EQU    1000H
  9. VTOP    EQU    1300H
  10. LBUF    EQU    VTOP+0037H
  11. LBFSZ    EQU    80
  12. MSTK    EQU    LBUF+LBFSZ
  13. TMSTK    EQU    MSTK+30
  14. STACK    EQU    1400H
  15.  
  16. ;    MAIN PROGRAM
  17.     ORG    ITOP
  18.  
  19. ENTRY:    DI
  20.     LXI    H,OTOP
  21.     SHLD    OBTM
  22. START:    LXI    SP,STACK
  23.     EI
  24.     CALL    CRLF
  25.     LXI    D,OKMES
  26.     SUB    A
  27.     CALL    MSG
  28.     LXI    H,$+7
  29.     SHLD    CLABL
  30.     LXI    H,0000H
  31.     SHLD    FCNTR
  32.     SHLD    RSTCK
  33.  
  34. EDITR:    MVI    A,'>'
  35.     CALL    GETL
  36.     PUSH    D
  37.     LXI    D,LBUF
  38.     CALL    GINT
  39.     CALL    SKPBL
  40.     MOV    A,H
  41.     ORA    L
  42.     POP    B
  43.     JZ    KWCPR
  44. INSRT:    DCX    D
  45.     MOV    A,H
  46.     STAX    D
  47.     DCX    D
  48.     MOV    A,L
  49.     STAX    D
  50.     PUSH    B
  51.     PUSH    D
  52.     MOV    A,C
  53.     SUB    E
  54.     PUSH    PSW
  55.     CALL    SRCH
  56.     PUSH    D
  57.     JNZ    MOVE
  58.     PUSH    D
  59.     CALL    SKIPL
  60.     POP    B
  61.     LHLD    OBTM
  62.     CALL    TRNSF
  63.     MOV    H,B
  64.     MOV    L,C
  65.     SHLD    OBTM
  66. MOVE:    POP    B
  67.     LHLD    OBTM
  68.     POP    PSW
  69.     PUSH    H
  70.     CPI    03H
  71.     JZ    START
  72.     ADD    L
  73.     MOV    L,A
  74.     MVI    A,00H
  75.     ADC    H
  76.     MOV    H,A
  77.     LXI    D,VTOP
  78.     CALL    COMPR
  79.     JNC    ERSRY
  80.     SHLD    OBTM
  81.     POP    D
  82.     CALL    TR2
  83.     POP    D
  84.     POP    H
  85.     CALL    TRNSF
  86.     JMP    EDITR
  87.  
  88. GETL:    CALL    PUT
  89.     LXI    D,LBUF
  90. GETL1:    CALL    GET
  91.     CPI    7FH
  92.     JZ    CRUB
  93.     CPI    08H
  94.     JZ    CRUB
  95.     CPI    18H
  96.     JZ    CCAN
  97.     CALL    PUT
  98.     STAX    D
  99.     INX    D
  100.     CPI    0DH
  101.     RZ
  102.     MOV    A,E
  103.     CPI    LBUFL+LBFSZ
  104.     JNZ    GETL1
  105. CRUB:    MOV    A,E
  106.     CPI    LBUFL
  107.     JZ    CCAN
  108.     DCX    D
  109.     MVI    A,08H
  110.     CALL    PUT
  111.     MVI    A,20H
  112.     CALL    PUT
  113.     MVI    A,08H
  114.     CALL    PUT
  115.     JMP    GETL1
  116. CCAN:    CALL    CRLF
  117.     MVI    A,5CH
  118.     JMP    GETL
  119. LBUFL    EQU    LBUF AND 0FFH
  120.  
  121. SRCH:    MOV    A,H
  122.     ORA    A
  123.     JM    ERHOW
  124.     LXI    D,OTOP
  125. SRCH1:    PUSH    H
  126.     LHLD    OBTM
  127.     DCX    H
  128.     CALL    COMPR
  129.     POP    H
  130.     RC
  131.     LDAX    D
  132.     SUB    L
  133.     MOV    B,A
  134.     INX    D
  135.     LDAX    D
  136.     SBB    H
  137.     JC    SKPL1
  138.     DCX    D
  139.     ORA    B
  140.     RET
  141.  
  142. SKIPL:    INX    D
  143. SKPL1:    INX    D
  144. SKPL2:    LDAX    D
  145.     CPI    0DH
  146.     JNZ    SKPL1
  147.     INX    D
  148.     JMP    SRCH1
  149.  
  150. TRNSF:    CALL    COMPR
  151.     RZ
  152.     LDAX    D
  153.     STAX    B
  154.     INX    D
  155.     INX    B
  156.     JMP    TRNSF
  157.  
  158. TR2:    MOV    A,B
  159.     SUB    D
  160.     JNZ    TR2E
  161.     MOV    A,C
  162.     SUB    E
  163.     RZ
  164. TR2E:    DCX    D
  165.     DCX    H
  166.     LDAX    D
  167.     MOV    M,A
  168.     JMP    TR2
  169.  
  170. KWCPR:    LXI    H,CMDKW-1
  171.  
  172. NXTKW:    CALL    SKPBL
  173. NXTK1:    PUSH    D
  174. KWC1:    LDAX    D
  175.     INX    D
  176.     CPI    '.'
  177.     JZ    KWSRT
  178.     INX    H
  179.     CMP    M
  180.     JZ    KWC1
  181.     DCX    D
  182.     SUB    A
  183.     CMP    M
  184.     JZ    EXEQT
  185. KWSK1:    INX    H
  186.     CMP    M
  187.     JNZ    KWSK1
  188.     INX    H
  189.     INX    H
  190.     POP    D
  191.     JMP    NXTK1
  192.  
  193. KWSRT:    SUB    A
  194. KWSK2:    INX    H
  195.     CMP    M
  196.     JNZ    KWSK2
  197.  
  198. EXEQT:    INX    H
  199.     MOV    A,M
  200.     INX    H
  201.     MOV    H,M
  202.     MOV    L,A
  203.     POP    PSW
  204.     PCHL
  205.  
  206. TEST:    XTHL
  207.     CALL    SKPBL
  208.     CMP    M
  209.     INX    H
  210.     JZ    TSTEQ
  211.     PUSH    B
  212.     MOV    C,M
  213.     MVI    B,00H
  214.     DAD    B
  215.     POP    B
  216.     DCX    D
  217. TSTEQ:    INX    D
  218.     INX    H
  219.     XTHL
  220.     RET
  221.  
  222. SKPBL:    LDAX    D
  223.     CPI    ' '
  224.     RNZ
  225.     INX    D
  226.     JMP    SKPBL
  227.  
  228. NEW:    CALL    TSCR2
  229.     LXI    H,OTOP
  230.     SHLD    OBTM
  231. STOP:    CALL    TSCR2
  232.     JMP    START
  233.  
  234. GOSUB:    CALL    PSHV
  235.     CALL    EEXPR
  236.     PUSH    D
  237.     CALL    SRCH
  238.     JNZ    ERHW1
  239.     LHLD    CLABL
  240.     PUSH    H
  241.     LHLD    RSTCK
  242.     PUSH    H
  243.     LXI    H,0000H
  244.     SHLD    FCNTR
  245.     DAD    SP
  246.     SHLD    RSTCK
  247.     JMP    RUN2
  248.  
  249. RETURN: CALL    TSCR2
  250.     LHLD    RSTCK
  251.     MOV    A,H
  252.     ORA    L
  253.     JZ    ERWHT
  254.     SPHL
  255.     POP    H
  256.     SHLD    RSTCK
  257.     POP    H
  258.     SHLD    CLABL
  259.     POP    D
  260.     CALL    POPV
  261.     JMP    ENDL
  262.  
  263. FOR:    CALL    PSHV
  264.     CALL    LTSUB
  265.     DCX    H
  266.     SHLD    FCNTR
  267.     LXI    H,KWTO-1
  268.     JMP    NXTKW
  269. FORTO:    CALL    EEXPR
  270.     SHLD    FTOV
  271.     LXI    H,KWSTP-1
  272.     JMP    NXTKW
  273. FSTEP:    CALL    EEXPR
  274.     JMP    FOR0
  275. FSTP1:    LXI    H,0001H
  276. FOR0:    SHLD    FSTPV
  277.     LHLD    CLABL
  278.     SHLD    FLABL
  279.     XCHG
  280.     SHLD    FOBJ
  281.     LXI    B,000AH
  282.     LHLD    FCNTR
  283.     XCHG
  284.     MOV    H,B
  285.     MOV    L,B
  286.     DAD    SP
  287.     DB    3EH
  288. FOR3:    DAD    B
  289.     MOV    A,M
  290.     INX    H
  291.     ORA    M
  292.     JZ    FOR10
  293.     MOV    A,M
  294.     DCX    H
  295.     CMP    D
  296.     JNZ    FOR3
  297.     MOV    A,M
  298.     CMP    E
  299.     JNZ    FOR3
  300. FOR5:    XCHG
  301.     LXI    H,0000H
  302.     DAD    SP
  303.     MOV    B,H
  304.     MOV    C,L
  305.     LXI    H,000AH
  306.     DAD    D
  307.     CALL    TR2
  308.     SPHL
  309. FOR10:    LHLD    FOBJ
  310.     XCHG
  311.     JMP    ENDL
  312.  
  313. NEXT:    CALL    TSTV
  314.     JC    ERWHT
  315.     SHLD    NCNTR
  316. NEXT1:    PUSH    D
  317.     XCHG
  318.     LHLD    FCNTR
  319.     MOV    A,H
  320.     ORA    L
  321.     JZ    ERWT1
  322.     CALL    COMPR
  323.     JZ    NEXT2
  324.     POP    D
  325.     CALL    POPV
  326.     LHLD    NCNTR
  327.     JMP    NEXT1
  328. NEXT2:    MOV    E,M
  329.     INX    H
  330.     MOV    D,M
  331.     LHLD    FSTPV
  332.     PUSH    H
  333.     DAD    D
  334.     XCHG
  335.     LHLD    FCNTR
  336.     MOV    M,E
  337.     INX    H
  338.     MOV    M,D
  339.     LHLD    FTOV
  340.     POP    PSW
  341.     ORA    A
  342.     JP    NEXT4
  343.     XCHG
  344. NEXT4:    CALL    CMINT
  345.     POP    D
  346.     JC    NEXT5
  347.     LHLD    FLABL
  348.     SHLD    CLABL
  349.     LHLD    FOBJ
  350.     XCHG
  351.     JMP    ENDL
  352. NEXT5:    CALL    POPV
  353.     JMP    ENDL
  354.  
  355. PSHV:    LXI    H,TMSTK
  356.     CALL    TWSCP
  357.     POP    B
  358.     DAD    SP
  359.     JNC    ERSRY
  360.     LHLD    FCNTR
  361.     MOV    A,H
  362.     ORA    L
  363.     JZ    NPSH
  364.     LHLD    FOBJ
  365.     PUSH    H
  366.     LHLD    FLABL
  367.     PUSH    H
  368.     LHLD    FTOV
  369.     PUSH    H
  370.     LHLD    FSTPV
  371.     PUSH    H
  372.     LHLD    FCNTR
  373. NPSH:    PUSH    H
  374.     PUSH    B
  375.     RET
  376.  
  377. POPV:    POP    B
  378.     POP    H
  379.     SHLD    FCNTR
  380.     MOV    A,H
  381.     ORA    L
  382.     JZ    NPOP
  383.     POP    H
  384.     SHLD    FSTPV
  385.     POP    H
  386.     SHLD    FTOV
  387.     POP    H
  388.     SHLD    FLABL
  389.     POP    H
  390.     SHLD    FOBJ
  391. NPOP:    PUSH    B
  392.     RET
  393.  
  394. IFSTM:    CALL    EEXPR
  395.     MOV    A,H
  396.     ORA    L
  397.     JNZ    NXTGO
  398. REM:    LXI    H,0000H
  399.     CALL    SKPL2
  400.     JNC    RUN2
  401.     JMP    START
  402.  
  403. LIST:    CALL    GINT
  404.     CALL    TSCR2
  405.     CALL    SRCH
  406. LISTL:    JC    START
  407.     CALL    WLINE
  408.     CALL    BREAK
  409.     CALL    SRCH1
  410.     JMP    LISTL
  411.  
  412. WLINE:    LDAX    D
  413.     MOV    L,A
  414.     INX    D
  415.     LDAX    D
  416.     MOV    H,A
  417.     INX    D
  418.     MVI    C,04H
  419.     CALL    WINT
  420.     MVI    A,' '
  421.     CALL    PUT
  422.     SUB    A
  423.     CALL    MSG
  424.     RET
  425.  
  426. PRINT:    MVI    C,6
  427. PRSC:    CALL    TEST
  428.     DB    ';'
  429.     DB    PRCR-$-1
  430.     CALL    CRLF
  431.     JMP    NXTGO
  432. PRCR:    CALL    TEST
  433.     DB    0DH
  434.     DB    PRSHA-$-1
  435.     CALL    CRLF
  436.     JMP    RUN1
  437. PRSHA:    CALL    TEST
  438.     DB    '#'
  439.     DB    PRLTR-$-1
  440.     CALL    EEXPR
  441.     MOV    C,L
  442.     JMP    PRCMA
  443. PRLTR:    CALL    PRSUB
  444.     JMP    PREXP
  445. PRCMA:    CALL    TEST
  446.     DB    ','
  447.     DB    PREND-$-1
  448.     CALL    TSTSC
  449.     JMP    PRSHA
  450. PREND:    CALL    CRLF
  451.     JMP    ENDL
  452. PREXP:    CALL    EEXPR
  453.     PUSH    B
  454.     CALL    WINT
  455.     POP    B
  456.     JMP    PRCMA
  457.  
  458. PRSUB:    CALL    TEST
  459.     DB    '"'
  460.     DB    PR13-$-1
  461.     MVI    A,'"'
  462.     JMP    PR11
  463. PR13:    CALL    TEST
  464.     DB    27H
  465.     DB    PR14-$-1
  466.     MVI    A,27H
  467. PR11:    CALL    MSG
  468.     CPI    0DH
  469.     POP    H
  470.     JZ    RUN1
  471.     JMP    PR12
  472. PR14:    CALL    TEST
  473.     DB    5FH
  474.     DB    PR15-$-1
  475.     MVI    A,8DH
  476.     CALL    PUT
  477.     CALL    PUT
  478.     POP    H
  479. PR12:    INX    H
  480.     INX    H
  481.     INX    H
  482.     PCHL
  483. PR15:    RET
  484.  
  485. WINT:    PUSH    D
  486. LXI    D,000AH
  487.     PUSH    D
  488.     MOV    B,D
  489.     DCR    C
  490.     CALL    ABS
  491.     JP    WINT1
  492.     MVI    B,'-'
  493.     DCR    C
  494. WINT1:    PUSH    B
  495. WINT2:    CALL    DIVID
  496.     MOV    A,B
  497.     ORA    C
  498.     JZ    WINT3
  499.     XTHL
  500.     DCR    L
  501.     PUSH    H
  502.     MOV    H,B
  503.     MOV    L,C
  504.     JMP    WINT2
  505. WINT3:    POP    B
  506. WINT4:    DCR    C
  507.     MOV    A,C
  508.     ORA    A
  509.     JM    WINT5
  510.     MVI    A,' '
  511.     CALL    PUT
  512.     JMP    WINT4
  513. WINT5:    MOV    A,B
  514.     CALL    PUT
  515.     MOV    E,L
  516. WINT6:    MOV    A,E
  517.     CPI    0AH
  518.     POP    D
  519.     RZ
  520.     ADI    30H
  521.     CALL    PUT
  522.     JMP    WINT6
  523.  
  524. ERRIN:    LHLD    NCNTR
  525.     SPHL
  526.     POP    H
  527.     SHLD    CLABL
  528.     POP    D
  529.     POP    D
  530. INPUT:    PUSH    D
  531.     CALL    PRSUB
  532.     JMP    INPT2
  533. INPT1:    CALL    TSTV
  534.     JC    INPT6
  535.     JMP    INPT4
  536. INPT2:    PUSH    D
  537.     CALL    TSTV
  538.     JC    ERWHT
  539.     LDAX    D
  540.     MOV    C,A
  541.     SUB    A
  542.     STAX    D
  543.     POP    D
  544.     CALL    MSG
  545.     MOV    A,C
  546.     DCX    D
  547.     STAX    D
  548. INPT4:    PUSH    D
  549.     XCHG
  550.     LHLD    CLABL
  551.     PUSH    H
  552.     LXI    H,INPUT
  553.     SHLD    CLABL
  554.     LXI    H,0000H
  555.     DAD    SP
  556.     SHLD    NCNTR
  557.     PUSH    D
  558.     MVI    A,':'
  559.     CALL    GETL
  560.     LXI    D,LBUF
  561.     CALL    EEXPR
  562.     POP    D
  563.     XCHG
  564.     MOV    M,E
  565.     INX    H
  566.     MOV    M,D
  567.     POP    H
  568.     SHLD    CLABL
  569.     POP    D
  570. INPT6:    POP    PSW
  571.     CALL    TEST
  572.     DB    ','
  573.     DB    ENDL-$-1
  574.     JMP    INPUT
  575.  
  576. LETDF:    CALL    TSCR1
  577.     CPI    0DH
  578.     JZ    ENDL
  579. LET:    CALL    LTSUB
  580.     CALL    TEST
  581.     DB    ','
  582.     DB    ENDL-$-1
  583.     JMP    LET
  584.  
  585. LTSUB:    CALL    TSTV
  586.     JC    ERWHT
  587.     PUSH    H
  588.     CALL    TEST
  589.     DB    '='
  590.     DB    LERR-$-1
  591.     CALL    EEXPR
  592.     MOV    B,H
  593.     MOV    C,L
  594.     POP    H
  595.     MOV    M,C
  596.     INX    H
  597.     MOV    M,B
  598.     RET
  599.  
  600. GOTO:    CALL    EEXPR
  601.     PUSH    D
  602.     CALL    TSCR2
  603.     CALL    SRCH
  604.     JNZ    ERHW1
  605.     POP    PSW
  606.     JMP    RUN2
  607.  
  608. RUN:    CALL    TSCR2
  609.     LXI    D,OTOP
  610. RUN1:    LXI    H,0000H
  611.     CALL    SRCH1
  612.     JC    START
  613. RUN2:    XCHG
  614.     SHLD    CLABL
  615.     XCHG
  616.     INX    D
  617.     INX    D
  618. NXTGO:    CALL    BREAK
  619.     LXI    H,STMKW-1
  620.     JMP    NXTKW
  621.  
  622. ENDL:    CALL    TSTSC
  623. LERR:    JMP    ERWHT
  624.  
  625. TSTSC:    CALL    TEST
  626.     DB    ';'
  627.     DB    TSCR1-$-1
  628.     POP    PSW
  629.     JMP    NXTGO
  630.  
  631. TSCR1:    CALL    TEST
  632.     DB    0DH
  633.     DB    TSRTN-$-1
  634.     POP    PSW
  635.     JMP    RUN1
  636. TSRTN:    RET
  637.  
  638. TSCR2:    CALL    SKPBL
  639.     CPI    0DH
  640.     RZ
  641.     JMP    ERWHT
  642.  
  643. EEXPR:    CALL    EXPR
  644.     PUSH    H
  645.     LXI    H,ROPKW-1
  646.     JMP    NXTKW
  647. GE:    CALL    IFEXQ
  648.     RC
  649.     MOV    L,A
  650.     RET
  651. NE:    CALL    IFEXQ
  652.     RZ
  653.     MOV    L,A
  654.     RET
  655. GT:    CALL    IFEXQ
  656.     RZ
  657.     RC
  658.     MOV    L,A
  659.     RET
  660. LE:    CALL    IFEXQ
  661.     MOV    L,A
  662.     RZ
  663.     RC
  664.     MOV    L,H
  665.     RET
  666. EQ:    CALL    IFEXQ
  667.     RNZ
  668.     MOV    L,A
  669.     RET
  670. LT:    CALL    IFEXQ
  671.     RNC
  672.     MOV    L,A
  673.     RET
  674. NOROP:    POP    H
  675.     RET
  676.  
  677. IFEXQ:    MOV    A,C
  678.     POP    H
  679.     POP    B
  680.     PUSH    H
  681.     PUSH    B
  682.     MOV    C,A
  683.     CALL    EXPR
  684.     XCHG
  685.     XTHL
  686.     CALL    CMINT
  687.     POP    D
  688.     LXI    H,0000H
  689.     MVI    A,01H
  690.     RET
  691.  
  692. EXPR:    CALL    TEST
  693.     DB    '-'
  694.     DB    EXPR1-$-1
  695.     LXI    H,0000H
  696.     JMP    NEGA1
  697. EXPR1:    CALL    TEST
  698.     DB    '+'
  699.     DB    EXPR3-$-1
  700. EXPR3:    CALL    TERM
  701. EXPR2:    CALL    TEST
  702.     DB    '+'
  703.     DB    NEGA0-$-1
  704.     PUSH    H
  705.     CALL    TERM
  706.     JMP    ADDBL
  707. NEGA0:    CALL    TEST
  708.     DB    '-'
  709.     DB    EXPRT-$-1
  710. NEGA1:    PUSH    H
  711.     CALL    TERM
  712.     CALL    TWSCP
  713. ADDBL:    XCHG
  714.     XTHL
  715.     MOV    A,H
  716.     XRA    D
  717.     MOV    A,D
  718.     DAD    D
  719.     POP    D
  720.     JM    EXPR2
  721.     XRA    H
  722.     JP    EXPR2
  723.     JMP    ERHOW
  724.  
  725. TERM:    CALL    FACTR
  726. MULT:    CALL    TEST
  727.     DB    '*'
  728.     DB    DIV-$-1
  729.     PUSH    H
  730.     CALL    FACTR
  731.     MVI    B,00H
  732.     CALL    ABS
  733.     XCHG
  734.     XTHL
  735.     CALL    ABS
  736.     MOV    A,H
  737.     ORA    A
  738.     JZ    MULT1
  739.     MOV    A,D
  740.     ORA    D
  741.     XCHG
  742.     JNZ    ERHW1
  743. MULT1:    MOV    A,L
  744.     MVI    L,0
  745.     ORA    A
  746.     JZ    TERM1
  747. MULTL:    DAD    D
  748.     JC    ERHW1
  749.     DCR    A
  750.     JNZ    MULTL
  751.     JMP    TERM1
  752. DIV:    CALL    TEST
  753.     DB    '/'
  754.     DB    EXPRT-$-1
  755.     PUSH    H
  756.     CAL