home *** CD-ROM | disk | FTP | other *** search
- / 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
-