+/
+/ copyright 1972 bell telephone laboratories inc.
+/
+
+/ 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:
+ mov argname,0f
+ sys 0; 9f
+.data
+9:
+ sys creat; 0:..; 0666
+.text
+ bec 1f
+ 4
+1:
+ mov r0,fo
+
+_list:
+ movf (r3)+,r0
+ movfi r0,-(sp)
+ 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:
+ tst (sp)+
+ mov fo,r0
+ cmp r0,$1
+ beq 1f
+ sys close
+ mov $1,fo
+1:
+ jmp *(r4)+
+
+_done:
+ sys unlink; tmpf
+ sys exit
+
+_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)+
+
+_print:
+ movf (r3)+,r0
+ jsr r5,ftoa; putc
+ jmp *(r4)+
+
+_octal:
+ movf (r3)+,r0
+ jsr r5,ftoo; putc
+ 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)+
+
+_nline:
+ mov $'\n,r0
+ jsr r5,putc
+ jmp *(r4)+
+
+_ascii:
+ movb (r4)+,r0
+ cmp r0,$'"
+ beq 1f
+ jsr r5,putc
+ 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
+
+_negat:
+ negf (r3)
+ jmp *(r4)+
+
+_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 r5,pow
+ bec advanc
+ jsr r5,error
+ <Bad exponentiation\n\0>; .even
+
+_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
+
+_dump:
+ mov r4,-(sp)
+ mov $9.*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,putc
+ movf 6(r4),r0
+ jsr r5,ftoa; putc
+ mov $'\n,r0
+ jsr r5,putc
+ 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,putc
+ mov *(sp),r0
+ com r0
+ movif r0,r0
+ jsr r5,ftoa; putc
+ mov $'],r0
+ jsr r5,putc
+1:
+ mov (sp)+,r4
+ rts pc