diff options
Diffstat (limited to 'src/devices/cpu/mn1400/mn1400d.cpp')
-rw-r--r-- | src/devices/cpu/mn1400/mn1400d.cpp | 135 |
1 files changed, 135 insertions, 0 deletions
diff --git a/src/devices/cpu/mn1400/mn1400d.cpp b/src/devices/cpu/mn1400/mn1400d.cpp new file mode 100644 index 00000000000..ae22889279c --- /dev/null +++ b/src/devices/cpu/mn1400/mn1400d.cpp @@ -0,0 +1,135 @@ +// license:BSD-3-Clause +// copyright-holders:hap +/* + + Matsushita (Panasonic) MN1400 MCU family disassembler + +*/ + +#include "emu.h" +#include "mn1400d.h" + + +// common lookup tables + +enum mn1400_disassembler::e_mnemonics : unsigned +{ + mILL, mILL2, + mL, mLD, mLI, mLIC, mLDC, mST, mSTD, mSTIC, mSTDC, + mLX, mLY, mTAX, mTAY, mTYA, mTACU, mTACL, mTCAU, mTCAL, + mNOP, mAND, mANDI, mOR, mXOR, mA, mAI, mCPL, mC, mCI, mCY, + mSL, mICY, mDCY, mICM, mDCM, mSM, mRM, mTB, + mINA, mINB, mOTD, mOTMD, mOTE, mOTIE, mRCO, mSCO, mCCO, + mRC, mRP, mSC, mSP, + mBS0, mBS1, mBS01, mBSN0, mBSN1, mBSN01, + mBP, mBC, mBZ, mBPC, mBPZ, mBCZ, mBPCZ, + mBNP, mBNC, mBNZ, mBNPC, mBNPZ, mBNCZ, mBNPCZ, + mJMP, mCAL, mRET, mEC, mDC +}; + +const char *const mn1400_disassembler::s_mnemonics[] = +{ + "?", "?", + "L", "LD", "LI", "LIC", "LDC", "ST", "STD", "STIC", "STDC", + "LX", "LY", "TAX", "TAY", "TYA", "TACU", "TACL", "TCAU", "TCAL", + "NOP", "AND", "ANDI", "OR", "XOR", "A", "AI", "CPL", "C", "CI", "CY", + "SL", "ICY", "DCY", "ICM", "DCM", "SM", "RM", "TB", + "INA", "INB", "OTD", "OTMD", "OTE", "OTIE", "RCO", "SCO", "CCO", + "RC", "RP", "SC", "SP", + "BS0", "BS1", "BS01", "BSN0", "BSN1", "BSN01", + "BP", "BC", "BZ", "BPC", "BPZ", "BCZ", "BPCZ", + "BNP", "BNC", "BNZ", "BNPC", "BNPZ", "BNCZ", "BNPCZ", + "JMP", "CAL", "RET", "EC", "DC" +}; + +// number of bits per opcode parameter +const u8 mn1400_disassembler::s_bits[] = +{ + 0, 8, + 0, 2, 4, 0, 0, 0, 2, 0, 0, + 3, 4, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 4, 0, 0, 0, 4, 0, 0, 4, 4, + 0, 0, 0, 0, 0, 4, 4, 4, + 0, 0, 0, 0, 0, 4, 0, 0, 0, + 0, 0, 0, 0, + 8, 8, 8, 8, 8, 8, + 8, 8, 8, 8, 8, 8, 8, + 8, 8, 8, 8, 8, 8, 8, + 11, 11, 0, 0, 0 +}; + +const u32 mn1400_disassembler::s_flags[] = +{ + 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, 0, 0, 0, + 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, + 0, STEP_OVER, STEP_OUT, 0, 0 +}; + + +const u8 mn1400_disassembler::mn1400_mnemonic[0x100] = +{ +// 0 1 2 3 4 5 6 7 8 9 A B C D E F + mNOP, mTAX, mTYA, mTAY, mAND, mOR, mXOR, mA, mCPL, mC, mST, mSTIC, mSTDC, mL, mLIC, mLDC, // 0 + mOTE, mOTMD, mOTD, mCCO, mINA, mINB, mRCO, mSCO, mTACL, mTACU, mTCAL, mTCAU, mDC, mEC, mSL, mRET, // 1 + mLD, mLD, mLD, mLD, mSTD, mSTD, mSTD, mSTD, mRC, mRP, mSC, mSP, mICY, mDCY, mICM, mDCM, // 2 + mLX, mLX, mLX, mLX, mLX, mLX, mLX, mLX, 1, 1, mBSN0, mBS0, mBSN1, mBS1, mBSN01,mBS01, // 3 + + mJMP, mJMP, mJMP, mJMP, mJMP, mJMP, mJMP, mJMP, mCAL, mCAL, mCAL, mCAL, mCAL, mCAL, mCAL, mCAL, // 4 + mLI, mLI, mLI, mLI, mLI, mLI, mLI, mLI, mLI, mLI, mLI, mLI, mLI, mLI, mLI, mLI, // 5 + mLY, mLY, mLY, mLY, mLY, mLY, mLY, mLY, mLY, mLY, mLY, mLY, mLY, mLY, mLY, mLY, // 6 + mANDI, mANDI, mANDI, mANDI, mANDI, mANDI, mANDI, mANDI, mANDI, mANDI, mANDI, mANDI, mANDI, mANDI, mANDI, mANDI, // 7 + + mAI, mAI, mAI, mAI, mAI, mAI, mAI, mAI, mAI, mAI, mAI, mAI, mAI, mAI, mAI, mAI, // 8 + mCI, mCI, mCI, mCI, mCI, mCI, mCI, mCI, mCI, mCI, mCI, mCI, mCI, mCI, mCI, mCI, // 9 + mCY, mCY, mCY, mCY, mCY, mCY, mCY, mCY, mCY, mCY, mCY, mCY, mCY, mCY, mCY, mCY, // A + mSM, mSM, mSM, mSM, mSM, mSM, mSM, mSM, mSM, mSM, mSM, mSM, mSM, mSM, mSM, mSM, // B + + mRM, mRM, mRM, mRM, mRM, mRM, mRM, mRM, mRM, mRM, mRM, mRM, mRM, mRM, mRM, mRM, // C + mTB, mTB, mTB, mTB, mTB, mTB, mTB, mTB, mTB, mTB, mTB, mTB, mTB, mTB, mTB, mTB, // D + 1, 1, mBNZ, mBZ, mBNC, mBC, mBNCZ, mBCZ, mBNP, mBP, mBNPZ, mBPZ, mBNPC, mBPC, mBNPCZ,mBPCZ, // E + mOTIE, mOTIE, mOTIE, mOTIE, mOTIE, mOTIE, mOTIE, mOTIE, mOTIE, mOTIE, mOTIE, mOTIE, mOTIE, mOTIE, mOTIE, mOTIE // F +}; + + +// disasm + +offs_t mn1400_disassembler::disassemble(std::ostream &stream, offs_t pc, const data_buffer &opcodes, const data_buffer ¶ms) +{ + offs_t pos = pc; + u8 op = opcodes.r8(pos++); + u8 instr = mn1400_mnemonic[op]; + u8 bits = s_bits[instr]; + + util::stream_format(stream,"%-8s", s_mnemonics[instr]); + + // opcode parameter + if (bits != 0) + { + if (bits >= 8) + { + u16 param = opcodes.r8(pos++); + if (bits > 8) + param |= (op & ((1 << (bits - 8)) - 1)) << 8; + else + param |= pc & 0x700; + + if (instr > 1) + util::stream_format(stream, "$%03X", param); + } + else + { + u8 param = op & ((1 << bits) - 1); + util::stream_format(stream, "%d", param); + } + } + + return (pos - pc) | s_flags[instr] | SUPPORTED; +} |