summaryrefslogtreecommitdiffstatshomepage
diff options
context:
space:
mode:
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
commit02a4f6fd888f8538151199a8d23d673954534f9b (patch)
tree169da761267751f3c0b059c8a66dfc96a45aa199
parent57545da189ae62a85b21d44c7c617fe64a723b1d (diff)
williams.cpp: Clean up scanline timers (nw)
-rw-r--r--src/devices/machine/timer.cpp3
-rw-r--r--src/mame/drivers/williams.cpp16
-rw-r--r--src/mame/drivers/wmg.cpp8
-rw-r--r--src/mame/includes/williams.h5
-rw-r--r--src/mame/machine/williams.cpp100
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));