commit 095a60c

Devine Lu Linvega  ·  2026-02-15 18:04:10 +0000 UTC
parent b0e0522
Pass stack to PUx macro
1 files changed,  +18, -18
+18, -18
 1@@ -1033,18 +1033,18 @@ emu_deo(const Uint8 port, const Uint8 value)
 2 #define DEC(m) stk[m][--ptr[m]]
 3 #define INC(m) stk[m][ptr[m]++]
 4 #define IMM(o) o = ram[pc++] << 8, o |= ram[pc++];
 5-#define MOV(o) { pc = d ? (unsigned short)o : pc + (Sint8)o; }
 6+#define MOV(o) { pc = d ? (Uint16)o : pc + (Sint8)o; }
 7 #define POx(o,m) o = DEC(r); if(m) o |= DEC(r) << 8;
 8-#define PUx(i,m) if(m) c = (i), INC(r) = c >> 8, INC(r) = c; else INC(r) = i;
 9+#define PUx(i,m,s) if(m) c = (i), INC(s) = c >> 8, INC(s) = c; else INC(s) = i;
10 #define GOT(o) if(d) o[1] = DEC(r); o[0] = DEC(r);
11-#define PUT(i) PUx(i[0],0) if(d) { PUx(i[1],0) }
12+#define PUT(i) PUx(i[0],0,r) if(d) { PUx(i[1],0,r) }
13 #define DEO(o,v) emu_deo(o, v[0]); if(d) emu_deo(o + 1, v[1]);
14 #define DEI(i,v) v[0] = emu_dei(i); if(d) v[1] = emu_dei(i + 1); PUT(v)
15 #define POK(o,v,m) ram[o] = v[0]; if(d) ram[(o + 1) & m] = v[1];
16 #define PEK(i,v,m) v[0] = ram[i]; if(d) v[1] = ram[(i + 1) & m]; PUT(v)
17 
18 static unsigned int
19-uxn_eval(unsigned short pc)
20+uxn_eval(Uint16 pc)
21 {
22 	unsigned int a, b, c, x[2], y[2], z[2];
23 	for(;;) {
24@@ -1057,20 +1057,20 @@ uxn_eval(unsigned short pc)
25 	/* LIT */ case 0x80: INC(0) = ram[pc++]; break;
26 	/* L2r */ case 0xe0: INC(1) = ram[pc++]; /* fall-through */
27 	/* LIr */ case 0xc0: INC(1) = ram[pc++]; break;
28-	/* INC */ OPC(0x01,POx(a,d),PUx(a + 1, d))
29+	/* INC */ OPC(0x01,POx(a,d),PUx(a + 1,d,r))
30 	/* POP */ OPC(0x02,REM,{})
31 	/* NIP */ OPC(0x03,GOT(x) REM,PUT(x))
32 	/* SWP */ OPC(0x04,GOT(x) GOT(y),PUT(x) PUT(y))
33 	/* ROT */ OPC(0x05,GOT(x) GOT(y) GOT(z),PUT(y) PUT(x) PUT(z))
34 	/* DUP */ OPC(0x06,GOT(x),PUT(x) PUT(x))
35 	/* OVR */ OPC(0x07,GOT(x) GOT(y),PUT(y) PUT(x) PUT(y))
36-	/* EQU */ OPC(0x08,POx(a,d) POx(b,d),PUx(b == a,0))
37-	/* NEQ */ OPC(0x09,POx(a,d) POx(b,d),PUx(b != a,0))
38-	/* GTH */ OPC(0x0a,POx(a,d) POx(b,d),PUx(b > a,0))
39-	/* LTH */ OPC(0x0b,POx(a,d) POx(b,d),PUx(b < a,0))
40+	/* EQU */ OPC(0x08,POx(a,d) POx(b,d),PUx(b == a,0,r))
41+	/* NEQ */ OPC(0x09,POx(a,d) POx(b,d),PUx(b != a,0,r))
42+	/* GTH */ OPC(0x0a,POx(a,d) POx(b,d),PUx(b > a,0,r))
43+	/* LTH */ OPC(0x0b,POx(a,d) POx(b,d),PUx(b < a,0,r))
44 	/* JMP */ OPC(0x0c,POx(a,d),MOV(a))
45 	/* JCN */ OPC(0x0d,POx(a,d) POx(b,0),if(b) MOV(a))
46-	/* JSR */ OPC(0x0e,POx(a,d),INC(!r) = pc >> 8; INC(!r) = pc; MOV(a))
47+	/* JSR */ OPC(0x0e,POx(a,d),PUx(pc,1,!r) MOV(a))
48 	/* STH */ OPC(0x0f,GOT(x),INC(!r) = x[0]; if(d) INC(!r) = x[1];)
49 	/* LDZ */ OPC(0x10,POx(a,0),PEK(a, x, 0xff))
50 	/* STZ */ OPC(0x11,POx(a,0) GOT(y),POK(a, y, 0xff))
51@@ -1080,14 +1080,14 @@ uxn_eval(unsigned short pc)
52 	/* STA */ OPC(0x15,POx(a,1) GOT(y),POK(a, y, 0xffff))
53 	/* DEI */ OPC(0x16,POx(a,0),DEI(a, x))
54 	/* DEO */ OPC(0x17,POx(a,0) GOT(y),DEO(a, y))
55-	/* ADD */ OPC(0x18,POx(a,d) POx(b,d),PUx(b + a, d))
56-	/* SUB */ OPC(0x19,POx(a,d) POx(b,d),PUx(b - a, d))
57-	/* MUL */ OPC(0x1a,POx(a,d) POx(b,d),PUx(b * a, d))
58-	/* DIV */ OPC(0x1b,POx(a,d) POx(b,d),PUx(a ? b / a : 0, d))
59-	/* AND */ OPC(0x1c,POx(a,d) POx(b,d),PUx(b & a, d))
60-	/* ORA */ OPC(0x1d,POx(a,d) POx(b,d),PUx(b | a, d))
61-	/* EOR */ OPC(0x1e,POx(a,d) POx(b,d),PUx(b ^ a, d))
62-	/* SFT */ OPC(0x1f,POx(a,0) POx(b,d),PUx(b >> (a & 0xf) << (a >> 4), d))
63+	/* ADD */ OPC(0x18,POx(a,d) POx(b,d),PUx(b + a, d,r))
64+	/* SUB */ OPC(0x19,POx(a,d) POx(b,d),PUx(b - a, d,r))
65+	/* MUL */ OPC(0x1a,POx(a,d) POx(b,d),PUx(b * a, d,r))
66+	/* DIV */ OPC(0x1b,POx(a,d) POx(b,d),PUx(a ? b / a : 0, d,r))
67+	/* AND */ OPC(0x1c,POx(a,d) POx(b,d),PUx(b & a, d,r))
68+	/* ORA */ OPC(0x1d,POx(a,d) POx(b,d),PUx(b | a, d,r))
69+	/* EOR */ OPC(0x1e,POx(a,d) POx(b,d),PUx(b ^ a, d,r))
70+	/* SFT */ OPC(0x1f,POx(a,0) POx(b,d),PUx(b >> (a & 0xf) << (a >> 4), d,r))
71 	}} return 0;
72 }
73