ref: 41ef4524abb81254169a47898572547c0db5a666
parent: f55c43fe8d859ddf709effc5d09ad7a8057711e8
author: aiju <devnull@localhost>
date: Sat Nov 22 14:40:36 EST 2014
games/md: interlacing, sort of
--- a/sys/src/games/md/dat.h
+++ b/sys/src/games/md/dat.h
@@ -23,7 +23,7 @@
extern u16int vram[32768], vsram[40];
extern u32int cramc[64];
extern u16int vdpstat;
-extern int vdpx, vdpy;
+extern int vdpx, vdpy, frame, intla;
extern u8int ym[512], ymstat;
--- a/sys/src/games/md/mem.c
+++ b/sys/src/games/md/mem.c
@@ -180,6 +180,8 @@
v = vdpx - (vdpx >= 360 ? 406 : 0);
else
v = vdpx - (vdpx >= 296 ? 342 : 0);
+ if(intla)
+ return vdpy - (vdpy >= 234 ? 5 : 0) << 8 & 0xfe00 | frame << 8 | v >> 1 & 0xff;
return vdpy - (vdpy >= 234 ? 5 : 0) << 8 | v >> 1 & 0xff;
default:
goto invalid;
--- a/sys/src/games/md/vdp.c
+++ b/sys/src/games/md/vdp.c
@@ -6,11 +6,12 @@
u8int pic[320*224*4*3];
u16int vdpstat = 0x3400;
-int vdpx, vdpy;
+int vdpx, vdpy, vdpyy, frame, intla;
u16int hctr;
-static int xmax, xdisp, ymax = 262, yvbl = 234;
+static int xmax, xdisp;
static int sx, snx, col, pri, lum;
enum { DARK, NORM, BRIGHT };
+enum { ymax = 262, yvbl = 234 };
void
vdpmode(void)
@@ -22,6 +23,7 @@
xdisp = 256;
xmax = 342;
}
+ intla = (reg[MODE4] & 6) == 6;
}
static void
@@ -43,6 +45,8 @@
u.b[2] = v;
u.b[3] = 0;
if(scale == 2){
+ if(intla)
+ y = y << 1 | frame;
q = (u32int*)pic + (x + y * 320) * 2;
q[0] = u.w;
q[1] = u.w;
@@ -97,9 +101,15 @@
a += p->tx;
p->t = vram[a];
y = p->tny;
- if((p->t & 0x1000) != 0)
- y = 7 - y;
- a = (p->t & 0x7ff) << 4 | y << 1;
+ if(intla){
+ if((p->t & 0x1000) != 0)
+ y = 15 - y;
+ a = (p->t & 0x7ff) << 5 | y << 1;
+ }else{
+ if((p->t & 0x1000) != 0)
+ y = 7 - y;
+ a = (p->t & 0x7ff) << 4 | y << 1;
+ }
p->c = vram[a] << 16 | vram[a+1];
}
@@ -129,9 +139,15 @@
v = -(vram[a + i] & 0x3ff);
p->tnx = v & 7;
p->tx = v >> 3 & pctxt[i].w - 1;
- v = vsram[i] + vdpy;
- p->tny = v & 7;
- p->ty = v >> 3 & pctxt[i].h - 1;
+ if(intla){
+ v = vsram[i] + vdpyy;
+ p->tny = v & 15;
+ p->ty = v >> 4 & pctxt[i].h - 1;
+ }else{
+ v = vsram[i] + vdpy;
+ p->tny = v & 7;
+ p->ty = v >> 3 & pctxt[i].h - 1;
+ }
tile(p);
if(p->tnx != 0)
if((p->t & 0x800) != 0)
@@ -237,9 +253,15 @@
np = 0;
nt = 0;
do{
- q->y = (p[0] & 0x3ff) - 128;
- q->h = (p[1] >> 8 & 3) + 1 << 3;
- dy = vdpy - q->y;
+ if(intla){
+ q->y = (p[0] & 0x3ff) - 256;
+ q->h = (p[1] >> 8 & 3) + 1 << 4;
+ dy = vdpyy - q->y;
+ }else{
+ q->y = (p[0] & 0x3ff) - 128;
+ q->h = (p[1] >> 8 & 3) + 1 << 3;
+ dy = vdpy - q->y;
+ }
if(dy >= q->h)
continue;
q->t = p[2];
@@ -249,7 +271,7 @@
if(q->x == 0xff80)
break;
q->w = (p[1] >> 10 & 3) + 1 << 3;
- c = ((q->t & 0x7ff) << 4) + (dy << 1);
+ c = ((q->t & 0x7ff) << 4+intla) + (dy << 1);
for(i = 0; i < q->w >> 3 && np < xdisp; i++){
v = vram[c] << 16 | vram[(u16int)(c+1)];
c += q->h << 1;
@@ -354,6 +376,8 @@
vdpstat &= ~(STATINT | STATVBL | STATOVR | STATCOLL);
flush();
}
+ if(intla)
+ vdpyy = vdpy << 1 | frame;
if(vdpy == 0 || vdpy >= 225)
hctr = reg[HORCTR];
else
@@ -364,6 +388,7 @@
}
if(vdpy == yvbl){
vdpstat |= STATVBL | STATINT;
+ frame ^= 1;
z80irq = 1;
if((reg[MODE2] & IE0) != 0)
irq |= INTVBL;