diff --git a/PIC_Simulator/Form1.Designer.cs b/PIC_Simulator/Form1.Designer.cs index 3c72638..199c613 100644 --- a/PIC_Simulator/Form1.Designer.cs +++ b/PIC_Simulator/Form1.Designer.cs @@ -29,9 +29,7 @@ private void InitializeComponent() { this.components = new System.ComponentModel.Container(); - System.Windows.Forms.ListViewItem listViewItem2 = new System.Windows.Forms.ListViewItem("INDF"); this.label1 = new System.Windows.Forms.Label(); - this.label2 = new System.Windows.Forms.Label(); this.box_CodeView = new System.Windows.Forms.RichTextBox(); this.lbl_path = new System.Windows.Forms.Label(); this.openFileDialog1 = new System.Windows.Forms.OpenFileDialog(); @@ -47,7 +45,7 @@ this.cmdOpenDoc = new System.Windows.Forms.ToolStripMenuItem(); this.label4 = new System.Windows.Forms.Label(); this.timer1 = new System.Windows.Forms.Timer(this.components); - this.listView1 = new System.Windows.Forms.ListView(); + this.lvMemory = new System.Windows.Forms.ListView(); this.columnHeader1 = ((System.Windows.Forms.ColumnHeader)(new System.Windows.Forms.ColumnHeader())); this.columnHeader2 = ((System.Windows.Forms.ColumnHeader)(new System.Windows.Forms.ColumnHeader())); this.columnHeader3 = ((System.Windows.Forms.ColumnHeader)(new System.Windows.Forms.ColumnHeader())); @@ -59,6 +57,9 @@ this.cmd_Stop = new System.Windows.Forms.Button(); this.lbl_Timer = new System.Windows.Forms.Label(); this.insertTime = new System.Windows.Forms.TextBox(); + this.lvSpecial = new System.Windows.Forms.ListView(); + this.c1 = ((System.Windows.Forms.ColumnHeader)(new System.Windows.Forms.ColumnHeader())); + this.c2 = ((System.Windows.Forms.ColumnHeader)(new System.Windows.Forms.ColumnHeader())); this.menuStrip1.SuspendLayout(); this.SuspendLayout(); // @@ -72,23 +73,13 @@ this.label1.Size = new System.Drawing.Size(0, 13); this.label1.TabIndex = 1; // - // label2 - // - this.label2.AutoSize = true; - this.label2.Location = new System.Drawing.Point(8, 469); - this.label2.Margin = new System.Windows.Forms.Padding(2, 0, 2, 0); - this.label2.Name = "label2"; - this.label2.Size = new System.Drawing.Size(78, 13); - this.label2.TabIndex = 2; - this.label2.Text = "Programmpfad:"; - // // box_CodeView // this.box_CodeView.Location = new System.Drawing.Point(8, 77); - this.box_CodeView.Margin = new System.Windows.Forms.Padding(2, 2, 2, 2); + this.box_CodeView.Margin = new System.Windows.Forms.Padding(2); this.box_CodeView.Name = "box_CodeView"; this.box_CodeView.ReadOnly = true; - this.box_CodeView.Size = new System.Drawing.Size(626, 376); + this.box_CodeView.Size = new System.Drawing.Size(626, 476); this.box_CodeView.TabIndex = 3; this.box_CodeView.Text = ""; this.box_CodeView.WordWrap = false; @@ -109,7 +100,7 @@ // cmd_Start // this.cmd_Start.Location = new System.Drawing.Point(11, 29); - this.cmd_Start.Margin = new System.Windows.Forms.Padding(2, 2, 2, 2); + this.cmd_Start.Margin = new System.Windows.Forms.Padding(2); this.cmd_Start.Name = "cmd_Start"; this.cmd_Start.Size = new System.Drawing.Size(50, 23); this.cmd_Start.TabIndex = 5; @@ -120,7 +111,7 @@ // cmd_next // this.cmd_next.Location = new System.Drawing.Point(126, 31); - this.cmd_next.Margin = new System.Windows.Forms.Padding(2, 2, 2, 2); + this.cmd_next.Margin = new System.Windows.Forms.Padding(2); this.cmd_next.Name = "cmd_next"; this.cmd_next.Size = new System.Drawing.Size(50, 21); this.cmd_next.TabIndex = 6; @@ -131,7 +122,7 @@ // cmd_reset // this.cmd_reset.Location = new System.Drawing.Point(190, 31); - this.cmd_reset.Margin = new System.Windows.Forms.Padding(2, 2, 2, 2); + this.cmd_reset.Margin = new System.Windows.Forms.Padding(2); this.cmd_reset.Name = "cmd_reset"; this.cmd_reset.Size = new System.Drawing.Size(50, 21); this.cmd_reset.TabIndex = 7; @@ -214,9 +205,9 @@ // this.timer1.Tick += new System.EventHandler(this.timer1_Tick); // - // listView1 + // lvMemory // - this.listView1.Columns.AddRange(new System.Windows.Forms.ColumnHeader[] { + this.lvMemory.Columns.AddRange(new System.Windows.Forms.ColumnHeader[] { this.columnHeader1, this.columnHeader2, this.columnHeader3, @@ -225,53 +216,58 @@ this.columnHeader6, this.columnHeader7, this.columnHeader8}); - this.listView1.Items.AddRange(new System.Windows.Forms.ListViewItem[] { - listViewItem2}); - this.listView1.Location = new System.Drawing.Point(680, 77); - this.listView1.Margin = new System.Windows.Forms.Padding(2, 2, 2, 2); - this.listView1.Name = "listView1"; - this.listView1.Size = new System.Drawing.Size(326, 285); - this.listView1.TabIndex = 14; - this.listView1.UseCompatibleStateImageBehavior = false; - this.listView1.View = System.Windows.Forms.View.Details; + this.lvMemory.Location = new System.Drawing.Point(733, 78); + this.lvMemory.Margin = new System.Windows.Forms.Padding(2); + this.lvMemory.Name = "lvMemory"; + this.lvMemory.Size = new System.Drawing.Size(304, 297); + this.lvMemory.TabIndex = 14; + this.lvMemory.UseCompatibleStateImageBehavior = false; + this.lvMemory.View = System.Windows.Forms.View.Details; // // columnHeader1 // this.columnHeader1.Text = "0"; + this.columnHeader1.Width = 32; // // columnHeader2 // this.columnHeader2.Text = "1"; + this.columnHeader2.Width = 32; // // columnHeader3 // this.columnHeader3.Text = "2"; + this.columnHeader3.Width = 32; // // columnHeader4 // this.columnHeader4.Text = "3"; + this.columnHeader4.Width = 32; // // columnHeader5 // this.columnHeader5.Text = "4"; + this.columnHeader5.Width = 32; // // columnHeader6 // this.columnHeader6.Text = "5"; - this.columnHeader6.Width = 62; + this.columnHeader6.Width = 32; // // columnHeader7 // this.columnHeader7.Text = "6"; + this.columnHeader7.Width = 32; // // columnHeader8 // this.columnHeader8.Text = "7"; + this.columnHeader8.Width = 32; // // cmd_Stop // this.cmd_Stop.Location = new System.Drawing.Point(64, 30); - this.cmd_Stop.Margin = new System.Windows.Forms.Padding(2, 2, 2, 2); + this.cmd_Stop.Margin = new System.Windows.Forms.Padding(2); this.cmd_Stop.Name = "cmd_Stop"; this.cmd_Stop.Size = new System.Drawing.Size(50, 22); this.cmd_Stop.TabIndex = 15; @@ -292,21 +288,45 @@ // insertTime // this.insertTime.Location = new System.Drawing.Point(894, 31); - this.insertTime.Margin = new System.Windows.Forms.Padding(2, 2, 2, 2); + this.insertTime.Margin = new System.Windows.Forms.Padding(2); this.insertTime.Name = "insertTime"; this.insertTime.Size = new System.Drawing.Size(47, 20); this.insertTime.TabIndex = 17; - this.insertTime.Text = "100"; + this.insertTime.Text = "500"; + // + // lvSpecial + // + this.lvSpecial.Columns.AddRange(new System.Windows.Forms.ColumnHeader[] { + this.c1, + this.c2}); + this.lvSpecial.Location = new System.Drawing.Point(638, 378); + this.lvSpecial.Margin = new System.Windows.Forms.Padding(2); + this.lvSpecial.Name = "lvSpecial"; + this.lvSpecial.Size = new System.Drawing.Size(399, 175); + this.lvSpecial.TabIndex = 18; + this.lvSpecial.UseCompatibleStateImageBehavior = false; + this.lvSpecial.View = System.Windows.Forms.View.Details; + // + // c1 + // + this.c1.Text = "Name"; + this.c1.Width = 128; + // + // c2 + // + this.c2.Text = "Wert"; + this.c2.Width = 128; // // Form1 // this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F); this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; - this.ClientSize = new System.Drawing.Size(1048, 488); + this.ClientSize = new System.Drawing.Size(1048, 585); + this.Controls.Add(this.lvSpecial); this.Controls.Add(this.insertTime); this.Controls.Add(this.lbl_Timer); this.Controls.Add(this.cmd_Stop); - this.Controls.Add(this.listView1); + this.Controls.Add(this.lvMemory); this.Controls.Add(this.label4); this.Controls.Add(this.label3); this.Controls.Add(this.cmd_reset); @@ -314,11 +334,10 @@ this.Controls.Add(this.cmd_Start); this.Controls.Add(this.lbl_path); this.Controls.Add(this.box_CodeView); - this.Controls.Add(this.label2); this.Controls.Add(this.label1); this.Controls.Add(this.menuStrip1); this.MainMenuStrip = this.menuStrip1; - this.Margin = new System.Windows.Forms.Padding(2, 2, 2, 2); + this.Margin = new System.Windows.Forms.Padding(2); this.Name = "Form1"; this.StartPosition = System.Windows.Forms.FormStartPosition.CenterScreen; this.Text = "PIC Simulator"; @@ -331,8 +350,7 @@ } #endregion - private System.Windows.Forms.Label label1; - private System.Windows.Forms.Label label2; + private System.Windows.Forms.Label label1; private System.Windows.Forms.RichTextBox box_CodeView; private System.Windows.Forms.Label lbl_path; private System.Windows.Forms.OpenFileDialog openFileDialog1; @@ -347,7 +365,7 @@ private System.Windows.Forms.ToolStripMenuItem cmdOpenDoc; private System.Windows.Forms.Label label4; private System.Windows.Forms.Timer timer1; - private System.Windows.Forms.ListView listView1; + private System.Windows.Forms.ListView lvMemory; private System.Windows.Forms.ColumnHeader columnHeader1; private System.Windows.Forms.ColumnHeader columnHeader2; private System.Windows.Forms.ColumnHeader columnHeader3; @@ -360,6 +378,9 @@ private System.Windows.Forms.Button cmd_Stop; private System.Windows.Forms.Label lbl_Timer; private System.Windows.Forms.TextBox insertTime; + private System.Windows.Forms.ListView lvSpecial; + private System.Windows.Forms.ColumnHeader c1; + private System.Windows.Forms.ColumnHeader c2; } } diff --git a/PIC_Simulator/Form1.cs b/PIC_Simulator/Form1.cs index d3c0bdb..b7a62f0 100644 --- a/PIC_Simulator/Form1.cs +++ b/PIC_Simulator/Form1.cs @@ -11,12 +11,25 @@ namespace PIC_Simulator { private PICProgramm programm; - private Timer quartztimer = new Timer(); + private Timer quartztimer; public Form1() { InitializeComponent(); + quartztimer = new Timer(); + quartztimer.Tick += timer1_Tick; + + for (int i = 0; i < 32; i++) + { + var item = new ListViewItem(new[] {"00", "00", "00", "00", "00", "00", "00", "00"}); + lvMemory.Items.Add(item); + } + + lvSpecial.Items.Add(new ListViewItem(new[] { "W", "0x00" })); + lvSpecial.Items.Add(new ListViewItem(new[] { "PC", "0x00" })); + lvSpecial.Items.Add(new ListViewItem(new[] { "Status", "0b00000000" })); + lvSpecial.Items.Add(new ListViewItem(new[] { "Time", "0ms" })); } private void Form1_Load(object sender, EventArgs e) @@ -27,6 +40,8 @@ namespace PIC_Simulator programm = new PICProgramm(); programm.Laden(Resources.TPicSim1); + + OberflaecheAktualisieren(); } private void cmd_Start_Click(object sender, EventArgs e) @@ -51,6 +66,8 @@ namespace PIC_Simulator programm = new PICProgramm(); programm.Laden(datei); + + OberflaecheAktualisieren(); } } @@ -68,10 +85,15 @@ namespace PIC_Simulator int i2 = box_CodeView.GetFirstCharIndexFromLine(line + 1); if (i2 < 0 || i1 < 0) { - box_CodeView.SelectionColor = Color.Transparent; + box_CodeView.SelectionStart = 0; + box_CodeView.SelectionLength = box_CodeView.TextLength; + box_CodeView.SelectionBackColor = box_CodeView.BackColor; } else { + box_CodeView.SelectionStart = 0; + box_CodeView.SelectionLength = box_CodeView.TextLength; + box_CodeView.SelectionBackColor = box_CodeView.BackColor; box_CodeView.SelectionStart = i1; box_CodeView.SelectionLength = i2 - i1; box_CodeView.SelectionBackColor = Color.SteelBlue; @@ -80,7 +102,12 @@ namespace PIC_Simulator private void cmd_reset_Click(object sender, EventArgs e) { - //TODO + quartztimer.Stop(); + + programm = new PICProgramm(); + programm.Laden(box_CodeView.Text); + + OberflaecheAktualisieren(); } private void beendenToolStripMenuItem_Click(object sender, EventArgs e) @@ -102,9 +129,37 @@ namespace PIC_Simulator { bool finished = programm.Step(); - if (finished) { quartztimer.Stop(); return; } + if (finished) { quartztimer.Stop(); MessageBox.Show("Finished"); return; } - Highlight(programm.befehle[programm.PCCounter].zeilennummer); + OberflaecheAktualisieren(); + } + + private void OberflaecheAktualisieren() + { + // Zeile highlighten + + if (programm.befehle.Count > 0 && programm.PCCounter < programm.befehle.Count) + { + Highlight(programm.befehle[programm.PCCounter].zeilennummer); + } + + // Memory aktualisieren + + for (int y = 0; y < 32; y++) + { + for (int x = 0; x < 8; x++) + { + string nummer = string.Format("{0:X2}", programm.Register[y*8 + x]); + if (nummer != lvMemory.Items[y].SubItems[x].Text) lvMemory.Items[y].SubItems[x].Text = nummer; + } + } + + // Spezialregister aktualisieren + + lvSpecial.Items[0].SubItems[1].Text = string.Format("0x{0:X2}", programm.Register_W); + lvSpecial.Items[1].SubItems[1].Text = string.Format("{0,4}", programm.PCCounter); + lvSpecial.Items[2].SubItems[1].Text = string.Format("0b{0}", Convert.ToString(programm.GetRegisterOhneBank(PICProgramm.ADDR_STATUS), 2).PadLeft(8, '0')); + lvSpecial.Items[1].SubItems[1].Text = string.Format("{0}ms", programm.Stepcount * int.Parse(insertTime.Text)); } } } diff --git a/PIC_Simulator/PIC/PICProgramm.cs b/PIC_Simulator/PIC/PICProgramm.cs index 47eb562..fa6e579 100644 --- a/PIC_Simulator/PIC/PICProgramm.cs +++ b/PIC_Simulator/PIC/PICProgramm.cs @@ -14,6 +14,8 @@ namespace PIC_Simulator.PIC public uint parameter_k; public uint parameter_b; + public int labelnummer; + public int zeilennummer; } @@ -108,6 +110,7 @@ namespace PIC_Simulator.PIC public List befehle; public int PCCounter = 0; // -> nächster befehl + public int Stepcount = 0; public uint Register_W = 0; public uint[] Register = new uint[0x100]; @@ -121,7 +124,7 @@ namespace PIC_Simulator.PIC { befehle = new List(); - int zn = 0; + int zn = -1; foreach (var zeile in Regex.Split(code, @"\r?\n")) { zn++; @@ -177,6 +180,7 @@ namespace PIC_Simulator.PIC b.parameter_x = p_x; b.parameter_b = p_b; b.zeilennummer = zeilennummer; + b.labelnummer = Convert.ToInt32(zeile.Substring(0, 4), 16); return b; } } @@ -496,7 +500,7 @@ namespace PIC_Simulator.PIC } else if (aktueller_befehl.befehl == GOTO) { - //TODO + PCCounter = befehle.FindIndex(b => b.labelnummer == aktueller_befehl.parameter_k) - 1; } else if (aktueller_befehl.befehl == IORLW) { @@ -559,6 +563,10 @@ namespace PIC_Simulator.PIC Register_W = Result; ; } + PCCounter++; + Stepcount++; + + return PCCounter >= befehle.Count; } private uint GetRegister(uint index) @@ -602,11 +610,16 @@ namespace PIC_Simulator.PIC Register[index] = SetBit(Register[index], bit, wert); } - private bool GetRegisterOhneBank(uint index, uint bit) + public bool GetRegisterOhneBank(uint index, uint bit) { return GetBit(Register[index], bit); } + public uint GetRegisterOhneBank(uint index) + { + return Register[index]; + } + public static bool AdditionDigitCarry(uint a, uint b) { a &= 0x0F; diff --git a/Projektinformationen/Lastenheft.pdf b/Projektinformationen/Lastenheft.pdf new file mode 100644 index 0000000..6ad3d6a Binary files /dev/null and b/Projektinformationen/Lastenheft.pdf differ