Add original unix v6
This commit is contained in:
@@ -0,0 +1,179 @@
|
||||
/
|
||||
/
|
||||
|
||||
/ f31 - pass3 dispatcher
|
||||
/
|
||||
/ main scan loop for pass3
|
||||
/ picks up executable statements
|
||||
/
|
||||
|
||||
.globl pass3
|
||||
.globl ifstmt
|
||||
|
||||
.globl isagn
|
||||
.globl signon
|
||||
.globl signoff
|
||||
.globl getline
|
||||
.globl lookup
|
||||
.globl sasgn
|
||||
.globl error
|
||||
.globl perror
|
||||
.globl doend
|
||||
.globl sform
|
||||
.globl sdata
|
||||
.globl sdo
|
||||
.globl sassi
|
||||
.globl scall
|
||||
.globl scont
|
||||
.globl sretu
|
||||
.globl sgoto
|
||||
.globl sif
|
||||
.globl spaus
|
||||
.globl sstop
|
||||
.globl sread
|
||||
.globl sprin
|
||||
.globl swrit
|
||||
.globl srewi
|
||||
.globl sback
|
||||
.globl sendf
|
||||
.globl blocks
|
||||
.globl blockp
|
||||
.globl code
|
||||
.globl ptemp
|
||||
.globl dotabp
|
||||
|
||||
pass3:
|
||||
jsr r5,signon; 3
|
||||
br 2f
|
||||
|
||||
scan3:
|
||||
jsr r5,getline
|
||||
2:
|
||||
mov $blocks,blockp
|
||||
mov $line,r1
|
||||
mov r1,r2
|
||||
jsr r5,lookup; fmttab
|
||||
br 2f
|
||||
mov r0,-(sp)
|
||||
jsr r5,isagn
|
||||
br 1f
|
||||
mov (sp)+,r0
|
||||
jsr r5,*fmtlst(r0)
|
||||
br scan3
|
||||
1:
|
||||
tst (sp)+
|
||||
2:
|
||||
mov efno,r0
|
||||
beq 1f
|
||||
jsr r5,ptemp; 's; efno; line
|
||||
jsr r5,code
|
||||
<.%d:\n\0>; .even
|
||||
r0
|
||||
1:
|
||||
jsr r5,isagn
|
||||
br 1f
|
||||
mov r1,r2
|
||||
jsr r5,lookup; stmtab
|
||||
br 2f
|
||||
mov r2,r1
|
||||
jsr r5,*sublst(r0)
|
||||
br 3f
|
||||
1:
|
||||
jsr r5,sasgn
|
||||
br 3f
|
||||
2:
|
||||
jsr r5,error; 101.
|
||||
3:
|
||||
cmp progt,$6
|
||||
bne 1f
|
||||
jsr r5,error; 50. / execut in block data
|
||||
1:
|
||||
jsr r5,perror
|
||||
mov efno,r0
|
||||
beq scan3
|
||||
jsr r5,doend
|
||||
br scan3
|
||||
|
||||
ifstmt:
|
||||
mov $blocks,blockp
|
||||
jsr r5,isagn
|
||||
br 1f
|
||||
mov r1,r2
|
||||
jsr r5,lookup; stmtab1
|
||||
br 2f
|
||||
mov r2,r1
|
||||
cmp r0,$4 / don't allow end
|
||||
beq 2f
|
||||
jmp *sublst1(r0)
|
||||
1:
|
||||
jmp sasgn
|
||||
2:
|
||||
jsr r5,error; 101.
|
||||
rts r5
|
||||
|
||||
send:
|
||||
tst dotabp
|
||||
beq 1f
|
||||
clr r0
|
||||
jsr r5,doend
|
||||
br send
|
||||
1:
|
||||
tst progt
|
||||
bne 1f
|
||||
jsr r5,sstop
|
||||
br 2f
|
||||
1:
|
||||
cmp progt,$6 / block data
|
||||
beq 2f
|
||||
jsr r5,sretu
|
||||
2:
|
||||
jsr r5,perror
|
||||
jsr r5,signoff; 3
|
||||
|
||||
sublst:
|
||||
sdo
|
||||
sublst1:
|
||||
sif
|
||||
sendf
|
||||
send
|
||||
sassi
|
||||
scall
|
||||
scont
|
||||
sretu
|
||||
sgoto
|
||||
spaus
|
||||
sstop
|
||||
sread
|
||||
sprin
|
||||
swrit
|
||||
srewi
|
||||
sback
|
||||
fmtlst:
|
||||
sform
|
||||
sdata
|
||||
stmtab:
|
||||
<do\0>
|
||||
stmtab1:
|
||||
<if(\0>
|
||||
<endfile\0>
|
||||
<end\0> / keep in this spot!!!
|
||||
<assign\0>
|
||||
<call\0>
|
||||
<continue\0>
|
||||
<return\0>
|
||||
<goto\0>
|
||||
<pause\0>
|
||||
<stop\0>
|
||||
<read\0>
|
||||
<print\0>
|
||||
<write\0>
|
||||
<rewind\0>
|
||||
<backspace\0>
|
||||
<\0>
|
||||
|
||||
fmttab:
|
||||
<format\0>
|
||||
<data\0>
|
||||
<\0>
|
||||
.even
|
||||
|
||||
@@ -0,0 +1,227 @@
|
||||
/
|
||||
/
|
||||
|
||||
/ f32 -- expression to tree
|
||||
|
||||
.globl e1
|
||||
.globl e2
|
||||
.globl e11
|
||||
|
||||
.globl error
|
||||
.globl getsym
|
||||
.globl blockp
|
||||
.globl blocks
|
||||
.globl declimpl
|
||||
.globl conu
|
||||
.globl ptemp
|
||||
.globl functn
|
||||
.globl funimpl
|
||||
|
||||
/ e1: e2[,e1]
|
||||
/ e2: e2[.or.e3]
|
||||
/ e3: e3[.and.e4]
|
||||
/ e4: [.not.]e5
|
||||
/ e5: e6[.rel.e6]
|
||||
/ e6: [+-]e7[+-e6]
|
||||
/ e7: e7[*/e8]
|
||||
/ e8: e9[**e9]
|
||||
/ e9: constant
|
||||
/ name[(e1)]
|
||||
/ (e2)
|
||||
e1:
|
||||
jsr r5,e2
|
||||
cmp r0,$36. / ,
|
||||
bne 1f
|
||||
jsr r5,block; e1
|
||||
rts r5
|
||||
|
||||
e2:
|
||||
jsr r5,e3
|
||||
2:
|
||||
cmp r0,$30. / or
|
||||
bne 1f
|
||||
jsr r5,block; e3
|
||||
br 2b
|
||||
|
||||
e3:
|
||||
jsr r5,e4
|
||||
2:
|
||||
cmp r0,$28. / and
|
||||
bne 1f
|
||||
jsr r5,block; e4
|
||||
br 2b
|
||||
|
||||
e4:
|
||||
jsr r5,getsym
|
||||
cmp r0,$26. / not
|
||||
bne e5
|
||||
clr r2
|
||||
jsr r5,block; e5a
|
||||
rts r5
|
||||
|
||||
e5a:
|
||||
jsr r5,getsym
|
||||
e5:
|
||||
jsr r5,e6
|
||||
cmp r0,$14. / .lt.
|
||||
blo 1f
|
||||
cmp r0,$24. / .ge.
|
||||
bhi 1f
|
||||
jsr r5,block; e6a
|
||||
rts r5
|
||||
|
||||
e6a:
|
||||
jsr r5,getsym
|
||||
e6:
|
||||
cmp r0,$12. / +
|
||||
beq e6a
|
||||
cmp r0,$10. / -
|
||||
bne 2f
|
||||
clr r2
|
||||
jsr r5,block; e7a
|
||||
br 3f
|
||||
2:
|
||||
jsr r5,e7
|
||||
3:
|
||||
cmp r0,$10. / -
|
||||
blo 1f
|
||||
cmp r0,$12. / +
|
||||
bhi 1f
|
||||
jsr r5,block; e7a
|
||||
br 3b
|
||||
|
||||
e7a:
|
||||
jsr r5,getsym
|
||||
e7:
|
||||
jsr r5,e8
|
||||
2:
|
||||
cmp r0,$6. / /
|
||||
blo 1f
|
||||
cmp r0,$8. / *
|
||||
bhi 1f
|
||||
jsr r5,block; e8a
|
||||
br 2b
|
||||
|
||||
e8a:
|
||||
jsr r5,getsym
|
||||
e8:
|
||||
jsr r5,e9
|
||||
cmp r0,$4 / **
|
||||
bne 1f
|
||||
jsr r5,block; e9a
|
||||
1:
|
||||
rts r5
|
||||
|
||||
e9a:
|
||||
jsr r5,getsym
|
||||
e9:
|
||||
cmp r0,$2 / constant
|
||||
beq 3f
|
||||
/ (e2)
|
||||
cmp r0,$32. / (
|
||||
bne 1f
|
||||
jsr r5,e2
|
||||
br 2f
|
||||
e10:
|
||||
jsr r5,e1
|
||||
2:
|
||||
cmp r0,$34. / )
|
||||
beq 2f
|
||||
jsr r5,error; 29.
|
||||
rts r5
|
||||
2:
|
||||
jsr r5,getsym
|
||||
rts r5
|
||||
1:
|
||||
tst r0
|
||||
beq e11
|
||||
/ unknown
|
||||
jsr r5,error; 30.
|
||||
rts r5
|
||||
|
||||
/ name
|
||||
e11:
|
||||
mov r3,r2
|
||||
jsr r5,getsym
|
||||
cmp r0,$32. / (
|
||||
bne 1f
|
||||
jsr r5,appl
|
||||
jsr r5,block; e10
|
||||
rts r5
|
||||
1:
|
||||
mov r2,r3
|
||||
mov r0,-(sp)
|
||||
jsr r5,declimpl
|
||||
mov symtab(r3),r0
|
||||
bic $!70,r0
|
||||
cmp r0,$30 / class =| funct
|
||||
bne 1f
|
||||
jsr r5,appl
|
||||
mov $42.,r3 / just function name
|
||||
br 2f
|
||||
1:
|
||||
clr r3
|
||||
2:
|
||||
mov (sp)+,r0
|
||||
mov r2,-(sp)
|
||||
mov blockp,r2
|
||||
add $6,blockp
|
||||
mov r3,(r2)
|
||||
mov (sp)+,2(r2)
|
||||
clr 4(r2)
|
||||
rts r5
|
||||
|
||||
/ number
|
||||
3:
|
||||
mov blockp,r2
|
||||
add $6,blockp
|
||||
mov r0,(r2)
|
||||
mov r3,2(r2)
|
||||
cmpb 2(r2),$5 / const->int
|
||||
bne 4f
|
||||
movb $1,2(r2)
|
||||
4:
|
||||
mov r3,temp
|
||||
mov conu,4(r2)
|
||||
inc conu
|
||||
jsr r5,ptemp; 'c; temp; symbuf
|
||||
jsr r5,getsym
|
||||
rts r5
|
||||
|
||||
appl:
|
||||
clr functn
|
||||
bit $70,symtab(r2) / class
|
||||
bne 1f
|
||||
bis $30,symtab(r2)
|
||||
jsr r5,funimpl
|
||||
1:
|
||||
mov r2,r3
|
||||
jsr r5,declimpl
|
||||
mov symtab(r2),r0
|
||||
bic $!70,r0 / class again
|
||||
cmp r0,$20 / array
|
||||
beq 1f
|
||||
cmp r0,$30 / funct
|
||||
beq 2f
|
||||
jsr r5,error; 33.
|
||||
bic $70,symtab(r2)
|
||||
br appl
|
||||
1:
|
||||
mov $32.,r0
|
||||
rts r5
|
||||
2:
|
||||
mov $34.,r0
|
||||
rts r5
|
||||
|
||||
block:
|
||||
mov blockp,r3
|
||||
add $6,blockp
|
||||
mov r0,(r3)+
|
||||
mov r2,(r3)+
|
||||
mov r3,-(sp)
|
||||
jsr r5,*(r5)+
|
||||
mov r2,*(sp)
|
||||
mov (sp)+,r2
|
||||
sub $4,r2
|
||||
rts r5
|
||||
|
||||
@@ -0,0 +1,143 @@
|
||||
/
|
||||
/
|
||||
|
||||
/ f33 -- do, etal
|
||||
|
||||
.globl sdo
|
||||
.globl dobeg
|
||||
.globl doend
|
||||
|
||||
.globl getlab
|
||||
.globl e2
|
||||
.globl error
|
||||
.globl lvalue
|
||||
.globl rvalue
|
||||
.globl code
|
||||
.globl convrt
|
||||
.globl dou
|
||||
.globl dotabp
|
||||
.globl edotab
|
||||
.globl dotab
|
||||
|
||||
sdo:
|
||||
jsr r5,getlab
|
||||
br 9f
|
||||
jsr r5,dobeg
|
||||
cmp r0,$40.
|
||||
bne 9f
|
||||
rts r5
|
||||
|
||||
7:
|
||||
tst (sp)+
|
||||
8:
|
||||
tst (sp)+
|
||||
9:
|
||||
jsr r5,error; 42.
|
||||
rts r5
|
||||
|
||||
dobeg:
|
||||
mov dotabp,r2
|
||||
cmp r2,$edotab
|
||||
blo 1f
|
||||
jsr r5,error; 44.
|
||||
rts r5
|
||||
1:
|
||||
mov dou,dotab(r2)
|
||||
inc dou
|
||||
mov r0,dotab+2(r2)
|
||||
add $4,dotabp
|
||||
jsr r5,e2
|
||||
cmp r0,$38. / =
|
||||
bne 9b
|
||||
mov r2,-(sp)
|
||||
jsr r5,lvalue
|
||||
mov r3,-(sp)
|
||||
bic $!7,r3
|
||||
cmp r3,$1 / integer
|
||||
bne 7b
|
||||
jsr r5,e2
|
||||
cmp r0,$36. / ,
|
||||
bne 7b
|
||||
jsr r5,rvalue
|
||||
mov (sp),r2
|
||||
jsr r5,convrt
|
||||
mov (sp),r3
|
||||
clrb r3
|
||||
swab r3
|
||||
jsr r5,code
|
||||
< gas%d\n goto; 2f\n\0>; .even
|
||||
r3
|
||||
mov dotabp,r2
|
||||
mov dotab-4(r2),r0
|
||||
jsr r5,code
|
||||
<t%d:\n\0>; .even
|
||||
r0
|
||||
mov (sp)+,r3
|
||||
mov (sp)+,r2
|
||||
mov r0,-(sp)
|
||||
mov r3,-(sp)
|
||||
jsr r5,lvalue
|
||||
jsr r5,e2
|
||||
mov r0,-(sp)
|
||||
jsr r5,rvalue
|
||||
mov 2(sp),r2
|
||||
jsr r5,convrt
|
||||
cmp (sp)+,$36. / ,
|
||||
bne 1f
|
||||
jsr r5,e2
|
||||
mov r0,-(sp)
|
||||
jsr r5,rvalue
|
||||
mov 2(sp),r2
|
||||
jsr r5,convrt
|
||||
mov (sp)+,r0
|
||||
jsr r5,code
|
||||
< do2\0>; .even
|
||||
br 2f
|
||||
1:
|
||||
jsr r5,code
|
||||
< do1\0>; .even
|
||||
2:
|
||||
mov (sp)+,r3
|
||||
clrb r3
|
||||
swab r3
|
||||
mov (sp)+,r2
|
||||
jsr r5,code
|
||||
<%d; o%d\n2:\n\0>; .even
|
||||
r3
|
||||
r2
|
||||
rts r5
|
||||
|
||||
doend:
|
||||
tst r0
|
||||
bne 1f
|
||||
jsr pc,gen
|
||||
rts r5
|
||||
1:
|
||||
clr r2
|
||||
1:
|
||||
cmp r2,dotabp
|
||||
bhis 1f
|
||||
add $4,r2
|
||||
cmp r0,dotab-2(r2)
|
||||
bne 1b
|
||||
jsr pc,gen
|
||||
br doend
|
||||
1:
|
||||
rts r5
|
||||
|
||||
gen:
|
||||
mov r0,-(sp)
|
||||
mov dotabp,r2
|
||||
cmp r0,dotab-2(r2)
|
||||
beq 1f
|
||||
jsr r5,error; 43.
|
||||
1:
|
||||
mov dotab-4(r2),r0
|
||||
sub $4,dotabp
|
||||
jsr r5,code
|
||||
< goto; t%d\no%d:\n\0>; .even
|
||||
r0
|
||||
r0
|
||||
mov (sp)+,r0
|
||||
rts pc
|
||||
|
||||
@@ -0,0 +1,65 @@
|
||||
/
|
||||
/
|
||||
|
||||
/ f34 -- if statement
|
||||
|
||||
.globl sif
|
||||
|
||||
.globl e2
|
||||
.globl error
|
||||
.globl rvalue
|
||||
.globl code
|
||||
.globl ifstmt
|
||||
.globl iserror
|
||||
.globl getsym
|
||||
.globl geti
|
||||
.globl genop
|
||||
.globl getlab
|
||||
.globl newline
|
||||
|
||||
sif:
|
||||
jsr r5,e2 / expression
|
||||
jsr r5,iserror
|
||||
br 9f
|
||||
cmp r0,$34. / )
|
||||
bne 9f
|
||||
jsr r5,rvalue
|
||||
mov $"if,r0
|
||||
jsr r5,genop
|
||||
bic $!7,r3
|
||||
cmp r3,$3 / logical
|
||||
bne 1f
|
||||
jsr r5,code
|
||||
<; 1f\n\0>; .even
|
||||
jsr r5,ifstmt
|
||||
jsr r5,code
|
||||
<1:\n\0>; .even
|
||||
rts r5
|
||||
1:
|
||||
mov $3,-(sp)
|
||||
1:
|
||||
jsr r5,getlab
|
||||
br 8f
|
||||
jsr r5,code
|
||||
<; .%d\0>; .even
|
||||
r0
|
||||
dec (sp)
|
||||
beq 1f
|
||||
jsr r5,getsym
|
||||
cmp r0,$36.
|
||||
beq 1b
|
||||
8:
|
||||
tst (sp)+
|
||||
br 9f
|
||||
1:
|
||||
tst (sp)+
|
||||
jsr r5,newline
|
||||
jsr r5,getsym
|
||||
cmp r0,$40.
|
||||
bne 9f
|
||||
rts r5
|
||||
|
||||
9:
|
||||
jsr r5,error; 40.
|
||||
rts r5
|
||||
|
||||
@@ -0,0 +1,87 @@
|
||||
/
|
||||
/
|
||||
|
||||
/ f35 -- assignment statement
|
||||
|
||||
.globl sasgn
|
||||
.globl sassi
|
||||
|
||||
.globl error
|
||||
.globl e2
|
||||
.globl lvalue
|
||||
.globl rvalue
|
||||
.globl code
|
||||
.globl convrt
|
||||
.globl geti
|
||||
.globl getsym
|
||||
.globl getlab
|
||||
.globl genop
|
||||
.globl newline
|
||||
.globl name
|
||||
|
||||
sasgn:
|
||||
jsr r5,e2
|
||||
cmp r0,$38. / =
|
||||
bne 9f
|
||||
mov r2,-(sp)
|
||||
jsr r5,e2
|
||||
cmp r0,$40. / =|
|
||||
bne 8f
|
||||
tst *(sp)
|
||||
bne 1f / too hard for simple as
|
||||
jsr r5,rvalue
|
||||
mov (sp)+,r2
|
||||
mov 2(r2),r2
|
||||
mov r2,-(sp)
|
||||
mov symtab(r2),r2
|
||||
jsr r5,convrt
|
||||
mov r2,r3
|
||||
bis $7,r3
|
||||
mov $"mv,r0
|
||||
jsr r5,genop
|
||||
mov (sp)+,r3
|
||||
jsr r5,name
|
||||
rts r5
|
||||
1:
|
||||
mov r2,r3
|
||||
mov (sp)+,r2
|
||||
mov r3,-(sp)
|
||||
jsr r5,lvalue
|
||||
mov (sp)+,r2
|
||||
mov r3,-(sp)
|
||||
jsr r5,rvalue
|
||||
1:
|
||||
mov (sp)+,r2
|
||||
jsr r5,convrt
|
||||
mov r2,r3
|
||||
bis $7,r3 / type 'g'
|
||||
mov $"as,r0
|
||||
jsr r5,genop
|
||||
jsr r5,newline
|
||||
rts r5
|
||||
|
||||
sassi:
|
||||
jsr r5,getlab
|
||||
br 9f
|
||||
mov r0,-(sp)
|
||||
cmpb (r1)+,$'t
|
||||
bne 8f
|
||||
cmpb (r1)+,$'o
|
||||
bne 8f
|
||||
jsr r5,e2
|
||||
cmp r0,$40. / =|
|
||||
bne 8f
|
||||
jsr r5,lvalue
|
||||
mov (sp)+,r0
|
||||
mov r3,-(sp)
|
||||
jsr r5,code
|
||||
< lval; .%d\n\0>; .even
|
||||
r0
|
||||
mov $int2con,r3
|
||||
br 1b
|
||||
8:
|
||||
tst (sp)+
|
||||
9:
|
||||
jsr r5,error; 39.
|
||||
rts r5
|
||||
|
||||
@@ -0,0 +1,467 @@
|
||||
/
|
||||
/
|
||||
|
||||
/ f36 -- expression code generation
|
||||
|
||||
.globl lvalue
|
||||
.globl rvalue
|
||||
.globl convrt
|
||||
.globl type
|
||||
.globl funcappl
|
||||
.globl name
|
||||
|
||||
.globl error
|
||||
.globl lookup
|
||||
.globl code
|
||||
.globl iserror
|
||||
.globl genop
|
||||
.globl typ
|
||||
.globl newline
|
||||
.globl functn
|
||||
.globl size
|
||||
|
||||
lvalue:
|
||||
jsr r5,iserror
|
||||
rts r5
|
||||
tst (r2)
|
||||
bne 1f
|
||||
mov 2(r2),r3
|
||||
jsr r5,code
|
||||
< lval>; .even
|
||||
br name
|
||||
1:
|
||||
mov r2,-(sp)
|
||||
cmp (r2),$32. / array appl
|
||||
bne 1f
|
||||
jsr r5,aryappl
|
||||
dec r0
|
||||
bne 2f / dim =| 1
|
||||
tstb symtab(r3)
|
||||
blt 2f / p-bit, not simple
|
||||
mov $"al,r0
|
||||
br simpary
|
||||
2:
|
||||
jsr r5,code
|
||||
< alval\0>; .even
|
||||
|
||||
arydope:
|
||||
jsr r5,pbit
|
||||
mov symtab+2(r3),r2
|
||||
mov (r2)+,r0
|
||||
asl r0
|
||||
add r0,r2
|
||||
mov (r2),r0
|
||||
jsr r5,code
|
||||
<; d%d\0>; .even
|
||||
r0
|
||||
br 2f
|
||||
1:
|
||||
jsr r5,error; 54.
|
||||
mov (sp)+,r2
|
||||
rts r5
|
||||
|
||||
simpary:
|
||||
mov r3,-(sp)
|
||||
mov symtab(r3),r3
|
||||
bis $7,r3
|
||||
jsr r5,genop
|
||||
mov (sp)+,r3
|
||||
jsr r5,size
|
||||
jsr r5,code
|
||||
<; %d.\0>; .even
|
||||
r0
|
||||
br 2f
|
||||
|
||||
name:
|
||||
mov r2,-(sp)
|
||||
jsr r5,pbit
|
||||
2:
|
||||
jsr r5,code
|
||||
<; \0>; .even
|
||||
bit $100,symtab(r3) / common
|
||||
beq 1f
|
||||
mov symtab+4(r3),r2
|
||||
jsr r5,code
|
||||
<%n+\0>; .even
|
||||
r2
|
||||
1:
|
||||
movb symtab(r3),r2
|
||||
bic $!70,r2
|
||||
cmp r2,$30 / external
|
||||
bne 1f
|
||||
jsr r5,code
|
||||
<%n.\n\0>; .even
|
||||
r3
|
||||
br 2f
|
||||
1:
|
||||
jsr r5,code
|
||||
<%n_\n\0>; .even
|
||||
r3
|
||||
2:
|
||||
mov symtab(r3),r3
|
||||
mov (sp)+,r2
|
||||
rts r5
|
||||
|
||||
rvalue:
|
||||
jsr r5,iserror
|
||||
rts r5
|
||||
mov r2,-(sp)
|
||||
tst (r2)
|
||||
bne 1f
|
||||
mov 2(r2),r3
|
||||
movb symtab+1(r3),r2
|
||||
jsr r5,code
|
||||
< rval%d>; .even
|
||||
r2
|
||||
mov (sp)+,r2
|
||||
br name
|
||||
1:
|
||||
cmp (r2),$32.
|
||||
bne 1f
|
||||
jsr r5,aryappl
|
||||
dec r0
|
||||
bne 3f
|
||||
tstb symtab(r3)
|
||||
blt 3f
|
||||
mov $"ar,r0
|
||||
br simpary
|
||||
3:
|
||||
jsr r5,code
|
||||
< arval\0>; .even
|
||||
br arydope
|
||||
1:
|
||||
cmp (r2),$34. / array appl
|
||||
bne 1f
|
||||
jsr r5,funcappl
|
||||
mov (sp)+,r2
|
||||
mov 2(r2),r3
|
||||
movb symtab+1(r3),r0
|
||||
jsr r5,code
|
||||
<%d.\n\0>; .even
|
||||
r0
|
||||
mov symtab(r3),r3
|
||||
rts r5
|
||||
1:
|
||||
cmp (r2),$2
|
||||
bne 1f
|
||||
movb 3(r2),r3
|
||||
mov 4(r2),r2
|
||||
jsr r5,code
|
||||
< rval%d; c%d\n\0>; .even
|
||||
r3
|
||||
r2
|
||||
mov (sp)+,r2
|
||||
mov 2(r2),r3
|
||||
rts r5
|
||||
1:
|
||||
cmp (r2),$24. / arith or relat
|
||||
bhi 1f
|
||||
mov 2(r2),r2
|
||||
bne 3f
|
||||
mov (sp),r2
|
||||
sub $10.,(r2) / - bin -> - unary
|
||||
mov 4(r2),r2
|
||||
jsr r5,rvalue
|
||||
br 2f
|
||||
3:
|
||||
jsr r5,rvalue
|
||||
mov (sp),r2
|
||||
mov r3,-(sp)
|
||||
mov 4(r2),r2
|
||||
jsr r5,type
|
||||
cmp *2(sp),$4 / **
|
||||
bne 3f
|
||||
mov r3,r2
|
||||
bic $!7,r2
|
||||
cmp r2,$1 / ** integer
|
||||
bne 3f
|
||||
mov 2(sp),r2
|
||||
sub $2,(r2) / pr -> pi
|
||||
mov 4(r2),r2
|
||||
jsr r5,rvalue
|
||||
mov $intcon,r2
|
||||
jsr r5,convrt
|
||||
mov (sp)+,r3
|
||||
br 2f
|
||||
3:
|
||||
mov (sp),r2
|
||||
jsr pc,maxtyp
|
||||
mov (sp)+,r3
|
||||
mov r2,-(sp)
|
||||
jsr r5,convrt
|
||||
mov 2(sp),r2
|
||||
mov 4(r2),r2
|
||||
jsr r5,rvalue
|
||||
mov (sp)+,r2
|
||||
jsr r5,convrt
|
||||
mov r2,r3
|
||||
br 2f
|
||||
1:
|
||||
cmp (r2),$30. / and or not
|
||||
bhi 1f
|
||||
mov 2(r2),r2
|
||||
beq 3f
|
||||
jsr r5,rvalue
|
||||
mov $logcon,r2
|
||||
jsr r5,convrt
|
||||
3:
|
||||
mov (sp),r2
|
||||
mov 4(r2),r2
|
||||
jsr r5,rvalue
|
||||
mov $logcon,r2
|
||||
jsr r5,convrt
|
||||
2:
|
||||
mov (sp)+,r2
|
||||
mov (r2),r0
|
||||
cmp r0,$4
|
||||
bhis 2f
|
||||
add $10.,(r2) / back to binary
|
||||
tst r0
|
||||
beq 2f
|
||||
sub $8,(r2) / back to pr
|
||||
2:
|
||||
mov optab(r0),r0
|
||||
jsr r5,genop
|
||||
jsr r5,newline
|
||||
cmp (r2),$14. / relat
|
||||
blo 2f
|
||||
mov $logcon,r3
|
||||
2:
|
||||
rts r5
|
||||
1:
|
||||
jsr r5,error; 54.
|
||||
mov (sp)+,r2
|
||||
rts r5
|
||||
|
||||
pbit:
|
||||
tstb symtab(r3)
|
||||
bge 1f
|
||||
jsr r5,code
|
||||
<p\0>
|
||||
1:
|
||||
rts r5
|
||||
|
||||
funcappl:
|
||||
mov r2,-(sp)
|
||||
mov functn,r3
|
||||
jsr r5,code
|
||||
< stsp; ft+%d.\n\0>; .even
|
||||
r3
|
||||
mov r3,-(sp)
|
||||
add $2,r3
|
||||
mov r3,functn
|
||||
clr -(sp) / nargs
|
||||
1:
|
||||
mov 4(r2),r2
|
||||
beq 2f
|
||||
inc (sp)
|
||||
cmp (r2),$36. / ,
|
||||
bne 1f
|
||||
mov r2,-(sp)
|
||||
mov 2(r2),r2
|
||||
mov 6(sp),r3
|
||||
jsr r5,fapp1
|
||||
mov (sp)+,r2
|
||||
br 1b
|
||||
1:
|
||||
mov 4(sp),r3
|
||||
jsr r5,fapp1
|
||||
2:
|
||||
mov (sp)+,r0 / nargs
|
||||
mov (sp)+,r2
|
||||
mov (sp)+,r3
|
||||
mov 2(r3),r3
|
||||
jsr r5,code
|
||||
< call\0>; .even
|
||||
jsr r5,pbit
|
||||
jsr r5,code
|
||||
<; %n.; ft+%d.; %d.; \0>; .even
|
||||
r3
|
||||
r2
|
||||
r0
|
||||
cmp functn,functm
|
||||
ble 1f
|
||||
mov functn,functm
|
||||
1:
|
||||
mov r2,functn
|
||||
rts r5
|
||||
|
||||
fapp1:
|
||||
mov 2(r3),r3 / fetch out function name
|
||||
mov symtab+2(r3),r3 / arg conversion
|
||||
bne 2f
|
||||
tst (r2)
|
||||
beq 1f
|
||||
cmp (r2),$32.
|
||||
beq 4f
|
||||
cmp (r2),$42. / lv if funct or name or arry app
|
||||
beq 1f
|
||||
cmp (r2),$2 / lv if const
|
||||
bne 2f
|
||||
mov 4(r2),r3
|
||||
jsr r5,code
|
||||
< lval; c%d\n\0>
|
||||
r3
|
||||
br 3f
|
||||
2:
|
||||
mov r3,-(sp)
|
||||
jsr r5,rvalue
|
||||
mov (sp)+,r2
|
||||
beq 2f
|
||||
jsr r5,convrt
|
||||
2:
|
||||
mov functn,r3
|
||||
jsr r5,code
|
||||
< stsp; ft+%d.\n\0>; .even
|
||||
r3
|
||||
add $2,functn
|
||||
rts r5
|
||||
1:
|
||||
clr (r2) / turn func/array names into lvs
|
||||
4:
|
||||
jsr r5,lvalue
|
||||
3:
|
||||
mov functn,r3
|
||||
jsr r5,code
|
||||
< stst; ft+%d.\n\0>; .even
|
||||
r3
|
||||
add $2,functn
|
||||
rts r5
|
||||
|
||||
aryappl:
|
||||
mov r2,-(sp)
|
||||
clr -(sp) / arg count
|
||||
2:
|
||||
inc (sp)
|
||||
mov 4(r2),r2
|
||||
cmp (r2),$36. / ,
|
||||
bne 2f
|
||||
mov r2,-(sp)
|
||||
mov 2(r2),r2
|
||||
jsr r5,rvalue
|
||||
mov $intcon,r2
|
||||
jsr r5,convrt
|
||||
mov (sp)+,r2
|
||||
br 2b
|
||||
2:
|
||||
jsr r5,rvalue
|
||||
mov $intcon,r2
|
||||
jsr r5,convrt
|
||||
mov (sp)+,r0
|
||||
mov (sp)+,r2
|
||||
mov 2(r2),r3
|
||||
cmp r0,*symtab+2(r3)
|
||||
beq 1f
|
||||
jsr r5,error; 53. / dimension mismatch
|
||||
1:
|
||||
rts r5
|
||||
|
||||
/ converts stack from type in r3 to type in r2
|
||||
convrt:
|
||||
mov r2,-(sp)
|
||||
mov r3,-(sp)
|
||||
bic $![377\<8+7],r2
|
||||
bic $![377\<8+7],r3
|
||||
cmp r2,r3
|
||||
beq 1f
|
||||
jsr r5,code
|
||||
< \0>; .even
|
||||
jsr pc,2f
|
||||
mov r2,r3
|
||||
jsr pc,2f
|
||||
jsr r5,code
|
||||
<\n\0>; .even
|
||||
1:
|
||||
mov (sp)+,r3
|
||||
mov (sp)+,r2
|
||||
rts r5
|
||||
2:
|
||||
mov r2,-(sp)
|
||||
mov r3,r2
|
||||
clrb r3
|
||||
swab r3
|
||||
bic $!7,r2
|
||||
movb typ(r2),r2
|
||||
jsr r5,code
|
||||
<%c%d\0>; .even
|
||||
r2
|
||||
r3
|
||||
mov (sp)+,r2
|
||||
rts pc
|
||||
|
||||
type:
|
||||
cmp (r2),$32.
|
||||
beq 2f
|
||||
cmp (r2),$34.
|
||||
beq 2f
|
||||
tst (r2)
|
||||
bne 1f
|
||||
2:
|
||||
mov 2(r2),r3
|
||||
mov symtab(r3),r3
|
||||
rts r5
|
||||
1:
|
||||
cmp (r2),$2
|
||||
bne 1f
|
||||
mov 2(r2),r3
|
||||
rts r5
|
||||
1:
|
||||
cmp (r2),$14.
|
||||
blo 1f
|
||||
mov $logcon,r3
|
||||
rts r5
|
||||
1:
|
||||
mov r2,-(sp)
|
||||
mov 2(r2),r2
|
||||
bne 1f
|
||||
mov (sp),r2
|
||||
mov 4(r2),r2
|
||||
jsr r5,type
|
||||
br 2f
|
||||
1:
|
||||
jsr r5,type
|
||||
mov (sp),r2
|
||||
mov r3,-(sp)
|
||||
mov 4(r2),r2
|
||||
jsr r5,type
|
||||
mov (sp)+,r2
|
||||
jsr pc,maxtyp
|
||||
mov r2,r3
|
||||
2:
|
||||
mov (sp)+,r2
|
||||
rts r5
|
||||
|
||||
maxtyp:
|
||||
mov r2,r0
|
||||
cmp r2,r3
|
||||
bhis 2f
|
||||
mov r3,r2
|
||||
2:
|
||||
clrb r2
|
||||
bic $!7,r0
|
||||
bic $!7,r3
|
||||
cmp r0,r3
|
||||
bhis 2f
|
||||
mov r3,r0
|
||||
2:
|
||||
bis r0,r2
|
||||
rts pc
|
||||
|
||||
optab:
|
||||
<ng>
|
||||
<pi>
|
||||
<pr>
|
||||
<dv>
|
||||
<mp>
|
||||
<sb>
|
||||
<ad>
|
||||
<lt>
|
||||
<le>
|
||||
<eq>
|
||||
<ne>
|
||||
<gt>
|
||||
<ge>
|
||||
<nt>
|
||||
<an>
|
||||
<or>
|
||||
|
||||
@@ -0,0 +1,96 @@
|
||||
/
|
||||
/
|
||||
|
||||
/ f37 -- goto statements of all kinds
|
||||
|
||||
.globl sgoto
|
||||
.globl intexp
|
||||
|
||||
.globl e2
|
||||
.globl code
|
||||
.globl getsym
|
||||
.globl error
|
||||
.globl getlab
|
||||
.globl rvalue
|
||||
.globl convrt
|
||||
.globl chrtab
|
||||
|
||||
sgoto:
|
||||
movb (r1),r0
|
||||
cmpb chrtab(r0),$4 / test digit
|
||||
bne 1f / not constant
|
||||
jsr r5,getlab
|
||||
br 8f
|
||||
jsr r5,code
|
||||
< goto; .%d\n\0>; .even
|
||||
r0
|
||||
br 9f
|
||||
1:
|
||||
cmpb (r1),$'(
|
||||
beq 1f
|
||||
jsr r5,intexp
|
||||
cmp r0,$36. / ,
|
||||
beq 2f
|
||||
jsr r5,code
|
||||
< agoto\n\0>; .even
|
||||
br 9f
|
||||
2:
|
||||
jsr r5,code
|
||||
< cagoto\n\0>; .even
|
||||
cmpb (r1)+,$'(
|
||||
bne 8f / syntax
|
||||
jsr pc,stmlist
|
||||
br 9f
|
||||
1:
|
||||
mov r1,r4
|
||||
1:
|
||||
movb (r1)+,r0
|
||||
beq 8f
|
||||
cmp r0,$')
|
||||
bne 1b
|
||||
cmpb (r1)+,$',
|
||||
bne 8f
|
||||
jsr r5,intexp
|
||||
mov r1,-(sp)
|
||||
jsr r5,code
|
||||
< cgoto\n\0>; .even
|
||||
mov r4,r1
|
||||
tstb (r1)+
|
||||
jsr pc,stmlist
|
||||
mov (sp)+,r1
|
||||
9:
|
||||
tstb (r1)
|
||||
beq 1f
|
||||
8:
|
||||
jsr r5,error; 35.
|
||||
1:
|
||||
rts r5
|
||||
|
||||
stmlist:
|
||||
jsr r5,getlab
|
||||
br 9f
|
||||
jsr r5,code
|
||||
< .%d\n\0>; .even
|
||||
r0
|
||||
movb (r1)+,r0
|
||||
cmp r0,$',
|
||||
beq stmlist
|
||||
cmp r0,$')
|
||||
bne 8f
|
||||
jsr r5,code
|
||||
< 0\n\0>; .even
|
||||
rts pc
|
||||
8:
|
||||
jsr r5,error; 35.
|
||||
9:
|
||||
rts pc
|
||||
|
||||
intexp:
|
||||
jsr r5,e2
|
||||
mov r0,-(sp)
|
||||
jsr r5,rvalue
|
||||
mov $intcon,r2
|
||||
jsr r5,convrt
|
||||
mov (sp)+,r0
|
||||
rts r5
|
||||
|
||||
@@ -0,0 +1,95 @@
|
||||
/
|
||||
/
|
||||
|
||||
/ f38 -- wierdo statements
|
||||
|
||||
.globl sstop
|
||||
.globl scall
|
||||
.globl spaus
|
||||
.globl sretu
|
||||
.globl scont
|
||||
.globl iserror
|
||||
|
||||
.globl ptemp
|
||||
.globl code
|
||||
.globl geti
|
||||
.globl getsym
|
||||
.globl error
|
||||
.globl declimpl
|
||||
.globl e11
|
||||
.globl funcappl
|
||||
|
||||
sstop:
|
||||
clr r0
|
||||
tstb (r1)
|
||||
beq 1f
|
||||
jsr r5,getsym
|
||||
cmp r0,$2. / const
|
||||
bne 7f
|
||||
cmp r3,$intcon
|
||||
bne 7f
|
||||
jsr r5,geti
|
||||
1:
|
||||
jsr r5,code
|
||||
< stop; %d\n\0>; .even
|
||||
r0
|
||||
br 8f
|
||||
|
||||
spaus:
|
||||
jsr r5,getsym
|
||||
cmp r0,$2
|
||||
bne 7f
|
||||
cmp r3,$intcon
|
||||
bne 7f
|
||||
jsr r5,geti
|
||||
jsr r5,code
|
||||
< paus; %d\n\0>; .even
|
||||
r0
|
||||
br 8f
|
||||
|
||||
sretu:
|
||||
tst progt
|
||||
bne 1f
|
||||
jsr r5,error; 37. / return in main
|
||||
br sstop
|
||||
1:
|
||||
jsr r5,code
|
||||
< retrn\n\0>; .even
|
||||
8:
|
||||
scont:
|
||||
tstb (r1)
|
||||
bne 7f
|
||||
rts r5
|
||||
7:
|
||||
jsr r5,error; 38.
|
||||
rts r5
|
||||
|
||||
iserror:
|
||||
cmp errp,$errb
|
||||
bne 1f
|
||||
tst (r5)+
|
||||
1:
|
||||
rts r5
|
||||
|
||||
scall:
|
||||
jsr r5,getsym
|
||||
tst r0
|
||||
bne 7b
|
||||
bit $70,symtab(r3)
|
||||
bne 1f
|
||||
bis $30,symtab(r3)
|
||||
1:
|
||||
jsr r5,declimpl
|
||||
jsr r5,e11
|
||||
cmp r0,$40.
|
||||
bne 7b
|
||||
cmp (r2),$34.
|
||||
beq 1f
|
||||
cmp (r2),$42.
|
||||
bne 7b
|
||||
1:
|
||||
jsr r5,funcappl
|
||||
jsr r5,code
|
||||
<0\n\0>; .even
|
||||
br 8b
|
||||
|
||||
@@ -0,0 +1,258 @@
|
||||
/
|
||||
/
|
||||
|
||||
/ f39 -- i/o statements
|
||||
|
||||
.globl sread
|
||||
.globl swrit
|
||||
.globl sprin
|
||||
.globl sback
|
||||
.globl srewi
|
||||
.globl sendf
|
||||
|
||||
.globl getsym
|
||||
.globl error
|
||||
.globl geticon
|
||||
.globl e2
|
||||
.globl lvalue
|
||||
.globl rvalue
|
||||
.globl iserror
|
||||
.globl convrt
|
||||
.globl code
|
||||
.globl chrtab
|
||||
.globl blocks
|
||||
.globl blockp
|
||||
.globl doend
|
||||
.globl genop
|
||||
.globl levzer
|
||||
.globl dobeg
|
||||
.globl intexp
|
||||
.globl ptemp
|
||||
.globl blocks
|
||||
.globl blockp
|
||||
.globl intexp
|
||||
.globl newline
|
||||
.globl nelem
|
||||
|
||||
sprin:
|
||||
mov $8.,-(sp)
|
||||
jsr r5,getfmt
|
||||
br 9f
|
||||
cmp r0,$36. / ,
|
||||
beq 1f
|
||||
cmp r0,$40. / =|
|
||||
bne 8f
|
||||
clrb (r1)
|
||||
1:
|
||||
mov $34.,r0 / simulate )
|
||||
br 2f
|
||||
|
||||
sread:
|
||||
mov $2,-(sp)
|
||||
br 1f
|
||||
|
||||
swrit:
|
||||
clr -(sp)
|
||||
|
||||
1:
|
||||
cmpb (r1)+,$'(
|
||||
bne 8f
|
||||
jsr r5,intexp
|
||||
mov $blocks,blockp
|
||||
cmp r0,$34. / ), implies unformatted
|
||||
beq 2f
|
||||
cmp r0,$36. / ,
|
||||
bne 8f
|
||||
jsr r5,getfmt
|
||||
br 9f
|
||||
add $4,(sp)
|
||||
cmp r0,$34. / )
|
||||
bne 8f
|
||||
2:
|
||||
mov (sp),r0
|
||||
mov iotype(r0),r0
|
||||
jsr r5,code
|
||||
< %s\n\0>; .even
|
||||
r0
|
||||
1:
|
||||
tstb (r1)
|
||||
beq 9f
|
||||
1:
|
||||
jsr r5,list
|
||||
cmp r0,$40. / |=
|
||||
beq 9f
|
||||
8:
|
||||
jsr r5,error; 41.
|
||||
9:
|
||||
jsr r5,code
|
||||
< endio\n\0>; .even
|
||||
tst (sp)+
|
||||
rts r5
|
||||
|
||||
iotype:
|
||||
1f
|
||||
2f
|
||||
3f
|
||||
4f
|
||||
5f
|
||||
|
||||
1:
|
||||
<iowu\0>
|
||||
2:
|
||||
<ioru\0>
|
||||
3:
|
||||
<iowf\0>
|
||||
4:
|
||||
<iorf\0>
|
||||
5:
|
||||
<iowp\0>
|
||||
.even
|
||||
|
||||
getfmt:
|
||||
movb (r1),r0
|
||||
cmpb chrtab(r0),$4 / digit
|
||||
beq 1f
|
||||
jsr r5,e2
|
||||
jsr r5,iserror
|
||||
rts r5
|
||||
mov r0,-(sp)
|
||||
jsr r5,lvalue
|
||||
mov $blocks,blockp
|
||||
br 8f
|
||||
1:
|
||||
jsr r5,geticon
|
||||
br 8f
|
||||
mov r0,temp
|
||||
jsr r5,ptemp; 'i; temp; line / register use of format
|
||||
jsr r5,code
|
||||
< lval; .%d\n\0>; .even
|
||||
r0
|
||||
jsr r5,getsym
|
||||
mov r0,-(sp)
|
||||
8:
|
||||
mov (sp)+,r0
|
||||
tst (r5)+
|
||||
rts r5
|
||||
|
||||
list:
|
||||
jsr r5,lstitm
|
||||
cmp r0,$36. / ,
|
||||
beq list
|
||||
rts r5
|
||||
|
||||
lstitm:
|
||||
mov $blocks,blockp
|
||||
cmpb (r1),$'( / test for sublist
|
||||
beq 1f
|
||||
jsr r5,e2
|
||||
jsr r5,iserror
|
||||
rts r5
|
||||
mov r0,-(sp)
|
||||
clr -(sp)
|
||||
tst (r2)
|
||||
bne 2f / test for name
|
||||
mov 2(r2),r3
|
||||
mov symtab(r3),r0
|
||||
bic $!70,r0
|
||||
cmp r0,$20 / test for short list
|
||||
bne 2f
|
||||
mov pc,(sp)
|
||||
mov symtab+2(r3),r3
|
||||
mov (r3)+,-(sp)
|
||||
asl (sp)
|
||||
add (sp)+,r3
|
||||
mov (r3),r3
|
||||
jsr r5,code
|
||||
< slist1; d%d\n2:\0>; .even
|
||||
r3
|
||||
2:
|
||||
jsr r5,lvalue
|
||||
tst (sp)
|
||||
beq 3f
|
||||
jsr r5,code
|
||||
< slist3\n\0>; .even
|
||||
3:
|
||||
mov $"io,r0
|
||||
jsr r5,genop
|
||||
tst (sp)+
|
||||
beq 2f
|
||||
jsr r5,code
|
||||
<\n slist2; 2b\0>; .even
|
||||
2:
|
||||
jsr r5,newline
|
||||
mov (sp)+,r0
|
||||
rts r5
|
||||
1:
|
||||
inc r1
|
||||
jsr r5,levzer; '=
|
||||
br 1f / yes, implied do
|
||||
jsr r5,list
|
||||
jsr r5,chkel
|
||||
jsr r5,getsym
|
||||
rts r5
|
||||
1:
|
||||
cmp r1,r0
|
||||
bhis 8f
|
||||
cmpb -(r0),$', / look backwards
|
||||
bne 1b
|
||||
mov r0,-(sp)
|
||||
mov r1,-(sp)
|
||||
movb $'),(r0) / fake!!
|
||||
mov r0,r1
|
||||
inc r1
|
||||
clr r0
|
||||
jsr r5,dobeg / get do
|
||||
jsr r5,chkel
|
||||
mov (sp)+,r0
|
||||
mov r1,-(sp)
|
||||
mov r0,r1
|
||||
jsr r5,list
|
||||
jsr r5,chkel
|
||||
clr r0
|
||||
jsr r5,doend
|
||||
mov (sp)+,r1
|
||||
movb $',,*(sp)+ / unfake!!
|
||||
jsr r5,getsym
|
||||
rts r5
|
||||
|
||||
chkel:
|
||||
cmp r0,$34. / )
|
||||
beq 1f
|
||||
8:
|
||||
jsr r5,error; 41.
|
||||
1:
|
||||
rts r5
|
||||
|
||||
sback:
|
||||
mov $bksp,r2
|
||||
br 1f
|
||||
|
||||
srewi:
|
||||
mov $rewi,r2
|
||||
br 1f
|
||||
|
||||
sendf:
|
||||
mov $enfl,r2
|
||||
|
||||
1:
|
||||
mov r2,-(sp)
|
||||
jsr r5,intexp
|
||||
mov (sp),r2
|
||||
jsr r5,code
|
||||
< %s\n\0>; .even
|
||||
r2
|
||||
cmp r0,$40. / =|
|
||||
beq 9f
|
||||
8:
|
||||
jsr r5,error; 41.
|
||||
9:
|
||||
tst (sp)+
|
||||
rts r5
|
||||
|
||||
bksp:
|
||||
<bksp\0>
|
||||
rewi:
|
||||
<rewi\0>
|
||||
enfl:
|
||||
<enfl\0>
|
||||
|
||||
Reference in New Issue
Block a user