| ... | ... |
@@ -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()) |