Пример #1
0
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;
}
Пример #2
0
Файл: code.c Проект: rycle/SPL14
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;
}