summaryrefslogtreecommitdiffstatshomepage
path: root/src/devices/sound/cdp1864.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/devices/sound/cdp1864.cpp')
-rw-r--r--src/devices/sound/cdp1864.cpp176
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;
}
}