|
...
|
...
|
@@ -11,14 +11,6 @@ THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
|
|
11
|
11
|
WITH REGARD TO THIS SOFTWARE.
|
|
12
|
12
|
*/
|
|
13
|
13
|
|
|
14
|
|
-/* Registers
|
|
15
|
|
-
|
|
16
|
|
-[ . ][ . ][ . ][ L ][ N ][ T ] <
|
|
17
|
|
-[ . ][ . ][ . ][ H2 ][ T ] <
|
|
18
|
|
-[ L2 ][ N2 ][ T2 ] <
|
|
19
|
|
-
|
|
20
|
|
-*/
|
|
21
|
|
-
|
|
22
|
14
|
#define T s->dat[s->ptr-1]
|
|
23
|
15
|
#define N s->dat[s->ptr-2]
|
|
24
|
16
|
#define L s->dat[s->ptr-3]
|
|
...
|
...
|
@@ -27,6 +19,14 @@ WITH REGARD TO THIS SOFTWARE.
|
|
27
|
19
|
#define N2 PEEK16(s->dat+s->ptr-4)
|
|
28
|
20
|
#define L2 PEEK16(s->dat+s->ptr-6)
|
|
29
|
21
|
|
|
|
22
|
+/* Registers
|
|
|
23
|
+
|
|
|
24
|
+[ . ][ . ][ . ][ L ][ N ][ T ] <
|
|
|
25
|
+[ . ][ . ][ . ][ H2 ][ T ] <
|
|
|
26
|
+[ L2 ][ N2 ][ T2 ] <
|
|
|
27
|
+
|
|
|
28
|
+*/
|
|
|
29
|
+
|
|
30
|
30
|
#define HALT(c) { return uxn_halt(u, ins, (c), pc - 1); }
|
|
31
|
31
|
#define SET(mul, add) { if(mul > s->ptr) HALT(1) s->ptr += k * mul + add; if(s->ptr > 254) HALT(2) }
|
|
32
|
32
|
#define PUT(o, v) { s->dat[s->ptr - o - 1] = (v); }
|
|
...
|
...
|
@@ -36,14 +36,15 @@ WITH REGARD TO THIS SOFTWARE.
|
|
36
|
36
|
#define DEO(a, b) { u->dev[a] = b; if((deo_masks[(a) >> 4] >> ((a) & 0xf)) & 0x1) uxn_deo(u, a); }
|
|
37
|
37
|
#define DEI(a, b) { PUT(a, ((dei_masks[(b) >> 4] >> ((b) & 0xf)) & 0x1) ? uxn_dei(u, b) : u->dev[b]) }
|
|
38
|
38
|
|
|
39
|
|
-static
|
|
|
39
|
+static
|
|
40
|
40
|
Uint16 deo_masks[] = {
|
|
41
|
41
|
0x6a08, 0x0300, 0xc028, 0x8000, 0x8000, 0x8000, 0x8000, 0x0000,
|
|
42
|
|
- 0x0000, 0x0000, 0xa260, 0xa260, 0x0000, 0x0000, 0x0000, 0x0000 };
|
|
|
42
|
+ 0x0000, 0x0000, 0xa260, 0xa260, 0x0000, 0x0000, 0x0000, 0x0000};
|
|
|
43
|
+
|
|
43
|
44
|
static
|
|
44
|
45
|
Uint16 dei_masks[] = {
|
|
45
|
46
|
0x0000, 0x0000, 0x0014, 0x0014, 0x0014, 0x0014, 0x0014, 0x0000,
|
|
46
|
|
- 0x0000, 0x0000, 0x0000, 0x0000, 0x07fd, 0x0000, 0x0000, 0x0000 };
|
|
|
47
|
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x07fd, 0x0000, 0x0000, 0x0000};
|
|
47
|
48
|
|
|
48
|
49
|
int
|
|
49
|
50
|
uxn_eval(Uxn *u, Uint16 pc)
|
|
...
|
...
|
@@ -96,8 +97,8 @@ uxn_eval(Uxn *u, Uint16 pc)
|
|
96
|
97
|
case 0x0d: /* JCN */ t=T;n=N; SET(2,-2) pc += !!n * (Sint8)t; break;
|
|
97
|
98
|
case 0x2e: /* JSR2 */ t=T2; SET(2,-2) PUSH2(u->rst, pc) pc = t; break;
|
|
98
|
99
|
case 0x0e: /* JSR */ t=T; SET(1,-1) PUSH2(u->rst, pc) pc += (Sint8)t; break;
|
|
99
|
|
- case 0x2f: /* STH2 */ t=T2; SET(2,-2) if(ins & 0x40) { PUSH2(u->wst, t) } else{ PUSH2(u->rst, t) } break;
|
|
100
|
|
- case 0x0f: /* STH */ t=T; SET(1,-1) if(ins & 0x40) { PUSH(u->wst, t) } else{ PUSH(u->rst, t) } break;
|
|
|
100
|
+ case 0x2f: /* STH2 */ t=T2; SET(2,-2) PUSH2((ins & 0x40 ? u->wst : u->rst), t) break;
|
|
|
101
|
+ case 0x0f: /* STH */ t=T; SET(1,-1) PUSH((ins & 0x40 ? u->wst : u->rst), t) break;
|
|
101
|
102
|
case 0x30: /* LDZ2 */ t=T; SET(1, 1) PUT2(0, PEEK16(u->ram + t)) break;
|
|
102
|
103
|
case 0x10: /* LDZ */ t=T; SET(1, 0) PUT(0, u->ram[t]) break;
|
|
103
|
104
|
case 0x31: /* STZ2 */ t=T;n=H2; SET(3,-3) POKE16(u->ram + t, n) break;
|