        mc68040
        XDEF    _AmigaCC040
                
_AmigaCC040     ;IN: D0 - X
        ;    D1 - Y
        ;    D2 - BYTESPERLINE
        ;    D3 - WIDTH
        ;    D4 - HEIGHT
        ;    A0 - SOURCE BUFFER
        ;    A1 - DESTINATION BUFFER
        ;NOTES: X MUST BE DIVISIBLE BY 16
        ;       A0 and A1 MUST BE DIVISIBLE BY 16 (MOVE16 restriction)
        ;       This routine is for 8Bit copy and must no be used
        ;       to copy rectangles in 16/24/32 bits
        ;       BYTESPERLINE MUST BE DIVISIBLE BY 16
        ;       MAXIMUN WIDTH = 2048 pixels

        

        MOVEM.L D0-D7/A0-A1,-(A7)
        SUBQ.W  #1,D4
        TST.W   D1
        BEQ.S   .NOD1
        MOVE.W  D1,D5
        MULU.W  D2,D5
        ADD.L   D5,A0
        ADD.L   D5,A1
.NOD1   CMP.W   D2,D3
        BEQ     .VERYFAST
        ADD.W   D0,A0
        ADD.W   D0,A1
        SUB.W   D3,D2
        MOVE.W  D3,D0
        LSR.W   #4,D0
        EOR.W   #$7F,D0
        LSL.W   #2,D0
        LSR.W   #1,D3
        AND.W   #$7,D3
.BIGLOOP        MOVE.W  D3,D1
        JMP     .LOOP(PC,D0.W)
.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)+
        MOVE16  (A0)+,(A1)+
        MOVE16  (A0)+,(A1)+
        MOVE16  (A0)+,(A1)+
        MOVE16  (A0)+,(A1)+
        MOVE16  (A0)+,(A1)+
        MOVE16  (A0)+,(A1)+
        MOVE16  (A0)+,(A1)+
        MOVE16  (A0)+,(A1)+
        MOVE16  (A0)+,(A1)+
        MOVE16  (A0)+,(A1)+
        MOVE16  (A0)+,(A1)+
        MOVE16  (A0)+,(A1)+
        MOVE16  (A0)+,(A1)+
        MOVE16  (A0)+,(A1)+
        MOVE16  (A0)+,(A1)+
        MOVE16  (A0)+,(A1)+
        MOVE16  (A0)+,(A1)+
        MOVE16  (A0)+,(A1)+
        MOVE16  (A0)+,(A1)+
        MOVE16  (A0)+,(A1)+
        MOVE16  (A0)+,(A1)+
        MOVE16  (A0)+,(A1)+
        MOVE16  (A0)+,(A1)+
        MOVE16  (A0)+,(A1)+
        MOVE16  (A0)+,(A1)+
        MOVE16  (A0)+,(A1)+
        MOVE16  (A0)+,(A1)+
        MOVE16  (A0)+,(A1)+
        MOVE16  (A0)+,(A1)+
        MOVE16  (A0)+,(A1)+
        MOVE16  (A0)+,(A1)+
        MOVE16  (A0)+,(A1)+
        MOVE16  (A0)+,(A1)+
        MOVE16  (A0)+,(A1)+
        MOVE16  (A0)+,(A1)+
        MOVE16  (A0)+,(A1)+
        MOVE16  (A0)+,(A1)+
        MOVE16  (A0)+,(A1)+
        MOVE16  (A0)+,(A1)+
        MOVE16  (A0)+,(A1)+
        MOVE16  (A0)+,(A1)+
        MOVE16  (A0)+,(A1)+
        MOVE16  (A0)+,(A1)+
        MOVE16  (A0)+,(A1)+
        MOVE16  (A0)+,(A1)+
        MOVE16  (A0)+,(A1)+
        MOVE16  (A0)+,(A1)+
        MOVE16  (A0)+,(A1)+
        MOVE16  (A0)+,(A1)+
        MOVE16  (A0)+,(A1)+
        MOVE16  (A0)+,(A1)+
        MOVE16  (A0)+,(A1)+
        MOVE16  (A0)+,(A1)+
        MOVE16  (A0)+,(A1)+
        MOVE16  (A0)+,(A1)+
        MOVE16  (A0)+,(A1)+
        MOVE16  (A0)+,(A1)+
        MOVE16  (A0)+,(A1)+
        MOVE16  (A0)+,(A1)+
        MOVE16  (A0)+,(A1)+
        MOVE16  (A0)+,(A1)+
        MOVE16  (A0)+,(A1)+
        MOVE16  (A0)+,(A1)+
        MOVE16  (A0)+,(A1)+
        MOVE16  (A0)+,(A1)+
        MOVE16  (A0)+,(A1)+
        MOVE16  (A0)+,(A1)+
        MOVE16  (A0)+,(A1)+
        MOVE16  (A0)+,(A1)+
        MOVE16  (A0)+,(A1)+
        MOVE16  (A0)+,(A1)+
        MOVE16  (A0)+,(A1)+
        MOVE16  (A0)+,(A1)+
        MOVE16  (A0)+,(A1)+
        MOVE16  (A0)+,(A1)+
        MOVE16  (A0)+,(A1)+
        MOVE16  (A0)+,(A1)+
        MOVE16  (A0)+,(A1)+
        MOVE16  (A0)+,(A1)+
        MOVE16  (A0)+,(A1)+
        MOVE16  (A0)+,(A1)+
        MOVE16  (A0)+,(A1)+
        MOVE16  (A0)+,(A1)+
        MOVE16  (A0)+,(A1)+
        MOVE16  (A0)+,(A1)+
        MOVE16  (A0)+,(A1)+
        MOVE16  (A0)+,(A1)+
        MOVE16  (A0)+,(A1)+
        MOVE16  (A0)+,(A1)+
        MOVE16  (A0)+,(A1)+
        MOVE16  (A0)+,(A1)+
        MOVE16  (A0)+,(A1)+
        MOVE16  (A0)+,(A1)+
        MOVE16  (A0)+,(A1)+
        MOVE16  (A0)+,(A1)+
        MOVE16  (A0)+,(A1)+
        MOVE16  (A0)+,(A1)+
        MOVE16  (A0)+,(A1)+
        MOVE16  (A0)+,(A1)+
        MOVE16  (A0)+,(A1)+
        MOVE16  (A0)+,(A1)+
        MOVE16  (A0)+,(A1)+
        MOVE16  (A0)+,(A1)+
        MOVE16  (A0)+,(A1)+
        MOVE16  (A0)+,(A1)+
        MOVE16  (A0)+,(A1)+
        MOVE16  (A0)+,(A1)+
        MOVE16  (A0)+,(A1)+
        MOVE16  (A0)+,(A1)+
        MOVE16  (A0)+,(A1)+
        MOVE16  (A0)+,(A1)+
        MOVE16  (A0)+,(A1)+
        MOVE16  (A0)+,(A1)+
        MOVE16  (A0)+,(A1)+
        MOVE16  (A0)+,(A1)+
        MOVE16  (A0)+,(A1)+
        MOVE16  (A0)+,(A1)+
        MOVE16  (A0)+,(A1)+
        MOVE16  (A0)+,(A1)+
        DBF     D1,.LOOP2
        BRA.S   .DH
