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

📄 nesasm.cpp

📁 冰人引擎,本2d游戏引擎定位于游戏次中层引擎。他不像CDX等引擎那样
💻 CPP
📖 第 1 页 / 共 2 页
字号:
#include "stdafx.h"

DWORD ENGINE_DRAW_LINE_ALPHA_SPEED_MASK[ 2 ] = { 0x007f7f7f , 0x007f7f7f };
DWORD ENGINE_DRAW_LINE_ALPHA_QUALITY_SRCBITMAP_MASK[ 256 ][ 2 ];
DWORD ENGINE_DRAW_LINE_ALPHA_QUALITY_DESTBITMAP_MASK[ 256 ][ 2 ];
DWORD ENGINE_DRAW_LINE_ALPHA_QUALITY_COLOR_MASK1 = 0x00ff0000;
DWORD ENGINE_DRAW_LINE_ALPHA_QUALITY_COLOR_MASK2 = 0x0000ff00;
DWORD ENGINE_DRAW_LINE_ALPHA_QUALITY_COLOR_MASK3 = 0x000000ff;
DWORD ENGINE_DRAW_LINE_ALPHA_MASK[ 256 ];
DWORD ENGINE_DRAW_LINE_ALPHA_CHUANNEL_MASK[ 2 ] = { 0x00ff00ff , 0x000000ff };

//DWORD ENGIEN_ALPHA_CHUNNEL_MASK[ 2 ] = { 0x00ff00ff , 0x000000ff };

void NesDrawLineInit( void )
{
	DWORD i;
	for( i = 0; i < 256; i ++ )
	{
		ENGINE_DRAW_LINE_ALPHA_QUALITY_SRCBITMAP_MASK[ i ][ 0 ]	= 0x00010001 * i;
		ENGINE_DRAW_LINE_ALPHA_QUALITY_SRCBITMAP_MASK[ i ][ 1 ] = 0x00010001 * i;
		ENGINE_DRAW_LINE_ALPHA_QUALITY_DESTBITMAP_MASK[ i ][ 0 ]= 0x00010001 * ( 255 - i );
		ENGINE_DRAW_LINE_ALPHA_QUALITY_DESTBITMAP_MASK[ i ][ 1 ]= 0x00010001 * ( 255 - i );

		ENGINE_DRAW_LINE_ALPHA_MASK[ i ] = 0x00010101 * ( 255 - i );
	}
}

NESASM void NesMemSet( PVOID pDestPointer , DWORD dwDestOffset , DWORD dwValue , DWORD dwLenght )
{
	__asm
	{
		push	ebp;
		mov		ebp , esp;
		push	edi;
		push	ecx;

		mov		edi , dword ptr Value1;
		mov		eax , dword ptr Value3;
		mov		ecx , dword ptr Value4;
		add		edi , dword ptr Value2;

		rep		stosd;
		pop		ecx;
		pop		edi;
		pop		ebp;
		ret;
	}
}

NESASM void NesDrawLineNormal( PVOID pDestPointer ,DWORD dwDestOffset , PVOID pSrcPointer , DWORD dwSrcOffset , DWORD dwLenght )
{
	__asm
	{
		push	ebp;
		mov		ebp , esp;
		push	edi;
		push	esi;
		push	ecx;

		mov		edi , dword ptr Value1;
		mov		esi , dword ptr Value3;
		mov		ecx , dword ptr Value5;
		add		edi , dword ptr Value2;
		add		esi , dword ptr Value4;

		rep		movsd;

		pop		ecx;
		pop		esi;
		pop		edi;
		pop		ebp;
		ret;
	}
}

NESASM void NesDrawLineNormalColorKey( PVOID pDestPointer ,DWORD dwDestOffset , PVOID pSrcPointer , DWORD dwSrcOffset , DWORD dwLenght , DWORD dwColorKey )
{
	__asm
	{
		push	ebp;
		mov		ebp , esp;
		push	edi;
		push	esi;
		push	ecx;
		push	ebx;

		mov		edi , dword ptr Value1;
		mov		esi , dword ptr Value3;
		mov		ecx , dword ptr Value5;
		add		edi , dword ptr Value2;
		add		esi , dword ptr Value4;
		mov		ebx , dword ptr Value6;
loop_1:
		lodsd;
		cmp		eax , ebx;
		je		loop_2;
		stosd;
		loop	loop_1;
		pop		ebx;
		pop		ecx;
		pop		esi;
		pop		edi;
		pop		ebp;
		ret;
loop_2:
		add		edi , 4;
		loop	loop_1;
		pop		ebx;
		pop		ecx;
		pop		esi;
		pop		edi;
		pop		ebp;
		ret;
	}
}

