--- nono/debugger/debugger_m680x0.cpp 2026/04/29 17:04:37 1.1.1.3 +++ nono/debugger/debugger_m680x0.cpp 2026/04/29 17:04:40 1.1.1.4 @@ -19,7 +19,8 @@ DebuggerMD_m680x0::DebuggerMD_m680x0(Deb // 機種依存変数 vector_max = 256; - inst_bits = 16; + inst_bytes = 2; + inst_bytes_fixed = 0; // 奇数にしておくことで初回に必ずアドレス変換を起こさせる。 last_lpage.addr = 0xffffffff; @@ -187,6 +188,36 @@ DebuggerMD_m680x0::IsStepOut() const return (RegA(7) > so_a7 || (RegSR & 0x3000) != so_sr); } +// この命令がステップイン出来るなら true を返す +bool +DebuggerMD_m680x0::IsOpStepIn(uint32 op) +{ + if ((op & 0xfff0) == 0x4e40 // TRAP + || (op == 0x4e76) // TRAPV + || (op & 0xffc0) == 0x4e80 // JSR + || (op & 0xf0f8) == 0x50f8 // TRAPcc + || (op & 0xff00) == 0x6100 // BSR + || (op & 0xfff8) == 0xf278 // FTRAPcc + ) { + return true; + } + + // IOCS コール(に逆アセンブラで見えるやつ)も一命令扱いにしておく。 + // XXX 本当は X68k の時だけだが今の所副作用なさげなので + if ((op & 0xff00) == 0x7000) { // MOVEQ to %d0 + saddr_t laddr; + laddr.addr = GetPC() + 2; + laddr.logical = true; + laddr.super = IsSuper(); + uint32 op2 = PeekFetch(laddr); + if (op2 == 0x4e4f) { // TRAP #15 + return true; + } + } + + return false; +} + // レジスタ名からそのレジスタ値を返す。 // メモリダンプのような用途なのでアドレスとして使えるアドレスのみ。 uint64 @@ -235,11 +266,11 @@ DebuggerMD_m680x0::GetRegAddr(const char // レジスタ表示系コマンドのヘルプ /*static*/ const HelpMessages DebuggerMD_m680x0::HelpMsgRegister = { - { "r", "通常レジスタを表示" }, - { "ra", "ATC を表示" }, - { "rf", "FPU レジスタを表示" }, - { "rm", "MMU レジスタを表示" }, - { "ro", "その他のレジスタを表示" }, + { "r", "Show general registers" }, + { "ra", "Show ATC" }, + { "rf", "Show FPU registers" }, + { "rm", "Show MMU registers" }, + { "ro", "Show other registers" }, }; const HelpMessages& @@ -612,3 +643,10 @@ DebuggerMD_m680x0::FormatDisasmLive(cons return str + condstr; } + +// 例外のベクタ番号から名前を取得。 +const char * +DebuggerMD_m680x0::GetExceptionName(int vector) const +{ + return m68030_get_exception_name(vector); +}