home *** CD-ROM | disk | FTP | other *** search
/ GEMini Atari / GEMini_Atari_CD-ROM_Walnut_Creek_December_1993.iso / zip / gnu / mntlib16.lzh / MNTLIB16 / BCOPY.S < prev    next >
Text File  |  1993-07-29  |  2KB  |  85 lines

  1. #APP
  2.  
  3. | void bcopy(void *src, void *dst, long cnt)
  4. |    handle overlap (both ways), odd/even alignment etc
  5. |    ++jrb    bammi@dsrgsun.ces.cwru.edu
  6.     .text
  7.     .even
  8.     .globl _bcopy
  9. _bcopy:
  10.     movl    sp@(4),a0    | src -> a0
  11.     movl    sp@(8),a1    | dst -> a1
  12.     movl    sp@(12),d0    | cnt -> d0
  13.     jle    return        | cnt <= 0
  14.     movl    d2,sp@-        | save d2
  15.  
  16.     | check overlap
  17.     movl    a0,d1        | (abs(src - dst)) < cnt =>  overlap
  18.     subl    a1,d1
  19.     jge    L1
  20.     negl    d1
  21. L1:    cmpl    d1,d0
  22.     jgt    overlap
  23.  
  24.     | check for odd src or dst
  25.     movw    a0,d1
  26.     movw    a1,d2
  27.     eorb    d1,d2
  28.     btst    #0,d2
  29.     jne    oddeven
  30.     btst    #0,d1
  31.     jeq    eveneven
  32.     movb    a0@+,a1@+    | odd  odd
  33.     subql    #1,d0        | now even even 
  34.  
  35. eveneven:            | may want long alignment for 020/030 etc
  36.     movl    d0,d1
  37.     andl    #0x1c,d1    | 4 bytes/copy  32 bytes max/iter
  38.     lsrl    #1,d1        | calc index into loop (each movl == 2bytes)
  39.     negl    d1        |  
  40.     addl    #18,d1        | 16 + 2 bytes for jmp ext word - d1 == index
  41.     jmp    pc@(0,d1)    |  dive into loop at appro spot
  42. loop1:
  43.     movl    a0@+,a1@+
  44.     movl    a0@+,a1@+
  45.     movl    a0@+,a1@+
  46.     movl    a0@+,a1@+
  47.  
  48.     movl    a0@+,a1@+
  49.     movl    a0@+,a1@+
  50.     movl    a0@+,a1@+
  51.     movl    a0@+,a1@+
  52.  
  53.     subl    #32,d0
  54.     jge    loop1
  55.  
  56.     btst    #1,d0
  57.     jeq    L4
  58.     movw    a0@+,a1@+    | residual word
  59. L4:    btst    #0,d0
  60.     jeq    ret
  61.     movb    a0@,a1@        | residual byte
  62.  
  63. ret:    movl    sp@+,d2
  64. return:    rts
  65.  
  66. oddeven:
  67. upcopy:                | byte-by-byte forward
  68.     subql    #1,d0
  69.     jlt    ret
  70.     movb    a0@+,a1@+
  71.     jra    upcopy
  72.  
  73. overlap:
  74.     cmpl    a0,a1
  75.     jmi    upcopy        | (src > dst) go do byte/byte forward copy
  76.     addl    d0,a0        | otherwise backwards copy
  77.     addl    d0,a1        | note we use predec so 1 is not sub from addr
  78.  
  79. downcopy:            | byte-by-byte backward
  80.     subql    #1,d0
  81.     jlt    ret
  82.     movb    a0@-,a1@-
  83.     jra    downcopy
  84.