Browse code

(uxn.c) Only one writing macro per line

neauoire authored on 29/08/2023 17:48:19
Showing 1 changed files
... ...
@@ -28,8 +28,12 @@ WITH REGARD TO THIS SOFTWARE.
28 28
 #define HALT(c)   { return emu_halt(u, ins, c, pc - 1); }
29 29
 #define FLIP      { s = ins & 0x40 ? &u->wst : &u->rst; }
30 30
 #define SET(x, y) { r = s->ptr; if(x > r) HALT(1) r += (x & k) + y; if(r > 254) HALT(2) ptr = s->dat + r - 1; s->ptr = r; }
31
-#define PUT1(v)   { *(ptr--) = v; }
32
-#define PUT2(v)   { r = (v); *(ptr--) = r; *(ptr--) = r >> 8; }
31
+#define PUT1(a)         { *(ptr) = a; }
32
+#define PUT1x2(a, b)    { *(ptr) = a; *(ptr - 1) = b; }
33
+#define PUT1x3(a, b, c) { *(ptr) = a; *(ptr - 1) = b; *(ptr - 2) = c; }
34
+#define PUT2(a)         { POKE2(ptr - 1, a) }
35
+#define PUT2x2(a, b)    { POKE2(ptr - 1, a) POKE2(ptr - 3, b) }
36
+#define PUT2x3(a, b, c) { POKE2(ptr - 1, a) POKE2(ptr - 3, b) POKE2(ptr - 5, c) }
33 37
 
34 38
 int
35 39
 uxn_eval(Uxn *u, Uint16 pc)
... ...
@@ -42,14 +46,14 @@ uxn_eval(Uxn *u, Uint16 pc)
42 46
 		int k = ins & 0x80 ? 0xff : 0;
43 47
 		Stack *s = ins & 0x40 ? &u->rst : &u->wst;
44 48
 		Uint8 *ptr = s->dat + s->ptr - 1;
