
    SECTION __MERGED,DATA

; Prototype see gfx.c
; a2 : Planes[8];
; a3 : chunky buffer
; d6 : Bitmap depth
; d7 : BitMap Size

    XDEF _CopyPlane2Chunky

    SECTION CODE

_CopyPlane2Chunky:

    movem   d0-d7/a0-a3,-(sp)

; backup the planepointers
    move.l  a2,a0    ; a2 = planebase !
    move.l  (a0)+,-(sp)
    move.l  (a0)+,-(sp)
    move.l  (a0)+,-(sp)
    move.l  (a0)+,-(sp)
    move.l  (a0)+,-(sp)
    move.l  (a0)+,-(sp)
    move.l  (a0)+,-(sp)
    move.l  (a0),-(sp)

    subq.w  #1,d6

next_pixel:
    
    move.l  a2,a0    ; a2 = planebase !
    move.l  (a0),a1
    move.w  d6,d5    ;            - 4
    sub.l   d0,d0
    move.l  d0,d1
    move.l  d0,d2
    move.l  d0,d3
    move.l  d0,d4

; ********* Copy PlanesData in Chunky Pixel

next_plane:

    move.b  (a1),d0  ; erste 8 Bit nach d0.low      - 8

    ror.w   #1,d0  ; high            - 6+2x = 8
    move.b  d0,d4  ;                 - 4
    swap.w  d0     ;                 - 4
    move.b  d4,d0  ;                 - 4
    ror.w   #1,d0  ; low             - 8
    move.b  d0,d1  ;                 - 4
    swap.w  d0     ;                 - 4

    ror.w   #1,d1  ; high            - 8
    move.b  d1,d4  ;                 - 4
    swap.w  d1     ;                 - 4
    move.b  d4,d1  ;                 - 4
    ror.w   #1,d1  ; low             - 8
    move.b  d1,d2  ;                 - 4
    swap.w  d1     ;                 - 4

    ror.w   #1,d2  ; high            - 8
    move.b  d2,d4  ;                 - 4
    swap.w  d2     ;                 - 4
    move.b  d4,d2  ;                 - 4
    ror.w   #1,d2  ; low             - 8
    move.b  d2,d3  ;                 - 4
    swap.w  d2     ;                 - 4

    ror.w   #1,d3  ; high            - 8
    move.b  d3,d4  ;                 - 4
    swap.w  d3     ;                 - 4
    move.b  d4,d3  ;                 - 4
    ror.w   #1,d3  ; low             - 4
    swap.w  d3     ;                 - 4

    addq.l  #1,a1  
    move.l  a1,(a0)+ ; Plane[i++] += 1;

    move.l  (a0),a1  ; a1 = planes[i] - 12
    dbra    d5,next_plane   ; --depth >= 0 ? jmp next_plane; - 12

    cmp.w   #7,d6
    beq     WriteBack

; if (depth < 8)

    move.w  #7,d4
    sub.w   d6,d4
    move.l  #$ff00ff00,d5
    and.l   d5,d0
    lsr.l   d4,d0
    and.l   d5,d1
    lsr.l   d4,d1
    and.l   d5,d2
    lsr.l   d4,d2
    and.l   d5,d3
    lsr.l   d4,d3

; ******** WriteBack the Chunky Data

WriteBack:
    lsr.l   #8,d3     ;             - 8+2x = 24 ( +2) 
    swap.w  d3        ;             - 4 ( +4)
    move.b  d3,(a3)+  ; pixel[0]    - 8
    swap.w  d3        ;             - 4  ( -18 !)
    move.b  d3,(a3)+  ; pixel[1]    - 8

    lsr.l   #8,d2     ;             - 24 ( +2)
    swap.w  d2        ;             - 4
    move.b  d2,(a3)+  ; pixel[2]    - 8
    swap.w  d2        ;             - 4  ( -18 !)
    move.b  d2,(a3)+  ; pixel[3]    - 8

    lsr.l   #8,d1     ;             - 24 ( +2)
    swap.w  d1        ;             - 4
    move.b  d1,(a3)+  ; pixel[4]    - 8
    swap.w  d1        ;             - 4  ( -18 !)
    move.b  d1,(a3)+  ; pixel[5]    - 8

    lsr.l   #8,d0     ;             - 24 ( +2)
    swap.w  d0        ;             - 4
    move.b  d0,(a3)+  ; pixel[6]    - 8
    swap.w  d0        ;             - 4  ( -18 !)
    move.b  d0,(a3)+  ; pixel[7]    - 8
   
    subq.l  #1,d7     ; d7 is a long !
    bne     next_pixel  ; --BMSize >= 0 ? jmp next_pixel;  - 12

; reinstall the plamepointers !
    move.l  a2,a0     ; a2 = planebase !
    add.l   #28,a0      ; plane[8] !!!
    move.l  (sp)+,(a0)  ; plane[--i] !!!
    move.l  (sp)+,-(a0)
    move.l  (sp)+,-(a0)
    move.l  (sp)+,-(a0)
    move.l  (sp)+,-(a0)
    move.l  (sp)+,-(a0)
    move.l  (sp)+,-(a0)
    move.l  (sp)+,-(a0)

    movem   (sp)+,d0-d7/a0-a3
    rts

    END
