unsigned short GetPressureSensor(void) { unsigned short Result = 0x0000; SelectSensor; StartConversion; Result = PerformConversion(); return Result; }
unsigned short GetYin(void) { unsigned short Result = 0x0000; SelectYin; StartConversion; Result = PerformConversion(); return Result; }
unsigned short GetXin(void) { unsigned short Result = 0x0000; SelectXin; //Set ADCON0 so that Xin is read and converted StartConversion; //Set start bit for ADC Result = PerformConversion(); return Result; }
void CCodeGenerationVisitor::Visit(CReturnStatement &AStmt) { if (AStmt.GetReturnExpression()) { AStmt.GetReturnExpression()->Accept(*this); PerformConversion(FuncSym->GetReturnType(), AStmt.GetReturnExpression()->GetResultType()); Asm.Add(POP, EAX); } Asm.Add(JMP, ".RL" + FuncSym->GetName()); }
void CCodeGenerationVisitor::Visit(CFunctionCall &AStmt) { CFunctionSymbol *Func = AStmt.GetFunction(); CFunctionSymbol::ArgumentsOrderContainer *FormalArgs = Func->GetArgumentsOrderedList(); CFunctionCall::ArgumentsReverseIterator ait; CFunctionSymbol::ArgumentsReverseOrderIterator fit; for (ait = AStmt.RBegin(), fit = FormalArgs->rbegin(); ait != AStmt.REnd() && fit != FormalArgs->rend(); ++ait, ++fit) { (*ait)->Accept(*this); PerformConversion(static_cast<CVariableSymbol *>(*fit)->GetType(), (*ait)->GetResultType()); } Asm.Add(CALL, Func->GetName()); Asm.Add(ADD, Func->GetArgumentsSymbolTable()->GetElementsSize(), ESP); if (!Func->GetReturnType()->IsVoid()) { Asm.Add(PUSH, EAX); } }
void CCodeGenerationVisitor::Visit(CBinaryOp &AStmt) { ETokenType OpType = AStmt.GetType(); if (OpType == TOKEN_TYPE_OPERATION_ASSIGN) { AStmt.GetLeft()->Accept(Addr); AStmt.GetRight()->Accept(*this); PerformConversion(AStmt.GetLeft()->GetResultType(), AStmt.GetRight()->GetResultType()); Asm.Add(POP, EAX); Asm.Add(POP, EBX); Asm.Add(MOV, EAX, mem(EBX)); } else if (OpType == TOKEN_TYPE_SEPARATOR_COMMA) { AStmt.GetLeft()->Accept(*this); AStmt.GetRight()->Accept(*this); Asm.Add(POP, EBX); Asm.Add(POP, EAX); Asm.Add(MOV, EBX, EAX); } else { bool CompoundAssignment = false; if (TokenTraits::IsCompoundAssignment(OpType)) { AStmt.GetLeft()->Accept(Addr); OpType = CompoundAssignmentOp[OpType]; CompoundAssignment = true; } AStmt.GetLeft()->Accept(*this); PerformConversion(AStmt.GetCommonRealType(), AStmt.GetLeft()->GetResultType()); AStmt.GetRight()->Accept(*this); PerformConversion(AStmt.GetCommonRealType(), AStmt.GetRight()->GetResultType()); if (AStmt.GetCommonRealType()->IsFloat()) { if (TokenTraits::IsTrivialOperation(OpType) || OpType == TOKEN_TYPE_OPERATION_SLASH) { Asm.Add(FLD, mem(ESP)); Asm.Add(ADD, TypeSize::Float, ESP); Asm.Add(FloatOperationCmd[OpType], mem(ESP)); Asm.Add(FSTP, mem(ESP)); Asm.Add(POP, EAX); } else if (OpType == TOKEN_TYPE_OPERATION_LOGIC_AND) { string FalseLabel = Asm.GenerateLabel(); string EndCheckLabel = Asm.GenerateLabel(); Asm.Add(FLD, mem(TypeSize::Float, ESP)); Asm.Add(FTST); Asm.Add(FSTSW, AX); Asm.Add(SAHF); Asm.Add(JE, FalseLabel); Asm.Add(FLD, mem(ESP)); Asm.Add(FTST); Asm.Add(FSTSW, AX); Asm.Add(SAHF); Asm.Add(JE, FalseLabel); Asm.Add(MOV, 1, EAX); Asm.Add(JMP, EndCheckLabel); Asm.Add(FalseLabel); Asm.Add(MOV, 0, EAX); Asm.Add(EndCheckLabel); Asm.Add(FSTP, ST0); Asm.Add(FSTP, ST0); Asm.Add(ADD, 2 * TypeSize::Float, ESP); } else if (OpType == TOKEN_TYPE_OPERATION_LOGIC_OR) { string TrueLabel = Asm.GenerateLabel(); string EndCheckLabel = Asm.GenerateLabel(); Asm.Add(FLD, mem(TypeSize::Float, ESP)); Asm.Add(FTST); Asm.Add(FSTSW, AX); Asm.Add(SAHF); Asm.Add(JNE, TrueLabel); Asm.Add(FLD, mem(ESP)); Asm.Add(FTST); Asm.Add(FSTSW, AX); Asm.Add(SAHF); Asm.Add(JNE, TrueLabel); Asm.Add(MOV, 0, EAX); Asm.Add(JMP, EndCheckLabel); Asm.Add(TrueLabel); Asm.Add(MOV, 1, EAX); Asm.Add(EndCheckLabel); Asm.Add(FSTP, ST0); Asm.Add(FSTP, ST0); Asm.Add(ADD, 2 * TypeSize::Float, ESP); } else if (TokenTraits::IsComparisonOperation(OpType)) { string TrueLabel = Asm.GenerateLabel(); string EndCheckLabel = Asm.GenerateLabel(); Asm.Add(FLD, mem(ESP)); Asm.Add(FLD, mem(TypeSize::Float, ESP)); Asm.Add(FCOMPP); Asm.Add(FSTSW, AX); Asm.Add(SAHF); Asm.Add(FloatOperationCmd[OpType], TrueLabel); Asm.Add(MOV, 0, EAX); Asm.Add(JMP, EndCheckLabel); Asm.Add(TrueLabel); Asm.Add(MOV, 1, EAX); Asm.Add(EndCheckLabel); Asm.Add(ADD, 2 * TypeSize::Float, ESP); } } else { Asm.Add(POP, EBX); Asm.Add(POP, EAX); if (TokenTraits::IsTrivialOperation(OpType)) { Asm.Add(IntOperationCmd[OpType], EBX, EAX); } else if (OpType == TOKEN_TYPE_OPERATION_SLASH || OpType == TOKEN_TYPE_OPERATION_PERCENT) { Asm.Add(CDQ); Asm.Add(IDIV, EBX); if (OpType == TOKEN_TYPE_OPERATION_PERCENT) { Asm.Add(MOV, EDX, EAX); } } else if (OpType == TOKEN_TYPE_OPERATION_SHIFT_LEFT || OpType == TOKEN_TYPE_OPERATION_SHIFT_RIGHT) { Asm.Add(MOV, EBX, ECX); Asm.Add(IntOperationCmd[OpType], CL, EAX); } else if (OpType == TOKEN_TYPE_OPERATION_LOGIC_AND) { string FalseLabel = Asm.GenerateLabel(); string EndCheckLabel = Asm.GenerateLabel(); Asm.Add(CMP, 0, EAX); Asm.Add(JE, FalseLabel); Asm.Add(CMP, 0, EBX); Asm.Add(JE, FalseLabel); Asm.Add(MOV, 1, EAX); Asm.Add(JMP, EndCheckLabel); Asm.Add(FalseLabel); Asm.Add(MOV, 0, EAX); Asm.Add(EndCheckLabel); } else if (OpType == TOKEN_TYPE_OPERATION_LOGIC_OR) { string TrueLabel = Asm.GenerateLabel(); string EndCheckLabel = Asm.GenerateLabel(); Asm.Add(CMP, 0, EAX); Asm.Add(JNE, TrueLabel); Asm.Add(CMP, 0, EBX); Asm.Add(JNE, TrueLabel); Asm.Add(MOV, 0, EAX); Asm.Add(JMP, EndCheckLabel); Asm.Add(TrueLabel); Asm.Add(MOV, 1, EAX); Asm.Add(EndCheckLabel); } else if (TokenTraits::IsComparisonOperation(OpType)) { string TrueLabel = Asm.GenerateLabel(); string EndCheckLabel = Asm.GenerateLabel(); Asm.Add(CMP, EBX, EAX); Asm.Add(IntOperationCmd[OpType], TrueLabel); Asm.Add(MOV, 0, EAX); Asm.Add(JMP, EndCheckLabel); Asm.Add(TrueLabel); Asm.Add(MOV, 1, EAX); Asm.Add(EndCheckLabel); } } if (CompoundAssignment) { Asm.Add(POP, EBX); Asm.Add(MOV, EAX, mem(EBX)); } } Asm.Add(PUSH, EAX); }