| ... | ... |
@@ -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 */ |