mirror of
https://github.com/fadden/6502bench.git
synced 2025-03-03 14:32:06 +00:00
First cut of split-address table formatter
Allows specification of table data in various ways, for 16-bit and 24-bit addresses. Shows a preview so you can see if the addresses look about right. Adds permanent labels at target offsets if none are present. Optionally sets code hints. Works beautifully on the A2-Amper-fdraw example, but needs some additional testing, documentation, etc. Dialog is more complicated that I would have liked, mostly because of 65816 support, but I think it'll do. (issue #10)
This commit is contained in:
parent
d4726dac7e
commit
f4e4ac842d
178
SourceGen/AppForms/FormatSplitAddress.Designer.cs
generated
178
SourceGen/AppForms/FormatSplitAddress.Designer.cs
generated
@ -23,15 +23,16 @@
|
|||||||
/// the contents of this method with the code editor.
|
/// the contents of this method with the code editor.
|
||||||
/// </summary>
|
/// </summary>
|
||||||
private void InitializeComponent() {
|
private void InitializeComponent() {
|
||||||
System.Windows.Forms.ListViewItem listViewItem2 = new System.Windows.Forms.ListViewItem(new string[] {
|
System.Windows.Forms.ListViewItem listViewItem5 = new System.Windows.Forms.ListViewItem(new string[] {
|
||||||
"123456",
|
"12/3456",
|
||||||
|
"+123456",
|
||||||
"(+) T_123456"}, -1);
|
"(+) T_123456"}, -1);
|
||||||
this.cancelButton = new System.Windows.Forms.Button();
|
this.cancelButton = new System.Windows.Forms.Button();
|
||||||
this.okButton = new System.Windows.Forms.Button();
|
this.okButton = new System.Windows.Forms.Button();
|
||||||
this.selectionInfoLabel = new System.Windows.Forms.Label();
|
this.selectionInfoLabel = new System.Windows.Forms.Label();
|
||||||
this.addressCharacteristicsGroup = new System.Windows.Forms.GroupBox();
|
this.addressCharacteristicsGroup = new System.Windows.Forms.GroupBox();
|
||||||
this.returnAddrCheckBox = new System.Windows.Forms.CheckBox();
|
this.pushRtsCheckBox = new System.Windows.Forms.CheckBox();
|
||||||
this.width24Button = new System.Windows.Forms.RadioButton();
|
this.width24Radio = new System.Windows.Forms.RadioButton();
|
||||||
this.width16Radio = new System.Windows.Forms.RadioButton();
|
this.width16Radio = new System.Windows.Forms.RadioButton();
|
||||||
this.lowByteGroupBox = new System.Windows.Forms.GroupBox();
|
this.lowByteGroupBox = new System.Windows.Forms.GroupBox();
|
||||||
this.lowThirdPartRadio = new System.Windows.Forms.RadioButton();
|
this.lowThirdPartRadio = new System.Windows.Forms.RadioButton();
|
||||||
@ -51,8 +52,11 @@
|
|||||||
this.addrColumnHeader = ((System.Windows.Forms.ColumnHeader)(new System.Windows.Forms.ColumnHeader()));
|
this.addrColumnHeader = ((System.Windows.Forms.ColumnHeader)(new System.Windows.Forms.ColumnHeader()));
|
||||||
this.symbolColumnHeader = ((System.Windows.Forms.ColumnHeader)(new System.Windows.Forms.ColumnHeader()));
|
this.symbolColumnHeader = ((System.Windows.Forms.ColumnHeader)(new System.Windows.Forms.ColumnHeader()));
|
||||||
this.outputPreviewGroupBox = new System.Windows.Forms.GroupBox();
|
this.outputPreviewGroupBox = new System.Windows.Forms.GroupBox();
|
||||||
|
this.invalidConstantLabel = new System.Windows.Forms.Label();
|
||||||
|
this.incompatibleSelectionLabel = new System.Windows.Forms.Label();
|
||||||
this.addCodeHintCheckBox = new System.Windows.Forms.CheckBox();
|
this.addCodeHintCheckBox = new System.Windows.Forms.CheckBox();
|
||||||
this.optionsGroupBox = new System.Windows.Forms.GroupBox();
|
this.optionsGroupBox = new System.Windows.Forms.GroupBox();
|
||||||
|
this.offsetColumnHeader = ((System.Windows.Forms.ColumnHeader)(new System.Windows.Forms.ColumnHeader()));
|
||||||
this.addressCharacteristicsGroup.SuspendLayout();
|
this.addressCharacteristicsGroup.SuspendLayout();
|
||||||
this.lowByteGroupBox.SuspendLayout();
|
this.lowByteGroupBox.SuspendLayout();
|
||||||
this.highByteGroupBox.SuspendLayout();
|
this.highByteGroupBox.SuspendLayout();
|
||||||
@ -65,10 +69,10 @@
|
|||||||
//
|
//
|
||||||
this.cancelButton.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Right)));
|
this.cancelButton.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Right)));
|
||||||
this.cancelButton.DialogResult = System.Windows.Forms.DialogResult.Cancel;
|
this.cancelButton.DialogResult = System.Windows.Forms.DialogResult.Cancel;
|
||||||
this.cancelButton.Location = new System.Drawing.Point(479, 465);
|
this.cancelButton.Location = new System.Drawing.Point(461, 461);
|
||||||
this.cancelButton.Name = "cancelButton";
|
this.cancelButton.Name = "cancelButton";
|
||||||
this.cancelButton.Size = new System.Drawing.Size(75, 23);
|
this.cancelButton.Size = new System.Drawing.Size(75, 23);
|
||||||
this.cancelButton.TabIndex = 0;
|
this.cancelButton.TabIndex = 8;
|
||||||
this.cancelButton.Text = "Cancel";
|
this.cancelButton.Text = "Cancel";
|
||||||
this.cancelButton.UseVisualStyleBackColor = true;
|
this.cancelButton.UseVisualStyleBackColor = true;
|
||||||
//
|
//
|
||||||
@ -76,10 +80,10 @@
|
|||||||
//
|
//
|
||||||
this.okButton.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Right)));
|
this.okButton.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Right)));
|
||||||
this.okButton.DialogResult = System.Windows.Forms.DialogResult.OK;
|
this.okButton.DialogResult = System.Windows.Forms.DialogResult.OK;
|
||||||
this.okButton.Location = new System.Drawing.Point(398, 465);
|
this.okButton.Location = new System.Drawing.Point(380, 461);
|
||||||
this.okButton.Name = "okButton";
|
this.okButton.Name = "okButton";
|
||||||
this.okButton.Size = new System.Drawing.Size(75, 23);
|
this.okButton.Size = new System.Drawing.Size(75, 23);
|
||||||
this.okButton.TabIndex = 1;
|
this.okButton.TabIndex = 7;
|
||||||
this.okButton.Text = "OK";
|
this.okButton.Text = "OK";
|
||||||
this.okButton.UseVisualStyleBackColor = true;
|
this.okButton.UseVisualStyleBackColor = true;
|
||||||
this.okButton.Click += new System.EventHandler(this.okButton_Click);
|
this.okButton.Click += new System.EventHandler(this.okButton_Click);
|
||||||
@ -89,42 +93,44 @@
|
|||||||
this.selectionInfoLabel.AutoSize = true;
|
this.selectionInfoLabel.AutoSize = true;
|
||||||
this.selectionInfoLabel.Location = new System.Drawing.Point(13, 13);
|
this.selectionInfoLabel.Location = new System.Drawing.Point(13, 13);
|
||||||
this.selectionInfoLabel.Name = "selectionInfoLabel";
|
this.selectionInfoLabel.Name = "selectionInfoLabel";
|
||||||
this.selectionInfoLabel.Size = new System.Drawing.Size(207, 13);
|
this.selectionInfoLabel.Size = new System.Drawing.Size(213, 13);
|
||||||
this.selectionInfoLabel.TabIndex = 2;
|
this.selectionInfoLabel.TabIndex = 0;
|
||||||
this.selectionInfoLabel.Text = "There are {0} bytes selected in {1} groups.";
|
this.selectionInfoLabel.Text = "There are {0} bytes selected, in {1} group(s)";
|
||||||
//
|
//
|
||||||
// addressCharacteristicsGroup
|
// addressCharacteristicsGroup
|
||||||
//
|
//
|
||||||
this.addressCharacteristicsGroup.Controls.Add(this.returnAddrCheckBox);
|
this.addressCharacteristicsGroup.Controls.Add(this.pushRtsCheckBox);
|
||||||
this.addressCharacteristicsGroup.Controls.Add(this.width24Button);
|
this.addressCharacteristicsGroup.Controls.Add(this.width24Radio);
|
||||||
this.addressCharacteristicsGroup.Controls.Add(this.width16Radio);
|
this.addressCharacteristicsGroup.Controls.Add(this.width16Radio);
|
||||||
this.addressCharacteristicsGroup.Location = new System.Drawing.Point(16, 44);
|
this.addressCharacteristicsGroup.Location = new System.Drawing.Point(16, 40);
|
||||||
this.addressCharacteristicsGroup.Name = "addressCharacteristicsGroup";
|
this.addressCharacteristicsGroup.Name = "addressCharacteristicsGroup";
|
||||||
this.addressCharacteristicsGroup.Size = new System.Drawing.Size(222, 90);
|
this.addressCharacteristicsGroup.Size = new System.Drawing.Size(204, 90);
|
||||||
this.addressCharacteristicsGroup.TabIndex = 3;
|
this.addressCharacteristicsGroup.TabIndex = 1;
|
||||||
this.addressCharacteristicsGroup.TabStop = false;
|
this.addressCharacteristicsGroup.TabStop = false;
|
||||||
this.addressCharacteristicsGroup.Text = "Address Characteristics";
|
this.addressCharacteristicsGroup.Text = "Address Characteristics";
|
||||||
//
|
//
|
||||||
// returnAddrCheckBox
|
// pushRtsCheckBox
|
||||||
//
|
//
|
||||||
this.returnAddrCheckBox.AutoSize = true;
|
this.pushRtsCheckBox.AutoSize = true;
|
||||||
this.returnAddrCheckBox.Location = new System.Drawing.Point(7, 68);
|
this.pushRtsCheckBox.Location = new System.Drawing.Point(7, 68);
|
||||||
this.returnAddrCheckBox.Name = "returnAddrCheckBox";
|
this.pushRtsCheckBox.Name = "pushRtsCheckBox";
|
||||||
this.returnAddrCheckBox.Size = new System.Drawing.Size(170, 17);
|
this.pushRtsCheckBox.Size = new System.Drawing.Size(167, 17);
|
||||||
this.returnAddrCheckBox.TabIndex = 2;
|
this.pushRtsCheckBox.TabIndex = 2;
|
||||||
this.returnAddrCheckBox.Text = "Return addresses (address - 1)";
|
this.pushRtsCheckBox.Text = "Push for RTS/RTL (target - 1)";
|
||||||
this.returnAddrCheckBox.UseVisualStyleBackColor = true;
|
this.pushRtsCheckBox.UseVisualStyleBackColor = true;
|
||||||
|
this.pushRtsCheckBox.CheckedChanged += new System.EventHandler(this.pushRtsCheckBox_CheckedChanged);
|
||||||
//
|
//
|
||||||
// width24Button
|
// width24Radio
|
||||||
//
|
//
|
||||||
this.width24Button.AutoSize = true;
|
this.width24Radio.AutoSize = true;
|
||||||
this.width24Button.Location = new System.Drawing.Point(7, 44);
|
this.width24Radio.Location = new System.Drawing.Point(7, 44);
|
||||||
this.width24Button.Name = "width24Button";
|
this.width24Radio.Name = "width24Radio";
|
||||||
this.width24Button.Size = new System.Drawing.Size(51, 17);
|
this.width24Radio.Size = new System.Drawing.Size(51, 17);
|
||||||
this.width24Button.TabIndex = 1;
|
this.width24Radio.TabIndex = 1;
|
||||||
this.width24Button.TabStop = true;
|
this.width24Radio.TabStop = true;
|
||||||
this.width24Button.Text = "24-bit";
|
this.width24Radio.Text = "24-bit";
|
||||||
this.width24Button.UseVisualStyleBackColor = true;
|
this.width24Radio.UseVisualStyleBackColor = true;
|
||||||
|
this.width24Radio.CheckedChanged += new System.EventHandler(this.widthRadio_CheckedChanged);
|
||||||
//
|
//
|
||||||
// width16Radio
|
// width16Radio
|
||||||
//
|
//
|
||||||
@ -136,16 +142,17 @@
|
|||||||
this.width16Radio.TabStop = true;
|
this.width16Radio.TabStop = true;
|
||||||
this.width16Radio.Text = "16-bit";
|
this.width16Radio.Text = "16-bit";
|
||||||
this.width16Radio.UseVisualStyleBackColor = true;
|
this.width16Radio.UseVisualStyleBackColor = true;
|
||||||
|
this.width16Radio.CheckedChanged += new System.EventHandler(this.widthRadio_CheckedChanged);
|
||||||
//
|
//
|
||||||
// lowByteGroupBox
|
// lowByteGroupBox
|
||||||
//
|
//
|
||||||
this.lowByteGroupBox.Controls.Add(this.lowThirdPartRadio);
|
this.lowByteGroupBox.Controls.Add(this.lowThirdPartRadio);
|
||||||
this.lowByteGroupBox.Controls.Add(this.lowSecondPartRadio);
|
this.lowByteGroupBox.Controls.Add(this.lowSecondPartRadio);
|
||||||
this.lowByteGroupBox.Controls.Add(this.lowFirstPartRadio);
|
this.lowByteGroupBox.Controls.Add(this.lowFirstPartRadio);
|
||||||
this.lowByteGroupBox.Location = new System.Drawing.Point(13, 140);
|
this.lowByteGroupBox.Location = new System.Drawing.Point(13, 136);
|
||||||
this.lowByteGroupBox.Name = "lowByteGroupBox";
|
this.lowByteGroupBox.Name = "lowByteGroupBox";
|
||||||
this.lowByteGroupBox.Size = new System.Drawing.Size(225, 94);
|
this.lowByteGroupBox.Size = new System.Drawing.Size(207, 94);
|
||||||
this.lowByteGroupBox.TabIndex = 4;
|
this.lowByteGroupBox.TabIndex = 2;
|
||||||
this.lowByteGroupBox.TabStop = false;
|
this.lowByteGroupBox.TabStop = false;
|
||||||
this.lowByteGroupBox.Text = "Low Byte";
|
this.lowByteGroupBox.Text = "Low Byte";
|
||||||
//
|
//
|
||||||
@ -159,6 +166,7 @@
|
|||||||
this.lowThirdPartRadio.TabStop = true;
|
this.lowThirdPartRadio.TabStop = true;
|
||||||
this.lowThirdPartRadio.Text = "Third part of selection";
|
this.lowThirdPartRadio.Text = "Third part of selection";
|
||||||
this.lowThirdPartRadio.UseVisualStyleBackColor = true;
|
this.lowThirdPartRadio.UseVisualStyleBackColor = true;
|
||||||
|
this.lowThirdPartRadio.CheckedChanged += new System.EventHandler(this.lowByte_CheckedChanged);
|
||||||
//
|
//
|
||||||
// lowSecondPartRadio
|
// lowSecondPartRadio
|
||||||
//
|
//
|
||||||
@ -170,6 +178,7 @@
|
|||||||
this.lowSecondPartRadio.TabStop = true;
|
this.lowSecondPartRadio.TabStop = true;
|
||||||
this.lowSecondPartRadio.Text = "Second part of selection";
|
this.lowSecondPartRadio.Text = "Second part of selection";
|
||||||
this.lowSecondPartRadio.UseVisualStyleBackColor = true;
|
this.lowSecondPartRadio.UseVisualStyleBackColor = true;
|
||||||
|
this.lowSecondPartRadio.CheckedChanged += new System.EventHandler(this.lowByte_CheckedChanged);
|
||||||
//
|
//
|
||||||
// lowFirstPartRadio
|
// lowFirstPartRadio
|
||||||
//
|
//
|
||||||
@ -181,6 +190,7 @@
|
|||||||
this.lowFirstPartRadio.TabStop = true;
|
this.lowFirstPartRadio.TabStop = true;
|
||||||
this.lowFirstPartRadio.Text = "First part of selection";
|
this.lowFirstPartRadio.Text = "First part of selection";
|
||||||
this.lowFirstPartRadio.UseVisualStyleBackColor = true;
|
this.lowFirstPartRadio.UseVisualStyleBackColor = true;
|
||||||
|
this.lowFirstPartRadio.CheckedChanged += new System.EventHandler(this.lowByte_CheckedChanged);
|
||||||
//
|
//
|
||||||
// highByteGroupBox
|
// highByteGroupBox
|
||||||
//
|
//
|
||||||
@ -189,10 +199,10 @@
|
|||||||
this.highByteGroupBox.Controls.Add(this.highThirdPartRadio);
|
this.highByteGroupBox.Controls.Add(this.highThirdPartRadio);
|
||||||
this.highByteGroupBox.Controls.Add(this.highSecondPartRadio);
|
this.highByteGroupBox.Controls.Add(this.highSecondPartRadio);
|
||||||
this.highByteGroupBox.Controls.Add(this.highFirstPartRadio);
|
this.highByteGroupBox.Controls.Add(this.highFirstPartRadio);
|
||||||
this.highByteGroupBox.Location = new System.Drawing.Point(13, 240);
|
this.highByteGroupBox.Location = new System.Drawing.Point(13, 236);
|
||||||
this.highByteGroupBox.Name = "highByteGroupBox";
|
this.highByteGroupBox.Name = "highByteGroupBox";
|
||||||
this.highByteGroupBox.Size = new System.Drawing.Size(225, 120);
|
this.highByteGroupBox.Size = new System.Drawing.Size(207, 120);
|
||||||
this.highByteGroupBox.TabIndex = 5;
|
this.highByteGroupBox.TabIndex = 3;
|
||||||
this.highByteGroupBox.TabStop = false;
|
this.highByteGroupBox.TabStop = false;
|
||||||
this.highByteGroupBox.Text = "High Byte";
|
this.highByteGroupBox.Text = "High Byte";
|
||||||
//
|
//
|
||||||
@ -203,6 +213,7 @@
|
|||||||
this.highConstantTextBox.Name = "highConstantTextBox";
|
this.highConstantTextBox.Name = "highConstantTextBox";
|
||||||
this.highConstantTextBox.Size = new System.Drawing.Size(93, 20);
|
this.highConstantTextBox.Size = new System.Drawing.Size(93, 20);
|
||||||
this.highConstantTextBox.TabIndex = 4;
|
this.highConstantTextBox.TabIndex = 4;
|
||||||
|
this.highConstantTextBox.TextChanged += new System.EventHandler(this.highConstantTextBox_TextChanged);
|
||||||
//
|
//
|
||||||
// highConstantRadio
|
// highConstantRadio
|
||||||
//
|
//
|
||||||
@ -214,6 +225,7 @@
|
|||||||
this.highConstantRadio.TabStop = true;
|
this.highConstantRadio.TabStop = true;
|
||||||
this.highConstantRadio.Text = "Constant:";
|
this.highConstantRadio.Text = "Constant:";
|
||||||
this.highConstantRadio.UseVisualStyleBackColor = true;
|
this.highConstantRadio.UseVisualStyleBackColor = true;
|
||||||
|
this.highConstantRadio.CheckedChanged += new System.EventHandler(this.highByte_CheckedChanged);
|
||||||
//
|
//
|
||||||
// highThirdPartRadio
|
// highThirdPartRadio
|
||||||
//
|
//
|
||||||
@ -225,6 +237,7 @@
|
|||||||
this.highThirdPartRadio.TabStop = true;
|
this.highThirdPartRadio.TabStop = true;
|
||||||
this.highThirdPartRadio.Text = "Third part of selection";
|
this.highThirdPartRadio.Text = "Third part of selection";
|
||||||
this.highThirdPartRadio.UseVisualStyleBackColor = true;
|
this.highThirdPartRadio.UseVisualStyleBackColor = true;
|
||||||
|
this.highThirdPartRadio.CheckedChanged += new System.EventHandler(this.highByte_CheckedChanged);
|
||||||
//
|
//
|
||||||
// highSecondPartRadio
|
// highSecondPartRadio
|
||||||
//
|
//
|
||||||
@ -236,6 +249,7 @@
|
|||||||
this.highSecondPartRadio.TabStop = true;
|
this.highSecondPartRadio.TabStop = true;
|
||||||
this.highSecondPartRadio.Text = "Second part of selection";
|
this.highSecondPartRadio.Text = "Second part of selection";
|
||||||
this.highSecondPartRadio.UseVisualStyleBackColor = true;
|
this.highSecondPartRadio.UseVisualStyleBackColor = true;
|
||||||
|
this.highSecondPartRadio.CheckedChanged += new System.EventHandler(this.highByte_CheckedChanged);
|
||||||
//
|
//
|
||||||
// highFirstPartRadio
|
// highFirstPartRadio
|
||||||
//
|
//
|
||||||
@ -247,16 +261,17 @@
|
|||||||
this.highFirstPartRadio.TabStop = true;
|
this.highFirstPartRadio.TabStop = true;
|
||||||
this.highFirstPartRadio.Text = "First part of selection";
|
this.highFirstPartRadio.Text = "First part of selection";
|
||||||
this.highFirstPartRadio.UseVisualStyleBackColor = true;
|
this.highFirstPartRadio.UseVisualStyleBackColor = true;
|
||||||
|
this.highFirstPartRadio.CheckedChanged += new System.EventHandler(this.highByte_CheckedChanged);
|
||||||
//
|
//
|
||||||
// bankByteGroupBox
|
// bankByteGroupBox
|
||||||
//
|
//
|
||||||
this.bankByteGroupBox.Controls.Add(this.bankConstantTextBox);
|
this.bankByteGroupBox.Controls.Add(this.bankConstantTextBox);
|
||||||
this.bankByteGroupBox.Controls.Add(this.bankNthPartRadio);
|
this.bankByteGroupBox.Controls.Add(this.bankNthPartRadio);
|
||||||
this.bankByteGroupBox.Controls.Add(this.bankConstantRadio);
|
this.bankByteGroupBox.Controls.Add(this.bankConstantRadio);
|
||||||
this.bankByteGroupBox.Location = new System.Drawing.Point(13, 367);
|
this.bankByteGroupBox.Location = new System.Drawing.Point(13, 362);
|
||||||
this.bankByteGroupBox.Name = "bankByteGroupBox";
|
this.bankByteGroupBox.Name = "bankByteGroupBox";
|
||||||
this.bankByteGroupBox.Size = new System.Drawing.Size(225, 70);
|
this.bankByteGroupBox.Size = new System.Drawing.Size(207, 70);
|
||||||
this.bankByteGroupBox.TabIndex = 6;
|
this.bankByteGroupBox.TabIndex = 4;
|
||||||
this.bankByteGroupBox.TabStop = false;
|
this.bankByteGroupBox.TabStop = false;
|
||||||
this.bankByteGroupBox.Text = "Bank Byte";
|
this.bankByteGroupBox.Text = "Bank Byte";
|
||||||
//
|
//
|
||||||
@ -266,7 +281,8 @@
|
|||||||
this.bankConstantTextBox.MaxLength = 10;
|
this.bankConstantTextBox.MaxLength = 10;
|
||||||
this.bankConstantTextBox.Name = "bankConstantTextBox";
|
this.bankConstantTextBox.Name = "bankConstantTextBox";
|
||||||
this.bankConstantTextBox.Size = new System.Drawing.Size(93, 20);
|
this.bankConstantTextBox.Size = new System.Drawing.Size(93, 20);
|
||||||
this.bankConstantTextBox.TabIndex = 5;
|
this.bankConstantTextBox.TabIndex = 2;
|
||||||
|
this.bankConstantTextBox.TextChanged += new System.EventHandler(this.bankConstantTextBox_TextChanged);
|
||||||
//
|
//
|
||||||
// bankNthPartRadio
|
// bankNthPartRadio
|
||||||
//
|
//
|
||||||
@ -274,10 +290,11 @@
|
|||||||
this.bankNthPartRadio.Location = new System.Drawing.Point(10, 19);
|
this.bankNthPartRadio.Location = new System.Drawing.Point(10, 19);
|
||||||
this.bankNthPartRadio.Name = "bankNthPartRadio";
|
this.bankNthPartRadio.Name = "bankNthPartRadio";
|
||||||
this.bankNthPartRadio.Size = new System.Drawing.Size(120, 17);
|
this.bankNthPartRadio.Size = new System.Drawing.Size(120, 17);
|
||||||
this.bankNthPartRadio.TabIndex = 2;
|
this.bankNthPartRadio.TabIndex = 0;
|
||||||
this.bankNthPartRadio.TabStop = true;
|
this.bankNthPartRadio.TabStop = true;
|
||||||
this.bankNthPartRadio.Text = "Nth part of selection";
|
this.bankNthPartRadio.Text = "Nth part of selection";
|
||||||
this.bankNthPartRadio.UseVisualStyleBackColor = true;
|
this.bankNthPartRadio.UseVisualStyleBackColor = true;
|
||||||
|
this.bankNthPartRadio.CheckedChanged += new System.EventHandler(this.bankByte_CheckedChanged);
|
||||||
//
|
//
|
||||||
// bankConstantRadio
|
// bankConstantRadio
|
||||||
//
|
//
|
||||||
@ -289,6 +306,7 @@
|
|||||||
this.bankConstantRadio.TabStop = true;
|
this.bankConstantRadio.TabStop = true;
|
||||||
this.bankConstantRadio.Text = "Constant:";
|
this.bankConstantRadio.Text = "Constant:";
|
||||||
this.bankConstantRadio.UseVisualStyleBackColor = true;
|
this.bankConstantRadio.UseVisualStyleBackColor = true;
|
||||||
|
this.bankConstantRadio.CheckedChanged += new System.EventHandler(this.bankByte_CheckedChanged);
|
||||||
//
|
//
|
||||||
// outputPreviewListView
|
// outputPreviewListView
|
||||||
//
|
//
|
||||||
@ -296,38 +314,67 @@
|
|||||||
| System.Windows.Forms.AnchorStyles.Right)));
|
| System.Windows.Forms.AnchorStyles.Right)));
|
||||||
this.outputPreviewListView.Columns.AddRange(new System.Windows.Forms.ColumnHeader[] {
|
this.outputPreviewListView.Columns.AddRange(new System.Windows.Forms.ColumnHeader[] {
|
||||||
this.addrColumnHeader,
|
this.addrColumnHeader,
|
||||||
|
this.offsetColumnHeader,
|
||||||
this.symbolColumnHeader});
|
this.symbolColumnHeader});
|
||||||
|
this.outputPreviewListView.Font = new System.Drawing.Font("Consolas", 8.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0)));
|
||||||
this.outputPreviewListView.FullRowSelect = true;
|
this.outputPreviewListView.FullRowSelect = true;
|
||||||
this.outputPreviewListView.HeaderStyle = System.Windows.Forms.ColumnHeaderStyle.Nonclickable;
|
this.outputPreviewListView.HeaderStyle = System.Windows.Forms.ColumnHeaderStyle.Nonclickable;
|
||||||
this.outputPreviewListView.Items.AddRange(new System.Windows.Forms.ListViewItem[] {
|
this.outputPreviewListView.Items.AddRange(new System.Windows.Forms.ListViewItem[] {
|
||||||
listViewItem2});
|
listViewItem5});
|
||||||
this.outputPreviewListView.Location = new System.Drawing.Point(6, 19);
|
this.outputPreviewListView.Location = new System.Drawing.Point(6, 19);
|
||||||
this.outputPreviewListView.MultiSelect = false;
|
this.outputPreviewListView.MultiSelect = false;
|
||||||
this.outputPreviewListView.Name = "outputPreviewListView";
|
this.outputPreviewListView.Name = "outputPreviewListView";
|
||||||
this.outputPreviewListView.Size = new System.Drawing.Size(290, 369);
|
this.outputPreviewListView.Size = new System.Drawing.Size(290, 369);
|
||||||
this.outputPreviewListView.TabIndex = 7;
|
this.outputPreviewListView.TabIndex = 0;
|
||||||
this.outputPreviewListView.UseCompatibleStateImageBehavior = false;
|
this.outputPreviewListView.UseCompatibleStateImageBehavior = false;
|
||||||
this.outputPreviewListView.View = System.Windows.Forms.View.Details;
|
this.outputPreviewListView.View = System.Windows.Forms.View.Details;
|
||||||
//
|
//
|
||||||
// addrColumnHeader
|
// addrColumnHeader
|
||||||
//
|
//
|
||||||
this.addrColumnHeader.Text = "Addr";
|
this.addrColumnHeader.Text = "Addr";
|
||||||
|
this.addrColumnHeader.Width = 52;
|
||||||
//
|
//
|
||||||
// symbolColumnHeader
|
// symbolColumnHeader
|
||||||
//
|
//
|
||||||
this.symbolColumnHeader.Text = "Symbol";
|
this.symbolColumnHeader.Text = "Symbol";
|
||||||
this.symbolColumnHeader.Width = 200;
|
this.symbolColumnHeader.Width = 174;
|
||||||
//
|
//
|
||||||
// outputPreviewGroupBox
|
// outputPreviewGroupBox
|
||||||
//
|
//
|
||||||
this.outputPreviewGroupBox.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Right)));
|
this.outputPreviewGroupBox.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Right)));
|
||||||
|
this.outputPreviewGroupBox.Controls.Add(this.invalidConstantLabel);
|
||||||
|
this.outputPreviewGroupBox.Controls.Add(this.incompatibleSelectionLabel);
|
||||||
this.outputPreviewGroupBox.Controls.Add(this.outputPreviewListView);
|
this.outputPreviewGroupBox.Controls.Add(this.outputPreviewListView);
|
||||||
this.outputPreviewGroupBox.Location = new System.Drawing.Point(252, 44);
|
this.outputPreviewGroupBox.Location = new System.Drawing.Point(234, 40);
|
||||||
this.outputPreviewGroupBox.Name = "outputPreviewGroupBox";
|
this.outputPreviewGroupBox.Name = "outputPreviewGroupBox";
|
||||||
this.outputPreviewGroupBox.Size = new System.Drawing.Size(302, 394);
|
this.outputPreviewGroupBox.Size = new System.Drawing.Size(302, 393);
|
||||||
this.outputPreviewGroupBox.TabIndex = 8;
|
this.outputPreviewGroupBox.TabIndex = 6;
|
||||||
this.outputPreviewGroupBox.TabStop = false;
|
this.outputPreviewGroupBox.TabStop = false;
|
||||||
this.outputPreviewGroupBox.Text = "Output Preview";
|
this.outputPreviewGroupBox.Text = "Generated Addresses";
|
||||||
|
//
|
||||||
|
// invalidConstantLabel
|
||||||
|
//
|
||||||
|
this.invalidConstantLabel.AutoSize = true;
|
||||||
|
this.invalidConstantLabel.BackColor = System.Drawing.SystemColors.Window;
|
||||||
|
this.invalidConstantLabel.Font = new System.Drawing.Font("Microsoft Sans Serif", 9.75F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0)));
|
||||||
|
this.invalidConstantLabel.ForeColor = System.Drawing.Color.Red;
|
||||||
|
this.invalidConstantLabel.Location = new System.Drawing.Point(101, 200);
|
||||||
|
this.invalidConstantLabel.Name = "invalidConstantLabel";
|
||||||
|
this.invalidConstantLabel.Size = new System.Drawing.Size(100, 16);
|
||||||
|
this.invalidConstantLabel.TabIndex = 2;
|
||||||
|
this.invalidConstantLabel.Text = "Invalid constant";
|
||||||
|
//
|
||||||
|
// incompatibleSelectionLabel
|
||||||
|
//
|
||||||
|
this.incompatibleSelectionLabel.AutoSize = true;
|
||||||
|
this.incompatibleSelectionLabel.BackColor = System.Drawing.SystemColors.Window;
|
||||||
|
this.incompatibleSelectionLabel.Font = new System.Drawing.Font("Microsoft Sans Serif", 9.75F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0)));
|
||||||
|
this.incompatibleSelectionLabel.ForeColor = System.Drawing.Color.Red;
|
||||||
|
this.incompatibleSelectionLabel.Location = new System.Drawing.Point(43, 177);
|
||||||
|
this.incompatibleSelectionLabel.Name = "incompatibleSelectionLabel";
|
||||||
|
this.incompatibleSelectionLabel.Size = new System.Drawing.Size(216, 16);
|
||||||
|
this.incompatibleSelectionLabel.TabIndex = 1;
|
||||||
|
this.incompatibleSelectionLabel.Text = "Options incompatible with selection";
|
||||||
//
|
//
|
||||||
// addCodeHintCheckBox
|
// addCodeHintCheckBox
|
||||||
//
|
//
|
||||||
@ -336,26 +383,33 @@
|
|||||||
this.addCodeHintCheckBox.AutoSize = true;
|
this.addCodeHintCheckBox.AutoSize = true;
|
||||||
this.addCodeHintCheckBox.Location = new System.Drawing.Point(10, 19);
|
this.addCodeHintCheckBox.Location = new System.Drawing.Point(10, 19);
|
||||||
this.addCodeHintCheckBox.Name = "addCodeHintCheckBox";
|
this.addCodeHintCheckBox.Name = "addCodeHintCheckBox";
|
||||||
this.addCodeHintCheckBox.Size = new System.Drawing.Size(123, 17);
|
this.addCodeHintCheckBox.Size = new System.Drawing.Size(165, 17);
|
||||||
this.addCodeHintCheckBox.TabIndex = 8;
|
this.addCodeHintCheckBox.TabIndex = 0;
|
||||||
this.addCodeHintCheckBox.Text = "Add code entry hints";
|
this.addCodeHintCheckBox.Text = "Add code entry hint if needed";
|
||||||
this.addCodeHintCheckBox.UseVisualStyleBackColor = true;
|
this.addCodeHintCheckBox.UseVisualStyleBackColor = true;
|
||||||
//
|
//
|
||||||
// optionsGroupBox
|
// optionsGroupBox
|
||||||
//
|
//
|
||||||
this.optionsGroupBox.Controls.Add(this.addCodeHintCheckBox);
|
this.optionsGroupBox.Controls.Add(this.addCodeHintCheckBox);
|
||||||
this.optionsGroupBox.Location = new System.Drawing.Point(13, 444);
|
this.optionsGroupBox.Location = new System.Drawing.Point(13, 439);
|
||||||
this.optionsGroupBox.Name = "optionsGroupBox";
|
this.optionsGroupBox.Name = "optionsGroupBox";
|
||||||
this.optionsGroupBox.Size = new System.Drawing.Size(225, 43);
|
this.optionsGroupBox.Size = new System.Drawing.Size(207, 43);
|
||||||
this.optionsGroupBox.TabIndex = 9;
|
this.optionsGroupBox.TabIndex = 5;
|
||||||
this.optionsGroupBox.TabStop = false;
|
this.optionsGroupBox.TabStop = false;
|
||||||
this.optionsGroupBox.Text = "Options";
|
this.optionsGroupBox.Text = "Options";
|
||||||
//
|
//
|
||||||
|
// offsetColumnHeader
|
||||||
|
//
|
||||||
|
this.offsetColumnHeader.Text = "Offset";
|
||||||
|
this.offsetColumnHeader.Width = 55;
|
||||||
|
//
|
||||||
// FormatSplitAddress
|
// FormatSplitAddress
|
||||||
//
|
//
|
||||||
|
this.AcceptButton = this.okButton;
|
||||||
this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F);
|
this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F);
|
||||||
this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
|
this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
|
||||||
this.ClientSize = new System.Drawing.Size(566, 500);
|
this.CancelButton = this.cancelButton;
|
||||||
|
this.ClientSize = new System.Drawing.Size(548, 496);
|
||||||
this.Controls.Add(this.optionsGroupBox);
|
this.Controls.Add(this.optionsGroupBox);
|
||||||
this.Controls.Add(this.outputPreviewGroupBox);
|
this.Controls.Add(this.outputPreviewGroupBox);
|
||||||
this.Controls.Add(this.bankByteGroupBox);
|
this.Controls.Add(this.bankByteGroupBox);
|
||||||
@ -382,6 +436,7 @@
|
|||||||
this.bankByteGroupBox.ResumeLayout(false);
|
this.bankByteGroupBox.ResumeLayout(false);
|
||||||
this.bankByteGroupBox.PerformLayout();
|
this.bankByteGroupBox.PerformLayout();
|
||||||
this.outputPreviewGroupBox.ResumeLayout(false);
|
this.outputPreviewGroupBox.ResumeLayout(false);
|
||||||
|
this.outputPreviewGroupBox.PerformLayout();
|
||||||
this.optionsGroupBox.ResumeLayout(false);
|
this.optionsGroupBox.ResumeLayout(false);
|
||||||
this.optionsGroupBox.PerformLayout();
|
this.optionsGroupBox.PerformLayout();
|
||||||
this.ResumeLayout(false);
|
this.ResumeLayout(false);
|
||||||
@ -396,8 +451,8 @@
|
|||||||
private System.Windows.Forms.Label selectionInfoLabel;
|
private System.Windows.Forms.Label selectionInfoLabel;
|
||||||
private System.Windows.Forms.GroupBox addressCharacteristicsGroup;
|
private System.Windows.Forms.GroupBox addressCharacteristicsGroup;
|
||||||
private System.Windows.Forms.RadioButton width16Radio;
|
private System.Windows.Forms.RadioButton width16Radio;
|
||||||
private System.Windows.Forms.RadioButton width24Button;
|
private System.Windows.Forms.RadioButton width24Radio;
|
||||||
private System.Windows.Forms.CheckBox returnAddrCheckBox;
|
private System.Windows.Forms.CheckBox pushRtsCheckBox;
|
||||||
private System.Windows.Forms.GroupBox lowByteGroupBox;
|
private System.Windows.Forms.GroupBox lowByteGroupBox;
|
||||||
private System.Windows.Forms.RadioButton lowFirstPartRadio;
|
private System.Windows.Forms.RadioButton lowFirstPartRadio;
|
||||||
private System.Windows.Forms.RadioButton lowSecondPartRadio;
|
private System.Windows.Forms.RadioButton lowSecondPartRadio;
|
||||||
@ -418,5 +473,8 @@
|
|||||||
private System.Windows.Forms.GroupBox outputPreviewGroupBox;
|
private System.Windows.Forms.GroupBox outputPreviewGroupBox;
|
||||||
private System.Windows.Forms.CheckBox addCodeHintCheckBox;
|
private System.Windows.Forms.CheckBox addCodeHintCheckBox;
|
||||||
private System.Windows.Forms.GroupBox optionsGroupBox;
|
private System.Windows.Forms.GroupBox optionsGroupBox;
|
||||||
|
private System.Windows.Forms.Label incompatibleSelectionLabel;
|
||||||
|
private System.Windows.Forms.Label invalidConstantLabel;
|
||||||
|
private System.Windows.Forms.ColumnHeader offsetColumnHeader;
|
||||||
}
|
}
|
||||||
}
|
}
|
@ -20,54 +20,409 @@ using System.Windows.Forms;
|
|||||||
|
|
||||||
using Asm65;
|
using Asm65;
|
||||||
using CommonUtil;
|
using CommonUtil;
|
||||||
|
using CommonWinForms;
|
||||||
|
|
||||||
namespace SourceGen.AppForms {
|
namespace SourceGen.AppForms {
|
||||||
public partial class FormatSplitAddress : Form {
|
public partial class FormatSplitAddress : Form {
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// Result set that describes the formatting to perform. Not all regions will have
|
/// Format descriptors to apply.
|
||||||
/// the same format, e.g. the "mixed ASCII" mode will alternate strings and bytes
|
|
||||||
/// (rather than a dedicated "mixed ASCII" format type).
|
|
||||||
/// </summary>
|
/// </summary>
|
||||||
public SortedList<int, FormatDescriptor> Results { get; private set; }
|
public SortedList<int, FormatDescriptor> NewFormatDescriptors { get; private set; }
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// User labels to apply.
|
||||||
|
/// </summary>
|
||||||
|
public Dictionary<int, Symbol> NewUserLabels { get; private set; }
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// All target offsets found. The list may contain redundant entries.
|
||||||
|
/// </summary>
|
||||||
|
public List<int> AllTargetOffsets { get; private set; }
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// Selected offsets. An otherwise contiguous range of offsets can be broken up
|
/// Selected offsets. An otherwise contiguous range of offsets can be broken up
|
||||||
/// by user-specified labels and address discontinuities, so this needs to be
|
/// by user-specified labels and address discontinuities, so this needs to be
|
||||||
/// processed by range.
|
/// processed by range.
|
||||||
/// </summary>
|
/// </summary>
|
||||||
public TypedRangeSet Selection { private get; set; }
|
private TypedRangeSet mSelection;
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// Raw file data.
|
/// Project reference.
|
||||||
/// </summary>
|
/// </summary>
|
||||||
private byte[] mFileData;
|
private DisasmProject mProject;
|
||||||
|
|
||||||
/// <summary>
|
|
||||||
/// Symbol table to use when resolving symbolic values.
|
|
||||||
/// </summary>
|
|
||||||
private SymbolTable mSymbolTable;
|
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// Formatter to use when displaying addresses and hex values.
|
/// Formatter to use when displaying addresses and hex values.
|
||||||
/// </summary>
|
/// </summary>
|
||||||
private Asm65.Formatter mFormatter;
|
private Formatter mFormatter;
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Set to prevent controls from going nuts while initializing.
|
||||||
|
/// </summary>
|
||||||
|
private bool mInitializing;
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Set to true when valid output is available.
|
||||||
|
/// </summary>
|
||||||
|
private bool mOutputReady;
|
||||||
|
|
||||||
|
|
||||||
public FormatSplitAddress(byte[] fileData, SymbolTable symbolTable,
|
public FormatSplitAddress(DisasmProject project, TypedRangeSet selection,
|
||||||
Formatter formatter) {
|
Formatter formatter) {
|
||||||
InitializeComponent();
|
InitializeComponent();
|
||||||
|
|
||||||
mFileData = fileData;
|
mProject = project;
|
||||||
mSymbolTable = symbolTable;
|
|
||||||
mFormatter = formatter;
|
mFormatter = formatter;
|
||||||
|
mSelection = selection;
|
||||||
|
|
||||||
|
mOutputReady = false;
|
||||||
}
|
}
|
||||||
|
|
||||||
private void FormatSplitAddress_Load(object sender, EventArgs e) {
|
private void FormatSplitAddress_Load(object sender, EventArgs e) {
|
||||||
|
mInitializing = true;
|
||||||
|
|
||||||
|
string fmt = selectionInfoLabel.Text;
|
||||||
|
selectionInfoLabel.Text = string.Format(fmt, mSelection.Count, mSelection.RangeCount);
|
||||||
|
|
||||||
|
width16Radio.Checked = true;
|
||||||
|
lowFirstPartRadio.Checked = true;
|
||||||
|
highSecondPartRadio.Checked = true;
|
||||||
|
bankNthPartRadio.Checked = true;
|
||||||
|
|
||||||
|
incompatibleSelectionLabel.Visible = invalidConstantLabel.Visible = false;
|
||||||
|
|
||||||
|
if (mProject.CpuDef.HasAddr16) {
|
||||||
|
// Disable the 24-bit option. Having 16-bit selected will disable the rest.
|
||||||
|
width24Radio.Enabled = false;
|
||||||
|
}
|
||||||
|
|
||||||
|
outputPreviewListView.SetDoubleBuffered(true);
|
||||||
|
|
||||||
|
mInitializing = false;
|
||||||
|
UpdateControls();
|
||||||
}
|
}
|
||||||
|
|
||||||
private void okButton_Click(object sender, EventArgs e) {
|
private void okButton_Click(object sender, EventArgs e) { }
|
||||||
Results = new SortedList<int, FormatDescriptor>();
|
|
||||||
|
private void UpdateControls() {
|
||||||
|
if (mInitializing) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
mInitializing = true; // no re-entry
|
||||||
|
|
||||||
|
lowThirdPartRadio.Enabled = width24Radio.Checked;
|
||||||
|
highThirdPartRadio.Enabled = width24Radio.Checked;
|
||||||
|
bankByteGroupBox.Enabled = width24Radio.Checked;
|
||||||
|
|
||||||
|
lowSecondPartRadio.Enabled = true;
|
||||||
|
|
||||||
|
// If the user selects "constant" for high byte or bank byte, then there is no
|
||||||
|
// 3rd part available for low/high, so we need to turn those back off.
|
||||||
|
if (width24Radio.Checked) {
|
||||||
|
bool haveThree = !(highConstantRadio.Checked || bankConstantRadio.Checked);
|
||||||
|
lowThirdPartRadio.Enabled = haveThree;
|
||||||
|
highThirdPartRadio.Enabled = haveThree;
|
||||||
|
|
||||||
|
// If "constant" is selected for high byte *and* bank byte, then there's no
|
||||||
|
// 2nd part available for low.
|
||||||
|
if (highConstantRadio.Checked && bankConstantRadio.Checked) {
|
||||||
|
lowSecondPartRadio.Enabled = false;
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
// For 16-bit address, if high byte is constant, then there's no second
|
||||||
|
// part for the low byte.
|
||||||
|
if (highConstantRadio.Checked) {
|
||||||
|
lowSecondPartRadio.Enabled = false;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// Was a now-invalidated radio button selected before?
|
||||||
|
if (!lowThirdPartRadio.Enabled && lowThirdPartRadio.Checked) {
|
||||||
|
// low now invalid, switch to whatever high isn't using
|
||||||
|
if (highFirstPartRadio.Checked) {
|
||||||
|
lowSecondPartRadio.Checked = true;
|
||||||
|
} else {
|
||||||
|
lowFirstPartRadio.Checked = true;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if (!highThirdPartRadio.Enabled && highThirdPartRadio.Checked) {
|
||||||
|
// high now invalid, switch to whatever low isn't using
|
||||||
|
if (lowFirstPartRadio.Checked) {
|
||||||
|
highSecondPartRadio.Checked = true;
|
||||||
|
} else {
|
||||||
|
highFirstPartRadio.Checked = true;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if (!lowSecondPartRadio.Enabled && lowSecondPartRadio.Checked) {
|
||||||
|
// Should only happen when high part is constant.
|
||||||
|
Debug.Assert(highFirstPartRadio.Checked == false);
|
||||||
|
lowFirstPartRadio.Checked = true;
|
||||||
|
}
|
||||||
|
|
||||||
|
mInitializing = false;
|
||||||
|
UpdatePreview();
|
||||||
|
|
||||||
|
okButton.Enabled = mOutputReady;
|
||||||
|
}
|
||||||
|
|
||||||
|
private void widthRadio_CheckedChanged(object sender, EventArgs e) {
|
||||||
|
UpdateControls();
|
||||||
|
}
|
||||||
|
|
||||||
|
private void pushRtsCheckBox_CheckedChanged(object sender, EventArgs e) {
|
||||||
|
UpdateControls();
|
||||||
|
}
|
||||||
|
|
||||||
|
private void lowByte_CheckedChanged(object sender, EventArgs e) {
|
||||||
|
// If we conflict with the high byte, change the high byte.
|
||||||
|
if (lowFirstPartRadio.Checked && highFirstPartRadio.Checked) {
|
||||||
|
highSecondPartRadio.Checked = true;
|
||||||
|
} else if (lowSecondPartRadio.Checked && highSecondPartRadio.Checked) {
|
||||||
|
highFirstPartRadio.Checked = true;
|
||||||
|
} else if (lowThirdPartRadio.Checked && highThirdPartRadio.Checked) {
|
||||||
|
highFirstPartRadio.Checked = true;
|
||||||
|
}
|
||||||
|
UpdateControls();
|
||||||
|
}
|
||||||
|
|
||||||
|
private void highByte_CheckedChanged(object sender, EventArgs e) {
|
||||||
|
// If we conflict with the low byte, change the low byte.
|
||||||
|
if (lowFirstPartRadio.Checked && highFirstPartRadio.Checked) {
|
||||||
|
lowSecondPartRadio.Checked = true;
|
||||||
|
} else if (lowSecondPartRadio.Checked && highSecondPartRadio.Checked) {
|
||||||
|
lowFirstPartRadio.Checked = true;
|
||||||
|
} else if (lowThirdPartRadio.Checked && highThirdPartRadio.Checked) {
|
||||||
|
lowFirstPartRadio.Checked = true;
|
||||||
|
}
|
||||||
|
UpdateControls();
|
||||||
|
}
|
||||||
|
|
||||||
|
private void bankByte_CheckedChanged(object sender, EventArgs e) {
|
||||||
|
UpdateControls();
|
||||||
|
}
|
||||||
|
|
||||||
|
private void highConstantTextBox_TextChanged(object sender, EventArgs e) {
|
||||||
|
highConstantRadio.Checked = true;
|
||||||
|
UpdateControls();
|
||||||
|
}
|
||||||
|
|
||||||
|
private void bankConstantTextBox_TextChanged(object sender, EventArgs e) {
|
||||||
|
bankConstantRadio.Checked = true;
|
||||||
|
UpdateControls();
|
||||||
|
}
|
||||||
|
|
||||||
|
private void UpdatePreview() {
|
||||||
|
mOutputReady = false;
|
||||||
|
|
||||||
|
int minDiv;
|
||||||
|
|
||||||
|
if (width16Radio.Checked) {
|
||||||
|
if (highConstantRadio.Checked) {
|
||||||
|
minDiv = 1;
|
||||||
|
} else {
|
||||||
|
minDiv = 2;
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
if (highConstantRadio.Checked) {
|
||||||
|
if (bankConstantRadio.Checked) {
|
||||||
|
minDiv = 1;
|
||||||
|
} else {
|
||||||
|
minDiv = 2;
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
if (bankConstantRadio.Checked) {
|
||||||
|
minDiv = 2;
|
||||||
|
} else {
|
||||||
|
minDiv = 3;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
incompatibleSelectionLabel.Visible = invalidConstantLabel.Visible = false;
|
||||||
|
|
||||||
|
try {
|
||||||
|
// Start by clearing the previous contents of the list. If something goes
|
||||||
|
// wrong, we want to show the error messages on an empty list.
|
||||||
|
outputPreviewListView.BeginUpdate();
|
||||||
|
outputPreviewListView.Items.Clear();
|
||||||
|
|
||||||
|
if ((mSelection.Count % minDiv) != 0) {
|
||||||
|
incompatibleSelectionLabel.Visible = true;
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
int highConstant = -1;
|
||||||
|
if (highConstantRadio.Checked) {
|
||||||
|
if (!Number.TryParseInt(highConstantTextBox.Text, out highConstant,
|
||||||
|
out int unused) || (highConstant != (byte) highConstant)) {
|
||||||
|
invalidConstantLabel.Visible = true;
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
int bankConstant = -1;
|
||||||
|
if (bankConstantRadio.Enabled && bankConstantRadio.Checked) {
|
||||||
|
if (!Number.TryParseInt(bankConstantTextBox.Text, out bankConstant,
|
||||||
|
out int unused) || (bankConstant != (byte) bankConstant)) {
|
||||||
|
invalidConstantLabel.Visible = true;
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// Looks valid, generate format list.
|
||||||
|
GenerateFormats(minDiv, highConstant, bankConstant);
|
||||||
|
} finally {
|
||||||
|
outputPreviewListView.EndUpdate();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private void GenerateFormats(int div, int highConst, int bankConst) {
|
||||||
|
SortedList<int, FormatDescriptor> newDfds = new SortedList<int, FormatDescriptor>();
|
||||||
|
Dictionary<int, Symbol> newLabels = new Dictionary<int, Symbol>();
|
||||||
|
List<int> targetOffsets = new List<int>();
|
||||||
|
|
||||||
|
// Identify the offset where each set of data starts.
|
||||||
|
int span = mSelection.Count / div;
|
||||||
|
int lowOff, highOff, bankOff;
|
||||||
|
|
||||||
|
if (lowFirstPartRadio.Checked) {
|
||||||
|
lowOff = 0;
|
||||||
|
} else if (lowSecondPartRadio.Checked) {
|
||||||
|
lowOff = span;
|
||||||
|
} else if (lowThirdPartRadio.Checked) {
|
||||||
|
lowOff = span * 2;
|
||||||
|
} else {
|
||||||
|
Debug.Assert(false);
|
||||||
|
lowOff = -1;
|
||||||
|
}
|
||||||
|
if (highFirstPartRadio.Checked) {
|
||||||
|
highOff = 0;
|
||||||
|
} else if (highSecondPartRadio.Checked) {
|
||||||
|
highOff = span;
|
||||||
|
} else if (highThirdPartRadio.Checked) {
|
||||||
|
highOff = span * 2;
|
||||||
|
} else {
|
||||||
|
highOff = -1; // use constant
|
||||||
|
}
|
||||||
|
if (width24Radio.Checked) {
|
||||||
|
if (bankNthPartRadio.Checked) {
|
||||||
|
// Use whichever part isn't being used by the other two.
|
||||||
|
if (lowOff != 0 && highOff != 0) {
|
||||||
|
bankOff = 0;
|
||||||
|
} else if (lowOff != span && highOff != span) {
|
||||||
|
bankOff = span;
|
||||||
|
} else {
|
||||||
|
Debug.Assert(lowOff != span * 2 && highOff != span * 2);
|
||||||
|
bankOff = span * 2;
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
bankOff = -1; // use constant
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
bankOff = -1; // use constant
|
||||||
|
bankConst = 0; // always bank 0
|
||||||
|
}
|
||||||
|
|
||||||
|
Debug.WriteLine("Extract from low=" + lowOff + " high=" + highOff +
|
||||||
|
" bank=" + bankOff);
|
||||||
|
|
||||||
|
// The TypedRangeSet doesn't have an index operation, so copy the values into
|
||||||
|
// an array.
|
||||||
|
int[] offsets = new int[mSelection.Count];
|
||||||
|
int index = 0;
|
||||||
|
foreach (TypedRangeSet.Tuple tup in mSelection) {
|
||||||
|
offsets[index++] = tup.Value;
|
||||||
|
}
|
||||||
|
|
||||||
|
int adj = 0;
|
||||||
|
if (pushRtsCheckBox.Checked) {
|
||||||
|
adj = 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Walk through the file data, generating addresses as we go.
|
||||||
|
byte[] fileData = mProject.FileData;
|
||||||
|
for (int i = 0; i < span; i++) {
|
||||||
|
byte low, high, bank;
|
||||||
|
|
||||||
|
low = fileData[offsets[lowOff + i]];
|
||||||
|
if (highOff >= 0) {
|
||||||
|
high = fileData[offsets[highOff + i]];
|
||||||
|
} else {
|
||||||
|
high = (byte) highConst;
|
||||||
|
}
|
||||||
|
if (bankOff >= 0) {
|
||||||
|
bank = fileData[offsets[bankOff + i]];
|
||||||
|
} else {
|
||||||
|
bank = (byte) bankConst;
|
||||||
|
}
|
||||||
|
|
||||||
|
int addr = ((bank << 16) | (high << 8) | low) + adj;
|
||||||
|
Debug.WriteLine("GOT " + i + ": " + addr.ToString("x6"));
|
||||||
|
|
||||||
|
int targetOffset = mProject.AddrMap.AddressToOffset(offsets[0], addr);
|
||||||
|
if (targetOffset < 0) {
|
||||||
|
// Address not within file bounds.
|
||||||
|
// TODO(maybe): look for matching platform/project symbols
|
||||||
|
AddPreviewItem(addr, -1, Properties.Resources.INVALID_ADDRESS);
|
||||||
|
} else {
|
||||||
|
// Note the same target offset may appear more than once.
|
||||||
|
targetOffsets.Add(targetOffset);
|
||||||
|
|
||||||
|
// If there's a user-defined label there already, use it. Otherwise, we'll
|
||||||
|
// need to generate one.
|
||||||
|
string targetLabel;
|
||||||
|
if (mProject.UserLabels.TryGetValue(targetOffset, out Symbol sym)) {
|
||||||
|
AddPreviewItem(addr, targetOffset, sym.Label);
|
||||||
|
targetLabel = sym.Label;
|
||||||
|
} else {
|
||||||
|
AddPreviewItem(addr, targetOffset, "(+)");
|
||||||
|
// Generate a symbol that's unique vs. the symbol table. We don't need
|
||||||
|
// it to be unique vs. the labels we're generating here, because we
|
||||||
|
// won't generate identical labels for different addresses, and we do
|
||||||
|
// want to generate a single label if more than one table entry refers
|
||||||
|
// to the same target.
|
||||||
|
Symbol tmpSym = SymbolTable.GenerateUniqueForAddress(addr,
|
||||||
|
mProject.SymbolTable, "T");
|
||||||
|
// tmpSym was returned as an auto-label, make it a user label instead
|
||||||
|
tmpSym = new Symbol(tmpSym.Label, tmpSym.Value, Symbol.Source.User,
|
||||||
|
Symbol.Type.LocalOrGlobalAddr);
|
||||||
|
newLabels[targetOffset] = tmpSym; // overwrites previous
|
||||||
|
targetLabel = tmpSym.Label;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Now we need to create format descriptors for the addresses where we
|
||||||
|
// extracted the low, high, and bank values.
|
||||||
|
newDfds.Add(offsets[lowOff + i], FormatDescriptor.Create(1,
|
||||||
|
new WeakSymbolRef(targetLabel, WeakSymbolRef.Part.Low), false));
|
||||||
|
if (highOff >= 0) {
|
||||||
|
newDfds.Add(offsets[highOff + i], FormatDescriptor.Create(1,
|
||||||
|
new WeakSymbolRef(targetLabel, WeakSymbolRef.Part.High), false));
|
||||||
|
}
|
||||||
|
if (bankOff >= 0) {
|
||||||
|
newDfds.Add(offsets[bankOff + i], FormatDescriptor.Create(1,
|
||||||
|
new WeakSymbolRef(targetLabel, WeakSymbolRef.Part.Bank), false));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
NewFormatDescriptors = newDfds;
|
||||||
|
NewUserLabels = newLabels;
|
||||||
|
AllTargetOffsets = targetOffsets;
|
||||||
|
|
||||||
|
mOutputReady = true;
|
||||||
|
}
|
||||||
|
|
||||||
|
private void AddPreviewItem(int addr, int offset, string label) {
|
||||||
|
ListViewItem lvi = new ListViewItem(mFormatter.FormatAddress(addr,
|
||||||
|
!mProject.CpuDef.HasAddr16));
|
||||||
|
if (offset >= 0) {
|
||||||
|
lvi.SubItems.Add(new ListViewItem.ListViewSubItem(lvi,
|
||||||
|
mFormatter.FormatOffset24(offset)));
|
||||||
|
} else {
|
||||||
|
lvi.SubItems.Add(new ListViewItem.ListViewSubItem(lvi, "---"));
|
||||||
|
}
|
||||||
|
lvi.SubItems.Add(new ListViewItem.ListViewSubItem(lvi, label));
|
||||||
|
outputPreviewListView.Items.Add(lvi);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -2225,7 +2225,7 @@ namespace SourceGen.AppForms {
|
|||||||
}
|
}
|
||||||
|
|
||||||
formatSplitAddressTableToolStripMenuItem.Enabled =
|
formatSplitAddressTableToolStripMenuItem.Enabled =
|
||||||
(entityCounts.mDataLines > 1 && entityCounts.mCodeLines == 0);
|
(entityCounts.mDataLines > 0 && entityCounts.mCodeLines == 0);
|
||||||
toggleSingleBytesToolStripMenuItem.Enabled =
|
toggleSingleBytesToolStripMenuItem.Enabled =
|
||||||
(entityCounts.mDataLines > 0 && entityCounts.mCodeLines == 0);
|
(entityCounts.mDataLines > 0 && entityCounts.mCodeLines == 0);
|
||||||
|
|
||||||
@ -2618,27 +2618,56 @@ namespace SourceGen.AppForms {
|
|||||||
}
|
}
|
||||||
|
|
||||||
private void FormatSplitAddressTable_Click(object sender, EventArgs e) {
|
private void FormatSplitAddressTable_Click(object sender, EventArgs e) {
|
||||||
FormatSplitAddress dlg = new FormatSplitAddress(mProject.FileData,
|
TypedRangeSet trs = GroupedOffsetSetFromSelected();
|
||||||
mProject.SymbolTable, mOutputFormatter);
|
|
||||||
|
|
||||||
TypedRangeSet trs = dlg.Selection = GroupedOffsetSetFromSelected();
|
|
||||||
if (trs.Count == 0) {
|
if (trs.Count == 0) {
|
||||||
// shouldn't happen
|
// shouldn't happen
|
||||||
Debug.Assert(false, "FormatSplitAddressTable found nothing to edit");
|
Debug.Assert(false, "FormatSplitAddressTable found nothing to edit");
|
||||||
dlg.Dispose();
|
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
// TODO: check to see if the selection is eligible for treatment as a
|
FormatSplitAddress dlg = new FormatSplitAddress(mProject, trs, mOutputFormatter);
|
||||||
// split-address table. If not, show a dialog explaining why.
|
|
||||||
|
|
||||||
dlg.ShowDialog();
|
dlg.ShowDialog();
|
||||||
if (dlg.DialogResult == DialogResult.OK) {
|
if (dlg.DialogResult == DialogResult.OK) {
|
||||||
ChangeSet cs = mProject.GenerateFormatMergeSet(dlg.Results);
|
// Start with the format descriptors.
|
||||||
|
ChangeSet cs = mProject.GenerateFormatMergeSet(dlg.NewFormatDescriptors);
|
||||||
|
|
||||||
|
// Add in the user labels.
|
||||||
|
foreach (KeyValuePair<int, Symbol> kvp in dlg.NewUserLabels) {
|
||||||
|
Symbol oldUserValue = null;
|
||||||
|
if (mProject.UserLabels.ContainsKey(kvp.Key)) {
|
||||||
|
Debug.Assert(false, "should not be replacing label");
|
||||||
|
oldUserValue = mProject.UserLabels[kvp.Key];
|
||||||
|
}
|
||||||
|
UndoableChange uc = UndoableChange.CreateLabelChange(kvp.Key,
|
||||||
|
oldUserValue, kvp.Value);
|
||||||
|
cs.Add(uc);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
// Apply code hints.
|
||||||
|
TypedRangeSet newSet = new TypedRangeSet();
|
||||||
|
TypedRangeSet undoSet = new TypedRangeSet();
|
||||||
|
|
||||||
|
foreach (int offset in dlg.AllTargetOffsets) {
|
||||||
|
if (!mProject.GetAnattrib(offset).IsInstruction) {
|
||||||
|
CodeAnalysis.TypeHint oldType = mProject.TypeHints[offset];
|
||||||
|
if (oldType == CodeAnalysis.TypeHint.Code) {
|
||||||
|
continue; // already set
|
||||||
|
}
|
||||||
|
undoSet.Add(offset, (int)oldType);
|
||||||
|
newSet.Add(offset, (int)CodeAnalysis.TypeHint.Code);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if (newSet.Count != 0) {
|
||||||
|
cs.Add(UndoableChange.CreateTypeHintChange(undoSet, newSet));
|
||||||
|
}
|
||||||
|
|
||||||
|
// Finally, apply the change.
|
||||||
if (cs.Count != 0) {
|
if (cs.Count != 0) {
|
||||||
ApplyUndoableChanges(cs);
|
ApplyUndoableChanges(cs);
|
||||||
} else {
|
} else {
|
||||||
Debug.WriteLine("No change to data formats");
|
Debug.WriteLine("No changes found");
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -292,7 +292,7 @@ namespace SourceGen {
|
|||||||
// up with a user or platform label that matches an auto label, so we
|
// up with a user or platform label that matches an auto label, so we
|
||||||
// need to do some renaming in that case. Shouldn't happen often.
|
// need to do some renaming in that case. Shouldn't happen often.
|
||||||
Symbol sym = SymbolTable.GenerateUniqueForAddress(mAnattribs[targetOffset].Address,
|
Symbol sym = SymbolTable.GenerateUniqueForAddress(mAnattribs[targetOffset].Address,
|
||||||
mProject.SymbolTable);
|
mProject.SymbolTable, "L");
|
||||||
mAnattribs[targetOffset].Symbol = sym;
|
mAnattribs[targetOffset].Symbol = sym;
|
||||||
// This will throw if the symbol already exists. That is the desired
|
// This will throw if the symbol already exists. That is the desired
|
||||||
// behavior, as that would be a bug.
|
// behavior, as that would be a bug.
|
||||||
|
9
SourceGen/Properties/Resources.Designer.cs
generated
9
SourceGen/Properties/Resources.Designer.cs
generated
@ -582,6 +582,15 @@ namespace SourceGen.Properties {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Looks up a localized string similar to (unknown address).
|
||||||
|
/// </summary>
|
||||||
|
internal static string INVALID_ADDRESS {
|
||||||
|
get {
|
||||||
|
return ResourceManager.GetString("INVALID_ADDRESS", resourceCulture);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// Looks up a localized string similar to Legal Stuff.
|
/// Looks up a localized string similar to Legal Stuff.
|
||||||
/// </summary>
|
/// </summary>
|
||||||
|
@ -291,6 +291,9 @@
|
|||||||
<data name="INITIAL_SYMBOL_FILES" xml:space="preserve">
|
<data name="INITIAL_SYMBOL_FILES" xml:space="preserve">
|
||||||
<value>Symbol files:</value>
|
<value>Symbol files:</value>
|
||||||
</data>
|
</data>
|
||||||
|
<data name="INVALID_ADDRESS" xml:space="preserve">
|
||||||
|
<value>(unknown address)</value>
|
||||||
|
</data>
|
||||||
<data name="LEGAL_STUFF_TITLE" xml:space="preserve">
|
<data name="LEGAL_STUFF_TITLE" xml:space="preserve">
|
||||||
<value>Legal Stuff</value>
|
<value>Legal Stuff</value>
|
||||||
</data>
|
</data>
|
||||||
|
@ -216,10 +216,13 @@ namespace SourceGen {
|
|||||||
/// Generates a unique address symbol. Does not add the symbol to the list.
|
/// Generates a unique address symbol. Does not add the symbol to the list.
|
||||||
/// </summary>
|
/// </summary>
|
||||||
/// <param name="addr">Address label will be applied to</param>
|
/// <param name="addr">Address label will be applied to</param>
|
||||||
|
/// <param name="symbols">Symbol table.</param>
|
||||||
|
/// <param name="prefix">Prefix to use; must start with a letter.</param>
|
||||||
/// <returns>Newly-created, unique symbol.</returns>
|
/// <returns>Newly-created, unique symbol.</returns>
|
||||||
public static Symbol GenerateUniqueForAddress(int addr, SymbolTable symbols) {
|
public static Symbol GenerateUniqueForAddress(int addr, SymbolTable symbols,
|
||||||
|
string prefix) {
|
||||||
// $1234 == L1234, $05/1234 == L51234.
|
// $1234 == L1234, $05/1234 == L51234.
|
||||||
string label = "L" + addr.ToString("X4");
|
string label = prefix + addr.ToString("X4"); // always upper-case
|
||||||
if (symbols.TryGetValue(label, out Symbol unused)) {
|
if (symbols.TryGetValue(label, out Symbol unused)) {
|
||||||
const int MAX_RENAME = 999;
|
const int MAX_RENAME = 999;
|
||||||
string baseLabel = label;
|
string baseLabel = label;
|
||||||
|
Loading…
x
Reference in New Issue
Block a user