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
+198
View File
@@ -0,0 +1,198 @@
.globl plausible
.globl lookchar
.globl wc
.globl seekchar
.globl putchar
.globl allocate
.globl release
.globl stats
.globl w,r,a,l
.globl bufchar
.globl copy
.globl getbuf
.globl swap
.globl fixct
/
/ routine to copy the contents of one string
/ to another.
/
/ mov source,r0
/ mov dest,r1
/ jsr pc,copy
/ mov r1,...
/
/ on return, r1 points to the new string and should
/ be saved. r0 is preserved.
/
copy:
mov r0,-(sp)
mov r2,-(sp)
mov r3,-(sp)
jsr pc,wc
1: jsr pc,reset
mov w(r0),r2
sub a(r0),r2 /W-A
mov l(r1),r3
sub a(r1),r3 /L-A
cmp r2,r3
ble 1f
jsr pc,release
mov r2,r0
jsr pc,allocate
mov 4(sp),r0
/
1: mov a(r1),w(r1) /rewind w pointer
mov a(r0),-(sp)
/
4: mov (sp),0f
mov afi,r0
sys seek;0:.. ;0 /set input pointer
cmp r2,$512.
ble 2f
mov $512.,r3 /# output this time
mov r3,0f
mov r3,3f
add r3,(sp)
sub r3,r2 /# left to output
br 1f
/
2: mov r2,0f
mov r2,3f
mov r2,r3
clr r2
/
1: mov afi,r0
sys read;b1;0:..
bes bad
cmp r0,r3
bne bad
mov afout,r0
mov (r1),0f
add r3,(r1)
sys seek;0:.. ;0
sys write;b1;3:..
bes bad
tst r2
bgt 4b
tst (sp)+
mov 4(sp),r0 /restore r0
/
/ fix up read ptr of new string
/
1: mov r(r0),r2
sub a(r0),r2
add a(r1),r2
mov r2,r(r1)
/
/ restore and return
/
mov (sp)+,r3
mov (sp)+,r2
mov (sp)+,r0
rts pc
/
bad: mov $1,r0
sys write;1f;2f-1f
4
1: <error on copy\n>
2: .even
/
/
wc:
mov r1,-(sp)
mov r2,-(sp)
mov r3,-(sp)
clr r3
1:
cmp r3,nbuf
bge 1f
mov r3,r2
asl r2
tst w1(r2)
ble 2f
mov r3,r1
ashc $9.,r1
bic $777,r1
add $b1,r1
jsr pc,clean
2:
inc r3
br 1b
1:
jsr pc,whead
mov (sp)+,r3
mov (sp)+,r2
mov (sp)+,r1
rts pc
swap:
mov w(r1),-(sp)
mov w(r0),w(r1)
mov (sp),w(r0)
mov r(r1),(sp)
mov r(r0),r(r1)
mov (sp),r(r0)
mov a(r1),(sp)
mov a(r0),a(r1)
mov (sp),a(r0)
mov l(r1),(sp)
mov l(r0),l(r1)
mov (sp)+,l(r0)
rts pc
/
/
/
/
/
/ mov position,r0
/ mov ...,r1
/ jsr pc,seekchar
/
seekchar:
mov r1,-(sp)
mov r0,-(sp)
1:
mov (sp),r0
add a(r1),r0
cmp r0,l(r1)
bhi 3f
mov r0,r(r1)
cmp r0,w(r1)
blo 1f
mov r0,w(r1)
br 1f
3:
mov (sp),r0
jsr pc,allocate
mov 2(sp),r0
jsr pc,copy
jsr pc,swap
jsr pc,release
mov 2(sp),r1
br 1b
1:
mov (sp)+,r0
mov (sp)+,r1
rts pc
/
reset:
mov r3,-(sp)
mov r2,-(sp)
clr r3
1:
cmp r3,nbuf
bge 1f
mov r3,r2
asl r2
mov $-1.,w1(r2)
clr b1s(r2)
clr b1e(r2)
clr u1(r2)
inc r3
br 1b
1:
clr flag
mov (sp)+,r2
mov (sp)+,r3
rts pc
/
+242
View File
@@ -0,0 +1,242 @@
/
/ routine to read from disc to a buffer
/ wcing the buffer if necessary
/ mov disc addr,r0
/ mov buffer addr,r2
/ jsr pc,getb
/ on return r0 = addr of byte in buffer
/
getb:
mov r3,-(sp)
mov r1,-(sp)
mov r0,-(sp)
mov r2,r3
asr r3
mov r3,r1
ashc $9.,r1
bic $777,r1
add $b1,r1
tst w1(r2) / w
ble 1f
jsr pc,clean
1: mov (sp),r0
bic $777,r0 /get lowest multiple of 512.
mov r0,0f
mov r0,b1s(r2) /set start
mov afi,r0
sys seek;0:..;0
mov r1,0f
sys read;0:..;512.
mov b1s(r2),b1e(r2)
add $512.,b1e(r2) / set end
clr w1(r2) /clear w
mov (sp)+,r0
sub b1s(r2),r0
add r1,r0 / set r0=byte addr in buffer
mov (sp)+,r1
mov (sp)+,r3
rts pc
/
/
/ routine to wc a buffer
/ mov buffer addr,r2
/ mov buffer addr+6,r1 beginning of buffer
/ jsr pc,clean
/
clean:
mov r0,-(sp)
mov b1s(r2),0f
mov afout,r0
sys seek;0:..;0
mov r1,0f
sys write;0:..;512.
clr w1(r2) /clear w
mov (sp)+,r0
rts pc
/
/ routine to get buffer addr of byte whose disc
/ addr is in r0 - also returns addr of write
/ flag for buffer in r2
/ mov disc addr,r0
/ jsr pc,bufchar
/ mov (r0),r0 for read
/ inc (r2) for write must inc w
/ c-bit set if char not in either buffer
/
bufchar:
mov r1,-(sp)
mov r3,-(sp)
clr r3
1:
mov r3,r2
asl r2
cmp r0,b1s(r2)
blo 2f
cmp r0,b1e(r2)
bhis 2f
sub b1s(r2),r0
mov r3,r1
ashc $9.,r1
bic $777,r1
add r1,r0
add $b1,r0
mov (sp)+,r3
mov (sp)+,r1
clc
rts pc
2:
inc r3
cmp r3,nbuf
blt 1b
mov (sp)+,r3
mov (sp)+,r1
sec
rts pc
/
/ routine to get a buffer
/ mov disc addr,r0
/ jsr pc,getbuf
/ mov (r0),r0 (for read)
/ inc (r2) must inc w for w
/
getbuf:
mov r4,-(sp)
mov r3,-(sp)
mov $2,r3
clr r2
mov $1,r4
1:
cmp r4,nbuf
bge 1f
cmp u1(r3),u1(r2)
bhis 2f
mov r3,r2
2:
inc r4
add $2.,r3
br 1b
1:
mov r2,r3
jsr pc,getb
add $stats+6.,r3
inc (r3)
mov (sp)+,r3
mov (sp)+,r4
rts pc
/
/ routine to look at next character from string
/ pointed to by r1; character returned in r0
/ c-bit set if character not available (end of file)
/ r1 is preserved
/
/ mov ...,r1
/ jsr pc,lookchar
/ movb r0,...
/
lookchar:
mov r2,-(sp)
jsr pc,plausible
cmp w(r1),r(r1) /W,R
blos noch
mov r(r1),r0
jsr pc,bufchar
bec 2f
jsr pc,getbuf
/
2:
inc flag
bne 2f
jsr pc,fixct
br 1f
2:
mov flag,u1(r2)
1:
mov (sp)+,r2
movb (r0),r0
tst r0 /clears c-bit
rts pc
/
noch:
mov (sp)+,r2
clr r0
sec
rts pc
/
/
/ routine to put a character into the string
/ pointed to by r1; character in r0
/ r0 is preserved; r1 points to the string
/ after return and must be saved.
/
/ movb ch,r0
/ mov ...,r1
/ jsr pc,putchar
/ mov r1,...
/
putchar:
mov r2,-(sp)
mov r1,-(sp)
mov r0,nchar
jsr pc,plausible
1: cmp w(r1),l(r1) /W,L
blt 3f
mov w(r1),r0
inc r0
sub a(r1),r0 /W-A+1
jsr pc,allocate
mov (sp),r0
jsr pc,copy
jsr pc,swap
jsr pc,release
mov (sp),r1
/
3: mov w(r1),r0
jsr pc,bufchar
bec 2f
jsr pc,getbuf
2: movb nchar,(r0)
mov $1,w1(r2)
mov nchar,r0 /to preserve r0 for user
inc w(r1)
inc flag
bne 2f
jsr pc,fixct
br 1f
2:
mov flag,u1(r2)
1:
mov (sp)+,r1
mov (sp)+,r2
rts pc
/
/
fixct:
mov r1,-(sp)
mov r3,-(sp)
mov nbuf,r1
mov nbuf,flag
2:
mov r1,u1(r2)
dec r1
bge 1f
mov (sp)+,r3
mov (sp)+,r1
rts pc
1:
clr r2
mov $2,r3
1:
cmp r3,nbuf2
bge 2b
cmp u1(r3),u1(r2)
blo 2f
mov r3,r2
2:
add $2,r3
br 1b
+432
View File
@@ -0,0 +1,432 @@
.globl flag
.globl b1, w1, u1, b1s, b1e
/ here to allocate a new block
/
/
/ mov ...,r0
/ jsr pc,allocate
/ mov r1,...
/
/ requested size in bytes in r0
/ pointer to header of allocated block returned in r1
/ r0 is preserved
/
/ convert to words, adjust for header, round up
/ to a power of two
/
/ each block has a four-word header
/ W - write ptr (also used as link ptr in frlist)
/ R - read ptr
/ A - pointer to head of data
/ L - ptr to (end+1) of data
hsz=1024.
numb=4.
numb2=2*numb
w=0
r=2
a=4
l=6
/
allocate:
mov r0,-(sp)
mov r2,-(sp)
mov r3,-(sp)
tst stats
bne 1f
jsr pc,initl
1:
inc stats
dec r0
bmi 1f
jsr pc,log2
inc r0
1: asl r0
mov r0,-(sp)
/
/ look on free list for block of required size
/
zzz:
mov (sp),r0
tst frlist(r0)
beq xxx
/
/ found it, allocate and return
/
mov frlist(r0),r1
add $hblk,r1
mov (r1),frlist(r0)
mov a(r1),r0
mov r0,w(r1)
mov r0,r(r1)
tst (sp)+
mov (sp)+,r3
mov (sp)+,r2
mov (sp)+,r0
/ jsr pc,whead
rts pc
/
/ no block of required size
/ look for larger block
/
xxx:
tst (r0)+
cmp r0,$frend-frlist
bhis www
tst frlist(r0)
bne yyy
br xxx
/
/ there are no larger blocks; must garbage collect
/
www: jsr pc,collect
tst r0
bne zzz
/
/ out of space
/
mov $1,r0
sys write; 1f; 2f-1f
4
1: <Out of space.\n>
2: .even
/
/ split larger block into two smaller pieces and
/ link together as smaller blocks in the free list.
/
yyy:
mov hblk,r3 /get free header block
beq www
mov frlist(r0),r1
add $hblk,r1
mov w(r1),frlist(r0)
mov r3,w(r1)
add $hblk,r3
mov exp2-2(r0),r2
add a(r1),r2
mov w(r3),hblk
mov l(r1),l(r3)
mov r2,l(r1) /L
mov r2,a(r3)
clr w(r3) /W'
mov r1,r2
sub $hblk,r2
mov r2,frlist-2(r0)
br zzz
/
/
/ here to release a block
/
/ mov ...,r1
/ jsr pc,release
/
/ pointer to block in r1
/
release:
/
/ discover that this is a plausible pointer
/
mov r0,-(sp)
jsr pc,preposterous
/
/ find free list index and link block to that entry
/
inc stats+2
mov frlist(r0),w(r1)
clr r(r1)
sub $hblk,r1
mov r1,frlist(r0)
clr r1 /self-defense
/ jsr pc,whead
mov (sp)+,r0
rts pc
/
/
/ jsr pc,collect
/
/ coalesce free storage by rejoining paired blocks
/ on the free list.
/ zero is returned in r0 if no paired blocks were found.
/
collect:
mov r1,-(sp)
mov r2,-(sp)
mov r3,-(sp)
mov r4,-(sp)
clr useful
inc stats+4.
clr r0 /start with smallest blocks
/r0 contains frlist index
loop1: mov $frlist,r1
add r0,r1
/
/ try next list member at this level
/
loop2: mov (r1),r3
beq advance /list is empty
add $hblk,r3
tst (r3) /W
beq advance /only one list element
/
/ calculate address of buddy
/
mov a(r3),r4
sub headsz,r4
bit exp2(r0),r4
beq 2f
bic exp2(r0),r4
br 1f
2: bis exp2(r0),r4
1: add headsz,r4
/
/ and search for him
/
loop3:
cmp a(r3),r4
beq coal
mov r3,r2
mov w(r3),r3
tst r3
beq nocoal
add $hblk,r3
br loop3
/
/ have found a pair; remove both blocks from list,
/ coalesce them, and put them on next higher list
/
coal: inc useful
mov w(r3),w(r2) /remove him from list
mov (r1),r2
add $hblk,r2
mov r3,r4
mov w(r2),w(r1) /remove other one
cmp a(r2),a(r4)
bgt 1f
mov r2,-(sp)
mov r4,r2
mov (sp)+,r4
1: mov hblk,(r2)
clr r(r2)
mov headsz,a(r2)
mov headsz,l(r2)
sub $hblk,r2
mov r2,hblk
add exp2(r0),l(r4) /L
clr r(r4)
mov frlist+2(r0),w(r4)
sub $hblk,r4
mov r4,frlist+2(r0)
br loop2
/
/ no buddy found, try next block on this list
/
nocoal:
mov (r1),r1
add $hblk,r1
br loop2
/
/ advance to next free list
/
advance:
tst (r0)+
cmp r0,$frend-frlist
blo loop1
mov useful,r0
/
/ restore registers and return
/
mov (sp)+,r4
mov (sp)+,r3
mov (sp)+,r2
mov (sp)+,r1
rts pc
/
/ routine to find integer part of log2(x)
/
/ jsr pc,log2
/
/ r0 = log2(r0)
/
log2:
mov $15.,-(sp)
tst r0
beq 2f
1:
asl r0
bcs 2f
dec (sp)
br 1b
2:
mov (sp)+,r0
rts pc
/
0
exp2:
1;2;4;10;20;40;100;200;400;1000;2000;4000;
10000;20000;40000;100000
/
/ routine to discover whether r1 points to
/ a plausible header - to avoid ruination.
/
/ r1 is preserved and r0 gets a suitable index for frlist
/
/ jsr pc,preposterous
/
plausible:
cmp r1,$strbuf
blo botch
cmp r1,$strend
bhis botch
rts pc
/
/
botch:
mov r0,-(sp)
mov $1,r0
sys write; 1f; 2f-1f
4
1: <Error in allocator.\n>
2: .even
/
/
preposterous:
cmp r1,$strbuf
blo botch
cmp r1,$strend
bhis botch
cmp a(r1),headsz /A
blo botch
cmp l(r1),datadr /L
bhi botch
mov l(r1),r0 /L
sub a(r1),r0 /A
mov r0,-(sp)
jsr pc,log2
asl r0
cmp exp2(r0),(sp)
bne botch
mov r0,(sp)
mov frlist(r0),r0
1: beq 1f
add $hblk,r0
cmp r0,r1
beq botch
mov (r0),r0
br 1b
1: mov (sp)+,r0
rts pc
/
/
whead:
mov r0,-(sp)
mov afout,r0
sys seek;0;0 /write pointer to 0
sys write;hblk;hsz
mov (sp)+,r0
rts pc
/
datasz: 16384.
headsz: hsz
nbuf: numb
nbuf2: numb2
b1s: .=.+numb2
b1e: .=.+ numb2
w1: .=.+ numb2
u1: .=.+ numb2
b1 = .
/
initl:
mov r0,-(sp)
mov r2,-(sp)
sys open;asmem; 1 /open for write
bec 2f
sys creat;asmem; 606
bes err2
2:
mov r0,afout
1:
sys open; asmem; 0 /open for read
bes err2
mov r0,afi
1:
br gargs
/
err2:
mov $1,r0
sys write; 1f; 2f-1f
4
1: <cannot open output file\n>
2:
asmem:
<alloc.d\0>
.even
/
gargs:
mov $headers,r2
mov r2,r0
sub $hblk,r0
mov r0,hblk
1:
add $8,r0
mov r0,(r2)
add $8,r2
cmp r2,$strend-8.
blo 1b
clr -8(r2)
/
mov headsz,datadr
add datasz,datadr
/
mov $frlist,r0
1: clr (r0)+
cmp r0,$frend
blo 1b
mov hblk,r2
add $hblk,r2
mov (r2),hblk
clr w(r2)
mov headsz,a(r2)
mov datadr,l(r2)
mov datasz,r0
jsr pc,log2
asl r0
cmp r0,$frend-frlist
blo 9f; 4; 9:
sub $hblk,r2
mov r2,frlist(r0)
/
/ install plausible pointers to make octal dumps look ok
/
mov $hblk,r1
1: mov (r1),r1
beq 1f
add $hblk,r1
mov headsz,a(r1)
mov headsz,l(r1)
br 1b
/
1: mov afout,r0
sys write;hblk;hsz
jsr pc,reset
mov (sp)+,r2
mov (sp)+,r0
rts pc
. = b1 + [512.*numb]
/
.bss
flag: .=.+2
stats: .=.+18.
useful: .=.+2
afi: .=.+2
afout: .=.+2
datadr: .=.+2
hblk: .=.+2 /must remain here - pointer to free header
frlist: .=hblk+34.
frend:
headers:
strbuf: .=hblk+hsz
strend:
nchar: .=.+2
end:
+63
View File
@@ -0,0 +1,63 @@
.globl alterchar
.globl plausible
.globl stats
.globl allocate, release
.globl copy
.globl bufchar, getbuf
.globl swap
.globl w, r, a, l
.globl w1, flag, u1, fixct
/
/ routine to rewrite the character pointer to by
/ read pointer. The read pointer is advanced.
/ the string is extended if necessary.
/ there is no error return.
/
/ movb ch,r0
/ mov ...,r1
/ jsr pc,alterchar
/ mov r1,...
/
alterchar:
mov r2,-(sp)
mov r1,-(sp)
mov r0,nchar
jsr pc,plausible
inc stats+8.
1: cmp r(r1),l(r1) /W,L
blt 3f
mov l(r1),r0
inc r0
sub a(r1),r0 /W-A+1
jsr pc,allocate
mov (sp),r0
jsr pc,copy
jsr pc,swap
jsr pc,release
mov (sp),r1
/
3: mov r(r1),r0
jsr pc,bufchar
bec 2f
jsr pc,getbuf
2: movb nchar,(r0)
mov nchar,r0 /to preserve r0 for user
inc r(r1)
mov $1,w1(r2)
cmp r(r1),w(r1)
ble 3f
mov r(r1),w(r1)
3:
inc flag
bne 1f
jsr pc,fixct
br 2f
1:
mov flag,u1(r2)
2:
mov (sp)+,r1
mov (sp)+,r2
rts pc
/
nchar: .=.+2
+20
View File
@@ -0,0 +1,20 @@
.globl backspace
.globl lookchar
.globl w, r, a, l
/
/ routine to read a string backwards
/ the read pointer is decremented before reading
/
/ mov ...,r1
/ jsr pc,backspace
/ mov r0,...
/
backspace:
cmp a(r1),r(r1)
bhis nochc
dec r(r1)
jsr pc,lookchar
rts pc
nochc: clr r0
sec
rts pc
+31
View File
@@ -0,0 +1,31 @@
.globl backword
.globl lookchar
.globl w, r, a, l
/
/
/ routine to get words backwards from string
/
/ mov ...,r1
/ jsr pc,backword
/ mov r0,...
/
backword:
cmp a(r1),r(r1)
bhis nochw
dec r(r1)
jsr pc,lookchar
movb r0,nchar+1
cmp a(r1),r(r1)
bhis nochw
dec r(r1)
jsr pc,lookchar
movb r0,nchar
mov nchar,r0
rts pc
/
nochw:
clr r0
sec
rts pc
/
nchar: .=.+2
+19
View File
@@ -0,0 +1,19 @@
.globl getchar
.globl lookchar
.globl w, r, a, l
/
/
/ routine to read next character from string
/ pointer to by r1; character returned in r0
/ c-bit set if character not availiable (eof)
/
/ mov ...,r1
/ jsr pc,getchar
/ movb r0,...
/
getchar:
jsr pc,lookchar
bes 1f
inc r(r1)
tst r0
1: rts pc
+56
View File
@@ -0,0 +1,56 @@
.globl getword
.globl putword
.globl lookword
.globl alterword
.globl alterchar
.globl putchar
.globl lookchar
.globl w, r, a, l
/
/ routine to put a word onto the string
/ mov ...,r1
/ mov ...,r0
/ jsr pc,putword
putword:
jsr pc,putchar
swab r0
jsr pc,putchar
swab r0
rts pc
/
/
/ routine to look at a word from the string
/ mov ...,r1
/ jsr pc,lookword
/ mov r0,...
lookword:
jsr pc,lookchar
bes 1f
movb r0,nchar
inc r(r1)
jsr pc,lookchar
bes 1f
movb r0,nchar+1
dec r(r1)
mov nchar,r0
1: rts pc
/
/
/ routine to get a word from the strng
/
getword:
jsr pc,lookword
bes 1f
add $2,r(r1)
1: rts pc
/
/
/ routine to alter a word in the string
/
alterword:
jsr pc,alterchar
swab r0
jsr pc,alterchar
swab r0
rts pc
nchar: .=.+2
+27
View File
@@ -0,0 +1,27 @@
.globl length
.globl position
.globl w, r, a, l
/
/
/ routine to return the length of a string
/
/ mov ...,r1
/ jsr pc,length
/ mov r0,...
/
length:
mov w(r1),r0
sub a(r1),r0
rts pc
/
/
/ routine to return the read pointer position
/
/ mov ...,r1
/ jsr pc,position
/ mov r0,...
/
position:
mov r(r1),r0
sub a(r1),r0
rts pc
+36
View File
@@ -0,0 +1,36 @@
.globl rewind
.globl create
.globl fsfile
.globl w, r, a, l
/
/
/ routine to rewind read pointer of string
/ pointed to by r1
/
/ mov ...,r1
/ jsr pc,rewind
/
rewind:
mov a(r1),r(r1)
rts pc
/
/ routine to rewind write pointer of string
/ pointed to by r1
/
/ mov ...,r1
/ jsr pc,create
/
create:
mov a(r1),w(r1)
mov a(r1),r(r1)
rts pc
/
/
/ routine to copy read pointer of string to end of string
/
/ mov ...,r1
/ jsr pc,fsfile
/
fsfile:
mov w(r1),r(r1)
rts pc
+11
View File
@@ -0,0 +1,11 @@
as alloc?.s; mv a.out alloc.o
as altch.s; mv a.out altch.o
as bsp.s; mv a.out bsp.o
as bword.s; mv a.out bword.o
as getch.s; mv a.out getch.o
as getwd.s; mv a.out getwd.o
as length.s; mv a.out length.o
as rewind.s; mv a.out rewind.o
as zero.s; mv a.out zero.o
ar r /lib/libs.a *.o
rm *.o
+21
View File
@@ -0,0 +1,21 @@
.globl zero
.globl putchar
.globl w, r, a, l
/
/
/ routine to zero a string
/
/ mov ...,r1
/ jsr pc,zero
/
zero:
mov r0,-(sp)
mov a(r1),w(r1)
clrb r0
1: cmp w(r1),l(r1)
bhis 1f
jsr pc,putchar
br 1b
1: mov a(r1),w(r1)
mov (sp)+,r0
rts pc