MiniUnix/usr/source/salloc/alloc2.s
/
/ 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