diff options
Diffstat (limited to 'src/devices/sound/cdp1864.cpp')
-rw-r--r-- | src/devices/sound/cdp1864.cpp | 176 |
1 files changed, 81 insertions, 95 deletions
diff --git a/src/devices/sound/cdp1864.cpp b/src/devices/sound/cdp1864.cpp index 7f3811bf09b..2d8acb64358 100644 --- a/src/devices/sound/cdp1864.cpp +++ b/src/devices/sound/cdp1864.cpp @@ -58,24 +58,24 @@ DEFINE_DEVICE_TYPE(CDP1864, cdp1864_device, "cdp1864", "RCA CDP1864") // cdp1864_device - constructor //------------------------------------------------- -cdp1864_device::cdp1864_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock) - : device_t(mconfig, CDP1864, tag, owner, clock), - device_sound_interface(mconfig, *this), - device_video_interface(mconfig, *this), - m_read_inlace(*this), - m_read_rdata(*this), - m_read_bdata(*this), - m_read_gdata(*this), - m_write_int(*this), - m_write_dma_out(*this), - m_write_efx(*this), - m_write_hsync(*this), - m_disp(0), - m_dmaout(0), - m_bgcolor(0), - m_con(0), - m_aoe(0), - m_latch(CDP1864_DEFAULT_LATCH) +cdp1864_device::cdp1864_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock) : + device_t(mconfig, CDP1864, tag, owner, clock), + device_sound_interface(mconfig, *this), + device_video_interface(mconfig, *this), + m_read_inlace(*this, 1), + m_read_rdata(*this, 0), + m_read_bdata(*this, 0), + m_read_gdata(*this, 0), + m_write_int(*this), + m_write_dma_out(*this), + m_write_efx(*this), + m_write_hsync(*this), + m_disp(0), + m_dmaout(0), + m_bgcolor(0), + m_con(0), + m_aoe(0), + m_latch(CDP1864_DEFAULT_LATCH) { } @@ -105,16 +105,6 @@ void cdp1864_device::device_config_complete() void cdp1864_device::device_start() { - // resolve callbacks - m_read_inlace.resolve_safe(1); - m_read_rdata.resolve_safe(0); - m_read_bdata.resolve_safe(0); - m_read_gdata.resolve_safe(0); - m_write_int.resolve_safe(); - m_write_dma_out.resolve_safe(); - m_write_efx.resolve_safe(); - m_write_hsync.resolve_safe(); - // initialize palette initialize_palette(); @@ -122,10 +112,9 @@ void cdp1864_device::device_start() m_stream = stream_alloc(0, 1, SAMPLE_RATE_OUTPUT_ADAPTIVE); // allocate timers - m_int_timer = timer_alloc(TIMER_INT); - m_efx_timer = timer_alloc(TIMER_EFX); - m_dma_timer = timer_alloc(TIMER_DMA); - m_hsync_timer = timer_alloc(TIMER_HSYNC); + m_int_timer = timer_alloc(FUNC(cdp1864_device::int_tick), this); + m_efx_timer = timer_alloc(FUNC(cdp1864_device::efx_tick), this); + m_dma_timer = timer_alloc(FUNC(cdp1864_device::dma_tick), this); // find devices screen().register_screen_bitmap(m_bitmap); @@ -163,91 +152,88 @@ void cdp1864_device::device_reset() //------------------------------------------------- -// device_timer - handle timer events +// timer events //------------------------------------------------- -void cdp1864_device::device_timer(emu_timer &timer, device_timer_id id, int param, void *ptr) +TIMER_CALLBACK_MEMBER(cdp1864_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(cdp1864_device::efx_tick) +{ + int scanline = screen().vpos(); + 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 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(cdp1864_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(CDP1864_CYCLES_DMA_WAIT)); + m_dma_timer->adjust(clocks_to_attotime(CDP1864_CYCLES_DMA_WAIT)); - m_dmaout = 0; - } - else + m_dmaout = 0; + } + 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(CDP1864_CYCLES_DMA_ACTIVE)); + m_dma_timer->adjust(clocks_to_attotime(CDP1864_CYCLES_DMA_ACTIVE)); - m_dmaout = 1; - } - break; + m_dmaout = 1; } } |