Browse code

The screen width/height ports can be written to

neauoire authored on 18/09/2021 23:51:20
Showing 5 changed files
... ...
@@ -54,6 +54,9 @@
54 54
 	;on-mouse   .Mouse/vector DEO2
55 55
 	;on-message .Console/vector DEO2
56 56
 
57
+	#0160 .Screen/width DEO2
58
+	#0100 .Screen/height DEO2
59
+
57 60
 	( find center )
58 61
 	.Screen/width DEI2 2// .center/x STZ2
59 62
 	.Screen/height DEI2 2// .center/y STZ2
... ...
@@ -62,6 +62,9 @@
62 62
 	#0fc5 .System/g DEO2 
63 63
 	#0f25 .System/b DEO2
64 64
 
65
+	#0100 .Screen/width DEO2
66
+	#0160 .Screen/height DEO2
67
+
65 68
 	( center )
66 69
 	.Screen/width DEI2 2// .center/x STZ2
67 70
 	.Screen/height DEI2 2// .center/y STZ2
... ...
@@ -78,5 +78,15 @@ ppu_init(Ppu *p, Uint8 hor, Uint8 ver)
78 78
 	p->height = 8 * ver;
79 79
 	p->bg = calloc(1, p->width / 4 * p->height * sizeof(Uint8));
80 80
 	p->fg = calloc(1, p->width / 4 * p->height * sizeof(Uint8));
81
-	return 1;
81
+	return p->bg && p->fg;
82 82
 }
83
+
84
+int
85
+ppu_resize(Ppu *p, Uint8 hor, Uint8 ver)
86
+{
87
+	p->width = 8 * hor;
88
+	p->height = 8 * ver;
89
+	p->bg = realloc(p->bg, p->width / 4 * p->height * sizeof(Uint8));
90
+	p->fg = realloc(p->fg, p->width / 4 * p->height * sizeof(Uint8));
91
+	return p->bg && p->fg;
92
+}
83 93
\ No newline at end of file
... ...
@@ -23,6 +23,7 @@ typedef struct Ppu {
23 23
 } Ppu;
24 24
 
25 25
 int ppu_init(Ppu *p, Uint8 hor, Uint8 ver);
26
+int ppu_resize(Ppu *p, Uint8 hor, Uint8 ver);
26 27
 void ppu_pixel(Ppu *p, Uint8 *layer, Uint16 x, Uint16 y, Uint8 color);
27 28
 void ppu_1bpp(Ppu *p, Uint8 *layer, Uint16 x, Uint16 y, Uint8 *sprite, Uint8 color, Uint8 flipx, Uint8 flipy);
28 29
 void ppu_2bpp(Ppu *p, Uint8 *layer, Uint16 x, Uint16 y, Uint8 *sprite, Uint8 color, Uint8 flipx, Uint8 flipy);
... ...
@@ -298,6 +298,21 @@ update_palette(Uint8 *addr)
298 298
 	reqdraw = 1;
299 299
 }
300 300
 
301
+void
302
+set_size(Uxn *u, Uint16 width, Uint16 height)
303
+{
304
+	ppu_resize(&ppu, width / 8, height / 8);
305
+	gRect.w = ppu.width;
306
+	gRect.h = ppu.height;
307
+	if(!(ppu_screen = realloc(ppu_screen, ppu.width * ppu.height * sizeof(Uint32))))
308
+		return;
309
+	SDL_DestroyTexture(gTexture);
310
+	SDL_RenderSetLogicalSize(gRenderer, ppu.width + PAD * 2, ppu.height + PAD * 2);
311
+	gTexture = SDL_CreateTexture(gRenderer, SDL_PIXELFORMAT_ARGB8888, SDL_TEXTUREACCESS_STATIC, ppu.width + PAD * 2, ppu.height + PAD * 2);
312
+	SDL_SetWindowSize(gWindow, (ppu.width + PAD * 2) * zoom, (ppu.height + PAD * 2) * zoom);
313
+	redraw(u);
314
+}
315
+
301 316
 #pragma mark - Devices
302 317
 
303 318
 static int
... ...
@@ -331,7 +346,13 @@ console_talk(Device *d, Uint8 b0, Uint8 w)
331 346
 static int
332 347
 screen_talk(Device *d, Uint8 b0, Uint8 w)
333 348
 {
334
-	if(w && b0 == 0xe) {
349
+	if(!w)
350
+		return 1;
351
+	if(b0 == 0x3)
352
+		set_size(d->u, peek16(d->dat, 0x2), ppu.height);
353
+	else if(b0 == 0x5)
354
+		set_size(d->u, ppu.width, peek16(d->dat, 0x4));
355
+	else if(b0 == 0xe) {
335 356
 		Uint16 x = peek16(d->dat, 0x8);
336 357
 		Uint16 y = peek16(d->dat, 0xa);
337 358
 		Uint8 layer = d->dat[0xe] & 0x40;
... ...
@@ -339,7 +360,7 @@ screen_talk(Device *d, Uint8 b0, Uint8 w)
339 360
 		if(d->dat[0x6] & 0x01) poke16(d->dat, 0x8, x + 1); /* auto x+1 */
340 361
 		if(d->dat[0x6] & 0x02) poke16(d->dat, 0xa, y + 1); /* auto y+1 */
341 362
 		reqdraw = 1;
342
-	} else if(w && b0 == 0xf) {
363
+	} else if(b0 == 0xf) {
343 364
 		Uint16 x = peek16(d->dat, 0x8);
344 365
 		Uint16 y = peek16(d->dat, 0xa);
345 366
 		Uint8 layer = d->dat[0xf] & 0x40;