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 }