//Eingelesene Zeile aufteilen in einzelne Komponente fuer Uebersichtlichkeit private Befehlszeile parseLine(String sLine, int lineNr) { Befehlszeile line = new Befehlszeile(); string[] myStrings = sLine.Split(new Char[] { ' ' }, StringSplitOptions.RemoveEmptyEntries); if (myStrings.Length > 2 && myStrings[0].Length == 4) { line.PclAsString = myStrings[0]; line.Pcl = int.Parse(myStrings[0], NumberStyles.AllowHexSpecifier); line.OpCodeAsString = myStrings[1]; line.OpCode = int.Parse(myStrings[1], NumberStyles.AllowHexSpecifier); line.State = ""; line.LineNr = lineNr; for (int i = 3; i < myStrings.Length; i++) { if (myStrings[i].StartsWith(";")) { break; } line.Command += myStrings[i] + " "; } return(line); } // zeilennummer + state vorhanden (zeilennummer + kommentare ausschließen) if (myStrings.Length == 2 && myStrings[1] != ";") { line.PclAsString = ""; line.Pcl = 99999; line.OpCodeAsString = ""; line.OpCode = 99999; line.State = myStrings[1]; line.Command = ""; line.LineNr = lineNr; return(line); } return(null); }
//Datei einlesen public void readFile() { Befehlszeile codeLine = new Befehlszeile(); StreamReader streamReader = new StreamReader(this.m_sDateiPfad); String sLine = ""; int lineNr = 0; while (sLine != null) { sLine = streamReader.ReadLine(); if (sLine != null) { codeLine = parseLine(sLine, lineNr); if (codeLine != null) { BefehlszeilenSatz.Instanz.addBefehlszeile(codeLine); lineNr++; } } } }
//Befehlszeile zur Befehlszeilen-Liste hinzufuegen public void addBefehlszeile(Befehlszeile aLine) { m_BefehlszeilenList.Add(aLine); }
//übergibt das aktuelle Kommando zum Auführen an den Decoder public void executeCommand(Befehlszeile aCodeLine) { decodeOpCode(aCodeLine.OpCode); }
public void LoadCommand(Befehlszeile aktuelleZeile) { if (aktuelleZeile == null) // Falls Programm nicht läuft Start-Button = Enable { InvokeIfRequired(btn_Start, (MethodInvoker) delegate() { btn_Start.Enabled = true; }); return; } //Vorherige Zeile entmarkieren InvokeIfRequired(List, (MethodInvoker) delegate() { if (m_letzteZeile != null) { List.Items[m_letzteZeile.LineNr].BackColor = Color.White; } }); //Aktuelle Zeile markieren InvokeIfRequired(List, (MethodInvoker) delegate() { List.Items[aktuelleZeile.LineNr].BackColor = Color.LightSkyBlue; m_letzteZeile = aktuelleZeile; List.EnsureVisible(aktuelleZeile.LineNr); }); //GUI Updaten GUI_UPDATE(); //Auf Breakpoints ueberpruefen InvokeIfRequired(List, (MethodInvoker) delegate() { if (List.Items[aktuelleZeile.LineNr].Checked == true) { List.Items[aktuelleZeile.LineNr].Checked = false; btn_Start.Enabled = true; m_tCommandExecutor.Abort(); return; } }); //TRISA und TRISB zwischenspeichern fuer Latch m_oPIC.cachedTrisA = m_oPIC.getRegisterValue(0x85); m_oPIC.cachedTrisB = m_oPIC.getRegisterValue(0x86); //AssemblerBefehl der aktuellen Zeile ausfuehren m_oPIC.executeCommand(aktuelleZeile); //Ueberpruefen ob TRISA und TRISB vertauscht wurden (Latch Logik) if (m_oPIC.cachedTrisA != m_oPIC.getRegisterValue(0x85)) { m_oPIC.writeLatchToPort(m_oPIC.getRegisterValue(0x85), 0x05, m_oPIC.LatchA); } if (m_oPIC.cachedTrisB != m_oPIC.getRegisterValue(0x86)) { m_oPIC.writeLatchToPort(m_oPIC.getRegisterValue(0x86), 0x06, m_oPIC.LatchB); } //Ueberpruefen ob WatchDog an if (checkWatchDog) { m_oPIC.incWatchDog(); } //Taktfrequenz - 250ms warten bis zum naechsten Befehl m_oPIC.timeOut(m_oPIC.Speed); //Ueberpruefen ob der Schrittmodus aktiv ist if (m_oPIC.Step == false) { //Rekursiver aufruf dieser Funktion ( naechster Schritt) LoadCommand(BefehlszeilenSatz.Instanz.getNextBefehlszeile(m_oPIC.ProgramCounter)); } else { //Anhalten bis Next gedrueckt m_tCommandExecutor.Abort(); return; } }