Mercurial > hg > Members > kono > os9 > sbc09
diff mc09/alloc.txt @ 160:1a30cd6e5973
move mc09 to top
author | Shinji KONO <kono@ie.u-ryukyu.ac.jp> |
---|---|
date | Tue, 05 Feb 2019 09:03:07 +0900 |
parents | os9/mc09/alloc.txt@92ed427b7f7d |
children |
line wrap: on
line diff
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/mc09/alloc.txt Tue Feb 05 09:03:07 2019 +0900 @@ -0,0 +1,118 @@ + +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); +}