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

📄 yuvrgb16.c

📁 超级解霸源代码。纯c语言写的。适合有一定编程基础的开发人员用来学习提高
💻 C
📖 第 1 页 / 共 5 页
字号:
		_EBP-=0x480;
		Over64K1(); _ESI+=800;// Full 64K
		////// 2nd 50 Lines /////////
		Line=25;
		MoveVideoData2402:
			DecodeTwoLine64KDouble();
			_ESI+=(800+0x480);_EDI+=1280;	//2 line had draw
			asm	dec	Line
			asm	jnz	near ptr MoveVideoData2402
		/////// Next Line ///////
		Over64K2();_ESI+=800;// Full 64K
		_EBP-=0x480;
		DecodeOneLine64KDouble();_ESI+=800;
		////// 3rd 48 Lines /////////
		Line=24;
		MoveVideoData2403:
			DecodeTwoLine64KDouble();
			_ESI+=(800+0x480);_EDI+=1280;	//2 line had draw
			asm	dec	Line
			asm	jnz	near ptr MoveVideoData2403
		/////// Next Line ///////
		DecodeOneLine64KDouble();_ESI+=800;
		_EBP-=0x480;
		Over64K3();	_ESI+=800;// Full 64K
		////// 4th 50 Lines /////////
		Line=25;
		MoveVideoData2404:
			DecodeTwoLine64KDouble();
			_ESI+=(800+0x480);_EDI+=1280;	//2 line had draw
			asm	dec	Line
			asm	jnz	near ptr MoveVideoData2404
		/////// Next Line ///////
		Over64K4();_ESI+=800;// Full 64K
		_EBP-=0x480;
		DecodeOneLine64KDouble();_ESI+=800;
		////// First 34 Lines /////////
		Line=17;
		MoveVideoData240:
			DecodeTwoLine64KDouble();
			_ESI+=(800+0x480);_EDI+=1280;	//2 line had draw
			asm	dec	Line
			asm	jnz	near ptr MoveVideoData240
		}
	else	{// 288 - > 240 6/5 delete 1 lines.
		/////////////352x288/////////
		_DX=A000Buffer;
		__emit__(0x26,0x66,0x8B,0x75,0x04);//asm mov esi,es:[di+4]
		__emit__(0x26,0x66,0x8B,0x6D,0x08);//asm mov ebp,es:[di+8]
		__emit__(0x26,0x8E,0x6D,0x10);//asm	mov	gs,es:[di+0x10]	//GS-> Video data
		asm	mov	es,dx
		_EDI=0;
		Line=10;
		Draw50Lines288:
			Decode5Lines();
			asm	dec	Line
			asm	jnz	near ptr Draw50Lines288
		First64KOver();	//First 64K
		Line=9;
		Draw45Lines2881:
			Decode5Lines();
			asm	dec	Line
			asm	jnz	near ptr Draw45Lines2881
		Second64KOver();	//2nd 64K
		Line=9;
		Draw45Lines2882:
			Decode5Lines();
			asm	dec	Line
			asm	jnz	near ptr Draw45Lines2882
		Third64KOver();
		Line=9;
		Draw45Lines2883:
			Decode5Lines();
			asm	dec	Line
			asm	jnz	near ptr Draw45Lines2883
		Fouth64KOver();
		Line=7;
		Draw35Lines288:
			Decode5Lines();
			asm	dec	Line
			asm	jnz	near ptr Draw35Lines288
		}
	_AX=0;	//return 0;
}
////////////////// 640x240 Linear mode /////////////
static	void	Align15(void)
{
	asm	nop
}
void	PASCAL near BuildYVURGB16DoubleColor(void)
{	//for 320x240 64K Color in memory
	asm	mov	es,OffScrSel;
	asm	xor	di,di
	Counter=0;
	if(DeleteLine==5)
		{
		/////////////352x240/////////////
		_DX=LinearSelSurface;
		__emit__(0x26,0x66,0x8B,0x75,0x04);//asm mov esi,es:[di+4]
		__emit__(0x26,0x66,0x8B,0x6D,0x08);//asm mov ebp,es:[di+8]
		__emit__(0x26,0x8E,0x6D,0x10);//asm	mov	gs,es:[di+0x10]	//GS-> Video data
		asm	mov	es,dx
		_EDI=LinearOffSurface;
		Line=120;
		MoveVideoData240:
		////// 352 bytes 32 times.
		Pixels=8;
		LoopLine240:
		FastYUV2RGB16BitsDouble();
		FastYUV2RGB16BitsDouble();
		FastYUV2RGB16BitsDoubleDeletePixel();//Delete one pixel
		FastYUV2RGB16BitsDouble();
		FastYUV2RGB16BitsDouble();
		FastYUV2RGB16BitsDoubleDeletePixel();//Delete one pixel
		FastYUV2RGB16BitsDouble();
		FastYUV2RGB16BitsDouble();
		FastYUV2RGB16BitsDoubleDeletePixel();//Delete one pixel
		FastYUV2RGB16BitsDouble();
		FastYUV2RGB16BitsDoubleDeletePixel();//Delete one pixel
		asm	dec	Pixels		//asm	loop	LoopLine240
		asm	jnz	LoopLine240
		_EBP+=976;
		_ESI+=(800+0x480);	//2 line had draw
		_EDI+=lStride;
		_EDI+=1280;	//640*2
		_EDI+=lStride;
		asm	dec	Line
		asm	jnz	near ptr MoveVideoData240
		}
	else	{// 288 - > 240 6/5 delete 1 lines.
		/////////////352x288/////////
		_DX=LinearSelSurface;
		__emit__(0x26,0x66,0x8B,0x75,0x04);//asm mov esi,es:[di+4]
		__emit__(0x26,0x66,0x8B,0x6D,0x08);//asm mov ebp,es:[di+8]
		__emit__(0x26,0x8E,0x6D,0x10);//asm	mov	gs,es:[di+0x10]	//GS-> Video data
		asm	mov	es,dx
		_EDI=LinearOffSurface;
		Line=144;//=288/2
		MoveVideoData288:
		asm	inc	Counter
		asm	cmp	Counter,3
		asm	je	DeleteLine288
		////// 352 bytes 32 times.
		Pixels=8;	//Draw 2 lines
		LoopLine288Delete:
		FastYUV2RGB16BitsDouble();
		FastYUV2RGB16BitsDouble();
		FastYUV2RGB16BitsDoubleDeletePixel();//Delete one pixel
		FastYUV2RGB16BitsDouble();
		FastYUV2RGB16BitsDouble();
		FastYUV2RGB16BitsDoubleDeletePixel();//Delete one pixel
		FastYUV2RGB16BitsDouble();
		FastYUV2RGB16BitsDouble();
		FastYUV2RGB16BitsDoubleDeletePixel();//Delete one pixel
		FastYUV2RGB16BitsDouble();
		FastYUV2RGB16BitsDoubleDeletePixel();//Delete one pixel
		asm	dec	Pixels
		asm	jnz	LoopLine288Delete
		_EBP+=976;
		_ESI+=(800+0x480);	//2 line had draw
		_EDI+=lStride;
		_EDI+=1280;	//2 line had draw
		_EDI+=lStride;
		asm	dec	Line
		asm	jnz	near ptr MoveVideoData288
		goto	RETURN;
		DeleteLine288://Draw 1 lines
		Counter=0;
		Pixels=8;
		LoopLine288:
		FastYUV2RGB16BitsDouble1Line();
		FastYUV2RGB16BitsDouble1Line();
		FastYUV2RGB16BitsDouble1LineDeletePixel();//Delete one pixel
		FastYUV2RGB16BitsDouble1Line();
		FastYUV2RGB16BitsDouble1Line();
		FastYUV2RGB16BitsDouble1LineDeletePixel();//Delete one pixel
		FastYUV2RGB16BitsDouble1Line();
		FastYUV2RGB16BitsDouble1Line();
		FastYUV2RGB16BitsDouble1LineDeletePixel();//Delete one pixel
		FastYUV2RGB16BitsDouble1Line();
		FastYUV2RGB16BitsDouble1LineDeletePixel();//Delete one pixel
		asm	dec	Pixels
		asm	jnz	LoopLine288
		_EBP+=976;
		_ESI+=(800+0x480);	//2 line had draw only one
		_EDI+=lStride;
		asm	dec	Line
		asm	jz	RETURN
		asm	jmp	MoveVideoData288
		}
	RETURN:
	_AX=0;	//return 0;
}
static	void	Align16(void)
{
}
void	PASCAL near Draw640x240Banking64KLinear(void)
{	//Only for VESA 640x480 -> 640x240 Linear VGA Primary DCI
//	LPDCIOFFSCREEN	DCISurfaceScreenPtr;
	DCIRVAL	(CALLBACK *EndAccess)(LPVOID);		//EndAccess Fn

//	DCISurfaceScreenPtr=&DCISurfaceScreen;
	EndAccess=DCISurfaceScreen.dciInfo.EndAccess;
	if(DCISurfaceScreen.dciInfo.BeginAccess!=NULL)
		(*DCISurfaceScreen.dciInfo.BeginAccess)(DCISurfaceScreenPtr,&VideoRc);
	//Build in memory 320x240 16Bits video data
	asm	push	bp
	BuildYVURGB16DoubleColor();	//Linear = Buffer for 320x240 16bits.
	asm	pop	bp
	//Write video linear buffer
	if(EndAccess!=NULL)
		(*EndAccess)(DCISurfaceScreenPtr);
}
//////////////////// 640x480 32K /////////////////
/*************************************************\
void	PASCAL near BuildYVURGB15Color(void)
{	//for 320x240 64K Color in memory
	asm	mov	es,OffScrSel;
	asm	xor	di,di
	Counter=0;
	if(DeleteLine==5)
		{
		/////////////352x240/////////////
		_DX=Linear;
		__emit__(0x26,0x66,0x8B,0x75,0x04);//asm mov esi,es:[di+4]
		__emit__(0x26,0x66,0x8B,0x6D,0x08);//asm mov ebp,es:[di+8]
		__emit__(0x26,0x8E,0x6D,0x10);//asm	mov	gs,es:[di+0x10]	//GS-> Video data
		asm	mov	es,dx
		_EDI=0;
		Line=120;
		MoveVideoData240:
		////// 352 bytes 32 times.
		Pixels=8;
		LoopLine240:
		FastYUV2RGB15Bits();
		FastYUV2RGB15Bits();
		FastYUV2RGB15BitsDeletePixel();//Delete one pixel
		FastYUV2RGB15Bits();
		FastYUV2RGB15Bits();
		FastYUV2RGB15BitsDeletePixel();//Delete one pixel
		FastYUV2RGB15Bits();
		FastYUV2RGB15Bits();
		FastYUV2RGB15BitsDeletePixel();//Delete one pixel
		FastYUV2RGB15Bits();
		FastYUV2RGB15BitsDeletePixel();//Delete one pixel
		asm	dec	Pixels		//asm	loop	LoopLine240
		asm	jnz	LoopLine240
		_EBP+=976;
		_ESI+=(800+0x480);	//2 line had draw
		_EDI+=640;
		asm	dec	Line
		asm	jnz	near ptr MoveVideoData240
		}
	else	{// 288 - > 240 6/5 delete 1 lines.
		/////////////352x288/////////
		_DX=Linear;
		__emit__(0x26,0x66,0x8B,0x75,0x04);//asm mov esi,es:[di+4]
		__emit__(0x26,0x66,0x8B,0x6D,0x08);//asm mov ebp,es:[di+8]
		__emit__(0x26,0x8E,0x6D,0x10);//asm	mov	gs,es:[di+0x10]	//GS-> Video data
		asm	mov	es,dx
		_EDI=0;
		Line=144;//=288/2
		MoveVideoData288:
		asm	inc	Counter
		asm	cmp	Counter,3
		asm	je	DeleteLine288
		////// 352 bytes 32 times.
		Pixels=8;	//Draw 2 lines
		LoopLine288Delete:
		FastYUV2RGB15Bits();
		FastYUV2RGB15Bits();
		FastYUV2RGB15BitsDeletePixel();//Delete one pixel
		FastYUV2RGB15Bits();
		FastYUV2RGB15Bits();
		FastYUV2RGB15BitsDeletePixel();//Delete one pixel
		FastYUV2RGB15Bits();
		FastYUV2RGB15Bits();
		FastYUV2RGB15BitsDeletePixel();//Delete one pixel
		FastYUV2RGB15Bits();
		FastYUV2RGB15BitsDeletePixel();//Delete one pixel
		asm	dec	Pixels
		asm	jnz	LoopLine288Delete
		_EBP+=976;
		_ESI+=(800+0x480);	//2 line had draw
		_EDI+=640;	//2 line had draw
		asm	dec	Line
		asm	jnz	near ptr MoveVideoData288
		goto	RETURN;
		DeleteLine288://Draw 1 lines
		Counter=0;
		Pixels=8;
		LoopLine288:
		FastYUV2RGB15Bits1Line();
		FastYUV2RGB15Bits1Line();
		FastYUV2RGB15Bits1LineDeletePixel();//Delete one pixel
		FastYUV2RGB15Bits1Line();
		FastYUV2RGB15Bits1Line();
		FastYUV2RGB15Bits1LineDeletePixel();//Delete one pixel
		FastYUV2RGB15Bits1Line();
		FastYUV2RGB15Bits1Line();
		FastYUV2RGB15Bits1LineDeletePixel();//Delete one pixel
		FastYUV2RGB15Bits1Line();
		FastYUV2RGB15Bits1LineDeletePixel();//Delete one pixel
		asm	dec	Pixels
		asm	jnz	LoopLine288
		_EBP+=976;
		_ESI+=(800+0x480);	//2 line had draw only one
		asm	dec	Line
		asm	jz	RETURN
		asm	jmp	MoveVideoData288
		}
	RETURN:
	_AX=0;	//return 0;
}
void	PASCAL near Draw640x240Banking32K(void)
{	//Only for VESA 640x480 -> 640x240 banking VGA
	int	BankCnt=4;
	int	BankingSize=BankSize;
	int	Banking=0;	//Select Bank 0
	//Build in memory 320x240 16Bits video data
	asm	push	bp
	BuildYVURGB15Color();	//Linear = Buffer for 320x240 16bits.
	asm	pop	bp
	//Set Bank and draw 64K data
	_ESI=0;
	_ES=A000Buffer;
	_DS=Linear;	//Video shadow buffer
	DrawPicture:
		_AX=0x4F05;
		_BX=0;
		_DX=Banking;
		geninterrupt(0x10);
		_DI=0;
		asm	mov	cx,16384
		Draw64KMemory:
		__emit__(0x67,0xAD);		//asm	lodsw	//32Bit address
		asm	mov 	dx,ax
		__emit__(0x66,0xC1,0xE0,0x10);	//asm	shl	eax,16
		asm	mov	ax,dx
		__emit__(0x66,0xAB);		//asm	stosd
		asm	dec	cx//asm	loop	Draw64KMemory
		asm	jnz	Draw64KMemory
	asm	mov	dx,BankingSize
	asm	add	Banking,dx
	asm	dec	BankCnt
	asm	jne	DrawPicture
	//Select Bank 5
	_AX=0x4F05;
	_BX=0;
	_DX=Banking;
	geninterrupt(0x10);
	_DI=0;
	asm	mov	cx,11264	//lept data.
	Draw64KMemoryLess:
	__emit__(0x67,0xAD);		//asm	lodsw	//32Bit address
	asm	mov 	dx,ax
	__emit__(0x66,0xC1,0xE0,0x10);	//asm	shl	eax,16
	asm	mov	ax,dx
	__emit__(0x66,0xAB);		//asm	stosd
	asm	dec	cx//asm	loop	Draw64KMemoryLess
	asm	jnz	Draw64KMemoryLess
}
\********************************************/
////////////////// 640x240 Banking mode /////////////
void	FastYUV2RGB15BitsDouble(void);
void	FastYUV2RGB15BitsDoubleDeletePixel(void);
void	FastYUV2RGB15BitsDouble1Line(void);
void	FastYUV2RGB15BitsDouble1LineDeletePixel(void);//Delete one pixel
void	FastYUV2RGB15BitsDouble1LineOnly(void);
void	FastYUV2RGB15BitsDouble1LineOnlyDeletePixel(void);//Delete one pixel
static	void	Align17(void)
{
	asm	nop
	asm	nop
}
void	PASCAL	near	DecodeTwoLine32KDouble(void)
{
	asm	mov	Pixels,8
	LoopLine:
	FastYUV2RGB15BitsDouble();
	FastYUV2RGB15BitsDouble();
	FastYUV2RGB15BitsDoubleDeletePixel();//Delete one pixel
	FastYUV2RGB15BitsDouble();
	FastYUV2RGB15BitsDouble();
	FastYUV2RGB15BitsDoubleDeletePixel();//Delete one pixel
	FastYUV2RGB15BitsDouble();
	FastYUV2RGB15BitsDouble();
	FastYUV2RGB15BitsDoubleDeletePixel();//Delete one pixel
	FastYUV2RGB15BitsDouble();
	FastYUV2RGB15BitsDoubleDeletePixel();//Delete one pixel
	asm	dec	Pixels		//asm	loop	LoopLine240
	asm	jnz	LoopLine
	_EBP+=976;
}
static	void	Align18(void)
{
	asm	nop
	asm	nop
}
void	PASCAL	near	DecodeOneLine32KDouble(void)
{
	asm	mov	Pixels,8
	LoopLine:
	FastYUV2RGB15BitsDouble1LineOnly();
	FastYUV2RGB15BitsDouble1LineOnly();
	FastYUV2RGB15BitsDouble1LineOnlyDeletePixel();//Delete one pixel
	FastYUV2RGB15BitsDouble1LineOnly();
	FastYUV2RGB15BitsDouble1LineOnly();
	FastYUV2RGB15BitsDouble1LineOnlyDeletePixel();//Delete one pixel
	FastYUV2RGB15BitsDouble1LineOnly();
	FastYUV2RGB15BitsDouble1LineOnly();
	FastYUV2RGB15BitsDouble1LineOnlyDeletePixel();//Delete one pixel
	FastYUV2RGB15BitsDouble1LineOnly();
	FastYUV2RGB15BitsDouble1LineOnlyDeletePixel();//Delete one pixel
	asm	dec	Pixels		//asm	loop	LoopLine240
	asm	jnz	LoopLine
	_EBP+=976;		//All Y, U, V Line len=0x480;
}
static	void	Align19(void)
{
	asm	nop
	asm	nop
}
void	PASCAL	near	DecodeOneLine32KMixDouble(void)

⌨️ 快捷键说明

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