mirror of
https://github.com/holub/mame
synced 2025-04-23 08:49:55 +03:00
-williams: Eliminated MACHINE_*_OVERRIDE and VIDEO_START_OVERRIDE. Eliminated magic switches on tilemap config for williams2. Added numerous subclasses to reduce optional device usage and reduce custom driver init callbacks, nw
This commit is contained in:
parent
e5cf6b2d3b
commit
06ed986b2c
@ -521,28 +521,39 @@ Reference video: https://www.youtube.com/watch?v=R5OeC6Wc_yI
|
||||
*
|
||||
*************************************/
|
||||
|
||||
void williams_state::defender_map(address_map &map)
|
||||
void defender_state::main_map(address_map &map)
|
||||
{
|
||||
map(0x0000, 0xbfff).ram().share("videoram");
|
||||
map(0xc000, 0xcfff).m(m_bankc000, FUNC(address_map_bank_device::amap8));
|
||||
map(0xd000, 0xdfff).w(FUNC(williams_state::defender_bank_select_w));
|
||||
map(0xd000, 0xdfff).w(FUNC(defender_state::bank_select_w));
|
||||
map(0xd000, 0xffff).rom();
|
||||
}
|
||||
|
||||
|
||||
void williams_state::defender_bankc000_map(address_map &map)
|
||||
void defender_state::bankc000_map(address_map &map)
|
||||
{
|
||||
map(0x0000, 0x000f).mirror(0x03e0).writeonly().share("paletteram");
|
||||
map(0x03ff, 0x03ff).w(FUNC(williams_state::williams_watchdog_reset_w));
|
||||
map(0x0010, 0x001f).mirror(0x03e0).w(FUNC(williams_state::defender_video_control_w));
|
||||
map(0x0400, 0x04ff).mirror(0x0300).ram().w(FUNC(williams_state::williams_cmos_w)).share("nvram");
|
||||
map(0x0800, 0x0bff).r(FUNC(williams_state::williams_video_counter_r));
|
||||
map(0x03ff, 0x03ff).w(FUNC(defender_state::watchdog_reset_w));
|
||||
map(0x0010, 0x001f).mirror(0x03e0).w(FUNC(defender_state::video_control_w));
|
||||
map(0x0400, 0x04ff).mirror(0x0300).ram().w(FUNC(defender_state::cmos_w)).share("nvram");
|
||||
map(0x0800, 0x0bff).r(FUNC(defender_state::video_counter_r));
|
||||
map(0x0c00, 0x0c03).mirror(0x03e0).rw(m_pia[1], FUNC(pia6821_device::read), FUNC(pia6821_device::write));
|
||||
map(0x0c04, 0x0c07).mirror(0x03e0).rw(m_pia[0], FUNC(pia6821_device::read), FUNC(pia6821_device::write));
|
||||
map(0x1000, 0x9fff).rom().region("maincpu", 0x10000);
|
||||
map(0xa000, 0xffff).noprw();
|
||||
}
|
||||
|
||||
/*************************************
|
||||
*
|
||||
* Mayday memory handlers
|
||||
*
|
||||
*************************************/
|
||||
|
||||
void mayday_state::main_map(address_map &map)
|
||||
{
|
||||
defender_state::main_map(map);
|
||||
/* install a handler to catch protection checks */
|
||||
map(0xa190, 0xa191).r(FUNC(mayday_state::protection_r));
|
||||
}
|
||||
|
||||
|
||||
/*************************************
|
||||
@ -551,18 +562,18 @@ void williams_state::defender_bankc000_map(address_map &map)
|
||||
*
|
||||
*************************************/
|
||||
|
||||
void williams_state::williams_map(address_map &map)
|
||||
void williams_state::base_map(address_map &map)
|
||||
{
|
||||
map(0x0000, 0x8fff).bankr("mainbank").writeonly().share("videoram");
|
||||
map(0x9000, 0xbfff).ram();
|
||||
map(0xc000, 0xc00f).mirror(0x03f0).writeonly().share("paletteram");
|
||||
map(0xc804, 0xc807).mirror(0x00f0).rw(m_pia[0], FUNC(pia6821_device::read), FUNC(pia6821_device::write));
|
||||
map(0xc80c, 0xc80f).mirror(0x00f0).rw(m_pia[1], FUNC(pia6821_device::read), FUNC(pia6821_device::write));
|
||||
map(0xc900, 0xc9ff).w(FUNC(williams_state::williams_vram_select_w));
|
||||
map(0xca00, 0xca07).mirror(0x00f8).w(FUNC(williams_state::williams_blitter_w));
|
||||
map(0xcb00, 0xcbff).r(FUNC(williams_state::williams_video_counter_r));
|
||||
map(0xcbff, 0xcbff).w(FUNC(williams_state::williams_watchdog_reset_w));
|
||||
map(0xcc00, 0xcfff).ram().w(FUNC(williams_state::williams_cmos_w)).share("nvram");
|
||||
map(0xc900, 0xc9ff).w(FUNC(williams_state::vram_select_w));
|
||||
map(0xca00, 0xca07).mirror(0x00f8).w(FUNC(williams_state::blitter_w));
|
||||
map(0xcb00, 0xcbff).r(FUNC(williams_state::video_counter_r));
|
||||
map(0xcbff, 0xcbff).w(FUNC(williams_state::watchdog_reset_w));
|
||||
map(0xcc00, 0xcfff).ram().w(FUNC(williams_state::cmos_w)).share("nvram");
|
||||
map(0xd000, 0xffff).rom();
|
||||
}
|
||||
|
||||
@ -574,23 +585,27 @@ void williams_state::williams_map(address_map &map)
|
||||
*
|
||||
*************************************/
|
||||
|
||||
void williams_state::sinistar_map(address_map &map)
|
||||
void sinistar_state::main_map(address_map &map)
|
||||
{
|
||||
map(0x0000, 0x8fff).bankr("mainbank").writeonly().share("videoram");
|
||||
map(0x9000, 0xbfff).ram();
|
||||
map(0xc000, 0xc00f).mirror(0x03f0).writeonly().share("paletteram");
|
||||
map(0xc804, 0xc807).mirror(0x00f0).rw(m_pia[0], FUNC(pia6821_device::read), FUNC(pia6821_device::write));
|
||||
map(0xc80c, 0xc80f).mirror(0x00f0).rw(m_pia[1], FUNC(pia6821_device::read), FUNC(pia6821_device::write));
|
||||
map(0xc900, 0xc9ff).w(FUNC(williams_state::sinistar_vram_select_w));
|
||||
map(0xca00, 0xca07).mirror(0x00f8).w(FUNC(williams_state::williams_blitter_w));
|
||||
map(0xcb00, 0xcbff).r(FUNC(williams_state::williams_video_counter_r));
|
||||
map(0xcbff, 0xcbff).w(FUNC(williams_state::williams_watchdog_reset_w));
|
||||
map(0xcc00, 0xcfff).ram().w(FUNC(williams_state::williams_cmos_w)).share("nvram");
|
||||
base_map(map);
|
||||
map(0xc900, 0xc9ff).w(FUNC(sinistar_state::vram_select_w));
|
||||
map(0xd000, 0xdfff).ram();
|
||||
map(0xe000, 0xffff).rom();
|
||||
}
|
||||
|
||||
|
||||
/*************************************
|
||||
*
|
||||
* Bubbles memory handlers
|
||||
*
|
||||
*************************************/
|
||||
|
||||
void bubbles_state::main_map(address_map &map)
|
||||
{
|
||||
base_map(map);
|
||||
/* bubbles has a full 8-bit-wide CMOS */
|
||||
map(0xcc00, 0xcfff).w(FUNC(bubbles_state::cmos_w)).share("nvram");
|
||||
}
|
||||
|
||||
/*************************************
|
||||
*
|
||||
@ -598,9 +613,9 @@ void williams_state::sinistar_map(address_map &map)
|
||||
*
|
||||
*************************************/
|
||||
|
||||
void spdball_state::spdball_map(address_map &map)
|
||||
void spdball_state::main_map(address_map &map)
|
||||
{
|
||||
williams_map(map);
|
||||
base_map(map);
|
||||
/* install extra input handlers */
|
||||
map(0xc800, 0xc800).portr("AN0");
|
||||
map(0xc801, 0xc801).portr("AN1");
|
||||
@ -618,7 +633,7 @@ void spdball_state::spdball_map(address_map &map)
|
||||
*
|
||||
*************************************/
|
||||
|
||||
void blaster_state::blaster_map(address_map &map)
|
||||
void blaster_state::main_map(address_map &map)
|
||||
{
|
||||
map(0x0000, 0x3fff).bankr("mainbank").writeonly().share("videoram");
|
||||
map(0x4000, 0x8fff).bankr("blaster_bankb").writeonly();
|
||||
@ -629,14 +644,14 @@ void blaster_state::blaster_map(address_map &map)
|
||||
map(0xc000, 0xc00f).mirror(0x03f0).writeonly().share("paletteram");
|
||||
map(0xc804, 0xc807).mirror(0x00f0).rw(m_pia[0], FUNC(pia6821_device::read), FUNC(pia6821_device::write));
|
||||
map(0xc80c, 0xc80f).mirror(0x00f0).rw(m_pia[1], FUNC(pia6821_device::read), FUNC(pia6821_device::write));
|
||||
map(0xc900, 0xc93f).w(FUNC(blaster_state::blaster_vram_select_w));
|
||||
map(0xc940, 0xc97f).w(FUNC(blaster_state::blaster_remap_select_w));
|
||||
map(0xc980, 0xc9bf).w(FUNC(blaster_state::blaster_bank_select_w));
|
||||
map(0xc9c0, 0xc9ff).w(FUNC(blaster_state::blaster_video_control_w));
|
||||
map(0xca00, 0xca07).mirror(0x00f8).w(FUNC(blaster_state::williams_blitter_w));
|
||||
map(0xcb00, 0xcbff).r(FUNC(blaster_state::williams_video_counter_r));
|
||||
map(0xcbff, 0xcbff).w(FUNC(blaster_state::williams_watchdog_reset_w));
|
||||
map(0xcc00, 0xcfff).ram().w(FUNC(blaster_state::williams_cmos_w)).share("nvram");
|
||||
map(0xc900, 0xc93f).w(FUNC(blaster_state::vram_select_w));
|
||||
map(0xc940, 0xc97f).w(FUNC(blaster_state::remap_select_w));
|
||||
map(0xc980, 0xc9bf).w(FUNC(blaster_state::bank_select_w));
|
||||
map(0xc9c0, 0xc9ff).w(FUNC(blaster_state::video_control_w));
|
||||
map(0xca00, 0xca07).mirror(0x00f8).w(FUNC(blaster_state::blitter_w));
|
||||
map(0xcb00, 0xcbff).r(FUNC(blaster_state::video_counter_r));
|
||||
map(0xcbff, 0xcbff).w(FUNC(blaster_state::watchdog_reset_w));
|
||||
map(0xcc00, 0xcfff).ram().w(FUNC(blaster_state::cmos_w)).share("nvram");
|
||||
map(0xd000, 0xffff).rom();
|
||||
}
|
||||
|
||||
@ -648,48 +663,48 @@ void blaster_state::blaster_map(address_map &map)
|
||||
*
|
||||
*************************************/
|
||||
|
||||
void williams2_state::williams2_common_map(address_map &map)
|
||||
void williams2_state::common_map(address_map &map)
|
||||
{
|
||||
map(0x0000, 0xbfff).ram().share("videoram");
|
||||
map(0x0000, 0x7fff).bankr("mainbank");
|
||||
map(0x8000, 0x87ff).m(m_bank8000, FUNC(address_map_bank_device::amap8));
|
||||
map(0xc000, 0xc7ff).ram().w(FUNC(williams2_state::williams2_tileram_w)).share("williams2_tile");
|
||||
map(0xc800, 0xc87f).w(FUNC(williams2_state::williams2_bank_select_w));
|
||||
map(0xc880, 0xc887).mirror(0x0078).w(FUNC(williams2_state::williams_blitter_w));
|
||||
map(0xc900, 0xc97f).w(FUNC(williams2_state::williams2_watchdog_reset_w));
|
||||
map(0xc000, 0xc7ff).ram().w(FUNC(williams2_state::tileram_w)).share("williams2_tile");
|
||||
map(0xc800, 0xc87f).w(FUNC(williams2_state::bank_select_w));
|
||||
map(0xc880, 0xc887).mirror(0x0078).w(FUNC(williams2_state::blitter_w));
|
||||
map(0xc900, 0xc97f).w(FUNC(williams2_state::watchdog_reset_w));
|
||||
map(0xc980, 0xc983).mirror(0x0070).rw(m_pia[1], FUNC(pia6821_device::read), FUNC(pia6821_device::write));
|
||||
map(0xc984, 0xc987).mirror(0x0070).rw(m_pia[0], FUNC(pia6821_device::read), FUNC(pia6821_device::write));
|
||||
map(0xc98c, 0xc98f).mirror(0x0070).w(FUNC(williams2_state::williams2_7segment_w));
|
||||
map(0xcb00, 0xcb1f).w(FUNC(williams2_state::williams2_fg_select_w));
|
||||
map(0xcb20, 0xcb3f).w(FUNC(williams2_state::williams2_bg_select_w));
|
||||
map(0xcb40, 0xcb5f).w(FUNC(williams2_state::williams2_xscroll_low_w));
|
||||
map(0xcb60, 0xcb7f).w(FUNC(williams2_state::williams2_xscroll_high_w));
|
||||
map(0xcb80, 0xcb9f).w(FUNC(williams2_state::defender_video_control_w));
|
||||
map(0xcba0, 0xcbbf).w(FUNC(williams2_state::williams2_blit_window_enable_w));
|
||||
map(0xcbe0, 0xcbef).r(FUNC(williams2_state::williams_video_counter_r));
|
||||
map(0xcc00, 0xcfff).ram().w(FUNC(williams2_state::williams_cmos_w)).share("nvram");
|
||||
map(0xc98c, 0xc98f).mirror(0x0070).w(FUNC(williams2_state::segments_w));
|
||||
map(0xcb00, 0xcb1f).w(FUNC(williams2_state::fg_select_w));
|
||||
map(0xcb20, 0xcb3f).w(FUNC(williams2_state::bg_select_w));
|
||||
map(0xcb40, 0xcb5f).w(FUNC(williams2_state::xscroll_low_w));
|
||||
map(0xcb60, 0xcb7f).w(FUNC(williams2_state::xscroll_high_w));
|
||||
map(0xcb80, 0xcb9f).w(FUNC(williams2_state::video_control_w));
|
||||
map(0xcba0, 0xcbbf).w(FUNC(williams2_state::blit_window_enable_w));
|
||||
map(0xcbe0, 0xcbef).r(FUNC(williams2_state::video_counter_r));
|
||||
map(0xcc00, 0xcfff).ram().w(FUNC(williams2_state::cmos_w)).share("nvram");
|
||||
}
|
||||
|
||||
void williams2_state::williams2_bank8000_map(address_map &map)
|
||||
void williams2_state::bank8000_map(address_map &map)
|
||||
{
|
||||
map(0x0000, 0x07ff).bankrw("vram8000");
|
||||
map(0x0800, 0x0fff).ram().w(FUNC(williams2_state::williams2_paletteram_w)).share("paletteram");
|
||||
map(0x0800, 0x0fff).ram().w(FUNC(williams2_state::paletteram_w)).share("paletteram");
|
||||
}
|
||||
|
||||
|
||||
/* mysticm and inferno: D000-DFFF is RAM */
|
||||
void williams2_state::williams2_d000_ram_map(address_map &map)
|
||||
void williams_d000_ram_state::d000_map(address_map &map)
|
||||
{
|
||||
williams2_common_map(map);
|
||||
common_map(map);
|
||||
map(0xd000, 0xdfff).ram();
|
||||
map(0xe000, 0xffff).rom();
|
||||
}
|
||||
|
||||
|
||||
/* tshoot and joust2: D000-DFFF is ROM */
|
||||
void williams2_state::williams2_d000_rom_map(address_map &map)
|
||||
void williams_d000_rom_state::d000_map(address_map &map)
|
||||
{
|
||||
williams2_common_map(map);
|
||||
common_map(map);
|
||||
map(0xd000, 0xffff).rom();
|
||||
}
|
||||
|
||||
@ -701,7 +716,7 @@ void williams2_state::williams2_d000_rom_map(address_map &map)
|
||||
*
|
||||
*************************************/
|
||||
|
||||
void williams_state::defender_sound_map(address_map &map)
|
||||
void defender_state::sound_map(address_map &map)
|
||||
{
|
||||
map(0x0000, 0x007f).ram(); /* internal RAM */
|
||||
map(0x0400, 0x0403).mirror(0x8000).rw(m_pia[2], FUNC(pia6821_device::read), FUNC(pia6821_device::write));
|
||||
@ -718,7 +733,7 @@ void williams_state::sound_map(address_map &map)
|
||||
}
|
||||
|
||||
/* Same as above, but for second sound board */
|
||||
void blaster_state::sound_map_b(address_map &map)
|
||||
void blaster_state::sound2_map(address_map &map)
|
||||
{
|
||||
map(0x0000, 0x007f).ram(); /* internal RAM */
|
||||
map(0x0080, 0x00ff).ram(); /* MC6810 RAM */
|
||||
@ -734,7 +749,7 @@ void blaster_state::sound_map_b(address_map &map)
|
||||
*
|
||||
*************************************/
|
||||
|
||||
void williams2_state::williams2_sound_map(address_map &map)
|
||||
void williams2_state::sound_map(address_map &map)
|
||||
{
|
||||
map(0x0000, 0x007f).ram(); /* internal RAM */
|
||||
map(0x0080, 0x00ff).ram(); /* MC6810 RAM */
|
||||
@ -1090,10 +1105,10 @@ static INPUT_PORTS_START( sinistar )
|
||||
PORT_BIT( 0x40, IP_ACTIVE_HIGH, IPT_TILT )
|
||||
PORT_BIT( 0x80, IP_ACTIVE_HIGH, IPT_UNKNOWN )
|
||||
|
||||
PORT_START("49WAYX") /* converted by williams_49way_port_0_r() */
|
||||
PORT_START("49WAYX") /* converted by port_0_49way_r() */
|
||||
PORT_BIT( 0xff, 0x38, IPT_AD_STICK_X ) PORT_MINMAX(0x00,0x6f) PORT_SENSITIVITY(100) PORT_KEYDELTA(10)
|
||||
|
||||
PORT_START("49WAYY") /* converted by williams_49way_port_0_r() */
|
||||
PORT_START("49WAYY") /* converted by port_0_49way_r() */
|
||||
PORT_BIT( 0xff, 0x38, IPT_AD_STICK_Y ) PORT_MINMAX(0x00,0x6f) PORT_SENSITIVITY(100) PORT_KEYDELTA(10) PORT_REVERSE
|
||||
INPUT_PORTS_END
|
||||
|
||||
@ -1152,10 +1167,10 @@ static INPUT_PORTS_START( blaster )
|
||||
PORT_START("INP2")
|
||||
PORT_BIT( 0x0f, IP_ACTIVE_HIGH, IPT_UNUSED )
|
||||
|
||||
PORT_START("49WAYX") /* converted by williams_49way_port_0_r() */
|
||||
PORT_START("49WAYX") /* converted by port_0_49way_r() */
|
||||
PORT_BIT( 0xff, 0x38, IPT_AD_STICK_X ) PORT_MINMAX(0x00,0x6f) PORT_SENSITIVITY(100) PORT_KEYDELTA(10)
|
||||
|
||||
PORT_START("49WAYY") /* converted by williams_49way_port_0_r() */
|
||||
PORT_START("49WAYY") /* converted by port_0_49way_r() */
|
||||
PORT_BIT( 0xff, 0x38, IPT_AD_STICK_Y ) PORT_MINMAX(0x00,0x6f) PORT_SENSITIVITY(100) PORT_KEYDELTA(10) PORT_REVERSE
|
||||
INPUT_PORTS_END
|
||||
|
||||
@ -1178,10 +1193,10 @@ static INPUT_PORTS_START( blastkit )
|
||||
PORT_BIT( 0x40, IP_ACTIVE_HIGH, IPT_TILT )
|
||||
PORT_BIT( 0x80, IP_ACTIVE_HIGH, IPT_UNKNOWN )
|
||||
|
||||
PORT_START("49WAYX") /* converted by williams_49way_port_0_r() */
|
||||
PORT_START("49WAYX") /* converted by port_0_49way_r() */
|
||||
PORT_BIT( 0xff, 0x38, IPT_AD_STICK_X ) PORT_MINMAX(0x00,0x6f) PORT_SENSITIVITY(100) PORT_KEYDELTA(10)
|
||||
|
||||
PORT_START("49WAYY") /* converted by williams_49way_port_0_r() */
|
||||
PORT_START("49WAYY") /* converted by port_0_49way_r() */
|
||||
PORT_BIT( 0xff, 0x38, IPT_AD_STICK_Y ) PORT_MINMAX(0x00,0x6f) PORT_SENSITIVITY(100) PORT_KEYDELTA(10) PORT_REVERSE
|
||||
|
||||
PORT_START("IN3")
|
||||
@ -1489,23 +1504,22 @@ GFXDECODE_END
|
||||
*
|
||||
*************************************/
|
||||
|
||||
void williams_state::williams(machine_config &config)
|
||||
void williams_state::williams_base(machine_config &config)
|
||||
{
|
||||
/* basic machine hardware */
|
||||
MC6809E(config, m_maincpu, MASTER_CLOCK/3/4);
|
||||
m_maincpu->set_addrmap(AS_PROGRAM, &williams_state::williams_map);
|
||||
m_maincpu->set_addrmap(AS_PROGRAM, &williams_state::base_map);
|
||||
|
||||
M6808(config, m_soundcpu, SOUND_CLOCK); // internal clock divider of 4, effective frequency is 894.886kHz
|
||||
m_soundcpu->set_addrmap(AS_PROGRAM, &williams_state::sound_map);
|
||||
|
||||
MCFG_MACHINE_START_OVERRIDE(williams_state,williams)
|
||||
NVRAM(config, "nvram", nvram_device::DEFAULT_ALL_0); // 5101 (Defender), 5114 or 6514 (later games) + battery
|
||||
|
||||
// set a timer to go off every 32 scanlines, to toggle the VA11 line and update the screen
|
||||
TIMER(config, "scan_timer").configure_scanline(FUNC(williams_state::williams_va11_callback), "screen", 0, 32);
|
||||
TIMER(config, "scan_timer").configure_scanline(FUNC(williams_state::va11_callback), "screen", 0, 32);
|
||||
|
||||
// also set a timer to go off on scanline 240
|
||||
TIMER(config, "240_timer").configure_scanline(FUNC(williams_state::williams_count240_callback), "screen", 0, 240);
|
||||
TIMER(config, "240_timer").configure_scanline(FUNC(williams_state::count240_callback), "screen", 0, 240);
|
||||
|
||||
WATCHDOG_TIMER(config, m_watchdog);
|
||||
|
||||
@ -1513,11 +1527,9 @@ void williams_state::williams(machine_config &config)
|
||||
SCREEN(config, m_screen, SCREEN_TYPE_RASTER);
|
||||
m_screen->set_video_attributes(VIDEO_UPDATE_SCANLINE | VIDEO_ALWAYS_UPDATE);
|
||||
m_screen->set_raw(MASTER_CLOCK*2/3, 512, 6, 298, 260, 7, 247);
|
||||
m_screen->set_screen_update(FUNC(williams_state::screen_update_williams));
|
||||
m_screen->set_screen_update(FUNC(williams_state::screen_update));
|
||||
|
||||
MCFG_VIDEO_START_OVERRIDE(williams_state,williams)
|
||||
|
||||
PALETTE(config, m_palette, FUNC(williams_state::williams_palette), 256);
|
||||
PALETTE(config, m_palette, FUNC(williams_state::palette_init), 256);
|
||||
|
||||
/* sound hardware */
|
||||
SPEAKER(config, "speaker").front_center();
|
||||
@ -1537,7 +1549,7 @@ void williams_state::williams(machine_config &config)
|
||||
|
||||
PIA6821(config, m_pia[1], 0);
|
||||
m_pia[1]->readpa_handler().set_ioport("IN2");
|
||||
m_pia[1]->writepb_handler().set(FUNC(williams_state::williams_snd_cmd_w));
|
||||
m_pia[1]->writepb_handler().set(FUNC(williams_state::snd_cmd_w));
|
||||
m_pia[1]->irqa_handler().set("mainirq", FUNC(input_merger_any_high_device::in_w<0>));
|
||||
m_pia[1]->irqb_handler().set("mainirq", FUNC(input_merger_any_high_device::in_w<1>));
|
||||
|
||||
@ -1548,26 +1560,22 @@ void williams_state::williams(machine_config &config)
|
||||
}
|
||||
|
||||
|
||||
void williams_state::defender(machine_config &config)
|
||||
void defender_state::defender(machine_config &config)
|
||||
{
|
||||
williams(config);
|
||||
williams_base(config);
|
||||
|
||||
/* basic machine hardware */
|
||||
|
||||
m_maincpu->set_addrmap(AS_PROGRAM, &williams_state::defender_map);
|
||||
m_maincpu->set_addrmap(AS_PROGRAM, &defender_state::main_map);
|
||||
m_soundcpu->set_addrmap(AS_PROGRAM, &defender_state::sound_map);
|
||||
|
||||
m_soundcpu->set_addrmap(AS_PROGRAM, &williams_state::defender_sound_map);
|
||||
|
||||
ADDRESS_MAP_BANK(config, "bankc000").set_map(&williams_state::defender_bankc000_map).set_options(ENDIANNESS_BIG, 8, 16, 0x1000);
|
||||
|
||||
MCFG_MACHINE_START_OVERRIDE(williams_state,defender)
|
||||
MCFG_MACHINE_RESET_OVERRIDE(williams_state,defender)
|
||||
ADDRESS_MAP_BANK(config, m_bankc000).set_map(&defender_state::bankc000_map).set_options(ENDIANNESS_BIG, 8, 16, 0x1000);
|
||||
|
||||
m_screen->set_visarea(12, 304-1, 7, 247-1);
|
||||
}
|
||||
|
||||
|
||||
void williams_state::jin(machine_config &config) // needs a different screen size or the credit text is clipped
|
||||
void defender_state::jin(machine_config &config) // needs a different screen size or the credit text is clipped
|
||||
{
|
||||
defender(config);
|
||||
/* basic machine hardware */
|
||||
@ -1575,9 +1583,9 @@ void williams_state::jin(machine_config &config) // needs a different screen si
|
||||
}
|
||||
|
||||
|
||||
void williams_state::williams_muxed(machine_config &config)
|
||||
void williams_muxed_state::williams_muxed(machine_config &config)
|
||||
{
|
||||
williams(config);
|
||||
williams_base(config);
|
||||
|
||||
/* basic machine hardware */
|
||||
|
||||
@ -1602,10 +1610,10 @@ void williams_state::williams_muxed(machine_config &config)
|
||||
|
||||
void spdball_state::spdball(machine_config &config)
|
||||
{
|
||||
williams(config);
|
||||
williams_base(config);
|
||||
|
||||
/* basic machine hardware */
|
||||
m_maincpu->set_addrmap(AS_PROGRAM, &spdball_state::spdball_map);
|
||||
m_maincpu->set_addrmap(AS_PROGRAM, &spdball_state::main_map);
|
||||
|
||||
/* pia */
|
||||
PIA6821(config, m_pia[3], 0);
|
||||
@ -1616,7 +1624,7 @@ void spdball_state::spdball(machine_config &config)
|
||||
|
||||
void williams_state::lottofun(machine_config &config)
|
||||
{
|
||||
williams(config);
|
||||
williams_base(config);
|
||||
|
||||
/* basic machine hardware */
|
||||
|
||||
@ -1628,27 +1636,36 @@ void williams_state::lottofun(machine_config &config)
|
||||
}
|
||||
|
||||
|
||||
void williams_state::sinistar(machine_config &config)
|
||||
void sinistar_state::sinistar(machine_config &config)
|
||||
{
|
||||
williams(config);
|
||||
williams_base(config);
|
||||
|
||||
/* basic machine hardware */
|
||||
m_maincpu->set_addrmap(AS_PROGRAM, &williams_state::sinistar_map);
|
||||
m_maincpu->set_addrmap(AS_PROGRAM, &sinistar_state::main_map);
|
||||
|
||||
/* sound hardware */
|
||||
HC55516(config, "cvsd", 0).add_route(ALL_OUTPUTS, "speaker", 0.8);
|
||||
|
||||
/* pia */
|
||||
m_pia[0]->readpa_handler().set(FUNC(williams_state::williams_49way_port_0_r));
|
||||
m_pia[0]->readpa_handler().set(FUNC(williams_state::port_0_49way_r));
|
||||
|
||||
m_pia[2]->ca2_handler().set("cvsd", FUNC(hc55516_device::digit_w));
|
||||
m_pia[2]->cb2_handler().set("cvsd", FUNC(hc55516_device::clock_w));
|
||||
}
|
||||
|
||||
|
||||
void williams_state::playball(machine_config &config)
|
||||
void bubbles_state::bubbles(machine_config &config) // has a full 8-bit NVRAM equipped
|
||||
{
|
||||
williams(config);
|
||||
williams_base(config);
|
||||
|
||||
/* basic machine hardware */
|
||||
m_maincpu->set_addrmap(AS_PROGRAM, &bubbles_state::main_map);
|
||||
}
|
||||
|
||||
|
||||
void playball_state::playball(machine_config &config)
|
||||
{
|
||||
williams_base(config);
|
||||
|
||||
/* basic machine hardware */
|
||||
|
||||
@ -1659,7 +1676,7 @@ void williams_state::playball(machine_config &config)
|
||||
HC55516(config, "cvsd", 0).add_route(ALL_OUTPUTS, "speaker", 0.8);
|
||||
|
||||
/* pia */
|
||||
m_pia[1]->writepb_handler().set(FUNC(williams_state::playball_snd_cmd_w));
|
||||
m_pia[1]->writepb_handler().set(FUNC(playball_state::snd_cmd_w));
|
||||
|
||||
m_pia[2]->ca2_handler().set("cvsd", FUNC(hc55516_device::digit_w));
|
||||
m_pia[2]->cb2_handler().set("cvsd", FUNC(hc55516_device::clock_w));
|
||||
@ -1668,16 +1685,13 @@ void williams_state::playball(machine_config &config)
|
||||
|
||||
void blaster_state::blastkit(machine_config &config)
|
||||
{
|
||||
williams(config);
|
||||
williams_base(config);
|
||||
|
||||
/* basic machine hardware */
|
||||
m_maincpu->set_addrmap(AS_PROGRAM, &blaster_state::blaster_map);
|
||||
|
||||
MCFG_MACHINE_START_OVERRIDE(blaster_state,blaster)
|
||||
m_maincpu->set_addrmap(AS_PROGRAM, &blaster_state::main_map);
|
||||
|
||||
/* video hardware */
|
||||
MCFG_VIDEO_START_OVERRIDE(blaster_state,blaster)
|
||||
m_screen->set_screen_update(FUNC(blaster_state::screen_update_blaster));
|
||||
m_screen->set_screen_update(FUNC(blaster_state::screen_update));
|
||||
|
||||
/* pia */
|
||||
m_pia[0]->readpa_handler().set("mux_a", FUNC(ls157_x2_device::output_r));
|
||||
@ -1687,7 +1701,7 @@ void blaster_state::blastkit(machine_config &config)
|
||||
|
||||
LS157_X2(config, m_muxa, 0);
|
||||
m_muxa->a_in_callback().set_ioport("IN3");
|
||||
m_muxa->b_in_callback().set(FUNC(williams_state::williams_49way_port_0_r));
|
||||
m_muxa->b_in_callback().set(FUNC(williams_state::port_0_49way_r));
|
||||
}
|
||||
|
||||
|
||||
@ -1697,7 +1711,7 @@ void blaster_state::blaster(machine_config &config)
|
||||
|
||||
/* basic machine hardware */
|
||||
M6808(config, m_soundcpu_b, SOUND_CLOCK); // internal clock divider of 4, effective frequency is 894.886kHz
|
||||
m_soundcpu_b->set_addrmap(AS_PROGRAM, &blaster_state::sound_map_b);
|
||||
m_soundcpu_b->set_addrmap(AS_PROGRAM, &blaster_state::sound2_map);
|
||||
|
||||
/* pia */
|
||||
m_pia[0]->readpb_handler().set("mux_b", FUNC(ls157_device::output_r)).mask(0x0f);
|
||||
@ -1706,7 +1720,7 @@ void blaster_state::blaster(machine_config &config)
|
||||
m_pia[0]->cb2_handler().append("mux_b", FUNC(ls157_device::select_w));
|
||||
|
||||
// IC7 (for PA0-PA3) + IC5 (for PA4-PA7)
|
||||
m_muxa->a_in_callback().set(FUNC(williams_state::williams_49way_port_0_r));
|
||||
m_muxa->a_in_callback().set(FUNC(williams_state::port_0_49way_r));
|
||||
m_muxa->b_in_callback().set_ioport("IN3");
|
||||
|
||||
LS157(config, m_muxb, 0); // IC3
|
||||
@ -1715,7 +1729,7 @@ void blaster_state::blaster(machine_config &config)
|
||||
|
||||
INPUT_MERGER_ANY_HIGH(config, "soundirq_b").output_handler().set_inputline(m_soundcpu_b, M6808_IRQ_LINE);
|
||||
|
||||
m_pia[1]->writepb_handler().set(FUNC(blaster_state::blaster_snd_cmd_w));
|
||||
m_pia[1]->writepb_handler().set(FUNC(blaster_state::snd_cmd_w));
|
||||
|
||||
m_pia[2]->writepa_handler().set("ldac", FUNC(dac_byte_interface::data_w));
|
||||
|
||||
@ -1739,26 +1753,23 @@ void blaster_state::blaster(machine_config &config)
|
||||
}
|
||||
|
||||
|
||||
void williams2_state::williams2(machine_config &config)
|
||||
void williams2_state::williams2_base(machine_config &config)
|
||||
{
|
||||
/* basic machine hardware */
|
||||
MC6809E(config, m_maincpu, MASTER_CLOCK/3/4);
|
||||
m_maincpu->set_addrmap(AS_PROGRAM, &williams2_state::williams2_d000_ram_map);
|
||||
|
||||
M6808(config, m_soundcpu, MASTER_CLOCK/3); /* yes, this is different from the older games */
|
||||
m_soundcpu->set_addrmap(AS_PROGRAM, &williams2_state::williams2_sound_map);
|
||||
m_soundcpu->set_addrmap(AS_PROGRAM, &williams2_state::sound_map);
|
||||
|
||||
ADDRESS_MAP_BANK(config, "bank8000").set_map(&williams2_state::williams2_bank8000_map).set_options(ENDIANNESS_BIG, 8, 12, 0x800);
|
||||
ADDRESS_MAP_BANK(config, "bank8000").set_map(&williams2_state::bank8000_map).set_options(ENDIANNESS_BIG, 8, 12, 0x800);
|
||||
|
||||
MCFG_MACHINE_START_OVERRIDE(williams2_state,williams2)
|
||||
MCFG_MACHINE_RESET_OVERRIDE(williams2_state,williams2)
|
||||
NVRAM(config, "nvram", nvram_device::DEFAULT_ALL_0); // 5114 + battery
|
||||
|
||||
// set a timer to go off every 32 scanlines, to toggle the VA11 line and update the screen
|
||||
TIMER(config, "scan_timer").configure_scanline(FUNC(williams2_state::williams2_va11_callback), "screen", 0, 32);
|
||||
TIMER(config, "scan_timer").configure_scanline(FUNC(williams2_state::va11_callback), "screen", 0, 32);
|
||||
|
||||
// also set a timer to go off on scanline 254
|
||||
TIMER(config, "254_timer").configure_scanline(FUNC(williams2_state::williams2_endscreen_callback), "screen", 8, 246);
|
||||
TIMER(config, "254_timer").configure_scanline(FUNC(williams2_state::endscreen_callback), "screen", 8, 246);
|
||||
|
||||
WATCHDOG_TIMER(config, m_watchdog);
|
||||
|
||||
@ -1769,9 +1780,7 @@ void williams2_state::williams2(machine_config &config)
|
||||
SCREEN(config, m_screen, SCREEN_TYPE_RASTER);
|
||||
m_screen->set_video_attributes(VIDEO_UPDATE_SCANLINE | VIDEO_ALWAYS_UPDATE);
|
||||
m_screen->set_raw(MASTER_CLOCK*2/3, 512, 8, 284, 260, 8, 248);
|
||||
m_screen->set_screen_update(FUNC(williams2_state::screen_update_williams2));
|
||||
|
||||
MCFG_VIDEO_START_OVERRIDE(williams2_state,williams2)
|
||||
m_screen->set_screen_update(FUNC(williams2_state::screen_update));
|
||||
|
||||
/* sound hardware */
|
||||
SPEAKER(config, "speaker").front_center();
|
||||
@ -1780,18 +1789,17 @@ void williams2_state::williams2(machine_config &config)
|
||||
vref.add_route(0, "dac", 1.0, DAC_VREF_POS_INPUT);
|
||||
vref.add_route(0, "dac", -1.0, DAC_VREF_NEG_INPUT);
|
||||
|
||||
/* pia */
|
||||
INPUT_MERGER_ANY_HIGH(config, "mainirq").output_handler().set_inputline(m_maincpu, M6809_IRQ_LINE);
|
||||
|
||||
INPUT_MERGER_ANY_HIGH(config, "soundirq").output_handler().set_inputline(m_soundcpu, M6808_IRQ_LINE);
|
||||
|
||||
/* pia */
|
||||
PIA6821(config, m_pia[0], 0);
|
||||
m_pia[0]->readpa_handler().set_ioport("IN0");
|
||||
m_pia[0]->readpb_handler().set_ioport("IN1");
|
||||
|
||||
PIA6821(config, m_pia[1], 0);
|
||||
m_pia[1]->readpa_handler().set_ioport("IN2");
|
||||
m_pia[1]->writepb_handler().set(FUNC(williams2_state::williams2_snd_cmd_w));
|
||||
m_pia[1]->writepb_handler().set(FUNC(williams2_state::snd_cmd_w));
|
||||
m_pia[1]->cb2_handler().set(m_pia[2], FUNC(pia6821_device::ca1_w));
|
||||
m_pia[1]->irqa_handler().set("mainirq", FUNC(input_merger_any_high_device::in_w<0>));
|
||||
m_pia[1]->irqb_handler().set("mainirq", FUNC(input_merger_any_high_device::in_w<1>));
|
||||
@ -1805,9 +1813,12 @@ void williams2_state::williams2(machine_config &config)
|
||||
}
|
||||
|
||||
|
||||
void williams2_state::inferno(machine_config &config)
|
||||
void inferno_state::inferno(machine_config &config)
|
||||
{
|
||||
williams2(config);
|
||||
williams2_base(config);
|
||||
m_maincpu->set_addrmap(AS_PROGRAM, &inferno_state::d000_map);
|
||||
|
||||
/* pia */
|
||||
m_pia[0]->readpa_handler().set("mux", FUNC(ls157_x2_device::output_r));
|
||||
m_pia[0]->ca2_handler().set("mux", FUNC(ls157_x2_device::select_w));
|
||||
|
||||
@ -1816,12 +1827,10 @@ void williams2_state::inferno(machine_config &config)
|
||||
m_mux->b_in_callback().set_ioport("INP2");
|
||||
}
|
||||
|
||||
|
||||
void williams2_state::mysticm(machine_config &config)
|
||||
void mysticm_state::mysticm(machine_config &config)
|
||||
{
|
||||
williams2(config);
|
||||
|
||||
/* basic machine hardware */
|
||||
williams2_base(config);
|
||||
m_maincpu->set_addrmap(AS_PROGRAM, &mysticm_state::d000_map);
|
||||
|
||||
/* pia */
|
||||
m_pia[0]->irqa_handler().set_inputline("maincpu", M6809_FIRQ_LINE);
|
||||
@ -1834,12 +1843,10 @@ void williams2_state::mysticm(machine_config &config)
|
||||
|
||||
void tshoot_state::tshoot(machine_config &config)
|
||||
{
|
||||
williams2(config);
|
||||
williams2_base(config);
|
||||
|
||||
/* basic machine hardware */
|
||||
m_maincpu->set_addrmap(AS_PROGRAM, &tshoot_state::williams2_d000_rom_map);
|
||||
|
||||
MCFG_MACHINE_START_OVERRIDE(tshoot_state,tshoot)
|
||||
m_maincpu->set_addrmap(AS_PROGRAM, &tshoot_state::d000_map);
|
||||
|
||||
/* pia */
|
||||
m_pia[0]->readpa_handler().set("mux", FUNC(ls157_x2_device::output_r));
|
||||
@ -1861,24 +1868,21 @@ void tshoot_state::tshoot(machine_config &config)
|
||||
|
||||
void joust2_state::joust2(machine_config &config)
|
||||
{
|
||||
williams2(config);
|
||||
williams2_base(config);
|
||||
|
||||
/* basic machine hardware */
|
||||
m_maincpu->set_addrmap(AS_PROGRAM, &joust2_state::williams2_d000_rom_map);
|
||||
m_maincpu->set_addrmap(AS_PROGRAM, &joust2_state::d000_map);
|
||||
|
||||
WILLIAMS_CVSD_SOUND(config, m_cvsd_sound).add_route(ALL_OUTPUTS, "speaker", 1.0);
|
||||
|
||||
MCFG_MACHINE_START_OVERRIDE(joust2_state,joust2)
|
||||
MCFG_MACHINE_RESET_OVERRIDE(joust2_state,joust2)
|
||||
|
||||
/* pia */
|
||||
m_pia[0]->readpa_handler().set_ioport("IN0").mask(0xf0);
|
||||
m_pia[0]->readpa_handler().append("mux", FUNC(ls157_device::output_r)).mask(0x0f);
|
||||
m_pia[0]->ca2_handler().set("mux", FUNC(ls157_device::select_w));
|
||||
|
||||
m_pia[1]->readpa_handler().set_ioport("IN2");
|
||||
m_pia[1]->writepb_handler().set(FUNC(joust2_state::joust2_snd_cmd_w));
|
||||
m_pia[1]->ca2_handler().set(FUNC(joust2_state::joust2_pia_3_cb1_w));
|
||||
m_pia[1]->writepb_handler().set(FUNC(joust2_state::snd_cmd_w));
|
||||
m_pia[1]->ca2_handler().set(FUNC(joust2_state::pia_3_cb1_w));
|
||||
m_pia[1]->cb2_handler().set(m_pia[2], FUNC(pia6821_device::ca1_w));
|
||||
m_pia[1]->irqa_handler().set("mainirq", FUNC(input_merger_any_high_device::in_w<0>));
|
||||
m_pia[1]->irqb_handler().set("mainirq", FUNC(input_merger_any_high_device::in_w<1>));
|
||||
@ -3149,37 +3153,24 @@ ROM_END
|
||||
|
||||
|
||||
|
||||
/*************************************
|
||||
*
|
||||
* Configuration macros
|
||||
*
|
||||
*************************************/
|
||||
|
||||
#define CONFIGURE_BLITTER(x,c) \
|
||||
m_blitter_config = x; \
|
||||
m_blitter_clip_address = c
|
||||
|
||||
#define CONFIGURE_TILEMAP(x) \
|
||||
m_williams2_tilemap_config = x
|
||||
|
||||
|
||||
|
||||
/*************************************
|
||||
*
|
||||
* Defender hardware driver init
|
||||
*
|
||||
*************************************/
|
||||
|
||||
void williams_state::init_defender()
|
||||
void defender_state::driver_init()
|
||||
{
|
||||
CONFIGURE_BLITTER(WILLIAMS_BLITTER_NONE, 0x0000);
|
||||
m_blitter_config = WILLIAMS_BLITTER_NONE;
|
||||
m_blitter_clip_address = 0x0000;
|
||||
}
|
||||
|
||||
|
||||
void williams_state::init_defndjeu()
|
||||
void defndjeu_state::driver_init()
|
||||
{
|
||||
uint8_t *rom = memregion("maincpu")->base();
|
||||
CONFIGURE_BLITTER(WILLIAMS_BLITTER_NONE, 0x0000);
|
||||
m_blitter_config = WILLIAMS_BLITTER_NONE;
|
||||
m_blitter_clip_address = 0x0000;
|
||||
|
||||
/* apply simple decryption by swapping bits 0 and 7 */
|
||||
for (int i = 0xd000; i < 0x19000; i++)
|
||||
@ -3187,13 +3178,11 @@ void williams_state::init_defndjeu()
|
||||
}
|
||||
|
||||
|
||||
void williams_state::init_mayday()
|
||||
void mayday_state::driver_init()
|
||||
{
|
||||
CONFIGURE_BLITTER(WILLIAMS_BLITTER_NONE, 0x0000);
|
||||
|
||||
/* install a handler to catch protection checks */
|
||||
m_maincpu->space(AS_PROGRAM).install_read_handler(0xa190, 0xa191, read8sm_delegate(*this, FUNC(williams_state::mayday_protection_r)));
|
||||
m_mayday_protection = m_videoram + 0xa190;
|
||||
m_blitter_config = WILLIAMS_BLITTER_NONE;
|
||||
m_blitter_clip_address = 0x0000;
|
||||
m_protection = m_videoram + 0xa190;
|
||||
}
|
||||
|
||||
|
||||
@ -3206,78 +3195,87 @@ void williams_state::init_mayday()
|
||||
|
||||
void williams_state::init_stargate()
|
||||
{
|
||||
CONFIGURE_BLITTER(WILLIAMS_BLITTER_NONE, 0x0000);
|
||||
m_blitter_config = WILLIAMS_BLITTER_NONE;
|
||||
m_blitter_clip_address = 0x0000;
|
||||
}
|
||||
|
||||
|
||||
void williams_state::init_robotron()
|
||||
{
|
||||
CONFIGURE_BLITTER(WILLIAMS_BLITTER_SC1, 0xc000);
|
||||
m_blitter_config = WILLIAMS_BLITTER_SC1;
|
||||
m_blitter_clip_address = 0xc000;
|
||||
}
|
||||
|
||||
|
||||
void williams_state::init_joust()
|
||||
void williams_muxed_state::init_joust()
|
||||
{
|
||||
CONFIGURE_BLITTER(WILLIAMS_BLITTER_SC1, 0xc000);
|
||||
m_blitter_config = WILLIAMS_BLITTER_SC1;
|
||||
m_blitter_clip_address = 0xc000;
|
||||
}
|
||||
|
||||
|
||||
void williams_state::init_bubbles()
|
||||
void bubbles_state::driver_init()
|
||||
{
|
||||
CONFIGURE_BLITTER(WILLIAMS_BLITTER_SC1, 0xc000);
|
||||
|
||||
/* bubbles has a full 8-bit-wide CMOS */
|
||||
m_maincpu->space(AS_PROGRAM).install_write_handler(0xcc00, 0xcfff, write8sm_delegate(*this, FUNC(williams_state::bubbles_cmos_w)));
|
||||
m_blitter_config = WILLIAMS_BLITTER_SC1;
|
||||
m_blitter_clip_address = 0xc000;
|
||||
}
|
||||
|
||||
|
||||
void williams_state::init_splat()
|
||||
void williams_muxed_state::init_splat()
|
||||
{
|
||||
CONFIGURE_BLITTER(WILLIAMS_BLITTER_SC2, 0xc000);
|
||||
m_blitter_config = WILLIAMS_BLITTER_SC2;
|
||||
m_blitter_clip_address = 0xc000;
|
||||
}
|
||||
|
||||
|
||||
void williams_state::init_sinistar()
|
||||
void sinistar_state::driver_init()
|
||||
{
|
||||
CONFIGURE_BLITTER(WILLIAMS_BLITTER_SC1, 0x7400);
|
||||
m_blitter_config = WILLIAMS_BLITTER_SC1;
|
||||
m_blitter_clip_address = 0x7400;
|
||||
}
|
||||
|
||||
|
||||
void williams_state::init_playball()
|
||||
void playball_state::driver_init()
|
||||
{
|
||||
CONFIGURE_BLITTER(WILLIAMS_BLITTER_SC1, 0xc000);
|
||||
m_blitter_config = WILLIAMS_BLITTER_SC1;
|
||||
m_blitter_clip_address = 0xc000;
|
||||
}
|
||||
|
||||
|
||||
void blaster_state::init_blaster()
|
||||
void blaster_state::driver_init()
|
||||
{
|
||||
CONFIGURE_BLITTER(WILLIAMS_BLITTER_SC2, 0x9700);
|
||||
m_blitter_config = WILLIAMS_BLITTER_SC2;
|
||||
m_blitter_clip_address = 0x9700;
|
||||
}
|
||||
|
||||
|
||||
void spdball_state::driver_init()
|
||||
{
|
||||
CONFIGURE_BLITTER(WILLIAMS_BLITTER_SC1, 0xc000);
|
||||
m_blitter_config = WILLIAMS_BLITTER_SC1;
|
||||
m_blitter_clip_address = 0xc000;
|
||||
}
|
||||
|
||||
|
||||
void williams_state::init_alienar()
|
||||
void williams_muxed_state::init_alienar()
|
||||
{
|
||||
CONFIGURE_BLITTER(WILLIAMS_BLITTER_SC1, 0xc000);
|
||||
m_blitter_config = WILLIAMS_BLITTER_SC1;
|
||||
m_blitter_clip_address = 0xc000;
|
||||
m_maincpu->space(AS_PROGRAM).nop_write(0xcbff, 0xcbff);
|
||||
}
|
||||
|
||||
|
||||
void williams_state::init_alienaru()
|
||||
void williams_muxed_state::init_alienaru()
|
||||
{
|
||||
CONFIGURE_BLITTER(WILLIAMS_BLITTER_SC1, 0xc000);
|
||||
m_blitter_config = WILLIAMS_BLITTER_SC1;
|
||||
m_blitter_clip_address = 0xc000;
|
||||
m_maincpu->space(AS_PROGRAM).nop_write(0xcbff, 0xcbff);
|
||||
}
|
||||
|
||||
|
||||
void williams_state::init_lottofun()
|
||||
{
|
||||
CONFIGURE_BLITTER(WILLIAMS_BLITTER_SC1, 0xc000);
|
||||
m_blitter_config = WILLIAMS_BLITTER_SC1;
|
||||
m_blitter_clip_address = 0xc000;
|
||||
}
|
||||
|
||||
|
||||
@ -3288,31 +3286,31 @@ void williams_state::init_lottofun()
|
||||
*
|
||||
*************************************/
|
||||
|
||||
void williams2_state::init_mysticm()
|
||||
void mysticm_state::driver_init()
|
||||
{
|
||||
CONFIGURE_BLITTER(WILLIAMS_BLITTER_SC2, 0x9000);
|
||||
CONFIGURE_TILEMAP(WILLIAMS_TILEMAP_MYSTICM);
|
||||
m_blitter_config = WILLIAMS_BLITTER_SC2;
|
||||
m_blitter_clip_address = 0x9000;
|
||||
}
|
||||
|
||||
|
||||
void williams2_state::init_tshoot()
|
||||
void tshoot_state::driver_init()
|
||||
{
|
||||
CONFIGURE_BLITTER(WILLIAMS_BLITTER_SC2, 0x9000);
|
||||
CONFIGURE_TILEMAP(WILLIAMS_TILEMAP_TSHOOT);
|
||||
m_blitter_config = WILLIAMS_BLITTER_SC2;
|
||||
m_blitter_clip_address = 0x9000;
|
||||
}
|
||||
|
||||
|
||||
void williams2_state::init_inferno()
|
||||
void inferno_state::driver_init()
|
||||
{
|
||||
CONFIGURE_BLITTER(WILLIAMS_BLITTER_SC2, 0x9000);
|
||||
CONFIGURE_TILEMAP(WILLIAMS_TILEMAP_TSHOOT);
|
||||
m_blitter_config = WILLIAMS_BLITTER_SC2;
|
||||
m_blitter_clip_address = 0x9000;
|
||||
}
|
||||
|
||||
|
||||
void joust2_state::init_joust2()
|
||||
void joust2_state::driver_init()
|
||||
{
|
||||
CONFIGURE_BLITTER(WILLIAMS_BLITTER_SC2, 0x9000);
|
||||
CONFIGURE_TILEMAP(WILLIAMS_TILEMAP_JOUST2);
|
||||
m_blitter_config = WILLIAMS_BLITTER_SC2;
|
||||
m_blitter_clip_address = 0x9000;
|
||||
}
|
||||
|
||||
|
||||
@ -3324,80 +3322,80 @@ void joust2_state::init_joust2()
|
||||
*************************************/
|
||||
|
||||
/* Defender hardware games */
|
||||
GAME( 1980, defender, 0, defender, defender, williams_state, init_defender, ROT0, "Williams", "Defender (Red label)", MACHINE_SUPPORTS_SAVE ) // developers left Williams in 1981 and formed Vid Kidz
|
||||
GAME( 1980, defenderg, defender, defender, defender, williams_state, init_defender, ROT0, "Williams", "Defender (Green label)", MACHINE_SUPPORTS_SAVE )
|
||||
GAME( 1980, defenderb, defender, defender, defender, williams_state, init_defender, ROT0, "Williams", "Defender (Blue label)", MACHINE_SUPPORTS_SAVE )
|
||||
GAME( 1980, defenderw, defender, defender, defender, williams_state, init_defender, ROT0, "Williams", "Defender (White label)", MACHINE_SUPPORTS_SAVE )
|
||||
GAME( 1980, defenderj, defender, defender, defender, williams_state, init_defender, ROT0, "Williams (Taito Corporation license)", "T.T Defender", MACHINE_SUPPORTS_SAVE )
|
||||
GAME( 1980, defndjeu, defender, defender, defender, williams_state, init_defndjeu, ROT0, "bootleg (Jeutel)", "Defender (bootleg)", MACHINE_NOT_WORKING | MACHINE_SUPPORTS_SAVE )
|
||||
GAME( 1980, tornado1, defender, defender, defender, williams_state, init_defndjeu, ROT0, "bootleg (Jeutel)", "Tornado (set 1, Defender bootleg)", MACHINE_SUPPORTS_SAVE )
|
||||
GAME( 1980, tornado2, defender, defender, defender, williams_state, init_defndjeu, ROT0, "bootleg (Jeutel)", "Tornado (set 2, Defender bootleg)", MACHINE_NOT_WORKING | MACHINE_SUPPORTS_SAVE ) // bad dump?
|
||||
GAME( 1980, zero, defender, defender, defender, williams_state, init_defndjeu, ROT0, "bootleg (Jeutel)", "Zero (set 1, Defender bootleg)", MACHINE_SUPPORTS_SAVE )
|
||||
GAME( 1980, zero2, defender, defender, defender, williams_state, init_defndjeu, ROT0, "bootleg (Amtec)", "Zero (set 2, Defender bootleg)", MACHINE_SUPPORTS_SAVE )
|
||||
GAME( 1980, defcmnd, defender, defender, defender, williams_state, init_defender, ROT0, "bootleg", "Defense Command (Defender bootleg)", MACHINE_SUPPORTS_SAVE )
|
||||
GAME( 1981, defence, defender, defender, defender, williams_state, init_defender, ROT0, "bootleg (Outer Limits)", "Defence Command (Defender bootleg)", MACHINE_SUPPORTS_SAVE )
|
||||
GAME( 1981, startrkd, defender, defender, defender, williams_state, init_defender, ROT0, "bootleg", "Star Trek (Defender bootleg)", MACHINE_SUPPORTS_SAVE )
|
||||
GAME( 1980, attackf, defender, defender, defender, williams_state, init_defender, ROT0, "bootleg (FAMARE S.A.)", "Attack (Defender bootleg)", MACHINE_SUPPORTS_SAVE )
|
||||
GAME( 1981, galwars2, defender, defender, defender, williams_state, init_defender, ROT0, "bootleg (Sonic)", "Galaxy Wars II (Defender bootleg)", MACHINE_SUPPORTS_SAVE ) // Sega Sonic - Sega S.A., only displays Sonic on title screen
|
||||
GAME( 1980, defender, 0, defender, defender, defender_state, empty_init, ROT0, "Williams", "Defender (Red label)", MACHINE_SUPPORTS_SAVE ) // developers left Williams in 1981 and formed Vid Kidz
|
||||
GAME( 1980, defenderg, defender, defender, defender, defender_state, empty_init, ROT0, "Williams", "Defender (Green label)", MACHINE_SUPPORTS_SAVE )
|
||||
GAME( 1980, defenderb, defender, defender, defender, defender_state, empty_init, ROT0, "Williams", "Defender (Blue label)", MACHINE_SUPPORTS_SAVE )
|
||||
GAME( 1980, defenderw, defender, defender, defender, defender_state, empty_init, ROT0, "Williams", "Defender (White label)", MACHINE_SUPPORTS_SAVE )
|
||||
GAME( 1980, defenderj, defender, defender, defender, defender_state, empty_init, ROT0, "Williams (Taito Corporation license)", "T.T Defender", MACHINE_SUPPORTS_SAVE )
|
||||
GAME( 1980, defndjeu, defender, defender, defender, defndjeu_state, empty_init, ROT0, "bootleg (Jeutel)", "Defender (bootleg)", MACHINE_NOT_WORKING | MACHINE_SUPPORTS_SAVE )
|
||||
GAME( 1980, tornado1, defender, defender, defender, defndjeu_state, empty_init, ROT0, "bootleg (Jeutel)", "Tornado (set 1, Defender bootleg)", MACHINE_SUPPORTS_SAVE )
|
||||
GAME( 1980, tornado2, defender, defender, defender, defndjeu_state, empty_init, ROT0, "bootleg (Jeutel)", "Tornado (set 2, Defender bootleg)", MACHINE_NOT_WORKING | MACHINE_SUPPORTS_SAVE ) // bad dump?
|
||||
GAME( 1980, zero, defender, defender, defender, defndjeu_state, empty_init, ROT0, "bootleg (Jeutel)", "Zero (set 1, Defender bootleg)", MACHINE_SUPPORTS_SAVE )
|
||||
GAME( 1980, zero2, defender, defender, defender, defndjeu_state, empty_init, ROT0, "bootleg (Amtec)", "Zero (set 2, Defender bootleg)", MACHINE_SUPPORTS_SAVE )
|
||||
GAME( 1980, defcmnd, defender, defender, defender, defender_state, empty_init, ROT0, "bootleg", "Defense Command (Defender bootleg)", MACHINE_SUPPORTS_SAVE )
|
||||
GAME( 1981, defence, defender, defender, defender, defender_state, empty_init, ROT0, "bootleg (Outer Limits)", "Defence Command (Defender bootleg)", MACHINE_SUPPORTS_SAVE )
|
||||
GAME( 1981, startrkd, defender, defender, defender, defender_state, empty_init, ROT0, "bootleg", "Star Trek (Defender bootleg)", MACHINE_SUPPORTS_SAVE )
|
||||
GAME( 1980, attackf, defender, defender, defender, defender_state, empty_init, ROT0, "bootleg (FAMARE S.A.)", "Attack (Defender bootleg)", MACHINE_SUPPORTS_SAVE )
|
||||
GAME( 1981, galwars2, defender, defender, defender, defender_state, empty_init, ROT0, "bootleg (Sonic)", "Galaxy Wars II (Defender bootleg)", MACHINE_SUPPORTS_SAVE ) // Sega Sonic - Sega S.A., only displays Sonic on title screen
|
||||
|
||||
GAME( 1980, mayday, 0, defender, mayday, williams_state, init_mayday, ROT0, "Hoei", "Mayday (set 1)", MACHINE_SUPPORTS_SAVE | MACHINE_UNEMULATED_PROTECTION ) // \ original by Hoei, which one of these 3 sets is bootleg/licensed/original is unknown
|
||||
GAME( 1980, maydaya, mayday, defender, mayday, williams_state, init_mayday, ROT0, "Hoei", "Mayday (set 2)", MACHINE_SUPPORTS_SAVE | MACHINE_UNEMULATED_PROTECTION ) // > these games have an unemulated protection chip of some sort which is hacked around in /machine/williams.cpp "mayday_protection_r" function
|
||||
GAME( 1980, maydayb, mayday, defender, mayday, williams_state, init_mayday, ROT0, "Hoei", "Mayday (set 3)", MACHINE_SUPPORTS_SAVE | MACHINE_UNEMULATED_PROTECTION ) // /
|
||||
GAME( 1980, batlzone, mayday, defender, mayday, williams_state, init_mayday, ROT0, "bootleg (Video Game)", "Battle Zone (bootleg of Mayday)", MACHINE_SUPPORTS_SAVE )// the bootleg may or may not use the same protection chip, or some hack around it.
|
||||
GAME( 1980, mayday, 0, defender, mayday, mayday_state, empty_init, ROT0, "Hoei", "Mayday (set 1)", MACHINE_SUPPORTS_SAVE | MACHINE_UNEMULATED_PROTECTION ) // \ original by Hoei, which one of these 3 sets is bootleg/licensed/original is unknown
|
||||
GAME( 1980, maydaya, mayday, defender, mayday, mayday_state, empty_init, ROT0, "Hoei", "Mayday (set 2)", MACHINE_SUPPORTS_SAVE | MACHINE_UNEMULATED_PROTECTION ) // > these games have an unemulated protection chip of some sort which is hacked around in /machine/williams.cpp "protection_r" function
|
||||
GAME( 1980, maydayb, mayday, defender, mayday, mayday_state, empty_init, ROT0, "Hoei", "Mayday (set 3)", MACHINE_SUPPORTS_SAVE | MACHINE_UNEMULATED_PROTECTION ) // /
|
||||
GAME( 1980, batlzone, mayday, defender, mayday, mayday_state, empty_init, ROT0, "bootleg (Video Game)", "Battle Zone (bootleg of Mayday)", MACHINE_SUPPORTS_SAVE )// the bootleg may or may not use the same protection chip, or some hack around it.
|
||||
|
||||
GAME( 1981, colony7, 0, defender, colony7, williams_state, init_defender, ROT270, "Taito", "Colony 7 (set 1)", MACHINE_SUPPORTS_SAVE )
|
||||
GAME( 1981, colony7a, colony7, defender, colony7, williams_state, init_defender, ROT270, "Taito", "Colony 7 (set 2)", MACHINE_SUPPORTS_SAVE )
|
||||
GAME( 1981, colony7, 0, defender, colony7, defender_state, empty_init, ROT270, "Taito", "Colony 7 (set 1)", MACHINE_SUPPORTS_SAVE )
|
||||
GAME( 1981, colony7a, colony7, defender, colony7, defender_state, empty_init, ROT270, "Taito", "Colony 7 (set 2)", MACHINE_SUPPORTS_SAVE )
|
||||
|
||||
GAME( 1982, jin, 0, jin, jin, williams_state, init_defender, ROT90, "Falcon", "Jin", MACHINE_SUPPORTS_SAVE )
|
||||
GAME( 1982, jin, 0, jin, jin, defender_state, empty_init, ROT90, "Falcon", "Jin", MACHINE_SUPPORTS_SAVE )
|
||||
|
||||
|
||||
|
||||
/* Standard Williams hardware */
|
||||
GAME( 1981, stargate, 0, williams, stargate, williams_state, init_stargate, ROT0, "Williams / Vid Kidz", "Stargate", MACHINE_SUPPORTS_SAVE )
|
||||
GAME( 1981, stargate, 0, williams_base, stargate, williams_state, init_stargate, ROT0, "Williams / Vid Kidz", "Stargate", MACHINE_SUPPORTS_SAVE )
|
||||
|
||||
GAME( 1982, robotron, 0, williams, robotron, williams_state, init_robotron, ROT0, "Williams / Vid Kidz", "Robotron: 2084 (Solid Blue label)", MACHINE_SUPPORTS_SAVE )
|
||||
GAME( 1982, robotronyo, robotron, williams, robotron, williams_state, init_robotron, ROT0, "Williams / Vid Kidz", "Robotron: 2084 (Yellow/Orange label)", MACHINE_SUPPORTS_SAVE )
|
||||
GAME( 1982, robotron, 0, williams_base, robotron, williams_state, init_robotron, ROT0, "Williams / Vid Kidz", "Robotron: 2084 (Solid Blue label)", MACHINE_SUPPORTS_SAVE )
|
||||
GAME( 1982, robotronyo, robotron, williams_base, robotron, williams_state, init_robotron, ROT0, "Williams / Vid Kidz", "Robotron: 2084 (Yellow/Orange label)", MACHINE_SUPPORTS_SAVE )
|
||||
// the 3 below are all noteworthy hacks of the Solid BLue set
|
||||
GAME( 1987, robotron87, robotron, williams, robotron, williams_state, init_robotron, ROT0, "hack", "Robotron: 2084 (1987 'shot-in-the-corner' bugfix)", MACHINE_SUPPORTS_SAVE ) // fixes a reset bug.
|
||||
GAME( 2012, robotron12, robotron, williams, robotron, williams_state, init_robotron, ROT0, "hack", "Robotron: 2084 (2012 'wave 201 start' hack)", MACHINE_SUPPORTS_SAVE ) // includes sitc bug fix, used for competitive play.
|
||||
GAME( 2015, robotrontd, robotron, williams, robotron, williams_state, init_robotron, ROT0, "hack", "Robotron: 2084 (2015 'tie-die V2' hack)", MACHINE_SUPPORTS_SAVE ) // inc. sitc fix, mods by some of the original developers, see backstory here http://www.robotron2084guidebook.com/gameplay/raceto100million/robo2k14_tie-die-romset/ (I guess there's a tie-die V1 before it was released to the public?)
|
||||
GAME( 1987, robotron87, robotron, williams_base, robotron, williams_state, init_robotron, ROT0, "hack", "Robotron: 2084 (1987 'shot-in-the-corner' bugfix)", MACHINE_SUPPORTS_SAVE ) // fixes a reset bug.
|
||||
GAME( 2012, robotron12, robotron, williams_base, robotron, williams_state, init_robotron, ROT0, "hack", "Robotron: 2084 (2012 'wave 201 start' hack)", MACHINE_SUPPORTS_SAVE ) // includes sitc bug fix, used for competitive play.
|
||||
GAME( 2015, robotrontd, robotron, williams_base, robotron, williams_state, init_robotron, ROT0, "hack", "Robotron: 2084 (2015 'tie-die V2' hack)", MACHINE_SUPPORTS_SAVE ) // inc. sitc fix, mods by some of the original developers, see backstory here http://www.robotron2084guidebook.com/gameplay/raceto100million/robo2k14_tie-die-romset/ (I guess there's a tie-die V1 before it was released to the public?)
|
||||
|
||||
GAME( 1982, joust, 0, williams_muxed, joust, williams_state, init_joust, ROT0, "Williams", "Joust (White/Green label)", MACHINE_SUPPORTS_SAVE )
|
||||
GAME( 1982, joustr, joust, williams_muxed, joust, williams_state, init_joust, ROT0, "Williams", "Joust (Solid Red label)", MACHINE_SUPPORTS_SAVE )
|
||||
GAME( 1982, joustwr, joust, williams_muxed, joust, williams_state, init_joust, ROT0, "Williams", "Joust (White/Red label)", MACHINE_SUPPORTS_SAVE )
|
||||
GAME( 1982, joust, 0, williams_muxed, joust, williams_muxed_state, init_joust, ROT0, "Williams", "Joust (White/Green label)", MACHINE_SUPPORTS_SAVE )
|
||||
GAME( 1982, joustr, joust, williams_muxed, joust, williams_muxed_state, init_joust, ROT0, "Williams", "Joust (Solid Red label)", MACHINE_SUPPORTS_SAVE )
|
||||
GAME( 1982, joustwr, joust, williams_muxed, joust, williams_muxed_state, init_joust, ROT0, "Williams", "Joust (White/Red label)", MACHINE_SUPPORTS_SAVE )
|
||||
|
||||
GAME( 1982, bubbles, 0, williams, bubbles, williams_state, init_bubbles, ROT0, "Williams", "Bubbles", MACHINE_SUPPORTS_SAVE )
|
||||
GAME( 1982, bubblesr, bubbles, williams, bubbles, williams_state, init_bubbles, ROT0, "Williams", "Bubbles (Solid Red label)", MACHINE_SUPPORTS_SAVE )
|
||||
GAME( 1982, bubblesp, bubbles, williams, bubbles, williams_state, init_bubbles, ROT0, "Williams", "Bubbles (prototype version)", MACHINE_SUPPORTS_SAVE )
|
||||
GAME( 1982, bubbles, 0, bubbles, bubbles, bubbles_state, empty_init, ROT0, "Williams", "Bubbles", MACHINE_SUPPORTS_SAVE )
|
||||
GAME( 1982, bubblesr, bubbles, bubbles, bubbles, bubbles_state, empty_init, ROT0, "Williams", "Bubbles (Solid Red label)", MACHINE_SUPPORTS_SAVE )
|
||||
GAME( 1982, bubblesp, bubbles, bubbles, bubbles, bubbles_state, empty_init, ROT0, "Williams", "Bubbles (prototype version)", MACHINE_SUPPORTS_SAVE )
|
||||
|
||||
GAME( 1982, splat, 0, williams_muxed, splat, williams_state, init_splat, ROT0, "Williams", "Splat!", MACHINE_SUPPORTS_SAVE )
|
||||
GAME( 1982, splat, 0, williams_muxed, splat, williams_muxed_state, init_splat, ROT0, "Williams", "Splat!", MACHINE_SUPPORTS_SAVE )
|
||||
|
||||
GAME( 1982, sinistar, 0, sinistar, sinistar, williams_state, init_sinistar, ROT270, "Williams", "Sinistar (revision 3)", MACHINE_SUPPORTS_SAVE )
|
||||
GAME( 1982, sinistar1, sinistar, sinistar, sinistar, williams_state, init_sinistar, ROT270, "Williams", "Sinistar (prototype version)", MACHINE_SUPPORTS_SAVE )
|
||||
GAME( 1982, sinistar2, sinistar, sinistar, sinistar, williams_state, init_sinistar, ROT270, "Williams", "Sinistar (revision 2)", MACHINE_SUPPORTS_SAVE )
|
||||
GAME( 1982, sinistar, 0, sinistar, sinistar, sinistar_state, empty_init, ROT270, "Williams", "Sinistar (revision 3)", MACHINE_SUPPORTS_SAVE )
|
||||
GAME( 1982, sinistar1, sinistar, sinistar, sinistar, sinistar_state, empty_init, ROT270, "Williams", "Sinistar (prototype version)", MACHINE_SUPPORTS_SAVE )
|
||||
GAME( 1982, sinistar2, sinistar, sinistar, sinistar, sinistar_state, empty_init, ROT270, "Williams", "Sinistar (revision 2)", MACHINE_SUPPORTS_SAVE )
|
||||
|
||||
GAME( 1983, playball, 0, playball, playball, williams_state, init_playball, ROT270, "Williams", "PlayBall! (prototype)", MACHINE_SUPPORTS_SAVE )
|
||||
GAME( 1983, playball, 0, playball, playball, playball_state, empty_init, ROT270, "Williams", "PlayBall! (prototype)", MACHINE_SUPPORTS_SAVE )
|
||||
|
||||
GAME( 1983, blaster, 0, blaster, blaster, blaster_state, init_blaster, ROT0, "Williams / Vid Kidz", "Blaster", MACHINE_SUPPORTS_SAVE )
|
||||
GAME( 1983, blastero, blaster, blaster, blaster, blaster_state, init_blaster, ROT0, "Williams / Vid Kidz", "Blaster (location test)", MACHINE_SUPPORTS_SAVE )
|
||||
GAME( 1983, blasterkit, blaster, blastkit, blastkit, blaster_state, init_blaster, ROT0, "Williams / Vid Kidz", "Blaster (conversion kit)", MACHINE_SUPPORTS_SAVE ) // mono sound
|
||||
GAME( 1983, blaster, 0, blaster, blaster, blaster_state, empty_init, ROT0, "Williams / Vid Kidz", "Blaster", MACHINE_SUPPORTS_SAVE )
|
||||
GAME( 1983, blastero, blaster, blaster, blaster, blaster_state, empty_init, ROT0, "Williams / Vid Kidz", "Blaster (location test)", MACHINE_SUPPORTS_SAVE )
|
||||
GAME( 1983, blasterkit, blaster, blastkit, blastkit, blaster_state, empty_init, ROT0, "Williams / Vid Kidz", "Blaster (conversion kit)", MACHINE_SUPPORTS_SAVE ) // mono sound
|
||||
|
||||
GAME( 1985, spdball, 0, spdball, spdball, spdball_state, driver_init, ROT0, "Williams", "Speed Ball - Contest at Neonworld (prototype)", MACHINE_SUPPORTS_SAVE )
|
||||
GAME( 1985, spdball, 0, spdball, spdball, spdball_state, empty_init, ROT0, "Williams", "Speed Ball - Contest at Neonworld (prototype)", MACHINE_SUPPORTS_SAVE )
|
||||
|
||||
GAME( 1985, alienar, 0, williams_muxed, alienar, williams_state, init_alienar, ROT0, "Duncan Brown", "Alien Arena", MACHINE_SUPPORTS_SAVE )
|
||||
GAME( 1985, alienaru, alienar, williams_muxed, alienar, williams_state, init_alienaru, ROT0, "Duncan Brown", "Alien Arena (Stargate upgrade)", MACHINE_SUPPORTS_SAVE )
|
||||
GAME( 1985, alienar, 0, williams_muxed, alienar, williams_muxed_state, init_alienar, ROT0, "Duncan Brown", "Alien Arena", MACHINE_SUPPORTS_SAVE )
|
||||
GAME( 1985, alienaru, alienar, williams_muxed, alienar, williams_muxed_state, init_alienaru, ROT0, "Duncan Brown", "Alien Arena (Stargate upgrade)", MACHINE_SUPPORTS_SAVE )
|
||||
|
||||
GAME( 1987, lottofun, 0, lottofun, lottofun, williams_state, init_lottofun, ROT0, "H.A.R. Management", "Lotto Fun", MACHINE_SUPPORTS_SAVE )
|
||||
GAME( 1987, lottofun, 0, lottofun, lottofun, williams_state, init_lottofun, ROT0, "H.A.R. Management", "Lotto Fun", MACHINE_SUPPORTS_SAVE )
|
||||
|
||||
|
||||
|
||||
/* 2nd Generation Williams hardware with tilemaps */
|
||||
GAME( 1983, mysticm, 0, mysticm, mysticm, williams2_state, init_mysticm, ROT0, "Williams", "Mystic Marathon", MACHINE_WRONG_COLORS | MACHINE_SUPPORTS_SAVE)
|
||||
GAME( 1983, mysticmp, mysticm, mysticm, mysticm, williams2_state, init_mysticm, ROT0, "Williams", "Mystic Marathon (prototype)", MACHINE_WRONG_COLORS | MACHINE_SUPPORTS_SAVE ) // newest roms are 'proto 6' ?
|
||||
GAME( 1983, mysticm, 0, mysticm, mysticm, mysticm_state, empty_init, ROT0, "Williams", "Mystic Marathon", MACHINE_WRONG_COLORS | MACHINE_SUPPORTS_SAVE)
|
||||
GAME( 1983, mysticmp, mysticm, mysticm, mysticm, mysticm_state, empty_init, ROT0, "Williams", "Mystic Marathon (prototype)", MACHINE_WRONG_COLORS | MACHINE_SUPPORTS_SAVE ) // newest roms are 'proto 6' ?
|
||||
|
||||
GAME( 1984, tshoot, 0, tshoot, tshoot, tshoot_state, init_tshoot, ROT0, "Williams", "Turkey Shoot (prototype)", MACHINE_SUPPORTS_SAVE )
|
||||
GAME( 1984, tshoot, 0, tshoot, tshoot, tshoot_state, empty_init, ROT0, "Williams", "Turkey Shoot (prototype)", MACHINE_SUPPORTS_SAVE )
|
||||
|
||||
GAME( 1984, inferno, 0, inferno, inferno, williams2_state, init_inferno, ROT0, "Williams", "Inferno (Williams)", MACHINE_SUPPORTS_SAVE )
|
||||
GAME( 1984, inferno, 0, inferno, inferno, inferno_state, empty_init, ROT0, "Williams", "Inferno (Williams)", MACHINE_SUPPORTS_SAVE )
|
||||
|
||||
GAME( 1986, joust2, 0, joust2, joust2, joust2_state, init_joust2, ROT270, "Williams", "Joust 2 - Survival of the Fittest (revision 2)", MACHINE_SUPPORTS_SAVE )
|
||||
GAME( 1986, joust2r1, joust2, joust2, joust2, joust2_state, init_joust2, ROT270, "Williams", "Joust 2 - Survival of the Fittest (revision 1)", MACHINE_SUPPORTS_SAVE )
|
||||
GAME( 1986, joust2, 0, joust2, joust2, joust2_state, empty_init, ROT270, "Williams", "Joust 2 - Survival of the Fittest (revision 2)", MACHINE_SUPPORTS_SAVE )
|
||||
GAME( 1986, joust2r1, joust2, joust2, joust2, joust2_state, empty_init, ROT270, "Williams", "Joust 2 - Survival of the Fittest (revision 1)", MACHINE_SUPPORTS_SAVE )
|
||||
|
@ -34,12 +34,6 @@ public:
|
||||
m_mainbank(*this, "mainbank"),
|
||||
m_maincpu(*this, "maincpu"),
|
||||
m_soundcpu(*this, "soundcpu"),
|
||||
m_mux(*this, "mux"),
|
||||
m_mux0(*this, "mux_0"),
|
||||
m_mux1(*this, "mux_1"),
|
||||
m_muxa(*this, "mux_a"),
|
||||
m_muxb(*this, "mux_b"),
|
||||
m_bankc000(*this, "bankc000"),
|
||||
m_watchdog(*this, "watchdog"),
|
||||
m_screen(*this, "screen"),
|
||||
m_palette(*this, "palette"),
|
||||
@ -47,42 +41,28 @@ public:
|
||||
m_pia(*this, "pia_%u", 0U)
|
||||
{ }
|
||||
|
||||
void playball(machine_config &config);
|
||||
void defender(machine_config &config);
|
||||
void sinistar(machine_config &config);
|
||||
void lottofun(machine_config &config);
|
||||
void williams(machine_config &config);
|
||||
void williams_muxed(machine_config &config);
|
||||
void jin(machine_config &config);
|
||||
void williams_base(machine_config &config);
|
||||
|
||||
void init_sinistar();
|
||||
void init_stargate();
|
||||
void init_playball();
|
||||
void init_defender();
|
||||
void init_mayday();
|
||||
void init_lottofun();
|
||||
void init_alienaru();
|
||||
void init_defndjeu();
|
||||
void init_splat();
|
||||
void init_joust();
|
||||
void init_alienar();
|
||||
void init_robotron();
|
||||
void init_bubbles();
|
||||
|
||||
u8 williams_49way_port_0_r();
|
||||
void williams_snd_cmd_w(u8 data);
|
||||
void defender_video_control_w(u8 data);
|
||||
u8 williams_video_counter_r();
|
||||
DECLARE_WRITE8_MEMBER(williams_watchdog_reset_w);
|
||||
u8 port_0_49way_r();
|
||||
u8 video_counter_r();
|
||||
virtual DECLARE_WRITE8_MEMBER(watchdog_reset_w);
|
||||
|
||||
TIMER_DEVICE_CALLBACK_MEMBER(williams_va11_callback);
|
||||
TIMER_DEVICE_CALLBACK_MEMBER(williams_count240_callback);
|
||||
virtual TIMER_DEVICE_CALLBACK_MEMBER(va11_callback);
|
||||
TIMER_DEVICE_CALLBACK_MEMBER(count240_callback);
|
||||
|
||||
uint32_t screen_update_williams(screen_device &screen, bitmap_rgb32 &bitmap, const rectangle &cliprect);
|
||||
DECLARE_VIDEO_START(williams);
|
||||
void williams_palette(palette_device &palette) const;
|
||||
virtual uint32_t screen_update(screen_device &screen, bitmap_rgb32 &bitmap, const rectangle &cliprect);
|
||||
void palette_init(palette_device &palette) const;
|
||||
|
||||
protected:
|
||||
virtual void machine_start() override;
|
||||
virtual void video_start() override;
|
||||
|
||||
enum
|
||||
{
|
||||
//controlbyte (0xCA00) bit definitions
|
||||
@ -99,7 +79,6 @@ protected:
|
||||
required_shared_ptr<uint8_t> m_nvram;
|
||||
required_shared_ptr<uint8_t> m_videoram;
|
||||
optional_memory_bank m_mainbank;
|
||||
uint8_t *m_mayday_protection;
|
||||
uint8_t m_blitter_config;
|
||||
uint16_t m_blitter_clip_address;
|
||||
uint8_t m_blitter_window_enable;
|
||||
@ -110,22 +89,14 @@ protected:
|
||||
uint8_t m_blitter_remap_index;
|
||||
const uint8_t *m_blitter_remap;
|
||||
std::unique_ptr<uint8_t[]> m_blitter_remap_lookup;
|
||||
void williams_vram_select_w(u8 data);
|
||||
void williams_cmos_w(offs_t offset, u8 data);
|
||||
void bubbles_cmos_w(offs_t offset, u8 data);
|
||||
void defender_bank_select_w(u8 data);
|
||||
u8 mayday_protection_r(offs_t offset);
|
||||
virtual void vram_select_w(u8 data);
|
||||
virtual void cmos_w(offs_t offset, u8 data);
|
||||
void sinistar_vram_select_w(u8 data);
|
||||
DECLARE_WRITE8_MEMBER(williams_blitter_w);
|
||||
DECLARE_WRITE8_MEMBER(blitter_w);
|
||||
|
||||
DECLARE_MACHINE_START(defender);
|
||||
DECLARE_MACHINE_RESET(defender);
|
||||
DECLARE_MACHINE_START(williams);
|
||||
DECLARE_MACHINE_START(williams_common);
|
||||
virtual TIMER_CALLBACK_MEMBER(deferred_snd_cmd_w);
|
||||
|
||||
TIMER_CALLBACK_MEMBER(williams_deferred_snd_cmd_w);
|
||||
|
||||
void playball_snd_cmd_w(u8 data);
|
||||
virtual void snd_cmd_w(u8 data);
|
||||
|
||||
DECLARE_WRITE_LINE_MEMBER(lottofun_coin_lock_w);
|
||||
|
||||
@ -136,24 +107,140 @@ protected:
|
||||
|
||||
required_device<cpu_device> m_maincpu;
|
||||
required_device<cpu_device> m_soundcpu;
|
||||
optional_device<ls157_device> m_mux;
|
||||
optional_device<ls157_device> m_mux0;
|
||||
optional_device<ls157_device> m_mux1;
|
||||
optional_device<ls157_x2_device> m_muxa;
|
||||
optional_device<ls157_device> m_muxb;
|
||||
optional_device<address_map_bank_device> m_bankc000;
|
||||
required_device<watchdog_timer_device> m_watchdog;
|
||||
required_device<screen_device> m_screen;
|
||||
optional_device<palette_device> m_palette;
|
||||
optional_shared_ptr<uint8_t> m_paletteram;
|
||||
optional_device_array<pia6821_device, 4> m_pia;
|
||||
|
||||
void defender_bankc000_map(address_map &map);
|
||||
void defender_map(address_map &map);
|
||||
void defender_sound_map(address_map &map);
|
||||
void sinistar_map(address_map &map);
|
||||
void sound_map(address_map &map);
|
||||
void williams_map(address_map &map);
|
||||
virtual void sound_map(address_map &map);
|
||||
void base_map(address_map &map);
|
||||
};
|
||||
|
||||
class defender_state : public williams_state
|
||||
{
|
||||
public:
|
||||
defender_state(const machine_config &mconfig, device_type type, const char *tag) :
|
||||
williams_state(mconfig, type, tag),
|
||||
m_bankc000(*this, "bankc000")
|
||||
{ }
|
||||
|
||||
void defender(machine_config &config);
|
||||
void jin(machine_config &config);
|
||||
|
||||
protected:
|
||||
virtual void driver_init() override;
|
||||
|
||||
virtual void main_map(address_map &map);
|
||||
|
||||
private:
|
||||
virtual void machine_start() override { }
|
||||
virtual void machine_reset() override;
|
||||
|
||||
void bankc000_map(address_map &map);
|
||||
virtual void sound_map(address_map &map) override;
|
||||
|
||||
void bank_select_w(u8 data);
|
||||
void video_control_w(u8 data);
|
||||
|
||||
required_device<address_map_bank_device> m_bankc000;
|
||||
};
|
||||
|
||||
class defndjeu_state : public defender_state
|
||||
{
|
||||
public:
|
||||
defndjeu_state(const machine_config &mconfig, device_type type, const char *tag) :
|
||||
defender_state(mconfig, type, tag)
|
||||
{ }
|
||||
|
||||
private:
|
||||
virtual void driver_init() override;
|
||||
};
|
||||
|
||||
class mayday_state : public defender_state
|
||||
{
|
||||
public:
|
||||
mayday_state(const machine_config &mconfig, device_type type, const char *tag) :
|
||||
defender_state(mconfig, type, tag)
|
||||
{ }
|
||||
|
||||
private:
|
||||
virtual void driver_init() override;
|
||||
|
||||
virtual void main_map(address_map &map) override;
|
||||
|
||||
uint8_t *m_protection;
|
||||
u8 protection_r(offs_t offset);
|
||||
};
|
||||
|
||||
class sinistar_state : public williams_state
|
||||
{
|
||||
public:
|
||||
sinistar_state(const machine_config &mconfig, device_type type, const char *tag) :
|
||||
williams_state(mconfig, type, tag)
|
||||
{ }
|
||||
|
||||
void sinistar(machine_config &config);
|
||||
|
||||
private:
|
||||
virtual void driver_init() override;
|
||||
|
||||
virtual void vram_select_w(u8 data) override;
|
||||
|
||||
void main_map(address_map &map);
|
||||
};
|
||||
|
||||
class bubbles_state : public williams_state
|
||||
{
|
||||
public:
|
||||
bubbles_state(const machine_config &mconfig, device_type type, const char *tag) :
|
||||
williams_state(mconfig, type, tag)
|
||||
{ }
|
||||
|
||||
void bubbles(machine_config &config);
|
||||
|
||||
private:
|
||||
virtual void driver_init() override;
|
||||
|
||||
void main_map(address_map &map);
|
||||
|
||||
virtual void cmos_w(offs_t offset, u8 data) override;
|
||||
};
|
||||
|
||||
class playball_state : public williams_state
|
||||
{
|
||||
public:
|
||||
playball_state(const machine_config &mconfig, device_type type, const char *tag) :
|
||||
williams_state(mconfig, type, tag)
|
||||
{ }
|
||||
|
||||
void playball(machine_config &config);
|
||||
|
||||
private:
|
||||
virtual void driver_init() override;
|
||||
|
||||
virtual void snd_cmd_w(u8 data) override;
|
||||
};
|
||||
|
||||
class williams_muxed_state : public williams_state
|
||||
{
|
||||
public:
|
||||
williams_muxed_state(const machine_config &mconfig, device_type type, const char *tag) :
|
||||
williams_state(mconfig, type, tag),
|
||||
m_mux0(*this, "mux_0"),
|
||||
m_mux1(*this, "mux_1")
|
||||
{ }
|
||||
|
||||
void williams_muxed(machine_config &config);
|
||||
|
||||
void init_splat();
|
||||
void init_joust();
|
||||
void init_alienar();
|
||||
void init_alienaru();
|
||||
|
||||
private:
|
||||
required_device<ls157_device> m_mux0;
|
||||
required_device<ls157_device> m_mux1;
|
||||
};
|
||||
|
||||
class spdball_state : public williams_state
|
||||
@ -165,10 +252,10 @@ public:
|
||||
|
||||
void spdball(machine_config &config);
|
||||
|
||||
void driver_init() override;
|
||||
|
||||
private:
|
||||
void spdball_map(address_map &map);
|
||||
virtual void driver_init() override;
|
||||
|
||||
void main_map(address_map &map);
|
||||
};
|
||||
|
||||
class blaster_state : public williams_state
|
||||
@ -177,45 +264,48 @@ public:
|
||||
blaster_state(const machine_config &mconfig, device_type type, const char *tag) :
|
||||
williams_state(mconfig, type, tag),
|
||||
m_soundcpu_b(*this, "soundcpu_b"),
|
||||
m_blaster_palette_0(*this, "blaster_pal0"),
|
||||
m_blaster_scanline_control(*this, "blaster_scan"),
|
||||
m_blaster_bankb(*this, "blaster_bankb")
|
||||
m_palette_0(*this, "blaster_pal0"),
|
||||
m_scanline_control(*this, "blaster_scan"),
|
||||
m_bankb(*this, "blaster_bankb"),
|
||||
m_muxa(*this, "mux_a"),
|
||||
m_muxb(*this, "mux_b")
|
||||
{ }
|
||||
|
||||
void blastkit(machine_config &config);
|
||||
void blaster(machine_config &config);
|
||||
|
||||
void init_blaster();
|
||||
|
||||
private:
|
||||
optional_device<cpu_device> m_soundcpu_b;
|
||||
required_shared_ptr<uint8_t> m_blaster_palette_0;
|
||||
required_shared_ptr<uint8_t> m_blaster_scanline_control;
|
||||
optional_memory_bank m_blaster_bankb;
|
||||
virtual void machine_start() override;
|
||||
virtual void video_start() override;
|
||||
virtual void driver_init() override;
|
||||
|
||||
rgb_t m_blaster_color0;
|
||||
uint8_t m_blaster_video_control;
|
||||
optional_device<cpu_device> m_soundcpu_b;
|
||||
required_shared_ptr<uint8_t> m_palette_0;
|
||||
required_shared_ptr<uint8_t> m_scanline_control;
|
||||
optional_memory_bank m_bankb;
|
||||
required_device<ls157_x2_device> m_muxa;
|
||||
optional_device<ls157_device> m_muxb;
|
||||
|
||||
rgb_t m_color0;
|
||||
uint8_t m_video_control;
|
||||
uint8_t m_vram_bank;
|
||||
uint8_t m_rom_bank;
|
||||
|
||||
void blaster_vram_select_w(u8 data);
|
||||
void blaster_bank_select_w(u8 data);
|
||||
void blaster_remap_select_w(u8 data);
|
||||
void blaster_video_control_w(u8 data);
|
||||
TIMER_CALLBACK_MEMBER(blaster_deferred_snd_cmd_w);
|
||||
void blaster_snd_cmd_w(u8 data);
|
||||
virtual void vram_select_w(u8 data) override;
|
||||
void bank_select_w(u8 data);
|
||||
void remap_select_w(u8 data);
|
||||
void video_control_w(u8 data);
|
||||
virtual TIMER_CALLBACK_MEMBER(deferred_snd_cmd_w) override;
|
||||
virtual void snd_cmd_w(u8 data) override;
|
||||
|
||||
DECLARE_MACHINE_START(blaster);
|
||||
DECLARE_VIDEO_START(blaster);
|
||||
uint32_t screen_update_blaster(screen_device &screen, bitmap_rgb32 &bitmap, const rectangle &cliprect);
|
||||
virtual uint32_t screen_update(screen_device &screen, bitmap_rgb32 &bitmap, const rectangle &cliprect) override;
|
||||
|
||||
inline void update_blaster_banking();
|
||||
|
||||
void blaster_map(address_map &map);
|
||||
void sound_map_b(address_map &map);
|
||||
void main_map(address_map &map);
|
||||
void sound2_map(address_map &map);
|
||||
};
|
||||
|
||||
|
||||
class williams2_state : public williams_state
|
||||
{
|
||||
public:
|
||||
@ -223,61 +313,109 @@ public:
|
||||
williams_state(mconfig, type, tag),
|
||||
m_bank8000(*this, "bank8000"),
|
||||
m_gfxdecode(*this, "gfxdecode"),
|
||||
m_williams2_tileram(*this, "williams2_tile")
|
||||
m_tileram(*this, "williams2_tile")
|
||||
{ }
|
||||
|
||||
void williams2(machine_config &config);
|
||||
void mysticm(machine_config &config);
|
||||
void inferno(machine_config &config);
|
||||
|
||||
void init_mysticm();
|
||||
void init_tshoot();
|
||||
void init_inferno();
|
||||
void williams2_base(machine_config &config);
|
||||
|
||||
protected:
|
||||
virtual void machine_start() override;
|
||||
virtual void machine_reset() override;
|
||||
virtual void video_start() override;
|
||||
|
||||
required_device<address_map_bank_device> m_bank8000;
|
||||
required_device<gfxdecode_device> m_gfxdecode;
|
||||
required_shared_ptr<uint8_t> m_williams2_tileram;
|
||||
required_shared_ptr<uint8_t> m_tileram;
|
||||
|
||||
tilemap_t *m_bg_tilemap;
|
||||
uint16_t m_tilemap_xscroll;
|
||||
uint8_t m_williams2_fg_color;
|
||||
uint8_t m_williams2_tilemap_config;
|
||||
uint8_t m_fg_color;
|
||||
|
||||
TILE_GET_INFO_MEMBER(get_tile_info);
|
||||
void williams2_bank_select_w(u8 data);
|
||||
DECLARE_WRITE8_MEMBER(williams2_watchdog_reset_w);
|
||||
void williams2_7segment_w(u8 data);
|
||||
void williams2_paletteram_w(offs_t offset, u8 data);
|
||||
void williams2_fg_select_w(u8 data);
|
||||
void williams2_bg_select_w(u8 data);
|
||||
void williams2_tileram_w(offs_t offset, u8 data);
|
||||
void williams2_xscroll_low_w(u8 data);
|
||||
void williams2_xscroll_high_w(u8 data);
|
||||
void williams2_blit_window_enable_w(u8 data);
|
||||
TIMER_DEVICE_CALLBACK_MEMBER(williams2_va11_callback);
|
||||
TIMER_DEVICE_CALLBACK_MEMBER(williams2_endscreen_callback);
|
||||
TIMER_CALLBACK_MEMBER(williams2_deferred_snd_cmd_w);
|
||||
void williams2_snd_cmd_w(u8 data);
|
||||
virtual TILE_GET_INFO_MEMBER(get_tile_info);
|
||||
void bank_select_w(u8 data);
|
||||
virtual DECLARE_WRITE8_MEMBER(watchdog_reset_w) override;
|
||||
void segments_w(u8 data);
|
||||
void paletteram_w(offs_t offset, u8 data);
|
||||
void fg_select_w(u8 data);
|
||||
virtual void bg_select_w(u8 data);
|
||||
void tileram_w(offs_t offset, u8 data);
|
||||
void xscroll_low_w(u8 data);
|
||||
void xscroll_high_w(u8 data);
|
||||
void blit_window_enable_w(u8 data);
|
||||
virtual TIMER_DEVICE_CALLBACK_MEMBER(va11_callback) override;
|
||||
TIMER_DEVICE_CALLBACK_MEMBER(endscreen_callback);
|
||||
virtual TIMER_CALLBACK_MEMBER(deferred_snd_cmd_w) override;
|
||||
virtual void snd_cmd_w(u8 data) override;
|
||||
|
||||
DECLARE_MACHINE_START(williams2);
|
||||
DECLARE_MACHINE_RESET(williams2);
|
||||
DECLARE_VIDEO_START(williams2);
|
||||
uint32_t screen_update_williams2(screen_device &screen, bitmap_rgb32 &bitmap, const rectangle &cliprect);
|
||||
virtual uint32_t screen_update(screen_device &screen, bitmap_rgb32 &bitmap, const rectangle &cliprect) override;
|
||||
|
||||
void williams2_bank8000_map(address_map &map);
|
||||
void williams2_common_map(address_map &map);
|
||||
void williams2_d000_ram_map(address_map &map);
|
||||
void williams2_d000_rom_map(address_map &map);
|
||||
void williams2_sound_map(address_map &map);
|
||||
void bank8000_map(address_map &map);
|
||||
void common_map(address_map &map);
|
||||
virtual void sound_map(address_map &map) override;
|
||||
|
||||
void video_control_w(u8 data);
|
||||
};
|
||||
|
||||
class williams_d000_rom_state : public williams2_state
|
||||
{
|
||||
public:
|
||||
williams_d000_rom_state(const machine_config &mconfig, device_type type, const char *tag) :
|
||||
williams2_state(mconfig, type, tag)
|
||||
{ }
|
||||
|
||||
class tshoot_state : public williams2_state
|
||||
protected:
|
||||
void d000_map(address_map &map);
|
||||
};
|
||||
|
||||
class williams_d000_ram_state : public williams2_state
|
||||
{
|
||||
public:
|
||||
williams_d000_ram_state(const machine_config &mconfig, device_type type, const char *tag) :
|
||||
williams2_state(mconfig, type, tag)
|
||||
{ }
|
||||
|
||||
protected:
|
||||
void d000_map(address_map &map);
|
||||
};
|
||||
|
||||
class inferno_state : public williams_d000_ram_state
|
||||
{
|
||||
public:
|
||||
inferno_state(const machine_config &mconfig, device_type type, const char *tag) :
|
||||
williams_d000_ram_state(mconfig, type, tag),
|
||||
m_mux(*this, "mux")
|
||||
{ }
|
||||
|
||||
void inferno(machine_config &config);
|
||||
|
||||
private:
|
||||
virtual void driver_init() override;
|
||||
|
||||
required_device<ls157_device> m_mux;
|
||||
};
|
||||
|
||||
class mysticm_state : public williams_d000_ram_state
|
||||
{
|
||||
public:
|
||||
mysticm_state(const machine_config &mconfig, device_type type, const char *tag) :
|
||||
williams_d000_ram_state(mconfig, type, tag)
|
||||
{ }
|
||||
|
||||
void mysticm(machine_config &config);
|
||||
|
||||
private:
|
||||
virtual void driver_init() override;
|
||||
|
||||
virtual TILE_GET_INFO_MEMBER(get_tile_info) override;
|
||||
virtual void bg_select_w(u8 data) override;
|
||||
};
|
||||
|
||||
class tshoot_state : public williams_d000_rom_state
|
||||
{
|
||||
public:
|
||||
tshoot_state(const machine_config &mconfig, device_type type, const char *tag) :
|
||||
williams2_state(mconfig, type, tag),
|
||||
williams_d000_rom_state(mconfig, type, tag),
|
||||
m_mux(*this, "mux"),
|
||||
m_gun(*this, {"GUNX", "GUNY"}),
|
||||
m_grenade_lamp(*this, "Grenade_lamp"),
|
||||
m_gun_lamp(*this, "Gun_lamp"),
|
||||
@ -290,11 +428,13 @@ public:
|
||||
template <int P> DECLARE_CUSTOM_INPUT_MEMBER(gun_r);
|
||||
|
||||
private:
|
||||
virtual void machine_start() override;
|
||||
virtual void driver_init() override;
|
||||
|
||||
DECLARE_WRITE_LINE_MEMBER(maxvol_w);
|
||||
void lamp_w(u8 data);
|
||||
|
||||
DECLARE_MACHINE_START(tshoot);
|
||||
|
||||
required_device<ls157_device> m_mux;
|
||||
required_ioport_array<2> m_gun;
|
||||
output_finder<> m_grenade_lamp;
|
||||
output_finder<> m_gun_lamp;
|
||||
@ -302,27 +442,31 @@ private:
|
||||
output_finder<> m_feather_blower;
|
||||
};
|
||||
|
||||
class joust2_state : public williams2_state
|
||||
class joust2_state : public williams_d000_rom_state
|
||||
{
|
||||
public:
|
||||
joust2_state(const machine_config &mconfig, device_type type, const char *tag) :
|
||||
williams2_state(mconfig, type, tag),
|
||||
williams_d000_rom_state(mconfig, type, tag),
|
||||
m_mux(*this, "mux"),
|
||||
m_cvsd_sound(*this, "cvsd")
|
||||
{ }
|
||||
|
||||
void joust2(machine_config &config);
|
||||
|
||||
void init_joust2();
|
||||
|
||||
private:
|
||||
required_device<williams_cvsd_sound_device> m_cvsd_sound;
|
||||
uint16_t m_joust2_current_sound_data;
|
||||
virtual void machine_start() override;
|
||||
virtual void driver_init() override;
|
||||
|
||||
DECLARE_MACHINE_START(joust2);
|
||||
DECLARE_MACHINE_RESET(joust2);
|
||||
TIMER_CALLBACK_MEMBER(joust2_deferred_snd_cmd_w);
|
||||
DECLARE_WRITE8_MEMBER(joust2_snd_cmd_w);
|
||||
DECLARE_WRITE_LINE_MEMBER(joust2_pia_3_cb1_w);
|
||||
required_device<ls157_device> m_mux;
|
||||
required_device<williams_cvsd_sound_device> m_cvsd_sound;
|
||||
uint16_t m_current_sound_data;
|
||||
|
||||
virtual TILE_GET_INFO_MEMBER(get_tile_info) override;
|
||||
virtual void bg_select_w(u8 data) override;
|
||||
|
||||
virtual TIMER_CALLBACK_MEMBER(deferred_snd_cmd_w) override;
|
||||
virtual void snd_cmd_w(u8 data) override;
|
||||
DECLARE_WRITE_LINE_MEMBER(pia_3_cb1_w);
|
||||
};
|
||||
|
||||
/*----------- defined in video/williams.cpp -----------*/
|
||||
|
@ -16,7 +16,7 @@
|
||||
*
|
||||
*************************************/
|
||||
|
||||
TIMER_DEVICE_CALLBACK_MEMBER(williams_state::williams_va11_callback)
|
||||
TIMER_DEVICE_CALLBACK_MEMBER(williams_state::va11_callback)
|
||||
{
|
||||
int scanline = param;
|
||||
|
||||
@ -29,7 +29,7 @@ TIMER_DEVICE_CALLBACK_MEMBER(williams_state::williams_va11_callback)
|
||||
}
|
||||
|
||||
|
||||
TIMER_DEVICE_CALLBACK_MEMBER(williams_state::williams_count240_callback)
|
||||
TIMER_DEVICE_CALLBACK_MEMBER(williams_state::count240_callback)
|
||||
{
|
||||
int scanline = param;
|
||||
|
||||
@ -44,7 +44,7 @@ TIMER_DEVICE_CALLBACK_MEMBER(williams_state::williams_count240_callback)
|
||||
*
|
||||
*************************************/
|
||||
|
||||
MACHINE_START_MEMBER(williams_state,williams_common)
|
||||
void williams_state::machine_start()
|
||||
{
|
||||
/* configure the memory bank */
|
||||
m_mainbank->configure_entry(1, memregion("maincpu")->base() + 0x10000);
|
||||
@ -52,20 +52,13 @@ MACHINE_START_MEMBER(williams_state,williams_common)
|
||||
}
|
||||
|
||||
|
||||
MACHINE_START_MEMBER(williams_state,williams)
|
||||
{
|
||||
MACHINE_START_CALL_MEMBER(williams_common);
|
||||
}
|
||||
|
||||
|
||||
|
||||
/*************************************
|
||||
*
|
||||
* Newer Williams interrupts
|
||||
*
|
||||
*************************************/
|
||||
|
||||
TIMER_DEVICE_CALLBACK_MEMBER(williams2_state::williams2_va11_callback)
|
||||
TIMER_DEVICE_CALLBACK_MEMBER(williams2_state::va11_callback)
|
||||
{
|
||||
int scanline = param;
|
||||
if (scanline == 256)
|
||||
@ -77,7 +70,7 @@ TIMER_DEVICE_CALLBACK_MEMBER(williams2_state::williams2_va11_callback)
|
||||
}
|
||||
|
||||
|
||||
TIMER_DEVICE_CALLBACK_MEMBER(williams2_state::williams2_endscreen_callback)
|
||||
TIMER_DEVICE_CALLBACK_MEMBER(williams2_state::endscreen_callback)
|
||||
{
|
||||
int scanline = param;
|
||||
|
||||
@ -93,7 +86,7 @@ TIMER_DEVICE_CALLBACK_MEMBER(williams2_state::williams2_endscreen_callback)
|
||||
*
|
||||
*************************************/
|
||||
|
||||
MACHINE_START_MEMBER(williams2_state,williams2)
|
||||
void williams2_state::machine_start()
|
||||
{
|
||||
/* configure memory banks */
|
||||
m_mainbank->configure_entries(1, 4, memregion("maincpu")->base() + 0x10000, 0x10000);
|
||||
@ -102,10 +95,10 @@ MACHINE_START_MEMBER(williams2_state,williams2)
|
||||
}
|
||||
|
||||
|
||||
MACHINE_RESET_MEMBER(williams2_state,williams2)
|
||||
void williams2_state::machine_reset()
|
||||
{
|
||||
/* make sure our banking is reset */
|
||||
williams2_bank_select_w(0);
|
||||
bank_select_w(0);
|
||||
}
|
||||
|
||||
|
||||
@ -116,7 +109,7 @@ MACHINE_RESET_MEMBER(williams2_state,williams2)
|
||||
*
|
||||
*************************************/
|
||||
|
||||
void williams_state::williams_vram_select_w(u8 data)
|
||||
void williams_state::vram_select_w(u8 data)
|
||||
{
|
||||
/* VRAM/ROM banking from bit 0 */
|
||||
m_mainbank->set_entry(data & 0x01);
|
||||
@ -126,7 +119,7 @@ void williams_state::williams_vram_select_w(u8 data)
|
||||
}
|
||||
|
||||
|
||||
void williams2_state::williams2_bank_select_w(u8 data)
|
||||
void williams2_state::bank_select_w(u8 data)
|
||||
{
|
||||
/* the low two bits control the paging */
|
||||
switch (data & 0x03)
|
||||
@ -160,31 +153,31 @@ void williams2_state::williams2_bank_select_w(u8 data)
|
||||
*
|
||||
*************************************/
|
||||
|
||||
TIMER_CALLBACK_MEMBER(williams_state::williams_deferred_snd_cmd_w)
|
||||
TIMER_CALLBACK_MEMBER(williams_state::deferred_snd_cmd_w)
|
||||
{
|
||||
m_pia[2]->write_portb(param);
|
||||
m_pia[2]->cb1_w((param == 0xff) ? 0 : 1);
|
||||
}
|
||||
|
||||
void williams_state::williams_snd_cmd_w(u8 data)
|
||||
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::williams_deferred_snd_cmd_w),this), data | 0xc0);
|
||||
machine().scheduler().synchronize(timer_expired_delegate(FUNC(williams_state::deferred_snd_cmd_w),this), data | 0xc0);
|
||||
}
|
||||
|
||||
void williams_state::playball_snd_cmd_w(u8 data)
|
||||
void playball_state::snd_cmd_w(u8 data)
|
||||
{
|
||||
machine().scheduler().synchronize(timer_expired_delegate(FUNC(williams_state::williams_deferred_snd_cmd_w),this), data);
|
||||
machine().scheduler().synchronize(timer_expired_delegate(FUNC(playball_state::deferred_snd_cmd_w),this), data);
|
||||
}
|
||||
|
||||
TIMER_CALLBACK_MEMBER(williams2_state::williams2_deferred_snd_cmd_w)
|
||||
TIMER_CALLBACK_MEMBER(williams2_state::deferred_snd_cmd_w)
|
||||
{
|
||||
m_pia[2]->write_porta(param);
|
||||
}
|
||||
|
||||
void williams2_state::williams2_snd_cmd_w(u8 data)
|
||||
void williams2_state::snd_cmd_w(u8 data)
|
||||
{
|
||||
machine().scheduler().synchronize(timer_expired_delegate(FUNC(williams2_state::williams2_deferred_snd_cmd_w),this), data);
|
||||
machine().scheduler().synchronize(timer_expired_delegate(FUNC(williams2_state::deferred_snd_cmd_w),this), data);
|
||||
}
|
||||
|
||||
|
||||
@ -214,7 +207,7 @@ void williams2_state::williams2_snd_cmd_w(u8 data)
|
||||
* 1000 = right/down full
|
||||
*/
|
||||
|
||||
u8 williams_state::williams_49way_port_0_r()
|
||||
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];
|
||||
@ -228,14 +221,14 @@ u8 williams_state::williams_49way_port_0_r()
|
||||
*
|
||||
*************************************/
|
||||
|
||||
void williams_state::williams_cmos_w(offs_t offset, u8 data)
|
||||
void williams_state::cmos_w(offs_t offset, u8 data)
|
||||
{
|
||||
/* only 4 bits are valid */
|
||||
m_nvram[offset] = data | 0xf0;
|
||||
}
|
||||
|
||||
|
||||
void williams_state::bubbles_cmos_w(offs_t offset, u8 data)
|
||||
void bubbles_state::cmos_w(offs_t offset, u8 data)
|
||||
{
|
||||
/* bubbles has additional CMOS for a full 8 bits */
|
||||
m_nvram[offset] = data;
|
||||
@ -249,7 +242,7 @@ void williams_state::bubbles_cmos_w(offs_t offset, u8 data)
|
||||
*
|
||||
*************************************/
|
||||
|
||||
WRITE8_MEMBER(williams_state::williams_watchdog_reset_w)
|
||||
WRITE8_MEMBER(williams_state::watchdog_reset_w)
|
||||
{
|
||||
/* yes, the data bits are checked for this specific value */
|
||||
if (data == 0x39)
|
||||
@ -257,7 +250,7 @@ WRITE8_MEMBER(williams_state::williams_watchdog_reset_w)
|
||||
}
|
||||
|
||||
|
||||
WRITE8_MEMBER(williams2_state::williams2_watchdog_reset_w)
|
||||
WRITE8_MEMBER(williams2_state::watchdog_reset_w)
|
||||
{
|
||||
/* yes, the data bits are checked for this specific value */
|
||||
if ((data & 0x3f) == 0x14)
|
||||
@ -272,7 +265,7 @@ WRITE8_MEMBER(williams2_state::williams2_watchdog_reset_w)
|
||||
*
|
||||
*************************************/
|
||||
|
||||
void williams2_state::williams2_7segment_w(u8 data)
|
||||
void williams2_state::segments_w(u8 data)
|
||||
{
|
||||
int n;
|
||||
char dot;
|
||||
@ -313,24 +306,19 @@ void williams2_state::williams2_7segment_w(u8 data)
|
||||
*
|
||||
*************************************/
|
||||
|
||||
MACHINE_START_MEMBER(williams_state,defender)
|
||||
void defender_state::machine_reset()
|
||||
{
|
||||
bank_select_w(0);
|
||||
}
|
||||
|
||||
|
||||
MACHINE_RESET_MEMBER(williams_state,defender)
|
||||
{
|
||||
defender_bank_select_w(0);
|
||||
}
|
||||
|
||||
|
||||
void williams_state::defender_video_control_w(u8 data)
|
||||
void defender_state::video_control_w(u8 data)
|
||||
{
|
||||
m_cocktail = data & 0x01;
|
||||
}
|
||||
|
||||
|
||||
void williams_state::defender_bank_select_w(u8 data)
|
||||
void defender_state::bank_select_w(u8 data)
|
||||
{
|
||||
m_bankc000->set_bank(data & 0x0f);
|
||||
}
|
||||
@ -343,14 +331,14 @@ void williams_state::defender_bank_select_w(u8 data)
|
||||
*
|
||||
*************************************/
|
||||
|
||||
u8 williams_state::mayday_protection_r(offs_t offset)
|
||||
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, */
|
||||
/* the protection from resetting the machine, we just return $a193 for $a190, */
|
||||
/* and $a194 for $a191. */
|
||||
return m_mayday_protection[offset + 3];
|
||||
return m_protection[offset + 3];
|
||||
}
|
||||
|
||||
|
||||
@ -361,10 +349,10 @@ u8 williams_state::mayday_protection_r(offs_t offset)
|
||||
*
|
||||
*************************************/
|
||||
|
||||
void williams_state::sinistar_vram_select_w(u8 data)
|
||||
void sinistar_state::vram_select_w(u8 data)
|
||||
{
|
||||
/* low two bits are standard */
|
||||
williams_vram_select_w(data);
|
||||
williams_state::vram_select_w(data);
|
||||
|
||||
/* window enable from bit 2 (clips to 0x7400) */
|
||||
m_blitter_window_enable = data & 0x04;
|
||||
@ -378,14 +366,14 @@ void williams_state::sinistar_vram_select_w(u8 data)
|
||||
*
|
||||
*************************************/
|
||||
|
||||
MACHINE_START_MEMBER(blaster_state,blaster)
|
||||
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);
|
||||
|
||||
m_blaster_bankb->configure_entries(1, 16, memregion("maincpu")->base() + 0x10000, 0x0000);
|
||||
m_blaster_bankb->configure_entry(0, &m_videoram[0x4000]);
|
||||
m_bankb->configure_entries(1, 16, memregion("maincpu")->base() + 0x10000, 0x0000);
|
||||
m_bankb->configure_entry(0, &m_videoram[0x4000]);
|
||||
|
||||
/* register for save states */
|
||||
save_item(NAME(m_vram_bank));
|
||||
@ -396,11 +384,11 @@ MACHINE_START_MEMBER(blaster_state,blaster)
|
||||
inline void blaster_state::update_blaster_banking()
|
||||
{
|
||||
m_mainbank->set_entry(m_vram_bank * (m_rom_bank + 1));
|
||||
m_blaster_bankb->set_entry(m_vram_bank * (m_rom_bank + 1));
|
||||
m_bankb->set_entry(m_vram_bank * (m_rom_bank + 1));
|
||||
}
|
||||
|
||||
|
||||
void blaster_state::blaster_vram_select_w(u8 data)
|
||||
void blaster_state::vram_select_w(u8 data)
|
||||
{
|
||||
/* VRAM/ROM banking from bit 0 */
|
||||
m_vram_bank = data & 0x01;
|
||||
@ -414,14 +402,14 @@ void blaster_state::blaster_vram_select_w(u8 data)
|
||||
}
|
||||
|
||||
|
||||
void blaster_state::blaster_bank_select_w(u8 data)
|
||||
void blaster_state::bank_select_w(u8 data)
|
||||
{
|
||||
m_rom_bank = data & 0x0f;
|
||||
update_blaster_banking();
|
||||
}
|
||||
|
||||
|
||||
TIMER_CALLBACK_MEMBER(blaster_state::blaster_deferred_snd_cmd_w)
|
||||
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;
|
||||
@ -431,9 +419,9 @@ TIMER_CALLBACK_MEMBER(blaster_state::blaster_deferred_snd_cmd_w)
|
||||
}
|
||||
|
||||
|
||||
void blaster_state::blaster_snd_cmd_w(u8 data)
|
||||
void blaster_state::snd_cmd_w(u8 data)
|
||||
{
|
||||
machine().scheduler().synchronize(timer_expired_delegate(FUNC(blaster_state::blaster_deferred_snd_cmd_w),this), data);
|
||||
machine().scheduler().synchronize(timer_expired_delegate(FUNC(blaster_state::deferred_snd_cmd_w),this), data);
|
||||
}
|
||||
|
||||
|
||||
@ -451,15 +439,28 @@ WRITE_LINE_MEMBER(williams_state::lottofun_coin_lock_w)
|
||||
|
||||
|
||||
|
||||
/*************************************
|
||||
*
|
||||
* Williams 2nd-gen-specific routines
|
||||
*
|
||||
*************************************/
|
||||
|
||||
void williams2_state::video_control_w(u8 data)
|
||||
{
|
||||
m_cocktail = data & 0x01;
|
||||
}
|
||||
|
||||
|
||||
|
||||
/*************************************
|
||||
*
|
||||
* Turkey Shoot-specific routines
|
||||
*
|
||||
*************************************/
|
||||
|
||||
MACHINE_START_MEMBER(tshoot_state,tshoot)
|
||||
void tshoot_state::machine_start()
|
||||
{
|
||||
MACHINE_START_CALL_MEMBER(williams2);
|
||||
williams2_state::machine_start();
|
||||
m_grenade_lamp.resolve();
|
||||
m_gun_lamp.resolve();
|
||||
m_p1_gun_recoil.resolve();
|
||||
@ -494,35 +495,29 @@ void tshoot_state::lamp_w(u8 data)
|
||||
*
|
||||
*************************************/
|
||||
|
||||
MACHINE_START_MEMBER(joust2_state,joust2)
|
||||
void joust2_state::machine_start()
|
||||
{
|
||||
MACHINE_START_CALL_MEMBER(williams2);
|
||||
save_item(NAME(m_joust2_current_sound_data));
|
||||
williams2_state::machine_start();
|
||||
save_item(NAME(m_current_sound_data));
|
||||
}
|
||||
|
||||
|
||||
MACHINE_RESET_MEMBER(joust2_state,joust2)
|
||||
{
|
||||
MACHINE_RESET_CALL_MEMBER(williams2);
|
||||
}
|
||||
|
||||
|
||||
TIMER_CALLBACK_MEMBER(joust2_state::joust2_deferred_snd_cmd_w)
|
||||
TIMER_CALLBACK_MEMBER(joust2_state::deferred_snd_cmd_w)
|
||||
{
|
||||
m_pia[2]->write_porta(param & 0xff);
|
||||
}
|
||||
|
||||
|
||||
WRITE_LINE_MEMBER(joust2_state::joust2_pia_3_cb1_w)
|
||||
WRITE_LINE_MEMBER(joust2_state::pia_3_cb1_w)
|
||||
{
|
||||
m_joust2_current_sound_data = (m_joust2_current_sound_data & ~0x100) | ((state << 8) & 0x100);
|
||||
m_cvsd_sound->write(m_joust2_current_sound_data);
|
||||
m_current_sound_data = (m_current_sound_data & ~0x100) | ((state << 8) & 0x100);
|
||||
m_cvsd_sound->write(m_current_sound_data);
|
||||
}
|
||||
|
||||
|
||||
WRITE8_MEMBER(joust2_state::joust2_snd_cmd_w)
|
||||
void joust2_state::snd_cmd_w(u8 data)
|
||||
{
|
||||
m_joust2_current_sound_data = (m_joust2_current_sound_data & ~0xff) | (data & 0xff);
|
||||
m_cvsd_sound->write(m_joust2_current_sound_data);
|
||||
machine().scheduler().synchronize(timer_expired_delegate(FUNC(joust2_state::joust2_deferred_snd_cmd_w),this), m_joust2_current_sound_data);
|
||||
m_current_sound_data = (m_current_sound_data & ~0xff) | (data & 0xff);
|
||||
m_cvsd_sound->write(m_current_sound_data);
|
||||
machine().scheduler().synchronize(timer_expired_delegate(FUNC(joust2_state::deferred_snd_cmd_w),this), m_current_sound_data);
|
||||
}
|
||||
|
@ -167,23 +167,23 @@ void williams_state::state_save_register()
|
||||
}
|
||||
|
||||
|
||||
VIDEO_START_MEMBER(williams_state,williams)
|
||||
void williams_state::video_start()
|
||||
{
|
||||
blitter_init(m_blitter_config, nullptr);
|
||||
state_save_register();
|
||||
}
|
||||
|
||||
|
||||
VIDEO_START_MEMBER(blaster_state,blaster)
|
||||
void blaster_state::video_start()
|
||||
{
|
||||
blitter_init(m_blitter_config, memregion("proms")->base());
|
||||
state_save_register();
|
||||
save_item(NAME(m_blaster_color0));
|
||||
save_item(NAME(m_blaster_video_control));
|
||||
save_item(NAME(m_color0));
|
||||
save_item(NAME(m_video_control));
|
||||
}
|
||||
|
||||
|
||||
VIDEO_START_MEMBER(williams2_state,williams2)
|
||||
void williams2_state::video_start()
|
||||
{
|
||||
blitter_init(m_blitter_config, nullptr);
|
||||
|
||||
@ -193,7 +193,7 @@ VIDEO_START_MEMBER(williams2_state,williams2)
|
||||
|
||||
state_save_register();
|
||||
save_item(NAME(m_tilemap_xscroll));
|
||||
save_item(NAME(m_williams2_fg_color));
|
||||
save_item(NAME(m_fg_color));
|
||||
}
|
||||
|
||||
|
||||
@ -204,7 +204,7 @@ VIDEO_START_MEMBER(williams2_state,williams2)
|
||||
*
|
||||
*************************************/
|
||||
|
||||
uint32_t williams_state::screen_update_williams(screen_device &screen, bitmap_rgb32 &bitmap, const rectangle &cliprect)
|
||||
uint32_t williams_state::screen_update(screen_device &screen, bitmap_rgb32 &bitmap, const rectangle &cliprect)
|
||||
{
|
||||
rgb_t pens[16];
|
||||
int x, y;
|
||||
@ -231,32 +231,31 @@ uint32_t williams_state::screen_update_williams(screen_device &screen, bitmap_rg
|
||||
}
|
||||
|
||||
|
||||
uint32_t blaster_state::screen_update_blaster(screen_device &screen, bitmap_rgb32 &bitmap, const rectangle &cliprect)
|
||||
uint32_t blaster_state::screen_update(screen_device &screen, bitmap_rgb32 &bitmap, const rectangle &cliprect)
|
||||
{
|
||||
rgb_t pens[16];
|
||||
int x, y;
|
||||
|
||||
/* precompute the palette */
|
||||
for (x = 0; x < 16; x++)
|
||||
for (int x = 0; x < 16; x++)
|
||||
pens[x] = m_palette->pen_color(m_paletteram[x]);
|
||||
|
||||
/* if we're blitting from the top, start with a 0 for color 0 */
|
||||
if (cliprect.min_y == screen.visible_area().min_y || !(m_blaster_video_control & 1))
|
||||
m_blaster_color0 = m_palette->pen_color(m_blaster_palette_0[0] ^ 0xff);
|
||||
if (cliprect.min_y == screen.visible_area().min_y || !(m_video_control & 1))
|
||||
m_color0 = m_palette->pen_color(m_palette_0[0] ^ 0xff);
|
||||
|
||||
/* loop over rows */
|
||||
for (y = cliprect.min_y; y <= cliprect.max_y; y++)
|
||||
for (int y = cliprect.min_y; y <= cliprect.max_y; y++)
|
||||
{
|
||||
int erase_behind = m_blaster_video_control & m_blaster_scanline_control[y] & 2;
|
||||
int erase_behind = m_video_control & m_scanline_control[y] & 2;
|
||||
uint8_t *source = &m_videoram[y];
|
||||
uint32_t *dest = &bitmap.pix32(y);
|
||||
|
||||
/* latch a new color0 pen? */
|
||||
if (m_blaster_video_control & m_blaster_scanline_control[y] & 1)
|
||||
m_blaster_color0 = m_palette->pen_color(m_blaster_palette_0[y] ^ 0xff);
|
||||
if (m_video_control & m_scanline_control[y] & 1)
|
||||
m_color0 = m_palette->pen_color(m_palette_0[y] ^ 0xff);
|
||||
|
||||
/* loop over columns */
|
||||
for (x = cliprect.min_x & ~1; x <= cliprect.max_x; x += 2)
|
||||
for (int x = cliprect.min_x & ~1; x <= cliprect.max_x; x += 2)
|
||||
{
|
||||
int pix = source[(x/2) * 256];
|
||||
|
||||
@ -265,34 +264,33 @@ uint32_t blaster_state::screen_update_blaster(screen_device &screen, bitmap_rgb3
|
||||
source[(x/2) * 256] = 0;
|
||||
|
||||
/* now draw */
|
||||
dest[x+0] = (pix & 0xf0) ? pens[pix >> 4] : rgb_t(m_blaster_color0 | pens[0]);
|
||||
dest[x+1] = (pix & 0x0f) ? pens[pix & 0x0f] : rgb_t(m_blaster_color0 | pens[0]);
|
||||
dest[x+0] = (pix & 0xf0) ? pens[pix >> 4] : rgb_t(m_color0 | pens[0]);
|
||||
dest[x+1] = (pix & 0x0f) ? pens[pix & 0x0f] : rgb_t(m_color0 | pens[0]);
|
||||
}
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
||||
uint32_t williams2_state::screen_update_williams2(screen_device &screen, bitmap_rgb32 &bitmap, const rectangle &cliprect)
|
||||
uint32_t williams2_state::screen_update(screen_device &screen, bitmap_rgb32 &bitmap, const rectangle &cliprect)
|
||||
{
|
||||
rgb_t pens[16];
|
||||
int x, y;
|
||||
|
||||
/* draw the background */
|
||||
m_bg_tilemap->draw(screen, bitmap, cliprect, 0, 0);
|
||||
|
||||
/* fetch the relevant pens */
|
||||
for (x = 1; x < 16; x++)
|
||||
pens[x] = m_palette->pen_color(m_williams2_fg_color * 16 + x);
|
||||
for (int x = 1; x < 16; x++)
|
||||
pens[x] = m_palette->pen_color(m_fg_color * 16 + x);
|
||||
|
||||
/* loop over rows */
|
||||
for (y = cliprect.min_y; y <= cliprect.max_y; y++)
|
||||
for (int y = cliprect.min_y; y <= cliprect.max_y; y++)
|
||||
{
|
||||
uint8_t *source = &m_videoram[y];
|
||||
uint32_t *dest = &bitmap.pix32(y);
|
||||
|
||||
/* loop over columns */
|
||||
for (x = cliprect.min_x & ~1; x <= cliprect.max_x; x += 2)
|
||||
for (int x = cliprect.min_x & ~1; x <= cliprect.max_x; x += 2)
|
||||
{
|
||||
int pix = source[(x/2) * 256];
|
||||
|
||||
@ -313,7 +311,7 @@ uint32_t williams2_state::screen_update_williams2(screen_device &screen, bitmap_
|
||||
*
|
||||
*************************************/
|
||||
|
||||
void williams_state::williams_palette(palette_device &palette) const
|
||||
void williams_state::palette_init(palette_device &palette) const
|
||||
{
|
||||
static constexpr int resistances_rg[3] = { 1200, 560, 330 };
|
||||
static constexpr int resistances_b[2] = { 560, 330 };
|
||||
@ -340,7 +338,7 @@ void williams_state::williams_palette(palette_device &palette) const
|
||||
|
||||
|
||||
|
||||
void williams2_state::williams2_paletteram_w(offs_t offset, u8 data)
|
||||
void williams2_state::paletteram_w(offs_t offset, u8 data)
|
||||
{
|
||||
static const uint8_t ztable[16] =
|
||||
{
|
||||
@ -365,9 +363,9 @@ void williams2_state::williams2_paletteram_w(offs_t offset, u8 data)
|
||||
}
|
||||
|
||||
|
||||
void williams2_state::williams2_fg_select_w(u8 data)
|
||||
void williams2_state::fg_select_w(u8 data)
|
||||
{
|
||||
m_williams2_fg_color = data & 0x3f;
|
||||
m_fg_color = data & 0x3f;
|
||||
}
|
||||
|
||||
|
||||
@ -378,7 +376,7 @@ void williams2_state::williams2_fg_select_w(u8 data)
|
||||
*
|
||||
*************************************/
|
||||
|
||||
u8 williams_state::williams_video_counter_r()
|
||||
u8 williams_state::video_counter_r()
|
||||
{
|
||||
if (m_screen->vpos() < 0x100)
|
||||
return m_screen->vpos() & 0xfc;
|
||||
@ -397,77 +395,78 @@ u8 williams_state::williams_video_counter_r()
|
||||
TILE_GET_INFO_MEMBER(williams2_state::get_tile_info)
|
||||
{
|
||||
int mask = m_gfxdecode->gfx(0)->elements() - 1;
|
||||
int data = m_williams2_tileram[tile_index];
|
||||
int data = m_tileram[tile_index];
|
||||
int y = (tile_index >> 1) & 7;
|
||||
int color = 0;
|
||||
|
||||
switch (m_williams2_tilemap_config)
|
||||
{
|
||||
case WILLIAMS_TILEMAP_MYSTICM:
|
||||
{
|
||||
/* IC79 is a 74LS85 comparator that controls the low bit */
|
||||
int a = 1 | ((color & 1) << 2) | ((color & 1) << 3);
|
||||
int b = ((y & 6) >> 1);
|
||||
int casc = (y & 1);
|
||||
color = (a > b) || ((a == b) && !casc);
|
||||
break;
|
||||
}
|
||||
|
||||
case WILLIAMS_TILEMAP_TSHOOT:
|
||||
/* IC79 is a 74LS157 selector jumpered to be enabled */
|
||||
color = y;
|
||||
break;
|
||||
|
||||
case WILLIAMS_TILEMAP_JOUST2:
|
||||
/* IC79 is a 74LS157 selector jumpered to be disabled */
|
||||
color = 0;
|
||||
break;
|
||||
}
|
||||
/* On tshoot and inferno, IC79 is a 74LS157 selector jumpered to be enabled */
|
||||
int color = y;
|
||||
|
||||
SET_TILE_INFO_MEMBER(0, data & mask, color, (data & ~mask) ? TILE_FLIPX : 0);
|
||||
}
|
||||
|
||||
|
||||
void williams2_state::williams2_bg_select_w(u8 data)
|
||||
TILE_GET_INFO_MEMBER(mysticm_state::get_tile_info)
|
||||
{
|
||||
/* based on the tilemap config, only certain bits are used */
|
||||
/* the rest are determined by other factors */
|
||||
switch (m_williams2_tilemap_config)
|
||||
{
|
||||
case WILLIAMS_TILEMAP_MYSTICM:
|
||||
/* IC79 is a 74LS85 comparator that controls the low bit */
|
||||
data &= 0x3e;
|
||||
break;
|
||||
int mask = m_gfxdecode->gfx(0)->elements() - 1;
|
||||
int data = m_tileram[tile_index];
|
||||
int y = (tile_index >> 1) & 7;
|
||||
int color = 0; // TODO: This seems highly suspect. Could it be why the palette doesn't work in mysticm?
|
||||
|
||||
case WILLIAMS_TILEMAP_TSHOOT:
|
||||
/* IC79 is a 74LS157 selector jumpered to be enabled */
|
||||
data &= 0x38;
|
||||
break;
|
||||
/* IC79 is a 74LS85 comparator that controls the low bit */
|
||||
int a = 1 | ((color & 1) << 2) | ((color & 1) << 3);
|
||||
int b = ((y & 6) >> 1);
|
||||
int casc = (y & 1);
|
||||
color = (a > b) || ((a == b) && !casc);
|
||||
|
||||
case WILLIAMS_TILEMAP_JOUST2:
|
||||
/* IC79 is a 74LS157 selector jumpered to be disabled */
|
||||
data &= 0x3f;
|
||||
break;
|
||||
}
|
||||
m_bg_tilemap->set_palette_offset(data * 16);
|
||||
SET_TILE_INFO_MEMBER(0, data & mask, color, (data & ~mask) ? TILE_FLIPX : 0);
|
||||
}
|
||||
|
||||
|
||||
void williams2_state::williams2_tileram_w(offs_t offset, u8 data)
|
||||
TILE_GET_INFO_MEMBER(joust2_state::get_tile_info)
|
||||
{
|
||||
m_williams2_tileram[offset] = data;
|
||||
int mask = m_gfxdecode->gfx(0)->elements() - 1;
|
||||
int data = m_tileram[tile_index];
|
||||
|
||||
/* IC79 is a 74LS157 selector jumpered to be disabled */
|
||||
int color = 0;
|
||||
|
||||
SET_TILE_INFO_MEMBER(0, data & mask, color, (data & ~mask) ? TILE_FLIPX : 0);
|
||||
}
|
||||
|
||||
/* based on the board type, only certain bits are used */
|
||||
/* the rest are determined by other factors */
|
||||
|
||||
void williams2_state::bg_select_w(u8 data)
|
||||
{
|
||||
/* IC79 is a 74LS157 selector jumpered to be enabled */
|
||||
m_bg_tilemap->set_palette_offset((data & 0x38) << 4);
|
||||
}
|
||||
|
||||
void mysticm_state::bg_select_w(u8 data)
|
||||
{
|
||||
/* IC79 is a 74LS85 comparator that controls the low bit */
|
||||
m_bg_tilemap->set_palette_offset((data & 0x3e) << 4);
|
||||
}
|
||||
|
||||
void joust2_state::bg_select_w(u8 data)
|
||||
{
|
||||
/* IC79 is a 74LS157 selector jumpered to be disabled */
|
||||
m_bg_tilemap->set_palette_offset((data & 0x3f) << 4);
|
||||
}
|
||||
|
||||
void williams2_state::tileram_w(offs_t offset, u8 data)
|
||||
{
|
||||
m_tileram[offset] = data;
|
||||
m_bg_tilemap->mark_tile_dirty(offset);
|
||||
}
|
||||
|
||||
|
||||
void williams2_state::williams2_xscroll_low_w(u8 data)
|
||||
void williams2_state::xscroll_low_w(u8 data)
|
||||
{
|
||||
m_tilemap_xscroll = (m_tilemap_xscroll & ~0x00f) | ((data & 0x80) >> 4) | (data & 0x07);
|
||||
m_bg_tilemap->set_scrollx(0, (m_tilemap_xscroll & 7) + ((m_tilemap_xscroll >> 3) * 6));
|
||||
}
|
||||
|
||||
|
||||
void williams2_state::williams2_xscroll_high_w(u8 data)
|
||||
void williams2_state::xscroll_high_w(u8 data)
|
||||
{
|
||||
m_tilemap_xscroll = (m_tilemap_xscroll & 0x00f) | (data << 4);
|
||||
m_bg_tilemap->set_scrollx(0, (m_tilemap_xscroll & 7) + ((m_tilemap_xscroll >> 3) * 6));
|
||||
@ -481,16 +480,16 @@ void williams2_state::williams2_xscroll_high_w(u8 data)
|
||||
*
|
||||
*************************************/
|
||||
|
||||
void blaster_state::blaster_remap_select_w(u8 data)
|
||||
void blaster_state::remap_select_w(u8 data)
|
||||
{
|
||||
m_blitter_remap_index = data;
|
||||
m_blitter_remap = m_blitter_remap_lookup.get() + data * 256;
|
||||
}
|
||||
|
||||
|
||||
void blaster_state::blaster_video_control_w(u8 data)
|
||||
void blaster_state::video_control_w(u8 data)
|
||||
{
|
||||
m_blaster_video_control = data;
|
||||
m_video_control = data;
|
||||
}
|
||||
|
||||
|
||||
@ -504,7 +503,6 @@ void blaster_state::blaster_video_control_w(u8 data)
|
||||
void williams_state::blitter_init(int blitter_config, const uint8_t *remap_prom)
|
||||
{
|
||||
static const uint8_t dummy_table[] = { 0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15 };
|
||||
int i,j;
|
||||
|
||||
/* by default, there is no clipping window - this will be touched only by games that have one */
|
||||
m_blitter_window_enable = 0;
|
||||
@ -516,20 +514,17 @@ void williams_state::blitter_init(int blitter_config, const uint8_t *remap_prom)
|
||||
m_blitter_remap_lookup = std::make_unique<uint8_t[]>(256 * 256);
|
||||
m_blitter_remap_index = 0;
|
||||
m_blitter_remap = m_blitter_remap_lookup.get();
|
||||
for (i = 0; i < 256; i++)
|
||||
for (int i = 0; i < 256; i++)
|
||||
{
|
||||
const uint8_t *table = remap_prom ? (remap_prom + (i & 0x7f) * 16) : dummy_table;
|
||||
for (j = 0; j < 256; j++)
|
||||
for (int j = 0; j < 256; j++)
|
||||
m_blitter_remap_lookup[i * 256 + j] = (table[j >> 4] << 4) | table[j & 0x0f];
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
WRITE8_MEMBER(williams_state::williams_blitter_w)
|
||||
WRITE8_MEMBER(williams_state::blitter_w)
|
||||
{
|
||||
int sstart, dstart, w, h, accesses;
|
||||
int estimated_clocks_at_4MHz;
|
||||
|
||||
/* store the data */
|
||||
m_blitterram[offset] = data;
|
||||
|
||||
@ -538,28 +533,29 @@ WRITE8_MEMBER(williams_state::williams_blitter_w)
|
||||
return;
|
||||
|
||||
/* compute the starting locations */
|
||||
sstart = (m_blitterram[2] << 8) + m_blitterram[3];
|
||||
dstart = (m_blitterram[4] << 8) + m_blitterram[5];
|
||||
int sstart = (m_blitterram[2] << 8) + m_blitterram[3];
|
||||
int dstart = (m_blitterram[4] << 8) + m_blitterram[5];
|
||||
|
||||
/* compute the width and height */
|
||||
w = m_blitterram[6] ^ m_blitter_xor;
|
||||
h = m_blitterram[7] ^ m_blitter_xor;
|
||||
int w = m_blitterram[6] ^ m_blitter_xor;
|
||||
int h = m_blitterram[7] ^ m_blitter_xor;
|
||||
|
||||
/* adjust the width and height */
|
||||
if (w == 0) w = 1;
|
||||
if (h == 0) h = 1;
|
||||
|
||||
/* do the actual blit */
|
||||
accesses = blitter_core(space, sstart, dstart, w, h, data);
|
||||
int accesses = blitter_core(space, sstart, dstart, w, h, data);
|
||||
|
||||
/* based on the number of memory accesses needed to do the blit, compute how long the blit will take */
|
||||
int estimated_clocks_at_4MHz = 4;
|
||||
if(data & WMS_BLITTER_CONTROLBYTE_SLOW)
|
||||
{
|
||||
estimated_clocks_at_4MHz = 4 + 4 * (accesses + 2);
|
||||
estimated_clocks_at_4MHz += 4 * (accesses + 2);
|
||||
}
|
||||
else
|
||||
{
|
||||
estimated_clocks_at_4MHz = 4 + 2 * (accesses + 3);
|
||||
estimated_clocks_at_4MHz += 2 * (accesses + 3);
|
||||
}
|
||||
|
||||
m_maincpu->adjust_icount(-((estimated_clocks_at_4MHz + 3) / 4));
|
||||
@ -575,7 +571,7 @@ WRITE8_MEMBER(williams_state::williams_blitter_w)
|
||||
}
|
||||
|
||||
|
||||
void williams2_state::williams2_blit_window_enable_w(u8 data)
|
||||
void williams2_state::blit_window_enable_w(u8 data)
|
||||
{
|
||||
m_blitter_window_enable = data & 0x01;
|
||||
}
|
||||
@ -636,27 +632,24 @@ inline void williams_state::blit_pixel(address_space &space, int dstaddr, int sr
|
||||
|
||||
int williams_state::blitter_core(address_space &space, int sstart, int dstart, int w, int h, int controlbyte)
|
||||
{
|
||||
int source, sxadv, syadv;
|
||||
int dest, dxadv, dyadv;
|
||||
int x, y;
|
||||
int accesses = 0;
|
||||
|
||||
/* compute how much to advance in the x and y loops */
|
||||
sxadv = (controlbyte & WMS_BLITTER_CONTROLBYTE_SRC_STRIDE_256) ? 0x100 : 1;
|
||||
syadv = (controlbyte & WMS_BLITTER_CONTROLBYTE_SRC_STRIDE_256) ? 1 : w;
|
||||
dxadv = (controlbyte & WMS_BLITTER_CONTROLBYTE_DST_STRIDE_256) ? 0x100 : 1;
|
||||
dyadv = (controlbyte & WMS_BLITTER_CONTROLBYTE_DST_STRIDE_256) ? 1 : w;
|
||||
int sxadv = (controlbyte & WMS_BLITTER_CONTROLBYTE_SRC_STRIDE_256) ? 0x100 : 1;
|
||||
int syadv = (controlbyte & WMS_BLITTER_CONTROLBYTE_SRC_STRIDE_256) ? 1 : w;
|
||||
int dxadv = (controlbyte & WMS_BLITTER_CONTROLBYTE_DST_STRIDE_256) ? 0x100 : 1;
|
||||
int dyadv = (controlbyte & WMS_BLITTER_CONTROLBYTE_DST_STRIDE_256) ? 1 : w;
|
||||
|
||||
int pixdata=0;
|
||||
int pixdata = 0;
|
||||
|
||||
/* loop over the height */
|
||||
for (y = 0; y < h; y++)
|
||||
for (int y = 0; y < h; y++)
|
||||
{
|
||||
source = sstart & 0xffff;
|
||||
dest = dstart & 0xffff;
|
||||
int source = sstart & 0xffff;
|
||||
int dest = dstart & 0xffff;
|
||||
|
||||
/* loop over the width */
|
||||
for (x = 0; x < w; x++)
|
||||
for (int x = 0; x < w; x++)
|
||||
{
|
||||
if (!(controlbyte & WMS_BLITTER_CONTROLBYTE_SHIFT)) //no shift
|
||||
{
|
||||
|
Loading…
Reference in New Issue
Block a user