New working machines

--------------------
Conquest (prototype) [Code Mystics]
This commit is contained in:
hap 2022-09-15 01:04:02 +02:00
parent 5f712ea702
commit d823fa71ea
5 changed files with 215 additions and 249 deletions

View File

@ -43734,6 +43734,7 @@ bubblesp // (c) 1982
bubblesr // (c) 1982 bubblesr // (c) 1982
colony7 // (c) 1981 Taito colony7 // (c) 1981 Taito
colony7a // (c) 1981 Taito colony7a // (c) 1981 Taito
conquest // prototype
defcmnd // bootleg defcmnd // bootleg
defence // bootleg defence // bootleg
defender // (c) 1980 defender // (c) 1980

View File

@ -552,7 +552,7 @@ void mayday_state::main_map(address_map &map)
* *
*************************************/ *************************************/
void williams_state::base_map(address_map &map) void williams_state::main_map(address_map &map)
{ {
map(0x0000, 0xbfff).ram().share("videoram"); map(0x0000, 0xbfff).ram().share("videoram");
map(0x0000, 0x8fff).bankr("mainbank"); map(0x0000, 0x8fff).bankr("mainbank");
@ -577,25 +577,12 @@ void williams_state::base_map(address_map &map)
void sinistar_state::main_map(address_map &map) void sinistar_state::main_map(address_map &map)
{ {
base_map(map); williams_state::main_map(map);
map(0xc900, 0xc9ff).w(FUNC(sinistar_state::vram_select_w));
map(0xd000, 0xdfff).ram(); map(0xd000, 0xdfff).ram();
map(0xe000, 0xffff).rom(); 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");
}
/************************************* /*************************************
* *
@ -605,7 +592,7 @@ void bubbles_state::main_map(address_map &map)
void spdball_state::main_map(address_map &map) void spdball_state::main_map(address_map &map)
{ {
base_map(map); williams_state::main_map(map);
// install extra input handlers // install extra input handlers
map(0xc800, 0xc800).portr("AN0"); map(0xc800, 0xc800).portr("AN0");
map(0xc801, 0xc801).portr("AN1"); map(0xc801, 0xc801).portr("AN1");
@ -678,7 +665,6 @@ void williams2_state::bank8000_map(address_map &map)
map(0x0800, 0x0fff).ram().w(FUNC(williams2_state::paletteram_w)).share("paletteram"); map(0x0800, 0x0fff).ram().w(FUNC(williams2_state::paletteram_w)).share("paletteram");
} }
// mysticm and inferno: D000-DFFF is RAM // mysticm and inferno: D000-DFFF is RAM
void williams_d000_ram_state::d000_map(address_map &map) void williams_d000_ram_state::d000_map(address_map &map)
{ {
@ -687,7 +673,6 @@ void williams_d000_ram_state::d000_map(address_map &map)
map(0xe000, 0xffff).rom(); map(0xe000, 0xffff).rom();
} }
// tshoot and joust2: D000-DFFF is ROM // tshoot and joust2: D000-DFFF is ROM
void williams_d000_rom_state::d000_map(address_map &map) void williams_d000_rom_state::d000_map(address_map &map)
{ {
@ -705,7 +690,7 @@ void williams_d000_rom_state::d000_map(address_map &map)
void defender_state::sound_map(address_map &map) void defender_state::sound_map(address_map &map)
{ {
map(0x0000, 0x007f).ram(); // internal RAM map(0x0000, 0x007f).ram(); // internal RAM
map(0x0400, 0x0403).mirror(0x8000).rw(m_pia[2], FUNC(pia6821_device::read), FUNC(pia6821_device::write)); map(0x0400, 0x0403).mirror(0x8000).rw(m_pia[2], FUNC(pia6821_device::read), FUNC(pia6821_device::write));
map(0xb000, 0xffff).rom(); map(0xb000, 0xffff).rom();
} }
@ -713,8 +698,8 @@ void defender_state::sound_map(address_map &map)
void williams_state::sound_map(address_map &map) void williams_state::sound_map(address_map &map)
{ {
map(0x0000, 0x007f).ram(); // internal RAM map(0x0000, 0x007f).ram(); // internal RAM
map(0x0080, 0x00ff).ram(); // MC6810 RAM map(0x0080, 0x00ff).ram(); // MC6810 RAM
map(0x0400, 0x0403).mirror(0x8000).rw(m_pia[2], FUNC(pia6821_device::read), FUNC(pia6821_device::write)); map(0x0400, 0x0403).mirror(0x8000).rw(m_pia[2], FUNC(pia6821_device::read), FUNC(pia6821_device::write));
map(0xb000, 0xffff).rom(); map(0xb000, 0xffff).rom();
} }
@ -722,8 +707,8 @@ void williams_state::sound_map(address_map &map)
/* Same as above, but for second sound board */ /* Same as above, but for second sound board */
void blaster_state::sound2_map(address_map &map) void blaster_state::sound2_map(address_map &map)
{ {
map(0x0000, 0x007f).ram(); // internal RAM map(0x0000, 0x007f).ram(); // internal RAM
map(0x0080, 0x00ff).ram(); // MC6810 RAM map(0x0080, 0x00ff).ram(); // MC6810 RAM
map(0x0400, 0x0403).mirror(0x8000).rw(m_pia[3], FUNC(pia6821_device::read), FUNC(pia6821_device::write)); map(0x0400, 0x0403).mirror(0x8000).rw(m_pia[3], FUNC(pia6821_device::read), FUNC(pia6821_device::write));
map(0xb000, 0xffff).rom(); map(0xb000, 0xffff).rom();
} }
@ -738,8 +723,8 @@ void blaster_state::sound2_map(address_map &map)
void williams2_state::sound_map(address_map &map) void williams2_state::sound_map(address_map &map)
{ {
map(0x0000, 0x007f).ram(); // internal RAM map(0x0000, 0x007f).ram(); // internal RAM
map(0x0080, 0x00ff).ram(); // MC6810 RAM map(0x0080, 0x00ff).ram(); // MC6810 RAM
map(0x2000, 0x2003).mirror(0x1ffc).rw(m_pia[2], FUNC(pia6821_device::read), FUNC(pia6821_device::write)); map(0x2000, 0x2003).mirror(0x1ffc).rw(m_pia[2], FUNC(pia6821_device::read), FUNC(pia6821_device::write));
map(0xe000, 0xffff).rom(); map(0xe000, 0xffff).rom();
} }
@ -860,10 +845,10 @@ static INPUT_PORTS_START( colony7 )
PORT_DIPSETTING( 0x02, "30k/50k" ) PORT_CONDITION("IN2",0x01,NOTEQUALS,0x01) PORT_DIPSETTING( 0x02, "30k/50k" ) PORT_CONDITION("IN2",0x01,NOTEQUALS,0x01)
PORT_DIPSETTING( 0x00, "30k/50k" ) PORT_CONDITION("IN2",0x01,EQUALS,0x01) PORT_DIPSETTING( 0x00, "30k/50k" ) PORT_CONDITION("IN2",0x01,EQUALS,0x01)
PORT_DIPSETTING( 0x02, "40k/70k" ) PORT_CONDITION("IN2",0x01,EQUALS,0x01) PORT_DIPSETTING( 0x02, "40k/70k" ) PORT_CONDITION("IN2",0x01,EQUALS,0x01)
PORT_DIPNAME( 0x04, 0x00, DEF_STR( Unknown )) // documented as unused PORT_DIPNAME( 0x04, 0x00, DEF_STR( Unknown )) // documented as unused
PORT_DIPSETTING( 0x04, DEF_STR( Off )) PORT_DIPSETTING( 0x04, DEF_STR( Off ))
PORT_DIPSETTING( 0x00, DEF_STR( On )) PORT_DIPSETTING( 0x00, DEF_STR( On ))
PORT_DIPNAME( 0x08, 0x00, DEF_STR( Unknown )) // documented as unused PORT_DIPNAME( 0x08, 0x00, DEF_STR( Unknown )) // documented as unused
PORT_DIPSETTING( 0x08, DEF_STR( Off )) PORT_DIPSETTING( 0x08, DEF_STR( Off ))
PORT_DIPSETTING( 0x00, DEF_STR( On )) PORT_DIPSETTING( 0x00, DEF_STR( On ))
PORT_BIT( 0x10, IP_ACTIVE_HIGH, IPT_COIN1 ) PORT_BIT( 0x10, IP_ACTIVE_HIGH, IPT_COIN1 )
@ -1055,6 +1040,28 @@ static INPUT_PORTS_START( bubbles )
INPUT_PORTS_END INPUT_PORTS_END
static INPUT_PORTS_START( conquest )
PORT_START("IN0")
PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_BUTTON1 ) PORT_NAME("Fire")
PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_BUTTON2 ) PORT_NAME("Thrust")
PORT_BIT( 0x0c, IP_ACTIVE_HIGH, IPT_CUSTOM ) PORT_CUSTOM_MEMBER(conquest_state, dial1_r)
PORT_BIT( 0x10, IP_ACTIVE_HIGH, IPT_START2 )
PORT_BIT( 0x20, IP_ACTIVE_HIGH, IPT_START1 )
PORT_BIT( 0x40, IP_ACTIVE_HIGH, IPT_UNKNOWN )
PORT_BIT( 0x80, IP_ACTIVE_HIGH, IPT_UNKNOWN )
PORT_START("IN1")
PORT_BIT( 0x03, IP_ACTIVE_HIGH, IPT_CUSTOM ) PORT_CUSTOM_MEMBER(conquest_state, dial0_r)
PORT_BIT( 0xfc, IP_ACTIVE_HIGH, IPT_UNKNOWN )
PORT_START("IN2")
PORT_BIT( 0xff, IP_ACTIVE_HIGH, IPT_UNKNOWN )
PORT_START("DIAL")
PORT_BIT( 0x0f, 0x00, IPT_DIAL ) PORT_SENSITIVITY(10) PORT_KEYDELTA(16) PORT_REVERSE
INPUT_PORTS_END
static INPUT_PORTS_START( splat ) static INPUT_PORTS_START( splat )
PORT_START("IN0") PORT_START("IN0")
// 0x0f muxed from INP1/INP2 // 0x0f muxed from INP1/INP2
@ -1122,10 +1129,10 @@ static INPUT_PORTS_START( sinistar )
PORT_BIT( 0x40, IP_ACTIVE_HIGH, IPT_TILT ) PORT_BIT( 0x40, IP_ACTIVE_HIGH, IPT_TILT )
PORT_BIT( 0x80, IP_ACTIVE_HIGH, IPT_UNKNOWN ) PORT_BIT( 0x80, IP_ACTIVE_HIGH, IPT_UNKNOWN )
PORT_START("49WAYX") // converted by port_0_49way_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_BIT( 0xff, 0x38, IPT_AD_STICK_X ) PORT_MINMAX(0x00,0x6f) PORT_SENSITIVITY(100) PORT_KEYDELTA(10)
PORT_START("49WAYY") // converted by port_0_49way_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_BIT( 0xff, 0x38, IPT_AD_STICK_Y ) PORT_MINMAX(0x00,0x6f) PORT_SENSITIVITY(100) PORT_KEYDELTA(10) PORT_REVERSE
INPUT_PORTS_END INPUT_PORTS_END
@ -1184,10 +1191,10 @@ static INPUT_PORTS_START( blaster )
PORT_START("INP2") PORT_START("INP2")
PORT_BIT( 0x0f, IP_ACTIVE_HIGH, IPT_UNUSED ) PORT_BIT( 0x0f, IP_ACTIVE_HIGH, IPT_UNUSED )
PORT_START("49WAYX") // converted by port_0_49way_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_BIT( 0xff, 0x38, IPT_AD_STICK_X ) PORT_MINMAX(0x00,0x6f) PORT_SENSITIVITY(100) PORT_KEYDELTA(10)
PORT_START("49WAYY") // converted by port_0_49way_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_BIT( 0xff, 0x38, IPT_AD_STICK_Y ) PORT_MINMAX(0x00,0x6f) PORT_SENSITIVITY(100) PORT_KEYDELTA(10) PORT_REVERSE
INPUT_PORTS_END INPUT_PORTS_END
@ -1210,10 +1217,10 @@ static INPUT_PORTS_START( blastkit )
PORT_BIT( 0x40, IP_ACTIVE_HIGH, IPT_TILT ) PORT_BIT( 0x40, IP_ACTIVE_HIGH, IPT_TILT )
PORT_BIT( 0x80, IP_ACTIVE_HIGH, IPT_UNKNOWN ) PORT_BIT( 0x80, IP_ACTIVE_HIGH, IPT_UNKNOWN )
PORT_START("49WAYX") // converted by port_0_49way_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_BIT( 0xff, 0x38, IPT_AD_STICK_X ) PORT_MINMAX(0x00,0x6f) PORT_SENSITIVITY(100) PORT_KEYDELTA(10)
PORT_START("49WAYY") // converted by port_0_49way_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_BIT( 0xff, 0x38, IPT_AD_STICK_Y ) PORT_MINMAX(0x00,0x6f) PORT_SENSITIVITY(100) PORT_KEYDELTA(10) PORT_REVERSE
PORT_START("IN3") PORT_START("IN3")
@ -1262,16 +1269,16 @@ static INPUT_PORTS_START( spdball )
PORT_BIT( 0x40, IP_ACTIVE_HIGH, IPT_START1 ) PORT_BIT( 0x40, IP_ACTIVE_HIGH, IPT_START1 )
PORT_BIT( 0x80, IP_ACTIVE_HIGH, IPT_START2 ) PORT_BIT( 0x80, IP_ACTIVE_HIGH, IPT_START2 )
PORT_START("AN0") // analog PORT_START("AN0") // analog
PORT_BIT( 0xff, 0x00, IPT_TRACKBALL_Y ) PORT_SENSITIVITY(25) PORT_KEYDELTA(32) PORT_REVERSE PORT_PLAYER(1) PORT_BIT( 0xff, 0x00, IPT_TRACKBALL_Y ) PORT_SENSITIVITY(25) PORT_KEYDELTA(32) PORT_REVERSE PORT_PLAYER(1)
PORT_START("AN1") // analog PORT_START("AN1") // analog
PORT_BIT( 0xff, 0x00, IPT_TRACKBALL_X ) PORT_SENSITIVITY(25) PORT_KEYDELTA(32) PORT_PLAYER(1) PORT_BIT( 0xff, 0x00, IPT_TRACKBALL_X ) PORT_SENSITIVITY(25) PORT_KEYDELTA(32) PORT_PLAYER(1)
PORT_START("AN2") // analog PORT_START("AN2") // analog
PORT_BIT( 0xff, 0x00, IPT_TRACKBALL_Y ) PORT_SENSITIVITY(25) PORT_KEYDELTA(32) PORT_REVERSE PORT_PLAYER(2) PORT_BIT( 0xff, 0x00, IPT_TRACKBALL_Y ) PORT_SENSITIVITY(25) PORT_KEYDELTA(32) PORT_REVERSE PORT_PLAYER(2)
PORT_START("AN3") // analog PORT_START("AN3") // analog
PORT_BIT( 0xff, 0x00, IPT_TRACKBALL_X ) PORT_SENSITIVITY(25) PORT_KEYDELTA(32) PORT_PLAYER(2) PORT_BIT( 0xff, 0x00, IPT_TRACKBALL_X ) PORT_SENSITIVITY(25) PORT_KEYDELTA(32) PORT_PLAYER(2)
INPUT_PORTS_END INPUT_PORTS_END
@ -1533,7 +1540,7 @@ void williams_state::williams_base(machine_config &config)
{ {
// basic machine hardware // basic machine hardware
MC6809E(config, m_maincpu, MASTER_CLOCK/3/4); MC6809E(config, m_maincpu, MASTER_CLOCK/3/4);
m_maincpu->set_addrmap(AS_PROGRAM, &williams_state::base_map); m_maincpu->set_addrmap(AS_PROGRAM, &williams_state::main_map);
M6808(config, m_soundcpu, SOUND_CLOCK); // internal clock divider of 4, effective frequency is 894.886kHz 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); m_soundcpu->set_addrmap(AS_PROGRAM, &williams_state::sound_map);
@ -1581,55 +1588,46 @@ void williams_state::williams_base(machine_config &config)
m_pia[2]->irqb_handler().set("soundirq", FUNC(input_merger_any_high_device::in_w<1>)); m_pia[2]->irqb_handler().set("soundirq", FUNC(input_merger_any_high_device::in_w<1>));
} }
void williams_state::williams_b0(machine_config &config)
void defender_state::defender(machine_config &config)
{
williams_base(config);
// basic machine hardware
m_maincpu->set_addrmap(AS_PROGRAM, &defender_state::main_map);
m_soundcpu->set_addrmap(AS_PROGRAM, &defender_state::sound_map);
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);
m_blitter_config = WILLIAMS_BLITTER_NONE;
m_blitter_clip_address = 0x0000;
}
void defender_state::jin(machine_config &config) // needs a different screen size or the credit text is clipped
{
defender(config);
// basic machine hardware
m_screen->set_visarea(0, 315, 7, 247-1);
}
void williams_state::stargate(machine_config &config)
{ {
williams_base(config); williams_base(config);
m_blitter_config = WILLIAMS_BLITTER_NONE; m_blitter_config = WILLIAMS_BLITTER_NONE;
m_blitter_clip_address = 0x0000; m_blitter_clip_address = 0x0000;
} }
void williams_state::williams_b1(machine_config &config)
void williams_state::robotron(machine_config &config)
{ {
williams_base(config); williams_base(config);
m_blitter_config = WILLIAMS_BLITTER_SC1; m_blitter_config = WILLIAMS_BLITTER_SC1;
m_blitter_clip_address = 0xc000; m_blitter_clip_address = 0xc000;
} }
void williams_state::williams_b2(machine_config &config)
{
williams_base(config);
m_blitter_config = WILLIAMS_BLITTER_SC2;
m_blitter_clip_address = 0xc000;
}
void defender_state::defender(machine_config &config)
{
williams_b0(config);
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 defender_state::jin(machine_config &config)
{
defender(config);
// needs a different screen size or the credit text is clipped
m_screen->set_visarea(0, 315, 7, 247-1);
}
void williams_muxed_state::williams_muxed(machine_config &config) void williams_muxed_state::williams_muxed(machine_config &config)
{ {
williams_base(config);
// basic machine hardware
// pia // pia
m_pia[0]->readpa_handler().set_ioport("IN0").mask(0x30); m_pia[0]->readpa_handler().set_ioport("IN0").mask(0x30);
m_pia[0]->readpa_handler().append("mux_0", FUNC(ls157_device::output_r)).mask(0x0f); m_pia[0]->readpa_handler().append("mux_0", FUNC(ls157_device::output_r)).mask(0x0f);
@ -1648,66 +1646,44 @@ void williams_muxed_state::williams_muxed(machine_config &config)
m_mux1->b_in_callback().set_ioport("INP1A"); m_mux1->b_in_callback().set_ioport("INP1A");
} }
void williams_muxed_state::joust(machine_config &config) void williams_muxed_state::joust(machine_config &config)
{ {
williams_b1(config);
williams_muxed(config); williams_muxed(config);
m_blitter_config = WILLIAMS_BLITTER_SC1;
m_blitter_clip_address = 0xc000;
} }
void williams_muxed_state::splat(machine_config &config) void williams_muxed_state::splat(machine_config &config)
{ {
williams_b2(config);
williams_muxed(config); williams_muxed(config);
m_blitter_config = WILLIAMS_BLITTER_SC2;
m_blitter_clip_address = 0xc000;
} }
void spdball_state::spdball(machine_config &config) void spdball_state::spdball(machine_config &config)
{ {
williams_base(config); williams_b1(config);
// basic machine hardware
m_maincpu->set_addrmap(AS_PROGRAM, &spdball_state::main_map);
// pia // pia
PIA6821(config, m_pia[3], 0); PIA6821(config, m_pia[3], 0);
m_pia[3]->readpa_handler().set_ioport("IN3"); m_pia[3]->readpa_handler().set_ioport("IN3");
m_pia[3]->readpb_handler().set_ioport("IN4"); m_pia[3]->readpb_handler().set_ioport("IN4");
m_blitter_config = WILLIAMS_BLITTER_SC1;
m_blitter_clip_address = 0xc000;
} }
void williams_state::lottofun(machine_config &config) void williams_state::lottofun(machine_config &config)
{ {
williams_base(config); williams_b1(config);
// basic machine hardware
// pia // pia
m_pia[0]->writepa_handler().set("ticket", FUNC(ticket_dispenser_device::motor_w)).bit(7); m_pia[0]->writepa_handler().set("ticket", FUNC(ticket_dispenser_device::motor_w)).bit(7);
m_pia[0]->ca2_handler().set(FUNC(williams_state::lottofun_coin_lock_w)); m_pia[0]->ca2_handler().set([this](int state) { machine().bookkeeping().coin_lockout_global_w(state); });
TICKET_DISPENSER(config, "ticket", attotime::from_msec(70), TICKET_MOTOR_ACTIVE_LOW, TICKET_STATUS_ACTIVE_HIGH); TICKET_DISPENSER(config, "ticket", attotime::from_msec(70), TICKET_MOTOR_ACTIVE_LOW, TICKET_STATUS_ACTIVE_HIGH);
m_blitter_config = WILLIAMS_BLITTER_SC1;
m_blitter_clip_address = 0xc000;
} }
void sinistar_state::sinistar(machine_config &config) void sinistar_state::sinistar(machine_config &config)
{ {
williams_base(config); williams_b1(config);
m_blitter_clip_address = 0x7400;
// basic machine hardware
m_maincpu->set_addrmap(AS_PROGRAM, &sinistar_state::main_map);
// sound hardware
HC55516(config, "cvsd", 0).add_route(ALL_OUTPUTS, "speaker", 0.8);
// pia // pia
m_pia[0]->readpa_handler().set(FUNC(williams_state::port_0_49way_r)); m_pia[0]->readpa_handler().set(FUNC(williams_state::port_0_49way_r));
@ -1715,28 +1691,13 @@ void sinistar_state::sinistar(machine_config &config)
m_pia[2]->ca2_handler().set("cvsd", FUNC(hc55516_device::digit_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)); m_pia[2]->cb2_handler().set("cvsd", FUNC(hc55516_device::clock_w));
m_blitter_config = WILLIAMS_BLITTER_SC1; // sound hardware
m_blitter_clip_address = 0x7400; HC55516(config, "cvsd", 0).add_route(ALL_OUTPUTS, "speaker", 0.8);
} }
void bubbles_state::bubbles(machine_config &config) // has a full 8-bit NVRAM equipped
{
williams_base(config);
// basic machine hardware
m_maincpu->set_addrmap(AS_PROGRAM, &bubbles_state::main_map);
m_blitter_config = WILLIAMS_BLITTER_SC1;
m_blitter_clip_address = 0xc000;
}
void playball_state::playball(machine_config &config) void playball_state::playball(machine_config &config)
{ {
williams_base(config); williams_b1(config);
// basic machine hardware
// video hardware // video hardware
m_screen->set_visarea(6, 298-1, 8, 240-1); m_screen->set_visarea(6, 298-1, 8, 240-1);
@ -1745,22 +1706,15 @@ void playball_state::playball(machine_config &config)
HC55516(config, "cvsd", 0).add_route(ALL_OUTPUTS, "speaker", 0.8); HC55516(config, "cvsd", 0).add_route(ALL_OUTPUTS, "speaker", 0.8);
// pia // pia
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]->ca2_handler().set("cvsd", FUNC(hc55516_device::digit_w));
m_pia[2]->cb2_handler().set("cvsd", FUNC(hc55516_device::clock_w)); m_pia[2]->cb2_handler().set("cvsd", FUNC(hc55516_device::clock_w));
m_blitter_config = WILLIAMS_BLITTER_SC1;
m_blitter_clip_address = 0xc000;
} }
void blaster_state::blastkit(machine_config &config) void blaster_state::blastkit(machine_config &config)
{ {
williams_base(config); williams_b2(config);
m_blitter_clip_address = 0x9700;
// basic machine hardware
m_maincpu->set_addrmap(AS_PROGRAM, &blaster_state::main_map);
// video hardware // video hardware
m_screen->set_screen_update(FUNC(blaster_state::screen_update)); m_screen->set_screen_update(FUNC(blaster_state::screen_update));
@ -1770,16 +1724,11 @@ void blaster_state::blastkit(machine_config &config)
m_pia[0]->cb2_handler().set("mux_a", FUNC(ls157_x2_device::select_w)); m_pia[0]->cb2_handler().set("mux_a", FUNC(ls157_x2_device::select_w));
// All multiplexers on Blaster interface board are really LS257 with OC tied to GND (which is equivalent to LS157) // All multiplexers on Blaster interface board are really LS257 with OC tied to GND (which is equivalent to LS157)
LS157_X2(config, m_muxa, 0); LS157_X2(config, m_muxa, 0);
m_muxa->a_in_callback().set_ioport("IN3"); m_muxa->a_in_callback().set_ioport("IN3");
m_muxa->b_in_callback().set(FUNC(williams_state::port_0_49way_r)); m_muxa->b_in_callback().set(FUNC(williams_state::port_0_49way_r));
m_blitter_config = WILLIAMS_BLITTER_SC2;
m_blitter_clip_address = 0x9700;
} }
void blaster_state::blaster(machine_config &config) void blaster_state::blaster(machine_config &config)
{ {
blastkit(config); blastkit(config);
@ -1804,8 +1753,6 @@ void blaster_state::blaster(machine_config &config)
INPUT_MERGER_ANY_HIGH(config, "soundirq_b").output_handler().set_inputline(m_soundcpu_b, M6808_IRQ_LINE); 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::snd_cmd_w));
m_pia[2]->writepa_handler().set("ldac", FUNC(dac_byte_interface::data_w)); m_pia[2]->writepa_handler().set("ldac", FUNC(dac_byte_interface::data_w));
PIA6821(config, m_pia[3], 0); PIA6821(config, m_pia[3], 0);
@ -1916,7 +1863,6 @@ void mysticm_state::mysticm(machine_config &config)
m_pia[1]->irqb_handler().set("mainirq", FUNC(input_merger_any_high_device::in_w<2>)); m_pia[1]->irqb_handler().set("mainirq", FUNC(input_merger_any_high_device::in_w<2>));
} }
void tshoot_state::tshoot(machine_config &config) void tshoot_state::tshoot(machine_config &config)
{ {
williams2_base(config); williams2_base(config);
@ -1941,7 +1887,6 @@ void tshoot_state::tshoot(machine_config &config)
m_mux->b_in_callback().set_ioport("INP2"); m_mux->b_in_callback().set_ioport("INP2");
} }
void joust2_state::joust2(machine_config &config) void joust2_state::joust2(machine_config &config)
{ {
williams2_base(config); williams2_base(config);
@ -1964,7 +1909,8 @@ void joust2_state::joust2(machine_config &config)
m_pia[1]->irqa_handler().set("mainirq", FUNC(input_merger_any_high_device::in_w<0>)); 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>)); m_pia[1]->irqb_handler().set("mainirq", FUNC(input_merger_any_high_device::in_w<1>));
// these (and ca2 above) are educated guesses, as we have no schematics for joust 2's pcb which has the 20 pin system 11 bg sound connector on it; inferno, which we have schematics to, lacks this connector. All of pia[1] ca2, pia[2] cb1, and pia[2] cb2 are unconnected/grounded on inferno. // these (and ca2 above) are educated guesses, as we have no schematics for joust 2's pcb which has the 20 pin system 11 bg sound connector on it;
// inferno, which we have schematics to, lacks this connector. All of pia[1] ca2, pia[2] cb1, and pia[2] cb2 are unconnected/grounded on inferno.
m_bg->cb2_cb().set(m_pia[2], FUNC(pia6821_device::cb1_w)); m_bg->cb2_cb().set(m_pia[2], FUNC(pia6821_device::cb1_w));
m_pia[2]->cb2_handler().set(m_bg, FUNC(s11_obg_device::resetq_w)); // inverted? m_pia[2]->cb2_handler().set(m_bg, FUNC(s11_obg_device::resetq_w)); // inverted?
@ -2398,6 +2344,30 @@ ROM_START( jin )
ROM_END ROM_END
/*
Conquest: early prototype by Vid Kidz for Williams.
Despite concept similarities, it's not an early version of Sinistar.
ROM files were reconstructed from June 1982 source code, not dumped from EPROMs.
It appears to use the sound ROM from Defender.
*/
ROM_START( conquest )
ROM_REGION( 0x19000, "maincpu", ROMREGION_ERASE00 )
ROM_LOAD( "conquest_b.bin", 0x0e000, 0x1000, CRC(9aab5516) SHA1(a71ce8f24fd7ffda8800d1af8c164085b0e2ec0a) )
ROM_RELOAD( 0x0f000, 0x1000 )
ROM_LOAD( "conquest_a.bin", 0x10000, 0x4000, CRC(a384f4a2) SHA1(819df35281216b8be2ba066602fc7d19a860e69e) )
ROM_REGION( 0x10000, "soundcpu", 0 )
ROM_LOAD( "video_sound_rom_1.ic12", 0xf800, 0x0800, CRC(fefd5b48) SHA1(ceb0d18483f0691978c604db94417e6941ad7ff2) )
ROM_REGION( 0x0400, "proms", 0 )
ROM_LOAD( "decoder.2", 0x0000, 0x0200, CRC(8dd98da5) SHA1(da979604f7a2aa8b5a6d4a5debd2e80f77569e35) )
ROM_LOAD( "decoder.3", 0x0200, 0x0200, CRC(c3f45f70) SHA1(d19036cbc46b130548873597b44b8b70758f25c4) )
ROM_END
/* /*
Stargate ROM labels are in this format: Stargate ROM labels are in this format:
@ -2486,6 +2456,7 @@ ROM_START( stargate ) /* "B" ROMs labeled 3002-13 through 3002-24, identical dat
ROM_LOAD( "decoder_rom_5.3c", 0x0200, 0x0200, CRC(f921c5fe) SHA1(9cebb8bb935315101d248140d1b4503993ebdf8a) ) // Universal Vertical decoder ROM - 7641-5 BPROM - P/N A-5342-09695 ROM_LOAD( "decoder_rom_5.3c", 0x0200, 0x0200, CRC(f921c5fe) SHA1(9cebb8bb935315101d248140d1b4503993ebdf8a) ) // Universal Vertical decoder ROM - 7641-5 BPROM - P/N A-5342-09695
ROM_END ROM_END
/* /*
Robotron 2084 ROM labels are in this format: Robotron 2084 ROM labels are in this format:
@ -2914,6 +2885,7 @@ ROM_START( joustr ) /* Solid red labels */
ROM_LOAD( "decoder_rom_6.3c", 0x0200, 0x0200, CRC(83faf25e) SHA1(30002643d08ed983a6701a7c4b5ee74a2f4a1adb) ) // Universal Vertical decoder ROM - 7641-5 BPROM - P/N A-5342-09821 ROM_LOAD( "decoder_rom_6.3c", 0x0200, 0x0200, CRC(83faf25e) SHA1(30002643d08ed983a6701a7c4b5ee74a2f4a1adb) ) // Universal Vertical decoder ROM - 7641-5 BPROM - P/N A-5342-09821
ROM_END ROM_END
/* /*
Bubbles ROM labels are in this format: Bubbles ROM labels are in this format:
@ -3125,6 +3097,7 @@ ROM_END
/* /*
Sinistar Sinistar
Multiple different ROM boards are known to exist: Multiple different ROM boards are known to exist:
@ -3730,7 +3703,7 @@ ROM_END
* *
*************************************/ *************************************/
void defndjeu_state::driver_start() void defender_state::init_defndjeu()
{ {
uint8_t *rom = memregion("maincpu")->base(); uint8_t *rom = memregion("maincpu")->base();
@ -3740,12 +3713,6 @@ void defndjeu_state::driver_start()
} }
void mayday_state::driver_start()
{
m_protection = m_videoram + 0xa190;
}
void williams_muxed_state::init_alienar() void williams_muxed_state::init_alienar()
{ {
m_maincpu->space(AS_PROGRAM).nop_write(0xcbff, 0xcbff); m_maincpu->space(AS_PROGRAM).nop_write(0xcbff, 0xcbff);
@ -3765,11 +3732,11 @@ GAME( 1980, defenderg, defender, defender, defender, defender_state,
GAME( 1980, defenderb, defender, defender, defender, defender_state, empty_init, ROT0, "Williams", "Defender (Blue 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, 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, 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, defndjeu, defender, defender, defender, defender_state, init_defndjeu, 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, tornado1, defender, defender, defender, defender_state, init_defndjeu, 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, tornado2, defender, defender, defender, defender_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, defndjeu_state, empty_init, ROT0, "bootleg (Jeutel)", "Zero (set 1, Defender bootleg)", MACHINE_SUPPORTS_SAVE ) GAME( 1980, zero, defender, defender, defender, defender_state, init_defndjeu, 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, zero2, defender, defender, defender, defender_state, init_defndjeu, 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( 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, defence, defender, defender, defender, defender_state, empty_init, ROT0, "bootleg (Outer Limits)", "Defence Command (Defender bootleg)", MACHINE_SUPPORTS_SAVE )
GAME( 198?, defenseb, defender, defender, defender, defender_state, empty_init, ROT0, "bootleg", "Defense (Defender bootleg)", MACHINE_SUPPORTS_SAVE ) GAME( 198?, defenseb, defender, defender, defender, defender_state, empty_init, ROT0, "bootleg", "Defense (Defender bootleg)", MACHINE_SUPPORTS_SAVE )
@ -3788,26 +3755,27 @@ GAME( 1981, colony7a, colony7, defender, colony7, defender_state,
GAME( 1982, jin, 0, jin, jin, defender_state, empty_init, 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 // Standard Williams hardware
GAME( 1981, stargate, 0, stargate, stargate, williams_state, empty_init, ROT0, "Williams / Vid Kidz", "Stargate", MACHINE_SUPPORTS_SAVE ) GAME( 1981, stargate, 0, williams_b0, stargate, williams_state, empty_init, ROT0, "Williams / Vid Kidz", "Stargate", MACHINE_SUPPORTS_SAVE )
GAME( 1982, robotron, 0, robotron, robotron, williams_state, empty_init, ROT0, "Williams / Vid Kidz", "Robotron: 2084 (Solid Blue label)", MACHINE_SUPPORTS_SAVE ) GAME( 1982, conquest, 0, williams_b1, conquest, conquest_state, empty_init, ROT270, "Williams / Vid Kidz", "Conquest (prototype)", MACHINE_IS_INCOMPLETE | MACHINE_SUPPORTS_SAVE )
GAME( 1982, robotronyo, robotron, robotron, robotron, williams_state, empty_init, ROT0, "Williams / Vid Kidz", "Robotron: 2084 (Yellow/Orange label)", MACHINE_SUPPORTS_SAVE )
GAME( 1982, robotronun, robotron, robotron, robotron, williams_state, empty_init, ROT0, "Williams / Vid Kidz (Unidesa license)", "Robotron: 2084 (Unidesa license)", MACHINE_SUPPORTS_SAVE ) GAME( 1982, robotron, 0, williams_b1, robotron, williams_state, empty_init, ROT0, "Williams / Vid Kidz", "Robotron: 2084 (Solid Blue label)", MACHINE_SUPPORTS_SAVE )
GAME( 1982, robotronyo, robotron, williams_b1, robotron, williams_state, empty_init, ROT0, "Williams / Vid Kidz", "Robotron: 2084 (Yellow/Orange label)", MACHINE_SUPPORTS_SAVE )
GAME( 1982, robotronun, robotron, williams_b1, robotron, williams_state, empty_init, ROT0, "Williams / Vid Kidz (Unidesa license)", "Robotron: 2084 (Unidesa license)", MACHINE_SUPPORTS_SAVE )
// the 3 below are all noteworthy hacks of the Solid BLue set // the 3 below are all noteworthy hacks of the Solid BLue set
GAME( 1987, robotron87, robotron, robotron, robotron, williams_state, empty_init, ROT0, "hack", "Robotron: 2084 (1987 'shot-in-the-corner' bugfix)", MACHINE_SUPPORTS_SAVE ) // fixes a reset bug. GAME( 1987, robotron87, robotron, williams_b1, robotron, williams_state, empty_init, ROT0, "hack", "Robotron: 2084 (1987 'shot-in-the-corner' bugfix)", MACHINE_SUPPORTS_SAVE ) // fixes a reset bug.
GAME( 2012, robotron12, robotron, robotron, robotron, williams_state, empty_init, ROT0, "hack", "Robotron: 2084 (2012 'wave 201 start' hack)", MACHINE_SUPPORTS_SAVE ) // includes sitc bug fix, used for competitive play. GAME( 2012, robotron12, robotron, williams_b1, robotron, williams_state, empty_init, ROT0, "hack", "Robotron: 2084 (2012 'wave 201 start' hack)", MACHINE_SUPPORTS_SAVE ) // includes sitc bug fix, used for competitive play.
GAME( 2015, robotrontd, robotron, robotron, robotron, williams_state, empty_init, 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( 2015, robotrontd, robotron, williams_b1, robotron, williams_state, empty_init, 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, joust, joust, williams_muxed_state, empty_init, ROT0, "Williams", "Joust (Green label)", MACHINE_SUPPORTS_SAVE ) GAME( 1982, joust, 0, joust, joust, williams_muxed_state, empty_init, ROT0, "Williams", "Joust (Green label)", MACHINE_SUPPORTS_SAVE )
GAME( 1982, joustr, joust, joust, joust, williams_muxed_state, empty_init, ROT0, "Williams", "Joust (Red label)", MACHINE_SUPPORTS_SAVE ) GAME( 1982, joustr, joust, joust, joust, williams_muxed_state, empty_init, ROT0, "Williams", "Joust (Red label)", MACHINE_SUPPORTS_SAVE )
GAME( 1982, jousty, joust, joust, joust, williams_muxed_state, empty_init, ROT0, "Williams", "Joust (Yellow label)", MACHINE_SUPPORTS_SAVE ) GAME( 1982, jousty, joust, joust, joust, williams_muxed_state, empty_init, ROT0, "Williams", "Joust (Yellow label)", MACHINE_SUPPORTS_SAVE )
GAME( 1982, bubbles, 0, bubbles, bubbles, bubbles_state, empty_init, ROT0, "Williams", "Bubbles", MACHINE_SUPPORTS_SAVE ) GAME( 1982, bubbles, 0, williams_b1, bubbles, williams_cmos8_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, bubblesr, bubbles, williams_b1, bubbles, williams_cmos8_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, bubblesp, bubbles, williams_b1, bubbles, williams_cmos8_state, empty_init, ROT0, "Williams", "Bubbles (prototype)", MACHINE_SUPPORTS_SAVE )
GAME( 1982, splat, 0, splat, splat, williams_muxed_state, empty_init, ROT0, "Williams", "Splat!", MACHINE_SUPPORTS_SAVE ) GAME( 1982, splat, 0, splat, splat, williams_muxed_state, empty_init, ROT0, "Williams", "Splat!", MACHINE_SUPPORTS_SAVE )

View File

@ -27,6 +27,7 @@
#include "screen.h" #include "screen.h"
#include "tilemap.h" #include "tilemap.h"
// base Williams hardware
class williams_state : public driver_device class williams_state : public driver_device
{ {
public: public:
@ -44,8 +45,11 @@ public:
m_pia(*this, "pia_%u", 0U) m_pia(*this, "pia_%u", 0U)
{ } { }
void stargate(machine_config &config); void williams_base(machine_config &config);
void robotron(machine_config &config); void williams_b0(machine_config &config);
void williams_b1(machine_config &config);
void williams_b2(machine_config &config);
void lottofun(machine_config &config); void lottofun(machine_config &config);
u8 port_0_49way_r(); u8 port_0_49way_r();
@ -59,20 +63,26 @@ public:
void palette_init(palette_device &palette) const; void palette_init(palette_device &palette) const;
protected: protected:
void williams_base(machine_config &config);
virtual void machine_start() override; virtual void machine_start() override;
virtual void video_start() override; virtual void video_start() override;
// blitter type
enum
{
WILLIAMS_BLITTER_NONE = 0, // no blitter
WILLIAMS_BLITTER_SC1 = 1, // Special Chip 1 blitter
WILLIAMS_BLITTER_SC2 = 2 // Special Chip 2 "bugfixed" blitter
};
// controlbyte (0xCA00) bit definitions
enum enum
{ {
//controlbyte (0xCA00) bit definitions
WMS_BLITTER_CONTROLBYTE_NO_EVEN = 0x80, WMS_BLITTER_CONTROLBYTE_NO_EVEN = 0x80,
WMS_BLITTER_CONTROLBYTE_NO_ODD = 0x40, WMS_BLITTER_CONTROLBYTE_NO_ODD = 0x40,
WMS_BLITTER_CONTROLBYTE_SHIFT = 0x20, WMS_BLITTER_CONTROLBYTE_SHIFT = 0x20,
WMS_BLITTER_CONTROLBYTE_SOLID = 0x10, WMS_BLITTER_CONTROLBYTE_SOLID = 0x10,
WMS_BLITTER_CONTROLBYTE_FOREGROUND_ONLY = 0x08, WMS_BLITTER_CONTROLBYTE_FOREGROUND_ONLY = 0x08,
WMS_BLITTER_CONTROLBYTE_SLOW = 0x04, //2us blits instead of 1us WMS_BLITTER_CONTROLBYTE_SLOW = 0x04, // 2us blits instead of 1us
WMS_BLITTER_CONTROLBYTE_DST_STRIDE_256 = 0x02, WMS_BLITTER_CONTROLBYTE_DST_STRIDE_256 = 0x02,
WMS_BLITTER_CONTROLBYTE_SRC_STRIDE_256 = 0x01 WMS_BLITTER_CONTROLBYTE_SRC_STRIDE_256 = 0x01
}; };
@ -92,14 +102,10 @@ protected:
std::unique_ptr<uint8_t[]> m_blitter_remap_lookup; std::unique_ptr<uint8_t[]> m_blitter_remap_lookup;
virtual void vram_select_w(u8 data); virtual void vram_select_w(u8 data);
virtual void cmos_w(offs_t offset, u8 data); virtual void cmos_w(offs_t offset, u8 data);
void sinistar_vram_select_w(u8 data);
void blitter_w(address_space &space, offs_t offset, u8 data); void blitter_w(address_space &space, offs_t offset, u8 data);
TIMER_CALLBACK_MEMBER(deferred_snd_cmd_w); TIMER_CALLBACK_MEMBER(deferred_snd_cmd_w);
virtual void snd_cmd_w(u8 data);
void snd_cmd_w(u8 data);
DECLARE_WRITE_LINE_MEMBER(lottofun_coin_lock_w);
void state_save_register(); void state_save_register();
void blitter_init(int blitter_config, const uint8_t *remap_prom); void blitter_init(int blitter_config, const uint8_t *remap_prom);
@ -115,9 +121,10 @@ protected:
optional_device_array<pia6821_device, 4> m_pia; optional_device_array<pia6821_device, 4> m_pia;
virtual void sound_map(address_map &map); virtual void sound_map(address_map &map);
void base_map(address_map &map); virtual void main_map(address_map &map);
}; };
// Defender
class defender_state : public williams_state class defender_state : public williams_state
{ {
public: public:
@ -129,8 +136,10 @@ public:
void defender(machine_config &config); void defender(machine_config &config);
void jin(machine_config &config); void jin(machine_config &config);
void init_defndjeu();
protected: protected:
virtual void main_map(address_map &map); virtual void main_map(address_map &map) override;
void video_control_w(u8 data); void video_control_w(u8 data);
@ -146,17 +155,7 @@ private:
void bank_select_w(u8 data); void bank_select_w(u8 data);
}; };
class defndjeu_state : public defender_state // Hoei Mayday: custom protection
{
public:
defndjeu_state(const machine_config &mconfig, device_type type, const char *tag) :
defender_state(mconfig, type, tag)
{ }
private:
virtual void driver_start() override;
};
class mayday_state : public defender_state class mayday_state : public defender_state
{ {
public: public:
@ -165,14 +164,11 @@ public:
{ } { }
private: private:
virtual void driver_start() override;
virtual void main_map(address_map &map) override;
uint8_t *m_protection = nullptr;
u8 protection_r(offs_t offset); u8 protection_r(offs_t offset);
virtual void main_map(address_map &map) override;
}; };
// Sinistar: blitter window clip
class sinistar_state : public williams_state class sinistar_state : public williams_state
{ {
public: public:
@ -184,25 +180,10 @@ public:
private: private:
virtual void vram_select_w(u8 data) override; virtual void vram_select_w(u8 data) override;
virtual void main_map(address_map &map) 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:
void main_map(address_map &map);
virtual void cmos_w(offs_t offset, u8 data) override;
}; };
// Playball: more soundlatch bits
class playball_state : public williams_state class playball_state : public williams_state
{ {
public: public:
@ -213,9 +194,38 @@ public:
void playball(machine_config &config); void playball(machine_config &config);
private: private:
void snd_cmd_w(u8 data); virtual void snd_cmd_w(u8 data) override;
}; };
// Bubbles: 8-bit nvram
class williams_cmos8_state : public williams_state
{
public:
williams_cmos8_state(const machine_config &mconfig, device_type type, const char *tag) :
williams_state(mconfig, type, tag)
{ }
protected:
virtual void cmos_w(offs_t offset, u8 data) override;
};
// Conquest: flywheel controller
class conquest_state : public williams_cmos8_state
{
public:
conquest_state(const machine_config &mconfig, device_type type, const char *tag) :
williams_cmos8_state(mconfig, type, tag),
m_dial(*this, "DIAL")
{ }
DECLARE_CUSTOM_INPUT_MEMBER(dial0_r) { return m_dial->read() & 3; }
DECLARE_CUSTOM_INPUT_MEMBER(dial1_r) { return m_dial->read() >> 2 & 3; }
private:
required_ioport m_dial;
};
// Joust, Splat: muxed inputs
class williams_muxed_state : public williams_state class williams_muxed_state : public williams_state
{ {
public: public:
@ -237,6 +247,7 @@ private:
required_device<ls157_device> m_mux1; required_device<ls157_device> m_mux1;
}; };
// Speed Ball: more input ports
class spdball_state : public williams_state class spdball_state : public williams_state
{ {
public: public:
@ -247,9 +258,10 @@ public:
void spdball(machine_config &config); void spdball(machine_config &config);
private: private:
void main_map(address_map &map); virtual void main_map(address_map &map) override;
}; };
// Blaster: extra sound hardware
class blaster_state : public williams_state class blaster_state : public williams_state
{ {
public: public:
@ -283,16 +295,17 @@ private:
void remap_select_w(u8 data); void remap_select_w(u8 data);
void video_control_w(u8 data); void video_control_w(u8 data);
TIMER_CALLBACK_MEMBER(deferred_snd_cmd_w); TIMER_CALLBACK_MEMBER(deferred_snd_cmd_w);
void snd_cmd_w(u8 data); virtual void snd_cmd_w(u8 data) override;
virtual uint32_t screen_update(screen_device &screen, bitmap_rgb32 &bitmap, const rectangle &cliprect) override; virtual uint32_t screen_update(screen_device &screen, bitmap_rgb32 &bitmap, const rectangle &cliprect) override;
inline void update_blaster_banking(); inline void update_blaster_banking();
void main_map(address_map &map); virtual void main_map(address_map &map) override;
void sound2_map(address_map &map); void sound2_map(address_map &map);
}; };
// base Williams 2nd gen hardware
class williams2_state : public williams_state class williams2_state : public williams_state
{ {
public: public:
@ -350,7 +363,7 @@ protected:
virtual TIMER_DEVICE_CALLBACK_MEMBER(va11_callback) override; virtual TIMER_DEVICE_CALLBACK_MEMBER(va11_callback) override;
TIMER_DEVICE_CALLBACK_MEMBER(endscreen_callback); TIMER_DEVICE_CALLBACK_MEMBER(endscreen_callback);
TIMER_CALLBACK_MEMBER(deferred_snd_cmd_w); TIMER_CALLBACK_MEMBER(deferred_snd_cmd_w);
void snd_cmd_w(u8 data); virtual void snd_cmd_w(u8 data) override;
virtual uint32_t screen_update(screen_device &screen, bitmap_rgb32 &bitmap, const rectangle &cliprect) override; virtual uint32_t screen_update(screen_device &screen, bitmap_rgb32 &bitmap, const rectangle &cliprect) override;
@ -383,6 +396,7 @@ protected:
void d000_map(address_map &map); void d000_map(address_map &map);
}; };
// Inferno
class inferno_state : public williams_d000_ram_state class inferno_state : public williams_d000_ram_state
{ {
public: public:
@ -397,6 +411,7 @@ private:
required_device<ls157_device> m_mux; required_device<ls157_device> m_mux;
}; };
// Mystic Marathon
class mysticm_state : public williams_d000_ram_state class mysticm_state : public williams_d000_ram_state
{ {
public: public:
@ -420,9 +435,9 @@ private:
int color_decode(uint8_t base_col, int sig_J1, int y); int color_decode(uint8_t base_col, int sig_J1, int y);
uint8_t m_bg_color = 0; uint8_t m_bg_color = 0;
}; };
// Turkey Shoot
class tshoot_state : public williams_d000_rom_state class tshoot_state : public williams_d000_rom_state
{ {
public: public:
@ -454,6 +469,7 @@ private:
output_finder<> m_feather_blower; output_finder<> m_feather_blower;
}; };
// Joust 2
class joust2_state : public williams_d000_rom_state class joust2_state : public williams_d000_rom_state
{ {
public: public:
@ -476,18 +492,9 @@ private:
virtual void bg_select_w(u8 data) override; virtual void bg_select_w(u8 data) override;
TIMER_CALLBACK_MEMBER(deferred_snd_cmd_w); TIMER_CALLBACK_MEMBER(deferred_snd_cmd_w);
void snd_cmd_w(u8 data); virtual void snd_cmd_w(u8 data) override;
DECLARE_WRITE_LINE_MEMBER(pia_s11_bg_strobe_w); DECLARE_WRITE_LINE_MEMBER(pia_s11_bg_strobe_w);
}; };
/*----------- defined in video/williams.cpp -----------*/
#define WILLIAMS_BLITTER_NONE 0 /* no blitter */
#define WILLIAMS_BLITTER_SC1 1 /* Special Chip 1 blitter */
#define WILLIAMS_BLITTER_SC2 2 /* Special Chip 2 "bugfixed" blitter */
#define WILLIAMS_TILEMAP_MYSTICM 0 /* IC79 is a 74LS85 comparator */
#define WILLIAMS_TILEMAP_TSHOOT 1 /* IC79 is a 74LS157 selector jumpered to be enabled */
#define WILLIAMS_TILEMAP_JOUST2 2 /* IC79 is a 74LS157 selector jumpered to be disabled */
#endif // MAME_MIDWAY_WILLIAMS_H #endif // MAME_MIDWAY_WILLIAMS_H

View File

@ -228,7 +228,7 @@ void williams_state::cmos_w(offs_t offset, u8 data)
} }
void bubbles_state::cmos_w(offs_t offset, u8 data) void williams_cmos8_state::cmos_w(offs_t offset, u8 data)
{ {
/* bubbles has additional CMOS for a full 8 bits */ /* bubbles has additional CMOS for a full 8 bits */
m_nvram[offset] = data; m_nvram[offset] = data;
@ -338,7 +338,7 @@ u8 mayday_state::protection_r(offs_t offset)
/* These are compared against $a193 and $a194, respectively. Thus, to prevent */ /* 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. */ /* and $a194 for $a191. */
return m_protection[offset + 3]; return m_videoram[0xa193 + offset];
} }
@ -429,19 +429,6 @@ void blaster_state::snd_cmd_w(u8 data)
/*************************************
*
* Lotto Fun-specific routines
*
*************************************/
WRITE_LINE_MEMBER(williams_state::lottofun_coin_lock_w)
{
machine().bookkeeping().coin_lockout_global_w(state & 1); /* bit 5 of PIC control port A */
}
/************************************* /*************************************
* *
* Williams 2nd-gen-specific routines * Williams 2nd-gen-specific routines

View File

@ -93,6 +93,7 @@
while bit 7 says odd only. while bit 7 says odd only.
****************************************************************************** ******************************************************************************
Special Chip 1 and 2 aka VLSI VL2001/2001A Pinout: Special Chip 1 and 2 aka VLSI VL2001/2001A Pinout:
_______ _______ _______ _______
_|* \__/ |_ _|* \__/ |_
@ -146,6 +147,7 @@ The full silkscreen markings of SC2 (under the "Special Chip 2" sticker, if it i
<VTi Logo> 242 <VTi Logo> 242
VL2001A VL2001A
5410-09958 5410-09958
******************************************************************************/ ******************************************************************************/
#include "emu.h" #include "emu.h"
@ -753,13 +755,13 @@ void williams2_state::blit_window_enable_w(u8 data)
inline void williams_state::blit_pixel(address_space &space, int dstaddr, int srcdata, int controlbyte) inline void williams_state::blit_pixel(address_space &space, int dstaddr, int srcdata, int controlbyte)
{ {
/* always read from video RAM regardless of the bank setting */ /* always read from video RAM regardless of the bank setting */
int curpix = (dstaddr < 0xc000) ? m_videoram[dstaddr] : space.read_byte(dstaddr); //current pixel values at dest int curpix = (dstaddr < 0xc000) ? m_videoram[dstaddr] : space.read_byte(dstaddr); // current pixel values at dest
int solid = m_blitterram[1]; int solid = m_blitterram[1];
unsigned char keepmask = 0xff; //what part of original dst byte should be kept, based on NO_EVEN and NO_ODD flags unsigned char keepmask = 0xff; // what part of original dst byte should be kept, based on NO_EVEN and NO_ODD flags
//even pixel (D7-D4) // even pixel (D7-D4)
if((controlbyte & WMS_BLITTER_CONTROLBYTE_FOREGROUND_ONLY) && !(srcdata & 0xf0)) //FG only and src even pixel=0 if((controlbyte & WMS_BLITTER_CONTROLBYTE_FOREGROUND_ONLY) && !(srcdata & 0xf0)) // FG only and src even pixel=0
{ {
if(controlbyte & WMS_BLITTER_CONTROLBYTE_NO_EVEN) if(controlbyte & WMS_BLITTER_CONTROLBYTE_NO_EVEN)
keepmask &= 0x0f; keepmask &= 0x0f;
@ -770,8 +772,8 @@ inline void williams_state::blit_pixel(address_space &space, int dstaddr, int sr
keepmask &= 0x0f; keepmask &= 0x0f;
} }
//odd pixel (D3-D0) // odd pixel (D3-D0)
if((controlbyte & WMS_BLITTER_CONTROLBYTE_FOREGROUND_ONLY) && !(srcdata & 0x0f)) //FG only and src odd pixel=0 if((controlbyte & WMS_BLITTER_CONTROLBYTE_FOREGROUND_ONLY) && !(srcdata & 0x0f)) // FG only and src odd pixel=0
{ {
if(controlbyte & WMS_BLITTER_CONTROLBYTE_NO_ODD) if(controlbyte & WMS_BLITTER_CONTROLBYTE_NO_ODD)
keepmask &= 0xf0; keepmask &= 0xf0;
@ -788,9 +790,9 @@ inline void williams_state::blit_pixel(address_space &space, int dstaddr, int sr
else else
curpix |= (srcdata & ~keepmask); curpix |= (srcdata & ~keepmask);
/* if the window is enabled, only blit to videoram below the clipping address */ /* if the window is enabled, only blit to videoram below the clipping address */
/* note that we have to allow blits to non-video RAM (e.g. tileram, Sinistar $DXXX SRAM) because those */ /* note that we have to allow blits to non-video RAM (e.g. tileram, Sinistar $DXXX SRAM) because those */
/* are not blocked by the window enable */ /* are not blocked by the window enable */
if (!m_blitter_window_enable || dstaddr < m_blitter_clip_address || dstaddr >= 0xc000) if (!m_blitter_window_enable || dstaddr < m_blitter_clip_address || dstaddr >= 0xc000)
space.write_byte(dstaddr, curpix); space.write_byte(dstaddr, curpix);
} }
@ -817,12 +819,13 @@ int williams_state::blitter_core(address_space &space, int sstart, int dstart, i
/* loop over the width */ /* loop over the width */
for (int x = 0; x < w; x++) for (int x = 0; x < w; x++)
{ {
if (!(controlbyte & WMS_BLITTER_CONTROLBYTE_SHIFT)) //no shift if (!(controlbyte & WMS_BLITTER_CONTROLBYTE_SHIFT)) // no shift
{ {
blit_pixel(space, dest, m_blitter_remap[space.read_byte(source)], controlbyte); blit_pixel(space, dest, m_blitter_remap[space.read_byte(source)], controlbyte);
} }
else else
{ //shift one pixel right {
// shift one pixel right
pixdata = (pixdata << 8) | m_blitter_remap[space.read_byte(source)]; pixdata = (pixdata << 8) | m_blitter_remap[space.read_byte(source)];
blit_pixel(space, dest, (pixdata >> 4) & 0xff, controlbyte); blit_pixel(space, dest, (pixdata >> 4) & 0xff, controlbyte);
} }