diff options
author | AJR <ajrhacker@users.noreply.github.com> | 2018-05-25 15:06:01 -0400 |
---|---|---|
committer | AJR <ajrhacker@users.noreply.github.com> | 2018-05-25 15:06:47 -0400 |
commit | 02a4f6fd888f8538151199a8d23d673954534f9b (patch) | |
tree | 169da761267751f3c0b059c8a66dfc96a45aa199 | |
parent | 57545da189ae62a85b21d44c7c617fe64a723b1d (diff) |
williams.cpp: Clean up scanline timers (nw)
-rw-r--r-- | src/devices/machine/timer.cpp | 3 | ||||
-rw-r--r-- | src/mame/drivers/williams.cpp | 16 | ||||
-rw-r--r-- | src/mame/drivers/wmg.cpp | 8 | ||||
-rw-r--r-- | src/mame/includes/williams.h | 5 | ||||
-rw-r--r-- | src/mame/machine/williams.cpp | 100 |
5 files changed, 34 insertions, 98 deletions
diff --git a/src/devices/machine/timer.cpp b/src/devices/machine/timer.cpp index e4c0643ffa3..b30471279f0 100644 --- a/src/devices/machine/timer.cpp +++ b/src/devices/machine/timer.cpp @@ -175,8 +175,7 @@ void timer_device::device_timer(emu_timer &timer, device_timer_id id, int param, (m_callback)(*this, m_ptr, param); break; - - // scanline timers have to do some additiona bookkeeping + // scanline timers have to do some additional bookkeeping case TIMER_TYPE_SCANLINE: { // by default, we fire at the first position diff --git a/src/mame/drivers/williams.cpp b/src/mame/drivers/williams.cpp index b29fd82dbe7..5c985329791 100644 --- a/src/mame/drivers/williams.cpp +++ b/src/mame/drivers/williams.cpp @@ -1472,11 +1472,13 @@ MACHINE_CONFIG_START(williams_state::williams) MCFG_DEVICE_PROGRAM_MAP(sound_map) MCFG_MACHINE_START_OVERRIDE(williams_state,williams) - MCFG_MACHINE_RESET_OVERRIDE(williams_state,williams) MCFG_NVRAM_ADD_0FILL("nvram") // 5101 (Defender), 5114 or 6514 (later games) + battery - MCFG_TIMER_DRIVER_ADD("scan_timer", williams_state, williams_va11_callback) - MCFG_TIMER_DRIVER_ADD("240_timer", williams_state, williams_count240_callback) + // set a timer to go off every 32 scanlines, to toggle the VA11 line and update the screen + MCFG_TIMER_DRIVER_ADD_SCANLINE("scan_timer", williams_state, williams_va11_callback, "screen", 0, 32) + + // also set a timer to go off on scanline 240 + MCFG_TIMER_DRIVER_ADD_SCANLINE("240_timer", williams_state, williams_count240_callback, "screen", 0, 240) MCFG_WATCHDOG_ADD("watchdog") @@ -1649,7 +1651,6 @@ MACHINE_CONFIG_START(blaster_state::blastkit) MCFG_DEVICE_PROGRAM_MAP(blaster_map) MCFG_MACHINE_START_OVERRIDE(blaster_state,blaster) - MCFG_MACHINE_RESET_OVERRIDE(blaster_state,blaster) /* video hardware */ MCFG_VIDEO_START_OVERRIDE(blaster_state,blaster) @@ -1737,8 +1738,11 @@ MACHINE_CONFIG_START(williams2_state::williams2) MCFG_MACHINE_RESET_OVERRIDE(williams2_state,williams2) MCFG_NVRAM_ADD_0FILL("nvram") // 5114 + battery - MCFG_TIMER_DRIVER_ADD("scan_timer", williams2_state, williams2_va11_callback) - MCFG_TIMER_DRIVER_ADD("254_timer", williams2_state, williams2_endscreen_callback) + // set a timer to go off every 32 scanlines, to toggle the VA11 line and update the screen + MCFG_TIMER_DRIVER_ADD_SCANLINE("scan_timer", williams2_state, williams2_va11_callback, "screen", 0, 32) + + // also set a timer to go off on scanline 254 + MCFG_TIMER_DRIVER_ADD_SCANLINE("254_timer", williams2_state, williams2_endscreen_callback, "screen", 8, 246) MCFG_WATCHDOG_ADD("watchdog") diff --git a/src/mame/drivers/wmg.cpp b/src/mame/drivers/wmg.cpp index f047d0b921d..034c80ea155 100644 --- a/src/mame/drivers/wmg.cpp +++ b/src/mame/drivers/wmg.cpp @@ -421,7 +421,6 @@ MACHINE_RESET_MEMBER( wmg_state, wmg ) m_wmg_port_select=0; m_wmg_vram_bank=0; wmg_c400_w( space1, 0, 0); - MACHINE_RESET_CALL_MEMBER(williams_common); m_maincpu->reset(); } @@ -503,8 +502,11 @@ MACHINE_CONFIG_START(wmg_state::wmg) MCFG_MACHINE_RESET_OVERRIDE(wmg_state, wmg) MCFG_NVRAM_ADD_0FILL("nvram") - MCFG_TIMER_DRIVER_ADD("scan_timer", williams_state, williams_va11_callback) - MCFG_TIMER_DRIVER_ADD("240_timer", williams_state, williams_count240_callback) + // set a timer to go off every 32 scanlines, to toggle the VA11 line and update the screen + MCFG_TIMER_DRIVER_ADD_SCANLINE("scan_timer", williams_state, williams_va11_callback, "screen", 0, 32) + + // also set a timer to go off on scanline 240 + MCFG_TIMER_DRIVER_ADD_SCANLINE("240_timer", williams_state, williams_count240_callback, "screen", 0, 240) MCFG_WATCHDOG_ADD("watchdog") diff --git a/src/mame/includes/williams.h b/src/mame/includes/williams.h index 2de918ed9ed..edd172957de 100644 --- a/src/mame/includes/williams.h +++ b/src/mame/includes/williams.h @@ -89,11 +89,8 @@ public: DECLARE_MACHINE_RESET(defender); DECLARE_VIDEO_START(williams); DECLARE_MACHINE_START(williams); - DECLARE_MACHINE_RESET(williams); DECLARE_MACHINE_START(williams_common); - DECLARE_MACHINE_RESET(williams_common); uint32_t screen_update_williams(screen_device &screen, bitmap_rgb32 &bitmap, const rectangle &cliprect); - TIMER_CALLBACK_MEMBER(williams_count240_off_callback); TIMER_CALLBACK_MEMBER(williams_deferred_snd_cmd_w); TIMER_DEVICE_CALLBACK_MEMBER(williams_va11_callback); TIMER_DEVICE_CALLBACK_MEMBER(williams_count240_callback); @@ -184,7 +181,6 @@ public: void init_blaster(); DECLARE_MACHINE_START(blaster); - DECLARE_MACHINE_RESET(blaster); DECLARE_VIDEO_START(blaster); uint32_t screen_update_blaster(screen_device &screen, bitmap_rgb32 &bitmap, const rectangle &cliprect); @@ -225,7 +221,6 @@ public: DECLARE_WRITE8_MEMBER(williams2_xscroll_low_w); DECLARE_WRITE8_MEMBER(williams2_xscroll_high_w); DECLARE_WRITE8_MEMBER(williams2_blit_window_enable_w); - TIMER_CALLBACK_MEMBER(williams2_endscreen_off_callback); TIMER_DEVICE_CALLBACK_MEMBER(williams2_va11_callback); TIMER_DEVICE_CALLBACK_MEMBER(williams2_endscreen_callback); TIMER_CALLBACK_MEMBER(williams2_deferred_snd_cmd_w); diff --git a/src/mame/machine/williams.cpp b/src/mame/machine/williams.cpp index c39904c3e3b..24aa0b6901e 100644 --- a/src/mame/machine/williams.cpp +++ b/src/mame/machine/williams.cpp @@ -20,33 +20,21 @@ TIMER_DEVICE_CALLBACK_MEMBER(williams_state::williams_va11_callback) { int scanline = param; - /* the IRQ signal comes into CB1, and is set to VA11 */ - m_pia_1->cb1_w(scanline & 0x20); - - /* set a timer for the next update */ - scanline += 0x20; - if (scanline >= 256) scanline = 0; - timer.adjust(m_screen->time_until_pos(scanline), scanline); -} + // must not fire at line 256 + if (scanline == 256) + return; - -TIMER_CALLBACK_MEMBER(williams_state::williams_count240_off_callback) -{ - /* the COUNT240 signal comes into CA1, and is set to the logical AND of VA10-VA13 */ - m_pia_1->ca1_w(0); + /* the IRQ signal comes into CB1, and is set to VA11 */ + m_pia_1->cb1_w(BIT(scanline, 5)); } TIMER_DEVICE_CALLBACK_MEMBER(williams_state::williams_count240_callback) { - /* the COUNT240 signal comes into CA1, and is set to the logical AND of VA10-VA13 */ - m_pia_1->ca1_w(1); - - /* set a timer to turn it off once the scanline counter resets */ - machine().scheduler().timer_set(m_screen->time_until_pos(0), timer_expired_delegate(FUNC(williams_state::williams_count240_off_callback),this)); + int scanline = param; - /* set a timer for next frame */ - timer.adjust(m_screen->time_until_pos(240)); + // the COUNT240 signal comes into CA1, and is set to the logical AND of VA10-VA13 + m_pia_1->ca1_w(scanline >= 240 ? 1 : 0); } @@ -123,30 +111,12 @@ MACHINE_START_MEMBER(williams_state,williams_common) } -MACHINE_RESET_MEMBER(williams_state,williams_common) -{ - /* set a timer to go off every 16 scanlines, to toggle the VA11 line and update the screen */ - timer_device *scan_timer = machine().device<timer_device>("scan_timer"); - scan_timer->adjust(m_screen->time_until_pos(0)); - - /* also set a timer to go off on scanline 240 */ - timer_device *l240_timer = machine().device<timer_device>("240_timer"); - l240_timer->adjust(m_screen->time_until_pos(240)); -} - - MACHINE_START_MEMBER(williams_state,williams) { MACHINE_START_CALL_MEMBER(williams_common); } -MACHINE_RESET_MEMBER(williams_state,williams) -{ - MACHINE_RESET_CALL_MEMBER(williams_common); -} - - /************************************* * @@ -157,35 +127,21 @@ MACHINE_RESET_MEMBER(williams_state,williams) TIMER_DEVICE_CALLBACK_MEMBER(williams2_state::williams2_va11_callback) { int scanline = param; + if (scanline == 256) + return; - /* the IRQ signal comes into CB1, and is set to VA11 */ - m_pia_0->cb1_w(scanline & 0x20); - m_pia_1->ca1_w(scanline & 0x20); - - /* set a timer for the next update */ - scanline += 0x20; - if (scanline >= 256) scanline = 0; - timer.adjust(m_screen->time_until_pos(scanline), scanline); -} - - -TIMER_CALLBACK_MEMBER(williams2_state::williams2_endscreen_off_callback) -{ - /* the /ENDSCREEN signal comes into CA1 */ - m_pia_0->ca1_w(1); + // the IRQ signal comes into CB1, and is set to VA11 + m_pia_0->cb1_w(BIT(scanline, 5)); + m_pia_1->ca1_w(BIT(scanline, 5)); } TIMER_DEVICE_CALLBACK_MEMBER(williams2_state::williams2_endscreen_callback) { - /* the /ENDSCREEN signal comes into CA1 */ - m_pia_0->ca1_w(0); - - /* set a timer to turn it off once the scanline counter resets */ - machine().scheduler().timer_set(m_screen->time_until_pos(8), timer_expired_delegate(FUNC(williams2_state::williams2_endscreen_off_callback),this)); + int scanline = param; - /* set a timer for next frame */ - timer.adjust(m_screen->time_until_pos(254)); + // the /ENDSCREEN signal comes into CA1 + m_pia_0->ca1_w(scanline >= 254 ? 0 : 1); } @@ -207,18 +163,8 @@ MACHINE_START_MEMBER(williams2_state,williams2) MACHINE_RESET_MEMBER(williams2_state,williams2) { - address_space &space = m_maincpu->space(AS_PROGRAM); - /* make sure our banking is reset */ - williams2_bank_select_w(space, 0, 0); - - /* set a timer to go off every 16 scanlines, to toggle the VA11 line and update the screen */ - timer_device *scan_timer = machine().device<timer_device>("scan_timer"); - scan_timer->adjust(m_screen->time_until_pos(0)); - - /* also set a timer to go off on scanline 254 */ - timer_device *l254_timer = machine().device<timer_device>("254_timer"); - l254_timer->adjust(m_screen->time_until_pos(254)); + williams2_bank_select_w(machine().dummy_space(), 0, 0); } @@ -433,11 +379,7 @@ MACHINE_START_MEMBER(williams_state,defender) MACHINE_RESET_MEMBER(williams_state,defender) { - address_space &space = m_maincpu->space(AS_PROGRAM); - - MACHINE_RESET_CALL_MEMBER(williams_common); - - defender_bank_select_w(space, 0, 0); + defender_bank_select_w(machine().dummy_space(), 0, 0); } @@ -510,12 +452,6 @@ MACHINE_START_MEMBER(blaster_state,blaster) } -MACHINE_RESET_MEMBER(blaster_state,blaster) -{ - MACHINE_RESET_CALL_MEMBER(williams_common); -} - - inline void blaster_state::update_blaster_banking() { membank("bank1")->set_entry(m_vram_bank * (m_rom_bank + 1)); |