NESASM void NesDrawLineAlphaSpeed( PVOID pDestPointer ,DWORD dwDestOffset , PVOID pSrcPointer , DWORD dwSrcOffset , DWORD dwLenght )
{
	__asm
	{
		push	ebp;
		mov		ebp , esp;
		push	edi;
		push	esi;
		push	ecx;

		mov		edi , dword ptr Value1;//[ Val1 ];
		mov		esi , dword ptr Value3;//[ Val3 ];
		mov		ecx , dword ptr Value5;//[ Val5 ];
		add		edi , dword ptr Value2;//[ Val2 ];
		add		esi , dword ptr Value4;//[ Val4 ];
		mov		eax , ecx;
		shr		ecx , 1;
		and		eax , 7;
		movq	mm0 , ENGINE_DRAW_LINE_ALPHA_SPEED_MASK;
		cmp		eax , 0;
		jne		loop_2;
loop_1:
		movq	mm1 , [ esi ];
		movq	mm2 , [ edi ];
		psrlq	mm1 , 1;
		psrlq	mm2 , 1;
		pand	mm1 , mm0;
		pand	mm2 , mm0;
		paddb	mm1 , mm2;
		movq	[ edi ] , mm1;
		add		edi , 8;
		add		esi , 8;
		loop	loop_1;

		pop		ecx;
		pop		esi;
		pop		edi;
		pop		ebp;
		ret;
		emms;
loop_2:
		cmp		ecx ,0;
		je		loop_3;
		movq	mm1 , [ esi ];
		movq	mm2 , [ edi ];
		psrlq	mm1 , 1;
		psrlq	mm2 , 1;
		pand	mm1 , mm0;
		pand	mm2 , mm0;
		paddb	mm1 , mm2;
		movq	[ edi ] , mm1;
		add		edi , 8;
		add		esi , 8;
		loop	loop_1;
loop_3:		
		movd	mm1 , [ esi ];
		movd	mm2 , [ edi ];
		psrlq	mm1 , 1;
		psrlq	mm2 , 1;
		pand	mm1 , mm0;
		pand	mm2 , mm0;
		paddb	mm1 , mm2;
		movd	[ edi ] , mm1;

		pop		ecx;
		pop		esi;
		pop		edi;
		pop		ebp;
		ret;
		emms;
	}
}

NESASM void NesDrawLineAlphaSpeedColorKey( PVOID pDestPointer ,DWORD dwDestOffset , PVOID pSrcPointer , DWORD dwSrcOffset , DWORD dwLenght , DWORD dwColorKey )
{
	__asm
	{
		push	ebp;
		mov		ebp , esp;
		push	edi;
		push	esi;
		push	ecx;
		push	ebx;
		push	edx;

		mov		edi , dword ptr Value1;
		mov		esi , dword ptr Value3;
		mov		ecx , dword ptr Value5;
		add		edi , dword ptr Value2;
		add		esi , dword ptr Value4;
		mov		edx , 0x007f7f7f;
loop_1:
		mov		eax , dword ptr [ esi ];
		cmp		eax , dword ptr Value6;
		jne		loop_2;
		add		esi , 4;
		add		edi , 4;
		loop	loop_1;
		pop		edx;
		pop		ebx;
		pop		ecx;
		pop		esi;
		pop		edi;
		pop		ebp;
		ret;

loop_2:
		mov		ebx , dword ptr [ edi ];
		shr		eax , 1;
		shr		ebx , 1;
		and		eax , edx;
		and		ebx , edx;
		add		eax , ebx;
		mov		dword ptr [ edi ] , eax;
		add		esi , 4;
		add		edi , 4;
		loop	loop_1;

		pop		edx;
		pop		ebx;
		pop		ecx;
		pop		esi;
		pop		edi;
		pop		ebp;
		ret;
	}
}
NESASM void NesDrawLineAlphaQuality( PVOID pDestPointer ,DWORD dwDestOffset , PVOID pSrcPointer , DWORD dwSrcOffset , DWORD dwLenght , DWORD dwAlpha )
{
	__asm
	{
		push	ebp;
		mov		ebp , esp;
		push	edi;
		push	esi;
		push	ecx;
		push	ebx;
		push	edx;

		mov		edi , dword ptr Value1;
		mov		esi , dword ptr Value3;
		mov		ecx , dword ptr Value5;
		add		edi , dword ptr Value2;
		add		esi , dword ptr Value4;
		mov		eax , offset ENGINE_DRAW_LINE_ALPHA_QUALITY_SRCBITMAP_MASK;
		mov		edx , offset ENGINE_DRAW_LINE_ALPHA_QUALITY_DESTBITMAP_MASK;
		mov		ebx , dword ptr Value6;
		lea		eax , dword ptr [ eax + ebx * 8 ];
		lea		edx , dword ptr [ edx + ebx * 8 ];
//		shr		ecx , 2;
		movq	mm6 , [ eax ];
		movq	mm7 , [ edx ];
		pxor	mm0 , mm0;
loop_1:
		movd	mm1 , [ esi ];
		movd	mm2 , [ edi ];
		punpcklbw	mm1 , mm0;
		punpcklbw	mm2 , mm0;
		pmullw	mm1 , mm6;
		pmullw	mm2 , mm7;
		paddb	mm1 , mm2;
		movq	mm2 , mm1;
		movq	mm3 , mm1;
		psrlq	mm1 , 24;
		psrlq	mm2 , 16;
		psrlq	mm3 , 8;

		pand	mm1 , ENGINE_DRAW_LINE_ALPHA_QUALITY_COLOR_MASK1;
		pand	mm2 , ENGINE_DRAW_LINE_ALPHA_QUALITY_COLOR_MASK2;
		pand	mm3 , ENGINE_DRAW_LINE_ALPHA_QUALITY_COLOR_MASK3;

		por		mm1 , mm2;
		por		mm1 , mm3;
		movd	[ edi ] ,mm1;
		add		esi , 4;
		add		edi , 4;
		loop	loop_1;

		pop		edx;
		pop		ebx;
		pop		ecx;
		pop		esi;
		pop		edi;
		pop		ebp;
		ret;
		emms;
	}
}