.LOOP2  MOVE.W  (A0)+,(A1)+
        DBF     D1,.LOOP2
.DH     ADD.W   D2,A0
        ADD.W   D2,A1
        DBF     D4,.BIGLOOP
        MOVEM.L (A7)+,D0-D7/A0-A1
        RTS
.VERYFAST       LSR.W   #4,D3
        EOR.W   #$7F,D3
        LSL.W   #2,D3
.BIGGEST        JMP     .LOOP3(PC,D3.W)
.LOOP3  MOVE16  (A0)+,(A1)+
        MOVE16  (A0)+,(A1)+
        MOVE16  (A0)+,(A1)+
        MOVE16  (A0)+,(A1)+
        MOVE16  (A0)+,(A1)+
        MOVE16  (A0)+,(A1)+
        MOVE16  (A0)+,(A1)+
        MOVE16  (A0)+,(A1)+
        MOVE16  (A0)+,(A1)+
        MOVE16  (A0)+,(A1)+
        MOVE16  (A0)+,(A1)+
        MOVE16  (A0)+,(A1)+
        MOVE16  (A0)+,(A1)+
        MOVE16  (A0)+,(A1)+
        MOVE16  (A0)+,(A1)+
        MOVE16  (A0)+,(A1)+
        MOVE16  (A0)+,(A1)+
        MOVE16  (A0)+,(A1)+
        MOVE16  (A0)+,(A1)+
        MOVE16  (A0)+,(A1)+
        MOVE16  (A0)+,(A1)+
        MOVE16  (A0)+,(A1)+
        MOVE16  (A0)+,(A1)+
        MOVE16  (A0)+,(A1)+
        MOVE16  (A0)+,(A1)+
        MOVE16  (A0)+,(A1)+
        MOVE16  (A0)+,(A1)+
        MOVE16  (A0)+,(A1)+
        MOVE16  (A0)+,(A1)+
        MOVE16  (A0)+,(A1)+
        MOVE16  (A0)+,(A1)+
        MOVE16  (A0)+,(A1)+
        MOVE16  (A0)+,(A1)+
        MOVE16  (A0)+,(A1)+
        MOVE16  (A0)+,(A1)+
        MOVE16  (A0)+,(A1)+
        MOVE16  (A0)+,(A1)+
        MOVE16  (A0)+,(A1)+
        MOVE16  (A0)+,(A1)+
        MOVE16  (A0)+,(A1)+
        MOVE16  (A0)+,(A1)+
        MOVE16  (A0)+,(A1)+
        MOVE16  (A0)+,(A1)+
        MOVE16  (A0)+,(A1)+
        MOVE16  (A0)+,(A1)+
        MOVE16  (A0)+,(A1)+
        MOVE16  (A0)+,(A1)+
        MOVE16  (A0)+,(A1)+
        MOVE16  (A0)+,(A1)+
        MOVE16  (A0)+,(A1)+
        MOVE16  (A0)+,(A1)+
        MOVE16  (A0)+,(A1)+
        MOVE16  (A0)+,(A1)+
        MOVE16  (A0)+,(A1)+
        MOVE16  (A0)+,(A1)+
        MOVE16  (A0)+,(A1)+
        MOVE16  (A0)+,(A1)+
        MOVE16  (A0)+,(A1)+
        MOVE16  (A0)+,(A1)+
        MOVE16  (A0)+,(A1)+
        MOVE16  (A0)+,(A1)+
        MOVE16  (A0)+,(A1)+
        MOVE16  (A0)+,(A1)+
        MOVE16  (A0)+,(A1)+
        MOVE16  (A0)+,(A1)+
        MOVE16  (A0)+,(A1)+
        MOVE16  (A0)+,(A1)+
        MOVE16  (A0)+,(A1)+
        MOVE16  (A0)+,(A1)+
        MOVE16  (A0)+,(A1)+
        MOVE16  (A0)+,(A1)+
        MOVE16  (A0)+,(A1)+
        MOVE16  (A0)+,(A1)+
        MOVE16  (A0)+,(A1)+
        MOVE16  (A0)+,(A1)+
        MOVE16  (A0)+,(A1)+
        MOVE16  (A0)+,(A1)+
        MOVE16  (A0)+,(A1)+
        MOVE16  (A0)+,(A1)+
        MOVE16  (A0)+,(A1)+
        MOVE16  (A0)+,(A1)+
        MOVE16  (A0)+,(A1)+
        MOVE16  (A0)+,(A1)+
        MOVE16  (A0)+,(A1)+
        MOVE16  (A0)+,(A1)+
        MOVE16  (A0)+,(A1)+
        MOVE16  (A0)+,(A1)+
        MOVE16  (A0)+,(A1)+
        MOVE16  (A0)+,(A1)+
        MOVE16  (A0)+,(A1)+
        MOVE16  (A0)+,(A1)+
        MOVE16  (A0)+,(A1)+
        MOVE16  (A0)+,(A1)+
        MOVE16  (A0)+,(A1)+
        MOVE16  (A0)+,(A1)+
        MOVE16  (A0)+,(A1)+
        MOVE16  (A0)+,(A1)+
        MOVE16  (A0)+,(A1)+
        MOVE16  (A0)+,(A1)+
        MOVE16  (A0)+,(A1)+
        MOVE16  (A0)+,(A1)+
        MOVE16  (A0)+,(A1)+
        MOVE16  (A0)+,(A1)+
        MOVE16  (A0)+,(A1)+
        MOVE16  (A0)+,(A1)+
        MOVE16  (A0)+,(A1)+
        MOVE16  (A0)+,(A1)+
        MOVE16  (A0)+,(A1)+
        MOVE16  (A0)+,(A1)+
        MOVE16  (A0)+,(A1)+
        MOVE16  (A0)+,(A1)+
        MOVE16  (A0)+,(A1)+
        MOVE16  (A0)+,(A1)+
        MOVE16  (A0)+,(A1)+
        MOVE16  (A0)+,(A1)+
        MOVE16  (A0)+,(A1)+
        MOVE16  (A0)+,(A1)+
        MOVE16  (A0)+,(A1)+
        MOVE16  (A0)+,(A1)+
        MOVE16  (A0)+,(A1)+
        MOVE16  (A0)+,(A1)+
        MOVE16  (A0)+,(A1)+
        MOVE16  (A0)+,(A1)+
        MOVE16  (A0)+,(A1)+
        MOVE16  (A0)+,(A1)+
        MOVE16  (A0)+,(A1)+
        MOVE16  (A0)+,(A1)+
        DBF     D4,.BIGGEST
        MOVEM.L (A7)+,D0-D7/A0-A1
        RTS
