From 37c641912131926e9e50b1461c368bfaa576e256 Mon Sep 17 00:00:00 2001 From: hap Date: Sat, 24 Jun 2017 19:38:32 +0200 Subject: New NOT_WORKING machine added ------------ Game & Watch: Mickey Mouse [hap, Igor] --- src/devices/cpu/sm510/sm500.h | 1 + src/devices/cpu/sm510/sm500core.cpp | 23 ++++++++ src/devices/cpu/sm510/sm510core.cpp | 2 +- src/mame/drivers/hh_sm510.cpp | 111 +++++++++++++++++++++++++++++++----- src/mame/mame.lst | 1 + 5 files changed, 122 insertions(+), 16 deletions(-) diff --git a/src/devices/cpu/sm510/sm500.h b/src/devices/cpu/sm510/sm500.h index a02d27ef13c..ce7f57a5586 100644 --- a/src/devices/cpu/sm510/sm500.h +++ b/src/devices/cpu/sm510/sm500.h @@ -83,6 +83,7 @@ protected: virtual offs_t disasm_disassemble(std::ostream &stream, offs_t pc, const u8 *oprom, const u8 *opram, u32 options) override; virtual void execute_one() override; virtual void get_opcode_param() override; + virtual void clock_melody() override; virtual void reset_vector() override { do_branch(0, 0xf, 0); } virtual void wakeup_vector() override { do_branch(0, 0, 0); } diff --git a/src/devices/cpu/sm510/sm500core.cpp b/src/devices/cpu/sm510/sm500core.cpp index 54c2143b3d7..11cc9759115 100644 --- a/src/devices/cpu/sm510/sm500core.cpp +++ b/src/devices/cpu/sm510/sm500core.cpp @@ -6,6 +6,8 @@ TODO: - EXKSA, EXKFA opcodes + - SM500 data book suggests that R1 divider output is selectable, but how? + - ACL doesn't work right? */ @@ -85,8 +87,10 @@ void sm500_device::device_reset() // SM500 specific op_idiv(); + m_1s = true; m_cb = 0; m_rsub = false; + m_r = 0xf; } @@ -99,6 +103,25 @@ offs_t sm500_device::disasm_disassemble(std::ostream &stream, offs_t pc, const u } +//------------------------------------------------- +// buzzer controller +//------------------------------------------------- + +void sm500_device::clock_melody() +{ + // R1 buzzer from divider, R2-R4 generic outputs + u8 out = m_div >> 2 & 1; + out = (out & ~m_r) | (~m_r & 0xe); + + // output to R pins + if (out != m_r_out) + { + m_write_r(0, out, 0xff); + m_r_out = out; + } +} + + //------------------------------------------------- // execute diff --git a/src/devices/cpu/sm510/sm510core.cpp b/src/devices/cpu/sm510/sm510core.cpp index e9bb5c5b089..3abc2ee1e9b 100644 --- a/src/devices/cpu/sm510/sm510core.cpp +++ b/src/devices/cpu/sm510/sm510core.cpp @@ -60,7 +60,7 @@ void sm510_device::clock_melody() out |= (out << 1 ^ 2); out &= m_r; - // output to R pin + // output to R pins if (out != m_r_out) { m_write_r(0, out, 0xff); diff --git a/src/mame/drivers/hh_sm510.cpp b/src/mame/drivers/hh_sm510.cpp index b8293c12d0e..f8eb1ee8558 100644 --- a/src/mame/drivers/hh_sm510.cpp +++ b/src/mame/drivers/hh_sm510.cpp @@ -5,6 +5,8 @@ Sharp SM510/SM511 handhelds. TODO: + - gnw_mc25 emulation is preliminary + - confirm gnw_mc25 romdump - improve svg layout for gnw_jr55, gnw_mw56 - svg lcd screen background/foreground (not supported in core), or should it be for external artwork only? @@ -16,10 +18,9 @@ ***************************************************************************/ #include "emu.h" - #include "cpu/sm510/sm510.h" +#include "cpu/sm510/sm500.h" #include "sound/spkrdev.h" - #include "rendlay.h" #include "screen.h" #include "speaker.h" @@ -56,11 +57,12 @@ public: virtual void update_k_line(); virtual DECLARE_INPUT_CHANGED_MEMBER(input_changed); virtual DECLARE_INPUT_CHANGED_MEMBER(acl_button); + virtual DECLARE_WRITE16_MEMBER(sm510_lcd_segment_w); virtual DECLARE_READ8_MEMBER(input_r); virtual DECLARE_WRITE8_MEMBER(input_w); virtual DECLARE_WRITE8_MEMBER(piezo_r1_w); virtual DECLARE_WRITE8_MEMBER(piezo_r2_w); - virtual DECLARE_WRITE16_MEMBER(lcd_segment_w); + virtual DECLARE_WRITE8_MEMBER(piezo_input_w); protected: virtual void machine_start() override; @@ -97,7 +99,7 @@ void hh_sm510_state::machine_reset() // lcd panel - on lcd handhelds, usually not a generic x/y screen device -WRITE16_MEMBER(hh_sm510_state::lcd_segment_w) +WRITE16_MEMBER(hh_sm510_state::sm510_lcd_segment_w) { for (int seg = 0; seg < 0x10; seg++) { @@ -177,6 +179,13 @@ WRITE8_MEMBER(hh_sm510_state::piezo_r2_w) m_speaker->level_w(data >> 1 & 1); } +WRITE8_MEMBER(hh_sm510_state::piezo_input_w) +{ + // R1 to piezo, other to input mux + piezo_r1_w(space, 0, data & 1); + input_w(space, 0, data >> 1); +} + @@ -232,7 +241,7 @@ static MACHINE_CONFIG_START( ktopgun ) /* basic machine hardware */ MCFG_CPU_ADD("maincpu", SM510, XTAL_32_768kHz) - MCFG_SM510_WRITE_SEGS_CB(WRITE16(hh_sm510_state, lcd_segment_w)) + MCFG_SM510_WRITE_SEGS_CB(WRITE16(hh_sm510_state, sm510_lcd_segment_w)) MCFG_SM510_READ_K_CB(READ8(hh_sm510_state, input_r)) MCFG_SM510_WRITE_S_CB(WRITE8(hh_sm510_state, input_w)) MCFG_SM510_WRITE_R_CB(WRITE8(hh_sm510_state, piezo_r1_w)) @@ -301,7 +310,7 @@ static MACHINE_CONFIG_START( kcontra ) /* basic machine hardware */ MCFG_CPU_ADD("maincpu", SM511, XTAL_32_768kHz) - MCFG_SM510_WRITE_SEGS_CB(WRITE16(hh_sm510_state, lcd_segment_w)) + MCFG_SM510_WRITE_SEGS_CB(WRITE16(hh_sm510_state, sm510_lcd_segment_w)) MCFG_SM510_READ_K_CB(READ8(hh_sm510_state, input_r)) MCFG_SM510_WRITE_S_CB(WRITE8(hh_sm510_state, input_w)) MCFG_SM510_WRITE_R_CB(WRITE8(hh_sm510_state, piezo_r1_w)) @@ -369,7 +378,7 @@ static MACHINE_CONFIG_START( ktmnt ) /* basic machine hardware */ MCFG_CPU_ADD("maincpu", SM511, XTAL_32_768kHz) - MCFG_SM510_WRITE_SEGS_CB(WRITE16(hh_sm510_state, lcd_segment_w)) + MCFG_SM510_WRITE_SEGS_CB(WRITE16(hh_sm510_state, sm510_lcd_segment_w)) MCFG_SM510_READ_K_CB(READ8(hh_sm510_state, input_r)) MCFG_SM510_WRITE_S_CB(WRITE8(hh_sm510_state, input_w)) MCFG_SM510_WRITE_R_CB(WRITE8(hh_sm510_state, piezo_r1_w)) @@ -434,7 +443,7 @@ static MACHINE_CONFIG_START( kgradius ) /* basic machine hardware */ MCFG_CPU_ADD("maincpu", SM511, XTAL_32_768kHz) - MCFG_SM510_WRITE_SEGS_CB(WRITE16(hh_sm510_state, lcd_segment_w)) + MCFG_SM510_WRITE_SEGS_CB(WRITE16(hh_sm510_state, sm510_lcd_segment_w)) MCFG_SM510_READ_K_CB(READ8(hh_sm510_state, input_r)) MCFG_SM510_WRITE_S_CB(WRITE8(hh_sm510_state, input_w)) MCFG_SM510_WRITE_R_CB(WRITE8(hh_sm510_state, piezo_r1_w)) @@ -497,7 +506,7 @@ static MACHINE_CONFIG_START( kloneran ) /* basic machine hardware */ MCFG_CPU_ADD("maincpu", SM511, XTAL_32_768kHz) - MCFG_SM510_WRITE_SEGS_CB(WRITE16(hh_sm510_state, lcd_segment_w)) + MCFG_SM510_WRITE_SEGS_CB(WRITE16(hh_sm510_state, sm510_lcd_segment_w)) MCFG_SM510_READ_K_CB(READ8(hh_sm510_state, input_r)) MCFG_SM510_WRITE_S_CB(WRITE8(hh_sm510_state, input_w)) MCFG_SM510_WRITE_R_CB(WRITE8(hh_sm510_state, piezo_r1_w)) @@ -519,6 +528,68 @@ MACHINE_CONFIG_END +/*************************************************************************** + + Nintendo Game & Watch: Mickey Mouse (model MC-25) + * Sharp SM5A label ? + +***************************************************************************/ + +class mc25_state : public hh_sm510_state +{ +public: + mc25_state(const machine_config &mconfig, device_type type, const char *tag) + : hh_sm510_state(mconfig, type, tag) + { + m_inp_lines = 3; + } +}; + +// config + +static INPUT_PORTS_START( mc25 ) + PORT_START("IN.0") + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_1) PORT_CHANGED_MEMBER(DEVICE_SELF, hh_sm510_state, input_changed, nullptr) + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_2) PORT_CHANGED_MEMBER(DEVICE_SELF, hh_sm510_state, input_changed, nullptr) + PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_3) PORT_CHANGED_MEMBER(DEVICE_SELF, hh_sm510_state, input_changed, nullptr) + PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_4) PORT_CHANGED_MEMBER(DEVICE_SELF, hh_sm510_state, input_changed, nullptr) + + PORT_START("IN.1") + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_Q) PORT_CHANGED_MEMBER(DEVICE_SELF, hh_sm510_state, input_changed, nullptr) + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_W) PORT_CHANGED_MEMBER(DEVICE_SELF, hh_sm510_state, input_changed, nullptr) + PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_E) PORT_CHANGED_MEMBER(DEVICE_SELF, hh_sm510_state, input_changed, nullptr) + PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_R) PORT_CHANGED_MEMBER(DEVICE_SELF, hh_sm510_state, input_changed, nullptr) + + PORT_START("IN.2") + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_A) PORT_CHANGED_MEMBER(DEVICE_SELF, hh_sm510_state, input_changed, nullptr) + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_S) PORT_CHANGED_MEMBER(DEVICE_SELF, hh_sm510_state, input_changed, nullptr) // game b + PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_D) PORT_CHANGED_MEMBER(DEVICE_SELF, hh_sm510_state, input_changed, nullptr) // game a + PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_F) PORT_CHANGED_MEMBER(DEVICE_SELF, hh_sm510_state, input_changed, nullptr) + + PORT_START("ACL") + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_SERVICE1 ) PORT_CHANGED_MEMBER(DEVICE_SELF, hh_sm510_state, acl_button, nullptr) PORT_NAME("ACL") +INPUT_PORTS_END + +static MACHINE_CONFIG_START( mc25 ) + + /* basic machine hardware */ + MCFG_CPU_ADD("maincpu", SM5A, XTAL_32_768kHz) + MCFG_SM510_READ_K_CB(READ8(hh_sm510_state, input_r)) + MCFG_SM510_WRITE_R_CB(WRITE8(hh_sm510_state, piezo_input_w)) + + /* video hardware */ + // .. + + /* sound hardware */ + MCFG_SPEAKER_STANDARD_MONO("mono") + MCFG_SOUND_ADD("speaker", SPEAKER_SOUND, 0) + MCFG_SOUND_ROUTE(ALL_OUTPUTS, "mono", 0.25) +MACHINE_CONFIG_END + + + + + /*************************************************************************** Nintendo Game & Watch: Mickey & Donald (model DM-53) @@ -560,7 +631,7 @@ static MACHINE_CONFIG_START( dm53 ) /* basic machine hardware */ MCFG_CPU_ADD("maincpu", SM510, XTAL_32_768kHz) - MCFG_SM510_WRITE_SEGS_CB(WRITE16(hh_sm510_state, lcd_segment_w)) + MCFG_SM510_WRITE_SEGS_CB(WRITE16(hh_sm510_state, sm510_lcd_segment_w)) MCFG_SM510_READ_K_CB(READ8(hh_sm510_state, input_r)) MCFG_SM510_WRITE_S_CB(WRITE8(hh_sm510_state, input_w)) MCFG_SM510_WRITE_R_CB(WRITE8(hh_sm510_state, piezo_r2_w)) @@ -633,7 +704,7 @@ static MACHINE_CONFIG_START( jr55 ) /* basic machine hardware */ MCFG_CPU_ADD("maincpu", SM510, XTAL_32_768kHz) - MCFG_SM510_WRITE_SEGS_CB(WRITE16(hh_sm510_state, lcd_segment_w)) + MCFG_SM510_WRITE_SEGS_CB(WRITE16(hh_sm510_state, sm510_lcd_segment_w)) MCFG_SM510_READ_K_CB(READ8(hh_sm510_state, input_r)) MCFG_SM510_WRITE_S_CB(WRITE8(hh_sm510_state, input_w)) MCFG_SM510_WRITE_R_CB(WRITE8(hh_sm510_state, piezo_r1_w)) @@ -702,7 +773,7 @@ static MACHINE_CONFIG_START( mw56 ) /* basic machine hardware */ MCFG_CPU_ADD("maincpu", SM510, XTAL_32_768kHz) - MCFG_SM510_WRITE_SEGS_CB(WRITE16(hh_sm510_state, lcd_segment_w)) + MCFG_SM510_WRITE_SEGS_CB(WRITE16(hh_sm510_state, sm510_lcd_segment_w)) MCFG_SM510_READ_K_CB(READ8(hh_sm510_state, input_r)) MCFG_SM510_WRITE_S_CB(WRITE8(hh_sm510_state, input_w)) MCFG_SM510_WRITE_R_CB(WRITE8(hh_sm510_state, piezo_r1_w)) @@ -777,7 +848,7 @@ static MACHINE_CONFIG_START( dj101 ) /* basic machine hardware */ MCFG_CPU_ADD("maincpu", SM510, XTAL_32_768kHz) - MCFG_SM510_WRITE_SEGS_CB(WRITE16(hh_sm510_state, lcd_segment_w)) + MCFG_SM510_WRITE_SEGS_CB(WRITE16(hh_sm510_state, sm510_lcd_segment_w)) MCFG_SM510_READ_K_CB(READ8(hh_sm510_state, input_r)) MCFG_SM510_WRITE_S_CB(WRITE8(hh_sm510_state, input_w)) MCFG_SM510_WRITE_R_CB(WRITE8(hh_sm510_state, piezo_r1_w)) @@ -841,7 +912,7 @@ static MACHINE_CONFIG_START( ml102 ) /* basic machine hardware */ MCFG_CPU_ADD("maincpu", SM510, XTAL_32_768kHz) - MCFG_SM510_WRITE_SEGS_CB(WRITE16(hh_sm510_state, lcd_segment_w)) + MCFG_SM510_WRITE_SEGS_CB(WRITE16(hh_sm510_state, sm510_lcd_segment_w)) MCFG_SM510_READ_K_CB(READ8(hh_sm510_state, input_r)) MCFG_SM510_WRITE_S_CB(WRITE8(hh_sm510_state, input_w)) MCFG_SM510_WRITE_R_CB(WRITE8(hh_sm510_state, piezo_r1_w)) @@ -927,7 +998,7 @@ static MACHINE_CONFIG_START( bx301 ) /* basic machine hardware */ MCFG_CPU_ADD("maincpu", SM511, XTAL_32_768kHz) - MCFG_SM510_WRITE_SEGS_CB(WRITE16(hh_sm510_state, lcd_segment_w)) + MCFG_SM510_WRITE_SEGS_CB(WRITE16(hh_sm510_state, sm510_lcd_segment_w)) MCFG_SM510_READ_K_CB(READ8(hh_sm510_state, input_r)) MCFG_SM510_WRITE_S_CB(WRITE8(hh_sm510_state, input_w)) MCFG_SM510_WRITE_R_CB(WRITE8(hh_sm510_state, piezo_r1_w)) @@ -1012,6 +1083,15 @@ ROM_START( kloneran ) ROM_END +ROM_START( gnw_mc25 ) + ROM_REGION( 0x1000, "maincpu", 0 ) + ROM_LOAD( "mc-25", 0x0000, 0x0740, BAD_DUMP CRC(cb820c32) SHA1(7e94fc255f32db725d5aa9e196088e490c1a1443) ) // dumped from Soviet clone + + ROM_REGION( 100000, "svg", 0) + ROM_LOAD( "gnw_mc25.svg", 0, 100000, NO_DUMP ) +ROM_END + + ROM_START( gnw_dm53 ) ROM_REGION( 0x1000, "maincpu", 0 ) ROM_LOAD( "dm-53_cms54c_cms565", 0x0000, 0x1000, CRC(e21fc0f5) SHA1(3b65ccf9f98813319410414e11a3231b787cdee6) ) @@ -1086,6 +1166,7 @@ CONS( 1989, ktmnt, 0, 0, ktmnt, ktmnt, ktmnt_state, 0, "Kona CONS( 1989, kgradius, 0, 0, kgradius, kgradius, kgradius_state, 0, "Konami", "Gradius (handheld)", MACHINE_SUPPORTS_SAVE ) CONS( 1989, kloneran, 0, 0, kloneran, kloneran, kloneran_state, 0, "Konami", "Lone Ranger (handheld)", MACHINE_SUPPORTS_SAVE ) +CONS( 1981, gnw_mc25, 0, 0, mc25, mc25, mc25_state, 0, "Nintendo", "Game & Watch: Mickey Mouse", MACHINE_SUPPORTS_SAVE | MACHINE_NOT_WORKING ) CONS( 1982, gnw_dm53, 0, 0, dm53, dm53, dm53_state, 0, "Nintendo", "Game & Watch: Mickey & Donald", MACHINE_SUPPORTS_SAVE ) CONS( 1983, gnw_jr55, 0, 0, jr55, jr55, jr55_state, 0, "Nintendo", "Game & Watch: Donkey Kong II", MACHINE_SUPPORTS_SAVE ) CONS( 1983, gnw_mw56, 0, 0, mw56, mw56, mw56_state, 0, "Nintendo", "Game & Watch: Mario Bros.", MACHINE_SUPPORTS_SAVE ) diff --git a/src/mame/mame.lst b/src/mame/mame.lst index e4131e973e1..edb17488af6 100644 --- a/src/mame/mame.lst +++ b/src/mame/mame.lst @@ -14531,6 +14531,7 @@ gnw_bx301 // Nintendo gnw_dj101 // Nintendo gnw_dm53 // Nintendo gnw_jr55 // Nintendo +gnw_mc25 // Nintendo gnw_ml102 // Nintendo gnw_mw56 // Nintendo kcontra // Konami -- cgit v1.2.3