diff options
Diffstat (limited to 'src/devices/video/cdp1861.cpp')
-rw-r--r-- | src/devices/video/cdp1861.cpp | 133 |
1 files changed, 62 insertions, 71 deletions
diff --git a/src/devices/video/cdp1861.cpp b/src/devices/video/cdp1861.cpp index 03bcd3e0e90..ca59bc51eee 100644 --- a/src/devices/video/cdp1861.cpp +++ b/src/devices/video/cdp1861.cpp @@ -109,15 +109,10 @@ void cdp1861_device::device_config_complete() void cdp1861_device::device_start() { - // resolve callbacks - m_write_int.resolve_safe(); - m_write_dma_out.resolve_safe(); - m_write_efx.resolve_safe(); - // allocate timers - m_int_timer = timer_alloc(TIMER_INT); - m_efx_timer = timer_alloc(TIMER_EFX); - m_dma_timer = timer_alloc(TIMER_DMA); + m_int_timer = timer_alloc(FUNC(cdp1861_device::int_tick), this); + m_efx_timer = timer_alloc(FUNC(cdp1861_device::efx_tick), this); + m_dma_timer = timer_alloc(FUNC(cdp1861_device::dma_tick), this); // find devices screen().register_screen_bitmap(m_bitmap); @@ -151,91 +146,87 @@ void cdp1861_device::device_reset() //------------------------------------------------- -// device_timer - handle timer events +// timer events //------------------------------------------------- -void cdp1861_device::device_timer(emu_timer &timer, device_timer_id id, int param, void *ptr) +TIMER_CALLBACK_MEMBER(cdp1861_device::int_tick) { - int scanline = screen().vpos(); - - switch (id) + if (screen().vpos() == SCANLINE_INT_START) { - case TIMER_INT: - if (scanline == SCANLINE_INT_START) + if (m_disp) { - if (m_disp) - { - m_write_int(ASSERT_LINE); - } - - m_int_timer->adjust(screen().time_until_pos( SCANLINE_INT_END, 0)); + m_write_int(ASSERT_LINE); } - else - { - if (m_disp) - { - m_write_int(CLEAR_LINE); - } - m_int_timer->adjust(screen().time_until_pos(SCANLINE_INT_START, 0)); + m_int_timer->adjust(screen().time_until_pos( SCANLINE_INT_END, 0)); + } + else + { + if (m_disp) + { + m_write_int(CLEAR_LINE); } + + m_int_timer->adjust(screen().time_until_pos(SCANLINE_INT_START, 0)); + } +} + +TIMER_CALLBACK_MEMBER(cdp1861_device::efx_tick) +{ + switch (screen().vpos()) + { + case SCANLINE_EFX_TOP_START: + m_write_efx(ASSERT_LINE); + m_efx_timer->adjust(screen().time_until_pos(SCANLINE_EFX_TOP_END, 0)); break; - case TIMER_EFX: - switch (scanline) - { - case SCANLINE_EFX_TOP_START: - m_write_efx(ASSERT_LINE); - m_efx_timer->adjust(screen().time_until_pos(SCANLINE_EFX_TOP_END, 0)); - break; - - case SCANLINE_EFX_TOP_END: - m_write_efx(CLEAR_LINE); - m_efx_timer->adjust(screen().time_until_pos(SCANLINE_EFX_BOTTOM_START, 0)); - break; - - case SCANLINE_EFX_BOTTOM_START: - m_write_efx(ASSERT_LINE); - m_efx_timer->adjust(screen().time_until_pos(SCANLINE_EFX_BOTTOM_END, 0)); - break; - - case SCANLINE_EFX_BOTTOM_END: - m_write_efx(CLEAR_LINE); - m_efx_timer->adjust(screen().time_until_pos(SCANLINE_EFX_TOP_START, 0)); - break; - } + case SCANLINE_EFX_TOP_END: + m_write_efx(CLEAR_LINE); + m_efx_timer->adjust(screen().time_until_pos(SCANLINE_EFX_BOTTOM_START, 0)); + break; + + case SCANLINE_EFX_BOTTOM_START: + m_write_efx(ASSERT_LINE); + m_efx_timer->adjust(screen().time_until_pos(SCANLINE_EFX_BOTTOM_END, 0)); + break; + + case SCANLINE_EFX_BOTTOM_END: + m_write_efx(CLEAR_LINE); + m_efx_timer->adjust(screen().time_until_pos(SCANLINE_EFX_TOP_START, 0)); break; + } +} - case TIMER_DMA: - if (m_dmaout) +TIMER_CALLBACK_MEMBER(cdp1861_device::dma_tick) +{ + int scanline = screen().vpos(); + if (m_dmaout) + { + if (m_disp) { - if (m_disp) + if (scanline >= SCANLINE_DISPLAY_START && scanline < SCANLINE_DISPLAY_END) { - if (scanline >= SCANLINE_DISPLAY_START && scanline < SCANLINE_DISPLAY_END) - { - m_write_dma_out(CLEAR_LINE); - } + m_write_dma_out(CLEAR_LINE); } + } - m_dma_timer->adjust(clocks_to_attotime(CDP1861_CYCLES_DMA_WAIT)); + m_dma_timer->adjust(clocks_to_attotime(CDP1861_CYCLES_DMA_WAIT)); - m_dmaout = CLEAR_LINE; - } - else + m_dmaout = CLEAR_LINE; + } + else + { + if (m_disp) { - if (m_disp) + if (scanline >= SCANLINE_DISPLAY_START && scanline < SCANLINE_DISPLAY_END) { - if (scanline >= SCANLINE_DISPLAY_START && scanline < SCANLINE_DISPLAY_END) - { - m_write_dma_out(ASSERT_LINE); - } + m_write_dma_out(ASSERT_LINE); } + } - m_dma_timer->adjust(clocks_to_attotime(CDP1861_CYCLES_DMA_ACTIVE)); + m_dma_timer->adjust(clocks_to_attotime(CDP1861_CYCLES_DMA_ACTIVE)); - m_dmaout = ASSERT_LINE; - } - break; + m_dmaout = ASSERT_LINE; } } |