⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 si_instr.c

📁 是一个手机功能的模拟程序
💻 C
📖 第 1 页 / 共 3 页
字号:
}


enumErrorCode Exec_IDIV( pstructSI si )
{
	pstructVar	op2 = RE_Pop( si->RE );		/* NOTE THE ORDER THE OPERANDS ARE POPPED!!! */
	pstructVar	op1 = RE_Pop( si->RE );
	pstructVar	result = NULL;

	if ((op1 != NULL) && (op2 != NULL)) {
		if ( Var_ConvertMethod(CONVERT_INTS, op1, op2) ) {
			result = Var_IDIV( op1, op2 );
		}
		else {
			result = Var_New();
			Var_AssignInvalid( result );
		}
		Var_Delete( &op1 );
		Var_Delete( &op2 );
		OpS_Push( si->RE->OpS, &result );

		return ERR_WAE_WMLS_NONE;
	}
	else {
		Var_Delete( &op1 );
		Var_Delete( &op2 );
		return ERR_WAE_WMLS_STACK_UNDERFLOW;
	}
}


enumErrorCode Exec_REM( pstructSI si )
{
	pstructVar	op2 = RE_Pop( si->RE );		/* NOTE THE ORDER THE OPERANDS ARE POPPED!!! */
	pstructVar	op1 = RE_Pop( si->RE );
	pstructVar	result = NULL;

	if ((op1 != NULL) && (op2 != NULL))
  {
		if ( Var_ConvertMethod(CONVERT_INTS, op1, op2) ) /* Change: WAP 1.1 spec changed from  CONVERT_INTS_FLOATS to CONVERT_INTS */
    {
			result = Var_REM( op1, op2 );
		}
		else
    {
			result = Var_New();
			Var_AssignInvalid( result );
		}
		Var_Delete( &op1 );
		Var_Delete( &op2 );
		OpS_Push( si->RE->OpS, &result );

		return ERR_WAE_WMLS_NONE;
	}
	else
  {
		Var_Delete( &op1 );
		Var_Delete( &op2 );
		return ERR_WAE_WMLS_STACK_UNDERFLOW;
	}
}



/* Bitwise instructions **************************************************************************/
enumErrorCode Exec_B_AND( pstructSI si )
{
	pstructVar	op2 = RE_Pop( si->RE );		/* NOTE THE ORDER THE OPERANDS ARE POPPED!!! */
	pstructVar	op1 = RE_Pop( si->RE );
	pstructVar	result = NULL;

	if ((op1 != NULL) && (op2 != NULL)) {
		if ( Var_ConvertMethod(CONVERT_INTS, op1, op2) ) {
			result = Var_B_AND( op1, op2 );
		}
		else {
			result = Var_New();
			Var_AssignInvalid( result );
		}
		Var_Delete( &op1 );
		Var_Delete( &op2 );
		OpS_Push( si->RE->OpS, &result );

		return ERR_WAE_WMLS_NONE;
	}
	else {
		Var_Delete( &op1 );
		Var_Delete( &op2 );
		return ERR_WAE_WMLS_STACK_UNDERFLOW;
	}
}


enumErrorCode Exec_B_OR( pstructSI si )
{
	pstructVar	op2 = RE_Pop( si->RE );		/* NOTE THE ORDER THE OPERANDS ARE POPPED!!! */
	pstructVar	op1 = RE_Pop( si->RE );
	pstructVar	result = NULL;

	if ((op1 != NULL) && (op2 != NULL)) {
		if ( Var_ConvertMethod(CONVERT_INTS, op1, op2) ) {
			result = Var_B_OR( op1, op2 );
		}
		else {
			result = Var_New();
			Var_AssignInvalid( result );
		}
		Var_Delete( &op1 );
		Var_Delete( &op2 );
		OpS_Push( si->RE->OpS, &result );

		return ERR_WAE_WMLS_NONE;
	}
	else {
		Var_Delete( &op1 );
		Var_Delete( &op2 );
		return ERR_WAE_WMLS_STACK_UNDERFLOW;
	}
}


