shithub: sms

Download patch

ref: 7994035e34128acee2c2b16abcb2f9d1b69ed29c
parent: bbdafbb399c4cd8b627ba2bbbead7bd349952069
author: Jean-André Santoni <jean.andre.santoni@gmail.com>
date: Mon Jan 12 07:03:10 EST 2026

Latch scroll and use the right color for the left column

--- a/vdp.c
+++ b/vdp.c
@@ -16,6 +16,8 @@
 static int xmax, xdisp;
 enum { ymax = 262, yvbl = 234 };
 int vdpy = ymax-1;
+static u8int scrollx;
+static int scrolly;
 
 void
 vdpmode(void)
@@ -54,7 +56,7 @@
 
 	int y = vdpy;
 	if(!((reg[MODE1] & 1 << 7) && vdpx >= 192))
-		y += reg[VERSCR];
+		y += scrolly;
 	if(ext224)
 		y &= 0xff;
 	else if(y >= 224)
@@ -62,7 +64,7 @@
 	int ty = y >> 3;
 	int tyoff = y & 7;
 
-	u8int x = vdpx - reg[HORSCR];
+	u8int x = vdpx - scrollx;
 	int tx = x >> 3;
 	int txoff = x & 7;
 
@@ -244,20 +246,26 @@
 	int disph = ((reg[MODE1] & 0x06) == 0x06) && ((reg[MODE2] & 0x18) == 0x10) ? 224 : 192;
 	if(vdpx == 0)
 		spritesinit();
+	if(vdpx == 0){
+		scrollx = reg[HORSCR];
+		if(vdpy == 0)
+			scrolly = reg[VERSCR];
+	}
 
 	if(vdpx < 320 && vdpy < disph)
 		if(vdpx < xdisp){
 			int c = (reg[BGCOL] & 0x0f) + 16;
-			pixeldraw(vdpx, vdpy, c);
+			pixeldraw(vdpx, vdpy, cramc[c]);
 			planes();
 			sprites();
 		}else
-			pixeldraw(vdpx, vdpy, 0xcccccc);
+			pixeldraw(vdpx, vdpy, cramc[(reg[BGCOL] & 0x0f) + 16]);
 	if(++vdpx >= xmax){
 		z80irq = 0;
 		vdpx = 0;
 		if(++vdpy >= ymax){
 			vdpy = 0;
+			scrolly = reg[VERSCR];
 			irq &= ~INTVBL;
 			vdpstat &= ~(STATINT | STATOVR | STATCOLL);
 			flush();
--