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; }
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}"); } }
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); } }
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); } }