+/
+/
+
+/ bas0 -- basic
+
+scope = 1
+.globl main
+.globl sin, cos, log, exp, atan, pow, sqrt
+.globl rand, srand
+.globl fptrap
+.globl fopen, getc
+
+indir = 0 /for indirect sys calls. (not in as)
+one = 40200
+
+main:
+ mov $1,prfile /initial print file
+ sys signal; 4; fptrap
+ setd
+ sys time
+ mov r1,r0
+ mov r0,randx
+ jsr pc,srand
+ sys signal; 2; intrup
+ mov sp,gsp
+ clr seeka
+ mov $'a,r1
+1:
+ movb r1,tmpf+8
+ sys stat; tmpf; line
+ bes 1f
+ inc r1
+ cmp r1,$'z
+ blos 1b
+ br 2f
+1:
+ sys creat; tmpf; 600
+ bes 2f
+ mov r0,tfo
+ sys open; tmpf; 0
+ bec 1f
+2:
+ mov $3f,r0
+ jsr pc,print
+ sys exit
+3:
+ <Tmp file?\n\0>; .even
+1:
+ mov r0,tfi
+
+ mov gsp,sp
+ cmp (sp),$2 /is there a file argument
+ blt noarg
+ mov 4(sp),r0
+ mov $argname,r1
+1:
+ movb (r0)+,(r1)+
+ bne 1b
+aftered: / after edit
+ mov $argname,r0
+ jsr r5,fopen; iobuf
+ bes 1f
+noarg:
+ jsr pc,isymtab
+ br loop
+1:
+ mov $1f,r0
+ jsr pc,print
+ br loop
+1:
+ <Cannot open file\n\0>; .even
+
+intrup:
+ sys signal; 2; intrup
+ mov $'\n,r0
+ jsr r5,xputc
+ jsr r5,error
+ <ready\n\0>; .even
+
+loop:
+ mov gsp,sp
+ clr lineno
+ jsr pc,rdline
+ mov $line,r3
+1:
+ movb (r3),r0
+ jsr pc,digit
+ br 1f
+ jsr r5,atoi
+ cmp r0,$' /
+ beq 3f
+ cmp r0,$' /tab
+ bne 1f
+3:
+ mov $lintab,r3
+ mov r1,r0
+ bgt 2f
+ jsr pc,serror
+2:
+ cmp r0,(r3)
+ beq 2f
+ tst (r3)
+ beq 2f
+ add $6,r3
+ br 2b
+2:
+ cmp r3,$elintab-12.
+ blo 2f
+ jsr r5,error
+ <too many lines\n\0>; .even
+2:
+ mov r0,(r3)+
+ mov seeka,(r3)+
+ mov tfo,r0
+ mov seeka,seekx
+ sys indir; sysseek
+ mov $line,r0
+ jsr pc,size
+ inc r0
+ add r0,seeka
+ mov r0,wlen
+ mov tfo,r0
+ mov $line,wbuf
+ sys indir;syswrit
+ br loop
+1:
+ mov $line,r3
+ jsr pc,singstat
+ br loop
+
+nextc:
+ movb (r3)+,r0
+ rts r5
+
+size:
+ clr -(sp)
+1:
+ inc (sp)
+ cmpb (r0),$'\n
+ beq 1f
+ cmpb (r0),$0
+ beq 1f
+ inc r0
+ br 1b
+1:
+ mov (sp)+,r0
+ rts pc
+
+rdline: / read input (file or tty) to carr. ret.
+ mov $line,r1
+1:
+ jsr r5,getc; iobuf
+ bes 2f
+ tst r0
+ beq 2f
+ cmp r1,$line+99.
+ bhis 2f / bad check, but a check
+ movb r0,(r1)+
+ cmpb r0,$'\n
+ bne 1b
+ clrb (r1)
+ rts pc
+2:
+ mov fi,r0
+ beq 1f
+ sys close
+ clr fi
+ br 1b
+1:
+ jmp _done
+
+error:
+ tst fi
+ beq 1f
+ sys close
+ clr fi
+1:
+ tst lineno
+ beq 1f
+ jsr pc,nextlin
+ br 1f
+ mov $line,r0
+ jsr pc,print
+1:
+ mov r5,r0
+ jsr pc,print
+ jmp loop
+
+serror:
+ dec r3
+ tst fi
+ beq 1f
+ sys close
+ clr fi
+1:
+ mov $line,r1
+1:
+ cmp r1,r3
+ bne 2f
+ mov $'_,r0
+ jsr r5,xputc
+ mov $10,r0
+ jsr r5,xputc
+2:
+ movb (r1),r0
+ jsr r5,xputc
+ cmpb (r1)+,$'\n
+ bne 1b
+ jmp loop
+
+print:
+ mov r0,wbuf
+ jsr pc,size
+ mov r0,wlen
+ mov prfile,r0
+ sys indir; syswrit
+ rts pc
+
+digit:
+ cmp r0,$'0
+ blo 1f
+ cmp r0,$'9
+ bhi 1f
+ add $2,(sp)
+1:
+ rts pc
+
+alpha:
+ cmp r0,$'a
+ blo 1f
+ cmp r0,$'z
+ bhi 1f
+ add $2,(sp)
+1:
+ cmp r0,$'A
+ blo 1f
+ cmp r0,$'Z
+ bhi 1f
+ add $2,(sp)
+1:
+ rts pc
+
+name:
+ mov $nameb,r1
+ clr (r1)
+ clr 2(r1)
+1:
+ cmp r1,$nameb+4
+ bhis 2f
+ movb r0,(r1)+
+2:
+ movb (r3)+,r0
+ jsr pc,alpha
+ br 2f
+ br 1b
+2:
+ jsr pc,digit
+ br 2f
+ br 1b
+2:
+ mov $resnam,r1
+1:
+ cmp nameb,(r1)
+ bne 2f
+ cmp nameb+2,2(r1)
+ bne 2f
+ sub $resnam,r1
+ asr r1
+ add $2,(sp)
+ rts pc
+2:
+ add $4,r1
+ cmp r1,$eresnam
+ blo 1b
+ mov $symtab,r1
+1:
+ tst (r1)
+ beq 1f
+ cmp nameb,(r1)
+ bne 2f
+ cmp nameb+2,2(r1)
+ bne 2f
+ rts pc
+2:
+ add $14.,r1
+ br 1b
+1:
+ cmp r1,$esymtab-28.
+ blo 1f
+ jsr r5,error
+ <out of symbol space\n\0>; .even
+1:
+ mov nameb,(r1)
+ mov nameb+2,2(r1)
+ clr 4(r1)
+ clr 14.(r1)
+ rts pc
+
+skip:
+ cmp r0,$' /
+ beq 1f
+ cmp r0,$' / tab
+ bne 2f
+1:
+ movb (r3)+,r0
+ br skip
+2:
+ rts pc
+
+xputc:
+.if scope / for plotting
+ tstb drflg
+ beq 1f
+ jsr pc,drput
+ rts r5
+1:
+.endif
+ mov r0,ch
+ mov $1,r0
+ sys write; ch; 1
+ rts r5
+
+nextlin:
+ clr -(sp)
+ mov $lintab,r1
+1:
+ tst (r1)
+ beq 1f
+ cmp lineno,(r1)
+ bhi 2f
+ mov (sp),r0
+ beq 3f
+ cmp (r0),(r1)
+ blos 2f
+3:
+ mov r1,(sp)
+2:
+ add $6,r1
+ br 1b
+1:
+ mov (sp)+,r1
+ beq 1f
+ mov (r1)+,lineno
+ mov (r1)+,seekx
+ mov tfi,r0
+ sys indir; sysseek
+ mov tfi,r0
+ sys read; line; 100.
+ add $2,(sp)
+1:
+ rts pc
+
+getloc:
+ mov $lintab,r1
+1:
+ tst (r1)
+ beq 1f
+ cmp r0,(r1)
+ beq 2f
+ add $6,r1
+ br 1b
+1:
+ jsr r5,error
+ <label not found\n\0>; .even
+2:
+ rts pc
+
+isymtab:
+ mov $symtab,r0
+ mov $symtnam,r1
+ clrf fr0
+ movf $one,fr1
+1:
+ mov (r1)+,(r0)+
+ mov (r1)+,(r0)+
+ mov $1,(r0)+
+ subf r1,r0
+ movf r0,(r0)+
+ cmp r1,$esymtnam
+ blo 1b
+ clr (r0)+
+ rts pc
+
+/
+/
+
+/ bas1 -- compile
+/
+/ convention: jsr pc,subrout /test
+/ br failside
+/ succeed ...
+
+compile:
+ clr forp
+ mov $iflev,ifp /added for if..else..fi
+ mov $space,r4
+ tst lineno
+ beq 1f
+ rts pc
+1:
+ jsr pc,nextlin
+ br 1f
+ mov lineno,r0
+ jsr pc,getloc
+ mov r4,4(r1)
+ jsr pc,statement
+ br .+2
+ inc lineno
+ cmp r4,$espace+20 / out of code space?
+ blo 1b
+ jsr r5,error
+ <out of code space\n\0>; .even
+1:
+ tst forp
+ jne forer
+ cmp ifp,$iflev
+ jne fier /hanging if..fi
+ mov $loop,(r4)+
+ rts pc
+
+singstat:
+ clr forp
+ mov $iflev,ifp
+ mov $exline,r4
+ jsr pc,statement
+ br 1f
+ cmp -2(r4),$_asgn
+ beq 1f
+ mov $_print,(r4)+
+ mov $_nline,(r4)+
+1:
+ tst forp
+ jne forer
+ cmp r4,$eexline
+ blo 1f
+ jsr r5,error
+ <out of code space\n\0>; .even
+1:
+ mov $loop,(r4)+
+ mov r4,exprloc
+ mov $exline,r4
+ jmp execute
+
+statement:
+ mov $line,r3
+ movb (r3)+,r0
+ jsr pc,digit
+ br stat1
+ dec r3
+ jsr r5,atoi
+ cmp r0,$' /
+ beq 1f
+ cmp r0,$' /tab
+ beq 1f
+ mov $line,r3
+ movb (r3)+,r0
+ br stat1
+1:
+ mov $_line,(r4)+
+ mov r1,(r4)+
+
+stat1:
+ jsr pc,skip
+ cmp r0,$'\n
+ bne .+4
+ rts pc
+ mov r3,-(sp)
+ jsr pc,alpha
+ br 1f
+ jsr pc,name
+ br 1f
+ tst (sp)+
+ jsr pc,skip
+ dec r3
+ jmp *2f(r1)
+2:
+ stlist
+ stdone
+ stdone
+ strun
+ stprint
+ stprompt / prompt is like print except for cr
+ stif
+ stgoto
+ streturn
+ stfor
+ stnext
+ stoctl
+ stsave
+ stdump
+ stfi
+ stelse
+ stedit
+ stcomment
+.if scope / for plotting on tektronix
+ stdisp
+ stdraw
+ steras
+.endif
+
+1:
+ mov (sp)+,r3
+ dec r3
+ jsr pc,expr
+ cmp r0,$'\n
+ jne joe
+ add $2,(sp)
+ rts pc
+
+stsave:
+ mov $_save,func
+ br 1f
+
+stlist:
+ mov $_list,func
+1:
+ cmp r0,$'\n
+ bne 1f
+ clrf r0
+ jsr pc,const
+ movif $77777,r0
+ jsr pc,const
+ br 2f
+1:
+ jsr pc,expr
+ cmp r0,$'\n
+ bne 1f
+ mov $_dup,(r4)+
+ br 2f
+1:
+ dec r3
+ jsr pc,expr
+ cmp r0,$'\n
+ jne joe
+2:
+ mov func,(r4)+
+ rts pc
+
+stdone:
+ cmp r0,$'\n
+ jne joe
+ mov $_done,(r4)+
+ rts pc
+
+strun:
+ cmp r0,$'\n
+ jne joe
+ mov $_run,(r4)+
+ rts pc
+
+
+stprompt:
+ clr -(sp)
+ br stpr2
+
+stdump:
+ cmp r0,$'\n
+ jne joe
+ mov $_dump,(r4)+
+ rts pc
+
+stprint:
+ mov pc,-(sp)
+stpr2:
+ movb (r3)+,r0
+ jsr pc,skip
+1:
+ cmp r0,$'\n
+ beq 2f
+ cmp r0,$'"
+ beq 1f
+ dec r3
+ jsr pc,expr
+ mov $_print,(r4)+
+ br 1b
+1:
+ mov $_ascii,(r4)+
+1:
+ movb (r3)+,(r4)
+ cmpb (r4),$'"
+ beq 1f
+ cmpb (r4)+,$'\n
+ bne 1b
+ jbr joe
+1:
+ add $2,r4
+ bic $1,r4
+ br stpr2
+2:
+ tst (sp)+
+ beq 1f
+ mov $_nline,(r4)+
+1:
+ rts pc
+
+stif:
+ jsr pc,expr
+ mov $_if,(r4)+
+ mov r4,*ifp
+ add $2,ifp
+ tst (r4)+
+ jsr pc,skip
+ cmp r0,$'\n / if ... fi
+ beq 1f
+ jsr pc,stat1
+ br .+2
+stfi:
+ sub $2,ifp
+ cmp ifp,$iflev
+ jlo fier
+ mov *ifp,r1 /for jump around if
+ mov r4,(r1)
+1:
+ rts pc
+
+fier:
+ jsr r5,error; <if...else...fi imbalance\n\0>; .even
+
+stelse:
+ mov $_tra,(r4)+ /jump around else side
+ mov r4+,-(sp) / save hole
+ tst (r4)+
+ sub $2,ifp
+ cmp ifp,$iflev
+ jlo fier
+ mov *ifp,r1
+ mov r4,(r1) /fill in jump to else
+ mov (sp)+,*ifp /save hole for fi
+ add $2,ifp
+ rts pc
+
+stedit: / enter the regular editor <ed>
+ sys fork
+ br newpr
+ mov $lintab,r0 / zero out line table during edit
+1:
+ cmp r0,$elintab /done
+ beq 1f
+ mov $0,(r0)+
+ br 1b
+1:
+ sys unlink; tmpf
+ sys wait
+ jmp aftered / start over
+newpr:
+ sys exec; ed; edarg
+ sys exit
+ed: </bin/ed\0> ; .even
+ednm: <-\n>
+ .even
+edarg: ednm; argname; 0
+
+stcomment: /comment line
+ cmp r0,$'\n
+ beq 1f
+ movb (r3)+,r0
+ br stcomment
+1:
+ rts pc
+stgoto:
+ jsr pc,expr
+ mov $_goto,(r4)+
+ rts pc
+
+streturn:
+ cmp r0,$'\n
+ beq 1f
+ jsr pc,expr
+ cmp r0,$'\n
+ bne joe
+ br 2f
+1:
+ clrf r0
+ jsr pc,const
+2:
+ mov $_return,(r4)+
+ rts pc
+
+joe:
+ jsr pc,serror
+
+stfor:
+ mov r4,-(sp)
+ jsr pc,e2
+ mov r4,-(sp)
+ cmp r0,$'=
+ bne joe
+ tst val
+ bne joe
+ jsr pc,expr
+ mov forp,(r4)+ / overlay w _asgn
+ mov r4,forp
+ cmp (r4)+,(r4)+ / _tra ..
+ mov (sp)+,r0
+ mov (sp)+,r1
+1:
+ mov (r1)+,(r4)+
+ cmp r1,r0
+ blo 1b
+ mov $_fori,(r4)+
+ mov forp,r1
+ mov $_tra,(r1)+
+ mov r4,(r1)+
+ dec r3
+ jsr pc,expr
+ mov $_lesseq,(r4)+
+ mov $_if,(r4)+
+ mov forp,(r4)+
+ mov r4,forp
+ cmp r0,$'\n
+ beq 1f
+ jsr pc,stat1
+ br .+2
+ br stnext
+1:
+ rts pc
+
+forer:
+ jsr r5,error; <for/next imbalance\n\0>; .even
+
+stnext:
+ mov forp,r1
+ beq forer
+ mov -(r1),r0
+ mov -(r0),forp
+ mov $_ptra,(r4)+
+ mov $_asgn,(r0)+
+ cmp (r0)+,(r0)+
+ mov r0,(r4)+
+ mov r4,(r1)+
+ rts pc
+
+stoctl:
+ jsr pc,expr
+ mov $_octal,(r4)+
+ rts pc
+
+.if scope / for plotting
+stdisp:
+ mov $_sdisp,(r4)+
+ jsr pc,stprint
+ mov $_fdisp,(r4)+
+ rts pc
+stdraw:
+ jsr pc,expr
+ dec r3
+ jsr pc,expr
+ cmp r0,$'\n
+ bne 1f
+ movf $one,r0
+ jsr pc,const
+ br 2f
+1:
+ dec r3
+ jsr pc,expr
+2:
+ mov $_draw,(r4)+
+ rts pc
+
+steras:
+ mov $_erase,(r4)+
+ rts pc
+.endif
+
+/
+/
+
+/ bas2 -- expression evaluation
+
+expr:
+ jsr pc,e1
+ jsr pc,rval
+ rts pc
+
+/ assignment right to left
+e1:
+ jsr pc,e2
+ cmp r0,$'=
+ beq 1f
+ jsr pc,rval
+ rts pc
+1:
+ tst val
+ beq 1f
+ jsr pc,serror
+1:
+ jsr pc,e1
+ jsr r5,op; _asgn
+ rts pc
+
+/ and or left to right
+e2:
+ jsr pc,e3
+1:
+ cmp r0,$'&
+ beq 2f
+ cmp r0,$'|
+ beq 3f
+ rts pc
+2:
+ jsr pc,rval
+ jsr pc,e3
+ jsr r5,op; _and
+ br 1b
+3:
+ jsr pc,rval
+ jsr pc,e3
+ jsr r5,op; _or
+ br 1b
+
+/ relation extended relation
+e3:
+ jsr pc,e4
+ jsr pc,e3a
+ rts pc
+ clr -(sp)
+1:
+ mov r0,-(sp)
+ jsr pc,e4
+ jsr pc,rval
+ mov (sp)+,(r4)+
+ jsr pc,e3a
+ br 1f
+ mov $_extr,(r4)+
+ inc (sp)
+ br 1b
+1:
+ dec (sp)
+ blt 1f
+ mov $_and,(r4)+
+ br 1b
+1:
+ tst (sp)+
+ rts pc
+
+/ relational operator
+e3a:
+ cmp r0,$'>
+ beq 1f
+ cmp r0,$'<
+ beq 2f
+ cmp r0,$'=
+ beq 3f
+ rts pc
+1:
+ mov $_great,r0
+ cmpb (r3),$'=
+ bne 1f
+ inc r3
+ mov $_greateq,r0
+ br 1f
+2:
+ cmpb (r3),$'>
+ bne 2f
+ inc r3
+ mov $_noteq,r0
+ br 1f
+2:
+ mov $_less,r0
+ cmpb (r3),$'=
+ bne 1f
+ inc r3
+ mov $_lesseq,r0
+ br 1f
+3:
+ cmpb (r3),$'=
+ beq 2f
+ rts pc
+2:
+ inc r3
+ mov $_equal,r0
+1:
+ jsr pc,rval
+ add $2,(sp)
+ rts pc
+
+/ add subtract
+e4:
+ jsr pc,e5
+1:
+ cmp r0,$'+
+ beq 2f
+ cmp r0,$'-
+ beq 3f
+ rts pc
+2:
+ jsr pc,rval
+ jsr pc,e5
+ jsr r5,op; _add
+ br 1b
+3:
+ jsr pc,rval
+ jsr pc,e5
+ jsr r5,op; _sub
+ br 1b
+
+/ multiply divide
+e5:
+ jsr pc,e6
+1:
+ cmp r0,$'*
+ beq 2f
+ cmp r0,$'/
+ beq 3f
+ rts pc
+2:
+ jsr pc,rval
+ jsr pc,e6
+ jsr r5,op; _mult
+ br 1b
+3:
+ jsr pc,rval
+ jsr pc,e6
+ jsr r5,op; _divid
+ br 1b
+
+/ exponential
+e6:
+ jsr pc,e6a
+1:
+ cmp r0,$'^
+ beq 2f
+ rts pc
+2:
+ jsr pc,rval
+ jsr pc,e6a
+ jsr r5,op; _expon
+ br 1b
+
+e6a:
+ movb (r3)+,r0
+ jsr pc,skip
+ cmp r0,$'_
+ bne 1f
+ jsr pc,e6a
+ jsr r5,op; _neg
+ rts pc
+1:
+ dec r3
+ jsr pc,e7
+ rts pc
+/ end of unary -
+
+/ primary
+e7:
+ movb (r3)+,r0
+ jsr pc,skip
+ mov $1,val
+ cmp r0,$'(
+ bne 1f
+ jsr pc,e1
+ cmp r0,$')
+ bne 2f
+ movb (r3)+,r0
+ br e7a
+2:
+ jsr pc,serror
+1:
+ cmp r0,$'.
+ beq 2f
+ jsr pc,digit
+ br 1f
+2:
+ dec r3
+ jsr r5,atof; nextc
+ jsr pc,const
+ br e7a
+1:
+ jsr pc,alpha
+ br jim
+ jsr pc,name
+ br 2f
+ jsr r5,error; <reserved name\n\0>; .even
+2:
+/ try to fix illegal symbol bug:
+ cmp r4,$eexline
+ bhis jim
+
+ mov $_lval,(r4)+
+ mov r1,(r4)+
+ clr val
+ br e7a
+jim:
+ jsr pc,serror
+
+e7a:
+ jsr pc,skip
+ cmp r0,$'(
+ bne 1f
+ jsr pc,rval
+ jsr r5,rlist; _funct
+ cmp r0,$')
+ bne jim
+ movb (r3)+,r0
+ br e7a
+1:
+ cmp r0,$'[
+ bne 1f
+ tst val
+ beq 2f
+ jsr pc,serror
+2:
+ jsr r5,rlist; _subscr
+ clr val
+ cmp r0,$']
+ bne jim
+ movb (r3)+,r0
+ br e7a
+1:
+ rts pc
+
+op:
+ jsr pc,rval
+ mov (r5)+,(r4)+
+ rts r5
+
+rval:
+ tst val
+ bne 1f
+ mov $_rval,(r4)+
+ inc val
+1:
+ rts pc
+
+const:
+ mov r0,-(sp)
+ movf r1,-(sp)
+ tstf r0
+ cfcc
+ bne 1f
+ mov $_con0,(r4)+
+ br 2f
+1:
+ cmpf $one,r0
+ cfcc
+ bne 1f
+ mov $_con1,(r4)+
+ br 2f
+1:
+ movfi r0,r0
+ movif r0,r1
+ cmpf r0,r1
+ cfcc
+ bne 1f
+ mov $_intcon,(r4)+
+ mov r0,(r4)+
+ br 2f
+1:
+ mov $_const,(r4)+
+ movf r0,(r4)+
+2:
+ movf (sp)+,r1
+ mov (sp)+,r0
+ rts pc
+
+rlist:
+ clr -(sp)
+ cmpb (r3),$')
+ bne 1f
+ movb (r3)+,r0
+ br 2f
+1:
+ inc (sp)
+ jsr pc,expr
+ cmp r0,$',
+ beq 1b
+2:
+ mov (r5)+,(r4)+
+ mov (sp)+,(r4)+
+ rts r5
+
+/
+/
+/ bas3 -- execution
+
+execute:
+ mov $estack,r3
+ mov r3,sstack
+ jmp *(r4)+
+
+_if:
+ tstf (r3)+
+ cfcc
+ beq _tra
+ tst (r4)+
+ jmp *(r4)+
+
+_ptra:
+ mov sstack,r3
+
+_tra:
+ mov (r4)+,r4
+ jmp *(r4)+
+
+_funct:
+ mov r4,-(r3)
+ mov sstack,-(r3)
+ mov r3,sstack
+ inc sublev
+ clr r0
+ jsr pc,arg
+ tstf r0
+ cfcc
+ bge 1f
+ jmp builtin
+
+_goto:
+ movf (r3),r0
+1:
+ movfi r0,-(sp)
+ jsr pc,compile
+ mov (sp)+,r0
+ jsr pc,getloc
+ mov 4(r1),r4
+ jmp *(r4)+
+
+_run:
+ jsr pc,isymtab
+ mov randx,r0
+ jsr pc,srand
+ jsr pc,compile
+ mov $space,r4
+ jmp *(r4)+
+
+_save: / _save is a _list to the file named on the bas command
+ sys creat; argname; 666
+ bes 1f
+ mov r0,prfile
+ br 2f
+1:
+ mov 1f,r0
+ mov $1,prfile
+ jsr pc,print
+ br _done
+1: <Cannot create b.out\n\0>; .even
+
+_list:
+ mov $1,prfile
+2:
+ movf (r3)+,r0
+ movfi r0,-(sp)
+/ probably vistigal?? mov r3,0f
+ movf (r3),r0
+ movfi r0,lineno
+1:
+ jsr pc,nextlin
+ br 1f
+ cmp lineno,(sp)
+ bhi 1f
+ mov $line,r0
+ jsr pc,print
+ inc lineno
+ br 1b
+1:
+ cmp $1,prfile
+ beq 1f
+ mov prfile,r0
+ sys close
+ mov $1,prfile
+1:
+ tst (sp)+
+ jmp *(r4)+
+
+_done:
+ sys unlink; tmpf
+ sys exit
+
+.if scope / for plotting
+_sdisp:
+ mov $2,r0
+ jsr pc,drput
+ jsr pc,drxy
+ mov $1,r0
+ jsr pc,drput
+ mov $3,r0
+ jsr pc,drput
+ incb drflg
+ jmp *(r4)+
+
+_fdisp:
+ clr r0
+ jsr pc,drput
+ clrb drflg
+ jmp *(r4)+
+
+_draw:
+ movf (r3)+,r2
+ movf (r3)+,r1
+ movf (r3)+,r0
+ jsr r5,draw
+ jmp *(r4)+
+
+_erase:
+ mov $1,r0
+ jsr pc,drput
+ mov $1,r0
+ jsr pc,drput
+ jmp *(r4)+
+.endif
+
+_print:
+ movf (r3)+,r0
+ jsr r5,ftoa; xputc
+ jmp *(r4)+
+
+_octal:
+ movf (r3)+,r0
+ jsr r5,ftoo; xputc
+ jmp *(r4)+
+
+_nline:
+ mov $'\n,r0
+ jsr r5,xputc
+ jmp *(r4)+
+
+_ascii:
+ movb (r4)+,r0
+ cmp r0,$'"
+ beq 1f
+ jsr r5,xputc
+ br _ascii
+1:
+ inc r4
+ bic $1,r4
+ jmp *(r4)+
+
+_line:
+ mov sstack,r3
+ cmp r3,$stack+20.
+ bhi 1f
+ jsr r5,error
+ <out of space\n\0>; .even
+1:
+ mov (r4)+,lineno
+ jmp *(r4)+
+
+_or:
+ tstf (r3)+
+ cfcc
+ bne stone
+ tstf (r3)
+ cfcc
+ bne stone
+ br stzero
+
+_and:
+ tstf (r3)+
+ cfcc
+ beq stzero
+ tstf (r3)
+ cfcc
+ beq stzero
+ br stone
+
+_great:
+ jsr pc,bool
+ bgt stone
+ br stzero
+
+_greateq:
+ jsr pc,bool
+ bge stone
+ br stzero
+
+_less:
+ jsr pc,bool
+ blt stone
+ br stzero
+
+_lesseq:
+ jsr pc,bool
+ ble stone
+ br stzero
+
+_noteq:
+ jsr pc,bool
+ bne stone
+ br stzero
+
+_equal:
+ jsr pc,bool
+ beq stone
+
+stzero:
+ clrf r0
+ br advanc
+
+stone:
+ movf $one,r0
+ br advanc
+
+_extr:
+ movf r1,r0 / dup for _and in extended rel
+ br subadv
+
+_asgn:
+ movf (r3)+,r0
+ mov (r3)+,r0
+ add $4,r0
+ bis $1,(r0)+
+ movf r0,(r0)
+ br subadv
+
+_add:
+ movf (r3)+,r0
+ addf (r3),r0
+ br advanc
+
+_sub:
+ movf (r3)+,r0
+ negf r0
+ addf (r3),r0
+ br advanc
+
+_mult:
+ movf (r3)+,r0
+ mulf (r3),r0
+ br advanc
+
+_divid:
+ movf (r3)+,r1
+ movf (r3),r0
+ divf r1,r0
+ br advanc
+
+_expon:
+ movf (r3)+,fr1
+ movf (r3),fr0
+ jsr pc,pow
+ bec advanc
+ jsr r5,error
+ <Bad exponentiation\n\0>; .even
+
+_neg: / unary -
+ negf r0
+ jbr advanc
+/ end of _neg
+
+_intcon:
+ movif (r4)+,r0
+ jbr subadv
+
+_con0:
+ clrf r0
+ jbr subadv
+
+_con1:
+ movf $one,r0
+ jbr subadv
+
+_const:
+ movf (r4)+,r0
+
+subadv:
+ movf r0,-(r3)
+ jmp *(r4)+
+
+advanc:
+ movf r0,(r3)
+ jmp *(r4)+
+
+_rval:
+ jsr pc,getlv
+ br subadv
+
+_fori:
+ jsr pc,getlv
+ addf $one,r0
+ movf r0,(r0)
+ br subadv
+
+_lval:
+ mov (r4)+,-(r3)
+ jmp *(r4)+
+
+_dup:
+ movf (r3),r0
+ br subadv
+
+_return:
+ dec sublev
+ bge 1f
+ jsr r5,error
+ <bad return\n\0>; .even
+1:
+ movf (r3),r0
+ mov sstack,r3
+ mov (r3)+,sstack
+ mov (r3)+,r4
+ mov (r4)+,r0
+1:
+ dec r0
+ blt advanc
+ add $8,r3
+ br 1b
+
+_subscr:
+ mov (r4),r1
+ mpy $8.,r1
+ add r1,r3
+ mov r3,-(sp)
+ mov (r3),r0
+ mov (r4)+,-(sp)
+1:
+ dec (sp)
+ blt 1f
+ movf -(r3),r0
+ movfi r0,r2
+ com r2
+ blt 2f
+ jsr r5,error
+ <subscript out of range\n\0>; .even
+2:
+ mov r0,r1
+ mov 4(r0),r0
+ bic $1,r0
+2:
+ beq 2f
+ cmp r2,(r0)+
+ bne 3f
+ tst -(r0)
+ br 1b
+3:
+ mov (r0),r0
+ br 2b
+2:
+ mov $symtab,r0
+2:
+ tst (r0)
+ beq 2f
+ add $14.,r0
+ br 2b
+2:
+ cmp r0,$esymtab-28.
+ blo 2f
+ jsr r5,error
+ <out of symbol space\n\0>; .even
+2:
+ cmp (r1)+,(r1)+
+ mov r0,-(sp)
+ clr 14.(r0)
+ mov r2,(r0)+
+ mov (r1),r2
+ bic $1,r2
+ mov r2,(r0)+
+ clr (r0)+
+ mov (sp)+,r0
+ bic $!1,(r1)
+ bis r0,(r1)
+ br 1b
+1:
+ tst (sp)+
+ mov (sp)+,r3
+ mov r0,(r3)
+ jmp *(r4)+
+
+bool:
+ movf (r3)+,r1 / r1 used in extended rel
+ cmpf (r3),r1
+ cfcc
+ rts pc
+
+getlv:
+ mov (r3)+,r0
+ add $4,r0
+ bit $1,(r0)+
+ bne 1f
+ jsr r5,error;<used before set\n\0>; .even
+1:
+ movf (r0),r0
+ rts pc
+
+/
+/
+
+/ bas4 -- builtin functions
+
+builtin:
+ dec sublev
+ mov (r3)+,sstack
+ mov (r3)+,r4
+ movfi r0,r0
+ com r0
+ asl r0
+ cmp r0,$2f-1f
+ bhis 2f
+ jmp *1f(r0)
+1:
+ fnarg
+ fnexp
+ fnlog
+ fnsin
+ fncos
+ fnatan
+ fnrand
+ fnexpr
+ fnint
+ fnabs
+ fnsqr
+2:
+ mov $-1,r0
+ jsr pc,getloc / label not found diagnostic
+
+fnarg:
+ cmp (r4)+,$1
+ bne narg
+ movf (r3),r0
+ movfi r0,r0
+ jsr pc,arg
+ br fnadvanc
+
+fnexp:
+ jsr r5,fnfn; exp
+ br fnadvanc
+
+fnlog:
+ jsr r5,fnfn; log
+ bec fnadvanc
+ jsr r5,error
+ <Bad log\n\0>; .even
+
+fnsin:
+ jsr r5,fnfn; sin
+ bec fnadvanc
+ jsr r5,error
+ <Bad sine\n\0>; .even
+
+fncos:
+ jsr r5,fnfn; cos
+ bec fnadvanc
+ jsr r5,error
+ <Bad cosine\n\0>; .even
+
+fnatan:
+ jsr r5,fnfn; atan
+ bec fnadvanc
+ jsr r5,error
+ <Bad arctangent\n\0>; .even
+
+fnrand:
+ tst (r4)+
+ bne narg
+ jsr pc,rand
+ movif r0,r0
+ divf $44000,r0
+ jmp advanc
+
+fnexpr:
+ tst (r4)+
+ bne narg
+ mov r3,-(sp)
+ mov r4,-(sp)
+ jsr pc,rdline
+ mov exprloc,r4
+ mov $line,r3
+ jsr pc,expr
+ mov $_tra,(r4)+
+ mov (sp)+,(r4)+
+ mov (sp)+,r3
+ mov exprloc,r4
+ add $8,r3
+ jmp *(r4)+
+
+fnint:
+ cmp (r4)+,$1
+ bne narg
+ movf (r3),r0
+ modf $one,r0
+ movf r1,r0
+ br fnadvanc
+
+fnabs:
+ cmp (r4)+,$1
+ bne narg
+ movf (r3),r0
+ cfcc
+ bge fnadvanc
+ negf r0
+ br fnadvanc
+
+fnsqr:
+ jsr r5,fnfn; sqrt
+ bec fnadvanc
+ jsr r5,error
+ <Bad square root arg\n\0>; .even
+fnadvanc:
+ add $8,r3
+ jmp advanc
+
+narg:
+ jsr r5,error
+ <arg count\n\0>; .even
+
+arg:
+ tst sublev
+ beq 1f
+ mov sstack,r1
+ sub *2(r1),r0
+ bhi 1f
+2:
+ inc r0
+ bgt 2f
+ add $8,r1
+ br 2b
+2:
+ movf 4(r1),r0
+ rts pc
+1:
+ jsr r5,error
+ <bad arg\n\0>; .even
+
+fnfn:
+ cmp (r4)+,$1
+ bne narg
+ movf (r3),r0
+ jsr pc,*(r5)+
+ rts r5
+
+.if scope / for plotting
+draw:
+ tstf r2
+ cfcc
+ bne 1f
+ movf r0,drx
+ movf r1,dry
+ rts r5
+1:
+ movf r0,-(sp)
+ movf r1,-(sp)
+ mov $3,r0
+ jsr pc,drput
+ jsr pc,drxy
+ movf (sp)+,r0
+ movf r0,dry
+ movf (sp)+,r0
+ movf r0,drx
+ jsr pc,drxy
+ rts r5
+
+drxy:
+ movf drx,r0
+ jsr pc,drco
+ movf dry,r0
+
+drco:
+ tstf r0
+ cfcc
+ bge 1f
+ clrf r0
+1:
+ cmpf $40200,r0 / 1.0
+ cfcc
+ bgt 1f
+ movf $40177,r0 / 1.0-eps
+1:
+ subf $40000,r0 / .5
+ mulf $43200,r0 / 4096
+ movfi r0,r0
+ mov r0,-(sp)
+ jsr pc,drput
+ mov (sp)+,r0
+ swab r0
+
+drput:
+ movb r0,ch
+ mov drfo,r0
+ bne 1f
+ sys open; vt; 1
+ bec 2f
+ 4
+2:
+ mov r0,drfo
+1:
+ sys write; ch; 1
+ rts pc
+
+.endif
+/ bas4 -- old library routines
+atoi:
+ clr r1
+ jsr r5,nextc
+ clr -(sp)
+ cmp r0,$'-
+ bne 2f
+ inc (sp)
+1:
+ jsr r5,nextc
+2:
+ sub $'0,r0
+ cmp r0,$9
+ bhi 1f
+ mpy $10.,r1
+ bcs 3f / >32k
+ add r0,r1
+ bcs 3f / >32k
+ br 1b
+1:
+ add $'0,r0
+ tst (sp)+
+ beq 1f
+ neg r1
+1:
+ rts r5
+3:
+ tst (sp)+
+ mov $'.,r0 / faking overflow
+ br 1b
+
+ldfps = 170100^tst
+stfps = 170200^tst
+atof:
+ stfps -(sp)
+ ldfps $200
+ movf fr1,-(sp)
+ mov r1,-(sp)
+ mov r2,-(sp)
+ clr -(sp)
+ clrf fr0
+ clr r2
+ jsr r5,*(r5)
+ cmpb r0,$'-
+ bne 2f
+ inc (sp)
+1:
+ jsr r5,*(r5)
+2:
+ sub $'0,r0
+ cmp r0,$9.
+ bhi 2f
+ jsr pc,dig
+ br 1b
+ inc r2
+ br 1b
+2:
+ cmpb r0,$'.-'0
+ bne 2f
+1:
+ jsr r5,*(r5)
+ sub $'0,r0
+ cmp r0,$9.
+ bhi 2f
+ jsr pc,dig
+ dec r2
+ br 1b
+2:
+ cmpb r0,$'e-'0
+ bne 1f
+ jsr r5,atoi
+ sub $'0,r0
+ add r1,r2
+1:
+ movf $one,fr1
+ mov r2,-(sp)
+ beq 2f
+ bgt 1f
+ neg r2
+1:
+ cmp r2,$38.
+ blos 1f
+ clrf fr0
+ tst (sp)+
+ bmi out
+ movf $huge,fr0
+ br out
+1:
+ mulf $ten,fr1
+ sob r2,1b
+2:
+ tst (sp)+
+ bge 1f
+ divf fr1,fr0
+ br 2f
+1:
+ mulf fr1,fr0
+ cfcc
+ bvc 2f
+ movf $huge,fr0
+2:
+out:
+ tst (sp)+
+ beq 1f
+ negf fr0
+1:
+ add $'0,r0
+ mov (sp)+,r2
+ mov (sp)+,r1
+ movf (sp)+,fr1
+ ldfps (sp)+
+ tst (r5)+
+ rts r5
+
+dig:
+ cmpf $big,fr0
+ cfcc
+ blt 1f
+ mulf $ten,fr0
+ movif r0,fr1
+ addf fr1,fr0
+ rts pc
+1:
+ add $2,(sp)
+ rts pc
+
+one = 40200
+ten = 41040
+big = 56200
+huge = 77777
+
+.globl _ndigits
+.globl ecvt
+.globl fcvt
+
+ftoa:
+ jsr pc,ecvt
+ mov r0,bufptr
+ tstb r1
+ beq 1f
+ mov $'-,r0
+ jsr r5,*(r5)
+1:
+ cmp r3,$-2
+ blt econ
+ cmp r2,$-5
+ ble econ
+ cmp r2,$6
+ bgt econ
+ jsr pc,cout
+ tst (r5)+
+ rts r5
+
+econ:
+ mov r2,-(sp)
+ mov $1,r2
+ jsr pc,cout
+ mov $'e,r0
+ jsr r5,*(r5)
+ mov (sp)+,r0
+ dec r0
+ jmp itoa
+
+cout:
+ mov bufptr,r1
+ add _ndigits,r1
+ mov r2,-(sp)
+ add bufptr,r2
+1:
+ cmp r1,r2
+ blos 1f
+ cmpb -(r1),$'0
+ beq 1b
+ inc r1
+1:
+ mov (sp)+,r2
+ bge 2f
+ mov $'.,r0
+ jsr r5,*(r5)
+1:
+ mov $'0,r0
+ jsr r5,*(r5)
+ inc r2
+ blt 1b
+ dec r2
+2:
+ mov r2,-(sp)
+ mov bufptr,r2
+1:
+ cmp r2,r1
+ bhis 1f
+ tst (sp)
+ bne 2f
+ mov $'.,r0
+ jsr r5,*(r5)
+2:
+ dec (sp)
+ movb (r2)+,r0
+ jsr r5,*(r5)
+ br 1b
+1:
+ tst (sp)+
+ rts pc
+
+.bss
+bufptr: .=.+2
+.text
+
+ftoo:
+ stfps -(sp)
+ ldfps $200
+ mov r1,-(sp)
+ mov r2,-(sp)
+ mov $buf,r1
+ movf fr0,(r1)+
+ mov $buf,r2
+ br 2f
+1:
+ cmp r2,r1
+ bhis 1f
+ mov $';,r0
+ jsr r5,*(r5)
+2:
+ mov (r2)+,r0
+ jsr pc,oct
+ br 1b
+1:
+ mov $'\n,r0
+ jsr pc,*(r5)+
+ ldfps (sp)+
+ rts r5
+
+oct:
+ mov r0,x+2
+ setl
+ movif x,fr0
+ mulf $small,fr0
+ seti
+ mov $6.,-(sp)
+1:
+ modf $eight,fr0
+ movfi fr1,r0
+ add $'0,r0
+ jsr r5,*(r5)
+ dec (sp)
+ bne 1b
+ tst (sp)+
+ rts pc
+
+eight = 41000
+small = 33600
+.bss
+buf: .=.+8
+x: .=.+4
+.text
+
+itoa:
+ mov r1,-(sp)
+ mov r0,r1
+ bge 1f
+ neg r1
+ mov $'-,r0
+ jsr r5,*(r5)
+1:
+ jsr pc,1f
+ mov (sp)+,r1
+ tst (r5)+
+ rts r5
+
+1:
+ clr r0
+ dvd $10.,r0
+ mov r1,-(sp)
+ mov r0,r1
+ beq 1f
+ jsr pc,1b
+1:
+ mov (sp)+,r0
+ add $'0,r0
+ jsr r5,*(r5)
+ rts pc
+/ bas -- BASIC
+/ new command "dump" which dumps symbol table values by name
+/ R. Haight
+/
+_dump:
+ mov r4,-(sp)
+ mov $11.*14.+symtab-14.,r4
+1:
+ add $14.,r4
+ tst (r4)
+ beq 1f
+ bit $1,4(r4)
+ beq 1b
+ jsr pc,dmp1
+ mov $'=,r0
+ jsr r5,xputc
+ movf 6(r4),r0
+ jsr r5,ftoa; xputc
+ mov $'\n,r0
+ jsr r5,xputc
+ br 1b
+1:
+ mov (sp)+,r4
+ jmp *(r4)+
+
+dmp1:
+ tst (r4)
+ blt 1f
+ mov (r4),nameb
+ mov 2(r4),nameb+2
+ mov $nameb,r0
+ jsr pc,print
+ rts pc
+1:
+ mov r4,-(sp)
+ mov $symtab-14.,r4
+1:
+ add $14.,r4
+ tst (r4)
+ beq 1f
+ mov 4(r4),r0
+ bic $1,r0
+2:
+ beq 1b
+ cmp r0,(sp)
+ beq 2f
+ mov 2(r0),r0
+ br 2b
+2:
+ jsr pc,dmp1
+ mov $'[,r0
+ jsr r5,xputc
+ mov *(sp),r0
+ com r0
+ movif r0,r0
+ jsr r5,ftoa; xputc
+ mov $'],r0
+ jsr r5,xputc
+1:
+ mov (sp)+,r4
+ rts pc
+/
+/
+
+/ basx -- data
+
+one = 40200
+
+.data
+
+_ndigits:10.
+tmpf: </tmp/btma\0>
+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>
+vt: </dev/vt0\0>
+.even
+pname: <\0\0\0\0\0\0>
+ .even
+
+resnam:
+ <list>
+ <done>
+ <q\0\0\0>
+ <run\0>
+ <prin>
+ <prom> / prompt is like print without \n (cr)
+ <if\0\0>
+ <goto>
+ <retu>
+ <for\0>
+ <next>
+ <octa>
+ <save>
+ <dump>
+ <fi\0\0>
+ <else>
+ <edit>
+ <comm> / comment
+.if scope / for plotting
+ <disp>
+ <draw>
+ <eras>
+.endif
+eresnam:
+
+symtnam:
+ <arg\0>
+ <exp\0>
+ <log\0>
+ <sin\0>
+ <cos\0>
+ <atn\0>
+ <rnd\0>
+ <expr>
+ <int\0>
+ <abs\0>
+ <sqr\0>
+esymtnam:
+
+/ indirect sys calls:
+sysseek: sys seek; seekx: 0; 0
+syswrit: sys write; wbuf: 0; wlen: 0
+sysread: sys read; rbuf: 0; rlen: 0
+sysopen: sys open; ofile: 0 ; omode: 0
+syscreat: sys creat; cfile: 0; cmode: 0
+.bss
+drx: .=.+8
+dry: .=.+8
+drfo: .=.+2
+ch: .=.+2
+drflg: .=.+2
+randx: .=.+2
+gsp: .=.+2
+forp: .=.+2
+exprloc:.=.+2
+sstack: .=.+2
+sublev: .=.+2
+val: .=.+2
+splimit: .=.+2 / statement size limit
+iflev: .=.+20. / nested if compile stack: 10 deep
+ifp: .=.+2 / current pointer to iflev
+line: .=.+100.
+prfile: .=.+2 / output from _list or _save
+tfi: .=.+2 / input file
+func: .=.+2 / alternate functions, eg: _list or _save
+seeka: .=.+2 / seek offset 1
+lineno: .=.+2
+nameb: .=.+4
+tfo: .=.+2
+symtab: .=.+2800.; esymtab: / symbol=7wds; symtab for 200
+space: .=.+8000.; espace: / code space
+exline: .=.+1000.; eexline: / line execute space
+lintab: .=.+1800.; elintab: / 3wds per statement = 300 stmts
+stack: .=.+800.; estack:
+
+iobuf: fi: .=.+518. / should be aquired??