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