home *** CD-ROM | disk | FTP | other *** search
/ Club Amiga de Montreal - CAM / CAM_CD_1.iso / files / 171.lha / SupLib / bmov.asm < prev    next >
Assembly Source File  |  1988-04-28  |  3KB  |  103 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.  
  103.