*******************************************
*            CopyMemQuicker060            *
* Uses Move16 only in Adresses >$00ffffff *
*                                         *
*            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 cmpa.l  #$01000000,a0 ;Ist Quelladresse >$00ffffff ?
        bcs.b   bigmov
        cmpa.l  #$01000000,a1 ;Ist Zieladresse >$00ffffff ?
        bcs.b   bigmov
        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 cmpa.l  #$01000000,a0 ;Ist Quelladresse >$00ffffff ?
        bcs.b   bigmovQ
        cmpa.l  #$01000000,a1 ;Ist Zieladresse >$00ffffff ?
        bcs.b   bigmovQ
        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

