... | ... |
@@ -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; |