Exemple #1
0
 private NumberLexToken GetNextByte(Lexer.Lexer lexer)
 {
     var token = lexer.Next();
     if (token != null
         && token is NumberLexToken)
     {
         if ((token as NumberLexToken).IntValue() > 0xff
             || (token as NumberLexToken).IntValue() < 0x0)
         {
             throw new SyntaxException($"{token.Value()} is not the correct size of a byte");
         }
     }
     else
     {
         lexer.UnGet(token);
         token = new NumberLexToken("0x0");
     }
     return (NumberLexToken)token;
 }
Exemple #2
0
        public void ParseInstruction(Lexer.Lexer lexer, bool buildingLabelTable = false)
        {
            var operation = lexer.Next();
            lexer.UnGet(operation);

            if (operation is AddressDataStatementLexToken)
            {
                ParseAddressDataStatement(lexer);
            }
            else if (operation is ByteDataStatementLexToken)
            {
                ParseByteDataStatement(lexer);
            }
            else if (operation is IfStatementLexToken)
            {
                ParseIfStatement(lexer, buildingLabelTable);
            }
            else if (operation is LabelDeclarationLexToken)
            {
                ParseLabelDeclaration(lexer, buildingLabelTable);
            }
            else if (operation is NewLineLexToken)
            {
                ParseNewLine(lexer);
            }
            else if (operation is OpCodeLexToken)
            {
                ParseOperation(lexer, buildingLabelTable);
            }
            else if (operation is WordDataStatementLexToken)
            {
                ParseWordDataStatement(lexer);
            }
            else
            {
                throw new SyntaxException($"Unknown instruction: {operation.Value()} on line {LineNumber}");
            }
        }
Exemple #3
0
        public void ParseWordDataStatement(Lexer.Lexer lexer)
        {
            var token = lexer.Next();
            if (token != null
                && token is WordDataStatementLexToken)
            {
                var a1 = lexer.Next();
                while (a1 != null
                    && a1 is NumberLexToken
                    && (a1 as NumberLexToken).IntValue() != 0)
                {
                    var encoded = Convert.ToUInt32(a1.Value(), 16);
                    WriteInstructionToKernel(encoded);

                    a1 = lexer.Next();
                }
                lexer.UnGet(a1);
            }
        }
Exemple #4
0
        public void ParseByteDataStatement(Lexer.Lexer lexer)
        {
            var token = lexer.Next();
            if (token != null
                && token is ByteDataStatementLexToken)
            {
                var a1 = lexer.Next();
                while (a1 != null
                    && a1 is NumberLexToken
                    //&& (a1 as NumberLexToken).IntValue() != 0
                    )
                {
                    if ((a1 as NumberLexToken).IntValue() > 0xff
                        || (a1 as NumberLexToken).IntValue() < 0x0)
                    {
                        throw new SyntaxException($"{a1.Value()} is not the correct size of a byte");
                    }
                    var a2 = GetNextByte(lexer);
                    var a3 = GetNextByte(lexer);
                    var a4 = GetNextByte(lexer);

                    var data = $"{a4.Value().Substring(2).PadLeft(2, '0')}{a3.Value().Substring(2).PadLeft(2, '0')}{a2.Value().Substring(2).PadLeft(2, '0')}{a1.Value().Substring(2).PadLeft(2, '0')}";
                    var encoded = Convert.ToUInt32(data, 16);
                    WriteInstructionToKernel(encoded, $"{token.Value()}: {a1.Value()}, {a2.Value()}, {a3.Value()}, {a4.Value()}");

                    a1 = lexer.Next();
                }
                lexer.UnGet(a1);
            }
        }