summaryrefslogtreecommitdiffstatshomepage
path: root/src/mame/midway/williams_m.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/mame/midway/williams_m.cpp')
-rw-r--r--src/mame/midway/williams_m.cpp227
1 files changed, 124 insertions, 103 deletions
diff --git a/src/mame/midway/williams_m.cpp b/src/mame/midway/williams_m.cpp
index 6582a504250..87e1774a553 100644
--- a/src/mame/midway/williams_m.cpp
+++ b/src/mame/midway/williams_m.cpp
@@ -18,20 +18,20 @@
TIMER_DEVICE_CALLBACK_MEMBER(williams_state::va11_callback)
{
- int scanline = param;
+ int const scanline = param;
// must not fire at line 256
if (scanline == 256)
return;
- /* the IRQ signal comes into CB1, and is set to VA11 */
+ // 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::count240_callback)
{
- int scanline = param;
+ int const scanline = param;
// 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);
@@ -44,11 +44,9 @@ TIMER_DEVICE_CALLBACK_MEMBER(williams_state::count240_callback)
*
*************************************/
-void williams_state::machine_start()
+void williams_state::machine_reset()
{
- /* configure the memory bank */
- m_mainbank->configure_entry(1, memregion("maincpu")->base() + 0x10000);
- m_mainbank->configure_entry(0, m_videoram);
+ m_rom_view.disable();
}
@@ -60,7 +58,7 @@ void williams_state::machine_start()
TIMER_DEVICE_CALLBACK_MEMBER(williams2_state::va11_callback)
{
- int scanline = param;
+ int const scanline = param;
if (scanline == 256)
return;
@@ -72,7 +70,7 @@ TIMER_DEVICE_CALLBACK_MEMBER(williams2_state::va11_callback)
TIMER_DEVICE_CALLBACK_MEMBER(williams2_state::endscreen_callback)
{
- int scanline = param;
+ int const scanline = param;
// the /ENDSCREEN signal comes into CA1
m_pia[0]->ca1_w(scanline >= 254 ? 0 : 1);
@@ -88,16 +86,18 @@ TIMER_DEVICE_CALLBACK_MEMBER(williams2_state::endscreen_callback)
void williams2_state::machine_start()
{
- /* configure memory banks */
- m_mainbank->configure_entries(1, 4, memregion("maincpu")->base() + 0x10000, 0x10000);
- m_mainbank->configure_entry(0, m_videoram);
- membank("vram8000")->set_base(&m_videoram[0x8000]);
+ williams_state::machine_start();
+
+ // configure memory banks
+ m_mainbank->configure_entries(0, 4, memregion("maincpu")->base() + 0x10000, 0x8000);
}
void williams2_state::machine_reset()
{
- /* make sure our banking is reset */
+ williams_state::machine_reset();
+
+ // make sure our banking is reset
bank_select_w(0);
}
@@ -111,36 +111,41 @@ void williams2_state::machine_reset()
void williams_state::vram_select_w(u8 data)
{
- /* VRAM/ROM banking from bit 0 */
- m_mainbank->set_entry(data & 0x01);
+ // VRAM/ROM banking from bit 0
+ if (BIT(data, 0))
+ m_rom_view.select(0);
+ else
+ m_rom_view.disable();
- /* cocktail flip from bit 1 */
- m_cocktail = data & 0x02;
+ // cocktail flip from bit 1
+ m_cocktail = BIT(data, 1);
}
void williams2_state::bank_select_w(u8 data)
{
- /* the low two bits control the paging */
+ // the low two bits control the paging
switch (data & 0x03)
{
- /* page 0 is video ram */
+ // page 0 is video ram
case 0:
- m_mainbank->set_entry(0);
- m_bank8000->set_bank(0);
+ m_rom_view.disable();
+ m_palette_view.disable();
break;
- /* pages 1 and 2 are ROM */
+ // pages 1 and 2 are ROM
case 1:
case 2:
- m_mainbank->set_entry(1 + ((data & 6) >> 1));
- m_bank8000->set_bank(0);
+ m_mainbank->set_entry((data & 6) >> 1);
+ m_rom_view.select(0);
+ m_palette_view.disable();
break;
- /* page 3 accesses palette RAM; the remaining areas are as if page 1 ROM was selected */
+ // page 3 accesses palette RAM; the remaining areas are as if page 1 ROM was selected
case 3:
- m_mainbank->set_entry(1 + ((data & 4) >> 1));
- m_bank8000->set_bank(1);
+ m_mainbank->set_entry((data & 4) >> 1);
+ m_rom_view.select(0);
+ m_palette_view.select(0);
break;
}
}
@@ -153,21 +158,25 @@ void williams2_state::bank_select_w(u8 data)
*
*************************************/
+template <unsigned A, unsigned... B>
TIMER_CALLBACK_MEMBER(williams_state::deferred_snd_cmd_w)
{
- m_pia[2]->portb_w(param);
- m_pia[2]->cb1_w((param == 0xff) ? 0 : 1);
+ m_pia[A]->portb_w(param);
+ m_pia[A]->cb1_w((param == 0xff) ? 0 : 1);
+
+ if constexpr (sizeof...(B) > 0)
+ deferred_snd_cmd_w<B...>(param);
}
void williams_state::snd_cmd_w(u8 data)
{
- /* the high two bits are set externally, and should be 1 */
- machine().scheduler().synchronize(timer_expired_delegate(FUNC(williams_state::deferred_snd_cmd_w),this), data | 0xc0);
+ // the high two bits are set externally, and should be 1
+ machine().scheduler().synchronize(timer_expired_delegate(FUNC(williams_state::deferred_snd_cmd_w<2>), this), data | 0xc0);
}
-void playball_state::snd_cmd_w(u8 data)
+void williams_state::playball_snd_cmd_w(u8 data)
{
- machine().scheduler().synchronize(timer_expired_delegate(FUNC(playball_state::deferred_snd_cmd_w),this), data);
+ machine().scheduler().synchronize(timer_expired_delegate(FUNC(williams_state::deferred_snd_cmd_w<2>), this), data);
}
TIMER_CALLBACK_MEMBER(williams2_state::deferred_snd_cmd_w)
@@ -209,8 +218,8 @@ void williams2_state::snd_cmd_w(u8 data)
u8 williams_state::port_0_49way_r()
{
- static const uint8_t translate49[7] = { 0x0, 0x4, 0x6, 0x7, 0xb, 0x9, 0x8 };
- return (translate49[ioport("49WAYX")->read() >> 4] << 4) | translate49[ioport("49WAYY")->read() >> 4];
+ static const u8 translate49[7] = { 0x0, 0x4, 0x6, 0x7, 0xb, 0x9, 0x8 };
+ return (translate49[m_49way_x->read() >> 4] << 4) | translate49[m_49way_y->read() >> 4];
}
@@ -221,20 +230,13 @@ u8 williams_state::port_0_49way_r()
*
*************************************/
-void williams_state::cmos_w(offs_t offset, u8 data)
+void williams_state::cmos_4bit_w(offs_t offset, u8 data)
{
- /* only 4 bits are valid */
+ // only 4 bits are valid
m_nvram[offset] = data | 0xf0;
}
-void bubbles_state::cmos_w(offs_t offset, u8 data)
-{
- /* bubbles has additional CMOS for a full 8 bits */
- m_nvram[offset] = data;
-}
-
-
/*************************************
*
@@ -244,7 +246,7 @@ void bubbles_state::cmos_w(offs_t offset, u8 data)
void williams_state::watchdog_reset_w(u8 data)
{
- /* yes, the data bits are checked for this specific value */
+ // yes, the data bits are checked for this specific value
if (data == 0x39)
m_watchdog->watchdog_reset();
}
@@ -252,7 +254,7 @@ void williams_state::watchdog_reset_w(u8 data)
void williams2_state::watchdog_reset_w(u8 data)
{
- /* yes, the data bits are checked for this specific value */
+ // yes, the data bits are checked for this specific value
if ((data & 0x3f) == 0x14)
m_watchdog->watchdog_reset();
}
@@ -306,21 +308,39 @@ void williams2_state::segments_w(u8 data)
*
*************************************/
+void defender_state::machine_start()
+{
+ williams_state::machine_start();
+
+ memory_region *const banked_rom = memregion("banked");
+ unsigned const banks = banked_rom->bytes() / 0x1000;
+ for (unsigned i = 0; 15 > i; ++i)
+ {
+ if ((i < 9) && (i < banks))
+ m_rom_view[i + 1].install_rom(0xc000, 0xcfff, banked_rom->base() + (i * 0x1000));
+ else
+ m_rom_view[i + 1];
+ }
+}
+
+
void defender_state::machine_reset()
{
+ williams_state::machine_reset();
+
bank_select_w(0);
}
void defender_state::video_control_w(u8 data)
{
- m_cocktail = data & 0x01;
+ m_cocktail = BIT(data, 0);
}
void defender_state::bank_select_w(u8 data)
{
- m_bankc000->set_bank(data & 0x0f);
+ m_rom_view.select(data & 0x0f);
}
@@ -333,11 +353,11 @@ void defender_state::bank_select_w(u8 data)
u8 mayday_state::protection_r(offs_t offset)
{
- /* Mayday does some kind of protection check that is not currently understood */
- /* However, the results of that protection check are stored at $a190 and $a191 */
- /* These are compared against $a193 and $a194, respectively. Thus, to prevent */
- /* the protection from resetting the machine, we just return $a193 for $a190, */
- /* and $a194 for $a191. */
+ // Mayday does some kind of protection check that is not currently understood
+ // However, the results of that protection check are stored at $a190 and $a191
+ // These are compared against $a193 and $a194, respectively. Thus, to prevent
+ // the protection from resetting the machine, we just return $a193 for $a190,
+ // and $a194 for $a191.
return m_videoram[0xa193 + offset];
}
@@ -349,30 +369,20 @@ u8 mayday_state::protection_r(offs_t offset)
*
*************************************/
-void sinistar_state::vram_select_w(u8 data)
+void williams_state::sinistar_vram_select_w(u8 data)
{
- /* low two bits are standard */
- williams_state::vram_select_w(data);
+ // low two bits are standard
+ vram_select_w(data);
- /* window enable from bit 2 (clips to 0x7400) */
- m_blitter_window_enable = data & 0x04;
+ // window enable from bit 2 (clips to 0x7400)
+ m_blitter->window_enable_w(BIT(data, 2));
}
-TIMER_CALLBACK_MEMBER(sinistar_state::cockpit_deferred_snd_cmd_w)
+void williams_state::cockpit_snd_cmd_w(u8 data)
{
- m_pia[2]->portb_w(param);
- m_pia[2]->cb1_w((param == 0xff) ? 0 : 1);
-
- m_pia[3]->portb_w(param);
- m_pia[3]->cb1_w((param == 0xff) ? 0 : 1);
-}
-
-
-void sinistar_state::cockpit_snd_cmd_w(u8 data)
-{
- /* the high two bits are set externally, and should be 1 */
- machine().scheduler().synchronize(timer_expired_delegate(FUNC(sinistar_state::cockpit_deferred_snd_cmd_w), this), data | 0xc0);
+ // the high two bits are set externally, and should be 1
+ machine().scheduler().synchronize(timer_expired_delegate(NAME((&williams_state::deferred_snd_cmd_w<2, 3>)), this), data | 0xc0);
}
@@ -385,54 +395,52 @@ void sinistar_state::cockpit_snd_cmd_w(u8 data)
void blaster_state::machine_start()
{
- /* banking is different for blaster */
- m_mainbank->configure_entries(1, 16, memregion("maincpu")->base() + 0x18000, 0x4000);
- m_mainbank->configure_entry(0, m_videoram);
+ williams_state::machine_start();
- m_bankb->configure_entries(1, 16, memregion("maincpu")->base() + 0x10000, 0x0000);
- m_bankb->configure_entry(0, &m_videoram[0x4000]);
+ // banking is different for blaster
+ m_mainbank->configure_entries(0, 16, memregion("maincpu")->base() + 0x10000, 0x4000);
+}
- /* register for save states */
- save_item(NAME(m_vram_bank));
- save_item(NAME(m_rom_bank));
+void blaster_state::machine_reset()
+{
+ williams_state::machine_reset();
- m_vram_bank = 0;
- m_rom_bank = 0;
+ m_mainbank->set_entry(0);
}
-inline void blaster_state::update_blaster_banking()
+void blaster_state::video_control_w(u8 data)
{
- m_mainbank->set_entry(m_vram_bank * (m_rom_bank + 1));
- m_bankb->set_entry(m_vram_bank * (m_rom_bank + 1));
+ m_video_control = data;
}
-void blaster_state::vram_select_w(u8 data)
+void blaster_state::blaster_vram_select_w(u8 data)
{
- /* VRAM/ROM banking from bit 0 */
- m_vram_bank = data & 0x01;
- update_blaster_banking();
+ // VRAM/ROM banking from bit 0
+ if (BIT(data, 0))
+ m_rom_view.select(0);
+ else
+ m_rom_view.disable();
- /* cocktail flip from bit 1 */
- m_cocktail = data & 0x02;
+ // cocktail flip from bit 1
+ m_cocktail = BIT(data, 1);
- /* window enable from bit 2 (clips to 0x9700) */
- m_blitter_window_enable = data & 0x04;
+ // window enable from bit 2 (clips to 0x9700)
+ m_blitter->window_enable_w(BIT(data, 2));
}
void blaster_state::bank_select_w(u8 data)
{
- m_rom_bank = data & 0x0f;
- update_blaster_banking();
+ m_mainbank->set_entry(data & 0x0f);
}
TIMER_CALLBACK_MEMBER(blaster_state::deferred_snd_cmd_w)
{
- uint8_t l_data = param | 0x80;
- uint8_t r_data = (param >> 1 & 0x40) | (param & 0x3f) | 0x80;
+ u8 const l_data = param | 0x80;
+ u8 const r_data = (param >> 1 & 0x40) | (param & 0x3f) | 0x80;
m_pia[2]->portb_w(l_data); m_pia[2]->cb1_w((l_data == 0xff) ? 0 : 1);
m_pia[3]->portb_w(r_data); m_pia[3]->cb1_w((r_data == 0xff) ? 0 : 1);
@@ -454,7 +462,22 @@ void blaster_state::blaster_snd_cmd_w(u8 data)
void williams2_state::video_control_w(u8 data)
{
- m_cocktail = data & 0x01;
+ m_cocktail = BIT(data, 0);
+}
+
+
+
+/*************************************
+ *
+ * Mystic Marathon-specific routines
+ *
+ *************************************/
+
+void mysticm_state::machine_start()
+{
+ williams2_state::machine_start();
+
+ save_item(NAME(m_bg_color));
}
@@ -468,6 +491,7 @@ void williams2_state::video_control_w(u8 data)
void tshoot_state::machine_start()
{
williams2_state::machine_start();
+
m_grenade_lamp.resolve();
m_gun_lamp.resolve();
m_p1_gun_recoil.resolve();
@@ -477,20 +501,16 @@ void tshoot_state::machine_start()
void tshoot_state::maxvol_w(int state)
{
- /* something to do with the sound volume */
+ // something to do with the sound volume
logerror("tshoot maxvol = %d (%s)\n", state, machine().describe_context());
}
void tshoot_state::lamp_w(u8 data)
{
- /* set the grenade lamp */
m_grenade_lamp = BIT(~data, 2);
- /* set the gun lamp */
m_gun_lamp = BIT(~data, 3);
- /* gun coil */
m_p1_gun_recoil = BIT(data, 4);
- /* feather coil */
m_feather_blower = BIT(data, 5);
}
@@ -505,6 +525,7 @@ void tshoot_state::lamp_w(u8 data)
void joust2_state::machine_start()
{
williams2_state::machine_start();
+
save_item(NAME(m_current_sound_data));
}