commit 256b7ca

Devine Lu Linvega  ·  2023-01-12 17:34:45 +0000 UTC
parent 18ff855
Call opcodes are now relative
2 files changed,  +31, -34
+13, -10
 1@@ -33,10 +33,11 @@ int
 2 uxn_eval(Uxn *u, Uint16 pc)
 3 {
 4 	Uint8 kptr, *sp;
 5-	Uint16 a, b, c, j, k, bs, instr;
 6+	Uint16 a, b, c, j, k, bs, instr, opcode;
 7 	Stack *src, *dst;
 8 	if(!pc || u->dev[0x0f]) return 0;
 9-	while((instr = u->ram[pc++])) {
10+	for(;;) {
11+		instr = u->ram[pc++];
12 		/* Return Mode */
13 		if(instr & 0x40) { src = u->rst; dst = u->wst; }
14 		else { src = u->wst; dst = u->rst; }
15@@ -45,14 +46,17 @@ uxn_eval(Uxn *u, Uint16 pc)
16 		else sp = &src->ptr;
17 		/* Short Mode */
18 		bs = instr & 0x20;
19-		switch(instr & 0x1f) {
20-		case 0x00:
21+		opcode = instr & 0x1f;
22+		switch(opcode - (!opcode * (instr >> 5))) {
23 		/* Literals/Calls */
24-		if(instr == 0x20)      /* JMI  */ { PEEK16(a, pc) pc = a; }
25-		else if(instr == 0x40) /* JCI  */ { sp = &u->wst->ptr; src = u->wst; POP8(b) if(b) { PEEK16(a, pc) pc = a; } else pc += 2; }
26-		else if(instr == 0x60) /* JSI  */ { PUSH16(u->rst, pc + 2) PEEK16(a, pc) pc = a; }
27-		else if(bs)            /* LIT2 */ { PEEK16(a, pc) PUSH16(src, a) pc += 2; }
28-		else                   /* LITr */ { a = u->ram[pc++]; PUSH8(src, a) } break;
29+		case -0x0: /* BRK */ return 1;
30+		case -0x1: /* JMI */ PEEK16(a, pc) pc += a + 2; break;
31+		case -0x2: /* JCI */ sp = &u->wst->ptr; src = u->wst; POP8(b) if(b) { PEEK16(a, pc) pc += a + 2; } else pc += 2; break;
32+		case -0x3: /* JSI */ PUSH16(u->rst, pc + 2) PEEK16(a, pc) pc += a + 2; break;
33+		case -0x4: /* LIT */
34+		case -0x6: /* LITr */ a = u->ram[pc++]; PUSH8(src, a) break;
35+		case -0x5: /* LIT2 */
36+		case -0x7: /* LIT2r */ PEEK16(a, pc) PUSH16(src, a) pc += 2; break;
37 		/* ALU */
38 		case 0x01: /* INC */ POP(a) PUSH(src, a + 1) break;
39 		case 0x02: /* POP */ POP(a) break;
40@@ -87,7 +91,6 @@ uxn_eval(Uxn *u, Uint16 pc)
41 		case 0x1f: /* SFT */ POP8(a) POP(b) PUSH(src, b >> (a & 0x0f) << ((a & 0xf0) >> 4)) break;
42 		}
43 	}
44-	return 1;
45 }
46 
47 int
+18, -24
  1@@ -302,26 +302,26 @@ parse(char *w, FILE *f)
  2 		makereference(p.scope, w, p.ptr);
  3 		return writebyte(0xff);
  4 	case ',': /* literal byte relative */
  5-		makereference(p.scope, w, p.ptr);
  6+		makereference(p.scope, w, p.ptr + 1);
  7 		return writelitbyte(0xff);
  8 	case '-': /* raw byte absolute */
  9 		makereference(p.scope, w, p.ptr);
 10 		return writebyte(0xff);
 11 	case '.': /* literal byte zero-page */
 12-		makereference(p.scope, w, p.ptr);
 13+		makereference(p.scope, w, p.ptr + 1);
 14 		return writelitbyte(0xff);
 15 	case ':': /* raw short absolute */
 16 	case '=':
 17 		makereference(p.scope, w, p.ptr);
 18 		return writeshort(0xffff, 0);
 19 	case ';': /* literal short absolute */
 20-		makereference(p.scope, w, p.ptr);
 21+		makereference(p.scope, w, p.ptr + 1);
 22 		return writeshort(0xffff, 1);
 23 	case '!': /* JMI */
 24-		makereference(p.scope, w, p.ptr);
 25+		makereference(p.scope, w, p.ptr + 1);
 26 		return writebyte(0x20) && writeshort(0xffff, 0);
 27 	case '?': /* JCI */
 28-		makereference(p.scope, w, p.ptr);
 29+		makereference(p.scope, w, p.ptr + 1);
 30 		return writebyte(0x40) && writeshort(0xffff, 0);
 31 	case '"': /* raw string */
 32 		i = 0;
 33@@ -348,7 +348,7 @@ parse(char *w, FILE *f)
 34 					return 0;
 35 			return 1;
 36 		} else {
 37-			makereference(p.scope, w - 1, p.ptr);
 38+			makereference(p.scope, w - 1, p.ptr + 1);
 39 			return writebyte(0x60) && writeshort(0xffff, 0);
 40 		}
 41 	}
 42@@ -360,10 +360,12 @@ resolve(void)
 43 {
 44 	Label *l;
 45 	int i;
 46+	Uint16 a;
 47 	for(i = 0; i < p.rlen; i++) {
 48 		Reference *r = &p.refs[i];
 49 		switch(r->rune) {
 50 		case '_':
 51+		case ',':
 52 			if(!(l = findlabel(r->name)))
 53 				return error("Unknown relative reference", r->name);
 54 			p.data[r->addr] = (Sint8)(l->addr - r->addr - 2);
 55@@ -371,39 +373,30 @@ resolve(void)
 56 				return error("Relative reference is too far", r->name);
 57 			l->refs++;
 58 			break;
 59-		case ',':
 60-			if(!(l = findlabel(r->name)))
 61-				return error("Unknown relative reference", r->name);
 62-			p.data[r->addr + 1] = (Sint8)(l->addr - r->addr - 3);
 63-			if((Sint8)p.data[r->addr + 1] != (l->addr - r->addr - 3))
 64-				return error("Relative reference is too far", r->name);
 65-			l->refs++;
 66-			break;
 67 		case '-':
 68-			if(!(l = findlabel(r->name)))
 69-				return error("Unknown absolute reference", r->name);
 70-			p.data[r->addr] = l->addr & 0xff;
 71-			l->refs++;
 72-			break;
 73 		case '.':
 74 			if(!(l = findlabel(r->name)))
 75 				return error("Unknown zero-page reference", r->name);
 76-			p.data[r->addr + 1] = l->addr & 0xff;
 77+			p.data[r->addr] = l->addr & 0xff;
 78 			l->refs++;
 79 			break;
 80 		case ':':
 81 		case '=':
 82+		case ';':
 83 			if(!(l = findlabel(r->name)))
 84 				return error("Unknown absolute reference", r->name);
 85 			p.data[r->addr] = l->addr >> 0x8;
 86 			p.data[r->addr + 1] = l->addr & 0xff;
 87 			l->refs++;
 88 			break;
 89+		case '?':
 90+		case '!':
 91 		default:
 92 			if(!(l = findlabel(r->name)))
 93 				return error("Unknown absolute reference", r->name);
 94-			p.data[r->addr + 1] = l->addr >> 0x8;
 95-			p.data[r->addr + 2] = l->addr & 0xff;
 96+			a = l->addr - r->addr - 2;
 97+			p.data[r->addr] = a >> 0x8;
 98+			p.data[r->addr + 1] = a & 0xff;
 99 			l->refs++;
100 			break;
101 		}
102@@ -451,8 +444,9 @@ writesym(char *filename)
103 	fp = fopen(scat(scpy(filename, symdst, slen(filename) + 1), ".sym"), "w");
104 	if(fp != NULL) {
105 		for(i = 0; i < p.llen; i++) {
106-			fwrite(&p.labels[i].addr + 1, 1, 1, fp);
107-			fwrite((Uint8*)&p.labels[i].addr, 1, 1, fp);
108+			Uint8 hb = p.labels[i].addr >> 8, lb = p.labels[i].addr & 0xff;
109+			fwrite(&hb, 1, 1, fp);
110+			fwrite(&lb, 1, 1, fp);
111 			fwrite(p.labels[i].name, slen(p.labels[i].name) + 1, 1, fp);
112 		}
113 	}