commit b0c8404

neauoire  ·  2022-04-05 16:22:33 +0000 UTC
parent ab6ce6b
Removed screen as Device
4 files changed,  +30, -29
+24, -24
 1@@ -117,64 +117,64 @@ clamp(int val, int min, int max)
 2 /* IO */
 3 
 4 Uint8
 5-screen_dei(Device *d, Uint8 port)
 6+screen_dei(Uint8 *d, Uint8 port)
 7 {
 8 	switch(port) {
 9 	case 0x2: return uxn_screen.width >> 8;
10 	case 0x3: return uxn_screen.width;
11 	case 0x4: return uxn_screen.height >> 8;
12 	case 0x5: return uxn_screen.height;
13-	default: return d->dat[port];
14+	default: return d[port];
15 	}
16 }
17 
18 void
19-screen_deo(Device *d, Uint8 port)
20+screen_deo(Uint8 *ram, Uint8 *d, Uint8 port)
21 {
22 	switch(port) {
23 	case 0x3:
24 		if(!FIXED_SIZE) {
25 			Uint16 w;
26-			DEVPEEK16(w, 0x2);
27+			PEKDEV(w, 0x2);
28 			screen_resize(&uxn_screen, clamp(w, 1, 1024), uxn_screen.height);
29 		}
30 		break;
31 	case 0x5:
32 		if(!FIXED_SIZE) {
33 			Uint16 h;
34-			DEVPEEK16(h, 0x4);
35+			PEKDEV(h, 0x4);
36 			screen_resize(&uxn_screen, uxn_screen.width, clamp(h, 1, 1024));
37 		}
38 		break;
39 	case 0xe: {
40 		Uint16 x, y;
41-		Uint8 layer = d->dat[0xe] & 0x40;
42-		DEVPEEK16(x, 0x8);
43-		DEVPEEK16(y, 0xa);
44-		screen_write(&uxn_screen, layer ? &uxn_screen.fg : &uxn_screen.bg, x, y, d->dat[0xe] & 0x3);
45-		if(d->dat[0x6] & 0x01) DEVPOKE16(0x8, x + 1); /* auto x+1 */
46-		if(d->dat[0x6] & 0x02) DEVPOKE16(0xa, y + 1); /* auto y+1 */
47+		Uint8 layer = d[0xe] & 0x40;
48+		PEKDEV(x, 0x8);
49+		PEKDEV(y, 0xa);
50+		screen_write(&uxn_screen, layer ? &uxn_screen.fg : &uxn_screen.bg, x, y, d[0xe] & 0x3);
51+		if(d[0x6] & 0x01) POKDEV(0x8, x + 1); /* auto x+1 */
52+		if(d[0x6] & 0x02) POKDEV(0xa, y + 1); /* auto y+1 */
53 		break;
54 	}
55 	case 0xf: {
56 		Uint16 x, y, dx, dy, addr;
57-		Uint8 i, n, twobpp = !!(d->dat[0xf] & 0x80);
58-		Layer *layer = (d->dat[0xf] & 0x40) ? &uxn_screen.fg : &uxn_screen.bg;
59-		DEVPEEK16(x, 0x8);
60-		DEVPEEK16(y, 0xa);
61-		DEVPEEK16(addr, 0xc);
62-		n = d->dat[0x6] >> 4;
63-		dx = (d->dat[0x6] & 0x01) << 3;
64-		dy = (d->dat[0x6] & 0x02) << 2;
65+		Uint8 i, n, twobpp = !!(d[0xf] & 0x80);
66+		Layer *layer = (d[0xf] & 0x40) ? &uxn_screen.fg : &uxn_screen.bg;
67+		PEKDEV(x, 0x8);
68+		PEKDEV(y, 0xa);
69+		PEKDEV(addr, 0xc);
70+		n = d[0x6] >> 4;
71+		dx = (d[0x6] & 0x01) << 3;
72+		dy = (d[0x6] & 0x02) << 2;
73 		if(addr > 0x10000 - ((n + 1) << (3 + twobpp)))
74 			return;
75 		for(i = 0; i <= n; i++) {
76-			screen_blit(&uxn_screen, layer, x + dy * i, y + dx * i, &d->u->ram[addr], d->dat[0xf] & 0xf, d->dat[0xf] & 0x10, d->dat[0xf] & 0x20, twobpp);
77-			addr += (d->dat[0x6] & 0x04) << (1 + twobpp);
78+			screen_blit(&uxn_screen, layer, x + dy * i, y + dx * i, &ram[addr], d[0xf] & 0xf, d[0xf] & 0x10, d[0xf] & 0x20, twobpp);
79+			addr += (d[0x6] & 0x04) << (1 + twobpp);
80 		}
81-		DEVPOKE16(0xc, addr);   /* auto addr+length */
82-		DEVPOKE16(0x8, x + dx); /* auto x+8 */
83-		DEVPOKE16(0xa, y + dy); /* auto y+8 */
84+		POKDEV(0xc, addr);   /* auto addr+length */
85+		POKDEV(0x8, x + dx); /* auto x+8 */
86+		POKDEV(0xa, y + dy); /* auto y+8 */
87 		break;
88 	}
89 	}
+2, -2
1@@ -29,6 +29,6 @@ void screen_resize(UxnScreen *p, Uint16 width, Uint16 height);
2 void screen_clear(UxnScreen *p, Layer *layer);
3 void screen_redraw(UxnScreen *p, Uint32 *pixels);
4 
5-Uint8 screen_dei(Device *d, Uint8 port);
6-void screen_deo(Device *d, Uint8 port);
7+Uint8 screen_dei(Uint8 *d, Uint8 port);
8+void screen_deo(Uint8 *ram, Uint8 *d, Uint8 port);
9 int clamp(int val, int min, int max);
+1, -0
1@@ -25,6 +25,7 @@ typedef unsigned int Uint32;
2 
3 #define GETVEC(d) ((d)[0] << 8 | (d)[1])
4 #define POKDEV(x, y) { d[(x)] = (y) >> 8; d[(x) + 1] = (y); }
5+#define PEKDEV(o, x) { (o) = (d[(x)] << 8) + d[(x) + 1]; }
6 
7 /* clang-format on */
8 
+3, -3
 1@@ -64,7 +64,7 @@ uxn11_dei(struct Uxn *u, Uint8 addr)
 2 	Uint8 p = addr & 0x0f;
 3 	Device *d = &u->dev[addr >> 4];
 4 	switch(addr & 0xf0) {
 5-	case 0x20: return screen_dei(d, p); break;
 6+	case 0x20: return screen_dei(d->dat, p); break;
 7 	case 0xa0: return file_dei(d, p); break;
 8 	case 0xb0: return file_dei(d, p); break;
 9 	case 0xc0: return datetime_dei(d->dat, p); break;
10@@ -81,7 +81,7 @@ uxn11_deo(Uxn *u, Uint8 addr, Uint8 v)
11 	switch(addr & 0xf0) {
12 	case 0x00: system_deo(d, p); break;
13 	case 0x10: console_deo(d, p); break;
14-	case 0x20: screen_deo(d, p); break;
15+	case 0x20: screen_deo(u->ram, d->dat, p); break;
16 	case 0xa0: file_deo(d, p); break;
17 	case 0xb0: file_deo(d, p); break;
18 	}
19@@ -194,7 +194,7 @@ start(Uxn *u, char *rom)
20 
21 	/* system   */ uxn_port(u, 0x0, nil_dei, system_deo);
22 	/* console  */ uxn_port(u, 0x1, nil_dei, console_deo);
23-	/* screen   */ devscreen = uxn_port(u, 0x2, screen_dei, screen_deo);
24+	/* screen   */ devscreen = uxn_port(u, 0x2, nil_dei, nil_deo);
25 	/* empty    */ uxn_port(u, 0x3, nil_dei, nil_deo);
26 	/* empty    */ uxn_port(u, 0x4, nil_dei, nil_deo);
27 	/* empty    */ uxn_port(u, 0x5, nil_dei, nil_deo);