📄 yuvrgb16.c
字号:
_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 + -