19682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall;
29682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall; x86 format converters for HERMES
39682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall; Copyright (c) 1998 Glenn Fielder (gaffer@gaffer.org)
49682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall; This source code is licensed under the GNU LGPL
59682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall; 
69682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall; Please refer to the file COPYING.LIB contained in the distribution for
79682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall; licensing conditions		
89682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall; 
99682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall; Routines adjusted for Hermes by Christian Nentwich (brn@eleet.mcb.at)
109682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall; Used with permission.
119682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall; 
129682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall
139682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse HallBITS 32
149682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall
159682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall%include "common.inc"
169682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall
179682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse HallSDL_FUNC _ConvertX86p16_16BGR565
189682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse HallSDL_FUNC _ConvertX86p16_16RGB555
199682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse HallSDL_FUNC _ConvertX86p16_16BGR555
209682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse HallSDL_FUNC _ConvertX86p16_8RGB332
219682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall
229682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse HallEXTERN _ConvertX86
239682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall
249682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse HallSECTION .text
259682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall
269682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall_ConvertX86p16_16BGR565:
279682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall
289682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall    ; check short
299682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall    cmp ecx,BYTE 16
309682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall    ja .L3
319682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall
329682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall
339682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall.L1: ; short loop
349682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall    mov al,[esi]
359682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall    mov ah,[esi+1]
369682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall    mov ebx,eax
379682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall    mov edx,eax
389682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall    shr eax,11
399682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall    and eax,BYTE 11111b
409682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall    and ebx,11111100000b
419682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall    shl edx,11
429682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall    add eax,ebx
439682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall    add eax,edx
449682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall    mov [edi],al
459682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall    mov [edi+1],ah
469682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall    add esi,BYTE 2
479682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall    add edi,BYTE 2
489682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall    dec ecx
499682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall    jnz .L1
509682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall.L2:
519682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall    retn
529682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall
539682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall.L3: ; head
549682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall    mov eax,edi
559682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall    and eax,BYTE 11b
569682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall    jz .L4
579682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall    mov al,[esi]
589682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall    mov ah,[esi+1]
599682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall    mov ebx,eax
609682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall    mov edx,eax
619682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall    shr eax,11
629682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall    and eax,BYTE 11111b
639682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall    and ebx,11111100000b
649682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall    shl edx,11
659682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall    add eax,ebx
669682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall    add eax,edx
679682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall    mov [edi],al
689682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall    mov [edi+1],ah
699682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall    add esi,BYTE 2
709682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall    add edi,BYTE 2
719682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall    dec ecx
729682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall
739682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall.L4: ; save count
749682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall    push ecx
759682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall
769682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall    ; unroll twice
779682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall    shr ecx,1
789682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall    
799682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall    ; point arrays to end
809682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall    lea esi,[esi+ecx*4]
819682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall    lea edi,[edi+ecx*4]
829682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall
839682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall    ; negative counter 
849682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall    neg ecx
859682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall    jmp SHORT .L6
869682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall                              
879682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall.L5:    mov [edi+ecx*4-4],eax
889682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall.L6:    mov eax,[esi+ecx*4]
899682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall
909682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall        mov ebx,[esi+ecx*4]
919682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall        and eax,07E007E0h         
929682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall
939682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall        mov edx,[esi+ecx*4]
949682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall        and ebx,0F800F800h
959682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall
969682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall        shr ebx,11
979682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall        and edx,001F001Fh
989682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall
999682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall        shl edx,11
1009682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall        add eax,ebx
1019682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall
1029682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall        add eax,edx                 
1039682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall        inc ecx
1049682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall
1059682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall        jnz .L5                 
1069682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall         
1079682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall    mov [edi+ecx*4-4],eax
1089682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall
1099682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall    ; tail
1109682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall    pop ecx
1119682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall    and ecx,BYTE 1
1129682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall    jz .L7
1139682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall    mov al,[esi]
1149682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall    mov ah,[esi+1]
1159682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall    mov ebx,eax
1169682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall    mov edx,eax
1179682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall    shr eax,11
1189682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall    and eax,BYTE 11111b
1199682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall    and ebx,11111100000b
1209682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall    shl edx,11
1219682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall    add eax,ebx
1229682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall    add eax,edx
1239682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall    mov [edi],al
1249682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall    mov [edi+1],ah
1259682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall    add esi,BYTE 2
1269682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall    add edi,BYTE 2
1279682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall
1289682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall.L7:
1299682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall    retn
1309682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall
1319682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall
1329682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall
1339682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall
1349682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall
1359682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall
1369682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall_ConvertX86p16_16RGB555:
1379682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall
1389682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall    ; check short
1399682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall    cmp ecx,BYTE 32
1409682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall    ja .L3
1419682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall
1429682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall
1439682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall.L1: ; short loop
1449682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall    mov al,[esi]
1459682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall    mov ah,[esi+1]
1469682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall    mov ebx,eax
1479682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall    shr ebx,1
1489682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall    and ebx,     0111111111100000b
1499682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall    and eax,BYTE 0000000000011111b
1509682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall    add eax,ebx
1519682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall    mov [edi],al
1529682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall    mov [edi+1],ah
1539682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall    add esi,BYTE 2
1549682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall    add edi,BYTE 2
1559682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall    dec ecx
1569682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall    jnz .L1
1579682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall.L2:
1589682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall    retn
1599682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall
1609682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall.L3: ; head
1619682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall    mov eax,edi
1629682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall    and eax,BYTE 11b
1639682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall    jz .L4
1649682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall    mov al,[esi]
1659682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall    mov ah,[esi+1]
1669682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall    mov ebx,eax
1679682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall    shr ebx,1
1689682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall    and ebx,     0111111111100000b
1699682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall    and eax,BYTE 0000000000011111b
1709682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall    add eax,ebx
1719682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall    mov [edi],al
1729682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall    mov [edi+1],ah
1739682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall    add esi,BYTE 2
1749682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall    add edi,BYTE 2
1759682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall    dec ecx
1769682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall
1779682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall.L4: ; save ebp
1789682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall    push ebp
1799682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall
1809682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall    ; save count
1819682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall    push ecx
1829682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall
1839682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall    ; unroll four times
1849682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall    shr ecx,2
1859682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall    
1869682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall    ; point arrays to end
1879682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall    lea esi,[esi+ecx*8]
1889682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall    lea edi,[edi+ecx*8]
1899682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall
1909682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall    ; negative counter 
1919682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall    xor ebp,ebp
1929682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall    sub ebp,ecx
1939682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall
1949682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall.L5:    mov eax,[esi+ebp*8]        ; agi?
1959682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall        mov ecx,[esi+ebp*8+4]
1969682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall       
1979682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall        mov ebx,eax
1989682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall        mov edx,ecx
1999682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall
2009682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall        and eax,0FFC0FFC0h
2019682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall        and ecx,0FFC0FFC0h
2029682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall
2039682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall        shr eax,1
2049682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall        and ebx,001F001Fh
2059682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall
2069682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall        shr ecx,1
2079682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall        and edx,001F001Fh
2089682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall
2099682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall        add eax,ebx
2109682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall        add ecx,edx
2119682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall
2129682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall        mov [edi+ebp*8],eax
2139682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall        mov [edi+ebp*8+4],ecx
2149682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall
2159682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall        inc ebp
2169682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall        jnz .L5                 
2179682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall
2189682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall    ; tail
2199682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall    pop ecx
2209682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall.L6: and ecx,BYTE 11b
2219682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall    jz .L7
2229682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall    mov al,[esi]
2239682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall    mov ah,[esi+1]
2249682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall    mov ebx,eax
2259682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall    shr ebx,1
2269682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall    and ebx,     0111111111100000b
2279682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall    and eax,BYTE 0000000000011111b
2289682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall    add eax,ebx
2299682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall    mov [edi],al
2309682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall    mov [edi+1],ah
2319682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall    add esi,BYTE 2
2329682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall    add edi,BYTE 2
2339682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall    dec ecx
2349682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall    jmp SHORT .L6
2359682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall
2369682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall.L7: pop ebp
2379682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall    retn
2389682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall
2399682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall
2409682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall
2419682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall
2429682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall
2439682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall
2449682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall_ConvertX86p16_16BGR555:
2459682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall
2469682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall    ; check short
2479682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall    cmp ecx,BYTE 16
2489682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall    ja .L3
2499682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall
2509682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall	
2519682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall.L1: ; short loop
2529682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall    mov al,[esi]
2539682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall    mov ah,[esi+1]
2549682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall    mov ebx,eax
2559682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall    mov edx,eax
2569682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall    shr eax,11
2579682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall    and eax,BYTE 11111b
2589682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall    shr ebx,1
2599682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall    and ebx,1111100000b
2609682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall    shl edx,10
2619682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall    and edx,0111110000000000b
2629682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall    add eax,ebx
2639682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall    add eax,edx
2649682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall    mov [edi],al
2659682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall    mov [edi+1],ah
2669682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall    add esi,BYTE 2
2679682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall    add edi,BYTE 2
2689682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall    dec ecx
2699682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall    jnz .L1
2709682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall.L2:
2719682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall    retn
2729682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall
2739682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall.L3: ; head
2749682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall    mov eax,edi
2759682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall    and eax,BYTE 11b
2769682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall    jz .L4
2779682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall    mov al,[esi]
2789682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall    mov ah,[esi+1]
2799682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall    mov ebx,eax
2809682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall    mov edx,eax
2819682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall    shr eax,11
2829682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall    and eax,BYTE 11111b
2839682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall    shr ebx,1
2849682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall    and ebx,1111100000b
2859682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall    shl edx,10
2869682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall    and edx,0111110000000000b
2879682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall    add eax,ebx
2889682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall    add eax,edx
2899682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall    mov [edi],al
2909682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall    mov [edi+1],ah
2919682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall    add esi,BYTE 2
2929682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall    add edi,BYTE 2
2939682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall    dec ecx
2949682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall
2959682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall.L4: ; save count
2969682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall    push ecx
2979682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall
2989682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall    ; unroll twice
2999682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall    shr ecx,1
3009682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall    
3019682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall    ; point arrays to end
3029682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall    lea esi,[esi+ecx*4]
3039682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall    lea edi,[edi+ecx*4]
3049682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall
3059682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall    ; negative counter 
3069682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall    neg ecx
3079682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall    jmp SHORT .L6
3089682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall                              
3099682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall.L5:     mov [edi+ecx*4-4],eax
3109682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall.L6:     mov eax,[esi+ecx*4]
3119682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall
3129682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall        shr eax,1
3139682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall        mov ebx,[esi+ecx*4]
3149682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall        
3159682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall        and eax,03E003E0h         
3169682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall        mov edx,[esi+ecx*4]
3179682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall
3189682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall        and ebx,0F800F800h
3199682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall
3209682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall        shr ebx,11
3219682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall        and edx,001F001Fh
3229682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall
3239682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall        shl edx,10
3249682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall        add eax,ebx
3259682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall
3269682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall        add eax,edx                 
3279682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall        inc ecx
3289682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall
3299682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall        jnz .L5                 
3309682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall         
3319682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall    mov [edi+ecx*4-4],eax
3329682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall
3339682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall    ; tail
3349682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall    pop ecx
3359682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall    and ecx,BYTE 1
3369682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall    jz .L7
3379682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall    mov al,[esi]
3389682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall    mov ah,[esi+1]
3399682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall    mov ebx,eax
3409682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall    mov edx,eax
3419682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall    shr eax,11
3429682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall    and eax,BYTE 11111b
3439682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall    shr ebx,1
3449682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall    and ebx,1111100000b
3459682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall    shl edx,10
3469682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall    and edx,0111110000000000b
3479682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall    add eax,ebx
3489682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall    add eax,edx
3499682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall    mov [edi],al
3509682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall    mov [edi+1],ah
3519682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall    add esi,BYTE 2
3529682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall    add edi,BYTE 2
3539682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall
3549682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall.L7:
3559682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall    retn
3569682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall
3579682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall
3589682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall
3599682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall
3609682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall
3619682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall
3629682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall_ConvertX86p16_8RGB332:
3639682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall
3649682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall    ; check short
3659682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall    cmp ecx,BYTE 16
3669682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall    ja .L3
3679682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall
3689682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall
3699682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall.L1: ; short loop
3709682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall    mov al,[esi+0]
3719682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall    mov ah,[esi+1]
3729682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall    mov ebx,eax
3739682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall    mov edx,eax
3749682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall    and eax,BYTE 11000b         ; blue
3759682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall    shr eax,3
3769682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall    and ebx,11100000000b        ; green
3779682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall    shr ebx,6
3789682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall    and edx,1110000000000000b   ; red
3799682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall    shr edx,8
3809682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall    add eax,ebx
3819682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall    add eax,edx
3829682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall    mov [edi],al
3839682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall    add esi,BYTE 2
3849682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall    inc edi
3859682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall    dec ecx
3869682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall    jnz .L1
3879682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall.L2:
3889682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall    retn
3899682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall
3909682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall.L3: mov eax,edi
3919682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall    and eax,BYTE 11b
3929682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall    jz .L4
3939682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall    mov al,[esi+0]
3949682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall    mov ah,[esi+1]
3959682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall    mov ebx,eax
3969682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall    mov edx,eax
3979682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall    and eax,BYTE 11000b         ; blue
3989682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall    shr eax,3
3999682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall    and ebx,11100000000b        ; green
4009682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall    shr ebx,6
4019682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall    and edx,1110000000000000b   ; red
4029682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall    shr edx,8
4039682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall    add eax,ebx
4049682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall    add eax,edx
4059682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall    mov [edi],al
4069682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall    add esi,BYTE 2
4079682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall    inc edi
4089682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall    dec ecx
4099682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall    jmp SHORT .L3
4109682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall
4119682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall.L4: ; save ebp
4129682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall    push ebp
4139682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall
4149682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall    ; save count
4159682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall    push ecx
4169682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall
4179682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall    ; unroll 4 times
4189682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall    shr ecx,2
4199682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall
4209682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall    ; prestep
4219682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall    mov dl,[esi+0]
4229682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall    mov bl,[esi+1]
4239682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall    mov dh,[esi+2]
4249682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall        
4259682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall.L5:     shl edx,16
4269682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall        mov bh,[esi+3]
4279682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall        
4289682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall        shl ebx,16
4299682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall        mov dl,[esi+4]
4309682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall
4319682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall        mov dh,[esi+6]
4329682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall        mov bl,[esi+5]
4339682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall
4349682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall        and edx,00011000000110000001100000011000b
4359682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall        mov bh,[esi+7]
4369682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall
4379682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall        ror edx,16+3
4389682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall        mov eax,ebx                                     ; setup eax for reds
4399682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall
4409682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall        and ebx,00000111000001110000011100000111b
4419682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall        and eax,11100000111000001110000011100000b       ; reds
4429682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall
4439682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall        ror ebx,16-2
4449682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall        add esi,BYTE 8
4459682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall
4469682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall        ror eax,16
4479682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall        add edi,BYTE 4
4489682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall
4499682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall        add eax,ebx
4509682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall        mov bl,[esi+1]                                  ; greens
4519682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall
4529682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall        add eax,edx
4539682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall        mov dl,[esi+0]                                  ; blues
4549682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall
4559682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall        mov [edi-4],eax
4569682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall        mov dh,[esi+2]
4579682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall
4589682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall        dec ecx
4599682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall        jnz .L5                 
4609682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall    
4619682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall    ; check tail
4629682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall    pop ecx
4639682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall    and ecx,BYTE 11b
4649682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall    jz .L7
4659682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall
4669682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall.L6: ; tail
4679682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall    mov al,[esi+0]
4689682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall    mov ah,[esi+1]
4699682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall    mov ebx,eax
4709682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall    mov edx,eax
4719682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall    and eax,BYTE 11000b         ; blue
4729682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall    shr eax,3
4739682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall    and ebx,11100000000b        ; green
4749682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall    shr ebx,6
4759682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall    and edx,1110000000000000b   ; red
4769682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall    shr edx,8
4779682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall    add eax,ebx
4789682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall    add eax,edx
4799682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall    mov [edi],al
4809682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall    add esi,BYTE 2
4819682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall    inc edi
4829682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall    dec ecx
4839682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall    jnz .L6
4849682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall
4859682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall.L7: pop ebp
4869682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall    retn
4879682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall
4889682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall%ifidn __OUTPUT_FORMAT__,elf32
4899682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hallsection .note.GNU-stack noalloc noexec nowrite progbits
4909682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall%endif
491