trunk/src/emu/cpu/ucom4/ucom4d.c
| r243422 | r243423 | |
| 11 | 11 | #include "ucom4.h" |
| 12 | 12 | |
| 13 | 13 | |
| 14 | enum e_mnemonics |
| 15 | { |
| 16 | mLI, mL, mLM, mLDI, mLDZ, mS, mTAL, mTLA, |
| 17 | mX, mXI, mXD, mXM, mXMI, mXMD, mAD, mADC, mADS, mDAA, mDAS, |
| 18 | mEXL, mCLA, mCMA, mCIA, mCLC, mSTC, mTC, mINC, mDEC, mIND, mDED, |
| 19 | mRMB, mSMB, mREB, mSEB, mRPB, mSPB, mJMP, mJCP, mJPA, mCAL, mCZP, mRT, mRTS, |
| 20 | mCI, mCM, mCMB, mTAB, mCLI, mTMB, mTPA, mTPB, |
| 21 | mTIT, mIA, mIP, mOE, mOP, mOCD, mNOP, |
| 22 | mILL, |
| 23 | mTAW, mTAZ, mTHX, mTLY, mXAW, mXAZ, mXHR, mXHX, mXLS, mXLY, mXC, |
| 24 | mSFB, mRFB, mFBT, mFBF, mRAR, mINM, mDEM, mSTM, mTTM, mEI, mDI |
| 25 | }; |
| 26 | |
| 27 | static const char *const s_mnemonics[] = |
| 28 | { |
| 29 | "LI", "L", "LM", "LDI", "LDZ", "S", "TAL", "TLA", |
| 30 | "X", "XI", "XD", "XM", "XMI", "XMD", "AD", "ADC", "ADS", "DAA", "DAS", |
| 31 | "EXL", "CLA", "CMA", "CIA", "CLC", "STC", "TC", "INC", "DEC", "IND", "DED", |
| 32 | "RMB", "SMB", "REB", "SEB", "RPB", "SPB", "JMP", "JCP", "JPA", "CAL", "CZP", "RT", "RTS", |
| 33 | "CI", "CM", "CMB", "TAB", "CLI", "TMB", "TPA", "TPB", |
| 34 | "TIT", "IA", "IP", "OE", "OP", "OCD", "NOP", |
| 35 | "?", |
| 36 | "TAW", "TAZ", "THX", "TLY", "XAW", "XAZ", "XHR", "XHX", "XLS", "XLY", "XC", |
| 37 | "SFB", "RFB", "FBT", "FBF", "RAR", "INM", "DEM", "STM", "TTM", "EI", "DI" |
| 38 | }; |
| 39 | |
| 40 | // number of bits per opcode parameter, 2 digits means opcode is 2 bytes |
| 41 | static const UINT8 s_bits[] = |
| 42 | { |
| 43 | 4, 0, 2, 80, 4, 0, 0, 0, |
| 44 | 0, 0, 0, 2, 2, 2, 0, 0, 0, 0, 0, |
| 45 | 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, |
| 46 | 2, 2, 2, 2, 2, 2, 83, 6, 0, 83, 4, 0, 0, |
| 47 | 40, 0, 2, 2, 40, 2, 2, 2, |
| 48 | 0, 0, 0, 0, 0, 80, 0, |
| 49 | 0, |
| 50 | 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, |
| 51 | 2, 2, 2, 2, 0, 0, 0, 80, 0, 0, 0 |
| 52 | }; |
| 53 | |
| 54 | #define _OVER DASMFLAG_STEP_OVER |
| 55 | #define _OUT DASMFLAG_STEP_OUT |
| 56 | |
| 57 | static const UINT32 s_flags[] = |
| 58 | { |
| 59 | 0, 0, 0, 0, 0, 0, 0, 0, |
| 60 | 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, |
| 61 | 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, |
| 62 | 0, 0, 0, 0, 0, 0, 0, 0, 0, _OVER, _OVER, _OUT, _OUT, |
| 63 | 0, 0, 0, 0, 0, 0, 0, 0, |
| 64 | 0, 0, 0, 0, 0, 0, 0, |
| 65 | 0, |
| 66 | 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, |
| 67 | 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 |
| 68 | }; |
| 69 | |
| 70 | |
| 71 | static const UINT8 ucom4_mnemonic[0x100] = |
| 72 | { |
| 73 | /* 0x00 */ |
| 74 | mNOP, mDI, mS, mTIT, mTC, mTTM, mDAA, mTAL, |
| 75 | mAD, mADS, mDAS, mCLC, mCM, mINC, mOP, mDEC, |
| 76 | mCMA, mCIA, mTLA, mDED, mSTM, mLDI, mCLI, mCI, |
| 77 | mEXL, mADC, mXC, mSTC, mILL, mINM, mOCD, mDEM, |
| 78 | /* 0x20 */ |
| 79 | mFBF, mFBF, mFBF, mFBF, mTAB, mTAB, mTAB, mTAB, |
| 80 | mX, mXM, mXM, mXM, mXD, mXMD, mXMD, mXMD, |
| 81 | mRAR, mEI, mIP, mIND, mCMB, mCMB, mCMB, mCMB, |
| 82 | mL, mLM, mLM, mLM, mXI, mXMI, mXMI, mXMI, |
| 83 | /* 0x40 */ |
| 84 | mIA, mJPA, mTAZ, mTAW, mOE, mILL, mTLY, mTHX, |
| 85 | mRT, mRTS, mXAZ, mXAW, mXLS, mXHR, mXLY, mXHX, |
| 86 | mTPB, mTPB, mTPB, mTPB, mTPA, mTPA, mTPA, mTPA, |
| 87 | mTMB, mTMB, mTMB, mTMB, mFBT, mFBT, mFBT, mFBT, |
| 88 | /* 0x60 */ |
| 89 | mRPB, mRPB, mRPB, mRPB, mREB, mREB, mREB, mREB, |
| 90 | mRMB, mRMB, mRMB, mRMB, mRFB, mRFB, mRFB, mRFB, |
| 91 | mSPB, mSPB, mSPB, mSPB, mSEB, mSEB, mSEB, mSEB, |
| 92 | mSMB, mSMB, mSMB, mSMB, mSFB, mSFB, mSFB, mSFB, |
| 93 | /* 0x80 */ |
| 94 | mLDZ, mLDZ, mLDZ, mLDZ, mLDZ, mLDZ, mLDZ, mLDZ, |
| 95 | mLDZ, mLDZ, mLDZ, mLDZ, mLDZ, mLDZ, mLDZ, mLDZ, |
| 96 | mCLA, mLI, mLI, mLI, mLI, mLI, mLI, mLI, |
| 97 | mLI, mLI, mLI, mLI, mLI, mLI, mLI, mLI, |
| 98 | /* 0xa0 */ |
| 99 | mJMP, mJMP, mJMP, mJMP, mJMP, mJMP, mJMP, mJMP, |
| 100 | mCAL, mCAL, mCAL, mCAL, mCAL, mCAL, mCAL, mCAL, |
| 101 | mCZP, mCZP, mCZP, mCZP, mCZP, mCZP, mCZP, mCZP, |
| 102 | mCZP, mCZP, mCZP, mCZP, mCZP, mCZP, mCZP, mCZP, |
| 103 | /* 0xc0 */ |
| 104 | mJCP, mJCP, mJCP, mJCP, mJCP, mJCP, mJCP, mJCP, |
| 105 | mJCP, mJCP, mJCP, mJCP, mJCP, mJCP, mJCP, mJCP, |
| 106 | mJCP, mJCP, mJCP, mJCP, mJCP, mJCP, mJCP, mJCP, |
| 107 | mJCP, mJCP, mJCP, mJCP, mJCP, mJCP, mJCP, mJCP, |
| 108 | mJCP, mJCP, mJCP, mJCP, mJCP, mJCP, mJCP, mJCP, |
| 109 | mJCP, mJCP, mJCP, mJCP, mJCP, mJCP, mJCP, mJCP, |
| 110 | mJCP, mJCP, mJCP, mJCP, mJCP, mJCP, mJCP, mJCP, |
| 111 | mJCP, mJCP, mJCP, mJCP, mJCP, mJCP, mJCP, mJCP |
| 112 | }; |
| 113 | |
| 114 | |
| 115 | |
| 14 | 116 | CPU_DISASSEMBLE(ucom4) |
| 15 | 117 | { |
| 16 | | int pos = 1;//0; |
| 17 | | // UINT8 op = oprom[pos++]; |
| 18 | | // UINT8 instr = ucom4_mnemonic[op]; |
| 118 | int pos = 0; |
| 119 | UINT8 op = oprom[pos++]; |
| 120 | UINT8 instr = ucom4_mnemonic[op]; |
| 19 | 121 | |
| 20 | 122 | char *dst = buffer; |
| 21 | | dst += sprintf(dst, "ABC"); |
| 123 | dst += sprintf(dst, "%-4s ", s_mnemonics[instr]); |
| 124 | |
| 125 | // opcode parameter |
| 126 | int bits = s_bits[instr]; |
| 127 | if (bits) |
| 128 | { |
| 129 | UINT16 param = op & ((1 << (bits % 10)) - 1); |
| 130 | if (bits / 10) |
| 131 | { |
| 132 | UINT8 op2 = oprom[pos++]; |
| 133 | param = (param << (bits / 10)) | (op2 & ((1 << (bits / 10)) - 1)); |
| 134 | bits = (bits % 10) + (bits / 10); |
| 135 | } |
| 136 | |
| 137 | // special case for CZP |
| 138 | if (instr == mCZP) |
| 139 | { |
| 140 | param <<= 2; |
| 141 | bits += 2; |
| 142 | } |
| 22 | 143 | |
| 23 | | return pos | 0 | DASMFLAG_SUPPORTED; |
| 144 | if (bits <= 4) |
| 145 | dst += sprintf(dst, "%d", param); |
| 146 | else if (bits <= 8) |
| 147 | dst += sprintf(dst, "$%02X", param); |
| 148 | else |
| 149 | dst += sprintf(dst, "$%03X", param); |
| 150 | } |
| 151 | |
| 152 | return pos | s_flags[instr] | DASMFLAG_SUPPORTED; |
| 24 | 153 | } |