123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120 |
- .globl _CopyX86p_4byte
- .globl _CopyX86p_3byte
- .globl _CopyX86p_2byte
- .globl _CopyX86p_1byte
- .extern _x86return
- .text
- ## _Copy*
- ## Paramters:
- ## ESI = source
- ## EDI = dest
- ## ECX = amount (NOT 0!!! (the _ConvertX86 routine checks for that though))
- ## Destroys:
- ## EAX, EBX, EDX
- _CopyX86p_4byte:
- rep
- movsl
- jmp _x86return
- _CopyX86p_3byte:
- leal (%ecx,%ecx,2),%ecx
- jmp _CopyX86p_1byte
- _CopyX86p_2byte:
- testl $3,%edi # Check if video memory is aligned
- jz _CopyX86p_2byte.L_ALIGNED
- movw (%esi),%ax
- addl $2,%esi
- movw %ax,(%edi)
- addl $2,%edi
- decl %ecx
- jz _CopyX86p_2byte.L3
- _CopyX86p_2byte.L_ALIGNED:
- movl %ecx,%ebx # Save ecx for later
- shrl %ecx
- jz _CopyX86p_2byte.L2
- rep
- movsl
- _CopyX86p_2byte.L2:
- andl $1,%ebx
- jz _CopyX86p_2byte.L3
- movw (%esi),%ax
- addl $2,%esi
- movw %ax,(%edi)
- addl $2,%edi
- _CopyX86p_2byte.L3:
- jmp _x86return
- _CopyX86p_1byte:
- _CopyX86p_1byte.L_alignloop:
- testl $3,%edi
- jz _CopyX86p_1byte.L_aligned
- movb (%esi),%al
- incl %esi
- movb %al,(%edi)
- incl %edi
- decl %ecx
- jz _CopyX86p_1byte.L4
- jmp _CopyX86p_1byte.L_alignloop
- _CopyX86p_1byte.L_aligned:
- movl %ecx,%edx
- shrl $2,%ecx
- jz _CopyX86p_1byte.L2
- rep
- movsl
- _CopyX86p_1byte.L2:
- movl %edx,%ecx # Get the remaining pixels to draw
- andl $3,%ecx
- jz _CopyX86p_1byte.L4 # width was modulo 4
- _CopyX86p_1byte.L3:
- movb (%esi),%al
- incl %esi
- movb %al,(%edi)
- incl %edi
- decl %ecx
- jnz _CopyX86p_1byte.L3
- _CopyX86p_1byte.L4:
- jmp _x86return
|