...
|
...
|
@@ -33,10 +33,11 @@ int
|
33
|
33
|
uxn_eval(Uxn *u, Uint16 pc)
|
34
|
34
|
{
|
35
|
35
|
Uint8 kptr, *sp;
|
36
|
|
- Uint16 a, b, c, j, k, bs, instr;
|
|
36
|
+ Uint16 a, b, c, j, k, bs, instr, opcode;
|
37
|
37
|
Stack *src, *dst;
|
38
|
38
|
if(!pc || u->dev[0x0f]) return 0;
|
39
|
|
- while((instr = u->ram[pc++])) {
|
|
39
|
+ for(;;) {
|
|
40
|
+ instr = u->ram[pc++];
|
40
|
41
|
/* Return Mode */
|
41
|
42
|
if(instr & 0x40) { src = u->rst; dst = u->wst; }
|
42
|
43
|
else { src = u->wst; dst = u->rst; }
|
...
|
...
|
@@ -45,14 +46,17 @@ uxn_eval(Uxn *u, Uint16 pc)
|
45
|
46
|
else sp = &src->ptr;
|
46
|
47
|
/* Short Mode */
|
47
|
48
|
bs = instr & 0x20;
|
48
|
|
- switch(instr & 0x1f) {
|
49
|
|
- case 0x00:
|
|
49
|
+ opcode = instr & 0x1f;
|
|
50
|
+ switch(opcode - (!opcode * (instr >> 5))) {
|
50
|
51
|
/* Literals/Calls */
|
51
|
|
- if(instr == 0x20) /* JMI */ { PEEK16(a, pc) pc = a; }
|
52
|
|
- else if(instr == 0x40) /* JCI */ { sp = &u->wst->ptr; src = u->wst; POP8(b) if(b) { PEEK16(a, pc) pc = a; } else pc += 2; }
|
53
|
|
- else if(instr == 0x60) /* JSI */ { PUSH16(u->rst, pc + 2) PEEK16(a, pc) pc = a; }
|
54
|
|
- else if(bs) /* LIT2 */ { PEEK16(a, pc) PUSH16(src, a) pc += 2; }
|
55
|
|
- else /* LITr */ { a = u->ram[pc++]; PUSH8(src, a) } break;
|
|
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;
|
|
56
|
+ case -0x4: /* LIT */
|
|
57
|
+ case -0x6: /* LITr */ a = u->ram[pc++]; PUSH8(src, a) break;
|
|
58
|
+ case -0x5: /* LIT2 */
|
|
59
|
+ case -0x7: /* LIT2r */ PEEK16(a, pc) PUSH16(src, a) pc += 2; break;
|
56
|
60
|
/* ALU */
|
57
|
61
|
case 0x01: /* INC */ POP(a) PUSH(src, a + 1) break;
|
58
|
62
|
case 0x02: /* POP */ POP(a) break;
|
...
|
...
|
@@ -87,7 +91,6 @@ uxn_eval(Uxn *u, Uint16 pc)
|
87
|
91
|
case 0x1f: /* SFT */ POP8(a) POP(b) PUSH(src, b >> (a & 0x0f) << ((a & 0xf0) >> 4)) break;
|
88
|
92
|
}
|
89
|
93
|
}
|
90
|
|
- return 1;
|
91
|
94
|
}
|
92
|
95
|
|
93
|
96
|
int
|