Browse code

(uxn.c) Catch underflow with JCI

neauoire authored on 30/08/2023 16:24:09
Showing 3 changed files
... ...
@@ -18,20 +18,19 @@ WITH REGARD TO THIS SOFTWARE.
18 18
 */
19 19
 
20 20
 #define T *ptr
21
-#define N *(ptr-1)
22
-#define L *(ptr-2)
23
-#define T2 PEEK2((ptr-1))
24
-#define H2 PEEK2((ptr-2))
25
-#define N2 PEEK2((ptr-3))
26
-#define L2 PEEK2((ptr-5))
27
-
28
-#define HALT(c)   { return emu_halt(u, ins, c, pc - 1); }
29
-#define FLIP      { s = ins & 0x40 ? &u->wst : &u->rst; }
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(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) }
21
+#define N *(ptr - 1)
22
+#define L *(ptr - 2)
23
+#define T2 PEEK2((ptr - 1))
24
+#define H2 PEEK2((ptr - 2))
25
+#define N2 PEEK2((ptr - 3))
26
+#define L2 PEEK2((ptr - 5))
27
+#define HALT(c)         { return emu_halt(u, ins, c, pc - 1); }
28
+#define FLIP            { s = ins & 0x40 ? &u->wst : &u->rst; }
29
+#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; }
30
+#define PUT1(a)         { *ptr = a; }
31
+#define PUT1x2(a, b)    { *ptr = a; *(ptr - 1) = b; }
32
+#define PUT1x3(a, b, c) { *ptr = a; *(ptr - 1) = b; *(ptr - 2) = c; }
33
+#define PUT2(a)         { r = (a); POKE2(ptr - 1, r) }
35 34
 #define PUT2x2(a, b)    { POKE2(ptr - 1, a) POKE2(ptr - 3, b) }
36 35
 #define PUT2x3(a, b, c) { POKE2(ptr - 1, a) POKE2(ptr - 3, b) POKE2(ptr - 5, c) }
37 36
 
... ...
@@ -49,7 +48,7 @@ uxn_eval(Uxn *u, Uint16 pc)
49 48
 		switch(ins & 0x1f ? ins & 0x3f : ins << 4) {
50 49
 			/* IMM */
51 50
 			case 0x000: /* BRK  */                          return 1;
52
-			case 0x200: /* JCI  */                          if(!s->dat[--s->ptr]) { pc += 2; break; } /* else fallthrough */
51
+			case 0x200: /* JCI  */ t=T;           SET(0,-1) if(!t) { pc += 2; break; } /* else fallthrough */
53 52
 			case 0x400: /* JMI  */                          pc += PEEK2(ram + pc) + 2; break;
54 53
 			case 0x600: /* JSI  */                SET(0, 2) PUT2(pc + 2) pc += PEEK2(ram + pc) + 2; break;
55 54
 			case 0x800: /* LIT  */ case 0xc00:    SET(0, 1) PUT1(ram[pc++]) break;
... ...
@@ -72,7 +72,7 @@ main(int argc, char **argv)
72 72
 	system_connect(0xc, DATETIME_VERSION, DATETIME_DEIMASK, DATETIME_DEOMASK);
73 73
 	/* Read flags */
74 74
 	if(argv[i][0] == '-' && argv[i][1] == 'v')
75
-		return system_version("Uxncli - Console Varvara Emulator", "29 Aug 2023");
75
+		return system_version("Uxncli - Console Varvara Emulator", "30 Aug 2023");
76 76
 	if(!system_init(&u, (Uint8 *)calloc(0x10000 * RAM_PAGES, sizeof(Uint8)), argv[i++]))
77 77
 		return system_error("Init", "Failed to initialize uxn.");
78 78
 	/* Game Loop */
... ...
@@ -516,7 +516,7 @@ main(int argc, char **argv)
516 516
 	system_connect(0xc, DATETIME_VERSION, DATETIME_DEIMASK, DATETIME_DEOMASK);
517 517
 	/* Read flags */
518 518
 	if(argv[i][0] == '-' && argv[i][1] == 'v')
519
-		return system_version("Uxnemu - Graphical Varvara Emulator", "29 Aug 2023");
519
+		return system_version("Uxnemu - Graphical Varvara Emulator", "30 Aug 2023");
520 520
 	if(strcmp(argv[i], "-2x") == 0 || strcmp(argv[i], "-3x") == 0)
521 521
 		set_zoom(argv[i++][1] - '0', 0);
522 522
 	if(!emu_init())