From 80b5354f82429f1122ccb4fb457f21cbfd377e69 Mon Sep 17 00:00:00 2001 From: hap Date: Sat, 6 Mar 2021 19:20:16 +0100 Subject: [PATCH] Machines promoted to working ---------------------------- Electronic Master Mind (Invicta) [hap, Sean Riddle] --- src/mame/drivers/hh_pps41.cpp | 78 ++++++++++++++++++++++++++++++----- 1 file changed, 67 insertions(+), 11 deletions(-) diff --git a/src/mame/drivers/hh_pps41.cpp b/src/mame/drivers/hh_pps41.cpp index 6a5f9d0ba65..85ff6ccaf5f 100644 --- a/src/mame/drivers/hh_pps41.cpp +++ b/src/mame/drivers/hh_pps41.cpp @@ -5,15 +5,11 @@ Rockwell PPS-4/1 MCU series handhelds - TODO: - - WIP - ***************************************************************************/ #include "emu.h" #include "cpu/pps41/mm75.h" -#include "cpu/pps41/mm76.h" #include "video/pwm.h" #include "sound/spkrdev.h" #include "speaker.h" @@ -39,12 +35,13 @@ public: required_device m_maincpu; optional_device m_display; optional_device m_speaker; - optional_ioport_array<8> m_inputs; // max 8 + optional_ioport_array<4> m_inputs; // max 4 u16 m_inp_mux = 0; // MCU output pin state - //.. + u16 m_d = 0; + u8 m_r = ~0; u8 read_inputs(int columns); @@ -60,6 +57,8 @@ void hh_pps41_state::machine_start() { // register for savestates save_item(NAME(m_inp_mux)); + save_item(NAME(m_d)); + save_item(NAME(m_r)); } void hh_pps41_state::machine_reset() @@ -101,7 +100,8 @@ namespace { /*************************************************************************** Invicta Electronic Master Mind - * x + * 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. @@ -115,24 +115,80 @@ public: hh_pps41_state(mconfig, type, tag) { } + void update_display(); + void write_d(u16 data); + void write_r(u8 data); + u8 read_p(); void mastmind(machine_config &config); }; // handlers +void mastmind_state::update_display() +{ + m_display->matrix(m_inp_mux, ~m_r); +} + +void mastmind_state::write_d(u16 data) +{ + // DIO0-DIO7: digit select (DIO7 N/C on mastmind) + // DIO0-DIO3: input mux + m_inp_mux = data; + update_display(); +} + +void mastmind_state::write_r(u8 data) +{ + // RIO1-RIO7: digit segment data + m_r = data; + update_display(); +} + +u8 mastmind_state::read_p() +{ + // PI1-PI4: multiplexed inputs + return ~read_inputs(4); +} + // config static INPUT_PORTS_START( mastmind ) + PORT_START("IN.0") // DIO0 + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_T) 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( 0x08, IP_ACTIVE_HIGH, IPT_UNUSED ) + + PORT_START("IN.1") // DIO1 + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_8) PORT_CODE(KEYCODE_8_PAD) PORT_NAME("8") + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_9) PORT_CODE(KEYCODE_9_PAD) PORT_NAME("9") + PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_S) PORT_NAME("Set") + PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_C) PORT_CODE(KEYCODE_DEL) PORT_CODE(KEYCODE_BACKSPACE) PORT_NAME("Clear") + + PORT_START("IN.2") // DIO2 + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_4) PORT_CODE(KEYCODE_4_PAD) PORT_NAME("4") + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_5) PORT_CODE(KEYCODE_5_PAD) PORT_NAME("5") + PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_6) PORT_CODE(KEYCODE_6_PAD) PORT_NAME("6") + PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_7) PORT_CODE(KEYCODE_7_PAD) PORT_NAME("7") + + PORT_START("IN.3") // DIO3 + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_0) PORT_CODE(KEYCODE_0_PAD) PORT_NAME("0") + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_1) PORT_CODE(KEYCODE_1_PAD) PORT_NAME("1") + PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_2) PORT_CODE(KEYCODE_2_PAD) PORT_NAME("2") + PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_3) PORT_CODE(KEYCODE_3_PAD) PORT_NAME("3") INPUT_PORTS_END void mastmind_state::mastmind(machine_config &config) { /* basic machine hardware */ MM75(config, m_maincpu, 100000); // approximation + 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)); /* video hardware */ - PWM_DISPLAY(config, m_display).set_size(4, 8); - m_display->set_segmask(3, 0xff); + PWM_DISPLAY(config, m_display).set_size(7, 7); + m_display->set_segmask(0x7f, 0x7f); config.set_default_layout(layout_mastmind); /* no sound! */ @@ -146,7 +202,7 @@ ROM_START( mastmind ) ROM_CONTINUE( 0x0380, 0x0080 ) ROM_REGION( 314, "maincpu:opla", 0 ) - ROM_LOAD( "mm76_mastmind_output.pla", 0, 314, CRC(84a3a6f2) SHA1(a3baf9a174a02d186769a1a2d81982e6dbdcf1ed) ) + ROM_LOAD( "mm76_mastmind_output.pla", 0, 314, CRC(c936aee7) SHA1(e9ec08a82493d6b63e936f82deeab3e4449b54c3) ) ROM_END @@ -160,4 +216,4 @@ ROM_END ***************************************************************************/ // YEAR NAME PARENT CMP MACHINE INPUT CLASS INIT COMPANY, FULLNAME, FLAGS -CONS( 1979, mastmind, 0, 0, mastmind, mastmind, mastmind_state, empty_init, "Invicta Plastics", "Electronic Master Mind (Invicta)", MACHINE_SUPPORTS_SAVE | MACHINE_NO_SOUND_HW | MACHINE_NOT_WORKING ) +CONS( 1979, mastmind, 0, 0, mastmind, mastmind, mastmind_state, empty_init, "Invicta Plastics", "Electronic Master Mind (Invicta)", MACHINE_SUPPORTS_SAVE | MACHINE_NO_SOUND_HW )