commit 38bccf5

Devine Lu Linvega  ·  2025-05-13 17:34:00 +0000 UTC
parent bc3f46e
Fine tuned microcode
3 files changed,  +51, -45
+1, -1
1@@ -29,7 +29,7 @@ grab:
2 	@ cp ../uxn-utils/cli/opctest/src/opctest.tal etc/examples/opctest.tal
3 
4 archive:
5-	@ cp src/uxncli.c ../oscean/etc/uxncli11.c.txt
6+	@ cp src/uxncli.c ../oscean/etc/uxncli.c.txt
7 	@ cp src/uxn11.c ../oscean/etc/uxn11.c.txt
8 	@ cp doc/man/uxntal.7 ../oscean/etc/uxntal.7.txt
9 
+24, -21
 1@@ -75,19 +75,22 @@ static Uxn uxn;
 2 
 3 /* Microcode */
 4 
 5-#define JMI a = uxn.ram[pc] << 8 | uxn.ram[pc + 1], pc += a + 2;
 6 #define REM if(_r) uxn.rst.ptr -= 1 + _2; else uxn.wst.ptr -= 1 + _2;
 7-#define INC(s) uxn.s.dat[uxn.s.ptr++]
 8-#define DEC(s) uxn.s.dat[--uxn.s.ptr]
 9+#define JMI c = uxn.ram[pc++] << 8 | uxn.ram[pc++];
