From d9136afc4a89ad26663e18afd61683dd9dae523f Mon Sep 17 00:00:00 2001 From: Oxore Date: Sat, 20 May 2023 15:33:04 +0300 Subject: Impl marks referencing for MOVEM --- disasm.cpp | 12 ++++++++++++ main.cpp | 2 ++ test_marks_referencing.bash | 5 ++++- 3 files changed, 18 insertions(+), 1 deletion(-) 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(a.lword); + node.ref_kinds = kRef2AbsMask | kRefWriteMask; + } else { + node.ref1_addr = static_cast(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(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(&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" -- cgit v1.2.3