Browse code

(uxnasm) Simplify handling of references.

Andrew Alderwick authored on 12/01/2023 13:15:07
Showing 1 changed files
... ...
@@ -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;