10 #define JMP(x) { if(_2) pc = x; else pc += (Sint8)x; }
11-#define PO1(o) { o = _r ? DEC(rst) : DEC(wst);}
12-#define PO2(o) { if(_r) o = DEC(rst), o |= DEC(rst) << 8; else o = DEC(wst), o |= DEC(wst) << 8; }
13+
14+#define DEC(s) uxn.s.dat[--uxn.s.ptr]
15+#define PO1(o) { if(_r) o = DEC(rst); else o = DEC(wst); }
16+#define PO2(o) { PO1(o) if(_r) o |= DEC(rst) << 8; else o |= DEC(wst) << 8; }
17 #define POx(o) { if(_2) PO2(o) else PO1(o) }
18-#define PU1(i) { if(_r) INC(rst) = i; else INC(wst) = i; }
19+#define GOT(o) { if(_2) PO1(o[1]) PO1(o[0]) }
20+
21+#define INC(s) uxn.s.dat[uxn.s.ptr++]
22 #define RP1(i) { if(_r) INC(wst) = i; else INC(rst) = i; }
23+#define PU1(i) { if(_r) INC(rst) = i; else INC(wst) = i; }
24 #define PUx(i) { if(_2) { c = (i); PU1(c >> 8) PU1(c) } else PU1(i) }
25-#define GET(o) { if(_2) PO1(o[1]) PO1(o[0]) }
26 #define PUT(i) { PU1(i[0]) if(_2) PU1(i[1]) }
27+
28 #define DEI(i,o) o[0] = emu_dei(i); if(_2) o[1] = emu_dei(i + 1); PUT(o)
29 #define DEO(i,j) emu_deo(i, j[0]); if(_2) emu_deo(i + 1, j[1]);
30 #define PEK(i,o,m) o[0] = uxn.ram[i]; if(_2) o[1] = uxn.ram[(i + 1) & m]; PUT(o)
31@@ -101,20 +104,20 @@ uxn_eval(Uint16 pc)
32 	for(step = STEP_MAX; step; step--) {
33 		switch(uxn.ram[pc++]) {
34 		/* BRK */ case 0x00: return 1;
35-		/* JCI */ case 0x20: if(DEC(wst)) { JMI break; } pc += 2; break;
36-		/* JMI */ case 0x40: JMI break;
37-		/* JSI */ case 0x60: c = pc + 2; INC(rst) = c >> 8; INC(rst) = c; JMI break;
38+		/* JCI */ case 0x20: if(DEC(wst)) { JMI pc += c; break; } pc += 2; break;
39+		/* JMI */ case 0x40: JMI pc += c; break;
40+		/* JSI */ case 0x60: JMI INC(rst) = pc >> 8, INC(rst) = pc, pc += c; break;
41 		/* LI2 */ case 0xa0: INC(wst) = uxn.ram[pc++]; /* fall-through */
42 		/* LIT */ case 0x80: INC(wst) = uxn.ram[pc++]; break;
43 		/* L2r */ case 0xe0: INC(rst) = uxn.ram[pc++]; /* fall-through */
44 		/* LIr */ case 0xc0: INC(rst) = uxn.ram[pc++]; break;
45 		/* INC */ OPC(0x01,POx(a),PUx(a + 1))
46 		/* POP */ OPC(0x02,REM ,{})
47-		/* NIP */ OPC(0x03,GET(x) REM ,PUT(x))
48-		/* SWP */ OPC(0x04,GET(x) GET(y),PUT(x) PUT(y))
49-		/* ROT */ OPC(0x05,GET(x) GET(y) GET(z),PUT(y) PUT(x) PUT(z))
50-		/* DUP */ OPC(0x06,GET(x),PUT(x) PUT(x))
51-		/* OVR */ OPC(0x07,GET(x) GET(y),PUT(y) PUT(x) PUT(y))
52+		/* NIP */ OPC(0x03,GOT(x) REM ,PUT(x))
53+		/* SWP */ OPC(0x04,GOT(x) GOT(y),PUT(x) PUT(y))
54+		/* ROT */ OPC(0x05,GOT(x) GOT(y) GOT(z),PUT(y) PUT(x) PUT(z))
55+		/* DUP */ OPC(0x06,GOT(x),PUT(x) PUT(x))
56+		/* OVR */ OPC(0x07,GOT(x) GOT(y),PUT(y) PUT(x) PUT(y))
57 		/* EQU */ OPC(0x08,POx(a) POx(b),PU1(b == a))
58 		/* NEQ */ OPC(0x09,POx(a) POx(b),PU1(b != a))
59 		/* GTH */ OPC(0x0a,POx(a) POx(b),PU1(b > a))
60@@ -122,15 +125,15 @@ uxn_eval(Uint16 pc)
61 		/* JMP */ OPC(0x0c,POx(a),JMP(a))
62 		/* JCN */ OPC(0x0d,POx(a) PO1(b),if(b) JMP(a))
63 		/* JSR */ OPC(0x0e,POx(a),RP1(pc >> 8) RP1(pc) JMP(a))
64-		/* STH */ OPC(0x0f,GET(x),RP1(x[0]) if(_2) RP1(x[1]))
65+		/* STH */ OPC(0x0f,GOT(x),RP1(x[0]) if(_2) RP1(x[1]))
66 		/* LDZ */ OPC(0x10,PO1(a),PEK(a, x, 0xff))
67-		/* STZ */ OPC(0x11,PO1(a) GET(y),POK(a, y, 0xff))
68+		/* STZ */ OPC(0x11,PO1(a) GOT(y),POK(a, y, 0xff))
69 		/* LDR */ OPC(0x12,PO1(a),PEK(pc + (Sint8)a, x, 0xffff))
70-		/* STR */ OPC(0x13,PO1(a) GET(y),POK(pc + (Sint8)a, y, 0xffff))
71+		/* STR */ OPC(0x13,PO1(a) GOT(y),POK(pc + (Sint8)a, y, 0xffff))
72 		/* LDA */ OPC(0x14,PO2(a),PEK(a, x, 0xffff))
73-		/* STA */ OPC(0x15,PO2(a) GET(y),POK(a, y, 0xffff))
74+		/* STA */ OPC(0x15,PO2(a) GOT(y),POK(a, y, 0xffff))
75 		/* DEI */ OPC(0x16,PO1(a),DEI(a, x))
76-		/* DEO */ OPC(0x17,PO1(a) GET(y),DEO(a, y))
77+		/* DEO */ OPC(0x17,PO1(a) GOT(y),DEO(a, y))
78 		/* ADD */ OPC(0x18,POx(a) POx(b),PUx(b + a))
79 		/* SUB */ OPC(0x19,POx(a) POx(b),PUx(b - a))
80 		/* MUL */ OPC(0x1a,POx(a) POx(b),PUx(b * a))
81@@ -1235,7 +1238,7 @@ main(int argc, char **argv)
82 {
83 	int i = 1;
84 	if(argc == 2 && argv[1][0] == '-' && argv[1][1] == 'v')
85-		return !fprintf(stdout, "Uxn11 - Varvara Emulator, 12 May 2025.\n");
86+		return !fprintf(stdout, "Uxn11 - Varvara Emulator, 13 May 2025.\n");
87 	else if(argc == 1)
88 		return !fprintf(stdout, "usage: %s [-v] file.rom [args..]\n", argv[0]);
89 	else if(!display_init())
+26, -23
 1@@ -7,7 +7,7 @@
 2 #define RAM_PAGES 0x10
 3 
 4 /*
 5-Copyright (c) 2021-2025 Devine Lu Linvega, Andrew Alderwick, 
 6+Copyright (c) 2021-2025 Devine Lu Linvega, Andrew Alderwick,
 7 Andrew Richards, Eiríkr Åsheim, Sigrid Solveig Haflínudóttir
 8 
 9 Permission to use, copy, modify, and distribute this software for any
10@@ -60,19 +60,22 @@ static Uxn uxn;
11 
12 /* Microcode */
13 
14-#define JMI a = uxn.ram[pc] << 8 | uxn.ram[pc + 1], pc += a + 2;
15 #define REM if(_r) uxn.rst.ptr -= 1 + _2; else uxn.wst.ptr -= 1 + _2;
16-#define INC(s) uxn.s.dat[uxn.s.ptr++]
17-#define DEC(s) uxn.s.dat[--uxn.s.ptr]
18+#define JMI c = uxn.ram[pc++] << 8 | uxn.ram[pc++];
19 #define JMP(x) { if(_2) pc = x; else pc += (Sint8)x; }
20-#define PO1(o) { o = _r ? DEC(rst) : DEC(wst);}
21-#define PO2(o) { if(_r) o = DEC(rst), o |= DEC(rst) << 8; else o = DEC(wst), o |= DEC(wst) << 8; }
22+
23+#define DEC(s) uxn.s.dat[--uxn.s.ptr]
24+#define PO1(o) { if(_r) o = DEC(rst); else o = DEC(wst); }
25+#define PO2(o) { PO1(o) if(_r) o |= DEC(rst) << 8; else o |= DEC(wst) << 8; }
26 #define POx(o) { if(_2) PO2(o) else PO1(o) }
27-#define PU1(i) { if(_r) INC(rst) = i; else INC(wst) = i; }
28+#define GOT(o) { if(_2) PO1(o[1]) PO1(o[0]) }
29+
30+#define INC(s) uxn.s.dat[uxn.s.ptr++]
31 #define RP1(i) { if(_r) INC(wst) = i; else INC(rst) = i; }
32+#define PU1(i) { if(_r) INC(rst) = i; else INC(wst) = i; }
33 #define PUx(i) { if(_2) { c = (i); PU1(c >> 8) PU1(c) } else PU1(i) }
34-#define GET(o) { if(_2) PO1(o[1]) PO1(o[0]) }
35 #define PUT(i) { PU1(i[0]) if(_2) PU1(i[1]) }
36+
37 #define DEI(i,o) o[0] = emu_dei(i); if(_2) o[1] = emu_dei(i + 1); PUT(o)
38 #define DEO(i,j) emu_deo(i, j[0]); if(_2) emu_deo(i + 1, j[1]);
39 #define PEK(i,o,m) o[0] = uxn.ram[i]; if(_2) o[1] = uxn.ram[(i + 1) & m]; PUT(o)
40@@ -86,20 +89,20 @@ uxn_eval(Uint16 pc)
41 	for(step = STEP_MAX; step; step--) {
42 		switch(uxn.ram[pc++]) {
43 		/* BRK */ case 0x00: return 1;
44-		/* JCI */ case 0x20: if(DEC(wst)) { JMI break; } pc += 2; break;
45-		/* JMI */ case 0x40: JMI break;
46-		/* JSI */ case 0x60: c = pc + 2; INC(rst) = c >> 8; INC(rst) = c; JMI break;
47+		/* JCI */ case 0x20: if(DEC(wst)) { JMI pc += c; break; } pc += 2; break;
48+		/* JMI */ case 0x40: JMI pc += c; break;
49+		/* JSI */ case 0x60: JMI INC(rst) = pc >> 8, INC(rst) = pc, pc += c; break;
50 		/* LI2 */ case 0xa0: INC(wst) = uxn.ram[pc++]; /* fall-through */
51 		/* LIT */ case 0x80: INC(wst) = uxn.ram[pc++]; break;
52 		/* L2r */ case 0xe0: INC(rst) = uxn.ram[pc++]; /* fall-through */
53 		/* LIr */ case 0xc0: INC(rst) = uxn.ram[pc++]; break;
54 		/* INC */ OPC(0x01,POx(a),PUx(a + 1))
55-		/* POP */ OPC(0x02,REM ,{})
56-		/* NIP */ OPC(0x03,GET(x) REM ,PUT(x))
57-		/* SWP */ OPC(0x04,GET(x) GET(y),PUT(x) PUT(y))
58-		/* ROT */ OPC(0x05,GET(x) GET(y) GET(z),PUT(y) PUT(x) PUT(z))
59-		/* DUP */ OPC(0x06,GET(x),PUT(x) PUT(x))
60-		/* OVR */ OPC(0x07,GET(x) GET(y),PUT(y) PUT(x) PUT(y))
61+		/* POP */ OPC(0x02,REM,{})
62+		/* NIP */ OPC(0x03,GOT(x) REM ,PUT(x))
63+		/* SWP */ OPC(0x04,GOT(x) GOT(y),PUT(x) PUT(y))
64+		/* ROT */ OPC(0x05,GOT(x) GOT(y) GOT(z),PUT(y) PUT(x) PUT(z))
65+		/* DUP */ OPC(0x06,GOT(x),PUT(x) PUT(x))
66+		/* OVR */ OPC(0x07,GOT(x) GOT(y),PUT(y) PUT(x) PUT(y))
67 		/* EQU */ OPC(0x08,POx(a) POx(b),PU1(b == a))
68 		/* NEQ */ OPC(0x09,POx(a) POx(b),PU1(b != a))
69 		/* GTH */ OPC(0x0a,POx(a) POx(b),PU1(b > a))
70@@ -107,15 +110,15 @@ uxn_eval(Uint16 pc)
71 		/* JMP */ OPC(0x0c,POx(a),JMP(a))
72 		/* JCN */ OPC(0x0d,POx(a) PO1(b),if(b) JMP(a))
73 		/* JSR */ OPC(0x0e,POx(a),RP1(pc >> 8) RP1(pc) JMP(a))
74-		/* STH */ OPC(0x0f,GET(x),RP1(x[0]) if(_2) RP1(x[1]))
75+		/* STH */ OPC(0x0f,GOT(x),RP1(x[0]) if(_2) RP1(x[1]))
76 		/* LDZ */ OPC(0x10,PO1(a),PEK(a, x, 0xff))
77-		/* STZ */ OPC(0x11,PO1(a) GET(y),POK(a, y, 0xff))
78+		/* STZ */ OPC(0x11,PO1(a) GOT(y),POK(a, y, 0xff))
79 		/* LDR */ OPC(0x12,PO1(a),PEK(pc + (Sint8)a, x, 0xffff))
80-		/* STR */ OPC(0x13,PO1(a) GET(y),POK(pc + (Sint8)a, y, 0xffff))
81+		/* STR */ OPC(0x13,PO1(a) GOT(y),POK(pc + (Sint8)a, y, 0xffff))
82 		/* LDA */ OPC(0x14,PO2(a),PEK(a, x, 0xffff))
83-		/* STA */ OPC(0x15,PO2(a) GET(y),POK(a, y, 0xffff))
84+		/* STA */ OPC(0x15,PO2(a) GOT(y),POK(a, y, 0xffff))
85 		/* DEI */ OPC(0x16,PO1(a),DEI(a, x))
86-		/* DEO */ OPC(0x17,PO1(a) GET(y),DEO(a, y))
87+		/* DEO */ OPC(0x17,PO1(a) GOT(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@@ -704,7 +707,7 @@ main(int argc, char **argv)
92 {
93 	int i = 1;
94 	if(argc == 2 && argv[1][0] == '-' && argv[1][1] == 'v')
95-		return !fprintf(stdout, "Uxn11 - Varvara Emulator(cli), 12 May 2025.\n");
96+		return !fprintf(stdout, "Uxn11 - Varvara Emulator(cli), 13 May 2025.\n");
97 	else if(argc == 1)
98 		return !fprintf(stdout, "usage: %s [-v] file.rom [args..]\n", argv[0]);
99 	else if(!system_boot((Uint8 *)calloc(0x10000 * RAM_PAGES, sizeof(Uint8)), argv[i++], argc > 2))