commit ac4ec09

Devine Lu Linvega  ·  2023-04-11 22:14:32 +0000 UTC
parent bc055f3
Implemented Screen/pixel fill mode
3 files changed,  +45, -27
+39, -22
  1@@ -22,6 +22,9 @@ static Uint8 blending[4][16] = {
  2 	{1, 2, 3, 1, 1, 2, 3, 1, 1, 2, 3, 1, 1, 2, 3, 1},
  3 	{2, 3, 1, 2, 2, 3, 1, 2, 2, 3, 1, 2, 2, 3, 1, 2}};
  4 
  5+static Uint32 palette_mono[] = {
  6+	0x0f000000, 0x0fffffff};
  7+
  8 static void
  9 screen_write(UxnScreen *p, Layer *layer, Uint16 x, Uint16 y, Uint8 color)
 10 {
 11@@ -35,12 +38,19 @@ screen_write(UxnScreen *p, Layer *layer, Uint16 x, Uint16 y, Uint8 color)
 12 }
 13 
 14 static void
 15-screen_wipe(UxnScreen *p, Layer *layer, Uint16 x, Uint16 y)
 16+screen_fill(UxnScreen *p, Layer *layer, Uint16 x1, Uint16 y1, Uint16 x2, Uint16 y2, Uint8 color)
 17 {
 18 	int v, h;
 19-	for(v = 0; v < 8; v++)
 20-		for(h = 0; h < 8; h++)
 21-			screen_write(p, layer, x + h, y + v, 0);
 22+	for(v = y1; v < y2; v++)
 23+		for(h = x1; h < x2; h++)
 24+			screen_write(p, layer, h, v, color);
 25+	layer->changed = 1;
 26+}
 27+
 28+static void
 29+screen_wipe(UxnScreen *p, Layer *layer, Uint16 x, Uint16 y)
 30+{
 31+	screen_fill(p, layer, x, y, x + 8, y + 8, 0);
 32 }
 33 
 34 static void
 35@@ -90,28 +100,24 @@ screen_resize(UxnScreen *p, Uint16 width, Uint16 height)
 36 	if(bg && fg && pixels) {
 37 		p->width = width;
 38 		p->height = height;
 39-		screen_clear(p, &p->bg);
 40-		screen_clear(p, &p->fg);
 41+		screen_fill(p, &p->bg, 0, 0, p->width, p->height, 0);
 42+		screen_fill(p, &p->fg, 0, 0, p->width, p->height, 0);
 43 	}
 44 }
 45 
 46 void
 47-screen_clear(UxnScreen *p, Layer *layer)
 48-{
 49-	Uint32 i, size = p->width * p->height;
 50-	for(i = 0; i < size; i++)
 51-		layer->pixels[i] = 0x00;
 52-	layer->changed = 1;
 53-}
 54-
 55-void
 56-screen_redraw(UxnScreen *p, Uint32 *pixels)
 57+screen_redraw(UxnScreen *p)
 58 {
 59 	Uint32 i, size = p->width * p->height, palette[16];
 60 	for(i = 0; i < 16; i++)
 61 		palette[i] = p->palette[(i >> 2) ? (i >> 2) : (i & 3)];
 62-	for(i = 0; i < size; i++)
 63-		pixels[i] = palette[p->fg.pixels[i] << 2 | p->bg.pixels[i]];
 64+	if(p->mono) {
 65+		for(i = 0; i < size; i++)
 66+			p->pixels[i] = palette_mono[(p->fg.pixels[i] ? p->fg.pixels[i] : p->bg.pixels[i]) & 0x1];
 67+	} else {
 68+		for(i = 0; i < size; i++)
 69+			p->pixels[i] = palette[p->fg.pixels[i] << 2 | p->bg.pixels[i]];
 70+	}
 71 	p->fg.changed = p->bg.changed = 0;
 72 }
 73 
 74@@ -121,6 +127,13 @@ clamp(int val, int min, int max)
 75 	return (val >= min) ? (val <= max) ? val : max : min;
 76 }
 77 
 78+void
 79+screen_mono(UxnScreen *p)
 80+{
 81+	p->mono = !p->mono;
 82+	screen_redraw(p);
 83+}
 84+
 85 /* IO */
 86 
 87 Uint8
 88@@ -149,10 +162,14 @@ screen_deo(Uint8 *ram, Uint8 *d, Uint8 port)
 89 		break;
 90 	case 0xe: {
 91 		Uint16 x = PEEK2(d + 0x8), y = PEEK2(d + 0xa);
 92-		Uint8 layer = d[0xe] & 0x40;
 93-		screen_write(&uxn_screen, layer ? &uxn_screen.fg : &uxn_screen.bg, x, y, d[0xe] & 0x3);
 94-		if(d[0x6] & 0x01) POKE2(d + 0x8, x + 1); /* auto x+1 */
 95-		if(d[0x6] & 0x02) POKE2(d + 0xa, y + 1); /* auto y+1 */
 96+		Layer *layer = (d[0xf] & 0x40) ? &uxn_screen.fg : &uxn_screen.bg;
 97+		if(d[0xe] & 0x80)
 98+			screen_fill(&uxn_screen, layer, (d[0xe] & 0x10) ? 0 : x, (d[0xe] & 0x20) ? 0 : y, (d[0xe] & 0x10) ? x : uxn_screen.width, (d[0xe] & 0x20) ? y : uxn_screen.height, d[0xe] & 0x3);
 99+		else {
100+			screen_write(&uxn_screen, layer, x, y, d[0xe] & 0x3);
101+			if(d[0x6] & 0x01) POKE2(d + 0x8, x + 1); /* auto x+1 */
102+			if(d[0x6] & 0x02) POKE2(d + 0xa, y + 1); /* auto y+1 */
103+		}
104 		break;
105 	}
106 	case 0xf: {
+5, -3
 1@@ -1,5 +1,6 @@
 2 /*
 3-Copyright (c) 2021 Devine Lu Linvega, Andrew Alderwick
 4+Copyright (c) 2021 Devine Lu Linvega
 5+Copyright (c) 2021 Andrew Alderwick
 6 
 7 Permission to use, copy, modify, and distribute this software for any
 8 purpose with or without fee is hereby granted, provided that the above
 9@@ -19,14 +20,15 @@ typedef struct UxnScreen {
10 	Uint32 palette[4], *pixels;
11 	Uint16 width, height;
12 	Layer fg, bg;
13+	Uint8 mono;
14 } UxnScreen;
15 
16 extern UxnScreen uxn_screen;
17 
18 void screen_palette(UxnScreen *p, Uint8 *addr);
19 void screen_resize(UxnScreen *p, Uint16 width, Uint16 height);
20-void screen_clear(UxnScreen *p, Layer *layer);
21-void screen_redraw(UxnScreen *p, Uint32 *pixels);
22+void screen_redraw(UxnScreen *p);
23+void screen_mono(UxnScreen *p);
24 
25 Uint8 screen_dei(Uxn *u, Uint8 addr);
26 void screen_deo(Uint8 *ram, Uint8 *d, Uint8 port);
+1, -2
 1@@ -34,7 +34,6 @@ static Window window;
 2 
 3 char *rom_path;
 4 
 5-#define SUPPORT 0x1f07 /* devices mask */
 6 #define WIDTH (64 * 8)
 7 #define HEIGHT (40 * 8)
 8 #define PAD 4
 9@@ -73,7 +72,7 @@ uxn_deo(Uxn *u, Uint8 addr)
10 static void
11 emu_draw(void)
12 {
13-	screen_redraw(&uxn_screen, uxn_screen.pixels);
14+	screen_redraw(&uxn_screen);
15 	XPutImage(display, window, DefaultGC(display, 0), ximage, 0, 0, PAD, PAD, uxn_screen.width, uxn_screen.height);
16 }
17