From 2cb6b5580274a31c76bd042964592384f76601ac Mon Sep 17 00:00:00 2001
From: Andy McFadden
Date: Wed, 24 Oct 2018 17:18:08 -0700
Subject: [PATCH] Generalize expression style setting
Before you could choose between Merlin-style and generic. Now
there's a combo box that lets you choose Merlin, cc65, or
"common", the latter being used for 64tass.
---
.../AppForms/EditAppSettings.Designer.cs | 82 +++++++++++--------
SourceGen/AppForms/EditAppSettings.cs | 63 ++++++++++----
SourceGen/RuntimeData/Help/settings.html | 8 +-
3 files changed, 99 insertions(+), 54 deletions(-)
diff --git a/SourceGen/AppForms/EditAppSettings.Designer.cs b/SourceGen/AppForms/EditAppSettings.Designer.cs
index 12429b7..251af8a 100644
--- a/SourceGen/AppForms/EditAppSettings.Designer.cs
+++ b/SourceGen/AppForms/EditAppSettings.Designer.cs
@@ -43,6 +43,8 @@ namespace SourceGen.AppForms {
this.applyButton = new System.Windows.Forms.Button();
this.settingsTabControl = new System.Windows.Forms.TabControl();
this.codeViewTabPage = new System.Windows.Forms.TabPage();
+ this.codeViewMiscGroupBox = new System.Windows.Forms.GroupBox();
+ this.spacesBetweenBytesCheckBox = new System.Windows.Forms.CheckBox();
this.clipboardGroupBox = new System.Windows.Forms.GroupBox();
this.clipboardFormatLabel = new System.Windows.Forms.Label();
this.clipboardFormatComboBox = new System.Windows.Forms.ComboBox();
@@ -94,7 +96,6 @@ namespace SourceGen.AppForms {
this.displayFmtQuickComboBox = new System.Windows.Forms.ComboBox();
this.displayFmtSetButton = new System.Windows.Forms.Button();
this.quickFmtDefaultButton = new System.Windows.Forms.Button();
- this.useMerlinExpressions = new System.Windows.Forms.CheckBox();
this.operandWidthGroupBox = new System.Windows.Forms.GroupBox();
this.disambPrefix24TextBox = new System.Windows.Forms.TextBox();
this.disambPrefix16TextBox = new System.Windows.Forms.TextBox();
@@ -156,10 +157,11 @@ namespace SourceGen.AppForms {
this.defineData1Label = new System.Windows.Forms.Label();
this.equDirectiveTextBox = new System.Windows.Forms.TextBox();
this.equDirectiveLabel = new System.Windows.Forms.Label();
- this.codeViewMiscGroupBox = new System.Windows.Forms.GroupBox();
- this.spacesBetweenBytesCheckBox = new System.Windows.Forms.CheckBox();
+ this.expressionStyleLabel = new System.Windows.Forms.Label();
+ this.expressionStyleComboBox = new System.Windows.Forms.ComboBox();
this.settingsTabControl.SuspendLayout();
this.codeViewTabPage.SuspendLayout();
+ this.codeViewMiscGroupBox.SuspendLayout();
this.clipboardGroupBox.SuspendLayout();
this.upperCaseGroupBox.SuspendLayout();
this.codeViewFontGroupBox.SuspendLayout();
@@ -171,7 +173,6 @@ namespace SourceGen.AppForms {
this.operandWidthGroupBox.SuspendLayout();
this.pseudoOpTabPage.SuspendLayout();
this.quickPseudoSetGroup.SuspendLayout();
- this.codeViewMiscGroupBox.SuspendLayout();
this.SuspendLayout();
//
// cancelButton
@@ -239,6 +240,27 @@ namespace SourceGen.AppForms {
this.codeViewTabPage.Text = "Code View";
this.codeViewTabPage.UseVisualStyleBackColor = true;
//
+ // codeViewMiscGroupBox
+ //
+ this.codeViewMiscGroupBox.Controls.Add(this.spacesBetweenBytesCheckBox);
+ this.codeViewMiscGroupBox.Location = new System.Drawing.Point(406, 101);
+ this.codeViewMiscGroupBox.Name = "codeViewMiscGroupBox";
+ this.codeViewMiscGroupBox.Size = new System.Drawing.Size(200, 47);
+ this.codeViewMiscGroupBox.TabIndex = 5;
+ this.codeViewMiscGroupBox.TabStop = false;
+ this.codeViewMiscGroupBox.Text = "Miscellaneous";
+ //
+ // spacesBetweenBytesCheckBox
+ //
+ this.spacesBetweenBytesCheckBox.AutoSize = true;
+ this.spacesBetweenBytesCheckBox.Location = new System.Drawing.Point(7, 20);
+ this.spacesBetweenBytesCheckBox.Name = "spacesBetweenBytesCheckBox";
+ this.spacesBetweenBytesCheckBox.Size = new System.Drawing.Size(158, 17);
+ this.spacesBetweenBytesCheckBox.TabIndex = 0;
+ this.spacesBetweenBytesCheckBox.Text = "Add spaces in bytes column";
+ this.spacesBetweenBytesCheckBox.UseVisualStyleBackColor = true;
+ this.spacesBetweenBytesCheckBox.CheckedChanged += new System.EventHandler(this.spacesBetweenBytesCheckBox_CheckedChanged);
+ //
// clipboardGroupBox
//
this.clipboardGroupBox.Controls.Add(this.clipboardFormatLabel);
@@ -717,9 +739,10 @@ namespace SourceGen.AppForms {
//
// displayFormatTabPage
//
+ this.displayFormatTabPage.Controls.Add(this.expressionStyleComboBox);
+ this.displayFormatTabPage.Controls.Add(this.expressionStyleLabel);
this.displayFormatTabPage.Controls.Add(this.fmtExplanationLabel);
this.displayFormatTabPage.Controls.Add(this.quickDisplayFormatGroup);
- this.displayFormatTabPage.Controls.Add(this.useMerlinExpressions);
this.displayFormatTabPage.Controls.Add(this.operandWidthGroupBox);
this.displayFormatTabPage.Location = new System.Drawing.Point(4, 22);
this.displayFormatTabPage.Name = "displayFormatTabPage";
@@ -781,17 +804,6 @@ namespace SourceGen.AppForms {
this.quickFmtDefaultButton.UseVisualStyleBackColor = true;
this.quickFmtDefaultButton.Click += new System.EventHandler(this.quickFmtDefaultButton_Click);
//
- // useMerlinExpressions
- //
- this.useMerlinExpressions.AutoSize = true;
- this.useMerlinExpressions.Location = new System.Drawing.Point(6, 153);
- this.useMerlinExpressions.Name = "useMerlinExpressions";
- this.useMerlinExpressions.Size = new System.Drawing.Size(158, 17);
- this.useMerlinExpressions.TabIndex = 2;
- this.useMerlinExpressions.Text = "Use Merlin-style expressions";
- this.useMerlinExpressions.UseVisualStyleBackColor = true;
- this.useMerlinExpressions.CheckedChanged += new System.EventHandler(this.shiftAfterAdjustCheckBox_CheckedChanged);
- //
// operandWidthGroupBox
//
this.operandWidthGroupBox.Controls.Add(this.disambPrefix24TextBox);
@@ -1456,26 +1468,23 @@ namespace SourceGen.AppForms {
this.equDirectiveLabel.Text = "Equate:";
this.equDirectiveLabel.TextAlign = System.Drawing.ContentAlignment.TopRight;
//
- // codeViewMiscGroupBox
+ // expressionStyleLabel
//
- this.codeViewMiscGroupBox.Controls.Add(this.spacesBetweenBytesCheckBox);
- this.codeViewMiscGroupBox.Location = new System.Drawing.Point(406, 101);
- this.codeViewMiscGroupBox.Name = "codeViewMiscGroupBox";
- this.codeViewMiscGroupBox.Size = new System.Drawing.Size(200, 47);
- this.codeViewMiscGroupBox.TabIndex = 5;
- this.codeViewMiscGroupBox.TabStop = false;
- this.codeViewMiscGroupBox.Text = "Miscellaneous";
+ this.expressionStyleLabel.AutoSize = true;
+ this.expressionStyleLabel.Location = new System.Drawing.Point(7, 156);
+ this.expressionStyleLabel.Name = "expressionStyleLabel";
+ this.expressionStyleLabel.Size = new System.Drawing.Size(85, 13);
+ this.expressionStyleLabel.TabIndex = 4;
+ this.expressionStyleLabel.Text = "Expression style:";
//
- // spacesBetweenBytesCheckBox
+ // expressionStyleComboBox
//
- this.spacesBetweenBytesCheckBox.AutoSize = true;
- this.spacesBetweenBytesCheckBox.Location = new System.Drawing.Point(7, 20);
- this.spacesBetweenBytesCheckBox.Name = "spacesBetweenBytesCheckBox";
- this.spacesBetweenBytesCheckBox.Size = new System.Drawing.Size(158, 17);
- this.spacesBetweenBytesCheckBox.TabIndex = 0;
- this.spacesBetweenBytesCheckBox.Text = "Add spaces in bytes column";
- this.spacesBetweenBytesCheckBox.UseVisualStyleBackColor = true;
- this.spacesBetweenBytesCheckBox.CheckedChanged += new System.EventHandler(this.spacesBetweenBytesCheckBox_CheckedChanged);
+ this.expressionStyleComboBox.FormattingEnabled = true;
+ this.expressionStyleComboBox.Location = new System.Drawing.Point(98, 153);
+ this.expressionStyleComboBox.Name = "expressionStyleComboBox";
+ this.expressionStyleComboBox.Size = new System.Drawing.Size(121, 21);
+ this.expressionStyleComboBox.TabIndex = 5;
+ this.expressionStyleComboBox.SelectedIndexChanged += new System.EventHandler(this.expressionStyleComboBox_SelectedIndexChanged);
//
// EditAppSettings
//
@@ -1499,6 +1508,8 @@ namespace SourceGen.AppForms {
this.settingsTabControl.ResumeLayout(false);
this.codeViewTabPage.ResumeLayout(false);
this.codeViewTabPage.PerformLayout();
+ this.codeViewMiscGroupBox.ResumeLayout(false);
+ this.codeViewMiscGroupBox.PerformLayout();
this.clipboardGroupBox.ResumeLayout(false);
this.clipboardGroupBox.PerformLayout();
this.upperCaseGroupBox.ResumeLayout(false);
@@ -1518,8 +1529,6 @@ namespace SourceGen.AppForms {
this.pseudoOpTabPage.ResumeLayout(false);
this.pseudoOpTabPage.PerformLayout();
this.quickPseudoSetGroup.ResumeLayout(false);
- this.codeViewMiscGroupBox.ResumeLayout(false);
- this.codeViewMiscGroupBox.PerformLayout();
this.ResumeLayout(false);
}
@@ -1609,7 +1618,6 @@ namespace SourceGen.AppForms {
private System.Windows.Forms.CheckBox enableDebugCheckBox;
private System.Windows.Forms.CheckBox showAsmIdentCheckBox;
private System.Windows.Forms.TabPage displayFormatTabPage;
- private System.Windows.Forms.CheckBox useMerlinExpressions;
private System.Windows.Forms.GroupBox operandWidthGroupBox;
private System.Windows.Forms.TextBox disambPrefix24TextBox;
private System.Windows.Forms.TextBox disambPrefix16TextBox;
@@ -1646,5 +1654,7 @@ namespace SourceGen.AppForms {
private System.Windows.Forms.ComboBox displayFmtQuickComboBox;
private System.Windows.Forms.GroupBox codeViewMiscGroupBox;
private System.Windows.Forms.CheckBox spacesBetweenBytesCheckBox;
+ private System.Windows.Forms.ComboBox expressionStyleComboBox;
+ private System.Windows.Forms.Label expressionStyleLabel;
}
}
\ No newline at end of file
diff --git a/SourceGen/AppForms/EditAppSettings.cs b/SourceGen/AppForms/EditAppSettings.cs
index a431f84..4d392c3 100644
--- a/SourceGen/AppForms/EditAppSettings.cs
+++ b/SourceGen/AppForms/EditAppSettings.cs
@@ -18,11 +18,11 @@ using System.Collections.Generic;
using System.Diagnostics;
using System.Drawing;
using System.Reflection;
-using System.Text;
using System.Windows.Forms;
using AssemblerInfo = SourceGen.AsmGen.AssemblerInfo;
using AssemblerConfig = SourceGen.AsmGen.AssemblerConfig;
+using ExpressionMode = Asm65.Formatter.FormatConfig.ExpressionMode;
namespace SourceGen.AppForms {
public partial class EditAppSettings : Form {
@@ -91,7 +91,7 @@ namespace SourceGen.AppForms {
// Enumerated ID.
public AssemblerInfo.Id AssemblerId { get; private set; }
- // Human-readable name.
+ // Human-readable name for display.
public string Name { get; private set; }
public AsmComboItem(AssemblerInfo info) {
@@ -100,6 +100,27 @@ namespace SourceGen.AppForms {
}
}
+ ///
+ /// Holds an item for the expression style selection combo box.
+ ///
+ private struct ExpressionStyleItem {
+ // Enumerated mode.
+ public ExpressionMode ExpMode { get; private set; }
+
+ // Human-readable name for display.
+ public string Name { get; private set; }
+
+ public ExpressionStyleItem(ExpressionMode expMode, string name) {
+ ExpMode = expMode;
+ Name = name;
+ }
+ }
+ private static ExpressionStyleItem[] sExpStyleItems = new ExpressionStyleItem[] {
+ new ExpressionStyleItem(ExpressionMode.Common, "Common"),
+ new ExpressionStyleItem(ExpressionMode.Cc65, "cc65"),
+ new ExpressionStyleItem(ExpressionMode.Merlin, "Merlin"),
+ };
+
public EditAppSettings(ProjectView projectView, Tab initialTab,
AssemblerInfo.Id initialAsmId) {
@@ -154,6 +175,11 @@ namespace SourceGen.AppForms {
ConfigureComboBox(asmConfigComboBox);
ConfigureComboBox(displayFmtQuickComboBox);
ConfigureComboBox(pseudoOpQuickComboBox);
+
+ expressionStyleComboBox.DisplayMember = "Name";
+ foreach (ExpressionStyleItem esi in sExpStyleItems) {
+ expressionStyleComboBox.Items.Add(esi);
+ }
}
private void ConfigureComboBox(ComboBox cb) {
@@ -238,9 +264,11 @@ namespace SourceGen.AppForms {
PopulateWidthDisamSettings();
string exprMode = mSettings.GetString(AppSettings.FMT_EXPRESSION_MODE, string.Empty);
- useMerlinExpressions.Checked =
- (Asm65.Formatter.FormatConfig.ParseExpressionMode(exprMode) ==
- Asm65.Formatter.FormatConfig.ExpressionMode.Merlin);
+ ExpressionMode mode;
+ if (!Enum.TryParse(exprMode, out mode)) {
+ mode = ExpressionMode.Common;
+ }
+ SetExpressionStyle(mode);
if (mInitialTab != Tab.Unknown) {
settingsTabControl.SelectTab((int)mInitialTab);
@@ -608,11 +636,20 @@ namespace SourceGen.AppForms {
// mSettings.GetString(AppSettings.FMT_OPERAND_PREFIX_LONG, string.Empty) + "'");
}
- private void shiftAfterAdjustCheckBox_CheckedChanged(object sender, EventArgs e) {
- string mode = useMerlinExpressions.Checked ?
- Asm65.Formatter.FormatConfig.ExpressionMode.Merlin.ToString() :
- Asm65.Formatter.FormatConfig.ExpressionMode.Cc65.ToString();
- mSettings.SetString(AppSettings.FMT_EXPRESSION_MODE, mode);
+ private void SetExpressionStyle(ExpressionMode mode) {
+ foreach (ExpressionStyleItem esi in expressionStyleComboBox.Items) {
+ if (esi.ExpMode == mode) {
+ expressionStyleComboBox.SelectedItem = esi;
+ return;
+ }
+ }
+ Debug.Assert(false, "Expression mode " + mode + " not found");
+ expressionStyleComboBox.SelectedIndex = 0;
+ }
+
+ private void expressionStyleComboBox_SelectedIndexChanged(object sender, EventArgs e) {
+ ExpressionStyleItem esi = (ExpressionStyleItem)expressionStyleComboBox.SelectedItem;
+ mSettings.SetString(AppSettings.FMT_EXPRESSION_MODE, esi.ExpMode.ToString());
SetDirty(true);
}
@@ -629,15 +666,13 @@ namespace SourceGen.AppForms {
formatConfig.mForceLongOpcodeSuffix,
formatConfig.mForceAbsOperandPrefix,
formatConfig.mForceLongOperandPrefix);
- useMerlinExpressions.Checked = (formatConfig.mExpressionMode ==
- Asm65.Formatter.FormatConfig.ExpressionMode.Merlin);
-
+ SetExpressionStyle(formatConfig.mExpressionMode);
// dirty flag set by change watchers if one or more fields have changed
}
private void quickFmtDefaultButton_Click(object sender, EventArgs e) {
SetWidthDisamSettings(null, "l", "a:", "f:");
- useMerlinExpressions.Checked = false;
+ SetExpressionStyle(ExpressionMode.Common);
// dirty flag set by change watchers if one or more fields have changed
}
diff --git a/SourceGen/RuntimeData/Help/settings.html b/SourceGen/RuntimeData/Help/settings.html
index 701ddb8..2d716d0 100644
--- a/SourceGen/RuntimeData/Help/settings.html
+++ b/SourceGen/RuntimeData/Help/settings.html
@@ -121,10 +121,10 @@ do not affect generated code.
strings are used when the width of an instruction operand is unclear.
You may specify values for all of them or none of them.
-The Merlin assembler uses an expression syntax that is compact but
-different from many other cross-assemblers. Notably, the byte-selection
-operators ('<', '>', '^') act like shift operators, yielding
-16-bit values when wide registers are enabled on the 65816.
+Different assemblers have different ways of forming expressions.
+Sometimes the rules allow expressions to be written simply, other times
+explicit grouping with parenthesis is required. Select whichever style
+you are most comfortable with.
The "quick set" buttons configure the fields on this tab to match
the conventions of the specified assembler. Select your preferred assembler