added SM511 stuff and konami tmnt

This commit is contained in:
hap 2015-07-12 14:01:59 +02:00
parent 936c420654
commit 72365833ef
7 changed files with 317 additions and 34 deletions

View File

@ -67,6 +67,7 @@ void sm510_base_device::device_start()
m_1s = false;
m_k_active = false;
m_l = 0;
m_x = 0;
m_y = 0;
m_bp = false;
m_bc = false;
@ -89,6 +90,7 @@ void sm510_base_device::device_start()
save_item(NAME(m_1s));
save_item(NAME(m_k_active));
save_item(NAME(m_l));
save_item(NAME(m_x));
save_item(NAME(m_y));
save_item(NAME(m_bp));
save_item(NAME(m_bc));
@ -162,8 +164,8 @@ TIMER_CALLBACK_MEMBER(sm510_base_device::lcd_timer_cb)
m_write_segb(h | SM510_PORT_SEGB, get_lcd_row(h, m_lcd_ram_b), 0xffff);
m_write_segc(h | SM510_PORT_SEGC, get_lcd_row(h, m_lcd_ram_c), 0xffff);
// bs output from L and Y regs
UINT8 bs = m_l >> h & 1;
// bs output from L/X and Y regs
UINT8 bs = (m_l >> h & 1) | ((m_x*2) >> h & 2);
m_write_segbs(h | SM510_PORT_SEGBS, (m_bc || !m_bp) ? 0 : bs, 0xffff);
}

View File

@ -45,7 +45,7 @@
#define MCFG_SM510_WRITE_SEGC_CB(_devcb) \
sm510_base_device::set_write_segc_callback(*device, DEVCB_##_devcb);
// LCD bs output: same as above, but only data d0 used
// LCD bs output: same as above, but only up to 2 bits used
#define MCFG_SM510_WRITE_SEGBS_CB(_devcb) \
sm510_base_device::set_write_segbs_callback(*device, DEVCB_##_devcb);
@ -128,7 +128,7 @@ protected:
int m_datamask;
UINT16 m_pc, m_prev_pc;
UINT8 m_op, m_prev_op;
UINT16 m_op, m_prev_op;
UINT8 m_param;
int m_stack_levels;
UINT16 m_stack[2];
@ -147,7 +147,7 @@ protected:
optional_shared_ptr<UINT8> m_lcd_ram_a, m_lcd_ram_b, m_lcd_ram_c;
devcb_write16 m_write_sega, m_write_segb, m_write_segc, m_write_segbs;
emu_timer *m_lcd_timer;
UINT8 m_l;
UINT8 m_l, m_x;
UINT8 m_y;
bool m_bp;
bool m_bc;
@ -176,13 +176,14 @@ protected:
// misc internal helpers
void increment_pc();
virtual void get_opcode_param() { } // -> child class
virtual void update_w_latch() { }
UINT8 ram_r();
void ram_w(UINT8 data);
void pop_stack();
void push_stack();
void do_branch(UINT8 pu, UINT8 pm, UINT8 pl);
UINT8 bitmask(UINT8 param);
UINT8 bitmask(UINT16 param);
// opcode handlers
void op_lb();
@ -206,11 +207,13 @@ protected:
void op_excd();
void op_lda();
void op_lax();
void op_ptw();
void op_wr();
void op_ws();
void op_kta();
void op_atbp();
void op_atx();
void op_atl();
void op_atfc();
void op_atr();
@ -236,6 +239,12 @@ protected:
void op_rm();
void op_sm();
void op_pre();
void op_sme();
void op_rme();
void op_tmel();
void op_skip();
void op_cend();
void op_idiv();
@ -253,6 +262,8 @@ protected:
virtual offs_t disasm_disassemble(char *buffer, offs_t pc, const UINT8 *oprom, const UINT8 *opram, UINT32 options);
virtual void execute_one();
virtual void get_opcode_param();
virtual void update_w_latch() { m_write_s(0, m_w, 0xff); } // W is connected directly to S
};

View File

@ -15,39 +15,45 @@
enum e_mnemonics
{
mILL,
mILL, mEXT,
mLB, mLBL, mSBM, mEXBLA, mINCB, mDECB,
mATPL, mRTN0, mRTN1, mTL, mTML, mTM, mT,
mEXC, mBDC, mEXCI, mEXCD, mLDA, mLAX, mWR, mWS,
mKTA, mATBP, mATL, mATFC, mATR,
mEXC, mBDC, mEXCI, mEXCD, mLDA, mLAX, mPTW, mWR, mWS,
mKTA, mATBP, mATX, mATL, mATFC, mATR,
mADD, mADD11, mADX, mCOMA, mROT, mRC, mSC,
mTB, mTC, mTAM, mTMI, mTA0, mTABL, mTIS, mTAL, mTF1, mTF4,
mRM, mSM, mSKIP, mCEND, mIDIV
mRM, mSM,
mPRE, mSME, mRME, mTMEL,
mSKIP, mCEND, mIDIV
};
static const char *const s_mnemonics[] =
{
"?",
"?", "",
"LB", "LBL", "SBM", "EXBLA", "INCB", "DECB",
"ATPL", "RTN0", "RTN1", "TL", "TML", "TM", "T",
"EXC", "BDC", "EXCI", "EXCD", "LDA", "LAX", "WR", "WS",
"KTA", "ATBP", "ATL", "ATFC", "ATR",
"EXC", "BDC", "EXCI", "EXCD", "LDA", "LAX", "PTW", "WR", "WS",
"KTA", "ATBP", "ATX", "ATL", "ATFC", "ATR",
"ADD", "ADD11", "ADX", "COMA", "ROT", "RC", "SC",
"TB", "TC", "TAM", "TMI", "TA0", "TABL", "TIS", "TAL", "TF1", "TF4",
"RM", "SM", "SKIP", "CEND", "IDIV"
"RM", "SM",
"PRE", "SME", "RME", "TMEL",
"SKIP", "CEND", "IDIV"
};
// number of bits per opcode parameter, 8 or larger means 2-byte opcode
static const UINT8 s_bits[] =
{
0,
0, 8,
4, 8, 0, 0, 0, 0,
0, 0, 0, 4+8, 2+8, 6, 6,
2, 0, 2, 2, 2, 4, 0, 0,
0, 0, 0, 0, 0,
2, 0, 2, 2, 2, 4, 0, 0, 0,
0, 0, 0, 0, 0, 0,
0, 0, 4, 0, 0, 0, 0,
0, 0, 0, 2, 0, 0, 0, 0, 0, 0,
2, 2, 0, 0, 0
2, 2,
8, 0, 0, 0,
0, 0, 0
};
#define _OVER DASMFLAG_STEP_OVER
@ -55,14 +61,16 @@ static const UINT8 s_bits[] =
static const UINT32 s_flags[] =
{
0,
0, 0,
0, 0, 0, 0, 0, 0,
0, _OUT, _OUT, 0, _OVER, _OVER, 0,
0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, _OVER, 0
0, 0,
0, 0, 0, 0,
0, _OVER, 0
};
// next program counter in sequence (relative)
@ -78,7 +86,7 @@ static const INT8 s_next_pc[0x40] =
// common disasm
static offs_t sm510_common_disasm(const UINT8 *lut_mnemonic, char *buffer, offs_t pc, const UINT8 *oprom, const UINT8 *opram)
static offs_t sm510_common_disasm(const UINT8 *lut_mnemonic, const UINT8 *lut_extended, char *buffer, offs_t pc, const UINT8 *oprom, const UINT8 *opram)
{
// get raw opcode
UINT8 op = oprom[0];
@ -95,6 +103,11 @@ static offs_t sm510_common_disasm(const UINT8 *lut_mnemonic, char *buffer, offs_
param = oprom[s_next_pc[pc & 0x3f]];
len++;
}
// extended opcode
bool is_extended = (instr == mEXT);
if (is_extended)
instr = lut_extended[param];
// disassemble it
char *dst = buffer;
@ -110,7 +123,8 @@ static offs_t sm510_common_disasm(const UINT8 *lut_mnemonic, char *buffer, offs_
}
else if (bits <= 8)
{
dst += sprintf(dst, "$%02X", param);
if (!is_extended)
dst += sprintf(dst, "$%02X", param);
}
else
{
@ -155,13 +169,47 @@ static const UINT8 sm510_mnemonic[0x100] =
CPU_DISASSEMBLE(sm510)
{
return sm510_common_disasm(sm510_mnemonic, buffer, pc, oprom, opram);
return sm510_common_disasm(sm510_mnemonic, NULL, buffer, pc, oprom, opram);
}
// SM511 disasm
static const UINT8 sm511_mnemonic[0x100] =
{
/* 0 1 2 3 4 5 6 7 8 9 A B C D E F */
mROT, 0, 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
mLB, mLB, mLB, mLB, mLB, mLB, mLB, mLB, mLB, mLB, mLB, mLB, mLB, mLB, mLB, mLB, // 4
mKTA, mTB, mTC, mTAM, mTMI, mTMI, mTMI, mTMI, mTIS, mATL, mTA0, mTABL, mATX, 0, mTAL, mLBL, // 5
mEXT, mPRE, mWR, mWS, mINCB, 0, mRC, mSC, mTML, mTML, mTML, mTML, mDECB, mPTW, mRTN0, mRTN1, // 6
mTL, mTL, mTL, mTL, mTL, mTL, mTL, mTL, mTL, mTL, mTL, mTL, mTL, mTL, mTL, mTL, // 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
};
static const UINT8 sm511_extended[0x10] =
{
mRME, mSME, mTMEL, mATFC, mBDC, mATBP, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // 60 3
};
CPU_DISASSEMBLE(sm511)
{
return sm510_common_disasm(sm510_mnemonic, buffer, pc, oprom, opram);
// create extended opcode table
UINT8 ext[0x100];
memset(ext, 0, 0x100);
memcpy(ext + 0x30, sm511_extended, 0x10);
return sm510_common_disasm(sm511_mnemonic, ext, buffer, pc, oprom, opram);
}

View File

@ -42,7 +42,7 @@ void sm510_base_device::do_branch(UINT8 pu, UINT8 pm, UINT8 pl)
m_pc = ((pu << 10 & 0xc00) | (pm << 6 & 0x3c0) | (pl & 0x03f)) & m_prgmask;
}
inline UINT8 sm510_base_device::bitmask(UINT8 param)
inline UINT8 sm510_base_device::bitmask(UINT16 param)
{
// bitmask from immediate opcode param
return 1 << (param & 3);
@ -192,18 +192,24 @@ void sm510_base_device::op_lax()
m_acc = m_op & 0xf;
}
void sm510_base_device::op_ptw()
{
// PTW: output W latch
m_write_s(0, m_w, 0xff);
}
void sm510_base_device::op_wr()
{
// WR: shift 0 into W
m_w = m_w << 1 | 0;
m_write_s(0, m_w, 0xff);
update_w_latch();
}
void sm510_base_device::op_ws()
{
// WR: shift 1 into W
m_w = m_w << 1 | 1;
m_write_s(0, m_w, 0xff);
update_w_latch();
}
@ -221,6 +227,12 @@ void sm510_base_device::op_atbp()
m_bp = ((m_acc & 1) != 0);
}
void sm510_base_device::op_atx()
{
// ATX: output ACC to X
m_x = m_acc;
}
void sm510_base_device::op_atl()
{
// ATL: output ACC to L
@ -371,6 +383,33 @@ void sm510_base_device::op_sm()
}
// Melody control instructions
void sm510_base_device::op_pre()
{
// PRE x: x
op_illegal();
}
void sm510_base_device::op_sme()
{
// SME: x
op_illegal();
}
void sm510_base_device::op_rme()
{
// RME: x
op_illegal();
}
void sm510_base_device::op_tmel()
{
// TMEL: x
op_illegal();
}
// Special instructions
void sm510_base_device::op_skip()
@ -392,5 +431,5 @@ void sm510_base_device::op_idiv()
void sm510_base_device::op_illegal()
{
logerror("%s unknown opcode $%03X at $%04X\n", tag(), m_op, m_prev_pc);
logerror("%s unknown opcode $%02X at $%04X\n", tag(), m_op, m_prev_pc);
}

View File

@ -63,8 +63,101 @@ sm512_device::sm512_device(const machine_config &mconfig, const char *tag, devic
void sm511_device::get_opcode_param()
{
// LBL, PRE, TL, TML and prefix opcodes are 2 bytes
if ((m_op >= 0x5f && m_op <= 0x61) || (m_op & 0xf0) == 0x70 || (m_op & 0xfc) == 0x68)
{
m_icount--;
m_param = m_program->read_byte(m_pc);
increment_pc();
}
}
void sm511_device::execute_one()
{
switch (m_op & 0xf0)
{
case 0x20: op_lax(); break;
case 0x30: op_adx(); break;
case 0x40: op_lb(); break;
case 0x70: op_tl(); break;
case 0x80: case 0x90: case 0xa0: case 0xb0:
op_t(); break;
case 0xc0: case 0xd0: case 0xe0: case 0xf0:
op_tm(); break;
default:
switch (m_op & 0xfc)
{
case 0x04: op_rm(); break;
case 0x0c: op_sm(); break;
case 0x10: op_exc(); break;
case 0x14: op_exci(); break;
case 0x18: op_lda(); break;
case 0x1c: op_excd(); break;
case 0x54: op_tmi(); break;
case 0x68: op_tml(); break;
default:
switch (m_op)
{
case 0x00: op_rot(); break;
case 0x02: op_sbm(); break;
case 0x03: op_atpl(); break;
case 0x08: op_add(); break;
case 0x09: op_add11(); break;
case 0x0a: op_coma(); break;
case 0x0b: op_exbla(); break;
case 0x50: op_kta(); break;
case 0x51: op_tb(); break;
case 0x52: op_tc(); break;
case 0x53: op_tam(); break;
case 0x58: op_tis(); break;
case 0x59: op_atl(); break;
case 0x5a: op_ta0(); break;
case 0x5b: op_tabl(); break;
case 0x5c: op_atx(); break;
// case 0x5d: op_cend(); break;
case 0x5e: op_tal(); break;
case 0x5f: op_lbl(); break;
case 0x61: op_pre(); break;
case 0x62: op_wr(); break;
case 0x63: op_ws(); break;
case 0x64: op_incb(); break;
// case 0x65: op_idiv(); break;
case 0x66: op_rc(); break;
case 0x67: op_sc(); break;
// case 0x68: op_tf1(); break;
// case 0x69: op_tf4(); break;
case 0x6c: op_decb(); break;
case 0x6d: op_ptw(); break;
case 0x6e: op_rtn0(); break;
case 0x6f: op_rtn1(); break;
// extended opcodes
case 0x60:
m_op = m_op << 8 | m_param;
switch (m_param)
{
case 0x30: op_rme(); break;
case 0x31: op_sme(); break;
case 0x32: op_tmel(); break;
case 0x33: op_atfc(); break;
case 0x34: op_bdc(); break;
case 0x35: op_atbp(); break;
default: op_illegal(); break;
}
break; // 0x60
default: op_illegal(); break;
}
break; // 0xff
}
break; // 0xfc
} // big switch
}

View File

@ -2195,6 +2195,7 @@ maniac // Ideal
// hh_sm510
ktopgun // Konami
ktmnt // Konami
gnwmndon // Nintendo
// hh_tms1k

View File

@ -148,7 +148,11 @@ READ8_MEMBER(hh_sm510_state::input_r)
Konami Top Gun
* PCB label BH003
* Sharp SM510 under epoxy (die label K/CM54C 598)
* Sharp SM510 under epoxy (die label CMS54C, KMS598)
The ROM listing "BH003 Top Gun" from patent US5137277 is identical to the
released version, except for 2 probable bit errors and filler bytes. Unused
pages list data too, of what looks like assembler leftover garbage.
***************************************************************************/
@ -217,11 +221,88 @@ MACHINE_CONFIG_END
/***************************************************************************
Konami Teenage Mutant Ninja Turtles
* Sharp SM511 under epoxy (die label KMS 73B, KMS 774)
The ROM listing "BH005 TMNT" from patent US5150899 is identical to the
released version, excluding filler bytes.
***************************************************************************/
class ktmnt_state : public hh_sm510_state
{
public:
ktmnt_state(const machine_config &mconfig, device_type type, const char *tag)
: hh_sm510_state(mconfig, type, tag)
{
m_inp_lines = 3;
}
DECLARE_WRITE8_MEMBER(speaker_w);
};
// handlers
WRITE8_MEMBER(ktmnt_state::speaker_w)
{
m_speaker->level_w(data >> 0 & 1);
}
// config
static INPUT_PORTS_START( ktmnt )
PORT_START("IN.0")
PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_JOYSTICK_LEFT ) PORT_CHANGED_MEMBER(DEVICE_SELF, hh_sm510_state, input_changed, NULL)
PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_JOYSTICK_UP ) PORT_CHANGED_MEMBER(DEVICE_SELF, hh_sm510_state, input_changed, NULL)
PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_JOYSTICK_DOWN ) PORT_CHANGED_MEMBER(DEVICE_SELF, hh_sm510_state, input_changed, NULL)
PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_JOYSTICK_RIGHT ) PORT_CHANGED_MEMBER(DEVICE_SELF, hh_sm510_state, input_changed, NULL)
PORT_START("IN.1")
PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_BUTTON1 ) PORT_CHANGED_MEMBER(DEVICE_SELF, hh_sm510_state, input_changed, NULL)
PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_BUTTON2 ) PORT_CHANGED_MEMBER(DEVICE_SELF, hh_sm510_state, input_changed, NULL)
PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_BUTTON3 ) PORT_CHANGED_MEMBER(DEVICE_SELF, hh_sm510_state, input_changed, NULL)
PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_BUTTON4 ) PORT_CHANGED_MEMBER(DEVICE_SELF, hh_sm510_state, input_changed, NULL)
PORT_START("IN.2")
PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_BUTTON5 ) PORT_CHANGED_MEMBER(DEVICE_SELF, hh_sm510_state, input_changed, NULL)
PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_BUTTON6 ) PORT_CHANGED_MEMBER(DEVICE_SELF, hh_sm510_state, input_changed, NULL)
PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_BUTTON7 ) PORT_CHANGED_MEMBER(DEVICE_SELF, hh_sm510_state, input_changed, NULL)
PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_BUTTON8 ) PORT_CHANGED_MEMBER(DEVICE_SELF, hh_sm510_state, input_changed, NULL)
INPUT_PORTS_END
static MACHINE_CONFIG_START( ktmnt, ktmnt_state )
/* basic machine hardware */
MCFG_CPU_ADD("maincpu", SM511, 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_WRITE_SEGBS_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(ktmnt_state, speaker_w))
MCFG_DEFAULT_LAYOUT(layout_hh_sm510_test)
/* 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
/***************************************************************************
Nintendo Game & Watch: Mickey & Donald (model DM-53)
* PCB label DM-53
* Sharp SM510 label DM-53 (die label CM54C 565)
* Sharp SM510 label DM-53 (die label CMS54C, CMS565)
***************************************************************************/
@ -294,18 +375,26 @@ MACHINE_CONFIG_END
ROM_START( ktopgun )
ROM_REGION( 0x1000, "maincpu", 0 )
ROM_LOAD( "bh003_598", 0x0000, 0x1000, CRC(50870b35) SHA1(cda1260c2e1c180995eced04b7d7ff51616dcef5) )
ROM_LOAD( "cms54c_kms598", 0x0000, 0x1000, CRC(50870b35) SHA1(cda1260c2e1c180995eced04b7d7ff51616dcef5) )
ROM_END
ROM_START( ktmnt )
ROM_REGION( 0x1000, "maincpu", 0 )
ROM_LOAD( "kms_73b_774.music", 0x0000, 0x100, CRC(8270d626) SHA1(bd91ca1d5cd7e2a62eef05c0033b19dcdbe441ca) ) //todo
ROM_LOAD( "kms_73b_774.prog", 0x0000, 0x1000, CRC(a1064f87) SHA1(92156c35fbbb414007ee6804fe635128a741d5f1) )
ROM_END
ROM_START( gnwmndon )
ROM_REGION( 0x1000, "maincpu", 0 )
ROM_LOAD( "dm53_565", 0x0000, 0x1000, CRC(e21fc0f5) SHA1(3b65ccf9f98813319410414e11a3231b787cdee6) )
ROM_LOAD( "dm53_cms54c_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_REQUIRES_ARTWORK | GAME_NOT_WORKING )
CONS( 1989, ktmnt, 0, 0, ktmnt, ktmnt, driver_device, 0, "Konami", "Teenage Mutant Ninja Turtles (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_REQUIRES_ARTWORK | GAME_NOT_WORKING )