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 */