summaryrefslogtreecommitdiff
path: root/disasm.cpp
diff options
context:
space:
mode:
authorOxore <oxore@protonmail.com>2023-05-20 16:41:59 +0300
committerOxore <oxore@protonmail.com>2023-05-20 16:41:59 +0300
commit429d978d108dfb77665f0c03a7190e2754c8fa1f (patch)
tree057c0eb090a7f9592c91ba9778795034e06bcd0f /disasm.cpp
parentd9136afc4a89ad26663e18afd61683dd9dae523f (diff)
Impl marks referencing for MOVE and MOVEA
Diffstat (limited to 'disasm.cpp')
-rw-r--r--disasm.cpp46
1 files changed, 36 insertions, 10 deletions
diff --git a/disasm.cpp b/disasm.cpp
index 0726f66..a95b0a2 100644
--- a/disasm.cpp
+++ b/disasm.cpp
@@ -262,10 +262,10 @@ static size_t disasm_ext_movem(
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;
+ node.ref_kinds = kRef2AbsMask | kRef2WriteMask;
} else {
node.ref1_addr = static_cast<uint32_t>(a.lword);
- node.ref_kinds = kRef1AbsMask | kRefReadMask;
+ node.ref_kinds = kRef1AbsMask | kRef1ReadMask;
}
break;
case AddrMode::kD16PCAddr: // 48ba / 4cba / 48fa / 4cfa
@@ -275,7 +275,7 @@ static size_t disasm_ext_movem(
} 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;
+ node.ref_kinds = kRef1RelMask | kRef1ReadMask;
}
break;
case AddrMode::kImmediate: // 4ebc / 4efc
@@ -315,12 +315,12 @@ static size_t disasm_lea(
case AddrMode::kWord:
case AddrMode::kLong:
node.ref1_addr = static_cast<uint32_t>(addr.lword);
- node.ref_kinds = kRef1AbsMask | kRefReadMask;
+ node.ref_kinds = kRef1AbsMask | kRef1ReadMask;
break;
case AddrMode::kD16PCAddr:
node.ref1_addr = node.offset + kInstructionSizeStepBytes +
static_cast<uint32_t>(addr.d16_pc.d16);
- node.ref_kinds = kRef1RelMask | kRefReadMask;
+ node.ref_kinds = kRef1RelMask | kRef1ReadMask;
break;
case AddrMode::kD8PCXiAddr:
break;
@@ -603,12 +603,35 @@ static size_t disasm_move_movea(
? OpSize::kByte : (opsize_raw == 3 ? OpSize::kWord : OpSize::kLong);
const auto src = FetchArg(
node.offset + kInstructionSizeStepBytes, code, instr, opsize);
- if (src.mode == AddrMode::kInvalid) {
- return disasm_verbatim(node, instr);
- }
- if (opsize == OpSize::kByte && src.mode == AddrMode::kAn) {
- // Does not exist
+ switch (src.mode) {
+ case AddrMode::kInvalid:
return disasm_verbatim(node, instr);
+ case AddrMode::kDn:
+ break;
+ case AddrMode::kAn:
+ if (opsize == OpSize::kByte) {
+ // Does not exist
+ return disasm_verbatim(node, instr);
+ }
+ case AddrMode::kAnAddr:
+ case AddrMode::kAnAddrIncr:
+ case AddrMode::kAnAddrDecr:
+ case AddrMode::kD16AnAddr:
+ case AddrMode::kD8AnXiAddr:
+ break;
+ case AddrMode::kWord:
+ case AddrMode::kLong:
+ node.ref1_addr = static_cast<uint32_t>(src.lword);
+ node.ref_kinds |= kRef1AbsMask | kRef1ReadMask;
+ break;
+ case AddrMode::kD16PCAddr:
+ node.ref1_addr = node.offset + kInstructionSizeStepBytes +
+ static_cast<uint32_t>(src.d16_pc.d16);
+ node.ref_kinds |= kRef1RelMask | kRef1ReadMask;
+ break;
+ case AddrMode::kD8PCXiAddr:
+ case AddrMode::kImmediate:
+ break;
}
const int m = (instr >> 6) & 7;
const int xn = (instr >> 9) & 7;
@@ -629,8 +652,11 @@ static size_t disasm_move_movea(
case AddrMode::kAnAddrDecr:
case AddrMode::kD16AnAddr:
case AddrMode::kD8AnXiAddr:
+ break;
case AddrMode::kWord:
case AddrMode::kLong:
+ node.ref2_addr = static_cast<uint32_t>(dst.lword);
+ node.ref_kinds |= kRef2AbsMask | kRef2WriteMask;
break;
case AddrMode::kD16PCAddr:
case AddrMode::kD8PCXiAddr: