commit 4e224c4
Devine Lu Linvega
·
2026-01-22 17:07:36 +0000 UTC
parent a26538c
Use for-loop in core
1 files changed,
+35,
-36
+35,
-36
1@@ -22,6 +22,7 @@ WITH REGARD TO THIS SOFTWARE.
2 cc -DNDEBUG -O2 -g0 -s src/uxn11.c -lX11 -lutil -o bin/uxn11
3 */
4
5+typedef signed char Sint8;
6 typedef unsigned char Uint8;
7 typedef unsigned short Uint16;
8 typedef void (*deo_handler)(void);
9@@ -1027,20 +1028,18 @@ emu_deo(const Uint8 port, const Uint8 value)
10 /* clang-format off */
11
12 #define OPC(opc, A, B) {\
13- case 0x00|opc:case 0x40|opc:{const int d=0;A B} goto step;\
14- case 0x20|opc:case 0x60|opc:{const int d=1;A B} goto step;\
15- case 0x80|opc:case 0xc0|opc:{const int d=0,k=*p;A *p=k;B} goto step;\
16- case 0xa0|opc:case 0xe0|opc:{const int d=1,k=*p;A *p=k;B} goto step;}
17-#define REM *p -= 1 + d;
18+ case 0x00|opc:case 0x40|opc:{const int d=0;A B} break;\
19+ case 0x20|opc:case 0x60|opc:{const int d=1;A B} break;\
20+ case 0x80|opc:case 0xc0|opc:{const int d=0,k=*p;A *p=k;B} break;\
21+ case 0xa0|opc:case 0xe0|opc:{const int d=1,k=*p;A *p=k;B} break;}
22 #define DEC s[--(*p)]
23 #define INC s[(*p)++]
24-#define FLIP { s = stk[!r], p = &ptr[!r]; }
25-#define MOVE { pc = d ? a : 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 FLIP s = stk[!r], p = &ptr[!r];
30+#define JUMP(x) c = ram[pc] << 8, c |= ram[pc + 1], pc += x + 2;
31+#define DROP(o,m) o = DEC; if(m) o |= DEC << 8;
32+#define TAKE(o) if(d) o[1] = DEC; o[0] = DEC;
33 #define PUSH(i,m) { if(m) c = (i), INC = c >> 8, INC = c; else INC = i; }
34-#define TAKE(i) INC = i[0]; if(d) INC = i[1];
35+#define GIVE(i) INC = i[0]; if(d) INC = i[1];
36 #define DEVO(o,r) emu_deo(o, r[0]); if(d) emu_deo(o + 1, r[1]);
37 #define DEVI(i,r) r[0] = emu_dei(i); if(d) r[1] = emu_dei(i + 1);
38 #define POKE(o,r,m) ram[o] = r[0]; if(d) ram[(o + 1) & m] = r[1];
39@@ -1050,40 +1049,40 @@ static unsigned
40 uxn_eval(Uint16 pc)
41 {
42 Uint16 a, b, c, x[2], y[2], z[2];
43-step: {
44+ for(;;) {
45 Uint8 op = ram[pc++], r = (op >> 6) & 1, *s = stk[r], *p = &ptr[r];
46 switch(op) {
47 /* BRK */ case 0x00:return 1;
48- /* JCI */ case 0x20:if(DEC) JUMP(c) else pc += 2; goto step;
49- /* JMI */ case 0x40:JUMP(c) goto step;
50- /* JSI */ case 0x60:JUMP(0) INC = pc >> 8; INC = pc; pc += c; goto step;
51+ /* JCI */ case 0x20:if(DEC) JUMP(c) else pc += 2; break;
52+ /* JMI */ case 0x40:JUMP(c) break;
53+ /* JSI */ case 0x60:JUMP(0) INC = pc >> 8; INC = pc; pc += c; break;
54 /* LI2 */ case 0xa0:INC = ram[pc++]; /* Fall-through */
55- /* LIT */ case 0x80:INC = ram[pc++]; goto step;
56+ /* LIT */ case 0x80:INC = ram[pc++]; break;
57 /* L2r */ case 0xe0:INC = ram[pc++]; /* Fall-through */
58- /* LIr */ case 0xc0:INC = ram[pc++]; goto step;
59+ /* LIr */ case 0xc0:INC = ram[pc++]; break;
60 /* INC */ OPC(0x01,DROP(a,d),PUSH(a + 1,d))
61- /* POP */ OPC(0x02,REM,(void)s;)
62- /* NIP */ OPC(0x03,GRAB(x) REM,TAKE(x))
63- /* SWP */ OPC(0x04,GRAB(x) GRAB(y),TAKE(x) TAKE(y))
64- /* ROT */ OPC(0x05,GRAB(x) GRAB(y) GRAB(z),TAKE(y) TAKE(x) TAKE(z))
65- /* DUP */ OPC(0x06,GRAB(x),TAKE(x) TAKE(x))
66- /* OVR */ OPC(0x07,GRAB(x) GRAB(y),TAKE(y) TAKE(x) TAKE(y))
67+ /* POP */ OPC(0x02,*p -= 1 + d;,{})
68+ /* NIP */ OPC(0x03,TAKE(x) *p -= 1 + d;,GIVE(x))
69+ /* SWP */ OPC(0x04,TAKE(x) TAKE(y),GIVE(x) GIVE(y))
70+ /* ROT */ OPC(0x05,TAKE(x) TAKE(y) TAKE(z),GIVE(y) GIVE(x) GIVE(z))
71+ /* DUP */ OPC(0x06,TAKE(x),GIVE(x) GIVE(x))
72+ /* OVR */ OPC(0x07,TAKE(x) TAKE(y),GIVE(y) GIVE(x) GIVE(y))
73 /* EQU */ OPC(0x08,DROP(a,d) DROP(b,d),PUSH(b == a,0))
74 /* NEQ */ OPC(0x09,DROP(a,d) DROP(b,d),PUSH(b != a,0))
75 /* GTH */ OPC(0x0a,DROP(a,d) DROP(b,d),PUSH(b > a,0))
76 /* LTH */ OPC(0x0b,DROP(a,d) DROP(b,d),PUSH(b < a,0))
77- /* JMP */ OPC(0x0c,DROP(a,d),MOVE)
78- /* JCN */ OPC(0x0d,DROP(a,d) DROP(b,0),if(b) MOVE)
79- /* JSR */ OPC(0x0e,DROP(a,d),FLIP PUSH(pc,1) MOVE)
80- /* STH */ OPC(0x0f,GRAB(x),FLIP PUSH(x[0],0) if(d) PUSH(x[1],0))
81- /* LDZ */ OPC(0x10,DROP(a,0),PEEK(a, x, 0xff) TAKE(x))
82- /* STZ */ OPC(0x11,DROP(a,0) GRAB(y),POKE(a, y, 0xff))
83- /* LDR */ OPC(0x12,DROP(a,0),PEEK(pc + (signed char)a, x, 0xffff) TAKE(x))
84- /* STR */ OPC(0x13,DROP(a,0) GRAB(y),POKE(pc + (signed char)a, y, 0xffff))
85- /* LDA */ OPC(0x14,DROP(a,1),PEEK(a, x, 0xffff) TAKE(x))
86- /* STA */ OPC(0x15,DROP(a,1) GRAB(y),POKE(a, y, 0xffff))
87- /* DEI */ OPC(0x16,DROP(a,0),DEVI(a, x) TAKE(x))
88- /* DEO */ OPC(0x17,DROP(a,0) GRAB(y),DEVO(a, y))
89+ /* JMP */ OPC(0x0c,DROP(a,d),pc = d ? a : pc + (Sint8)a;)
90+ /* JCN */ OPC(0x0d,DROP(a,d) DROP(b,0),if(b) pc = d ? a : pc + (Sint8)a;)
91+ /* JSR */ OPC(0x0e,DROP(a,d),FLIP PUSH(pc,1) pc = d ? a : pc + (Sint8)a;)
92+ /* STH */ OPC(0x0f,TAKE(x),FLIP PUSH(x[0],0) if(d) PUSH(x[1],0))
93+ /* LDZ */ OPC(0x10,DROP(a,0),PEEK(a, x, 0xff) GIVE(x))
94+ /* STZ */ OPC(0x11,DROP(a,0) TAKE(y),POKE(a, y, 0xff))
95+ /* LDR */ OPC(0x12,DROP(a,0),PEEK(pc + (Sint8)a, x, 0xffff) GIVE(x))
96+ /* STR */ OPC(0x13,DROP(a,0) TAKE(y),POKE(pc + (Sint8)a, y, 0xffff))
97+ /* LDA */ OPC(0x14,DROP(a,1),PEEK(a, x, 0xffff) GIVE(x))
98+ /* STA */ OPC(0x15,DROP(a,1) TAKE(y),POKE(a, y, 0xffff))
99+ /* DEI */ OPC(0x16,DROP(a,0),DEVI(a, x) GIVE(x))
100+ /* DEO */ OPC(0x17,DROP(a,0) TAKE(y),DEVO(a, y))
101 /* ADD */ OPC(0x18,DROP(a,d) DROP(b,d),PUSH(b + a,d))
102 /* SUB */ OPC(0x19,DROP(a,d) DROP(b,d),PUSH(b - a,d))
103 /* MUL */ OPC(0x1a,DROP(a,d) DROP(b,d),PUSH(b * a,d))
104@@ -1305,7 +1304,7 @@ main(int argc, char **argv)
105 {
106 int i = 1;
107 if(argc == 2 && argv[1][0] == '-' && argv[1][1] == 'v')
108- return !fprintf(stdout, "%s - Varvara Emulator, 21 Jan 2026.\n", argv[0]);
109+ return !fprintf(stdout, "%s - Varvara Emulator, 22 Jan 2026.\n", argv[0]);
110 else if(argc == 1)
111 return !fprintf(stdout, "usage: %s [-v] file.rom [args..]\n", argv[0]);
112 else if(!system_boot(argv[i++], argc > 2))