Esempio n. 1
0
void LabelMap::RegisterDefaults()
{
  for (int i = 0; i < 0x24; i++)
  {
    if (regnames[i].name)
      RegisterLabel(regnames[i].name, regnames[i].addr);
  }
  for (int i = 0; i < (int)pdlabels_size; i++)
  {
    if (pdlabels[i].name)
      RegisterLabel(pdlabels[i].name, pdlabels[i].addr);
  }
}
Esempio n. 2
0
void LabelMap::RegisterDefaults()
{
  for (const auto& reg_name_label : regnames)
  {
    if (reg_name_label.name != nullptr)
      RegisterLabel(reg_name_label.name, reg_name_label.addr);
  }

  for (const auto& predefined_label : pdlabels)
  {
    if (predefined_label.name != nullptr)
      RegisterLabel(predefined_label.name, predefined_label.addr);
  }
}
Esempio n. 3
0
void Assembler::ScanAndFix()
{
	ip = 0;
	for (ast::Instruction& instr : parsedProgram){		
		if (instr.label){
			RegisterLabel(instr.label.get(), ip);
		}
		
		instr.address = ip;
		
		if (instr.op.type() == typeid(ast::Directive)){
			ExecuteDirective(instr);
			continue;
		}
		
		EncodeOperation(instr);
		
		ip++;
	}
}
Esempio n. 4
0
void Assembler::ExecuteDirective(ast::Instruction& instr)
{
	ast::Directive dir = boost::get<ast::Directive>(instr.op);
	
	if (dir == ast::Directive::DEF){
		if (!instr.ArgB()){
			throw ArgumentException(".def <name>, <literal>", instr.lineNumber);
		}
		
		if (instr.ArgC().type() == typeid(ast::RegisterReference) ||
			instr.ArgB().get().type() == typeid(ast::RegisterReference)){
			throw ArgumentException(".def cannot assign registers.", instr.lineNumber);
		}
		
		ast::IndexExpression& bExpr = boost::get<ast::IndexExpression>(instr.ArgB().get());
		
		if (!instr.ArgB() || bExpr.type() != typeid(ast::Label)){
			throw ArgumentException(".def <name>, <literal>", instr.lineNumber);
		}
		
		RegisterLabel(boost::get<ast::Label>(bExpr), 
					  EvaluateExpression(boost::get<ast::IndexExpression>(instr.ArgC())));
		
	}
	else if (dir == ast::Directive::LOCATE) {
		if (instr.ArgC().type() == typeid(ast::RegisterReference)){
			throw ArgumentException(".locate <literal>", instr.lineNumber);
		}
		
		ip = EvaluateExpression(boost::get<ast::IndexExpression>(instr.ArgC()));
	}
	else if (dir == ast::Directive::DATA) {
		//we actually encode the data in ResolveArguments(), since it could
		//potentially involve a label ref.
		ip++;
	}
}