Browse code

Make JMI, JCI and JSI relative.

Andrew Alderwick authored on 12/01/2023 13:22:21
Showing 2 changed files
... ...
@@ -50,9 +50,9 @@ uxn_eval(Uxn *u, Uint16 pc)
50 50
 		switch(opcode - (!opcode * (instr >> 5))) {
51 51
 		/* Literals/Calls */
52 52
 		case -0x0: /* BRK */ return 1;
53
-		case -0x1: /* JMI */ PEEK16(a, pc) pc = a; break;
54
-		case -0x2: /* JCI */ sp = &u->wst->ptr; src = u->wst; POP8(b) if(b) { PEEK16(a, pc) pc = a; } else pc += 2; break;
55
-		case -0x3: /* JSI */ PUSH16(u->rst, pc + 2) PEEK16(a, pc) pc = a; break;
53
+		case -0x1: /* JMI */ PEEK16(a, pc) pc += a + 2; break;
54
+		case -0x2: /* JCI */ sp = &u->wst->ptr; src = u->wst; POP8(b) if(b) { PEEK16(a, pc) pc += a + 2; } else pc += 2; break;
55
+		case -0x3: /* JSI */ PUSH16(u->rst, pc + 2) PEEK16(a, pc) pc += a + 2; break;
56 56
 		case -0x4: /* LIT */
57 57
 		case -0x6: /* LITr */ a = u->ram[pc++]; PUSH8(src, a) break;
58 58
 		case -0x5: /* LIT2 */
... ...
@@ -360,6 +360,7 @@ resolve(void)
360 360
 {
361 361
 	Label *l;
362 362
 	int i;
363
+	Uint16 a;
363 364
 	for(i = 0; i < p.rlen; i++) {
364 365
 		Reference *r = &p.refs[i];
365 366
 		switch(r->rune) {
... ...
@@ -382,13 +383,20 @@ resolve(void)
382 383
 		case ':':
383 384
 		case '=':
384 385
 		case ';':
386
+			if(!(l = findlabel(r->name)))
387
+				return error("Unknown absolute reference", r->name);
388
+			p.data[r->addr] = l->addr >> 0x8;
389
+			p.data[r->addr + 1] = l->addr & 0xff;
390
+			l->refs++;
391
+			break;
385 392
 		case '?':
386 393
 		case '!':
387 394
 		default:
388 395
 			if(!(l = findlabel(r->name)))
389 396
 				return error("Unknown absolute reference", r->name);
390
-			p.data[r->addr] = l->addr >> 0x8;
391
-			p.data[r->addr + 1] = l->addr & 0xff;
397
+			a = l->addr - r->addr - 2;
398
+			p.data[r->addr] = a >> 0x8;
399
+			p.data[r->addr + 1] = a & 0xff;
392 400
 			l->refs++;
393 401
 			break;
394 402
 		}