Add original unix v6

This commit is contained in:
memnoth
2018-01-27 22:35:41 +09:00
commit 2c7099ee50
664 changed files with 106254 additions and 0 deletions
+53
View File
@@ -0,0 +1,53 @@
/
/
/ fhd -- data segment header
/
symsize = 1600.
linsize = 800.
namsize = 1200.
smblsize = 399.
intcon = 4\<8+1 / type of integer constant
realcon = 4\<8+2
logcon = 2\<8+3 / type of logical constant
log1con = 1\<8+3
int1con = 1\<8+1
int2con = 2\<8+1
dblcon = 10\<8+2
dcplxcon = 20\<8+4
cplxcon = 10\<8+4
.globl data
.globl ibuf
.globl obuf
.globl tbuf
.globl line
.globl eline
.globl ifno
.globl efno
.globl errp
.globl errb
.globl eerrb
.globl symtab
.globl esymtab
.globl esymp
.globl symtp
.globl namebuf
.globl enamebuf
.globl namep
.globl symbuf
.globl esymbuf
.globl ch
.globl ch1
.globl progt
.globl holquo
.globl nxtaloc
.globl imptab
.globl nerror
.globl temp
.globl functm
.globl edata
.globl dsize
+40
View File
@@ -0,0 +1,40 @@
/
/
/ fx1 -- utility
.globl lookup
/ lookup
/ lookup string pointed at by r2
/ in table pointed at by arg1
/ r0 returns symbol number*2
/ r2 is advanced by matched string
/ registers used: r0,r2
lookup:
mov r1,-(sp)
clr r0
mov r2,-(sp)
mov (r5)+,r1
1:
mov (sp),r2
tstb (r1)
beq 1f
2:
cmpb (r2)+,(r1)+
bne 2f
tstb (r1)
bne 2b
asl r0
cmp (r5)+,(sp)+
mov (sp)+,r1
rts r5
2:
tstb (r1)+
bne 2b
inc r0
br 1b
1:
mov (sp)+,r2
mov (sp)+,r1
rts r5
+134
View File
@@ -0,0 +1,134 @@
/
/
/ fx2 -- error setting and printing
.globl error
.globl perror
.globl tput
.globl tdecml
error:
inc nerror
mov r0,-(sp)
mov r2,-(sp)
mov (r5)+,r0
mov $errb,r2
1:
cmp r2,errp
bhis 1f
cmp r0,(r2)+
beq 2f
tst (r2)+
br 1b
1:
cmp r2,$eerrb
bhis 2f
mov r0,(r2)+
mov r1,(r2)
dec (r2)+ / r1 is often 1 too far
mov r2,errp
2:
mov (sp)+,r2
mov (sp)+,r0
rts r5
perror:
cmp errp,$errb
beq 1f
mov r1,-(sp)
mov r2,-(sp)
mov ifno,r0
jsr r5,tdecml
mov $'\t,r0
jsr r5,tput
mov $line,r1
2:
movb (r1),r0
beq 2f
jsr r5,tput
mov $errb+2,r2
3:
cmp r1,(r2)+
bne 4f
mov $1,r0
sys write; mes2; 2 / bs, _
br 3f
4:
cmp r2,errp
blo 3b
3:
inc r1
br 2b
2:
mov $errb,r1
2:
mov $1,r0
sys write; mes1; 4
3:
sys open; errfil; 0
bec 3f
mov (r1)+,r0
tst (r1)+
jsr r5,tdecml
cmp r1,errp
bhis 2f
mov $',,r0
jsr r5,tput
br 3b
3:
mov r0,-(sp)
mov (r1)+,r2
tst (r1)+
3:
dec r2
ble 3f
4:
mov (sp),r0
sys read; ich; 1
bes 4f
tst r0
beq 4f
cmpb ich,$'\n
bne 4b
br 3b
3:
mov (sp),r0
sys read; ich; 1
bes 4f
tst r0
beq 4f
movb ich,r0
cmp r0,$'\n
beq 3f
jsr r5,tput
br 3b
4:
mov $1,r0
sys write; mes3; 18.
3:
mov (sp)+,r0
sys close
cmp r1,$errp
blo 2b
2:
mov $'\n,r0
jsr r5,tput
mov $errb,errp
mov (sp)+,r2
mov (sp)+,r1
1:
rts r5
mes1:
<\n** >
mes2:
.byte 010, '_
mes3:
<Unknown diagnostic>
errfil:
</usr/fort/errors\0>
.even
.bss
ich: .=.+2
+49
View File
@@ -0,0 +1,49 @@
/
/
/ fx3 -- get integer
.globl geti
.globl ptemp
.globl putc
.globl putw
geti:
mov r1,-(sp)
mov r3,-(sp)
clr r3
mov $symbuf,r0
1:
movb (r0)+,r1
sub $'0,r1
cmp r1,$9
bhi 1f
mpy $10.,r3
add r1,r3
br 1b
1:
mov r3,r0
mov (sp)+,r3
mov (sp)+,r1
rts r5
ptemp:
mov r0,-(sp)
mov r1,-(sp)
mov (r5)+,r0 / character
jsr r5,putc; tbuf
mov *(r5)+,r0 / word
jsr r5,putw; tbuf
mov ifno,r0
jsr r5,putw; tbuf
mov (r5)+,r1 / string
1:
movb (r1),r0
jsr r5,putc; tbuf
tstb (r1)+
bne 1b
mov (sp)+,r1
mov (sp)+,r0
rts r5
+364
View File
@@ -0,0 +1,364 @@
/
/
/ fx4 -- get symbol
.globl getsym
.globl getid
.globl lookid
.globl chrtab
.globl lookup
.globl error
.globl geti
.globl holround
/ getsym returns the next basic symbol
/ 0 name (symbol table entry in r3)
/ 2 number (type in r3)
/ 4 **
/ 6 /
/ 8 *
/ 10 -
/ 12 +
/ 14 .lt.
/ 16 .le.
/ 18 .eq.
/ 20 .ne.
/ 22 .gt.
/ 24 .ge.
/ 26 .not.
/ 28 .and.
/ 30 .or.
/ 32 (
/ 34 )
/ 36 ,
/ 38 =
/ 40 =|
/
getsym:
mov r2,-(sp)
mov r1,r2
jsr r5,lookup; bastab
br 1f
mov r2,r1
cmp r0,$4
bhis 2f
asr r0
add $'0,r0
movb r0,symbuf
movb $12,symbuf+1
clrb symbuf+2
mov $logcon,r3 / logical*2
mov $2,r0
2:
cmp r0,$32.
bne 2f
/ check for possible complex constant
mov r1,-(sp)
movb -2(r1),r0
movb chrtab(r0),r0
beq 4f
cmp r0,$4
blos 3f
4:
jsr r5,srconst
br 3f
mov r3,r2
cmpb (r1)+,$',
bne 3f
jsr r5,srconst
br 3f
cmp r3,r2
bhis 4f
mov r2,r3
4:
cmpb (r1)+,$')
bne 3f
mov (sp)+,r1
mov $symbuf,r2
4:
movb (r1)+,(r2)
cmpb (r2)+,$')
bne 4b
clrb -(r2)
mov $2,r0
br 2f
3:
mov (sp)+,r1
mov $32.,r0
2:
mov (sp)+,r2
rts r5
1:
clr lstchr
cmp r1,$line
blos 1f
movb -1(r1),lstchr
1:
mov $symbuf,r2
movb (r1)+,r0
movb r0,(r2)+
bic $!177,r0
movb chrtab(r0),r0
jmp *1f(r0)
1:
eos
let
num
per
eos:
mov $40.,r0
tstb -(r1)
beq 2b
jsr r5,error; 8.
br 2b
let:
dec r1
jsr r5,getid
br .+2 / cannot happen
jsr r5,lookid; symbuf
mov (sp)+,r2
clr r0
rts r5
num:
mov $intcon,r3 / integer*4
jsr r5,numst
cmpb (r1),$'.
bne 2f
mov r2,-(sp)
mov r1,r2
jsr r5,lookup; bastab
br 1f
mov (sp)+,r2
br 3f
1:
mov (sp)+,r2
movb (r1)+,(r2)+
br 1f
2:
cmpb (r1),$'h / hollerith const?
bne 2f
mov lstchr,r0
cmpb chrtab(r0),$2 / letter?
beq 2f / not h, then
cmp r0,$'*
beq 2f / e.g. real*4 h...
clrb (r2)
jsr r5,geti
mov $symbuf,r2
inc r1
mov holround,-(sp)
dec (sp)
clr -(sp)
4:
movb (r1)+,(r2)+
bne 5f
jsr r5,error; 55.
br 6f
5:
inc (sp)
dec r0
bgt 4b
6:
bit (sp),2(sp)
beq 6f
movb $' ,(r2)+
inc (sp)
br 6b
6:
mov (sp)+,r3
tst (sp)+
swab r3
clrb r3
bis $5,r3
mov $2,r0
mov (sp)+,r2
rts r5
.bss
lstchr: .=.+2
.text
per:
jsr r5,isnum
br eos
1:
mov $realcon,r3 / real*4
jsr r5,numst
2:
jsr r5,expon
3:
clrb (r2)
mov $2,r0
mov (sp)+,r2
rts r5
isnum:
movb (r1),r0
cmpb chrtab(r0),$4
bne 1f
tst (r5)+
1:
rts r5
numst:
jsr r5,isnum
br 1b
inc r1
movb r0,(r2)+
br numst
expon:
cmpb (r1)+,$'e
beq 1f
cmpb -1(r1),$'d
beq 1f
2:
dec r1
rts r5
1:
cmpb (r1),$'+
beq 1f
cmpb (r1),$'-
beq 1f
jsr r5,isnum
br 2b
1:
mov $realcon,r3 / real*4
cmpb -(r1),$'e
beq 1f
mov $dblcon,r3 / real*8
1:
movb (r1)+,(r2)+
movb (r1)+,(r2)+
jsr r5,numst
rts r5
getid:
mov r0,-(sp)
mov r2,-(sp)
movb (r1),r0
cmpb chrtab(r0),$2
bne 3f
tst (r5)+
mov $symbuf,r2
1:
movb (r1)+,r0
movb r0,(r2)+
movb chrtab(r0),r0
cmp r0,$2
beq 1b
cmp r0,$4
beq 1b
dec r1
clrb (r2)
movb $12,-(r2)
3:
mov (sp)+,r2
mov (sp)+,r0
rts r5
lookid:
mov r0,-(sp)
mov r2,-(sp)
2:
mov (r5),r2
jsr r5,lookup; namebuf
br 1f
asl r0
asl r0
mov r0,r3
mov (sp)+,r2
mov (sp)+,r0
tst (r5)+
rts r5
1:
mov namep,r0
add $8.,symtp
1:
movb (r2)+,(r0)+
bne 1b
mov r0,namep
cmp r0,$enamebuf
bhis 1f
mov symtp,r0
add $symtab,r0
cmp r0,esymp
blo 2b
1:
mov $1,r0
sys write; ovfl; eovfl-ovfl
clr r0
sys seek; 0; 2
mov $-1,r0
sys exit
ovfl:
<Symbol table overflow\n>
eovfl:
.even
srconst:
cmpb (r1)+,$'+
beq 1f
cmpb -(r1),$'-
bne 1f
inc r1
1:
jsr r5,getsym
cmp r0,$2
bne 1f
clrb r3
add r3,r3
bisb $cplxcon,r3
tst (r5)+
1:
rts r5
chrtab:
.byte 0,0,0,0,0,0,0,0
.byte 0,0,0,0,0,0,0,0
.byte 0,0,0,0,0,0,0,0
.byte 0,0,0,0,0,0,0,0
.byte 0,0,0,0,0,0,0,0
.byte 0,0,0,0,0,0,6,0
.byte 4,4,4,4,4,4,4,4
.byte 4,4,0,0,0,0,0,0
.byte 0,2,2,2,2,2,2,2
.byte 2,2,2,2,2,2,2,2
.byte 2,2,2,2,2,2,2,2
.byte 2,2,2,0,0,0,0,0
.byte 0,2,2,2,2,2,2,2
.byte 2,2,2,2,2,2,2,2
.byte 2,2,2,2,2,2,2,2
.byte 2,2,2,0,0,0,0,0
bastab:
<.false.\0>
<.true.\0>
<**\0>
</\0>
<*\0>
<-\0>
<+\0>
<.lt.\0>
<.le.\0>
<.eq.\0>
<.ne.\0>
<.gt.\0>
<.ge.\0>
<.not.\0>
<.and.\0>
<.or.\0>
<(\0>
<)\0>
<,\0>
<=\0>
<\0>
+46
View File
@@ -0,0 +1,46 @@
/
/
/ fx5 -- declare implicit
.globl declimpl
.globl getname
declimpl:
bit $7,symtab(r3)
bne 1f / already declared
jsr r5,getname
movb symbuf,r0
cmp r0,$'a
blo 2f
sub $6,r0 / map 'a -> 'Z+1
2:
asl r0
bis imptab-[2*'A](r0),symtab(r3)
1:
bit $70,symtab(r3) / class
bne 1f
bis $10,symtab(r3) / simple
1:
rts r5
getname:
mov r3,-(sp)
clr r3
mov $namebuf,r0
1:
cmp r3,(sp)
bhis 1f
2:
tstb (r0)+
bne 2b
add $8,r3
br 1b
1:
mov $symbuf,r3
2:
movb (r0)+,(r3)+
bne 2b
mov (sp)+,r3
rts r5
+31
View File
@@ -0,0 +1,31 @@
/
/
/ fx6 -- teletype
.globl tput
.globl tdecml
tdecml:
mov r1,-(sp)
jsr r5,td
mov (sp)+,r1
rts r5
td:
mov r0,r1
clr r0
dvd $10.,r0
mov r1,-(sp)
tst r0
beq 1f
jsr r5,td
1:
mov (sp)+,r0
add $'0,r0
tput:
movb r0,ch+1
mov $1,r0
sys write; ch+1; 1
rts r5
+34
View File
@@ -0,0 +1,34 @@
/
/
/ fx7 -- passes advancement
.globl signon
.globl signoff
.globl pass2
.globl pass3
.globl pass4
signon:
tst (r5)+
rts r5
signoff:
mov (r5)+,r0
tst (sp)+
dec r0
asl r0
jmp *passtab(r0)
passtab:
pass2
pass3
pass4
.data
+269
View File
@@ -0,0 +1,269 @@
/
/
/ fx8 -- read source line
.globl getline
.globl isagn
.globl levzer
.globl error
.globl getc
.globl chrtab
getline:
mov r3,-(sp)
clr holquo
clr r3 / line number
clr line
mov $line,r1
1:
jsr pc,get
sub $'0,r0
cmp r0,$9
bhi 1f
mpy $10.,r3
add r0,r3
br 1b
1:
add $'0,r0
movb r0,ch
mov r3,efno
1:
mov lino, ifno
inc ifno
jsr pc,get
cmp r0,$'\n / nl
beq 1f
cmp r0,$''
beq 2f
cmp r0,$'"
bne 3f
2:
mov r0,holquo
add $4,r1 / room for h count
mov r1,-(sp)
2:
jsr pc,get
cmp r0,$'\n
beq 4f
cmp r0,holquo
beq 2f
bis $200,r0
movb r0,(r1)+
cmp r1,$eline-1
blo 2b
4:
tst (sp)+
br err1
2:
mov (sp)+,r3
mov r1,-(sp)
sub r3,r1
movb $'h,-(r3)
clr r0
div $10.,r0
add $'0,r1
movb r1,-(r3)
mov r0,r1
clr r0
div $10.,r0
add $'0,r1
movb r1,-(r3)
add $'0,r0
movb r0,-(r3)
mov (sp)+,r1
clr holquo
br 1b
3:
cmp r0,$'h
bne 2f
clr r3 / quote count
mov r1,-(sp)
3:
cmp r1,$line
blos 4f
movb -(r1),r0
cmpb chrtab(r0),$4 / digit?
beq 3b
cmpb chrtab(r0),$2 / test letter
beq 3f
cmp r0,$'*
beq 3f
inc r1
4:
cmp r1,(sp)
bhis 4f
movb (r1)+,r0
sub $'0,r0
mpy $10.,r3
add r0,r3
br 4b
4:
mov r3,r0
beq 3f
mov r0,holquo
mov (sp)+,r1
movb $'h,(r1)+
4:
jsr pc,get
cmp r0,$'\n
bne 5f
mov r0,ch
mov $' ,r0
5:
bis $200,r0
movb r0,(r1)+
cmp r1,$eline-1
bhis err1
dec holquo
bne 4b
br 1b
3:
mov (sp)+,r1
mov $'h,r0
2:
movb r0,(r1)+
cmp r1,$eline-1
blo 1b
err1:
jsr r5,error; 1.
1:
clrb (r1)+
mov (sp)+,r3
tstb line
bne 1f
jmp getline
1:
rts r5
isagn:
jsr r5,levzer; '=
br 1f
br 3f
1:
mov r0,-(sp)
jsr r5,levzer; ',
br 4f
jsr r5,levzer; '(
br 1f
tst (sp)+
2:
rts r5
1:
cmp (sp)+,r0
blt 2b
mov r1,-(sp)
mov r0,r1
inc r1
jsr r5,levzer; ')
br 1f
1:
mov (sp)+,r1
cmpb 1(r0),$'=
bne 3f
rts r5
levzer:
mov r1,r0
clr -(sp)
1:
tst (sp)
bne 2f
cmpb (r0),(r5)
beq 1f
2:
cmpb (r0),$'(
bne 2f
inc (sp)
2:
cmpb (r0),$')
bne 2f
dec (sp)
blt 5f
2:
tstb (r0)+
bne 1b
5:
tst (r5)+
1:
4:
tst (sp)+
3:
tst (r5)+
rts r5
get:
movb ch,r0
beq 1f
clrb ch
rts pc
1:
jsr pc,get1
cmp r0,$'\n
bne 2f
jsr pc,get1
cmp r0,$'&
beq 1b
movb r0,ch1
mov $'\n,r0
2:
tst holquo
bne 1f
cmp $' ,r0
beq 1b
cmp $'\t,r0
beq 1b
1:
cmp r0,$4 / test EOT
bne 1f
mov $1,r0
sys write; mes; emes-mes
mov $1,r0 / syntax errors detected
sys exit
1:
rts pc
get1:
movb ch1,r0
beq 1f
clrb ch1
br 2f
1:
jsr r5,getc; ibuf
bcs 1f
bic $!177,r0
beq 1b
cmp r0,$'\n
bne 2f
inc lino
2:
tst nlflg
beq 2f
clr nlflg
cmp r0,$'c
bne 2f
3:
jsr pc,get1
cmp r0,$'\n
beq 1b
cmp r0,$4
bne 3b
2:
cmp r0,$'\n
bne 2f
inc nlflg
2:
rts pc
1:
mov $4,r0
rts pc
.data
nlflg: 1
.text
mes:
<EOF on input\n\0>
emes:
.bss
lino: .=.+2
+125
View File
@@ -0,0 +1,125 @@
/
/
/ fx9 -- code
/ jsr r5,code; <string\0>; .even
/ arg1
/ arg2
/ ...
/
/ args specified by %<c> in string.
/ %s: string
/ %d: decimal number
/ %o: octal number
/ %c: character
/
/ args are addresses
/ or registers r0-r4
.globl code
.globl putc
.globl getname
code:
mov r4,-(sp)
mov r3,-(sp)
mov r2,-(sp)
mov r1,-(sp)
mov r0,-(sp)
mov r5,r4
1:
tstb (r5)+
bne 1b
inc r5
bic $1,r5
1:
movb (r4)+,r0
beq 1f
cmp r0,$'%
beq 2f
jsr r5,putc; obuf
br 1b
2:
movb (r4)+,r0
beq 1f
cmp r0,$'s
beq cstr
cmp r0,$'c
beq cchr
cmp r0,$'d
beq cdec
cmp r0,$'o
beq coct
cmp r0,$'n
beq cnam
jsr r5,putc; obuf
br 1b
cnam:
jsr pc,cget
mov r1,r3
jsr r5,getname
mov $symbuf,r1
br 2f
cstr:
jsr pc,cget
2:
movb (r1)+,r0
beq 1b
cmp r0,$'\n
beq 2b
jsr r5,putc; obuf
br 2b
cchr:
jsr pc,cget
mov r1,r0
jsr r5,putc; obuf
mov r1,r0
clrb r0
swab r0
beq 1b
jsr r5,putc; obuf
br 1b
coct:
jsr pc,cget
mov $8.,r2
br 2f
cdec:
jsr pc,cget
mov $10.,r2
2:
jsr pc,2f
br 1b
2:
clr r0
dvd r2,r0
mov r1,-(sp)
mov r0,r1
beq 2f
jsr pc,2b
2:
mov (sp)+,r0
add $'0,r0
jsr r5,putc; obuf
rts pc
1:
mov (sp)+,r0
mov (sp)+,r1
mov (sp)+,r2
mov (sp)+,r3
mov (sp)+,r4
rts r5
cget:
mov (r5)+,r1
cmp r1,$4
blos 1f
rts pc
1:
asl r1
add $2,r1
add sp,r1
mov (r1),r1
rts pc
+36
View File
@@ -0,0 +1,36 @@
/
/
/ fxa -- genop -- output a typed operator
.globl genop
.globl newline
.globl code
.globl typ
genop:
mov r1,-(sp)
mov r3,-(sp)
bic $!7,r3
movb typ(r3),r1
mov (sp),r3
clrb r3
swab r3
jsr r5,code
< %c%c%d\0>; .even
r1
r0
r3
mov (sp)+,r3
mov (sp)+,r1
rts r5
newline:
jsr r5,code
<\n\0>; .even
rts r5
typ:
<?irlc??g>
+32
View File
@@ -0,0 +1,32 @@
/
/
/ fxb -- get integer constant or label
.globl geticon
.globl getlab
.globl getsym
.globl geti
.globl ptemp
geticon:
jsr r5,getsym
cmp r0,$2
bne 1f
cmp r3,$intcon
bne 1f
jsr r5,geti
tst (r5)+
1:
rts r5
getlab:
jsr r5,geticon
br 1f
mov r0,temp
jsr r5,ptemp; 'r; temp; line
tst (r5)+
1:
rts r5
+36
View File
@@ -0,0 +1,36 @@
/
/
/ fxc -- size of array
.globl size
.globl nelem
.globl error
size:
movb symtab+1(r3),r0
jsr r5,nelem
inc r0
bic $1,r0 / round to 0 mod 2
rts r5
nelem:
mov r1,-(sp)
mov r0,r1
mov symtab(r3),r0
bic $!70,r0
cmp r0,$20
bne 1f
mov symtab+2(r3),r0
mov (r0)+,-(sp)
2:
mpy (r0)+,r1
dec (sp)
bgt 2b
tst (sp)+
1:
mov r1,r0
mov (sp)+,r1
rts r5
+50
View File
@@ -0,0 +1,50 @@
/
/
/ xd -- tmp file 2 handl
.globl setln
.globl getln
.globl tfil2
.globl tfildiag
.globl fopen
.globl getc
.globl getw
.globl xbuf
setln:
mov $tfil2,r0
jsr r5,fopen; xbuf
bcc 1f
jmp tfildiag
1:
rts r5
getln:
jsr r5,getc; xbuf
bcs 3f
mov r0,-(sp)
jsr r5,getw; xbuf
mov r0,efno
jsr r5, getw; xbuf
mov r0,ifno
mov $line,r1
1:
jsr r5,getc; xbuf
bcs 1f
tst r0
beq 1f
bic $200,r0
movb r0,(r1)+
br 1b
1:
clrb (r1)+
mov (sp)+,r0
tst (r5)+
rts r5
3:
mov xbuf,r0
sys close
rts r5
+24
View File
@@ -0,0 +1,24 @@
/
/
/ xe -- temp file junk
.globl tfildiag
.globl tfil1, tfil2
tfildiag:
mov $1,r0
sys write; mes1; emes1-mes1
clr r0
sys seek; 0; 2
mov $-1,r0 / failure return
sys exit
mes1:
<Temp file?\n>
emes1:
tfil1:
<f.tmp1\0>
tfil2:
<f.tmp2\0>
+23
View File
@@ -0,0 +1,23 @@
/
/
/ fxf -- format statements
.globl sform
.globl sdata
.globl ptemp
.globl error
sform:
cmp progt,$6 / block data
bne 1f
jsr r5,error; 50.
1:
jsr r5,ptemp; 'f; efno; line
rts r5
sdata:
jsr r5,ptemp; 'd; efno; line
rts r5
+186
View File
@@ -0,0 +1,186 @@
/
/
/ fxg -- declare implicit functions
.globl funimpl
.globl getname
.globl lookup
funimpl:
bit $7,symtab(r3)
bne 1f
jsr r5,getname
mov r2,-(sp)
mov $symbuf,r2
jsr r5,lookup; funtab
br 2f
cmpb (r2),$'\n
bne 2f
asr r0
movb funtabt(r0),r0
mov r0,-(sp)
bic $!17,r0
bis typtab(r0),symtab(r3)
mov (sp)+,r0
asr r0
asr r0
asr r0
asr r0
bic $!17,r0
mov typtab(r0),symtab+2(r3) / save argument conversion
2: / in dimension pointer
mov (sp)+,r2
1:
rts r5
typtab:
intcon
realcon
dblcon
cplxcon
dcplxcon
funtab:
<tanh\0>
<sqrt\0>
<sngl\0>
<sin\0>
<sign\0>
<real\0>
<mod\0>
<min1\0>
<min0\0>
<max1\0>
<max0\0>
<isign\0>
<int\0>
<ifix\0>
<idint\0>
<idim\0>
<iabs\0>
<float\0>
<exp\0>
<dsqrt\0>
<dsin\0>
<dsign\0>
<dreal\0>
<dmod\0>
<dmin1\0>
<dmax1\0>
<dlog10\0>
<dlog\0>
<dimag\0>
<dim\0>
<dexp\0>
<dcsqrt\0>
<dcsin\0>
<dcos\0>
<dconjg\0>
<dcmplx\0>
<dclog\0>
<dcexp\0>
<dccos\0>
<dcabs\0>
<dble\0>
<datan2\0>
<datan\0>
<dabs\0>
<csqrt\0>
<csin\0>
<cos\0>
<conjg\0>
<cmplx\0>
<clog\0>
<cexp\0>
<ccos\0>
<cabs\0>
<atan2\0>
<atan\0>
<amod\0>
<amin1\0>
<amin0\0>
<amax1\0>
<amax0\0>
<alog10\0>
<alog\0>
<aint\0>
<aimag\0>
<abs\0>
<\0>
/ function type xy
/ x = arg types
/ y = result type
/ 0 = integer
/ 2 = real
/ 4 = double
/ 6 = complex
/ 8 = doublecomplex
funtabt:
.byte 2\<4+2 / tanh
.byte 2\<4+2 / sqrt
.byte 4\<4+2 / sngl
.byte 2\<4+2 / sin
.byte 2\<4+2 / sign
.byte 6\<4+2 / real
.byte 0\<4+0 / mod
.byte 2\<4+0 / min1
.byte 0\<4+0 / min0
.byte 2\<4+0 / max1
.byte 0\<4+0 / max0
.byte 0\<4+0 / isign
.byte 2\<4+0 / int
.byte 2\<4+0 / ifix
.byte 4\<4+0 / idint
.byte 0\<4+0 / idim
.byte 0\<4+0 / iabs
.byte 0\<4+2 / float
.byte 2\<4+2 / exp
.byte 4\<4+4 / dsqrt
.byte 4\<4+4 / dsin
.byte 4\<4+4 / dsign
.byte 8\<4+4 / dreal
.byte 4\<4+4 / dmod
.byte 4\<4+4 / dmin1
.byte 4\<4+4 / dmax1
.byte 4\<4+4 / dlog10
.byte 4\<4+4 / dlog
.byte 8\<4+4 / dimag
.byte 2\<4+2 / dim
.byte 4\<4+4 / dexp
.byte 8\<4+8 / dcsqrt
.byte 8\<4+8 / dcsin
.byte 4\<4+4 / dcos
.byte 8\<4+8 / dconjg
.byte 4\<4+8 / dcmplx
.byte 8\<4+8 / dclog
.byte 8\<4+8 / dcexp
.byte 8\<4+8 / dccos
.byte 8\<4+4 / dcabs
.byte 2\<4+4 / dble
.byte 4\<4+4 / datan2
.byte 4\<4+4 / datan
.byte 4\<4+4 / dabs
.byte 6\<4+6 / csqrt
.byte 6\<4+6 / csin
.byte 2\<4+2 / cos
.byte 6\<4+6 / conjg
.byte 2\<4+6 / cmplx
.byte 6\<4+6 / clog
.byte 6\<4+6 / cexp
.byte 6\<4+6 / ccos
.byte 6\<4+2 / cabs
.byte 2\<4+2 / atan2
.byte 2\<4+2 / atan
.byte 2\<4+2 / amod
.byte 2\<4+2 / amin1
.byte 0\<4+2 / amin0
.byte 2\<4+2 / amax1
.byte 0\<4+2 / amax0
.byte 2\<4+2 / alog10
.byte 2\<4+2 / alog
.byte 2\<4+2 / aint
.byte 6\<4+2 / aimag
.byte 2\<4+2 / abs
+77
View File
@@ -0,0 +1,77 @@
/
/
/ fxh -- array constant offset
.globl consub
.globl getsym
.globl geti
.globl error
.globl geticon
/ turn constant subscripts into offset.
/ in: r3 -> symtab
/ r1 -> just beyond (
/ out:r0 has offset
consub:
mov symtab(r3),r0
bic $!70,r0
cmp r0,$20 / test class == array
beq 1f
jsr r5,error; 17.
clr r0
rts r5
1:
mov r5,-(sp)
mov r4,-(sp)
mov r3,-(sp)
mov r2,-(sp)
clr r4 / accumulated offset
mov symtab+2(r3),r2 / ptr to declarator
mov (r2)+,-(sp) / dimensionality
mov $1,r5 / prod of declarators
1:
jsr r5,geticon
br 9f
cmp r0,(r2)
bgt 3f
dec r0
bge 2f
3:
jsr r5,error; 19. / out of range
clr r0
2:
mov r5,-(sp)
mpy r0,r5
add r5,r4
mov (sp)+,r5
mpy (r2)+,r5
jsr r5,getsym
cmp r0,$36. / comma
bne 1f
dec (sp)
bgt 1b
jsr r5,error; 18. / wrong subscript count
br 1b
1:
cmp r0,$34. / )
beq 1f
9:
jsr r5,error; 20.
clr r0
1:
cmp (sp)+,$1
beq 1f
jsr r5,error; 18. / subscript count
1:
mov (sp)+,r2
mov (sp)+,r3
movb symtab+1(r3),r5
mpy r4,r5
mov r5,r0
mov (sp)+,r4
mov (sp)+,r5
rts r5
+145
View File
@@ -0,0 +1,145 @@
/
/
/ quicker sort
/ mov $base,r1
/ mov $base+[n*width],r2
/ mov $width,r3
/ jsr pc,qsort
/ r0,r1,r2,r3,r4 are used
.globl qsort
.globl compare
qsort:
mov r5,-(sp)
mov r4,-(sp)
bit $1,r3
bne 1f
bit $1,r1
bne 1f
cmp r3,$2
bne 2f
mov $exch1,exchange
br 3f
2:
mov r3,r5
clc
ror r5
mov r5,width
mov $exchw,exchange
br 3f
1:
mov $exchb,exchange
3:
jsr pc,qs1
mov (sp)+,r4
mov (sp)+,r5
rts pc
qs1:
mov r1,r5
neg r5
add r2,r5
bgt 1f
rts pc
1:
clr r4
dvd r3,r4
asr r4
mpy r3,r4
mov r5,r4
add r1,r4
mov r1,-(sp)
mov r2,-(sp)
loop:
cmp r1,r4
bhis loop1
mov r1,r0
jsr pc,compare
bgt loop1
add r3,r1
br loop
loop1:
cmp r2,r4
blos 1f
sub r3,r2
mov r2,r0
jsr pc,compare
bge loop1
jsr pc,*exchange
cmp r1,r4
bne loop
mov r2,r4
br loop
1:
cmp r1,r4
beq 1f
jsr pc,*exchange
mov r1,r4
br loop1
1:
mov (sp)+,r2
mov r4,-(sp)
mov r4,r1
add r3,r1
mov r2,r0
sub r1,r0
sub 2(sp),r4
cmp r0,r4
blo 1f
mov (sp)+,r0
mov (sp)+,r4
mov r1,-(sp)
mov r2,-(sp)
mov r0,r2
mov r4,r1
1:
jsr pc,qs1
mov (sp)+,r2
mov (sp)+,r1
br qs1
exchb:
mov r1,-(sp)
mov r2,-(sp)
mov r3,r5
1:
movb (r1),r0
movb (r2),(r1)+
movb r0,(r2)+
sob r5,1b
mov (sp)+,r2
mov (sp)+,r1
rts pc
exchw:
mov r1,-(sp)
mov r2,-(sp)
mov width,r5
1:
mov (r1),r0
mov (r2),(r1)+
mov r0,(r2)+
sob r5,1b
mov (sp)+,r2
mov (sp)+,r1
rts pc
exch1:
mov (r1),r0
mov (r2),(r1)
mov r0,(r2)
rts pc
.bss
exchange: .=.+2
width: .=.+2
+100
View File
@@ -0,0 +1,100 @@
/
/
/ fxx -- data segment definition
.data
.globl holround
holround: 4
.bss
/ pass 1
.globl dimu
dimu: .=.+2
/ pass 2
.globl eqvtab
/ pass 3 stuff
.globl conu
.globl dou
.globl blockp
.globl dotabp
.globl dotab
.globl edotab
.globl functn
.globl blocks
conu: .=.+2
dou: .=.+2
blockp: .=.+2
dotabp: .=.+2
dotab: .=.+60.
edotab:
functn: .=.+2
/ pass 4
.globl negflg
.globl repfact
.globl contab
.globl dattab
negflg: .=.+2
repfact:.=.+2
/ general buffer
xbufsiz = 2200.
.globl xbuf
xbuf: .=.+xbufsiz
eqvtab = xbuf+518. / for pass 2
blocks = xbuf / for pass 3
dattab = xbuf+518. / for pass 4
contab = xbuf+xbufsiz
/ for all passes
data:
ibuf: .=.+518.
obuf: .=.+518.
tbuf: .=.+518.
line: .=.+linsize
eline: .=.+4
ifno: .=.+2
efno: .=.+2
errp: .=.+2 / init(errb)
errb: .=.+12.
eerrb: / size 0 mod 4
symtab: .=.+symsize
esymtab:
esymp: .=.+2 / init(esymtab)
symtp: .=.+2
namebuf:.=.+namsize
enamebuf:
namep: .=.+2 / init(namebuf)
.=.+40 /fake
.=.+1 / make odd
symbuf: .=.+smblsize / init(<_>)
esymbuf:
ch: .=.+1
ch1: .=.+1
progt: .=.+2
holquo: .=.+2
nxtaloc:.=.+2
imptab: .=.+[26.*2*2] / 26 letters, 2 alphabets, 2 bytes
nerror: .=.+2
temp: .=.+2
functm: .=.+2
edata:
dsize =.-data