public override string ToString() { var register = BankRegisterFiles.ContainsKey(address) ? BankRegisterFiles[address] : $"0x{address:X2}"; var destinationRegister = Registers.ContainsKey(destination)? Registers[destination] : destination.ToString(); return($"SWAPF {register}, {destinationRegister}"); }
public int GetRegValue(Token.Register reg) { if (!Registers.ContainsKey(reg.RegName)) { Registers[reg.RegName] = 0; return(0); } return(Registers[reg.RegName]); }
static long GetRegister(string register) { if (!Registers.ContainsKey(register)) { Registers[register] = 0; } return(Registers[register]); }
private void SaveToRegister(long address, long value) { if (Registers.ContainsKey(address)) { Registers[address] = value; } else { Registers.Add(address, value); } }
public long GetRegisterValue(char key) { if (Registers.ContainsKey(key)) { return(Registers[key]); } else { return(0); } }
private void RunInstructions() { foreach (var instruction in Instructions) { var parts = instruction.Split(" "); var register = parts[0]; var add = parts[1].Equals("inc"); var value = int.Parse(parts[2]); var condRegister = parts[4]; var condition = parts[5]; var condValue = int.Parse(parts[6]); //Init Registers if missing if (!Registers.ContainsKey(register)) { Registers.Add(register, 0); } if (!Registers.ContainsKey(condRegister)) { Registers.Add(condRegister, 0); } //check condition var conditionMet = condition switch { (">") => Registers[condRegister] > condValue, (">=") => Registers[condRegister] >= condValue, ("<") => Registers[condRegister] < condValue, ("<=") => Registers[condRegister] <= condValue, ("==") => Registers[condRegister] == condValue, ("!=") => Registers[condRegister] != condValue, _ => throw new ArgumentOutOfRangeException() }; if (!conditionMet) { continue; } if (add) { Registers[register] += value; } else { Registers[register] -= value; } MaxValueInRegister = Math.Max(MaxValueInRegister, Registers[register]); } }
public void ParseDuet(IEnumerable <string> rows) { Instructions.Clear(); foreach (var row in rows) { var ins = Instruction.CreateCmd(row); if (!string.IsNullOrEmpty(ins.RegA) && !Registers.ContainsKey(ins.RegA)) { Registers.Add(ins.RegA, 0); } if (!string.IsNullOrEmpty(ins.RegB) && !Registers.ContainsKey(ins.RegA)) { Registers.Add(ins.RegB, 0); } Instructions.Add(ins); } }
public override string Solve() { var totalMax = 0; foreach (var line in _parser.GetData().ToArray()) { var parts = line.Split(' '); var commandRegister = parts[0]; var command = parts[1]; var commandValue = int.Parse(parts[2]); var evalRegister = parts[4]; var evalOperator = parts[5]; var evalValue = int.Parse(parts[6]); if (!Registers.ContainsKey(commandRegister)) { Registers[commandRegister] = 0; } if (!Registers.ContainsKey(evalRegister)) { Registers[evalRegister] = 0; } if (EvaluateCondition(evalRegister, evalOperator, evalValue)) { UpdateRegister(commandRegister, command, commandValue); if (Registers[commandRegister] > totalMax) { totalMax = Registers[commandRegister]; } } } return(totalMax.ToString()); }
public bool HasRegValue(Token.Register reg) { return(Registers.ContainsKey(reg.RegName)); }
public void Run(int cSteps) { Labels = new Dictionary <string, int>(); for (int i = 0; i < Code.Count; i++) { string sLine = Code[i].Trim().Replace(" ", ""); if (sLine.StartsWith("(")) { Labels[sLine.Substring(1, sLine.Length - 2)] = i + 1; } } PC = 0; for (int i = 0; i < cSteps && PC < Code.Count; i++) { int iPreviousA = A; string sLine = Code[PC].Trim().Replace(" ", ""); Console.WriteLine("A=" + A + ", D=" + D + ", M=" + M[A] + ", PC=" + PC + ", line=" + sLine); if (sLine.StartsWith("@")) { string sValue = sLine.Substring(1); int iValue = 0; if (int.TryParse(sValue, out iValue)) { A = iValue; } else { if (Registers.ContainsKey(sValue)) { A = Registers[sValue]; } else if (Labels.ContainsKey(sValue)) { A = Labels[sValue]; } else { throw new Exception("Not spporting symbol " + sValue); } } PC++; } else if (sLine.StartsWith("(") || sLine.StartsWith("//")) { PC++; } else { string sDest = "", sCompute = "", sJMP = ""; if (sLine.Contains("=")) { sDest = sLine.Split('=')[0]; sLine = sLine.Substring(sDest.Length + 1); } if (sLine.Contains(";")) { sJMP = sLine.Split(';')[1]; sLine = sLine.Replace(";" + sJMP, ""); } sCompute = sLine; int iCompute = Compute(sCompute); if (sDest.Contains("D")) { D = iCompute; } if (sDest.Contains("M")) { M[iPreviousA] = iCompute; } if (sDest.Contains("A")) { A = iCompute; } if (sJMP != "" && Jump(sJMP, iCompute)) { PC = iPreviousA; } else { PC++; } } } }
public void Run(int cSteps, bool bBreakInfiniteLoops) { List <int> lLines = new List <int>(); Labels = new Dictionary <string, int>(); for (int i = 0; i < Code.Count; i++) { string sLine = Code[i].Trim().Replace(" ", ""); if (sLine.StartsWith("(")) { Labels[sLine.Substring(1, sLine.Length - 2)] = i + 1; } } PC = 0; for (int i = 0; i < cSteps && PC < Code.Count; i++) { lLines.Add(PC); if (lLines.Count > 3 && bBreakInfiniteLoops) { if (lLines[i] == lLines[i - 2] && lLines[i - 1] == lLines[i - 3]) { break; } } int iPreviousA = A; string sOriginalLine = Code[PC].Trim(); string sLine = sOriginalLine.Replace(" ", ""); if (sLine.Contains("//")) { sLine = sLine.Substring(0, sLine.IndexOf("/")).Trim(); } if (sLine == "") { PC++; continue; } string sMA = "N/A"; if (A >= 0 && A < M.Length) { sMA = M[A] + ""; } Console.WriteLine(i + ") A=" + A + ", D=" + D + ", M=" + sMA + ", PC=" + PC + ", line=" + sOriginalLine); if (sLine == "") { continue; } if (sLine.StartsWith("@")) { string sValue = sLine.Substring(1); int iValue = 0; if (int.TryParse(sValue, out iValue)) { A = iValue; } else { if (Registers.ContainsKey(sValue)) { A = Registers[sValue]; } else if (Labels.ContainsKey(sValue)) { A = Labels[sValue]; } else { Labels[sValue] = VarBase + VarCount; VarCount++; A = Labels[sValue]; } //throw new Exception("Not spporting symbol " + sValue); } PC++; } else if (sLine.StartsWith("(") || sLine.StartsWith("//")) { PC++; } else { string sDest = "", sCompute = "", sJMP = ""; if (sLine.Contains("=")) { sDest = sLine.Split('=')[0]; sLine = sLine.Substring(sDest.Length + 1); } if (sLine.Contains(";")) { sJMP = sLine.Split(';')[1]; sLine = sLine.Replace(";" + sJMP, ""); } sCompute = sLine; int iCompute = Compute(sCompute); if (sDest.Contains("D")) { D = iCompute; } if (sDest.Contains("M")) { M[iPreviousA] = iCompute; } if (sDest.Contains("A")) { A = iCompute; } if (sJMP != "" && Jump(sJMP, iCompute)) { PC = iPreviousA; } else { PC++; } } } }