Browse code

Uxn can no longer error

neauoire authored on 02/09/2023 20:51:03
Showing 5 changed files
... ...
@@ -19,11 +19,6 @@ char *boot_rom;
19 19
 Uint8 dei_masks[0x100], deo_masks[0x100];
20 20
 Uint16 dev_vers[0x10], dei_mask[0x10], deo_mask[0x10];
21 21
 
22
-static const char *errors[] = {
23
-	"underflow",
24
-	"overflow",
25
-	"division by zero"};
26
-
27 22
 static int
28 23
 system_load(Uxn *u, char *filename)
29 24
 {
... ...
@@ -164,24 +159,3 @@ system_deo(Uxn *u, Uint8 *d, Uint8 port)
164 159
 		break;
165 160
 	}
166 161
 }
167
-
168
-/* Errors */
169
-
170
-int
171
-emu_halt(Uxn *u, Uint8 instr, Uint8 err, Uint16 addr)
172
-{
173
-	Uint8 *d = &u->dev[0];
174
-	Uint16 handler = PEEK2(d);
175
-	if(handler) {
176
-		u->wst.ptr = 4;
177
-		u->wst.dat[0] = addr >> 0x8;
178
-		u->wst.dat[1] = addr & 0xff;
179
-		u->wst.dat[2] = instr;
180
-		u->wst.dat[3] = err;
181
-		return uxn_eval(u, handler);
182
-	} else {
183
-		system_inspect(u);
184
-		fprintf(stderr, "%s %s, by %02x at 0x%04x.\n", (instr & 0x40) ? "Return-stack" : "Working-stack", errors[err - 1], instr, addr);
185
-	}
186
-	return 0;
187
-}
... ...
@@ -17,7 +17,7 @@ WITH REGARD TO THIS SOFTWARE.
17 17
 [   L2   ][   N2   ][   T2   ] <
18 18
 */
19 19
 
20
-#define T *ptr
20
+#define T *(ptr)
21 21
 #define N *(ptr - 1)
22 22
 #define L *(ptr - 2)
23 23
 #define X *(ptr - 3)
... ...
@@ -31,21 +31,20 @@ WITH REGARD TO THIS SOFTWARE.
31 31
 #define N2_(v) { r = (v); L = r; X = r >> 8; }
32 32
 #define L2_(v) { r = (v); Y = r; Z = r >> 8; }
33 33
 
34
-#define HALT(c)   { return emu_halt(u, ins, c, pc - 1); }
35 34
 #define FLIP      { s = ins & 0x40 ? &u->wst : &u->rst; }
36
-#define SET(x, y) { r = s->ptr; if(x > r) HALT(1) r += y; if(ins & 0x80) r += x; if(r > 254) HALT(2) ptr = s->dat + r - 1; s->ptr = r; }
37
-#define SHIFT(y)  { r = s->ptr + y; if(r > 254) HALT(2) ptr = s->dat + r - 1; s->ptr = r; }
35
+#define SHIFT(y)  { r = s->ptr + (y); ptr = s->dat + r - 1; s->ptr = r; }
36
+#define SET(x, y) { SHIFT((ins & 0x80) ? x + y : y) }
38 37
 
39 38
 int
40 39
 uxn_eval(Uxn *u, Uint16 pc)
41 40
 {
42 41
 	int t, n, l, r;
43
-	Uint8 *ram = u->ram;
42
+	Uint8 *ram = u->ram, *rr;
44 43
 	if(!pc || u->dev[0x0f]) return 0;
45 44
 	for(;;) {
46 45
 		int ins = ram[pc++];
47 46
 		Stack *s = ins & 0x40 ? &u->rst : &u->wst;
48
-		Uint8 *ptr = s->dat + s->ptr - 1, *rr;
47
+		Uint8 *ptr = s->dat + s->ptr - 1;
49 48
 		switch(ins & 0x1f ? ins & 0x3f : ins << 4) {
50 49
 			/* IMM */
51 50
 			case 0x000: /* BRK  */                          return 1;
... ...
@@ -107,8 +106,8 @@ uxn_eval(Uxn *u, Uint16 pc)
107 106
 			case 0x39: /* SUB2 */ t=T2;n=N2;      SET(4,-2) T2_(n - t) break;
108 107
 			case 0x1a: /* MUL  */ t=T;n=N;        SET(2,-1) T = n * t; break;
109 108
 			case 0x3a: /* MUL2 */ t=T2;n=N2;      SET(4,-2) T2_(n * t) break;
110
-			case 0x1b: /* DIV  */ t=T;n=N;        SET(2,-1) if(!t) HALT(3) T = n / t; break;
111
-			case 0x3b: /* DIV2 */ t=T2;n=N2;      SET(4,-2) if(!t) HALT(3) T2_(n / t) break;
109
+			case 0x1b: /* DIV  */ t=T;n=N;        SET(2,-1) T = t ? n / t : 0; break;
110
+			case 0x3b: /* DIV2 */ t=T2;n=N2;      SET(4,-2) T2_(t ? n / t : 0) break;
112 111
 			case 0x1c: /* AND  */ t=T;n=N;        SET(2,-1) T = n & t; break;
113 112
 			case 0x3c: /* AND2 */ t=T2;n=N2;      SET(4,-2) T2_(n & t) break;
114 113
 			case 0x1d: /* ORA  */ t=T;n=N;        SET(2,-1) T = n | t; break;
... ...
@@ -39,7 +39,6 @@ typedef struct Uxn {
39 39
 
40 40
 extern Uint8 emu_dei(Uxn *u, Uint8 addr);
41 41
 extern void emu_deo(Uxn *u, Uint8 addr);
42
-extern int emu_halt(Uxn *u, Uint8 instr, Uint8 err, Uint16 addr);
43 42
 extern Uint8 dei_masks[0x100], deo_masks[0x100];
44 43
 extern Uint16 dev_vers[0x10], dei_mask[0x10], deo_mask[0x10];
45 44
 
... ...
@@ -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", "2 Sep 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 */
... ...
@@ -524,7 +524,7 @@ main(int argc, char **argv)
524 524
 	system_connect(0xc, DATETIME_VERSION, DATETIME_DEIMASK, DATETIME_DEOMASK);
525 525
 	/* Read flags */
526 526
 	if(argv[i][0] == '-' && argv[i][1] == 'v')
527
-		return system_version("Uxnemu - Graphical Varvara Emulator", "30 Aug 2023");
527
+		return system_version("Uxnemu - Graphical Varvara Emulator", "2 Sep 2023");
528 528
 	if(strcmp(argv[i], "-2x") == 0 || strcmp(argv[i], "-3x") == 0)
529 529
 		set_zoom(argv[i++][1] - '0', 0);
530 530
 	if(!emu_init())