--- nono/debugger/debugger_m88xx0.cpp 2026/04/29 17:04:37 1.1.1.3 +++ nono/debugger/debugger_m88xx0.cpp 2026/04/29 17:04:40 1.1.1.4 @@ -28,7 +28,8 @@ DebuggerMD_m88xx0::DebuggerMD_m88xx0(Deb // 機種依存変数 vector_max = 512; - inst_bits = 32; + inst_bytes = 4; + inst_bytes_fixed = 4; // 奇数にしておくことで初回に必ずアドレス変換を起こさせる。 last_lpage[0].addr = 0xffffffff; @@ -85,12 +86,25 @@ DebuggerMD_m88xx0::TranslateAddr(saddr_t return paddr; } +// op が bb0 命令なら true を返す +/*static*/ bool +DebuggerMD_m88xx0::IsBB0(uint32 op) +{ + return ((op & 0xf8000000) == 0xd0000000); // bb0 +} + +// op が tb0 命令なら true を返す +/*static*/ bool +DebuggerMD_m88xx0::IsTB0(uint32 op) +{ + return ((op & 0xfc00fe00) == 0xf000d000); // tb0 +} + // op が bb0/tb0 命令なら true を返す /*static*/ bool DebuggerMD_m88xx0::IsBBTB0(uint32 op) { - return ((op & 0xf8000000) == 0xd0000000 || // bb0 - (op & 0xfc00fe00) == 0xf000d000 ); // tb0 + return IsBB0(op) || IsTB0(op); } // op が bb1 命令なら true を返す @@ -132,6 +146,24 @@ DebuggerMD_m88xx0::IsStepOut() const return (cpu->xip == so_r1); } +// この命令がステップイン出来るなら true を返す +bool +DebuggerMD_m88xx0::IsOpStepIn(uint32 op) +{ + if ((op & 0xf800'0000) == 0xc800'0000 // bsr + || IsTB0(op) // tb0 + || (IsTB1(op) && ((op >> 16) & 0x1f) != 0) // tb1 (except r0) + || (op & 0xfc00'fe00) == 0xf000'e800 // tcnd + || (op & 0xfc00'fb00) == 0xf400'c800 // jsr + || (op & 0xfc00'0000) == 0xf800'0000 // tbnd imm + || (op & 0xfc00'ffe0) == 0xf400'f800 // tbnd rs2 + ) { + return true; + } + + return false; +} + // レジスタ名からそのレジスタ値を返す。 // メモリダンプのような用途なのでアドレスとして使えるアドレスのみ。 uint64 @@ -190,13 +222,13 @@ DebuggerMD_m88xx0::GetRegAddr(const char // レジスタ表示系コマンドのヘルプ /*static*/ const HelpMessages DebuggerMD_m88xx0::HelpMsgRegister = { - { "r", "通常レジスタを表示" }, - { "rc", "制御レジスタを表示" }, - { "rf", "FPU レジスタを表示" }, - { "ro", "その他のレジスタを表示" }, - { "ra", "ATC を表示" }, - { "rd []", "データキャッシュを表示" }, - { "rm", "CMMU レジスタを表示" }, + { "r", "Show general registers" }, + { "rc", "Show (integer) control registers" }, + { "rf", "Show floating point control registers" }, + { "ro", "Show other (shadow) registers" }, + { "ra", "Show ATC on CMMU" }, + { "rd", "Show data cache on CMMU" }, + { "rm", "Show CMMU registers" }, }; const HelpMessages& @@ -326,12 +358,12 @@ DebuggerMD_m88xx0::ShowRegCtrl(Console * /* 0 1 2 3 4 5 6 7 0123456789012345678901234567890123456789012345678901234567890123456789012345678 -pid (cr0):12345678(Arch=$00 Ver=$00 M/C=Checker) ssbr(cr3):00000000 -psr (cr1):12345678(S,LE,SER,Cy SFD1,MXM,IND,SFRZ) vbr (cr7):00000000 -epsr(cr2):12345678(S,LE,SER,Cy SFD1,MXM,IND,SFRZ) sr0(cr17):00000000 -xip:00000000 opX:00000000(--) sxip(cr4):00000000:VE sr1(cr18):00000000 -nip:00000000 opF:00000000(--) snip(cr5):00000000:-- sr2(cr19):00000000 -fip:00000000 sfip(cr6):00000000:VE sr3(cr20):00000000 +pid (cr0):12345678(Arch=$00 Ver=$00 M/C=Checker) sr0(cr17):00000000 +psr (cr1):12345678(S,LE,SER,Cy SFD1,MXM,IND,SFRZ) sr1(cr18):00000000 +epsr(cr2):12345678(S,LE,SER,Cy SFD1,MXM,IND,SFRZ) sr2(cr19):00000000 +xip:00000000 opX:00000000(--) sxip(cr4):00000000:VE sr3(cr20):00000000 +nip:00000000 opF:00000000(--) snip(cr5):00000000:-- ssbr(cr3):00000000 +fip:00000000 sfip(cr6):00000000:VE vbr (cr7):00000000 */ #define PRINT_B(x, y, reg, mask, fmt, arg) do { \ @@ -366,7 +398,7 @@ fip:00000000 sfip(cr6 // epsr(cr2) y++; - s.Print(x, y, TSBOLDC(psr), "epsr(cr2):%08x", cpu->epsr); + s.Print(x, y, TSBOLDC(epsr), "epsr(cr2):%08x", cpu->epsr); s.Print(x + 18, y, "(s,le,ser,cy sfd1,mxm,ind,sfrz)"); PRINT_B(x + 19, y, epsr, m88100reg::PSR_SUPER, "%c", _new ? 'S' : '-'); PRINT_B(x + 21, y, epsr, m88100reg::PSR_BO_LE, "%s", _new ? "LE" : "BE"); @@ -402,17 +434,16 @@ fip:00000000 sfip(cr6 x = 55; y = 0; - // ssbr(cr3) - s.Print(x, y++, TSBOLDC(ssbr), "ssbr(cr3):%08x", cpu->ssbr); - // vbr(cr7) - s.Print(x, y++, TSBOLDC(vbr), "vbr (cr7):%08x", cpu->vbr); - // SR* for (int i = 0; i < 4; i++) { int rn = 17 + i; - s.Print(x, y + i, TSBOLDC(cr[rn]), "sr%d(cr%d):%08x", + s.Print(x, y++, TSBOLDC(cr[rn]), "sr%d(cr%d):%08x", i, rn, cpu->cr[rn]); } + // ssbr(cr3) + s.Print(x, y++, TSBOLDC(ssbr), "ssbr(cr3):%08x", cpu->ssbr); + // vbr(cr7) + s.Print(x, y++, TSBOLDC(vbr), "vbr (cr7):%08x", cpu->vbr); parent->ShowTextScreen(s); } @@ -604,6 +635,13 @@ 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)"; \