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