--- nono/debugger/debugger_m88xx0.cpp 2026/04/29 17:04:43 1.1.1.5 +++ nono/debugger/debugger_m88xx0.cpp 2026/04/29 17:05:09 1.1.1.9 @@ -4,12 +4,14 @@ // Licensed under nono-license.txt // -#include "console.h" +// +// デバッガ (M88xx0 依存部分) +// + #include "debugger_private.h" #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,12 +24,11 @@ // コンストラクタ DebuggerMD_m88xx0::DebuggerMD_m88xx0(Debugger *parent_, m88kcpu *cpu_) - : inherited(parent_, Debugger::Arch::M88xx0) + : inherited(parent_, Arch::M88xx0) { cpu = cpu_; // 機種依存変数 - vector_max = 512; inst_bytes = 4; inst_bytes_fixed = 4; @@ -288,7 +289,7 @@ DebuggerMD_m88xx0::GetHelpReg() const // レジスタ表示系コマンド bool -DebuggerMD_m88xx0::ShowRegister(Console *cons, +DebuggerMD_m88xx0::ShowRegister(FILE *cons, const std::vector& args) { int cmmu_id; @@ -296,42 +297,51 @@ DebuggerMD_m88xx0::ShowRegister(Console // 余分な引数は無視する? if (args[0] == "r") { - ShowRegMain(cons); + ShowRegMain(); return true; } if (args[0] == "rc") { - ShowRegCtrl(cons); + ShowRegCtrl(); return true; } if (args[0] == "rf") { - ShowRegFPU(cons); + ShowRegFPU(); return true; } if (args[0] == "ro") { - ShowRegOther(cons); + ShowRegOther(); return true; } if (MatchCMMUCmd(args[0], "ra", &cmmu_id)) { - parent->ShowMonitor(*gMPU88200ATC[7 - cmmu_id]); - return true; + Monitor *mon = gMonitorManager->Find(ID_MONITOR_ATC(cmmu_id)); + if (mon) { + parent->ShowMonitor(*mon); + return true; + } + goto notfound; } if (MatchCMMUCmd(args[0], "rd", &cmmu_id)) { - ShowRegCache(cons, args, cmmu_id); - return true; + return ShowRegCache(cons, args, cmmu_id); } if (MatchCMMUCmd(args[0], "rm", &cmmu_id)) { - ShowRegMMU(cons, cmmu_id); - return true; + Monitor *mon = gMonitorManager->Find(ID_MONITOR_CMMU(cmmu_id)); + if (mon) { + parent->ShowMonitor(*mon); + return true; + } + goto notfound; } // 該当なし + notfound: return false; } // CMMU ID 入りコマンド名を照合する。 // cmdname が basename + の時、*idp に id を格納して true を返す。 -// 一致しないか id が不正なら false を返す。 +// 一致しないか id が(数値でないなど)不正なら false を返す。 +// 実際にその id の CMMU が存在するかはここではチェックしない。 bool DebuggerMD_m88xx0::MatchCMMUCmd(const std::string& cmdname, const char *basename, int *idp) @@ -357,7 +367,7 @@ DebuggerMD_m88xx0::MatchCMMUCmd(const st } void -DebuggerMD_m88xx0::ShowRegMain(Console *cons) +DebuggerMD_m88xx0::ShowRegMain() { TextScreen s(80, 8); @@ -398,7 +408,7 @@ r2 :0070e1a0 r10:00000000 r18:00000000 } void -DebuggerMD_m88xx0::ShowRegCtrl(Console *cons) +DebuggerMD_m88xx0::ShowRegCtrl() { TextScreen s(80, 6); int x; @@ -500,65 +510,65 @@ fip:00000000 sfip(cr6 // CMMU のデータキャッシュを表示 // rd なら概要表示。 // rd なら個別セットの詳細表示。 -void -DebuggerMD_m88xx0::ShowRegCache(Console *cons, +// id を受け付ければ true を、そうでなければ false を返す。 +bool +DebuggerMD_m88xx0::ShowRegCache(FILE *cons, const std::vector& args, int id) { + m88200 *cmmu; + + // XXX id はまだ決め打ち + if (id == 7) { + cmmu = &cpu->cmmu[0]; + } else if (id == 6) { + cmmu = &cpu->cmmu[1]; + } else { + return false; + } + if (args.size() < 2) { - ShowRegCacheOverview(cons, id); + ShowRegCacheOverview(cmmu); } else { int set; char *end; errno = 0; set = strtol(args[1].c_str(), &end, 16); if (end == &args[1][0] || *end != '\0' || errno == ERANGE) { - cons->Print(" must be a number\n"); - return; + fprintf(cons, " must be a number\n"); + goto done; } if (set < 0 || set > 256) { - cons->Print(" must be in 00..ff\n"); - return; + fprintf(cons, " must be in 00..ff\n"); + goto done; } - ShowRegCacheSet(cons, id, set); + ShowRegCacheSet(cmmu, set); } + done: + return true; } // CMMU データキャッシュの概要表示 void -DebuggerMD_m88xx0::ShowRegCacheOverview(Console *cons, int id) +DebuggerMD_m88xx0::ShowRegCacheOverview(m88200 *cmmu) { TextScreen s(70, 17); - m88200 *cmmu; - // まだ今の所決め打ち - if (id == 7) { - cmmu = &cpu->cmmu[0]; - } else { - cmmu = &cpu->cmmu[1]; - } cmmu->MonitorCacheOverview(s, 0, false); parent->ShowTextScreen(s); } // CMMU データキャッシュの指定セットの詳細表示 void -DebuggerMD_m88xx0::ShowRegCacheSet(Console *cons, int id, int setidx) +DebuggerMD_m88xx0::ShowRegCacheSet(m88200 *cmmu, int setidx) { TextScreen s(70, 5); - m88200 *cmmu; - // まだ今の所決め打ち - if (id == 7) { - cmmu = &cpu->cmmu[0]; - } else { - cmmu = &cpu->cmmu[1]; - } cmmu->MonitorCacheSet(s, 0, setidx); parent->ShowTextScreen(s); } void -DebuggerMD_m88xx0::ShowRegFPU(Console *cons) +DebuggerMD_m88xx0::ShowRegFPU() { static const char * const fcrname[] = { "fpecr", @@ -587,21 +597,7 @@ DebuggerMD_m88xx0::ShowRegFPU(Console *c } void -DebuggerMD_m88xx0::ShowRegMMU(Console *cons, int id) -{ - m88200 *cmmu; - - // まだ今の所決め打ち - if (id == 7) { - cmmu = &cpu->cmmu[0]; - } else { - cmmu = &cpu->cmmu[1]; - } - parent->ShowMonitor(*cmmu); -} - -void -DebuggerMD_m88xx0::ShowRegOther(Console *cons) +DebuggerMD_m88xx0::ShowRegOther() { TextScreen s(80, 3); /* @@ -650,8 +646,19 @@ DebuggerMD_m88xx0::Disassemble(DebuggerM if (dis.Exec() == false) { return false; } - mnemonic = dis.text; bin = dis.bin; + mnemonic = dis.text; + if (!dis.alttext.empty()) { + // 別名追加 + int len = mnemonic.length() % 8; + if (len < 8) { + mnemonic += std::string(8 - len, ' '); + } else { + mnemonic += ' '; + } + mnemonic += dis.alttext; + } + return true; } @@ -684,13 +691,6 @@ DebuggerMD_m88xx0::FormatDisasmLive(cons op, delay.c_str(), mnemonic.c_str(), cond); } -// 例外のベクタ番号から名前を取得。 -const char * -DebuggerMD_m88xx0::GetExceptionName(int vector) const -{ - return m88kcpu::GetExceptionName(vector); -} - #define TAKE_IF(expr) do { \ if ((expr)) \ return " (will take)"; \