NESASM void NesDrawLineAlphaQualityColorKey( PVOID pDestPointer ,DWORD dwDestOffset , PVOID pSrcPointer , DWORD dwSrcOffset , DWORD dwLenght , DWORD dwAlpha , DWORD dwColorKey )
{
	__asm
	{
		push	ebp;
		mov		ebp , esp;
		push	edi;
		push	esi;
		push	ecx;
		push	ebx;
		push	edx;

		mov		edi , dword ptr Value1;

		mov		edi , dword ptr Value1;
		mov		esi , dword ptr Value3;
		mov		ecx , dword ptr Value5;
		add		edi , dword ptr Value2;
		add		esi , dword ptr Value4;
		mov		eax , offset ENGINE_DRAW_LINE_ALPHA_QUALITY_SRCBITMAP_MASK;
		mov		edx , offset ENGINE_DRAW_LINE_ALPHA_QUALITY_DESTBITMAP_MASK;
		mov		ebx , dword ptr Value6;
		lea		eax , dword ptr [ eax + ebx * 8 ];
		lea		edx , dword ptr [ edx + ebx * 8 ];
//		shr		ecx , 2;
		movq	mm6 , [ eax ];
		movq	mm7 , [ edx ];
		pxor	mm0 , mm0;
		mov		ebx , dword ptr Value7;
loop_1:
		mov		eax , dword ptr [ esi ];
		cmp		ebx , eax;
		je		loop_2;

//		movd	mm1 , [ esi ];
		movd	mm1 , eax;
		movd	mm2 , [ edi ];
		punpcklbw	mm1 , mm0;
		punpcklbw	mm2 , mm0;
		pmullw	mm1 , mm6;
		pmullw	mm2 , mm7;
		paddb	mm1 , mm2;
		movq	mm2 , mm1;
		movq	mm3 , mm1;
		psrlq	mm1 , 24;
		psrlq	mm2 , 16;
		psrlq	mm3 , 8;

		pand	mm1 , ENGINE_DRAW_LINE_ALPHA_QUALITY_COLOR_MASK1;
		pand	mm2 , ENGINE_DRAW_LINE_ALPHA_QUALITY_COLOR_MASK2;
		pand	mm3 , ENGINE_DRAW_LINE_ALPHA_QUALITY_COLOR_MASK3;

		por		mm1 , mm2;
		por		mm1 , mm3;
		movd	[ edi ] ,mm1;
		add		esi , 4;
		add		edi , 4;
		loop	loop_1;

		pop		edx;
		pop		ebx;
		pop		ecx;
		pop		esi;
		pop		edi;
		pop		ebp;
		ret;
loop_2:
		add		esi , 4;
		add		edi , 4;
		loop	loop_1;

		pop		edx;
		pop		ebx;
		pop		ecx;
		pop		esi;
		pop		edi;
		pop		ebp;
		ret;
		emms;
	}
}

NESASM void NesDrawLineAlphaAdd( PVOID pDestPointer ,DWORD dwDestOffset , PVOID pSrcPointer , DWORD dwSrcOffset , DWORD dwLenght )
{
	__asm
	{
		push	ebp;
		mov		ebp , esp;

⌨️ 快捷键说明

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