| ... | ... |
@@ -303,26 +303,30 @@ parse(char *w, FILE *f) |
| 303 | 303 |
if(!writeshort(shex(w + 1), 1)) return 0; |
| 304 | 304 |
} |
| 305 | 305 |
break; |
| 306 |
- case '.': /* literal byte zero-page */ |
|
| 306 |
+ case '_': /* raw byte relative */ |
|
| 307 | 307 |
makereference(p.scope, w, p.ptr); |
| 308 |
- if(!writelitbyte(0xff)) return 0; |
|
| 308 |
+ if(!writebyte(0xff)) return 0; |
|
| 309 | 309 |
break; |
| 310 | 310 |
case ',': /* literal byte relative */ |
| 311 | 311 |
makereference(p.scope, w, p.ptr); |
| 312 | 312 |
if(!writelitbyte(0xff)) return 0; |
| 313 | 313 |
break; |
| 314 |
- case ';': /* literal short absolute */ |
|
| 314 |
+ case '-': /* raw byte absolute */ |
|
| 315 | 315 |
makereference(p.scope, w, p.ptr); |
| 316 |
- if(!writeshort(0xffff, 1)) return 0; |
|
| 316 |
+ if(!writebyte(0xff)) return 0; |
|
| 317 |
+ break; |
|
| 318 |
+ case '.': /* literal byte zero-page */ |
|
| 319 |
+ makereference(p.scope, w, p.ptr); |
|
| 320 |
+ if(!writelitbyte(0xff)) return 0; |
|
| 317 | 321 |
break; |
| 318 | 322 |
case ':': /* raw short absolute */ |
| 319 | 323 |
case '=': |
| 320 | 324 |
makereference(p.scope, w, p.ptr); |
| 321 | 325 |
if(!writeshort(0xffff, 0)) return 0; |
| 322 | 326 |
break; |
| 323 |
- case '-': /* raw byte absolute */ |
|
| 327 |
+ case ';': /* literal short absolute */ |
|
| 324 | 328 |
makereference(p.scope, w, p.ptr); |
| 325 |
- if(!writebyte(0xff)) return 0; |
|
| 329 |
+ if(!writeshort(0xffff, 1)) return 0; |
|
| 326 | 330 |
break; |
| 327 | 331 |
case '"': /* raw string */ |
| 328 | 332 |
i = 0; |
| ... | ... |
@@ -365,10 +369,12 @@ resolve(void) |
| 365 | 369 |
for(i = 0; i < p.rlen; i++) {
|
| 366 | 370 |
Reference *r = &p.refs[i]; |
| 367 | 371 |
switch(r->rune) {
|
| 368 |
- case '.': |
|
| 372 |
+ case '_': |
|
| 369 | 373 |
if(!(l = findlabel(r->name))) |
| 370 |
- return error("Unknown zero-page reference", r->name);
|
|
| 371 |
- p.data[r->addr + 1] = l->addr & 0xff; |
|
| 374 |
+ return error("Unknown relative reference", r->name);
|
|
| 375 |
+ p.data[r->addr] = (Sint8)(l->addr - r->addr - 2); |
|
| 376 |
+ if((Sint8)p.data[r->addr] != (l->addr - r->addr - 2)) |
|
| 377 |
+ return error("Relative reference is too far", r->name);
|
|
| 372 | 378 |
l->refs++; |
| 373 | 379 |
break; |
| 374 | 380 |
case ',': |
| ... | ... |
@@ -379,11 +385,16 @@ resolve(void) |
| 379 | 385 |
return error("Relative reference is too far", r->name);
|
| 380 | 386 |
l->refs++; |
| 381 | 387 |
break; |
| 382 |
- case ';': |
|
| 388 |
+ case '-': |
|
| 383 | 389 |
if(!(l = findlabel(r->name))) |
| 384 | 390 |
return error("Unknown absolute reference", r->name);
|
| 385 |
- p.data[r->addr + 1] = l->addr >> 0x8; |
|
| 386 |
- p.data[r->addr + 2] = l->addr & 0xff; |
|
| 391 |
+ p.data[r->addr] = l->addr & 0xff; |
|
| 392 |
+ l->refs++; |
|
| 393 |
+ break; |
|
| 394 |
+ case '.': |
|
| 395 |
+ if(!(l = findlabel(r->name))) |
|
| 396 |
+ return error("Unknown zero-page reference", r->name);
|
|
| 397 |
+ p.data[r->addr + 1] = l->addr & 0xff; |
|
| 387 | 398 |
l->refs++; |
| 388 | 399 |
break; |
| 389 | 400 |
case ':': |
| ... | ... |
@@ -394,10 +405,11 @@ resolve(void) |
| 394 | 405 |
p.data[r->addr + 1] = l->addr & 0xff; |
| 395 | 406 |
l->refs++; |
| 396 | 407 |
break; |
| 397 |
- case '-': |
|
| 408 |
+ case ';': |
|
| 398 | 409 |
if(!(l = findlabel(r->name))) |
| 399 | 410 |
return error("Unknown absolute reference", r->name);
|
| 400 |
- p.data[r->addr] = l->addr & 0xff; |
|
| 411 |
+ p.data[r->addr + 1] = l->addr >> 0x8; |
|
| 412 |
+ p.data[r->addr + 2] = l->addr & 0xff; |
|
| 401 | 413 |
l->refs++; |
| 402 | 414 |
break; |
| 403 | 415 |
default: |