comparison src/hermes/x86p_32.asm @ 0:74212992fb08

Initial revision
author Sam Lantinga <slouken@lokigames.com>
date Thu, 26 Apr 2001 16:45:43 +0000
parents
children da33b7e6d181
comparison
equal deleted inserted replaced
-1:000000000000 0:74212992fb08
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 ;
6 ; Please refer to the file COPYING.LIB contained in the distribution for
7 ; licensing conditions
8 ;
9 ; Most routines are (c) Glenn Fiedler (ptc@gaffer.org), used with permission
10 ;
11
12
13 BITS 32
14
15 GLOBAL _ConvertX86p32_32BGR888
16 GLOBAL _ConvertX86p32_32RGBA888
17 GLOBAL _ConvertX86p32_32BGRA888
18 GLOBAL _ConvertX86p32_24RGB888
19 GLOBAL _ConvertX86p32_24BGR888
20 GLOBAL _ConvertX86p32_16RGB565
21 GLOBAL _ConvertX86p32_16BGR565
22 GLOBAL _ConvertX86p32_16RGB555
23 GLOBAL _ConvertX86p32_16BGR555
24 GLOBAL _ConvertX86p32_8RGB332
25
26 EXTERN _x86return
27
28 SECTION .text
29
30
31 ;; _Convert_*
32 ;; Paramters:
33 ;; ESI = source
34 ;; EDI = dest
35 ;; ECX = amount (NOT 0!!! (the _ConvertX86 routine checks for that though))
36 ;; Destroys:
37 ;; EAX, EBX, EDX
38
39
40 _ConvertX86p32_32BGR888:
41
42 ; check short
43 cmp ecx,BYTE 32
44 ja .L3
45
46 .L1 ; short loop
47 mov edx,[esi]
48 bswap edx
49 ror edx,8
50 mov [edi],edx
51 add esi,BYTE 4
52 add edi,BYTE 4
53 dec ecx
54 jnz .L1
55 .L2
56 jmp _x86return
57
58 .L3 ; save ebp
59 push ebp
60
61 ; unroll four times
62 mov ebp,ecx
63 shr ebp,2
64
65 ; save count
66 push ecx
67
68 .L4 mov eax,[esi]
69 mov ebx,[esi+4]
70
71 bswap eax
72
73 bswap ebx
74
75 ror eax,8
76 mov ecx,[esi+8]
77
78 ror ebx,8
79 mov edx,[esi+12]
80
81 bswap ecx
82
83 bswap edx
84
85 ror ecx,8
86 mov [edi+0],eax
87
88 ror edx,8
89 mov [edi+4],ebx
90
91 mov [edi+8],ecx
92 mov [edi+12],edx
93
94 add esi,BYTE 16
95 add edi,BYTE 16
96
97 dec ebp
98 jnz .L4
99
100 ; check tail
101 pop ecx
102 and ecx,BYTE 11b
103 jz .L6
104
105 .L5 ; tail loop
106 mov edx,[esi]
107 bswap edx
108 ror edx,8
109 mov [edi],edx
110 add esi,BYTE 4
111 add edi,BYTE 4
112 dec ecx
113 jnz .L5
114
115 .L6 pop ebp
116 jmp _x86return
117
118
119
120
121 _ConvertX86p32_32RGBA888:
122
123 ; check short
124 cmp ecx,BYTE 32
125 ja .L3
126
127 .L1 ; short loop
128 mov edx,[esi]
129 rol edx,8
130 mov [edi],edx
131 add esi,BYTE 4
132 add edi,BYTE 4
133 dec ecx
134 jnz .L1
135 .L2
136 jmp _x86return
137
138 .L3 ; save ebp
139 push ebp
140
141 ; unroll four times
142 mov ebp,ecx
143 shr ebp,2
144
145 ; save count
146 push ecx
147
148 .L4 mov eax,[esi]
149 mov ebx,[esi+4]
150
151 rol eax,8
152 mov ecx,[esi+8]
153
154 rol ebx,8
155 mov edx,[esi+12]
156
157 rol ecx,8
158 mov [edi+0],eax
159
160 rol edx,8
161 mov [edi+4],ebx
162
163 mov [edi+8],ecx
164 mov [edi+12],edx
165
166 add esi,BYTE 16
167 add edi,BYTE 16
168
169 dec ebp
170 jnz .L4
171
172 ; check tail
173 pop ecx
174 and ecx,BYTE 11b
175 jz .L6
176
177 .L5 ; tail loop
178 mov edx,[esi]
179 rol edx,8
180 mov [edi],edx
181 add esi,BYTE 4
182 add edi,BYTE 4
183 dec ecx
184 jnz .L5
185
186 .L6 pop ebp
187 jmp _x86return
188
189
190
191
192 _ConvertX86p32_32BGRA888:
193
194 ; check short
195 cmp ecx,BYTE 32
196 ja .L3
197
198 .L1 ; short loop
199 mov edx,[esi]
200 bswap edx
201 mov [edi],edx
202 add esi,BYTE 4
203 add edi,BYTE 4
204 dec ecx
205 jnz .L1
206 .L2
207 jmp _x86return
208
209 .L3 ; save ebp
210 push ebp
211
212 ; unroll four times
213 mov ebp,ecx
214 shr ebp,2
215
216 ; save count
217 push ecx
218
219 .L4 mov eax,[esi]
220 mov ebx,[esi+4]
221
222 mov ecx,[esi+8]
223 mov edx,[esi+12]
224
225 bswap eax
226
227 bswap ebx
228
229 bswap ecx
230
231 bswap edx
232
233 mov [edi+0],eax
234 mov [edi+4],ebx
235
236 mov [edi+8],ecx
237 mov [edi+12],edx
238
239 add esi,BYTE 16
240 add edi,BYTE 16
241
242 dec ebp
243 jnz .L4
244
245 ; check tail
246 pop ecx
247 and ecx,BYTE 11b
248 jz .L6
249
250 .L5 ; tail loop
251 mov edx,[esi]
252 bswap edx
253 mov [edi],edx
254 add esi,BYTE 4
255 add edi,BYTE 4
256 dec ecx
257 jnz .L5
258
259 .L6 pop ebp
260 jmp _x86return
261
262
263
264
265 ;; 32 bit RGB 888 to 24 BIT RGB 888
266
267 _ConvertX86p32_24RGB888:
268
269 ; check short
270 cmp ecx,BYTE 32
271 ja .L3
272
273 .L1 ; short loop
274 mov al,[esi]
275 mov bl,[esi+1]
276 mov dl,[esi+2]
277 mov [edi],al
278 mov [edi+1],bl
279 mov [edi+2],dl
280 add esi,BYTE 4
281 add edi,BYTE 3
282 dec ecx
283 jnz .L1
284 .L2
285 jmp _x86return
286
287 .L3 ; head
288 mov edx,edi
289 and edx,BYTE 11b
290 jz .L4
291 mov al,[esi]
292 mov bl,[esi+1]
293 mov dl,[esi+2]
294 mov [edi],al
295 mov [edi+1],bl
296 mov [edi+2],dl
297 add esi,BYTE 4
298 add edi,BYTE 3
299 dec ecx
300 jmp SHORT .L3
301
302 .L4 ; unroll 4 times
303 push ebp
304 mov ebp,ecx
305 shr ebp,2
306
307 ; save count
308 push ecx
309
310 .L5 mov eax,[esi] ; first dword eax = [A][R][G][B]
311 mov ebx,[esi+4] ; second dword ebx = [a][r][g][b]
312
313 shl eax,8 ; eax = [R][G][B][.]
314 mov ecx,[esi+12] ; third dword ecx = [a][r][g][b]
315
316 shl ebx,8 ; ebx = [r][g][b][.]
317 mov al,[esi+4] ; eax = [R][G][B][b]
318
319 ror eax,8 ; eax = [b][R][G][B] (done)
320 mov bh,[esi+8+1] ; ebx = [r][g][G][.]
321
322 mov [edi],eax
323 add edi,BYTE 3*4
324
325 shl ecx,8 ; ecx = [r][g][b][.]
326 mov bl,[esi+8+0] ; ebx = [r][g][G][B]
327
328 rol ebx,16 ; ebx = [G][B][r][g] (done)
329 mov cl,[esi+8+2] ; ecx = [r][g][b][R] (done)
330
331 mov [edi+4-3*4],ebx
332 add esi,BYTE 4*4
333
334 mov [edi+8-3*4],ecx
335 dec ebp
336
337 jnz .L5
338
339 ; check tail
340 pop ecx
341 and ecx,BYTE 11b
342 jz .L7
343
344 .L6 ; tail loop
345 mov al,[esi]
346 mov bl,[esi+1]
347 mov dl,[esi+2]
348 mov [edi],al
349 mov [edi+1],bl
350 mov [edi+2],dl
351 add esi,BYTE 4
352 add edi,BYTE 3
353 dec ecx
354 jnz .L6
355
356 .L7 pop ebp
357 jmp _x86return
358
359
360
361
362 ;; 32 bit RGB 888 to 24 bit BGR 888
363
364 _ConvertX86p32_24BGR888:
365
366 ; check short
367 cmp ecx,BYTE 32
368 ja .L3
369
370
371 .L1 ; short loop
372 mov dl,[esi]
373 mov bl,[esi+1]
374 mov al,[esi+2]
375 mov [edi],al
376 mov [edi+1],bl
377 mov [edi+2],dl
378 add esi,BYTE 4
379 add edi,BYTE 3
380 dec ecx
381 jnz .L1
382 .L2
383 jmp _x86return
384
385 .L3 ; head
386 mov edx,edi
387 and edx,BYTE 11b
388 jz .L4
389 mov dl,[esi]
390 mov bl,[esi+1]
391 mov al,[esi+2]
392 mov [edi],al
393 mov [edi+1],bl
394 mov [edi+2],dl
395 add esi,BYTE 4
396 add edi,BYTE 3
397 dec ecx
398 jmp SHORT .L3
399
400 .L4 ; unroll 4 times
401 push ebp
402 mov ebp,ecx
403 shr ebp,2
404
405 ; save count
406 push ecx
407
408 .L5
409 mov eax,[esi] ; first dword eax = [A][R][G][B]
410 mov ebx,[esi+4] ; second dword ebx = [a][r][g][b]
411
412 bswap eax ; eax = [B][G][R][A]
413
414 bswap ebx ; ebx = [b][g][r][a]
415
416 mov al,[esi+4+2] ; eax = [B][G][R][r]
417 mov bh,[esi+4+4+1] ; ebx = [b][g][G][a]
418
419 ror eax,8 ; eax = [r][B][G][R] (done)
420 mov bl,[esi+4+4+2] ; ebx = [b][g][G][R]
421
422 ror ebx,16 ; ebx = [G][R][b][g] (done)
423 mov [edi],eax
424
425 mov [edi+4],ebx
426 mov ecx,[esi+12] ; third dword ecx = [a][r][g][b]
427
428 bswap ecx ; ecx = [b][g][r][a]
429
430 mov cl,[esi+8] ; ecx = [b][g][r][B] (done)
431 add esi,BYTE 4*4
432
433 mov [edi+8],ecx
434 add edi,BYTE 3*4
435
436 dec ebp
437 jnz .L5
438
439 ; check tail
440 pop ecx
441 and ecx,BYTE 11b
442 jz .L7
443
444 .L6 ; tail loop
445 mov dl,[esi]
446 mov bl,[esi+1]
447 mov al,[esi+2]
448 mov [edi],al
449 mov [edi+1],bl
450 mov [edi+2],dl
451 add esi,BYTE 4
452 add edi,BYTE 3
453 dec ecx
454 jnz .L6
455
456 .L7
457 pop ebp
458 jmp _x86return
459
460
461
462
463 ;; 32 bit RGB 888 to 16 BIT RGB 565
464
465 _ConvertX86p32_16RGB565:
466 ; check short
467 cmp ecx,BYTE 16
468 ja .L3
469
470 .L1 ; short loop
471 mov bl,[esi+0] ; blue
472 mov al,[esi+1] ; green
473 mov ah,[esi+2] ; red
474 shr ah,3
475 and al,11111100b
476 shl eax,3
477 shr bl,3
478 add al,bl
479 mov [edi+0],al
480 mov [edi+1],ah
481 add esi,BYTE 4
482 add edi,BYTE 2
483 dec ecx
484 jnz .L1
485
486 .L2: ; End of short loop
487 jmp _x86return
488
489
490 .L3 ; head
491 mov ebx,edi
492 and ebx,BYTE 11b
493 jz .L4
494
495 mov bl,[esi+0] ; blue
496 mov al,[esi+1] ; green
497 mov ah,[esi+2] ; red
498 shr ah,3
499 and al,11111100b
500 shl eax,3
501 shr bl,3
502 add al,bl
503 mov [edi+0],al
504 mov [edi+1],ah
505 add esi,BYTE 4
506 add edi,BYTE 2
507 dec ecx
508
509 .L4:
510 ; save count
511 push ecx
512
513 ; unroll twice
514 shr ecx,1
515
516 ; point arrays to end
517 lea esi,[esi+ecx*8]
518 lea edi,[edi+ecx*4]
519
520 ; negative counter
521 neg ecx
522 jmp SHORT .L6
523
524 .L5:
525 mov [edi+ecx*4-4],eax
526 .L6:
527 mov eax,[esi+ecx*8]
528
529 shr ah,2
530 mov ebx,[esi+ecx*8+4]
531
532 shr eax,3
533 mov edx,[esi+ecx*8+4]
534
535 shr bh,2
536 mov dl,[esi+ecx*8+2]
537
538 shl ebx,13
539 and eax,000007FFh
540
541 shl edx,8
542 and ebx,07FF0000h
543
544 and edx,0F800F800h
545 add eax,ebx
546
547 add eax,edx
548 inc ecx
549
550 jnz .L5
551
552 mov [edi+ecx*4-4],eax
553
554 ; tail
555 pop ecx
556 test cl,1
557 jz .L7
558
559 mov bl,[esi+0] ; blue
560 mov al,[esi+1] ; green
561 mov ah,[esi+2] ; red
562 shr ah,3
563 and al,11111100b
564 shl eax,3
565 shr bl,3
566 add al,bl
567 mov [edi+0],al
568 mov [edi+1],ah
569 add esi,BYTE 4
570 add edi,BYTE 2
571
572 .L7:
573 jmp _x86return
574
575
576
577
578 ;; 32 bit RGB 888 to 16 BIT BGR 565
579
580 _ConvertX86p32_16BGR565:
581
582 ; check short
583 cmp ecx,BYTE 16
584 ja .L3
585
586 .L1 ; short loop
587 mov ah,[esi+0] ; blue
588 mov al,[esi+1] ; green
589 mov bl,[esi+2] ; red
590 shr ah,3
591 and al,11111100b
592 shl eax,3
593 shr bl,3
594 add al,bl
595 mov [edi+0],al
596 mov [edi+1],ah
597 add esi,BYTE 4
598 add edi,BYTE 2
599 dec ecx
600 jnz .L1
601 .L2
602 jmp _x86return
603
604 .L3 ; head
605 mov ebx,edi
606 and ebx,BYTE 11b
607 jz .L4
608 mov ah,[esi+0] ; blue
609 mov al,[esi+1] ; green
610 mov bl,[esi+2] ; red
611 shr ah,3
612 and al,11111100b
613 shl eax,3
614 shr bl,3
615 add al,bl
616 mov [edi+0],al
617 mov [edi+1],ah
618 add esi,BYTE 4
619 add edi,BYTE 2
620 dec ecx
621
622 .L4 ; save count
623 push ecx
624
625 ; unroll twice
626 shr ecx,1
627
628 ; point arrays to end
629 lea esi,[esi+ecx*8]
630 lea edi,[edi+ecx*4]
631
632 ; negative count
633 neg ecx
634 jmp SHORT .L6
635
636 .L5
637 mov [edi+ecx*4-4],eax
638 .L6
639 mov edx,[esi+ecx*8+4]
640
641 mov bh,[esi+ecx*8+4]
642 mov ah,[esi+ecx*8]
643
644 shr bh,3
645 mov al,[esi+ecx*8+1]
646
647 shr ah,3
648 mov bl,[esi+ecx*8+5]
649
650 shl eax,3
651 mov dl,[esi+ecx*8+2]
652
653 shl ebx,19
654 and eax,0000FFE0h
655
656 shr edx,3
657 and ebx,0FFE00000h
658
659 and edx,001F001Fh
660 add eax,ebx
661
662 add eax,edx
663 inc ecx
664
665 jnz .L5
666
667 mov [edi+ecx*4-4],eax
668
669 ; tail
670 pop ecx
671 and ecx,BYTE 1
672 jz .L7
673 mov ah,[esi+0] ; blue
674 mov al,[esi+1] ; green
675 mov bl,[esi+2] ; red
676 shr ah,3
677 and al,11111100b
678 shl eax,3
679 shr bl,3
680 add al,bl
681 mov [edi+0],al
682 mov [edi+1],ah
683 add esi,BYTE 4
684 add edi,BYTE 2
685
686 .L7
687 jmp _x86return
688
689
690
691
692 ;; 32 BIT RGB TO 16 BIT RGB 555
693
694 _ConvertX86p32_16RGB555:
695
696 ; check short
697 cmp ecx,BYTE 16
698 ja .L3
699
700 .L1 ; short loop
701 mov bl,[esi+0] ; blue
702 mov al,[esi+1] ; green
703 mov ah,[esi+2] ; red
704 shr ah,3
705 and al,11111000b
706 shl eax,2
707 shr bl,3
708 add al,bl
709 mov [edi+0],al
710 mov [edi+1],ah
711 add esi,BYTE 4
712 add edi,BYTE 2
713 dec ecx
714 jnz .L1
715 .L2
716 jmp _x86return
717
718 .L3 ; head
719 mov ebx,edi
720 and ebx,BYTE 11b
721 jz .L4
722 mov bl,[esi+0] ; blue
723 mov al,[esi+1] ; green
724 mov ah,[esi+2] ; red
725 shr ah,3
726 and al,11111000b
727 shl eax,2
728 shr bl,3
729 add al,bl
730 mov [edi+0],al
731 mov [edi+1],ah
732 add esi,BYTE 4
733 add edi,BYTE 2
734 dec ecx
735
736 .L4 ; save count
737 push ecx
738
739 ; unroll twice
740 shr ecx,1
741
742 ; point arrays to end
743 lea esi,[esi+ecx*8]
744 lea edi,[edi+ecx*4]
745
746 ; negative counter
747 neg ecx
748 jmp SHORT .L6
749
750 .L5
751 mov [edi+ecx*4-4],eax
752 .L6
753 mov eax,[esi+ecx*8]
754
755 shr ah,3
756 mov ebx,[esi+ecx*8+4]
757
758 shr eax,3
759 mov edx,[esi+ecx*8+4]
760
761 shr bh,3
762 mov dl,[esi+ecx*8+2]
763
764 shl ebx,13
765 and eax,000007FFh
766
767 shl edx,7
768 and ebx,07FF0000h
769
770 and edx,07C007C00h
771 add eax,ebx
772
773 add eax,edx
774 inc ecx
775
776 jnz .L5
777
778 mov [edi+ecx*4-4],eax
779
780 ; tail
781 pop ecx
782 and ecx,BYTE 1
783 jz .L7
784 mov bl,[esi+0] ; blue
785 mov al,[esi+1] ; green
786 mov ah,[esi+2] ; red
787 shr ah,3
788 and al,11111000b
789 shl eax,2
790 shr bl,3
791 add al,bl
792 mov [edi+0],al
793 mov [edi+1],ah
794 add esi,BYTE 4
795 add edi,BYTE 2
796
797 .L7
798 jmp _x86return
799
800
801
802
803 ;; 32 BIT RGB TO 16 BIT BGR 555
804
805 _ConvertX86p32_16BGR555:
806
807 ; check short
808 cmp ecx,BYTE 16
809 ja .L3
810
811
812 .L1 ; short loop
813 mov ah,[esi+0] ; blue
814 mov al,[esi+1] ; green
815 mov bl,[esi+2] ; red
816 shr ah,3
817 and al,11111000b
818 shl eax,2
819 shr bl,3
820 add al,bl
821 mov [edi+0],al
822 mov [edi+1],ah
823 add esi,BYTE 4
824 add edi,BYTE 2
825 dec ecx
826 jnz .L1
827 .L2
828 jmp _x86return
829
830 .L3 ; head
831 mov ebx,edi
832 and ebx,BYTE 11b
833 jz .L4
834 mov ah,[esi+0] ; blue
835 mov al,[esi+1] ; green
836 mov bl,[esi+2] ; red
837 shr ah,3
838 and al,11111000b
839 shl eax,2
840 shr bl,3
841 add al,bl
842 mov [edi+0],al
843 mov [edi+1],ah
844 add esi,BYTE 4
845 add edi,BYTE 2
846 dec ecx
847
848 .L4 ; save count
849 push ecx
850
851 ; unroll twice
852 shr ecx,1
853
854 ; point arrays to end
855 lea esi,[esi+ecx*8]
856 lea edi,[edi+ecx*4]
857
858 ; negative counter
859 neg ecx
860 jmp SHORT .L6
861
862 .L5
863 mov [edi+ecx*4-4],eax
864 .L6
865 mov edx,[esi+ecx*8+4]
866
867 mov bh,[esi+ecx*8+4]
868 mov ah,[esi+ecx*8]
869
870 shr bh,3
871 mov al,[esi+ecx*8+1]
872
873 shr ah,3
874 mov bl,[esi+ecx*8+5]
875
876 shl eax,2
877 mov dl,[esi+ecx*8+2]
878
879 shl ebx,18
880 and eax,00007FE0h
881
882 shr edx,3
883 and ebx,07FE00000h
884
885 and edx,001F001Fh
886 add eax,ebx
887
888 add eax,edx
889 inc ecx
890
891 jnz .L5
892
893 mov [edi+ecx*4-4],eax
894
895 ; tail
896 pop ecx
897 and ecx,BYTE 1
898 jz .L7
899 mov ah,[esi+0] ; blue
900 mov al,[esi+1] ; green
901 mov bl,[esi+2] ; red
902 shr ah,3
903 and al,11111000b
904 shl eax,2
905 shr bl,3
906 add al,bl
907 mov [edi+0],al
908 mov [edi+1],ah
909 add esi,BYTE 4
910 add edi,BYTE 2
911
912 .L7
913 jmp _x86return
914
915
916
917
918
919 ;; FROM 32 BIT RGB to 8 BIT RGB (rrrgggbbb)
920 ;; This routine writes FOUR pixels at once (dword) and then, if they exist
921 ;; the trailing three pixels
922 _ConvertX86p32_8RGB332:
923
924
925 .L_ALIGNED
926 push ecx
927
928 shr ecx,2 ; We will draw 4 pixels at once
929 jnz .L1
930
931 jmp .L2 ; short jump out of range :(
932
933 .L1:
934 mov eax,[esi] ; first pair of pixels
935 mov edx,[esi+4]
936
937 shr dl,6
938 mov ebx,eax
939
940 shr al,6
941 and ah,0e0h
942
943 shr ebx,16
944 and dh,0e0h
945
946 shr ah,3
947 and bl,0e0h
948
949 shr dh,3
950
951 or al,bl
952
953 mov ebx,edx
954 or al,ah
955
956 shr ebx,16
957 or dl,dh
958
959 and bl,0e0h
960
961 or dl,bl
962
963 mov ah,dl
964
965
966
967 mov ebx,[esi+8] ; second pair of pixels
968
969 mov edx,ebx
970 and bh,0e0h
971
972 shr bl,6
973 and edx,0e00000h
974
975 shr edx,16
976
977 shr bh,3
978
979 ror eax,16
980 or bl,dl
981
982 mov edx,[esi+12]
983 or bl,bh
984
985 mov al,bl
986
987 mov ebx,edx
988 and dh,0e0h
989
990 shr dl,6
991 and ebx,0e00000h
992
993 shr dh,3
994 mov ah,dl
995
996 shr ebx,16
997 or ah,dh
998
999 or ah,bl
1000
1001 rol eax,16
1002 add esi,BYTE 16
1003
1004 mov [edi],eax
1005 add edi,BYTE 4
1006
1007 dec ecx
1008 jz .L2 ; L1 out of range for short jump :(
1009
1010 jmp .L1
1011 .L2:
1012
1013 pop ecx
1014 and ecx,BYTE 3 ; mask out number of pixels to draw
1015
1016 jz .L4 ; Nothing to do anymore
1017
1018 .L3:
1019 mov eax,[esi] ; single pixel conversion for trailing pixels
1020
1021 mov ebx,eax
1022
1023 shr al,6
1024 and ah,0e0h
1025
1026 shr ebx,16
1027
1028 shr ah,3
1029 and bl,0e0h
1030
1031 or al,ah
1032 or al,bl
1033
1034 mov [edi],al
1035
1036 inc edi
1037 add esi,BYTE 4
1038
1039 dec ecx
1040 jnz .L3
1041
1042 .L4:
1043 jmp _x86return