MiniUnix/usr/source/s1/bas.s
/
/
/ 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??