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