MiniUnix/usr/source/s4/alloc.s
/ storage allocator for use with C
/
/
/
/ hand-tooled from C compilation to modify save-return
/ so that it can be called from within the C save
/ when running with coroutines
/
/#
//*
/ * C storage allocator
/ * (circular first fit strategy)
/ */
/#define BLOK 512
/#define BUSY 01
/
/char *allocs[2] { /*initial empty arena*/
/ &allocs[1],
/ &allocs[0]
/};
/struct { int word; };
/char **allocp &allocs[1]; /*current search pointer*/
/char **alloct &allocs[1]; /*top of arena (last cell)*/
/
/alloc(nbytes)
/{
/ register int nwords;
/ register char **p, **q;
/ static char **t;
/
/ allocs[0].word =| BUSY; /*static initialization*/
/ allocs[1].word =| BUSY;
/
/ nwords = (nbytes+(2*sizeof(p)-1))/sizeof(p);
/ for(p=allocp;;) {
/ do {
/ if((p->word&BUSY)==0) {
/ while(((q = *p)->word&BUSY)==0)
/ *p = *q;
/ if(q >= &p[nwords])
/ goto found;
/ }
/ q = p;
/ p = p->word & ~BUSY;
/ } while(q>=allocp || p<allocp);
/ if((*alloct=t=sbrk(BLOK*sizeof(p))) == -1)
/ return(-1);
/ if(t!=alloct+1)
/ alloct->word =| BUSY;
/ alloct = (*t = &t[BLOK]-1);
/ *alloct = allocs;
/ alloct->word =| BUSY;
/ }
/found:
/ allocp = &p[nwords];
/ if(q>allocp)
/ *allocp = *p;
/ *p = allocp.word|BUSY;
/ return(p+1);
/}
/
/free(p)
/char **p;
/{
/ allocp = p-1;
/ allocp->word =& ~BUSY;
/}
.globl _allocs
.data
_allocs=.
2+_allocs
_allocs
.globl _allocp
.data
_allocp=.
2+_allocs
.globl _alloct
.data
_alloct=.
2+_allocs
.globl _alloc
.globl _sbrk
.text
_alloc:
mov r5,-(sp)
mov sp,r5
mov r4,-(sp)
mov r3,-(sp)
mov r2,-(sp)
bis $1,_allocs
bis $1,2+_allocs
mov 4(r5),r4
add $3,r4
asr r4
mov _allocp,r3
jbr L6
L7:mov r3,r2
mov (r3),r3
bic $!177776,r3
cmp r2,_allocp
jhis L6
cmp r3,_allocp
jlo L6
mov $2000,-(sp)
jsr pc,*$_sbrk
tst (sp)+
mov r0,t
mov r0,*_alloct
cmp $177777,r0
jeq L11
mov _alloct,r0
add $2,r0
cmp t,r0
jeq L12
bis $1,*_alloct
L12:mov t,r0
add $1776,r0
mov r0,*t
mov r0,_alloct
mov $_allocs,*_alloct
bis $1,*_alloct
L6:bit $1,(r3)
jeq L8
jbr L7
L20001:mov (r2),(r3)
L8:mov (r3),r2
bit $1,(r2)
jeq L20001
mov r4,r0
asl r0
add r3,r0
cmp r2,r0
jlo L7
mov r4,r0
asl r0
add r3,r0
mov r0,_allocp
cmp r2,r0
jlos L13
mov (r3),*_allocp
L13:mov _allocp,r0
bis $1,r0
mov r0,(r3)
mov r3,r0
add $2,r0
L11:
mov (sp)+,r2
mov (sp)+,r3
mov (sp)+,r4
mov (sp)+,r5
rts pc
.globl _free
.text
_free:
mov r5,-(sp)
mov sp,r5
mov 4(r5),r0
add $177776,r0
mov r0,_allocp
bic $!177776,*_allocp
mov (sp)+,r5
rts pc
.bss
t: .=.+2