#pragma once #pragma code_seg("pi") __forceinline float pi() { __asm fldpi } #pragma code_seg("sm0") unsigned long ftol(float Value) { unsigned long RetVal; __asm fld Value __asm fistp RetVal return RetVal; } #pragma code_seg("sm1") float frac(float Value) { return Value - ftol(Value); } #pragma code_seg("sm2") float abs(float Value) { __asm fld Value __asm fabs } #pragma code_seg("sm3") float sin(float Value) { __asm fld Value __asm fsin } #pragma code_seg("sm4") float sign(float Value) { if (Value != 0) return Value / abs(Value); return 1.0f; } #pragma code_seg("sm5") float sqrt(float Value) { __asm fld Value __asm fsqrt } #pragma code_seg("sm7") void* memcpy(void* Dest, const void* Src, size_t destSize) { __asm mov esi, Src __asm mov edi, Dest __asm mov ecx, destSize __asm rep movsb } #pragma code_seg("sm8") float fmod(float x, float y) { __asm fld y __asm fld x __asm fprem __asm fxch __asm fstp x } #pragma data_seg("smA") static unsigned long seed=0x12345678; #pragma code_seg("sm9") __forceinline void randomize(unsigned long x) { seed = x; } #pragma code_seg("smB") float rand() { seed = seed * 0x76364873 + 1234567; return (float)(seed & 0x7FFFFFFF) * (const float)(2.0f / (float)0x7FFFFFFF) - 1.0f; } #pragma code_seg("smS") __forceinline size_t strlen(const char* String) { size_t Length = 0; while (*String++) ++Length; return Length; } #pragma code_seg("smP") float pow(float x, float y){ float r; __asm{ fld y fld x fyl2x fld1 fld st(1) fprem f2xm1 faddp st(1),st fscale fxch st(1) fstp st(0) fstp r } return r; }