bool CArmInstruction::Load(char *Name, char *Params) { bool paramfail = false; NoCheckError = false; for (int z = 0; ArmOpcodes[z].name != NULL; z++) { if ((ArmOpcodes[z].flags & ARM_ARM9) && !Arm.isArm9()) continue; if (ParseOpcode((char*)ArmOpcodes[z].name,Name) == true) { if (LoadEncoding(ArmOpcodes[z],Params) == true) { Loaded = true; return true; } paramfail = true; } } if (NoCheckError == false) { if (paramfail == true) { Logger::printError(Logger::Error,L"ARM parameter failure \"%S\"",Params); } else { Logger::printError(Logger::Error,L"Invalid ARM opcode \"%S\"",Name); } } return false; }
bool TranslateInstruction() { char skipCount; /*reset relevant counters */ extraWords = 0; skipCount = isLabel ? ONE : ZERO; if (ParseOpcode() == NULL) return false; skipCount++; if (!ParseTypesAndCombinations()) return false; part = SkipParts(line, lineCopy, skipCount, DELIMITERS_AND_COMMA); switch(inst->OpcodeCategory) { case ZERO: if (part != NULL) { SYNTAX_ASSERT(false, OPCODE_NOT_EXPECT_OPERANDS); return false; } break; case ONE: if (!TranslateOperand(false)) /* treat operand as target */ return false; break; case TWO: { if (!TranslateOperand(true)) return false; skipCount++; part = SkipParts(line, lineCopy,skipCount, DELIMITERS_AND_COMMA); if (!TranslateOperand(false)) return false; } break; } /* verify that skipping the parts really exhausts the whole line */ part = SkipParts(line, lineCopy, skipCount + 1, DELIMITERS_AND_COMMA); if (part != NULL) { SYNTAX_ASSERT(false, EXPECTED_EOL); return false; } WordViewToBitsWord(word, view); code[IC].Word.Bits = word->Bits; code[IC].Type = ABSOLUTE; code[IC].UnresolvedLabel = false; IC += 1 + extraWords; /* one word of code translation + amount of extra words */ return true; }