    incdir "include:"
    include "rtgmaster/rtgc2p.i"
    include "rtgmaster/rtgmaster.i"
    include "rtgmaster/rtgsublibs.i"
    include "rtgmaster/rtgAMI.i"
    include "intuition/screens.i"
    include "exec/memory.i"
    moveq #0,d0
    rts
.s  dc.l "c2p!"
    dc.l .s
    dc.l 1
    dc.l Structure

Structure
    dc.w CI_256+CI_128+CI_64+CI_EHB+CI_32+CI_16+CI_8+CI_4+CI_2
    dc.w CI_68060D+CI_68040+CI_68030D+CI_68020
    dc.w 0
    dc.b 0
    dc.b 0
    dc.l c2p_1x1
    dc.w 32
    dc.w 2
    dc.w CI_Smaller
    dc.b 'AMI '
    dc.l Name
    dc.l Init
    dc.l Expunge
    dc.l chunky2planar
    dc.l chunky2planarI
    dc.l 0
    dc.l 0
    dc.b 0
    dc.b 0,0,0 ; Test
    even

Init:
    movem.l a0/a1/a6/d0/d1,-(sp)
    move.l #0,rs_c2pdata(a0)
    movem.l (sp)+,a0/a1/a6/d0/d1
    move.l #0,d0
    rts
Error:
Name: dc.b 'c2p for 020 (Noninterl.+Interl.)',0
    even

Expunge:
    rts
chunky2planarI:
                movem.l d0/d2/d3/d4/a3/d7,-(sp)
                move.l #0,d7
                cmp.l #c2p_1x1,d0
                beq .OK
                cmp.l #c2p_Best,d0
                beq .OK
                cmp.l #c2p_BestD,d0
                beq .OK
                cmp.l #c2p_Fastest,d0
                beq .OK
                cmp.l #c2p_FastestD,d0
                beq .OK
                cmp.l #c2p_Selected,d0
                beq .Selected
                cmp.l #c2p_SelectedD,d0
                beq .Selected
                move.l #c2p_warn_Wrong_Pixelmode,d7
                bra .OK
.Selected:
                move.l rs_c2pcurr(a3),d3
                cmp.l #c2p_1x1,d3
                beq .OK
                move.l #c2p_warn_Wrong_Pixelmode,d7
                bra .OK
.OK:
                sub.l d0,d0
                sub.l d1,d1
                move.l rsAMI_ScreenHandle(a3),a3
                move.w sc_Width(a3),d0
                move.w sc_Height(a3),d1
                move.l d1,d2
                mulu d0,d2
                lsr.l #3,d2
                move.l d0,d3
                lsr.l #3,d3

                add.w (a4)+,a1
                move.w (a4)+,d4
                mulu d0,d4
                lsr.l #3,d4
                add.w d4,a1


.w:
                move.w (a4)+,d0
                move.w (a4),d1
                cmp.l #1,.Merk
                beq c2p
                move.l #1,.Merk
                move.l a3,-(sp)
                move.l rsAMI_ScreenHandle(a3),a3
                ;move.w sc_Width(a3),d0
                ;move.w sc_Height(a3),d1
                move.l (sp)+,a3
                lea rsAMI_Bitmap1(a3),a3
                sub.l d3,d3
                bra c2p
                move.l a3,-(sp)
                bra .Mistake
.Merk: dc.l 0
.Merk2: dc.l 0
.Mistake:
                move.l (sp)+,a3
                move.l #1,.Merk2
                movem.l (sp)+,d0/d2/d3/d4/a3/a7
                move.l d7,d0
                movem.l d2/a6,-(sp)
                move.l $4,a6
                move.l #0,a1
                jsr -294(a6)
                move.l d0,a1
                movem.l (sp)+,d0/a6
                move.l a6,-(sp)
                move.l $4,a6
                move.l d0,d1
                sub.l d0,d0
                bset d1,d0
                jsr -324(a6)
                move.l (sp)+,a6
                move.l #c2p_err_internal,d0
                rts
chunky2planar:
                movem.l d0/d2/d3/d4/a3/d7,-(sp)
                move.l #0,d7
                cmp.l #c2p_1x1,d0
                beq .OK
                cmp.l #c2p_Best,d0
                beq .OK
                cmp.l #c2p_BestD,d0
                beq .OK
                cmp.l #c2p_Fastest,d0
                beq .OK
                cmp.l #c2p_FastestD,d0
                beq .OK
                cmp.l #c2p_Selected,d0
                beq .Selected
                cmp.l #c2p_SelectedD,d0
                beq .Selected
                move.l #c2p_warn_Wrong_Pixelmode,d7
                bra .OK
