summaryrefslogtreecommitdiffstatshomepage
path: root/src/mame/ice/chexx.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/mame/ice/chexx.cpp')
-rw-r--r--src/mame/ice/chexx.cpp615
1 files changed, 615 insertions, 0 deletions
diff --git a/src/mame/ice/chexx.cpp b/src/mame/ice/chexx.cpp
new file mode 100644
index 00000000000..33aadc571c7
--- /dev/null
+++ b/src/mame/ice/chexx.cpp
@@ -0,0 +1,615 @@
+// license:BSD-3-Clause
+// copyright-holders:Luca Elia
+/***************************************************************************
+
+Electro-mechanical bubble hockey games:
+
+- Chexx (1983 version) by ICE
+ http://www.pinrepair.com/arcade/chexx.htm
+
+- Face-Off, an illegal? copy of Chexx
+ http://valker.us/gameroom/SegaFaceOff.htm
+ https://casetext.com/case/innovative-concepts-in-ent-v-entertainment-enter
+
+(Some sources indicate these may have been copied from a earlier Sega game called Face-Off)
+
+Olimpic Hockey, Spanish clone from Inor (probably unlicensed), runs on an almost
+exact clone of the 1st generation ICE Chexx hardware (https://www.recreativas.org/olimpic-hockey-1110-inor):
+
+ Inor Olympic Hockey PCB
+ ________________________________________
+ | |
+ | : <- Conn P4 ____________ |
+ | |/B8342 SJLB| |
+ | |___________| |
+ | ____________ |
+ | |/B8342 SJLC| |
+ | |___________| |
+ | ____________ |
+ | |/B8342 SJLD| |
+ | |___________| |
+ | ____________ |
+ |/o\ <- Conn p5 |/B8342 SJLF| |
+ ||o| |___________| |
+ ||o| ____________ |
+ | |/B8342 SJLG| |
+ | |___________| |
+ | : <- Conn P7 ____________ |
+ | : |/B8342 SJLH| |
+ | |___________| |
+ | ____ ____________ |
+ | LM358N |EMPTY | |
+ | |___________| |
+ | ____________ |
+ | _________ |EMPTY | |
+ | 74LS138B1 |___________| |
+ | ______________________ |
+ | | 54104 DIGITALKER | |
+ | |_____________________| |
+ | _________ : |
+ | _________ |________| : |
+ | |74LS74B1| Conn P2 -> : |
+ | ______________________ |
+ | | UM6522A | |
+ | _________ |_____________________| |
+ | |________| |
+ | ____________ |
+ | : | EF68B10P | |
+ | : <- Conn P1 |___________| |
+ | : o <- Conn P8 |
+ | o : <- Conn P6 |
+ | 0 : |
+ | : ______________________ |
+ | : <- Conn P3 | UM6502A | |
+ | |_____________________| |
+ | _________ |
+ | _________ ____________ PC74HCT74P |
+ | |74LS04_| | EPROM | |
+ | |___________| |
+ | Xtal |
+ | 4.000 MHz DSW _________ DSW |
+ | x2 T74LS365B1 x2 |
+ |___________ COST _____________ TIME ___|
+
+The electromechanical game Fire Escape (1984, Mech-Tronic Games, Inc.)
+appears to run on very similar hardware, with a AY8912 but no Digitalker.
+
+***************************************************************************/
+
+#include "emu.h"
+#include "cpu/m6502/m6502.h"
+#include "machine/6522via.h"
+#include "machine/timer.h"
+#include "sound/ay8910.h"
+#include "sound/digitalk.h"
+#include "speaker.h"
+
+#include "chexx.lh"
+
+
+namespace {
+
+class chexx_state : public driver_device
+{
+public:
+ chexx_state(const machine_config &mconfig, device_type type, const char *tag)
+ : driver_device(mconfig, type, tag)
+ , m_maincpu(*this, "maincpu")
+ , m_via(*this, "via6522")
+ , m_digitalker(*this, "digitalker")
+ , m_digits(*this, "digit%u", 0U)
+ , m_leds(*this, "led%u", 0U)
+ , m_lamps(*this, "lamp%u", 0U)
+ , m_dsw(*this, "DSW")
+ , m_input(*this, "INPUT")
+ , m_coin(*this, "COIN")
+ {
+ }
+
+ void chexx(machine_config &config) ATTR_COLD;
+ void unkbubsc(machine_config &config) ATTR_COLD;
+
+protected:
+ // handlers
+ uint8_t via_a_in();
+ uint8_t via_b_in();
+
+ void via_a_out(uint8_t data);
+ void via_b_out(uint8_t data);
+
+ void via_ca2_out(int state);
+ void via_cb1_out(int state);
+ void via_cb2_out(int state);
+ void via_irq_out(int state);
+
+ uint8_t input_r();
+
+ void lamp_w(uint8_t data);
+
+ void mem(address_map &map) ATTR_COLD;
+ void unkbubsc_mem(address_map &map) ATTR_COLD;
+
+ TIMER_CALLBACK_MEMBER(update);
+
+ // digitalker
+ void digitalker_set_bank(uint8_t bank);
+
+ // driver_device overrides
+ virtual void machine_start() override ATTR_COLD;
+ virtual void machine_reset() override ATTR_COLD;
+
+ // devices
+ required_device<cpu_device> m_maincpu;
+ required_device<via6522_device> m_via;
+ required_device<digitalker_device> m_digitalker;
+ output_finder<4> m_digits;
+ output_finder<3> m_leds;
+ output_finder<2> m_lamps;
+
+ required_ioport m_dsw;
+ required_ioport m_input;
+ required_ioport m_coin;
+
+ // vars
+ emu_timer *m_update_timer;
+ uint8_t m_port_a;
+ uint8_t m_port_b;
+ uint8_t m_bank;
+ uint32_t m_shift;
+ uint8_t m_lamp;
+};
+
+class faceoffh_state : public chexx_state
+{
+public:
+ faceoffh_state(const machine_config &mconfig, device_type type, const char *tag)
+ : chexx_state(mconfig, type, tag)
+ , m_aysnd(*this, "aysnd")
+ {
+ }
+
+ void faceoffh(machine_config &config);
+
+protected:
+ void ay_w(offs_t offset, uint8_t data);
+
+ void mem(address_map &map) ATTR_COLD;
+
+ required_device<ay8910_device> m_aysnd; // only faceoffh
+ uint8_t m_ay_cmd = 0;
+ uint8_t m_ay_data = 0;
+};
+
+
+// VIA
+
+uint8_t chexx_state::via_a_in()
+{
+ uint8_t ret = 0;
+ logerror("%s: VIA read A: %02X\n", machine().describe_context(), ret);
+ return ret;
+}
+
+uint8_t chexx_state::via_b_in()
+{
+ uint8_t ret = 0;
+ logerror("%s: VIA read B: %02X\n", machine().describe_context(), ret);
+ return ret;
+}
+
+void chexx_state::via_a_out(uint8_t data)
+{
+ m_port_a = data; // multiplexer
+ m_digitalker->digitalker_data_w(data);
+// logerror("%s: VIA write A = %02X\n", machine().describe_context(), data);
+}
+
+void chexx_state::via_b_out(uint8_t data)
+{
+ m_port_b = data;
+
+ digitalker_set_bank(data & 3);
+ m_digitalker->set_output_gain(0, BIT(data,2) ? 1.0f : 0.0f); // bit 2 controls the Digitalker output
+ machine().bookkeeping().coin_counter_w(0, BIT(~data,3));
+ // bit 4 is EJECT
+ // bit 7 is related to speaker out
+
+// logerror("%s: VIA write B = %02X\n", machine().describe_context(), data);
+}
+
+void chexx_state::via_ca2_out(int state)
+{
+ m_digitalker->digitalker_0_cms_w(CLEAR_LINE);
+ m_digitalker->digitalker_0_cs_w(CLEAR_LINE);
+ m_digitalker->digitalker_0_wr_w(state ? ASSERT_LINE : CLEAR_LINE);
+
+// logerror("%s: VIA write CA2 = %02X\n", machine().describe_context(), state);
+}
+
+void chexx_state::via_cb1_out(int state)
+{
+// logerror("%s: VIA write CB1 = %02X\n", machine().describe_context(), state);
+}
+
+void chexx_state::via_cb2_out(int state)
+{
+ m_shift = ((m_shift << 1) & 0xffffff) | state;
+
+ // 7segs (score)
+ constexpr uint8_t patterns[16] = { 0x3f, 0x06, 0x5b, 0x4f, 0x66, 0x6d, 0x7c, 0x07, 0x7f, 0x67, 0, 0, 0, 0, 0, 0 }; // 4511
+
+ m_digits[0] = patterns[(m_shift >> (16+4)) & 0xf];
+ m_digits[1] = patterns[(m_shift >> (16+0)) & 0xf];
+ m_digits[2] = patterns[(m_shift >> (8+4)) & 0xf];
+ m_digits[3] = patterns[(m_shift >> (8+0)) & 0xf];
+
+ // Leds (period being played)
+ m_leds[0] = BIT(m_shift,2);
+ m_leds[1] = BIT(m_shift,1);
+ m_leds[2] = BIT(m_shift,0);
+
+// logerror("%s: VIA write CB2 = %02X\n", machine().describe_context(), state);
+}
+
+void chexx_state::via_irq_out(int state)
+{
+ m_maincpu->set_input_line(INPUT_LINE_IRQ0, state ? ASSERT_LINE : CLEAR_LINE);
+// logerror("%s: VIA write IRQ = %02X\n", machine().describe_context(), state);
+}
+
+uint8_t chexx_state::input_r()
+{
+ uint8_t ret = m_dsw->read(); // bits 0-3
+ uint8_t inp = m_input->read(); // bit 7 (multiplexed)
+
+ for (int i = 0; i < 8; ++i)
+ if (BIT(~m_port_a, i) && BIT(~inp, i))
+ ret &= 0x7f;
+
+ return ret;
+}
+
+// Chexx Memory Map
+
+void chexx_state::mem(address_map &map)
+{
+ map(0x0000, 0x007f).ram().mirror(0x100); // 6810 - 128 x 8 static RAM
+ map(0x4000, 0x400f).m(m_via, FUNC(via6522_device::map));
+ map(0x8000, 0x8000).r(FUNC(chexx_state::input_r));
+ map(0xf800, 0xffff).rom().region("maincpu", 0);
+}
+
+void chexx_state::unkbubsc_mem(address_map &map)
+{
+ mem(map);
+
+ map(0xf000, 0xffff).rom().region("maincpu", 0);
+}
+
+void chexx_state::lamp_w(uint8_t data)
+{
+ m_lamp = data;
+ m_lamps[0] = BIT(m_lamp,0);
+ m_lamps[1] = BIT(m_lamp,1);
+}
+
+// Face-Off Memory Map
+
+void faceoffh_state::mem(address_map &map)
+{
+ map(0x0000, 0x007f).ram().mirror(0x100); // M58725P - 2KB
+ map(0x4000, 0x400f).m(m_via, FUNC(via6522_device::map));
+ map(0x8000, 0x8000).r(FUNC(faceoffh_state::input_r));
+ map(0xa000, 0xa001).w(FUNC(faceoffh_state::ay_w));
+ map(0xc000, 0xc000).w(FUNC(faceoffh_state::lamp_w));
+ map(0xf000, 0xffff).rom().region("maincpu", 0);
+}
+
+void faceoffh_state::ay_w(offs_t offset, uint8_t data)
+{
+ if (offset)
+ {
+ m_ay_data = data;
+ return;
+ }
+
+ if (m_ay_cmd == 0x00 && data == 0x03)
+ {
+ m_aysnd->address_w(m_ay_data);
+// logerror("%s: AY addr = %02X\n", machine().describe_context(), m_ay_data);
+ }
+ else if (m_ay_cmd == 0x00 && data == 0x02)
+ {
+ m_aysnd->data_w(m_ay_data);
+// logerror("%s: AY data = %02X\n", machine().describe_context(), m_ay_data);
+ }
+ m_ay_cmd = data;
+}
+
+// Inputs
+
+static INPUT_PORTS_START( chexx83 )
+ PORT_START("COIN")
+ PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_COIN1 ) PORT_IMPULSE(1) // play anthem
+ PORT_BIT( 0x02, IP_ACTIVE_LOW, IPT_COIN2 ) PORT_IMPULSE(1) // play anthem
+
+ PORT_START("INPUT")
+ PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_START1 ) PORT_NAME("P1 Goal Sensor")
+ PORT_BIT( 0x02, IP_ACTIVE_LOW, IPT_START2 ) PORT_NAME("P2 Goal Sensor")
+ PORT_BIT( 0x04, IP_ACTIVE_LOW, IPT_START3 ) PORT_NAME("Puck Near Goal Sensors") // play "ohh" sample
+ PORT_BIT( 0x08, IP_ACTIVE_LOW, IPT_BUTTON1 ) PORT_NAME("P1 Boo Button") // stop anthem, play "boo" sample, eject puck
+ PORT_BIT( 0x10, IP_ACTIVE_LOW, IPT_BUTTON2 ) PORT_NAME("P2 Boo Button") // stop anthem, play "boo" sample, eject puck
+ PORT_BIT( 0x20, IP_ACTIVE_LOW, IPT_BUTTON3 ) PORT_NAME("Puck Eject Ready Sensor")
+ PORT_BIT( 0x40, IP_ACTIVE_LOW, IPT_UNKNOWN )
+ PORT_BIT( 0x80, IP_ACTIVE_LOW, IPT_UNKNOWN )
+
+ PORT_START("DSW")
+ PORT_DIPNAME( 0x03, 0x00, DEF_STR( Coinage ) ) PORT_DIPLOCATION("SW1:1,2")
+ PORT_DIPSETTING( 0x03, DEF_STR( 4C_1C ) )
+ PORT_DIPSETTING( 0x02, DEF_STR( 3C_1C ) )
+ PORT_DIPSETTING( 0x01, DEF_STR( 2C_1C ) )
+ PORT_DIPSETTING( 0x00, DEF_STR( 1C_1C ) )
+ PORT_DIPNAME( 0x0c, 0x00, "Game Duration (mins)" ) PORT_DIPLOCATION("SW1:3,4")
+ PORT_DIPSETTING( 0x00, "2" ) // 40
+ PORT_DIPSETTING( 0x04, "3" ) // 60
+ PORT_DIPSETTING( 0x08, "4" ) // 80
+ PORT_DIPSETTING( 0x0c, "5" ) // 100
+ PORT_BIT( 0x70, IP_ACTIVE_LOW, IPT_UNKNOWN )
+ PORT_BIT( 0x80, IP_ACTIVE_LOW, IPT_CUSTOM ) // multiplexed inputs
+INPUT_PORTS_END
+
+// Machine
+
+void chexx_state::machine_start()
+{
+ m_digits.resolve();
+ m_leds.resolve();
+ m_lamps.resolve();
+
+ m_update_timer = timer_alloc(FUNC(chexx_state::update), this);
+}
+
+void chexx_state::digitalker_set_bank(uint8_t bank)
+{
+ if (m_bank != bank)
+ {
+ uint8_t *src = memregion("samples")->base();
+ uint8_t *dst = memregion("digitalker")->base();
+
+ memcpy(dst, src + bank * 0x4000, 0x4000);
+
+ m_bank = bank;
+ }
+}
+
+void chexx_state::machine_reset()
+{
+ m_bank = -1;
+ digitalker_set_bank(0);
+ m_update_timer->adjust(attotime::from_hz(60), 0, attotime::from_hz(60));
+}
+
+TIMER_CALLBACK_MEMBER(chexx_state::update)
+{
+ // NMI on coin-in
+ uint8_t coin = (~m_coin->read()) & 0x03;
+ m_maincpu->set_input_line(INPUT_LINE_NMI, coin ? ASSERT_LINE : CLEAR_LINE);
+
+ // VIA CA1 connected to Digitalker INTR line
+ m_via->write_ca1(m_digitalker->digitalker_0_intr_r());
+
+#if 0
+ // Play the digitalker samples (it's not hooked up correctly yet)
+ static uint8_t sample = 0, bank = 0;
+
+ if (machine().input().code_pressed_once(KEYCODE_Q))
+ --bank;
+ if (machine().input().code_pressed_once(KEYCODE_W))
+ ++bank;
+ bank %= 3;
+ digitalker_set_bank(bank);
+
+ if (machine().input().code_pressed_once(KEYCODE_A))
+ --sample;
+ if (machine().input().code_pressed_once(KEYCODE_S))
+ ++sample;
+
+ if (machine().input().code_pressed_once(KEYCODE_Z))
+ {
+ m_digitalker->digitalker_0_cms_w(CLEAR_LINE);
+ m_digitalker->digitalker_0_cs_w(CLEAR_LINE);
+
+ m_digitalker->digitalker_data_w(sample);
+
+ m_digitalker->digitalker_0_wr_w(ASSERT_LINE);
+ m_digitalker->digitalker_0_wr_w(CLEAR_LINE);
+ m_digitalker->digitalker_0_wr_w(ASSERT_LINE);
+ }
+#endif
+}
+
+void chexx_state::chexx(machine_config &config)
+{
+ M6502(config, m_maincpu, XTAL(4'000'000) / 2);
+ m_maincpu->set_addrmap(AS_PROGRAM, &chexx_state::mem);
+
+ // via
+ MOS6522(config, m_via, XTAL(4'000'000) / 4);
+
+ m_via->readpa_handler().set(FUNC(chexx_state::via_a_in));
+ m_via->readpb_handler().set(FUNC(chexx_state::via_b_in));
+
+ m_via->writepa_handler().set(FUNC(chexx_state::via_a_out));
+ m_via->writepb_handler().set(FUNC(chexx_state::via_b_out));
+
+ m_via->ca2_handler().set(FUNC(chexx_state::via_ca2_out));
+ m_via->cb1_handler().set(FUNC(chexx_state::via_cb1_out));
+ m_via->cb2_handler().set(FUNC(chexx_state::via_cb2_out));
+ m_via->irq_handler().set(FUNC(chexx_state::via_irq_out));
+
+ // Layout
+ config.set_default_layout(layout_chexx);
+
+ // sound hardware
+ SPEAKER(config, "mono").front_center();
+ DIGITALKER(config, m_digitalker, XTAL(4'000'000));
+ m_digitalker->add_route(ALL_OUTPUTS, "mono", 0.16);
+}
+
+void chexx_state::unkbubsc(machine_config &config)
+{
+ chexx(config);
+
+ m_maincpu->set_addrmap(AS_PROGRAM, &chexx_state::unkbubsc_mem);
+}
+
+void faceoffh_state::faceoffh(machine_config &config)
+{
+ chexx(config);
+ m_maincpu->set_addrmap(AS_PROGRAM, &faceoffh_state::mem);
+
+ AY8910(config, m_aysnd, XTAL(4'000'000) / 2);
+ m_aysnd->add_route(ALL_OUTPUTS, "mono", 0.30);
+}
+
+// ROMs
+
+/***************************************************************************
+
+Chexx Hockey (1983 version 1.1)
+
+The "long and skinny" Moog CPU board used a 6502 for the processor,
+a 6522 for the PIA, a 6810 static RAM, eight 52164 64k bit sound ROM chips,
+a 40 pin 54104 sound chip, and a single 2716 CPU EPROM
+
+***************************************************************************/
+
+ROM_START( chexx83 )
+ ROM_REGION( 0x0800, "maincpu", 0 )
+ ROM_LOAD( "chexx83.u4", 0x0000, 0x0800, CRC(a34abac1) SHA1(75a31670eb6d1b62ba984f0bac7c6e6067f6ae87) )
+
+ ROM_REGION( 0x4000, "digitalker", ROMREGION_ERASE00 )
+ // bank switched (from samples region)
+
+ ROM_REGION( 0x10000, "samples", ROMREGION_ERASE00 )
+ ROM_LOAD( "sjlb.u19", 0x0000, 0x2000, CRC(059b3725) SHA1(5837bee1ef34ce19a3101b851ca55029776e4b3e) )
+ ROM_LOAD( "sjlc.u18", 0x2000, 0x2000, CRC(679da4e1) SHA1(01a5b9dd132c1b0de97c153d7de226f5bf357338) )
+ ROM_LOAD( "sjld.u17", 0x4000, 0x2000, CRC(f8461b33) SHA1(717a8842e0ce9ba94dd59504a324bede4844e389) )
+ ROM_LOAD( "sjlf.u16", 0x6000, 0x2000, CRC(156c91e0) SHA1(6017d4b5609b214a6e66dcd76493a7d1442c04d4) )
+ ROM_LOAD( "sjlg.u15", 0x8000, 0x2000, CRC(19904604) SHA1(633c211a9a822cdf597a6f3c221ae9c8d6482e82) )
+ ROM_LOAD( "sjlh.u14", 0xa000, 0x2000, CRC(c3386d51) SHA1(7882e88db55ba914be81075e4b2d76e246c34d3b) )
+ ROM_LOAD( "sjlj.u13", 0xc000, 0x2000, CRC(cc3473b5) SHA1(325d16b64a0d09091768d0bfae16517505b00d03) )
+ ROM_LOAD( "sjlk.u12", 0xe000, 0x2000, CRC(f8ff29df) SHA1(681501d5692fcb741af7bf830fa18907d2fa283f) )
+ROM_END
+
+// Same PCB as 'chexx83'
+ROM_START( olihockey )
+ ROM_REGION( 0x0800, "maincpu", 0 )
+ ROM_LOAD( "inor_1.u4", 0x0000, 0x0800, CRC(97716ac9) SHA1(b85ff1401544dc7121babee8adf618f82a2f6a89) )
+
+ ROM_REGION( 0x4000, "digitalker", ROMREGION_ERASE00 )
+ // bank switched (from samples region)
+
+ ROM_REGION( 0x10000, "samples", ROMREGION_ERASE00 )
+ ROM_LOAD( "b8342_sjlb.u19", 0x0000, 0x2000, CRC(059b3725) SHA1(5837bee1ef34ce19a3101b851ca55029776e4b3e) )
+ ROM_LOAD( "b8342_sjlc.u18", 0x2000, 0x2000, CRC(679da4e1) SHA1(01a5b9dd132c1b0de97c153d7de226f5bf357338) )
+ ROM_LOAD( "b8342_sjld.u17", 0x4000, 0x2000, CRC(f8461b33) SHA1(717a8842e0ce9ba94dd59504a324bede4844e389) )
+ ROM_LOAD( "b8342_sjlf.u16", 0x6000, 0x2000, CRC(156c91e0) SHA1(6017d4b5609b214a6e66dcd76493a7d1442c04d4) )
+ ROM_LOAD( "b8342_sjlg.u15", 0x8000, 0x2000, CRC(19904604) SHA1(633c211a9a822cdf597a6f3c221ae9c8d6482e82) )
+ ROM_LOAD( "b8342_sjlh.u14", 0xa000, 0x2000, CRC(c3386d51) SHA1(7882e88db55ba914be81075e4b2d76e246c34d3b) )
+
+ // U13 and U12 unpopulated
+ ROM_FILL( 0xc000, 0x2000, 0xff )
+ ROM_FILL( 0xe000, 0x2000, 0xff )
+ROM_END
+
+// Same PCB as 'chexx83'
+ROM_START( olihockeya )
+ ROM_REGION( 0x0800, "maincpu", 0 )
+ ROM_LOAD( "inor_2.u4", 0x0000, 0x0800, CRC(038958a4) SHA1(aec5e24eea1829459dd3ef9ffe3e4b8c39071ced) )
+
+ ROM_REGION( 0x4000, "digitalker", ROMREGION_ERASE00 )
+ // bank switched (from samples region)
+
+ ROM_REGION( 0x10000, "samples", ROMREGION_ERASE00 )
+ ROM_LOAD( "b8342_sjlb.u19", 0x0000, 0x2000, CRC(059b3725) SHA1(5837bee1ef34ce19a3101b851ca55029776e4b3e) )
+ ROM_LOAD( "b8342_sjlc.u18", 0x2000, 0x2000, CRC(679da4e1) SHA1(01a5b9dd132c1b0de97c153d7de226f5bf357338) )
+ ROM_LOAD( "b8342_sjld.u17", 0x4000, 0x2000, CRC(f8461b33) SHA1(717a8842e0ce9ba94dd59504a324bede4844e389) )
+ ROM_LOAD( "b8342_sjlf.u16", 0x6000, 0x2000, CRC(156c91e0) SHA1(6017d4b5609b214a6e66dcd76493a7d1442c04d4) )
+ ROM_LOAD( "b8342_sjlg.u15", 0x8000, 0x2000, CRC(19904604) SHA1(633c211a9a822cdf597a6f3c221ae9c8d6482e82) )
+ ROM_LOAD( "b8342_sjlh.u14", 0xa000, 0x2000, CRC(c3386d51) SHA1(7882e88db55ba914be81075e4b2d76e246c34d3b) )
+
+ // U13 and U12 unpopulated
+ ROM_FILL( 0xc000, 0x2000, 0xff )
+ ROM_FILL( 0xe000, 0x2000, 0xff )
+ROM_END
+
+/***************************************************************************
+
+Face-Off PCB?
+
+Entertainment Enterprises Ltd. 1983 (sticker)
+Serial No. 025402 (sticker)
+MADE IN JAPAN (etched)
+
+CPU: R6502P
+RAM: M58725P (2KB)
+I/O: R6522P (VIA)
+Samples: Digitalker (MM54104)
+Music: AY-3-8910
+Misc: XTAL 4MHz, DSW4, 42-pin connector
+
+***************************************************************************/
+
+ROM_START( faceoffh )
+ ROM_REGION( 0x1000, "maincpu", 0 )
+ // "Copyright (c) 1983 SoftLogic JAPAN"
+ ROM_LOAD( "1.5d", 0x0000, 0x1000, CRC(6ab050be) SHA1(ebecae855e22e9c3c46bdee51f84fd5352bf191a) )
+
+ ROM_REGION( 0x4000, "digitalker", ROMREGION_ERASE00 )
+ // bank switched (from samples region)
+
+ ROM_REGION( 0x10000, "samples", 0 )
+ ROM_LOAD( "9.2a", 0x0000, 0x2000, CRC(059b3725) SHA1(5837bee1ef34ce19a3101b851ca55029776e4b3e) ) // digitalker header
+ ROM_LOAD( "8.2b", 0x2000, 0x2000, CRC(679da4e1) SHA1(01a5b9dd132c1b0de97c153d7de226f5bf357338) )
+
+ ROM_LOAD( "7.2c", 0x4000, 0x2000, CRC(f8461b33) SHA1(717a8842e0ce9ba94dd59504a324bede4844e389) ) // digitalker header
+ ROM_LOAD( "6.2d", 0x6000, 0x2000, CRC(156c91e0) SHA1(6017d4b5609b214a6e66dcd76493a7d1442c04d4) )
+
+ ROM_LOAD( "5.3a", 0x8000, 0x2000, CRC(19904604) SHA1(633c211a9a822cdf597a6f3c221ae9c8d6482e82) ) // digitalker header
+ ROM_LOAD( "4.3b", 0xa000, 0x2000, CRC(c3386d51) SHA1(7882e88db55ba914be81075e4b2d76e246c34d3b) )
+
+ ROM_FILL( 0xc000, 0x2000, 0xff ) // unpopulated
+ ROM_FILL( 0xe000, 0x2000, 0xff ) // unpopulated
+ROM_END
+
+// SOCCER CPU PCB: SY6502A, R6522AP, B8303DIGITALKER, bank of 4 DIP switches, 4 MHz XTAL
+ROM_START( unkbubsc )
+ ROM_REGION( 0x1000, "maincpu", 0 )
+ ROM_LOAD( "9.5d", 0x0000, 0x1000, CRC(2efe2cb6) SHA1(f4c34c9145528cc308ccf8002e7f638c2c578bee) )
+
+ ROM_REGION( 0x4000, "digitalker", ROMREGION_ERASE00 )
+ // bank switched (from samples region)
+
+ ROM_REGION( 0x10000, "samples", 0 )
+ ROM_LOAD( "1.2a", 0x0000, 0x2000, CRC(059b3725) SHA1(5837bee1ef34ce19a3101b851ca55029776e4b3e) ) // digitalker header
+ ROM_LOAD( "2.2b", 0x2000, 0x2000, CRC(679da4e1) SHA1(01a5b9dd132c1b0de97c153d7de226f5bf357338) )
+
+ ROM_LOAD( "3.2c", 0x4000, 0x2000, CRC(f8461b33) SHA1(717a8842e0ce9ba94dd59504a324bede4844e389) ) // digitalker header
+ ROM_LOAD( "4.2d", 0x6000, 0x2000, CRC(156c91e0) SHA1(6017d4b5609b214a6e66dcd76493a7d1442c04d4) )
+
+ ROM_LOAD( "5.3a", 0x8000, 0x2000, CRC(19904604) SHA1(633c211a9a822cdf597a6f3c221ae9c8d6482e82) ) // digitalker header
+ ROM_LOAD( "6.3b", 0xa000, 0x2000, CRC(c3386d51) SHA1(7882e88db55ba914be81075e4b2d76e246c34d3b) )
+
+ ROM_LOAD( "7.3c", 0xc000, 0x2000, CRC(cc3473b5) SHA1(325d16b64a0d09091768d0bfae16517505b00d03) )
+ ROM_LOAD( "8.3d", 0xe000, 0x2000, CRC(f8ff29df) SHA1(681501d5692fcb741af7bf830fa18907d2fa283f) )
+ROM_END
+
+} // anonymous namespace
+
+
+GAME( 1983, chexx83, 0, chexx, chexx83, chexx_state, empty_init, ROT270, "ICE", "Chexx (EM Bubble Hockey, 1983 1.1)", MACHINE_NOT_WORKING | MACHINE_MECHANICAL | MACHINE_IMPERFECT_SOUND )
+GAME( 1983, faceoffh, chexx83, faceoffh, chexx83, faceoffh_state, empty_init, ROT270, "SoftLogic (Entertainment Enterprises, Ltd. license)", "Face-Off (EM Bubble Hockey)", MACHINE_NOT_WORKING | MACHINE_MECHANICAL | MACHINE_IMPERFECT_SOUND )
+GAME( 1985, olihockey, 0, chexx, chexx83, chexx_state, empty_init, ROT270, "Inor", "Olimpic Hockey (EM Bubble Hockey, set 1)", MACHINE_NOT_WORKING | MACHINE_MECHANICAL | MACHINE_IMPERFECT_SOUND )
+GAME( 1985, olihockeya, olihockey, chexx, chexx83, chexx_state, empty_init, ROT270, "Inor", "Olimpic Hockey (EM Bubble Hockey, set 2)", MACHINE_NOT_WORKING | MACHINE_MECHANICAL | MACHINE_IMPERFECT_SOUND )
+GAME( 198?, unkbubsc, 0, unkbubsc, chexx83, chexx_state, empty_init, ROT270, "<unknown>", "unknown bubble soccer game", MACHINE_NOT_WORKING | MACHINE_MECHANICAL | MACHINE_IMPERFECT_SOUND )