x86p_cpy.as 1.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120
  1. .globl _CopyX86p_4byte
  2. .globl _CopyX86p_3byte
  3. .globl _CopyX86p_2byte
  4. .globl _CopyX86p_1byte
  5. .extern _x86return
  6. .text
  7. ## _Copy*
  8. ## Paramters:
  9. ## ESI = source
  10. ## EDI = dest
  11. ## ECX = amount (NOT 0!!! (the _ConvertX86 routine checks for that though))
  12. ## Destroys:
  13. ## EAX, EBX, EDX
  14. _CopyX86p_4byte:
  15. rep
  16. movsl
  17. jmp _x86return
  18. _CopyX86p_3byte:
  19. leal (%ecx,%ecx,2),%ecx
  20. jmp _CopyX86p_1byte
  21. _CopyX86p_2byte:
  22. testl $3,%edi # Check if video memory is aligned
  23. jz _CopyX86p_2byte.L_ALIGNED
  24. movw (%esi),%ax
  25. addl $2,%esi
  26. movw %ax,(%edi)
  27. addl $2,%edi
  28. decl %ecx
  29. jz _CopyX86p_2byte.L3
  30. _CopyX86p_2byte.L_ALIGNED:
  31. movl %ecx,%ebx # Save ecx for later
  32. shrl %ecx
  33. jz _CopyX86p_2byte.L2
  34. rep
  35. movsl
  36. _CopyX86p_2byte.L2:
  37. andl $1,%ebx
  38. jz _CopyX86p_2byte.L3
  39. movw (%esi),%ax
  40. addl $2,%esi
  41. movw %ax,(%edi)
  42. addl $2,%edi
  43. _CopyX86p_2byte.L3:
  44. jmp _x86return
  45. _CopyX86p_1byte:
  46. _CopyX86p_1byte.L_alignloop:
  47. testl $3,%edi
  48. jz _CopyX86p_1byte.L_aligned
  49. movb (%esi),%al
  50. incl %esi
  51. movb %al,(%edi)
  52. incl %edi
  53. decl %ecx
  54. jz _CopyX86p_1byte.L4
  55. jmp _CopyX86p_1byte.L_alignloop
  56. _CopyX86p_1byte.L_aligned:
  57. movl %ecx,%edx
  58. shrl $2,%ecx
  59. jz _CopyX86p_1byte.L2
  60. rep
  61. movsl
  62. _CopyX86p_1byte.L2:
  63. movl %edx,%ecx # Get the remaining pixels to draw
  64. andl $3,%ecx
  65. jz _CopyX86p_1byte.L4 # width was modulo 4
  66. _CopyX86p_1byte.L3:
  67. movb (%esi),%al
  68. incl %esi
  69. movb %al,(%edi)
  70. incl %edi
  71. decl %ecx
  72. jnz _CopyX86p_1byte.L3
  73. _CopyX86p_1byte.L4:
  74. jmp _x86return