From e058313217acec61d716e295475d29745ac76c93 Mon Sep 17 00:00:00 2001 From: hap Date: Sat, 13 Mar 2021 13:57:28 +0100 Subject: New working machines -------------------- Super-Sonic Electronic Master Mind [hap, Sean Riddle] Reader's Digest Q&A - Computer Question & Answer Game [hap, Sean Riddle] World Championship Football [hap, Sean Riddle, Kevin Horton, Olivier Galibert] --- src/devices/cpu/pps41/mm75.h | 3 - src/devices/cpu/pps41/mm76op.cpp | 4 +- src/devices/cpu/pps41/pps41base.cpp | 75 +++--- src/devices/cpu/pps41/pps41base.h | 21 +- src/mame/drivers/hh_hmcs40.cpp | 12 +- src/mame/drivers/hh_pps41.cpp | 450 +++++++++++++++++++++++++++++++++--- src/mame/drivers/hh_tms1k.cpp | 2 +- src/mame/layout/mwcfootb.lay | 35 +++ src/mame/layout/rdqa.lay | 22 ++ src/mame/layout/smastmind.lay | 73 ++++++ src/mame/mame.lst | 3 + 11 files changed, 610 insertions(+), 90 deletions(-) create mode 100644 src/mame/layout/mwcfootb.lay create mode 100644 src/mame/layout/rdqa.lay create mode 100644 src/mame/layout/smastmind.lay diff --git a/src/devices/cpu/pps41/mm75.h b/src/devices/cpu/pps41/mm75.h index 669225ca8c5..39a14245cae 100644 --- a/src/devices/cpu/pps41/mm75.h +++ b/src/devices/cpu/pps41/mm75.h @@ -42,9 +42,6 @@ public: protected: virtual void device_start() override; - virtual u32 execute_input_lines() const noexcept override { return 2; } - virtual void execute_set_input(int line, int state) override { if (line < 2) mm76_device::execute_set_input(line, state); } - // opcode handlers virtual void op_ios() override; virtual void op_i2c() override; diff --git a/src/devices/cpu/pps41/mm76op.cpp b/src/devices/cpu/pps41/mm76op.cpp index f01dfc77fbf..6cef3dae06d 100644 --- a/src/devices/cpu/pps41/mm76op.cpp +++ b/src/devices/cpu/pps41/mm76op.cpp @@ -414,8 +414,8 @@ void mm76_device::op_oa() void mm76_device::op_ios() { - // IOS: start serial I/O - m_sclock_count = 8; + // IOS: start serial I/O (2 cycles per shift, 1st shift at IOS+3) + m_sclock_count = 9; } void mm76_device::op_i1() diff --git a/src/devices/cpu/pps41/pps41base.cpp b/src/devices/cpu/pps41/pps41base.cpp index 4c824022b39..e03443da73e 100644 --- a/src/devices/cpu/pps41/pps41base.cpp +++ b/src/devices/cpu/pps41/pps41base.cpp @@ -25,7 +25,7 @@ Part numbers: Internal clock is 4-phase (4 subcycles per 1-byte opcode), and when running from an external oscillator, it is divided by 2 first. It also has an internal -oscillator which can be enabled up with a resistor to VC. +oscillator which can be enabled with a resistor wired to VC. References: - Series MM76 Product Description @@ -40,9 +40,7 @@ TODO: explain what would happen. Scrabble Sensor does it, so it's probably ok. - documentation discourages use of some extended opcodes when in subroutine pages, but again does not explain why -- documentation is conflicting whether or not MM76/MM75 can (re)set interrupt flip- - flops with SOS/ROS opcodes -- allowed opcodes after TAB should be limited +- allowed opcode after TAB should be limited - add MCU mask options, there's one for inverting interrupts - add MM78LA @@ -66,6 +64,7 @@ pps41_base_device::pps41_base_device(const machine_config &mconfig, device_type m_write_d(*this), m_read_r(*this), m_write_r(*this), + m_read_sdi(*this), m_write_sdo(*this), m_write_ssc(*this) { } @@ -88,6 +87,7 @@ void pps41_base_device::device_start() m_write_d.resolve_safe(); m_read_r.resolve_safe(0xff); m_write_r.resolve_safe(); + m_read_sdi.resolve_safe(1); m_write_sdo.resolve_safe(); m_write_ssc.resolve_safe(); @@ -120,10 +120,8 @@ void pps41_base_device::device_start() m_skip_count = 0; m_s = 0; - m_sdi = 0; - m_sclock_in = 1; + m_sclock_in = 0; m_sclock_count = 0; - m_ss_pending = false; m_d_pins = 10; m_d_mask = (1 << m_d_pins) - 1; @@ -157,10 +155,8 @@ void pps41_base_device::device_start() save_item(NAME(m_skip_count)); save_item(NAME(m_s)); - save_item(NAME(m_sdi)); save_item(NAME(m_sclock_in)); save_item(NAME(m_sclock_count)); - save_item(NAME(m_ss_pending)); save_item(NAME(m_d_output)); save_item(NAME(m_r_output)); @@ -213,7 +209,7 @@ void pps41_base_device::device_reset() //------------------------------------------------- -// inputline handling +// interrupt handling //------------------------------------------------- void pps41_base_device::execute_set_input(int line, int state) @@ -236,45 +232,56 @@ void pps41_base_device::execute_set_input(int line, int state) m_int_line[1] = state; break; - case PPS41_INPUT_LINE_SDI: - m_sdi = state; - break; - - case PPS41_INPUT_LINE_SSC: - // serial shift pending on falling edge - if (!state && m_sclock_in) - m_ss_pending = true; - m_sclock_in = state; - break; - default: break; } } +//------------------------------------------------- +// serial i/o +//------------------------------------------------- + +void pps41_base_device::ssc_w(int state) +{ + state = (state) ? 1 : 0; + + // serial shift on falling edge + if (!state && m_sclock_in) + serial_shift(m_read_sdi()); + m_sclock_in = state; +} + +void pps41_base_device::serial_shift(int state) +{ + state = (state) ? 1 : 0; + m_s = (m_s << 1 | state) & 0xf; + m_write_sdo(BIT(m_s, 3)); +} + +void pps41_base_device::serial_clock() +{ + // internal serial clock cycle + int i = m_read_sdi(); + m_sclock_count--; + m_write_ssc(m_sclock_count & 1); + + if (~m_sclock_count & 1 && m_sclock_count < 8) + serial_shift(i); +} + + //------------------------------------------------- // execute //------------------------------------------------- void pps41_base_device::cycle() { - m_icount -= 4; + m_icount--; // clock serial i/o - m_ss_pending = m_ss_pending || bool(m_sclock_count & 1); - if (m_sclock_count) - { - m_sclock_count--; - m_write_ssc(m_sclock_count & 1); - } - if (m_ss_pending) - { - m_ss_pending = false; - m_s = (m_s << 1 | m_sdi) & 0xf; - m_write_sdo(BIT(m_s, 3)); - } + serial_clock(); } void pps41_base_device::increment_pc() diff --git a/src/devices/cpu/pps41/pps41base.h b/src/devices/cpu/pps41/pps41base.h index af5e12ddbcc..2158c76a9fe 100644 --- a/src/devices/cpu/pps41/pps41base.h +++ b/src/devices/cpu/pps41/pps41base.h @@ -16,9 +16,7 @@ enum { PPS41_INPUT_LINE_INT0 = 0, - PPS41_INPUT_LINE_INT1, - PPS41_INPUT_LINE_SDI, // serial data input - PPS41_INPUT_LINE_SSC // serial shift clock + PPS41_INPUT_LINE_INT1 }; @@ -40,9 +38,15 @@ public: auto write_r() { return m_write_r.bind(); } // serial data/clock + auto read_sdi() { return m_read_sdi.bind(); } auto write_sdo() { return m_write_sdo.bind(); } auto write_ssc() { return m_write_ssc.bind(); } + u16 d_r() { return m_d_output; } + u8 r_r() { return m_r_output; } + int sdo_r() { return BIT(m_s, 3); } + void ssc_w(int state); + protected: // construction/destruction pps41_base_device(const machine_config &mconfig, device_type type, const char *tag, device_t *owner, u32 clock, int prgwidth, address_map_constructor program, int datawidth, address_map_constructor data); @@ -52,11 +56,11 @@ protected: virtual void device_reset() override; // device_execute_interface overrides - virtual u64 execute_clocks_to_cycles(u64 clocks) const noexcept override { return (clocks + 2 - 1) / 2; } - virtual u64 execute_cycles_to_clocks(u64 cycles) const noexcept override { return (cycles * 2); } + virtual u64 execute_clocks_to_cycles(u64 clocks) const noexcept override { return (clocks + 4 - 1) / 4; } + virtual u64 execute_cycles_to_clocks(u64 cycles) const noexcept override { return (cycles * 4); } virtual u32 execute_min_cycles() const noexcept override { return 1; } virtual u32 execute_max_cycles() const noexcept override { return 2; } - virtual u32 execute_input_lines() const noexcept override { return 4; } + virtual u32 execute_input_lines() const noexcept override { return 2; } virtual void execute_set_input(int line, int state) override; virtual void execute_run() override; virtual void execute_one() = 0; @@ -86,6 +90,7 @@ protected: devcb_write16 m_write_d; devcb_read8 m_read_r; devcb_write8 m_write_r; + devcb_read_line m_read_sdi; devcb_write_line m_write_sdo; devcb_write_line m_write_ssc; @@ -115,10 +120,8 @@ protected: int m_skip_count; u8 m_s; - int m_sdi; int m_sclock_in; int m_sclock_count; - bool m_ss_pending; int m_d_pins; u16 m_d_mask; @@ -129,6 +132,8 @@ protected: // misc handlers virtual bool op_is_tr(u8 op) = 0; + void serial_shift(int state); + void serial_clock(); void cycle(); void increment_pc(); }; diff --git a/src/mame/drivers/hh_hmcs40.cpp b/src/mame/drivers/hh_hmcs40.cpp index 249a3c859c4..2a6068add74 100644 --- a/src/mame/drivers/hh_hmcs40.cpp +++ b/src/mame/drivers/hh_hmcs40.cpp @@ -3518,14 +3518,14 @@ ROM_END /*************************************************************************** - Mattel World Championship Baseball + Mattel World Championship Baseball (model 3201) * PCB label MEL-001 Baseball Rev. B * Hitachi QFP HD38820A09 MCU * cyan/red/green VFD display Futaba DM-24ZK 1G, with etched overlay - To start the game in 2-player mode, simply turn the game on. For 1-player, - turn the game on while holding the 1-key and use the visitor's side keypad - to play offsense. + It was patented under US4372557. To start the game in 2-player mode, simply + turn the game on. For 1-player, turn the game on while holding the 1-key + and use the visitor's side keypad to play offsense. ***************************************************************************/ @@ -3601,9 +3601,9 @@ u8 mwcbaseb_state::input_r() SLOW CURVE FAST SLOW CURVE FAST */ -static INPUT_PORTS_START( mwcbaseb ) +static INPUT_PORTS_START( mwcbaseb ) // P1 = left/visitor, P2 = right/home PORT_START("IN.0") // D9 port R4x - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_Y) PORT_NAME("P2 4") // note: P1 = left/visitor, P2 = right/home + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_Y) PORT_NAME("P2 4") PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_8) PORT_NAME("P2 3") PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_7) PORT_NAME("P2 2") PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_6) PORT_NAME("P2 1") diff --git a/src/mame/drivers/hh_pps41.cpp b/src/mame/drivers/hh_pps41.cpp index 606fe4f83d4..5b0747faca7 100644 --- a/src/mame/drivers/hh_pps41.cpp +++ b/src/mame/drivers/hh_pps41.cpp @@ -13,14 +13,20 @@ #include "cpu/pps41/mm76.h" #include "cpu/pps41/mm78.h" #include "video/pwm.h" +#include "sound/beep.h" #include "sound/spkrdev.h" + +#include "screen.h" #include "speaker.h" // internal artwork #include "ftri1.lh" #include "mastmind.lh" +#include "mwcfootb.lh" #include "memoquiz.lh" +#include "rdqa.lh" #include "scrabsen.lh" +#include "smastmind.lh" //#include "hh_pps41_test.lh" // common test-layout - use external artwork @@ -43,6 +49,8 @@ public: optional_ioport_array<6> m_inputs; // max 6 u16 m_inp_mux = 0; + u32 m_grid = 0; + u32 m_plate = 0; // MCU output pin state u16 m_d = 0; @@ -66,6 +74,8 @@ void hh_pps41_state::machine_start() { // register for savestates save_item(NAME(m_inp_mux)); + save_item(NAME(m_grid)); + save_item(NAME(m_plate)); save_item(NAME(m_d)); save_item(NAME(m_r)); } @@ -168,7 +178,7 @@ static INPUT_PORTS_START( ftri1 ) PORT_START("IN.0") PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_UNUSED ) PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_UNUSED ) - PORT_CONFNAME( 0x0c, 0x04, "Game" ) + PORT_CONFNAME( 0x0c, 0x04, "Game Select" ) PORT_CONFSETTING( 0x08, "Star Chase" ) PORT_CONFSETTING( 0x04, "All Star Baseball" ) PORT_CONFSETTING( 0x00, "Batting Champs" ) @@ -184,7 +194,7 @@ INPUT_PORTS_END void ftri1_state::ftri1(machine_config &config) { /* basic machine hardware */ - MM78(config, m_maincpu, 600000); // approximation + MM78(config, m_maincpu, 300000); // approximation - VC osc. R=68K m_maincpu->write_d().set(FUNC(ftri1_state::write_d)); m_maincpu->write_r().set(FUNC(ftri1_state::write_r)); m_maincpu->read_p().set_ioport("IN.0"); @@ -217,9 +227,13 @@ ROM_END * MM75 MCU (label MM75 A7525-11, die label A7525) * 9-digit 7seg VFD display (Futaba 9-ST) - Invicta is the owner of the Mastermind game rights. The back of the unit - says (C) 1977, but this electronic handheld version came out in 1979. - Or maybe there's an older revision. + Invicta Super-Sonic Electronic Master Mind + * MM75 MCU (label A7539-12, die label A7539) + * same base hardware, added beeper + + Invicta Plastics is the owner of the Mastermind game rights. The back of the + Master Mind unit says (C) 1977, but this electronic handheld version came + out in 1979. Or maybe there's an older revision. ***************************************************************************/ @@ -227,14 +241,19 @@ class mastmind_state : public hh_pps41_state { public: mastmind_state(const machine_config &mconfig, device_type type, const char *tag) : - hh_pps41_state(mconfig, type, tag) + hh_pps41_state(mconfig, type, tag), + m_beeper(*this, "beeper") { } + optional_device m_beeper; + void update_display(); void write_d(u16 data); void write_r(u8 data); u8 read_p(); + void mastmind(machine_config &config); + void smastmind(machine_config &config); }; // handlers @@ -250,6 +269,10 @@ void mastmind_state::write_d(u16 data) // DIO0-DIO3: input mux m_inp_mux = data; update_display(); + + // DIO8: beeper on smastmind + if (m_beeper) + m_beeper->set_state(BIT(data, 8)); } void mastmind_state::write_r(u8 data) @@ -271,7 +294,7 @@ static INPUT_PORTS_START( mastmind ) PORT_START("IN.0") // DIO0 PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_ENTER) PORT_CODE(KEYCODE_ENTER_PAD) PORT_NAME("Try") PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_F) PORT_NAME("Fail") - PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_UNUSED ) // display test? + PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_UNUSED ) // display test on mastmind? PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_UNUSED ) PORT_START("IN.1") // DIO1 @@ -296,7 +319,7 @@ INPUT_PORTS_END void mastmind_state::mastmind(machine_config &config) { /* basic machine hardware */ - MM75(config, m_maincpu, 700000); // approximation + MM75(config, m_maincpu, 360000); // approximation - VC osc. R=56K m_maincpu->write_d().set(FUNC(mastmind_state::write_d)); m_maincpu->write_r().set(FUNC(mastmind_state::write_r)); m_maincpu->read_p().set(FUNC(mastmind_state::read_p)); @@ -309,6 +332,18 @@ void mastmind_state::mastmind(machine_config &config) /* no sound! */ } +void mastmind_state::smastmind(machine_config &config) +{ + mastmind(config); + + config.set_default_layout(layout_smastmind); + + /* sound hardware */ + SPEAKER(config, "mono").front_center(); + BEEP(config, m_beeper, 2400); // approximation + m_beeper->add_route(ALL_OUTPUTS, "mono", 0.25); +} + // roms ROM_START( mastmind ) @@ -320,6 +355,15 @@ ROM_START( mastmind ) ROM_LOAD( "mm76_mastmind_output.pla", 0, 314, CRC(c936aee7) SHA1(e9ec08a82493d6b63e936f82deeab3e4449b54c3) ) ROM_END +ROM_START( smastmind ) + ROM_REGION( 0x0400, "maincpu", ROMREGION_ERASE00 ) + ROM_LOAD( "a7539-12", 0x0000, 0x0200, CRC(b63c453f) SHA1(f47a540fd90eed7514ed03864be2121f641c1154) ) + ROM_CONTINUE( 0x0380, 0x0080 ) + + ROM_REGION( 314, "maincpu:opla", 0 ) + ROM_LOAD( "mm76_smastmind_output.pla", 0, 314, CRC(c936aee7) SHA1(e9ec08a82493d6b63e936f82deeab3e4449b54c3) ) +ROM_END + @@ -434,7 +478,7 @@ INPUT_PORTS_END void memoquiz_state::memoquiz(machine_config &config) { /* basic machine hardware */ - MM75(config, m_maincpu, 700000); // approximation + MM75(config, m_maincpu, 360000); // approximation - VC osc. R=56K m_maincpu->write_d().set(FUNC(memoquiz_state::write_d)); m_maincpu->write_r().set(FUNC(memoquiz_state::write_r)); m_maincpu->read_p().set(FUNC(memoquiz_state::read_p)); @@ -462,6 +506,204 @@ ROM_END +/*************************************************************************** + + Mattel World Championship Football (model 3202) + * MM78L MCU (label MM78 A78C6-12, die label A78C6) + * MM78L MCU (label MM78 A78C7-12, die label A78C7) + * 8-digit 7seg VFD, cyan/red/green VFD Itron CP5023, 1-bit sound + + It was patented under US4422639. Like the Baseball counterpart (mwcbaseb in + hh_hmcs40.cpp), this handheld is a complex game. + +***************************************************************************/ + +class mwcfootb_state : public hh_pps41_state +{ +public: + mwcfootb_state(const machine_config &mconfig, device_type type, const char *tag) : + hh_pps41_state(mconfig, type, tag), + m_subcpu(*this, "subcpu") + { } + + required_device m_subcpu; + + void update_display(); + + void main_write_d(u16 data); + u16 main_read_d(); + void main_write_r(u8 data); + u8 main_read_p(); + + void sub_write_d(u16 data); + void sub_write_r(u8 data); + + void mwcfootb(machine_config &config); +}; + +// handlers + +void mwcfootb_state::update_display() +{ + m_display->matrix(m_grid, bitswap<19>(m_plate, 19,18,17,16, 11,10,9,8,15,14,13,12, 2,3,1,0,6,5,4)); +} + +// maincpu side + +void mwcfootb_state::main_write_d(u16 data) +{ + // DIO0-DIO7: vfd grid + // DIO0-DIO2: input mux + m_grid = m_inp_mux = data; + update_display(); + + // DIO8: subcpu INT0 + m_subcpu->set_input_line(0, (data & 0x100) ? ASSERT_LINE : CLEAR_LINE); +} + +u16 mwcfootb_state::main_read_d() +{ + // DIO9: subcpu DIO9 + return m_subcpu->d_r() & 0x200; +} + +void mwcfootb_state::main_write_r(u8 data) +{ + // RIO1-RIO7: vfd plate 0-6 + m_plate = (m_plate & 0xfff00) | (~data & 0x7f); + update_display(); + + // RIO8: speaker out + m_speaker->level_w(BIT(~data, 7)); +} + +u8 mwcfootb_state::main_read_p() +{ + // PI1-PI8: multiplexed inputs + return read_inputs(3); +} + +// subcpu side + +void mwcfootb_state::sub_write_d(u16 data) +{ + // DIO0-DIO3: vfd plate 15-18 + m_plate = (m_plate & 0x0ffff) | (data << 16 & 0xf0000); + update_display(); + + // DIO9: maincpu INT0 (+DIO9) + m_maincpu->set_input_line(0, (data & 0x200) ? ASSERT_LINE : CLEAR_LINE); +} + +void mwcfootb_state::sub_write_r(u8 data) +{ + // RIO1-RIO8: vfd plate 7-14 + m_plate = (m_plate & 0xf00ff) | (~data << 8 & 0xff00); + update_display(); +} + +// config + +/* physical button layout and labels is like this: + + (home team side) (visitor team side) + [1] RECEIVERS [2] [1] RECEIVERS [2] + + [1] [1] + [4] [PAUSE] [2] [4] [PAUSE] [2] + [3] [3] + DOWN QUARTER + [ENTER] YDS. TO GO TIME LEFT POSITION SCORE [ENTER] + [KICK] [TIME] [ ] [ ] [ ] [ ] [TIME] [KICK] + + [^] [^] + [<] [P/C] [>] [<] [P/C] [>] + [v] [v] +*/ + +static INPUT_PORTS_START( mwcfootb ) // P1 = left/home, P2 = right/visitor + PORT_START("IN.0") // DIO0 + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_START4 ) PORT_NAME("Score") + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_START3 ) PORT_NAME("Position") + PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_BUTTON2 ) PORT_PLAYER(2) PORT_NAME("P2 Kick") + PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_BUTTON1 ) PORT_PLAYER(2) PORT_NAME("P2 P/C/Pause") + PORT_BIT( 0x10, IP_ACTIVE_HIGH, IPT_START2 ) PORT_NAME("Quarter Time Left") + PORT_BIT( 0x20, IP_ACTIVE_HIGH, IPT_START1 ) PORT_NAME("Down / Yards To Go") + PORT_BIT( 0x40, IP_ACTIVE_HIGH, IPT_BUTTON2 ) PORT_PLAYER(1) PORT_NAME("P1 Kick") + PORT_BIT( 0x80, IP_ACTIVE_HIGH, IPT_BUTTON1 ) PORT_PLAYER(1) PORT_NAME("P1 P/C/Pause") + + PORT_START("IN.1") // DIO1 + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_BUTTON6 ) PORT_PLAYER(2) PORT_NAME("P2 Receiver 2") + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_BUTTON3 ) PORT_PLAYER(2) PORT_NAME("P2 Time") + PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_BUTTON4 ) PORT_PLAYER(2) PORT_NAME("P2 Enter") + PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_BUTTON5 ) PORT_PLAYER(2) PORT_NAME("P2 Receiver 1") + PORT_BIT( 0x10, IP_ACTIVE_HIGH, IPT_BUTTON6 ) PORT_PLAYER(1) PORT_NAME("P1 Receiver 2") + PORT_BIT( 0x20, IP_ACTIVE_HIGH, IPT_BUTTON3 ) PORT_PLAYER(1) PORT_NAME("P1 Time") + PORT_BIT( 0x40, IP_ACTIVE_HIGH, IPT_BUTTON4 ) PORT_PLAYER(1) PORT_NAME("P1 Enter") + PORT_BIT( 0x80, IP_ACTIVE_HIGH, IPT_BUTTON5 ) PORT_PLAYER(1) PORT_NAME("P1 Receiver 1") + + PORT_START("IN.2") // DIO2 + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_JOYSTICK_LEFT ) PORT_PLAYER(2) PORT_16WAY PORT_NAME("P2 Left/4") + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_JOYSTICK_RIGHT ) PORT_PLAYER(2) PORT_16WAY PORT_NAME("P2 Right/2") + PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_JOYSTICK_DOWN ) PORT_PLAYER(2) PORT_16WAY PORT_NAME("P2 Down/3") + PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_JOYSTICK_UP ) PORT_PLAYER(2) PORT_16WAY PORT_NAME("P2 Up/1") + PORT_BIT( 0x10, IP_ACTIVE_HIGH, IPT_JOYSTICK_LEFT ) PORT_PLAYER(1) PORT_16WAY PORT_NAME("P1 Left/4") + PORT_BIT( 0x20, IP_ACTIVE_HIGH, IPT_JOYSTICK_RIGHT ) PORT_PLAYER(1) PORT_16WAY PORT_NAME("P1 Right/2") + PORT_BIT( 0x40, IP_ACTIVE_HIGH, IPT_JOYSTICK_DOWN ) PORT_PLAYER(1) PORT_16WAY PORT_NAME("P1 Down/3") + PORT_BIT( 0x80, IP_ACTIVE_HIGH, IPT_JOYSTICK_UP ) PORT_PLAYER(1) PORT_16WAY PORT_NAME("P1 Up/1") +INPUT_PORTS_END + +void mwcfootb_state::mwcfootb(machine_config &config) +{ + /* basic machine hardware */ + MM78L(config, m_maincpu, 360000); // approximation - VC osc. R=56K + m_maincpu->write_d().set(FUNC(mwcfootb_state::main_write_d)); + m_maincpu->read_d().set(FUNC(mwcfootb_state::main_read_d)); + m_maincpu->write_r().set(FUNC(mwcfootb_state::main_write_r)); + m_maincpu->read_p().set(FUNC(mwcfootb_state::main_read_p)); + m_maincpu->read_sdi().set(m_subcpu, FUNC(pps41_base_device::sdo_r)); + m_maincpu->write_ssc().set(m_subcpu, FUNC(pps41_base_device::ssc_w)); + + MM78L(config, m_subcpu, 360000); // osc. from maincpu + m_subcpu->write_d().set(FUNC(mwcfootb_state::sub_write_d)); + m_subcpu->write_r().set(FUNC(mwcfootb_state::sub_write_r)); + m_subcpu->read_sdi().set(m_maincpu, FUNC(pps41_base_device::sdo_r)); + + config.set_perfect_quantum(m_maincpu); + + /* video hardware */ + screen_device &screen(SCREEN(config, "screen", SCREEN_TYPE_SVG)); + screen.set_refresh_hz(60); + screen.set_size(1920, 571); + screen.set_visarea_full(); + + PWM_DISPLAY(config, m_display).set_size(8, 19); + m_display->set_segmask(0x7f, 0x7f); + config.set_default_layout(layout_mwcfootb); + + /* sound hardware */ + SPEAKER(config, "mono").front_center(); + SPEAKER_SOUND(config, m_speaker); + m_speaker->add_route(ALL_OUTPUTS, "mono", 0.25); +} + +// roms + +ROM_START( mwcfootb ) + ROM_REGION( 0x0800, "maincpu", 0 ) + ROM_LOAD( "mm78_a78c6-12", 0x0000, 0x0800, CRC(91cf0d9b) SHA1(8d778b441eb26fcff50e8532c142f368c0dd5818) ) + + ROM_REGION( 0x0800, "subcpu", 0 ) + ROM_LOAD( "mm78_a78c7-12", 0x0000, 0x0800, CRC(b991d06e) SHA1(1f801b5cd7214f7378ae3f19799b84a9dc5bba4e) ) + + ROM_REGION( 248486, "screen", 0) + ROM_LOAD( "mwcfootb.svg", 0, 248486, CRC(03d17b85) SHA1(c877316c0c7923432235655d810fea8d714a4b31) ) +ROM_END + + + + + /*************************************************************************** Selchow & Righter Scrabble Sensor @@ -538,7 +780,6 @@ static INPUT_PORTS_START( scrabsen ) PORT_BIT( 0x10, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_N) PORT_CHAR('N') PORT_BIT( 0x20, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_DEL) PORT_CODE(KEYCODE_BACKSPACE) PORT_CHAR(8) PORT_NAME("Clear") PORT_BIT( 0x40, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_I) PORT_CHAR('I') - PORT_BIT( 0x80, IP_ACTIVE_HIGH, IPT_UNUSED ) PORT_START("IN.1") // DIO1 PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_A) PORT_CHAR('A') @@ -548,17 +789,15 @@ static INPUT_PORTS_START( scrabsen ) PORT_BIT( 0x10, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_O) PORT_CHAR('O') PORT_BIT( 0x20, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_SPACE) PORT_CHAR(' ') PORT_NAME("Space") PORT_BIT( 0x40, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_J) PORT_CHAR('J') - PORT_BIT( 0x80, IP_ACTIVE_HIGH, IPT_UNUSED ) - PORT_START("IN.4") // DIO4 - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_B) PORT_CHAR('B') - PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_F) PORT_CHAR('F') - PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_U) PORT_CHAR('U') - PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_Y) PORT_CHAR('Y') - PORT_BIT( 0x10, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_P) PORT_CHAR('P') - PORT_BIT( 0x20, IP_ACTIVE_HIGH, IPT_UNUSED ) - PORT_BIT( 0x40, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_K) PORT_CHAR('K') - PORT_BIT( 0x80, IP_ACTIVE_HIGH, IPT_UNUSED ) + PORT_START("IN.2") // DIO2 + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_UNUSED ) + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_H) PORT_CHAR('H') + PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_W) PORT_CHAR('W') + PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_UNUSED ) + PORT_BIT( 0x10, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_R) PORT_CHAR('R') + PORT_BIT( 0x20, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_ENTER) PORT_CODE(KEYCODE_ENTER_PAD) PORT_CHAR(13) PORT_NAME("Enter") + PORT_BIT( 0x40, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_M) PORT_CHAR('M') PORT_START("IN.3") // DIO3 PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_C) PORT_CHAR('C') @@ -568,17 +807,15 @@ static INPUT_PORTS_START( scrabsen ) PORT_BIT( 0x10, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_Q) PORT_CHAR('Q') PORT_BIT( 0x20, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_STOP) PORT_CHAR('.') PORT_NAME("Auto.") PORT_BIT( 0x40, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_L) PORT_CHAR('L') - PORT_BIT( 0x80, IP_ACTIVE_HIGH, IPT_UNUSED ) - PORT_START("IN.2") // DIO2 - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_UNUSED ) - PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_H) PORT_CHAR('H') - PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_W) PORT_CHAR('W') - PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_UNUSED ) - PORT_BIT( 0x10, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_R) PORT_CHAR('R') - PORT_BIT( 0x20, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_ENTER) PORT_CODE(KEYCODE_ENTER_PAD) PORT_CHAR(13) PORT_NAME("Enter") - PORT_BIT( 0x40, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_M) PORT_CHAR('M') - PORT_BIT( 0x80, IP_ACTIVE_HIGH, IPT_UNUSED ) + PORT_START("IN.4") // DIO4 + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_B) PORT_CHAR('B') + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_F) PORT_CHAR('F') + PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_U) PORT_CHAR('U') + PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_Y) PORT_CHAR('Y') + PORT_BIT( 0x10, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_P) PORT_CHAR('P') + PORT_BIT( 0x20, IP_ACTIVE_HIGH, IPT_UNUSED ) + PORT_BIT( 0x40, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_K) PORT_CHAR('K') PORT_START("IN.5") // INT0 PORT_CONFNAME( 0x01, 0x01, "Players" ) PORT_CHANGED_MEMBER(DEVICE_SELF, scrabsen_state, players_switch, 0) @@ -589,7 +826,7 @@ INPUT_PORTS_END void scrabsen_state::scrabsen(machine_config &config) { /* basic machine hardware */ - MM76EL(config, m_maincpu, 750000); // approximation + MM76EL(config, m_maincpu, 380000); // approximation - VC osc. R=56K m_maincpu->write_d().set(FUNC(scrabsen_state::write_d)); m_maincpu->write_r().set(FUNC(scrabsen_state::write_r)); m_maincpu->read_p().set(FUNC(scrabsen_state::read_p)); @@ -616,6 +853,143 @@ ROM_END + + +/*************************************************************************** + + Selchow & Righter Reader's Digest Q&A + * MM76EL MCU (label MM76EL B8654-11, die label B8654) + * 9-digit 7seg display(4 unused), 2-bit sound + + The game requires question books. The player inputs a 3-digit code and + answers 20 multiple-choice questions from the page. + +***************************************************************************/ + +class rdqa_state : public hh_pps41_state +{ +public: + rdqa_state(const machine_config &mconfig, device_type type, const char *tag) : + hh_pps41_state(mconfig, type, tag) + { } + + DECLARE_INPUT_CHANGED_MEMBER(players_switch) { update_int(); } + virtual void update_int() override; + + void update_display(); + void write_d(u16 data); + void write_r(u8 data); + u8 read_p(); + void rdqa(machine_config &config); +}; + +// handlers + +void rdqa_state::update_int() +{ + // players switch is tied to MCU INT0 + m_maincpu->set_input_line(0, (m_inputs[4]->read() & 1) ? ASSERT_LINE : CLEAR_LINE); +} + +void rdqa_state::update_display() +{ + m_display->matrix(m_inp_mux, ~m_r); +} + +void rdqa_state::write_d(u16 data) +{ + // DIO0-DIO4: digit select + // DIO0-DIO3: input mux + m_inp_mux = data; + update_display(); + + // DIO8,DIO9: speaker out + m_speaker->level_w(data >> 8 & 3); +} + +void rdqa_state::write_r(u8 data) +{ + // RIO1-RIO7: digit segment data + m_r = data; + update_display(); +} + +u8 rdqa_state::read_p() +{ + // PI1-PI5: multiplexed inputs + return read_inputs(4); +} + +// config + +static INPUT_PORTS_START( rdqa ) + PORT_START("IN.0") // DIO0 + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_1) PORT_NAME("1") + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_2) PORT_NAME("2") + PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_3) PORT_NAME("3") + PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_4) PORT_NAME("4") + PORT_BIT( 0x10, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_5) PORT_NAME("5") + + PORT_START("IN.1") // DIO1 + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_6) PORT_NAME("6") + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_7) PORT_NAME("7") + PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_8) PORT_NAME("8") + PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_9) PORT_NAME("9") + PORT_BIT( 0x10, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_0) PORT_NAME("0") + + PORT_START("IN.2") // DIO2 + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_A) PORT_NAME("A") + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_B) PORT_NAME("B") + PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_C) PORT_NAME("C") + PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_D) PORT_NAME("D") + PORT_BIT( 0x10, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_S) PORT_NAME("Score") + + PORT_START("IN.3") // DIO3 + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_R) PORT_NAME("Right") + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_W) PORT_NAME("Wrong") + PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_X) PORT_NAME("Pass") + PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_DEL) PORT_CODE(KEYCODE_BACKSPACE) PORT_NAME("Clear") + PORT_BIT( 0x10, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_ENTER) PORT_CODE(KEYCODE_ENTER_PAD) PORT_NAME("Enter") + + PORT_START("IN.4") // INT0 + PORT_CONFNAME( 0x01, 0x01, "Players" ) PORT_CHANGED_MEMBER(DEVICE_SELF, rdqa_state, players_switch, 0) + PORT_CONFSETTING( 0x01, "1" ) // single + PORT_CONFSETTING( 0x00, "2" ) // double +INPUT_PORTS_END + +void rdqa_state::rdqa(machine_config &config) +{ + /* basic machine hardware */ + MM76EL(config, m_maincpu, 400000); // approximation - VC osc. R=56K + m_maincpu->write_d().set(FUNC(rdqa_state::write_d)); + m_maincpu->write_r().set(FUNC(rdqa_state::write_r)); + m_maincpu->read_p().set(FUNC(rdqa_state::read_p)); + + /* video hardware */ + PWM_DISPLAY(config, m_display).set_size(5, 7); + m_display->set_segmask(0x1f, 0x7f); + config.set_default_layout(layout_rdqa); + + /* sound hardware */ + SPEAKER(config, "mono").front_center(); + SPEAKER_SOUND(config, m_speaker); + static const double speaker_levels[4] = { 0.0, 1.0, -1.0, 0.0 }; + m_speaker->set_levels(4, speaker_levels); + m_speaker->add_route(ALL_OUTPUTS, "mono", 0.25); +} + +// roms + +ROM_START( rdqa ) + ROM_REGION( 0x0400, "maincpu", 0 ) + ROM_LOAD( "mm76el_b8654-11", 0x0000, 0x0400, CRC(95c00eee) SHA1(1537626df03a7131d83a555e557a4528e093a22a) ) + + ROM_REGION( 314, "maincpu:opla", 0 ) + ROM_LOAD( "mm76_rdqa_output.pla", 0, 314, CRC(e024b2d3) SHA1(fc3121e70f22151cf8f3411f9fcbac88002ae330) ) +ROM_END + + + } // anonymous namespace /*************************************************************************** @@ -624,11 +998,15 @@ ROM_END ***************************************************************************/ -// YEAR NAME PARENT CMP MACHINE INPUT CLASS INIT COMPANY, FULLNAME, FLAGS -CONS( 1979, ftri1, 0, 0, ftri1, ftri1, ftri1_state, empty_init, "Fonas", "Tri-1 (Fonas)", MACHINE_SUPPORTS_SAVE ) +// YEAR NAME PARENT CMP MACHINE INPUT CLASS INIT COMPANY, FULLNAME, FLAGS +CONS( 1979, ftri1, 0, 0, ftri1, ftri1, ftri1_state, empty_init, "Fonas", "Tri-1 (Fonas)", MACHINE_SUPPORTS_SAVE ) + +CONS( 1979, mastmind, 0, 0, mastmind, mastmind, mastmind_state, empty_init, "Invicta", "Electronic Master Mind (Invicta)", MACHINE_SUPPORTS_SAVE | MACHINE_NO_SOUND_HW ) +CONS( 1979, smastmind, 0, 0, smastmind, mastmind, mastmind_state, empty_init, "Invicta", "Super-Sonic Electronic Master Mind", MACHINE_SUPPORTS_SAVE ) -CONS( 1979, mastmind, 0, 0, mastmind, mastmind, mastmind_state, empty_init, "Invicta Plastics", "Electronic Master Mind (Invicta)", MACHINE_SUPPORTS_SAVE | MACHINE_NO_SOUND_HW ) +CONS( 1978, memoquiz, 0, 0, memoquiz, memoquiz, memoquiz_state, empty_init, "M.E.M. Belgium", "Memoquiz", MACHINE_SUPPORTS_SAVE | MACHINE_NO_SOUND_HW ) -CONS( 1978, memoquiz, 0, 0, memoquiz, memoquiz, memoquiz_state, empty_init, "M.E.M. Belgium", "Memoquiz", MACHINE_SUPPORTS_SAVE | MACHINE_NO_SOUND_HW ) +CONS( 1980, mwcfootb, 0, 0, mwcfootb, mwcfootb, mwcfootb_state, empty_init, "Mattel", "World Championship Football", MACHINE_SUPPORTS_SAVE ) -CONS( 1980, scrabsen, 0, 0, scrabsen, scrabsen, scrabsen_state, empty_init, "Selchow & Righter", "Scrabble Sensor - Electronic Word Game", MACHINE_SUPPORTS_SAVE ) +CONS( 1978, scrabsen, 0, 0, scrabsen, scrabsen, scrabsen_state, empty_init, "Selchow & Righter", "Scrabble Sensor - Electronic Word Game", MACHINE_SUPPORTS_SAVE ) +CONS( 1980, rdqa, 0, 0, rdqa, rdqa, rdqa_state, empty_init, "Selchow & Righter", "Reader's Digest Q&A - Computer Question & Answer Game", MACHINE_SUPPORTS_SAVE ) diff --git a/src/mame/drivers/hh_tms1k.cpp b/src/mame/drivers/hh_tms1k.cpp index 34fb6220aae..58934f44cce 100644 --- a/src/mame/drivers/hh_tms1k.cpp +++ b/src/mame/drivers/hh_tms1k.cpp @@ -5000,7 +5000,7 @@ void gpoker_state::gpoker(machine_config &config) /* sound hardware */ SPEAKER(config, "mono").front_center(); - BEEP(config, m_beeper, 2405); // astable multivibrator - C1 and C2 are 0.003uF, R1 and R4 are 1K, R2 and R3 are 100K + BEEP(config, m_beeper, 2400); // astable multivibrator - C1 and C2 are 0.003uF, R1 and R4 are 1K, R2 and R3 are 100K m_beeper->add_route(ALL_OUTPUTS, "mono", 0.25); } diff --git a/src/mame/layout/mwcfootb.lay b/src/mame/layout/mwcfootb.lay new file mode 100644 index 00000000000..12051205f71 --- /dev/null +++ b/src/mame/layout/mwcfootb.lay @@ -0,0 +1,35 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/mame/layout/rdqa.lay b/src/mame/layout/rdqa.lay new file mode 100644 index 00000000000..924bce4fa0f --- /dev/null +++ b/src/mame/layout/rdqa.lay @@ -0,0 +1,22 @@ + + + + + + + + + + + + + + + + + + + + diff --git a/src/mame/layout/smastmind.lay b/src/mame/layout/smastmind.lay new file mode 100644 index 00000000000..cdda6ba4ce9 --- /dev/null +++ b/src/mame/layout/smastmind.lay @@ -0,0 +1,73 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/mame/mame.lst b/src/mame/mame.lst index 4bd8f801f19..d6f59dd192b 100644 --- a/src/mame/mame.lst +++ b/src/mame/mame.lst @@ -16179,7 +16179,10 @@ uspbball // US Games ftri1 // Fonas mastmind // Invicta memoquiz // MEM +mwcfootb // Mattel +rdqa // Selchow & Righter scrabsen // Selchow & Righter +smastmind // Invicta @source:hh_sm510.cpp auslalom // Elektronika -- cgit v1.2.3