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