Add original unix v6
This commit is contained in:
@@ -0,0 +1,17 @@
|
||||
i = r3
|
||||
f = r5
|
||||
.globl x,j
|
||||
.globl succ,fail
|
||||
.globl ctest,iget
|
||||
.globl any
|
||||
|
||||
any:
|
||||
mov j(f),-(sp)
|
||||
jsr pc,iget
|
||||
jsr pc,ctest
|
||||
bcs 1f
|
||||
mov (sp)+,j(f)
|
||||
jmp fail
|
||||
1:
|
||||
tst (sp)+
|
||||
jmp succ
|
||||
@@ -0,0 +1,16 @@
|
||||
.globl succ
|
||||
.globl putcstr,iget
|
||||
.globl append
|
||||
|
||||
append:
|
||||
jsr pc,iget
|
||||
mov r0,-(sp)
|
||||
1:
|
||||
movb *(sp),r0
|
||||
beq 1f
|
||||
jsr pc,putcstr
|
||||
inc (sp)
|
||||
br 1b
|
||||
1:
|
||||
tst (sp)+
|
||||
jmp succ
|
||||
@@ -0,0 +1,56 @@
|
||||
.globl succ,fail,iget
|
||||
.globl seekchar,getword,alterword
|
||||
.globl sprv,update
|
||||
.globl .l,.u,.p,.t,.st,
|
||||
|
||||
/ infix =
|
||||
.st:
|
||||
jsr pc,sprv
|
||||
mov (sp)+,(sp)
|
||||
mov (sp)+,(sp)
|
||||
/ update
|
||||
.u:
|
||||
jsr pc,update
|
||||
br 9f
|
||||
/ pop stack
|
||||
.p:
|
||||
jsr pc,sprv
|
||||
cmp (sp)+,(sp)+
|
||||
br 9f
|
||||
/ test stack
|
||||
.t:
|
||||
jsr pc,sprv
|
||||
mov (sp)+,(sp)+
|
||||
bne 9f
|
||||
jmp fail
|
||||
/ load named value
|
||||
/ rvalue into (sp), lvalue into 2(sp)
|
||||
.l:
|
||||
jsr pc,iget
|
||||
mov r0,-(sp)
|
||||
mov (r0),-(sp)
|
||||
br 9f
|
||||
/ update a stored value, used by all assignments
|
||||
update:
|
||||
cmp 2+2(sp),$-1
|
||||
beq 1f
|
||||
mov 0+2(sp),*2+2(sp)
|
||||
rts pc
|
||||
1:
|
||||
mov 4+2(sp),r1
|
||||
mov 6+2(sp),r0
|
||||
jsr pc,seekchar
|
||||
mov 0+2(sp),r0
|
||||
jsr pc,alterword
|
||||
/ make sp hold a simple rv (forget it might be a table value)
|
||||
sprv:
|
||||
mov (sp)+,r0
|
||||
cmp $-1,2(sp)
|
||||
bne 1f
|
||||
mov (sp)+,(sp)
|
||||
mov (sp)+,(sp)
|
||||
1:
|
||||
mov r0,pc
|
||||
9:
|
||||
jmp succ
|
||||
|
||||
@@ -0,0 +1,25 @@
|
||||
f = r5
|
||||
g = r4
|
||||
.globl g1
|
||||
.globl pbundle,iget
|
||||
.globl succ
|
||||
.globl bundle,reduce
|
||||
|
||||
reduce:
|
||||
jsr pc,iget
|
||||
mov (r0),r1
|
||||
mov g,r0
|
||||
asl r1
|
||||
sub r1,r0
|
||||
br 1f
|
||||
br 1f
|
||||
bundle:
|
||||
mov f,r0
|
||||
add $g1,r0
|
||||
1:
|
||||
jsr pc,pbundle
|
||||
tst r0
|
||||
beq 1f
|
||||
mov r0,(g)+
|
||||
1:
|
||||
jmp succ
|
||||
@@ -0,0 +1,18 @@
|
||||
f = r5
|
||||
i = r3
|
||||
.globl j
|
||||
.globl jget,iget
|
||||
.globl char
|
||||
.globl succ,fail
|
||||
|
||||
char:
|
||||
jsr pc,jget
|
||||
bne 1f
|
||||
tst (i)+
|
||||
jmp fail
|
||||
1:
|
||||
mov r0,-(sp)
|
||||
jsr pc,iget
|
||||
mov (sp)+,(r0)
|
||||
inc j(f)
|
||||
jmp succ
|
||||
@@ -0,0 +1,36 @@
|
||||
f = r5
|
||||
i = r3
|
||||
.globl x,k
|
||||
.globl ktab,ktat
|
||||
.globl putcall,obuild
|
||||
.globl errcom,succ,generate
|
||||
.globl rewcstr,getcstr
|
||||
.globl scopy
|
||||
|
||||
scopy:
|
||||
mov $2f+1,r0
|
||||
jsr pc,putcall
|
||||
jsr pc,rewcstr
|
||||
mov k(f),r2
|
||||
neg r2
|
||||
add $2,r2
|
||||
1:
|
||||
jsr pc,getcstr
|
||||
tst r0
|
||||
beq 1f
|
||||
movb r0,ktab(r2)
|
||||
inc r2
|
||||
cmp r2,$ktat
|
||||
blt 1b
|
||||
jsr r0,errcom
|
||||
<translation overflow\0>;.even
|
||||
1:
|
||||
clrb ktab(r2)
|
||||
bic $1,r2
|
||||
neg r2
|
||||
mov r2,k(f)
|
||||
jmp succ
|
||||
2:
|
||||
mov i,r0
|
||||
jsr pc,obuild
|
||||
jmp generate
|
||||
@@ -0,0 +1,75 @@
|
||||
.globl jget,iget
|
||||
.globl succ
|
||||
.globl create,rewind,putchar,getchar,allocate
|
||||
.globl smark
|
||||
.globl rewcstr,putcstr,getcstr,size
|
||||
|
||||
/ currnet string manipulations
|
||||
/ keep a initial fragment handy for quick access
|
||||
/go to allocator for the rest
|
||||
|
||||
smark:
|
||||
jsr pc,jget
|
||||
clr cstrw
|
||||
jmp succ
|
||||
|
||||
rewcstr:
|
||||
clr cstrr
|
||||
rts pc
|
||||
|
||||
putcstr:
|
||||
mov cstrw,r1
|
||||
inc cstrw
|
||||
cmp r1,$cstrt /is it quick access?
|
||||
bge 1f
|
||||
movb r0,cstrb(r1) /yes, stash the char
|
||||
rts pc
|
||||
1:
|
||||
bne 1f
|
||||
mov r0,-(sp) /first char to allocator
|
||||
mov symp,r1
|
||||
bne 2f
|
||||
mov $64,r0
|
||||
jsr pc,allocate
|
||||
mov r1,symp
|
||||
2:
|
||||
jsr pc,create
|
||||
mov (sp)+,r0
|
||||
1:
|
||||
mov symp,r1
|
||||
jsr pc,putchar
|
||||
rts pc
|
||||
|
||||
getcstr:
|
||||
mov cstrr,r1
|
||||
cmp r1,cstrw
|
||||
blt 1f
|
||||
clr r0 /end of string
|
||||
rts pc
|
||||
1:
|
||||
inc cstrr
|
||||
cmp r1,$cstrt
|
||||
bge 1f
|
||||
movb cstrb(r1),r0
|
||||
rts pc
|
||||
1:
|
||||
bne 1f
|
||||
mov symp,r1
|
||||
jsr pc,rewind
|
||||
1:
|
||||
mov symp,r1
|
||||
jsr pc,getchar
|
||||
rts pc
|
||||
|
||||
size:
|
||||
jsr pc,iget
|
||||
mov cstrw,(r0)
|
||||
jmp succ
|
||||
|
||||
cstrt = 16 /top of quick access current string
|
||||
.data
|
||||
symp: 0 /pointer to dynamicallly allocated current string
|
||||
cstrw: 0 /current string write pointer
|
||||
.bss
|
||||
cstrr: .=.+2 /read pointer
|
||||
cstrb: .=.+cstrt /base of quick access fragment
|
||||
@@ -0,0 +1,24 @@
|
||||
f = r5
|
||||
.globl j
|
||||
.globl classtab,jget
|
||||
.globl ctest
|
||||
.globl putcstr
|
||||
.globl succ
|
||||
|
||||
ctest:
|
||||
inc ctestc
|
||||
mov r0,-(sp)
|
||||
jsr pc,jget
|
||||
asl r0
|
||||
bit *(sp)+,classtab(r0)
|
||||
clc
|
||||
beq 1f
|
||||
asr r0
|
||||
jsr pc,putcstr
|
||||
inc j(f)
|
||||
sec
|
||||
1:
|
||||
rts pc
|
||||
|
||||
.data
|
||||
ctestc: 0
|
||||
@@ -0,0 +1,16 @@
|
||||
i = r3
|
||||
.globl putcall,iget,kput,putdec
|
||||
.globl generate,succ
|
||||
.globl decimal
|
||||
|
||||
decimal:
|
||||
mov $1f+1,r0
|
||||
jsr pc,putcall
|
||||
jsr pc,iget
|
||||
mov (r0),r0
|
||||
jsr pc,kput
|
||||
jmp succ
|
||||
1:
|
||||
mov (i),r0
|
||||
jsr pc,putdec
|
||||
jmp generate
|
||||
@@ -0,0 +1,9 @@
|
||||
.globl release
|
||||
.globl discard
|
||||
.globl iget,succ
|
||||
|
||||
discard:
|
||||
jsr pc,iget
|
||||
mov (r0),r1
|
||||
jsr pc,release
|
||||
jmp succ
|
||||
@@ -0,0 +1,42 @@
|
||||
f=r5
|
||||
g=r4
|
||||
.globl ofile
|
||||
.globl dogen
|
||||
.globl succ
|
||||
.globl g1,k
|
||||
.globl emit
|
||||
|
||||
emit:
|
||||
mov f,-(sp)
|
||||
add $g1,(sp)
|
||||
mov g,r1
|
||||
1: /look for a translation
|
||||
cmp (sp),r1
|
||||
bge 3f /none at all
|
||||
bit -(r1),$100001
|
||||
beq 1b
|
||||
/move it to end of stak
|
||||
mov (r1)+,r0
|
||||
1:
|
||||
cmp g,r1
|
||||
ble 1f
|
||||
mov (r1),-2(r1)
|
||||
mov r0,(r1)+
|
||||
br 1b
|
||||
1:
|
||||
mov ofile,r0
|
||||
jsr pc,dogen
|
||||
mov g,r1
|
||||
1:
|
||||
cmp (sp),r1 /try to find prev value of k
|
||||
bge 1f /nothing more in this stack frame
|
||||
tst -(r1)
|
||||
bge 1b /this isnt a k pointer (negative)
|
||||
mov (r1),k(f)
|
||||
br 3f
|
||||
1:
|
||||
mov f,r0 /go back to prev stack frame
|
||||
mov k(r0),k(f)
|
||||
3:
|
||||
tst (sp)+
|
||||
jmp succ
|
||||
@@ -0,0 +1,3 @@
|
||||
.globl end
|
||||
/ the driving tables ended just before here
|
||||
end:
|
||||
@@ -0,0 +1,13 @@
|
||||
.globl .f
|
||||
.globl succ
|
||||
.globl seekchar,getword
|
||||
|
||||
.f:
|
||||
mov (sp),r0
|
||||
mov r0,6(sp)
|
||||
mov 4(sp),r1
|
||||
jsr pc,seekchar
|
||||
jsr pc,getword
|
||||
mov r0,(sp)
|
||||
mov $-1,2(sp)
|
||||
jmp succ
|
||||
@@ -0,0 +1,93 @@
|
||||
i=r3
|
||||
.globl lptr,rptr,sptr
|
||||
.globl succ,fail
|
||||
.globl iget
|
||||
.globl find,enter
|
||||
.globl seekchar,getword,getchar
|
||||
.globl putword,putchar,alterword
|
||||
.globl getcstr,rewcstr
|
||||
.globl length,rewind
|
||||
|
||||
index=0
|
||||
tablep=2
|
||||
temp=4
|
||||
which=6
|
||||
framel=10
|
||||
|
||||
find:
|
||||
mov pc,-(sp) /which(sp)
|
||||
br 1f
|
||||
enter:
|
||||
clr -(sp)
|
||||
1:
|
||||
jsr pc,rewcstr
|
||||
jsr pc,getcstr
|
||||
bne 1f
|
||||
tst (sp)+
|
||||
jmp fail
|
||||
1:
|
||||
clr -(sp) /temp(sp)
|
||||
jsr pc,iget
|
||||
mov (r0),-(sp) /tablep(sp)
|
||||
clr -(sp) /index(sp)
|
||||
|
||||
right:
|
||||
add $rptr,index(sp)
|
||||
br 1f
|
||||
left:
|
||||
add $lptr,index(sp)
|
||||
1: /get index of next entry
|
||||
mov tablep(sp),r1
|
||||
mov index(sp),r0
|
||||
jsr pc,seekchar
|
||||
jsr pc,getword
|
||||
tst r0
|
||||
beq nomore
|
||||
mov r0,index(sp)
|
||||
add $sptr,r0
|
||||
jsr pc,seekchar
|
||||
jsr pc,rewcstr
|
||||
1: /comparison loop
|
||||
mov tablep(sp),r1
|
||||
jsr pc,getchar
|
||||
mov r0,-(sp)
|
||||
jsr pc,getcstr
|
||||
cmp r0,(sp)+
|
||||
bgt right
|
||||
blt left
|
||||
tst r0
|
||||
beq found
|
||||
br 1b
|
||||
|
||||
nomore: /not in table
|
||||
tst which(sp)
|
||||
beq 1f
|
||||
tst (i)+ /exit from find
|
||||
add $framel,sp
|
||||
jmp fail
|
||||
1:
|
||||
mov tablep(sp),r1
|
||||
jsr pc,length
|
||||
mov r0,temp(sp)
|
||||
clr r0
|
||||
jsr pc,putword /scratch word
|
||||
jsr pc,putword /left pointer
|
||||
jsr pc,putword /right
|
||||
mov index(sp),r0
|
||||
jsr pc,seekchar
|
||||
mov temp(sp),r0
|
||||
mov r0,index(sp)
|
||||
jsr pc,alterword
|
||||
jsr pc,rewcstr
|
||||
1: /copy loop
|
||||
jsr pc,getcstr
|
||||
mov tablep(sp),r1
|
||||
jsr pc,putchar
|
||||
tst r0
|
||||
bne 1b
|
||||
|
||||
found:
|
||||
jsr pc,iget
|
||||
mov index(sp),(r0)
|
||||
add $framel,sp
|
||||
jmp succ
|
||||
@@ -0,0 +1,50 @@
|
||||
i = r3
|
||||
.globl putcall,kput,obuild
|
||||
.globl seekchar
|
||||
.globl getchar
|
||||
.globl outb, outw, outt
|
||||
.globl cfile, lfile, flush
|
||||
.globl iget
|
||||
.globl sptr
|
||||
.globl generate,succ
|
||||
.globl getnam
|
||||
|
||||
getnam:
|
||||
mov $1f+1,r0
|
||||
jsr pc,putcall
|
||||
jsr pc,iget
|
||||
mov (r0),r0
|
||||
jsr pc,kput
|
||||
jsr pc,iget
|
||||
mov (r0),r0
|
||||
jsr pc,kput
|
||||
jmp succ
|
||||
1:
|
||||
cmp cfile,lfile
|
||||
beq 1f
|
||||
jsr pc,flush
|
||||
mov cfile,lfile
|
||||
1:
|
||||
mov (i)+,r1
|
||||
mov r1,-(sp)
|
||||
mov (i)+,r0
|
||||
add $sptr,r0
|
||||
jsr pc,seekchar
|
||||
2:
|
||||
mov (sp),r1
|
||||
mov outw,r2
|
||||
1:
|
||||
jsr pc,getchar
|
||||
tst r0
|
||||
beq 1f
|
||||
movb r0,outb(r2)
|
||||
inc r2
|
||||
mov r2,outw
|
||||
cmp r2,$outt
|
||||
blt 1b
|
||||
/
|
||||
jsr pc,flush
|
||||
br 2b
|
||||
1:
|
||||
tst (sp)+
|
||||
jmp generate
|
||||
@@ -0,0 +1,9 @@
|
||||
f = r5
|
||||
.globl n
|
||||
.globl succ,iget
|
||||
.globl ignore
|
||||
|
||||
ignore:
|
||||
jsr pc,iget
|
||||
mov (r0),n(f)
|
||||
jmp succ
|
||||
@@ -0,0 +1,24 @@
|
||||
.globl succ,.u,update
|
||||
.globl .ia,.ib,.da,.db
|
||||
|
||||
/prefix ++
|
||||
.ib:
|
||||
inc (sp)
|
||||
jmp .u
|
||||
/prefix --
|
||||
.db:
|
||||
dec (sp)
|
||||
jmp .u
|
||||
/postfix++
|
||||
.ia:
|
||||
inc (sp)
|
||||
jsr pc,update
|
||||
dec (sp)
|
||||
jmp succ
|
||||
/potsfix --
|
||||
.da:
|
||||
dec (sp)
|
||||
jsr pc,update
|
||||
inc (sp)
|
||||
jmp succ
|
||||
|
||||
@@ -0,0 +1,35 @@
|
||||
.globl .p,sprv
|
||||
.globl .a,.s,.o,.n,.x
|
||||
|
||||
/ +
|
||||
.a:
|
||||
jsr pc,sprv
|
||||
add (sp),4(sp)
|
||||
br 9f
|
||||
|
||||
/ -
|
||||
.s:
|
||||
jsr pc,sprv
|
||||
sub (sp),4(sp)
|
||||
br 9f
|
||||
|
||||
/ |
|
||||
.o:
|
||||
jsr pc,sprv
|
||||
bis (sp),4(sp)
|
||||
br 9f
|
||||
|
||||
/ &
|
||||
.n:
|
||||
jsr pc,sprv
|
||||
com (sp)
|
||||
bic (sp),4(sp)
|
||||
br 9f
|
||||
|
||||
/ ^ exclusive or
|
||||
.x:
|
||||
jsr pc,sprv
|
||||
mov (sp),r0
|
||||
xor r0,4(sp)
|
||||
9:
|
||||
jmp .p
|
||||
@@ -0,0 +1,46 @@
|
||||
f = r5
|
||||
.globl j,n
|
||||
.globl input
|
||||
.globl classtab
|
||||
.globl jget
|
||||
|
||||
jget:
|
||||
inc jgetc
|
||||
3:
|
||||
mov j(f),r1
|
||||
mov r1,r0
|
||||
bic $inpt-1,r0
|
||||
bic r0,r1
|
||||
cmp r0,inpr
|
||||
beq 1f
|
||||
inc readc
|
||||
mov r0,inpr
|
||||
mov input,r0
|
||||
sys seek
|
||||
inpr: 1;0
|
||||
sys read;inpb;inpt
|
||||
2:
|
||||
cmp r0,$inpt
|
||||
bge 1f
|
||||
clrb inpb(r0)
|
||||
inc r0
|
||||
br 2b
|
||||
1:
|
||||
movb inpb(r1),r0
|
||||
asl r0
|
||||
bit n(f),classtab(r0)
|
||||
beq 1f
|
||||
inc j(f)
|
||||
inc r1
|
||||
cmp r1,$inpt
|
||||
blt 1b
|
||||
br 3b
|
||||
1:
|
||||
asr r0
|
||||
rts pc
|
||||
inpt = 128.
|
||||
.bss
|
||||
inpb: . = .+inpt
|
||||
.data
|
||||
jgetc: 0
|
||||
readc: 0
|
||||
@@ -0,0 +1,15 @@
|
||||
.globl .lv,.rv
|
||||
.globl succ
|
||||
|
||||
/ unary &
|
||||
|
||||
.lv:
|
||||
mov 2(sp),(sp)
|
||||
jmp succ
|
||||
|
||||
/ *
|
||||
|
||||
.rv:
|
||||
mov (sp),2(sp)
|
||||
mov *2(sp),(sp)
|
||||
jmp succ
|
||||
@@ -0,0 +1,26 @@
|
||||
.globl .m,.q,.r
|
||||
.globl .p,sprv
|
||||
|
||||
.m:
|
||||
jsr pc,sprv
|
||||
mov (sp),r0
|
||||
mpy 4(sp),r0
|
||||
mov r1,4(sp)
|
||||
br 1f
|
||||
|
||||
.q:
|
||||
jsr pc,sprv
|
||||
mov 4(sp),r1
|
||||
sxt r0
|
||||
dvd (sp),r0
|
||||
mov r0,4(sp)
|
||||
br 1f
|
||||
|
||||
.r:
|
||||
jsr pc,sprv
|
||||
mov 4(sp),r1
|
||||
sxt r0
|
||||
dvd (sp),r0
|
||||
mov r1,4(sp)
|
||||
1:
|
||||
jmp .p
|
||||
@@ -0,0 +1,16 @@
|
||||
i = r3
|
||||
.globl putcall,iget,kput,putoct
|
||||
.globl generate,succ
|
||||
.globl octal
|
||||
|
||||
octal:
|
||||
mov $1f+1,r0
|
||||
jsr pc,putcall
|
||||
jsr pc,iget
|
||||
mov (r0),r0
|
||||
jsr pc,kput
|
||||
jmp succ
|
||||
1:
|
||||
mov (i),r0
|
||||
jsr pc,putoct
|
||||
jmp generate
|
||||
@@ -0,0 +1,13 @@
|
||||
f = r5
|
||||
.globl iget
|
||||
.globl env,si
|
||||
.globl succ
|
||||
.globl params
|
||||
|
||||
params:
|
||||
jsr pc,iget
|
||||
mov (r0),r0
|
||||
asl r0
|
||||
mov env(f),r1
|
||||
add r0,si(r1)
|
||||
jmp succ
|
||||
@@ -0,0 +1,25 @@
|
||||
.globl succ
|
||||
.globl iget
|
||||
.globl push
|
||||
|
||||
push:
|
||||
jsr pc,iget
|
||||
mov (r0),r2
|
||||
mov r2,r1
|
||||
1:
|
||||
mov r1,-(sp)
|
||||
jsr pc,iget
|
||||
mov (sp)+,r1
|
||||
mov r0,-(sp)
|
||||
mov (r0),-(sp)
|
||||
dec r2
|
||||
bgt 1b
|
||||
mov r1,-(sp)
|
||||
jsr pc,succ
|
||||
/ preserve c bit from here on
|
||||
mov (sp)+,r2
|
||||
1:
|
||||
mov (sp)+,*(sp)+
|
||||
dec r2
|
||||
bgt 1b
|
||||
rts pc /pass sret or fret back to invoking rule
|
||||
@@ -0,0 +1,23 @@
|
||||
f = r5
|
||||
g = r4
|
||||
.globl k
|
||||
.globl errcom
|
||||
.globl ktab,ktat
|
||||
.globl putcall,kput
|
||||
|
||||
putcall:
|
||||
jsr pc,kput
|
||||
mov k(f),(g)+
|
||||
rts pc
|
||||
|
||||
kput:
|
||||
sub $2,k(f)
|
||||
mov k(f),r1
|
||||
neg r1
|
||||
mov r0,ktab(r1)
|
||||
cmp r1,$ktat
|
||||
bhis 1f
|
||||
rts pc
|
||||
1:
|
||||
jsr r0,errcom
|
||||
<translation overflow\0>;.even
|
||||
@@ -0,0 +1,29 @@
|
||||
.globl putch,obuild
|
||||
.globl putdec
|
||||
|
||||
putdec:
|
||||
tst r0
|
||||
bge 1f
|
||||
cmp r0,$100000
|
||||
beq 2f
|
||||
mov r0,-(sp)
|
||||
mov $'-,r0
|
||||
jsr pc,putch
|
||||
mov (sp)+,r0
|
||||
neg r0
|
||||
1:
|
||||
alsc $-16.,r0
|
||||
dvd $10.,r0
|
||||
beq 1f
|
||||
mov r1,-(sp)
|
||||
jsr pc,1b
|
||||
mov (sp)+,r1
|
||||
1:
|
||||
mov r1,r0
|
||||
add $'0,r0
|
||||
jmp putch
|
||||
2:
|
||||
mov $1f,r0
|
||||
jmp obuild
|
||||
1:
|
||||
<-32768\0>;.even
|
||||
@@ -0,0 +1,18 @@
|
||||
.globl putch,obuild
|
||||
.globl putoct
|
||||
|
||||
|
||||
putoct: mov r0,-(sp)
|
||||
bic $7,r0
|
||||
bic r0,(sp)
|
||||
clc
|
||||
ror r0
|
||||
ror r0
|
||||
ror r0
|
||||
beq 1f
|
||||
jsr pc,putoct
|
||||
1:
|
||||
mov (sp)+,r0
|
||||
add $'0,r0
|
||||
jsr pc,putch
|
||||
rts pc
|
||||
@@ -0,0 +1,38 @@
|
||||
f = r5
|
||||
i = r3
|
||||
.globl j,n
|
||||
.globl iget,jget
|
||||
.globl succ,fail
|
||||
.globl .px,.pxs
|
||||
|
||||
.pxs:
|
||||
mov i,r0
|
||||
tst (i)+
|
||||
br 1f
|
||||
.px:
|
||||
jsr pc,iget
|
||||
1:
|
||||
inc litc
|
||||
mov n(f),-(sp)
|
||||
mov j(f),-(sp)
|
||||
mov r0,-(sp)
|
||||
2:
|
||||
tstb *(sp)
|
||||
beq 2f
|
||||
jsr pc,jget
|
||||
cmpb r0,*(sp)
|
||||
beq 1f
|
||||
tst (sp)+
|
||||
mov (sp)+,j(f)
|
||||
mov (sp)+,n(f)
|
||||
jmp fail
|
||||
1:
|
||||
clr n(f)
|
||||
inc (sp)
|
||||
inc j(f)
|
||||
br 2b
|
||||
2:
|
||||
cmp (sp)+,(sp)+
|
||||
mov (sp)+,n(f)
|
||||
jmp succ
|
||||
litc: 0
|
||||
@@ -0,0 +1,45 @@
|
||||
.globl .p,sprv
|
||||
.globl .eq,.ne,.lt,.le,.gt,.ge
|
||||
|
||||
.eq:
|
||||
jsr pc,sprv
|
||||
cmp 4(sp),(sp)
|
||||
beq true
|
||||
br false
|
||||
|
||||
.ne:
|
||||
jsr pc,sprv
|
||||
cmp 4(sp),(sp)
|
||||
bne true
|
||||
br false
|
||||
.lt:
|
||||
jsr pc,sprv
|
||||
cmp 4(sp),(sp)
|
||||
blt true
|
||||
br false
|
||||
|
||||
.le:
|
||||
jsr pc,sprv
|
||||
cmp 4(sp),(sp)
|
||||
ble true
|
||||
br false
|
||||
|
||||
.gt:
|
||||
jsr pc,sprv
|
||||
cmp 4(sp),(sp)
|
||||
bgt true
|
||||
br false
|
||||
|
||||
.ge:
|
||||
jsr pc,sprv
|
||||
cmp 4(sp),(sp)
|
||||
bge true
|
||||
br false
|
||||
|
||||
true:
|
||||
mov $1,4(sp)
|
||||
jmp .p
|
||||
|
||||
false:
|
||||
clr 4(sp)
|
||||
jmp .p
|
||||
@@ -0,0 +1,14 @@
|
||||
.globl .p,sprv
|
||||
.globl .sr,.sl
|
||||
|
||||
/ >>
|
||||
.sr:
|
||||
neg (sp)
|
||||
|
||||
/ <<
|
||||
.sl:
|
||||
mov 4(sp),r1
|
||||
clr r0
|
||||
alsc (sp),r0
|
||||
mov r1,4(sp)
|
||||
jmp .p
|
||||
@@ -0,0 +1,76 @@
|
||||
/ builtins for shift-reduce parsking
|
||||
f = r5
|
||||
i = r3
|
||||
g = r4
|
||||
.globl succ,pbundle,goto,iget
|
||||
.globl g1
|
||||
.globl stack,unstack,gotab,accept
|
||||
|
||||
/stack label of present rule (state)
|
||||
/should come first in a rule
|
||||
|
||||
stack:
|
||||
mov i,(g)
|
||||
sub $2,(g)+
|
||||
jmp succ
|
||||
|
||||
/unstack(n) deletes last n stacked states
|
||||
/states are distinguishable from translations in not having
|
||||
/an exit bit ($1) nor being bundles ($100000)
|
||||
unstack:
|
||||
jsr pc,iget
|
||||
mov (r0),r0
|
||||
mov g,r1
|
||||
1:
|
||||
bit -(r1),$100001
|
||||
bne 1b
|
||||
dec r0
|
||||
bge 1b
|
||||
tst (r1)+
|
||||
br 1f
|
||||
|
||||
accept: /clean out all states from stack
|
||||
mov f,r1
|
||||
add $g1,r1
|
||||
1:
|
||||
mov r1,r0
|
||||
mov r1,-(sp)
|
||||
1:
|
||||
cmp r1,g
|
||||
bge 2f
|
||||
bit (r1)+,$100001
|
||||
beq 1b
|
||||
mov -2(r1),(r0)+
|
||||
br 1b
|
||||
2:
|
||||
mov r0,g
|
||||
mov (sp)+,r0
|
||||
jsr pc,pbundle
|
||||
tst r0
|
||||
beq 1f
|
||||
mov r0,(g)+
|
||||
1:
|
||||
jmp succ
|
||||
|
||||
/gotab(s1,t1,s2,t2,...sn,tn,0,t)
|
||||
/checks top of stack for states
|
||||
/s1,s2,... and goes to t1, t2 accordingly
|
||||
/if top of stack is not in table, goes to t
|
||||
|
||||
gotab:
|
||||
mov g,r0
|
||||
1:
|
||||
bit -(r0),$100001 /find top state
|
||||
bne 1b
|
||||
mov (r0),-(sp)
|
||||
1:
|
||||
jsr pc,iget
|
||||
tst (r0)
|
||||
beq 1f
|
||||
cmp (sp),r0
|
||||
beq 1f
|
||||
jsr pc,iget
|
||||
br 1b
|
||||
1:
|
||||
tst (sp)+
|
||||
jmp goto
|
||||
@@ -0,0 +1,18 @@
|
||||
f = r5
|
||||
i = r3
|
||||
.globl j
|
||||
.globl succ
|
||||
.globl ctest,iget
|
||||
.globl string
|
||||
|
||||
string:
|
||||
tst -(sp)
|
||||
jsr pc,iget
|
||||
1:
|
||||
mov j(f),(sp)
|
||||
mov r0,-(sp)
|
||||
jsr pc,ctest
|
||||
mov (sp)+,r0
|
||||
bcs 1b
|
||||
mov (sp)+,j(f)
|
||||
jmp succ
|
||||
@@ -0,0 +1,17 @@
|
||||
.globl allocate,putword,putchar
|
||||
.globl iget
|
||||
.globl succ
|
||||
.globl table
|
||||
|
||||
table:
|
||||
mov $10,r0
|
||||
jsr pc,allocate
|
||||
mov r1,-(sp)
|
||||
clr r0
|
||||
jsr pc,putword
|
||||
jsr pc,putword
|
||||
jsr pc,putword
|
||||
jsr pc,putchar
|
||||
jsr pc,iget
|
||||
mov (sp)+,(r0)
|
||||
jmp succ
|
||||
@@ -0,0 +1,28 @@
|
||||
f = r5
|
||||
i = r3
|
||||
.globl ek,ep,ek.fs,ep.fs,si,x,fs
|
||||
.globl generate
|
||||
.globl .tq,gpar
|
||||
|
||||
.tq:
|
||||
mov (i)+,r0
|
||||
mov i,si(f)
|
||||
mov ep(f),r1
|
||||
mov ep(r1),ep.fs(f)
|
||||
mov ek(r1),ek.fs(f)
|
||||
mov si(r1),r1
|
||||
asl r0
|
||||
sub r0,r1
|
||||
mov (r1),i
|
||||
add $fs,f
|
||||
clr x(f)
|
||||
jsr pc,generate
|
||||
jmp generate
|
||||
|
||||
gpar:
|
||||
mov (i)+,r0
|
||||
mov ep(f),r1
|
||||
asl r0
|
||||
add r0,si(r1)
|
||||
jmp generate
|
||||
.globl gq;gq=.tq
|
||||
@@ -0,0 +1,14 @@
|
||||
i = r3
|
||||
.globl putch,putoct
|
||||
.globl trswitch
|
||||
.globl trace
|
||||
|
||||
trace:
|
||||
jsr pc,putch
|
||||
mov i,r0
|
||||
jsr pc,putoct
|
||||
mov $'\n,r0
|
||||
jsr pc,putch
|
||||
rts pc
|
||||
.data
|
||||
trswitch: 0
|
||||
@@ -0,0 +1,8 @@
|
||||
g = r4
|
||||
.globl succ,iget
|
||||
.globl trans
|
||||
|
||||
trans:
|
||||
jsr pc,iget
|
||||
mov r0,(g)+
|
||||
jmp succ
|
||||
@@ -0,0 +1,14 @@
|
||||
i = r3
|
||||
.globl generate
|
||||
.globl obuild
|
||||
.globl .tx,.txs
|
||||
|
||||
.txs:
|
||||
mov i,r0
|
||||
tst (i)+
|
||||
br 1f
|
||||
.tx:
|
||||
mov (i)+,r0
|
||||
1:
|
||||
jsr pc,obuild
|
||||
jmp generate
|
||||
@@ -0,0 +1,27 @@
|
||||
.globl succ
|
||||
.globl .ng,.nt,.cm
|
||||
|
||||
/ !
|
||||
|
||||
.nt:
|
||||
tst (sp)
|
||||
beq 1f
|
||||
clr (sp)
|
||||
br 9f
|
||||
1:
|
||||
mov $1,(sp)
|
||||
br 9f
|
||||
|
||||
/unary -
|
||||
|
||||
.ng:
|
||||
neg (sp)
|
||||
br 9f
|
||||
|
||||
/ ~
|
||||
|
||||
.cm:
|
||||
com (sp)
|
||||
|
||||
9:
|
||||
jmp succ
|
||||
Reference in New Issue
Block a user