📄 yuvrgb16.c
字号:
FastYUV2RGB16Bits1Line();
FastYUV2RGB16Bits1Line();
FastYUV2RGB16Bits1LineDeletePixel();//Delete one pixel
FastYUV2RGB16Bits1Line();
FastYUV2RGB16Bits1Line();
FastYUV2RGB16Bits1LineDeletePixel();//Delete one pixel
FastYUV2RGB16Bits1Line();
FastYUV2RGB16Bits1Line();
FastYUV2RGB16Bits1LineDeletePixel();//Delete one pixel
FastYUV2RGB16Bits1Line();
FastYUV2RGB16Bits1LineDeletePixel();//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 Draw640x240Banking64K(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
BuildYVURGB16Color(); //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); //Some handbook VGA system will change DX
_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 FastYUV2RGB16BitsDouble(void);
void FastYUV2RGB16BitsDoubleDeletePixel(void);
void FastYUV2RGB16BitsDouble1Line(void);
void FastYUV2RGB16BitsDouble1LineDeletePixel(void);//Delete one pixel
void FastYUV2RGB16BitsDouble1LineOnly(void);
void FastYUV2RGB16BitsDouble1LineOnlyDeletePixel(void);//Delete one pixel
static void Align2(void)
{
asm nop
}
void PASCAL near DecodeTwoLine64KDouble(void)
{
asm mov Pixels,8
LoopLine:
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 LoopLine
_EBP+=976;
}
static void Align3(void)
{
asm nop
asm nop
}
void PASCAL near DecodeOneLine64KDouble(void)
{
asm mov Pixels,8
LoopLine:
FastYUV2RGB16BitsDouble1LineOnly();
FastYUV2RGB16BitsDouble1LineOnly();
FastYUV2RGB16BitsDouble1LineOnlyDeletePixel();//Delete one pixel
FastYUV2RGB16BitsDouble1LineOnly();
FastYUV2RGB16BitsDouble1LineOnly();
FastYUV2RGB16BitsDouble1LineOnlyDeletePixel();//Delete one pixel
FastYUV2RGB16BitsDouble1LineOnly();
FastYUV2RGB16BitsDouble1LineOnly();
FastYUV2RGB16BitsDouble1LineOnlyDeletePixel();//Delete one pixel
FastYUV2RGB16BitsDouble1LineOnly();
FastYUV2RGB16BitsDouble1LineOnlyDeletePixel();//Delete one pixel
asm dec Pixels //asm loop LoopLine240
asm jnz LoopLine
_EBP+=976; //All Y, U, V Line len=0x480;
}
static void Align4(void)
{
asm nop
asm nop
}
void PASCAL near DecodeOneLine64KMixDouble(void)
{
asm mov Pixels,8
LoopLine:
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 loop LoopLine240
asm jnz LoopLine
_EBP+=976; //All Y, U, V Line len=0x480;
}
static void Align5(void)
{
asm nop
asm nop
}
void PASCAL near Draw40Pixel(void)
{
FastYUV2RGB16BitsDouble1LineOnly();
FastYUV2RGB16BitsDouble1LineOnly();
FastYUV2RGB16BitsDouble1LineOnlyDeletePixel();//Delete one pixel
FastYUV2RGB16BitsDouble1LineOnly();
FastYUV2RGB16BitsDouble1LineOnly();
FastYUV2RGB16BitsDouble1LineOnlyDeletePixel();//Delete one pixel
FastYUV2RGB16BitsDouble1LineOnly();
FastYUV2RGB16BitsDouble1LineOnly();
FastYUV2RGB16BitsDouble1LineOnlyDeletePixel();//Delete one pixel
FastYUV2RGB16BitsDouble1LineOnly();
FastYUV2RGB16BitsDouble1LineOnlyDeletePixel();//Delete one pixel
}
static void Align6(void)
{
asm nop
}
void PASCAL near Over64K1(void)
{
Draw40Pixel();
FastYUV2RGB16BitsDouble1LineOnly();
FastYUV2RGB16BitsDouble1LineOnly();
FastYUV2RGB16BitsDouble1LineOnly();
FastYUV2RGB16BitsDouble1LineOnly();
FastYUV2RGB16BitsDouble1LineOnly();
FastYUV2RGB16BitsDouble1LineOnly();
__emit__(0x66,0x33,0xFF);
_AX=0x4F05;_BX=0;_DX=BankSize;
geninterrupt(0x10); //Some handbook VGA system will change DX
FastYUV2RGB16BitsDouble1LineOnlyDeletePixel();//Delete one pixel
FastYUV2RGB16BitsDouble1LineOnlyDeletePixel();//Delete one pixel
FastYUV2RGB16BitsDouble1LineOnlyDeletePixel();//Delete one pixel
FastYUV2RGB16BitsDouble1LineOnly();
FastYUV2RGB16BitsDouble1LineOnlyDeletePixel();//Delete one pixel
asm mov Pixels,6
LoopLine:
Draw40Pixel();
asm dec Pixels //asm loop LoopLine240
asm jnz LoopLine
_EBP+=976; //All Y, U, V Line len=0x480;
}
static void Align7(void)
{
asm nop
asm nop
}
void PASCAL near Over64K2(void)
{
asm mov Pixels,3
LoopLine:
Draw40Pixel();
asm dec Pixels //asm loop LoopLine240
asm jnz LoopLine
FastYUV2RGB16BitsDouble1LineOnly();
FastYUV2RGB16BitsDouble1LineOnly();
__emit__(0x66,0x33,0xFF);
_AX=0x4F05;_BX=0;_DX=BankSize;
asm add dx,dx
geninterrupt(0x10); //Some handbook VGA system will change DX
FastYUV2RGB16BitsDouble1LineOnlyDeletePixel();//Delete one pixel
FastYUV2RGB16BitsDouble1LineOnly();
FastYUV2RGB16BitsDouble1LineOnly();
FastYUV2RGB16BitsDouble1LineOnlyDeletePixel();//Delete one pixel
FastYUV2RGB16BitsDouble1LineOnly();
FastYUV2RGB16BitsDouble1LineOnly();
FastYUV2RGB16BitsDouble1LineOnlyDeletePixel();//Delete one pixel
FastYUV2RGB16BitsDouble1LineOnly();
FastYUV2RGB16BitsDouble1LineOnlyDeletePixel();//Delete one pixel
asm mov Pixels,4
LoopLine1:
Draw40Pixel();
asm dec Pixels //asm loop LoopLine240
asm jnz LoopLine1
_EBP+=976; //All Y, U, V Line len=0x480;
}
static void Align8(void)
{
}
void PASCAL near Over64K3(void)
{
asm mov Pixels,4
LoopLine:
Draw40Pixel();
asm dec Pixels //asm loop LoopLine240
asm jnz LoopLine
FastYUV2RGB16BitsDouble1LineOnly();
FastYUV2RGB16BitsDouble1LineOnly();
FastYUV2RGB16BitsDouble1LineOnlyDeletePixel();//Delete one pixel
FastYUV2RGB16BitsDouble1LineOnly();
FastYUV2RGB16BitsDouble1LineOnlyDeletePixel();//Delete one pixel
FastYUV2RGB16BitsDouble1LineOnly();
FastYUV2RGB16BitsDouble1LineOnlyDeletePixel();//Delete one pixel
FastYUV2RGB16BitsDouble1LineOnly();
FastYUV2RGB16BitsDouble1LineOnlyDeletePixel();//Delete one pixel
__emit__(0x66,0x33,0xFF);
_AX=0x4F05;_BX=0;_DX=BankSize;
asm add dx,dx
asm add dx,BankSize
geninterrupt(0x10); //Some handbook VGA system will change DX
FastYUV2RGB16BitsDouble1LineOnly();
FastYUV2RGB16BitsDouble1LineOnly();
asm mov Pixels,3
LoopLine1:
Draw40Pixel();
asm dec Pixels //asm loop LoopLine240
asm jnz LoopLine1
_EBP+=976; //All Y, U, V Line len=0x480;
}
static void Align9(void)
{
}
void PASCAL near Over64K4(void)
{
asm mov Pixels,6
LoopLine:
Draw40Pixel();
asm dec Pixels //asm loop LoopLine240
asm jnz LoopLine
FastYUV2RGB16BitsDouble1LineOnly();
FastYUV2RGB16BitsDouble1LineOnly();
FastYUV2RGB16BitsDouble1LineOnly();
FastYUV2RGB16BitsDouble1LineOnly();
__emit__(0x66,0x33,0xFF);
_AX=0x4F05;_BX=0;_DX=BankSize;
asm shl dx,2
geninterrupt(0x10); //Some handbook VGA system will change DX
FastYUV2RGB16BitsDouble1LineOnlyDeletePixel();//Delete one pixel
FastYUV2RGB16BitsDouble1LineOnly();
FastYUV2RGB16BitsDouble1LineOnlyDeletePixel();//Delete one pixel
FastYUV2RGB16BitsDouble1LineOnly();
FastYUV2RGB16BitsDouble1LineOnlyDeletePixel();//Delete one pixel
FastYUV2RGB16BitsDouble1LineOnly();
FastYUV2RGB16BitsDouble1LineOnlyDeletePixel();//Delete one pixel
Draw40Pixel();
_EBP+=976; //All Y, U, V Line len=0x480;
}
void Decode5Lines(void)
{
DecodeTwoLine64KDouble();
__emit__(0x66,0x81,0xC6,0xA0,0x07,0x00,0x00);//_ESI+=(800+0x480);
__emit__(0x66,0x81,0xC7,0x00,0x05,0x00,0x00);//_EDI+=1280; //2 line had draw
DecodeTwoLine64KDouble();
__emit__(0x66,0x81,0xC6,0xA0,0x07,0x00,0x00);//_ESI+=(800+0x480);
__emit__(0x66,0x81,0xC7,0x00,0x05,0x00,0x00);//_EDI+=1280; //2 line had draw
DecodeOneLine64KMixDouble(); //Two lines mix to one line
__emit__(0x66,0x81,0xC6,0xA0,0x07,0x00,0x00);//_ESI+=(800+0x480);
}
static void Align10(void)
{
asm nop
asm nop
}
void First64KOver(void)
{//Draw 5 Line
DecodeOneLine64KDouble();
__emit__(0x66,0x81,0xC6,0x20,0x03,0x00,0x00);//_ESI+=800; //1 line had draw
_EBP-=0x480;
Over64K1();
__emit__(0x66,0x81,0xC6,0x20,0x03,0x00,0x00);//_ESI+=800; //1 line had draw
DecodeTwoLine64KDouble();
__emit__(0x66,0x81,0xC6,0xA0,0x07,0x00,0x00);//_ESI+=(800+0x480);
__emit__(0x66,0x81,0xC7,0x00,0x05,0x00,0x00);//_EDI+=1280; //2 line had draw
DecodeOneLine64KMixDouble(); //Two lines mix to one line
__emit__(0x66,0x81,0xC6,0xA0,0x07,0x00,0x00);//_ESI+=(800+0x480);
}
static void Align11(void)
{
}
void Second64KOver(void)
{//Draw 5 Line
DecodeTwoLine64KDouble();
__emit__(0x66,0x81,0xC6,0xA0,0x07,0x00,0x00);//_ESI+=(800+0x480);
__emit__(0x66,0x81,0xC7,0x00,0x05,0x00,0x00);//_EDI+=1280; //2 line had draw
Over64K2();
__emit__(0x66,0x81,0xC6,0x20,0x03,0x00,0x00);//_ESI+=800; //1 line had draw
_EBP-=0x480;
DecodeOneLine64KDouble();
__emit__(0x66,0x81,0xC6,0x20,0x03,0x00,0x00);//_ESI+=800; //1 line had draw
DecodeOneLine64KMixDouble(); //Two lines mix to one line
__emit__(0x66,0x81,0xC6,0xA0,0x07,0x00,0x00);//_ESI+=(800+0x480);
}
static void Align12(void)
{
}
void Third64KOver(void)
{//Draw 5 Line
DecodeTwoLine64KDouble();
__emit__(0x66,0x81,0xC6,0xA0,0x07,0x00,0x00);//_ESI+=(800+0x480);
__emit__(0x66,0x81,0xC7,0x00,0x05,0x00,0x00);//_EDI+=1280; //2 line had draw
DecodeOneLine64KDouble();
__emit__(0x66,0x81,0xC6,0x20,0x03,0x00,0x00);//_ESI+=800; //1 line had draw
_EBP-=0x480;
Over64K3();
__emit__(0x66,0x81,0xC6,0x20,0x03,0x00,0x00);//_ESI+=800; //1 line had draw
DecodeOneLine64KMixDouble(); //Two lines mix to one line
__emit__(0x66,0x81,0xC6,0xA0,0x07,0x00,0x00);//_ESI+=(800+0x480);
}
static void Align13(void)
{
}
void PASCAL near Over64K4Mix(void)
{
asm mov Pixels,6
LoopLine:
Draw40Pixel();
asm dec Pixels //asm loop LoopLine240
asm jnz LoopLine
FastYUV2RGB16BitsDouble1Line();
FastYUV2RGB16BitsDouble1Line();
FastYUV2RGB16BitsDouble1Line();
FastYUV2RGB16BitsDouble1Line();
__emit__(0x66,0x33,0xFF);
_AX=0x4F05;_BX=0;_DX=BankSize;
asm shl dx,2
geninterrupt(0x10); //Some handbook VGA system will change DX
FastYUV2RGB16BitsDouble1LineDeletePixel();//Delete one pixel
FastYUV2RGB16BitsDouble1Line();
FastYUV2RGB16BitsDouble1LineDeletePixel();//Delete one pixel
FastYUV2RGB16BitsDouble1Line();
FastYUV2RGB16BitsDouble1LineDeletePixel();//Delete one pixel
FastYUV2RGB16BitsDouble1Line();
FastYUV2RGB16BitsDouble1LineDeletePixel();//Delete one pixel
Draw40Pixel();
_EBP+=976; //All Y, U, V Line len=0x480;
}
void Fouth64KOver(void)
{//Draw 5 Line
DecodeTwoLine64KDouble();
__emit__(0x66,0x81,0xC6,0xA0,0x07,0x00,0x00);//_ESI+=(800+0x480);
__emit__(0x66,0x81,0xC7,0x00,0x05,0x00,0x00);//_EDI+=1280; //2 line had draw
DecodeTwoLine64KDouble();
__emit__(0x66,0x81,0xC6,0xA0,0x07,0x00,0x00);//_ESI+=(800+0x480);
__emit__(0x66,0x81,0xC7,0x00,0x05,0x00,0x00);//_EDI+=1280; //2 line had draw
Over64K4Mix();
__emit__(0x66,0x81,0xC6,0x20,0x03,0x00,0x00);//_ESI+=(800);
}
DWORD lStride; //Video Memory Line width.
static void Align14(void)
{
asm nop
asm nop
}
void PASCAL near Draw640x240Banking64K(void)
{ //Only for VESA 640x480 -> 640x240 banking VGA
_AX=0x4F05;
_BX=0;_DX=0;
geninterrupt(0x10); //Some handbook VGA system will change DX
asm mov es,OffScrSel;
asm xor di,di
Counter=0;
if(DeleteLine==5)
{
/////////////352x240/////////////
_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;
////// First 50 Lines /////////
Line=25;
MoveVideoData2401:
DecodeTwoLine64KDouble();
_ESI+=(800+0x480);_EDI+=1280; //2 line had draw
asm dec Line
asm jnz near ptr MoveVideoData2401
/////// Next Line ///////
DecodeOneLine64KDouble();_ESI+=800; //1 line had draw
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -