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();
--
⑨