enumErrorCode Exec_B_XOR( pstructSI si )
{
	pstructVar	op2 = RE_Pop( si->RE );		/* NOTE THE ORDER THE OPERANDS ARE POPPED!!! */
	pstructVar	op1 = RE_Pop( si->RE );
	pstructVar	result = NULL;

	if ((op1 != NULL) && (op2 != NULL)) {
		if ( Var_ConvertMethod(CONVERT_INTS, op1, op2) ) {
			result = Var_B_XOR( op1, op2 );
		}
		else {
			result = Var_New();
			Var_AssignInvalid( result );
		}
		Var_Delete( &op1 );
		Var_Delete( &op2 );
		OpS_Push( si->RE->OpS, &result );

		return ERR_WAE_WMLS_NONE;
	}
	else {
		Var_Delete( &op1 );
		Var_Delete( &op2 );
		return ERR_WAE_WMLS_STACK_UNDERFLOW;
	}
}


enumErrorCode Exec_B_NOT( pstructSI si )
{
	pstructVar		op1 =	RE_Pop( si->RE );
	pstructVar		result = NULL;

	if (op1 == NULL)
		return ERR_WAE_WMLS_STACK_UNDERFLOW;

	if (Var_ConvertMethod( CONVERT_INTS, op1, NULL )) {
		result = Var_B_NOT( op1 );
		Var_AssignVar( op1, result );
		Var_Delete( &result );
	}
	else {
		Var_AssignInvalid( op1 );
	}
	OpS_Push( si->RE->OpS, &op1 );
	return ERR_WAE_WMLS_NONE;
}


enumErrorCode Exec_B_LSHIFT( pstructSI si )
{
	pstructVar	op2 = RE_Pop( si->RE );		/* NOTE THE ORDER THE OPERANDS ARE POPPED!!! */
	pstructVar	op1 = RE_Pop( si->RE );
	pstructVar	result = NULL;

	if ((op1 != NULL) && (op2 != NULL)) {
		if ( Var_ConvertMethod(CONVERT_INTS, op1, op2) ) {
			result = Var_B_LSHIFT( op1, op2 );
		}
		else {
			result = Var_New();
			Var_AssignInvalid( result );
		}
		Var_Delete( &op1 );
		Var_Delete( &op2 );
		OpS_Push( si->RE->OpS, &result );

		return ERR_WAE_WMLS_NONE;
	}
	else {
		Var_Delete( &op1 );
		Var_Delete( &op2 );
		return ERR_WAE_WMLS_STACK_UNDERFLOW;
	}
}


enumErrorCode Exec_B_RSSHIFT( pstructSI si )
{
	pstructVar	op2 = RE_Pop( si->RE );		/* NOTE THE ORDER THE OPERANDS ARE POPPED!!! */
	pstructVar	op1 = RE_Pop( si->RE );
	pstructVar	result = NULL;

	if ((op1 != NULL) && (op2 != NULL)) {
		if ( Var_ConvertMethod(CONVERT_INTS, op1, op2) ) {
			result = Var_B_RSSHIFT( op1, op2 );
		}
		else {
			result = Var_New();
			Var_AssignInvalid( result );
		}
		Var_Delete( &op1 );
		Var_Delete( &op2 );
		OpS_Push( si->RE->OpS, &result );

		return ERR_WAE_WMLS_NONE;
	}
	else {
		Var_Delete( &op1 );
		Var_Delete( &op2 );
		return ERR_WAE_WMLS_STACK_UNDERFLOW;
	}
}


enumErrorCode Exec_B_RSZSHIFT( pstructSI si )
{
	pstructVar	op2 = RE_Pop( si->RE );		/* NOTE THE ORDER THE OPERANDS ARE POPPED!!! */
	pstructVar	op1 = RE_Pop( si->RE );
	pstructVar	result = NULL;

	if ((op1 != NULL) && (op2 != NULL)) {
		if ( Var_ConvertMethod(CONVERT_INTS, op1, op2) ) {
			result = Var_B_RSZSHIFT( op1, op2 );
		}
		else {
			result = Var_New();
			Var_AssignInvalid( result );
		}
		Var_Delete( &op1 );
		Var_Delete( &op2 );
		OpS_Push( si->RE->OpS, &result );

		return ERR_WAE_WMLS_NONE;
	}
	else {
		Var_Delete( &op1 );
		Var_Delete( &op2 );
		return ERR_WAE_WMLS_STACK_UNDERFLOW;
	}
}



