예제 #1
0
        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}");
        }
예제 #2
0
 public int GetRegValue(Token.Register reg)
 {
     if (!Registers.ContainsKey(reg.RegName))
     {
         Registers[reg.RegName] = 0;
         return(0);
     }
     return(Registers[reg.RegName]);
 }
예제 #3
0
파일: Day08.cs 프로젝트: westappdev/aoc2017
        static long GetRegister(string register)
        {
            if (!Registers.ContainsKey(register))
            {
                Registers[register] = 0;
            }

            return(Registers[register]);
        }
예제 #4
0
 private void SaveToRegister(long address, long value)
 {
     if (Registers.ContainsKey(address))
     {
         Registers[address] = value;
     }
     else
     {
         Registers.Add(address, value);
     }
 }
예제 #5
0
 public long GetRegisterValue(char key)
 {
     if (Registers.ContainsKey(key))
     {
         return(Registers[key]);
     }
     else
     {
         return(0);
     }
 }
예제 #6
0
파일: Day08.cs 프로젝트: jonlue/AOC2017
        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]);
            }
        }
예제 #7
0
        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);
            }
        }
예제 #8
0
        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());
        }
예제 #9
0
 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++;
                    }
                }
            }
        }
예제 #11
0
파일: CPUEmulator.cs 프로젝트: boaz23/ECS
        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++;
                    }
                }
            }
        }