... | ... |
@@ -72,6 +72,12 @@ error(const char *name, const char *msg) |
72 | 72 |
return 0; |
73 | 73 |
} |
74 | 74 |
|
75 |
+static char * |
|
76 |
+sublabel(char *src, char *scope, char *name) |
|
77 |
+{ |
|
78 |
+ return scat(scat(scpy(scope, src, 64), "/"), name); |
|
79 |
+} |
|
80 |
+ |
|
75 | 81 |
static Macro * |
76 | 82 |
findmacro(char *name) |
77 | 83 |
{ |
... | ... |
@@ -161,6 +167,23 @@ makelabel(char *name) |
161 | 167 |
return 1; |
162 | 168 |
} |
163 | 169 |
|
170 |
+static int |
|
171 |
+makereference(char *scope, char *label, Uint16 addr) |
|
172 |
+{ |
|
173 |
+ char subw[64]; |
|
174 |
+ Reference *r; |
|
175 |
+ if(p.rlen == 2048) |
|
176 |
+ return error("Too many references", label); |
|
177 |
+ r = &p.refs[p.rlen++]; |
|
178 |
+ if(label[1] == '&') |
|
179 |
+ scpy(sublabel(subw, scope, label + 2), r->name, 64); |
|
180 |
+ else |
|
181 |
+ scpy(label + 1, r->name, 64); |
|
182 |
+ r->rune = label[0]; |
|
183 |
+ r->addr = addr; |
|
184 |
+ return 1; |
|
185 |
+} |
|
186 |
+ |
|
164 | 187 |
static void |
165 | 188 |
writebyte(Uint8 b) |
166 | 189 |
{ |
... | ... |
@@ -192,25 +215,6 @@ writelitbyte(Uint8 b) |
192 | 215 |
litlast = 1; |
193 | 216 |
} |
194 | 217 |
|
195 |
-static char * |
|
196 |
-sublabel(char *src, char *scope, char *name) |
|
197 |
-{ |
|
198 |
- return scat(scat(scpy(scope, src, 64), "/"), name); |
|
199 |
-} |
|
200 |
- |
|
201 |
-static void |
|
202 |
-prefill(char *scope, char *label, Uint16 addr) |
|
203 |
-{ |
|
204 |
- char subw[64]; |
|
205 |
- Reference *r = &p.refs[p.rlen++]; |
|
206 |
- if(label[1] == '&') |
|
207 |
- scpy(sublabel(subw, scope, label + 2), r->name, 64); |
|
208 |
- else |
|
209 |
- scpy(label + 1, r->name, 64); |
|
210 |
- r->rune = label[0]; |
|
211 |
- r->addr = addr; |
|
212 |
-} |
|
213 |
- |
|
214 | 218 |
static int |
215 | 219 |
doinclude(const char *filename) |
216 | 220 |
{ |
... | ... |
@@ -274,19 +278,19 @@ tokenize(char *w, FILE *f) |
274 | 278 |
writeshort(shex(w + 1), 1); |
275 | 279 |
break; |
276 | 280 |
case '.': /* literal byte zero-page */ |
277 |
- prefill(p.scope, w, p.ptr - litlast); |
|
281 |
+ makereference(p.scope, w, p.ptr - litlast); |
|
278 | 282 |
writelitbyte(0xff); |
279 | 283 |
break; |
280 | 284 |
case ',': /* literal byte relative */ |
281 |
- prefill(p.scope, w, p.ptr - litlast); |
|
285 |
+ makereference(p.scope, w, p.ptr - litlast); |
|
282 | 286 |
writelitbyte(0xff); |
283 | 287 |
break; |
284 | 288 |
case ';': /* literal short absolute */ |
285 |
- prefill(p.scope, w, p.ptr); |
|
289 |
+ makereference(p.scope, w, p.ptr); |
|
286 | 290 |
writeshort(0xffff, 1); |
287 | 291 |
break; |
288 | 292 |
case ':': /* raw short absolute */ |
289 |
- prefill(p.scope, w, p.ptr); |
|
293 |
+ makereference(p.scope, w, p.ptr); |
|
290 | 294 |
writeshort(0xffff, 0); |
291 | 295 |
break; |
292 | 296 |
case '\'': /* raw char */ |