diff options
author | Oxore <oxore@protonmail.com> | 2023-05-02 00:16:07 +0300 |
---|---|---|
committer | Oxore <oxore@protonmail.com> | 2023-05-02 00:16:07 +0300 |
commit | edf839f2352095cbc375e1f679001f2b20404b9d (patch) | |
tree | 5ce71c2f1989be91c671d50b01723bb215b75690 /disasm.cpp | |
parent | 0df8468808e922f694de264cae59762ff484b67e (diff) |
Impl CHK
Diffstat (limited to 'disasm.cpp')
-rw-r--r-- | disasm.cpp | 32 |
1 files changed, 32 insertions, 0 deletions
@@ -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 { |