home *** CD-ROM | disk | FTP | other *** search
/ Atari FTP / ATARI_FTP_0693.zip / ATARI_FTP_0693 / Mint / mntlib25.zoo / purec / bcopy.s < prev    next >
Text File  |  1992-06-26  |  2KB  |  84 lines

  1. ; void bcopy(void *src, void *dst, long cnt)
  2. ;    handle overlap (both ways), odd/even alignment etc
  3. ;    ++jrb    bammi@dsrgsun.ces.cwru.edu
  4. ;   Pure C version 20-6-92 bm
  5.  
  6.     .text
  7.     .even
  8.     .globl bcopy
  9. bcopy:
  10.     ; src -> a0
  11.     ; dst -> a1
  12.     ; cnt -> d0
  13.     tst.l d0    
  14.     ble    return            ; cnt <= 0
  15.  
  16.     ; check overlap
  17.     move.l    a0,d1        ; (abs(src - dst)) < cnt =>  overlap
  18.     sub.l    a1,d1
  19.     bge    L1
  20.     neg.l    d1
  21. L1:    cmp.l    d1,d0
  22.     bgt    overlap
  23.  
  24.     ; check for odd src or dst
  25.     move.w    a0,d1
  26.     move.w    a1,d2
  27.     eor.b    d1,d2
  28.     btst    #0,d2
  29.     bne    oddeven
  30.     btst    #0,d1
  31.     beq    eveneven
  32.     move.b    (a0)+,(a1)+    ; odd  odd
  33.     subq.l    #1,d0        ; now even even 
  34.  
  35. eveneven:                ; may want long alignment for 020/030 etc
  36.     move.l    d0,d1
  37.     and.w    #$1c,d1        ; 4 bytes/copy  32 bytes max/iter
  38.     lsr.l    #1,d1        ; calc index into loop (each move.l == 2bytes)
  39.     neg.l    d1
  40.     add.l    #18,d1        ; 16 + 2 bytes for jmp ext word - d1 == index
  41.     jmp    0(pc,d1)        ;  dive into loop at appro spot
  42. loop1:
  43.     move.l    (a0)+,(a1)+
  44.     move.l    (a0)+,(a1)+
  45.     move.l    (a0)+,(a1)+
  46.     move.l    (a0)+,(a1)+
  47.  
  48.     move.l    (a0)+,(a1)+
  49.     move.l    (a0)+,(a1)+
  50.     move.l    (a0)+,(a1)+
  51.     move.l    (a0)+,(a1)+
  52.  
  53.     sub.l    #32,d0
  54.     bge    loop1
  55.  
  56.     btst    #1,d0
  57.     beq    L4
  58.     move.w    (a0)+,(a1)+    ; residual word
  59. L4:    btst    #0,d0
  60.     beq    ret
  61.     move.b    (a0),(a1)    ; residual byte
  62.  
  63. ret:
  64. return:    rts
  65.  
  66. oddeven:
  67. upcopy:                    ; byte-by-byte forward
  68.     subq.l    #1,d0
  69.     blt    ret
  70.     move.b    (a0)+,(a1)+
  71.     bra    upcopy
  72.  
  73. overlap:
  74.     cmp.l    a0,a1
  75.     bmi    upcopy            ; (src > dst) go do byte/byte forward copy
  76.     add.l    d0,a0        ; otherwise backwards copy
  77.     add.l    d0,a1        ; note we use predec so 1 is not sub from addr
  78.  
  79. downcopy:                ; byte-by-byte backward
  80.     subq.l    #1,d0
  81.     blt    ret
  82.     move.b    -(a0),-(a1)
  83.     bra    downcopy
  84.