--- nono/m88xx0/m88100disasm.cpp 2026/04/29 17:04:31 1.1.1.1 +++ nono/m88xx0/m88100disasm.cpp 2026/04/29 17:04:41 1.1.1.3 @@ -1,9 +1,11 @@ // // nono -// Copyright (C) 2020 isaki@NetBSD.org +// Copyright (C) 2020 nono project +// Licensed under nono-license.txt // #include "m88100disasm.h" +#include "m88100acc.h" #include "bus.h" #include "mystring.h" @@ -11,8 +13,8 @@ #define OP_FUNC(name) __CONCAT(op_,name)() // コンストラクタ -m88100disasm::m88100disasm(DebuggerMD *m) - : inherited(m) +m88100disasm::m88100disasm(DebuggerMD *md_) + : inherited(md_) { } @@ -34,14 +36,15 @@ m88100disasm::Exec(saddr_t laddr) arg2.clear(); xip = laddr.addr; - phys_xip = laddr.addr; - opX = peek(); + opX = peek(laddr); uint32 op12 = ((opX >> 20) & 0x0fc0) | ((opX >> 10) & 0x003f); switch (op12) { #include "m88100switch.inc" default: - __unreachable(); + name = "illegal"; + break; + //OP_FUNC(illegal); } // 出力文字列(ダンプ) @@ -95,18 +98,9 @@ m88100disasm::Exec(saddr_t laddr) // ピーク (IP を進めずワードを取得する) uint32 -m88100disasm::peek() -{ - // 物理空間から取り込む - return m88200_phys_peek_32(phys_xip); -} - -// フェッチ -uint32 -m88100disasm::fetch() +m88100disasm::peek(const saddr_t& laddr) { - opX = peek(); - return opX; + return md->PeekFetch(laddr); } // フィールド部品 @@ -152,6 +146,7 @@ m88100disasm::d16() std::string m88100disasm::crs() { + // CRS フィールドは 6 bit。ただし CR20 までしか存在しない uint32 cr = (opX >> 5) & 0x3f; static const char *crnames[] = { "pid", "psr", "epsr", "ssbr", // cr0..3 @@ -159,7 +154,7 @@ m88100disasm::crs() "dmt0", "dmd0", "dma0", // cr8..10 "dmt1", "dmd1", "dma1", // cr11..13 "dmt2", "dmd2", "dma2", // cr14..16 - "sr0," "sr1", "sr2", "sr3", // cr17..20 + "sr0", "sr1", "sr2", "sr3", // cr17..20 }; if (cr < countof(crnames)) { @@ -231,8 +226,8 @@ m88100disasm::cio() uint32 c = (opX >> 8) & 3; static const char *carrystr[] = { "", - ".ci", ".co", + ".ci", ".cio", }; return std::string(carrystr[c]); @@ -617,7 +612,7 @@ OP_DEF(xcr) name = "xcr"; arg0 = rd(); arg1 = rs1(); - arg2 = fcrs(); + arg2 = crs(); } else { // どうすべ OP_FUNC(unimpl); @@ -872,7 +867,17 @@ OP_DEF(tb0) // 111100_bbbbbSSSSS_110110_0vvvvvvvvv OP_DEF(tb1) { - ops_tb("tb1"); + if (opt_alias && m88100opf_S1(opX) == 0) { + // tb1 *,r0,* はパイプライン同期を目的として使われる。 + // この形式はトラップは発生しない。 + if (VEC9 < 128) { + name = "ssync"; + } else { + name = "usync"; + } + } else { + ops_tb("tb1"); + } } // 111100_MMMMMSSSSS_111010_0vvvvvvvvv @@ -1043,10 +1048,17 @@ OP_DEF(xor_c) // 111101_DDDDDSSSSS_010110_00000sssss OP_DEF(or) { - name = "or"; - arg0 = rd(); - arg1 = rs1(); - arg2 = rs2(); + if (opt_alias && m88100opf_D(opX) == 0) { + // or r0,*,* は nop とする + // and とかも nop だが motolora が サンプルコードで + // or r0,r0,r0 を nop として使っているため、or が一般的なようだ。 + name = "nop"; + } else { + name = "or"; + arg0 = rd(); + arg1 = rs1(); + arg2 = rs2(); + } } // 111101_DDDDDSSSSS_010111_00000sssss @@ -1212,6 +1224,22 @@ OP_DEF(jsr_n) arg0 = rs2(); } +// 111101_DDDDDzzzzz_111010_00000sssss +OP_DEF(ff1) +{ + name = "ff1"; + arg0 = rd(); + arg1 = rs2(); +} + +// 111101_DDDDDzzzzz_111011_00000sssss +OP_DEF(ff0) +{ + name = "ff0"; + arg0 = rd(); + arg1 = rs2(); +} + // 111101_zzzzzzzzzz_111111_0000000000 OP_DEF(rte) {