source: vital-to8-sdk/mc09/src/alloc.txt @ 1

Last change on this file since 1 was 1, checked in by svn, 5 years ago

Import initial

File size: 1.8 KB
Line 
1
2typedef struct header
3                {       struct header *ptr;
4                        unsigned size;
5                } HEADER;
6
7HEADER base,*allocp,*heap;
8
9char *malloc(s)
10unsigned s;
11{HEADER *p,*q;
12 int nunits;
13        nunits = 1 + (s + sizeof(HEADER) - 1) / sizeof(HEADER);
14        if ((q = allocp) == NULL)
15        {       base.ptr = allocp = q = &base;
16                base.size = 0;
17        }
18        for (p = q->ptr; ; q = p,p = p->ptr)
19        {       if (p->size >= nunits)
20                {       if (p->size == nunits)
21                                q->ptr = p->ptr;
22                        else
23                        {       p->size -= nunits;
24                                p += p->size;
25                                p->size = nunits;
26                        }
27                        allocp = q;
28                        clearblock(p);
29                        return ((char *)(p + 1));
30                }
31                if (p == allocp)
32                        if ((p = morecore(nunits)) == NULL)
33                                return(NULL);
34        }
35}
36
37clearblock(p)
38HEADER *p;
39{char *s,*t;
40        s = (char *)(p + 1);
41        t = (char *)(p + p->size);
42        while (s < t) *s++ = 0;
43}
44
45#define NALLOC 128
46
47HEADER *morecore(nu)
48unsigned nu;
49{char *cp;
50 HEADER *up;
51 int rnu;
52        rnu = NALLOC * ((nu + NALLOC - 1) / NALLOC);
53        cp = sbrk(rnu * sizeof(HEADER));
54        if ((int)cp == -1) return NULL;
55        up = (HEADER *) cp;
56        up->size = rnu;
57        mfree((char *)(up+1));
58        return allocp;
59}
60
61#asm
62sbrk    PSHS    U
63        LEAU    ,S
64       
65        LDD     heap,Y
66        BNE     _mc0
67        BSR     initheap
68_mc0    PSHS    D
69        TFR     S,D
70        SUBD    ,S++
71        CMPD    4,U
72        BCC     _mc1
73        LDD     #-1
74        LEAS    ,U
75        PULS    U,PC
76       
77_mc1    LDD     4,U
78        LDX     heap,Y
79        LEAX    D,X
80        LDD     heap,Y
81        STX     heap,Y
82        LEAS    ,U
83        PULS    U,PC
84
85initheap
86        PSHS    U
87        LEAU    ,S
88        TFR     Y,D
89        ADDD    #_GLOBALS
90        STD     heap,Y
91        LEAS    ,U
92        PULS    U,PC
93#endasm
94
95mfree(ap)
96char *ap;
97{HEADER *p,*q;
98        p = (HEADER *)ap - 1;
99        for (q = allocp; !(p > q && p < q->ptr); q = q->ptr)
100                if (q >= q->ptr && (p > q || p < q->ptr)) break;
101        if (p + p->size == q->ptr)
102        {       p->size += q->ptr->size;
103                p->ptr = q->ptr->ptr;
104        }
105        else p->ptr = q->ptr;
106        if (q + q->size == p)
107        {       q->size += p->size;
108                q->ptr = p->ptr;
109        }
110        else q->ptr = p;
111        allocp = q;
112}
113
114unsigned freesize()
115{int i;
116        if (!heap) initheap();
117        return ((char *)&i - (char *)heap);
118}
Note: See TracBrowser for help on using the repository browser.