shithub: sms

Download patch

ref: 6d9e0773724cdcd6a5159e4cf342a5c5a42195d2
parent: 3774586cf5fa1e79538ef024f48017a7090bcfe6
author: Jean-André Santoni <jean.andre.santoni@gmail.com>
date: Fri Feb 27 11:06:29 EST 2026

Fix viewport

--- a/sms.c
+++ b/sms.c
@@ -89,7 +89,7 @@
 	if(argc < 1)
 		usage();
 	loadrom(*argv);
-	initemu(320, 224, 4, XRGB32, 1, nil);
+	initemu(256, 224, 4, XRGB32, 1, nil);
 	regkey("a", 'c', 1<<4);
 	regkey("b", 'x', 1<<5);
 	regkey("start", '\n', 1<<6);
--- a/vdp.c
+++ b/vdp.c
@@ -13,7 +13,7 @@
 int vdpx = 0, vdpyy, frame, intla;
 int first = 1;
 u16int hctr;
-static int xmax, xdisp;
+static int xmax, xdisp, ydisp;
 enum { ymax = 262, yvbl = 234 };
 int vdpy = ymax-1;
 static u8int scrollx;
@@ -24,6 +24,7 @@
 {
 	xmax = 320;
 	xdisp = 256;
+	ydisp = 224;
 }
 
 static void
@@ -32,7 +33,9 @@
 	u32int *p;
 	union { u32int l; u8int b[4]; } u;
 
-	p = (u32int *)pic + (x + y * 320);
+	if(x < 0 || x >= xdisp || y < 0 || y >= ydisp)
+		return;
+	p = (u32int *)pic + (x + y * xdisp);
 	u.b[0] = v >> 16;
 	u.b[1] = v >> 8;
 	u.b[2] = v;
@@ -253,14 +256,15 @@
 			scrolly = reg[VERSCR];
 	}
 
-	if(vdpx < 320 && vdpy < disph)
-		if(vdpx < xdisp){
+	if(vdpx < xdisp && vdpy < ydisp){
+		if(vdpy < disph){
 			int c = (reg[BGCOL] & 0x0f) + 16;
 			pixeldraw(vdpx, vdpy, cramc[c]);
 			planes();
 			sprites();
 		}else
-			pixeldraw(vdpx, vdpy, cramc[(reg[BGCOL] & 0x0f) + 16]);
+			pixeldraw(vdpx, vdpy, 0);
+	}
 	if(++vdpx >= xmax){
 		z80irq = 0;
 		vdpx = 0;
--