improved 2-cell vscroll emulation accuracy (fixes Cutie Suzuki no Ringside Angel left-most column)

This commit is contained in:
ekeeke31 2010-07-30 21:26:06 +00:00
parent 7baad4c52e
commit 21e263dd25
2 changed files with 34 additions and 8 deletions

View File

@ -28,6 +28,7 @@ of samples per frame and keeping PSG & FM chips in sync.
* added support for some undocumented mode register bits
* added proper emulation of HV Counter latch: fixes Sunset Riders intro
* added pixel-accurate emulation of mid-line display on/off (Nigel Mansell World Championship PAL, Ren & Stimpy's Invention PAL,...)
* improved 2-cell vscroll emulation accuracy (left-most column in Gynoug, Cutie Suzuki no Ringside Angel, Formula One, Kawasaki Superbike Challenge)
* improved FIFO timings accuracy: fixes Sol Deace intro
* improved sprite masking accuracy (thanks to Nemesis for his test program)
* improved sprites processing accuracy: fixes (un)masked sprites in Mickey Mania (3D level), Sonic 2 (VS mode).

View File

@ -1083,8 +1083,15 @@ static void render_bg_vs(int line, int width)
if(shift)
{
dst = (uint32 *)&buf[0x10 + shift];
nt = (uint32 *)&vram[ntbb + (((line >> 3) << pf_shift) & 0x1FC0)];
v_line = (line & 7) << 3;
#ifdef LSB_FIRST
v_line = (line + (vs[19] & 0x3FF)) & pf_row_mask;
#else
v_line = (line + ((vs[19] >> 16) & 0x3FF)) & pf_row_mask;
#endif
nt = (uint32 *)&vram[ntbb + (((v_line >> 3) << pf_shift) & 0x1FC0)];
v_line = (v_line & 7) << 3;
atbuf = nt[(index-1) & pf_col_mask];
DRAW_COLUMN(atbuf, v_line)
@ -1145,8 +1152,14 @@ static void render_bg_vs(int line, int width)
if(shift)
{
dst = (uint32 *)&buf[0x10 + shift + (start<<4)];
nt = (uint32 *)&vram[ntab + (((line >> 3) << pf_shift) & 0x1FC0)];
v_line = (line & 7) << 3;
#ifdef LSB_FIRST
v_line = (line + ((vs[19] >> 16) & 0x3FF)) & pf_row_mask;
#else
v_line = (line + (vs[19] & 0x3FF)) & pf_row_mask;
#endif
nt = (uint32 *)&vram[ntab + (((v_line >> 3) << pf_shift) & 0x1FC0)];
v_line = (v_line & 7) << 3;
/* Window bug */
if (start) atbuf = nt[index & pf_col_mask];
@ -1343,8 +1356,14 @@ static void render_bg_im2_vs(int line, int width, int odd)
if(shift)
{
dst = (uint32 *)&buf[0x10 + shift];
nt = (uint32 *)&vram[ntbb + (((line >> 3) << pf_shift) & 0x1FC0)];
v_line = (((line & 7) << 1) | odd) << 3;
#ifdef LSB_FIRST
v_line = (line + ((vs[19] >> 1) & 0x3FF)) & pf_row_mask;
#else
v_line = (line + ((vs[19] >> 17) & 0x3FF)) & pf_row_mask;
#endif
nt = (uint32 *)&vram[ntbb + (((v_line >> 3) << pf_shift) & 0x1FC0)];
v_line = (((v_line & 7) << 1) | odd) << 3;
atbuf = nt[(index-1) & pf_col_mask];
DRAW_COLUMN_IM2(atbuf, v_line)
@ -1403,8 +1422,14 @@ static void render_bg_im2_vs(int line, int width, int odd)
if(shift)
{
dst = (uint32 *)&buf[0x10 + shift + (start<<4)];
nt = (uint32 *)&vram[ntab + (((line >> 3) << pf_shift) & 0x1FC0)];
v_line = (((line & 7) << 1) | odd) << 3;
#ifdef LSB_FIRST
v_line = (line + ((vs[19] >> 17) & 0x3FF)) & pf_row_mask;
#else
v_line = (line + ((vs[19] >> 1) & 0x3FF)) & pf_row_mask;
#endif
nt = (uint32 *)&vram[ntab + (((v_line >> 3) << pf_shift) & 0x1FC0)];
v_line = (((v_line & 7) << 1) | odd) << 3;
/* Window bug */
if (start) atbuf = nt[index & pf_col_mask];