V6/usr/source/s1/form5.s
.globl b1
.globl hblk
.globl headers
.globl initl
.globl asmem
.globl b1s
.globl b1e
.globl w1
.globl stats
.globl lookchar
.globl flush
.globl fsfile
.globl seekchar
.globl backspace
.globl alterchar
.globl zero
.globl getchar
.globl putchar
.globl copy
.globl rewind
.globl create
.globl allocate
.globl release
.globl collect
.globl w,r,a,l
.globl getword
.globl putword
.globl backword
.globl alterword
/
/
/ 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 /clears c-bit
1: rts pc
/
/
/ 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
/
/
/ routine to put a word onto the string
/
/ mov ...,r1
/ mov ...,r0
/ jsr pc,putword
/
putword:
mov r0,-(sp)
sub $hblk,r0
jsr pc,putchar
swab r0
jsr pc,putchar
mov (sp)+,r0
rts pc
/
/
/ routine to get a word from the string
/
/ mov ...,r1
/ jsr pc,getword
/ mov r0,...
/
getword:
jsr pc,lookchar
bes 1f
movb r0,nchar
inc r(r1)
jsr pc,lookchar
bes 1f
movb r0,nchar+1
inc r(r1)
mov nchar,r0
add $hblk,r0
1: rts pc
/
/
/ routine to alter the word pointed to by r(r1)
/ by replacing the word there with r0
/
/ mov wd,r0
/ mov ...,r1
/ jsr pc,alterword
/
alterword:
mov r0,-(sp)
sub $hblk,r0
jsr pc,alterchar
swab r0
jsr pc,alterchar
mov (sp)+,r0
rts pc
/
/
/ 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
add $hblk,r0
rts pc
/
nochw:
clr r0
sec
rts pc
/
/
/ 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:
inc stats+12.
mov r0,-(sp)
mov r1,-(sp)
mov r2,-(sp)
mov r3,-(sp)
mov w(r0),r2
sub a(r0),r2 /W-A (old)
mov l(r1),r3
sub a(r1),r3 /L-A (new)
cmp r2,r3
blos 1f
mov r2,r0
jsr pc,allocate
mov 4(sp),r0 /new
jsr pc,swap
jsr pc,release
mov r0,r1
mov 0(sp),r0 /old
1:
mov a(r1),w(r1) /rewind w pointer
cmp r2,$512.
blos copy1 /is a short string
/
jsr pc,flush
jsr pc,reset
/
mov a(r0),-(sp)
4:
mov (sp),0f
mov afi,r0
sys seek;0:.. ;0 /set input pointer
cmp r2,$512.
blos 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)+
/
/ fix up read ptr of new string
/
copy2:
mov 6(sp),r0 /restore r0
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)+,r1
mov (sp)+,r0
rts pc
/
bad: mov $1,r0
sys write;1f;2f-1f
4
1: <error on copy\n>
2: .even
/
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
/
/ copy a short string
/
copy1:
mov r(r0),-(sp)
mov a(r0),r(r0)
mov nchar,-(sp)
mov r0,r2 /old
mov r1,r3 /new
1:
mov r2,r1
jsr pc,getchar
bes 1f
mov r3,r1
jsr pc,putchar
br 1b
1:
mov r2,r0
mov (sp)+,nchar
mov (sp)+,r(r0)
mov r3,r1
br copy2
/
/
/
/
/
/ 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 zero a string
/
/ mov ...,r1
/ jsr pc,zero
/
zero:
mov r0,-(sp)
.if testing
jsr pc,preposterous
.endif
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
/
/
/
/ routine to move the read pointer of a string to the
/ relative position indicated by r0. the string is
/ extended if necessary - there is no error return.
/
/ mov position,r0
/ mov ...,r1
/ jsr pc,seekchar
/
seekchar:
mov r1,-(sp)
mov r0,-(sp)
.if testing
jsr pc,preposterous
.endif
inc stats+10.
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
/
/
/ routine to move read pointer of string to end of string
/
/ mov ...,r1
/ jsr pc,fsfile
/
fsfile:
mov r0,-(sp)
.if testing
jsr pc,preposterous
.endif
inc stats+10.
mov w(r1),r(r1)
mov (sp)+,r0
rts pc
/
/
/ routine to place the character in r0 at the current
/ position of the read pointer - the read pointer
/ is not moved.
/
/ movb ch,r0
/ mov ...,r1
/ jsr pc,alterchar
/ mov r1,...
/
alterchar:
mov r2,-(sp)
mov r1,-(sp)
mov r0,nchar
.if testing
jsr pc,preposterous
.endif
inc stats+8.
1: cmp r(r1),l(r1) /W,L
blo 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 $1,w1(r2)
mov nchar,r0 /to preserve r0 for user
inc r(r1)
cmp r(r1),w(r1)
blos 3f
mov r(r1),w(r1)
3:
mov (sp)+,r1
mov (sp)+,r2
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)
inc stats+6.
.if testing
jsr pc,preposterous
.endif
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
.if testing
jsr pc,preposterous
.endif
inc stats+8.
1: cmp w(r1),l(r1) /W,L
blo 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
/
/
/ routine to flush contents of all buffers.
/
/ jsr pc,flush
/
flush:
mov r1,-(sp)
mov r2,-(sp)
mov r3,-(sp)
clr r3
1:
cmp r3,$numb
bhis 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:
mov (sp)+,r3
mov (sp)+,r2
mov (sp)+,r1
rts pc
/
/
reset:
mov r3,-(sp)
mov r2,-(sp)
clr r3
1:
cmp r3,$numb
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
/
/
/ 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:
inc stats+24.
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,$numb
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,$numb
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+14.,r3
inc (r3)
mov (sp)+,r3
mov (sp)+,r4
rts pc
/
/
/ this routine renumbers the time used cell u1(r2)
/ of the buffers when the clock overflows
/
fixct:
mov r1,-(sp)
mov r3,-(sp)
mov $numb,r1
mov $numb,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,$numb2
bge 2b
cmp u1(r3),u1(r2)
blo 2f
mov r3,r2
2:
add $2,r3
br 1b