byte StringFPS[255];
dword FPS;
dword LastTime;

alphakey_line15(dword src,dst,size,alpha,key)
{
	ECX=size;
	IF(ECX){
		$push edi,esi,ebx
		EDI=src;
		ESI=dst;
		alpha=alpha&0x000000FF>>3;
		loop(ECX){
			EAX=DSWORD[EDI];
			IF(EAX!=key){
				EBX=DSWORD[ESI];
				$push ecx
				ECX=EAX<<16;
				EDX=EBX<<16;
				EAX=EAX|ECX&3E07C1Fh;
				EBX=EBX|EDX&3E07C1Fh;
				EAX=int EAX-EBX*alpha>>5+EBX&0x3E07C1F;
				EDX=EAX>>16;
				EAX=EAX&0x0000FFFF|EDX;
				$pop ecx
				DSWORD[ESI]=AX;
			}
			EDI+=2;
			ESI+=2;
		}
	$pop ebx,esi,edi
	}
}

alphakey_line16(dword src,dst,size,alpha,key)
{
	ECX=size;
	IF(ECX){
		$push edi,esi,ebx
		EDI=src;
		ESI=dst;
		alpha=alpha&0x000000FF>>3;
		loop(ECX){
			EAX=DSWORD[EDI];
			IF(EAX!=key){
				EBX=DSWORD[ESI];
				$push ecx
				ECX=EAX<<16;
				EDX=EBX<<16;
				EAX=EAX|ECX&7E0F81Fh;
				EBX=EBX|EDX&7E0F81Fh;
				EAX=int EAX-EBX*alpha>>5+EBX&0x7E0F81F;
				EDX=EAX>>16;
				EAX=EAX&0x0000FFFF|EDX;
				$pop ecx
				DSWORD[ESI]=AX;
			}
			EDI+=2;
			ESI+=2;
		}
		$pop ebx,esi,edi
	}
}

alphakey_line24(dword src,dst,size,alpha,key)
{
	ECX=size;
	IF(ECX){
		$push edi,esi,ebx
		EDI=src;
		ESI=dst;
		key=key&0xFFFFFF00;
		loop(ECX){
			EAX=DSDWORD[EDI]&0xFFFFFF00;
			IF(EAX!=key){
				EBX=DSDWORD[ESI];
				EAX>>=8;
				EBX>>=8;
				$push ecx
				EDX=EBX&0x00FF00FF;
				ECX=EAX&0x00FF00FF-EDX;
				EBX&=0x0000FF00;
				EAX&=0x0000FF00;
				EAX-=EBX;
				$push EBX;
				EBX=alpha;
				ECX*=EBX;
				EAX*=EBX;
				$pop EBX
				ECX=ECX>>8+EDX&0x00FF00FF;
				EAX=EAX>>8+EBX&0x0000FF00|ECX;
				$pop ECX
				DSWORD[ESI+1]=AX;
				EAX>>=8;
				DSBYTE[ESI]=AH;

			}
			EDI+=3;
			ESI+=3;
		}
		$pop ebx,esi,edi
	}
}

alphakey_line32(dword src,dst,size,alpha,key)
{
	ECX=size;
	IF(ECX){
		$push edi,esi,ebx
		EDI=src;
		ESI=dst;
		key=key&0xFFFFFF00;
		loop(ECX){
			EAX=DSDWORD[EDI]&0x00FFFFFF;
			IF(EAX!=key){
				EBX=DSDWORD[ESI];
				$push ecx
				EDX=EBX&0x00FF00FF;
				ECX=EAX&0x00FF00FF-EDX;
				EBX&=0x0000FF00;
				EAX&=0x0000FF00;
				EAX-=EBX;
				$push EBX;
				EBX=alpha;
				ECX*=EBX;
				EAX*=EBX;
				$pop EBX
				ECX=ECX>>8+EDX&0x00FF00FF;
				EAX=EAX>>8+EBX&0x0000FF00|ECX;
				$pop ECX
				DSDWORD[ESI]=EAX;
			}
			EDI+=4;
			ESI+=4;
		}
		$pop ebx,esi,edi
	}
}

// RGB 888 -> RGB 555
:void pack15(dword Pack15Element)
{
	$push ebx
	EAX=Pack15Element;
	EBX=EAX&0b00000000000111110000000000000000>>6;//извлекаем красную состовляющую
	$push ebx                                   //сохраняем в стеке
	EBX=EAX&0b00000000000000000001111100000000>>3;
	EAX=EAX&0b00000000000000000000000000011111|EBX;
	$pop EBX
	EAX|=EBX;
	$pop ebx
}
//результат в eax, ax содержит 16 бит запакованного RGB 555 цвета

// RGB 888 -> RGB 565
:void pack16(dword Pack16Element)
{
	$push ebx
	EAX=Pack16Element;
	EBX=EAX&0b00000000000111110000000000000000>>5;//извлекаем красную состовляющую
	$push ebx                                   //сохраняем в стеке
	EBX=EAX&0b00000000000000000011111100000000>>3;
	EAX=EAX&0b00000000000000000000000000011111|EBX;
	$pop EBX
	EAX|=EBX;
	$pop ebx
}
//результат в eax, ax содержит 16 бит запакованного RGB 565 цвета

//Копирование заголока BMP файла
CopyBitmapInfoheader(dword LpDIB,LpBitmapinfoheader)
{
	$push ecx,esi,edi
	ECX=sizeof(BITMAPINFOHEADER);
	ESI=LpDIB+14;    //установим на BITMAPINFOHEADER
	EDI=LpBitmapinfoheader;
	$rep $movsb
	$pop  edi,esi,ecx
}

ViewFPS(dword hWnd_handle)
{
	$push EBX
	EBX=EAX=GetTickCount();
//	IF(LastTime==0)LastTime=EAX;
	FPS++;
	IF(EAX-LastTime>=1000){
		LastTime=EBX;
		wsprintf(#StringFPS,"DirectDraw software Alpha, FPS %d",FPS);
		SetWindowText(hWnd_handle,#StringFPS);
		FPS=0;
	}
	$pop EBX
}
