commit 38bccf5
Devine Lu Linvega
·
2025-05-13 17:34:00 +0000 UTC
parent bc3f46e
Fine tuned microcode
3 files changed,
+51,
-45
M
makefile
+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))