146be48730333120a7b939116cef075e61c12c703David 'Digit' Turner; 246be48730333120a7b939116cef075e61c12c703David 'Digit' Turner; x86 format converters for HERMES 346be48730333120a7b939116cef075e61c12c703David 'Digit' Turner; Some routines Copyright (c) 1998 Christian Nentwich (brn@eleet.mcb.at) 446be48730333120a7b939116cef075e61c12c703David 'Digit' Turner; This source code is licensed under the GNU LGPL 546be48730333120a7b939116cef075e61c12c703David 'Digit' Turner; 646be48730333120a7b939116cef075e61c12c703David 'Digit' Turner; Please refer to the file COPYING.LIB contained in the distribution for 746be48730333120a7b939116cef075e61c12c703David 'Digit' Turner; licensing conditions 846be48730333120a7b939116cef075e61c12c703David 'Digit' Turner; 946be48730333120a7b939116cef075e61c12c703David 'Digit' Turner; Most routines are (c) Glenn Fiedler (ptc@gaffer.org), used with permission 1046be48730333120a7b939116cef075e61c12c703David 'Digit' Turner; 1146be48730333120a7b939116cef075e61c12c703David 'Digit' Turner 1246be48730333120a7b939116cef075e61c12c703David 'Digit' TurnerBITS 32 1346be48730333120a7b939116cef075e61c12c703David 'Digit' Turner 1446be48730333120a7b939116cef075e61c12c703David 'Digit' Turner%include "common.inc" 1546be48730333120a7b939116cef075e61c12c703David 'Digit' Turner 1646be48730333120a7b939116cef075e61c12c703David 'Digit' TurnerSDL_FUNC _ConvertX86p32_32BGR888 1746be48730333120a7b939116cef075e61c12c703David 'Digit' TurnerSDL_FUNC _ConvertX86p32_32RGBA888 1846be48730333120a7b939116cef075e61c12c703David 'Digit' TurnerSDL_FUNC _ConvertX86p32_32BGRA888 1946be48730333120a7b939116cef075e61c12c703David 'Digit' TurnerSDL_FUNC _ConvertX86p32_24RGB888 2046be48730333120a7b939116cef075e61c12c703David 'Digit' TurnerSDL_FUNC _ConvertX86p32_24BGR888 2146be48730333120a7b939116cef075e61c12c703David 'Digit' TurnerSDL_FUNC _ConvertX86p32_16RGB565 2246be48730333120a7b939116cef075e61c12c703David 'Digit' TurnerSDL_FUNC _ConvertX86p32_16BGR565 2346be48730333120a7b939116cef075e61c12c703David 'Digit' TurnerSDL_FUNC _ConvertX86p32_16RGB555 2446be48730333120a7b939116cef075e61c12c703David 'Digit' TurnerSDL_FUNC _ConvertX86p32_16BGR555 2546be48730333120a7b939116cef075e61c12c703David 'Digit' TurnerSDL_FUNC _ConvertX86p32_8RGB332 2646be48730333120a7b939116cef075e61c12c703David 'Digit' Turner 2746be48730333120a7b939116cef075e61c12c703David 'Digit' TurnerSECTION .text 2846be48730333120a7b939116cef075e61c12c703David 'Digit' Turner 2946be48730333120a7b939116cef075e61c12c703David 'Digit' Turner;; _Convert_* 3046be48730333120a7b939116cef075e61c12c703David 'Digit' Turner;; Paramters: 3146be48730333120a7b939116cef075e61c12c703David 'Digit' Turner;; ESI = source 3246be48730333120a7b939116cef075e61c12c703David 'Digit' Turner;; EDI = dest 3346be48730333120a7b939116cef075e61c12c703David 'Digit' Turner;; ECX = amount (NOT 0!!! (the _ConvertX86 routine checks for that though)) 3446be48730333120a7b939116cef075e61c12c703David 'Digit' Turner;; Destroys: 3546be48730333120a7b939116cef075e61c12c703David 'Digit' Turner;; EAX, EBX, EDX 3646be48730333120a7b939116cef075e61c12c703David 'Digit' Turner 3746be48730333120a7b939116cef075e61c12c703David 'Digit' Turner 3846be48730333120a7b939116cef075e61c12c703David 'Digit' Turner_ConvertX86p32_32BGR888: 3946be48730333120a7b939116cef075e61c12c703David 'Digit' Turner 4046be48730333120a7b939116cef075e61c12c703David 'Digit' Turner ; check short 4146be48730333120a7b939116cef075e61c12c703David 'Digit' Turner cmp ecx,BYTE 32 4246be48730333120a7b939116cef075e61c12c703David 'Digit' Turner ja .L3 4346be48730333120a7b939116cef075e61c12c703David 'Digit' Turner 4446be48730333120a7b939116cef075e61c12c703David 'Digit' Turner.L1 ; short loop 4546be48730333120a7b939116cef075e61c12c703David 'Digit' Turner mov edx,[esi] 4646be48730333120a7b939116cef075e61c12c703David 'Digit' Turner bswap edx 4746be48730333120a7b939116cef075e61c12c703David 'Digit' Turner ror edx,8 4846be48730333120a7b939116cef075e61c12c703David 'Digit' Turner mov [edi],edx 4946be48730333120a7b939116cef075e61c12c703David 'Digit' Turner add esi,BYTE 4 5046be48730333120a7b939116cef075e61c12c703David 'Digit' Turner add edi,BYTE 4 5146be48730333120a7b939116cef075e61c12c703David 'Digit' Turner dec ecx 5246be48730333120a7b939116cef075e61c12c703David 'Digit' Turner jnz .L1 5346be48730333120a7b939116cef075e61c12c703David 'Digit' Turner.L2 5446be48730333120a7b939116cef075e61c12c703David 'Digit' Turner retn 5546be48730333120a7b939116cef075e61c12c703David 'Digit' Turner 5646be48730333120a7b939116cef075e61c12c703David 'Digit' Turner.L3 ; save ebp 5746be48730333120a7b939116cef075e61c12c703David 'Digit' Turner push ebp 5846be48730333120a7b939116cef075e61c12c703David 'Digit' Turner 5946be48730333120a7b939116cef075e61c12c703David 'Digit' Turner ; unroll four times 6046be48730333120a7b939116cef075e61c12c703David 'Digit' Turner mov ebp,ecx 6146be48730333120a7b939116cef075e61c12c703David 'Digit' Turner shr ebp,2 6246be48730333120a7b939116cef075e61c12c703David 'Digit' Turner 6346be48730333120a7b939116cef075e61c12c703David 'Digit' Turner ; save count 6446be48730333120a7b939116cef075e61c12c703David 'Digit' Turner push ecx 6546be48730333120a7b939116cef075e61c12c703David 'Digit' Turner 6646be48730333120a7b939116cef075e61c12c703David 'Digit' Turner.L4 mov eax,[esi] 6746be48730333120a7b939116cef075e61c12c703David 'Digit' Turner mov ebx,[esi+4] 6846be48730333120a7b939116cef075e61c12c703David 'Digit' Turner 6946be48730333120a7b939116cef075e61c12c703David 'Digit' Turner bswap eax 7046be48730333120a7b939116cef075e61c12c703David 'Digit' Turner 7146be48730333120a7b939116cef075e61c12c703David 'Digit' Turner bswap ebx 7246be48730333120a7b939116cef075e61c12c703David 'Digit' Turner 7346be48730333120a7b939116cef075e61c12c703David 'Digit' Turner ror eax,8 7446be48730333120a7b939116cef075e61c12c703David 'Digit' Turner mov ecx,[esi+8] 7546be48730333120a7b939116cef075e61c12c703David 'Digit' Turner 7646be48730333120a7b939116cef075e61c12c703David 'Digit' Turner ror ebx,8 7746be48730333120a7b939116cef075e61c12c703David 'Digit' Turner mov edx,[esi+12] 7846be48730333120a7b939116cef075e61c12c703David 'Digit' Turner 7946be48730333120a7b939116cef075e61c12c703David 'Digit' Turner bswap ecx 8046be48730333120a7b939116cef075e61c12c703David 'Digit' Turner 8146be48730333120a7b939116cef075e61c12c703David 'Digit' Turner bswap edx 8246be48730333120a7b939116cef075e61c12c703David 'Digit' Turner 8346be48730333120a7b939116cef075e61c12c703David 'Digit' Turner ror ecx,8 8446be48730333120a7b939116cef075e61c12c703David 'Digit' Turner mov [edi+0],eax 8546be48730333120a7b939116cef075e61c12c703David 'Digit' Turner 8646be48730333120a7b939116cef075e61c12c703David 'Digit' Turner ror edx,8 8746be48730333120a7b939116cef075e61c12c703David 'Digit' Turner mov [edi+4],ebx 8846be48730333120a7b939116cef075e61c12c703David 'Digit' Turner 8946be48730333120a7b939116cef075e61c12c703David 'Digit' Turner mov [edi+8],ecx 9046be48730333120a7b939116cef075e61c12c703David 'Digit' Turner mov [edi+12],edx 9146be48730333120a7b939116cef075e61c12c703David 'Digit' Turner 9246be48730333120a7b939116cef075e61c12c703David 'Digit' Turner add esi,BYTE 16 9346be48730333120a7b939116cef075e61c12c703David 'Digit' Turner add edi,BYTE 16 9446be48730333120a7b939116cef075e61c12c703David 'Digit' Turner 9546be48730333120a7b939116cef075e61c12c703David 'Digit' Turner dec ebp 9646be48730333120a7b939116cef075e61c12c703David 'Digit' Turner jnz .L4 9746be48730333120a7b939116cef075e61c12c703David 'Digit' Turner 9846be48730333120a7b939116cef075e61c12c703David 'Digit' Turner ; check tail 9946be48730333120a7b939116cef075e61c12c703David 'Digit' Turner pop ecx 10046be48730333120a7b939116cef075e61c12c703David 'Digit' Turner and ecx,BYTE 11b 10146be48730333120a7b939116cef075e61c12c703David 'Digit' Turner jz .L6 10246be48730333120a7b939116cef075e61c12c703David 'Digit' Turner 10346be48730333120a7b939116cef075e61c12c703David 'Digit' Turner.L5 ; tail loop 10446be48730333120a7b939116cef075e61c12c703David 'Digit' Turner mov edx,[esi] 10546be48730333120a7b939116cef075e61c12c703David 'Digit' Turner bswap edx 10646be48730333120a7b939116cef075e61c12c703David 'Digit' Turner ror edx,8 10746be48730333120a7b939116cef075e61c12c703David 'Digit' Turner mov [edi],edx 10846be48730333120a7b939116cef075e61c12c703David 'Digit' Turner add esi,BYTE 4 10946be48730333120a7b939116cef075e61c12c703David 'Digit' Turner add edi,BYTE 4 11046be48730333120a7b939116cef075e61c12c703David 'Digit' Turner dec ecx 11146be48730333120a7b939116cef075e61c12c703David 'Digit' Turner jnz .L5 11246be48730333120a7b939116cef075e61c12c703David 'Digit' Turner 11346be48730333120a7b939116cef075e61c12c703David 'Digit' Turner.L6 pop ebp 11446be48730333120a7b939116cef075e61c12c703David 'Digit' Turner retn 11546be48730333120a7b939116cef075e61c12c703David 'Digit' Turner 11646be48730333120a7b939116cef075e61c12c703David 'Digit' Turner 11746be48730333120a7b939116cef075e61c12c703David 'Digit' Turner 11846be48730333120a7b939116cef075e61c12c703David 'Digit' Turner 11946be48730333120a7b939116cef075e61c12c703David 'Digit' Turner_ConvertX86p32_32RGBA888: 12046be48730333120a7b939116cef075e61c12c703David 'Digit' Turner 12146be48730333120a7b939116cef075e61c12c703David 'Digit' Turner ; check short 12246be48730333120a7b939116cef075e61c12c703David 'Digit' Turner cmp ecx,BYTE 32 12346be48730333120a7b939116cef075e61c12c703David 'Digit' Turner ja .L3 12446be48730333120a7b939116cef075e61c12c703David 'Digit' Turner 12546be48730333120a7b939116cef075e61c12c703David 'Digit' Turner.L1 ; short loop 12646be48730333120a7b939116cef075e61c12c703David 'Digit' Turner mov edx,[esi] 12746be48730333120a7b939116cef075e61c12c703David 'Digit' Turner rol edx,8 12846be48730333120a7b939116cef075e61c12c703David 'Digit' Turner mov [edi],edx 12946be48730333120a7b939116cef075e61c12c703David 'Digit' Turner add esi,BYTE 4 13046be48730333120a7b939116cef075e61c12c703David 'Digit' Turner add edi,BYTE 4 13146be48730333120a7b939116cef075e61c12c703David 'Digit' Turner dec ecx 13246be48730333120a7b939116cef075e61c12c703David 'Digit' Turner jnz .L1 13346be48730333120a7b939116cef075e61c12c703David 'Digit' Turner.L2 13446be48730333120a7b939116cef075e61c12c703David 'Digit' Turner retn 13546be48730333120a7b939116cef075e61c12c703David 'Digit' Turner 13646be48730333120a7b939116cef075e61c12c703David 'Digit' Turner.L3 ; save ebp 13746be48730333120a7b939116cef075e61c12c703David 'Digit' Turner push ebp 13846be48730333120a7b939116cef075e61c12c703David 'Digit' Turner 13946be48730333120a7b939116cef075e61c12c703David 'Digit' Turner ; unroll four times 14046be48730333120a7b939116cef075e61c12c703David 'Digit' Turner mov ebp,ecx 14146be48730333120a7b939116cef075e61c12c703David 'Digit' Turner shr ebp,2 14246be48730333120a7b939116cef075e61c12c703David 'Digit' Turner 14346be48730333120a7b939116cef075e61c12c703David 'Digit' Turner ; save count 14446be48730333120a7b939116cef075e61c12c703David 'Digit' Turner push ecx 14546be48730333120a7b939116cef075e61c12c703David 'Digit' Turner 14646be48730333120a7b939116cef075e61c12c703David 'Digit' Turner.L4 mov eax,[esi] 14746be48730333120a7b939116cef075e61c12c703David 'Digit' Turner mov ebx,[esi+4] 14846be48730333120a7b939116cef075e61c12c703David 'Digit' Turner 14946be48730333120a7b939116cef075e61c12c703David 'Digit' Turner rol eax,8 15046be48730333120a7b939116cef075e61c12c703David 'Digit' Turner mov ecx,[esi+8] 15146be48730333120a7b939116cef075e61c12c703David 'Digit' Turner 15246be48730333120a7b939116cef075e61c12c703David 'Digit' Turner rol ebx,8 15346be48730333120a7b939116cef075e61c12c703David 'Digit' Turner mov edx,[esi+12] 15446be48730333120a7b939116cef075e61c12c703David 'Digit' Turner 15546be48730333120a7b939116cef075e61c12c703David 'Digit' Turner rol ecx,8 15646be48730333120a7b939116cef075e61c12c703David 'Digit' Turner mov [edi+0],eax 15746be48730333120a7b939116cef075e61c12c703David 'Digit' Turner 15846be48730333120a7b939116cef075e61c12c703David 'Digit' Turner rol edx,8 15946be48730333120a7b939116cef075e61c12c703David 'Digit' Turner mov [edi+4],ebx 16046be48730333120a7b939116cef075e61c12c703David 'Digit' Turner 16146be48730333120a7b939116cef075e61c12c703David 'Digit' Turner mov [edi+8],ecx 16246be48730333120a7b939116cef075e61c12c703David 'Digit' Turner mov [edi+12],edx 16346be48730333120a7b939116cef075e61c12c703David 'Digit' Turner 16446be48730333120a7b939116cef075e61c12c703David 'Digit' Turner add esi,BYTE 16 16546be48730333120a7b939116cef075e61c12c703David 'Digit' Turner add edi,BYTE 16 16646be48730333120a7b939116cef075e61c12c703David 'Digit' Turner 16746be48730333120a7b939116cef075e61c12c703David 'Digit' Turner dec ebp 16846be48730333120a7b939116cef075e61c12c703David 'Digit' Turner jnz .L4 16946be48730333120a7b939116cef075e61c12c703David 'Digit' Turner 17046be48730333120a7b939116cef075e61c12c703David 'Digit' Turner ; check tail 17146be48730333120a7b939116cef075e61c12c703David 'Digit' Turner pop ecx 17246be48730333120a7b939116cef075e61c12c703David 'Digit' Turner and ecx,BYTE 11b 17346be48730333120a7b939116cef075e61c12c703David 'Digit' Turner jz .L6 17446be48730333120a7b939116cef075e61c12c703David 'Digit' Turner 17546be48730333120a7b939116cef075e61c12c703David 'Digit' Turner.L5 ; tail loop 17646be48730333120a7b939116cef075e61c12c703David 'Digit' Turner mov edx,[esi] 17746be48730333120a7b939116cef075e61c12c703David 'Digit' Turner rol edx,8 17846be48730333120a7b939116cef075e61c12c703David 'Digit' Turner mov [edi],edx 17946be48730333120a7b939116cef075e61c12c703David 'Digit' Turner add esi,BYTE 4 18046be48730333120a7b939116cef075e61c12c703David 'Digit' Turner add edi,BYTE 4 18146be48730333120a7b939116cef075e61c12c703David 'Digit' Turner dec ecx 18246be48730333120a7b939116cef075e61c12c703David 'Digit' Turner jnz .L5 18346be48730333120a7b939116cef075e61c12c703David 'Digit' Turner 18446be48730333120a7b939116cef075e61c12c703David 'Digit' Turner.L6 pop ebp 18546be48730333120a7b939116cef075e61c12c703David 'Digit' Turner retn 18646be48730333120a7b939116cef075e61c12c703David 'Digit' Turner 18746be48730333120a7b939116cef075e61c12c703David 'Digit' Turner 18846be48730333120a7b939116cef075e61c12c703David 'Digit' Turner 18946be48730333120a7b939116cef075e61c12c703David 'Digit' Turner 19046be48730333120a7b939116cef075e61c12c703David 'Digit' Turner_ConvertX86p32_32BGRA888: 19146be48730333120a7b939116cef075e61c12c703David 'Digit' Turner 19246be48730333120a7b939116cef075e61c12c703David 'Digit' Turner ; check short 19346be48730333120a7b939116cef075e61c12c703David 'Digit' Turner cmp ecx,BYTE 32 19446be48730333120a7b939116cef075e61c12c703David 'Digit' Turner ja .L3 19546be48730333120a7b939116cef075e61c12c703David 'Digit' Turner 19646be48730333120a7b939116cef075e61c12c703David 'Digit' Turner.L1 ; short loop 19746be48730333120a7b939116cef075e61c12c703David 'Digit' Turner mov edx,[esi] 19846be48730333120a7b939116cef075e61c12c703David 'Digit' Turner bswap edx 19946be48730333120a7b939116cef075e61c12c703David 'Digit' Turner mov [edi],edx 20046be48730333120a7b939116cef075e61c12c703David 'Digit' Turner add esi,BYTE 4 20146be48730333120a7b939116cef075e61c12c703David 'Digit' Turner add edi,BYTE 4 20246be48730333120a7b939116cef075e61c12c703David 'Digit' Turner dec ecx 20346be48730333120a7b939116cef075e61c12c703David 'Digit' Turner jnz .L1 20446be48730333120a7b939116cef075e61c12c703David 'Digit' Turner.L2 20546be48730333120a7b939116cef075e61c12c703David 'Digit' Turner retn 20646be48730333120a7b939116cef075e61c12c703David 'Digit' Turner 20746be48730333120a7b939116cef075e61c12c703David 'Digit' Turner.L3 ; save ebp 20846be48730333120a7b939116cef075e61c12c703David 'Digit' Turner push ebp 20946be48730333120a7b939116cef075e61c12c703David 'Digit' Turner 21046be48730333120a7b939116cef075e61c12c703David 'Digit' Turner ; unroll four times 21146be48730333120a7b939116cef075e61c12c703David 'Digit' Turner mov ebp,ecx 21246be48730333120a7b939116cef075e61c12c703David 'Digit' Turner shr ebp,2 21346be48730333120a7b939116cef075e61c12c703David 'Digit' Turner 21446be48730333120a7b939116cef075e61c12c703David 'Digit' Turner ; save count 21546be48730333120a7b939116cef075e61c12c703David 'Digit' Turner push ecx 21646be48730333120a7b939116cef075e61c12c703David 'Digit' Turner 21746be48730333120a7b939116cef075e61c12c703David 'Digit' Turner.L4 mov eax,[esi] 21846be48730333120a7b939116cef075e61c12c703David 'Digit' Turner mov ebx,[esi+4] 21946be48730333120a7b939116cef075e61c12c703David 'Digit' Turner 22046be48730333120a7b939116cef075e61c12c703David 'Digit' Turner mov ecx,[esi+8] 22146be48730333120a7b939116cef075e61c12c703David 'Digit' Turner mov edx,[esi+12] 22246be48730333120a7b939116cef075e61c12c703David 'Digit' Turner 22346be48730333120a7b939116cef075e61c12c703David 'Digit' Turner bswap eax 22446be48730333120a7b939116cef075e61c12c703David 'Digit' Turner 22546be48730333120a7b939116cef075e61c12c703David 'Digit' Turner bswap ebx 22646be48730333120a7b939116cef075e61c12c703David 'Digit' Turner 22746be48730333120a7b939116cef075e61c12c703David 'Digit' Turner bswap ecx 22846be48730333120a7b939116cef075e61c12c703David 'Digit' Turner 22946be48730333120a7b939116cef075e61c12c703David 'Digit' Turner bswap edx 23046be48730333120a7b939116cef075e61c12c703David 'Digit' Turner 23146be48730333120a7b939116cef075e61c12c703David 'Digit' Turner mov [edi+0],eax 23246be48730333120a7b939116cef075e61c12c703David 'Digit' Turner mov [edi+4],ebx 23346be48730333120a7b939116cef075e61c12c703David 'Digit' Turner 23446be48730333120a7b939116cef075e61c12c703David 'Digit' Turner mov [edi+8],ecx 23546be48730333120a7b939116cef075e61c12c703David 'Digit' Turner mov [edi+12],edx 23646be48730333120a7b939116cef075e61c12c703David 'Digit' Turner 23746be48730333120a7b939116cef075e61c12c703David 'Digit' Turner add esi,BYTE 16 23846be48730333120a7b939116cef075e61c12c703David 'Digit' Turner add edi,BYTE 16 23946be48730333120a7b939116cef075e61c12c703David 'Digit' Turner 24046be48730333120a7b939116cef075e61c12c703David 'Digit' Turner dec ebp 24146be48730333120a7b939116cef075e61c12c703David 'Digit' Turner jnz .L4 24246be48730333120a7b939116cef075e61c12c703David 'Digit' Turner 24346be48730333120a7b939116cef075e61c12c703David 'Digit' Turner ; check tail 24446be48730333120a7b939116cef075e61c12c703David 'Digit' Turner pop ecx 24546be48730333120a7b939116cef075e61c12c703David 'Digit' Turner and ecx,BYTE 11b 24646be48730333120a7b939116cef075e61c12c703David 'Digit' Turner jz .L6 24746be48730333120a7b939116cef075e61c12c703David 'Digit' Turner 24846be48730333120a7b939116cef075e61c12c703David 'Digit' Turner.L5 ; tail loop 24946be48730333120a7b939116cef075e61c12c703David 'Digit' Turner mov edx,[esi] 25046be48730333120a7b939116cef075e61c12c703David 'Digit' Turner bswap edx 25146be48730333120a7b939116cef075e61c12c703David 'Digit' Turner mov [edi],edx 25246be48730333120a7b939116cef075e61c12c703David 'Digit' Turner add esi,BYTE 4 25346be48730333120a7b939116cef075e61c12c703David 'Digit' Turner add edi,BYTE 4 25446be48730333120a7b939116cef075e61c12c703David 'Digit' Turner dec ecx 25546be48730333120a7b939116cef075e61c12c703David 'Digit' Turner jnz .L5 25646be48730333120a7b939116cef075e61c12c703David 'Digit' Turner 25746be48730333120a7b939116cef075e61c12c703David 'Digit' Turner.L6 pop ebp 25846be48730333120a7b939116cef075e61c12c703David 'Digit' Turner retn 25946be48730333120a7b939116cef075e61c12c703David 'Digit' Turner 26046be48730333120a7b939116cef075e61c12c703David 'Digit' Turner 26146be48730333120a7b939116cef075e61c12c703David 'Digit' Turner 26246be48730333120a7b939116cef075e61c12c703David 'Digit' Turner 26346be48730333120a7b939116cef075e61c12c703David 'Digit' Turner;; 32 bit RGB 888 to 24 BIT RGB 888 26446be48730333120a7b939116cef075e61c12c703David 'Digit' Turner 26546be48730333120a7b939116cef075e61c12c703David 'Digit' Turner_ConvertX86p32_24RGB888: 26646be48730333120a7b939116cef075e61c12c703David 'Digit' Turner 26746be48730333120a7b939116cef075e61c12c703David 'Digit' Turner ; check short 26846be48730333120a7b939116cef075e61c12c703David 'Digit' Turner cmp ecx,BYTE 32 26946be48730333120a7b939116cef075e61c12c703David 'Digit' Turner ja .L3 27046be48730333120a7b939116cef075e61c12c703David 'Digit' Turner 27146be48730333120a7b939116cef075e61c12c703David 'Digit' Turner.L1 ; short loop 27246be48730333120a7b939116cef075e61c12c703David 'Digit' Turner mov al,[esi] 27346be48730333120a7b939116cef075e61c12c703David 'Digit' Turner mov bl,[esi+1] 27446be48730333120a7b939116cef075e61c12c703David 'Digit' Turner mov dl,[esi+2] 27546be48730333120a7b939116cef075e61c12c703David 'Digit' Turner mov [edi],al 27646be48730333120a7b939116cef075e61c12c703David 'Digit' Turner mov [edi+1],bl 27746be48730333120a7b939116cef075e61c12c703David 'Digit' Turner mov [edi+2],dl 27846be48730333120a7b939116cef075e61c12c703David 'Digit' Turner add esi,BYTE 4 27946be48730333120a7b939116cef075e61c12c703David 'Digit' Turner add edi,BYTE 3 28046be48730333120a7b939116cef075e61c12c703David 'Digit' Turner dec ecx 28146be48730333120a7b939116cef075e61c12c703David 'Digit' Turner jnz .L1 28246be48730333120a7b939116cef075e61c12c703David 'Digit' Turner.L2 28346be48730333120a7b939116cef075e61c12c703David 'Digit' Turner retn 28446be48730333120a7b939116cef075e61c12c703David 'Digit' Turner 28546be48730333120a7b939116cef075e61c12c703David 'Digit' Turner.L3 ; head 28646be48730333120a7b939116cef075e61c12c703David 'Digit' Turner mov edx,edi 28746be48730333120a7b939116cef075e61c12c703David 'Digit' Turner and edx,BYTE 11b 28846be48730333120a7b939116cef075e61c12c703David 'Digit' Turner jz .L4 28946be48730333120a7b939116cef075e61c12c703David 'Digit' Turner mov al,[esi] 29046be48730333120a7b939116cef075e61c12c703David 'Digit' Turner mov bl,[esi+1] 29146be48730333120a7b939116cef075e61c12c703David 'Digit' Turner mov dl,[esi+2] 29246be48730333120a7b939116cef075e61c12c703David 'Digit' Turner mov [edi],al 29346be48730333120a7b939116cef075e61c12c703David 'Digit' Turner mov [edi+1],bl 29446be48730333120a7b939116cef075e61c12c703David 'Digit' Turner mov [edi+2],dl 29546be48730333120a7b939116cef075e61c12c703David 'Digit' Turner add esi,BYTE 4 29646be48730333120a7b939116cef075e61c12c703David 'Digit' Turner add edi,BYTE 3 29746be48730333120a7b939116cef075e61c12c703David 'Digit' Turner dec ecx 29846be48730333120a7b939116cef075e61c12c703David 'Digit' Turner jmp SHORT .L3 29946be48730333120a7b939116cef075e61c12c703David 'Digit' Turner 30046be48730333120a7b939116cef075e61c12c703David 'Digit' Turner.L4 ; unroll 4 times 30146be48730333120a7b939116cef075e61c12c703David 'Digit' Turner push ebp 30246be48730333120a7b939116cef075e61c12c703David 'Digit' Turner mov ebp,ecx 30346be48730333120a7b939116cef075e61c12c703David 'Digit' Turner shr ebp,2 30446be48730333120a7b939116cef075e61c12c703David 'Digit' Turner 30546be48730333120a7b939116cef075e61c12c703David 'Digit' Turner ; save count 30646be48730333120a7b939116cef075e61c12c703David 'Digit' Turner push ecx 30746be48730333120a7b939116cef075e61c12c703David 'Digit' Turner 30846be48730333120a7b939116cef075e61c12c703David 'Digit' Turner.L5 mov eax,[esi] ; first dword eax = [A][R][G][B] 30946be48730333120a7b939116cef075e61c12c703David 'Digit' Turner mov ebx,[esi+4] ; second dword ebx = [a][r][g][b] 31046be48730333120a7b939116cef075e61c12c703David 'Digit' Turner 31146be48730333120a7b939116cef075e61c12c703David 'Digit' Turner shl eax,8 ; eax = [R][G][B][.] 31246be48730333120a7b939116cef075e61c12c703David 'Digit' Turner mov ecx,[esi+12] ; third dword ecx = [a][r][g][b] 31346be48730333120a7b939116cef075e61c12c703David 'Digit' Turner 31446be48730333120a7b939116cef075e61c12c703David 'Digit' Turner shl ebx,8 ; ebx = [r][g][b][.] 31546be48730333120a7b939116cef075e61c12c703David 'Digit' Turner mov al,[esi+4] ; eax = [R][G][B][b] 31646be48730333120a7b939116cef075e61c12c703David 'Digit' Turner 31746be48730333120a7b939116cef075e61c12c703David 'Digit' Turner ror eax,8 ; eax = [b][R][G][B] (done) 31846be48730333120a7b939116cef075e61c12c703David 'Digit' Turner mov bh,[esi+8+1] ; ebx = [r][g][G][.] 31946be48730333120a7b939116cef075e61c12c703David 'Digit' Turner 32046be48730333120a7b939116cef075e61c12c703David 'Digit' Turner mov [edi],eax 32146be48730333120a7b939116cef075e61c12c703David 'Digit' Turner add edi,BYTE 3*4 32246be48730333120a7b939116cef075e61c12c703David 'Digit' Turner 32346be48730333120a7b939116cef075e61c12c703David 'Digit' Turner shl ecx,8 ; ecx = [r][g][b][.] 32446be48730333120a7b939116cef075e61c12c703David 'Digit' Turner mov bl,[esi+8+0] ; ebx = [r][g][G][B] 32546be48730333120a7b939116cef075e61c12c703David 'Digit' Turner 32646be48730333120a7b939116cef075e61c12c703David 'Digit' Turner rol ebx,16 ; ebx = [G][B][r][g] (done) 32746be48730333120a7b939116cef075e61c12c703David 'Digit' Turner mov cl,[esi+8+2] ; ecx = [r][g][b][R] (done) 32846be48730333120a7b939116cef075e61c12c703David 'Digit' Turner 32946be48730333120a7b939116cef075e61c12c703David 'Digit' Turner mov [edi+4-3*4],ebx 33046be48730333120a7b939116cef075e61c12c703David 'Digit' Turner add esi,BYTE 4*4 33146be48730333120a7b939116cef075e61c12c703David 'Digit' Turner 33246be48730333120a7b939116cef075e61c12c703David 'Digit' Turner mov [edi+8-3*4],ecx 33346be48730333120a7b939116cef075e61c12c703David 'Digit' Turner dec ebp 33446be48730333120a7b939116cef075e61c12c703David 'Digit' Turner 33546be48730333120a7b939116cef075e61c12c703David 'Digit' Turner jnz .L5 33646be48730333120a7b939116cef075e61c12c703David 'Digit' Turner 33746be48730333120a7b939116cef075e61c12c703David 'Digit' Turner ; check tail 33846be48730333120a7b939116cef075e61c12c703David 'Digit' Turner pop ecx 33946be48730333120a7b939116cef075e61c12c703David 'Digit' Turner and ecx,BYTE 11b 34046be48730333120a7b939116cef075e61c12c703David 'Digit' Turner jz .L7 34146be48730333120a7b939116cef075e61c12c703David 'Digit' Turner 34246be48730333120a7b939116cef075e61c12c703David 'Digit' Turner.L6 ; tail loop 34346be48730333120a7b939116cef075e61c12c703David 'Digit' Turner mov al,[esi] 34446be48730333120a7b939116cef075e61c12c703David 'Digit' Turner mov bl,[esi+1] 34546be48730333120a7b939116cef075e61c12c703David 'Digit' Turner mov dl,[esi+2] 34646be48730333120a7b939116cef075e61c12c703David 'Digit' Turner mov [edi],al 34746be48730333120a7b939116cef075e61c12c703David 'Digit' Turner mov [edi+1],bl 34846be48730333120a7b939116cef075e61c12c703David 'Digit' Turner mov [edi+2],dl 34946be48730333120a7b939116cef075e61c12c703David 'Digit' Turner add esi,BYTE 4 35046be48730333120a7b939116cef075e61c12c703David 'Digit' Turner add edi,BYTE 3 35146be48730333120a7b939116cef075e61c12c703David 'Digit' Turner dec ecx 35246be48730333120a7b939116cef075e61c12c703David 'Digit' Turner jnz .L6 35346be48730333120a7b939116cef075e61c12c703David 'Digit' Turner 35446be48730333120a7b939116cef075e61c12c703David 'Digit' Turner.L7 pop ebp 35546be48730333120a7b939116cef075e61c12c703David 'Digit' Turner retn 35646be48730333120a7b939116cef075e61c12c703David 'Digit' Turner 35746be48730333120a7b939116cef075e61c12c703David 'Digit' Turner 35846be48730333120a7b939116cef075e61c12c703David 'Digit' Turner 35946be48730333120a7b939116cef075e61c12c703David 'Digit' Turner 36046be48730333120a7b939116cef075e61c12c703David 'Digit' Turner;; 32 bit RGB 888 to 24 bit BGR 888 36146be48730333120a7b939116cef075e61c12c703David 'Digit' Turner 36246be48730333120a7b939116cef075e61c12c703David 'Digit' Turner_ConvertX86p32_24BGR888: 36346be48730333120a7b939116cef075e61c12c703David 'Digit' Turner 36446be48730333120a7b939116cef075e61c12c703David 'Digit' Turner ; check short 36546be48730333120a7b939116cef075e61c12c703David 'Digit' Turner cmp ecx,BYTE 32 36646be48730333120a7b939116cef075e61c12c703David 'Digit' Turner ja .L3 36746be48730333120a7b939116cef075e61c12c703David 'Digit' Turner 36846be48730333120a7b939116cef075e61c12c703David 'Digit' Turner 36946be48730333120a7b939116cef075e61c12c703David 'Digit' Turner.L1 ; short loop 37046be48730333120a7b939116cef075e61c12c703David 'Digit' Turner mov dl,[esi] 37146be48730333120a7b939116cef075e61c12c703David 'Digit' Turner mov bl,[esi+1] 37246be48730333120a7b939116cef075e61c12c703David 'Digit' Turner mov al,[esi+2] 37346be48730333120a7b939116cef075e61c12c703David 'Digit' Turner mov [edi],al 37446be48730333120a7b939116cef075e61c12c703David 'Digit' Turner mov [edi+1],bl 37546be48730333120a7b939116cef075e61c12c703David 'Digit' Turner mov [edi+2],dl 37646be48730333120a7b939116cef075e61c12c703David 'Digit' Turner add esi,BYTE 4 37746be48730333120a7b939116cef075e61c12c703David 'Digit' Turner add edi,BYTE 3 37846be48730333120a7b939116cef075e61c12c703David 'Digit' Turner dec ecx 37946be48730333120a7b939116cef075e61c12c703David 'Digit' Turner jnz .L1 38046be48730333120a7b939116cef075e61c12c703David 'Digit' Turner.L2 38146be48730333120a7b939116cef075e61c12c703David 'Digit' Turner retn 38246be48730333120a7b939116cef075e61c12c703David 'Digit' Turner 38346be48730333120a7b939116cef075e61c12c703David 'Digit' Turner.L3 ; head 38446be48730333120a7b939116cef075e61c12c703David 'Digit' Turner mov edx,edi 38546be48730333120a7b939116cef075e61c12c703David 'Digit' Turner and edx,BYTE 11b 38646be48730333120a7b939116cef075e61c12c703David 'Digit' Turner jz .L4 38746be48730333120a7b939116cef075e61c12c703David 'Digit' Turner mov dl,[esi] 38846be48730333120a7b939116cef075e61c12c703David 'Digit' Turner mov bl,[esi+1] 38946be48730333120a7b939116cef075e61c12c703David 'Digit' Turner mov al,[esi+2] 39046be48730333120a7b939116cef075e61c12c703David 'Digit' Turner mov [edi],al 39146be48730333120a7b939116cef075e61c12c703David 'Digit' Turner mov [edi+1],bl 39246be48730333120a7b939116cef075e61c12c703David 'Digit' Turner mov [edi+2],dl 39346be48730333120a7b939116cef075e61c12c703David 'Digit' Turner add esi,BYTE 4 39446be48730333120a7b939116cef075e61c12c703David 'Digit' Turner add edi,BYTE 3 39546be48730333120a7b939116cef075e61c12c703David 'Digit' Turner dec ecx 39646be48730333120a7b939116cef075e61c12c703David 'Digit' Turner jmp SHORT .L3 39746be48730333120a7b939116cef075e61c12c703David 'Digit' Turner 39846be48730333120a7b939116cef075e61c12c703David 'Digit' Turner.L4 ; unroll 4 times 39946be48730333120a7b939116cef075e61c12c703David 'Digit' Turner push ebp 40046be48730333120a7b939116cef075e61c12c703David 'Digit' Turner mov ebp,ecx 40146be48730333120a7b939116cef075e61c12c703David 'Digit' Turner shr ebp,2 40246be48730333120a7b939116cef075e61c12c703David 'Digit' Turner 40346be48730333120a7b939116cef075e61c12c703David 'Digit' Turner ; save count 40446be48730333120a7b939116cef075e61c12c703David 'Digit' Turner push ecx 40546be48730333120a7b939116cef075e61c12c703David 'Digit' Turner 40646be48730333120a7b939116cef075e61c12c703David 'Digit' Turner.L5 40746be48730333120a7b939116cef075e61c12c703David 'Digit' Turner mov eax,[esi] ; first dword eax = [A][R][G][B] 40846be48730333120a7b939116cef075e61c12c703David 'Digit' Turner mov ebx,[esi+4] ; second dword ebx = [a][r][g][b] 40946be48730333120a7b939116cef075e61c12c703David 'Digit' Turner 41046be48730333120a7b939116cef075e61c12c703David 'Digit' Turner bswap eax ; eax = [B][G][R][A] 41146be48730333120a7b939116cef075e61c12c703David 'Digit' Turner 41246be48730333120a7b939116cef075e61c12c703David 'Digit' Turner bswap ebx ; ebx = [b][g][r][a] 41346be48730333120a7b939116cef075e61c12c703David 'Digit' Turner 41446be48730333120a7b939116cef075e61c12c703David 'Digit' Turner mov al,[esi+4+2] ; eax = [B][G][R][r] 41546be48730333120a7b939116cef075e61c12c703David 'Digit' Turner mov bh,[esi+4+4+1] ; ebx = [b][g][G][a] 41646be48730333120a7b939116cef075e61c12c703David 'Digit' Turner 41746be48730333120a7b939116cef075e61c12c703David 'Digit' Turner ror eax,8 ; eax = [r][B][G][R] (done) 41846be48730333120a7b939116cef075e61c12c703David 'Digit' Turner mov bl,[esi+4+4+2] ; ebx = [b][g][G][R] 41946be48730333120a7b939116cef075e61c12c703David 'Digit' Turner 42046be48730333120a7b939116cef075e61c12c703David 'Digit' Turner ror ebx,16 ; ebx = [G][R][b][g] (done) 42146be48730333120a7b939116cef075e61c12c703David 'Digit' Turner mov [edi],eax 42246be48730333120a7b939116cef075e61c12c703David 'Digit' Turner 42346be48730333120a7b939116cef075e61c12c703David 'Digit' Turner mov [edi+4],ebx 42446be48730333120a7b939116cef075e61c12c703David 'Digit' Turner mov ecx,[esi+12] ; third dword ecx = [a][r][g][b] 42546be48730333120a7b939116cef075e61c12c703David 'Digit' Turner 42646be48730333120a7b939116cef075e61c12c703David 'Digit' Turner bswap ecx ; ecx = [b][g][r][a] 42746be48730333120a7b939116cef075e61c12c703David 'Digit' Turner 42846be48730333120a7b939116cef075e61c12c703David 'Digit' Turner mov cl,[esi+8] ; ecx = [b][g][r][B] (done) 42946be48730333120a7b939116cef075e61c12c703David 'Digit' Turner add esi,BYTE 4*4 43046be48730333120a7b939116cef075e61c12c703David 'Digit' Turner 43146be48730333120a7b939116cef075e61c12c703David 'Digit' Turner mov [edi+8],ecx 43246be48730333120a7b939116cef075e61c12c703David 'Digit' Turner add edi,BYTE 3*4 43346be48730333120a7b939116cef075e61c12c703David 'Digit' Turner 43446be48730333120a7b939116cef075e61c12c703David 'Digit' Turner dec ebp 43546be48730333120a7b939116cef075e61c12c703David 'Digit' Turner jnz .L5 43646be48730333120a7b939116cef075e61c12c703David 'Digit' Turner 43746be48730333120a7b939116cef075e61c12c703David 'Digit' Turner ; check tail 43846be48730333120a7b939116cef075e61c12c703David 'Digit' Turner pop ecx 43946be48730333120a7b939116cef075e61c12c703David 'Digit' Turner and ecx,BYTE 11b 44046be48730333120a7b939116cef075e61c12c703David 'Digit' Turner jz .L7 44146be48730333120a7b939116cef075e61c12c703David 'Digit' Turner 44246be48730333120a7b939116cef075e61c12c703David 'Digit' Turner.L6 ; tail loop 44346be48730333120a7b939116cef075e61c12c703David 'Digit' Turner mov dl,[esi] 44446be48730333120a7b939116cef075e61c12c703David 'Digit' Turner mov bl,[esi+1] 44546be48730333120a7b939116cef075e61c12c703David 'Digit' Turner mov al,[esi+2] 44646be48730333120a7b939116cef075e61c12c703David 'Digit' Turner mov [edi],al 44746be48730333120a7b939116cef075e61c12c703David 'Digit' Turner mov [edi+1],bl 44846be48730333120a7b939116cef075e61c12c703David 'Digit' Turner mov [edi+2],dl 44946be48730333120a7b939116cef075e61c12c703David 'Digit' Turner add esi,BYTE 4 45046be48730333120a7b939116cef075e61c12c703David 'Digit' Turner add edi,BYTE 3 45146be48730333120a7b939116cef075e61c12c703David 'Digit' Turner dec ecx 45246be48730333120a7b939116cef075e61c12c703David 'Digit' Turner jnz .L6 45346be48730333120a7b939116cef075e61c12c703David 'Digit' Turner 45446be48730333120a7b939116cef075e61c12c703David 'Digit' Turner.L7 45546be48730333120a7b939116cef075e61c12c703David 'Digit' Turner pop ebp 45646be48730333120a7b939116cef075e61c12c703David 'Digit' Turner retn 45746be48730333120a7b939116cef075e61c12c703David 'Digit' Turner 45846be48730333120a7b939116cef075e61c12c703David 'Digit' Turner 45946be48730333120a7b939116cef075e61c12c703David 'Digit' Turner 46046be48730333120a7b939116cef075e61c12c703David 'Digit' Turner 46146be48730333120a7b939116cef075e61c12c703David 'Digit' Turner;; 32 bit RGB 888 to 16 BIT RGB 565 46246be48730333120a7b939116cef075e61c12c703David 'Digit' Turner 46346be48730333120a7b939116cef075e61c12c703David 'Digit' Turner_ConvertX86p32_16RGB565: 46446be48730333120a7b939116cef075e61c12c703David 'Digit' Turner ; check short 46546be48730333120a7b939116cef075e61c12c703David 'Digit' Turner cmp ecx,BYTE 16 46646be48730333120a7b939116cef075e61c12c703David 'Digit' Turner ja .L3 46746be48730333120a7b939116cef075e61c12c703David 'Digit' Turner 46846be48730333120a7b939116cef075e61c12c703David 'Digit' Turner.L1 ; short loop 46946be48730333120a7b939116cef075e61c12c703David 'Digit' Turner mov bl,[esi+0] ; blue 47046be48730333120a7b939116cef075e61c12c703David 'Digit' Turner mov al,[esi+1] ; green 47146be48730333120a7b939116cef075e61c12c703David 'Digit' Turner mov ah,[esi+2] ; red 47246be48730333120a7b939116cef075e61c12c703David 'Digit' Turner shr ah,3 47346be48730333120a7b939116cef075e61c12c703David 'Digit' Turner and al,11111100b 47446be48730333120a7b939116cef075e61c12c703David 'Digit' Turner shl eax,3 47546be48730333120a7b939116cef075e61c12c703David 'Digit' Turner shr bl,3 47646be48730333120a7b939116cef075e61c12c703David 'Digit' Turner add al,bl 47746be48730333120a7b939116cef075e61c12c703David 'Digit' Turner mov [edi+0],al 47846be48730333120a7b939116cef075e61c12c703David 'Digit' Turner mov [edi+1],ah 47946be48730333120a7b939116cef075e61c12c703David 'Digit' Turner add esi,BYTE 4 48046be48730333120a7b939116cef075e61c12c703David 'Digit' Turner add edi,BYTE 2 48146be48730333120a7b939116cef075e61c12c703David 'Digit' Turner dec ecx 48246be48730333120a7b939116cef075e61c12c703David 'Digit' Turner jnz .L1 48346be48730333120a7b939116cef075e61c12c703David 'Digit' Turner 48446be48730333120a7b939116cef075e61c12c703David 'Digit' Turner.L2: ; End of short loop 48546be48730333120a7b939116cef075e61c12c703David 'Digit' Turner retn 48646be48730333120a7b939116cef075e61c12c703David 'Digit' Turner 48746be48730333120a7b939116cef075e61c12c703David 'Digit' Turner 48846be48730333120a7b939116cef075e61c12c703David 'Digit' Turner.L3 ; head 48946be48730333120a7b939116cef075e61c12c703David 'Digit' Turner mov ebx,edi 49046be48730333120a7b939116cef075e61c12c703David 'Digit' Turner and ebx,BYTE 11b 49146be48730333120a7b939116cef075e61c12c703David 'Digit' Turner jz .L4 49246be48730333120a7b939116cef075e61c12c703David 'Digit' Turner 49346be48730333120a7b939116cef075e61c12c703David 'Digit' Turner mov bl,[esi+0] ; blue 49446be48730333120a7b939116cef075e61c12c703David 'Digit' Turner mov al,[esi+1] ; green 49546be48730333120a7b939116cef075e61c12c703David 'Digit' Turner mov ah,[esi+2] ; red 49646be48730333120a7b939116cef075e61c12c703David 'Digit' Turner shr ah,3 49746be48730333120a7b939116cef075e61c12c703David 'Digit' Turner and al,11111100b 49846be48730333120a7b939116cef075e61c12c703David 'Digit' Turner shl eax,3 49946be48730333120a7b939116cef075e61c12c703David 'Digit' Turner shr bl,3 50046be48730333120a7b939116cef075e61c12c703David 'Digit' Turner add al,bl 50146be48730333120a7b939116cef075e61c12c703David 'Digit' Turner mov [edi+0],al 50246be48730333120a7b939116cef075e61c12c703David 'Digit' Turner mov [edi+1],ah 50346be48730333120a7b939116cef075e61c12c703David 'Digit' Turner add esi,BYTE 4 50446be48730333120a7b939116cef075e61c12c703David 'Digit' Turner add edi,BYTE 2 50546be48730333120a7b939116cef075e61c12c703David 'Digit' Turner dec ecx 50646be48730333120a7b939116cef075e61c12c703David 'Digit' Turner 50746be48730333120a7b939116cef075e61c12c703David 'Digit' Turner.L4: 50846be48730333120a7b939116cef075e61c12c703David 'Digit' Turner ; save count 50946be48730333120a7b939116cef075e61c12c703David 'Digit' Turner push ecx 51046be48730333120a7b939116cef075e61c12c703David 'Digit' Turner 51146be48730333120a7b939116cef075e61c12c703David 'Digit' Turner ; unroll twice 51246be48730333120a7b939116cef075e61c12c703David 'Digit' Turner shr ecx,1 51346be48730333120a7b939116cef075e61c12c703David 'Digit' Turner 51446be48730333120a7b939116cef075e61c12c703David 'Digit' Turner ; point arrays to end 51546be48730333120a7b939116cef075e61c12c703David 'Digit' Turner lea esi,[esi+ecx*8] 51646be48730333120a7b939116cef075e61c12c703David 'Digit' Turner lea edi,[edi+ecx*4] 51746be48730333120a7b939116cef075e61c12c703David 'Digit' Turner 51846be48730333120a7b939116cef075e61c12c703David 'Digit' Turner ; negative counter 51946be48730333120a7b939116cef075e61c12c703David 'Digit' Turner neg ecx 52046be48730333120a7b939116cef075e61c12c703David 'Digit' Turner jmp SHORT .L6 52146be48730333120a7b939116cef075e61c12c703David 'Digit' Turner 52246be48730333120a7b939116cef075e61c12c703David 'Digit' Turner.L5: 52346be48730333120a7b939116cef075e61c12c703David 'Digit' Turner mov [edi+ecx*4-4],eax 52446be48730333120a7b939116cef075e61c12c703David 'Digit' Turner.L6: 52546be48730333120a7b939116cef075e61c12c703David 'Digit' Turner mov eax,[esi+ecx*8] 52646be48730333120a7b939116cef075e61c12c703David 'Digit' Turner 52746be48730333120a7b939116cef075e61c12c703David 'Digit' Turner shr ah,2 52846be48730333120a7b939116cef075e61c12c703David 'Digit' Turner mov ebx,[esi+ecx*8+4] 52946be48730333120a7b939116cef075e61c12c703David 'Digit' Turner 53046be48730333120a7b939116cef075e61c12c703David 'Digit' Turner shr eax,3 53146be48730333120a7b939116cef075e61c12c703David 'Digit' Turner mov edx,[esi+ecx*8+4] 53246be48730333120a7b939116cef075e61c12c703David 'Digit' Turner 53346be48730333120a7b939116cef075e61c12c703David 'Digit' Turner shr bh,2 53446be48730333120a7b939116cef075e61c12c703David 'Digit' Turner mov dl,[esi+ecx*8+2] 53546be48730333120a7b939116cef075e61c12c703David 'Digit' Turner 53646be48730333120a7b939116cef075e61c12c703David 'Digit' Turner shl ebx,13 53746be48730333120a7b939116cef075e61c12c703David 'Digit' Turner and eax,000007FFh 53846be48730333120a7b939116cef075e61c12c703David 'Digit' Turner 53946be48730333120a7b939116cef075e61c12c703David 'Digit' Turner shl edx,8 54046be48730333120a7b939116cef075e61c12c703David 'Digit' Turner and ebx,07FF0000h 54146be48730333120a7b939116cef075e61c12c703David 'Digit' Turner 54246be48730333120a7b939116cef075e61c12c703David 'Digit' Turner and edx,0F800F800h 54346be48730333120a7b939116cef075e61c12c703David 'Digit' Turner add eax,ebx 54446be48730333120a7b939116cef075e61c12c703David 'Digit' Turner 54546be48730333120a7b939116cef075e61c12c703David 'Digit' Turner add eax,edx 54646be48730333120a7b939116cef075e61c12c703David 'Digit' Turner inc ecx 54746be48730333120a7b939116cef075e61c12c703David 'Digit' Turner 54846be48730333120a7b939116cef075e61c12c703David 'Digit' Turner jnz .L5 54946be48730333120a7b939116cef075e61c12c703David 'Digit' Turner 55046be48730333120a7b939116cef075e61c12c703David 'Digit' Turner mov [edi+ecx*4-4],eax 55146be48730333120a7b939116cef075e61c12c703David 'Digit' Turner 55246be48730333120a7b939116cef075e61c12c703David 'Digit' Turner ; tail 55346be48730333120a7b939116cef075e61c12c703David 'Digit' Turner pop ecx 55446be48730333120a7b939116cef075e61c12c703David 'Digit' Turner test cl,1 55546be48730333120a7b939116cef075e61c12c703David 'Digit' Turner jz .L7 55646be48730333120a7b939116cef075e61c12c703David 'Digit' Turner 55746be48730333120a7b939116cef075e61c12c703David 'Digit' Turner mov bl,[esi+0] ; blue 55846be48730333120a7b939116cef075e61c12c703David 'Digit' Turner mov al,[esi+1] ; green 55946be48730333120a7b939116cef075e61c12c703David 'Digit' Turner mov ah,[esi+2] ; red 56046be48730333120a7b939116cef075e61c12c703David 'Digit' Turner shr ah,3 56146be48730333120a7b939116cef075e61c12c703David 'Digit' Turner and al,11111100b 56246be48730333120a7b939116cef075e61c12c703David 'Digit' Turner shl eax,3 56346be48730333120a7b939116cef075e61c12c703David 'Digit' Turner shr bl,3 56446be48730333120a7b939116cef075e61c12c703David 'Digit' Turner add al,bl 56546be48730333120a7b939116cef075e61c12c703David 'Digit' Turner mov [edi+0],al 56646be48730333120a7b939116cef075e61c12c703David 'Digit' Turner mov [edi+1],ah 56746be48730333120a7b939116cef075e61c12c703David 'Digit' Turner add esi,BYTE 4 56846be48730333120a7b939116cef075e61c12c703David 'Digit' Turner add edi,BYTE 2 56946be48730333120a7b939116cef075e61c12c703David 'Digit' Turner 57046be48730333120a7b939116cef075e61c12c703David 'Digit' Turner.L7: 57146be48730333120a7b939116cef075e61c12c703David 'Digit' Turner retn 57246be48730333120a7b939116cef075e61c12c703David 'Digit' Turner 57346be48730333120a7b939116cef075e61c12c703David 'Digit' Turner 57446be48730333120a7b939116cef075e61c12c703David 'Digit' Turner 57546be48730333120a7b939116cef075e61c12c703David 'Digit' Turner 57646be48730333120a7b939116cef075e61c12c703David 'Digit' Turner;; 32 bit RGB 888 to 16 BIT BGR 565 57746be48730333120a7b939116cef075e61c12c703David 'Digit' Turner 57846be48730333120a7b939116cef075e61c12c703David 'Digit' Turner_ConvertX86p32_16BGR565: 57946be48730333120a7b939116cef075e61c12c703David 'Digit' Turner 58046be48730333120a7b939116cef075e61c12c703David 'Digit' Turner ; check short 58146be48730333120a7b939116cef075e61c12c703David 'Digit' Turner cmp ecx,BYTE 16 58246be48730333120a7b939116cef075e61c12c703David 'Digit' Turner ja .L3 58346be48730333120a7b939116cef075e61c12c703David 'Digit' Turner 58446be48730333120a7b939116cef075e61c12c703David 'Digit' Turner.L1 ; short loop 58546be48730333120a7b939116cef075e61c12c703David 'Digit' Turner mov ah,[esi+0] ; blue 58646be48730333120a7b939116cef075e61c12c703David 'Digit' Turner mov al,[esi+1] ; green 58746be48730333120a7b939116cef075e61c12c703David 'Digit' Turner mov bl,[esi+2] ; red 58846be48730333120a7b939116cef075e61c12c703David 'Digit' Turner shr ah,3 58946be48730333120a7b939116cef075e61c12c703David 'Digit' Turner and al,11111100b 59046be48730333120a7b939116cef075e61c12c703David 'Digit' Turner shl eax,3 59146be48730333120a7b939116cef075e61c12c703David 'Digit' Turner shr bl,3 59246be48730333120a7b939116cef075e61c12c703David 'Digit' Turner add al,bl 59346be48730333120a7b939116cef075e61c12c703David 'Digit' Turner mov [edi+0],al 59446be48730333120a7b939116cef075e61c12c703David 'Digit' Turner mov [edi+1],ah 59546be48730333120a7b939116cef075e61c12c703David 'Digit' Turner add esi,BYTE 4 59646be48730333120a7b939116cef075e61c12c703David 'Digit' Turner add edi,BYTE 2 59746be48730333120a7b939116cef075e61c12c703David 'Digit' Turner dec ecx 59846be48730333120a7b939116cef075e61c12c703David 'Digit' Turner jnz .L1 59946be48730333120a7b939116cef075e61c12c703David 'Digit' Turner.L2 60046be48730333120a7b939116cef075e61c12c703David 'Digit' Turner retn 60146be48730333120a7b939116cef075e61c12c703David 'Digit' Turner 60246be48730333120a7b939116cef075e61c12c703David 'Digit' Turner.L3 ; head 60346be48730333120a7b939116cef075e61c12c703David 'Digit' Turner mov ebx,edi 60446be48730333120a7b939116cef075e61c12c703David 'Digit' Turner and ebx,BYTE 11b 60546be48730333120a7b939116cef075e61c12c703David 'Digit' Turner jz .L4 60646be48730333120a7b939116cef075e61c12c703David 'Digit' Turner mov ah,[esi+0] ; blue 60746be48730333120a7b939116cef075e61c12c703David 'Digit' Turner mov al,[esi+1] ; green 60846be48730333120a7b939116cef075e61c12c703David 'Digit' Turner mov bl,[esi+2] ; red 60946be48730333120a7b939116cef075e61c12c703David 'Digit' Turner shr ah,3 61046be48730333120a7b939116cef075e61c12c703David 'Digit' Turner and al,11111100b 61146be48730333120a7b939116cef075e61c12c703David 'Digit' Turner shl eax,3 61246be48730333120a7b939116cef075e61c12c703David 'Digit' Turner shr bl,3 61346be48730333120a7b939116cef075e61c12c703David 'Digit' Turner add al,bl 61446be48730333120a7b939116cef075e61c12c703David 'Digit' Turner mov [edi+0],al 61546be48730333120a7b939116cef075e61c12c703David 'Digit' Turner mov [edi+1],ah 61646be48730333120a7b939116cef075e61c12c703David 'Digit' Turner add esi,BYTE 4 61746be48730333120a7b939116cef075e61c12c703David 'Digit' Turner add edi,BYTE 2 61846be48730333120a7b939116cef075e61c12c703David 'Digit' Turner dec ecx 61946be48730333120a7b939116cef075e61c12c703David 'Digit' Turner 62046be48730333120a7b939116cef075e61c12c703David 'Digit' Turner.L4 ; save count 62146be48730333120a7b939116cef075e61c12c703David 'Digit' Turner push ecx 62246be48730333120a7b939116cef075e61c12c703David 'Digit' Turner 62346be48730333120a7b939116cef075e61c12c703David 'Digit' Turner ; unroll twice 62446be48730333120a7b939116cef075e61c12c703David 'Digit' Turner shr ecx,1 62546be48730333120a7b939116cef075e61c12c703David 'Digit' Turner 62646be48730333120a7b939116cef075e61c12c703David 'Digit' Turner ; point arrays to end 62746be48730333120a7b939116cef075e61c12c703David 'Digit' Turner lea esi,[esi+ecx*8] 62846be48730333120a7b939116cef075e61c12c703David 'Digit' Turner lea edi,[edi+ecx*4] 62946be48730333120a7b939116cef075e61c12c703David 'Digit' Turner 63046be48730333120a7b939116cef075e61c12c703David 'Digit' Turner ; negative count 63146be48730333120a7b939116cef075e61c12c703David 'Digit' Turner neg ecx 63246be48730333120a7b939116cef075e61c12c703David 'Digit' Turner jmp SHORT .L6 63346be48730333120a7b939116cef075e61c12c703David 'Digit' Turner 63446be48730333120a7b939116cef075e61c12c703David 'Digit' Turner.L5 63546be48730333120a7b939116cef075e61c12c703David 'Digit' Turner mov [edi+ecx*4-4],eax 63646be48730333120a7b939116cef075e61c12c703David 'Digit' Turner.L6 63746be48730333120a7b939116cef075e61c12c703David 'Digit' Turner mov edx,[esi+ecx*8+4] 63846be48730333120a7b939116cef075e61c12c703David 'Digit' Turner 63946be48730333120a7b939116cef075e61c12c703David 'Digit' Turner mov bh,[esi+ecx*8+4] 64046be48730333120a7b939116cef075e61c12c703David 'Digit' Turner mov ah,[esi+ecx*8] 64146be48730333120a7b939116cef075e61c12c703David 'Digit' Turner 64246be48730333120a7b939116cef075e61c12c703David 'Digit' Turner shr bh,3 64346be48730333120a7b939116cef075e61c12c703David 'Digit' Turner mov al,[esi+ecx*8+1] 64446be48730333120a7b939116cef075e61c12c703David 'Digit' Turner 64546be48730333120a7b939116cef075e61c12c703David 'Digit' Turner shr ah,3 64646be48730333120a7b939116cef075e61c12c703David 'Digit' Turner mov bl,[esi+ecx*8+5] 64746be48730333120a7b939116cef075e61c12c703David 'Digit' Turner 64846be48730333120a7b939116cef075e61c12c703David 'Digit' Turner shl eax,3 64946be48730333120a7b939116cef075e61c12c703David 'Digit' Turner mov dl,[esi+ecx*8+2] 65046be48730333120a7b939116cef075e61c12c703David 'Digit' Turner 65146be48730333120a7b939116cef075e61c12c703David 'Digit' Turner shl ebx,19 65246be48730333120a7b939116cef075e61c12c703David 'Digit' Turner and eax,0000FFE0h 65346be48730333120a7b939116cef075e61c12c703David 'Digit' Turner 65446be48730333120a7b939116cef075e61c12c703David 'Digit' Turner shr edx,3 65546be48730333120a7b939116cef075e61c12c703David 'Digit' Turner and ebx,0FFE00000h 65646be48730333120a7b939116cef075e61c12c703David 'Digit' Turner 65746be48730333120a7b939116cef075e61c12c703David 'Digit' Turner and edx,001F001Fh 65846be48730333120a7b939116cef075e61c12c703David 'Digit' Turner add eax,ebx 65946be48730333120a7b939116cef075e61c12c703David 'Digit' Turner 66046be48730333120a7b939116cef075e61c12c703David 'Digit' Turner add eax,edx 66146be48730333120a7b939116cef075e61c12c703David 'Digit' Turner inc ecx 66246be48730333120a7b939116cef075e61c12c703David 'Digit' Turner 66346be48730333120a7b939116cef075e61c12c703David 'Digit' Turner jnz .L5 66446be48730333120a7b939116cef075e61c12c703David 'Digit' Turner 66546be48730333120a7b939116cef075e61c12c703David 'Digit' Turner mov [edi+ecx*4-4],eax 66646be48730333120a7b939116cef075e61c12c703David 'Digit' Turner 66746be48730333120a7b939116cef075e61c12c703David 'Digit' Turner ; tail 66846be48730333120a7b939116cef075e61c12c703David 'Digit' Turner pop ecx 66946be48730333120a7b939116cef075e61c12c703David 'Digit' Turner and ecx,BYTE 1 67046be48730333120a7b939116cef075e61c12c703David 'Digit' Turner jz .L7 67146be48730333120a7b939116cef075e61c12c703David 'Digit' Turner mov ah,[esi+0] ; blue 67246be48730333120a7b939116cef075e61c12c703David 'Digit' Turner mov al,[esi+1] ; green 67346be48730333120a7b939116cef075e61c12c703David 'Digit' Turner mov bl,[esi+2] ; red 67446be48730333120a7b939116cef075e61c12c703David 'Digit' Turner shr ah,3 67546be48730333120a7b939116cef075e61c12c703David 'Digit' Turner and al,11111100b 67646be48730333120a7b939116cef075e61c12c703David 'Digit' Turner shl eax,3 67746be48730333120a7b939116cef075e61c12c703David 'Digit' Turner shr bl,3 67846be48730333120a7b939116cef075e61c12c703David 'Digit' Turner add al,bl 67946be48730333120a7b939116cef075e61c12c703David 'Digit' Turner mov [edi+0],al 68046be48730333120a7b939116cef075e61c12c703David 'Digit' Turner mov [edi+1],ah 68146be48730333120a7b939116cef075e61c12c703David 'Digit' Turner add esi,BYTE 4 68246be48730333120a7b939116cef075e61c12c703David 'Digit' Turner add edi,BYTE 2 68346be48730333120a7b939116cef075e61c12c703David 'Digit' Turner 68446be48730333120a7b939116cef075e61c12c703David 'Digit' Turner.L7 68546be48730333120a7b939116cef075e61c12c703David 'Digit' Turner retn 68646be48730333120a7b939116cef075e61c12c703David 'Digit' Turner 68746be48730333120a7b939116cef075e61c12c703David 'Digit' Turner 68846be48730333120a7b939116cef075e61c12c703David 'Digit' Turner 68946be48730333120a7b939116cef075e61c12c703David 'Digit' Turner 69046be48730333120a7b939116cef075e61c12c703David 'Digit' Turner;; 32 BIT RGB TO 16 BIT RGB 555 69146be48730333120a7b939116cef075e61c12c703David 'Digit' Turner 69246be48730333120a7b939116cef075e61c12c703David 'Digit' Turner_ConvertX86p32_16RGB555: 69346be48730333120a7b939116cef075e61c12c703David 'Digit' Turner 69446be48730333120a7b939116cef075e61c12c703David 'Digit' Turner ; check short 69546be48730333120a7b939116cef075e61c12c703David 'Digit' Turner cmp ecx,BYTE 16 69646be48730333120a7b939116cef075e61c12c703David 'Digit' Turner ja .L3 69746be48730333120a7b939116cef075e61c12c703David 'Digit' Turner 69846be48730333120a7b939116cef075e61c12c703David 'Digit' Turner.L1 ; short loop 69946be48730333120a7b939116cef075e61c12c703David 'Digit' Turner mov bl,[esi+0] ; blue 70046be48730333120a7b939116cef075e61c12c703David 'Digit' Turner mov al,[esi+1] ; green 70146be48730333120a7b939116cef075e61c12c703David 'Digit' Turner mov ah,[esi+2] ; red 70246be48730333120a7b939116cef075e61c12c703David 'Digit' Turner shr ah,3 70346be48730333120a7b939116cef075e61c12c703David 'Digit' Turner and al,11111000b 70446be48730333120a7b939116cef075e61c12c703David 'Digit' Turner shl eax,2 70546be48730333120a7b939116cef075e61c12c703David 'Digit' Turner shr bl,3 70646be48730333120a7b939116cef075e61c12c703David 'Digit' Turner add al,bl 70746be48730333120a7b939116cef075e61c12c703David 'Digit' Turner mov [edi+0],al 70846be48730333120a7b939116cef075e61c12c703David 'Digit' Turner mov [edi+1],ah 70946be48730333120a7b939116cef075e61c12c703David 'Digit' Turner add esi,BYTE 4 71046be48730333120a7b939116cef075e61c12c703David 'Digit' Turner add edi,BYTE 2 71146be48730333120a7b939116cef075e61c12c703David 'Digit' Turner dec ecx 71246be48730333120a7b939116cef075e61c12c703David 'Digit' Turner jnz .L1 71346be48730333120a7b939116cef075e61c12c703David 'Digit' Turner.L2 71446be48730333120a7b939116cef075e61c12c703David 'Digit' Turner retn 71546be48730333120a7b939116cef075e61c12c703David 'Digit' Turner 71646be48730333120a7b939116cef075e61c12c703David 'Digit' Turner.L3 ; head 71746be48730333120a7b939116cef075e61c12c703David 'Digit' Turner mov ebx,edi 71846be48730333120a7b939116cef075e61c12c703David 'Digit' Turner and ebx,BYTE 11b 71946be48730333120a7b939116cef075e61c12c703David 'Digit' Turner jz .L4 72046be48730333120a7b939116cef075e61c12c703David 'Digit' Turner mov bl,[esi+0] ; blue 72146be48730333120a7b939116cef075e61c12c703David 'Digit' Turner mov al,[esi+1] ; green 72246be48730333120a7b939116cef075e61c12c703David 'Digit' Turner mov ah,[esi+2] ; red 72346be48730333120a7b939116cef075e61c12c703David 'Digit' Turner shr ah,3 72446be48730333120a7b939116cef075e61c12c703David 'Digit' Turner and al,11111000b 72546be48730333120a7b939116cef075e61c12c703David 'Digit' Turner shl eax,2 72646be48730333120a7b939116cef075e61c12c703David 'Digit' Turner shr bl,3 72746be48730333120a7b939116cef075e61c12c703David 'Digit' Turner add al,bl 72846be48730333120a7b939116cef075e61c12c703David 'Digit' Turner mov [edi+0],al 72946be48730333120a7b939116cef075e61c12c703David 'Digit' Turner mov [edi+1],ah 73046be48730333120a7b939116cef075e61c12c703David 'Digit' Turner add esi,BYTE 4 73146be48730333120a7b939116cef075e61c12c703David 'Digit' Turner add edi,BYTE 2 73246be48730333120a7b939116cef075e61c12c703David 'Digit' Turner dec ecx 73346be48730333120a7b939116cef075e61c12c703David 'Digit' Turner 73446be48730333120a7b939116cef075e61c12c703David 'Digit' Turner.L4 ; save count 73546be48730333120a7b939116cef075e61c12c703David 'Digit' Turner push ecx 73646be48730333120a7b939116cef075e61c12c703David 'Digit' Turner 73746be48730333120a7b939116cef075e61c12c703David 'Digit' Turner ; unroll twice 73846be48730333120a7b939116cef075e61c12c703David 'Digit' Turner shr ecx,1 73946be48730333120a7b939116cef075e61c12c703David 'Digit' Turner 74046be48730333120a7b939116cef075e61c12c703David 'Digit' Turner ; point arrays to end 74146be48730333120a7b939116cef075e61c12c703David 'Digit' Turner lea esi,[esi+ecx*8] 74246be48730333120a7b939116cef075e61c12c703David 'Digit' Turner lea edi,[edi+ecx*4] 74346be48730333120a7b939116cef075e61c12c703David 'Digit' Turner 74446be48730333120a7b939116cef075e61c12c703David 'Digit' Turner ; negative counter 74546be48730333120a7b939116cef075e61c12c703David 'Digit' Turner neg ecx 74646be48730333120a7b939116cef075e61c12c703David 'Digit' Turner jmp SHORT .L6 74746be48730333120a7b939116cef075e61c12c703David 'Digit' Turner 74846be48730333120a7b939116cef075e61c12c703David 'Digit' Turner.L5 74946be48730333120a7b939116cef075e61c12c703David 'Digit' Turner mov [edi+ecx*4-4],eax 75046be48730333120a7b939116cef075e61c12c703David 'Digit' Turner.L6 75146be48730333120a7b939116cef075e61c12c703David 'Digit' Turner mov eax,[esi+ecx*8] 75246be48730333120a7b939116cef075e61c12c703David 'Digit' Turner 75346be48730333120a7b939116cef075e61c12c703David 'Digit' Turner shr ah,3 75446be48730333120a7b939116cef075e61c12c703David 'Digit' Turner mov ebx,[esi+ecx*8+4] 75546be48730333120a7b939116cef075e61c12c703David 'Digit' Turner 75646be48730333120a7b939116cef075e61c12c703David 'Digit' Turner shr eax,3 75746be48730333120a7b939116cef075e61c12c703David 'Digit' Turner mov edx,[esi+ecx*8+4] 75846be48730333120a7b939116cef075e61c12c703David 'Digit' Turner 75946be48730333120a7b939116cef075e61c12c703David 'Digit' Turner shr bh,3 76046be48730333120a7b939116cef075e61c12c703David 'Digit' Turner mov dl,[esi+ecx*8+2] 76146be48730333120a7b939116cef075e61c12c703David 'Digit' Turner 76246be48730333120a7b939116cef075e61c12c703David 'Digit' Turner shl ebx,13 76346be48730333120a7b939116cef075e61c12c703David 'Digit' Turner and eax,000007FFh 76446be48730333120a7b939116cef075e61c12c703David 'Digit' Turner 76546be48730333120a7b939116cef075e61c12c703David 'Digit' Turner shl edx,7 76646be48730333120a7b939116cef075e61c12c703David 'Digit' Turner and ebx,07FF0000h 76746be48730333120a7b939116cef075e61c12c703David 'Digit' Turner 76846be48730333120a7b939116cef075e61c12c703David 'Digit' Turner and edx,07C007C00h 76946be48730333120a7b939116cef075e61c12c703David 'Digit' Turner add eax,ebx 77046be48730333120a7b939116cef075e61c12c703David 'Digit' Turner 77146be48730333120a7b939116cef075e61c12c703David 'Digit' Turner add eax,edx 77246be48730333120a7b939116cef075e61c12c703David 'Digit' Turner inc ecx 77346be48730333120a7b939116cef075e61c12c703David 'Digit' Turner 77446be48730333120a7b939116cef075e61c12c703David 'Digit' Turner jnz .L5 77546be48730333120a7b939116cef075e61c12c703David 'Digit' Turner 77646be48730333120a7b939116cef075e61c12c703David 'Digit' Turner mov [edi+ecx*4-4],eax 77746be48730333120a7b939116cef075e61c12c703David 'Digit' Turner 77846be48730333120a7b939116cef075e61c12c703David 'Digit' Turner ; tail 77946be48730333120a7b939116cef075e61c12c703David 'Digit' Turner pop ecx 78046be48730333120a7b939116cef075e61c12c703David 'Digit' Turner and ecx,BYTE 1 78146be48730333120a7b939116cef075e61c12c703David 'Digit' Turner jz .L7 78246be48730333120a7b939116cef075e61c12c703David 'Digit' Turner mov bl,[esi+0] ; blue 78346be48730333120a7b939116cef075e61c12c703David 'Digit' Turner mov al,[esi+1] ; green 78446be48730333120a7b939116cef075e61c12c703David 'Digit' Turner mov ah,[esi+2] ; red 78546be48730333120a7b939116cef075e61c12c703David 'Digit' Turner shr ah,3 78646be48730333120a7b939116cef075e61c12c703David 'Digit' Turner and al,11111000b 78746be48730333120a7b939116cef075e61c12c703David 'Digit' Turner shl eax,2 78846be48730333120a7b939116cef075e61c12c703David 'Digit' Turner shr bl,3 78946be48730333120a7b939116cef075e61c12c703David 'Digit' Turner add al,bl 79046be48730333120a7b939116cef075e61c12c703David 'Digit' Turner mov [edi+0],al 79146be48730333120a7b939116cef075e61c12c703David 'Digit' Turner mov [edi+1],ah 79246be48730333120a7b939116cef075e61c12c703David 'Digit' Turner add esi,BYTE 4 79346be48730333120a7b939116cef075e61c12c703David 'Digit' Turner add edi,BYTE 2 79446be48730333120a7b939116cef075e61c12c703David 'Digit' Turner 79546be48730333120a7b939116cef075e61c12c703David 'Digit' Turner.L7 79646be48730333120a7b939116cef075e61c12c703David 'Digit' Turner retn 79746be48730333120a7b939116cef075e61c12c703David 'Digit' Turner 79846be48730333120a7b939116cef075e61c12c703David 'Digit' Turner 79946be48730333120a7b939116cef075e61c12c703David 'Digit' Turner 80046be48730333120a7b939116cef075e61c12c703David 'Digit' Turner 80146be48730333120a7b939116cef075e61c12c703David 'Digit' Turner;; 32 BIT RGB TO 16 BIT BGR 555 80246be48730333120a7b939116cef075e61c12c703David 'Digit' Turner 80346be48730333120a7b939116cef075e61c12c703David 'Digit' Turner_ConvertX86p32_16BGR555: 80446be48730333120a7b939116cef075e61c12c703David 'Digit' Turner 80546be48730333120a7b939116cef075e61c12c703David 'Digit' Turner ; check short 80646be48730333120a7b939116cef075e61c12c703David 'Digit' Turner cmp ecx,BYTE 16 80746be48730333120a7b939116cef075e61c12c703David 'Digit' Turner ja .L3 80846be48730333120a7b939116cef075e61c12c703David 'Digit' Turner 80946be48730333120a7b939116cef075e61c12c703David 'Digit' Turner 81046be48730333120a7b939116cef075e61c12c703David 'Digit' Turner.L1 ; short loop 81146be48730333120a7b939116cef075e61c12c703David 'Digit' Turner mov ah,[esi+0] ; blue 81246be48730333120a7b939116cef075e61c12c703David 'Digit' Turner mov al,[esi+1] ; green 81346be48730333120a7b939116cef075e61c12c703David 'Digit' Turner mov bl,[esi+2] ; red 81446be48730333120a7b939116cef075e61c12c703David 'Digit' Turner shr ah,3 81546be48730333120a7b939116cef075e61c12c703David 'Digit' Turner and al,11111000b 81646be48730333120a7b939116cef075e61c12c703David 'Digit' Turner shl eax,2 81746be48730333120a7b939116cef075e61c12c703David 'Digit' Turner shr bl,3 81846be48730333120a7b939116cef075e61c12c703David 'Digit' Turner add al,bl 81946be48730333120a7b939116cef075e61c12c703David 'Digit' Turner mov [edi+0],al 82046be48730333120a7b939116cef075e61c12c703David 'Digit' Turner mov [edi+1],ah 82146be48730333120a7b939116cef075e61c12c703David 'Digit' Turner add esi,BYTE 4 82246be48730333120a7b939116cef075e61c12c703David 'Digit' Turner add edi,BYTE 2 82346be48730333120a7b939116cef075e61c12c703David 'Digit' Turner dec ecx 82446be48730333120a7b939116cef075e61c12c703David 'Digit' Turner jnz .L1 82546be48730333120a7b939116cef075e61c12c703David 'Digit' Turner.L2 82646be48730333120a7b939116cef075e61c12c703David 'Digit' Turner retn 82746be48730333120a7b939116cef075e61c12c703David 'Digit' Turner 82846be48730333120a7b939116cef075e61c12c703David 'Digit' Turner.L3 ; head 82946be48730333120a7b939116cef075e61c12c703David 'Digit' Turner mov ebx,edi 83046be48730333120a7b939116cef075e61c12c703David 'Digit' Turner and ebx,BYTE 11b 83146be48730333120a7b939116cef075e61c12c703David 'Digit' Turner jz .L4 83246be48730333120a7b939116cef075e61c12c703David 'Digit' Turner mov ah,[esi+0] ; blue 83346be48730333120a7b939116cef075e61c12c703David 'Digit' Turner mov al,[esi+1] ; green 83446be48730333120a7b939116cef075e61c12c703David 'Digit' Turner mov bl,[esi+2] ; red 83546be48730333120a7b939116cef075e61c12c703David 'Digit' Turner shr ah,3 83646be48730333120a7b939116cef075e61c12c703David 'Digit' Turner and al,11111000b 83746be48730333120a7b939116cef075e61c12c703David 'Digit' Turner shl eax,2 83846be48730333120a7b939116cef075e61c12c703David 'Digit' Turner shr bl,3 83946be48730333120a7b939116cef075e61c12c703David 'Digit' Turner add al,bl 84046be48730333120a7b939116cef075e61c12c703David 'Digit' Turner mov [edi+0],al 84146be48730333120a7b939116cef075e61c12c703David 'Digit' Turner mov [edi+1],ah 84246be48730333120a7b939116cef075e61c12c703David 'Digit' Turner add esi,BYTE 4 84346be48730333120a7b939116cef075e61c12c703David 'Digit' Turner add edi,BYTE 2 84446be48730333120a7b939116cef075e61c12c703David 'Digit' Turner dec ecx 84546be48730333120a7b939116cef075e61c12c703David 'Digit' Turner 84646be48730333120a7b939116cef075e61c12c703David 'Digit' Turner.L4 ; save count 84746be48730333120a7b939116cef075e61c12c703David 'Digit' Turner push ecx 84846be48730333120a7b939116cef075e61c12c703David 'Digit' Turner 84946be48730333120a7b939116cef075e61c12c703David 'Digit' Turner ; unroll twice 85046be48730333120a7b939116cef075e61c12c703David 'Digit' Turner shr ecx,1 85146be48730333120a7b939116cef075e61c12c703David 'Digit' Turner 85246be48730333120a7b939116cef075e61c12c703David 'Digit' Turner ; point arrays to end 85346be48730333120a7b939116cef075e61c12c703David 'Digit' Turner lea esi,[esi+ecx*8] 85446be48730333120a7b939116cef075e61c12c703David 'Digit' Turner lea edi,[edi+ecx*4] 85546be48730333120a7b939116cef075e61c12c703David 'Digit' Turner 85646be48730333120a7b939116cef075e61c12c703David 'Digit' Turner ; negative counter 85746be48730333120a7b939116cef075e61c12c703David 'Digit' Turner neg ecx 85846be48730333120a7b939116cef075e61c12c703David 'Digit' Turner jmp SHORT .L6 85946be48730333120a7b939116cef075e61c12c703David 'Digit' Turner 86046be48730333120a7b939116cef075e61c12c703David 'Digit' Turner.L5 86146be48730333120a7b939116cef075e61c12c703David 'Digit' Turner mov [edi+ecx*4-4],eax 86246be48730333120a7b939116cef075e61c12c703David 'Digit' Turner.L6 86346be48730333120a7b939116cef075e61c12c703David 'Digit' Turner mov edx,[esi+ecx*8+4] 86446be48730333120a7b939116cef075e61c12c703David 'Digit' Turner 86546be48730333120a7b939116cef075e61c12c703David 'Digit' Turner mov bh,[esi+ecx*8+4] 86646be48730333120a7b939116cef075e61c12c703David 'Digit' Turner mov ah,[esi+ecx*8] 86746be48730333120a7b939116cef075e61c12c703David 'Digit' Turner 86846be48730333120a7b939116cef075e61c12c703David 'Digit' Turner shr bh,3 86946be48730333120a7b939116cef075e61c12c703David 'Digit' Turner mov al,[esi+ecx*8+1] 87046be48730333120a7b939116cef075e61c12c703David 'Digit' Turner 87146be48730333120a7b939116cef075e61c12c703David 'Digit' Turner shr ah,3 87246be48730333120a7b939116cef075e61c12c703David 'Digit' Turner mov bl,[esi+ecx*8+5] 87346be48730333120a7b939116cef075e61c12c703David 'Digit' Turner 87446be48730333120a7b939116cef075e61c12c703David 'Digit' Turner shl eax,2 87546be48730333120a7b939116cef075e61c12c703David 'Digit' Turner mov dl,[esi+ecx*8+2] 87646be48730333120a7b939116cef075e61c12c703David 'Digit' Turner 87746be48730333120a7b939116cef075e61c12c703David 'Digit' Turner shl ebx,18 87846be48730333120a7b939116cef075e61c12c703David 'Digit' Turner and eax,00007FE0h 87946be48730333120a7b939116cef075e61c12c703David 'Digit' Turner 88046be48730333120a7b939116cef075e61c12c703David 'Digit' Turner shr edx,3 88146be48730333120a7b939116cef075e61c12c703David 'Digit' Turner and ebx,07FE00000h 88246be48730333120a7b939116cef075e61c12c703David 'Digit' Turner 88346be48730333120a7b939116cef075e61c12c703David 'Digit' Turner and edx,001F001Fh 88446be48730333120a7b939116cef075e61c12c703David 'Digit' Turner add eax,ebx 88546be48730333120a7b939116cef075e61c12c703David 'Digit' Turner 88646be48730333120a7b939116cef075e61c12c703David 'Digit' Turner add eax,edx 88746be48730333120a7b939116cef075e61c12c703David 'Digit' Turner inc ecx 88846be48730333120a7b939116cef075e61c12c703David 'Digit' Turner 88946be48730333120a7b939116cef075e61c12c703David 'Digit' Turner jnz .L5 89046be48730333120a7b939116cef075e61c12c703David 'Digit' Turner 89146be48730333120a7b939116cef075e61c12c703David 'Digit' Turner mov [edi+ecx*4-4],eax 89246be48730333120a7b939116cef075e61c12c703David 'Digit' Turner 89346be48730333120a7b939116cef075e61c12c703David 'Digit' Turner ; tail 89446be48730333120a7b939116cef075e61c12c703David 'Digit' Turner pop ecx 89546be48730333120a7b939116cef075e61c12c703David 'Digit' Turner and ecx,BYTE 1 89646be48730333120a7b939116cef075e61c12c703David 'Digit' Turner jz .L7 89746be48730333120a7b939116cef075e61c12c703David 'Digit' Turner mov ah,[esi+0] ; blue 89846be48730333120a7b939116cef075e61c12c703David 'Digit' Turner mov al,[esi+1] ; green 89946be48730333120a7b939116cef075e61c12c703David 'Digit' Turner mov bl,[esi+2] ; red 90046be48730333120a7b939116cef075e61c12c703David 'Digit' Turner shr ah,3 90146be48730333120a7b939116cef075e61c12c703David 'Digit' Turner and al,11111000b 90246be48730333120a7b939116cef075e61c12c703David 'Digit' Turner shl eax,2 90346be48730333120a7b939116cef075e61c12c703David 'Digit' Turner shr bl,3 90446be48730333120a7b939116cef075e61c12c703David 'Digit' Turner add al,bl 90546be48730333120a7b939116cef075e61c12c703David 'Digit' Turner mov [edi+0],al 90646be48730333120a7b939116cef075e61c12c703David 'Digit' Turner mov [edi+1],ah 90746be48730333120a7b939116cef075e61c12c703David 'Digit' Turner add esi,BYTE 4 90846be48730333120a7b939116cef075e61c12c703David 'Digit' Turner add edi,BYTE 2 90946be48730333120a7b939116cef075e61c12c703David 'Digit' Turner 91046be48730333120a7b939116cef075e61c12c703David 'Digit' Turner.L7 91146be48730333120a7b939116cef075e61c12c703David 'Digit' Turner retn 91246be48730333120a7b939116cef075e61c12c703David 'Digit' Turner 91346be48730333120a7b939116cef075e61c12c703David 'Digit' Turner 91446be48730333120a7b939116cef075e61c12c703David 'Digit' Turner 91546be48730333120a7b939116cef075e61c12c703David 'Digit' Turner 91646be48730333120a7b939116cef075e61c12c703David 'Digit' Turner 91746be48730333120a7b939116cef075e61c12c703David 'Digit' Turner;; FROM 32 BIT RGB to 8 BIT RGB (rrrgggbbb) 91846be48730333120a7b939116cef075e61c12c703David 'Digit' Turner;; This routine writes FOUR pixels at once (dword) and then, if they exist 91946be48730333120a7b939116cef075e61c12c703David 'Digit' Turner;; the trailing three pixels 92046be48730333120a7b939116cef075e61c12c703David 'Digit' Turner_ConvertX86p32_8RGB332: 92146be48730333120a7b939116cef075e61c12c703David 'Digit' Turner 92246be48730333120a7b939116cef075e61c12c703David 'Digit' Turner 92346be48730333120a7b939116cef075e61c12c703David 'Digit' Turner.L_ALIGNED 92446be48730333120a7b939116cef075e61c12c703David 'Digit' Turner push ecx 92546be48730333120a7b939116cef075e61c12c703David 'Digit' Turner 92646be48730333120a7b939116cef075e61c12c703David 'Digit' Turner shr ecx,2 ; We will draw 4 pixels at once 92746be48730333120a7b939116cef075e61c12c703David 'Digit' Turner jnz .L1 92846be48730333120a7b939116cef075e61c12c703David 'Digit' Turner 92946be48730333120a7b939116cef075e61c12c703David 'Digit' Turner jmp .L2 ; short jump out of range :( 93046be48730333120a7b939116cef075e61c12c703David 'Digit' Turner 93146be48730333120a7b939116cef075e61c12c703David 'Digit' Turner.L1: 93246be48730333120a7b939116cef075e61c12c703David 'Digit' Turner mov eax,[esi] ; first pair of pixels 93346be48730333120a7b939116cef075e61c12c703David 'Digit' Turner mov edx,[esi+4] 93446be48730333120a7b939116cef075e61c12c703David 'Digit' Turner 93546be48730333120a7b939116cef075e61c12c703David 'Digit' Turner shr dl,6 93646be48730333120a7b939116cef075e61c12c703David 'Digit' Turner mov ebx,eax 93746be48730333120a7b939116cef075e61c12c703David 'Digit' Turner 93846be48730333120a7b939116cef075e61c12c703David 'Digit' Turner shr al,6 93946be48730333120a7b939116cef075e61c12c703David 'Digit' Turner and ah,0e0h 94046be48730333120a7b939116cef075e61c12c703David 'Digit' Turner 94146be48730333120a7b939116cef075e61c12c703David 'Digit' Turner shr ebx,16 94246be48730333120a7b939116cef075e61c12c703David 'Digit' Turner and dh,0e0h 94346be48730333120a7b939116cef075e61c12c703David 'Digit' Turner 94446be48730333120a7b939116cef075e61c12c703David 'Digit' Turner shr ah,3 94546be48730333120a7b939116cef075e61c12c703David 'Digit' Turner and bl,0e0h 94646be48730333120a7b939116cef075e61c12c703David 'Digit' Turner 94746be48730333120a7b939116cef075e61c12c703David 'Digit' Turner shr dh,3 94846be48730333120a7b939116cef075e61c12c703David 'Digit' Turner 94946be48730333120a7b939116cef075e61c12c703David 'Digit' Turner or al,bl 95046be48730333120a7b939116cef075e61c12c703David 'Digit' Turner 95146be48730333120a7b939116cef075e61c12c703David 'Digit' Turner mov ebx,edx 95246be48730333120a7b939116cef075e61c12c703David 'Digit' Turner or al,ah 95346be48730333120a7b939116cef075e61c12c703David 'Digit' Turner 95446be48730333120a7b939116cef075e61c12c703David 'Digit' Turner shr ebx,16 95546be48730333120a7b939116cef075e61c12c703David 'Digit' Turner or dl,dh 95646be48730333120a7b939116cef075e61c12c703David 'Digit' Turner 95746be48730333120a7b939116cef075e61c12c703David 'Digit' Turner and bl,0e0h 95846be48730333120a7b939116cef075e61c12c703David 'Digit' Turner 95946be48730333120a7b939116cef075e61c12c703David 'Digit' Turner or dl,bl 96046be48730333120a7b939116cef075e61c12c703David 'Digit' Turner 96146be48730333120a7b939116cef075e61c12c703David 'Digit' Turner mov ah,dl 96246be48730333120a7b939116cef075e61c12c703David 'Digit' Turner 96346be48730333120a7b939116cef075e61c12c703David 'Digit' Turner 96446be48730333120a7b939116cef075e61c12c703David 'Digit' Turner 96546be48730333120a7b939116cef075e61c12c703David 'Digit' Turner mov ebx,[esi+8] ; second pair of pixels 96646be48730333120a7b939116cef075e61c12c703David 'Digit' Turner 96746be48730333120a7b939116cef075e61c12c703David 'Digit' Turner mov edx,ebx 96846be48730333120a7b939116cef075e61c12c703David 'Digit' Turner and bh,0e0h 96946be48730333120a7b939116cef075e61c12c703David 'Digit' Turner 97046be48730333120a7b939116cef075e61c12c703David 'Digit' Turner shr bl,6 97146be48730333120a7b939116cef075e61c12c703David 'Digit' Turner and edx,0e00000h 97246be48730333120a7b939116cef075e61c12c703David 'Digit' Turner 97346be48730333120a7b939116cef075e61c12c703David 'Digit' Turner shr edx,16 97446be48730333120a7b939116cef075e61c12c703David 'Digit' Turner 97546be48730333120a7b939116cef075e61c12c703David 'Digit' Turner shr bh,3 97646be48730333120a7b939116cef075e61c12c703David 'Digit' Turner 97746be48730333120a7b939116cef075e61c12c703David 'Digit' Turner ror eax,16 97846be48730333120a7b939116cef075e61c12c703David 'Digit' Turner or bl,dl 97946be48730333120a7b939116cef075e61c12c703David 'Digit' Turner 98046be48730333120a7b939116cef075e61c12c703David 'Digit' Turner mov edx,[esi+12] 98146be48730333120a7b939116cef075e61c12c703David 'Digit' Turner or bl,bh 98246be48730333120a7b939116cef075e61c12c703David 'Digit' Turner 98346be48730333120a7b939116cef075e61c12c703David 'Digit' Turner mov al,bl 98446be48730333120a7b939116cef075e61c12c703David 'Digit' Turner 98546be48730333120a7b939116cef075e61c12c703David 'Digit' Turner mov ebx,edx 98646be48730333120a7b939116cef075e61c12c703David 'Digit' Turner and dh,0e0h 98746be48730333120a7b939116cef075e61c12c703David 'Digit' Turner 98846be48730333120a7b939116cef075e61c12c703David 'Digit' Turner shr dl,6 98946be48730333120a7b939116cef075e61c12c703David 'Digit' Turner and ebx,0e00000h 99046be48730333120a7b939116cef075e61c12c703David 'Digit' Turner 99146be48730333120a7b939116cef075e61c12c703David 'Digit' Turner shr dh,3 99246be48730333120a7b939116cef075e61c12c703David 'Digit' Turner mov ah,dl 99346be48730333120a7b939116cef075e61c12c703David 'Digit' Turner 99446be48730333120a7b939116cef075e61c12c703David 'Digit' Turner shr ebx,16 99546be48730333120a7b939116cef075e61c12c703David 'Digit' Turner or ah,dh 99646be48730333120a7b939116cef075e61c12c703David 'Digit' Turner 99746be48730333120a7b939116cef075e61c12c703David 'Digit' Turner or ah,bl 99846be48730333120a7b939116cef075e61c12c703David 'Digit' Turner 99946be48730333120a7b939116cef075e61c12c703David 'Digit' Turner rol eax,16 100046be48730333120a7b939116cef075e61c12c703David 'Digit' Turner add esi,BYTE 16 100146be48730333120a7b939116cef075e61c12c703David 'Digit' Turner 100246be48730333120a7b939116cef075e61c12c703David 'Digit' Turner mov [edi],eax 100346be48730333120a7b939116cef075e61c12c703David 'Digit' Turner add edi,BYTE 4 100446be48730333120a7b939116cef075e61c12c703David 'Digit' Turner 100546be48730333120a7b939116cef075e61c12c703David 'Digit' Turner dec ecx 100646be48730333120a7b939116cef075e61c12c703David 'Digit' Turner jz .L2 ; L1 out of range for short jump :( 100746be48730333120a7b939116cef075e61c12c703David 'Digit' Turner 100846be48730333120a7b939116cef075e61c12c703David 'Digit' Turner jmp .L1 100946be48730333120a7b939116cef075e61c12c703David 'Digit' Turner.L2: 101046be48730333120a7b939116cef075e61c12c703David 'Digit' Turner 101146be48730333120a7b939116cef075e61c12c703David 'Digit' Turner pop ecx 101246be48730333120a7b939116cef075e61c12c703David 'Digit' Turner and ecx,BYTE 3 ; mask out number of pixels to draw 101346be48730333120a7b939116cef075e61c12c703David 'Digit' Turner 101446be48730333120a7b939116cef075e61c12c703David 'Digit' Turner jz .L4 ; Nothing to do anymore 101546be48730333120a7b939116cef075e61c12c703David 'Digit' Turner 101646be48730333120a7b939116cef075e61c12c703David 'Digit' Turner.L3: 101746be48730333120a7b939116cef075e61c12c703David 'Digit' Turner mov eax,[esi] ; single pixel conversion for trailing pixels 101846be48730333120a7b939116cef075e61c12c703David 'Digit' Turner 101946be48730333120a7b939116cef075e61c12c703David 'Digit' Turner mov ebx,eax 102046be48730333120a7b939116cef075e61c12c703David 'Digit' Turner 102146be48730333120a7b939116cef075e61c12c703David 'Digit' Turner shr al,6 102246be48730333120a7b939116cef075e61c12c703David 'Digit' Turner and ah,0e0h 102346be48730333120a7b939116cef075e61c12c703David 'Digit' Turner 102446be48730333120a7b939116cef075e61c12c703David 'Digit' Turner shr ebx,16 102546be48730333120a7b939116cef075e61c12c703David 'Digit' Turner 102646be48730333120a7b939116cef075e61c12c703David 'Digit' Turner shr ah,3 102746be48730333120a7b939116cef075e61c12c703David 'Digit' Turner and bl,0e0h 102846be48730333120a7b939116cef075e61c12c703David 'Digit' Turner 102946be48730333120a7b939116cef075e61c12c703David 'Digit' Turner or al,ah 103046be48730333120a7b939116cef075e61c12c703David 'Digit' Turner or al,bl 103146be48730333120a7b939116cef075e61c12c703David 'Digit' Turner 103246be48730333120a7b939116cef075e61c12c703David 'Digit' Turner mov [edi],al 103346be48730333120a7b939116cef075e61c12c703David 'Digit' Turner 103446be48730333120a7b939116cef075e61c12c703David 'Digit' Turner inc edi 103546be48730333120a7b939116cef075e61c12c703David 'Digit' Turner add esi,BYTE 4 103646be48730333120a7b939116cef075e61c12c703David 'Digit' Turner 103746be48730333120a7b939116cef075e61c12c703David 'Digit' Turner dec ecx 103846be48730333120a7b939116cef075e61c12c703David 'Digit' Turner jnz .L3 103946be48730333120a7b939116cef075e61c12c703David 'Digit' Turner 104046be48730333120a7b939116cef075e61c12c703David 'Digit' Turner.L4: 104146be48730333120a7b939116cef075e61c12c703David 'Digit' Turner retn 104246be48730333120a7b939116cef075e61c12c703David 'Digit' Turner 104346be48730333120a7b939116cef075e61c12c703David 'Digit' Turner%ifidn __OUTPUT_FORMAT__,elf 104446be48730333120a7b939116cef075e61c12c703David 'Digit' Turnersection .note.GNU-stack noalloc noexec nowrite progbits 104546be48730333120a7b939116cef075e61c12c703David 'Digit' Turner%endif 1046