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
colony7 // (c) 1981 Taito
colony7a // (c) 1981 Taito
conquest // prototype
defcmnd // bootleg
defence // bootleg
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, 0x8fff).bankr("mainbank");
@ -577,25 +577,12 @@ void williams_state::base_map(address_map &map)
void sinistar_state::main_map(address_map &map)
{
base_map(map);
map(0xc900, 0xc9ff).w(FUNC(sinistar_state::vram_select_w));
williams_state::main_map(map);
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");
}
/*************************************
*
@ -605,7 +592,7 @@ void bubbles_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
map(0xc800, 0xc800).portr("AN0");
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");
}
// mysticm and inferno: D000-DFFF is RAM
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();
}
// tshoot and joust2: D000-DFFF is ROM
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)
{
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(0xb000, 0xffff).rom();
}
@ -713,8 +698,8 @@ void defender_state::sound_map(address_map &map)
void williams_state::sound_map(address_map &map)
{
map(0x0000, 0x007f).ram(); // internal RAM
map(0x0080, 0x00ff).ram(); // MC6810 RAM
map(0x0000, 0x007f).ram(); // internal 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(0xb000, 0xffff).rom();
}
@ -722,8 +707,8 @@ void williams_state::sound_map(address_map &map)
/* Same as above, but for second sound board */
void blaster_state::sound2_map(address_map &map)
{
map(0x0000, 0x007f).ram(); // internal RAM
map(0x0080, 0x00ff).ram(); // MC6810 RAM
map(0x0000, 0x007f).ram(); // internal 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(0xb000, 0xffff).rom();
}
@ -738,8 +723,8 @@ void blaster_state::sound2_map(address_map &map)
void williams2_state::sound_map(address_map &map)
{
map(0x0000, 0x007f).ram(); // internal RAM
map(0x0080, 0x00ff).ram(); // MC6810 RAM
map(0x0000, 0x007f).ram(); // internal 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(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( 0x00, "30k/50k" ) 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( 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( 0x00, DEF_STR( On ))
PORT_BIT( 0x10, IP_ACTIVE_HIGH, IPT_COIN1 )
@ -1055,6 +1040,28 @@ static INPUT_PORTS_START( bubbles )
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 )
PORT_START("IN0")
// 0x0f muxed from INP1/INP2
@ -1122,10 +1129,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 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_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
INPUT_PORTS_END
@ -1184,10 +1191,10 @@ static INPUT_PORTS_START( blaster )
PORT_START("INP2")
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_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
INPUT_PORTS_END
@ -1210,10 +1217,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 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_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_START("IN3")
@ -1262,16 +1269,16 @@ static INPUT_PORTS_START( spdball )
PORT_BIT( 0x40, IP_ACTIVE_HIGH, IPT_START1 )
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_START("AN1") // analog
PORT_START("AN1") // analog
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_START("AN3") // analog
PORT_START("AN3") // analog
PORT_BIT( 0xff, 0x00, IPT_TRACKBALL_X ) PORT_SENSITIVITY(25) PORT_KEYDELTA(32) PORT_PLAYER(2)
INPUT_PORTS_END
@ -1533,7 +1540,7 @@ 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::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
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>));
}
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)
void williams_state::williams_b0(machine_config &config)
{
williams_base(config);
m_blitter_config = WILLIAMS_BLITTER_NONE;
m_blitter_clip_address = 0x0000;
}
void williams_state::robotron(machine_config &config)
void williams_state::williams_b1(machine_config &config)
{
williams_base(config);
m_blitter_config = WILLIAMS_BLITTER_SC1;
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)
{
williams_base(config);
// basic machine hardware
// pia
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);
@ -1648,66 +1646,44 @@ void williams_muxed_state::williams_muxed(machine_config &config)
m_mux1->b_in_callback().set_ioport("INP1A");
}
void williams_muxed_state::joust(machine_config &config)
{
williams_b1(config);
williams_muxed(config);
m_blitter_config = WILLIAMS_BLITTER_SC1;
m_blitter_clip_address = 0xc000;
}
void williams_muxed_state::splat(machine_config &config)
{
williams_b2(config);
williams_muxed(config);
m_blitter_config = WILLIAMS_BLITTER_SC2;
m_blitter_clip_address = 0xc000;
}
void spdball_state::spdball(machine_config &config)
{
williams_base(config);
// basic machine hardware
m_maincpu->set_addrmap(AS_PROGRAM, &spdball_state::main_map);
williams_b1(config);
// pia
PIA6821(config, m_pia[3], 0);
m_pia[3]->readpa_handler().set_ioport("IN3");
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)
{
williams_base(config);
// basic machine hardware
williams_b1(config);
// pia
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);
m_blitter_config = WILLIAMS_BLITTER_SC1;
m_blitter_clip_address = 0xc000;
}
void sinistar_state::sinistar(machine_config &config)
{
williams_base(config);
// 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);
williams_b1(config);
m_blitter_clip_address = 0x7400;
// pia
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]->cb2_handler().set("cvsd", FUNC(hc55516_device::clock_w));
m_blitter_config = WILLIAMS_BLITTER_SC1;
m_blitter_clip_address = 0x7400;
// sound hardware
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)
{
williams_base(config);
// basic machine hardware
williams_b1(config);
// video hardware
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);
// 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]->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)
{
williams_base(config);
// basic machine hardware
m_maincpu->set_addrmap(AS_PROGRAM, &blaster_state::main_map);
williams_b2(config);
m_blitter_clip_address = 0x9700;
// video hardware
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));
// 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);
m_muxa->a_in_callback().set_ioport("IN3");
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)
{
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);
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));
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>));
}
void tshoot_state::tshoot(machine_config &config)
{
williams2_base(config);
@ -1941,7 +1887,6 @@ void tshoot_state::tshoot(machine_config &config)
m_mux->b_in_callback().set_ioport("INP2");
}
void joust2_state::joust2(machine_config &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]->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_pia[2]->cb2_handler().set(m_bg, FUNC(s11_obg_device::resetq_w)); // inverted?
@ -2398,6 +2344,30 @@ ROM_START( jin )
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:
@ -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_END
/*
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_END
/*
Bubbles ROM labels are in this format:
@ -3125,6 +3097,7 @@ ROM_END
/*
Sinistar
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();
@ -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()
{
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, 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, 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, defender_state, init_defndjeu, ROT0, "bootleg (Jeutel)", "Tornado (set 1, Defender bootleg)", MACHINE_SUPPORTS_SAVE )
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, defender_state, init_defndjeu, ROT0, "bootleg (Jeutel)", "Zero (set 1, 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( 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 )
@ -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 )
// 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, 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, conquest, 0, williams_b1, conquest, conquest_state, empty_init, ROT270, "Williams / Vid Kidz", "Conquest (prototype)", MACHINE_IS_INCOMPLETE | 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
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( 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( 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( 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, 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, 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, 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, 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, bubbles, 0, williams_b1, bubbles, williams_cmos8_state, empty_init, ROT0, "Williams", "Bubbles", 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, 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 )

View File

@ -27,6 +27,7 @@
#include "screen.h"
#include "tilemap.h"
// base Williams hardware
class williams_state : public driver_device
{
public:
@ -44,8 +45,11 @@ public:
m_pia(*this, "pia_%u", 0U)
{ }
void stargate(machine_config &config);
void robotron(machine_config &config);
void williams_base(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);
u8 port_0_49way_r();
@ -59,20 +63,26 @@ public:
void palette_init(palette_device &palette) const;
protected:
void williams_base(machine_config &config);
virtual void machine_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
{
//controlbyte (0xCA00) bit definitions
WMS_BLITTER_CONTROLBYTE_NO_EVEN = 0x80,
WMS_BLITTER_CONTROLBYTE_NO_ODD = 0x40,
WMS_BLITTER_CONTROLBYTE_SHIFT = 0x20,
WMS_BLITTER_CONTROLBYTE_SOLID = 0x10,
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_SRC_STRIDE_256 = 0x01
};
@ -92,14 +102,10 @@ protected:
std::unique_ptr<uint8_t[]> m_blitter_remap_lookup;
virtual void vram_select_w(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);
TIMER_CALLBACK_MEMBER(deferred_snd_cmd_w);
void snd_cmd_w(u8 data);
DECLARE_WRITE_LINE_MEMBER(lottofun_coin_lock_w);
virtual void snd_cmd_w(u8 data);
void state_save_register();
void blitter_init(int blitter_config, const uint8_t *remap_prom);
@ -115,9 +121,10 @@ protected:
optional_device_array<pia6821_device, 4> m_pia;
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
{
public:
@ -129,8 +136,10 @@ public:
void defender(machine_config &config);
void jin(machine_config &config);
void init_defndjeu();
protected:
virtual void main_map(address_map &map);
virtual void main_map(address_map &map) override;
void video_control_w(u8 data);
@ -146,17 +155,7 @@ private:
void bank_select_w(u8 data);
};
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_start() override;
};
// Hoei Mayday: custom protection
class mayday_state : public defender_state
{
public:
@ -165,14 +164,11 @@ public:
{ }
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);
virtual void main_map(address_map &map) override;
};
// Sinistar: blitter window clip
class sinistar_state : public williams_state
{
public:
@ -184,25 +180,10 @@ public:
private:
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:
void main_map(address_map &map);
virtual void cmos_w(offs_t offset, u8 data) override;
virtual void main_map(address_map &map) override;
};
// Playball: more soundlatch bits
class playball_state : public williams_state
{
public:
@ -213,9 +194,38 @@ public:
void playball(machine_config &config);
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
{
public:
@ -237,6 +247,7 @@ private:
required_device<ls157_device> m_mux1;
};
// Speed Ball: more input ports
class spdball_state : public williams_state
{
public:
@ -247,9 +258,10 @@ public:
void spdball(machine_config &config);
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
{
public:
@ -283,16 +295,17 @@ private:
void remap_select_w(u8 data);
void video_control_w(u8 data);
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;
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);
};
// base Williams 2nd gen hardware
class williams2_state : public williams_state
{
public:
@ -350,7 +363,7 @@ protected:
virtual TIMER_DEVICE_CALLBACK_MEMBER(va11_callback) override;
TIMER_DEVICE_CALLBACK_MEMBER(endscreen_callback);
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;
@ -383,6 +396,7 @@ protected:
void d000_map(address_map &map);
};
// Inferno
class inferno_state : public williams_d000_ram_state
{
public:
@ -397,6 +411,7 @@ private:
required_device<ls157_device> m_mux;
};
// Mystic Marathon
class mysticm_state : public williams_d000_ram_state
{
public:
@ -420,9 +435,9 @@ private:
int color_decode(uint8_t base_col, int sig_J1, int y);
uint8_t m_bg_color = 0;
};
// Turkey Shoot
class tshoot_state : public williams_d000_rom_state
{
public:
@ -454,6 +469,7 @@ private:
output_finder<> m_feather_blower;
};
// Joust 2
class joust2_state : public williams_d000_rom_state
{
public:
@ -476,18 +492,9 @@ private:
virtual void bg_select_w(u8 data) override;
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);
};
/*----------- 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

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 */
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 */
/* the protection from resetting the machine, we just return $a193 for $a190, */
/* 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

View File

@ -93,6 +93,7 @@
while bit 7 says odd only.
******************************************************************************
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
VL2001A
5410-09958
******************************************************************************/
#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)
{
/* 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];
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)
if((controlbyte & WMS_BLITTER_CONTROLBYTE_FOREGROUND_ONLY) && !(srcdata & 0xf0)) //FG only and src even pixel=0
// 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_NO_EVEN)
keepmask &= 0x0f;
@ -770,8 +772,8 @@ inline void williams_state::blit_pixel(address_space &space, int dstaddr, int sr
keepmask &= 0x0f;
}
//odd pixel (D3-D0)
if((controlbyte & WMS_BLITTER_CONTROLBYTE_FOREGROUND_ONLY) && !(srcdata & 0x0f)) //FG only and src odd pixel=0
// 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_NO_ODD)
keepmask &= 0xf0;
@ -788,9 +790,9 @@ inline void williams_state::blit_pixel(address_space &space, int dstaddr, int sr
else
curpix |= (srcdata & ~keepmask);
/* 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 */
/* are not blocked by the window enable */
/* 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 */
/* are not blocked by the window enable */
if (!m_blitter_window_enable || dstaddr < m_blitter_clip_address || dstaddr >= 0xc000)
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 */
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);
}
else
{ //shift one pixel right
{
// shift one pixel right
pixdata = (pixdata << 8) | m_blitter_remap[space.read_byte(source)];
blit_pixel(space, dest, (pixdata >> 4) & 0xff, controlbyte);
}