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
+17
View File
@@ -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
+16
View File
@@ -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
+56
View File
@@ -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
+25
View File
@@ -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
+18
View File
@@ -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
+36
View File
@@ -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
+75
View File
@@ -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
+24
View File
@@ -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
+16
View File
@@ -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
+9
View File
@@ -0,0 +1,9 @@
.globl release
.globl discard
.globl iget,succ
discard:
jsr pc,iget
mov (r0),r1
jsr pc,release
jmp succ
+42
View File
@@ -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
+3
View File
@@ -0,0 +1,3 @@
.globl end
/ the driving tables ended just before here
end:
+13
View File
@@ -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
+93
View File
@@ -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
+50
View File
@@ -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
+9
View File
@@ -0,0 +1,9 @@
f = r5
.globl n
.globl succ,iget
.globl ignore
ignore:
jsr pc,iget
mov (r0),n(f)
jmp succ
+24
View File
@@ -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
+35
View File
@@ -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
+46
View File
@@ -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
+15
View File
@@ -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
+26
View File
@@ -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
+16
View File
@@ -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
+13
View File
@@ -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
+25
View File
@@ -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
+23
View File
@@ -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
+29
View File
@@ -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
+18
View File
@@ -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
+38
View File
@@ -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
+45
View File
@@ -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
+14
View File
@@ -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
+76
View File
@@ -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
+18
View File
@@ -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
+17
View File
@@ -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
+28
View File
@@ -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
+14
View File
@@ -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
+8
View File
@@ -0,0 +1,8 @@
g = r4
.globl succ,iget
.globl trans
trans:
jsr pc,iget
mov r0,(g)+
jmp succ
+14
View File
@@ -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
+27
View File
@@ -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