home *** CD-ROM | disk | FTP | other *** search
/ Atari FTP / ATARI_FTP_0693.zip / ATARI_FTP_0693 / Mint / mntlib32.zoo / lattice / bcopy.s < prev    next >
Text File  |  1993-05-23  |  2KB  |  100 lines

  1.     INCLUDE    inc.i
  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. ;
  7.     XFUNC
  8.     IF        _REGARG
  9.     xdef    @bcopy
  10.     xdef    @_bcopy
  11.     ELSE
  12.     xdef    _bcopy
  13.     xdef    __bcopy
  14.     ENDC
  15.     
  16.     TEXT
  17.     IFEQ    _REGARG
  18. _bcopy:
  19. __bcopy:
  20.     move.l    4(sp),a0    ; src -> a0
  21.     move.l    8(sp),a1    ; dst -> a1
  22.     move.l    12(sp),d0    ; cnt -> d0
  23.     ELSE
  24. @bcopy:
  25. @_bcopy:
  26.     tst.l    d0
  27.     ENDC
  28.     ble    return        ; cnt <= 0
  29.     move.l    d2,-(sp)    ; save d2
  30.  
  31.     ; check overlap
  32.     move.l    a0,d1        ; (abs(src - dst)) < cnt =>  overlap
  33.     sub.l    a1,d1
  34.     bge    L1
  35.     neg.l    d1
  36. L1:    cmp.l    d1,d0
  37.     bgt    overlap
  38.  
  39.     ; check for odd src or dst
  40.     move.w    a0,d1
  41.     move.w    a1,d2
  42.     eor.b    d1,d2
  43.     btst    #0,d2
  44.     bne    oddeven
  45.     btst    #0,d1
  46.     beq    eveneven
  47.     move.b    (a0)+,(a1)+    ; odd  odd
  48.     subq.l    #1,d0        ; now even even 
  49.  
  50. eveneven:            ; may want long alignment for 020/030 etc
  51.     move.l    d0,d1
  52.     and.b    #$1c,d1        ; 4 bytes/copy  32 bytes max/iter
  53.     lsr.l    #1,d1        ; calc index into loop (each move.l == 2bytes)
  54.     neg.l    d1        ;  
  55.     add.l    #18,d1        ; 16 + 2 bytes for jmp ext word - d1 == index
  56.     jmp    0(pc,d1)    ;  dive into loop at appro spot
  57. loop1:
  58.     move.l    (a0)+,(a1)+
  59.     move.l    (a0)+,(a1)+
  60.     move.l    (a0)+,(a1)+
  61.     move.l    (a0)+,(a1)+
  62.  
  63.     move.l    (a0)+,(a1)+
  64.     move.l    (a0)+,(a1)+
  65.     move.l    (a0)+,(a1)+
  66.     move.l    (a0)+,(a1)+
  67.  
  68.     sub.l    #32,d0
  69.     bge    loop1
  70.  
  71.     btst    #1,d0
  72.     beq    L4
  73.     move.w    (a0)+,(a1)+    ; residual word
  74. L4:    btst    #0,d0
  75.     beq    ret
  76.     move.b    (a0),(a1)        ; residual byte
  77.  
  78. ret:    move.l    (sp)+,d2
  79. return:    rts
  80.  
  81. oddeven:
  82. upcopy:                ; byte-by-byte forward
  83.     subq.l    #1,d0
  84.     blt    ret
  85.     move.b    (a0)+,(a1)+
  86.     bra    upcopy
  87.  
  88. overlap:
  89.     cmp.l    a0,a1
  90.     bmi    upcopy        ; (src > dst) go do byte/byte forward copy
  91.     add.l    d0,a0        ; otherwise backwards copy
  92.     add.l    d0,a1        ; note we use predec so 1 is not sub from addr
  93.  
  94. downcopy:            ; byte-by-byte backward
  95.     subq.l    #1,d0
  96.     blt    ret
  97.     move.b    -(a0),-(a1)
  98.     bra    downcopy
  99.     end
  100.