changeset 710:4cd8823f79e3

First pass at emulating a vscroll latch. Titan's Overdrive demo seems to depend on the scroll value being latched early in the line before the HINT gets a chance to change it
author Michael Pavone <pavone@retrodev.com>
date Sat, 16 May 2015 23:04:57 -0700
parents 3f065c20423c
children 3342548de036
files vdp.c vdp.h
diffstat 2 files changed, 7 insertions(+), 1 deletions(-) [+]
line wrap: on
line diff
--- a/vdp.c	Sat May 16 22:42:26 2015 -0700
+++ b/vdp.c	Sat May 16 23:04:57 2015 -0700
@@ -657,7 +657,12 @@
 		vscroll <<= 1;
 		vscroll |= 1;
 	}
-	vscroll &= (context->vsram[(context->regs[REG_MODE_3] & BIT_VSCROLL ? (column-2)&63 : 0) + vsram_off] + line);
+	//TODO: Further research on vscroll latch behavior and the "first column bug" seen in Gynoug
+	//this should be close, but won't match the exact behavior Eke-Eke has written about
+	if (column == 2 || (column && (context->regs[REG_MODE_3] & BIT_VSCROLL))) {
+		context->vscroll_latch[vsram_off] = context->vsram[column - 2 + vsram_off];
+	}
+	vscroll &= context->vscroll_latch[vsram_off] + line;
 	context->v_offset = vscroll & v_offset_mask;
 	//printf("%s | line %d, vsram: %d, vscroll: %d, v_offset: %d\n",(vsram_off ? "B" : "A"), line, context->vsram[context->regs[REG_MODE_3] & 0x4 ? column : 0], vscroll, context->v_offset);
 	vscroll >>= vscroll_shift;
--- a/vdp.h	Sat May 16 22:42:26 2015 -0700
+++ b/vdp.h	Sat May 16 23:04:57 2015 -0700
@@ -143,6 +143,7 @@
 	uint32_t    colors[CRAM_SIZE*3];
 	uint32_t    debugcolors[1 << (3 + 1 + 1 + 1)];//3 bits for source, 1 bit for priority, 1 bit for shadow, 1 bit for hilight
 	uint16_t    vsram[VSRAM_SIZE];
+	uint16_t    vscroll_latch[2];
 	uint32_t    frame;
 	uint16_t    vcounter;
 	uint16_t    hslot; //hcounter/2