commit 3fa23b6

Devine Lu Linvega  ·  2024-12-15 19:26:37 +0000 UTC
parent 9f409c9
(screen) Optimizations
1 files changed,  +17, -15
+17, -15
 1@@ -209,24 +209,25 @@ screen_deo(Uint8 addr)
 2 		return;
 3 	}
 4 	case 0x2f: {
 5-		int i;
 6 		int ctrl = uxn.dev[0x2f];
 7 		int twobpp = !!(ctrl & 0x80);
 8 		int blend = ctrl & 0xf;
 9 		int fx = ctrl & 0x10 ? -1 : 1, fy = ctrl & 0x20 ? -1 : 1;
10-		int x1, x2, y1, y2, ax, ay, qx, qy, x = rX, y = rY;
11+		int i, x1, x2, y1, y2, ax, ay, qx, qy, x = rX, y = rY;
12 		int dxy = rDX * fy, dyx = rDY * fx, addr_incr = rMA << (1 + twobpp);
13-		int len = MAR2(uxn_screen.width);
14+		int wmar = MAR(uxn_screen.width), wmar2 = MAR2(uxn_screen.width);
15+		int hmar2 = MAR2(uxn_screen.height);
16 		Uint8 *layer = ctrl & 0x40 ? uxn_screen.fg : uxn_screen.bg;
17 		if(twobpp)
18 			for(i = 0; i <= rML; i++, x += dyx, y += dxy, rA += addr_incr) {
19-				Uint16 xx = MAR(x), yy = MAR(y);
20-				if(xx < MAR(uxn_screen.width) && MAR(yy) < MAR2(uxn_screen.height)) {
21+				Uint16 xmar = MAR(x), ymar = MAR(y);
22+				Uint16 xmar2 = MAR2(x), ymar2 = MAR2(y);
23+				if(xmar < wmar && ymar2 < hmar2) {
24 					Uint8 *sprite = &uxn.ram[rA];
25-					int opaque = blend % 5, by = (yy + 8) * len;
26-					for(ay = yy * len, qy = fy < 0 ? 7 : 0; ay < by; ay += len, qy += fy) {
27-						int ch1 = sprite[qy], ch2 = sprite[qy + 8] << 1, bx = xx + 8 + ay;
28-						for(ax = xx + ay, qx = fx > 0 ? 7 : 0; ax < bx; ax++, qx -= fx) {
29+					int opaque = blend % 5, by = ymar2 * wmar2;
30+					for(ay = ymar * wmar2, qy = fy < 0 ? 7 : 0; ay < by; ay += wmar2, qy += fy) {
31+						int ch1 = sprite[qy], ch2 = sprite[qy + 8] << 1, bx = xmar2 + ay;
32+						for(ax = xmar + ay, qx = fx > 0 ? 7 : 0; ax < bx; ax++, qx -= fx) {
33 							int color = ((ch1 >> qx) & 1) | ((ch2 >> qx) & 2);
34 							if(opaque || color) layer[ax] = blending[color][blend];
35 						}
36@@ -235,13 +236,14 @@ screen_deo(Uint8 addr)
37 			}
38 		else
39 			for(i = 0; i <= rML; i++, x += dyx, y += dxy, rA += addr_incr) {
40-				Uint16 xx = MAR(x), yy = MAR(y);
41-				if(xx < MAR(uxn_screen.width) && MAR(yy) < MAR2(uxn_screen.height)) {
42+				Uint16 xmar = MAR(x), ymar = MAR(y);
43+				Uint16 xmar2 = MAR2(x), ymar2 = MAR2(y);
44+				if(xmar < wmar && ymar2 < hmar2) {
45 					Uint8 *sprite = &uxn.ram[rA];
46-					int opaque = blend % 5, by = (yy + 8) * len;
47-					for(ay = yy * len, qy = fy < 0 ? 7 : 0; ay < by; ay += len, qy += fy) {
48-						int ch1 = sprite[qy], bx = xx + 8 + ay;
49-						for(ax = xx + ay, qx = fx > 0 ? 7 : 0; ax < bx; ax++, qx -= fx) {
50+					int opaque = blend % 5, by = ymar2 * wmar2;
51+					for(ay = ymar * wmar2, qy = fy < 0 ? 7 : 0; ay < by; ay += wmar2, qy += fy) {
52+						int ch1 = sprite[qy], bx = xmar2 + ay;
53+						for(ax = xmar + ay, qx = fx > 0 ? 7 : 0; ax < bx; ax++, qx -= fx) {
54 							int color = (ch1 >> qx) & 1;
55 							if(opaque || color) layer[ax] = blending[color][blend];
56 						}