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); } }
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); } }
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++; } }
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++; } }