|
|
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.