Example #1
0
void FunctionEntry::memAlloc(MemoryMgr &mm){
	memory_mgr_ = MemoryMgr();

	const SymTab* st = this->symTab();
	bool p_var = true;
	if(st!=NULL){
		for(SymTab::const_iterator i = st->begin(); i != st->end(); ++i){
			if((*i)->kind()==SymTabEntry::Kind::VARIABLE_KIND){
				VariableEntry* ve = (VariableEntry*) (*i);
				if(ve->varKind()==VariableEntry::VarKind::PARAM_VAR && p_var){
					//Parameters
					ve->offSet(memory_mgr_.getNextAddress());
				} else {
					if(p_var){
						//Set control_link_ and return_address_
						returnLabel(memory_mgr_.getNextAddress());
						returnOffset(memory_mgr_.getNextAddress());
						controlLink(memory_mgr_.getNextAddress());
						p_var = false;
					}
					//Local variables declared in function
					ve->memAlloc(memory_mgr_);
				}
			}
		}
		if(p_var){
			returnLabel(memory_mgr_.getNextAddress());
			returnOffset(memory_mgr_.getNextAddress());
			controlLink(memory_mgr_.getNextAddress());
		}
	}
	if(body()!=NULL){
		body()->memAlloc(memory_mgr_);

		//Used for returning in case function reaches the end of its body without a return statement
		mem_reg_ = memory_mgr_.getNextRegister(true);
		memory_mgr_.addRegister(mem_reg_);
		label_reg_ = memory_mgr_.getNextRegister(true);
		memory_mgr_.addRegister(label_reg_);
		memory_mgr_.freeRegister(mem_reg_);
		memory_mgr_.freeRegister(label_reg_);
	}
}
Example #2
0
void FunctionEntry::print(ostream& out, int indent) const{
	for(int i=0;i<indent;++i){
		out << "\t";
	}
	out << type()->retType()->name() << " " << name() << "(";
	const SymTab* st = this->symTab();
	bool p_var = true;
	if(st!=NULL){
		for(SymTab::const_iterator i = st->begin(); i != st->end(); ++i){
			if((*i)->kind()==SymTabEntry::Kind::VARIABLE_KIND){
				VariableEntry* ve = (VariableEntry*) (*i);
				if(ve->varKind()==VariableEntry::VarKind::PARAM_VAR && p_var){
					if(i != st->begin()){
						out << ", ";
					}
					out << ve->type()->fullName()<<" "<<ve->name();
					out << "(offset = " << ve->offSet() << ")";
				} else {
					if(p_var){
						out << ")(return_label = " << returnLabel() << ", return_address = " << returnOffset() << ", control_link = " << controlLink() << ") {" << endl;
						p_var = false;
					}
					ve->print(out,indent+1);
				}
			}
		}
	}
	if(p_var){
		out << ")(return_address = " << returnOffset() << ", control_link = " << controlLink() << ")";
	}
	if(body()!=NULL){
		if(p_var){
			out<<" {" << endl;
		}
		body()->printWithoutBraces(out,indent);
		for(int i=0;i<indent-1;++i){
			out << "\t";
		}
		out << "}";
	}
	out<< ";" << endl;
}
Example #3
0
const sf::Vector2f ParticleSystem::getOffsetByEffect(const ParticleEffect effect)
{
	sf::Vector2f returnOffset(0, 0);
	switch (effect)
	{
	case FIRE:
		returnOffset = sf::Vector2f(rand() % 80 - 40, rand() % 80 - 40);
		break;
	case SMOKE:
		int offsetX = rand() % 100 + 200;
		int offsetY = rand() % 100 + 100;
		float randomX = -rand() % (offsetX / 4) - 3 * offsetX / 4.0f;
		float offsetXSquared = offsetX * offsetX;
		float offsetYSquared = offsetY * offsetY;
		float randomXSquared = randomX * randomX;
		float yPossible = sqrt((offsetXSquared * offsetYSquared - randomXSquared * offsetYSquared) / offsetXSquared);
		float randomY = rand() % (2 * (int)yPossible) - yPossible + 0.5f;
		returnOffset = sf::Vector2f(randomX, randomY);
		break;
	}

	return returnOffset;
}
Example #4
0
	/* Note: MAX_LINE_LENGTH, OK, EMPTY_LINE, and DONE are defined values */
