diff options
author | Oxore <oxore@protonmail.com> | 2023-05-20 15:33:04 +0300 |
---|---|---|
committer | Oxore <oxore@protonmail.com> | 2023-05-20 15:33:45 +0300 |
commit | d9136afc4a89ad26663e18afd61683dd9dae523f (patch) | |
tree | 6e82355441312845d9b55c1a3bbc677a3a2ca208 | |
parent | bad358209af4abcc85a23e4091564e61b99cf0e1 (diff) |
Impl marks referencing for MOVEM
-rw-r--r-- | disasm.cpp | 12 | ||||
-rw-r--r-- | main.cpp | 2 | ||||
-rw-r--r-- | test_marks_referencing.bash | 5 |
3 files changed, 18 insertions, 1 deletions
@@ -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 @@ -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" |