Exemplo n.º 1
0
        public ElfCPU(string[] program)
        {
            List <ElfOpCode> parsedOpCodes = new List <ElfOpCode>();

            foreach (var s in program)
            {
                var parts = s.ToUpper().Split(' ');
                /* parse string */
                if (parts[0].Equals("#IP"))
                {
                    /* set the IP Register */
                    IPReg = int.Parse(parts[1]);
                    continue;
                }

                var opc = new ElfOpCode();
                opc.Operation = (ElfOp)Enum.Parse(typeof(ElfOp), parts[0]);
                opc.A         = int.Parse(parts[1]);
                if (parts.Length > 2)
                {
                    opc.B = int.Parse(parts[2]);
                    opc.C = int.Parse(parts[3]);
                }
                parsedOpCodes.Add(opc);
            }
            OpCodes = parsedOpCodes.ToArray();
            IP      = 0;
        }
Exemplo n.º 2
0
        public void ExecuteOp(ElfOpCode opc)
        {
            switch (opc.Operation)
            {
            case ElfOp.ADDR:
                Registers[opc.C] = Registers[opc.A] + Registers[opc.B];
                break;

            case ElfOp.ADDI:
                Registers[opc.C] = Registers[opc.A] + opc.B;
                break;

            case ElfOp.MULR:
                Registers[opc.C] = Registers[opc.A] * Registers[opc.B];
                break;

            case ElfOp.MULI:
                Registers[opc.C] = Registers[opc.A] * opc.B;
                break;

            case ElfOp.BANR:
                Registers[opc.C] = Registers[opc.A] & Registers[opc.B];
                break;

            case ElfOp.BANI:
                Registers[opc.C] = Registers[opc.A] & opc.B;
                break;

            case ElfOp.BORR:
                Registers[opc.C] = Registers[opc.A] | Registers[opc.B];
                break;

            case ElfOp.BORI:
                Registers[opc.C] = Registers[opc.A] | opc.B;
                break;

            case ElfOp.SETR:
                Registers[opc.C] = Registers[opc.A];
                break;

            case ElfOp.SETI:
                Registers[opc.C] = opc.A;
                break;

            case ElfOp.GTIR:
                if (opc.A > Registers[opc.B])
                {
                    Registers[opc.C] = 1;
                }
                else
                {
                    Registers[opc.C] = 0;
                }
                break;

            case ElfOp.GTRI:
                if (Registers[opc.A] > opc.B)
                {
                    Registers[opc.C] = 1;
                }
                else
                {
                    Registers[opc.C] = 0;
                }
                break;

            case ElfOp.GTRR:
                if (Registers[opc.A] > Registers[opc.B])
                {
                    Registers[opc.C] = 1;
                }
                else
                {
                    Registers[opc.C] = 0;
                }
                break;

            case ElfOp.EQIR:
                if (opc.A == Registers[opc.B])
                {
                    Registers[opc.C] = 1;
                }
                else
                {
                    Registers[opc.C] = 0;
                }
                break;

            case ElfOp.EQRI:
                if (Registers[opc.A] == opc.B)
                {
                    Registers[opc.C] = 1;
                }
                else
                {
                    Registers[opc.C] = 0;
                }
                break;

            case ElfOp.EQRR:
                if (Registers[opc.A] == Registers[opc.B])
                {
                    Registers[opc.C] = 1;
                }
                else
                {
                    Registers[opc.C] = 0;
                }
                break;
            }
        }