home *** CD-ROM | disk | FTP | other *** search
/ The Fred Fish Collection 1.5 / ffcollection-1-5-1992-11.iso / ff_progs / fileutil / scan.lha / src / bmov.asm < prev    next >
Encoding:
Assembly Source File  |  1992-05-21  |  4.1 KB  |  102 lines

  1.  
  2.                 ;   BMOV(src, dst, len)
  3.                 ;
  4.                 ;   The memory move algorithm is somewhat more of a mess
  5.                 ;   since we must do it either ascending or decending.
  6.  
  7.                 public  _bmov
  8. _bmov:          move.l  4(sp),A0
  9.                 move.l  8(sp),A1
  10.                 move.l  12(sp),D0
  11.                 cmp.l   A0,A1           ;move to self
  12.                 beq     .bmend
  13.                 bls     .bmup
  14. .bmdown         adda.l  D0,A0           ;descending copy
  15.                 adda.l  D0,A1
  16.                 move.w  A0,D1           ;CHECK WORD ALIGNED
  17.                 btst.l  #0,D1
  18.                 bne     .bmdown1
  19.                 move.w  A1,D1
  20.                 btst.l  #0,D1
  21.                 bne     .bmdown1
  22.                 cmp.l   #259,D0             ;chosen by calculation.
  23.                 blo     .bmdown8
  24.  
  25.                 move.l  D0,D1               ;overhead for bmd44: ~360
  26.                 divu    #44,D1
  27.                 bvs     .bmdown8            ;too big (> 2,883,540)
  28.                 movem.l D2-D7/A2-A6,-(sp)   ;use D2-D7/A2-A6 (11 regs)
  29.                 move.l  #11*4,D0
  30.                 bra     .bmd44b
  31. .bmd44a         sub.l   D0,A0               ;8          total 214/44bytes
  32.                 movem.l (A0),D2-D7/A2-A6    ;12 + 8*11  4.86 cycles/byte
  33.                 movem.l D2-D7/A2-A6,-(A1)   ; 8 + 8*11
  34. .bmd44b         dbf     D1,.bmd44a          ;10
  35.                 swap    D1                  ;D0<15:7> already contain 0
  36.                 move.w  D1,D0               ;D0 = remainder
  37.                 movem.l (sp)+,D2-D7/A2-A6
  38.  
  39. .bmdown8        move.w  D0,D1               ;D1<2:0> = #bytes left later
  40.                 lsr.l   #3,D0               ;divide by 8
  41.                 bra     .bmd8b
  42. .bmd8a          move.l  -(A0),-(A1)         ;20         total 50/8bytes
  43.                 move.l  -(A0),-(A1)         ;20         = 6.25 cycles/byte
  44. .bmd8b          dbf     D0,.bmd8a           ;10
  45.                 sub.l   #$10000,D0
  46.                 bcc     .bmd8a
  47.                 move.w  D1,D0               ;D0 = 0 to 7 bytes
  48.                 and.l   #7,D0
  49.                 bne     .bmdown1
  50.                 rts
  51.  
  52. .bmd1a          move.b  -(A0),-(A1)         ;12         total 22/byte
  53. .bmdown1                                    ;           = 22 cycles/byte
  54. .bmd1b          dbf     D0,.bmd1a           ;10
  55.                 sub.l   #$10000,D0
  56.                 bcc     .bmd1a
  57.                 rts
  58.  
  59. .bmup           move.w  A0,D1               ;CHECK WORD ALIGNED
  60.                 btst.l  #0,D1
  61.                 bne     .bmup1
  62.                 move.w  A1,D1
  63.                 btst.l  #0,D1
  64.                 bne     .bmup1
  65.                 cmp.l   #259,D0             ;chosen by calculation
  66.                 blo     .bmup8
  67.  
  68.                 move.l  D0,D1               ;overhead for bmu44: ~360
  69.                 divu    #44,D1
  70.                 bvs     .bmup8              ;too big (> 2,883,540)
  71.                 movem.l D2-D7/A2-A6,-(sp)   ;use D2-D7/A2-A6 (11 regs)
  72.                 move.l  #11*4,D0
  73.                 bra     .bmu44b
  74. .bmu44a         movem.l (A0)+,D2-D7/A2-A6   ;12 + 8*11  ttl 214/44bytes
  75.                 movem.l D2-D7/A2-A6,(A1)    ;8  + 8*11  4.86 cycles/byte
  76.                 add.l   D0,A1               ;8
  77. .bmu44b         dbf     D1,.bmu44a          ;10
  78.                 swap    D1                  ;D0<15:7> already contain 0
  79.                 move.w  D1,D0               ;D0 = remainder
  80.                 movem.l (sp)+,D2-D7/A2-A6
  81.  
  82. .bmup8          move.w  D0,D1               ;D1<2:0> = #bytes left later
  83.                 lsr.l   #3,D0               ;divide by 8
  84.                 bra     .bmu8b
  85. .bmu8a          move.l  (A0)+,(A1)+         ;20         total 50/8bytes
  86.                 move.l  (A0)+,(A1)+         ;20         = 6.25 cycles/byte
  87. .bmu8b          dbf     D0,.bmu8a           ;10
  88.                 sub.l   #$10000,D0
  89.                 bcc     .bmu8a
  90.                 move.w  D1,D0               ;D0 = 0 to 7 bytes
  91.                 and.l   #7,D0
  92.                 bne     .bmup1
  93.                 rts
  94.  
  95. .bmu1a          move.b  (A0)+,(A1)+
  96. .bmup1
  97. .bmu1b          dbf     D0,.bmu1a
  98.                 sub.l   #$10000,D0
  99.                 bcc     .bmu1a
  100. .bmend          rts
  101.  
  102.