From edf839f2352095cbc375e1f679001f2b20404b9d Mon Sep 17 00:00:00 2001 From: Oxore Date: Tue, 2 May 2023 00:16:07 +0300 Subject: Impl CHK --- disasm.cpp | 32 ++++++++++++++++++++++++++++++++ test.bash | 20 ++++++++++++++------ 2 files changed, 46 insertions(+), 6 deletions(-) diff --git a/disasm.cpp b/disasm.cpp index d761c12..0ee4f92 100644 --- a/disasm.cpp +++ b/disasm.cpp @@ -484,7 +484,39 @@ static void disasm_lea( static void disasm_chk( DisasmNode &node, uint16_t instr, const DataBuffer &code, const Settings &s) { + const auto src = AddrModeArg::Fetch( + node.offset + kInstructionSizeStepBytes, code, instr, 'w'); + switch (src.mode) { + case AddrMode::kInvalid: + return disasm_verbatim(node, instr, code, s); + case AddrMode::kDn: + break; + case AddrMode::kAn: return disasm_verbatim(node, instr, code, s); + case AddrMode::kAnAddr: + case AddrMode::kAnAddrIncr: + case AddrMode::kAnAddrDecr: + case AddrMode::kD16AnAddr: + case AddrMode::kD8AnXiAddr: + case AddrMode::kWord: + case AddrMode::kLong: + break; + case AddrMode::kD16PCAddr: + case AddrMode::kD8PCXiAddr: + case AddrMode::kImmediate: + return disasm_verbatim(node, instr, code, s); + } + const unsigned dn = ((instr >> 9) & 7); + const auto dst = AddrModeArg::Fetch( + node.offset + kInstructionSizeStepBytes, code, 0, dn, 'w'); + assert(dst.mode == AddrMode::kDn); + char src_str[32]{}; + char dst_str[32]{}; + src.SNPrint(src_str, sizeof(src_str)); + dst.SNPrint(dst_str, sizeof(dst_str)); + snprintf(node.mnemonic, kMnemonicBufferSize, "chkw"); + snprintf(node.arguments, kArgsBufferSize, "%s,%s", src_str, dst_str); + node.size = kInstructionSizeStepBytes + src.Size() + dst.Size(); } enum class Condition { diff --git a/test.bash b/test.bash index d615b32..be8a5be 100644 --- a/test.bash +++ b/test.bash @@ -93,13 +93,21 @@ run_test_iterative() { done } -# 4xxx lea +# 4xxx chkw # -run_test_simple "lea (An)" "\x41\xd0" -run_test_simple "lea (d16,An)" "\x47\xe9\x80\x00" -run_test_simple "lea (d8,An,Xi)" "\x47\xf2\xa8\x7f" -run_test_simple "lea (d16,PC)" "\x47\xfa\x7f\xff" -run_test_simple "lea (d8,PC,Xi)" "\x47\xfb\xa8\x80" +run_test_simple "chkw Dn" "\x47\x82" +run_test_simple "chkw (An)" "\x41\x90" +run_test_simple "chkw (An)+" "\x47\x9b" +run_test_simple "chkw (d16,An)" "\x47\xa9\x80\x00" +run_test_simple "chkw (d8,An,Xi)" "\x47\xb2\xa8\x7f" + +# 4xxx leal +# +run_test_simple "leal (An)" "\x41\xd0" +run_test_simple "leal (d16,An)" "\x47\xe9\x80\x00" +run_test_simple "leal (d8,An,Xi)" "\x47\xf2\xa8\x7f" +run_test_simple "leal (d16,PC)" "\x47\xfa\x7f\xff" +run_test_simple "leal (d8,PC,Xi)" "\x47\xfb\xa8\x80" # 0xxx movep # -- cgit v1.2.3