Exemple #1
0
bool
parse_IsDot(void) {
    if (lex_Current.token == '.') {
        parse_GetToken();
        return true;
    }

    if (lex_Current.token == T_ID && lex_Current.value.string[0] == '.') {
        lex_UnputString(lex_Current.value.string + 1);
        parse_GetToken();
        return true;
    }

    return false;
}
Exemple #2
0
static bool
handleMacroArgument() {
    if (lex_Current.token == T_STRING) {
        fstk_AddMacroArgument(lex_Current.value.string);
        parse_GetToken();
        return true;
    } else {
        return false;
    }
}
Exemple #3
0
bool
parse_ExpectChar(char ch) {
    if (lex_Current.token == (uint32_t) ch) {
        parse_GetToken();
        return true;
    } else {
        err_Error(ERROR_CHAR_EXPECTED, ch);
        return false;
    }
}
bool
m68k_ParseDirective() {
    switch (lex_Current.token) {
        case T_68K_MC68000:
            opt_Current->machineOptions->cpu = CPUF_68000;
            parse_GetToken();
            return true;
        case T_68K_MC68010:
            opt_Current->machineOptions->cpu = CPUF_68010;
            parse_GetToken();
            return true;
        case T_68K_MC68020:
            opt_Current->machineOptions->cpu = CPUF_68020;
            parse_GetToken();
            return true;
        case T_68K_MC68030:
            opt_Current->machineOptions->cpu = CPUF_68030;
            parse_GetToken();
            return true;
        case T_68K_MC68040:
            opt_Current->machineOptions->cpu = CPUF_68040;
            parse_GetToken();
            return true;
        case T_68K_MC68060:
            opt_Current->machineOptions->cpu = CPUF_68060;
            parse_GetToken();
            return true;
        case T_68K_FPU6888X:
            opt_Current->machineOptions->fpu = FPUF_6888X;
            parse_GetToken();
            return true;
        case T_68K_FPU68040:
            opt_Current->machineOptions->fpu = FPUF_68040;
            parse_GetToken();
            return true;
        case T_68K_FPU68060:
            opt_Current->machineOptions->fpu = FPUF_68060;
            parse_GetToken();
            return true;
        default:
            return false;
    }
}
Exemple #5
0
static bool
handleMacroArguments() {
    lex_SetState(LEX_STATE_MACRO_ARGUMENT0);
    parse_GetToken();

    if (lex_Current.token == T_MACROARG0) {
        fstk_SetMacroArgument0(lex_Current.value.string);
        parse_GetToken();
    }

    if (handleMacroArgument()) {
        while (lex_Current.token == ',') {
            parse_GetToken();
            if (!handleMacroArgument()) {
                err_Error(ERROR_INVALID_MACRO_ARGUMENT);
                break;
            }
        }
    }

    lex_SetState(LEX_STATE_NORMAL);
    return lex_Current.token == '\n';
}
Exemple #6
0
static bool
handleMacroInvocation(void) {
    bool r = false;
    if (lex_Current.token == T_ID) {
        string* symbolName = str_Create(lex_Current.value.string);

        if (sym_IsMacro(symbolName)) {
            if (handleMacroArguments()) {
                fstk_ProcessMacro(symbolName);
                parse_GetToken();
                r = true;
            }
        } else {
            err_Error(ERROR_INSTR_UNKNOWN, lex_Current.value.string);
        }
        str_Free(symbolName);
    }
    return r;
}
Exemple #7
0
bool_t parse_IntegerInstruction(void)
{
	if(T_0X10C_ADD <= g_CurrentToken.ID.TargetToken && g_CurrentToken.ID.TargetToken <= T_0X10C_XOR)
	{
		eTargetToken nToken = g_CurrentToken.ID.TargetToken;
		SParser* pParser = &g_Parsers[nToken - T_0X10C_ADD];

		parse_GetToken();

		if(pParser->nAllowedModes2 != 0)
		{
			/* Two operands */
			SAddrMode addrMode1;
			SAddrMode addrMode2;

			if(!parse_AddressingMode(&addrMode1, pParser->nAllowedModes1))
				return prj_Error(MERROR_ILLEGAL_ADDRMODE);

			if(!parse_ExpectComma())
				return false;

			if(!parse_AddressingMode(&addrMode2, pParser->nAllowedModes2))
				return prj_Error(MERROR_ILLEGAL_ADDRMODE);
	
			return pParser->fpParser(&addrMode1, &addrMode2, pParser->nData);
		}
		else
		{
			/* One operand */
			SAddrMode addrMode1;

			if(!parse_AddressingMode(&addrMode1, pParser->nAllowedModes1))
				return prj_Error(MERROR_ILLEGAL_ADDRMODE);
	
			return pParser->fpParser(&addrMode1, NULL, pParser->nData);
		}
	}

	return false;
}
Exemple #8
0
static bool_t parse_IndirectComponent(int* pRegister, SExpression** ppAddress)
{
	if(g_CurrentToken.ID.TargetToken >= T_REG_A && g_CurrentToken.ID.TargetToken <= T_REG_J)
	{
		*pRegister = g_CurrentToken.ID.TargetToken - T_REG_A;
		*ppAddress = NULL;
		parse_GetToken();
		return true;
	}
	else
	{
		SExpression* pExpr = parse_ExpressionNoReservedIdentifiers();

		if(pExpr != NULL)
		{
			*pRegister = -1;
			*ppAddress = pExpr;
			return true;
		}
	}
	return false;
}
Exemple #9
0
static bool_t parse_AddressingMode(SAddrMode* pMode, uint32_t nAllowedModes)
{
	switch(g_CurrentToken.ID.TargetToken)
	{
		case T_REG_A:
		case T_REG_B:
		case T_REG_C:
		case T_REG_X:
		case T_REG_Y:
		case T_REG_Z:
		case T_REG_I:
		case T_REG_J:
		{
			EAddrMode eMode = (EAddrMode)(g_CurrentToken.ID.TargetToken - T_REG_A + ADDR_A);
			parse_GetToken();

			if(nAllowedModes & (1 << eMode))
			{
				pMode->eMode = eMode;
				pMode->pAddress = NULL;

				return true;
			}
			break;
		}
		case T_REG_POP:
		case T_REG_PEEK:
		case T_REG_PUSH:
		case T_REG_SP:
		case T_REG_PC:
		case T_REG_O:
		{
			EAddrMode eMode = (EAddrMode)(g_CurrentToken.ID.TargetToken - T_REG_POP + ADDR_POP);
			parse_GetToken();

			if(nAllowedModes & (1 << eMode))
			{
				pMode->eMode = eMode;
				pMode->pAddress = NULL;

				return true;
			}
			break;
		}
		default:
		{
			if(parse_IndirectAddressing(pMode, nAllowedModes))
			{
				return true;
			}
			else
			{
				SExpression* pAddress = parse_Expression();
				if(pAddress != NULL && (nAllowedModes & ADDRF_LITERAL))
				{
					pMode->eMode = ADDR_LITERAL;
					pMode->pAddress = pAddress;
					parse_OptimizeAddressingMode(pMode);
					return true;
				}
			}
			break;
		}
	}

	return false;
}
Exemple #10
0
static bool_t parse_IndirectAddressing(SAddrMode* pMode, uint32_t nAllowedModes)
{
	if(g_CurrentToken.ID.TargetToken == '[')
	{
		int nRegister = -1;
		SExpression* pAddress = NULL;

		parse_GetToken();

		if(!parse_IndirectComponent(&nRegister, &pAddress))
			return false;

		while(g_CurrentToken.ID.TargetToken == T_OP_ADD || g_CurrentToken.ID.TargetToken == T_OP_SUB)
		{
			if(g_CurrentToken.ID.TargetToken == T_OP_ADD)
			{
				int nRegister2 = -1;
				SExpression* pAddress2 = NULL;

				parse_GetToken();
				if(!parse_IndirectComponent(&nRegister2, &pAddress2))
					return false;

				if(nRegister2 >= 0)
				{
					if(nRegister == -1)
						nRegister = nRegister2;
					else
						prj_Error(MERROR_ADDRMODE_ONE_REGISTER);
				}
				else if(pAddress2 != NULL)
				{
					pAddress = pAddress == NULL ? pAddress2 : expr_Add(pAddress, pAddress2);
				}
				else
				{
					prj_Error(MERROR_ILLEGAL_ADDRMODE);
				}
			}
			else if(g_CurrentToken.ID.TargetToken == T_OP_SUB)
			{
				int nRegister2 = -1;
				SExpression* pAddress2 = NULL;

				parse_GetToken();
				if(!parse_IndirectComponent(&nRegister2, &pAddress2))
					return false;

				if(nRegister2 >= 0)
				{
					prj_Error(MERROR_ADDRMODE_SUBTRACT_REGISTER);
				}
				else if(pAddress2 != NULL)
				{
					pAddress = pAddress == NULL ? pAddress2 : expr_Sub(pAddress, pAddress2);
				}
				else
				{
					prj_Error(MERROR_ILLEGAL_ADDRMODE);
				}
			}
		}

		parse_ExpectChar(']');

		if(nRegister != -1 && pAddress == NULL)
		{
			EAddrMode eMode = (EAddrMode)(nRegister + ADDR_A_IND);
			if(nAllowedModes & (1 << eMode))
			{
				pMode->eMode = eMode;
				pMode->pAddress = NULL;
				return true;
			}
		}

		if(nRegister != -1 && pAddress != NULL)
		{
			EAddrMode eMode = (EAddrMode)(nRegister + ADDR_A_OFFSET_IND);
			if(nAllowedModes & (1 << eMode))
			{
				pMode->eMode = eMode;
				pMode->pAddress = parse_CheckSU16(pAddress);
				return true;
			}
		}

		if(nRegister == -1 && pAddress != NULL)
		{
			EAddrMode eMode = ADDR_ADDRESS_IND;
			if(nAllowedModes & (1 << eMode))
			{
				pMode->eMode = eMode;
				pMode->pAddress = parse_CheckU16(pAddress);
				return true;
			}
		}
	}

	return false;
}