--- nono/debugger/debugger_m88xx0.cpp 2026/04/29 17:04:40 1.1.1.4 +++ nono/debugger/debugger_m88xx0.cpp 2026/04/29 17:04:48 1.1.1.6 @@ -9,7 +9,6 @@ #include "debugger_m88xx0.h" #include "m88100disasm.h" #include "m88100acc.h" -#include "mystring.h" // newval が oldval から変化していれば太字属性にするマクロ #define TSBOLD(newval, oldval) (((newval) != (oldval)) ? TA::Em : TA::Off) @@ -22,7 +21,7 @@ // コンストラクタ DebuggerMD_m88xx0::DebuggerMD_m88xx0(Debugger *parent_, m88kcpu *cpu_) - : inherited(parent_) + : inherited(parent_, Debugger::Arch::M88xx0) { cpu = cpu_; @@ -31,10 +30,6 @@ DebuggerMD_m88xx0::DebuggerMD_m88xx0(Deb inst_bytes = 4; inst_bytes_fixed = 4; - // 奇数にしておくことで初回に必ずアドレス変換を起こさせる。 - last_lpage[0].addr = 0xffffffff; - last_lpage[1].addr = 0xffffffff; - cmp_rd = -1; } @@ -53,37 +48,18 @@ DebuggerMD_m88xx0::MMUEnabled() const // アドレス変換 uint64 -DebuggerMD_m88xx0::TranslateAddr(saddr_t laddr) +DebuggerMD_m88xx0::TranslateAddr(saddr_t laddr, bool lookup) const { - uint64 paddr; - int isdata; m88200 *cmmu; // XXX とりあえずね - isdata = (laddr.data) ? 1 : 0; - if (isdata == 0) { + if (laddr.IsData() == false) { cmmu = &cpu->cmmu[0]; } else { cmmu = &cpu->cmmu[1]; } - // ページ境界(と初回)でアドレス変換 - saddr_t lpage; - lpage.addr = laddr.addr & 0xfffff000; - lpage.super = laddr.super; - if (lpage.GetSaddr() != last_lpage[isdata].GetSaddr()) { - last_lpage[isdata] = lpage; - - bool do_search = laddr.IsSearch(); - paddr = cmmu->TranslatePeek(laddr.addr, laddr.super, do_search); - if ((int64)paddr < 0) { - last_lpage[isdata].addr = 0xffffffff; - } - last_ppage[isdata] = paddr & 0xfffff000; - } else { - paddr = last_ppage[isdata] | (laddr.addr & 0x00000fff); - } - return paddr; + return cmmu->TranslatePeek((uint32)laddr, laddr.IsSuper(), lookup); } // op が bb0 命令なら true を返す @@ -148,8 +124,10 @@ DebuggerMD_m88xx0::IsStepOut() const // この命令がステップイン出来るなら true を返す bool -DebuggerMD_m88xx0::IsOpStepIn(uint32 op) +DebuggerMD_m88xx0::IsOpStepIn(DebuggerMemoryStream& mem) { + uint32 op = mem.FetchInst(); + if ((op & 0xf800'0000) == 0xc800'0000 // bsr || IsTB0(op) // tb0 || (IsTB1(op) && ((op >> 16) & 0x1f) != 0) // tb1 (except r0) @@ -221,7 +199,7 @@ DebuggerMD_m88xx0::GetRegAddr(const char // レジスタ表示系コマンドのヘルプ /*static*/ const HelpMessages -DebuggerMD_m88xx0::HelpMsgRegister = { +DebuggerMD_m88xx0::HelpListReg = { { "r", "Show general registers" }, { "rc", "Show (integer) control registers" }, { "rf", "Show floating point control registers" }, @@ -231,10 +209,80 @@ DebuggerMD_m88xx0::HelpMsgRegister = { { "rm", "Show CMMU registers" }, }; +/*static*/ const HelpMessages +DebuggerMD_m88xx0::HelpReg = { + //----- + { "r", R"**( + Command: r + + Shows general registers. + )**" }, + + //----- + { "rc", R"**( + Command: rc + + Shows the (integer) control registers. + )**" }, + + //----- + { "rf", R"**( + Command: rf + + Shows the floating point control registers. + )**" }, + + //----- + { "ro", R"**( + Command: ro + + Shows the other registers. + )**" }, + + //----- + { "ra", R"**( + Command: ra := 7, 6 + + Shows BATC/PATC on CMMU. + CMMU7 is instruction CMMU of CPU#0. + CMMU6 is data CMMU of CPU#0. + )**" }, + { "ra6", "=ra" }, + { "ra7", "=ra" }, + + //----- + { "rd", R"**( + Command: rd := 7, 6 + + Shows data cache on CMMU. + CMMU7 is instruction CMMU of CPU#0. + CMMU6 is data CMMU of CPU#0. + )**" }, + { "rd6", "=rd" }, + { "rd7", "=rd" }, + + //----- + { "rm", R"**( + Command: rm := 7, 6 + + Shows CMMU registers. + CMMU7 is instruction CMMU of CPU#0. + CMMU6 is data CMMU of CPU#0. + )**" }, + { "rm6", "=rm" }, + { "rm7", "=rm" }, +}; + +const HelpMessages& +DebuggerMD_m88xx0::GetHelpListReg() const +{ + return HelpListReg; +} + const HelpMessages& -DebuggerMD_m88xx0::GetRegisterHelp() const +DebuggerMD_m88xx0::GetHelpReg() const { - return HelpMsgRegister; + return HelpReg; } // レジスタ表示系コマンド @@ -594,11 +642,11 @@ dmt0(cr14):0000(B, ,D,L,Rxx,S,LLLL,W,V) // 逆アセンブル bool -DebuggerMD_m88xx0::Disassemble(saddr_t laddr, +DebuggerMD_m88xx0::Disassemble(DebuggerMemoryStream& mem, std::string& mnemonic, std::vector& bin) { - m88100disasm dis(this); - if (dis.Exec(laddr) == false) { + m88100disasm dis(mem); + if (dis.Exec() == false) { return false; } mnemonic = dis.text;