diff --git a/SourceGen/DisasmProject.cs b/SourceGen/DisasmProject.cs index c9f4674..3c2ab6f 100644 --- a/SourceGen/DisasmProject.cs +++ b/SourceGen/DisasmProject.cs @@ -2352,18 +2352,14 @@ namespace SourceGen { "project/platform symbol"); needReanalysis = UndoableChange.ReanalysisScope.DataOnly; } else { - affectedOffsets.Add(offset); + AddAffectedLine(affectedOffsets, offset); // Use the cross-reference table to identify the offsets that // we need to update. if (mXrefs.TryGetValue(offset, out XrefSet xrefs)) { foreach (XrefSet.Xref xr in xrefs) { - // This isn't quite right -- in theory we should be - // adding all offsets that are part of the instruction, - // so that affectedOffsets can hold a contiguous range - // instead of a collection of opcode offsets. In - // practice, for a label change, it shouldn't matter. - affectedOffsets.Add(xr.Offset); + // Add all bytes in the instruction / data item. + AddAffectedLine(affectedOffsets, xr.Offset); } } } @@ -2432,8 +2428,8 @@ namespace SourceGen { } Comments[offset] = (string)newValue; - // Only affects this offset. - affectedOffsets.Add(offset); + // Only affects the bytes at this offset. + AddAffectedLine(affectedOffsets, offset); } break; case UndoableChange.ChangeType.SetLongComment: { @@ -2449,8 +2445,8 @@ namespace SourceGen { LongComments[offset] = (MultiLineComment)newValue; } - // Only affects this offset. - affectedOffsets.Add(offset); + // Only affects the bytes at this offset. + AddAffectedLine(affectedOffsets, offset); } break; case UndoableChange.ChangeType.SetNote: { @@ -2466,8 +2462,8 @@ namespace SourceGen { Notes[offset] = (MultiLineComment)newValue; } - // Only affects this offset. - affectedOffsets.Add(offset); + // Only affects the bytes at this offset. + AddAffectedLine(affectedOffsets, offset); } break; case UndoableChange.ChangeType.SetProjectProperties: { @@ -2555,6 +2551,31 @@ namespace SourceGen { return needReanalysis; } + /// + /// Adds all offsets associated with the code or data item at the specified offset + /// to the range set. + /// + /// + /// In the past, it was only really necessary to add the first offset, because that + /// would trigger the entire line to be redrawn. That's not the case with arend + /// directives, which are associated with the last byte of a multi-byte item. + /// + /// Range set to update. + /// Offset of first byte. + private void AddAffectedLine(RangeSet affectedOffsets, int offset) { + int len = 1; + if (offset >= 0) { // header comment doesn't have an Anattrib entry + len = mAnattribs[offset].Length; + } + if (len == 0) { + Debug.Assert(false, "Zero-length affected line?"); + len = 1; + } + for (int i = offset; i < offset + len; i++) { + affectedOffsets.Add(i); + } + } + /// /// Clears all cached visualization images. /// diff --git a/SourceGen/LineListGen.cs b/SourceGen/LineListGen.cs index 8c765f5..7ba2e94 100644 --- a/SourceGen/LineListGen.cs +++ b/SourceGen/LineListGen.cs @@ -307,7 +307,8 @@ namespace SourceGen { if (lineType == Line.Type.Code || lineType == Line.Type.Data) { lineType = Line.Type.CodeOrData; } - if (line.FileOffset == curOffset || lineType == Line.Type.ArEndDirective) { + if (line.FileOffset == curOffset || + (tag != null && lineType == Line.Type.ArEndDirective)) { // Another item at same offset. We special-case the arend directive // because it's contained within the previous item, so we want it to be // set on the existing [offset,offset+span) range tag. diff --git a/SourceGen/WpfGui/EditDefSymbol.xaml b/SourceGen/WpfGui/EditDefSymbol.xaml index b3ccfdc..d45ddbb 100644 --- a/SourceGen/WpfGui/EditDefSymbol.xaml +++ b/SourceGen/WpfGui/EditDefSymbol.xaml @@ -32,8 +32,8 @@ limitations under the License. • Decimal or hex value, 1-{0} - Constant - Stack-Relative Offset + _Constant + Stack-Relative _Offset @@ -54,7 +54,7 @@ limitations under the License. Symbol type: - +