.Selected:
                move.l rs_c2pcurr(a3),d3
                cmp.l #c2p_1x1,d3
                beq .OK
                move.l #c2p_warn_Wrong_Pixelmode,d7
                bra .OK
.OK:
                sub.l d0,d0
                sub.l d1,d1
                move.l rsAMI_ScreenHandle(a3),a3
                move.w sc_Width(a3),d0
                move.w sc_Height(a3),d1
                move.l d1,d2
                mulu d0,d2
                lsr.l #3,d2
                move.l d0,d3
                lsr.l #3,d3
                ;tst.l (a4)+
                sub.l d4,d4
                add.w (a4)+,a1
                move.w (a4)+,d4
                mulu d0,d4
                lsr.l #3,d4
                add.w d4,a1


.w:
                move.w (a4)+,d0
                move.w (a4),d1
                cmp.l #1,.Merk
                beq c2p
                move.l #1,.Merk
                move.l a3,-(sp)
                move.l rsAMI_ScreenHandle(a3),a3
                ;move.w sc_Width(a3),d0
                ;move.w sc_Height(a3),d1
                move.l (sp)+,a3
                lea rsAMI_Bitmap1(a3),a3
                bra c2p
                move.l a3,-(sp)
                bra .Mistake
.Merk: dc.l 0
.Merk2: dc.l 0
.Mistake:
                move.l (sp)+,a3
                move.l #1,.Merk2
                movem.l (sp)+,d0/d2/d3/d4/a3/a7
                move.l d7,d0
                movem.l d2/a6,-(sp)
                move.l $4,a6
                move.l #0,a1
                jsr -294(a6)
                move.l d0,a1
                movem.l (sp)+,d0/a6
                move.l a6,-(sp)
                move.l $4,a6
                move.l d0,d1
                sub.l d0,d0
                bset d1,d0
                jsr -324(a6)
                move.l (sp)+,a6
                move.l #c2p_err_internal,d0
                rts

width           equ     320             ; must be multiple of 32
height          equ     200
plsiz           equ     (width/8)*height

c2p:
_chunky2planar:
                ;a0 = chunky buffer
                ;a1 = first bitplane

        movem.l d2-d7/a2-a6,-(sp)
    
exit
                movea.l d2,a5
                lsl.l   #3,d2
                sub.l   a5,d2
                subq.l  #2,d2
                movea.l d2,a6

                lsr.w   #4,d0
                ext.l   d0
                move.l  d0,d4
                subq.l  #1,d4
                move.l  d4,-(sp)

                add.l   d0,d0
                sub.l   d0,d3
                sub.l   a6,d3
                move.l  d3,-(sp)

                move.w  d1,d7
                subq.w  #1,d7

                movea.l #$f0f0f0f0,a2
                movea.l #$cccccccc,a3
                movea.l #$aaaa5555,a4
                move.l  a2,d6

                swap    d7
                move.w  (6,sp),d7

                move.l  (a0)+,d0
                move.l  (a0)+,d1
                move.l  (a0)+,d2
                move.l  (a0)+,d3

                move.l  d0,d4
                and.l   d6,d0
                eor.l   d0,d4
                lsl.l   #4,d4

                bra.w   same_from_here

                cnop    0,4

outerloop       swap    d7
                move.w  (6,sp),d7

                move.w  d5,(a1)
                adda.l  a5,a1
                swap    d5

                move.w  d5,(a1)
                adda.l  (sp),a1

                movem.l (a0)+,d0-d3
                move.l  d0,d5
                swap    d0
                rol.l   #8,d2
                move.w  d0,d4
                move.b  d2,d4
                swap    d4
                swap    d2
                move.w  d2,d4
                move.b  d0,d4
                ror.w   #8,d4
                move.b  d2,d5
                swap    d5
                swap    d2
                move.w  d2,d5
                swap    d0
                move.b  d0,d5
                ror.w   #8,d5

                move.l  d1,d2
                swap    d1
                rol.l   #8,d3
                move.w  d1,d0
                move.b  d3,d0
                swap    d0
                swap    d3
                move.w  d3,d0
                move.b  d1,d0
                ror.w   #8,d0
                move.b  d3,d2
                swap    d2
                swap    d3
                move.w  d3,d2
                swap    d1
                move.b  d1,d2
                ror.w   #8,d2

                move.l  d2,d3
                move.l  d0,d2
                move.l  d4,d0
                move.l  d5,d1

                move.l  d0,d4
                and.l   d6,d0
                eor.l   d0,d4
                lsl.l   #4,d4

                bra.b   same_from_here

