mirror of
https://github.com/holub/mame
synced 2025-04-22 08:22:15 +03:00
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:
parent
721fbb5cfe
commit
e058313217
@ -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;
|
||||
|
@ -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()
|
||||
|
@ -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()
|
||||
|
@ -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();
|
||||
};
|
||||
|
@ -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")
|
||||
|
@ -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 )
|
||||
|
@ -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);
|
||||
}
|
||||
|
||||
|
35
src/mame/layout/mwcfootb.lay
Normal file
35
src/mame/layout/mwcfootb.lay
Normal 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
22
src/mame/layout/rdqa.lay
Normal 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>
|
73
src/mame/layout/smastmind.lay
Normal file
73
src/mame/layout/smastmind.lay
Normal 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>
|
@ -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
|
||||
|
Loading…
Reference in New Issue
Block a user