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; }
static bool handleMacroArgument() { if (lex_Current.token == T_STRING) { fstk_AddMacroArgument(lex_Current.value.string); parse_GetToken(); return true; } else { return false; } }
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; } }
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'; }
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; }
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; }
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; }
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; }
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; }