From 74a8d9b04ad4b3a83b69d9e6576e90789daf4350 Mon Sep 17 00:00:00 2001 From: hap Date: Fri, 10 Jul 2015 00:18:27 +0200 Subject: [PATCH] added lcd output to driver side --- src/emu/cpu/sm510/sm510.h | 6 +- src/mess/drivers/hh_sm510.c | 46 +++++- src/mess/layout/hh_sm510_test.lay | 233 ++++++++++++++++++++++++++++++ 3 files changed, 275 insertions(+), 10 deletions(-) create mode 100644 src/mess/layout/hh_sm510_test.lay diff --git a/src/emu/cpu/sm510/sm510.h b/src/emu/cpu/sm510/sm510.h index 1428e22d823..95037fe91ff 100644 --- a/src/emu/cpu/sm510/sm510.h +++ b/src/emu/cpu/sm510/sm510.h @@ -47,9 +47,9 @@ enum { - SM510_PORT_SEGA = 0x10, - SM510_PORT_SEGB = 0x20, - SM510_PORT_SEGC = 0x30 + SM510_PORT_SEGA = 0, + SM510_PORT_SEGB = 4, + SM510_PORT_SEGC = 8 }; diff --git a/src/mess/drivers/hh_sm510.c b/src/mess/drivers/hh_sm510.c index 7b8bf156d6d..0f4bc9b7ef0 100644 --- a/src/mess/drivers/hh_sm510.c +++ b/src/mess/drivers/hh_sm510.c @@ -13,8 +13,7 @@ #include "cpu/sm510/sm510.h" #include "sound/speaker.h" -// internal artwork -//.. +#include "hh_sm510_test.lh" // common test-layout - use external artwork class hh_sm510_state : public driver_device @@ -36,6 +35,7 @@ public: // misc common UINT16 m_inp_mux; // multiplexed inputs mask int m_inp_lines; // number of input mux columns + UINT8 m_lcd_output_cache[3*4*0x10]; UINT8 read_inputs(int columns); @@ -43,6 +43,7 @@ public: virtual DECLARE_INPUT_CHANGED_MEMBER(input_changed); virtual DECLARE_READ8_MEMBER(input_r); virtual DECLARE_WRITE8_MEMBER(input_w); + virtual DECLARE_WRITE16_MEMBER(lcd_segment_w); protected: virtual void machine_start(); @@ -57,10 +58,12 @@ void hh_sm510_state::machine_start() // zerofill m_inp_mux = 0; // m_inp_lines = 0; + memset(m_lcd_output_cache, ~0, sizeof(m_lcd_output_cache)); // register for savestates save_item(NAME(m_inp_mux)); save_item(NAME(m_inp_lines)); + /* save_item(NAME(m_lcd_output_cache)); */ // don't save! } void hh_sm510_state::machine_reset() @@ -75,6 +78,30 @@ 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) +{ + for (int seg = 0; seg < 0x10; seg++) + { + int state = data >> seg & 1; + int index = offset << 4 | seg; + + if (state != m_lcd_output_cache[index]) + { + // output to x.y, where x = row a/b/c*4 + H1-4, y = seg1-16 + char buf[0x10]; + sprintf(buf, "%d.%d", offset, seg); + output_set_value(buf, state); + + m_lcd_output_cache[index] = state; + } + } +} + + +// generic input handlers - usually S output is input mux, and K input for buttons + UINT8 hh_sm510_state::read_inputs(int columns) { UINT8 ret = 0; @@ -87,9 +114,6 @@ UINT8 hh_sm510_state::read_inputs(int columns) return ret; } - -// generic input handlers - usually S output is input mux, and K input for buttons - void hh_sm510_state::update_k_line() { // this is necessary because the MCU can wake up on K input activity @@ -174,10 +198,14 @@ static MACHINE_CONFIG_START( ktopgun, ktopgun_state ) /* basic machine hardware */ MCFG_CPU_ADD("maincpu", SM510, XTAL_32_768kHz) + MCFG_SM510_WRITE_SEGA_CB(WRITE16(hh_sm510_state, lcd_segment_w)) + MCFG_SM510_WRITE_SEGB_CB(WRITE16(hh_sm510_state, 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(ktopgun_state, speaker_w)) + MCFG_DEFAULT_LAYOUT(layout_hh_sm510_test) + /* no video! */ /* sound hardware */ @@ -238,10 +266,14 @@ static MACHINE_CONFIG_START( gnwmndon, gnwmndon_state ) /* basic machine hardware */ MCFG_CPU_ADD("maincpu", SM510, XTAL_32_768kHz) + MCFG_SM510_WRITE_SEGA_CB(WRITE16(hh_sm510_state, lcd_segment_w)) + MCFG_SM510_WRITE_SEGB_CB(WRITE16(hh_sm510_state, 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(gnwmndon_state, speaker_w)) + MCFG_DEFAULT_LAYOUT(layout_hh_sm510_test) + /* no video! */ /* sound hardware */ @@ -274,6 +306,6 @@ ROM_END /* YEAR NAME PARENT COMPAT MACHINE INPUT INIT COMPANY, FULLNAME, FLAGS */ -CONS( 1989, ktopgun, 0, 0, ktopgun, ktopgun, driver_device, 0, "Konami", "Top Gun (Konami)", GAME_SUPPORTS_SAVE | GAME_NOT_WORKING ) +CONS( 1989, ktopgun, 0, 0, ktopgun, ktopgun, driver_device, 0, "Konami", "Top Gun (Konami)", GAME_SUPPORTS_SAVE | GAME_REQUIRES_ARTWORK | GAME_NOT_WORKING ) -CONS( 1982, gnwmndon, 0, 0, gnwmndon, gnwmndon, driver_device, 0, "Nintendo", "Game & Watch: Mickey & Donald", GAME_SUPPORTS_SAVE | GAME_NOT_WORKING ) +CONS( 1982, gnwmndon, 0, 0, gnwmndon, gnwmndon, driver_device, 0, "Nintendo", "Game & Watch: Mickey & Donald", GAME_SUPPORTS_SAVE | GAME_REQUIRES_ARTWORK | GAME_NOT_WORKING ) diff --git a/src/mess/layout/hh_sm510_test.lay b/src/mess/layout/hh_sm510_test.lay new file mode 100644 index 00000000000..ddad71a6a74 --- /dev/null +++ b/src/mess/layout/hh_sm510_test.lay @@ -0,0 +1,233 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +