skeleton added

Game & Watch: Mickey & Donald
This commit is contained in:
hap 2015-07-07 00:30:21 +02:00
parent 43c5e1a6dd
commit ac08f7c460
8 changed files with 137 additions and 46 deletions

View File

@ -25,7 +25,8 @@
enum 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() void sm510_base_device::device_start()
@ -52,6 +53,9 @@ void sm510_base_device::device_start()
m_c = 0; m_c = 0;
m_skip = false; m_skip = false;
m_w = 0; m_w = 0;
m_div = 0;
m_bdc = false;
m_cend = false;
// register for savestates // register for savestates
save_item(NAME(m_stack)); save_item(NAME(m_stack));
@ -66,12 +70,17 @@ void sm510_base_device::device_start()
save_item(NAME(m_c)); save_item(NAME(m_c));
save_item(NAME(m_skip)); save_item(NAME(m_skip));
save_item(NAME(m_w)); save_item(NAME(m_w));
save_item(NAME(m_div));
save_item(NAME(m_bdc));
save_item(NAME(m_cend));
// register state for debugger // register state for debugger
state_add(SM510_PC, "PC", m_pc).formatstr("%04X"); state_add(SM510_PC, "PC", m_pc).formatstr("%04X");
state_add(SM510_ACC, "ACC", m_acc).formatstr("%01X"); state_add(SM510_ACC, "ACC", m_acc).formatstr("%01X");
state_add(SM510_BL, "BL", m_bl).formatstr("%01X"); state_add(SM510_BL, "BL", m_bl).formatstr("%01X");
state_add(SM510_BM, "BM", m_bm).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_GENPC, "curpc", m_pc).formatstr("%04X").noshow();
state_add(STATE_GENFLAGS, "GENFLAGS", m_c).formatstr("%1s").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() void sm510_base_device::device_reset()
{ {
m_skip = false; m_skip = false;
m_bdc = false;
m_cend = false;
m_op = m_prev_op = 0; m_op = m_prev_op = 0;
do_branch(3, 7, 0); do_branch(3, 7, 0);
m_prev_pc = m_pc; m_prev_pc = m_pc;

View File

@ -38,6 +38,7 @@ public:
: cpu_device(mconfig, type, name, tag, owner, clock, shortname, source) : cpu_device(mconfig, type, name, tag, owner, clock, shortname, source)
, m_program_config("program", ENDIANNESS_LITTLE, 8, prgwidth, 0, program) , m_program_config("program", ENDIANNESS_LITTLE, 8, prgwidth, 0, program)
, m_data_config("data", ENDIANNESS_LITTLE, 8, datawidth, 0, data) , m_data_config("data", ENDIANNESS_LITTLE, 8, datawidth, 0, data)
, m_lcd_ram(*this, "lcd_ram")
, m_prgwidth(prgwidth) , m_prgwidth(prgwidth)
, m_datawidth(datawidth) , m_datawidth(datawidth)
, m_stack_levels(stack_levels) , m_stack_levels(stack_levels)
@ -75,16 +76,15 @@ protected:
address_space_config m_data_config; address_space_config m_data_config;
address_space *m_program; address_space *m_program;
address_space *m_data; address_space *m_data;
required_shared_ptr<UINT8> m_lcd_ram;
int m_prgwidth; int m_prgwidth;
int m_datawidth; int m_datawidth;
int m_prgmask; int m_prgmask;
int m_datamask; int m_datamask;
UINT16 m_pc; UINT16 m_pc, m_prev_pc;
UINT16 m_prev_pc; UINT8 m_op, m_prev_op;
UINT8 m_op;
UINT8 m_prev_op;
UINT8 m_param; UINT8 m_param;
int m_stack_levels; int m_stack_levels;
UINT16 m_stack[2]; UINT16 m_stack[2];
@ -96,6 +96,9 @@ protected:
UINT8 m_c; UINT8 m_c;
bool m_skip; bool m_skip;
UINT8 m_w; UINT8 m_w;
UINT16 m_div;
bool m_bdc;
bool m_cend;
// i/o handlers // i/o handlers
devcb_read16 m_read_k; devcb_read16 m_read_k;

View File

@ -24,7 +24,7 @@ ADDRESS_MAP_END
static ADDRESS_MAP_START(data_96_32x4, AS_DATA, 8, sm510_base_device) static ADDRESS_MAP_START(data_96_32x4, AS_DATA, 8, sm510_base_device)
AM_RANGE(0x00, 0x5f) AM_RAM 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 ADDRESS_MAP_END

View File

@ -11,7 +11,7 @@
#include "sm510.h" #include "sm510.h"
// common // common lookup tables
enum e_mnemonics enum e_mnemonics
{ {
@ -76,37 +76,13 @@ static const INT8 s_next_pc[0x40] =
// SM510 disasm // common disasm
static const UINT8 sm510_mnemonic[0x100] = static offs_t sm510_common_disasm(const UINT8 *lut_mnemonic, char *buffer, offs_t pc, const UINT8 *oprom, const UINT8 *opram)
{
/* 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)
{ {
// get raw opcode // get raw opcode
UINT8 op = oprom[0]; UINT8 op = oprom[0];
UINT8 instr = sm510_mnemonic[op]; UINT8 instr = lut_mnemonic[op];
int len = 1; int len = 1;
int bits = s_bits[instr]; 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 // SM511 disasm
CPU_DISASSEMBLE(sm511) CPU_DISASSEMBLE(sm511)
{ {
return 1; return sm510_common_disasm(sm510_mnemonic, buffer, pc, oprom, opram);
} }

View File

@ -160,8 +160,8 @@ void sm510_base_device::op_exc()
void sm510_base_device::op_bdc() void sm510_base_device::op_bdc()
{ {
// BDC: x // BDC: enable LCD bleeder current with C
op_illegal(); m_bdc = (m_c != 0);
} }
void sm510_base_device::op_exci() void sm510_base_device::op_exci()
@ -380,13 +380,13 @@ void sm510_base_device::op_skip()
void sm510_base_device::op_cend() void sm510_base_device::op_cend()
{ {
// CEND: stop clock // CEND: stop clock
op_illegal(); m_cend = true;
} }
void sm510_base_device::op_idiv() void sm510_base_device::op_idiv()
{ {
// IDIV: reset divider // IDIV: reset divider
op_illegal(); m_div = 0;
} }
void sm510_base_device::op_illegal() void sm510_base_device::op_illegal()

View File

@ -22,12 +22,12 @@ ADDRESS_MAP_END
static ADDRESS_MAP_START(data_96_32x4, AS_DATA, 8, sm510_base_device) static ADDRESS_MAP_START(data_96_32x4, AS_DATA, 8, sm510_base_device)
AM_RANGE(0x00, 0x5f) AM_RAM 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 ADDRESS_MAP_END
static ADDRESS_MAP_START(data_80_48x4, AS_DATA, 8, sm510_base_device) static ADDRESS_MAP_START(data_80_48x4, AS_DATA, 8, sm510_base_device)
AM_RANGE(0x00, 0x4f) AM_RAM 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 ADDRESS_MAP_END

View File

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

View File

@ -92,7 +92,8 @@ UINT8 hh_sm510_state::read_inputs(int columns)
/*************************************************************************** /***************************************************************************
Konami Top Gun Konami Top Gun
* x * PCB label BH003
* Sharp SM510 under epoxy (die label K/CM54C 598)
***************************************************************************/ ***************************************************************************/
@ -109,7 +110,6 @@ public:
// handlers // handlers
WRITE8_MEMBER(ktopgun_state::input_w) WRITE8_MEMBER(ktopgun_state::input_w)
{ {
// S1-S3: input mux // S1-S3: input mux
@ -123,7 +123,6 @@ READ8_MEMBER(ktopgun_state::input_r)
} }
// config // config
static INPUT_PORTS_START( ktopgun ) 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_START( ktopgun )
ROM_REGION( 0x1000, "maincpu", 0 ) 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_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 */ /* 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_NOT_WORKING )
CONS( 1982, gnwmndon, 0, 0, gnwmndon, gnwmndon, driver_device, 0, "Nintendo", "Game & Watch: Mickey & Donald", GAME_SUPPORTS_SAVE | GAME_NOT_WORKING )