From 80300e5cc636d22ab53d4b5765d8f17533d617b1 Mon Sep 17 00:00:00 2001 From: hap Date: Thu, 7 Apr 2016 20:45:38 +0200 Subject: [PATCH] sm500: added disasm --- src/devices/cpu/sm510/sm500core.cpp | 4 +- src/devices/cpu/sm510/sm510d.cpp | 94 ++++++++++++++++++++++++++--- src/tools/unidasm.cpp | 4 ++ 3 files changed, 90 insertions(+), 12 deletions(-) diff --git a/src/devices/cpu/sm510/sm500core.cpp b/src/devices/cpu/sm510/sm500core.cpp index 4ea9af383fd..6b2a1a33e69 100644 --- a/src/devices/cpu/sm510/sm500core.cpp +++ b/src/devices/cpu/sm510/sm500core.cpp @@ -33,6 +33,6 @@ sm500_device::sm500_device(const machine_config &mconfig, const char *tag, devic // disasm offs_t sm500_device::disasm_disassemble(char *buffer, offs_t pc, const UINT8 *oprom, const UINT8 *opram, UINT32 options) { - extern CPU_DISASSEMBLE(sm510); - return CPU_DISASSEMBLE_NAME(sm510)(this, buffer, pc, oprom, opram, options); + extern CPU_DISASSEMBLE(sm500); + return CPU_DISASSEMBLE_NAME(sm500)(this, buffer, pc, oprom, opram, options); } diff --git a/src/devices/cpu/sm510/sm510d.cpp b/src/devices/cpu/sm510/sm510d.cpp index 2ab48984ee0..49a5b74a39d 100644 --- a/src/devices/cpu/sm510/sm510d.cpp +++ b/src/devices/cpu/sm510/sm510d.cpp @@ -2,7 +2,7 @@ // copyright-holders:hap /* - Sharp SM510 MCU family disassembler + Sharp SM510/SM500 MCU family disassembler */ @@ -15,7 +15,8 @@ enum e_mnemonics { - mILL, mEXT, + // SM510 common + mILL /* 0! */, mEXT, mLB, mLBL, mSBM, mEXBLA, mINCB, mDECB, mATPL, mRTN0, mRTN1, mTL, mTML, mTM, mT, mEXC, mBDC, mEXCI, mEXCD, mLDA, mLAX, mPTW, mWR, mWS, @@ -24,7 +25,16 @@ enum e_mnemonics mTB, mTC, mTAM, mTMI, mTA0, mTABL, mTIS, mTAL, mTF1, mTF4, mRM, mSM, mPRE, mSME, mRME, mTMEL, - mSKIP, mCEND, mIDIV + mSKIP, mCEND, mIDIV, mDR, mDTA, + + // SM500-specific + mCOMCB, mRTN, mRTNS, mSSR, mTR, mTRS, + mADDC, mPDTW, mTW, mDTW, + mATS, mEXKSA, mEXKFA, + mRMF, mSMF, mCOMCN, + mTA, mTG + + // KB1013VK1-2 aliases }; static const char *const s_mnemonics[] = @@ -38,7 +48,14 @@ static const char *const s_mnemonics[] = "TB", "TC", "TAM", "TMI", "TA0", "TABL", "TIS", "TAL", "TF1", "TF4", "RM", "SM", "PRE", "SME", "RME", "TMEL", - "SKIP", "CEND", "IDIV" + "SKIP", "CEND", "IDIV", "DR", "DTA", + + // + "COMCB", "RTN", "RTNS", "SSR", "TR", "TRS", + "ADDC", "PDTW", "TW", "DTW", + "ATS", "EXKSA", "EXKFA", + "RMF", "SMF", "COMCN", + "TA", "TG" }; // number of bits per opcode parameter, 8 or larger means 2-byte opcode @@ -53,7 +70,14 @@ static const UINT8 s_bits[] = 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, 2, 2, 8, 0, 0, 0, - 0, 0, 0 + 0, 0, 0, 0, 0, + + // + 0, 0, 0, 4, 6, 6, + 0, 0, 0, 0, + 0, 0, 0, + 0, 0, 0, + 0, 0 }; #define _OVER DASMFLAG_STEP_OVER @@ -70,7 +94,14 @@ static const UINT32 s_flags[] = 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, _OVER, 0 + 0, _OVER, 0, 0, 0, + + // + 0, _OUT, _OUT, 0, 0, _OVER, + 0, 0, 0, 0, + 0, 0, 0, + 0, 0, 0, + 0, 0 }; // next program counter in sequence (relative) @@ -178,14 +209,14 @@ CPU_DISASSEMBLE(sm510) 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 + mROT, mDTA, 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 + mKTA, mTB, mTC, mTAM, mTMI, mTMI, mTMI, mTMI, mTIS, mATL, mTA0, mTABL, mATX, mCEND, mTAL, mLBL, // 5 + mEXT, mPRE, mWR, mWS, mINCB, mDR, 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 @@ -201,7 +232,7 @@ static const UINT8 sm511_mnemonic[0x100] = static const UINT8 sm511_extended[0x10] = { - mRME, mSME, mTMEL, mATFC, mBDC, mATBP, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // 60 3 + mRME, mSME, mTMEL, mATFC, mBDC, mATBP, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 // 60 3 }; CPU_DISASSEMBLE(sm511) @@ -213,3 +244,46 @@ CPU_DISASSEMBLE(sm511) return sm510_common_disasm(sm511_mnemonic, ext, buffer, pc, oprom, opram); } + + +// SM500 disasm + +static const UINT8 sm500_mnemonic[0x100] = +{ +/* 0 1 2 3 4 5 6 7 8 9 A B C D E F */ + + mSKIP, mATR, mEXKSA,mATBP, mRM, mRM, mRM, mRM, mADD, mADDC, 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 + mATS, 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 + mTA, mTB, mTC, mTAM, mTM, mTM, mTM, mTM, mTG, mPTW, mTA0, mTABL, mTW, mDTW, mEXT, mLBL, // 5 + mCOMCN,mPDTW, mWR, mWS, mINCB, mIDIV, mRC, mSC, mRMF, mSMF, mKTA, mEXKFA,mDECB, mCOMCB,mRTN, mRTNS, // 6 + mSSR, mSSR, mSSR, mSSR, mSSR, mSSR, mSSR, mSSR, mSSR, mSSR, mSSR, mSSR, mSSR, mSSR, mSSR, mSSR, // 7 + + mTR, mTR, mTR, mTR, mTR, mTR, mTR, mTR, mTR, mTR, mTR, mTR, mTR, mTR, mTR, mTR, // 8 + mTR, mTR, mTR, mTR, mTR, mTR, mTR, mTR, mTR, mTR, mTR, mTR, mTR, mTR, mTR, mTR, // 9 + mTR, mTR, mTR, mTR, mTR, mTR, mTR, mTR, mTR, mTR, mTR, mTR, mTR, mTR, mTR, mTR, // A + mTR, mTR, mTR, mTR, mTR, mTR, mTR, mTR, mTR, mTR, mTR, mTR, mTR, mTR, mTR, mTR, // B + + mTRS, mTRS, mTRS, mTRS, mTRS, mTRS, mTRS, mTRS, mTRS, mTRS, mTRS, mTRS, mTRS, mTRS, mTRS, mTRS, // C + mTRS, mTRS, mTRS, mTRS, mTRS, mTRS, mTRS, mTRS, mTRS, mTRS, mTRS, mTRS, mTRS, mTRS, mTRS, mTRS, // D + mTRS, mTRS, mTRS, mTRS, mTRS, mTRS, mTRS, mTRS, mTRS, mTRS, mTRS, mTRS, mTRS, mTRS, mTRS, mTRS, // E + mTRS, mTRS, mTRS, mTRS, mTRS, mTRS, mTRS, mTRS, mTRS, mTRS, mTRS, mTRS, mTRS, mTRS, mTRS, mTRS // F +}; + +static const UINT8 sm500_extended[0x10] = +{ + mCEND, 0, 0, 0, mDTA, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 // 5E 0 +}; + +CPU_DISASSEMBLE(sm500) +{ + // create extended opcode table + UINT8 ext[0x100]; + memset(ext, 0, 0x100); + memcpy(ext + 0x00, sm500_extended, 0x10); + + return sm510_common_disasm(sm500_mnemonic, ext, buffer, pc, oprom, opram); +} diff --git a/src/tools/unidasm.cpp b/src/tools/unidasm.cpp index 59cce01ad29..05f622aa45a 100644 --- a/src/tools/unidasm.cpp +++ b/src/tools/unidasm.cpp @@ -158,7 +158,9 @@ CPU_DISASSEMBLE( sh2 ); CPU_DISASSEMBLE( sh4 ); CPU_DISASSEMBLE( sh4be ); CPU_DISASSEMBLE( sharc ); +CPU_DISASSEMBLE( sm500 ); CPU_DISASSEMBLE( sm510 ); +CPU_DISASSEMBLE( sm511 ); CPU_DISASSEMBLE( sm8500 ); CPU_DISASSEMBLE( spc700 ); CPU_DISASSEMBLE( ssem ); @@ -311,7 +313,9 @@ static const dasm_table_entry dasm_table[] = { "sh4", _16le, 0, CPU_DISASSEMBLE_NAME(sh4) }, { "sh4be", _16be, 0, CPU_DISASSEMBLE_NAME(sh4be) }, { "sharc", _48le, -2, CPU_DISASSEMBLE_NAME(sharc) }, + { "sm500", _8bit, 0, CPU_DISASSEMBLE_NAME(sm500) }, { "sm510", _8bit, 0, CPU_DISASSEMBLE_NAME(sm510) }, + { "sm511", _8bit, 0, CPU_DISASSEMBLE_NAME(sm511) }, { "sm8500", _8bit, 0, CPU_DISASSEMBLE_NAME(sm8500) }, { "spc700", _8bit, 0, CPU_DISASSEMBLE_NAME(spc700) }, { "ssem", _32le, 0, CPU_DISASSEMBLE_NAME(ssem) },