home *** CD-ROM | disk | FTP | other *** search
/ minnie.tuhs.org / unixen.tar / unixen / PDP-11 / Trees / V7 / usr / src / cmd / bas / bas.s next >
Encoding:
Text File  |  1979-01-10  |  22.8 KB  |  2,129 lines

  1. /
  2. /
  3.  
  4. / bas0 -- basic
  5.  
  6. scope = 1
  7. .globl    main
  8. .globl    sin, cos, log, exp, atan, pow, sqrt
  9. .globl    rand, srand
  10. .globl    fptrap
  11. .globl fopen, getc
  12.  
  13. indir =    0  /for  indirect sys calls. (not in as)
  14. one = 40200
  15.  
  16. main:
  17.     mov    $1,prfile /initial print file
  18.     sys    signal; 4; fptrap
  19.     setd
  20.     sys    time
  21.     mov    r1,r0
  22.     mov    r0,randx
  23.     jsr    pc,srand
  24.     sys    signal; 1; _done
  25.     sys    signal; 2; intrup
  26.     tst    r0
  27.     jeq    1f
  28.     sys    signal; 2; 1
  29. 1:
  30.     mov    sp,gsp
  31.     clr    seeka
  32.     mov    $'a,r1
  33. 1:
  34.     movb    r1,tmpf+8
  35.     sys    stat; tmpf; line
  36.     bes    1f
  37.     inc    r1
  38.     cmp    r1,$'z
  39.     blos    1b
  40.     br    2f
  41. 1:
  42.     sys    creat; tmpf; 600
  43.     bes    2f
  44.     mov    r0,tfo
  45.     sys    open; tmpf; 0
  46.     bec    1f
  47. 2:
  48.     mov    $3f,r0
  49.     jsr    pc,print
  50.     sys    exit
  51. 3:
  52.     <Tmp file?\n\0>; .even
  53. 1:
  54.     mov    r0,tfi
  55.  
  56.     mov    gsp,sp
  57.     cmp    (sp),$2  /is there a file argument
  58.     blt    noarg
  59.     mov    4(sp),r0
  60.     mov    $argname,r1
  61. 1:
  62.     movb    (r0)+,(r1)+
  63.     bne    1b
  64. aftered: / after edit
  65.     mov    $argname,r0
  66.     jsr    r5,fopen; iobuf
  67.     bes    1f
  68. noarg:
  69.     jsr    pc,isymtab
  70.     br    loop
  71. 1:
  72.     mov    $1f,r0
  73.     jsr    pc,print
  74.     br    loop
  75. 1:
  76.     <Cannot open file\n\0>; .even
  77.  
  78. intrup:
  79.     sys    signal; 2; intrup
  80.     mov    $'\n,r0
  81.     jsr    r5,xputc
  82.     jsr    r5,error
  83.         <ready\n\0>; .even
  84.  
  85. loop:
  86.     mov    gsp,sp
  87.     clr    lineno
  88.     jsr    pc,rdline
  89.     mov    $line,r3
  90. 1:
  91.     movb    (r3),r0
  92.     jsr    pc,digit
  93.         br 1f
  94.     jsr    r5,atoi
  95.     cmp    r0,$' /
  96.     beq    3f
  97.     cmp    r0,$'     /tab
  98.     bne    1f
  99. 3:
  100.     mov    $lintab,r3
  101.     mov    r1,r0
  102.     bgt    2f
  103.     jsr    pc,serror
  104. 2:
  105.     cmp    r0,(r3)
  106.     beq    2f
  107.     tst    (r3)
  108.     beq    2f
  109.     add    $6,r3
  110.     br    2b
  111. 2:
  112.     cmp    r3,$elintab-12.
  113.     blo    2f
  114.     jsr    r5,error
  115.         <too many lines\n\0>; .even
  116. 2:
  117.     mov    r0,(r3)+
  118.     mov    seeka,(r3)+
  119.     mov    tfo,r0
  120.     mov    seeka,seekx
  121.     sys    indir; sysseek
  122.     mov    $line,r0
  123.     jsr    pc,size
  124.     inc    r0
  125.     add    r0,seeka
  126.     mov    r0,wlen
  127.     mov    tfo,r0
  128.     mov    $line,wbuf
  129.     sys    indir;syswrit
  130.     br    loop
  131. 1:
  132.     mov    $line,r3
  133.     jsr    pc,singstat
  134.     br    loop
  135.  
  136. nextc:
  137.     movb    (r3)+,r0
  138.     rts    r5
  139.  
  140. size:
  141.     clr    -(sp)
  142. 1:
  143.     inc    (sp)
  144.     cmpb    (r0),$'\n
  145.     beq    1f
  146.     cmpb    (r0),$0
  147.     beq    1f
  148.     inc    r0
  149.     br    1b
  150. 1:
  151.     mov    (sp)+,r0
  152.     rts    pc
  153.  
  154. rdline:  / read input (file or tty) to carr. ret.
  155.     mov    $line,r1
  156. 1:
  157.     jsr    r5,getc; iobuf
  158.     bes    2f
  159.     tst    r0
  160.     beq    2f
  161.     cmp    r1,$line+99.
  162.     bhis    2f            / bad check, but a check
  163.     movb    r0,(r1)+
  164.     cmpb    r0,$'\n
  165.     bne    1b
  166.     clrb    (r1)
  167.     rts    pc
  168. 2:
  169.     mov    fi,r0
  170.     beq    1f
  171.     sys    close
  172.     clr    fi
  173.     br    1b
  174. 1:
  175.     jmp    _done
  176.  
  177. error:
  178.     tst    fi
  179.     beq    1f
  180.     sys    close
  181.     clr    fi
  182. 1:
  183.     tst    lineno
  184.     beq    1f
  185.     jsr    pc,nextlin
  186.         br 1f
  187.     mov    $line,r0
  188.     jsr    pc,print
  189. 1:
  190.     mov    r5,r0
  191.     jsr    pc,print
  192.     jmp    loop
  193.  
  194. serror:
  195.     dec    r3
  196.     tst    fi
  197.     beq    1f
  198.     sys    close
  199.     clr    fi
  200. 1:
  201.     mov    $line,r1
  202. 1:
  203.     cmp    r1,r3
  204.     bne    2f
  205.     mov    $'_,r0
  206.     jsr    r5,xputc
  207.     mov    $10,r0
  208.     jsr    r5,xputc
  209. 2:
  210.     movb    (r1),r0
  211.     jsr    r5,xputc
  212.     cmpb    (r1)+,$'\n
  213.     bne    1b
  214.     jmp    loop
  215.  
  216. print:
  217.     mov    r0,wbuf
  218.     jsr    pc,size
  219.     mov    r0,wlen
  220.     mov    prfile,r0
  221.     sys    indir; syswrit
  222.     rts    pc
  223.  
  224. digit:
  225.     cmp    r0,$'0
  226.     blo    1f
  227.     cmp    r0,$'9
  228.     bhi    1f
  229.     add    $2,(sp)
  230. 1:
  231.     rts    pc
  232.  
  233. alpha:
  234.     cmp    r0,$'a
  235.     blo    1f
  236.     cmp    r0,$'z
  237.     bhi    1f
  238.     add    $2,(sp)
  239. 1:
  240.     cmp    r0,$'A
  241.     blo    1f
  242.     cmp    r0,$'Z
  243.     bhi    1f
  244.     add    $2,(sp)
  245. 1:
  246.     rts    pc
  247.  
  248. name:
  249.     mov    $nameb,r1
  250.     clr    (r1)
  251.     clr    2(r1)
  252. 1:
  253.     cmp    r1,$nameb+4
  254.     bhis    2f
  255.     movb    r0,(r1)+
  256. 2:
  257.     movb    (r3)+,r0
  258.     jsr    pc,alpha
  259.         br 2f
  260.     br    1b
  261. 2:
  262.     jsr    pc,digit
  263.         br 2f
  264.     br    1b
  265. 2:
  266.     mov    $resnam,r1
  267. 1:
  268.     cmp    nameb,(r1)
  269.     bne    2f
  270.     cmp    nameb+2,2(r1)
  271.     bne    2f
  272.     sub    $resnam,r1
  273.     asr    r1
  274.     add    $2,(sp)
  275.     rts    pc
  276. 2:
  277.     add    $4,r1
  278.     cmp    r1,$eresnam
  279.     blo    1b
  280.     mov    $symtab,r1
  281. 1:
  282.     tst    (r1)
  283.     beq    1f
  284.     cmp    nameb,(r1)
  285.     bne    2f
  286.     cmp    nameb+2,2(r1)
  287.     bne    2f
  288.     rts    pc
  289. 2:
  290.     add    $14.,r1
  291.     br    1b
  292. 1:
  293.     cmp    r1,$esymtab-28.
  294.     blo    1f
  295.     jsr    r5,error
  296.         <out of symbol space\n\0>; .even
  297. 1:
  298.     mov    nameb,(r1)
  299.     mov    nameb+2,2(r1)
  300.     clr    4(r1)
  301.     clr    14.(r1)
  302.     rts    pc
  303.  
  304. skip:
  305.     cmp    r0,$' /
  306.     beq    1f
  307.     cmp    r0,$'      / tab
  308.     bne    2f
  309. 1:
  310.     movb    (r3)+,r0
  311.     br    skip
  312. 2:
  313.     rts    pc
  314.  
  315. xputc:
  316. .if scope  / for plotting
  317.     tstb    drflg
  318.     beq    1f
  319.     jsr    pc,drput
  320.     rts    r5
  321. 1:
  322. .endif
  323.     mov    r0,ch
  324.     mov    $1,r0
  325.     sys    write; ch; 1
  326.     rts    r5
  327.  
  328. nextlin:
  329.     clr    -(sp)
  330.     mov    $lintab,r1
  331. 1:
  332.     tst    (r1)
  333.     beq    1f
  334.     cmp    lineno,(r1)
  335.     bhi    2f
  336.     mov    (sp),r0
  337.     beq    3f
  338.     cmp    (r0),(r1)
  339.     blos    2f
  340. 3:
  341.     mov    r1,(sp)
  342. 2:
  343.     add    $6,r1
  344.     br    1b
  345. 1:
  346.     mov    (sp)+,r1
  347.     beq    1f
  348.     mov    (r1)+,lineno
  349.     mov    (r1)+,seekx
  350.     mov    tfi,r0
  351.     sys    indir; sysseek
  352.     mov    tfi,r0
  353.     sys    read; line; 100.
  354.     add    $2,(sp)
  355. 1:
  356.     rts    pc
  357.  
  358. getloc:
  359.     mov    $lintab,r1
  360. 1:
  361.     tst    (r1)
  362.     beq    1f
  363.     cmp    r0,(r1)
  364.     beq    2f
  365.     add    $6,r1
  366.     br    1b
  367. 1:
  368.     jsr    r5,error
  369.         <label not found\n\0>; .even
  370. 2:
  371.     rts    pc
  372.  
  373. isymtab:
  374.     mov    $symtab,r0
  375.     mov    $symtnam,r1
  376.     clrf    fr0
  377.     movf    $one,fr1
  378. 1:
  379.     mov    (r1)+,(r0)+
  380.     mov    (r1)+,(r0)+
  381.     mov    $1,(r0)+
  382.     subf    r1,r0
  383.     movf    r0,(r0)+
  384.     cmp    r1,$esymtnam
  385.     blo    1b
  386.     clr    (r0)+
  387.     rts    pc
  388.  
  389. /
  390. /
  391.  
  392. / bas1 -- compile
  393. /
  394. /    convention:    jsr pc,subrout /test
  395. /                br failside
  396. /            succeed ...
  397.  
  398. compile:
  399.     clr    forp
  400.     mov    $iflev,ifp /added for if..else..fi
  401.     mov    $space,r4
  402.     tst    lineno
  403.     beq    1f
  404.     rts    pc
  405. 1:
  406.     jsr    pc,nextlin
  407.         br 1f
  408.     mov    lineno,r0
  409.     jsr    pc,getloc
  410.     mov    r4,4(r1)
  411.     jsr    pc,statement
  412.         br .+2
  413.     inc    lineno
  414.     cmp    r4,$espace+20  / out of code space?
  415.     blo    1b
  416.     jsr    r5,error
  417.         <out of code space\n\0>; .even
  418. 1:
  419.     tst    forp
  420.     jne    forer
  421.     cmp    ifp,$iflev
  422.     jne    fier   /hanging if..fi
  423.     mov    $loop,(r4)+
  424.     rts    pc
  425.  
  426. singstat:
  427.     clr    forp
  428.     mov    $iflev,ifp
  429.     mov    $exline,r4
  430.     jsr    pc,statement
  431.         br 1f
  432.     cmp    -2(r4),$_asgn
  433.     beq    1f
  434.     mov    $_print,(r4)+
  435.     mov    $_nline,(r4)+
  436. 1:
  437.     tst    forp
  438.     jne    forer
  439.     cmp    r4,$eexline
  440.     blo    1f
  441.     jsr    r5,error
  442.         <out of code space\n\0>; .even
  443. 1:
  444.     mov    $loop,(r4)+
  445.     mov    r4,exprloc
  446.     mov    $exline,r4
  447.     jmp    execute
  448.  
  449. statement:
  450.     mov    $line,r3
  451.     movb    (r3)+,r0
  452.     jsr    pc,digit
  453.         br stat1
  454.     dec    r3
  455.     jsr    r5,atoi
  456.     cmp    r0,$' /
  457.     beq    1f
  458.     cmp    r0,$'     /tab
  459.     beq    1f
  460.     mov    $line,r3
  461.     movb    (r3)+,r0
  462.     br    stat1
  463. 1:
  464.     mov    $_line,(r4)+
  465.     mov    r1,(r4)+
  466.  
  467. stat1:
  468.     jsr    pc,skip
  469.     cmp    r0,$'\n
  470.     bne    .+4
  471.     rts    pc
  472.     mov    r3,-(sp)
  473.     jsr    pc,alpha
  474.         br 1f
  475.     jsr    pc,name
  476.         br 1f
  477.     tst    (sp)+
  478.     jsr    pc,skip
  479.     dec    r3
  480.     jmp    *2f(r1)
  481. 2:
  482.     stlist
  483.     stdone
  484.     stdone
  485.     strun
  486.     stprint
  487.     stprompt   / prompt is like print except for cr
  488.     stif
  489.     stgoto
  490.     streturn
  491.     stfor
  492.     stnext
  493.     stoctl
  494.     stsave
  495.     stdump
  496.     stfi
  497.     stelse
  498.     stedit
  499.     stcomment
  500. .if scope    / for plotting on tektronix
  501.     stdisp
  502.     stdraw
  503.     steras
  504. .endif
  505.  
  506. 1:
  507.     mov    (sp)+,r3
  508.     dec    r3
  509.     jsr    pc,expr
  510.     cmp    r0,$'\n
  511.     jne    joe
  512.     add    $2,(sp)
  513.     rts    pc
  514.  
  515. stsave:
  516.     mov    $_save,func
  517.     br    1f
  518.  
  519. stlist:
  520.     mov    $_list,func
  521. 1:
  522.     cmp    r0,$'\n
  523.     bne    1f
  524.     clrf    r0
  525.     jsr    pc,const
  526.     movif    $77777,r0
  527.     jsr    pc,const
  528.     br    2f
  529. 1:
  530.     jsr    pc,expr
  531.     cmp    r0,$'\n
  532.     bne    1f
  533.     mov    $_dup,(r4)+
  534.     br    2f
  535. 1:
  536.     dec    r3
  537.     jsr    pc,expr
  538.     cmp    r0,$'\n
  539.     jne    joe
  540. 2:
  541.     mov    func,(r4)+
  542.     rts    pc
  543.  
  544. stdone:
  545.     cmp    r0,$'\n
  546.     jne    joe
  547.     mov    $_done,(r4)+
  548.     rts    pc
  549.  
  550. strun:
  551.     cmp    r0,$'\n
  552.     jne    joe
  553.     mov    $_run,(r4)+
  554.     rts    pc
  555.  
  556.  
  557. stprompt:
  558.     clr    -(sp)
  559.     br    stpr2
  560.  
  561. stdump:
  562.     cmp    r0,$'\n
  563.     jne    joe
  564.     mov    $_dump,(r4)+
  565.     rts    pc
  566.  
  567. stprint:
  568.     mov    pc,-(sp)
  569. stpr2:
  570.     movb    (r3)+,r0
  571.     jsr    pc,skip
  572. 1:
  573.     cmp    r0,$'\n
  574.     beq    2f
  575.     cmp    r0,$'"
  576.     beq    1f
  577.     dec    r3
  578.     jsr    pc,expr
  579.     mov    $_print,(r4)+
  580.     br    1b
  581. 1:
  582.     mov    $_ascii,(r4)+
  583. 1:
  584.     movb    (r3)+,(r4)
  585.     cmpb    (r4),$'"
  586.     beq    1f
  587.     cmpb    (r4)+,$'\n
  588.     bne    1b
  589.     jbr    joe
  590. 1:
  591.     add    $2,r4
  592.     bic    $1,r4
  593.     br    stpr2
  594. 2:
  595.     tst    (sp)+
  596.     beq    1f
  597.     mov    $_nline,(r4)+
  598. 1:
  599.     rts    pc
  600.  
  601. stif:
  602.     jsr    pc,expr
  603.     mov    $_if,(r4)+
  604.     mov    r4,*ifp
  605.     add    $2,ifp
  606.     tst    (r4)+
  607.     jsr    pc,skip
  608.     cmp    r0,$'\n   / if ... fi
  609.     beq    1f
  610.     jsr    pc,stat1
  611.         br  .+2
  612. stfi:
  613.     sub    $2,ifp
  614.     cmp    ifp,$iflev
  615.     jlo    fier
  616.     mov    *ifp,r1  /for jump around if
  617.     mov    r4,(r1)
  618. 1:
  619.     rts    pc
  620.  
  621. fier:
  622.     jsr    r5,error; <if...else...fi imbalance\n\0>; .even
  623.  
  624. stelse:
  625.     mov    $_tra,(r4)+  /jump around else side
  626.     mov    r4+,-(sp) / save hole
  627.     tst    (r4)+
  628.     sub    $2,ifp
  629.     cmp    ifp,$iflev
  630.     jlo    fier
  631.     mov    *ifp,r1
  632.     mov    r4,(r1)  /fill in jump to else
  633.     mov    (sp)+,*ifp /save hole for fi
  634.     add    $2,ifp
  635.     rts    pc
  636.  
  637. stedit:  / enter the regular editor <ed>
  638.     sys fork
  639.     br    newpr
  640.     mov    $lintab,r0  / zero out line table during edit
  641. 1:
  642.     cmp    r0,$elintab  /done
  643.     beq    1f
  644.     mov    $0,(r0)+
  645.     br    1b
  646. 1:
  647.     sys    unlink; tmpf
  648.     sys    wait
  649.     jmp    aftered / start over
  650. newpr:
  651.     sys    exec; ed; edarg
  652.     sys    exit
  653. ed:    </bin/ed\0> ; .even
  654. ednm:    <-\n>
  655.  .even
  656. edarg:    ednm; argname; 0
  657.  
  658. stcomment:  /comment line
  659.     cmp    r0,$'\n
  660.     beq    1f
  661.     movb    (r3)+,r0
  662.     br    stcomment
  663. 1:
  664.     rts    pc
  665. stgoto:
  666.     jsr    pc,expr
  667.     mov    $_goto,(r4)+
  668.     rts    pc
  669.  
  670. streturn:
  671.     cmp    r0,$'\n
  672.     beq    1f
  673.     jsr    pc,expr
  674.     cmp    r0,$'\n
  675.     bne    joe
  676.     br    2f
  677. 1:
  678.     clrf    r0
  679.     jsr    pc,const
  680. 2:
  681.     mov    $_return,(r4)+
  682.     rts    pc
  683.  
  684. joe:
  685.     jsr    pc,serror
  686.  
  687. stfor:
  688.     mov    r4,-(sp)
  689.     jsr    pc,e2
  690.     mov    r4,-(sp)
  691.     cmp    r0,$'=
  692.     bne    joe
  693.     tst    val
  694.     bne    joe
  695.     jsr    pc,expr
  696.     mov    forp,(r4)+    / overlay w _asgn
  697.     mov    r4,forp
  698.     cmp    (r4)+,(r4)+    / _tra ..
  699.     mov    (sp)+,r0
  700.     mov    (sp)+,r1
  701. 1:
  702.     mov    (r1)+,(r4)+
  703.     cmp    r1,r0
  704.     blo    1b
  705.     mov    $_fori,(r4)+
  706.     mov    forp,r1
  707.     mov    $_tra,(r1)+
  708.     mov    r4,(r1)+
  709.     dec    r3
  710.     jsr    pc,expr
  711.     mov    $_lesseq,(r4)+
  712.     mov    $_if,(r4)+
  713.     mov    forp,(r4)+
  714.     mov    r4,forp
  715.     cmp    r0,$'\n
  716.     beq    1f
  717.     jsr    pc,stat1
  718.         br .+2
  719.     br    stnext
  720. 1:
  721.     rts    pc
  722.  
  723. forer:
  724.     jsr    r5,error; <for/next imbalance\n\0>; .even
  725.  
  726. stnext:
  727.     mov    forp,r1
  728.     beq    forer
  729.     mov    -(r1),r0
  730.     mov    -(r0),forp
  731.     mov    $_ptra,(r4)+
  732.     mov    $_asgn,(r0)+
  733.     cmp    (r0)+,(r0)+
  734.     mov    r0,(r4)+
  735.     mov    r4,(r1)+
  736.     rts    pc
  737.  
  738. stoctl:
  739.     jsr    pc,expr
  740.     mov    $_octal,(r4)+
  741.     rts    pc
  742.  
  743. .if scope  / for plotting
  744. stdisp:
  745.     mov    $_sdisp,(r4)+
  746.     jsr    pc,stprint
  747.     mov    $_fdisp,(r4)+
  748.     rts    pc
  749. stdraw:
  750.     jsr    pc,expr
  751.     dec    r3
  752.     jsr    pc,expr
  753.     cmp    r0,$'\n
  754.     bne    1f
  755.     movf    $one,r0
  756.     jsr    pc,const
  757.     br    2f
  758. 1:
  759.     dec    r3
  760.     jsr    pc,expr
  761. 2:
  762.     mov    $_draw,(r4)+
  763.     rts    pc
  764.  
  765. steras:
  766.     mov    $_erase,(r4)+
  767.     rts    pc
  768. .endif
  769.  
  770. /
  771. /
  772.  
  773. / bas2 -- expression evaluation
  774.  
  775. expr:
  776.     jsr    pc,e1
  777.     jsr    pc,rval
  778.     rts    pc
  779.  
  780. / assignment right to left
  781. e1:
  782.     jsr    pc,e2
  783.     cmp    r0,$'=
  784.     beq    1f
  785.     jsr    pc,rval
  786.     rts    pc
  787. 1:
  788.     tst    val
  789.     beq    1f
  790.     jsr    pc,serror
  791. 1:
  792.     jsr    pc,e1
  793.     jsr    r5,op; _asgn
  794.     rts    pc
  795.  
  796. / and or left to right
  797. e2:
  798.     jsr    pc,e3
  799. 1:
  800.     cmp    r0,$'&
  801.     beq    2f
  802.     cmp    r0,$'|
  803.     beq    3f
  804.     rts    pc
  805. 2:
  806.     jsr    pc,rval
  807.     jsr    pc,e3
  808.     jsr    r5,op; _and
  809.     br    1b
  810. 3:
  811.     jsr    pc,rval
  812.     jsr    pc,e3
  813.     jsr    r5,op; _or
  814.     br    1b
  815.  
  816. / relation extended relation
  817. e3:
  818.     jsr    pc,e4
  819.     jsr    pc,e3a
  820.         rts pc
  821.     clr    -(sp)
  822. 1:
  823.     mov    r0,-(sp)
  824.     jsr    pc,e4
  825.     jsr    pc,rval
  826.     mov    (sp)+,(r4)+
  827.     jsr    pc,e3a
  828.         br 1f
  829.     mov    $_extr,(r4)+
  830.     inc    (sp)
  831.     br    1b
  832. 1:
  833.     dec    (sp)
  834.     blt    1f
  835.     mov    $_and,(r4)+
  836.     br    1b
  837. 1:
  838.     tst    (sp)+
  839.     rts    pc
  840.  
  841. / relational operator
  842. e3a:
  843.     cmp    r0,$'>
  844.     beq    1f
  845.     cmp    r0,$'<
  846.     beq    2f
  847.     cmp    r0,$'=
  848.     beq    3f
  849.     rts    pc
  850. 1:
  851.     mov    $_great,r0
  852.     cmpb    (r3),$'=
  853.     bne    1f
  854.     inc    r3
  855.     mov    $_greateq,r0
  856.     br    1f
  857. 2:
  858.     cmpb    (r3),$'>
  859.     bne    2f
  860.     inc    r3
  861.     mov    $_noteq,r0
  862.     br    1f
  863. 2:
  864.     mov    $_less,r0
  865.     cmpb    (r3),$'=
  866.     bne    1f
  867.     inc    r3
  868.     mov    $_lesseq,r0
  869.     br    1f
  870. 3:
  871.     cmpb    (r3),$'=
  872.     beq    2f
  873.     rts    pc
  874. 2:
  875.     inc    r3
  876.     mov    $_equal,r0
  877. 1:
  878.     jsr    pc,rval
  879.     add    $2,(sp)
  880.     rts    pc
  881.  
  882. / add subtract
  883. e4:
  884.     jsr    pc,e5
  885. 1:
  886.     cmp    r0,$'+
  887.     beq    2f
  888.     cmp    r0,$'-
  889.     beq    3f
  890.     rts    pc
  891. 2:
  892.     jsr    pc,rval
  893.     jsr    pc,e5
  894.     jsr    r5,op; _add
  895.     br    1b
  896. 3:
  897.     jsr    pc,rval
  898.     jsr    pc,e5
  899.     jsr    r5,op; _sub
  900.     br    1b
  901.  
  902. / multiply divide
  903. e5:
  904.     jsr    pc,e6
  905. 1:
  906.     cmp    r0,$'*
  907.     beq    2f
  908.     cmp    r0,$'/
  909.     beq    3f
  910.     rts    pc
  911. 2:
  912.     jsr    pc,rval
  913.     jsr    pc,e6
  914.     jsr    r5,op; _mult
  915.     br    1b
  916. 3:
  917.     jsr    pc,rval
  918.     jsr    pc,e6
  919.     jsr    r5,op; _divid
  920.     br    1b
  921.  
  922. / exponential
  923. e6:
  924.     jsr    pc,e6a
  925. 1:
  926.     cmp    r0,$'^
  927.     beq    2f
  928.     rts    pc
  929. 2:
  930.     jsr    pc,rval
  931.     jsr    pc,e6a
  932.     jsr    r5,op; _expon
  933.     br    1b
  934.  
  935. e6a:
  936.     movb    (r3)+,r0
  937.     jsr    pc,skip
  938.     cmp    r0,$'_
  939.     bne    1f
  940.     jsr    pc,e6a
  941.     jsr    r5,op; _neg
  942.     rts    pc
  943. 1:
  944.     dec    r3
  945.     jsr    pc,e7
  946.     rts    pc
  947. / end of unary -
  948.  
  949. / primary
  950. e7:
  951.     movb    (r3)+,r0
  952.     jsr    pc,skip
  953.     mov    $1,val
  954.     cmp    r0,$'(
  955.     bne    1f
  956.     jsr    pc,e1
  957.     cmp    r0,$')
  958.     bne    2f
  959.     movb    (r3)+,r0
  960.     br    e7a
  961. 2:
  962.     jsr    pc,serror
  963. 1:
  964.     cmp    r0,$'.
  965.     beq    2f
  966.     jsr    pc,digit
  967.         br 1f
  968. 2:
  969.     dec    r3
  970.     jsr    r5,atof; nextc
  971.     jsr    pc,const
  972.     br    e7a
  973. 1:
  974.     jsr    pc,alpha
  975.         br jim
  976.     jsr    pc,name
  977.         br 2f
  978.     jsr    r5,error; <reserved name\n\0>; .even
  979. 2:
  980. / try to fix illegal symbol bug:
  981.     cmp    r4,$eexline
  982.     bhis    jim
  983.  
  984.     mov    $_lval,(r4)+
  985.     mov    r1,(r4)+
  986.     clr    val
  987.     br    e7a
  988. jim:
  989.     jsr    pc,serror
  990.  
  991. e7a:
  992.     jsr    pc,skip
  993.     cmp    r0,$'(
  994.     bne    1f
  995.     jsr    pc,rval
  996.     jsr    r5,rlist; _funct
  997.     cmp    r0,$')
  998.     bne    jim
  999.     movb    (r3)+,r0
  1000.     br    e7a
  1001. 1:
  1002.     cmp    r0,$'[
  1003.     bne    1f
  1004.     tst    val
  1005.     beq    2f
  1006.     jsr    pc,serror
  1007. 2:
  1008.     jsr    r5,rlist; _subscr
  1009.     clr    val
  1010.     cmp    r0,$']
  1011.     bne    jim
  1012.     movb    (r3)+,r0
  1013.     br    e7a
  1014. 1:
  1015.     rts    pc
  1016.  
  1017. op:
  1018.     jsr    pc,rval
  1019.     mov    (r5)+,(r4)+
  1020.     rts    r5
  1021.  
  1022. rval:
  1023.     tst    val
  1024.     bne    1f
  1025.     mov    $_rval,(r4)+
  1026.     inc    val
  1027. 1:
  1028.     rts    pc
  1029.  
  1030. const:
  1031.     mov    r0,-(sp)
  1032.     movf    r1,-(sp)
  1033.     tstf    r0
  1034.     cfcc
  1035.     bne    1f
  1036.     mov    $_con0,(r4)+
  1037.     br    2f
  1038. 1:
  1039.     cmpf    $one,r0
  1040.     cfcc
  1041.     bne    1f
  1042.     mov    $_con1,(r4)+
  1043.     br    2f
  1044. 1:
  1045.     movfi    r0,r0
  1046.     movif    r0,r1
  1047.     cmpf    r0,r1
  1048.     cfcc
  1049.     bne    1f
  1050.     mov    $_intcon,(r4)+
  1051.     mov    r0,(r4)+
  1052.     br    2f
  1053. 1:
  1054.     mov    $_const,(r4)+
  1055.     movf    r0,(r4)+
  1056. 2:
  1057.     movf    (sp)+,r1
  1058.     mov    (sp)+,r0
  1059.     rts    pc
  1060.  
  1061. rlist:
  1062.     clr    -(sp)
  1063.     cmpb    (r3),$')
  1064.     bne    1f
  1065.     movb    (r3)+,r0
  1066.     br    2f
  1067. 1:
  1068.     inc    (sp)
  1069.     jsr    pc,expr
  1070.     cmp    r0,$',
  1071.     beq    1b
  1072. 2:
  1073.     mov    (r5)+,(r4)+
  1074.     mov    (sp)+,(r4)+
  1075.     rts    r5
  1076.  
  1077. /
  1078. /
  1079. / bas3 -- execution
  1080.  
  1081. execute:
  1082.     mov    $estack,r3
  1083.     mov    r3,sstack
  1084.     jmp    *(r4)+
  1085.  
  1086. _if:
  1087.     tstf    (r3)+
  1088.     cfcc
  1089.     beq    _tra
  1090.     tst    (r4)+
  1091.     jmp    *(r4)+
  1092.  
  1093. _ptra:
  1094.     mov    sstack,r3
  1095.  
  1096. _tra:
  1097.     mov    (r4)+,r4
  1098.     jmp    *(r4)+
  1099.  
  1100. _funct:
  1101.     mov    r4,-(r3)
  1102.     mov    sstack,-(r3)
  1103.     mov    r3,sstack
  1104.     inc    sublev
  1105.     clr    r0
  1106.     jsr    pc,arg
  1107.     tstf    r0
  1108.     cfcc
  1109.     bge    1f
  1110.     jmp    builtin
  1111.  
  1112. _goto:
  1113.     movf    (r3),r0
  1114. 1:
  1115.     movfi    r0,-(sp)
  1116.     jsr    pc,compile
  1117.     mov    (sp)+,r0
  1118.     jsr    pc,getloc
  1119.     mov    4(r1),r4
  1120.     jmp    *(r4)+
  1121.  
  1122. _run:
  1123.     jsr    pc,isymtab
  1124.     mov    randx,r0
  1125.     jsr    pc,srand
  1126.     jsr    pc,compile
  1127.     mov    $space,r4
  1128.     jmp    *(r4)+
  1129.  
  1130. _save:    / _save is a _list to the file named on the bas command
  1131.     sys    creat; argname; 666
  1132.     bes    1f
  1133.     mov    r0,prfile
  1134.     br    2f
  1135. 1:
  1136.     mov    1f,r0
  1137.     mov    $1,prfile
  1138.     jsr    pc,print
  1139.     br    _done
  1140. 1:    <Cannot create b.out\n\0>; .even
  1141.  
  1142. _list:
  1143.     mov    $1,prfile
  1144. 2:
  1145.     movf    (r3)+,r0
  1146.     movfi    r0,-(sp)
  1147. / probably vistigal??     mov    r3,0f
  1148.     movf    (r3),r0
  1149.     movfi    r0,lineno
  1150. 1:
  1151.     jsr    pc,nextlin
  1152.         br 1f
  1153.     cmp    lineno,(sp)
  1154.     bhi    1f
  1155.     mov    $line,r0
  1156.     jsr    pc,print
  1157.     inc    lineno
  1158.     br    1b
  1159. 1:
  1160.     cmp    $1,prfile
  1161.     beq    1f
  1162.     mov    prfile,r0
  1163.     sys    close
  1164.     mov    $1,prfile
  1165. 1:
  1166.     tst    (sp)+
  1167.     jmp    *(r4)+
  1168.  
  1169. _done:
  1170.     sys    unlink; tmpf
  1171.     sys    exit
  1172.  
  1173. .if scope  / for plotting
  1174. _sdisp:
  1175.     mov    $2,r0
  1176.     jsr    pc,drput
  1177.     jsr    pc,drxy
  1178.     mov    $1,r0
  1179.     jsr    pc,drput
  1180.     mov    $3,r0
  1181.     jsr    pc,drput
  1182.     incb    drflg
  1183.     jmp    *(r4)+
  1184.  
  1185. _fdisp:
  1186.     clr    r0
  1187.     jsr    pc,drput
  1188.     clrb    drflg
  1189.     jmp    *(r4)+
  1190.  
  1191. _draw:
  1192.     movf    (r3)+,r2
  1193.     movf    (r3)+,r1
  1194.     movf    (r3)+,r0
  1195.     jsr    r5,draw
  1196.     jmp    *(r4)+
  1197.  
  1198. _erase:
  1199.     mov    $1,r0
  1200.     jsr    pc,drput
  1201.     mov    $1,r0
  1202.     jsr    pc,drput
  1203.     jmp    *(r4)+
  1204. .endif
  1205.  
  1206. _print:
  1207.     movf    (r3)+,r0
  1208.     jsr    r5,ftoa; xputc
  1209.     jmp    *(r4)+
  1210.  
  1211. _octal:
  1212.     movf    (r3)+,r0
  1213.     jsr    r5,ftoo; xputc
  1214.     jmp    *(r4)+
  1215.  
  1216. _nline:
  1217.     mov    $'\n,r0
  1218.     jsr    r5,xputc
  1219.     jmp    *(r4)+
  1220.  
  1221. _ascii:
  1222.     movb    (r4)+,r0
  1223.     cmp    r0,$'"
  1224.     beq    1f
  1225.     jsr    r5,xputc
  1226.     br    _ascii
  1227. 1:
  1228.     inc    r4
  1229.     bic    $1,r4
  1230.     jmp    *(r4)+
  1231.  
  1232. _line:
  1233.     mov    sstack,r3
  1234.     cmp    r3,$stack+20.
  1235.     bhi    1f
  1236.     jsr    r5,error
  1237.         <out of space\n\0>; .even
  1238. 1:
  1239.     mov    (r4)+,lineno
  1240.     jmp    *(r4)+
  1241.  
  1242. _or:
  1243.     tstf    (r3)+
  1244.     cfcc
  1245.     bne    stone
  1246.     tstf    (r3)
  1247.     cfcc
  1248.     bne    stone
  1249.     br    stzero
  1250.  
  1251. _and:
  1252.     tstf    (r3)+
  1253.     cfcc
  1254.     beq    stzero
  1255.     tstf    (r3)
  1256.     cfcc
  1257.     beq    stzero
  1258.     br    stone
  1259.  
  1260. _great:
  1261.     jsr    pc,bool
  1262.     bgt    stone
  1263.     br    stzero
  1264.  
  1265. _greateq:
  1266.     jsr    pc,bool
  1267.     bge    stone
  1268.     br    stzero
  1269.  
  1270. _less:
  1271.     jsr    pc,bool
  1272.     blt    stone
  1273.     br    stzero
  1274.  
  1275. _lesseq:
  1276.     jsr    pc,bool
  1277.     ble    stone
  1278.     br    stzero
  1279.  
  1280. _noteq:
  1281.     jsr    pc,bool
  1282.     bne    stone
  1283.     br    stzero
  1284.  
  1285. _equal:
  1286.     jsr    pc,bool
  1287.     beq    stone
  1288.  
  1289. stzero:
  1290.     clrf    r0
  1291.     br    advanc
  1292.  
  1293. stone:
  1294.     movf    $one,r0
  1295.     br    advanc
  1296.  
  1297. _extr:
  1298.     movf    r1,r0        / dup for _and in extended rel
  1299.     br    subadv
  1300.  
  1301. _asgn:
  1302.     movf    (r3)+,r0
  1303.     mov    (r3)+,r0
  1304.     add    $4,r0
  1305.     bis    $1,(r0)+
  1306.     movf    r0,(r0)
  1307.     br    subadv
  1308.  
  1309. _add:
  1310.     movf    (r3)+,r0
  1311.     addf    (r3),r0
  1312.     br    advanc
  1313.  
  1314. _sub:
  1315.     movf    (r3)+,r0
  1316.     negf    r0
  1317.     addf    (r3),r0
  1318.     br    advanc
  1319.  
  1320. _mult:
  1321.     movf    (r3)+,r0
  1322.     mulf    (r3),r0
  1323.     br    advanc
  1324.  
  1325. _divid:
  1326.     movf    (r3)+,r1
  1327.     movf    (r3),r0
  1328.     divf    r1,r0
  1329.     br    advanc
  1330.  
  1331. _expon:
  1332.     movf    (r3)+,fr1
  1333.     movf    (r3),fr0
  1334.     jsr    pc,pow
  1335.     bec    advanc
  1336.     jsr    r5,error
  1337.         <Bad exponentiation\n\0>; .even
  1338.  
  1339. _neg:  / unary -
  1340.     negf    r0
  1341.     jbr    advanc
  1342. / end of _neg
  1343.  
  1344. _intcon:
  1345.     movif    (r4)+,r0
  1346.     jbr    subadv
  1347.  
  1348. _con0:
  1349.     clrf    r0
  1350.     jbr    subadv
  1351.  
  1352. _con1:
  1353.     movf    $one,r0
  1354.     jbr    subadv
  1355.  
  1356. _const:
  1357.     movf    (r4)+,r0
  1358.  
  1359. subadv:
  1360.     movf    r0,-(r3)
  1361.     jmp    *(r4)+
  1362.  
  1363. advanc:
  1364.     movf    r0,(r3)
  1365.     jmp    *(r4)+
  1366.  
  1367. _rval:
  1368.     jsr    pc,getlv
  1369.     br    subadv
  1370.  
  1371. _fori:
  1372.     jsr    pc,getlv
  1373.     addf    $one,r0
  1374.     movf    r0,(r0)
  1375.     br    subadv
  1376.  
  1377. _lval:
  1378.     mov    (r4)+,-(r3)
  1379.     jmp    *(r4)+
  1380.  
  1381. _dup:
  1382.     movf    (r3),r0
  1383.     br    subadv
  1384.  
  1385. _return:
  1386.     dec    sublev
  1387.     bge    1f
  1388.     jsr    r5,error
  1389.         <bad return\n\0>; .even
  1390. 1:
  1391.     movf    (r3),r0
  1392.     mov    sstack,r3
  1393.     mov    (r3)+,sstack
  1394.     mov    (r3)+,r4
  1395.     mov    (r4)+,r0
  1396. 1:
  1397.     dec    r0
  1398.     blt    advanc
  1399.     add    $8,r3
  1400.     br    1b
  1401.  
  1402. _subscr:
  1403.     mov    (r4),r1
  1404.     mpy    $8.,r1
  1405.     add    r1,r3
  1406.     mov    r3,-(sp)
  1407.     mov    (r3),r0
  1408.     mov    (r4)+,-(sp)
  1409. 1:
  1410.     dec    (sp)
  1411.     blt    1f
  1412.     movf    -(r3),r0
  1413.     movfi    r0,r2
  1414.     com    r2
  1415.     blt    2f
  1416.     jsr    r5,error
  1417.         <subscript out of range\n\0>; .even
  1418. 2:
  1419.     mov    r0,r1
  1420.     mov    4(r0),r0
  1421.     bic    $1,r0
  1422. 2:
  1423.     beq    2f
  1424.     cmp    r2,(r0)+
  1425.     bne    3f
  1426.     tst    -(r0)
  1427.     br    1b
  1428. 3:
  1429.     mov    (r0),r0
  1430.     br    2b
  1431. 2:
  1432.     mov    $symtab,r0
  1433. 2:
  1434.     tst    (r0)
  1435.     beq    2f
  1436.     add    $14.,r0
  1437.     br    2b
  1438. 2:
  1439.     cmp    r0,$esymtab-28.
  1440.     blo    2f
  1441.     jsr    r5,error
  1442.         <out of symbol space\n\0>; .even
  1443. 2:
  1444.     cmp    (r1)+,(r1)+
  1445.     mov    r0,-(sp)
  1446.     clr    14.(r0)
  1447.     mov    r2,(r0)+
  1448.     mov    (r1),r2
  1449.     bic    $1,r2
  1450.     mov    r2,(r0)+
  1451.     clr    (r0)+
  1452.     mov    (sp)+,r0
  1453.     bic    $!1,(r1)
  1454.     bis    r0,(r1)
  1455.     br    1b
  1456. 1:
  1457.     tst    (sp)+
  1458.     mov    (sp)+,r3
  1459.     mov    r0,(r3)
  1460.     jmp    *(r4)+
  1461.  
  1462. bool:
  1463.     movf    (r3)+,r1    / r1 used in extended rel
  1464.     cmpf    (r3),r1
  1465.     cfcc
  1466.     rts    pc
  1467.  
  1468. getlv:
  1469.     mov    (r3)+,r0
  1470.     add    $4,r0
  1471.     bit    $1,(r0)+
  1472.     bne    1f
  1473.     jsr    r5,error;<used before set\n\0>; .even
  1474. 1:
  1475.     movf    (r0),r0
  1476.     rts    pc
  1477.  
  1478. /
  1479. /
  1480.  
  1481. / bas4 -- builtin functions
  1482.  
  1483. builtin:
  1484.     dec    sublev
  1485.     mov    (r3)+,sstack
  1486.     mov    (r3)+,r4
  1487.     movfi    r0,r0
  1488.     com    r0
  1489.     asl    r0
  1490.     cmp    r0,$2f-1f
  1491.     bhis    2f
  1492.     jmp    *1f(r0)
  1493. 1:
  1494.     fnarg
  1495.     fnexp
  1496.     fnlog
  1497.     fnsin
  1498.     fncos
  1499.     fnatan
  1500.     fnrand
  1501.     fnexpr
  1502.     fnint
  1503.     fnabs
  1504.     fnsqr
  1505.     fnlast
  1506. 2:
  1507.     mov    $-1,r0
  1508.     jsr    pc,getloc        / label not found diagnostic
  1509.  
  1510. fnarg:
  1511.     cmp    (r4)+,$1
  1512.     jne    narg
  1513.     movf    (r3),r0
  1514.     movfi    r0,r0
  1515.     jsr    pc,arg
  1516.     br    fnadvanc
  1517.  
  1518. fnexp:
  1519.     jsr    r5,fnfn; exp
  1520.     br    fnadvanc
  1521.  
  1522. fnlog:
  1523.     jsr    r5,fnfn; log
  1524.     bec    fnadvanc
  1525.     jsr    r5,error
  1526.         <Bad log\n\0>; .even
  1527.  
  1528. fnsin:
  1529.     jsr    r5,fnfn; sin
  1530.     bec    fnadvanc
  1531.     jsr    r5,error
  1532.         <Bad sine\n\0>; .even
  1533.  
  1534. fncos:
  1535.     jsr    r5,fnfn; cos
  1536.     bec    fnadvanc
  1537.     jsr    r5,error
  1538.         <Bad cosine\n\0>; .even
  1539.  
  1540. fnatan:
  1541.     jsr    r5,fnfn; atan
  1542.     bec    fnadvanc
  1543.     jsr    r5,error
  1544.         <Bad arctangent\n\0>; .even
  1545.  
  1546. fnrand:
  1547.     tst    (r4)+
  1548.     bne    narg
  1549.     jsr    pc,rand
  1550.     movif    r0,r0
  1551.     divf    $44000,r0
  1552.     jmp    advanc
  1553.  
  1554. fnexpr:
  1555.     tst    (r4)+
  1556.     bne    narg
  1557.     mov    r3,-(sp)
  1558.     mov    r4,-(sp)
  1559.     jsr    pc,rdline
  1560.     mov    exprloc,r4
  1561.     mov    $line,r3
  1562.     jsr    pc,expr
  1563.     mov    $_tra,(r4)+
  1564.     mov    (sp)+,(r4)+
  1565.     mov    (sp)+,r3
  1566.     mov    exprloc,r4
  1567.     add    $8,r3
  1568.     jmp    *(r4)+
  1569.  
  1570. fnint:
  1571.     cmp    (r4)+,$1
  1572.     bne    narg
  1573.     movf    (r3),r0
  1574.     modf    $one,r0
  1575.     movf    r1,r0
  1576.     br    fnadvanc
  1577.  
  1578. fnabs:
  1579.     cmp    (r4)+,$1
  1580.     bne    narg
  1581.     movf    (r3),r0
  1582.     cfcc
  1583.     bge    fnadvanc
  1584.     negf    r0
  1585.     br    fnadvanc
  1586.  
  1587. fnlast:
  1588.     tst    (r4)+
  1589.     bne    narg
  1590.     movf    lastpr,fr0
  1591.     jbr    advanc
  1592.  
  1593. fnsqr:
  1594.     jsr    r5,fnfn; sqrt
  1595.     bec    fnadvanc
  1596.     jsr    r5,error
  1597.     <Bad square root arg\n\0>; .even
  1598. fnadvanc:
  1599.     add    $8,r3
  1600.     jmp    advanc
  1601.  
  1602. narg:
  1603.     jsr    r5,error
  1604.         <arg count\n\0>; .even
  1605.  
  1606. arg:
  1607.     tst    sublev
  1608.     beq    1f
  1609.     mov    sstack,r1
  1610.     sub    *2(r1),r0
  1611.     bhi    1f
  1612. 2:
  1613.     inc    r0
  1614.     bgt    2f
  1615.     add    $8,r1
  1616.     br    2b
  1617. 2:
  1618.     movf    4(r1),r0
  1619.     rts    pc
  1620. 1:
  1621.     jsr    r5,error
  1622.         <bad arg\n\0>; .even
  1623.  
  1624. fnfn:
  1625.     cmp    (r4)+,$1
  1626.     bne    narg
  1627.     movf    (r3),r0
  1628.     jsr    pc,*(r5)+
  1629.     rts    r5
  1630.  
  1631. .if scope / for plotting
  1632. draw:
  1633.     tstf    r2
  1634.     cfcc
  1635.     bne    1f
  1636.     movf    r0,drx
  1637.     movf    r1,dry
  1638.     rts    r5
  1639. 1:
  1640.     movf    r0,-(sp)
  1641.     movf    r1,-(sp)
  1642.     mov    $3,r0
  1643.     jsr    pc,drput
  1644.     jsr    pc,drxy
  1645.     movf    (sp)+,r0
  1646.     movf    r0,dry
  1647.     movf    (sp)+,r0
  1648.     movf    r0,drx
  1649.     jsr    pc,drxy
  1650.     rts    r5
  1651.  
  1652. drxy:
  1653.     movf    drx,r0
  1654.     jsr    pc,drco
  1655.     movf    dry,r0
  1656.  
  1657. drco:
  1658.     tstf    r0
  1659.     cfcc
  1660.     bge    1f
  1661.     clrf    r0
  1662. 1:
  1663.     cmpf    $40200,r0        / 1.0
  1664.     cfcc
  1665.     bgt    1f
  1666.     movf    $40177,r0        / 1.0-eps
  1667. 1:
  1668.     subf    $40000,r0        / .5
  1669.     mulf    $43200,r0        / 4096
  1670.     movfi    r0,r0
  1671.     mov    r0,-(sp)
  1672.     jsr    pc,drput
  1673.     mov    (sp)+,r0
  1674.     swab    r0
  1675.  
  1676. drput:
  1677.     movb    r0,ch
  1678.     mov    drfo,r0
  1679.     bne    1f
  1680.     sys    open; vt; 1
  1681.     bec    2f
  1682.     4
  1683. 2:
  1684.     mov    r0,drfo
  1685. 1:
  1686.     sys    write; ch; 1
  1687.     rts    pc
  1688.  
  1689. .endif
  1690. / bas4 -- old library routines
  1691. atoi:
  1692.     clr    r1
  1693.     jsr    r5,nextc
  1694.     clr    -(sp)
  1695.     cmp    r0,$'-
  1696.     bne    2f
  1697.     inc    (sp)
  1698. 1:
  1699.     jsr    r5,nextc
  1700. 2:
  1701.     sub    $'0,r0
  1702.     cmp    r0,$9
  1703.     bhi    1f
  1704.     mpy    $10.,r1
  1705.     bcs    3f / >32k
  1706.     add    r0,r1
  1707.     bcs    3f / >32k
  1708.     br    1b
  1709. 1:
  1710.     add    $'0,r0
  1711.     tst    (sp)+
  1712.     beq    1f
  1713.     neg    r1
  1714. 1:
  1715.     rts    r5
  1716. 3:
  1717.     tst    (sp)+
  1718.     mov    $'.,r0  / faking overflow
  1719.     br    1b
  1720.  
  1721. ldfps = 170100^tst
  1722. stfps = 170200^tst
  1723. atof:
  1724.     stfps    -(sp)
  1725.     ldfps    $200
  1726.     movf    fr1,-(sp)
  1727.     mov    r1,-(sp)
  1728.     mov    r2,-(sp)
  1729.     clr    -(sp)
  1730.     clrf    fr0
  1731.     clr    r2
  1732.     jsr    r5,*(r5)
  1733.     cmpb    r0,$'-
  1734.     bne    2f
  1735.     inc    (sp)
  1736. 1:
  1737.     jsr    r5,*(r5)
  1738. 2:
  1739.     sub    $'0,r0
  1740.     cmp    r0,$9.
  1741.     bhi    2f
  1742.     jsr    pc,dig
  1743.         br    1b
  1744.     inc    r2
  1745.     br    1b
  1746. 2:
  1747.     cmpb    r0,$'.-'0
  1748.     bne    2f
  1749. 1:
  1750.     jsr    r5,*(r5)
  1751.     sub    $'0,r0
  1752.     cmp    r0,$9.
  1753.     bhi    2f
  1754.     jsr    pc,dig
  1755.         dec r2
  1756.     br    1b
  1757. 2:
  1758.     cmpb    r0,$'e-'0
  1759.     bne    1f
  1760.     jsr    r5,atoi
  1761.     sub    $'0,r0
  1762.     add    r1,r2
  1763. 1:
  1764.     movf    $one,fr1
  1765.     mov    r2,-(sp)
  1766.     beq    2f
  1767.     bgt    1f
  1768.     neg    r2
  1769. 1:
  1770.     cmp    r2,$38.
  1771.     blos    1f
  1772.     clrf    fr0
  1773.     tst    (sp)+
  1774.     bmi    out
  1775.     movf    $huge,fr0
  1776.     br    out
  1777. 1:
  1778.     mulf    $ten,fr1
  1779.     sob    r2,1b
  1780. 2:
  1781.     tst    (sp)+
  1782.     bge    1f
  1783.     divf    fr1,fr0
  1784.     br    2f
  1785. 1:
  1786.     mulf    fr1,fr0
  1787.     cfcc
  1788.     bvc    2f
  1789.     movf    $huge,fr0
  1790. 2:
  1791. out:
  1792.     tst    (sp)+
  1793.     beq    1f
  1794.     negf    fr0
  1795. 1:
  1796.     add    $'0,r0
  1797.     mov    (sp)+,r2
  1798.     mov    (sp)+,r1
  1799.     movf    (sp)+,fr1
  1800.     ldfps    (sp)+
  1801.     tst    (r5)+
  1802.     rts    r5
  1803.  
  1804. dig:
  1805.     cmpf    $big,fr0
  1806.     cfcc
  1807.     blt    1f
  1808.     mulf    $ten,fr0
  1809.     movif    r0,fr1
  1810.     addf    fr1,fr0
  1811.     rts    pc
  1812. 1:
  1813.     add    $2,(sp)
  1814.     rts    pc
  1815.  
  1816. one    = 40200
  1817. ten    = 41040
  1818. big    = 56200
  1819. huge    = 77777
  1820.  
  1821. .globl    _ndigits
  1822. .globl ecvt
  1823. .globl fcvt
  1824.  
  1825. ftoa:
  1826.     movf    fr0,lastpr
  1827.     jsr    pc,ecvt
  1828.     mov    r0,bufptr
  1829.     tstb    r1
  1830.     beq    1f
  1831.     mov    $'-,r0
  1832.     jsr    r5,*(r5)
  1833. 1:
  1834.     cmp    r3,$-2
  1835.     blt    econ
  1836.     cmp    r2,$-5
  1837.     ble    econ
  1838.     cmp    r2,$6
  1839.     bgt    econ
  1840.     jsr    pc,cout
  1841.     tst    (r5)+
  1842.     rts    r5
  1843.  
  1844. econ:
  1845.     mov    r2,-(sp)
  1846.     mov    $1,r2
  1847.     jsr    pc,cout
  1848.     mov    $'e,r0
  1849.     jsr    r5,*(r5)
  1850.     mov    (sp)+,r0
  1851.     dec    r0
  1852.     jmp    itoa
  1853.  
  1854. cout:
  1855.     mov    bufptr,r1
  1856.     add    _ndigits,r1
  1857.     mov    r2,-(sp)
  1858.     add    bufptr,r2
  1859. 1:
  1860.     cmp    r1,r2
  1861.     blos    1f
  1862.     cmpb    -(r1),$'0
  1863.     beq    1b
  1864.     inc    r1
  1865. 1:
  1866.     mov    (sp)+,r2
  1867.     bge    2f
  1868.     mov    $'.,r0
  1869.     jsr    r5,*(r5)
  1870. 1:
  1871.     mov    $'0,r0
  1872.     jsr    r5,*(r5)
  1873.     inc    r2
  1874.     blt    1b
  1875.     dec    r2
  1876. 2:
  1877.     mov    r2,-(sp)
  1878.     mov    bufptr,r2
  1879. 1:
  1880.     cmp    r2,r1
  1881.     bhis    1f
  1882.     tst    (sp)
  1883.     bne    2f
  1884.     mov    $'.,r0
  1885.     jsr    r5,*(r5)
  1886. 2:
  1887.     dec    (sp)
  1888.     movb    (r2)+,r0
  1889.     jsr    r5,*(r5)
  1890.     br    1b
  1891. 1:
  1892.     tst    (sp)+
  1893.     rts    pc
  1894.  
  1895. .bss
  1896. bufptr:    .=.+2
  1897. .text
  1898.  
  1899. ftoo:
  1900.     stfps    -(sp)
  1901.     ldfps    $200
  1902.     mov    r1,-(sp)
  1903.     mov    r2,-(sp)
  1904.     mov    $buf,r1
  1905.     movf    fr0,(r1)+
  1906.     mov    $buf,r2
  1907.     br    2f
  1908. 1:
  1909.     cmp    r2,r1
  1910.     bhis    1f
  1911.     mov    $';,r0
  1912.     jsr    r5,*(r5)
  1913. 2:
  1914.     mov    (r2)+,r0
  1915.     jsr    pc,oct
  1916.     br    1b
  1917. 1:
  1918.     mov    $'\n,r0
  1919.     jsr    pc,*(r5)+
  1920.     ldfps    (sp)+
  1921.     rts    r5
  1922.  
  1923. oct:
  1924.     mov    r0,x+2
  1925.     setl
  1926.     movif    x,fr0
  1927.     mulf    $small,fr0
  1928.     seti
  1929.     mov    $6.,-(sp)
  1930. 1:
  1931.     modf    $eight,fr0
  1932.     movfi    fr1,r0
  1933.     add    $'0,r0
  1934.     jsr    r5,*(r5)
  1935.     dec    (sp)
  1936.     bne    1b
  1937.     tst    (sp)+
  1938.     rts    pc
  1939.  
  1940. eight    = 41000
  1941. small    = 33600
  1942. .bss
  1943. buf:    .=.+8
  1944. x:    .=.+4
  1945. .text
  1946.  
  1947. itoa:
  1948.     mov    r1,-(sp)
  1949.     mov    r0,r1
  1950.     bge    1f
  1951.     neg    r1
  1952.     mov    $'-,r0
  1953.     jsr    r5,*(r5)
  1954. 1:
  1955.     jsr    pc,1f
  1956.     mov    (sp)+,r1
  1957.     tst    (r5)+
  1958.     rts    r5
  1959.  
  1960. 1:
  1961.     clr    r0
  1962.     dvd    $10.,r0
  1963.     mov    r1,-(sp)
  1964.     mov    r0,r1
  1965.     beq    1f
  1966.     jsr    pc,1b
  1967. 1:
  1968.     mov    (sp)+,r0
  1969.     add    $'0,r0
  1970.     jsr    r5,*(r5)
  1971.     rts    pc
  1972. / bas -- BASIC
  1973. / new command "dump" which dumps symbol table values by name
  1974. /        R. Haight
  1975. /
  1976. _dump:
  1977.     mov    r4,-(sp)
  1978.     mov    $12.*14.+symtab-14.,r4
  1979. 1:
  1980.     add    $14.,r4
  1981.     tst    (r4)
  1982.     beq    1f
  1983.     bit    $1,4(r4)
  1984.     beq    1b
  1985.     jsr    pc,dmp1
  1986.     mov    $'=,r0
  1987.     jsr    r5,xputc
  1988.     movf    6(r4),r0
  1989.     jsr    r5,ftoa; xputc
  1990.     mov    $'\n,r0
  1991.     jsr    r5,xputc
  1992.     br    1b
  1993. 1:
  1994.     mov    (sp)+,r4
  1995.     jmp    *(r4)+
  1996.  
  1997. dmp1:
  1998.     tst    (r4)
  1999.     blt    1f
  2000.     mov    (r4),nameb
  2001.     mov    2(r4),nameb+2
  2002.     mov    $nameb,r0
  2003.     jsr    pc,print
  2004.     rts    pc
  2005. 1:
  2006.     mov    r4,-(sp)
  2007.     mov    $symtab-14.,r4
  2008. 1:
  2009.     add    $14.,r4
  2010.     tst    (r4)
  2011.     beq    1f
  2012.     mov    4(r4),r0
  2013.     bic    $1,r0
  2014. 2:
  2015.     beq    1b
  2016.     cmp    r0,(sp)
  2017.     beq    2f
  2018.     mov    2(r0),r0
  2019.     br    2b
  2020. 2:
  2021.     jsr    pc,dmp1
  2022.     mov    $'[,r0
  2023.     jsr    r5,xputc
  2024.     mov    *(sp),r0
  2025.     com    r0
  2026.     movif    r0,r0
  2027.     jsr    r5,ftoa; xputc
  2028.     mov    $'],r0
  2029.     jsr    r5,xputc
  2030. 1:
  2031.     mov    (sp)+,r4
  2032.     rts    pc
  2033. /
  2034. /
  2035.  
  2036. / basx -- data
  2037.  
  2038. one = 40200
  2039.  
  2040. .data
  2041.  
  2042. _ndigits:10.
  2043. tmpf:    </tmp/btma\0>
  2044. argname: <b.out\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0>
  2045. vt:    </dev/vt0\0>
  2046. .even
  2047. pname:    <\0\0\0\0\0\0>
  2048.     .even
  2049.  
  2050. resnam:
  2051.     <list>
  2052.     <done>
  2053.     <q\0\0\0>
  2054.     <run\0>
  2055.     <prin>
  2056.     <prom>   / prompt is like print without \n (cr)
  2057.     <if\0\0>
  2058.     <goto>
  2059.     <retu>
  2060.     <for\0>
  2061.     <next>
  2062.     <octa>
  2063.     <save>
  2064.     <dump>
  2065.     <fi\0\0>
  2066.     <else>
  2067.     <edit>
  2068.     <comm>  / comment
  2069. .if scope / for plotting
  2070.     <disp>
  2071.     <draw>
  2072.     <eras>
  2073. .endif
  2074. eresnam:
  2075.  
  2076. symtnam:
  2077.     <arg\0>
  2078.     <exp\0>
  2079.     <log\0>
  2080.     <sin\0>
  2081.     <cos\0>
  2082.     <atn\0>
  2083.     <rnd\0>
  2084.     <expr>
  2085.     <int\0>
  2086.     <abs\0>
  2087.     <sqr\0>
  2088.     <last>
  2089. esymtnam:
  2090.  
  2091. / indirect sys calls:
  2092. sysseek:    sys    lseek; 0; seekx: 0; 0
  2093. syswrit:    sys    write; wbuf: 0; wlen: 0
  2094. sysread:    sys    read; rbuf: 0; rlen: 0
  2095. sysopen:    sys    open; ofile: 0 ; omode: 0
  2096. syscreat:    sys    creat; cfile: 0; cmode: 0
  2097. .bss
  2098. drx:    .=.+8
  2099. dry:    .=.+8
  2100. drfo:    .=.+2
  2101. ch:    .=.+2
  2102. drflg:    .=.+2
  2103. randx:    .=.+2
  2104. gsp:    .=.+2
  2105. forp:    .=.+2
  2106. exprloc:.=.+2
  2107. sstack:    .=.+2
  2108. sublev:    .=.+2
  2109. val:    .=.+2
  2110. splimit:    .=.+2  / statement size limit
  2111. iflev:    .=.+20.  / nested if compile stack: 10 deep
  2112. ifp:    .=.+2    / current pointer to iflev
  2113. line:    .=.+100.
  2114. prfile:    .=.+2   / output from _list or _save
  2115. tfi:    .=.+2  / input file
  2116. lastpr:    .=.+8    / last printed number
  2117. func:    .=.+2   / alternate functions, eg: _list or _save
  2118. seeka:    .=.+2   / seek offset 1
  2119. lineno:    .=.+2
  2120. nameb:    .=.+4
  2121. tfo:    .=.+2
  2122. symtab:    .=.+2800.; esymtab: / symbol=7wds; symtab for 200
  2123. space:    .=.+8000.; espace: / code space
  2124. exline:    .=.+1000.; eexline: / line execute space
  2125. lintab:    .=.+1800.; elintab: / 3wds per statement = 300 stmts
  2126. stack:    .=.+800.; estack:
  2127.  
  2128. iobuf: fi: .=.+518.  / should be acquired??
  2129.