diff --git a/SourceGen/CodeAnalysis.cs b/SourceGen/CodeAnalysis.cs
index 99c29a3..85b5ae1 100644
--- a/SourceGen/CodeAnalysis.cs
+++ b/SourceGen/CodeAnalysis.cs
@@ -1082,7 +1082,7 @@ namespace SourceGen {
}
///
- /// Sets the format of an instruction operand.
+ /// Sets the format of an instruction operand. Invoked from extension script.
///
/// Offset of opcode.
/// Format sub-type.
diff --git a/SourceGen/MainController.cs b/SourceGen/MainController.cs
index abac086..eacdddd 100644
--- a/SourceGen/MainController.cs
+++ b/SourceGen/MainController.cs
@@ -2545,6 +2545,48 @@ namespace SourceGen {
internalLabelOffset.ToString("x6") + " extSym=" + externalSym +
" extAddr=" + externalAddr + " isLV=" + isLV);
+ // Check to see if a symbol has been explicitly set. If so, we want to edit the
+ // label at the address for that symbol, or the project symbol entry, rather than
+ // using the numeric value of the operand to do the determination. This feels better
+ // because you're editing the label shown on screen in the operand field.
+ if (mProject.OperandFormats.TryGetValue(selOffset, out FormatDescriptor dfd) &&
+ dfd.FormatType == FormatDescriptor.Type.NumericLE &&
+ dfd.FormatSubType == FormatDescriptor.SubType.Symbol) {
+ // Symbol formats are weak references, so we need to look the label up in the
+ // symbol table to ensure that it exists. Non-local label references will have
+ // the uniquification string appended.
+ string label = dfd.SymbolRef.Label;
+ bool didEdit = false;
+ if (mProject.SymbolTable.TryGetNonVariableValue(label, out Symbol foundSym)) {
+ if (foundSym.SymbolSource == Symbol.Source.User) {
+ // Edit the label at the target address.
+ int labelOffset = mProject.FindLabelOffsetByName(label);
+ if (labelOffset >= 0) {
+ DoEditLabel(labelOffset);
+ didEdit = true;
+ } else {
+ Debug.Assert(false, "Can't edit symbol " + foundSym);
+ }
+ } else if (foundSym.SymbolSource == Symbol.Source.Project) {
+ // Edit the symbol we found.
+ Debug.Assert(foundSym is DefSymbol);
+ DoEditProjectSymbol(CodeListColumn.Label, (DefSymbol)foundSym);
+ didEdit = true;
+ } else {
+ // Could be a platform symbol, or we managed to get something odd in here.
+ // Whatever the case, fall through to the "uneditable" case.
+ }
+ }
+ if (!didEdit) {
+ // If we can't edit it for whatever reason, just open the appropriate Edit
+ // Operand dialog, so they can fix the symbol name. Seems more appropriate
+ // than posting an error dialog or quietly doing nothing.
+ Debug.WriteLine("Unable to cleverly edit '" + label + "', doing EO");
+ EditOperand();
+ }
+ return;
+ }
+
// Operand targets can be internal or external, and can be in an LVT. Internal
// address user labels have the highest priority, LVTs are next, then external
// project/platform symbols.