| ... | ... |
@@ -211,9 +211,7 @@ writebyte(Uint8 b) |
| 211 | 211 |
static int |
| 212 | 212 |
writeopcode(char *w) |
| 213 | 213 |
{
|
| 214 |
- Uint8 res; |
|
| 215 |
- res = writebyte(findopcode(w)); |
|
| 216 |
- return res; |
|
| 214 |
+ return writebyte(findopcode(w)); |
|
| 217 | 215 |
} |
| 218 | 216 |
|
| 219 | 217 |
static int |
| ... | ... |
@@ -227,9 +225,7 @@ writeshort(Uint16 s, int lit) |
| 227 | 225 |
static int |
| 228 | 226 |
writelitbyte(Uint8 b) |
| 229 | 227 |
{
|
| 230 |
- if(!writebyte(findopcode("LIT"))) return 0;
|
|
| 231 |
- if(!writebyte(b)) return 0; |
|
| 232 |
- return 1; |
|
| 228 |
+ return writebyte(findopcode("LIT")) && writebyte(b);
|
|
| 233 | 229 |
} |
| 234 | 230 |
|
| 235 | 231 |
static int |
| ... | ... |
@@ -295,39 +291,38 @@ parse(char *w, FILE *f) |
| 295 | 291 |
return error("Invalid sublabel", w);
|
| 296 | 292 |
break; |
| 297 | 293 |
case '#': /* literals hex */ |
| 298 |
- if(!sihx(w + 1) || (slen(w) != 3 && slen(w) != 5)) |
|
| 294 |
+ if(sihx(w + 1) && slen(w) == 3) |
|
| 295 |
+ return writelitbyte(shex(w + 1)); |
|
| 296 |
+ else if(sihx(w + 1) && slen(w) == 5) |
|
| 297 |
+ return writeshort(shex(w + 1), 1); |
|
| 298 |
+ else |
|
| 299 | 299 |
return error("Invalid hex literal", w);
|
| 300 |
- if(slen(w) == 3) {
|
|
| 301 |
- if(!writelitbyte(shex(w + 1))) return 0; |
|
| 302 |
- } else if(slen(w) == 5) {
|
|
| 303 |
- if(!writeshort(shex(w + 1), 1)) return 0; |
|
| 304 |
- } |
|
| 305 | 300 |
break; |
| 306 | 301 |
case '_': /* raw byte relative */ |
| 307 | 302 |
makereference(p.scope, w, p.ptr); |
| 308 |
- if(!writebyte(0xff)) return 0; |
|
| 309 |
- break; |
|
| 303 |
+ return writebyte(0xff); |
|
| 310 | 304 |
case ',': /* literal byte relative */ |
| 311 | 305 |
makereference(p.scope, w, p.ptr); |
| 312 |
- if(!writelitbyte(0xff)) return 0; |
|
| 313 |
- break; |
|
| 306 |
+ return writelitbyte(0xff); |
|
| 314 | 307 |
case '-': /* raw byte absolute */ |
| 315 | 308 |
makereference(p.scope, w, p.ptr); |
| 316 |
- if(!writebyte(0xff)) return 0; |
|
| 317 |
- break; |
|
| 309 |
+ return writebyte(0xff); |
|
| 318 | 310 |
case '.': /* literal byte zero-page */ |
| 319 | 311 |
makereference(p.scope, w, p.ptr); |
| 320 |
- if(!writelitbyte(0xff)) return 0; |
|
| 321 |
- break; |
|
| 312 |
+ return writelitbyte(0xff); |
|
| 322 | 313 |
case ':': /* raw short absolute */ |
| 323 | 314 |
case '=': |
| 324 | 315 |
makereference(p.scope, w, p.ptr); |
| 325 |
- if(!writeshort(0xffff, 0)) return 0; |
|
| 326 |
- break; |
|
| 316 |
+ return writeshort(0xffff, 0); |
|
| 327 | 317 |
case ';': /* literal short absolute */ |
| 328 | 318 |
makereference(p.scope, w, p.ptr); |
| 329 |
- if(!writeshort(0xffff, 1)) return 0; |
|
| 330 |
- break; |
|
| 319 |
+ return writeshort(0xffff, 1); |
|
| 320 |
+ case '!': /* JMI */ |
|
| 321 |
+ makereference(p.scope, w, p.ptr); |
|
| 322 |
+ return writebyte(0x20) && writeshort(0xffff, 0); |
|
| 323 |
+ case '?': /* JCI */ |
|
| 324 |
+ makereference(p.scope, w, p.ptr); |
|
| 325 |
+ return writebyte(0x40) && writeshort(0xffff, 0); |
|
| 331 | 326 |
case '"': /* raw string */ |
| 332 | 327 |
i = 0; |
| 333 | 328 |
while((c = w[++i])) |
| ... | ... |
@@ -338,25 +333,24 @@ parse(char *w, FILE *f) |
| 338 | 333 |
if(slen(w) == 1) break; /* else fallthrough */ |
| 339 | 334 |
default: |
| 340 | 335 |
/* opcode */ |
| 341 |
- if(findopcode(w) || scmp(w, "BRK", 4)) {
|
|
| 342 |
- if(!writeopcode(w)) return 0; |
|
| 343 |
- } |
|
| 336 |
+ if(findopcode(w) || scmp(w, "BRK", 4)) |
|
| 337 |
+ return writeopcode(w); |
|
| 344 | 338 |
/* raw byte */ |
| 345 |
- else if(sihx(w) && slen(w) == 2) {
|
|
| 346 |
- if(!writebyte(shex(w))) return 0; |
|
| 347 |
- } |
|
| 339 |
+ else if(sihx(w) && slen(w) == 2) |
|
| 340 |
+ return writebyte(shex(w)); |
|
| 348 | 341 |
/* raw short */ |
| 349 |
- else if(sihx(w) && slen(w) == 4) {
|
|
| 350 |
- if(!writeshort(shex(w), 0)) return 0; |
|
| 351 |
- } |
|
| 342 |
+ else if(sihx(w) && slen(w) == 4) |
|
| 343 |
+ return writeshort(shex(w), 0); |
|
| 352 | 344 |
/* macro */ |
| 353 | 345 |
else if((m = findmacro(w))) {
|
| 354 | 346 |
for(i = 0; i < m->len; i++) |
| 355 | 347 |
if(!parse(m->items[i], f)) |
| 356 | 348 |
return 0; |
| 357 | 349 |
return 1; |
| 358 |
- } else |
|
| 359 |
- return error("Unknown token", w);
|
|
| 350 |
+ } else {
|
|
| 351 |
+ makereference(p.scope, w - 1, p.ptr); |
|
| 352 |
+ return writebyte(0x60) && writeshort(0xffff, 0); |
|
| 353 |
+ } |
|
| 360 | 354 |
} |
| 361 | 355 |
return 1; |
| 362 | 356 |
} |
| ... | ... |
@@ -405,15 +399,13 @@ resolve(void) |
| 405 | 399 |
p.data[r->addr + 1] = l->addr & 0xff; |
| 406 | 400 |
l->refs++; |
| 407 | 401 |
break; |
| 408 |
- case ';': |
|
| 402 |
+ default: |
|
| 409 | 403 |
if(!(l = findlabel(r->name))) |
| 410 | 404 |
return error("Unknown absolute reference", r->name);
|
| 411 | 405 |
p.data[r->addr + 1] = l->addr >> 0x8; |
| 412 | 406 |
p.data[r->addr + 2] = l->addr & 0xff; |
| 413 | 407 |
l->refs++; |
| 414 | 408 |
break; |
| 415 |
- default: |
|
| 416 |
- return error("Unknown reference", r->name);
|
|
| 417 | 409 |
} |
| 418 | 410 |
} |
| 419 | 411 |
return 1; |