home *** CD-ROM | disk | FTP | other *** search
- * $VER: c2p4.s (22.11.96) 33.1
- *
- * - c2p for chunky nybbles
- * - this routine is public domain, use it as you want
- * - based on the excellent merge rout by Mikael Kalms
- *
- * Version history:
- *
- * 33.1 22.11.96 Aki Laukkanen (amlaukka@cc.helsinki.fi)
- *
- * created
- *
-
- xdef _c2p4
-
- ; from:
- ; 0 4 8 12 16 20 24 28
- ; a3a2a1a0 b3b2b1b0 c3c2c1c0 d3d2d1d0 e3e2e1e0 f3f2f1f0 g3g2g1g0 h3h2h1h0
- ; i3i2i1i0 j3j2j1j0 k3k2k1k0 l3l2l1l0 m3m2m1m0 n3n2n1n0 o3o2o1o0 p3p2p1p0
- ; q3q2q1q0 r3r2r1r0 s3s2s1s0 t3t2t1t0 u3u2u1u0 v3v2v1v0 w3w2w1w0 x3x2x1x0
- ; y3y2y1y0 z3z2z1z0 A3A2A1A0 B3B2B1B0 C3C2C1C0 D3D2D1D0 E3E2E1E0 F3F2F1F0
-
- ; 1st pass
- ; 8x1
- ; a3a2a1a0 b3b2b1b0 i3i2i1i0 j3j2j1j0 e3e2e1e0 f3f2f1f0 m3m2m1m0 n3n2n1n0
- ; c3c2c1c0 d3d2d1d0 k3k2k1k0 l3l2l1l0 g3g2g1g0 h3h2h1h0 o3o2o1o0 p3p2p1p0
- ; q3q2q1q0 r3r2r1r0 y3y2y1y0 z3z2z1z0 u3u2u1u0 v3v2v1v0 C3C2C1C0 D3D2D1D0
- ; s3s2s1s0 t3t2t1t0 A3A2A1A0 B3B2B1B0 w3w2w1w0 x3x2x1x0 E3E2E1E0 F3F2F1F0
-
- ; 2nd pass
- ; 16x2
- ; a3a2a1a0 b3b2b1b0 i3i2i1i0 j3j2j1j0 q3q2q1q0 r3r2r1r0 y3y2y1y0 z3z2z1z0
- ; c3c2c1c0 d3d2d1d0 k3k2k1k0 l3l2l1l0 s3s2s1s0 t3t2t1t0 A3A2A1A0 B3B2B1B0
- ; e3e2e1e0 f3f2f1f0 m3m2m1m0 n3n2n1n0 u3u2u1u0 v3v2v1v0 C3C2C1C0 D3D2D1D0
- ; g3g2g1g0 h3h2h1h0 o3o2o1o0 p3p2p1p0 w3w2w1w0 x3x2x1x0 E3E2E1E0 F3F2F1F0
-
- ; 3rd pass
- ; 4x2
- ; a3a2a1a0 e3e2e1e0 i3i2i1i0 m3m2m1m0 q3q2q1q0 u3u2u1u0 y3y2y1y0 C3C2C1C0
- ; c3c2c1c0 g3g2g1g0 k3k2k1k0 o3o2o1o0 s3s2s1s0 w3w2w1w0 A3A2A1A0 E3E2E1E0
- ; b3b2b1b0 f3f2f1f0 j3j2j1j0 n3n2n1n0 r3r2r1r0 v3v2v1v0 z3z2z1z0 D3D2D1D0
- ; d3d2d1d0 h3h2h1h0 l3l2l1l0 p3p2p1p0 t3t2t1t0 x3x2x1x0 B3B2B1B0 F3F2F1F0
-
- ; 4th pass
- ; 2x1
- ; a3a2c3c2 e3e2g3g2 i3i1k3k2 m3m2o3o2 q3q2s3s2 u3u2w3w2 y3y2A3A2 C3C2E3E2
- ; a1a0c1c0 e1e0g1g0 i1i0k1k0 m1m0o1o0 q1q0s1s0 u1u0w1w0 y1y0A1A0 C1C0E1E0
- ; b3b2d3d2 f3f2h3h2 j3j2l3l2 n3n2p3p2 r3r2t3t2 v3v2x3x2 z3z2B3B2 D3D2F3F2
- ; b1b0d1d0 f1f0h1h0 j1j0l1l0 n1n0p1p0 r1r0t1t0 v1v0x1x0 z1z0B1B0 D1D0F1F0
-
- ; to (5th pass)
- ; 1x2
- ; a3b3c3d3 e3f2g3h3 i3j3k3l3 m3n3o3p3 q3r3s3t3 u3v3w3x3 y3z3A3B3 C3D3E3F3
- ; a1b1c1d1 e1f1g1h1 i1j1k1l1 m1n1o1p1 q1r1s1t1 u1v1w1x1 y1z1A1B1 C1D1E1F1
- ; a2b2c2d2 e2f2g2h2 i2j2k2l2 m2n2o2p2 q2r2s2t2 u2v2w2x2 y2z2A2B2 C2D2E2F2
- ; a0b0c0d0 e0f0g0h0 i0j0k0l0 m0n0o0p0 q0r0s0t0 u0v0w0x0 y0z0A0B0 C0D0E0F0
-
- include "exec/types.i"
- include "graphics/gfx.i"
-
- ; a0 - source chunky
- ; a1 - keep as temp bpl pointer
- ; a2 - chunky end
- ; a3 - BitMap structure
- _c2p4
- movem.l d2-d7/a2-a6,-(sp)
-
- subq.l #8,sp
- subq.l #8,sp
- move.l (bm_Planes,a3),(sp)
- move.l (bm_Planes+4,a3),(4,sp)
- move.l (bm_Planes+8,a3),(8,sp)
- move.l (bm_Planes+12,a3),(12,sp)
- move.l #$00FF00FF,d7
- .start
- move.l (a0)+,d0 ; source data
- move.l (a0)+,d1
- move.l (a0)+,d2
- move.l (a0)+,d3
-
- move.l d1,d5 ; 1st pass (8x1)
- move.l d3,d6
- lsr.l #8,d5
- lsr.l #8,d6
- eor.l d0,d5
- eor.l d2,d6
- and.l d7,d5
- and.l d7,d6
- eor.l d5,d0
- eor.l d6,d2
- lsl.l #8,d5
- lsl.l #8,d6
- eor.l d6,d3
- eor.l d5,d1
-
- swap d2 ; 2nd pass (16x2)
- swap d3
- move.w d2,d5
- move.w d3,d6
- move.w d0,d2
- move.w d1,d3
- move.w d5,d0
- move.w d6,d1
- swap d2
- swap d3
-
- move.l #$0F0F0F0F,d4
-
- move.l d2,d5 ; 3rd pass (4x2)
- move.l d3,d6
- lsr.l #4,d5
- lsr.l #4,d6
- eor.l d0,d5
- eor.l d1,d6
- and.l d4,d5
- and.l d4,d6
- eor.l d5,d0
- eor.l d6,d1
- lsl.l #4,d5
- lsl.l #4,d6
- eor.l d6,d3
- eor.l d5,d2
-
- move.l #$33333333,d4
-
- move.l d1,d5 ; 4th pass (2x1)
- move.l d3,d6
- lsr.l #2,d5
- lsr.l #2,d6
- eor.l d0,d5
- eor.l d2,d6
- and.l d4,d5
- and.l d4,d6
- eor.l d5,d0
- eor.l d6,d2
- lsl.l #2,d5
- lsl.l #2,d6
- eor.l d6,d3
- eor.l d5,d1
-
- move.l #$55555555,d4
-
- move.l d2,d5 ; 5th pass (1x2)
- move.l d3,d6
- lsr.l #1,d5
- lsr.l #1,d6
- eor.l d0,d5
- eor.l d1,d6
- and.l d4,d5
- and.l d4,d6
- eor.l d5,d0 ; plane 3
- eor.l d6,d1 ; plane 1
- lsl.l #1,d5
- lsl.l #1,d6
- eor.l d6,d3 ; plane 2
- eor.l d5,d2 ; plane 0
-
- move.l d3,a3
- move.l d1,a4
- move.l d2,a5
- move.l d0,a6
-
- cmp.l a0,a2
- beq .end
- .loop
- move.l (a0)+,d0 ; source data pOEP (special case,
- move.l (a0)+,d1 ; sOEP see M68060UM/AD
- move.l (a0)+,d2 ; pOEP section 10 for
- move.l (a0)+,d3 ; sOEP reference)
-
- move.l (sp),a1 ; write plane 0 pOEP
- move.l a3,(a1) ; pOEP
-
- move.l d1,d5 ; 1st pass (8x1) pOEP
- move.l d3,d6 ; sOEP
- lsr.l #8,d5 ; pOEP
- lsr.l #8,d6 ; sOEP
- eor.l d0,d5 ; pOEP
- eor.l d2,d6 ; sOEP
- and.l d7,d5 ; pOEP
- and.l d7,d6 ; pOEP (be careful and
- eor.l d5,d0 ; sOEP so these things don't
- eor.l d6,d2 ; pOEP stall the pipeline)
- lsl.l #8,d5 ; sOEP
- lsl.l #8,d6 ; pOEP
- eor.l d6,d3 ; sOEP
- eor.l d5,d1 ; pOEP
-
- swap d2 ; 2nd pass (16x2) pOEP only (well you can't have all)
- swap d3 ; pOEP only
- move.w d2,d5 ; pOEP
- move.w d3,d6 ; sOEP
- move.w d0,d2 ; pOEP
-
- move.l (4,sp),a1 ; write plane 1 sOEP = 12 cycles between chip writes
- move.l a4,(a1) ; pOEP
-
- move.w d1,d3 ; sOEP
- move.w d5,d0 ; pOEP
- move.w d6,d1 ; sOEP
- swap d2 ; pOEP only
- swap d3 ; pOEP only
-
- move.l #$0F0F0F0F,d4
-
- move.l d2,d5 ; 3rd pass (4x2)
- move.l d3,d6
- lsr.l #4,d5
- lsr.l #4,d6
- eor.l d0,d5
- eor.l d1,d6
- and.l d4,d5
- and.l d4,d6
- eor.l d5,d0
- eor.l d6,d1
- lsl.l #4,d5
- lsl.l #4,d6
- eor.l d6,d3
- eor.l d5,d2
-
- move.l #$33333333,d4
-
- move.l (8,sp),a1 ; write plane 2
- move.l a5,(a1)
-
- move.l d1,d5 ; 4th pass (2x1)
- move.l d3,d6
- lsr.l #2,d5
- lsr.l #2,d6
- eor.l d0,d5
- eor.l d2,d6
- and.l d4,d5
- and.l d4,d6
- eor.l d5,d0
- eor.l d6,d2
- lsl.l #2,d5
- lsl.l #2,d6
- eor.l d6,d3
- eor.l d5,d1
-
- move.l #$55555555,d4
-
- move.l (12,sp),a1 ; write plane 3
- move.l a6,(a1)
-
- move.l d2,d5 ; 5th pass (1x2)
- move.l d3,d6
- lsr.l #1,d5
- lsr.l #1,d6
- eor.l d0,d5
- eor.l d1,d6
- and.l d4,d5
- and.l d4,d6
- eor.l d5,d0 ; plane 3
- eor.l d6,d1 ; plane 1
- lsl.l #1,d5
- lsl.l #1,d6
- eor.l d6,d3 ; plane 2
- eor.l d5,d2 ; plane 0
-
- move.l d3,a3 ; save planar data
- move.l d1,a4
- move.l d2,a5
- move.l d0,a6
-
- addq.l #4,(sp) ; update bitmap pointers
- addq.l #4,(4,sp)
- addq.l #4,(8,sp)
- addq.l #4,(12,sp)
-
- cmp.l a0,a2
- bne .loop
- .end
- move.l (sp),a1 ; save data
- move.l a3,(a1)
- move.l (4,sp),a1
- move.l a4,(a1)
- move.l (8,sp),a1
- move.l a5,(a1)
- move.l (12,sp),a1
- move.l a6,(a1)
-
- addq.l #8,sp
- addq.l #8,sp
-
- movem.l (sp)+,d2-d7/a2-a6
-
- rts
-