mirror of
https://github.com/ekeeke/Genesis-Plus-GX.git
synced 2024-12-27 11:41:48 +01:00
[Core/VDP] improved VDP status timing accuracy
This commit is contained in:
parent
381a9d114f
commit
9365ac2b55
@ -95,6 +95,7 @@ Genesis Plus GX 1.7.5 (xx/xx/xxxx) (Eke-Eke)
|
|||||||
* improved Mode 5 sprites rendering timings (fixes "Overdrive" demo)
|
* improved Mode 5 sprites rendering timings (fixes "Overdrive" demo)
|
||||||
* improved FIFO timings accuracy (fixes "Overdrive" Demo)
|
* improved FIFO timings accuracy (fixes "Overdrive" Demo)
|
||||||
* improved H-Counter accuracy in H32 mode
|
* improved H-Counter accuracy in H32 mode
|
||||||
|
* improved VDP status timing accuracy
|
||||||
* improved accuracy of Master System color palette brightness range (verified against real hardware)
|
* improved accuracy of Master System color palette brightness range (verified against real hardware)
|
||||||
* fixed misaligned buffer writes in Mode 4 when -DALIGN_LONG option is used
|
* fixed misaligned buffer writes in Mode 4 when -DALIGN_LONG option is used
|
||||||
* fixed alpha channel for 15-bit (RGB555) and 32-bit (RGB888) color support
|
* fixed alpha channel for 15-bit (RGB555) and 32-bit (RGB888) color support
|
||||||
|
Binary file not shown.
Binary file not shown.
Before Width: | Height: | Size: 3.2 MiB After Width: | Height: | Size: 3.2 MiB |
Binary file not shown.
Before Width: | Height: | Size: 3.3 MiB After Width: | Height: | Size: 3.3 MiB |
@ -481,12 +481,6 @@ void system_frame_gen(int do_skip)
|
|||||||
/* refresh inputs just before VINT (Warriors of Eternal Sun) */
|
/* refresh inputs just before VINT (Warriors of Eternal Sun) */
|
||||||
osd_input_update();
|
osd_input_update();
|
||||||
|
|
||||||
/* delay between VINT flag & Vertical Interrupt (Ex-Mutants, Tyrant) */
|
|
||||||
m68k_run(588);
|
|
||||||
|
|
||||||
/* set VINT flag */
|
|
||||||
status |= 0x80;
|
|
||||||
|
|
||||||
/* delay between VBLANK flag & Vertical Interrupt (Dracula, OutRunners, VR Troopers) */
|
/* delay between VBLANK flag & Vertical Interrupt (Dracula, OutRunners, VR Troopers) */
|
||||||
m68k_run(788);
|
m68k_run(788);
|
||||||
if (zstate == 1)
|
if (zstate == 1)
|
||||||
@ -498,6 +492,9 @@ void system_frame_gen(int do_skip)
|
|||||||
Z80.cycles = 788;
|
Z80.cycles = 788;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/* set VINT flag */
|
||||||
|
status |= 0x80;
|
||||||
|
|
||||||
/* Vertical Interrupt */
|
/* Vertical Interrupt */
|
||||||
vint_pending = 0x20;
|
vint_pending = 0x20;
|
||||||
if (reg[1] & 0x20)
|
if (reg[1] & 0x20)
|
||||||
@ -853,12 +850,6 @@ void system_frame_scd(int do_skip)
|
|||||||
/* refresh inputs just before VINT */
|
/* refresh inputs just before VINT */
|
||||||
osd_input_update();
|
osd_input_update();
|
||||||
|
|
||||||
/* delay between VINT flag & Vertical Interrupt (Ex-Mutants, Tyrant) */
|
|
||||||
m68k_run(588);
|
|
||||||
|
|
||||||
/* set VINT flag */
|
|
||||||
status |= 0x80;
|
|
||||||
|
|
||||||
/* delay between VBLANK flag & Vertical Interrupt (Dracula, OutRunners, VR Troopers) */
|
/* delay between VBLANK flag & Vertical Interrupt (Dracula, OutRunners, VR Troopers) */
|
||||||
m68k_run(788);
|
m68k_run(788);
|
||||||
if (zstate == 1)
|
if (zstate == 1)
|
||||||
@ -870,6 +861,9 @@ void system_frame_scd(int do_skip)
|
|||||||
Z80.cycles = 788;
|
Z80.cycles = 788;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/* set VINT flag */
|
||||||
|
status |= 0x80;
|
||||||
|
|
||||||
/* Vertical Interrupt */
|
/* Vertical Interrupt */
|
||||||
vint_pending = 0x20;
|
vint_pending = 0x20;
|
||||||
if (reg[1] & 0x20)
|
if (reg[1] & 0x20)
|
||||||
|
@ -1134,6 +1134,9 @@ unsigned int vdp_68k_ctrl_r(unsigned int cycles)
|
|||||||
{
|
{
|
||||||
unsigned int temp;
|
unsigned int temp;
|
||||||
|
|
||||||
|
/* Cycle-accurate VDP status read (68k read cycle takes four CPU cycles i.e 28 Mcycles) */
|
||||||
|
cycles += 4 * 7;
|
||||||
|
|
||||||
/* Update FIFO status flags if not empty */
|
/* Update FIFO status flags if not empty */
|
||||||
if (fifo_write_cnt)
|
if (fifo_write_cnt)
|
||||||
{
|
{
|
||||||
@ -1160,14 +1163,25 @@ unsigned int vdp_68k_ctrl_r(unsigned int cycles)
|
|||||||
/* Clear SOVR & SCOL flags */
|
/* Clear SOVR & SCOL flags */
|
||||||
status &= 0xFF9F;
|
status &= 0xFF9F;
|
||||||
|
|
||||||
/* Display OFF: VBLANK flag is set */
|
/* VBLANK flag is set when display is disabled */
|
||||||
if (!(reg[1] & 0x40))
|
if (!(reg[1] & 0x40))
|
||||||
{
|
{
|
||||||
temp |= 0x08;
|
temp |= 0x08;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* HBLANK flag (Sonic 3 and Sonic 2 "VS Modes", Lemmings 2, Mega Turrican, V.R Troopers, Gouketsuji Ichizoku,...) */
|
/* Cycle-accurate VINT flag (Ex-Mutants, Tyrant / Mega-Lo-Mania) */
|
||||||
/* NB: this is not 100% accurate and need to be verified on real hardware */
|
/* this allows VINT flag to be read just before vertical interrupt is being triggered */
|
||||||
|
if ((v_counter == bitmap.viewport.h) && (cycles >= (mcycles_vdp + 788)))
|
||||||
|
{
|
||||||
|
/* check Z80 interrupt state to assure VINT has not already been triggered (and flag cleared) */
|
||||||
|
if (Z80.irq_state != ASSERT_LINE)
|
||||||
|
{
|
||||||
|
temp |= 0x80;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Cycle-accurate HBLANK flag (Sonic 3 & Sonic 2 "VS Modes", Bugs Bunny Double Trouble, Lemmings 2, Mega Turrican, V.R Troopers, Gouketsuji Ichizoku,...) */
|
||||||
|
/* NB: this is not 100% accurate (see hvc.h for horizontal events timings in H32 and H40 mode) but is close enough to make no noticeable difference for games */
|
||||||
if ((cycles % MCYCLES_PER_LINE) < 588)
|
if ((cycles % MCYCLES_PER_LINE) < 588)
|
||||||
{
|
{
|
||||||
temp |= 0x04;
|
temp |= 0x04;
|
||||||
|
Loading…
Reference in New Issue
Block a user