diff --git a/src/mame/includes/megadriv.h b/src/mame/includes/megadriv.h index 6a455d8c4f5..be604fd5345 100644 --- a/src/mame/includes/megadriv.h +++ b/src/mame/includes/megadriv.h @@ -407,4 +407,3 @@ private: /* machine/megavdp.c */ extern int megadrive_total_scanlines; -extern int megadrive_vblank_flag; diff --git a/src/mame/machine/mega32x.c b/src/mame/machine/mega32x.c index 1fb2bd65af9..0499ec9a386 100644 --- a/src/mame/machine/mega32x.c +++ b/src/mame/machine/mega32x.c @@ -1017,16 +1017,16 @@ READ16_MEMBER( sega_32x_device::_32x_common_vdp_regs_r ) UINT16 hpos = get_hposition(); int megadrive_hblank_flag = 0; - if (megadrive_vblank_flag) retdata |= 0x8000; + if (m_32x_vblank_flag) retdata |= 0x8000; if (hpos>400) megadrive_hblank_flag = 1; if (hpos>460) megadrive_hblank_flag = 0; if (megadrive_hblank_flag) retdata |= 0x4000; - if (megadrive_vblank_flag) { retdata |= 2; } // framebuffer approval (TODO: condition is unknown at current time) + if (m_32x_vblank_flag) { retdata |= 2; } // framebuffer approval (TODO: condition is unknown at current time) - if (megadrive_hblank_flag && megadrive_vblank_flag) { retdata |= 0x2000; } // palette approval (TODO: active high or low?) + if (megadrive_hblank_flag && m_32x_vblank_flag) { retdata |= 0x2000; } // palette approval (TODO: active high or low?) return retdata; } @@ -1597,6 +1597,7 @@ void sega_32x_device::_32x_interrupt_cb(int scanline, int irq6) { if (scanline == irq6) { + m_32x_vblank_flag = 1; m_sh2_master_vint_pending = 1; m_sh2_slave_vint_pending = 1; _32x_check_irqs(); diff --git a/src/mame/machine/mega32x.h b/src/mame/machine/mega32x.h index 9a514edd447..2557f0cef57 100644 --- a/src/mame/machine/mega32x.h +++ b/src/mame/machine/mega32x.h @@ -120,6 +120,7 @@ public: /* our main vblank handler resets this */ int m_32x_hcount_compare_val; + int m_32x_vblank_flag; int m_sh2_are_running; int m_32x_240mode; UINT16 m_32x_a1518a_reg; diff --git a/src/mame/machine/megadriv.c b/src/mame/machine/megadriv.c index 2196b907a86..a0cdaf51208 100644 --- a/src/mame/machine/megadriv.c +++ b/src/mame/machine/megadriv.c @@ -1165,8 +1165,11 @@ void md_base_state::screen_eof_megadriv(screen_device &screen, bool state) m_vdp->vdp_handle_eof(); m_vdp->m_megadriv_scanline_timer->adjust(attotime::zero); - if (m_32x) + if (m_32x) + { + m_32x->m_32x_vblank_flag = 0; m_32x->m_32x_hcount_compare_val = -1; + } } } } diff --git a/src/mame/machine/megavdp.c b/src/mame/machine/megavdp.c index 9c0f2e7b474..5f5b015b501 100644 --- a/src/mame/machine/megavdp.c +++ b/src/mame/machine/megavdp.c @@ -12,7 +12,6 @@ /* external gunk still has dependencies on these */ int megadrive_total_scanlines; -int megadrive_vblank_flag = 0; const device_type SEGA_GEN_VDP = &device_creator; @@ -148,6 +147,7 @@ void sega_genesis_vdp_device::device_start() save_item(NAME(m_irq6_scanline)); save_item(NAME(m_z80irq_scanline)); save_item(NAME(m_scanline_counter)); + save_item(NAME(m_vblank_flag)); m_sprite_renderline = auto_alloc_array(machine(), UINT8, 1024); m_highpri_renderline = auto_alloc_array(machine(), UINT8, 320); @@ -212,6 +212,7 @@ void sega_genesis_vdp_device::device_reset() megadrive_irq6_pending = 0; megadrive_irq4_pending = 0; m_scanline_counter = 0; + m_vblank_flag = 0; sega315_5124_device::device_reset(); } @@ -986,7 +987,7 @@ UINT16 sega_genesis_vdp_device::megadriv_vdp_ctrl_port_r() int megadrive_odd_frame = m_imode_odd_frame^1; int megadrive_hblank_flag = 0; int megadrive_dma_active = 0; - int vblank; + int vblank = m_vblank_flag; int fifo_empty = 1; int fifo_full = 0; @@ -995,8 +996,6 @@ UINT16 sega_genesis_vdp_device::megadriv_vdp_ctrl_port_r() if (hpos>400) megadrive_hblank_flag = 1; if (hpos>460) megadrive_hblank_flag = 0; - vblank = megadrive_vblank_flag; - /* extra case */ if (MEGADRIVE_REG01_DISP_ENABLE==0) vblank = 1; @@ -2623,7 +2622,7 @@ void sega_genesis_vdp_device::vdp_handle_scanline_callback(int scanline) // mame_printf_debug("x %d",genesis_get_scanline_counter()); irq6_on_timer->adjust(attotime::from_usec(6)); megadrive_irq6_pending = 1; - megadrive_vblank_flag = 1; + m_vblank_flag = 1; } @@ -2682,7 +2681,7 @@ void sega_genesis_vdp_device::vdp_handle_eof() rectangle visarea; int scr_width = 320; - megadrive_vblank_flag = 0; + m_vblank_flag = 0; //megadrive_irq6_pending = 0; /* NO! (breaks warlock) */ /* Set it to -1 here, so it becomes 0 when the first timer kicks in */ diff --git a/src/mame/machine/megavdp.h b/src/mame/machine/megavdp.h index 53a45905fb9..155fcfde977 100644 --- a/src/mame/machine/megavdp.h +++ b/src/mame/machine/megavdp.h @@ -272,6 +272,7 @@ private: int megadrive_irq6_pending; int megadrive_irq4_pending; int m_scanline_counter; + int m_vblank_flag; int megadrive_imode;