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