summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--disasm.cpp12
-rw-r--r--main.cpp2
-rw-r--r--test_marks_referencing.bash5
3 files changed, 18 insertions, 1 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
diff --git a/main.cpp b/main.cpp
index 6beac4e..3a4e34a 100644
--- a/main.cpp
+++ b/main.cpp
@@ -67,6 +67,8 @@ DisasmNode *DisasmMap::insertTracedNode(const uint32_t offset, const TracedNodeT
// instruction, then it must become an instruction node.
if (type == TracedNodeType::kInstruction && node->type != TracedNodeType::kInstruction) {
*const_cast<TracedNodeType*>(&node->type) = type;
+ // Make sure it is OpCode::kNone so it will be properly disassembled
+ node->op = Op{};
}
return node;
}
diff --git a/test_marks_referencing.bash b/test_marks_referencing.bash
index 1a17882..a5aaa67 100644
--- a/test_marks_referencing.bash
+++ b/test_marks_referencing.bash
@@ -49,7 +49,7 @@ run_test_r() {
fi
local run_check=$4
$run_check
- #cat ${file_asm}
+ echo && cat ${file_asm}
echo -e "${CGREEN}OK${CRST}"
}
@@ -89,3 +89,6 @@ run_test_rdisp "bras ." "\x60\xfe"
run_test_rdisp "bras .-2" "\x4e\x71\x60\xfc"
run_test_rdisp "bras .-1" "\x4e\x71\x60\xfd"
run_test_rdisp "braw .+2" "\x4e\x71\x60\x00\x00\x00"
+run_test_rword "moveml 0x0:w,%d0" "\x4c\xf8\x00\x01\x00\x00"
+run_test_rword "moveml 0x6:w,%a0" "\x4c\xf8\x01\x00\x00\x06\x4e\x71\x4e\x71"
+run_test_rword "movemw 0x0:l,%a0" "\x4e\x71\x4e\x71\x4c\xb9\x01\x00\x00\x00\x00\x02"