From d823fa71ea33689f75463fc11090991601e0912f Mon Sep 17 00:00:00 2001 From: hap Date: Thu, 15 Sep 2022 01:04:02 +0200 Subject: New working machines -------------------- Conquest (prototype) [Code Mystics] --- src/mame/mame.lst | 1 + src/mame/midway/williams.cpp | 280 ++++++++++++++++++----------------------- src/mame/midway/williams.h | 117 +++++++++-------- src/mame/midway/williams_m.cpp | 17 +-- src/mame/midway/williams_v.cpp | 25 ++-- 5 files changed, 203 insertions(+), 237 deletions(-) diff --git a/src/mame/mame.lst b/src/mame/mame.lst index c779ce441be..ca81d74786e 100644 --- a/src/mame/mame.lst +++ b/src/mame/mame.lst @@ -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 diff --git a/src/mame/midway/williams.cpp b/src/mame/midway/williams.cpp index b459082583c..31a7b65b7e7 100644 --- a/src/mame/midway/williams.cpp +++ b/src/mame/midway/williams.cpp @@ -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) +void williams_state::williams_b0(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 +void williams_state::williams_b1(machine_config &config) { - defender(config); - // basic machine hardware - m_screen->set_visarea(0, 315, 7, 247-1); + williams_base(config); + m_blitter_config = WILLIAMS_BLITTER_SC1; + m_blitter_clip_address = 0xc000; } - -void williams_state::stargate(machine_config &config) +void williams_state::williams_b2(machine_config &config) { williams_base(config); - m_blitter_config = WILLIAMS_BLITTER_NONE; - m_blitter_clip_address = 0x0000; + m_blitter_config = WILLIAMS_BLITTER_SC2; + m_blitter_clip_address = 0xc000; } -void williams_state::robotron(machine_config &config) +void defender_state::defender(machine_config &config) { - williams_base(config); - m_blitter_config = WILLIAMS_BLITTER_SC1; - m_blitter_clip_address = 0xc000; -} + 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 williams_muxed_state::williams_muxed(machine_config &config) +void defender_state::jin(machine_config &config) { - williams_base(config); + defender(config); + // needs a different screen size or the credit text is clipped + m_screen->set_visarea(0, 315, 7, 247-1); +} - // basic machine hardware +void williams_muxed_state::williams_muxed(machine_config &config) +{ // 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; -} - - -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; + // sound hardware + HC55516(config, "cvsd", 0).add_route(ALL_OUTPUTS, "speaker", 0.8); } - 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, 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, 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, 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 ) diff --git a/src/mame/midway/williams.h b/src/mame/midway/williams.h index 4ea7625ec2f..28bc5488569 100644 --- a/src/mame/midway/williams.h +++ b/src/mame/midway/williams.h @@ -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 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 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,38 +180,52 @@ public: private: virtual void vram_select_w(u8 data) override; - - void main_map(address_map &map); + virtual void main_map(address_map &map) override; }; -class bubbles_state : public williams_state +// Playball: more soundlatch bits +class playball_state : public williams_state { public: - bubbles_state(const machine_config &mconfig, device_type type, const char *tag) : + playball_state(const machine_config &mconfig, device_type type, const char *tag) : williams_state(mconfig, type, tag) { } - void bubbles(machine_config &config); + void playball(machine_config &config); private: - void main_map(address_map &map); + 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; }; -class playball_state : public williams_state +// Conquest: flywheel controller +class conquest_state : public williams_cmos8_state { public: - playball_state(const machine_config &mconfig, device_type type, const char *tag) : - williams_state(mconfig, type, tag) + conquest_state(const machine_config &mconfig, device_type type, const char *tag) : + williams_cmos8_state(mconfig, type, tag), + m_dial(*this, "DIAL") { } - void playball(machine_config &config); + DECLARE_CUSTOM_INPUT_MEMBER(dial0_r) { return m_dial->read() & 3; } + DECLARE_CUSTOM_INPUT_MEMBER(dial1_r) { return m_dial->read() >> 2 & 3; } private: - void snd_cmd_w(u8 data); + required_ioport m_dial; }; +// Joust, Splat: muxed inputs class williams_muxed_state : public williams_state { public: @@ -237,6 +247,7 @@ private: required_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 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 diff --git a/src/mame/midway/williams_m.cpp b/src/mame/midway/williams_m.cpp index ad19ffeeb1c..2ae49869ad7 100644 --- a/src/mame/midway/williams_m.cpp +++ b/src/mame/midway/williams_m.cpp @@ -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 diff --git a/src/mame/midway/williams_v.cpp b/src/mame/midway/williams_v.cpp index 4bc0f2781a5..c20f72a84c4 100644 --- a/src/mame/midway/williams_v.cpp +++ b/src/mame/midway/williams_v.cpp @@ -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 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); } -- cgit v1.2.3