Пример #1
0
unsigned short GetPressureSensor(void) {
    unsigned short Result = 0x0000;
    SelectSensor;
    StartConversion;
    Result = PerformConversion();
    return Result;
}
Пример #2
0
unsigned short GetYin(void) {
    unsigned short Result = 0x0000;
    SelectYin;
    StartConversion;
    Result = PerformConversion();
    return Result;
}
Пример #3
0
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;
}
Пример #4
0
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());
}
Пример #5
0
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);
	}
}
Пример #6
0
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);
}