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