commit 2b06a51

Devine Lu Linvega  ·  2024-07-01 04:16:54 +0000 UTC
parent d3ea48e
Ignore r mode in imm opcodes
1 files changed,  +70, -73
+70, -73
  1@@ -42,83 +42,80 @@ uxn_eval(Uint16 pc)
  2 	if(!pc || uxn.dev[0x0f]) return 0;
  3 	for(;;) {
  4 		Uint8 ins = uxn.ram[pc++];
  5-		Stack *s = ins & 0x40 ? &uxn.rst : &uxn.wst;
  6-		switch(ins & 0x3f) {
  7-		/* IMM */
  8-		case 0x00: case 0x20:
  9+		if(ins & 0x1f) {
 10+			Stack *s = ins & 0x40 ? &uxn.rst : &uxn.wst;
 11+			switch(ins & 0x3f) {
 12+			case 0x01: /* INC  */ t=T;            SET(1, 0) T = t + 1; break;
 13+			case 0x21: /* INC2 */ t=T2;           SET(2, 0) T2_(t + 1) break;
 14+			case 0x02: /* POP  */                 SET(1,-1) break;
 15+			case 0x22: /* POP2 */                 SET(2,-2) break;
 16+			case 0x03: /* NIP  */ t=T;            SET(2,-1) T = t; break;
 17+			case 0x23: /* NIP2 */ t=T2;           SET(4,-2) T2_(t) break;
 18+			case 0x04: /* SWP  */ t=T;n=N;        SET(2, 0) T = n; N = t; break;
 19+			case 0x24: /* SWP2 */ t=T2;n=N2;      SET(4, 0) T2_(n) N2_(t) break;
 20+			case 0x05: /* ROT  */ t=T;n=N;l=L;    SET(3, 0) T = l; N = t; L = n; break;
 21+			case 0x25: /* ROT2 */ t=T2;n=N2;l=L2; SET(6, 0) T2_(l) N2_(t) L2_(n) break;
 22+			case 0x06: /* DUP  */ t=T;            SET(1, 1) T = t; N = t; break;
 23+			case 0x26: /* DUP2 */ t=T2;           SET(2, 2) T2_(t) N2_(t) break;
 24+			case 0x07: /* OVR  */ t=T;n=N;        SET(2, 1) T = n; N = t; L = n; break;
 25+			case 0x27: /* OVR2 */ t=T2;n=N2;      SET(4, 2) T2_(n) N2_(t) L2_(n) break;
 26+			case 0x08: /* EQU  */ t=T;n=N;        SET(2,-1) T = n == t; break;
 27+			case 0x28: /* EQU2 */ t=T2;n=N2;      SET(4,-3) T = n == t; break;
 28+			case 0x09: /* NEQ  */ t=T;n=N;        SET(2,-1) T = n != t; break;
 29+			case 0x29: /* NEQ2 */ t=T2;n=N2;      SET(4,-3) T = n != t; break;
 30+			case 0x0a: /* GTH  */ t=T;n=N;        SET(2,-1) T = n > t; break;
 31+			case 0x2a: /* GTH2 */ t=T2;n=N2;      SET(4,-3) T = n > t; break;
 32+			case 0x0b: /* LTH  */ t=T;n=N;        SET(2,-1) T = n < t; break;
 33+			case 0x2b: /* LTH2 */ t=T2;n=N2;      SET(4,-3) T = n < t; break;
 34+			case 0x0c: /* JMP  */ t=T;            SET(1,-1) pc += (Sint8)t; break;
 35+			case 0x2c: /* JMP2 */ t=T2;           SET(2,-2) pc = t; break;
 36+			case 0x0d: /* JCN  */ t=T;n=N;        SET(2,-2) if(n) pc += (Sint8)t; break;
 37+			case 0x2d: /* JCN2 */ t=T2;n=L;       SET(3,-3) if(n) pc = t; break;
 38+			case 0x0e: /* JSR  */ t=T;            SET(1,-1) FLIP SHIFT(2) T2_(pc) pc += (Sint8)t; break;
 39+			case 0x2e: /* JSR2 */ t=T2;           SET(2,-2) FLIP SHIFT(2) T2_(pc) pc = t; break;
 40+			case 0x0f: /* STH  */ t=T;            SET(1,-1) FLIP SHIFT(1) T = t; break;
 41+			case 0x2f: /* STH2 */ t=T2;           SET(2,-2) FLIP SHIFT(2) T2_(t) break;
 42+			case 0x10: /* LDZ  */ t=T;            SET(1, 0) T = uxn.ram[t]; break;
 43+			case 0x30: /* LDZ2 */ t=T;            SET(1, 1) N = uxn.ram[t++]; T = uxn.ram[(Uint8)t]; break;
 44+			case 0x11: /* STZ  */ t=T;n=N;        SET(2,-2) uxn.ram[t] = n; break;
 45+			case 0x31: /* STZ2 */ t=T;n=H2;       SET(3,-3) uxn.ram[t++] = n >> 8; uxn.ram[(Uint8)t] = n; break;
 46+			case 0x12: /* LDR  */ t=T;            SET(1, 0) r = pc + (Sint8)t; T = uxn.ram[r]; break;
 47+			case 0x32: /* LDR2 */ t=T;            SET(1, 1) r = pc + (Sint8)t; N = uxn.ram[r++]; T = uxn.ram[r]; break;
 48+			case 0x13: /* STR  */ t=T;n=N;        SET(2,-2) r = pc + (Sint8)t; uxn.ram[r] = n; break;
 49+			case 0x33: /* STR2 */ t=T;n=H2;       SET(3,-3) r = pc + (Sint8)t; uxn.ram[r++] = n >> 8; uxn.ram[r] = n; break;
 50+			case 0x14: /* LDA  */ t=T2;           SET(2,-1) T = uxn.ram[t]; break;
 51+			case 0x34: /* LDA2 */ t=T2;           SET(2, 0) N = uxn.ram[t++]; T = uxn.ram[t]; break;
 52+			case 0x15: /* STA  */ t=T2;n=L;       SET(3,-3) uxn.ram[t] = n; break;
 53+			case 0x35: /* STA2 */ t=T2;n=N2;      SET(4,-4) uxn.ram[t++] = n >> 8; uxn.ram[t] = n; break;
 54+			case 0x16: /* DEI  */ t=T;            SET(1, 0) T = emu_dei(t); break;
 55+			case 0x36: /* DEI2 */ t=T;            SET(1, 1) N = emu_dei(t++); T = emu_dei(t); break;
 56+			case 0x17: /* DEO  */ t=T;n=N;        SET(2,-2) emu_deo(t, n); break;
 57+			case 0x37: /* DEO2 */ t=T;n=N;l=L;    SET(3,-3) emu_deo(t++, l); emu_deo(t, n); break;
 58+			case 0x18: /* ADD  */ t=T;n=N;        SET(2,-1) T = n + t; break;
 59+			case 0x38: /* ADD2 */ t=T2;n=N2;      SET(4,-2) T2_(n + t) break;
 60+			case 0x19: /* SUB  */ t=T;n=N;        SET(2,-1) T = n - t; break;
 61+			case 0x39: /* SUB2 */ t=T2;n=N2;      SET(4,-2) T2_(n - t) break;
 62+			case 0x1a: /* MUL  */ t=T;n=N;        SET(2,-1) T = n * t; break;
 63+			case 0x3a: /* MUL2 */ t=T2;n=N2;      SET(4,-2) T2_(n * t) break;
 64+			case 0x1b: /* DIV  */ t=T;n=N;        SET(2,-1) T = t ? n / t : 0; break;
 65+			case 0x3b: /* DIV2 */ t=T2;n=N2;      SET(4,-2) T2_(t ? n / t : 0) break;
 66+			case 0x1c: /* AND  */ t=T;n=N;        SET(2,-1) T = n & t; break;
 67+			case 0x3c: /* AND2 */ t=T2;n=N2;      SET(4,-2) T2_(n & t) break;
 68+			case 0x1d: /* ORA  */ t=T;n=N;        SET(2,-1) T = n | t; break;
 69+			case 0x3d: /* ORA2 */ t=T2;n=N2;      SET(4,-2) T2_(n | t) break;
 70+			case 0x1e: /* EOR  */ t=T;n=N;        SET(2,-1) T = n ^ t; break;
 71+			case 0x3e: /* EOR2 */ t=T2;n=N2;      SET(4,-2) T2_(n ^ t) break;
 72+			case 0x1f: /* SFT  */ t=T;n=N;        SET(2,-1) T = n >> (t & 0xf) << (t >> 4); break;
 73+			case 0x3f: /* SFT2 */ t=T;n=H2;       SET(3,-1) T2_(n >> (t & 0xf) << (t >> 4)) break; }
 74+		} else
 75 			switch(ins) {
 76 			case 0x00: /* BRK   */ return 1;
 77-			case 0x20: /* JCI   */ if(!uxn.wst.dat[uxn.wst.ptr--]) { pc += 2; break; } /* fall-through */
 78+			case 0x20: /* JCI   */ if(!uxn.wst.dat[uxn.wst.ptr--]) { pc += 2; break; } /* fall */
 79 			case 0x40: /* JMI   */ rr = uxn.ram + pc; pc += 2 + PEEK2(rr); break;
 80 			case 0x60: /* JSI   */ rr = uxn.ram + pc; pc += 2; uxn.rst.dat[++uxn.rst.ptr] = pc >> 8; uxn.rst.dat[++uxn.rst.ptr] = pc; pc += PEEK2(rr); break;
 81-			case 0xa0: /* LIT2  */ uxn.wst.dat[++uxn.wst.ptr] = uxn.ram[pc++]; /* fall-through */
 82+			case 0xa0: /* LIT2  */ uxn.wst.dat[++uxn.wst.ptr] = uxn.ram[pc++]; /* fall */
 83 			case 0x80: /* LIT   */ uxn.wst.dat[++uxn.wst.ptr] = uxn.ram[pc++]; break;
 84-			case 0xe0: /* LIT2r */ uxn.rst.dat[++uxn.rst.ptr] = uxn.ram[pc++]; /* fall-through */
 85-			case 0xc0: /* LITr  */ uxn.rst.dat[++uxn.rst.ptr] = uxn.ram[pc++]; break;
 86-			} break;
 87-		/* ALU */
 88-		case 0x01: /* INC  */ t=T;            SET(1, 0) T = t + 1; break;
 89-		case 0x21: /* INC2 */ t=T2;           SET(2, 0) T2_(t + 1) break;
 90-		case 0x02: /* POP  */                 SET(1,-1) break;
 91-		case 0x22: /* POP2 */                 SET(2,-2) break;
 92-		case 0x03: /* NIP  */ t=T;            SET(2,-1) T = t; break;
 93-		case 0x23: /* NIP2 */ t=T2;           SET(4,-2) T2_(t) break;
 94-		case 0x04: /* SWP  */ t=T;n=N;        SET(2, 0) T = n; N = t; break;
 95-		case 0x24: /* SWP2 */ t=T2;n=N2;      SET(4, 0) T2_(n) N2_(t) break;
 96-		case 0x05: /* ROT  */ t=T;n=N;l=L;    SET(3, 0) T = l; N = t; L = n; break;
 97-		case 0x25: /* ROT2 */ t=T2;n=N2;l=L2; SET(6, 0) T2_(l) N2_(t) L2_(n) break;
 98-		case 0x06: /* DUP  */ t=T;            SET(1, 1) T = t; N = t; break;
 99-		case 0x26: /* DUP2 */ t=T2;           SET(2, 2) T2_(t) N2_(t) break;
100-		case 0x07: /* OVR  */ t=T;n=N;        SET(2, 1) T = n; N = t; L = n; break;
101-		case 0x27: /* OVR2 */ t=T2;n=N2;      SET(4, 2) T2_(n) N2_(t) L2_(n) break;
102-		case 0x08: /* EQU  */ t=T;n=N;        SET(2,-1) T = n == t; break;
103-		case 0x28: /* EQU2 */ t=T2;n=N2;      SET(4,-3) T = n == t; break;
104-		case 0x09: /* NEQ  */ t=T;n=N;        SET(2,-1) T = n != t; break;
105-		case 0x29: /* NEQ2 */ t=T2;n=N2;      SET(4,-3) T = n != t; break;
106-		case 0x0a: /* GTH  */ t=T;n=N;        SET(2,-1) T = n > t; break;
107-		case 0x2a: /* GTH2 */ t=T2;n=N2;      SET(4,-3) T = n > t; break;
108-		case 0x0b: /* LTH  */ t=T;n=N;        SET(2,-1) T = n < t; break;
109-		case 0x2b: /* LTH2 */ t=T2;n=N2;      SET(4,-3) T = n < t; break;
110-		case 0x0c: /* JMP  */ t=T;            SET(1,-1) pc += (Sint8)t; break;
111-		case 0x2c: /* JMP2 */ t=T2;           SET(2,-2) pc = t; break;
112-		case 0x0d: /* JCN  */ t=T;n=N;        SET(2,-2) if(n) pc += (Sint8)t; break;
113-		case 0x2d: /* JCN2 */ t=T2;n=L;       SET(3,-3) if(n) pc = t; break;
114-		case 0x0e: /* JSR  */ t=T;            SET(1,-1) FLIP SHIFT(2) T2_(pc) pc += (Sint8)t; break;
115-		case 0x2e: /* JSR2 */ t=T2;           SET(2,-2) FLIP SHIFT(2) T2_(pc) pc = t; break;
116-		case 0x0f: /* STH  */ t=T;            SET(1,-1) FLIP SHIFT(1) T = t; break;
117-		case 0x2f: /* STH2 */ t=T2;           SET(2,-2) FLIP SHIFT(2) T2_(t) break;
118-		case 0x10: /* LDZ  */ t=T;            SET(1, 0) T = uxn.ram[t]; break;
119-		case 0x30: /* LDZ2 */ t=T;            SET(1, 1) N = uxn.ram[t++]; T = uxn.ram[(Uint8)t]; break;
120-		case 0x11: /* STZ  */ t=T;n=N;        SET(2,-2) uxn.ram[t] = n; break;
121-		case 0x31: /* STZ2 */ t=T;n=H2;       SET(3,-3) uxn.ram[t++] = n >> 8; uxn.ram[(Uint8)t] = n; break;
122-		case 0x12: /* LDR  */ t=T;            SET(1, 0) r = pc + (Sint8)t; T = uxn.ram[r]; break;
123-		case 0x32: /* LDR2 */ t=T;            SET(1, 1) r = pc + (Sint8)t; N = uxn.ram[r++]; T = uxn.ram[r]; break;
124-		case 0x13: /* STR  */ t=T;n=N;        SET(2,-2) r = pc + (Sint8)t; uxn.ram[r] = n; break;
125-		case 0x33: /* STR2 */ t=T;n=H2;       SET(3,-3) r = pc + (Sint8)t; uxn.ram[r++] = n >> 8; uxn.ram[r] = n; break;
126-		case 0x14: /* LDA  */ t=T2;           SET(2,-1) T = uxn.ram[t]; break;
127-		case 0x34: /* LDA2 */ t=T2;           SET(2, 0) N = uxn.ram[t++]; T = uxn.ram[t]; break;
128-		case 0x15: /* STA  */ t=T2;n=L;       SET(3,-3) uxn.ram[t] = n; break;
129-		case 0x35: /* STA2 */ t=T2;n=N2;      SET(4,-4) uxn.ram[t++] = n >> 8; uxn.ram[t] = n; break;
130-		case 0x16: /* DEI  */ t=T;            SET(1, 0) T = emu_dei(t); break;
131-		case 0x36: /* DEI2 */ t=T;            SET(1, 1) N = emu_dei(t++); T = emu_dei(t); break;
132-		case 0x17: /* DEO  */ t=T;n=N;        SET(2,-2) emu_deo(t, n); break;
133-		case 0x37: /* DEO2 */ t=T;n=N;l=L;    SET(3,-3) emu_deo(t++, l); emu_deo(t, n); break;
134-		case 0x18: /* ADD  */ t=T;n=N;        SET(2,-1) T = n + t; break;
135-		case 0x38: /* ADD2 */ t=T2;n=N2;      SET(4,-2) T2_(n + t) break;
136-		case 0x19: /* SUB  */ t=T;n=N;        SET(2,-1) T = n - t; break;
137-		case 0x39: /* SUB2 */ t=T2;n=N2;      SET(4,-2) T2_(n - t) break;
138-		case 0x1a: /* MUL  */ t=T;n=N;        SET(2,-1) T = n * t; break;
139-		case 0x3a: /* MUL2 */ t=T2;n=N2;      SET(4,-2) T2_(n * t) break;
140-		case 0x1b: /* DIV  */ t=T;n=N;        SET(2,-1) T = t ? n / t : 0; break;
141-		case 0x3b: /* DIV2 */ t=T2;n=N2;      SET(4,-2) T2_(t ? n / t : 0) break;
142-		case 0x1c: /* AND  */ t=T;n=N;        SET(2,-1) T = n & t; break;
143-		case 0x3c: /* AND2 */ t=T2;n=N2;      SET(4,-2) T2_(n & t) break;
144-		case 0x1d: /* ORA  */ t=T;n=N;        SET(2,-1) T = n | t; break;
145-		case 0x3d: /* ORA2 */ t=T2;n=N2;      SET(4,-2) T2_(n | t) break;
146-		case 0x1e: /* EOR  */ t=T;n=N;        SET(2,-1) T = n ^ t; break;
147-		case 0x3e: /* EOR2 */ t=T2;n=N2;      SET(4,-2) T2_(n ^ t) break;
148-		case 0x1f: /* SFT  */ t=T;n=N;        SET(2,-1) T = n >> (t & 0xf) << (t >> 4); break;
149-		case 0x3f: /* SFT2 */ t=T;n=H2;       SET(3,-1) T2_(n >> (t & 0xf) << (t >> 4)) break;
150-		}
151+			case 0xe0: /* LIT2r */ uxn.rst.dat[++uxn.rst.ptr] = uxn.ram[pc++]; /* fall */
152+			case 0xc0: /* LITr  */ uxn.rst.dat[++uxn.rst.ptr] = uxn.ram[pc++]; break; }
153 	}
154 }