commit c567fbd

Devine Lu Linvega  ·  2025-05-18 16:59:10 +0000 UTC
parent eab7930
Renamed microcode JMP to MOV
2 files changed,  +46, -48
+24, -24
 1@@ -50,22 +50,22 @@ void emu_deo(const Uint8 port, const Uint8 value);
 2 #define clamp(v,a,b) { if(v < a) v = a; else if(v >= b) v = b; }
 3 #define twos(v) (v & 0x8000 ? (int)v - 0x10000 : (int)v)
 4 
 5-#define OPC(opc, init, body) {\
 6-	case 0x00|opc: {const int _2=0,_r=0;init body;} break;\
 7-	case 0x20|opc: {const int _2=1,_r=0;init body;} break;\
 8-	case 0x40|opc: {const int _2=0,_r=1;init body;} break;\
 9-	case 0x60|opc: {const int _2=1,_r=1;init body;} break;\
10-	case 0x80|opc: {const int _2=0,_r=0,k=wst.ptr;init wst.ptr=k;body;} break;\
11-	case 0xa0|opc: {const int _2=1,_r=0,k=wst.ptr;init wst.ptr=k;body;} break;\
12-	case 0xc0|opc: {const int _2=0,_r=1,k=rst.ptr;init rst.ptr=k;body;} break;\
13-	case 0xe0|opc: {const int _2=1,_r=1,k=rst.ptr;init rst.ptr=k;body;} break;\
14+#define OPC(opc, A, B) {\
15+	case 0x00|opc: {const int _2=0,_r=0;A B;} break;\
16+	case 0x20|opc: {const int _2=1,_r=0;A B;} break;\
17+	case 0x40|opc: {const int _2=0,_r=1;A B;} break;\
18+	case 0x60|opc: {const int _2=1,_r=1;A B;} break;\
19+	case 0x80|opc: {const int _2=0,_r=0;int k=wst.ptr;A wst.ptr=k;B;} break;\
20+	case 0xa0|opc: {const int _2=1,_r=0;int k=wst.ptr;A wst.ptr=k;B;} break;\
21+	case 0xc0|opc: {const int _2=0,_r=1;int k=rst.ptr;A rst.ptr=k;B;} break;\
22+	case 0xe0|opc: {const int _2=1,_r=1;int k=rst.ptr;A rst.ptr=k;B;} break;\
23 }
24 
25 /* Microcode */
26 
27 #define REM if(_r) rst.ptr -= 1 + _2; else wst.ptr -= 1 + _2;
28-#define JMI c = ram[pc] << 8 | ram[pc+1], pc += 2;
29-#define JMP(x) { if(_2) pc = x; else pc += (signed char)x; }
30+#define IMM(o) o = ram[pc] << 8 | ram[pc + 1], pc += 2;
31+#define MOV(x) { if(_2) pc = x; else pc += (signed char)x; }
32 #define DEC(s) s.dat[--s.ptr]
33 #define PO1(o) { if(_r) o = DEC(rst); else o = DEC(wst); }
34 #define PO2(o) { PO1(o) if(_r) o |= DEC(rst) << 8; else o |= DEC(wst) << 8; }
35@@ -81,23 +81,23 @@ void emu_deo(const Uint8 port, const Uint8 value);
36 #define PEK(i,o,m) o[0] = ram[i]; if(_2) o[1] = ram[(i + 1) & m]; PUT(o)
37 #define POK(i,j,m) ram[i] = j[0]; if(_2) ram[(i + 1) & m] = j[1];
38 
39-int
40-uxn_eval(Uint16 pc)
41+static unsigned int
42+uxn_eval(unsigned short pc)
43 {
44-	unsigned int a, b, c, x[2], y[2], z[2], step;
45-	for(step = 0x80000000; step; step--) {
46+	unsigned int a, b, c, x[2], y[2], z[2], step = 0x8000000;
47+	while(step--) {
48 		switch(ram[pc++]) {
49 		/* BRK */ case 0x00: return 1;
50-		/* JCI */ case 0x20: if(DEC(wst)) { JMI pc += c; break; } pc += 2; break;
51-		/* JMI */ case 0x40: JMI pc += c; break;
52-		/* JSI */ case 0x60: JMI INC(rst) = pc >> 8, INC(rst) = pc, pc += c; break;
53+		/* JCI */ case 0x20: IMM(c) if(DEC(wst)) pc += c; break;
54+		/* JMI */ case 0x40: IMM(c) pc += c; break;
55+		/* JSI */ case 0x60: IMM(c) INC(rst) = pc >> 8, INC(rst) = pc, pc += c; break;
56 		/* LI2 */ case 0xa0: INC(wst) = ram[pc++]; /* fall-through */
57 		/* LIT */ case 0x80: INC(wst) = ram[pc++]; break;
58 		/* L2r */ case 0xe0: INC(rst) = ram[pc++]; /* fall-through */
59 		/* LIr */ case 0xc0: INC(rst) = ram[pc++]; break;
60 		/* INC */ OPC(0x01,POx(a),PUx(a + 1))
61-		/* POP */ OPC(0x02,REM ,{})
62-		/* NIP */ OPC(0x03,GOT(x) REM ,PUT(x))
63+		/* POP */ OPC(0x02,REM,{})
64+		/* NIP */ OPC(0x03,GOT(x) REM,PUT(x))
65 		/* SWP */ OPC(0x04,GOT(x) GOT(y),PUT(x) PUT(y))
66 		/* ROT */ OPC(0x05,GOT(x) GOT(y) GOT(z),PUT(y) PUT(x) PUT(z))
67 		/* DUP */ OPC(0x06,GOT(x),PUT(x) PUT(x))
68@@ -106,9 +106,9 @@ uxn_eval(Uint16 pc)
69 		/* NEQ */ OPC(0x09,POx(a) POx(b),PU1(b != a))
70 		/* GTH */ OPC(0x0a,POx(a) POx(b),PU1(b > a))
71 		/* LTH */ OPC(0x0b,POx(a) POx(b),PU1(b < a))
72-		/* JMP */ OPC(0x0c,POx(a),JMP(a))
73-		/* JCN */ OPC(0x0d,POx(a) PO1(b),if(b) JMP(a))
74-		/* JSR */ OPC(0x0e,POx(a),RP1(pc >> 8) RP1(pc) JMP(a))
75+		/* JMP */ OPC(0x0c,POx(a),MOV(a))
76+		/* JCN */ OPC(0x0d,POx(a) PO1(b),if(b) MOV(a))
77+		/* JSR */ OPC(0x0e,POx(a),RP1(pc >> 8) RP1(pc) MOV(a))
78 		/* STH */ OPC(0x0f,GOT(x),RP1(x[0]) if(_2) RP1(x[1]))
79 		/* LDZ */ OPC(0x10,PO1(a),PEK(a, x, 0xff))
80 		/* STZ */ OPC(0x11,PO1(a) GOT(y),POK(a, y, 0xff))
81@@ -128,7 +128,7 @@ uxn_eval(Uint16 pc)
82 		/* SFT */ OPC(0x1f,PO1(a) POx(b),PUx(b >> (a & 0xf) << (a >> 4)))
83 		}
84 	}
85-	return 0;
86+	return !fprintf(stdout, "Exhausted cycles limit.\n");
87 }
88 
89 /* clang-format on */
+22, -24
 1@@ -37,22 +37,22 @@ void emu_deo(const Uint8 port, const Uint8 value);
 2 #define PEEK2(d) (*(d) << 8 | (d)[1])
 3 #define POKE2(d, v) { *(d) = (v) >> 8; (d)[1] = (v); }
 4 
 5-#define OPC(opc, init, body) {\
 6-	case 0x00|opc: {const int _2=0,_r=0;init body;} break;\
 7-	case 0x20|opc: {const int _2=1,_r=0;init body;} break;\
 8-	case 0x40|opc: {const int _2=0,_r=1;init body;} break;\
 9-	case 0x60|opc: {const int _2=1,_r=1;init body;} break;\
10-	case 0x80|opc: {const int _2=0,_r=0,k=wst.ptr;init wst.ptr=k;body;} break;\
11-	case 0xa0|opc: {const int _2=1,_r=0,k=wst.ptr;init wst.ptr=k;body;} break;\
12-	case 0xc0|opc: {const int _2=0,_r=1,k=rst.ptr;init rst.ptr=k;body;} break;\
13-	case 0xe0|opc: {const int _2=1,_r=1,k=rst.ptr;init rst.ptr=k;body;} break;\
14+#define OPC(opc, A, B) {\
15+	case 0x00|opc: {const int _2=0,_r=0;A B;} break;\
16+	case 0x20|opc: {const int _2=1,_r=0;A B;} break;\
17+	case 0x40|opc: {const int _2=0,_r=1;A B;} break;\
18+	case 0x60|opc: {const int _2=1,_r=1;A B;} break;\
19+	case 0x80|opc: {const int _2=0,_r=0;int k=wst.ptr;A wst.ptr=k;B;} break;\
20+	case 0xa0|opc: {const int _2=1,_r=0;int k=wst.ptr;A wst.ptr=k;B;} break;\
21+	case 0xc0|opc: {const int _2=0,_r=1;int k=rst.ptr;A rst.ptr=k;B;} break;\
22+	case 0xe0|opc: {const int _2=1,_r=1;int k=rst.ptr;A rst.ptr=k;B;} break;\
23 }
24 
25 /* Microcode */
26 
27 #define REM if(_r) rst.ptr -= 1 + _2; else wst.ptr -= 1 + _2;
28-#define JMI c = ram[pc] << 8 | ram[pc+1], pc += 2;
29-#define JMP(x) { if(_2) pc = x; else pc += (signed char)x; }
30+#define IMM(o) o = ram[pc] << 8 | ram[pc + 1], pc += 2;
31+#define MOV(x) { if(_2) pc = x; else pc += (signed char)x; }
32 #define DEC(s) s.dat[--s.ptr]
33 #define PO1(o) { if(_r) o = DEC(rst); else o = DEC(wst); }
34 #define PO2(o) { PO1(o) if(_r) o |= DEC(rst) << 8; else o |= DEC(wst) << 8; }
35@@ -68,24 +68,23 @@ void emu_deo(const Uint8 port, const Uint8 value);
36 #define PEK(i,o,m) o[0] = ram[i]; if(_2) o[1] = ram[(i + 1) & m]; PUT(o)
37 #define POK(i,j,m) ram[i] = j[0]; if(_2) ram[(i + 1) & m] = j[1];
38 
39-int
40-uxn_eval(Uint16 pc)
41+static unsigned int
42+uxn_eval(unsigned short pc)
43 {
44-	unsigned int a, b, c, x[2], y[2], z[2], step = 0x80000000;
45-	if(dev[0x0f]) return 0;
46+	unsigned int a, b, c, x[2], y[2], z[2], step = 0x8000000;
47 	while(step--) {
48 		switch(ram[pc++]) {
49 		/* BRK */ case 0x00: return 1;
50-		/* JCI */ case 0x20: if(DEC(wst)) { JMI pc += c; break; } pc += 2; break;
51-		/* JMI */ case 0x40: JMI pc += c; break;
52-		/* JSI */ case 0x60: JMI INC(rst) = pc >> 8, INC(rst) = pc, pc += c; break;
53+		/* JCI */ case 0x20: IMM(c) if(DEC(wst)) pc += c; break;
54+		/* JMI */ case 0x40: IMM(c) pc += c; break;
55+		/* JSI */ case 0x60: IMM(c) INC(rst) = pc >> 8, INC(rst) = pc, pc += c; break;
56 		/* LI2 */ case 0xa0: INC(wst) = ram[pc++]; /* fall-through */
57 		/* LIT */ case 0x80: INC(wst) = ram[pc++]; break;
58 		/* L2r */ case 0xe0: INC(rst) = ram[pc++]; /* fall-through */
59 		/* LIr */ case 0xc0: INC(rst) = ram[pc++]; break;
60 		/* INC */ OPC(0x01,POx(a),PUx(a + 1))
61 		/* POP */ OPC(0x02,REM,{})
62-		/* NIP */ OPC(0x03,GOT(x) REM ,PUT(x))
63+		/* NIP */ OPC(0x03,GOT(x) REM,PUT(x))
64 		/* SWP */ OPC(0x04,GOT(x) GOT(y),PUT(x) PUT(y))
65 		/* ROT */ OPC(0x05,GOT(x) GOT(y) GOT(z),PUT(y) PUT(x) PUT(z))
66 		/* DUP */ OPC(0x06,GOT(x),PUT(x) PUT(x))
67@@ -94,9 +93,9 @@ uxn_eval(Uint16 pc)
68 		/* NEQ */ OPC(0x09,POx(a) POx(b),PU1(b != a))
69 		/* GTH */ OPC(0x0a,POx(a) POx(b),PU1(b > a))
70 		/* LTH */ OPC(0x0b,POx(a) POx(b),PU1(b < a))
71-		/* JMP */ OPC(0x0c,POx(a),JMP(a))
72-		/* JCN */ OPC(0x0d,POx(a) PO1(b),if(b) JMP(a))
73-		/* JSR */ OPC(0x0e,POx(a),RP1(pc >> 8) RP1(pc) JMP(a))
74+		/* JMP */ OPC(0x0c,POx(a),MOV(a))
75+		/* JCN */ OPC(0x0d,POx(a) PO1(b),if(b) MOV(a))
76+		/* JSR */ OPC(0x0e,POx(a),RP1(pc >> 8) RP1(pc) MOV(a))
77 		/* STH */ OPC(0x0f,GOT(x),RP1(x[0]) if(_2) RP1(x[1]))
78 		/* LDZ */ OPC(0x10,PO1(a),PEK(a, x, 0xff))
79 		/* STZ */ OPC(0x11,PO1(a) GOT(y),POK(a, y, 0xff))
80@@ -116,8 +115,7 @@ uxn_eval(Uint16 pc)
81 		/* SFT */ OPC(0x1f,PO1(a) POx(b),PUx(b >> (a & 0xf) << (a >> 4)))
82 		}
83 	}
84-	fprintf(stdout, "Exhausted cycles limit.\n");
85-	return 0;
86+	return !fprintf(stdout, "Exhausted cycles limit.\n");
87 }
88 
89 /* clang-format on */