Add original unix v6
This commit is contained in:
@@ -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
|
||||
/
|
||||
@@ -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
|
||||
@@ -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:
|
||||
@@ -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
|
||||
@@ -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
|
||||
@@ -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
|
||||
@@ -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
|
||||
@@ -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
|
||||
@@ -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
|
||||
@@ -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
|
||||
@@ -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
|
||||
@@ -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
|
||||
Reference in New Issue
Block a user