Mercurial > hg > Members > kono > os9 > sbc09
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 } |