166 lines
2.4 KiB
ArmAsm
166 lines
2.4 KiB
ArmAsm
/ 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
|