diff options
author | Oxore <oxore@protonmail.com> | 2023-05-21 21:54:05 +0300 |
---|---|---|
committer | Oxore <oxore@protonmail.com> | 2023-05-21 22:00:23 +0300 |
commit | befd06430f141cbe95ea2393603046020cb14019 (patch) | |
tree | 33f16ea93f24c884e4b6df413ef599809ff2ee68 | |
parent | 4f2215e74a003b86a131778e232162af066965f6 (diff) |
Make imm values print as hex if dest arg is An, CCR or SR
-rw-r--r-- | disasm.cpp | 23 | ||||
-rw-r--r-- | disasm.h | 1 |
2 files changed, 19 insertions, 5 deletions
@@ -892,10 +892,10 @@ static size_t disasm_move_usp(DisasmNode &node, const uint16_t instr) const auto dir = static_cast<MoveDirection>((instr >> 3) & 1); if (dir == MoveDirection::kRegisterToMemory) { node.op = Op::Typical( - OpCode::kMOVE, OpSize::kLong, Arg::AddrModeXn(ArgType::kAn, xn), Arg::USP()); + OpCode::kMOVE, OpSize::kLong, Arg::An(xn), Arg::USP()); } else { node.op = Op::Typical( - OpCode::kMOVE, OpSize::kLong, Arg::USP(), Arg::AddrModeXn(ArgType::kAn, xn)); + OpCode::kMOVE, OpSize::kLong, Arg::USP(), Arg::An(xn)); } return node.size = kInstructionSizeStepBytes; } @@ -1809,6 +1809,7 @@ static size_t snprint_reg_mask( int Arg::SNPrint( char *const buf, const size_t bufsz, + const bool imm_as_hex, const RefKindMask ref_kinds, const uint32_t self_addr, const uint32_t ref_addr) const @@ -1878,7 +1879,11 @@ int Arg::SNPrint( RegNum(d8_pc_xi.xi), SizeSpecChar(d8_pc_xi.xi)); case ArgType::kImmediate: - return snprintf(buf, bufsz, "#%d", lword); + if (imm_as_hex) { + return snprintf(buf, bufsz, "#0x%x", lword); + } else { + return snprintf(buf, bufsz, "#%d", lword); + } case ArgType::kRegMask: case ArgType::kRegMaskPredecrement: return snprint_reg_mask(buf, bufsz, uword, type); @@ -1917,11 +1922,19 @@ int Op::FPrint( if (arg1.type != ArgType::kNone) { char arg1_str[kArgsBufferSize]{}; const RefKindMask ref1_kinds = ref_kinds & (kRef1Mask | kRefPcRelFix2Bytes); - arg1.SNPrint(arg1_str, kArgsBufferSize, ref1_kinds, self_addr, ref1_addr); + // It is useful to have immediate value printed as hex if destination + // argument is plain address register, status register or condition code + // register. USP is not the case because it's value may be moved only to + // or from An register. + const bool imm_as_hex = + arg2.type == ArgType::kAn || + arg2.type == ArgType::kCCR || + arg2.type == ArgType::kSR; + arg1.SNPrint(arg1_str, kArgsBufferSize, imm_as_hex, ref1_kinds, self_addr, ref1_addr); if (arg2.type != ArgType::kNone) { char arg2_str[kArgsBufferSize]{}; const RefKindMask ref2_kinds = ref_kinds & (kRef2Mask | kRefPcRelFix2Bytes); - arg2.SNPrint(arg2_str, kArgsBufferSize, ref2_kinds, self_addr, ref2_addr); + arg2.SNPrint(arg2_str, kArgsBufferSize, false, ref2_kinds, self_addr, ref2_addr); return fprintf(stream, " %s %s,%s", mnemonic_str, arg1_str, arg2_str); } else { return fprintf(stream, " %s %s", mnemonic_str, arg1_str); @@ -297,6 +297,7 @@ struct Arg { int SNPrint( char *buf, size_t bufsz, + bool imm_as_hex = false, RefKindMask ref_kinds = 0, uint32_t self_addr = 0, uint32_t ref_addr = 0) const; |