|
|
1.1 ! root 1: // ! 2: // nono ! 3: // Copyright (C) 2017 [email protected] ! 4: // ! 5: ! 6: #pragma once ! 7: ! 8: #include <string> ! 9: #include <vector> ! 10: ! 11: class m68kcpu; ! 12: ! 13: // 逆アセンブル ! 14: class Disasm ! 15: { ! 16: public: ! 17: Disasm(); ! 18: virtual ~Disasm(); ! 19: ! 20: // 逆アセンブル文字列を返す (物理アクセス) ! 21: std::string Disassemble(uint32 paddr) { ! 22: return Disassemble(paddr, paddr); ! 23: } ! 24: // ダンプ付きの逆アセンブル文字列を返す (物理アクセス) ! 25: std::string DisassembleWithDump(uint32 paddr) { ! 26: return DisassembleWithDump(paddr, paddr); ! 27: } ! 28: ! 29: // 逆アセンブル文字列を返す (論理アクセス) ! 30: std::string Disassemble(uint32 laddr, uint32 paddr); ! 31: // ダンプ付きの逆アセンブル文字列を返す (論理アクセス) ! 32: std::string DisassembleWithDump(uint32 laddr, uint32 paddr); ! 33: ! 34: // 次の開始アドレスを取得する ! 35: uint32 GetNextAddr() const { return pc; } ! 36: // 今処理した命令のバイト数を取得する ! 37: uint32 GetLength() const { return pc - pc0; } ! 38: ! 39: private: ! 40: uint32 pc = 0; // 現在の PC (論理アドレス) ! 41: uint32 pc0 = 0; // 命令先頭 (論理アドレス) ! 42: uint32 phys_pc = 0; // pc に対応する物理アドレス ! 43: ! 44: enum Reg { ! 45: CCR, ! 46: SR, ! 47: PC, ! 48: USP, ! 49: ! 50: MSP, ! 51: ISP, ! 52: VBR, ! 53: SFC, ! 54: DFC, ! 55: CACR, ! 56: CAAR, ! 57: ! 58: TC, ! 59: MMUSR, ! 60: SRP, ! 61: CRP, ! 62: TT0, ! 63: TT1, ! 64: ! 65: FPCR, ! 66: FPSR, ! 67: FPIAR, ! 68: ! 69: URP, ! 70: ITT0, ! 71: ITT1, ! 72: DTT0, ! 73: DTT1, ! 74: }; ! 75: ! 76: // L/S/X/P/W/D/B/(Pk) は FMOVE <ea>,FPn の時の並び順。 ! 77: enum Size { ! 78: L = 0, // Long ! 79: S, // Single ! 80: X, // eXtended ! 81: P, // Packed ! 82: W, // Word ! 83: D, // Double ! 84: B, // Byte ! 85: Pk, // Packed with dynamic k-factor ! 86: Q, // Quad ! 87: None, ! 88: }; ! 89: ! 90: virtual uint32 fetch16(); ! 91: virtual uint32 peek16(); // PC を進めずワードを取得 (IOCSコール用) ! 92: uint32 fetch32(); ! 93: ! 94: // 1行逆アセンブル前の初期化 ! 95: void init(); ! 96: ! 97: std::string make_reg(Reg); ! 98: ! 99: std::string hex8(uint32); ! 100: std::string hex16(uint32); ! 101: std::string hex32(uint32); ! 102: std::string shex8(uint32); ! 103: std::string shex16(uint32); ! 104: std::string shex32(uint32); ! 105: std::string make_ea(); ! 106: std::string make_ea(uint); ! 107: std::string make_eaix(std::string basereg); ! 108: ! 109: std::string addr16(uint32 addr); // addr をワードアドレスとして ! 110: std::string addr32(uint32 addr); // addr をロングワードアドレスとして ! 111: std::string addr16(); // フェッチした値をワードアドレスとして ! 112: std::string addr32(); // フェッチした値をロングワードアドレスとして ! 113: std::string disp16(); // フェッチしたワードディスプレースメント ! 114: std::string disp32(); // フェッチしたロングワードディスプレースメント ! 115: std::string imm8(); ! 116: std::string imm16(); ! 117: std::string imm32(); ! 118: std::string make_dn(uint); ! 119: std::string make_an(uint); ! 120: std::string make_rn(uint); ! 121: std::string make_anin(uint); ! 122: std::string make_anpd(uint); ! 123: std::string make_anpi(uint); ! 124: std::string make_q8(); ! 125: std::string make_reglist(); ! 126: void make_reglist_half(std::string& s, const char *reg, uint16 mask); ! 127: std::string make_bf(); ! 128: std::string make_fc(); ! 129: std::string make_movec(); ! 130: std::string make_fpgen(); ! 131: std::string make_fpn(uint n); ! 132: std::string make_fpcc(uint16 ir); ! 133: uint make_fpctls(std::string& s); ! 134: std::string make_fpnlist(); ! 135: ! 136: static const char * const reg_names[]; ! 137: static const char * const size_str[]; ! 138: static const char * const conditions[]; ! 139: static const char * const fpconditions[]; ! 140: static const char * const btst_names[]; ! 141: static const char * const fpgen_names[0x3b]; ! 142: static const char * const fmovecr_text[]; ! 143: static const char * const x68k_doscall[256]; ! 144: static const char * const x68k_fpcall[256]; ! 145: static const char * const x68k_iocscall[256]; ! 146: void ops_cmp2chk2(Size sz); ! 147: void ops_btst_movep(); ! 148: void ops_cas(Size sz); ! 149: void ops_cas2(Size sz); ! 150: void ops_moves(Size sz); ! 151: void ops_movep(); ! 152: void ops_btst_imm_ea(); ! 153: void ops_move(Size sz); ! 154: void ops_movem_ext(Size sz); ! 155: void ops_scc(); ! 156: void ops_bcc(); ! 157: void ops_sub(Size sz); ! 158: void ops_add(Size sz); ! 159: void ops_eor_cmpm(Size sz); ! 160: void ops_rotate(std::string dir, Size sz); ! 161: void ops_pmove(Reg reg, Size sz); ! 162: void ops_fpgen_fpn_fpn(); ! 163: void ops_fpgen_ea_fpn(); ! 164: void ops_fmovecr(); ! 165: void ops_fmove_fpn_ea(); ! 166: void ops_fmovem_ea_ctl(); ! 167: void ops_fmovem_ctl_ea(); ! 168: void ops_fmovem_ea_fpn(); ! 169: void ops_fmovem_fpn_ea(); ! 170: ! 171: std::vector<uint16> ir {}; ! 172: ! 173: std::string name; ! 174: Size size {}; ! 175: std::string src; ! 176: std::string dst; ! 177: ! 178: #define OP_PROTO(name) void __CONCAT(op_,name)() ! 179: #define OP_DEF(name) void __CONCAT(Disasm::op_,name)() ! 180: #define OP_FUNC(name) __CONCAT(op_,name)() ! 181: #include "m68030ops.h" ! 182: };
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.