summaryrefslogtreecommitdiff
path: root/disasm.cpp
diff options
context:
space:
mode:
authorOxore <oxore@protonmail.com>2023-05-20 15:33:04 +0300
committerOxore <oxore@protonmail.com>2023-05-20 15:33:45 +0300
commitd9136afc4a89ad26663e18afd61683dd9dae523f (patch)
tree6e82355441312845d9b55c1a3bbc677a3a2ca208 /disasm.cpp
parentbad358209af4abcc85a23e4091564e61b99cf0e1 (diff)
Impl marks referencing for MOVEM
Diffstat (limited to 'disasm.cpp')
-rw-r--r--disasm.cpp12
1 files changed, 12 insertions, 0 deletions
diff --git a/disasm.cpp b/disasm.cpp
index a5223c7..0726f66 100644
--- a/disasm.cpp
+++ b/disasm.cpp
@@ -257,13 +257,25 @@ static size_t disasm_ext_movem(
break;
case AddrMode::kD16AnAddr: // 48a8..48af / 4c8a..4caf / 48e8..48ef / 4ce8..4cef
case AddrMode::kD8AnXiAddr: // 48b0..48b7 / 4cb0..4cb7 / 48f0..48f7 / 4cf0..4cf7
+ break;
case AddrMode::kWord: // 48b8 / 4cb8 / 48f8 / 4cf8
case AddrMode::kLong: // 48b9 / 4cb9 / 48f9 / 4cf9
+ if (dir == MoveDirection::kRegisterToMemory) {
+ node.ref2_addr = static_cast<uint32_t>(a.lword);
+ node.ref_kinds = kRef2AbsMask | kRefWriteMask;
+ } else {
+ node.ref1_addr = static_cast<uint32_t>(a.lword);
+ node.ref_kinds = kRef1AbsMask | kRefReadMask;
+ }
break;
case AddrMode::kD16PCAddr: // 48ba / 4cba / 48fa / 4cfa
case AddrMode::kD8PCXiAddr: // 48bb / 4cbb / 48fb / 4cfb
if (dir == MoveDirection::kRegisterToMemory) {
return disasm_verbatim(node, instr);
+ } else if (a.mode == AddrMode::kD16PCAddr) {
+ node.ref1_addr = node.offset + kInstructionSizeStepBytes +
+ static_cast<uint32_t>(a.d16_pc.d16);
+ node.ref_kinds = kRef1RelMask | kRefReadMask;
}
break;
case AddrMode::kImmediate: // 4ebc / 4efc