Browse code

(uxn-tnl) Use stack pointer for arithmetic

neauoire authored on 09/08/2023 19:57:51
Showing 1 changed files
... ...
@@ -17,31 +17,32 @@ WITH REGARD TO THIS SOFTWARE.
17 17
 [   L2   ][   N2   ][   T2   ] <
18 18
 */
19 19
 
20
-#define T s->dat[s->ptr - 1]
21
-#define N s->dat[s->ptr - 2]
22
-#define L s->dat[s->ptr - 3]
23
-#define T2 PEEK2(s->dat + s->ptr - 2)
24
-#define H2 PEEK2(s->dat + s->ptr - 3)
25
-#define N2 PEEK2(s->dat + s->ptr - 4)
26
-#define L2 PEEK2(s->dat + s->ptr - 6)
20
+#define T *sp
21
+#define N *(sp-1)
22
+#define L *(sp-2)
23
+#define T2 PEEK2((sp-1))
24
+#define H2 PEEK2((sp-2))
25
+#define N2 PEEK2((sp-3))
26
+#define L2 PEEK2((sp-5))
27 27
 
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)  { if(x > s->ptr) HALT(1) tmp = (x & k) + y + s->ptr; if(tmp > 254) HALT(2) s->ptr = tmp; }
31 31
 #define PUT(o, v)  { s->dat[(s->ptr - 1 - (o))] = (v); }
32
-#define PUT2(o, v) { tmp = (v); POKE2(s->dat + (s->ptr - o - 2), tmp); }
32
+#define PUT2(o, v) { tmp = (v); POKE2(s->dat + (s->ptr - 2 - (o)), tmp); }
33 33
 
34 34
 int
35 35
 uxn_eval(Uxn *u, Uint16 pc)
36 36
 {
37 37
 	int t, n, l, k, tmp, ins, opc;
38
-	Uint8 *ram = u->ram;
38
+	Uint8 *ram = u->ram, *sp;
39 39
 	Stack *s;
40 40
 	if(!pc || u->dev[0x0f]) return 0;
41 41
 	for(;;) {
42 42
 		ins = ram[pc++];
43 43
 		k = ins & 0x80 ? 0xff : 0;
44 44
 		s = ins & 0x40 ? &u->rst : &u->wst;
45
+		sp = s->dat + s->ptr - 1;
45 46
 		opc = !(ins & 0x1f) ? (0 - (ins >> 5)) & 0xff : ins & 0x3f;
46 47
 		switch(opc) {
47 48
 			/* IMM */