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

  1.     xdef    Start00
  2.     xdef    Quicker00
  3.     xdef    Quickest00
  4.     xdef    CopyLen00
  5. Quicker00    equ    Quicker-Start00
  6. Quickest00    equ    Quickest-Start00
  7. CopyLen00    equ    Stop00-Start00
  8.  
  9. Start00
  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    #34,d1        ; as above plus 1 "roundoff" byte
  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)+
  56.     move.l    a2,d0
  57.     sub.l    a4,d0
  58.     movea.l    d0,a2
  59.     bcc.s    uloop
  60.     add.w    a4,d0
  61.     movem.l    (sp)+,a2-a4/d2-d7
  62.     subq.b    #1,d0
  63.     bcs.s    tdone
  64.  
  65. tloop    move.b    (a0)+,(a1)+
  66. tinycpy    dbf    d0,tloop
  67. tdone    rts
  68.  
  69. evenquicker
  70.     moveq    #44*2,d1
  71.     cmp.l    d1,d0
  72.     bcs.s    smlmov
  73.     moveq    #44,d1        ; 11 registers of 4 bytes
  74.     sub.l    d1,d0
  75.     movem.l    d2-d7/a2-a6,-(sp)
  76. bigmov    movem.l    (a0)+,d2-d7/a2-a6
  77.     movem.l    d2-d7/a2-a6,(a1)
  78.     adda.w    d1,a1
  79.     sub.l    d1,d0
  80.     bcc.s    bigmov
  81.     add.w    d1,d0
  82.     movem.l    (sp)+,d2-d7/a2-a6
  83.  
  84. smlmov    lsr.w    #1,d0
  85.     beq.s    even01
  86.     bcs.s    sm13
  87.     lsr.w    #1,d0
  88.     beq.s    even2
  89.     bcs.s    sm2
  90. sm0    subq.w    #1,d0
  91. loop0    move.l    (a0)+,(a1)+
  92.     dbf    d0,loop0
  93. even0    rts
  94. sm2    subq.w    #1,d0
  95. loop2    move.l    (a0)+,(a1)+
  96.     dbf    d0,loop2
  97. even2    move.w    (a0),(a1)
  98.     rts
  99. sm13    lsr.w    #1,d0
  100.     beq.s    even3
  101.     bcs.s    sm3
  102. sm1    subq.w    #1,d0
  103. loop1    move.l    (a0)+,(a1)+
  104.     dbf    d0,loop1
  105. even1    move.b    (a0),(a1)
  106.     rts
  107. sm3    subq.w    #1,d0
  108. loop3    move.l    (a0)+,(a1)+
  109.     dbf    d0,loop3
  110. even3    move.w    (a0)+,(a1)+
  111.     move.b    (a0),(a1)
  112.     rts
  113. even01    bcs.s    even1
  114.     rts
  115.  
  116. Quickest
  117.     moveq    #44*2,d1
  118.     cmp.l    d1,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. Stop00
  137.