diff --git a/src/emu/cpu/sm510/sm510.c b/src/emu/cpu/sm510/sm510.c index b5dcf501265..2968335b68a 100644 --- a/src/emu/cpu/sm510/sm510.c +++ b/src/emu/cpu/sm510/sm510.c @@ -25,7 +25,8 @@ enum { - SM510_PC=1, SM510_ACC, SM510_BL, SM510_BM + SM510_PC=1, SM510_ACC, SM510_BL, SM510_BM, + SM510_C, SM510_W }; void sm510_base_device::device_start() @@ -52,6 +53,9 @@ void sm510_base_device::device_start() m_c = 0; m_skip = false; m_w = 0; + m_div = 0; + m_bdc = false; + m_cend = false; // register for savestates save_item(NAME(m_stack)); @@ -66,12 +70,17 @@ void sm510_base_device::device_start() save_item(NAME(m_c)); save_item(NAME(m_skip)); save_item(NAME(m_w)); + save_item(NAME(m_div)); + save_item(NAME(m_bdc)); + save_item(NAME(m_cend)); // register state for debugger state_add(SM510_PC, "PC", m_pc).formatstr("%04X"); state_add(SM510_ACC, "ACC", m_acc).formatstr("%01X"); state_add(SM510_BL, "BL", m_bl).formatstr("%01X"); state_add(SM510_BM, "BM", m_bm).formatstr("%01X"); + state_add(SM510_C, "C", m_c).formatstr("%01X"); + state_add(SM510_W, "W", m_w).formatstr("%02X"); state_add(STATE_GENPC, "curpc", m_pc).formatstr("%04X").noshow(); state_add(STATE_GENFLAGS, "GENFLAGS", m_c).formatstr("%1s").noshow(); @@ -88,6 +97,8 @@ void sm510_base_device::device_start() void sm510_base_device::device_reset() { m_skip = false; + m_bdc = false; + m_cend = false; m_op = m_prev_op = 0; do_branch(3, 7, 0); m_prev_pc = m_pc; diff --git a/src/emu/cpu/sm510/sm510.h b/src/emu/cpu/sm510/sm510.h index c2674ecb9b0..7af7f1a7542 100644 --- a/src/emu/cpu/sm510/sm510.h +++ b/src/emu/cpu/sm510/sm510.h @@ -38,6 +38,7 @@ public: : cpu_device(mconfig, type, name, tag, owner, clock, shortname, source) , m_program_config("program", ENDIANNESS_LITTLE, 8, prgwidth, 0, program) , m_data_config("data", ENDIANNESS_LITTLE, 8, datawidth, 0, data) + , m_lcd_ram(*this, "lcd_ram") , m_prgwidth(prgwidth) , m_datawidth(datawidth) , m_stack_levels(stack_levels) @@ -75,16 +76,15 @@ protected: address_space_config m_data_config; address_space *m_program; address_space *m_data; + required_shared_ptr m_lcd_ram; int m_prgwidth; int m_datawidth; int m_prgmask; int m_datamask; - UINT16 m_pc; - UINT16 m_prev_pc; - UINT8 m_op; - UINT8 m_prev_op; + UINT16 m_pc, m_prev_pc; + UINT8 m_op, m_prev_op; UINT8 m_param; int m_stack_levels; UINT16 m_stack[2]; @@ -96,6 +96,9 @@ protected: UINT8 m_c; bool m_skip; UINT8 m_w; + UINT16 m_div; + bool m_bdc; + bool m_cend; // i/o handlers devcb_read16 m_read_k; diff --git a/src/emu/cpu/sm510/sm510core.c b/src/emu/cpu/sm510/sm510core.c index 791c44f4a24..58d6035252e 100644 --- a/src/emu/cpu/sm510/sm510core.c +++ b/src/emu/cpu/sm510/sm510core.c @@ -24,7 +24,7 @@ ADDRESS_MAP_END static ADDRESS_MAP_START(data_96_32x4, AS_DATA, 8, sm510_base_device) AM_RANGE(0x00, 0x5f) AM_RAM - AM_RANGE(0x60, 0x7f) AM_RAM + AM_RANGE(0x60, 0x7f) AM_RAM AM_SHARE("lcd_ram") ADDRESS_MAP_END diff --git a/src/emu/cpu/sm510/sm510d.c b/src/emu/cpu/sm510/sm510d.c index 1bacab9c91f..81c1abff33c 100644 --- a/src/emu/cpu/sm510/sm510d.c +++ b/src/emu/cpu/sm510/sm510d.c @@ -11,7 +11,7 @@ #include "sm510.h" -// common +// common lookup tables enum e_mnemonics { @@ -76,37 +76,13 @@ static const INT8 s_next_pc[0x40] = -// SM510 disasm +// common disasm -static const UINT8 sm510_mnemonic[0x100] = -{ -/* 0 1 2 3 4 5 6 7 8 9 A B C D E F */ - mSKIP, mATBP, mSBM, mATPL, mRM, mRM, mRM, mRM, mADD, mADD11,mCOMA, mEXBLA,mSM, mSM, mSM, mSM, // 0 - mEXC, mEXC, mEXC, mEXC, mEXCI, mEXCI, mEXCI, mEXCI, mLDA, mLDA, mLDA, mLDA, mEXCD, mEXCD, mEXCD, mEXCD, // 1 - mLAX, mLAX, mLAX, mLAX, mLAX, mLAX, mLAX, mLAX, mLAX, mLAX, mLAX, mLAX, mLAX, mLAX, mLAX, mLAX, // 2 - mADX, mADX, mADX, mADX, mADX, mADX, mADX, mADX, mADX, mADX, mADX, mADX, mADX, mADX, mADX, mADX, // 3 - note: $3A has synonym DC(decimal correct) - - mLB, mLB, mLB, mLB, mLB, mLB, mLB, mLB, mLB, mLB, mLB, mLB, mLB, mLB, mLB, mLB, // 4 - 0, mTB, mTC, mTAM, mTMI, mTMI, mTMI, mTMI, mTIS, mATL, mTA0, mTABL, 0, mCEND, mTAL, mLBL, // 5 - mATFC, mATR, mWR, mWS, mINCB, mIDIV, mRC, mSC, mTF1, mTF4, mKTA, mROT, mDECB, mBDC, mRTN0, mRTN1, // 6 - mTL, mTL, mTL, mTL, mTL, mTL, mTL, mTL, mTL, mTL, mTL, mTL, mTML, mTML, mTML, mTML, // 7 - - mT, mT, mT, mT, mT, mT, mT, mT, mT, mT, mT, mT, mT, mT, mT, mT, // 8 - mT, mT, mT, mT, mT, mT, mT, mT, mT, mT, mT, mT, mT, mT, mT, mT, // 9 - mT, mT, mT, mT, mT, mT, mT, mT, mT, mT, mT, mT, mT, mT, mT, mT, // A - mT, mT, mT, mT, mT, mT, mT, mT, mT, mT, mT, mT, mT, mT, mT, mT, // B - - mTM, mTM, mTM, mTM, mTM, mTM, mTM, mTM, mTM, mTM, mTM, mTM, mTM, mTM, mTM, mTM, // C - mTM, mTM, mTM, mTM, mTM, mTM, mTM, mTM, mTM, mTM, mTM, mTM, mTM, mTM, mTM, mTM, // D - mTM, mTM, mTM, mTM, mTM, mTM, mTM, mTM, mTM, mTM, mTM, mTM, mTM, mTM, mTM, mTM, // E - mTM, mTM, mTM, mTM, mTM, mTM, mTM, mTM, mTM, mTM, mTM, mTM, mTM, mTM, mTM, mTM // F -}; - -CPU_DISASSEMBLE(sm510) +static offs_t sm510_common_disasm(const UINT8 *lut_mnemonic, char *buffer, offs_t pc, const UINT8 *oprom, const UINT8 *opram) { // get raw opcode UINT8 op = oprom[0]; - UINT8 instr = sm510_mnemonic[op]; + UINT8 instr = lut_mnemonic[op]; int len = 1; int bits = s_bits[instr]; @@ -151,10 +127,41 @@ CPU_DISASSEMBLE(sm510) } +// SM510 disasm + +static const UINT8 sm510_mnemonic[0x100] = +{ +/* 0 1 2 3 4 5 6 7 8 9 A B C D E F */ + mSKIP, mATBP, mSBM, mATPL, mRM, mRM, mRM, mRM, mADD, mADD11,mCOMA, mEXBLA,mSM, mSM, mSM, mSM, // 0 + mEXC, mEXC, mEXC, mEXC, mEXCI, mEXCI, mEXCI, mEXCI, mLDA, mLDA, mLDA, mLDA, mEXCD, mEXCD, mEXCD, mEXCD, // 1 + mLAX, mLAX, mLAX, mLAX, mLAX, mLAX, mLAX, mLAX, mLAX, mLAX, mLAX, mLAX, mLAX, mLAX, mLAX, mLAX, // 2 + mADX, mADX, mADX, mADX, mADX, mADX, mADX, mADX, mADX, mADX, mADX, mADX, mADX, mADX, mADX, mADX, // 3 - note: $3A has synonym DC(decimal correct) + + mLB, mLB, mLB, mLB, mLB, mLB, mLB, mLB, mLB, mLB, mLB, mLB, mLB, mLB, mLB, mLB, // 4 + 0, mTB, mTC, mTAM, mTMI, mTMI, mTMI, mTMI, mTIS, mATL, mTA0, mTABL, 0, mCEND, mTAL, mLBL, // 5 + mATFC, mATR, mWR, mWS, mINCB, mIDIV, mRC, mSC, mTF1, mTF4, mKTA, mROT, mDECB, mBDC, mRTN0, mRTN1, // 6 + mTL, mTL, mTL, mTL, mTL, mTL, mTL, mTL, mTL, mTL, mTL, mTL, mTML, mTML, mTML, mTML, // 7 + + mT, mT, mT, mT, mT, mT, mT, mT, mT, mT, mT, mT, mT, mT, mT, mT, // 8 + mT, mT, mT, mT, mT, mT, mT, mT, mT, mT, mT, mT, mT, mT, mT, mT, // 9 + mT, mT, mT, mT, mT, mT, mT, mT, mT, mT, mT, mT, mT, mT, mT, mT, // A + mT, mT, mT, mT, mT, mT, mT, mT, mT, mT, mT, mT, mT, mT, mT, mT, // B + + mTM, mTM, mTM, mTM, mTM, mTM, mTM, mTM, mTM, mTM, mTM, mTM, mTM, mTM, mTM, mTM, // C + mTM, mTM, mTM, mTM, mTM, mTM, mTM, mTM, mTM, mTM, mTM, mTM, mTM, mTM, mTM, mTM, // D + mTM, mTM, mTM, mTM, mTM, mTM, mTM, mTM, mTM, mTM, mTM, mTM, mTM, mTM, mTM, mTM, // E + mTM, mTM, mTM, mTM, mTM, mTM, mTM, mTM, mTM, mTM, mTM, mTM, mTM, mTM, mTM, mTM // F +}; + +CPU_DISASSEMBLE(sm510) +{ + return sm510_common_disasm(sm510_mnemonic, buffer, pc, oprom, opram); +} + // SM511 disasm CPU_DISASSEMBLE(sm511) { - return 1; + return sm510_common_disasm(sm510_mnemonic, buffer, pc, oprom, opram); } diff --git a/src/emu/cpu/sm510/sm510op.c b/src/emu/cpu/sm510/sm510op.c index 835289e7ce3..0e3238e1739 100644 --- a/src/emu/cpu/sm510/sm510op.c +++ b/src/emu/cpu/sm510/sm510op.c @@ -160,8 +160,8 @@ void sm510_base_device::op_exc() void sm510_base_device::op_bdc() { - // BDC: x - op_illegal(); + // BDC: enable LCD bleeder current with C + m_bdc = (m_c != 0); } void sm510_base_device::op_exci() @@ -380,13 +380,13 @@ void sm510_base_device::op_skip() void sm510_base_device::op_cend() { // CEND: stop clock - op_illegal(); + m_cend = true; } void sm510_base_device::op_idiv() { // IDIV: reset divider - op_illegal(); + m_div = 0; } void sm510_base_device::op_illegal() diff --git a/src/emu/cpu/sm510/sm511core.c b/src/emu/cpu/sm510/sm511core.c index 237e5b72d7b..8905b4c3239 100644 --- a/src/emu/cpu/sm510/sm511core.c +++ b/src/emu/cpu/sm510/sm511core.c @@ -22,12 +22,12 @@ ADDRESS_MAP_END static ADDRESS_MAP_START(data_96_32x4, AS_DATA, 8, sm510_base_device) AM_RANGE(0x00, 0x5f) AM_RAM - AM_RANGE(0x60, 0x7f) AM_RAM + AM_RANGE(0x60, 0x7f) AM_RAM AM_SHARE("lcd_ram") ADDRESS_MAP_END static ADDRESS_MAP_START(data_80_48x4, AS_DATA, 8, sm510_base_device) AM_RANGE(0x00, 0x4f) AM_RAM - AM_RANGE(0x50, 0x7f) AM_RAM + AM_RANGE(0x50, 0x7f) AM_RAM AM_SHARE("lcd_ram") ADDRESS_MAP_END diff --git a/src/mame/mess.lst b/src/mame/mess.lst index 63f873c22c8..aa19be4bf23 100644 --- a/src/mame/mess.lst +++ b/src/mame/mess.lst @@ -2195,6 +2195,7 @@ maniac // Ideal // hh_sm510 ktopgun // Konami +gnwmndon // Nintendo // hh_tms1k mathmagi // APF diff --git a/src/mess/drivers/hh_sm510.c b/src/mess/drivers/hh_sm510.c index e0ffa12a969..ab51dfeba1e 100644 --- a/src/mess/drivers/hh_sm510.c +++ b/src/mess/drivers/hh_sm510.c @@ -92,7 +92,8 @@ UINT8 hh_sm510_state::read_inputs(int columns) /*************************************************************************** Konami Top Gun - * x + * PCB label BH003 + * Sharp SM510 under epoxy (die label K/CM54C 598) ***************************************************************************/ @@ -109,7 +110,6 @@ public: // handlers - WRITE8_MEMBER(ktopgun_state::input_w) { // S1-S3: input mux @@ -123,7 +123,6 @@ READ8_MEMBER(ktopgun_state::input_r) } - // config static INPUT_PORTS_START( ktopgun ) @@ -165,6 +164,71 @@ MACHINE_CONFIG_END +/*************************************************************************** + + Nintendo Game & Watch: Mickey & Donald (model DM-53) + * PCB label DM-53 + * Sharp SM510 label DM-53 (die label CM54C 565) + +***************************************************************************/ + +class gnwmndon_state : public hh_sm510_state +{ +public: + gnwmndon_state(const machine_config &mconfig, device_type type, const char *tag) + : hh_sm510_state(mconfig, type, tag) + { } + + DECLARE_WRITE8_MEMBER(input_w); + DECLARE_READ8_MEMBER(input_r); +}; + +// handlers + +WRITE8_MEMBER(gnwmndon_state::input_w) +{ + // S1,S2: input mux + m_inp_mux = data; +} + +READ8_MEMBER(gnwmndon_state::input_r) +{ + return read_inputs(2); +} + + +// config + +static INPUT_PORTS_START( gnwmndon ) + PORT_START("IN.0") + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_JOYSTICK_RIGHT ) PORT_4WAY + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_JOYSTICK_UP ) PORT_4WAY + PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_JOYSTICK_LEFT ) PORT_4WAY + PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_JOYSTICK_DOWN ) PORT_4WAY + + PORT_START("IN.1") + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_BUTTON1 ) // time + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_BUTTON2 ) // b + PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_BUTTON3 ) // a + PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_BUTTON4 ) // alarm +INPUT_PORTS_END + +static MACHINE_CONFIG_START( gnwmndon, gnwmndon_state ) + + /* basic machine hardware */ + MCFG_CPU_ADD("maincpu", SM510, XTAL_32_768kHz) + MCFG_SM510_READ_K_CB(READ8(gnwmndon_state, input_r)) + MCFG_SM510_WRITE_S_CB(WRITE8(gnwmndon_state, input_w)) + + /* no video! */ + + /* 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 + + @@ -176,13 +240,18 @@ MACHINE_CONFIG_END ROM_START( ktopgun ) ROM_REGION( 0x1000, "maincpu", 0 ) - ROM_LOAD( "topgun_die.bin", 0x0000, 0x1000, CRC(50870b35) SHA1(cda1260c2e1c180995eced04b7d7ff51616dcef5) ) + ROM_LOAD( "bh003_598", 0x0000, 0x1000, CRC(50870b35) SHA1(cda1260c2e1c180995eced04b7d7ff51616dcef5) ) ROM_END - +ROM_START( gnwmndon ) + ROM_REGION( 0x1000, "maincpu", 0 ) + ROM_LOAD( "dm53_565", 0x0000, 0x1000, CRC(e21fc0f5) SHA1(3b65ccf9f98813319410414e11a3231b787cdee6) ) +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( 1982, gnwmndon, 0, 0, gnwmndon, gnwmndon, driver_device, 0, "Nintendo", "Game & Watch: Mickey & Donald", GAME_SUPPORTS_SAVE | GAME_NOT_WORKING )