summaryrefslogtreecommitdiffstatshomepage
diff options
context:
space:
mode:
author hap <happppp@users.noreply.github.com>2021-03-13 13:57:28 +0100
committer hap <happppp@users.noreply.github.com>2021-03-13 13:58:05 +0100
commite058313217acec61d716e295475d29745ac76c93 (patch)
tree4e281bd40561e432394630a8aa91aeb598ae4094
parent721fbb5cfeb972617feb7bb30031b2075921e047 (diff)
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]
-rw-r--r--src/devices/cpu/pps41/mm75.h3
-rw-r--r--src/devices/cpu/pps41/mm76op.cpp4
-rw-r--r--src/devices/cpu/pps41/pps41base.cpp75
-rw-r--r--src/devices/cpu/pps41/pps41base.h21
-rw-r--r--src/mame/drivers/hh_hmcs40.cpp12
-rw-r--r--src/mame/drivers/hh_pps41.cpp450
-rw-r--r--src/mame/drivers/hh_tms1k.cpp2
-rw-r--r--src/mame/layout/mwcfootb.lay35
-rw-r--r--src/mame/layout/rdqa.lay22
-rw-r--r--src/mame/layout/smastmind.lay73
-rw-r--r--src/mame/mame.lst3
11 files changed, 610 insertions, 90 deletions
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,17 +232,6 @@ 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;
}
@@ -254,27 +239,49 @@ void pps41_base_device::execute_set_input(int line, int state)
//-------------------------------------------------
+// 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<beep_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));
@@ -464,6 +508,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<pps41_base_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
* MM76EL MCU (label B8610-11, die label B8610)
* 16 leds, 1-bit sound
@@ -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 @@
+<?xml version="1.0"?>
+<!--
+license:CC0
+-->
+<mamelayout version="2">
+
+<!-- define elements -->
+
+ <element name="yellow"><rect><color red="0.66" green="0.6" blue="0.0" /></rect></element>
+
+ <element name="digit" defstate="0">
+ <led7seg><color red="0.2" green="1.0" blue="0.85" /></led7seg>
+ </element>
+
+
+<!-- build screen -->
+
+ <view name="Internal Layout">
+ <bounds left="35" right="245" top="-5" bottom="91" />
+
+ <element ref="digit"><bounds x="100" y="0" width="10" height="15" /></element> <!-- N/C -->
+ <element name="digit0" ref="digit"><bounds x="110" y="0" width="10" height="15" /></element>
+ <element name="digit1" ref="digit"><bounds x="120" y="0" width="10" height="15" /></element>
+ <element name="digit2" ref="digit"><bounds x="130" y="0" width="10" height="15" /></element>
+ <element name="digit3" ref="digit"><bounds x="140" y="0" width="10" height="15" /></element>
+ <element name="digit4" ref="digit"><bounds x="150" y="0" width="10" height="15" /></element>
+ <element name="digit5" ref="digit"><bounds x="160" y="0" width="10" height="15" /></element>
+ <element name="digit6" ref="digit"><bounds x="170" y="0" width="10" height="15" /></element>
+
+ <element ref="yellow"><bounds x="35" y="20" width="210" height="1.5" /></element>
+
+ <screen index="0"><bounds x="40" y="26.5" width="200" height="59.5" /></screen>
+ </view>
+
+</mamelayout>
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 @@
+<?xml version="1.0"?>
+<!--
+license:CC0
+-->
+<mamelayout version="2">
+
+ <element name="digit" defstate="0">
+ <led7seg><color red="1.0" green="0.15" blue="0.08" /></led7seg>
+ </element>
+
+ <view name="Internal Layout">
+ <element ref="digit"><bounds x="0" y="0" width="10" height="15" /></element> <!-- N/C -->
+ <element ref="digit"><bounds x="10" y="0" width="10" height="15" /></element> <!-- N/C -->
+ <element name="digit0" ref="digit"><bounds x="20" y="0" width="10" height="15" /></element>
+ <element name="digit1" ref="digit"><bounds x="30" y="0" width="10" height="15" /></element>
+ <element name="digit2" ref="digit"><bounds x="40" y="0" width="10" height="15" /></element>
+ <element name="digit3" ref="digit"><bounds x="50" y="0" width="10" height="15" /></element>
+ <element name="digit4" ref="digit"><bounds x="60" y="0" width="10" height="15" /></element>
+ <element ref="digit"><bounds x="70" y="0" width="10" height="15" /></element> <!-- N/C -->
+ <element ref="digit"><bounds x="80" y="0" width="10" height="15" /></element> <!-- N/C -->
+ </view>
+</mamelayout>
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 @@
+<?xml version="1.0"?>
+<!--
+license:CC0
+-->
+<mamelayout version="2">
+
+<!-- define elements -->
+
+ <element name="mul"><rect><color red="0.5" green="0.4" blue="0.05" /></rect></element>
+
+ <element name="text_l1"><text string="MIN"><color red="1" green="1" blue="1" /></text></element>
+ <element name="text_l2"><text string="SEC"><color red="1" green="1" blue="1" /></text></element>
+ <element name="text_l3"><text string="TRY"><color red="1" green="1" blue="1" /></text></element>
+
+ <element name="text_1"><text string="1"><color red="1" green="1" blue="1" /></text></element>
+ <element name="text_2"><text string="2"><color red="1" green="1" blue="1" /></text></element>
+ <element name="text_3"><text string="3"><color red="1" green="1" blue="1" /></text></element>
+ <element name="text_4"><text string="4"><color red="1" green="1" blue="1" /></text></element>
+ <element name="text_5"><text string="5"><color red="1" green="1" blue="1" /></text></element>
+ <element name="text_6"><text string="6"><color red="1" green="1" blue="1" /></text></element>
+ <element name="text_x"><text string="X"><color red="1" green="1" blue="1" /></text></element>
+
+ <element name="text_v">
+ <text string="V">
+ <bounds x="0" y="0" width="1" height="1" />
+ <color red="1" green="1" blue="1" />
+ </text>
+ <disk>
+ <bounds x="0" y="0" width="0.5" height="0.5" />
+ <color red="0" green="0" blue="0" />
+ </disk>
+ </element>
+
+ <element name="digit" defstate="0">
+ <led7seg><color red="0.2" green="1.0" blue="0.85" /></led7seg>
+ </element>
+
+
+<!-- build screen -->
+
+ <view name="Internal Layout">
+
+ <!-- labels -->
+ <collection name="Labels">
+ <element ref="text_1"><bounds x="10" y="0" width="10" height="10" /></element>
+ <element ref="text_2"><bounds x="20" y="0" width="10" height="10" /></element>
+ <element ref="text_3"><bounds x="30" y="0" width="10" height="10" /></element>
+ <element ref="text_4"><bounds x="40" y="0" width="10" height="10" /></element>
+ <element ref="text_5"><bounds x="50" y="0" width="10" height="10" /></element>
+ <element ref="text_6"><bounds x="60" y="0" width="10" height="10" /></element>
+ <element ref="text_v"><bounds x="80" y="0" width="10" height="10" /></element>
+ <element ref="text_x"><bounds x="90" y="0" width="10" height="10" /></element>
+
+ <element ref="text_l1"><bounds x="10" y="26" width="20" height="5" /></element>
+ <element ref="text_l2"><bounds x="40" y="26" width="20" height="5" /></element>
+ <element ref="text_l3"><bounds x="80" y="26" width="20" height="5" /></element>
+
+ <element ref="mul" blend="multiply"><bounds x="8" y="0" width="94" height="32" /></element>
+ </collection>
+
+ <!-- display -->
+ <element name="digit0" ref="digit"><bounds x="10" y="10" width="10" height="15" /></element>
+ <element name="digit1" ref="digit"><bounds x="20" y="10" width="10" height="15" /></element>
+ <element name="digit2" ref="digit"><bounds x="30" y="10" width="10" height="15" /></element>
+ <element name="digit3" ref="digit"><bounds x="40" y="10" width="10" height="15" /></element>
+ <element name="digit4" ref="digit"><bounds x="50" y="10" width="10" height="15" /></element>
+ <element name="digit5" ref="digit"><bounds x="60" y="10" width="10" height="15" /></element>
+ <element ref="digit"><bounds x="70" y="10" width="10" height="15" /></element> <!-- N/C -->
+ <element name="digit6" ref="digit"><bounds x="80" y="10" width="10" height="15" /></element>
+ <element name="digit7" ref="digit"><bounds x="90" y="10" width="10" height="15" /></element>
+
+ </view>
+</mamelayout>
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