summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorOxore <oxore@protonmail.com>2023-05-02 00:16:07 +0300
committerOxore <oxore@protonmail.com>2023-05-02 00:16:07 +0300
commitedf839f2352095cbc375e1f679001f2b20404b9d (patch)
tree5ce71c2f1989be91c671d50b01723bb215b75690
parent0df8468808e922f694de264cae59762ff484b67e (diff)
Impl CHK
-rw-r--r--disasm.cpp32
-rw-r--r--test.bash20
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
#