*************************************
*   CopyMemQuicker060 with Move16   *
*         Include File V1.4         *
*       written by Dirk Busse       *
*            3. Apr. 1999           *
*************************************

PatchStart

        tst.l   d0
        beq.b   squit
        move.w  a1,d1   ;Zieladresse nach d1 (nur die ersten zwei Bits werden benötigt)
        btst    #0,d1
        beq.b   .skip1
        move.b  (a0)+,(a1)+    ;Zieladresse auf EVEN setzen
        subq.l  #1,d0
        beq.b   squit
        move.w  a1,d1
.skip1  btst    #1,d1
        beq.b   .skip2
        cmpi.l  #1,d0
        bne.b   .two
        move.b  (a0)+,(a1)+
        rts

;  cnop 0,4

.two    move.w  (a0)+,(a1)+    ;Zieladresse auf LONG setzen
        subq.l  #2,d0
        beq.b   squit
.skip2
        cmpi.l  #%0000100000010000,d0 ;prüfen, ob d0 >=2064
        bcc.b   bigmove

smlmove move.l  d0,d1
        lsr.w   #2,d1          ;d0 ist hier nur noch maximal 12Bit lang
        beq.b   .nolong
.loop   move.l  (a0)+,(a1)+
        subq.w  #1,d1
        bne.b   .loop

.nolong btst    #1,d0
        beq.b   .skip
        move.w  (a0)+,(a1)+    ;letztes Word uebertragen
.skip   btst    #0,d0
        beq.b   squit
        move.b  (a0)+,(a1)+    ;letztes Byte uebertragen
squit   rts

;  cnop 0,4

bigmove move.w  a1,d1
        btst    #2,d1
        beq.b   .skip1
        subq.l  #%100,d0       ;Zieladresse auf 8-Byte-Block legen
        move.l  (a0)+,(a1)+
        move.w  a1,d1
.skip1  btst    #3,d1
        beq.b   .dest16
        subq.l  #%1000,d0       ;Zieladresse auf 16-Byte-Block legen
        move.l  (a0)+,(a1)+
        move.l  (a0)+,(a1)+
.dest16 move.w  a0,d1
        andi.b  #15,d1
        bne.b   bigmov     ;wenn Quelladresse nicht im 16-Byte-Block liegt

        move.l  d0,d1
        lsr.l   #7,d1
.loop   move16  (a0)+,(a1)+
        move16  (a0)+,(a1)+
        move16  (a0)+,(a1)+
        move16  (a0)+,(a1)+
        move16  (a0)+,(a1)+
        move16  (a0)+,(a1)+
        move16  (a0)+,(a1)+
        move16  (a0)+,(a1)+
        subq.l  #1,d1
        bne.b   .loop
        and.w   #%0000000001111111,d0 ;die oberen 16 Bits werden ab hier nichtmehr berücksichtigt
        bne.b   smlmove
        rts

;  cnop 0,4

bigmov  move.l  d0,d1
        lsr.l   #6,d1
.loop   move.l  (a0)+,(a1)+
        move.l  (a0)+,(a1)+
        move.l  (a0)+,(a1)+
        move.l  (a0)+,(a1)+
        move.l  (a0)+,(a1)+
        move.l  (a0)+,(a1)+
        move.l  (a0)+,(a1)+
        move.l  (a0)+,(a1)+
        move.l  (a0)+,(a1)+
        move.l  (a0)+,(a1)+
        move.l  (a0)+,(a1)+
        move.l  (a0)+,(a1)+
        move.l  (a0)+,(a1)+
        move.l  (a0)+,(a1)+
        move.l  (a0)+,(a1)+
        move.l  (a0)+,(a1)+
        subq.l  #1,d1
        bne.b   .loop
        and.w   #%0000000000111111,d0 ;die oberen 16 Bits werden ab hier nichtmehr berücksichtigt
        bne.b   smlmove
        rts

  cnop 0,4
**************************************************************************

Quickest
        lsr.l   #2,d0
        cmpi.l  #%0000001000000100,d0 ;prüfen, ob d0 >=2064/4
        bcc.b   bigmo16

smlmovQ tst.w   d0          ;d0 ist hier nur noch maximal 10 Bit lang
        beq.b   squitQ
sloopQ  move.l  (a0)+,(a1)+
        subq.w  #1,d0
        bne.b   sloopQ
squitQ  rts

;  cnop 0,4

bigmo16 move.w  a1,d1
        btst    #2,d1
        beq.b   .skip1
        subq.l  #1,d0       ;Zieladresse auf 8-Byte-Block legen
        move.l  (a0)+,(a1)+
        move.w  a1,d1
.skip1  btst    #3,d1
        beq.b   .dest16
        subq.l  #2,d0       ;Zieladresse auf 16-Byte-Block legen
        move.l  (a0)+,(a1)+
        move.l  (a0)+,(a1)+
.dest16 move.w  a0,d1
        andi.b  #15,d1
        bne.b   bigmovQ     ;wenn Quelladresse nicht im 16-Byte-Block liegt

        move.l  d0,d1
        lsr.l   #5,d1
.loop   move16  (a0)+,(a1)+
        move16  (a0)+,(a1)+
        move16  (a0)+,(a1)+
        move16  (a0)+,(a1)+
        move16  (a0)+,(a1)+
        move16  (a0)+,(a1)+
        move16  (a0)+,(a1)+
        move16  (a0)+,(a1)+
        subq.l  #1,d1
        bne.b   .loop
        and.w   #%0000000000011111,d0 ;die oberen 16 Bits werden ab hier nichtmehr berücksichtigt
        bne.b   sloopQ
        rts

;  cnop 0,4

bigmovQ move.l  d0,d1
        lsr.l   #4,d1
.loop   move.l  (a0)+,(a1)+
        move.l  (a0)+,(a1)+
        move.l  (a0)+,(a1)+
        move.l  (a0)+,(a1)+
        move.l  (a0)+,(a1)+
        move.l  (a0)+,(a1)+
        move.l  (a0)+,(a1)+
        move.l  (a0)+,(a1)+
        move.l  (a0)+,(a1)+
        move.l  (a0)+,(a1)+
        move.l  (a0)+,(a1)+
        move.l  (a0)+,(a1)+
        move.l  (a0)+,(a1)+
        move.l  (a0)+,(a1)+
        move.l  (a0)+,(a1)+
        move.l  (a0)+,(a1)+
        subq.l  #1,d1
        bne.b   .loop
        and.w   #%0000000000001111,d0 ;die oberen 16 Bits werden ab hier nichtmehr berücksichtigt
        bne.b   sloopQ
        rts

  cnop 0,4

PatchEnd

