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

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