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]
This commit is contained in:
hap 2021-03-13 13:57:28 +01:00
parent 721fbb5cfe
commit e058313217
11 changed files with 612 additions and 92 deletions

View File

@ -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;

View File

@ -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()

View File

@ -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()

View File

@ -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();
};

View File

@ -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")

View File

@ -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));
@ -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<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
@ -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,27 +789,6 @@ 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.3") // DIO3
PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_C) PORT_CHAR('C')
PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_G) PORT_CHAR('G')
PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_V) PORT_CHAR('V')
PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_Z) PORT_CHAR('Z')
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 )
@ -578,7 +798,24 @@ static INPUT_PORTS_START( scrabsen )
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.3") // DIO3
PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_C) PORT_CHAR('C')
PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_G) PORT_CHAR('G')
PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_V) PORT_CHAR('V')
PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_Z) PORT_CHAR('Z')
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_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 Plastics", "Electronic Master Mind (Invicta)", MACHINE_SUPPORTS_SAVE | MACHINE_NO_SOUND_HW )
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( 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, scrabsen, 0, 0, scrabsen, scrabsen, scrabsen_state, empty_init, "Selchow & Righter", "Scrabble Sensor - Electronic Word Game", MACHINE_SUPPORTS_SAVE )
CONS( 1980, mwcfootb, 0, 0, mwcfootb, mwcfootb, mwcfootb_state, empty_init, "Mattel", "World Championship Football", 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 )

View File

@ -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);
}

View File

@ -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>

22
src/mame/layout/rdqa.lay Normal file
View File

@ -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>

View File

@ -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>

View File

@ -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