Browse code

Clearer routing of LIT/CALL opcodes

Devine Lu Linvega authored on 02/01/2023 21:11:52
Showing 1 changed files
... ...
@@ -46,8 +46,14 @@ uxn_eval(Uxn *u, Uint16 pc)
46 46
 		/* Short Mode */
47 47
 		bs = instr & 0x20;
48 48
 		switch(instr & 0x1f) {
49
-		case 0x00: /* LIT */ if(bs) { PEEK16(a, pc) PUSH16(src, a) pc += 2; }
50
-		                     else   { a = u->ram[pc]; PUSH8(src, a) pc++; } break;
49
+		case 0x00:
50
+		/* Literals/Calls */
51
+		if(instr == 0x20)      /* JMI  */ { sp = &u->wst->ptr; PEEK16(a, pc) pc = a; }
52
+		else if(instr == 0x40) /* JCI  */ { sp = &u->wst->ptr; src = u->wst; POP8(a) PEEK16(b, pc) pc = a ? (Uint16)b : pc + 2; }
53
+		else if(instr == 0x60) /* JSI  */ { sp = &u->wst->ptr; PEEK16(a, pc) PUSH16(u->rst, pc + 2) pc = a; }
54
+		else if(bs)            /* LIT2 */ { PEEK16(a, pc) PUSH16(src, a) pc = pc + 2; }
55
+		else                   /* LITr */ { a = u->ram[pc++]; PUSH8(src, a) } break;
56
+		/* ALU */
51 57
 		case 0x01: /* INC */ POP(a) PUSH(src, a + 1) break;
52 58
 		case 0x02: /* POP */ POP(a) break;
53 59
 		case 0x03: /* NIP */ POP(a) POP(b) PUSH(src, a) break;