Browse code

Use device masks for DEI

Devine Lu Linvega authored on 04/03/2023 18:51:23
Showing 2 changed files
... ...
@@ -35,6 +35,7 @@ WITH REGARD TO THIS SOFTWARE.
35 35
 #define PUSH(stack, v) { stack->dat[stack->ptr++] = (v); }
36 36
 #define PUSH2(stack, v) { tmp = (v); stack->dat[stack->ptr] = (v) >> 8; stack->dat[stack->ptr + 1] = (v); stack->ptr += 2; }
37 37
 #define SEND(a, b) { u->dev[a] = b; if((send_events[(a) >> 4] >> ((a) & 0xf)) & 0x1) u->deo(u, a); }
38
+#define LISTEN(a, b) { PUT(a, ((receive_events[(b) >> 4] >> ((b) & 0xf)) & 0x1) ? u->dei(u, b) : u->dev[b])  }
38 39
 
39 40
 static 
40 41
 Uint16 send_events[] = {
... ...
@@ -42,8 +43,8 @@ Uint16 send_events[] = {
42 43
 	0x0000, 0x0000, 0xa260, 0xa260, 0x0000, 0x0000, 0x0000, 0x0000 };
43 44
 static
44 45
 Uint16 receive_events[] = {
45
-	0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
46
-	0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000 };
46
+	0x0000, 0x0000, 0x0014, 0x0014, 0x0014, 0x0014, 0x0014, 0x0000,
47
+	0x0000, 0x0000, 0x0000, 0x0000, 0x07fd, 0x0000, 0x0000, 0x0000 };
47 48
 
48 49
 int
49 50
 uxn_eval(Uxn *u, Uint16 pc)
... ...
@@ -110,8 +111,8 @@ uxn_eval(Uxn *u, Uint16 pc)
110 111
 			case 0x14: /* LDA  */ t=T2;           INC(2,-1) PUT(0, u->ram[t]) break;
111 112
 			case 0x35: /* STA2 */ t=T2;n=N2;      DEC(4, 0) POKE16(u->ram + t, n) break;
112 113
 			case 0x15: /* STA  */ t=T2;n=L;       DEC(3, 0) u->ram[t] = n; break;
113
-			case 0x36: /* DEI2 */ t=T;            INC(1, 1) PUT(1, u->dei(u, t)) PUT(0, u->dei(u, t + 1)) break;
114
-			case 0x16: /* DEI  */ t=T;            INC(1, 0) PUT(0, u->dei(u, t)) break;
114
+			case 0x36: /* DEI2 */ t=T;            INC(1, 1) LISTEN(1, t) LISTEN(0, t + 1) break;
115
+			case 0x16: /* DEI  */ t=T;            INC(1, 0) LISTEN(0, t) break;
115 116
 			case 0x37: /* DEO2 */ t=T;n=N;l=L;    DEC(3, 0) SEND(t, l) SEND(t + 1, n) break;
116 117
 			case 0x17: /* DEO  */ t=T;n=N;        DEC(2, 0) SEND(t, n) break;
117 118
 			case 0x38: /* ADD2 */ t=T2;n=N2;      INC(4,-2) PUT2(0, n + t) break;
... ...
@@ -50,8 +50,7 @@ console_deo(Uint8 *d, Uint8 port)
50 50
 static Uint8
51 51
 emu_dei(Uxn *u, Uint8 addr)
52 52
 {
53
-	Uint8 p = addr & 0x0f, d = addr & 0xf0;
54
-	switch(d) {
53
+	switch(addr & 0xf0) {
55 54
 	case 0xc0: return datetime_dei(u, addr);
56 55
 	}
57 56
 	return u->dev[addr];