Browse code

Palette is now part of the PPU

neauoire authored on 24/12/2021 17:39:51
Showing 3 changed files
... ...
@@ -39,6 +39,22 @@ static Uint8 font[][8] = {
39 39
 	{0x00, 0x7c, 0x82, 0x80, 0xf0, 0x80, 0x82, 0x7c},
40 40
 	{0x00, 0x7c, 0x82, 0x80, 0xf0, 0x80, 0x80, 0x80}};
41 41
 
42
+void
43
+ppu_palette(Ppu *p, Uint8 *addr)
44
+{
45
+	int i;
46
+	for(i = 0; i < 4; ++i) {
47
+		Uint8
48
+			r = (*(addr + i / 2) >> (!(i % 2) << 2)) & 0x0f,
49
+			g = (*(addr + 2 + i / 2) >> (!(i % 2) << 2)) & 0x0f,
50
+			b = (*(addr + 4 + i / 2) >> (!(i % 2) << 2)) & 0x0f;
51
+		p->palette[i] = 0xff000000 | (r << 20) | (r << 16) | (g << 12) | (g << 8) | (b << 4) | b;
52
+	}
53
+	for(i = 4; i < 16; ++i)
54
+		p->palette[i] = p->palette[i / 4];
55
+	p->reqdraw = 1;
56
+}
57
+
42 58
 void
43 59
 ppu_resize(Ppu *p, Uint16 width, Uint16 height)
44 60
 {
... ...
@@ -23,8 +23,10 @@ typedef unsigned int Uint32;
23 23
 typedef struct Ppu {
24 24
 	Uint8 *pixels, reqdraw;
25 25
 	Uint16 width, height;
26
+	Uint32 palette[16];
26 27
 } Ppu;
27 28
 
29
+void ppu_palette(Ppu *p, Uint8 *addr);
28 30
 void ppu_resize(Ppu *p, Uint16 width, Uint16 height);
29 31
 void ppu_clear(Ppu *p, Uint8 layer);
30 32
 Uint8 ppu_read(Ppu *p, Uint16 x, Uint16 y);
... ...
@@ -39,7 +39,7 @@ static Ppu ppu;
39 39
 static Apu apu[POLYPHONY];
40 40
 static Device *devsystem, *devscreen, *devmouse, *devctrl, *devaudio0, *devconsole;
41 41
 static Uint8 zoom = 1;
42
-static Uint32 *ppu_screen, stdin_event, audio0_event, palette[16];
42
+static Uint32 *ppu_screen, stdin_event, audio0_event;
43 43
 
44 44
 static int
45 45
 clamp(int val, int min, int max)
... ...
@@ -88,22 +88,6 @@ stdin_handler(void *p)
88 88
 	(void)p;
89 89
 }
90 90
 
91
-void
92
-set_palette(Uint8 *addr)
93
-{
94
-	int i;
95
-	for(i = 0; i < 4; ++i) {
96
-		Uint8
97
-			r = (*(addr + i / 2) >> (!(i % 2) << 2)) & 0x0f,
98
-			g = (*(addr + 2 + i / 2) >> (!(i % 2) << 2)) & 0x0f,
99
-			b = (*(addr + 4 + i / 2) >> (!(i % 2) << 2)) & 0x0f;
100
-		palette[i] = 0xff000000 | (r << 20) | (r << 16) | (g << 12) | (g << 8) | (b << 4) | b;
101
-	}
102
-	for(i = 4; i < 16; ++i)
103
-		palette[i] = palette[i / 4];
104
-	ppu.reqdraw = 1;
105
-}
106
-
107 91
 static void
108 92
 set_window_size(SDL_Window *window, int w, int h)
109 93
 {
... ...
@@ -173,7 +157,7 @@ redraw(Uxn *u)
173 157
 		ppu_debug(&ppu, u->wst.dat, u->wst.ptr, u->rst.ptr, u->ram.dat);
174 158
 	for(y = 0; y < ppu.height; ++y)
175 159
 		for(x = 0; x < ppu.width; ++x)
176
-			ppu_screen[x + y * ppu.width] = palette[ppu_read(&ppu, x, y)];
160
+			ppu_screen[x + y * ppu.width] = ppu.palette[ppu_read(&ppu, x, y)];
177 161
 	if(SDL_UpdateTexture(gTexture, &gRect, ppu_screen, ppu.width * sizeof(Uint32)) != 0)
178 162
 		error("SDL_UpdateTexture", SDL_GetError());
179 163
 	SDL_RenderClear(gRenderer);
... ...
@@ -277,7 +261,7 @@ system_deo(Device *d, Uint8 port)
277 261
 	case 0x3: d->u->rst.ptr = d->dat[port]; break;
278 262
 	}
279 263
 	if(port > 0x7 && port < 0xe)
280
-		set_palette(&d->dat[0x8]);
264
+		ppu_palette(&ppu, &d->dat[0x8]);
281 265
 }
282 266
 
283 267
 static void