--- nono/m88xx0/m88100disasm.cpp 2026/04/29 17:04:41 1.1.1.3 +++ nono/m88xx0/m88100disasm.cpp 2026/04/29 17:04:52 1.1.1.6 @@ -7,14 +7,13 @@ #include "m88100disasm.h" #include "m88100acc.h" #include "bus.h" -#include "mystring.h" #define OP_DEF(name) void __CONCAT(m88100disasm::op_,name)() #define OP_FUNC(name) __CONCAT(op_,name)() // コンストラクタ -m88100disasm::m88100disasm(DebuggerMD *md_) - : inherited(md_) +m88100disasm::m88100disasm(DebuggerMemoryStream& mem_) + : inherited(mem_) { } @@ -25,7 +24,7 @@ m88100disasm::~m88100disasm() // 逆アセンブルを実行 bool -m88100disasm::Exec(saddr_t laddr) +m88100disasm::Exec() { ExecInit(); @@ -35,10 +34,10 @@ m88100disasm::Exec(saddr_t laddr) arg1.clear(); arg2.clear(); - xip = laddr.addr; + xip = (uint32)mem.laddr; - opX = peek(laddr); - uint32 op12 = ((opX >> 20) & 0x0fc0) | ((opX >> 10) & 0x003f); + opX = mem.FetchInst(); + uint32 op12 = m88kcpu::op32_to_12(opX); switch (op12) { #include "m88100switch.inc" default: @@ -69,7 +68,7 @@ m88100disasm::Exec(saddr_t laddr) if (!arg1.empty()) { if (!args.empty()) { args += ","; - while (args.length() < 4) + while (args.length() % 4 != 0) args += " "; } args += arg1; @@ -77,7 +76,7 @@ m88100disasm::Exec(saddr_t laddr) if (!arg2.empty()) { if (!args.empty()) { args += ","; - while (args.length() < 8) + while (args.length() % 4 != 0) args += " "; } args += arg2; @@ -96,13 +95,6 @@ m88100disasm::Exec(saddr_t laddr) return true; } -// ピーク (IP を進めずワードを取得する) -uint32 -m88100disasm::peek(const saddr_t& laddr) -{ - return md->PeekFetch(laddr); -} - // フィールド部品 #define B5 ((opX >> 21) & 0x1f) #define M5 ((opX >> 21) & 0x1f) @@ -142,6 +134,12 @@ m88100disasm::d16() return string_format("0x%08x", xip + D16); } +std::string +m88100disasm::d26() +{ + return string_format("0x%08x", xip + D26); +} + // 制御レジスタ名 std::string m88100disasm::crs() @@ -269,148 +267,111 @@ m88100disasm::op_unimpl() name = "unimplemented"; } -// 000000_DDDDDSSSSS_nnnnnn_nnnnnnnnnn -OP_DEF(xmem_bu_imm) +// ld_imm, st_imm, xmem_imm の共通部 +// namebase にはサイズプレフィックスを含む。 +void +m88100disasm::ops_ldst_imm(const std::string& namebase) { - name = "xmem.bu"; + name = namebase; arg0 = rd(); arg1 = rs1(); arg2 = imm16(); } +// 000000_DDDDDSSSSS_nnnnnn_nnnnnnnnnn +OP_DEF(xmem_bu_imm) +{ + ops_ldst_imm("xmem.bu"); +} + // 000001_DDDDDSSSSS_nnnnnn_nnnnnnnnnn OP_DEF(xmem_w_imm) { - name = "xmem"; - arg0 = rd(); - arg1 = rs1(); - arg2 = imm16(); + ops_ldst_imm("xmem"); } // 000010_DDDDDSSSSS_nnnnnn_nnnnnnnnnn OP_DEF(ld_hu_imm) { - name = "ld.hu"; - arg0 = rd(); - arg1 = rs1(); - arg2 = imm16(); + ops_ldst_imm("ld.hu"); } // 000011_DDDDDSSSSS_nnnnnn_nnnnnnnnnn OP_DEF(ld_bu_imm) { - name = "ld.bu"; - arg0 = rd(); - arg1 = rs1(); - arg2 = imm16(); + ops_ldst_imm("ld.bu"); } // 000100_DDDDDSSSSS_nnnnnn_nnnnnnnnnn OP_DEF(ld_d_imm) { - name = "ld.d"; - arg0 = rd(); - arg1 = rs1(); - arg2 = imm16(); + ops_ldst_imm("ld.d"); } // 000101_DDDDDSSSSS_nnnnnn_nnnnnnnnnn OP_DEF(ld_w_imm) { - name = "ld"; - arg0 = rd(); - arg1 = rs1(); - arg2 = imm16(); + ops_ldst_imm("ld"); } // 000110_DDDDDSSSSS_nnnnnn_nnnnnnnnnn OP_DEF(ld_h_imm) { - name = "ld.h"; - arg0 = rd(); - arg1 = rs1(); - arg2 = imm16(); + ops_ldst_imm("ld.h"); } // 000111_DDDDDSSSSS_nnnnnn_nnnnnnnnnn OP_DEF(ld_b_imm) { - name = "ld.b"; - arg0 = rd(); - arg1 = rs1(); - arg2 = imm16(); + ops_ldst_imm("ld.b"); } // 001000_DDDDDSSSSS_nnnnnn_nnnnnnnnnn OP_DEF(st_d_imm) { - name = "st.d"; - arg0 = rd(); - arg1 = rs1(); - arg2 = imm16(); + ops_ldst_imm("st.d"); } // 001001_DDDDDSSSSS_nnnnnn_nnnnnnnnnn OP_DEF(st_w_imm) { - name = "st"; - arg0 = rd(); - arg1 = rs1(); - arg2 = imm16(); + ops_ldst_imm("st"); } // 001010_DDDDDSSSSS_nnnnnn_nnnnnnnnnn OP_DEF(st_h_imm) { - name = "st.h"; - arg0 = rd(); - arg1 = rs1(); - arg2 = imm16(); + ops_ldst_imm("st.h"); } // 001011_DDDDDSSSSS_nnnnnn_nnnnnnnnnn OP_DEF(st_b_imm) { - name = "st.b"; - arg0 = rd(); - arg1 = rs1(); - arg2 = imm16(); + ops_ldst_imm("st.b"); } // 001100_DDDDDSSSSS_nnnnnn_nnnnnnnnnn OP_DEF(lda_d_imm) { - name = "lda.d"; - arg0 = rd(); - arg1 = rs1(); - arg2 = imm16(); + ops_ldst_imm("lda.d"); } // 001101_DDDDDSSSSS_nnnnnn_nnnnnnnnnn OP_DEF(lda_w_imm) { - name = "lda"; - arg0 = rd(); - arg1 = rs1(); - arg2 = imm16(); + ops_ldst_imm("lda"); } // 001110_DDDDDSSSSS_nnnnnn_nnnnnnnnnn OP_DEF(lda_h_imm) { - name = "lda.h"; - arg0 = rd(); - arg1 = rs1(); - arg2 = imm16(); + ops_ldst_imm("lda.h"); } // 001111_DDDDDSSSSS_nnnnnn_nnnnnnnnnn OP_DEF(lda_b_imm) { - name = "lda.b"; - arg0 = rd(); - arg1 = rs1(); - arg2 = imm16(); + ops_ldst_imm("lda.b"); } // 010000_DDDDDSSSSS_nnnnnn_nnnnnnnnnn @@ -716,28 +677,28 @@ OP_DEF(fdiv) OP_DEF(br) { name = "br"; - arg0 = string_format("%08x", xip + D26); + arg0 = d26(); } // 110001_nnnnnnnnnn_nnnnnn_nnnnnnnnnn OP_DEF(br_n) { name = "br.n"; - arg0 = string_format("%08x", xip + D26); + arg0 = d26(); } // 110010_nnnnnnnnnn_nnnnnn_nnnnnnnnnn OP_DEF(bsr) { name = "bsr"; - arg0 = string_format("%08x", xip + D26); + arg0 = d26(); } // 110011_nnnnnnnnnn_nnnnnn_nnnnnnnnnn OP_DEF(bsr_n) { name = "bsr.n"; - arg0 = string_format("%08x", xip + D26); + arg0 = d26(); } // bb の共通部