45
-		switch(ins & 0x1f ? ins & 0x3f : (0 - (ins >> 5))) {
49
+		switch(ins & 0x1f ? ins & 0x3f : ins << 4) {
46 50
 			/* IMM */
47
-			case -0:   /* BRK  */                           return 1;
48
-			case -1:   /* JCI  */                           if(!s->dat[--s->ptr]) { pc += 2; break; } /* else fallthrough */
49
-			case -2:   /* JMI  */                           pc += PEEK2(ram + pc) + 2; break;
50
-			case -3:   /* JSI  */                 SET(0, 2) PUT2(pc + 2) pc += PEEK2(ram + pc) + 2; break;
51
-			case -4:   /* LITr */ case -6:        SET(0, 1) PUT1(ram[pc++]) break;
52
-			case -5:   /* LIT2r*/ case -7:        SET(0, 2) PUT2(PEEK2(ram + pc)) pc += 2; break;
51
+			case 0x000: /* BRK  */                          return 1;
52
+			case 0x200: /* JCI  */                          if(!s->dat[--s->ptr]) { pc += 2; break; } /* else fallthrough */
53
+			case 0x400: /* JMI  */                          pc += PEEK2(ram + pc) + 2; break;
54
+			case 0x600: /* JSI  */                SET(0, 2) PUT2(pc + 2) pc += PEEK2(ram + pc) + 2; break;
55
+			case 0x800: /* LIT  */ case 0xc00:    SET(0, 1) PUT1(ram[pc++]) break;
56
+			case 0xa00: /* LIT2 */ case 0xe00:    SET(0, 2) PUT2(PEEK2(ram + pc)) pc += 2; break;
53 57
 			/* ALU */
54 58
 			case 0x01: /* INC  */ t=T;            SET(1, 0) PUT1(t + 1) break;
55 59
 			case 0x21: /* INC2 */ t=T2;           SET(2, 0) PUT2(t + 1) break;
... ...
@@ -57,14 +61,14 @@ uxn_eval(Uxn *u, Uint16 pc)
57 61
 			case 0x22: /* POP2 */                 SET(2,-2) break;
58 62
 			case 0x03: /* NIP  */ t=T;            SET(2,-1) PUT1(t) break;
59 63
 			case 0x23: /* NIP2 */ t=T2;           SET(4,-2) PUT2(t) break;
60
-			case 0x04: /* SWP  */ t=T;n=N;        SET(2, 0) PUT1(n) PUT1(t) break;
61
-			case 0x24: /* SWP2 */ t=T2;n=N2;      SET(4, 0) PUT2(n) PUT2(t) break;
62
-			case 0x05: /* ROT  */ t=T;n=N;l=L;    SET(3, 0) PUT1(l) PUT1(t) PUT1(n) break;
63
-			case 0x25: /* ROT2 */ t=T2;n=N2;l=L2; SET(6, 0) PUT2(l) PUT2(t) PUT2(n) break;
64
-			case 0x06: /* DUP  */ t=T;            SET(1, 1) PUT1(t) PUT1(t) break;
65
-			case 0x26: /* DUP2 */ t=T2;           SET(2, 2) PUT2(t) PUT2(t) break;
66
-			case 0x07: /* OVR  */ t=T;n=N;        SET(2, 1) PUT1(n) PUT1(t) PUT1(n) break;
67
-			case 0x27: /* OVR2 */ t=T2;n=N2;      SET(4, 2) PUT2(n) PUT2(t) PUT2(n) break;
64
+			case 0x04: /* SWP  */ t=T;n=N;        SET(2, 0) PUT1x2(n, t) break;
65
+			case 0x24: /* SWP2 */ t=T2;n=N2;      SET(4, 0) PUT2x2(n, t) break;
66
+			case 0x05: /* ROT  */ t=T;n=N;l=L;    SET(3, 0) PUT1x3(l, t, n) break;
67
+			case 0x25: /* ROT2 */ t=T2;n=N2;l=L2; SET(6, 0) PUT2x3(l, t, n) break;
68
+			case 0x06: /* DUP  */ t=T;            SET(1, 1) PUT1x2(t, t) break;
69
+			case 0x26: /* DUP2 */ t=T2;           SET(2, 2) PUT2x2(t, t) break;
70
+			case 0x07: /* OVR  */ t=T;n=N;        SET(2, 1) PUT1x3(n, t, n) break;
71
+			case 0x27: /* OVR2 */ t=T2;n=N2;      SET(4, 2) PUT2x3(n, t, n) break;
68 72
 			case 0x08: /* EQU  */ t=T;n=N;        SET(2,-1) PUT1(n == t) break;
69 73
 			case 0x28: /* EQU2 */ t=T2;n=N2;      SET(4,-3) PUT1(n == t) break;
70 74
 			case 0x09: /* NEQ  */ t=T;n=N;        SET(2,-1) PUT1(n != t) break;
... ...
@@ -94,7 +98,7 @@ uxn_eval(Uxn *u, Uint16 pc)
94 98
 			case 0x15: /* STA  */ t=T2;n=L;       SET(3,-3) ram[t] = n; break;
95 99
 			case 0x35: /* STA2 */ t=T2;n=N2;      SET(4,-4) POKE2(ram + t, n) break;
96 100
 			case 0x16: /* DEI  */ t=T;            SET(1, 0) PUT1(DEI(t)) break;
97
-			case 0x36: /* DEI2 */ t=T;            SET(1, 1) PUT1(DEI(t + 1)) PUT1(DEI(t)) break;
101
+			case 0x36: /* DEI2 */ t=T;            SET(1, 1) PUT1x2(DEI(t + 1), DEI(t)) break;
98 102
 			case 0x17: /* DEO  */ t=T;n=N;        SET(2,-2) DEO(t, n) break;
99 103
 			case 0x37: /* DEO2 */ t=T;n=N;l=L;    SET(3,-3) DEO(t, l) DEO((t + 1), n) break;
100 104
 			case 0x18: /* ADD  */ t=T;n=N;        SET(2,-1) PUT1(n + t) break;