home *** CD-ROM | disk | FTP | other *** search
/ World of A1200 / World_Of_A1200.iso / programs / system / copymemquicker / source.lha / source / cm020.asm < prev    next >
Assembly Source File  |  1992-02-11  |  3KB  |  158 lines

  1.     xdef    Start20
  2.     xdef    Quicker20
  3.     xdef    Quickest20
  4.     xdef    CopyLen20
  5. Quicker20    equ    Quicker-Start20
  6. Quickest20    equ    Quickest-Start20
  7. CopyLen20    equ    Stop20-Start20
  8.  
  9. Start20
  10. Quicker
  11.     moveq    #16,d1
  12.     cmp.l    d1,d0
  13.     bcs.s    tinycpy        ; too small to gain anything
  14.     move.w    a0,d1
  15.     lsr.b    #1,d1        ; fastest test for evenness
  16.     bcc.s    evena0
  17.     move.b    (a0)+,(a1)+
  18.     subq.l    #1,d0
  19. evena0    lsr.b    #1,d1
  20.     bcc.s    longa0
  21.  
  22.     move.w    a1,d1
  23.     lsr.b    #1,d1
  24.     bcc.s    quickplus
  25.     moveq    #36*3+2,d1
  26.     cmp.l    d1,d0
  27.     bcs.s    tinycpy
  28.     move.b    (a0)+,(a1)+
  29.     move.b    (a0)+,(a1)+
  30.     subq.l    #2,d0
  31.     bra.s    unevcpy
  32.  
  33. longa0    move.w    a1,d1
  34.     lsr.b    #1,d1
  35.     bcc.s    evenquicker
  36.     moveq    #36*3,d1
  37.     cmp.l    d1,d0
  38.     bcs.s    tinycpy
  39.  
  40. * This is tricky!  They said it couldn't be done...
  41. unevcpy    movem.l    a2-a4/d2-d7,-(sp)
  42.     moveq    #32,d1        ; 8 registers of 4 bytes
  43.     move.w    d1,a3
  44.     moveq    #36,d1        ; as above plus 4 "roundoff" bytes
  45.     move.w    d1,a4
  46.     sub.l    d1,d0
  47.     move.l    d0,a2
  48. uloop    movem.l    (a0)+,d0-d7
  49.     rol.l    #8,d0
  50.     rol.l    #8,d1
  51.     rol.l    #8,d2
  52.     rol.l    #8,d3
  53.     rol.l    #8,d4
  54.     rol.l    #8,d5
  55.     rol.l    #8,d6
  56.     rol.l    #8,d7
  57.     move.b    d0,(a1)+
  58.     move.b    d1,d0
  59.     move.b    d2,d1
  60.     move.b    d3,d2
  61.     move.b    d4,d3
  62.     move.b    d5,d4
  63.     move.b    d6,d5
  64.     move.b    d7,d6
  65.     move.b    (a0)+,d7
  66.     movem.l    d0-d7,(a1)
  67.     adda.w    a3,a1
  68.     move.b    (a0)+,(a1)+    ; even up to next longword
  69.     move.b    (a0)+,(a1)+
  70.     move.b    (a0)+,(a1)+
  71.     move.l    a2,d0
  72.     sub.l    a4,d0
  73.     movea.l    d0,a2
  74.     bcc.s    uloop
  75.     add.w    a4,d0
  76.     movem.l    (sp)+,a2-a4/d2-d7
  77.     subq.b    #1,d0
  78.     bcs.s    tdone
  79.  
  80. tloop    move.b    (a0)+,(a1)+
  81. tinycpy    dbf    d0,tloop
  82. tdone    rts
  83.  
  84.     dc.w    0
  85.  
  86. quickplus
  87.     move.w    (a0)+,(a1)+
  88.     subq.l    #2,d0
  89. evenquicker
  90.     cmpi.l    #44*4,d0
  91.     bcs.s    smlmov
  92.     moveq    #44,d1        ; 11 registers of 4 bytes
  93.     sub.l    d1,d0
  94.     movem.l    d2-d7/a2-a6,-(sp)
  95. bigmov    movem.l    (a0)+,d2-d7/a2-a6
  96.     movem.l    d2-d7/a2-a6,(a1)
  97.     adda.w    d1,a1
  98.     sub.l    d1,d0
  99.     bcc.s    bigmov
  100.     add.w    d1,d0
  101.     movem.l    (sp)+,d2-d7/a2-a6
  102.  
  103. smlmov    lsr.w    #1,d0
  104.     beq.s    even01
  105.     bcs.s    sm13
  106.     lsr.w    #1,d0
  107.     beq.s    even2
  108.     bcs.s    sm2
  109. sm0    subq.w    #1,d0
  110. loop0    move.l    (a0)+,(a1)+
  111.     dbf    d0,loop0
  112. even0    rts
  113. sm2    subq.w    #1,d0
  114. loop2    move.l    (a0)+,(a1)+
  115.     dbf    d0,loop2
  116. even2    move.w    (a0),(a1)
  117.     rts
  118. sm13    lsr.w    #1,d0
  119.     beq.s    even3
  120.     bcs.s    sm3
  121. sm1    subq.w    #1,d0
  122. loop1    move.l    (a0)+,(a1)+
  123.     dbf    d0,loop1
  124. even1    move.b    (a0),(a1)
  125.     rts
  126. sm3    subq.w    #1,d0
  127. loop3    move.l    (a0)+,(a1)+
  128.     dbf    d0,loop3
  129. even3    move.w    (a0)+,(a1)+
  130.     move.b    (a0),(a1)
  131.     rts
  132. even01    bcs.s    even1
  133.     rts
  134.  
  135.     dc.w    0
  136.  
  137. Quickest
  138.     cmpi.l    #44*4,d0
  139.     bcs.s    smlmovQ
  140.     moveq    #44,d1        ; 11 registers of 4 bytes
  141.     sub.l    d1,d0
  142.     movem.l    d2-d7/a2-a6,-(sp)
  143. bigmovQ    movem.l    (a0)+,d2-d7/a2-a6
  144.     movem.l    d2-d7/a2-a6,(a1)
  145.     adda.w    d1,a1
  146.     sub.l    d1,d0
  147.     bcc.s    bigmovQ
  148.     add.w    d1,d0
  149.     movem.l    (sp)+,d2-d7/a2-a6
  150. smlmovQ    lsr.w    #2,d0
  151.     beq.s    done
  152.     subq.w    #1,d0
  153. qloop    move.l    (a0)+,(a1)+
  154.     dbf    d0,qloop
  155. done    rts
  156. Stop20
  157.  
  158.