/* Comparison instructions *****************************************************************/
enumErrorCode Exec_EQ( pstructSI si )
{
	pstructVar	op2 = RE_Pop( si->RE );		/* NOTE THE ORDER THE OPERANDS ARE POPPED!!! */
	pstructVar	op1 = RE_Pop( si->RE );
	pstructVar	result = NULL;

	if ((op1 != NULL) && (op2 != NULL)) {
		if ( Var_ConvertMethod(CONVERT_INTS_FLOATS_STRINGS, op1, op2) ) {
			result = Var_EQ( op1, op2 );
		}
		else {
			result = Var_New();
			Var_AssignInvalid( result );
		}
		Var_Delete( &op1 );
		Var_Delete( &op2 );
		OpS_Push( si->RE->OpS, &result );

		return ERR_WAE_WMLS_NONE;
	}
	else {
		Var_Delete( &op1 );
		Var_Delete( &op2 );
		return ERR_WAE_WMLS_STACK_UNDERFLOW;
	}
}


enumErrorCode Exec_LE( pstructSI si )
{
	pstructVar	op2 = RE_Pop( si->RE );		/* NOTE THE ORDER THE OPERANDS ARE POPPED!!! */
	pstructVar	op1 = RE_Pop( si->RE );
	pstructVar	result = NULL;

	if ((op1 != NULL) && (op2 != NULL)) {
		if ( Var_ConvertMethod(CONVERT_INTS_FLOATS_STRINGS, op1, op2) ) {
			result = Var_LE( op1, op2 );
		}
		else {
			result = Var_New();
			Var_AssignInvalid( result );
		}
		Var_Delete( &op1 );
		Var_Delete( &op2 );
		OpS_Push( si->RE->OpS, &result );

		return ERR_WAE_WMLS_NONE;
	}
	else {
		Var_Delete( &op1 );
		Var_Delete( &op2 );
		return ERR_WAE_WMLS_STACK_UNDERFLOW;
	}
}


enumErrorCode Exec_LT( pstructSI si )
{
	pstructVar	op2 = RE_Pop( si->RE );		/* NOTE THE ORDER THE OPERANDS ARE POPPED!!! */
	pstructVar	op1 = RE_Pop( si->RE );
	pstructVar	result = NULL;

	if ((op1 != NULL) && (op2 != NULL)) {
		if ( Var_ConvertMethod(CONVERT_INTS_FLOATS_STRINGS, op1, op2) ) {
			result = Var_LT( op1, op2 );
		}
		else {
			result = Var_New();
			Var_AssignInvalid( result );
		}
		Var_Delete( &op1 );
		Var_Delete( &op2 );
		OpS_Push( si->RE->OpS, &result );

		return ERR_WAE_WMLS_NONE;
	}
	else {
		Var_Delete( &op1 );
		Var_Delete( &op2 );
		return ERR_WAE_WMLS_STACK_UNDERFLOW;
	}
}


enumErrorCode Exec_GE( pstructSI si )
{
	pstructVar	op2 = RE_Pop( si->RE );		/* NOTE THE ORDER THE OPERANDS ARE POPPED!!! */
	pstructVar	op1 = RE_Pop( si->RE );
	pstructVar	result = NULL;

	if ((op1 != NULL) && (op2 != NULL)) {
		if ( Var_ConvertMethod(CONVERT_INTS_FLOATS_STRINGS, op1, op2) ) {
			result = Var_GE( op1, op2 );
		}
		else {
			result = Var_New();
			Var_AssignInvalid( result );
		}
		Var_Delete( &op1 );
		Var_Delete( &op2 );
		OpS_Push( si->RE->OpS, &result );

		return ERR_WAE_WMLS_NONE;
	}
	else {
		Var_Delete( &op1 );
		Var_Delete( &op2 );
		return ERR_WAE_WMLS_STACK_UNDERFLOW;
	}
}


