--- nono/m680x0/m68030disasm.cpp 2026/04/29 17:04:31 1.1 +++ nono/m680x0/m68030disasm.cpp 2026/04/29 17:04:40 1.1.1.4 @@ -1,6 +1,7 @@ // // nono -// Copyright (C) 2017 isaki@NetBSD.org +// Copyright (C) 2020 nono project +// Licensed under nono-license.txt // #include "m68030disasm.h" @@ -8,8 +9,8 @@ #include "mystring.h" // コンストラクタ -m680x0disasm::m680x0disasm(DebuggerMD *m) - : inherited(m) +m680x0disasm::m680x0disasm(DebuggerMD *md_) + : inherited(md_) { } @@ -86,21 +87,7 @@ m680x0disasm::Exec(saddr_t addr) uint32 m680x0disasm::peek16() { - uint64 paddr; - - if (pc.IsLogical() && md->MMUEnabled()) { - paddr = md->TranslateAddr(pc); - if ((int64)paddr < 0) - return 0xffff; - } else { - paddr = pc.addr; - } - - // 物理空間から読み込む - uint16 data; - data = vm_phys_peek_8(paddr) << 8; - data |= vm_phys_peek_8(paddr + 1); - return data; + return md->PeekFetch(pc); } // ワードフェッチ @@ -864,6 +851,12 @@ m680x0disasm::make_fpnlist() "fpcr", "fpsr", "fpiar", + + "urp", + "itt0", + "itt1", + "dtt0", + "dtt1", }; /*static*/ const char * const m680x0disasm::size_str[] = { @@ -2088,6 +2081,22 @@ OP_DEF(addi_l) dst = make_ea(); } +// %0000_011011_00nnnn RTM Rn +// %0000_011011_mmmrrr CALLM #, +OP_DEF(callm) +{ + uint n = ir[0] & 0x3f; + + if (n < 16) { + name = "rtm"; + src = make_rn(n); + } else { + name = "callm"; + src = imm16(); + dst = make_ea(); + } +} + // BTST,BCHG,BCLR,BSET #, の共通部分。 void m680x0disasm::ops_btst_imm_ea() @@ -3385,7 +3394,7 @@ OP_DEF(moveq) // 4e4f trap #15 // という命令列になっているので、これを検出する。 uint16 next = peek16(); - if (next == 0x4e4f) { + if ((ir[0] & 0xff00) == 0x7000 && next == 0x4e4f) { // IOCS コールと確定したら TRAP のワードも取り出しておく fetch16(); name = "IOCS"; @@ -4623,4 +4632,8 @@ OP_DEF(fline) OP_DEF(illegal) { name = ""; + + // illegal とは関係ないけど、ほどよく置く場所がないのでここに置いておく。 + // 変数宣言よりも後ろでクラス内でないと書けない。 + static_assert(countof(reg_names) == MaxReg, "count of reg_names[]"); }