view os9/mc09/alloc.txt @ 99:92ed427b7f7d

add micro-c by mohta
author Shinji KONO <kono@ie.u-ryukyu.ac.jp>
date Thu, 27 Dec 2018 11:01:16 +0900
parents
children
line wrap: on
line source


typedef struct header
		{	struct header *ptr;
			unsigned size;
		} HEADER;

HEADER base,*allocp,*heap;

char *malloc(s)
unsigned s;
{HEADER *p,*q;
 int nunits;
	nunits = 1 + (s + sizeof(HEADER) - 1) / sizeof(HEADER);
	if ((q = allocp) == NULL)
	{	base.ptr = allocp = q = &base;
		base.size = 0;
	}
	for (p = q->ptr; ; q = p,p = p->ptr)
	{	if (p->size >= nunits)
		{	if (p->size == nunits)
				q->ptr = p->ptr;
			else
			{	p->size -= nunits;
				p += p->size;
				p->size = nunits;
			}
			allocp = q;
			clearblock(p);
			return ((char *)(p + 1));
		}
		if (p == allocp)
			if ((p = morecore(nunits)) == NULL)
				return(NULL);
	}
}

clearblock(p)
HEADER *p;
{char *s,*t;
	s = (char *)(p + 1);
	t = (char *)(p + p->size);
	while (s < t) *s++ = 0;
}

#define NALLOC 128

HEADER *morecore(nu)
unsigned nu;
{char *cp;
 HEADER *up;
 int rnu;
	rnu = NALLOC * ((nu + NALLOC - 1) / NALLOC);
	cp = sbrk(rnu * sizeof(HEADER));
	if ((int)cp == -1) return NULL;
	up = (HEADER *) cp;
	up->size = rnu;
	mfree((char *)(up+1));
	return allocp;
}

#asm
sbrk	PSHS	U
	LEAU	,S
	
	LDD	heap,Y
	BNE	_mc0
	BSR	initheap
_mc0	PSHS	D
	TFR	S,D
	SUBD	,S++
	CMPD	4,U
	BCC	_mc1
	LDD	#-1
	LEAS	,U
	PULS	U,PC
	
_mc1	LDD	4,U
	LDX	heap,Y
	LEAX	D,X
	LDD	heap,Y
	STX	heap,Y
	LEAS	,U
	PULS	U,PC

initheap
	PSHS	U
	LEAU	,S
	TFR	Y,D
	ADDD	#_GLOBALS
	STD	heap,Y
	LEAS	,U
	PULS	U,PC
#endasm

mfree(ap)
char *ap;
{HEADER *p,*q;
	p = (HEADER *)ap - 1;
	for (q = allocp; !(p > q && p < q->ptr); q = q->ptr)
		if (q >= q->ptr && (p > q || p < q->ptr)) break;
	if (p + p->size == q->ptr)
	{	p->size += q->ptr->size;
		p->ptr = q->ptr->ptr;
	}
	else p->ptr = q->ptr;
	if (q + q->size == p)
	{	q->size += p->size;
		q->ptr = p->ptr;
	}
	else q->ptr = p;
	allocp = q;
}

unsigned freesize()
{int i;
	if (!heap) initheap();
	return ((char *)&i - (char *)heap);
}