[Core/VDP] fixed first frame VINT occurrence

This commit is contained in:
EkeEke 2016-10-15 14:07:50 +02:00
parent 2a410a66a9
commit 1f169d76e5

View File

@ -434,13 +434,10 @@ void system_frame_gen(int do_skip)
}
}
/* initialize VCounter */
v_counter = bitmap.viewport.h;
/* first line of overscan */
if (bitmap.viewport.y)
{
blank_line(v_counter, -bitmap.viewport.x, bitmap.viewport.w + 2*bitmap.viewport.x);
blank_line(bitmap.viewport.h, -bitmap.viewport.x, bitmap.viewport.w + 2*bitmap.viewport.x);
}
/* clear DMA Busy, FIFO FULL & field flags */
@ -481,6 +478,12 @@ void system_frame_gen(int do_skip)
/* refresh inputs just before VINT (Warriors of Eternal Sun) */
osd_input_update();
/* VDP always starts after VBLANK so VINT cannot occur on first frame after a VDP reset (verified on real hardware) */
if (v_counter != bitmap.viewport.h)
{
/* reinitialize VCounter */
v_counter = bitmap.viewport.h;
/* delay between VBLANK flag & Vertical Interrupt (Dracula, OutRunners, VR Troopers) */
m68k_run(788);
if (zstate == 1)
@ -505,6 +508,7 @@ void system_frame_gen(int do_skip)
/* assert Z80 interrupt */
Z80.irq_state = ASSERT_LINE;
}
/* run 68k & Z80 until end of line */
m68k_run(MCYCLES_PER_LINE);
@ -789,13 +793,10 @@ void system_frame_scd(int do_skip)
}
}
/* initialize VCounter */
v_counter = bitmap.viewport.h;
/* first line of overscan */
if (bitmap.viewport.y)
{
blank_line(v_counter, -bitmap.viewport.x, bitmap.viewport.w + 2*bitmap.viewport.x);
blank_line(bitmap.viewport.h, -bitmap.viewport.x, bitmap.viewport.w + 2*bitmap.viewport.x);
}
/* clear DMA Busy, FIFO FULL & field flags */
@ -836,6 +837,12 @@ void system_frame_scd(int do_skip)
/* refresh inputs just before VINT */
osd_input_update();
/* VDP always starts after VBLANK so VINT cannot occur on first frame after a VDP reset (verified on real hardware) */
if (v_counter != bitmap.viewport.h)
{
/* reinitialize VCounter */
v_counter = bitmap.viewport.h;
/* delay between VBLANK flag & Vertical Interrupt (Dracula, OutRunners, VR Troopers) */
m68k_run(788);
if (zstate == 1)
@ -860,6 +867,7 @@ void system_frame_scd(int do_skip)
/* assert Z80 interrupt */
Z80.irq_state = ASSERT_LINE;
}
/* run both 68k & CD hardware until end of line */
scd_update(MCYCLES_PER_LINE);