enumErrorCode Exec_GT( pstructSI si )
{
	pstructVar	op2 = RE_Pop( si->RE );		/* NOTE THE ORDER THE OPERANDS ARE POPPED!!! */
	pstructVar	op1 = RE_Pop( si->RE );
	pstructVar	result = NULL;

	if ((op1 != NULL) && (op2 != NULL)) {
		if ( Var_ConvertMethod(CONVERT_INTS_FLOATS_STRINGS, op1, op2) ) {
			result = Var_GT( op1, op2 );
		}
		else {
			result = Var_New();
			Var_AssignInvalid( result );
		}
		Var_Delete( &op1 );
		Var_Delete( &op2 );
		OpS_Push( si->RE->OpS, &result );

		return ERR_WAE_WMLS_NONE;
	}
	else {
		Var_Delete( &op1 );
		Var_Delete( &op2 );
		return ERR_WAE_WMLS_STACK_UNDERFLOW;
	}
}


enumErrorCode Exec_NE( pstructSI si )
{
	if ((Exec_EQ(si)  == ERR_WAE_WMLS_NONE) && 
			(Exec_NOT(si) == ERR_WAE_WMLS_NONE)) {
		return ERR_WAE_WMLS_NONE;
	}
	else {
		return ERR_WAE_WMLS_STACK_UNDERFLOW;
		/* the only fatal error from EQ and NOT is stack underflow */
	}
}



/* Logical instructions ***********************************************************************/
enumErrorCode Exec_NOT( pstructSI si )
{
	pstructVar	var = RE_Pop( si->RE );

	if (var == NULL) {
		return ERR_WAE_WMLS_STACK_UNDERFLOW;
	}

	if ( VCR_OK == Var_Convert( var, typeBool )) {
		if (var->val.theInt == FALSE) {
			Var_AssignBool( var, TRUE );
		}
		else {
			Var_AssignBool( var, FALSE );
		}
	}
	else {
		Var_AssignInvalid( var );
	}

	OpS_Push( si->RE->OpS, &var );
	return ERR_WAE_WMLS_NONE;
}


enumErrorCode Exec_SCAND( pstructSI si )
{
	pstructVar	var = RE_Pop( si->RE );
	pstructVar	var2 = NULL;


	if (var == NULL) {
		return ERR_WAE_WMLS_STACK_UNDERFLOW;
	}

	if ( VCR_OK == Var_Convert( var, typeBool )) {
		if (var->val.theInt == FALSE) {
			var2 = Var_New();
			Var_AssignBool( var2, FALSE );
		}
	}
	else {
		var2 = Var_New();
		Var_AssignBool( var2, FALSE );
		Var_AssignInvalid( var );
	}

	OpS_Push( si->RE->OpS, &var );
	if (var2 != NULL) {
		OpS_Push( si->RE->OpS, &var2 );
	}
	return ERR_WAE_WMLS_NONE;
}


enumErrorCode Exec_SCOR( pstructSI si )
{
	pstructVar	var = RE_Pop( si->RE );
	pstructVar	var2 = NULL;


	if (var == NULL) {
		return ERR_WAE_WMLS_STACK_UNDERFLOW;
	}

	if ( VCR_OK == Var_Convert( var, typeBool )) {
		if (var->val.theInt == FALSE) {
			Var_AssignBool( var, TRUE );
		}
		else {
			var2 = Var_New();
			Var_AssignBool( var2, FALSE );
		}
	}
	else {
		var2 = Var_New();
		Var_AssignBool( var2, FALSE );
		Var_AssignInvalid( var );
	}

	OpS_Push( si->RE->OpS, &var );
	if (var2 != NULL) {
		OpS_Push( si->RE->OpS, &var2 );
	}
	return ERR_WAE_WMLS_NONE;
}


enumErrorCode Exec_TOBOOL( pstructSI si )
{
	pstructVar	var = RE_Pop( si->RE );

	if (var == NULL) {
		return ERR_WAE_WMLS_STACK_UNDERFLOW;
	}

	if ( ! (VCR_OK == Var_Convert( var, typeBool ))) {
		Var_AssignInvalid( var );
	}

	OpS_Push( si->RE->OpS, &var );
	return ERR_WAE_WMLS_NONE;
}



