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