Research V7 development
[unix-history] / usr / src / cmd / bas / bas.s
CommitLineData
95af7ab2
KT
1/
2/
3
4/ bas0 -- basic
5
6scope = 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
13indir = 0 /for indirect sys calls. (not in as)
14one = 40200
15
16main:
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
291:
30 mov sp,gsp
31 clr seeka
32 mov $'a,r1
331:
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
411:
42 sys creat; tmpf; 600
43 bes 2f
44 mov r0,tfo
45 sys open; tmpf; 0
46 bec 1f
472:
48 mov $3f,r0
49 jsr pc,print
50 sys exit
513:
52 <Tmp file?\n\0>; .even
531:
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
611:
62 movb (r0)+,(r1)+
63 bne 1b
64aftered: / after edit
65 mov $argname,r0
66 jsr r5,fopen; iobuf
67 bes 1f
68noarg:
69 jsr pc,isymtab
70 br loop
711:
72 mov $1f,r0
73 jsr pc,print
74 br loop
751:
76 <Cannot open file\n\0>; .even
77
78intrup:
79 sys signal; 2; intrup
80 mov $'\n,r0
81 jsr r5,xputc
82 jsr r5,error
83 <ready\n\0>; .even
84
85loop:
86 mov gsp,sp
87 clr lineno
88 jsr pc,rdline
89 mov $line,r3
901:
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
993:
100 mov $lintab,r3
101 mov r1,r0
102 bgt 2f
103 jsr pc,serror
1042:
105 cmp r0,(r3)
106 beq 2f
107 tst (r3)
108 beq 2f
109 add $6,r3
110 br 2b
1112:
112 cmp r3,$elintab-12.
113 blo 2f
114 jsr r5,error
115 <too many lines\n\0>; .even
1162:
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
1311:
132 mov $line,r3
133 jsr pc,singstat
134 br loop
135
136nextc:
137 movb (r3)+,r0
138 rts r5
139
140size:
141 clr -(sp)
1421:
143 inc (sp)
144 cmpb (r0),$'\n
145 beq 1f
146 cmpb (r0),$0
147 beq 1f
148 inc r0
149 br 1b
1501:
151 mov (sp)+,r0
152 rts pc
153
154rdline: / read input (file or tty) to carr. ret.
155 mov $line,r1
1561:
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
1682:
169 mov fi,r0
170 beq 1f
171 sys close
172 clr fi
173 br 1b
1741:
175 jmp _done
176
177error:
178 tst fi
179 beq 1f
180 sys close
181 clr fi
1821:
183 tst lineno
184 beq 1f
185 jsr pc,nextlin
186 br 1f
187 mov $line,r0
188 jsr pc,print
1891:
190 mov r5,r0
191 jsr pc,print
192 jmp loop
193
194serror:
195 dec r3
196 tst fi
197 beq 1f
198 sys close
199 clr fi
2001:
201 mov $line,r1
2021:
203 cmp r1,r3
204 bne 2f
205 mov $'_,r0
206 jsr r5,xputc
207 mov $10,r0
208 jsr r5,xputc
2092:
210 movb (r1),r0
211 jsr r5,xputc
212 cmpb (r1)+,$'\n
213 bne 1b
214 jmp loop
215
216print:
217 mov r0,wbuf
218 jsr pc,size
219 mov r0,wlen
220 mov prfile,r0
221 sys indir; syswrit
222 rts pc
223
224digit:
225 cmp r0,$'0
226 blo 1f
227 cmp r0,$'9
228 bhi 1f
229 add $2,(sp)
2301:
231 rts pc
232
233alpha:
234 cmp r0,$'a
235 blo 1f
236 cmp r0,$'z
237 bhi 1f
238 add $2,(sp)
2391:
240 cmp r0,$'A
241 blo 1f
242 cmp r0,$'Z
243 bhi 1f
244 add $2,(sp)
2451:
246 rts pc
247
248name:
249 mov $nameb,r1
250 clr (r1)
251 clr 2(r1)
2521:
253 cmp r1,$nameb+4
254 bhis 2f
255 movb r0,(r1)+
2562:
257 movb (r3)+,r0
258 jsr pc,alpha
259 br 2f
260 br 1b
2612:
262 jsr pc,digit
263 br 2f
264 br 1b
2652:
266 mov $resnam,r1
2671:
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
2762:
277 add $4,r1
278 cmp r1,$eresnam
279 blo 1b
280 mov $symtab,r1
2811:
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
2892:
290 add $14.,r1
291 br 1b
2921:
293 cmp r1,$esymtab-28.
294 blo 1f
295 jsr r5,error
296 <out of symbol space\n\0>; .even
2971:
298 mov nameb,(r1)
299 mov nameb+2,2(r1)
300 clr 4(r1)
301 clr 14.(r1)
302 rts pc
303
304skip:
305 cmp r0,$' /
306 beq 1f
307 cmp r0,$' / tab
308 bne 2f
3091:
310 movb (r3)+,r0
311 br skip
3122:
313 rts pc
314
315xputc:
316.if scope / for plotting
317 tstb drflg
318 beq 1f
319 jsr pc,drput
320 rts r5
3211:
322.endif
323 mov r0,ch
324 mov $1,r0
325 sys write; ch; 1
326 rts r5
327
328nextlin:
329 clr -(sp)
330 mov $lintab,r1
3311:
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
3403:
341 mov r1,(sp)
3422:
343 add $6,r1
344 br 1b
3451:
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)
3551:
356 rts pc
357
358getloc:
359 mov $lintab,r1
3601:
361 tst (r1)
362 beq 1f
363 cmp r0,(r1)
364 beq 2f
365 add $6,r1
366 br 1b
3671:
368 jsr r5,error
369 <label not found\n\0>; .even
3702:
371 rts pc
372
373isymtab:
374 mov $symtab,r0
375 mov $symtnam,r1
376 clrf fr0
377 movf $one,fr1
3781:
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
398compile:
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
4051:
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
4181:
419 tst forp
420 jne forer
421 cmp ifp,$iflev
422 jne fier /hanging if..fi
423 mov $loop,(r4)+
424 rts pc
425
426singstat:
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)+
4361:
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
4431:
444 mov $loop,(r4)+
445 mov r4,exprloc
446 mov $exline,r4
447 jmp execute
448
449statement:
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
4631:
464 mov $_line,(r4)+
465 mov r1,(r4)+
466
467stat1:
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)
4812:
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
5061:
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
515stsave:
516 mov $_save,func
517 br 1f
518
519stlist:
520 mov $_list,func
5211:
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
5291:
530 jsr pc,expr
531 cmp r0,$'\n
532 bne 1f
533 mov $_dup,(r4)+
534 br 2f
5351:
536 dec r3
537 jsr pc,expr
538 cmp r0,$'\n
539 jne joe
5402:
541 mov func,(r4)+
542 rts pc
543
544stdone:
545 cmp r0,$'\n
546 jne joe
547 mov $_done,(r4)+
548 rts pc
549
550strun:
551 cmp r0,$'\n
552 jne joe
553 mov $_run,(r4)+
554 rts pc
555
556
557stprompt:
558 clr -(sp)
559 br stpr2
560
561stdump:
562 cmp r0,$'\n
563 jne joe
564 mov $_dump,(r4)+
565 rts pc
566
567stprint:
568 mov pc,-(sp)
569stpr2:
570 movb (r3)+,r0
571 jsr pc,skip
5721:
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
5811:
582 mov $_ascii,(r4)+
5831:
584 movb (r3)+,(r4)
585 cmpb (r4),$'"
586 beq 1f
587 cmpb (r4)+,$'\n
588 bne 1b
589 jbr joe
5901:
591 add $2,r4
592 bic $1,r4
593 br stpr2
5942:
595 tst (sp)+
596 beq 1f
597 mov $_nline,(r4)+
5981:
599 rts pc
600
601stif:
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
612stfi:
613 sub $2,ifp
614 cmp ifp,$iflev
615 jlo fier
616 mov *ifp,r1 /for jump around if
617 mov r4,(r1)
6181:
619 rts pc
620
621fier:
622 jsr r5,error; <if...else...fi imbalance\n\0>; .even
623
624stelse:
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
637stedit: / enter the regular editor <ed>
638 sys fork
639 br newpr
640 mov $lintab,r0 / zero out line table during edit
6411:
642 cmp r0,$elintab /done
643 beq 1f
644 mov $0,(r0)+
645 br 1b
6461:
647 sys unlink; tmpf
648 sys wait
649 jmp aftered / start over
650newpr:
651 sys exec; ed; edarg
652 sys exit
653ed: </bin/ed\0> ; .even
654ednm: <-\n>
655 .even
656edarg: ednm; argname; 0
657
658stcomment: /comment line
659 cmp r0,$'\n
660 beq 1f
661 movb (r3)+,r0
662 br stcomment
6631:
664 rts pc
665stgoto:
666 jsr pc,expr
667 mov $_goto,(r4)+
668 rts pc
669
670streturn:
671 cmp r0,$'\n
672 beq 1f
673 jsr pc,expr
674 cmp r0,$'\n
675 bne joe
676 br 2f
6771:
678 clrf r0
679 jsr pc,const
6802:
681 mov $_return,(r4)+
682 rts pc
683
684joe:
685 jsr pc,serror
686
687stfor:
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
7011:
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
7201:
721 rts pc
722
723forer:
724 jsr r5,error; <for/next imbalance\n\0>; .even
725
726stnext:
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
738stoctl:
739 jsr pc,expr
740 mov $_octal,(r4)+
741 rts pc
742
743.if scope / for plotting
744stdisp:
745 mov $_sdisp,(r4)+
746 jsr pc,stprint
747 mov $_fdisp,(r4)+
748 rts pc
749stdraw:
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
7581:
759 dec r3
760 jsr pc,expr
7612:
762 mov $_draw,(r4)+
763 rts pc
764
765steras:
766 mov $_erase,(r4)+
767 rts pc
768.endif
769
770/
771/
772
773/ bas2 -- expression evaluation
774
775expr:
776 jsr pc,e1
777 jsr pc,rval
778 rts pc
779
780/ assignment right to left
781e1:
782 jsr pc,e2
783 cmp r0,$'=
784 beq 1f
785 jsr pc,rval
786 rts pc
7871:
788 tst val
789 beq 1f
790 jsr pc,serror
7911:
792 jsr pc,e1
793 jsr r5,op; _asgn
794 rts pc
795
796/ and or left to right
797e2:
798 jsr pc,e3
7991:
800 cmp r0,$'&
801 beq 2f
802 cmp r0,$'|
803 beq 3f
804 rts pc
8052:
806 jsr pc,rval
807 jsr pc,e3
808 jsr r5,op; _and
809 br 1b
8103:
811 jsr pc,rval
812 jsr pc,e3
813 jsr r5,op; _or
814 br 1b
815
816/ relation extended relation
817e3:
818 jsr pc,e4
819 jsr pc,e3a
820 rts pc
821 clr -(sp)
8221:
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
8321:
833 dec (sp)
834 blt 1f
835 mov $_and,(r4)+
836 br 1b
8371:
838 tst (sp)+
839 rts pc
840
841/ relational operator
842e3a:
843 cmp r0,$'>
844 beq 1f
845 cmp r0,$'<
846 beq 2f
847 cmp r0,$'=
848 beq 3f
849 rts pc
8501:
851 mov $_great,r0
852 cmpb (r3),$'=
853 bne 1f
854 inc r3
855 mov $_greateq,r0
856 br 1f
8572:
858 cmpb (r3),$'>
859 bne 2f
860 inc r3
861 mov $_noteq,r0
862 br 1f
8632:
864 mov $_less,r0
865 cmpb (r3),$'=
866 bne 1f
867 inc r3
868 mov $_lesseq,r0
869 br 1f
8703:
871 cmpb (r3),$'=
872 beq 2f
873 rts pc
8742:
875 inc r3
876 mov $_equal,r0
8771:
878 jsr pc,rval
879 add $2,(sp)
880 rts pc
881
882/ add subtract
883e4:
884 jsr pc,e5
8851:
886 cmp r0,$'+
887 beq 2f
888 cmp r0,$'-
889 beq 3f
890 rts pc
8912:
892 jsr pc,rval
893 jsr pc,e5
894 jsr r5,op; _add
895 br 1b
8963:
897 jsr pc,rval
898 jsr pc,e5
899 jsr r5,op; _sub
900 br 1b
901
902/ multiply divide
903e5:
904 jsr pc,e6
9051:
906 cmp r0,$'*
907 beq 2f
908 cmp r0,$'/
909 beq 3f
910 rts pc
9112:
912 jsr pc,rval
913 jsr pc,e6
914 jsr r5,op; _mult
915 br 1b
9163:
917 jsr pc,rval
918 jsr pc,e6
919 jsr r5,op; _divid
920 br 1b
921
922/ exponential
923e6:
924 jsr pc,e6a
9251:
926 cmp r0,$'^
927 beq 2f
928 rts pc
9292:
930 jsr pc,rval
931 jsr pc,e6a
932 jsr r5,op; _expon
933 br 1b
934
935e6a:
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
9431:
944 dec r3
945 jsr pc,e7
946 rts pc
947/ end of unary -
948
949/ primary
950e7:
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
9612:
962 jsr pc,serror
9631:
964 cmp r0,$'.
965 beq 2f
966 jsr pc,digit
967 br 1f
9682:
969 dec r3
970 jsr r5,atof; nextc
971 jsr pc,const
972 br e7a
9731:
974 jsr pc,alpha
975 br jim
976 jsr pc,name
977 br 2f
978 jsr r5,error; <reserved name\n\0>; .even
9792:
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
988jim:
989 jsr pc,serror
990
991e7a:
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
10011:
1002 cmp r0,$'[
1003 bne 1f
1004 tst val
1005 beq 2f
1006 jsr pc,serror
10072:
1008 jsr r5,rlist; _subscr
1009 clr val
1010 cmp r0,$']
1011 bne jim
1012 movb (r3)+,r0
1013 br e7a
10141:
1015 rts pc
1016
1017op:
1018 jsr pc,rval
1019 mov (r5)+,(r4)+
1020 rts r5
1021
1022rval:
1023 tst val
1024 bne 1f
1025 mov $_rval,(r4)+
1026 inc val
10271:
1028 rts pc
1029
1030const:
1031 mov r0,-(sp)
1032 movf r1,-(sp)
1033 tstf r0
1034 cfcc
1035 bne 1f
1036 mov $_con0,(r4)+
1037 br 2f
10381:
1039 cmpf $one,r0
1040 cfcc
1041 bne 1f
1042 mov $_con1,(r4)+
1043 br 2f
10441:
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
10531:
1054 mov $_const,(r4)+
1055 movf r0,(r4)+
10562:
1057 movf (sp)+,r1
1058 mov (sp)+,r0
1059 rts pc
1060
1061rlist:
1062 clr -(sp)
1063 cmpb (r3),$')
1064 bne 1f
1065 movb (r3)+,r0
1066 br 2f
10671:
1068 inc (sp)
1069 jsr pc,expr
1070 cmp r0,$',
1071 beq 1b
10722:
1073 mov (r5)+,(r4)+
1074 mov (sp)+,(r4)+
1075 rts r5
1076
1077/
1078/
1079/ bas3 -- execution
1080
1081execute:
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
11141:
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
11351:
1136 mov 1f,r0
1137 mov $1,prfile
1138 jsr pc,print
1139 br _done
11401: <Cannot create b.out\n\0>; .even
1141
1142_list:
1143 mov $1,prfile
11442:
1145 movf (r3)+,r0
1146 movfi r0,-(sp)
1147/ probably vistigal?? mov r3,0f
1148 movf (r3),r0
1149 movfi r0,lineno
11501:
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
11591:
1160 cmp $1,prfile
1161 beq 1f
1162 mov prfile,r0
1163 sys close
1164 mov $1,prfile
11651:
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
12271:
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
12381:
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
1289stzero:
1290 clrf r0
1291 br advanc
1292
1293stone:
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
1359subadv:
1360 movf r0,-(r3)
1361 jmp *(r4)+
1362
1363advanc:
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
13901:
1391 movf (r3),r0
1392 mov sstack,r3
1393 mov (r3)+,sstack
1394 mov (r3)+,r4
1395 mov (r4)+,r0
13961:
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)
14091:
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
14182:
1419 mov r0,r1
1420 mov 4(r0),r0
1421 bic $1,r0
14222:
1423 beq 2f
1424 cmp r2,(r0)+
1425 bne 3f
1426 tst -(r0)
1427 br 1b
14283:
1429 mov (r0),r0
1430 br 2b
14312:
1432 mov $symtab,r0
14332:
1434 tst (r0)
1435 beq 2f
1436 add $14.,r0
1437 br 2b
14382:
1439 cmp r0,$esymtab-28.
1440 blo 2f
1441 jsr r5,error
1442 <out of symbol space\n\0>; .even
14432:
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
14561:
1457 tst (sp)+
1458 mov (sp)+,r3
1459 mov r0,(r3)
1460 jmp *(r4)+
1461
1462bool:
1463 movf (r3)+,r1 / r1 used in extended rel
1464 cmpf (r3),r1
1465 cfcc
1466 rts pc
1467
1468getlv:
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
14741:
1475 movf (r0),r0
1476 rts pc
1477
1478/
1479/
1480
1481/ bas4 -- builtin functions
1482
1483builtin:
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)
14931:
1494 fnarg
1495 fnexp
1496 fnlog
1497 fnsin
1498 fncos
1499 fnatan
1500 fnrand
1501 fnexpr
1502 fnint
1503 fnabs
1504 fnsqr
1505 fnlast
15062:
1507 mov $-1,r0
1508 jsr pc,getloc / label not found diagnostic
1509
1510fnarg:
1511 cmp (r4)+,$1
1512 jne narg
1513 movf (r3),r0
1514 movfi r0,r0
1515 jsr pc,arg
1516 br fnadvanc
1517
1518fnexp:
1519 jsr r5,fnfn; exp
1520 br fnadvanc
1521
1522fnlog:
1523 jsr r5,fnfn; log
1524 bec fnadvanc
1525 jsr r5,error
1526 <Bad log\n\0>; .even
1527
1528fnsin:
1529 jsr r5,fnfn; sin
1530 bec fnadvanc
1531 jsr r5,error
1532 <Bad sine\n\0>; .even
1533
1534fncos:
1535 jsr r5,fnfn; cos
1536 bec fnadvanc
1537 jsr r5,error
1538 <Bad cosine\n\0>; .even
1539
1540fnatan:
1541 jsr r5,fnfn; atan
1542 bec fnadvanc
1543 jsr r5,error
1544 <Bad arctangent\n\0>; .even
1545
1546fnrand:
1547 tst (r4)+
1548 bne narg
1549 jsr pc,rand
1550 movif r0,r0
1551 divf $44000,r0
1552 jmp advanc
1553
1554fnexpr:
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
1570fnint:
1571 cmp (r4)+,$1
1572 bne narg
1573 movf (r3),r0
1574 modf $one,r0
1575 movf r1,r0
1576 br fnadvanc
1577
1578fnabs:
1579 cmp (r4)+,$1
1580 bne narg
1581 movf (r3),r0
1582 cfcc
1583 bge fnadvanc
1584 negf r0
1585 br fnadvanc
1586
1587fnlast:
1588 tst (r4)+
1589 bne narg
1590 movf lastpr,fr0
1591 jbr advanc
1592
1593fnsqr:
1594 jsr r5,fnfn; sqrt
1595 bec fnadvanc
1596 jsr r5,error
1597 <Bad square root arg\n\0>; .even
1598fnadvanc:
1599 add $8,r3
1600 jmp advanc
1601
1602narg:
1603 jsr r5,error
1604 <arg count\n\0>; .even
1605
1606arg:
1607 tst sublev
1608 beq 1f
1609 mov sstack,r1
1610 sub *2(r1),r0
1611 bhi 1f
16122:
1613 inc r0
1614 bgt 2f
1615 add $8,r1
1616 br 2b
16172:
1618 movf 4(r1),r0
1619 rts pc
16201:
1621 jsr r5,error
1622 <bad arg\n\0>; .even
1623
1624fnfn:
1625 cmp (r4)+,$1
1626 bne narg
1627 movf (r3),r0
1628 jsr pc,*(r5)+
1629 rts r5
1630
1631.if scope / for plotting
1632draw:
1633 tstf r2
1634 cfcc
1635 bne 1f
1636 movf r0,drx
1637 movf r1,dry
1638 rts r5
16391:
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
1652drxy:
1653 movf drx,r0
1654 jsr pc,drco
1655 movf dry,r0
1656
1657drco:
1658 tstf r0
1659 cfcc
1660 bge 1f
1661 clrf r0
16621:
1663 cmpf $40200,r0 / 1.0
1664 cfcc
1665 bgt 1f
1666 movf $40177,r0 / 1.0-eps
16671:
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
1676drput:
1677 movb r0,ch
1678 mov drfo,r0
1679 bne 1f
1680 sys open; vt; 1
1681 bec 2f
1682 4
16832:
1684 mov r0,drfo
16851:
1686 sys write; ch; 1
1687 rts pc
1688
1689.endif
1690/ bas4 -- old library routines
1691atoi:
1692 clr r1
1693 jsr r5,nextc
1694 clr -(sp)
1695 cmp r0,$'-
1696 bne 2f
1697 inc (sp)
16981:
1699 jsr r5,nextc
17002:
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
17091:
1710 add $'0,r0
1711 tst (sp)+
1712 beq 1f
1713 neg r1
17141:
1715 rts r5
17163:
1717 tst (sp)+
1718 mov $'.,r0 / faking overflow
1719 br 1b
1720
1721ldfps = 170100^tst
1722stfps = 170200^tst
1723atof:
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)
17361:
1737 jsr r5,*(r5)
17382:
1739 sub $'0,r0
1740 cmp r0,$9.
1741 bhi 2f
1742 jsr pc,dig
1743 br 1b
1744 inc r2
1745 br 1b
17462:
1747 cmpb r0,$'.-'0
1748 bne 2f
17491:
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
17572:
1758 cmpb r0,$'e-'0
1759 bne 1f
1760 jsr r5,atoi
1761 sub $'0,r0
1762 add r1,r2
17631:
1764 movf $one,fr1
1765 mov r2,-(sp)
1766 beq 2f
1767 bgt 1f
1768 neg r2
17691:
1770 cmp r2,$38.
1771 blos 1f
1772 clrf fr0
1773 tst (sp)+
1774 bmi out
1775 movf $huge,fr0
1776 br out
17771:
1778 mulf $ten,fr1
1779 sob r2,1b
17802:
1781 tst (sp)+
1782 bge 1f
1783 divf fr1,fr0
1784 br 2f
17851:
1786 mulf fr1,fr0
1787 cfcc
1788 bvc 2f
1789 movf $huge,fr0
17902:
1791out:
1792 tst (sp)+
1793 beq 1f
1794 negf fr0
17951:
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
1804dig:
1805 cmpf $big,fr0
1806 cfcc
1807 blt 1f
1808 mulf $ten,fr0
1809 movif r0,fr1
1810 addf fr1,fr0
1811 rts pc
18121:
1813 add $2,(sp)
1814 rts pc
1815
1816one = 40200
1817ten = 41040
1818big = 56200
1819huge = 77777
1820
1821.globl _ndigits
1822.globl ecvt
1823.globl fcvt
1824
1825ftoa:
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)
18331:
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
1844econ:
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
1854cout:
1855 mov bufptr,r1
1856 add _ndigits,r1
1857 mov r2,-(sp)
1858 add bufptr,r2
18591:
1860 cmp r1,r2
1861 blos 1f
1862 cmpb -(r1),$'0
1863 beq 1b
1864 inc r1
18651:
1866 mov (sp)+,r2
1867 bge 2f
1868 mov $'.,r0
1869 jsr r5,*(r5)
18701:
1871 mov $'0,r0
1872 jsr r5,*(r5)
1873 inc r2
1874 blt 1b
1875 dec r2
18762:
1877 mov r2,-(sp)
1878 mov bufptr,r2
18791:
1880 cmp r2,r1
1881 bhis 1f
1882 tst (sp)
1883 bne 2f
1884 mov $'.,r0
1885 jsr r5,*(r5)
18862:
1887 dec (sp)
1888 movb (r2)+,r0
1889 jsr r5,*(r5)
1890 br 1b
18911:
1892 tst (sp)+
1893 rts pc
1894
1895.bss
1896bufptr: .=.+2
1897.text
1898
1899ftoo:
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
19081:
1909 cmp r2,r1
1910 bhis 1f
1911 mov $';,r0
1912 jsr r5,*(r5)
19132:
1914 mov (r2)+,r0
1915 jsr pc,oct
1916 br 1b
19171:
1918 mov $'\n,r0
1919 jsr pc,*(r5)+
1920 ldfps (sp)+
1921 rts r5
1922
1923oct:
1924 mov r0,x+2
1925 setl
1926 movif x,fr0
1927 mulf $small,fr0
1928 seti
1929 mov $6.,-(sp)
19301:
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
1940eight = 41000
1941small = 33600
1942.bss
1943buf: .=.+8
1944x: .=.+4
1945.text
1946
1947itoa:
1948 mov r1,-(sp)
1949 mov r0,r1
1950 bge 1f
1951 neg r1
1952 mov $'-,r0
1953 jsr r5,*(r5)
19541:
1955 jsr pc,1f
1956 mov (sp)+,r1
1957 tst (r5)+
1958 rts r5
1959
19601:
1961 clr r0
1962 dvd $10.,r0
1963 mov r1,-(sp)
1964 mov r0,r1
1965 beq 1f
1966 jsr pc,1b
19671:
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
19791:
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
19931:
1994 mov (sp)+,r4
1995 jmp *(r4)+
1996
1997dmp1:
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
20051:
2006 mov r4,-(sp)
2007 mov $symtab-14.,r4
20081:
2009 add $14.,r4
2010 tst (r4)
2011 beq 1f
2012 mov 4(r4),r0
2013 bic $1,r0
20142:
2015 beq 1b
2016 cmp r0,(sp)
2017 beq 2f
2018 mov 2(r0),r0
2019 br 2b
20202:
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
20301:
2031 mov (sp)+,r4
2032 rts pc
2033/
2034/
2035
2036/ basx -- data
2037
2038one = 40200
2039
2040.data
2041
2042_ndigits:10.
2043tmpf: </tmp/btma\0>
2044argname: <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>
2045vt: </dev/vt0\0>
2046.even
2047pname: <\0\0\0\0\0\0>
2048 .even
2049
2050resnam:
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
2074eresnam:
2075
2076symtnam:
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>
2089esymtnam:
2090
2091/ indirect sys calls:
2092sysseek: sys lseek; 0; seekx: 0; 0
2093syswrit: sys write; wbuf: 0; wlen: 0
2094sysread: sys read; rbuf: 0; rlen: 0
2095sysopen: sys open; ofile: 0 ; omode: 0
2096syscreat: sys creat; cfile: 0; cmode: 0
2097.bss
2098drx: .=.+8
2099dry: .=.+8
2100drfo: .=.+2
2101ch: .=.+2
2102drflg: .=.+2
2103randx: .=.+2
2104gsp: .=.+2
2105forp: .=.+2
2106exprloc:.=.+2
2107sstack: .=.+2
2108sublev: .=.+2
2109val: .=.+2
2110splimit: .=.+2 / statement size limit
2111iflev: .=.+20. / nested if compile stack: 10 deep
2112ifp: .=.+2 / current pointer to iflev
2113line: .=.+100.
2114prfile: .=.+2 / output from _list or _save
2115tfi: .=.+2 / input file
2116lastpr: .=.+8 / last printed number
2117func: .=.+2 / alternate functions, eg: _list or _save
2118seeka: .=.+2 / seek offset 1
2119lineno: .=.+2
2120nameb: .=.+4
2121tfo: .=.+2
2122symtab: .=.+2800.; esymtab: / symbol=7wds; symtab for 200
2123space: .=.+8000.; espace: / code space
2124exline: .=.+1000.; eexline: / line execute space
2125lintab: .=.+1800.; elintab: / 3wds per statement = 300 stmts
2126stack: .=.+800.; estack:
2127
2128iobuf: fi: .=.+518. / should be acquired??