home *** CD-ROM | disk | FTP | other *** search
- ; Chunky2Planar algorithm. [writes pipelined a little]
- ;
- ; Cpu only solution
- ; Optimised for 020+fastram
- ; Aim for less than 90ms for 320x200x256 on 14MHz 020
- ;
- ;
- ; NOTE: uses hardcoded values for screen size
- ; assumes planes are allocated contiguously
- ;
- ; -------------------------------------------------------------------
- ;
- ; void __asm c2p_020( register __a0 UBYTE *chunky,
- ; register __a1 PLANEPTR raster );
- ;
- ; -------------------------------------------------------------------
- ;
- ; see c2p_020_test.c for example of usage
-
-
- opt o-,l+,d+
-
- xdef _c2p_020
-
- WIDTH equ 320 ; MUST be multiple of 32
- HEIGHT equ 200
- plsiz equ (WIDTH/8)*HEIGHT
-
-
- cnop 0,4
-
- _c2p_020:
-
- movem.l d2-d7/a2-a6,-(sp)
- move.l a0,a2
- add.l #plsiz*8,a2 ;a2 = end of chunky buffer
-
- ;; Sweep thru the whole chunky data once,
- ;; Performing 3 merge operations on it.
-
- move.l #$00ff00ff,a3 ; load byte merge mask
- move.l #$0f0f0f0f,a4 ; load nibble merge mask
-
- firstsweep
- movem.l (a0),d0-d7 ;8+4n 40 cycles
- move.l d4,a6 a6 = CD
- move.w d0,d4 d4 = CB
- swap d4 d4 = BC
- move.w d4,d0 d0 = AC
- move.w a6,d4 d4 = BD
- move.l d5,a6 a6 = CD
- move.w d1,d5 d5 = CB
- swap d5 d5 = BC
- move.w d5,d1 d1 = AC
- move.w a6,d5 d5 = BD
- move.l d6,a6 a6 = CD
- move.w d2,d6 d6 = CB
- swap d6 d6 = BC
- move.w d6,d2 d2 = AC
- move.w a6,d6 d6 = BD
- move.l d7,a6 a6 = CD
- move.w d3,d7 d7 = CB
- swap d7 d7 = BC
- move.w d7,d3 d3 = AC
- move.w a6,d7 d7 = BD
- move.l d7,a6
- move.l d6,a5
- move.l a3,d6 ; d6 = 0x0x
- move.l a3,d7 ; d7 = 0x0x
- and.l d0,d6 ; d6 = 0b0r
- and.l d2,d7 ; d7 = 0j0z
- eor.l d6,d0 ; d0 = a0q0
- eor.l d7,d2 ; d2 = i0y0
- lsl.l #8,d6 ; d6 = b0r0
- lsr.l #8,d2 ; d2 = 0i0y
- or.l d2,d0 ; d0 = aiqy
- or.l d7,d6 ; d2 = bjrz
- move.l a3,d7 ; d7 = 0x0x
- move.l a3,d2 ; d2 = 0x0x
- and.l d1,d7 ; d7 = 0b0r
- and.l d3,d2 ; d2 = 0j0z
- eor.l d7,d1 ; d1 = a0q0
- eor.l d2,d3 ; d3 = i0y0
- lsl.l #8,d7 ; d7 = b0r0
- lsr.l #8,d3 ; d3 = 0i0y
- or.l d3,d1 ; d1 = aiqy
- or.l d2,d7 ; d3 = bjrz
-
- move.l a4,d2 ; d2 = 0x0x
- move.l a4,d3 ; d3 = 0x0x
- and.l d0,d2 ; d2 = 0b0r
- and.l d1,d3 ; d3 = 0j0z
- eor.l d2,d0 ; d0 = a0q0
- eor.l d3,d1 ; d1 = i0y0
- lsr.l #4,d1 ; d1 = 0i0y
- or.l d1,d0 ; d0 = aiqy
- move.l d0,(a0)+
- lsl.l #4,d2
- or.l d3,d2 ; d1 = bjrz
- move.l d2,(a0)+
-
- move.l a4,d3 ; d3 = 0x0x
- move.l a4,d1 ; d1 = 0x0x
- and.l d6,d3 ; d3 = 0b0r
- and.l d7,d1 ; d1 = 0j0z
- eor.l d3,d6 ; d6 = a0q0
- eor.l d1,d7 ; d7 = i0y0
- lsr.l #4,d7 ; d7 = 0i0y
- or.l d7,d6 ; d6 = aiqy
- move.l d6,(a0)+
- lsl.l #4,d3
- or.l d1,d3 ; d7 = bjrz
- move.l d3,(a0)+
-
- ; move.l d0,(a0)+
- ; move.l d2,(a0)+
- ; move.l d6,(a0)+
- ; move.l d3,(a0)+
- move.l a6,d7
- move.l a5,d6
- move.l a3,d0 ; d0 = 0x0x
- move.l a3,d1 ; d1 = 0x0x
- and.l d4,d0 ; d0 = 0b0r
- and.l d6,d1 ; d1 = 0j0z
- eor.l d0,d4 ; d4 = a0q0
- eor.l d1,d6 ; d6 = i0y0
- lsl.l #8,d0 ; d0 = b0r0
- lsr.l #8,d6 ; d6 = 0i0y
- or.l d6,d4 ; d4 = aiqy
- or.l d1,d0 ; d6 = bjrz
- move.l a3,d1 ; d1 = 0x0x
- move.l a3,d6 ; d6 = 0x0x
- and.l d5,d1 ; d1 = 0b0r
- and.l d7,d6 ; d6 = 0j0z
- eor.l d1,d5 ; d5 = a0q0
- eor.l d6,d7 ; d7 = i0y0
- lsl.l #8,d1 ; d1 = b0r0
- lsr.l #8,d7 ; d7 = 0i0y
- or.l d7,d5 ; d5 = aiqy
- or.l d6,d1 ; d7 = bjrz
- move.l a4,d6 ; d6 = 0x0x
- move.l a4,d7 ; d7 = 0x0x
- and.l d4,d6 ; d6 = 0b0r
- and.l d5,d7 ; d7 = 0j0z
- eor.l d6,d4 ; d4 = a0q0
- eor.l d7,d5 ; d5 = i0y0
- lsr.l #4,d5 ; d5 = 0i0y
- or.l d5,d4 ; d4 = aiqy
- move.l d4,(a0)+
- lsl.l #4,d6 ; d6 = b0r0
- or.l d7,d6 ; d5 = bjrz
- move.l d6,(a0)+
-
- move.l a4,d7 ; d7 = 0x0x
- move.l a4,d5 ; d5 = 0x0x
- and.l d0,d7 ; d7 = 0b0r
- and.l d1,d5 ; d5 = 0j0z
- eor.l d7,d0 ; d0 = a0q0
- eor.l d5,d1 ; d1 = i0y0
- lsr.l #4,d1 ; d1 = 0i0y
- or.l d1,d0 ; d0 = aiqy
- move.l d0,(a0)+
- lsl.l #4,d7 ; d7 = b0r0
- or.l d5,d7 ; d1 = bjrz
- move.l d7,(a0)+
- cmp.l a0,a2 ;; 4c
- bne.w firstsweep ;; 6c
-
- sub.l #plsiz*8,a0
- move.l #$33333333,a5
- move.l #$55555555,a6
- lea plsiz*4(a1),a1 ;a2 = plane4
-
- secondsweep
- move.l (a0),d0
- move.l 8(a0),d1
- move.l 16(a0),d2
- move.l 24(a0),d3
-
- move.l a5,d6 ; d6 = 0x0x
- move.l a5,d7 ; d7 = 0x0x
- and.l d0,d6 ; d6 = 0b0r
- and.l d2,d7 ; d7 = 0j0z
- eor.l d6,d0 ; d0 = a0q0
- eor.l d7,d2 ; d2 = i0y0
- lsl.l #2,d6 ; d6 = b0r0
- lsr.l #2,d2 ; d2 = 0i0y
- or.l d2,d0 ; d0 = aiqy
- or.l d7,d6 ; d2 = bjrz
- move.l a5,d7 ; d7 = 0x0x
- move.l a5,d2 ; d2 = 0x0x
- and.l d1,d7 ; d7 = 0b0r
- and.l d3,d2 ; d2 = 0j0z
- eor.l d7,d1 ; d1 = a0q0
- eor.l d2,d3 ; d3 = i0y0
- lsl.l #2,d7 ; d7 = b0r0
- lsr.l #2,d3 ; d3 = 0i0y
- or.l d3,d1 ; d1 = aiqy
- or.l d2,d7 ; d3 = bjrz
- move.l a6,d2 ; d2 = 0x0x
- move.l a6,d3 ; d3 = 0x0x
- and.l d0,d2 ; d2 = 0b0r
- and.l d1,d3 ; d3 = 0j0z
- eor.l d2,d0 ; d0 = a0q0
- eor.l d3,d1 ; d1 = i0y0
- lsr.l #1,d1 ; d1 = 0i0y
- or.l d1,d0 ; d0 = aiqy
- move.l d0,plsiz*3(a1)
- add.l d2,d2
- or.l d3,d2 ; d1 = bjrz
- move.l d2,plsiz*2(a1)
-
- move.l a6,d3 ; d3 = 0x0x
- move.l a6,d1 ; d1 = 0x0x
- and.l d6,d3 ; d3 = 0b0r
- and.l d7,d1 ; d1 = 0j0z
- eor.l d3,d6 ; d6 = a0q0
- eor.l d1,d7 ; d7 = i0y0
- lsr.l #1,d7 ; d7 = 0i0y
- or.l d7,d6 ; d6 = aiqy
- move.l d6,plsiz*1(a1)
- add.l d3,d3
- or.l d1,d3 ; d7 = bjrz
- move.l d3,(a1)+
-
- move.l 4(a0),d0
- move.l 12(a0),d1
- move.l 20(a0),d2
- move.l 28(a0),d3
-
- move.l a5,d6 ; d6 = 0x0x
- move.l a5,d7 ; d7 = 0x0x
- and.l d0,d6 ; d6 = 0b0r
- and.l d2,d7 ; d7 = 0j0z
- eor.l d6,d0 ; d0 = a0q0
- eor.l d7,d2 ; d2 = i0y0
- lsl.l #2,d6 ; d6 = b0r0
- lsr.l #2,d2 ; d2 = 0i0y
- or.l d2,d0 ; d0 = aiqy
- or.l d7,d6 ; d2 = bjrz
- move.l a5,d7 ; d7 = 0x0x
- move.l a5,d2 ; d2 = 0x0x
- and.l d1,d7 ; d7 = 0b0r
- and.l d3,d2 ; d2 = 0j0z
- eor.l d7,d1 ; d1 = a0q0
- eor.l d2,d3 ; d3 = i0y0
- lsl.l #2,d7 ; d7 = b0r0
- lsr.l #2,d3 ; d3 = 0i0y
- or.l d3,d1 ; d1 = aiqy
- or.l d2,d7 ; d3 = bjrz
- move.l a6,d2 ; d2 = 0x0x
- move.l a6,d3 ; d3 = 0x0x
- and.l d0,d2 ; d2 = 0b0r
- and.l d1,d3 ; d3 = 0j0z
- eor.l d2,d0 ; d0 = a0q0
- eor.l d3,d1 ; d1 = i0y0
- lsr.l #1,d1 ; d1 = 0i0y
- or.l d1,d0 ; d0 = aiqy
- move.l d0,-4-plsiz*1(a1)
- add.l d2,d2
- or.l d3,d2 ; d1 = bjrz
- move.l d2,-4-plsiz*2(a1)
-
- move.l a6,d3 ; d3 = 0x0x
- move.l a6,d1 ; d1 = 0x0x
- and.l d6,d3 ; d3 = 0b0r
- and.l d7,d1 ; d1 = 0j0z
- eor.l d3,d6 ; d6 = a0q0
- eor.l d1,d7 ; d7 = i0y0
- lsr.l #1,d7 ; d7 = 0i0y
- or.l d7,d6 ; d6 = aiqy
- move.l d6,-4-plsiz*3(a1)
- add.l d3,d3
- or.l d1,d3 ; d7 = bjrz
- move.l d3,-4-plsiz*4(a1)
- add.w #32,a0 ;;4c
- cmp.l a0,a2 ;;4c
- bne.w secondsweep ;;6c
-
- ;300
-
- exit
- movem.l (sp)+,d2-d7/a2-a6
- rts
-
-
-