Browse code

Added _rune

neauoire authored on 11/11/2022 04:54:53
Showing 1 changed files
... ...
@@ -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: