x86p_32.asm
上传用户:sun1608
上传日期:2007-02-02
资源大小:6116k
文件大小:17k
源码类别:

流媒体/Mpeg4/MP4

开发平台:

Visual C++

  1. ;
  2. ; x86 format converters for HERMES
  3. ; Some routines Copyright (c) 1998 Christian Nentwich (brn@eleet.mcb.at)
  4. ; This source code is licensed under the GNU LGPL
  5. ; Please refer to the file COPYING.LIB contained in the distribution for
  6. ; licensing conditions
  7. ;
  8. ; Most routines are (c) Glenn Fiedler (ptc@gaffer.org), used with permission
  9. BITS 32
  10. GLOBAL _ConvertX86p32_32BGR888
  11. GLOBAL _ConvertX86p32_32RGBA888
  12. GLOBAL _ConvertX86p32_32BGRA888
  13. GLOBAL _ConvertX86p32_24RGB888
  14. GLOBAL _ConvertX86p32_24BGR888
  15. GLOBAL _ConvertX86p32_16RGB565
  16. GLOBAL _ConvertX86p32_16BGR565
  17. GLOBAL _ConvertX86p32_16RGB555
  18. GLOBAL _ConvertX86p32_16BGR555
  19. GLOBAL _ConvertX86p32_8RGB332
  20. EXTERN _x86return
  21. SECTION .text
  22. ;; _Convert_*
  23. ;; Paramters:
  24. ;;   ESI = source 
  25. ;;   EDI = dest
  26. ;;   ECX = amount (NOT 0!!! (the _ConvertX86 routine checks for that though))
  27. ;; Destroys:
  28. ;;   EAX, EBX, EDX
  29. _ConvertX86p32_32BGR888:
  30.     ; check short
  31.     cmp ecx,BYTE 32
  32.     ja .L3
  33. .L1 ; short loop
  34.     mov edx,[esi]
  35.     bswap edx
  36.     ror edx,8
  37.     mov [edi],edx
  38.     add esi,BYTE 4
  39.     add edi,BYTE 4
  40.     dec ecx
  41.     jnz .L1
  42. .L2
  43.     jmp _x86return
  44. .L3 ; save ebp
  45.     push ebp
  46.     ; unroll four times
  47.     mov ebp,ecx
  48.     shr ebp,2
  49.     
  50.     ; save count
  51.     push ecx
  52. .L4     mov eax,[esi]
  53.         mov ebx,[esi+4]
  54.         bswap eax
  55.         bswap ebx
  56.         ror eax,8
  57.         mov ecx,[esi+8]
  58.         ror ebx,8
  59.         mov edx,[esi+12]
  60.         bswap ecx
  61.         bswap edx
  62.         ror ecx,8
  63.         mov [edi+0],eax
  64.         ror edx,8
  65.         mov [edi+4],ebx
  66.         mov [edi+8],ecx
  67.         mov [edi+12],edx
  68.         add esi,BYTE 16
  69.         add edi,BYTE 16
  70.         dec ebp
  71.         jnz .L4                 
  72.     ; check tail
  73.     pop ecx
  74.     and ecx,BYTE 11b
  75.     jz .L6
  76. .L5 ; tail loop
  77.     mov edx,[esi]
  78.     bswap edx
  79.     ror edx,8
  80.     mov [edi],edx
  81.     add esi,BYTE 4
  82.     add edi,BYTE 4
  83.     dec ecx
  84.     jnz .L5
  85. .L6 pop ebp
  86.     jmp _x86return
  87. _ConvertX86p32_32RGBA888:
  88.     ; check short
  89.     cmp ecx,BYTE 32
  90.     ja .L3
  91. .L1 ; short loop
  92.     mov edx,[esi]
  93.     rol edx,8
  94.     mov [edi],edx
  95.     add esi,BYTE 4
  96.     add edi,BYTE 4
  97.     dec ecx
  98.     jnz .L1
  99. .L2
  100.     jmp _x86return
  101. .L3 ; save ebp
  102.     push ebp
  103.     ; unroll four times
  104.     mov ebp,ecx
  105.     shr ebp,2
  106.     
  107.     ; save count
  108.     push ecx
  109. .L4     mov eax,[esi]
  110.         mov ebx,[esi+4]
  111.         rol eax,8
  112.         mov ecx,[esi+8]
  113.         rol ebx,8
  114.         mov edx,[esi+12]
  115.         rol ecx,8
  116.         mov [edi+0],eax
  117.         rol edx,8
  118.         mov [edi+4],ebx
  119.         mov [edi+8],ecx
  120.         mov [edi+12],edx
  121.         add esi,BYTE 16
  122.         add edi,BYTE 16
  123.         dec ebp
  124.         jnz .L4                 
  125.     ; check tail
  126.     pop ecx
  127.     and ecx,BYTE 11b
  128.     jz .L6
  129. .L5 ; tail loop
  130.     mov edx,[esi]
  131.     rol edx,8
  132.     mov [edi],edx
  133.     add esi,BYTE 4
  134.     add edi,BYTE 4
  135.     dec ecx
  136.     jnz .L5
  137. .L6 pop ebp
  138.     jmp _x86return
  139. _ConvertX86p32_32BGRA888:
  140.     ; check short
  141.     cmp ecx,BYTE 32
  142.     ja .L3
  143. .L1 ; short loop
  144.     mov edx,[esi]
  145.     bswap edx
  146.     mov [edi],edx
  147.     add esi,BYTE 4
  148.     add edi,BYTE 4
  149.     dec ecx
  150.     jnz .L1
  151. .L2
  152.     jmp _x86return
  153. .L3 ; save ebp
  154.     push ebp
  155.     ; unroll four times
  156.     mov ebp,ecx
  157.     shr ebp,2
  158.     
  159.     ; save count
  160.     push ecx
  161. .L4     mov eax,[esi]
  162.         mov ebx,[esi+4]
  163.         mov ecx,[esi+8]
  164.         mov edx,[esi+12]
  165.         bswap eax
  166.         bswap ebx
  167.         bswap ecx
  168.         bswap edx
  169.         mov [edi+0],eax
  170.         mov [edi+4],ebx
  171.         mov [edi+8],ecx
  172.         mov [edi+12],edx
  173.         add esi,BYTE 16
  174.         add edi,BYTE 16
  175.         dec ebp
  176.         jnz .L4                 
  177.     ; check tail
  178.     pop ecx
  179.     and ecx,BYTE 11b
  180.     jz .L6
  181. .L5 ; tail loop
  182.     mov edx,[esi]
  183.     bswap edx
  184.     mov [edi],edx
  185.     add esi,BYTE 4
  186.     add edi,BYTE 4
  187.     dec ecx
  188.     jnz .L5
  189. .L6 pop ebp
  190.     jmp _x86return
  191. ;; 32 bit RGB 888 to 24 BIT RGB 888
  192. _ConvertX86p32_24RGB888:
  193. ; check short
  194. cmp ecx,BYTE 32
  195. ja .L3
  196. .L1 ; short loop
  197. mov al,[esi]
  198. mov bl,[esi+1]
  199. mov dl,[esi+2]
  200. mov [edi],al
  201. mov [edi+1],bl
  202. mov [edi+2],dl
  203. add esi,BYTE 4
  204. add edi,BYTE 3
  205. dec ecx
  206. jnz .L1
  207. .L2 
  208. jmp _x86return
  209. .L3 ;  head
  210. mov edx,edi
  211. and edx,BYTE 11b
  212. jz .L4
  213. mov al,[esi]
  214. mov bl,[esi+1]
  215. mov dl,[esi+2]
  216. mov [edi],al
  217. mov [edi+1],bl
  218. mov [edi+2],dl
  219. add esi,BYTE 4
  220. add edi,BYTE 3
  221. dec ecx
  222. jmp SHORT .L3
  223. .L4 ; unroll 4 times
  224. push ebp
  225. mov ebp,ecx
  226. shr ebp,2
  227.     ; save count
  228. push ecx
  229. .L5     mov eax,[esi]                   ; first dword            eax = [A][R][G][B]
  230.         mov ebx,[esi+4]                 ; second dword           ebx = [a][r][g][b]
  231.         shl eax,8                       ;                        eax = [R][G][B][.]
  232.         mov ecx,[esi+12]                ; third dword            ecx = [a][r][g][b]
  233.         shl ebx,8                       ;                        ebx = [r][g][b][.]
  234.         mov al,[esi+4]                  ;                        eax = [R][G][B][b]
  235.         ror eax,8                       ;                        eax = [b][R][G][B] (done)
  236.         mov bh,[esi+8+1]                ;                        ebx = [r][g][G][.]
  237.         mov [edi],eax
  238.         add edi,BYTE 3*4
  239.         shl ecx,8                       ;                        ecx = [r][g][b][.]
  240.         mov bl,[esi+8+0]                ;                        ebx = [r][g][G][B]
  241.         rol ebx,16                      ;                        ebx = [G][B][r][g] (done)
  242.         mov cl,[esi+8+2]                ;                        ecx = [r][g][b][R] (done)
  243.         mov [edi+4-3*4],ebx
  244.         add esi,BYTE 4*4
  245.         
  246.         mov [edi+8-3*4],ecx
  247.         dec ebp
  248.         jnz .L5
  249.     ; check tail
  250. pop ecx
  251. and ecx,BYTE 11b
  252. jz .L7
  253. .L6 ; tail loop
  254. mov al,[esi]
  255. mov bl,[esi+1]
  256. mov dl,[esi+2]
  257. mov [edi],al
  258. mov [edi+1],bl
  259. mov [edi+2],dl
  260. add esi,BYTE 4
  261. add edi,BYTE 3
  262. dec ecx
  263. jnz .L6
  264. .L7 pop ebp
  265. jmp _x86return
  266. ;; 32 bit RGB 888 to 24 bit BGR 888
  267. _ConvertX86p32_24BGR888:
  268. ; check short
  269. cmp ecx,BYTE 32
  270. ja .L3
  271. .L1 ; short loop
  272. mov dl,[esi]
  273. mov bl,[esi+1]
  274. mov al,[esi+2]
  275. mov [edi],al
  276. mov [edi+1],bl
  277. mov [edi+2],dl
  278. add esi,BYTE 4
  279. add edi,BYTE 3
  280. dec ecx
  281. jnz .L1
  282. .L2
  283. jmp _x86return
  284. .L3 ; head
  285. mov edx,edi
  286. and edx,BYTE 11b
  287. jz .L4
  288. mov dl,[esi]
  289. mov bl,[esi+1]
  290. mov al,[esi+2]
  291. mov [edi],al
  292. mov [edi+1],bl
  293. mov [edi+2],dl
  294. add esi,BYTE 4
  295. add edi,BYTE 3
  296. dec ecx
  297. jmp SHORT .L3
  298. .L4 ; unroll 4 times
  299. push ebp
  300. mov ebp,ecx
  301. shr ebp,2
  302. ; save count
  303. push ecx
  304. .L5     
  305. mov eax,[esi]                   ; first dword            eax = [A][R][G][B]
  306.         mov ebx,[esi+4]                 ; second dword           ebx = [a][r][g][b]
  307.         
  308.         bswap eax                       ;                        eax = [B][G][R][A]
  309.         bswap ebx                       ;                        ebx = [b][g][r][a]
  310.         mov al,[esi+4+2]                ;                        eax = [B][G][R][r] 
  311.         mov bh,[esi+4+4+1]              ;                        ebx = [b][g][G][a]
  312.         ror eax,8                       ;                        eax = [r][B][G][R] (done)
  313.         mov bl,[esi+4+4+2]              ;                        ebx = [b][g][G][R]
  314.         ror ebx,16                      ;                        ebx = [G][R][b][g] (done)
  315.         mov [edi],eax
  316.     
  317.         mov [edi+4],ebx
  318.         mov ecx,[esi+12]                ; third dword            ecx = [a][r][g][b]
  319.         
  320.         bswap ecx                       ;                        ecx = [b][g][r][a]
  321.         
  322.         mov cl,[esi+8]                  ;                        ecx = [b][g][r][B] (done)
  323.         add esi,BYTE 4*4
  324.         mov [edi+8],ecx
  325.         add edi,BYTE 3*4
  326.         dec ebp
  327.         jnz .L5
  328. ; check tail
  329. pop ecx
  330. and ecx,BYTE 11b
  331. jz .L7
  332. .L6 ; tail loop
  333. mov dl,[esi]
  334. mov bl,[esi+1]
  335. mov al,[esi+2]
  336. mov [edi],al
  337. mov [edi+1],bl
  338. mov [edi+2],dl
  339. add esi,BYTE 4
  340. add edi,BYTE 3
  341. dec ecx
  342. jnz .L6
  343. .L7 
  344. pop ebp
  345. jmp _x86return
  346.  
  347. ;; 32 bit RGB 888 to 16 BIT RGB 565 
  348. _ConvertX86p32_16RGB565:
  349. ; check short
  350. cmp ecx,BYTE 16
  351. ja .L3
  352. .L1 ; short loop
  353. mov bl,[esi+0]    ; blue
  354. mov al,[esi+1]    ; green
  355. mov ah,[esi+2]    ; red
  356. shr ah,3
  357.         and al,11111100b
  358. shl eax,3
  359. shr bl,3
  360. add al,bl
  361. mov [edi+0],al
  362. mov [edi+1],ah
  363. add esi,BYTE 4
  364. add edi,BYTE 2
  365. dec ecx
  366. jnz .L1
  367. .L2: ; End of short loop
  368. jmp _x86return
  369. .L3 ; head
  370. mov ebx,edi
  371. and ebx,BYTE 11b
  372. jz .L4
  373. mov bl,[esi+0]    ; blue
  374. mov al,[esi+1]    ; green
  375. mov ah,[esi+2]    ; red
  376. shr ah,3
  377. and al,11111100b
  378. shl eax,3
  379. shr bl,3
  380. add al,bl
  381. mov [edi+0],al
  382. mov [edi+1],ah
  383. add esi,BYTE 4
  384. add edi,BYTE 2
  385. dec ecx
  386. .L4:  
  387.     ; save count
  388. push ecx
  389.     ; unroll twice
  390. shr ecx,1
  391.     
  392.     ; point arrays to end
  393. lea esi,[esi+ecx*8]
  394. lea edi,[edi+ecx*4]
  395.     ; negative counter 
  396. neg ecx
  397. jmp SHORT .L6
  398. .L5:     
  399. mov [edi+ecx*4-4],eax
  400. .L6:
  401. mov eax,[esi+ecx*8]
  402.         shr ah,2
  403.         mov ebx,[esi+ecx*8+4]
  404.         shr eax,3
  405.         mov edx,[esi+ecx*8+4]
  406.         shr bh,2
  407.         mov dl,[esi+ecx*8+2]
  408.         shl ebx,13
  409.         and eax,000007FFh
  410.         
  411.         shl edx,8
  412.         and ebx,07FF0000h
  413.         and edx,0F800F800h
  414.         add eax,ebx
  415.         add eax,edx
  416.         inc ecx
  417.         jnz .L5                 
  418. mov [edi+ecx*4-4],eax
  419.     ; tail
  420. pop ecx
  421. test cl,1
  422. jz .L7
  423. mov bl,[esi+0]    ; blue
  424. mov al,[esi+1]    ; green
  425. mov ah,[esi+2]    ; red
  426. shr ah,3
  427. and al,11111100b
  428. shl eax,3
  429. shr bl,3
  430. add al,bl
  431. mov [edi+0],al
  432. mov [edi+1],ah
  433. add esi,BYTE 4
  434. add edi,BYTE 2
  435. .L7:
  436. jmp _x86return
  437. ;; 32 bit RGB 888 to 16 BIT BGR 565 
  438. _ConvertX86p32_16BGR565:
  439. ; check short
  440. cmp ecx,BYTE 16
  441. ja .L3
  442. .L1 ; short loop
  443. mov ah,[esi+0]    ; blue
  444. mov al,[esi+1]    ; green
  445. mov bl,[esi+2]    ; red
  446. shr ah,3
  447. and al,11111100b
  448. shl eax,3
  449. shr bl,3
  450. add al,bl
  451. mov [edi+0],al
  452. mov [edi+1],ah
  453. add esi,BYTE 4
  454. add edi,BYTE 2
  455. dec ecx
  456. jnz .L1
  457. .L2
  458. jmp _x86return
  459. .L3 ; head
  460. mov ebx,edi
  461. and ebx,BYTE 11b
  462. jz .L4   
  463. mov ah,[esi+0]    ; blue
  464. mov al,[esi+1]    ; green
  465. mov bl,[esi+2]    ; red
  466. shr ah,3
  467. and al,11111100b
  468. shl eax,3
  469. shr bl,3
  470. add al,bl
  471. mov [edi+0],al
  472. mov [edi+1],ah
  473. add esi,BYTE 4
  474. add edi,BYTE 2
  475. dec ecx
  476. .L4 ; save count
  477. push ecx
  478. ; unroll twice
  479. shr ecx,1
  480.     
  481. ; point arrays to end
  482. lea esi,[esi+ecx*8]
  483. lea edi,[edi+ecx*4]
  484. ; negative count
  485. neg ecx
  486. jmp SHORT .L6
  487. .L5     
  488. mov [edi+ecx*4-4],eax            
  489. .L6     
  490. mov edx,[esi+ecx*8+4]
  491.         mov bh,[esi+ecx*8+4]                       
  492.         mov ah,[esi+ecx*8]                       
  493.         shr bh,3
  494.         mov al,[esi+ecx*8+1]             
  495.         shr ah,3
  496.         mov bl,[esi+ecx*8+5]           
  497.         shl eax,3
  498.         mov dl,[esi+ecx*8+2]
  499.         shl ebx,19
  500.         and eax,0000FFE0h              
  501.                 
  502.         shr edx,3
  503.         and ebx,0FFE00000h             
  504.         
  505.         and edx,001F001Fh               
  506.         add eax,ebx
  507.         add eax,edx
  508.         inc ecx
  509.         jnz .L5                 
  510. mov [edi+ecx*4-4],eax            
  511. ; tail
  512. pop ecx
  513. and ecx,BYTE 1
  514. jz .L7
  515. mov ah,[esi+0]    ; blue
  516. mov al,[esi+1]    ; green
  517. mov bl,[esi+2]    ; red
  518. shr ah,3
  519. and al,11111100b
  520. shl eax,3
  521. shr bl,3
  522. add al,bl
  523. mov [edi+0],al
  524. mov [edi+1],ah
  525. add esi,BYTE 4
  526. add edi,BYTE 2
  527. .L7 
  528. jmp _x86return
  529. ;; 32 BIT RGB TO 16 BIT RGB 555
  530. _ConvertX86p32_16RGB555:
  531. ; check short
  532. cmp ecx,BYTE 16
  533. ja .L3
  534. .L1 ; short loop
  535. mov bl,[esi+0]    ; blue
  536. mov al,[esi+1]    ; green
  537. mov ah,[esi+2]    ; red
  538. shr ah,3
  539. and al,11111000b
  540. shl eax,2
  541. shr bl,3
  542. add al,bl
  543. mov [edi+0],al
  544. mov [edi+1],ah
  545. add esi,BYTE 4
  546. add edi,BYTE 2
  547. dec ecx
  548. jnz .L1
  549. .L2
  550. jmp _x86return
  551. .L3 ; head
  552. mov ebx,edi
  553.         and ebx,BYTE 11b
  554. jz .L4   
  555. mov bl,[esi+0]    ; blue
  556. mov al,[esi+1]    ; green
  557. mov ah,[esi+2]    ; red
  558. shr ah,3
  559. and al,11111000b
  560. shl eax,2
  561. shr bl,3
  562. add al,bl
  563. mov [edi+0],al
  564. mov [edi+1],ah
  565. add esi,BYTE 4
  566. add edi,BYTE 2
  567. dec ecx
  568. .L4 ; save count
  569. push ecx
  570. ; unroll twice
  571. shr ecx,1
  572.     
  573. ; point arrays to end
  574. lea esi,[esi+ecx*8]
  575. lea edi,[edi+ecx*4]
  576. ; negative counter 
  577. neg ecx
  578. jmp SHORT .L6
  579. .L5     
  580. mov [edi+ecx*4-4],eax
  581. .L6     
  582. mov eax,[esi+ecx*8]
  583.         shr ah,3
  584.         mov ebx,[esi+ecx*8+4]
  585.         shr eax,3
  586.         mov edx,[esi+ecx*8+4]
  587.         shr bh,3
  588.         mov dl,[esi+ecx*8+2]
  589.         shl ebx,13
  590.         and eax,000007FFh
  591.         
  592.         shl edx,7
  593.         and ebx,07FF0000h
  594.         and edx,07C007C00h
  595.         add eax,ebx
  596.         add eax,edx
  597.         inc ecx
  598.         jnz .L5                 
  599. mov [edi+ecx*4-4],eax
  600. ; tail
  601. pop ecx
  602. and ecx,BYTE 1
  603. jz .L7
  604. mov bl,[esi+0]    ; blue
  605. mov al,[esi+1]    ; green
  606. mov ah,[esi+2]    ; red
  607. shr ah,3
  608. and al,11111000b
  609. shl eax,2
  610. shr bl,3
  611. add al,bl
  612. mov [edi+0],al
  613. mov [edi+1],ah
  614. add esi,BYTE 4
  615. add edi,BYTE 2
  616. .L7
  617. jmp _x86return
  618. ;; 32 BIT RGB TO 16 BIT BGR 555
  619. _ConvertX86p32_16BGR555:
  620. ; check short
  621. cmp ecx,BYTE 16
  622. ja .L3
  623. .L1 ; short loop
  624. mov ah,[esi+0]    ; blue
  625. mov al,[esi+1]    ; green
  626. mov bl,[esi+2]    ; red
  627. shr ah,3
  628. and al,11111000b
  629. shl eax,2
  630. shr bl,3
  631. add al,bl
  632. mov [edi+0],al
  633. mov [edi+1],ah
  634. add esi,BYTE 4
  635. add edi,BYTE 2
  636. dec ecx
  637. jnz .L1
  638. .L2 
  639. jmp _x86return
  640. .L3 ; head
  641. mov ebx,edi
  642.         and ebx,BYTE 11b
  643. jz .L4   
  644. mov ah,[esi+0]    ; blue
  645. mov al,[esi+1]    ; green
  646. mov bl,[esi+2]    ; red
  647. shr ah,3
  648. and al,11111000b
  649. shl eax,2
  650. shr bl,3
  651. add al,bl
  652. mov [edi+0],al
  653. mov [edi+1],ah
  654. add esi,BYTE 4
  655. add edi,BYTE 2
  656. dec ecx
  657. .L4 ; save count
  658. push ecx
  659. ; unroll twice
  660. shr ecx,1
  661.     
  662. ; point arrays to end
  663. lea esi,[esi+ecx*8]
  664. lea edi,[edi+ecx*4]
  665. ; negative counter 
  666. neg ecx
  667. jmp SHORT .L6
  668. .L5     
  669. mov [edi+ecx*4-4],eax            
  670. .L6     
  671. mov edx,[esi+ecx*8+4]
  672.         mov bh,[esi+ecx*8+4]                       
  673.         mov ah,[esi+ecx*8]                       
  674.         shr bh,3
  675.         mov al,[esi+ecx*8+1]             
  676.         shr ah,3
  677.         mov bl,[esi+ecx*8+5]           
  678.         shl eax,2
  679.         mov dl,[esi+ecx*8+2]
  680.         shl ebx,18
  681.         and eax,00007FE0h              
  682.                 
  683.         shr edx,3
  684.         and ebx,07FE00000h             
  685.         
  686.         and edx,001F001Fh               
  687.         add eax,ebx
  688.         add eax,edx
  689.         inc ecx
  690.         jnz .L5                 
  691. mov [edi+ecx*4-4],eax            
  692. ; tail
  693. pop ecx
  694. and ecx,BYTE 1
  695. jz .L7
  696. mov ah,[esi+0]    ; blue
  697. mov al,[esi+1]    ; green
  698. mov bl,[esi+2]    ; red
  699. shr ah,3
  700. and al,11111000b
  701. shl eax,2
  702. shr bl,3
  703. add al,bl
  704. mov [edi+0],al
  705. mov [edi+1],ah
  706. add esi,BYTE 4
  707. add edi,BYTE 2
  708. .L7
  709. jmp _x86return
  710. ;; FROM 32 BIT RGB to 8 BIT RGB (rrrgggbbb)
  711. ;; This routine writes FOUR pixels at once (dword) and then, if they exist
  712. ;; the trailing three pixels
  713. _ConvertX86p32_8RGB332:
  714. .L_ALIGNED
  715. push ecx
  716. shr ecx,2 ; We will draw 4 pixels at once
  717. jnz .L1
  718. jmp .L2 ; short jump out of range :(
  719. .L1:
  720. mov eax,[esi] ; first pair of pixels
  721. mov edx,[esi+4]
  722. shr dl,6
  723. mov ebx,eax
  724. shr al,6
  725. and ah,0e0h
  726. shr ebx,16
  727. and dh,0e0h
  728. shr ah,3
  729. and bl,0e0h
  730. shr dh,3
  731. or al,bl
  732. mov ebx,edx
  733. or al,ah
  734. shr ebx,16
  735. or dl,dh
  736. and bl,0e0h
  737. or dl,bl
  738. mov ah,dl
  739. mov ebx,[esi+8] ; second pair of pixels
  740. mov edx,ebx
  741. and bh,0e0h
  742. shr bl,6
  743. and edx,0e00000h
  744. shr edx,16
  745. shr bh,3
  746. ror eax,16
  747. or bl,dl
  748. mov edx,[esi+12]
  749. or bl,bh
  750. mov al,bl
  751. mov ebx,edx
  752. and dh,0e0h
  753. shr dl,6
  754. and ebx,0e00000h
  755. shr dh,3
  756. mov ah,dl
  757. shr ebx,16
  758. or ah,dh
  759. or ah,bl
  760. rol eax,16
  761. add esi,BYTE 16
  762. mov [edi],eax
  763. add edi,BYTE 4
  764. dec ecx
  765. jz .L2 ; L1 out of range for short jump :(
  766. jmp .L1
  767. .L2:
  768. pop ecx
  769. and ecx,BYTE 3 ; mask out number of pixels to draw
  770. jz .L4 ; Nothing to do anymore
  771. .L3:
  772. mov eax,[esi] ; single pixel conversion for trailing pixels
  773.         mov ebx,eax
  774.         shr al,6
  775.         and ah,0e0h
  776.         shr ebx,16
  777.         shr ah,3
  778.         and bl,0e0h
  779.         or al,ah
  780.         or al,bl
  781.         mov [edi],al
  782.         inc edi
  783.         add esi,BYTE 4
  784. dec ecx
  785. jnz .L3
  786. .L4:
  787. jmp _x86return