innerloop
                move.w  d5,(a1)
                adda.l  a5,a1
                swap    d5

                move.w  d5,(a1)
                suba.l  a6,a1

                move.l  (a0)+,d0
                move.l  d0,d5
                move.l  (a0)+,d1
                swap    d0
                move.l  (a0)+,d2
                rol.l   #8,d2
                move.w  d0,d4
                move.b  d2,d4
                swap    d4
                swap    d2
                move.w  d2,d4
                move.b  d0,d4
                ror.w   #8,d4
                move.b  d2,d5
                swap    d5
                swap    d2
                move.w  d2,d5
                swap    d0
                move.b  d0,d5
                ror.w   #8,d5

                move.l  d1,d2
                swap    d1
                move.l  (a0)+,d3
                rol.l   #8,d3
                move.w  d1,d0
                move.b  d3,d0
                swap    d0
                swap    d3
                move.w  d3,d0
                move.b  d1,d0
                ror.w   #8,d0
                move.b  d3,d2
                swap    d2
                swap    d3
                move.w  d3,d2
                swap    d1
                move.b  d1,d2
                ror.w   #8,d2

                move.l  d2,d3
                move.l  d0,d2
                move.l  d4,d0
                move.l  d5,d1

;               move.l  d0,d4
                and.l   d6,d0
                eor.l   d0,d4
                lsl.l   #4,d4

same_from_here  move.l  d2,d5
                and.l   d6,d5
                eor.l   d5,d2
                lsr.l   #4,d5
                or.l    d5,d0
                or.l    d4,d2
                move.l  d1,d4
                and.l   d6,d1
                eor.l   d1,d4
                move.l  d3,d5
                and.l   d6,d5
                eor.l   d5,d3
                lsr.l   #4,d5
                lsl.l   #4,d4
                or.l    d5,d1
                or.l    d4,d3
                move.l  a3,d6
                move.l  d2,d4
                and.l   d6,d2
                eor.l   d2,d4
                move.l  d3,d5
                and.l   d6,d5
                eor.l   d5,d3
                lsl.l   #2,d4
                or.l    d4,d3
                move.l  a4,d6
                move.l  d3,d4
                and.l   d6,d3
                eor.l   d3,d4
                lsr.w   #1,d4
                swap    d4
                add.w   d4,d4
                or.l    d4,d3

                move.w  d3,(a1)
                adda.l  a5,a1

                lsr.l   #2,d5
                or.l    d5,d2
                move.l  d2,d4
                and.l   d6,d2
                eor.l   d2,d4
                lsr.w   #1,d4

                swap    d3
                move.w  d3,(a1)
                adda.l  a5,a1

                swap    d4
                add.w   d4,d4
                or.l    d4,d2
                move.l  a3,d6
                move.l  d0,d4
                and.l   d6,d0
                eor.l   d0,d4

                move.w  d2,(a1)
                adda.l  a5,a1

                move.l  d1,d5
                and.l   d6,d5
                eor.l   d5,d1
                lsl.l   #2,d4
                or.l    d4,d1
                move.l  a4,d6

                swap    d2
                move.w  d2,(a1)
                adda.l  a5,a1

                move.l  d1,d4
                and.l   d6,d1
                eor.l   d1,d4
                lsr.w   #1,d4
                swap    d4
                add.w   d4,d4
                or.l    d4,d1

                move.w  d1,(a1)
                adda.l  a5,a1

                lsr.l   #2,d5
                or.l    d5,d0
                move.l  d0,d5
                and.l   d6,d0
                eor.l   d0,d5

                swap    d1
                move.w  d1,(a1)
                adda.l  a5,a1

                lsr.w   #1,d5
                swap    d5
                add.w   d5,d5
                or.l    d0,d5

                move.l  a2,d6

                dbra    d7,innerloop

                swap    d7
                dbra    d7,outerloop

                move.w  d5,(a1)
                adda.l  a5,a1
                swap    d5
                move.w  d5,(a1)

                addq.l  #8,sp
        movem.l (sp)+,d2-d7/a2-a6



Raus:

                move.l d7,d0
                movem.l (sp)+,d0/d2/d3/d4/a3/d7
                movem.l d2/a6,-(sp)
                move.l $4,a6
                move.l #0,a1
                jsr -294(a6)
                move.l d0,a1
                movem.l (sp)+,d0/a6
                move.l a6,-(sp)
                move.l $4,a6
                move.l d0,d1
                sub.l d0,d0
                bset d1,d0
                jsr -324(a6)
                move.l (sp)+,a6
                move.l #0,d0
                rts

                cnop    0,4

    END

