commit 2fe1517

Devine Lu Linvega  ·  2025-01-22 00:22:01 +0000 UTC
parent 9fad09e
Screen improvements
4 files changed,  +15, -9
+1, -0
1@@ -17,6 +17,7 @@ WITH REGARD TO THIS SOFTWARE.
2 void close_console(void);
3 int console_input(int c, int type);
4 void console_arguments(int i, int argc, char **argv);
5+
6 Uint8 console_dei(Uint8 addr);
7 void console_deo(Uint8 addr);
8 
+1, -0
1@@ -12,4 +12,5 @@ WITH REGARD TO THIS SOFTWARE.
2 void controller_down(Uint8 mask);
3 void controller_up(Uint8 mask);
4 void controller_key(Uint8 key);
5+
6 void controller_deo(Uint8 addr);
+1, -0
1@@ -13,4 +13,5 @@ void mouse_down(Uint8 mask);
2 void mouse_up(Uint8 mask);
3 void mouse_pos(Uint16 x, Uint16 y);
4 void mouse_scroll(Uint16 x, Uint16 y);
5+
6 void mouse_deo(Uint8 addr);
+12, -9
 1@@ -180,46 +180,49 @@ screen_deo(Uint8 addr)
 2 	}
 3 	case 0x2f: {
 4 		int ctrl = uxn.dev[0x2f];
 5-		int twobpp = !!(ctrl & 0x80);
 6 		int blend = ctrl & 0xf, opaque = blend % 5;
 7 		int fx = ctrl & 0x10 ? -1 : 1, fy = ctrl & 0x20 ? -1 : 1;
 8-		int i, x1, x2, y1, y2, ax, ay, qx, qy, x = rX, y = rY;
 9-		int dxy = rDX * fy, dyx = rDY * fx, addr_incr = rMA << (1 + twobpp);
10+		int qfx = fx > 0 ? 7 : 0, qfy = fy < 0 ? 7 : 0;
11+		int dxy = fy * rDX, dyx = fx * rDY;
12 		int wmar = MAR(uxn_screen.width), wmar2 = MAR2(uxn_screen.width);
13 		int hmar2 = MAR2(uxn_screen.height);
14+		int i, x1, x2, y1, y2, ax, ay, qx, qy, x = rX, y = rY;
15 		Uint8 *layer = ctrl & 0x40 ? uxn_screen.fg : uxn_screen.bg;
16-		if(twobpp)
17+		if(ctrl & 0x80) {
18+			int addr_incr = rMA << 2;
19 			for(i = 0; i <= rML; i++, x += dyx, y += dxy, rA += addr_incr) {
20 				Uint16 xmar = MAR(x), ymar = MAR(y);
21 				Uint16 xmar2 = MAR2(x), ymar2 = MAR2(y);
22 				if(xmar < wmar && ymar2 < hmar2) {
23 					Uint8 *sprite = &uxn.ram[rA];
24 					int by = ymar2 * wmar2;
25-					for(ay = ymar * wmar2, qy = fy < 0 ? 7 : 0; ay < by; ay += wmar2, qy += fy) {
26+					for(ay = ymar * wmar2, qy = qfy; ay < by; ay += wmar2, qy += fy) {
27 						int ch1 = sprite[qy], ch2 = sprite[qy + 8] << 1, bx = xmar2 + ay;
28-						for(ax = xmar + ay, qx = fx > 0 ? 7 : 0; ax < bx; ax++, qx -= fx) {
29+						for(ax = xmar + ay, qx = qfx; ax < bx; ax++, qx -= fx) {
30 							int color = ((ch1 >> qx) & 1) | ((ch2 >> qx) & 2);
31 							if(opaque || color) layer[ax] = blending[color][blend];
32 						}
33 					}
34 				}
35 			}
36-		else
37+		} else {
38+			int addr_incr = rMA << 1;
39 			for(i = 0; i <= rML; i++, x += dyx, y += dxy, rA += addr_incr) {
40 				Uint16 xmar = MAR(x), ymar = MAR(y);
41 				Uint16 xmar2 = MAR2(x), ymar2 = MAR2(y);
42 				if(xmar < wmar && ymar2 < hmar2) {
43 					Uint8 *sprite = &uxn.ram[rA];
44 					int by = ymar2 * wmar2;
45-					for(ay = ymar * wmar2, qy = fy < 0 ? 7 : 0; ay < by; ay += wmar2, qy += fy) {
46+					for(ay = ymar * wmar2, qy = qfy; ay < by; ay += wmar2, qy += fy) {
47 						int ch1 = sprite[qy], bx = xmar2 + ay;
48-						for(ax = xmar + ay, qx = fx > 0 ? 7 : 0; ax < bx; ax++, qx -= fx) {
49+						for(ax = xmar + ay, qx = qfx; ax < bx; ax++, qx -= fx) {
50 							int color = (ch1 >> qx) & 1;
51 							if(opaque || color) layer[ax] = blending[color][blend];
52 						}
53 					}
54 				}
55 			}
56+		}
57 		if(fx < 0)
58 			x1 = x, x2 = rX;
59 		else