コード例 #1
0
        public void OperatorsInfoTests_GetInstructionFormats_InvalidFormat()
        {
            int idx = 0;

            Array.Resize(ref ops, 5);
            ops[4] = "I dnt Exist";

            Array.Resize(ref opFormats, 5);
            opFormats[4] = EInstructionFormat.INVALID;

            Token[] opTkn = new Token[ops.Length];
            for (int i = 0; i < opTkn.Length; i++)
            {
                opTkn[i] = new Token(TokenType.OPERATOR, ops[i]);
            }

            foreach (Token operation in opTkn)
            {
                EInstructionFormat f = OperatorsInfo.GetInstructionFormat(operation);

                Assert.AreEqual(opFormats[idx], f);

                idx++;
            }
        }
コード例 #2
0
        private void init(OperatorsInfo opi)
        {
            operatorInfo = opi;
            leave        = false;
            waiting      = 0;
            commands     = new Dictionary <string, Command>();

            commands.Add("start", new StartCommand(opi));
            commands.Add("interval", new IntervalCommand(opi));
            commands.Add("status", new StatusCommand(opi));
            commands.Add("crash", new CrashCommand(opi));
            commands.Add("freeze", new FreezeCommand(opi));
            commands.Add("unfreeze", new UnfreezeCommand(opi));
            commands.Add("wait", new WaitCommand(this));
        }
コード例 #3
0
        public void OperatorsInfoTests_GetInstructionFormats_Success()
        {
            Token[] opTkn = new Token[ops.Length];
            for (int i = 0; i < opTkn.Length; i++)
            {
                opTkn[i] = new Token(TokenType.OPERATOR, ops[i]);
            }
            int idx = 0;

            foreach (Token operation in opTkn)
            {
                EInstructionFormat f = OperatorsInfo.GetInstructionFormat(operation);

                Assert.AreEqual(opFormats[idx], f);

                idx++;
            }
        }
コード例 #4
0
 public IntervalCommand(OperatorsInfo opi)
 {
     operatorsInfo = opi;
 }
コード例 #5
0
 public StartCommand(OperatorsInfo opi)
 {
     operatorsInfo = opi;
 }
コード例 #6
0
 public UnfreezeCommand(OperatorsInfo opi)
 {
     operatorsInfo = opi;
 }
コード例 #7
0
ファイル: Compiler.cs プロジェクト: agSant01/se-assembler
        /// <summary>
        /// get binary format of each instruction
        /// </summary>
        private string GetBinaryFormat(IFormatInstructions _operator)
        {
            int opcode = OperatorsInfo.GetOPCode(_operator.Operator);


            switch (OperatorsInfo.GetInstructionFormat(_operator.Operator))
            {
            case EInstructionFormat.FORMAT_1:
            {
                int Rc = 0;
                int Ra = 0;
                int Rb = 0;
                InstructionFormat1 format = (InstructionFormat1)_operator;

                if (format.RegisterA != null)
                {
                    Ra = (format.RegisterA?.ToString() == "") ? 0 : Convert.ToInt32(Regex.Replace(format.RegisterA.ToString(), @"[.\D+]", ""));
                }
                if (format.RegisterC != null)
                {
                    Rb = (format.RegisterB?.ToString() == "") ? 0 : Convert.ToInt32(Regex.Replace(format.RegisterB.ToString(), @"[.\D+]", ""));
                }
                if (format.RegisterC != null)
                {
                    Rc = (format.RegisterC.ToString() == "") ? 0 : Convert.ToInt32(Regex.Replace(format.RegisterC.ToString(), @"[.\D+]", ""));
                }
                return($"{Convert.ToString(opcode, 2).PadLeft(5, '0')}" +
                       $"{Convert.ToString(Ra, 2).PadLeft(3, '0')}" +
                       $"{Convert.ToString(Rb, 2).PadLeft(3, '0')}" +
                       $"{Convert.ToString(Rc, 2).PadLeft(3, '0')}00");
            }

            case EInstructionFormat.FORMAT_2:
            {
                InstructionFormat2 format = (InstructionFormat2)_operator;
                int Ra = (format.RegisterA.ToString() == "") ? 0 : Convert.ToInt32(Regex.Replace(format.RegisterA.ToString(), @"[.\D+]", ""));

                int constOrAddr;

                if (constants.ContainsKey(format.ConstOrAddress.ToString()))
                {
                    constOrAddr = constants[format.ConstOrAddress.ToString()];
                }
                else if (variables.ContainsKey(format.ConstOrAddress.ToString()))
                {
                    constOrAddr = variables[format.ConstOrAddress.ToString()];
                }
                else if (labels.ContainsKey(format.ConstOrAddress.ToString()))
                {
                    constOrAddr = labels[format.ConstOrAddress.ToString()];
                }
                else
                {
                    //check if the constant or address is a direct input
                    try
                    {
                        constOrAddr = UnitConverter.BinaryToByte(
                            UnitConverter.HexToBinary(
                                format.ConstOrAddress.ToString().Replace("#", "")
                                )
                            );
                    } catch (OverflowException)
                    {
                        //send error message (undefined variable)
                        AsmLogger.Error($"Overflow in instruction: {_operator}",
                                        currentLine.ToString(),
                                        $"Value '{format.ConstOrAddress}'");

                        return(null);
                    }
                    catch
                    {
                        //send error message (undefined variable)
                        AsmLogger.Error($"Variable not defined: {_operator}",
                                        currentLine.ToString(),
                                        "Variable called but never defined");
                        return(null);
                    }
                }
                return($"{UnitConverter.IntToBinary(opcode, defaultWidth: 5)}" +
                       $"{UnitConverter.IntToBinary(Ra, defaultWidth: 3)}" +
                       $"{UnitConverter.IntToBinary(constOrAddr, defaultWidth: 8)}");
            }

            case EInstructionFormat.FORMAT_3:
            {
                InstructionFormat3 format = (InstructionFormat3)_operator;

                int constOrAddr = 0;
                if (constants.ContainsKey(format.ConstOrAddress.ToString()))
                {
                    constOrAddr = constants[format.ConstOrAddress.ToString()];
                }
                else if (variables.ContainsKey(format.ConstOrAddress.ToString()))
                {
                    constOrAddr = variables[format.ConstOrAddress.ToString()];
                }
                else if (labels.ContainsKey(format.ConstOrAddress.ToString()))
                {
                    constOrAddr = labels[format.ConstOrAddress.ToString()];
                }
                else
                {
                    //check if the constant or address is a direct input
                    try
                    {
                        constOrAddr = Convert.ToInt32(format.ConstOrAddress.ToString().Replace("#", ""), 16);
                    }
                    catch
                    {
                        //send error message (undefined variable)
                        return(null);
                    }
                }


                return($"{Convert.ToString(opcode, 2).PadLeft(5, '0')}" +
                       $"{Convert.ToString(constOrAddr, 2).PadLeft(11, '0')}");
            }

            default:
            {
                throw new Exception("Token is not an instruction");
            }
            }
        }
コード例 #8
0
 public CrashCommand(OperatorsInfo opi)
 {
     operatorsInfo = opi;
 }
コード例 #9
0
 public Shell(OperatorsInfo opi)
 {
     init(opi);
 }