comparison 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
comparison
equal deleted inserted replaced
159:1d574c5b3383 160:1a30cd6e5973
1
2 typedef struct header
3 { struct header *ptr;
4 unsigned size;
5 } HEADER;
6
7 HEADER base,*allocp,*heap;
8
9 char *malloc(s)
10 unsigned 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
37 clearblock(p)
38 HEADER *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
47 HEADER *morecore(nu)
48 unsigned 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
62 sbrk 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
85 initheap
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
95 mfree(ap)
96 char *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
114 unsigned freesize()
115 {int i;
116 if (!heap) initheap();
117 return ((char *)&i - (char *)heap);
118 }