diff options
Diffstat (limited to 'src/mame/midway/williams_m.cpp')
-rw-r--r-- | src/mame/midway/williams_m.cpp | 227 |
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)); } |