*************************************
*         CopyMemQuicker060 BeepCMQ *
*         Include File V1.0         *
*       written by Dirk Busse       *
*           19. Sep. 1998           *
*************************************

PatchStart

;        move.l  a6,-(sp)
;        movea.l intbase,a6
;        move.l  a0,-(sp)
;        move.l  a1,-(sp)
;        move.l  d0,-(sp)
;        move.l  #0,a0
;        jsr     _LVODisplayBeep(a6)
;        move.l  (sp)+,d0
;        movea.l (sp)+,a1
;        movea.l (sp)+,a0
;        movea.l (sp)+,a6

        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

.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
        bpl.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

bigmove btst    #0,d0
        beq.b   .skip1
        subq.l  #1,d0
        move.b  (a0,d0.l),(a1,d0.l) ;letztes Byte übertragen
.skip1  btst    #1,d0
        beq.b   .skip2
        subq.l  #2,d0
        move.w  (a0,d0.l),(a1,d0.l) ;letztes Word übertragen
.skip2  lsr.l   #2,d0               ;jetzt ist d0 durch 4 teilbar
        jmp     bigmo16

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

Quickest
        move.l  a6,-(sp)
        movea.l intbase,a6
        move.l  a0,-(sp)
        move.l  a1,-(sp)
        move.l  d0,-(sp)
        move.l  #0,a0
        jsr     _LVODisplayBeep(a6)
        move.l  (sp)+,d0
        movea.l (sp)+,a1
        movea.l (sp)+,a0
        movea.l (sp)+,a6

        lsr.l   #2,d0
        cmpi.l  #%0000001000000100,d0 ;prüfen, ob d0 > 2064/4
        bpl.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

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

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

intbase
        dc.l    $0

PatchEnd