/* Stack instructions *****************************************************************************/
enumErrorCode Exec_POP( pstructSI si ) 
{
	pstructVar	var = RE_Pop( si->RE );

	if (var == NULL) {
		return ERR_WAE_WMLS_STACK_UNDERFLOW;
	}
	else {
		Var_Delete( &var );
		return ERR_WAE_WMLS_NONE;
	}
}



/* Access to operand type ************************************************************************/
enumErrorCode Exec_TYPEOF( pstructSI si ) 
{
	pstructVar			var = RE_Pop( si->RE );
	pstructVar			type;

	if (var == NULL) 
		return ERR_WAE_WMLS_STACK_UNDERFLOW;

	type = Var_New();
	Var_AssignInt( type, var->type );

	Var_Delete( &var );

	OpS_Push( si->RE->OpS, &type );

	return ERR_WAE_WMLS_NONE;
}


enumErrorCode Exec_ISVALID( pstructSI si ) 
{
	pstructVar			var = RE_Pop( si->RE );
	pstructVar			isValid;

	if (var == NULL) 
		return ERR_WAE_WMLS_STACK_UNDERFLOW;

	isValid = Var_New();
	if (var->type  != typeInvalid) {
		Var_AssignBool( isValid, TRUE );
	}
	else {
		Var_AssignBool( isValid, FALSE );
	}

	Var_Delete( &var );

	OpS_Push( si->RE->OpS, &isValid );

	return ERR_WAE_WMLS_NONE;
}



/* Function return instructions ***************************************************************/
enumErrorCode Exec_RETURN( pstructSI si ) 
{
	UINT16					topIndex = OpS_GetTopIndex( si->RE->OpS );
	pstructVar			funcResult = NULL;
	pstructFrame		returnFrame = si->RE->currF;
	
	/* first make sure that the result is correctly placed on the stack */
	
	if (topIndex != (si->RE->currF->returnSP + 1)) {
		/* there is some scrap on the stack which must be disposed */
		funcResult = RE_Pop( si->RE );
		if ( ! OpS_ClearUntilIndex( si->RE->OpS, si->RE->currF->returnSP ) ) {
			return ERR_WAE_WMLS_STACK_UNDERFLOW;
		}
		OpS_Push( si->RE->OpS, &funcResult );
	}

	si->RE->currF = FS_Pop( si->RE->FS );

	/* check if this was the last function to finish in this BP */
	if( si->RE->currF != NULL ) {
		/* not the last: restore the frame that called */
		si->RE->IP = si->RE->currF->returnIP;
	}
	else {
		/* the last: signal to to SI that this BP is done */
		si->returnInfo = SI_RETURN_DONE;
	}
	Frame_Delete( &returnFrame, si->RE->BPI );

	return ERR_WAE_WMLS_NONE;
}


enumErrorCode Exec_RETURN_ES( pstructSI si ) 
{
	pstructVar			esVar = Var_New();
	pstructFrame		returnFrame = si->RE->currF;
	
	/* first make sure that the result is correctly placed on the stack */
	
	if ( ! OpS_ClearUntilIndex( si->RE->OpS, si->RE->currF->returnSP ) ) {
		return ERR_WAE_WMLS_STACK_UNDERFLOW;
	}
	OpS_Push( si->RE->OpS, &esVar );

	si->RE->currF = FS_Pop( si->RE->FS );

	/* check if this was the last function to finish in this BP */
	if( si->RE->currF != NULL ) {
		/* not the last: restore the frame that called */
		si->RE->IP = si->RE->currF->returnIP;
	}
	else {
		/* the last: signal to to SI that this BP is done */
		si->returnInfo = SI_RETURN_DONE;
	}
	Frame_Delete( &returnFrame, si->RE->BPI );

	return ERR_WAE_WMLS_NONE;
}



/* Miscellaneous instructions *******************************************************************/
enumErrorCode Exec_DEBUG( pstructSI si ) 
{
	si=si; /* just to get rid of a compiler warning */

	return ERR_WAE_WMLS_NONE;
}


⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -