diff --git a/Asm65/StatusFlags.cs b/Asm65/StatusFlags.cs index 6aedfa6..a9c9c2f 100644 --- a/Asm65/StatusFlags.cs +++ b/Asm65/StatusFlags.cs @@ -235,7 +235,10 @@ namespace Asm65 { /// (8-bit) accumulator. /// /// - /// This is where we decide how to treat ambiguous status flags. + /// This is (mostly) where we decide how to treat ambiguous status flags. We favor + /// short flags because, when we get it wrong, it tends to be easier to spot (e.g. + /// LDA #$00xx becomes LDA+BRK). Mistakenly guessing "long" also tends to result in + /// instructions with other instructions embedded in them, which can be confusing. /// public bool IsShortM { get { diff --git a/SourceGen/Anattrib.cs b/SourceGen/Anattrib.cs index 4471836..799b0a9 100644 --- a/SourceGen/Anattrib.cs +++ b/SourceGen/Anattrib.cs @@ -225,6 +225,11 @@ namespace SourceGen { return IsInlineData && DataDescriptor != null; } } + public bool IsUntyped { + get { + return !IsInstruction && !IsData && !IsInlineData; + } + } /// /// Get the target memory address for this byte. diff --git a/SourceGen/DataAnalysis.cs b/SourceGen/DataAnalysis.cs index 9f8bb81..0244079 100644 --- a/SourceGen/DataAnalysis.cs +++ b/SourceGen/DataAnalysis.cs @@ -165,11 +165,16 @@ namespace SourceGen { // Check for a relocation. It'll be at offset+1 because it's on the operand, // not the opcode byte. (Make sure to check the length, or an RTS followed // by relocated data will freak out.) + // + // We don't check for embedded instructions here. If that did somehow happen, + // it's probably intentional, so we should do the replacement. + // // TODO(someday): this won't get the second byte of an MVN/MVP, which is fine // since we don't currently support two formats on one instruction. if (mAnalysisParams.UseRelocData) { if (attr.Length > 1 && mProject.RelocList.TryGetValue(offset + 1, - out DisasmProject.RelocData reloc)) { + out DisasmProject.RelocData reloc) && + attr.Length > reloc.Width) { // The relocation address differs from what the analyzer came up // with. This may be because of incorrect assumptions about the // bank (assuming B==K) or because the partial address refers to @@ -245,15 +250,15 @@ namespace SourceGen { // There shouldn't be any data items inside other data items, so we // can just skip forward. offset += mAnattribs[offset].DataDescriptor.Length - 1; - } else if (mAnalysisParams.UseRelocData && - !attr.IsInstruction && !attr.IsData && !attr.IsInlineData && + } else if (mAnalysisParams.UseRelocData && attr.IsUntyped && mProject.RelocList.TryGetValue(offset, out DisasmProject.RelocData reloc)) { // Byte is unformatted, but there's relocation data here. If the full // range of bytes is unformatted, create a symbolic reference. bool allClear = true; for (int i = 1; i < reloc.Width; i++) { - if (mAnattribs[offset + i].DataDescriptor != null) { + if (!mAnattribs[offset + i].IsUntyped || + mAnattribs[offset + i].DataDescriptor != null) { allClear = false; break; } @@ -382,6 +387,8 @@ namespace SourceGen { // and offsets identified by users or scripts have been categorized.) // // ?? Can we use GetBaseOperandOffset(), which searches for IsStart? + // + // TODO(performance): we spend a significant amount of time in this loop. int scanOffset = targetOffset; while (--scanOffset >= 0) { FormatDescriptor dfd = mAnattribs[scanOffset].DataDescriptor;