--- nono/m88xx0/m88100disasm.cpp 2026/04/29 17:04:31 1.1.1.1 +++ nono/m88xx0/m88100disasm.cpp 2026/04/29 17:04:34 1.1.1.2 @@ -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" @@ -41,7 +43,9 @@ m88100disasm::Exec(saddr_t laddr) switch (op12) { #include "m88100switch.inc" default: - __unreachable(); + name = "illegal"; + break; + //OP_FUNC(illegal); } // 出力文字列(ダンプ) @@ -98,7 +102,7 @@ uint32 m88100disasm::peek() { // 物理空間から取り込む - return m88200_phys_peek_32(phys_xip); + return vm_phys_peek_32(phys_xip); } // フェッチ @@ -152,6 +156,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 +164,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 +236,8 @@ m88100disasm::cio() uint32 c = (opX >> 8) & 3; static const char *carrystr[] = { "", - ".ci", ".co", + ".ci", ".cio", }; return std::string(carrystr[c]); @@ -617,7 +622,7 @@ OP_DEF(xcr) name = "xcr"; arg0 = rd(); arg1 = rs1(); - arg2 = fcrs(); + arg2 = crs(); } else { // どうすべ OP_FUNC(unimpl); @@ -872,7 +877,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 +1058,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 +1234,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) {