HRESULT Library_spot_native_Microsoft_SPOT_Hardware_Utility::Piezo___STATIC__VOID__U4__U4( CLR_RT_StackFrame& stack )
{
    NATIVE_PROFILE_CLR_CORE();
    TINYCLR_HEADER();

    CLR_RT_HeapBlock* pArgs = &(stack.Arg0());

    ::Piezo_Tone( pArgs[ 0 ].NumericByRef().u4, pArgs[ 1 ].NumericByRef().u4 );

    TINYCLR_NOCLEANUP_NOLABEL();
}
HRESULT Library_corlib_native_System_DateTime::get_Second___I4( CLR_RT_StackFrame& stack )
{
    NATIVE_PROFILE_CLR_CORE();
    TINYCLR_HEADER();

    SYSTEMTIME st; Expand( stack, st );

    stack.SetResult_I4( st.wSecond );

    TINYCLR_NOCLEANUP_NOLABEL();
}
HRESULT Library_spot_native_Microsoft_SPOT_Hardware_Utility::GetMachineTime___STATIC__mscorlibSystemTimeSpan( CLR_RT_StackFrame& stack )
{
    NATIVE_PROFILE_CLR_CORE();
    TINYCLR_HEADER();

    CLR_INT64* pRes = Library_corlib_native_System_TimeSpan::NewObject( stack );

    *pRes = Time_GetMachineTime();

    TINYCLR_NOCLEANUP_NOLABEL();
}
HRESULT CLR_RT_FileStream::AssignStorage( BYTE* bufferIn, size_t sizeIn, BYTE* bufferOut, size_t sizeOut )
{   
    TINYCLR_HEADER();
   
    m_dataIn = bufferIn;
    m_dataInSize = sizeIn;
    m_dataOut = bufferOut;
    m_dataOutSize = sizeOut;

    TINYCLR_NOCLEANUP_NOLABEL();
}
HRESULT Library_corlib_native_System_Double::CompareTo___STATIC__I4__R8__R8( CLR_RT_StackFrame& stack )
{
    NATIVE_PROFILE_CLR_CORE();
    TINYCLR_HEADER();

    CLR_INT64 left  = stack.Arg0().NumericByRef().s8;
    CLR_INT64 right = stack.Arg1().NumericByRef().s8;

    stack.SetResult_I4((left < right) ? -1 : (left > right) ? 1 : 0);

    TINYCLR_NOCLEANUP_NOLABEL();
}
HRESULT Library_corlib_native_System_Double::IsPositiveInfinity___STATIC__BOOLEAN__R8( CLR_RT_StackFrame& stack )
{
    NATIVE_PROFILE_CLR_CORE();
    TINYCLR_HEADER();

    double d = stack.Arg0().NumericByRefConst().r8;
    bool res = System::Double::IsPositiveInfinity( d );

    stack.SetResult_Boolean( res );    

    TINYCLR_NOCLEANUP_NOLABEL();
}
HRESULT Library_corlib_native_System_Math::Cosh___STATIC__R8__R8( CLR_RT_StackFrame& stack )
{
    NATIVE_PROFILE_CLR_CORE();
    TINYCLR_HEADER();

    double d = stack.Arg0().NumericByRefConst().r8;
    double res = System::Math::Cosh( d );

    stack.SetResult_R8( res );

    TINYCLR_NOCLEANUP_NOLABEL();
}
HRESULT Library_spot_native_Microsoft_SPOT_Reflection::IsTypeLoaded___STATIC__BOOLEAN__mscorlibSystemType( CLR_RT_StackFrame& stack )
{
    NATIVE_PROFILE_CLR_CORE();
    TINYCLR_HEADER();

    CLR_RT_TypeDef_Instance inst;
    CLR_RT_HeapBlock*       hbType = stack.Arg0().Dereference();

    stack.SetResult_Boolean( CLR_RT_ReflectionDef_Index::Convert( *hbType, inst, NULL ) );

    TINYCLR_NOCLEANUP_NOLABEL();
}
HRESULT Library_corlib_native_System_Math::Ceiling___STATIC__R8__R8( CLR_RT_StackFrame& stack )
{
    NATIVE_PROFILE_CLR_CORE();
    TINYCLR_HEADER();

    CLR_INT64  d = stack.Arg0().NumericByRefConst().r8;

    CLR_INT64 res = (CLR_INT64)(d + (CLR_INT64)CLR_RT_HeapBlock::HB_DoubleMask) & (~CLR_RT_HeapBlock::HB_DoubleMask);

    stack.SetResult_I8( res );

    TINYCLR_NOCLEANUP_NOLABEL();
}
HRESULT Library_corlib_native_System_BitConverter::DoubleToInt64Bits___STATIC__I8__R8( CLR_RT_StackFrame& stack )
{
	NATIVE_PROFILE_CLR_CORE();
	TINYCLR_HEADER();

	double input;
	input = stack.Arg0().NumericByRefConst().r8;
	__int64* p;
	p = reinterpret_cast<__int64*>(&input);
	stack.SetResult_I8(*p);

	TINYCLR_NOCLEANUP_NOLABEL();
}
HRESULT Library_corlib_native_System_Double::CompareTo___STATIC__I4__R8__R8( CLR_RT_StackFrame& stack )
{
    NATIVE_PROFILE_CLR_CORE();
    TINYCLR_HEADER();

    double d = stack.Arg0().NumericByRefConst().r8;
    double val = stack.Arg0().NumericByRefConst().r8;
    CLR_UINT32 res = System::Double::CompareTo( d, val );

    stack.PushValue().SetInteger( res );

    TINYCLR_NOCLEANUP_NOLABEL();
}
HRESULT Library_spot_hardware_native_Microsoft_SPOT_Hardware_Cpu::get_GlitchFilterTime___STATIC__mscorlibSystemTimeSpan( CLR_RT_StackFrame& stack )
{
    NATIVE_PROFILE_CLR_HARDWARE();
    TINYCLR_HEADER();

    CLR_INT64 val = (CLR_INT64)::CPU_GPIO_GetDebounce() * TIME_CONVERSION__TO_MILLISECONDS;

    stack.SetResult_I8( val );
    
    stack.TopValue().ChangeDataType( DATATYPE_TIMESPAN );

    TINYCLR_NOCLEANUP_NOLABEL();
}
HRESULT Library_spot_update_native_Microsoft_SPOT_MFUpdate_MFNativeUpdate::Authenticate___STATIC__BOOLEAN__I4__SZARRAY_U1( CLR_RT_StackFrame& stack )
{
    TINYCLR_HEADER();

    CLR_INT32               handle  = stack.Arg0().NumericByRef().s4;
    CLR_RT_HeapBlock_Array* paArgs  = stack.Arg1().DereferenceArray();
    CLR_UINT8*              pArgs   = paArgs == NULL ? NULL : paArgs->GetFirstElement();
    CLR_INT32               argsLen = paArgs == NULL ? 0    : paArgs->m_numOfElements;

    stack.SetResult_Boolean(TRUE == MFUpdate_Authenticate(handle, pArgs, argsLen));

    TINYCLR_NOCLEANUP_NOLABEL();
}
HRESULT Library_spot_net_security_native_Microsoft_SPOT_Net_Security_SslNative::ExitSecureContext___STATIC__I4__I4( CLR_RT_StackFrame& stack )
{
    NATIVE_PROFILE_CLR_NETWORK();
    TINYCLR_HEADER();

    CLR_INT32 sslContext = stack.Arg0().NumericByRef().s4;

    int result = SSL_ExitContext( sslContext ) == TRUE ? 0 : -1;

    stack.SetResult_I4( result );

    TINYCLR_NOCLEANUP_NOLABEL();
}
static HRESULT ComputeSinCos( CLR_RT_StackFrame& stack, bool fSin )
{
    NATIVE_PROFILE_CLR_CORE();
    TINYCLR_HEADER();

    int index = (stack.Arg0().NumericByRef().s4 % 360) / 6; if(index < 0) index += 60;

    const CLR_RADIAN& rec = c_CLR_radians[ index ];

    stack.SetResult_I4( (int)(fSin ? rec.sin : rec.cos) );

    TINYCLR_NOCLEANUP_NOLABEL();
}
HRESULT Library_spot_native_Microsoft_SPOT_Debug::Print___STATIC__VOID__STRING( CLR_RT_StackFrame& stack )
{
    NATIVE_PROFILE_CLR_CORE();
    TINYCLR_HEADER();

    LPCSTR szText0 = stack.Arg0().RecoverString();

    if(!szText0) szText0 = "<null>";

    CLR_Debug::Emit( szText0, -1 );
    CLR_Debug::Emit( "\r\n" , -1 );

    TINYCLR_NOCLEANUP_NOLABEL();
}
HRESULT Library_spot_hardware_native_Microsoft_SPOT_Hardware_HardwareProvider::NativeSupportsNonStandardBaudRate___BOOLEAN__I4( CLR_RT_StackFrame& stack )
{
    TINYCLR_HEADER();

    CLR_UINT32 port;

    port = stack.Arg1().NumericByRef().u4;
    if (::CPU_USART_SupportNonStandardBaudRate( port )==TRUE)
        stack.SetResult_Boolean( true );
    else
        stack.SetResult_Boolean( false );
        
	TINYCLR_NOCLEANUP_NOLABEL();
}
HRESULT CLR_HW_Hardware::ManagedHardware_Initialize()
{
    NATIVE_PROFILE_CLR_HARDWARE();
    TINYCLR_HEADER();
    
    m_interruptData.m_HalQueue.Initialize( (CLR_HW_Hardware::HalInterruptRecord*)&g_scratchInterruptDispatchingStorage, InterruptRecords() );

    m_interruptData.m_applicationQueue.DblLinkedList_Initialize ();

    m_interruptData.m_queuedInterrupts = 0;

    TINYCLR_NOCLEANUP_NOLABEL();

}
HRESULT Library_spot_hardware_native_Microsoft_SPOT_Hardware_AnalogOutput::WriteRaw___VOID__I4( CLR_RT_StackFrame& stack )
{
    NATIVE_PROFILE_CLR_HARDWARE();
    TINYCLR_HEADER();

    CLR_RT_HeapBlock* pThis = stack.This();
    DA_CHANNEL channel = (DA_CHANNEL)pThis[FIELD__m_channel].NumericByRef().s4;
    
    INT32 level = stack.Arg1().NumericByRef().s4;

    ::DA_Write(channel, level);

    TINYCLR_NOCLEANUP_NOLABEL();
}
HRESULT Library_corlib_native_System_BitConverter::DoubleToInt64Bits___STATIC__I8__R8(CLR_RT_StackFrame& stack)
{
	NATIVE_PROFILE_CLR_CORE();
	TINYCLR_HEADER();

#if !defined(TINYCLR_EMULATED_FLOATINGPOINT)
	double input = stack.Arg0().NumericByRefConst().r8;
#else
	CLR_INT64 input = stack.Arg0().NumericByRefConst().r8;
#endif
	__int64* p = reinterpret_cast<__int64*>(&input);
	stack.SetResult_I8(*p);

	TINYCLR_NOCLEANUP_NOLABEL();
}
HRESULT Library_corlib_native_System_DateTime::DaysInMonth___STATIC__I4__I4__I4( CLR_RT_StackFrame& stack )
{
    NATIVE_PROFILE_CLR_CORE();
    TINYCLR_HEADER();

    CLR_INT32 year  = stack.Arg0().NumericByRef().s4;
    CLR_INT32 month = stack.Arg1().NumericByRef().s4;
    CLR_INT32 days  = 0;

    Time_DaysInMonth( year, month, &days );

    stack.SetResult_I4( days );

    TINYCLR_NOCLEANUP_NOLABEL();
}
HRESULT Library_spot_native_Microsoft_SPOT_Reflection::GetTypeFromHash___STATIC__mscorlibSystemType__U4( CLR_RT_StackFrame& stack )
{
    NATIVE_PROFILE_CLR_CORE();
    TINYCLR_HEADER();

    CLR_RT_HeapBlock&    top = stack.PushValueAndClear();
    CLR_RT_TypeDef_Index res;

    if(g_CLR_RT_TypeSystem.FindTypeDef( stack.Arg0().NumericByRefConst().u4, res ))
    {
        top.SetReflection( res );
    }

    TINYCLR_NOCLEANUP_NOLABEL();
}
HRESULT Library_spot_hardware_native_Microsoft_SPOT_Hardware_AnalogInput::ReadRaw___I4( CLR_RT_StackFrame& stack )
{
    NATIVE_PROFILE_CLR_HARDWARE();
    TINYCLR_HEADER();

    CLR_RT_HeapBlock* pThis = stack.This();

    const ANALOG_CHANNEL channel = (ANALOG_CHANNEL)pThis[FIELD__m_channel].NumericByRef().s4;
    
    const CLR_INT32 raw = ::AD_Read(channel);

    stack.SetResult_I4(raw);

    TINYCLR_NOCLEANUP_NOLABEL();
}
HRESULT Library_corlib_native_System_Math::Sign___STATIC__I4__R8( CLR_RT_StackFrame& stack )
{
    NATIVE_PROFILE_CLR_CORE();
    TINYCLR_HEADER();

    double d = stack.Arg0().NumericByRefConst().r8;
    INT32 res;
    if (d < 0) res =  -1;
    else if (d > 0) res =  +1;
    else res = 0;

    stack.SetResult_I4( res );

    TINYCLR_NOCLEANUP_NOLABEL();;
}
HRESULT Library_spot_native_Microsoft_SPOT_Reflection::GetTypeHash___STATIC__U4__mscorlibSystemType( CLR_RT_StackFrame& stack )
{
    NATIVE_PROFILE_CLR_CORE();
    TINYCLR_HEADER();

    CLR_UINT32 hash;

    if(CLR_RT_ReflectionDef_Index::Convert( stack.Arg0(), hash ) == false)
    {
        hash = 0;
    }

    stack.SetResult( hash, DATATYPE_U4 );

    TINYCLR_NOCLEANUP_NOLABEL();
}
HRESULT Library_corlib_native_System_Math::Round___STATIC__R8__R8( CLR_RT_StackFrame& stack )
{
    NATIVE_PROFILE_CLR_CORE();
    TINYCLR_HEADER();

    CLR_INT64 d = stack.Arg0().NumericByRefConst().r8;

    //for negative number we have to be banker's round, if -0.5, round to 0, but 0.5 to 0
    if (d <0) d =d + 1; 
    CLR_INT64 res = (CLR_INT64)(d + (CLR_INT64)(CLR_RT_HeapBlock::HB_DoubleMask>>1) ) & (~CLR_RT_HeapBlock::HB_DoubleMask);

    stack.SetResult_I8( res );


    TINYCLR_NOCLEANUP_NOLABEL();
}
HRESULT Library_spot_Time_native_Microsoft_SPOT_Time_TimeService::SetUtcTime___STATIC__VOID__I8( CLR_RT_StackFrame& stack )
{
    TINYCLR_HEADER(); 

    INT64 utc = stack.Arg0().NumericByRef().s8;
    
    INT64 utcBefore = Time_GetUtcTime();
    INT64 utcNow = Time_SetUtcTime( utc, false );

    // correct the uptime
    if(utcNow > utcBefore) 
    {
        g_CLR_RT_ExecutionEngine.m_startTime += (utcNow - utcBefore);
    }
    else
    {
        g_CLR_RT_ExecutionEngine.m_startTime -= (utcBefore - utcNow);
    }

    TINYCLR_NOCLEANUP_NOLABEL();
}
HRESULT Library_corlib_native_System_DateTime::get_Today___STATIC__SystemDateTime( CLR_RT_StackFrame& stack )
{
    NATIVE_PROFILE_CLR_CORE();
    TINYCLR_HEADER();

    CLR_INT64* pRes = NewObject( stack );

    {
        SYSTEMTIME st; 
        Time_ToSystemTime( Time_GetLocalTime(), &st );

        st.wHour         = 0;
        st.wMinute       = 0;
        st.wSecond       = 0;
        st.wMilliseconds = 0;

        *pRes = Time_FromSystemTime( &st );
    }

    TINYCLR_NOCLEANUP_NOLABEL();
}
HRESULT Library_spot_native_Microsoft_SPOT_Reflection::GetAssemblyHash___STATIC__U4__mscorlibSystemReflectionAssembly( CLR_RT_StackFrame& stack )
{
    NATIVE_PROFILE_CLR_CORE();
    TINYCLR_HEADER();

    CLR_RT_Assembly_Instance inst;
    CLR_UINT32               hash;

    if(CLR_RT_ReflectionDef_Index::Convert( stack.Arg0(), inst ))
    {
        hash = inst.m_assm->ComputeAssemblyHash();
    }
    else
    {
        hash = 0;
    }

    stack.SetResult( hash, DATATYPE_U4 );

    TINYCLR_NOCLEANUP_NOLABEL();
}
HRESULT Library_corlib_native_System_Math::Round___STATIC__R8__R8( CLR_RT_StackFrame& stack )
{
    NATIVE_PROFILE_CLR_CORE();
    TINYCLR_HEADER();

    double d = stack.Arg0().NumericByRefConst().r8;
    double hi = d + 0.5;
    double res = System::Math::Floor( hi );

    //If the number was in the middle of two integers, we need to round to the even one.
    if(res==hi)
    {
        if(System::Math::Fmod( res, 2.0 ) != 0)
        {
            //Rounding up made the number odd so we should round down.
            res -= 1.0;
        }
    }

    stack.SetResult_R8( res );

    TINYCLR_NOCLEANUP_NOLABEL();
}