# HG changeset patch # User Michael Pavone # Date 1431842697 25200 # Node ID 4cd8823f79e3e25d9c881e644d72fde588f82768 # Parent 3f065c20423c6f7f481f605a83ec4d05cc209d3c 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 diff -r 3f065c20423c -r 4cd8823f79e3 vdp.c --- 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; diff -r 3f065c20423c -r 4cd8823f79e3 vdp.h --- 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