Microsoft (R) Macro Assembler Version 9.00.30729.01 06/23/11 13:09:02 c:\Winamp\libvp6\corelibs\cdxv\vpxblit\wx86\bcy00.asm Page 1 - 1 ;//========================================================================== ;// ;// THIS CODE AND INFORMATION IS PROVIDED "AS IS" WITHOUT WARRANTY OF ANY ;// KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE ;// IMPLIED WARRANTIES OF MERCHANTABILITY AND/OR FITNESS FOR A PARTICULAR ;// PURPOSE. ;// ;// Copyright (c) 1999 - 2001 On2 Technologies Inc. All Rights Reserved. ;// ;//-------------------------------------------------------------------------- ;/***********************************************\ ;??? bcy00.asm ; yv12 to yuy2 same blitter ;\***********************************************/ .586 .387 .MODEL flat, SYSCALL, os_dos .MMX 00000000 .CODE NAME x86bcy00 PUBLIC bcy00_MMX_ PUBLIC _bcy00_MMX INCLUDE wilk.ash C ;//========================================================================== C ;// C ;// THIS CODE AND INFORMATION IS PROVIDED "AS IS" WITHOUT WARRANTY OF ANY C ;// KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE C ;// IMPLIED WARRANTIES OF MERCHANTABILITY AND/OR FITNESS FOR A PARTICULAR C ;// PURPOSE. C ;// C ;// Copyright (c) 1999 - 2001 On2 Technologies Inc. All Rights Reserved. C ;// C ;//-------------------------------------------------------------------------- C C C ;/***********************************************\ C ; C ;\***********************************************/ C C ;; C ;; YUV buffer configuration structure C ;; C ;------------------------------------------------ 00000030 C YUV_BUFFER_CONFIG STRUC 00000000 00000000 C YWidth dd ? 00000004 00000000 C YHeight dd ? 00000008 00000000 C YStride dd ? C 0000000C 00000000 C UVWidth dd ? 00000010 00000000 C UVHeight dd ? 00000014 00000000 C UVStride dd ? C 00000018 00000000 C YBuffer dd ? 0000001C 00000000 C UBuffer dd ? 00000020 00000000 C VBuffer dd ? C 00000024 00000000 C uvStart dd ? 00000028 00000000 C uvDstArea dd ? 0000002C 00000000 C uvUsedArea dd ? C YUV_BUFFER_CONFIG ENDS C ;------------------------------------------------ C INCLUDE wblit.ash C ;//========================================================================== C ;// C ;// THIS CODE AND INFORMATION IS PROVIDED "AS IS" WITHOUT WARRANTY OF ANY C ;// KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE C ;// IMPLIED WARRANTIES OF MERCHANTABILITY AND/OR FITNESS FOR A PARTICULAR C ;// PURPOSE. C ;// C ;// Copyright (c) 1999 - 2001 On2 Technologies Inc. All Rights Reserved. C ;// C ;//-------------------------------------------------------------------------- C C C ;/***********************************************\ C ;??? wblit.ash C ; C ;\***********************************************/ C C ;------------------------------------------------ 00000028 C x86_Params STRUC 00000000 00000006 [ C dd 6 dup (?) ;6 pushed regs 00000000 ] 0DD0000C 00000000 C dd ? ;return address 0DD00010 00000000 C dst dd ? 0DD00014 00000000 C scrnPitch dd ? 0DD00018 00000000 C buffConfig dd ? C x86_Params ENDS C ;------------------------------------------------ C C EXTERNDEF _WK_YforY:DWORD C EXTERNDEF _WK_UforBG:DWORD C EXTERNDEF _WK_VforRG:DWORD C C EXTERNDEF _WK_YforY_MMX:DWORD C EXTERNDEF _WK_UforBG_MMX:DWORD C EXTERNDEF _WK_VforRG_MMX:DWORD C C EXTERNDEF _WK_ClampTableR:DWORD C EXTERNDEF _WK_ClampTableG:DWORD C EXTERNDEF _WK_ClampTableB:DWORD C C EXTERNDEF _WK_ClampTableR555:DWORD C EXTERNDEF _WK_ClampTableG555:DWORD C EXTERNDEF _WK_ClampTableB555:DWORD C C EXTERNDEF _WK_ClampTableR565:DWORD C EXTERNDEF _WK_ClampTableG565:DWORD C EXTERNDEF _WK_ClampTableB565:DWORD C = 00000600 C CLAMPCENTER EQU 256*4+128*4 C C C EXTERNDEF WK_johnsTable_MMX:DWORD C EXTERNDEF WK_johnsTable:DWORD C C EXTERNDEF WK_RGB_MULFACTOR_555:QWORD C EXTERNDEF WK_RB_MASK_555:QWORD C EXTERNDEF WK_G_MASK_555:QWORD C C EXTERNDEF WK_RGB_MULFACTOR_565:QWORD C EXTERNDEF WK_RB_MASK_565:QWORD C EXTERNDEF WK_G_MASK_565:QWORD C C EXTERNDEF WK_MASK_YY_MMX:DWORD C EXTERNDEF WK_MASK_BYTE0:DWORD C C ;------------------------------------------------ ; local vars 00000000 L_3s QWORD 0003000300030003h ; 4 3's 0003000300030003 00000008 L_2s QWORD 0002000200020002h ; 4 3's 0002000200020002 = 00000000 L_blkWidth EQU 0 = 00000004 L_YStride EQU L_blkWidth+4 = 00000008 L_Height EQU L_YStride+4 = 0000000C L_extraWidth EQU L_Height+4 = 00000010 L_tempspaceL EQU L_extraWidth+4 = 00000018 L_tempspaceH EQU L_tempspaceL+8 = 00000020 LOCAL_SPACE EQU L_tempspaceL+16 ;------------------------------------------------ ;void bcy00_MMX(unsigned long *dst, int scrnPitch, YUV_BUFFER_CONFIG *buffConfig); ; 00000010 bcy00_MMX_: 00000010 _bcy00_MMX: 00000010 56 push esi 00000011 57 push edi 00000012 55 push ebp 00000013 53 push ebx 00000014 51 push ecx 00000015 52 push edx 00000016 8B 7C 24 1C mov edi,[esp].dst ; edi = dst 0000001A 8B 6C 24 24 mov ebp,[esp].buffConfig ; ebp = buffConfig 0000001E 90 nop 0000001F 83 EC 20 sub esp,LOCAL_SPACE 00000022 8B 45 08 mov eax,[ebp].YStride ; eax = YStride 00000025 89 44 24 04 mov L_YStride[esp],eax ; save to local 00000029 8B 45 04 mov eax,[ebp].YHeight ; eax = Height 0000002C 48 dec eax ; 1 less than full height 0000002D 89 44 24 08 mov L_Height[esp], eax ; save to local 00000031 8B 4D 00 mov ecx,[ebp].YWidth ; ecx = YWidth ; mov eax, [esp+LOCAL_SPACE].scrnPitch 00000034 8B C1 mov eax, ecx ; eax = YWidth 00000036 C1 E9 03 shr ecx,3 ;blocks of 8 pixels 00000039 8B 75 18 mov esi,[ebp].YBuffer ; esi = YBuffer 0000003C 33 DB xor ebx,ebx ; ebx = 0 0000003E 89 0C 24 mov L_blkWidth[esp],ecx ; Save YWidth/8 to local 00000041 83 E0 07 and eax, 7 ; extraWidth 00000044 89 44 24 0C mov L_extraWidth[esp], eax ; save extraWidth; 00000048 8B C3 mov eax,ebx ; eax = 0; 0000004A 8B 55 20 mov edx,[ebp].VBuffer ; edx = YBuffer 0000004D 8B 6D 1C mov ebp,[ebp].UBuffer ; ebp = UBuffer 00000050 0F EF E4 pxor mm4,mm4 ; ; eax = 0 ; ebx = 0; ; ecx = YWidth/8 ; edx = VBuffer ; ebp = UBuffer ; esi = YBuffer ; edi = dst ; 00000053 hloop: 00000053 wloop: 00000053 0F 6F 3C 13 movq mm7,[edx+ebx] ; get 8 v's 00000057 0F 60 FC punpcklbw mm7,mm4 ; unpack v's with 0's 0000005A 0F D5 3D pmullw mm7,L_3s ; v's * 3 00000000 R 00000061 0F 6F 2C 10 movq mm5,[edx+eax] ; get 8 v's pointed to by eax 00000065 0F 7F EE movq mm6,mm5 ; copy to mm7 00000068 0F 60 F4 punpcklbw mm6,mm4 ; unpack v's with 0's 0000006B 0F FD FE paddw mm7,mm6 ; mm7 = 3 * [ebx] + 1 * [eax] 0000006E 0F FD 3D paddw mm7,L_2s ; mm7 = 3 * [ebx] + 1 * [eax] + 2 00000008 R 00000075 0F 71 D7 02 psrlw mm7,2 ; mm7 = ( 3 * [ebx] + 1 * [eax] + 2 ) / 4 00000079 0F 6F 1C 2B movq mm3,[ebp+ebx] ; get 8 u's into mm1 0000007D 0F 60 DC punpcklbw mm3,mm4 ; unpack u's with 0's 00000080 0F D5 1D pmullw mm3,L_3s ; u's * 3 00000000 R 00000087 0F 6F 2C 28 movq mm5,[ebp+eax] ; get 8 u's pointed to by eax 0000008B 0F 7F EE movq mm6,mm5 ; copy to mm3 0000008E 0F 60 F4 punpcklbw mm6,mm4 ; unpack u's with 0's 00000091 0F FD DE paddw mm3,mm6 ; mm3 = 3 * [ebx] + 1 * [eax] 00000094 0F FD 1D paddw mm3,L_2s ; mm3 = 3 * [ebx] + 1 * [eax] + 2 00000008 R 0000009B 0F 71 D3 02 psrlw mm3,2 ; mm3 = ( 3 * [ebx] + 1 * [eax] + 2 ) / 4 0000009F 0F 71 F7 08 psllw mm7,8 ; v3 0 v2 0 v1 0 v0 0 000000A3 0F EB DF por mm3,mm7 ; v3 u3 v2 u2 v1 u1 v0 u0 000000A6 0F 6F 04 5E movq mm0,[esi+ebx*2] ; get the y's 000000AA 0F 7F C1 movq mm1,mm0 ; save upper y's 000000AD 0F 60 C3 punpcklbw mm0,mm3 ; v1 y3 u1 y2 v0 y1 u0 y0 000000B0 0F 68 CB punpckhbw mm1,mm3 ; v3 y7 u3 y6 v2 y5 u2 y4 000000B3 49 dec ecx 000000B4 0F 7F 04 9F movq [edi+ebx*4],mm0 ;write first 4 pixels ;- 000000B8 0F 7F 4C 9F 08 movq 8[edi+ebx*4],mm1 ;write next 4 pixels ;- 000000BD 8D 40 04 lea eax,[eax+4] ;increment *1 pointer to next pixel 000000C0 8D 5B 04 lea ebx,[ebx+4] ;increment *3 pointer to next pixel 000000C3 7F 8E jg wloop ;------------------------------------------------------------ ; need to handle the line end condition when YWidth%8 !=0 ;------------------------------------------------------------ 000000C5 8B 4C 24 0C mov ecx, L_extraWidth[esp] ; extraWidth 000000C9 ewloop: 000000C9 49 dec ecx 000000CA 78 79 js phloop 000000CC 0F 6F 3C 13 movq mm7,[edx+ebx] ; get 8 v's 000000D0 0F 60 FC punpcklbw mm7,mm4 ; unpack v's with 0's 000000D3 0F D5 3D pmullw mm7,L_3s ; v's * 3 00000000 R 000000DA 0F 6F 2C 10 movq mm5,[edx+eax] ; get 8 v's pointed to by eax 000000DE 0F 7F EE movq mm6,mm5 ; copy to mm7 000000E1 0F 60 F4 punpcklbw mm6,mm4 ; unpack v's with 0's 000000E4 0F FD FE paddw mm7,mm6 ; mm7 = 3 * [ebx] + 1 * [eax] 000000E7 0F FD 3D paddw mm7,L_2s ; mm7 = 3 * [ebx] + 1 * [eax] + 2 00000008 R 000000EE 0F 71 D7 02 psrlw mm7,2 ; mm7 = ( 3 * [ebx] + 1 * [eax] + 2 ) / 4 000000F2 0F 6F 1C 2B movq mm3,[ebp+ebx] ; get 8 u's into mm1 000000F6 0F 60 DC punpcklbw mm3,mm4 ; unpack u's with 0's 000000F9 0F D5 1D pmullw mm3,L_3s ; u's * 3 00000000 R 00000100 0F 6F 2C 28 movq mm5,[ebp+eax] ; get 8 u's pointed to by eax 00000104 0F 7F EE movq mm6,mm5 ; copy to mm3 00000107 0F 60 F4 punpcklbw mm6,mm4 ; unpack u's with 0's 0000010A 0F FD DE paddw mm3,mm6 ; mm3 = 3 * [ebx] + 1 * [eax] 0000010D 0F FD 1D paddw mm3,L_2s ; mm3 = 3 * [ebx] + 1 * [eax] + 2 00000008 R 00000114 0F 71 D3 02 psrlw mm3,2 ; mm3 = ( 3 * [ebx] + 1 * [eax] + 2 ) / 4 00000118 0F 71 F7 08 psllw mm7,8 ; v3 0 v2 0 v1 0 v0 0 0000011C 0F EB DF por mm3,mm7 ; v3 u3 v2 u2 v1 u1 v0 u0 0000011F 0F 6F 04 5E movq mm0,[esi+ebx*2] ; get the y's 00000123 0F 7F C1 movq mm1,mm0 ; save upper y's 00000126 0F 60 C3 punpcklbw mm0,mm3 ; v1 y3 u1 y2 v0 y1 u0 y0 00000129 0F 68 CB punpckhbw mm1,mm3 ; v3 y7 u3 y6 v2 y5 u2 y4 0000012C 0F 7F 44 24 10 movq L_tempspaceL[esp],mm0 ;write first 4 pixels ;- 00000131 0F 7F 4C 24 18 movq L_tempspaceH[esp],mm1 ;write next 4 pixels ;- ;------------------------------------------------------------ ; uncomment the next two line of code will make the image ; output have a white last vertical line ;------------------------------------------------------------ ; mov eax, 0ff80ff80h ; mov L_tempspaceH[esp], eax; ; read two bytes ;------------------------------------------------------------ 00000136 8D 1C 9F lea ebx, [edi + ebx*4];get the destination pointer 00000139 cploop: 00000139 66| 8B 44 4C mov ax, L_tempspaceL[esp + ecx * 2]; ; read two bytes 10 0000013E 66| 89 04 4B mov [ebx+ecx*2], ax 00000142 49 dec ecx 00000143 7D F4 jge cploop 00000145 phloop: ;------------------------------------------------------------ ; prepare for the next line ;------------------------------------------------------------ 00000145 8B 4C 24 08 mov ecx,DWORD PTR L_Height[esp] ;get current line number 00000149 8B 5C 24 40 mov ebx,[esp+LOCAL_SPACE].scrnPitch 0000014D C1 E1 1F shl ecx,31 ; save low bit 00000150 03 FB add edi,ebx 00000152 C1 F9 1F sar ecx,31 ; even lines ecx = 00000000 odd lines it equals FFFFFFFF 00000155 8B 5C 24 04 mov ebx,L_YStride[esp] 00000159 D1 FB sar ebx,1 ; ebx is uv stride 0000015B 8B C3 mov eax,ebx ; eax is uv stride 0000015D 23 C1 and eax,ecx ; odd lines eax equals uvpitch even lines eax = 0 0000015F F7 D1 not ecx ; even lines ecx = ffffffff odd lines it equals 00000000 00000161 23 D9 and ebx,ecx ; ebx = uv pitch on even lines and 0 on odd lines 00000163 2B EB sub ebp,ebx ; increment u pointer if we're on an odd line 00000165 2B D3 sub edx,ebx ; increment v pointer if we're on an odd line 00000167 F7 D8 neg eax ; eax = -uvpitch on odd lines and 0 on even lines 00000169 03 C3 add eax,ebx ; eax = -uvpitch on odd lines and +uv pitch on even lines 0000016B 33 DB xor ebx,ebx ; ebx is used as column pointer so set it to 0 0000016D 8B 0C 24 mov ecx,L_blkWidth[esp] 00000170 2B 74 24 04 sub esi,DWORD PTR L_YStride[esp] 00000174 FF 4C 24 08 dec DWORD PTR L_Height[esp] 00000178 0F 8F FFFFFED5 jg hloop 0000017E 8B C3 mov eax,ebx ; last line ebx and eax should point to the same line 00000180 0F 84 FFFFFECD jz hloop ;------------------------------------------------ 00000186 theExit: 00000186 83 C4 20 add esp,LOCAL_SPACE 00000189 90 nop 0000018A 0F 77 emms 0000018C 5A pop edx 0000018D 59 pop ecx 0000018E 5B pop ebx 0000018F 5D pop ebp 00000190 5F pop edi 00000191 5E pop esi 00000192 C3 ret ;************************************************ END Microsoft (R) Macro Assembler Version 9.00.30729.01 06/23/11 13:09:02 c:\Winamp\libvp6\corelibs\cdxv\vpxblit\wx86\bcy00.asm Symbols 2 - 1 Structures and Unions: N a m e Size Offset Type YUV_BUFFER_CONFIG . . . . . . . 00000030 YWidth . . . . . . . . . . . . 00000000 DWord YHeight . . . . . . . . . . . 00000004 DWord YStride . . . . . . . . . . . 00000008 DWord UVWidth . . . . . . . . . . . 0000000C DWord UVHeight . . . . . . . . . . . 00000010 DWord UVStride . . . . . . . . . . . 00000014 DWord YBuffer . . . . . . . . . . . 00000018 DWord UBuffer . . . . . . . . . . . 0000001C DWord VBuffer . . . . . . . . . . . 00000020 DWord uvStart . . . . . . . . . . . 00000024 DWord uvDstArea . . . . . . . . . . 00000028 DWord uvUsedArea . . . . . . . . . . 0000002C DWord x86_Params . . . . . . . . . . . 00000028 dst . . . . . . . . . . . . . 0000001C DWord scrnPitch . . . . . . . . . . 00000020 DWord buffConfig . . . . . . . . . . 00000024 DWord Segments and Groups: N a m e Size Length Align Combine Class FLAT . . . . . . . . . . . . . . GROUP _DATA . . . . . . . . . . . . . 32 Bit 00000000 Para Public 'DATA' _TEXT . . . . . . . . . . . . . 32 Bit 00000193 Para Public 'CODE' Symbols: N a m e Type Value Attr @CodeSize . . . . . . . . . . . Number 00000000h @DataSize . . . . . . . . . . . Number 00000000h @Interface . . . . . . . . . . . Number 00000002h @Model . . . . . . . . . . . . . Number 00000007h @code . . . . . . . . . . . . . Text _TEXT @data . . . . . . . . . . . . . Text FLAT @fardata? . . . . . . . . . . . Text FLAT @fardata . . . . . . . . . . . . Text FLAT @stack . . . . . . . . . . . . . Text FLAT CLAMPCENTER . . . . . . . . . . Number 00000600h LOCAL_SPACE . . . . . . . . . . Number 00000020h L_2s . . . . . . . . . . . . . . QWord 00000008 _TEXT L_3s . . . . . . . . . . . . . . QWord 00000000 _TEXT L_Height . . . . . . . . . . . . Number 00000008h L_YStride . . . . . . . . . . . Number 00000004h L_blkWidth . . . . . . . . . . . Number 00000000h L_extraWidth . . . . . . . . . . Number 0000000Ch L_tempspaceH . . . . . . . . . . Number 00000018h L_tempspaceL . . . . . . . . . . Number 00000010h WK_G_MASK_555 . . . . . . . . . QWord 00000000 FLAT External SYSCALL WK_G_MASK_565 . . . . . . . . . QWord 00000000 FLAT External SYSCALL WK_MASK_BYTE0 . . . . . . . . . DWord 00000000 FLAT External SYSCALL WK_MASK_YY_MMX . . . . . . . . . DWord 00000000 FLAT External SYSCALL WK_RB_MASK_555 . . . . . . . . . QWord 00000000 FLAT External SYSCALL WK_RB_MASK_565 . . . . . . . . . QWord 00000000 FLAT External SYSCALL WK_RGB_MULFACTOR_555 . . . . . . QWord 00000000 FLAT External SYSCALL WK_RGB_MULFACTOR_565 . . . . . . QWord 00000000 FLAT External SYSCALL WK_johnsTable_MMX . . . . . . . DWord 00000000 FLAT External SYSCALL WK_johnsTable . . . . . . . . . DWord 00000000 FLAT External SYSCALL _WK_ClampTableB555 . . . . . . . DWord 00000000 FLAT External SYSCALL _WK_ClampTableB565 . . . . . . . DWord 00000000 FLAT External SYSCALL _WK_ClampTableB . . . . . . . . DWord 00000000 FLAT External SYSCALL _WK_ClampTableG555 . . . . . . . DWord 00000000 FLAT External SYSCALL _WK_ClampTableG565 . . . . . . . DWord 00000000 FLAT External SYSCALL _WK_ClampTableG . . . . . . . . DWord 00000000 FLAT External SYSCALL _WK_ClampTableR555 . . . . . . . DWord 00000000 FLAT External SYSCALL _WK_ClampTableR565 . . . . . . . DWord 00000000 FLAT External SYSCALL _WK_ClampTableR . . . . . . . . DWord 00000000 FLAT External SYSCALL _WK_UforBG_MMX . . . . . . . . . DWord 00000000 FLAT External SYSCALL _WK_UforBG . . . . . . . . . . . DWord 00000000 FLAT External SYSCALL _WK_VforRG_MMX . . . . . . . . . DWord 00000000 FLAT External SYSCALL _WK_VforRG . . . . . . . . . . . DWord 00000000 FLAT External SYSCALL _WK_YforY_MMX . . . . . . . . . DWord 00000000 FLAT External SYSCALL _WK_YforY . . . . . . . . . . . DWord 00000000 FLAT External SYSCALL _bcy00_MMX . . . . . . . . . . . L Near 00000010 _TEXT Public SYSCALL bcy00_MMX_ . . . . . . . . . . . L Near 00000010 _TEXT Public SYSCALL cploop . . . . . . . . . . . . . L Near 00000139 _TEXT ewloop . . . . . . . . . . . . . L Near 000000C9 _TEXT hloop . . . . . . . . . . . . . L Near 00000053 _TEXT phloop . . . . . . . . . . . . . L Near 00000145 _TEXT theExit . . . . . . . . . . . . L Near 00000186 _TEXT wloop . . . . . . . . . . . . . L Near 00000053 _TEXT 0 Warnings 0 Errors