commit f31e080
Devine Lu Linvega
·
2026-01-21 19:16:47 +0000 UTC
parent d551067
Smaller core
1 files changed,
+51,
-55
+51,
-55
1@@ -1031,30 +1031,26 @@ emu_deo(const Uint8 port, const Uint8 value)
2
3 /* clang-format off */
4
5-#define REM *p -= 1 + _2;
6+#define REM *p -= 1 + d;
7 #define DEC s[--(*p)]
8 #define INC s[(*p)++]
9-#define INV { s = stk[!r], p = &ptr[!r]; }
10-#define MOV { if(_2) pc = a; else pc += (signed char)a; }
11-#define JMP(x) { c = ram[pc] << 8, c |= ram[pc + 1]; pc += x + 2; }
12-#define PO1(o) o = s[--(*p)];
13-#define PO2(o) { PO1(o) o |= DEC << 8; }
14-#define POx(o) { PO1(o) if(_2) o |= DEC << 8; }
15-#define POt(o) if(_2) PO1(o[1]) PO1(o[0])
16-#define PU1(i) s[(*p)++] = i;
17-#define PU2(i) PU1(i >> 8) PU1(i)
18-#define PUx(i) c = (i); if(_2) PU1(c >> 8) PU1(c)
19-#define PUt(i) PU1(i[0]) if(_2) PU1(i[1])
20-#define DEO(o,r) emu_deo(o, r[0]); if(_2) emu_deo(o + 1, r[1]);
21-#define DEI(i,r) r[0] = emu_dei(i); if(_2) r[1] = emu_dei(i + 1);
22-#define POK(o,r,m) ram[o] = r[0]; if(_2) ram[(o + 1) & m] = r[1];
23-#define PEK(i,r,m) r[0] = ram[i]; if(_2) r[1] = ram[(i + 1) & m];
24+#define FLIP { s = stk[!r], p = &ptr[!r]; }
25+#define MOVE { if(d) pc = a; else pc += (signed char)a; }
26+#define JUMP(x) { c = ram[pc] << 8, c |= ram[pc + 1]; pc += x + 2; }
27+#define DROP(o,m) { o = DEC; if(m) o |= DEC << 8; }
28+#define GRAB(o) if(d) o[1] = DEC; o[0] = DEC;
29+#define PUSH(i,m) { if(m) c = (i), INC = c >> 8, INC = c; else INC = i; }
30+#define TAKE(i) INC = i[0]; if(d) INC = i[1];
31+#define DEVO(o,r) emu_deo(o, r[0]); if(d) emu_deo(o + 1, r[1]);
32+#define DEVI(i,r) r[0] = emu_dei(i); if(d) r[1] = emu_dei(i + 1);
33+#define POKE(o,r,m) ram[o] = r[0]; if(d) ram[(o + 1) & m] = r[1];
34+#define PEEK(i,r,m) r[0] = ram[i]; if(d) r[1] = ram[(i + 1) & m];
35
36 #define OPC(opc, A, B) {\
37-case 0x00|opc: case 0x40|opc: {const int _2=0;A B} goto step;\
38-case 0x20|opc: case 0x60|opc: {const int _2=1;A B} goto step;\
39-case 0x80|opc: case 0xc0|opc: {const int _2=0;int k=*p; A *p=k;B} goto step;\
40-case 0xa0|opc: case 0xe0|opc: {const int _2=1;int k=*p; A *p=k;B} goto step;}
41+case 0x00|opc:case 0x40|opc:{const int d=0;A B} goto step;\
42+case 0x20|opc:case 0x60|opc:{const int d=1;A B} goto step;\
43+case 0x80|opc:case 0xc0|opc:{const int d=0;int k=*p; A *p=k;B} goto step;\
44+case 0xa0|opc:case 0xe0|opc:{const int d=1;int k=*p; A *p=k;B} goto step;}
45
46 static unsigned
47 uxn_eval(Uint16 pc)
48@@ -1064,44 +1060,44 @@ step: {
49 Uint8 op = ram[pc++], r = (op >> 6) & 1, *s = stk[r], *p = &ptr[r];
50 switch(op) {
51 /* BRK */ case 0x00:return 1;
52- /* JCI */ case 0x20:if(DEC) JMP(c) else pc += 2; goto step;
53- /* JMI */ case 0x40:JMP(c) goto step;
54- /* JSI */ case 0x60:JMP(0) PU2(pc) pc += c; goto step;
55- /* LI2 */ case 0xa0:INC = ram[pc++]; // fall through
56+ /* JCI */ case 0x20:if(DEC) JUMP(c) else pc += 2; goto step;
57+ /* JMI */ case 0x40:JUMP(c) goto step;
58+ /* JSI */ case 0x60:JUMP(0) INC = pc >> 8; INC = pc; pc += c; goto step;
59+ /* LI2 */ case 0xa0:INC = ram[pc++];
60 /* LIT */ case 0x80:INC = ram[pc++]; goto step;
61- /* L2r */ case 0xe0:INC = ram[pc++]; // fall through
62+ /* L2r */ case 0xe0:INC = ram[pc++];
63 /* LIr */ case 0xc0:INC = ram[pc++]; goto step;
64- /* INC */ OPC(0x01,POx(a),PUx(a + 1))
65+ /* INC */ OPC(0x01,DROP(a,d),PUSH(a + 1,d))
66 /* POP */ OPC(0x02,REM,(void)s;)
67- /* NIP */ OPC(0x03,POt(x) REM,PUt(x))
68- /* SWP */ OPC(0x04,POt(x) POt(y),PUt(x) PUt(y))
69- /* ROT */ OPC(0x05,POt(x) POt(y) POt(z),PUt(y) PUt(x) PUt(z))
70- /* DUP */ OPC(0x06,POt(x),PUt(x) PUt(x))
71- /* OVR */ OPC(0x07,POt(x) POt(y),PUt(y) PUt(x) PUt(y))
72- /* EQU */ OPC(0x08,POx(a) POx(b),PU1(b == a))
73- /* NEQ */ OPC(0x09,POx(a) POx(b),PU1(b != a))
74- /* GTH */ OPC(0x0a,POx(a) POx(b),PU1(b > a))
75- /* LTH */ OPC(0x0b,POx(a) POx(b),PU1(b < a))
76- /* JMP */ OPC(0x0c,POx(a),MOV)
77- /* JCN */ OPC(0x0d,POx(a) PO1(b),if(b) MOV)
78- /* JSR */ OPC(0x0e,POx(a),INV PU1(pc >> 8) PU1(pc) MOV)
79- /* STH */ OPC(0x0f,POt(x),INV PU1(x[0]) if(_2) PU1(x[1]))
80- /* LDZ */ OPC(0x10,PO1(a),PEK(a, x, 0xff) PUt(x))
81- /* STZ */ OPC(0x11,PO1(a) POt(y),POK(a, y, 0xff))
82- /* LDR */ OPC(0x12,PO1(a),PEK(pc + (signed char)a, x, 0xffff) PUt(x))
83- /* STR */ OPC(0x13,PO1(a) POt(y),POK(pc + (signed char)a, y, 0xffff))
84- /* LDA */ OPC(0x14,PO2(a),PEK(a, x, 0xffff) PUt(x))
85- /* STA */ OPC(0x15,PO2(a) POt(y),POK(a, y, 0xffff))
86- /* DEI */ OPC(0x16,PO1(a),DEI(a, x) PUt(x))
87- /* DEO */ OPC(0x17,PO1(a) POt(y),DEO(a, y))
88- /* ADD */ OPC(0x18,POx(a) POx(b),PUx(b + a))
89- /* SUB */ OPC(0x19,POx(a) POx(b),PUx(b - a))
90- /* MUL */ OPC(0x1a,POx(a) POx(b),PUx(b * a))
91- /* DIV */ OPC(0x1b,POx(a) POx(b),PUx(a ? b / a : 0))
92- /* AND */ OPC(0x1c,POx(a) POx(b),PUx(b & a))
93- /* ORA */ OPC(0x1d,POx(a) POx(b),PUx(b | a))
94- /* EOR */ OPC(0x1e,POx(a) POx(b),PUx(b ^ a))
95- /* SFT */ OPC(0x1f,PO1(a) POx(b),PUx(b >> (a & 0xf) << (a >> 4)))
96+ /* NIP */ OPC(0x03,GRAB(x) REM,TAKE(x))
97+ /* SWP */ OPC(0x04,GRAB(x) GRAB(y),TAKE(x) TAKE(y))
98+ /* ROT */ OPC(0x05,GRAB(x) GRAB(y) GRAB(z),TAKE(y) TAKE(x) TAKE(z))
99+ /* DUP */ OPC(0x06,GRAB(x),TAKE(x) TAKE(x))
100+ /* OVR */ OPC(0x07,GRAB(x) GRAB(y),TAKE(y) TAKE(x) TAKE(y))
101+ /* EQU */ OPC(0x08,DROP(a,d) DROP(b,d),PUSH(b == a,0))
102+ /* NEQ */ OPC(0x09,DROP(a,d) DROP(b,d),PUSH(b != a,0))
103+ /* GTH */ OPC(0x0a,DROP(a,d) DROP(b,d),PUSH(b > a,0))
104+ /* LTH */ OPC(0x0b,DROP(a,d) DROP(b,d),PUSH(b < a,0))
105+ /* JMP */ OPC(0x0c,DROP(a,d),MOVE)
106+ /* JCN */ OPC(0x0d,DROP(a,d) DROP(b,0),if(b) MOVE)
107+ /* JSR */ OPC(0x0e,DROP(a,d),FLIP PUSH(pc,1) MOVE)
108+ /* STH */ OPC(0x0f,GRAB(x),FLIP PUSH(x[0],0) if(d) PUSH(x[1],0))
109+ /* LDZ */ OPC(0x10,DROP(a,0),PEEK(a, x, 0xff) TAKE(x))
110+ /* STZ */ OPC(0x11,DROP(a,0) GRAB(y),POKE(a, y, 0xff))
111+ /* LDR */ OPC(0x12,DROP(a,0),PEEK(pc + (signed char)a, x, 0xffff) TAKE(x))
112+ /* STR */ OPC(0x13,DROP(a,0) GRAB(y),POKE(pc + (signed char)a, y, 0xffff))
113+ /* LDA */ OPC(0x14,DROP(a,1),PEEK(a, x, 0xffff) TAKE(x))
114+ /* STA */ OPC(0x15,DROP(a,1) GRAB(y),POKE(a, y, 0xffff))
115+ /* DEI */ OPC(0x16,DROP(a,0),DEVI(a, x) TAKE(x))
116+ /* DEO */ OPC(0x17,DROP(a,0) GRAB(y),DEVO(a, y))
117+ /* ADD */ OPC(0x18,DROP(a,d) DROP(b,d),PUSH(b + a,d))
118+ /* SUB */ OPC(0x19,DROP(a,d) DROP(b,d),PUSH(b - a,d))
119+ /* MUL */ OPC(0x1a,DROP(a,d) DROP(b,d),PUSH(b * a,d))
120+ /* DIV */ OPC(0x1b,DROP(a,d) DROP(b,d),PUSH(a ? b / a : 0,d))
121+ /* AND */ OPC(0x1c,DROP(a,d) DROP(b,d),PUSH(b & a,d))
122+ /* ORA */ OPC(0x1d,DROP(a,d) DROP(b,d),PUSH(b | a,d))
123+ /* EOR */ OPC(0x1e,DROP(a,d) DROP(b,d),PUSH(b ^ a,d))
124+ /* SFT */ OPC(0x1f,DROP(a,0) DROP(b,d),PUSH(b >> (a & 0xf) << (a >> 4),d))
125 }} return 0;
126 }
127