home *** CD-ROM | disk | FTP | other *** search
/ The Fred Fish Collection 1.5 / ffcollection-1-5-1992-11.iso / ff_progs / prog_c / suplib.lzh / SUPLIB / SRC / BMOV.ASM < prev    next >
Encoding:
Assembly Source File  |  1991-08-16  |  2.6 KB  |  108 lines

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