commit 71c8d44

Devine Lu Linvega  ·  2024-01-11 01:41:35 +0000 UTC
parent e247b86
Faster screen drawing
3 files changed,  +56, -66
+2, -3
 1@@ -20,9 +20,8 @@ static int tids[8];
 2 static Uint16 link_vectors[8];
 3 static Uint8 *link_ram;
 4 
 5-static void
 6-	*
 7-	link_eval(void *x)
 8+static void *
 9+link_eval(void *x)
10 {
11 	int tid = *((int *)x);
12 	Uxn u;
+53, -62
  1@@ -122,14 +122,14 @@ screen_debugger(Uxn *u)
  2 		Uint8 pos = u->wst.ptr - 4 + i;
  3 		Uint8 color = i > 4 ? 0x01 : !pos ? 0xc :
  4 			i == 4                        ? 0x8 :
  5-                                            0x2;
  6+											0x2;
  7 		draw_byte(u->wst.dat[pos], i * 0x18 + 0x8, uxn_screen.height - 0x18, color);
  8 	}
  9 	for(i = 0; i < 0x08; i++) {
 10 		Uint8 pos = u->rst.ptr - 4 + i;
 11 		Uint8 color = i > 4 ? 0x01 : !pos ? 0xc :
 12 			i == 4                        ? 0x8 :
 13-                                            0x2;
 14+											0x2;
 15 		draw_byte(u->rst.dat[pos], i * 0x18 + 0x8, uxn_screen.height - 0x10, color);
 16 	}
 17 	screen_1bpp(uxn_screen.fg, &arrow[0], 0x68, uxn_screen.height - 0x20, 3, 1, 1);
 18@@ -217,6 +217,10 @@ screen_redraw(Uxn *u)
 19 	}
 20 }
 21 
 22+/* screen registers */
 23+
 24+static Uint16 rX, rY, rA, rMX, rMY, rMA, rML, rDX, rDY;
 25+
 26 Uint8
 27 screen_dei(Uxn *u, Uint8 addr)
 28 {
 29@@ -225,6 +229,12 @@ screen_dei(Uxn *u, Uint8 addr)
 30 	case 0x23: return uxn_screen.width;
 31 	case 0x24: return uxn_screen.height >> 8;
 32 	case 0x25: return uxn_screen.height;
 33+	case 0x28: return rX >> 8;
 34+	case 0x29: return rX;
 35+	case 0x2a: return rY >> 8;
 36+	case 0x2b: return rY;
 37+	case 0x2c: return rA >> 8;
 38+	case 0x2d: return rA;
 39 	default: return u->dev[addr];
 40 	}
 41 }
 42@@ -232,83 +242,64 @@ screen_dei(Uxn *u, Uint8 addr)
 43 void
 44 screen_deo(Uint8 *ram, Uint8 *d, Uint8 port)
 45 {
 46-	Uint8 *port_x, *port_y, *port_addr;
 47-	Uint16 x, y, dx, dy, dxy, dyx, addr, addr_incr;
 48 	switch(port) {
 49-	case 0x3: {
 50-		Uint8 *port_width = d + 0x2;
 51-		screen_resize(PEEK2(port_width), uxn_screen.height, uxn_screen.scale);
 52-	} break;
 53-	case 0x5: {
 54-		Uint8 *port_height = d + 0x4;
 55-		screen_resize(uxn_screen.width, PEEK2(port_height), uxn_screen.scale);
 56-	} break;
 57+	case 0x3: screen_resize(PEEK2(d + 2), uxn_screen.height, uxn_screen.scale); return;
 58+	case 0x5: screen_resize(uxn_screen.width, PEEK2(d + 4), uxn_screen.scale); return;
 59+	case 0x6: rMX = d[0x6] & 0x1, rMY = d[0x6] & 0x2, rMA = d[0x6] & 0x4, rML = d[0x6] >> 4, rDX = rMX << 3, rDY = rMY << 2; return;
 60+	case 0x8:
 61+	case 0x9: rX = (d[0x8] << 8) | d[0x9]; return;
 62+	case 0xa:
 63+	case 0xb: rY = (d[0xa] << 8) | d[0xb]; return;
 64+	case 0xc:
 65+	case 0xd: rA = (d[0xc] << 8) | d[0xd]; return;
 66 	case 0xe: {
 67 		Uint8 ctrl = d[0xe];
 68 		Uint8 color = ctrl & 0x3;
 69-		Uint8 *layer = (ctrl & 0x40) ? uxn_screen.fg : uxn_screen.bg;
 70-		port_x = d + 0x8, port_y = d + 0xa;
 71-		x = PEEK2(port_x);
 72-		y = PEEK2(port_y);
 73+		Uint8 *layer = ctrl & 0x40 ? uxn_screen.fg : uxn_screen.bg;
 74 		/* fill mode */
 75 		if(ctrl & 0x80) {
 76-			Uint16 x2 = uxn_screen.width, y2 = uxn_screen.height;
 77-			if(ctrl & 0x10) x2 = x, x = 0;
 78-			if(ctrl & 0x20) y2 = y, y = 0;
 79-			if(!x && !y && x2 == uxn_screen.width && y2 == uxn_screen.height)
 80-				screen_fill(layer, color);
 81+			Uint16 x1, y1, x2, y2;
 82+			if(ctrl & 0x10)
 83+				x1 = 0, x2 = rX;
 84+			else
 85+				x1 = rX, x2 = uxn_screen.width;
 86+			if(ctrl & 0x20)
 87+				y1 = 0, y2 = rY;
 88 			else
 89-				screen_rect(layer, x, y, x2, y2, color);
 90-			screen_change(x, y, x2, y2);
 91+				y1 = rY, y2 = uxn_screen.height;
 92+			screen_rect(layer, x1, y1, x2, y2, color);
 93+			screen_change(x1, y1, x2, y2);
 94 		}
 95 		/* pixel mode */
 96 		else {
 97-			Uint16 w = uxn_screen.width, h = uxn_screen.height;
 98-			if(x < w && y < h)
 99-				layer[x + y * w] = color;
100-			screen_change(x, y, x + 1, y + 1);
101-			if(d[0x6] & 0x1) POKE2(port_x, x + 1);
102-			if(d[0x6] & 0x2) POKE2(port_y, y + 1);
103+			Uint16 w = uxn_screen.width;
104+			if(rX < w && rY < uxn_screen.height)
105+				layer[rX + rY * w] = color;
106+			screen_change(rX, rY, rX + 1, rY + 1);
107+			if(rMX) rX++;
108+			if(rMY) rY++;
109 		}
110-		break;
111+		return;
112 	}
113 	case 0xf: {
114 		Uint8 i;
115 		Uint8 ctrl = d[0xf];
116-		Uint8 move = d[0x6];
117-		Uint8 length = move >> 4;
118 		Uint8 twobpp = !!(ctrl & 0x80);
119-		Uint8 *layer = (ctrl & 0x40) ? uxn_screen.fg : uxn_screen.bg;
120 		Uint8 color = ctrl & 0xf;
121-		int flipx = (ctrl & 0x10), fx = flipx ? -1 : 1;
122-		int flipy = (ctrl & 0x20), fy = flipy ? -1 : 1;
123-		port_x = d + 0x8, port_y = d + 0xa;
124-		port_addr = d + 0xc;
125-		x = PEEK2(port_x), dx = (move & 0x1) << 3, dxy = dx * fy;
126-		y = PEEK2(port_y), dy = (move & 0x2) << 2, dyx = dy * fx;
127-		addr = PEEK2(port_addr), addr_incr = (move & 0x4) << (1 + twobpp);
128-		if(twobpp) {
129-			for(i = 0; i <= length; i++) {
130-				screen_2bpp(layer, &ram[addr], x + dyx * i, y + dxy * i, color, fx, fy);
131-				addr += addr_incr;
132-			}
133-		} else {
134-			for(i = 0; i <= length; i++) {
135-				screen_1bpp(layer, &ram[addr], x + dyx * i, y + dxy * i, color, fx, fy);
136-				addr += addr_incr;
137-			}
138-		}
139-		screen_change(x, y, x + dyx * length + 8, y + dxy * length + 8);
140-		if(move & 0x1) {
141-			x = x + dx * fx;
142-			POKE2(port_x, x);
143-		}
144-		if(move & 0x2) {
145-			y = y + dy * fy;
146-			POKE2(port_y, y);
147-		}
148-		if(move & 0x4) POKE2(port_addr, addr); /* auto addr+length */
149-		break;
150+		Uint8 *layer = ctrl & 0x40 ? uxn_screen.fg : uxn_screen.bg;
151+		int fx = ctrl & 0x10 ? -1 : 1;
152+		int fy = ctrl & 0x20 ? -1 : 1;
153+		Uint16 dxy = rDX * fy, dyx = rDY * fx, addr_incr = rMA << (1 + twobpp);
154+		if(twobpp)
155+			for(i = 0; i <= rML; i++, rA += addr_incr)
156+				screen_2bpp(layer, &ram[rA], rX + dyx * i, rY + dxy * i, color, fx, fy);
157+		else
158+			for(i = 0; i <= rML; i++, rA += addr_incr)
159+				screen_1bpp(layer, &ram[rA], rX + dyx * i, rY + dxy * i, color, fx, fy);
160+		screen_change(rX, rY, rX + dyx * rML + 8, rY + dxy * rML + 8);
161+		if(rMX) rX += rDX * fx;
162+		if(rMY) rY += rDY * fy;
163+		return;
164 	}
165 	}
166 }
+1, -1
1@@ -40,7 +40,7 @@ system_print(Stack *s, char *name)
2 	for(i = 0; i < 9; i++) {
3 		Uint8 pos = s->ptr - 4 + i;
4 		fprintf(stderr, !pos ? "[%02x]" : i == 4 ? "<%02x>" :
5-                                                   " %02x ",
6+												   " %02x ",
7 			s->dat[pos]);
8 	}
9 	fprintf(stderr, "\n");