| ... | ... |
@@ -302,26 +302,26 @@ parse(char *w, FILE *f) |
| 302 | 302 |
makereference(p.scope, w, p.ptr); |
| 303 | 303 |
return writebyte(0xff); |
| 304 | 304 |
case ',': /* literal byte relative */ |
| 305 |
- makereference(p.scope, w, p.ptr); |
|
| 305 |
+ makereference(p.scope, w, p.ptr + 1); |
|
| 306 | 306 |
return writelitbyte(0xff); |
| 307 | 307 |
case '-': /* raw byte absolute */ |
| 308 | 308 |
makereference(p.scope, w, p.ptr); |
| 309 | 309 |
return writebyte(0xff); |
| 310 | 310 |
case '.': /* literal byte zero-page */ |
| 311 |
- makereference(p.scope, w, p.ptr); |
|
| 311 |
+ makereference(p.scope, w, p.ptr + 1); |
|
| 312 | 312 |
return writelitbyte(0xff); |
| 313 | 313 |
case ':': /* raw short absolute */ |
| 314 | 314 |
case '=': |
| 315 | 315 |
makereference(p.scope, w, p.ptr); |
| 316 | 316 |
return writeshort(0xffff, 0); |
| 317 | 317 |
case ';': /* literal short absolute */ |
| 318 |
- makereference(p.scope, w, p.ptr); |
|
| 318 |
+ makereference(p.scope, w, p.ptr + 1); |
|
| 319 | 319 |
return writeshort(0xffff, 1); |
| 320 | 320 |
case '!': /* JMI */ |
| 321 |
- makereference(p.scope, w, p.ptr); |
|
| 321 |
+ makereference(p.scope, w, p.ptr + 1); |
|
| 322 | 322 |
return writebyte(0x20) && writeshort(0xffff, 0); |
| 323 | 323 |
case '?': /* JCI */ |
| 324 |
- makereference(p.scope, w, p.ptr); |
|
| 324 |
+ makereference(p.scope, w, p.ptr + 1); |
|
| 325 | 325 |
return writebyte(0x40) && writeshort(0xffff, 0); |
| 326 | 326 |
case '"': /* raw string */ |
| 327 | 327 |
i = 0; |
| ... | ... |
@@ -348,7 +348,7 @@ parse(char *w, FILE *f) |
| 348 | 348 |
return 0; |
| 349 | 349 |
return 1; |
| 350 | 350 |
} else {
|
| 351 |
- makereference(p.scope, w - 1, p.ptr); |
|
| 351 |
+ makereference(p.scope, w - 1, p.ptr + 1); |
|
| 352 | 352 |
return writebyte(0x60) && writeshort(0xffff, 0); |
| 353 | 353 |
} |
| 354 | 354 |
} |
| ... | ... |
@@ -364,6 +364,7 @@ resolve(void) |
| 364 | 364 |
Reference *r = &p.refs[i]; |
| 365 | 365 |
switch(r->rune) {
|
| 366 | 366 |
case '_': |
| 367 |
+ case ',': |
|
| 367 | 368 |
if(!(l = findlabel(r->name))) |
| 368 | 369 |
return error("Unknown relative reference", r->name);
|
| 369 | 370 |
p.data[r->addr] = (Sint8)(l->addr - r->addr - 2); |
| ... | ... |
@@ -371,41 +372,25 @@ resolve(void) |
| 371 | 372 |
return error("Relative reference is too far", r->name);
|
| 372 | 373 |
l->refs++; |
| 373 | 374 |
break; |
| 374 |
- case ',': |
|
| 375 |
- if(!(l = findlabel(r->name))) |
|
| 376 |
- return error("Unknown relative reference", r->name);
|
|
| 377 |
- p.data[r->addr + 1] = (Sint8)(l->addr - r->addr - 3); |
|
| 378 |
- if((Sint8)p.data[r->addr + 1] != (l->addr - r->addr - 3)) |
|
| 379 |
- return error("Relative reference is too far", r->name);
|
|
| 380 |
- l->refs++; |
|
| 381 |
- break; |
|
| 382 | 375 |
case '-': |
| 383 |
- if(!(l = findlabel(r->name))) |
|
| 384 |
- return error("Unknown absolute reference", r->name);
|
|
| 385 |
- p.data[r->addr] = l->addr & 0xff; |
|
| 386 |
- l->refs++; |
|
| 387 |
- break; |
|
| 388 | 376 |
case '.': |
| 389 | 377 |
if(!(l = findlabel(r->name))) |
| 390 | 378 |
return error("Unknown zero-page reference", r->name);
|
| 391 |
- p.data[r->addr + 1] = l->addr & 0xff; |
|
| 379 |
+ p.data[r->addr] = l->addr & 0xff; |
|
| 392 | 380 |
l->refs++; |
| 393 | 381 |
break; |
| 394 | 382 |
case ':': |
| 395 | 383 |
case '=': |
| 384 |
+ case ';': |
|
| 385 |
+ case '?': |
|
| 386 |
+ case '!': |
|
| 387 |
+ default: |
|
| 396 | 388 |
if(!(l = findlabel(r->name))) |
| 397 | 389 |
return error("Unknown absolute reference", r->name);
|
| 398 | 390 |
p.data[r->addr] = l->addr >> 0x8; |
| 399 | 391 |
p.data[r->addr + 1] = l->addr & 0xff; |
| 400 | 392 |
l->refs++; |
| 401 | 393 |
break; |
| 402 |
- default: |
|
| 403 |
- if(!(l = findlabel(r->name))) |
|
| 404 |
- return error("Unknown absolute reference", r->name);
|
|
| 405 |
- p.data[r->addr + 1] = l->addr >> 0x8; |
|
| 406 |
- p.data[r->addr + 2] = l->addr & 0xff; |
|
| 407 |
- l->refs++; |
|
| 408 |
- break; |
|
| 409 | 394 |
} |
| 410 | 395 |
} |
| 411 | 396 |
return 1; |