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))