home *** CD-ROM | disk | FTP | other *** search
/ GEMini Atari / GEMini_Atari_CD-ROM_Walnut_Creek_December_1993.iso / files / language / sozodlib / lmemcpy.s < prev    next >
Encoding:
Text File  |  1991-03-07  |  2.2 KB  |  87 lines

  1. *    char *memcpy(dest, source, len)
  2. *        register char *dest, *source;
  3. *        register unsigned int len;
  4. .text
  5. .globl _memcpy
  6. _memcpy:
  7.     moveq    #0,d1        ; load a word but get a long
  8.     move.w    12(a7),d1    ; d1.l <- #bytes
  9.     bra    memcpy        ; skip to main routine
  10.  
  11. *    char *lmemcpy(dest, source, len)
  12. *        register char *dest, *source;
  13. *        register unsigned long len;
  14. .text
  15. .globl _lmemcpy
  16. _lmemcpy:
  17.     move.l    12(a7),d1    ; d1.l <- #bytes fall thro' to main routine
  18. memcpy:
  19.     beq    lmemcpy8    ; more than 0 bytes to copy?
  20.     move.l    4(a7),a1    ; YES, a1 <- destination
  21.     move.l    8(a7),a0    ;      a0 <- source
  22.  
  23.     move.l    a0,d0        ; check if aligned together
  24.     move.l    a1,d2
  25.     eor.w    d0,d2
  26.     btst    #0,d2        ; both odd or both even?
  27.     bne    lmemcpy9
  28.     btst    #0,d0        ; YES, do they have odd alignment?
  29.     beq    lmemcpy0
  30.     move.b    (a0)+,(a1)+    ; YES, copy first byte
  31.     subq.l    #1,d1        ; and reduce count
  32. lmemcpy0:
  33.     move.l    d1,d2        ; save full count value
  34.     lsr.l    #2,d1        ; convert to long count
  35.     move.w    d1,d0        ; # of extra longs to copy
  36.     swap    d1        ; # of 64Kbyte blocks to copy
  37.     bra    lmemcpy2
  38. lmemcpy1:
  39.     move.l    (a0)+,(a1)+    ; extra bytes copy loop
  40. lmemcpy2:
  41.     dbra    d0,lmemcpy1
  42.     bra    lmemcpy6
  43. lmemcpy3:
  44.     move.w    #$1000,d0    ; 64Kwords = 4K * 4long count
  45.     bra    lmemcpy5
  46. lmemcpy4:
  47.     move.l    (a0)+,(a1)+    ; 64Kword copy loop
  48.     move.l    (a0)+,(a1)+    ; 4 longs at a time
  49.     move.l    (a0)+,(a1)+    ; or, 8 words at a time
  50.     move.l    (a0)+,(a1)+    ; or, 16 bytes at a time
  51. lmemcpy5:
  52.     dbra    d0,lmemcpy4
  53. lmemcpy6:
  54.     dbra    d1,lmemcpy3
  55.     btst    #1,d2        ; extra word to copy?
  56.     bne    lmemcpy7
  57.     move.w    (a0)+,(a1)+    ; YES, copy it
  58. lmemcpy7:
  59.     btst    #0,d2        ; extra odd byte to copy?
  60.     beq    lmemcpy8
  61.     move.b    (a0)+,(a1)+    ; copy last byte
  62. lmemcpy8:
  63.     move.l    4(a7),d0    ; return destination pointer
  64.     rts
  65. lmemcpy9:
  66.     move.w    d1,d0        ; NON-ALIGNED, d0.w <- extra bytes to copy
  67.     swap    d1        ;            d1.w <- extra 64kbytes to copy
  68.     bra    lmemcpy11
  69. lmemcpy10:
  70.     move.b    (a0)+,(a1)+    ; extra bytes copy loop
  71. lmemcpy11:
  72.     dbra    d0,lmemcpy10
  73.     bra    lmemcpy15
  74. lmemcpy12:
  75.     move.w    #$4000,d0    ; 64kbytes = 16k * 4byte count
  76.     bra    lmemcpy14
  77. lmemcpy13:
  78.     move.b    (a0)+,(a1)+    ; 64kbyte copy loop
  79.     move.b    (a0)+,(a1)+
  80.     move.b    (a0)+,(a1)+
  81.     move.b    (a0)+,(a1)+
  82. lmemcpy14:
  83.     dbra    d0,lmemcpy13
  84. lmemcpy15:
  85.     dbra    d1,lmemcpy12
  86.     bra    lmemcpy8    ; jump to end code
  87.