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_); } }
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; }
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; }
/* 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); }