home *** CD-ROM | disk | FTP | other *** search
/ The Best of Mecomp Multimedia 2 / MECOMP-CD-II.iso / amiga / emulation / shapeshifter / videodrivers / turboevd / sources / c2p4.s < prev    next >
Encoding:
Text File  |  1996-11-23  |  8.6 KB  |  289 lines

  1. * $VER: c2p4.s (22.11.96) 33.1
  2. *
  3. * - c2p for chunky nybbles
  4. * - this routine is public domain, use it as you want
  5. * - based on the excellent merge rout by Mikael Kalms
  6. *
  7. * Version history:
  8. * 33.1  22.11.96    Aki Laukkanen (amlaukka@cc.helsinki.fi)
  9. *
  10. *       created
  11. *
  12.  
  13.     xdef    _c2p4
  14.  
  15. ; from:
  16. ; 0        4        8        12       16       20       24       28
  17. ; a3a2a1a0 b3b2b1b0 c3c2c1c0 d3d2d1d0 e3e2e1e0 f3f2f1f0 g3g2g1g0 h3h2h1h0 
  18. ; i3i2i1i0 j3j2j1j0 k3k2k1k0 l3l2l1l0 m3m2m1m0 n3n2n1n0 o3o2o1o0 p3p2p1p0
  19. ; q3q2q1q0 r3r2r1r0 s3s2s1s0 t3t2t1t0 u3u2u1u0 v3v2v1v0 w3w2w1w0 x3x2x1x0
  20. ; y3y2y1y0 z3z2z1z0 A3A2A1A0 B3B2B1B0 C3C2C1C0 D3D2D1D0 E3E2E1E0 F3F2F1F0
  21.  
  22. ; 1st pass
  23. ; 8x1
  24. ; a3a2a1a0 b3b2b1b0 i3i2i1i0 j3j2j1j0 e3e2e1e0 f3f2f1f0 m3m2m1m0 n3n2n1n0
  25. ; c3c2c1c0 d3d2d1d0 k3k2k1k0 l3l2l1l0 g3g2g1g0 h3h2h1h0 o3o2o1o0 p3p2p1p0
  26. ; q3q2q1q0 r3r2r1r0 y3y2y1y0 z3z2z1z0 u3u2u1u0 v3v2v1v0 C3C2C1C0 D3D2D1D0
  27. ; s3s2s1s0 t3t2t1t0 A3A2A1A0 B3B2B1B0 w3w2w1w0 x3x2x1x0 E3E2E1E0 F3F2F1F0
  28.  
  29. ; 2nd pass
  30. ; 16x2
  31. ; a3a2a1a0 b3b2b1b0 i3i2i1i0 j3j2j1j0 q3q2q1q0 r3r2r1r0 y3y2y1y0 z3z2z1z0
  32. ; c3c2c1c0 d3d2d1d0 k3k2k1k0 l3l2l1l0 s3s2s1s0 t3t2t1t0 A3A2A1A0 B3B2B1B0
  33. ; e3e2e1e0 f3f2f1f0 m3m2m1m0 n3n2n1n0 u3u2u1u0 v3v2v1v0 C3C2C1C0 D3D2D1D0
  34. ; g3g2g1g0 h3h2h1h0 o3o2o1o0 p3p2p1p0 w3w2w1w0 x3x2x1x0 E3E2E1E0 F3F2F1F0
  35.  
  36. ; 3rd pass
  37. ; 4x2
  38. ; a3a2a1a0 e3e2e1e0 i3i2i1i0 m3m2m1m0 q3q2q1q0 u3u2u1u0 y3y2y1y0 C3C2C1C0
  39. ; c3c2c1c0 g3g2g1g0 k3k2k1k0 o3o2o1o0 s3s2s1s0 w3w2w1w0 A3A2A1A0 E3E2E1E0
  40. ; b3b2b1b0 f3f2f1f0 j3j2j1j0 n3n2n1n0 r3r2r1r0 v3v2v1v0 z3z2z1z0 D3D2D1D0
  41. ; d3d2d1d0 h3h2h1h0 l3l2l1l0 p3p2p1p0 t3t2t1t0 x3x2x1x0 B3B2B1B0 F3F2F1F0
  42.  
  43. ; 4th pass
  44. ; 2x1
  45. ; a3a2c3c2 e3e2g3g2 i3i1k3k2 m3m2o3o2 q3q2s3s2 u3u2w3w2 y3y2A3A2 C3C2E3E2
  46. ; a1a0c1c0 e1e0g1g0 i1i0k1k0 m1m0o1o0 q1q0s1s0 u1u0w1w0 y1y0A1A0 C1C0E1E0
  47. ; b3b2d3d2 f3f2h3h2 j3j2l3l2 n3n2p3p2 r3r2t3t2 v3v2x3x2 z3z2B3B2 D3D2F3F2
  48. ; b1b0d1d0 f1f0h1h0 j1j0l1l0 n1n0p1p0 r1r0t1t0 v1v0x1x0 z1z0B1B0 D1D0F1F0
  49.  
  50. ; to (5th pass)
  51. ; 1x2
  52. ; a3b3c3d3 e3f2g3h3 i3j3k3l3 m3n3o3p3 q3r3s3t3 u3v3w3x3 y3z3A3B3 C3D3E3F3
  53. ; a1b1c1d1 e1f1g1h1 i1j1k1l1 m1n1o1p1 q1r1s1t1 u1v1w1x1 y1z1A1B1 C1D1E1F1
  54. ; a2b2c2d2 e2f2g2h2 i2j2k2l2 m2n2o2p2 q2r2s2t2 u2v2w2x2 y2z2A2B2 C2D2E2F2
  55. ; a0b0c0d0 e0f0g0h0 i0j0k0l0 m0n0o0p0 q0r0s0t0 u0v0w0x0 y0z0A0B0 C0D0E0F0
  56.  
  57.     include "exec/types.i"
  58.     include "graphics/gfx.i"
  59.  
  60. ; a0 - source chunky
  61. ; a1 - keep as temp bpl pointer
  62. ; a2 - chunky end
  63. ; a3 - BitMap structure
  64. _c2p4
  65.     movem.l d2-d7/a2-a6,-(sp)
  66.  
  67.     subq.l  #8,sp
  68.     subq.l  #8,sp
  69.     move.l  (bm_Planes,a3),(sp)
  70.     move.l  (bm_Planes+4,a3),(4,sp)
  71.     move.l  (bm_Planes+8,a3),(8,sp)
  72.     move.l  (bm_Planes+12,a3),(12,sp)
  73.     move.l  #$00FF00FF,d7
  74. .start
  75.     move.l  (a0)+,d0                        ; source data
  76.     move.l  (a0)+,d1
  77.     move.l  (a0)+,d2
  78.     move.l  (a0)+,d3
  79.  
  80.     move.l  d1,d5                           ; 1st pass (8x1)
  81.     move.l  d3,d6
  82.     lsr.l   #8,d5
  83.     lsr.l   #8,d6
  84.     eor.l   d0,d5
  85.     eor.l   d2,d6
  86.     and.l   d7,d5  
  87.     and.l   d7,d6
  88.     eor.l   d5,d0
  89.     eor.l   d6,d2
  90.     lsl.l   #8,d5
  91.     lsl.l   #8,d6
  92.     eor.l   d6,d3
  93.     eor.l   d5,d1
  94.  
  95.     swap    d2                              ; 2nd pass (16x2)
  96.     swap    d3
  97.     move.w  d2,d5
  98.     move.w  d3,d6
  99.     move.w  d0,d2
  100.     move.w  d1,d3
  101.     move.w  d5,d0
  102.     move.w  d6,d1
  103.     swap    d2
  104.     swap    d3
  105.  
  106.     move.l  #$0F0F0F0F,d4
  107.  
  108.     move.l  d2,d5                           ; 3rd pass (4x2)
  109.     move.l  d3,d6
  110.     lsr.l   #4,d5
  111.     lsr.l   #4,d6
  112.     eor.l   d0,d5
  113.     eor.l   d1,d6
  114.     and.l   d4,d5  
  115.     and.l   d4,d6
  116.     eor.l   d5,d0
  117.     eor.l   d6,d1
  118.     lsl.l   #4,d5
  119.     lsl.l   #4,d6
  120.     eor.l   d6,d3
  121.     eor.l   d5,d2
  122.  
  123.     move.l  #$33333333,d4
  124.  
  125.     move.l  d1,d5                           ; 4th pass (2x1)
  126.     move.l  d3,d6
  127.     lsr.l   #2,d5
  128.     lsr.l   #2,d6
  129.     eor.l   d0,d5
  130.     eor.l   d2,d6
  131.     and.l   d4,d5  
  132.     and.l   d4,d6
  133.     eor.l   d5,d0
  134.     eor.l   d6,d2
  135.     lsl.l   #2,d5
  136.     lsl.l   #2,d6
  137.     eor.l   d6,d3
  138.     eor.l   d5,d1
  139.  
  140.     move.l  #$55555555,d4
  141.  
  142.     move.l  d2,d5                           ; 5th pass (1x2)
  143.     move.l  d3,d6
  144.     lsr.l   #1,d5
  145.     lsr.l   #1,d6
  146.     eor.l   d0,d5
  147.     eor.l   d1,d6
  148.     and.l   d4,d5  
  149.     and.l   d4,d6
  150.     eor.l   d5,d0                           ; plane 3 
  151.     eor.l   d6,d1                           ; plane 1
  152.     lsl.l   #1,d5
  153.     lsl.l   #1,d6
  154.     eor.l   d6,d3                           ; plane 2
  155.     eor.l   d5,d2                           ; plane 0
  156.  
  157.     move.l  d3,a3
  158.     move.l  d1,a4
  159.     move.l  d2,a5
  160.     move.l  d0,a6
  161.  
  162.     cmp.l   a0,a2
  163.     beq     .end
  164. .loop
  165.     move.l  (a0)+,d0                        ; source data       pOEP (special case,
  166.     move.l  (a0)+,d1                        ;                   sOEP see M68060UM/AD
  167.     move.l  (a0)+,d2                        ;                   pOEP section 10 for
  168.     move.l  (a0)+,d3                        ;                   sOEP reference)
  169.  
  170.     move.l  (sp),a1                         ; write plane 0     pOEP
  171.     move.l  a3,(a1)                         ;                   pOEP
  172.  
  173.     move.l  d1,d5                           ; 1st pass (8x1)    pOEP
  174.     move.l  d3,d6                           ;                   sOEP
  175.     lsr.l   #8,d5                           ;                   pOEP
  176.     lsr.l   #8,d6                           ;                   sOEP
  177.     eor.l   d0,d5                           ;                   pOEP
  178.     eor.l   d2,d6                           ;                   sOEP
  179.     and.l   d7,d5                           ;                   pOEP
  180.     and.l   d7,d6                           ;                   pOEP (be careful and
  181.     eor.l   d5,d0                           ;                   sOEP so these things don't
  182.     eor.l   d6,d2                           ;                   pOEP stall the pipeline)
  183.     lsl.l   #8,d5                           ;                   sOEP
  184.     lsl.l   #8,d6                           ;                   pOEP
  185.     eor.l   d6,d3                           ;                   sOEP
  186.     eor.l   d5,d1                           ;                   pOEP
  187.  
  188.     swap    d2                              ; 2nd pass (16x2)   pOEP only (well you can't have all)
  189.     swap    d3                              ;                   pOEP only
  190.     move.w  d2,d5                           ;                   pOEP
  191.     move.w  d3,d6                           ;                   sOEP
  192.     move.w  d0,d2                           ;                   pOEP
  193.  
  194.     move.l  (4,sp),a1                       ; write plane 1     sOEP = 12 cycles between chip writes
  195.     move.l  a4,(a1)                         ;                   pOEP
  196.  
  197.     move.w  d1,d3                           ;                   sOEP
  198.     move.w  d5,d0                           ;                   pOEP
  199.     move.w  d6,d1                           ;                   sOEP
  200.     swap    d2                              ;                   pOEP only
  201.     swap    d3                              ;                   pOEP only
  202.  
  203.     move.l  #$0F0F0F0F,d4
  204.  
  205.     move.l  d2,d5                           ; 3rd pass (4x2)
  206.     move.l  d3,d6
  207.     lsr.l   #4,d5
  208.     lsr.l   #4,d6
  209.     eor.l   d0,d5
  210.     eor.l   d1,d6
  211.     and.l   d4,d5  
  212.     and.l   d4,d6
  213.     eor.l   d5,d0
  214.     eor.l   d6,d1
  215.     lsl.l   #4,d5
  216.     lsl.l   #4,d6
  217.     eor.l   d6,d3
  218.     eor.l   d5,d2
  219.  
  220.     move.l  #$33333333,d4
  221.  
  222.     move.l  (8,sp),a1                       ; write plane 2
  223.     move.l  a5,(a1)
  224.  
  225.     move.l  d1,d5                           ; 4th pass (2x1)
  226.     move.l  d3,d6
  227.     lsr.l   #2,d5
  228.     lsr.l   #2,d6
  229.     eor.l   d0,d5
  230.     eor.l   d2,d6
  231.     and.l   d4,d5  
  232.     and.l   d4,d6
  233.     eor.l   d5,d0
  234.     eor.l   d6,d2
  235.     lsl.l   #2,d5
  236.     lsl.l   #2,d6
  237.     eor.l   d6,d3
  238.     eor.l   d5,d1
  239.  
  240.     move.l  #$55555555,d4
  241.  
  242.     move.l  (12,sp),a1                      ; write plane 3
  243.     move.l  a6,(a1)
  244.  
  245.     move.l  d2,d5                           ; 5th pass (1x2)
  246.     move.l  d3,d6
  247.     lsr.l   #1,d5
  248.     lsr.l   #1,d6
  249.     eor.l   d0,d5
  250.     eor.l   d1,d6
  251.     and.l   d4,d5  
  252.     and.l   d4,d6
  253.     eor.l   d5,d0                           ; plane 3 
  254.     eor.l   d6,d1                           ; plane 1
  255.     lsl.l   #1,d5 
  256.     lsl.l   #1,d6
  257.     eor.l   d6,d3                           ; plane 2
  258.     eor.l   d5,d2                           ; plane 0
  259.  
  260.     move.l  d3,a3                           ; save planar data
  261.     move.l  d1,a4
  262.     move.l  d2,a5
  263.     move.l  d0,a6
  264.  
  265.     addq.l  #4,(sp)                         ; update bitmap pointers
  266.     addq.l  #4,(4,sp)
  267.     addq.l  #4,(8,sp)
  268.     addq.l  #4,(12,sp)
  269.  
  270.     cmp.l   a0,a2
  271.     bne     .loop
  272. .end
  273.     move.l  (sp),a1                         ; save data
  274.     move.l  a3,(a1)
  275.     move.l  (4,sp),a1
  276.     move.l  a4,(a1)
  277.     move.l  (8,sp),a1
  278.     move.l  a5,(a1)
  279.     move.l  (12,sp),a1
  280.     move.l  a6,(a1)
  281.  
  282.     addq.l  #8,sp
  283.     addq.l  #8,sp
  284.  
  285.     movem.l (sp)+,d2-d7/a2-a6
  286.  
  287.     rts
  288.