summaryrefslogtreecommitdiff
path: root/disasm.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'disasm.cpp')
-rw-r--r--disasm.cpp37
1 files changed, 27 insertions, 10 deletions
diff --git a/disasm.cpp b/disasm.cpp
index 6179c8d..20e4ec8 100644
--- a/disasm.cpp
+++ b/disasm.cpp
@@ -1822,6 +1822,7 @@ int Arg::SNPrint(
const size_t bufsz,
const bool imm_as_hex,
const RefKindMask ref_kinds,
+ const char *const label,
const uint32_t self_addr,
const uint32_t ref_addr) const
{
@@ -1857,11 +1858,11 @@ int Arg::SNPrint(
const char c = type == ArgType::kLong ? 'l' : 'w';
if (ref_kinds & kRefAbsMask) {
if (static_cast<uint32_t>(lword) == ref_addr) {
- return snprintf(buf, bufsz, "L%08x:%c", ref_addr, c);
+ return snprintf(buf, bufsz, "%s:%c", label, c);
} else {
// It has to be AFTER the label we are gonna reference here
assert(static_cast<uint32_t>(lword) > ref_addr);
- return snprintf(buf, bufsz, "L%08x+%d:%c", ref_addr, lword - ref_addr, c);
+ return snprintf(buf, bufsz, "%s+%d:%c", label, lword - ref_addr, c);
}
} else {
return snprintf(buf, bufsz, "0x%x:%c", lword, c);
@@ -1874,10 +1875,10 @@ int Arg::SNPrint(
const bool has_fix = ref_kinds & kRefPcRelFix2Bytes;
const uint32_t arg_addr = self_addr + d16_pc.d16 + kInstructionSizeStepBytes + (has_fix ? kInstructionSizeStepBytes : 0);
if (arg_addr == ref_addr) {
- return snprintf(buf, bufsz, "%%pc@(L%08x:w)", ref_addr);
+ return snprintf(buf, bufsz, "%%pc@(%s:w)", label);
} else {
assert(arg_addr > ref_addr);
- return snprintf(buf, bufsz, "%%pc@(L%08x+%d:w)", ref_addr, arg_addr - ref_addr);
+ return snprintf(buf, bufsz, "%%pc@(%s+%d:w)", label, arg_addr - ref_addr);
}
} else {
return snprintf(buf, bufsz, "%%pc@(%d:w)", d16_pc.d16);
@@ -1892,11 +1893,11 @@ int Arg::SNPrint(
case ArgType::kImmediate:
if (ref_kinds & kRef1ImmMask) {
if (static_cast<uint32_t>(lword) == ref_addr) {
- return snprintf(buf, bufsz, "#L%08x", ref_addr);
+ return snprintf(buf, bufsz, "#%s", label);
} else {
// It has to be AFTER the label we are gonna reference here
assert(static_cast<uint32_t>(lword) > ref_addr);
- return snprintf(buf, bufsz, "#L%08x+%d", ref_addr, lword - ref_addr);
+ return snprintf(buf, bufsz, "#%s+%d", label, lword - ref_addr);
}
} else if (imm_as_hex) {
return snprintf(buf, bufsz, "#0x%x", lword);
@@ -1909,10 +1910,10 @@ int Arg::SNPrint(
case ArgType::kDisplacement:
if (ref_kinds & kRefRelMask) {
if (static_cast<uint32_t>(self_addr + lword) == ref_addr) {
- return snprintf(buf, bufsz, "L%08x", ref_addr);
+ return snprintf(buf, bufsz, "%s", label);
} else {
assert(static_cast<uint32_t>(self_addr + lword) > ref_addr);
- return snprintf(buf, bufsz, "L%08x+%d", ref_addr, (self_addr + lword) - ref_addr);
+ return snprintf(buf, bufsz, "%s+%d", label, (self_addr + lword) - ref_addr);
}
} else {
return snprintf(buf, bufsz, ".%s%d", lword >= 0 ? "+" : "", lword);
@@ -1932,6 +1933,8 @@ int Op::FPrint(
FILE *const stream,
const char *const indent,
const RefKindMask ref_kinds,
+ const char *const ref1_label,
+ const char *const ref2_label,
const uint32_t self_addr,
const uint32_t ref1_addr,
const uint32_t ref2_addr) const
@@ -1950,11 +1953,25 @@ int Op::FPrint(
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);
+ arg1.SNPrint(
+ arg1_str,
+ kArgsBufferSize,
+ imm_as_hex,
+ ref1_kinds,
+ ref1_label,
+ 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, false, ref2_kinds, self_addr, ref2_addr);
+ arg2.SNPrint(
+ arg2_str,
+ kArgsBufferSize,
+ false,
+ ref2_kinds,
+ ref2_label,
+ self_addr,
+ ref2_addr);
return fprintf(stream, "%s%s %s,%s", indent, mnemonic_str, arg1_str, arg2_str);
} else {
return fprintf(stream, "%s%s %s", indent, mnemonic_str, arg1_str);