/ 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