int main (){

	   char lLine[MAX_LINE_LENGTH + 1], *lLabel, *lOpcode, *lArg1, *lArg2, *lArg3, *lArg4;
	   int lRet;
	   int i = 0;
	   int ctr = 0;
	   int addrCtr; /*used in 2nd pass of program*/
	   int mach_code = 0;
	   int arg1_num = 0;
	   int orig; /*start addr of program*/
	   int offs; /*offset from current addr to label*/
	  
	   FILE * pOutfile;
	   pOutfile = fopen( "data.out", "w" );

	   int endDefined = 0;
	   FILE * lInfile;
	   lInfile = fopen("data.in", "r");	/* open the input file */
	  
	    /*find start address of program*/
	   do{
	   	lRet = readAndParse( lInfile, lLine, &lLabel, &lOpcode, &lArg1, &lArg2, &lArg3, &lArg4 );
		if (strcmp(lOpcode, ".orig") == 0){
                 	orig = toNum(lArg1);
			printf("%i\n",orig);
                }

        else if (strcmp(lOpcode, ".end") == 0){
                 	endDefined = 1;
                }

	   } while (lRet != DONE);


	   /*If there is no .END, then throw an error*/
	   	if(endDefined == 0){
	   		error(4);
	   	}


        /*1st pass: generate symbol table*/
	   /* lInfile = fopen("data.in", "r");*/     /* open the input file */
	   rewind(lInfile);	
	   do{	
	 	lRet = readAndParse( lInfile, lLine, &lLabel, &lOpcode, &lArg1, &lArg2, &lArg3, &lArg4 );
		printf("1st pass");
		printf("	lRet: %i\n", lRet);
		if (label){
			symbol_table[i].addr = orig + ctr;
			printf("address: %i\n", symbol_table[i].addr);	
			symbol_table[i].name = lLabel;
			printf("label: %s\n", symbol_table[i].name);
			label = 0;
			i++; 
		}
 		ctr++;
	   } while( lRet != DONE );

	    /*writeText(mach_code);2nd pass: generate machine code*/
	   /*lInfile = fopen("data.in", "r");*/     /* open the input file */
	   rewind(lInfile);
	   do
	   {	
	   	addrCtr = orig;
	   	lRet = readAndParse( lInfile, lLine, &lLabel, &lOpcode, &lArg1, &lArg2, &lArg3, &lArg4 );
		printf("label:%s", lLabel);
		printf(" opcode:%s", lOpcode);
		printf(" arg1:%s", lArg1);
		printf(" arg2:%s ", lArg2);
		printf(" arg3:%s\n", lArg3);
		if( lRet != DONE && lRet != EMPTY_LINE ){
			/*generate machine code (hex) given the parsed opcodes*/
				if (strcmp(lOpcode, ".orig") == 0){
					fprintf( pOutfile, "0x%.4X\n", orig);
				}

				if (strcmp(lOpcode, "br") || strcmp(lOpcode, "brnzp") == 0){
					/*need condition for n, z, p,*/ 
					offs = returnOffset(lArg1, addrCtr);
					/*check if offset is too big!!!*/
					mach_code = offs;
				}

				else if (strcmp(lOpcode, "add") == 0){
					mach_code = (ADD << 12) + ((lArg1[1] - 0x30)<<9) + ((lArg2[1] - 0x30)<<6);
					mach_code &= 0xFFC0; /*clearing the last 6 bits*/
					/*see if the number being added is a constant number*/
					if( (lArg3[0] == 'x') || (lArg3[0] == '#')){
						mach_code |= 0x10; /*Changing the 5th bit to 1 since we are adding a constant*/
						mach_code += toNum(lArg3);
					}
					/*Argument 3 is a register*/
					else{
						mach_code += (lArg3[1] - 0x30);
					}
					fprintf( pOutfile, "0x%.4X\n", mach_code);
				}


				else if (strcmp(lOpcode, "ldb") == 0){
					 /*extract reg number from arguments, then shift to correct place*/
					mach_code = (LDB << 12) + ((lArg1[1] - 0x30)<<9) + ((lArg2[1] - 0x30)<<6); 

					 /* put constant in bits[5:0]*/
					mach_code &= 0xFFC0;
					mach_code += toNum(lArg3);
					printf("mach_code: %i\n", mach_code);
					fprintf( pOutfile, "0x%.4X\n", mach_code);
			
				}				
				else if (strcmp(lOpcode, "stb") == 0){
					  /*extract reg number from arguments, then shift to correct place*/
                                        mach_code = (STB << 12) + ((lArg1[1] - 0x30)<<9) + ((lArg2[1] - 0x30)<<6);

                                         /* put constant in bits[5:0]*/
                                        mach_code &= 0xFFC0;
                                        mach_code += toNum(lArg3);
                                        printf("mach_code: %i\n", mach_code);
					fprintf( pOutfile, "0x%.4X\n", mach_code);

				}

				else if (strcmp(lOpcode, "jsr") == 0 || strcmp(lOpcode, "jsrr") == 0){
						
						if (strcmp(lOpcode, "jsr") == 0)
						{
							mach_code = (JSR << 12) + 1<<11;
						}
						else 
						{
							mach_code = (JSR << 12) + ((lArg1[1] - 0x30) << 5);
						}
						 
				}
				/*fprintf( pOutfile, "0x%.4X\n", mach_code);*/
				printf("MACH_CODE!:  %i\n", mach_code);


				addrCtr++;

		}
	   } while( lRet != DONE );
	   fclose(pOutfile);

	}