home *** CD-ROM | disk | FTP | other *** search
/ Amiga ACS 1997 #5 / amigaacscoverdisc1997-051997.i / games / commercialdemos / gloom3 / src / 020_1.s next >
Text File  |  1996-01-04  |  22KB  |  913 lines

  1.         multipass
  2.         mc68020
  3.  
  4.         bra.w    initc2p        ; offset 0: initialization routines
  5.         bra.w    doc2p_1X8    ; offset 4: one pixel wide version, AGA
  6.         bra.w    doc2p_1X6    ; offset 8: one pixel wide version, EHB
  7.         bra.w    doc2p_2X8    ; offset 12: two pixel wide version, AGA
  8.         bra.w    doc2p_2X6    ; offset 16: two pixel wide version, EHB
  9.         dc.l    string        ; offset 20: address of descr string
  10.  
  11.         dc.b    '$VER: 020_1 1.0 (4/1/96)',0
  12. string        dc.b    'A chunky to planar routine by Peter McGavin. '
  13.         dc.b    'Optimised for 68020. '
  14.         dc.b    'Supports 6/8 bitplane, single/double width pixels.',0
  15.         even
  16.  
  17. initc2p
  18.  
  19. ; create 2 tables for Gloom
  20.  
  21. ; a0=columns buffer to fill in (array of longs) for 1 wide pixs.
  22. ; a1=columns buffer for 2 wide pixs
  23. ; d0=how many columns (multiple of 32)
  24. ; a2=palette remapping array (do 256)
  25.  
  26.         move.w    #255,d1    ;#colours-1
  27. .loop        move.b    d1,(0,a2,d1.w)
  28.         dbf    d1,.loop
  29.  
  30. ; column offsets for 1 wide pixels
  31.  
  32. ; 0,2,4,6,8,10,12,14,1,3,5,7,9,11,13,15,
  33. ; 16,18,20,...
  34.  
  35.         move.l    d0,d4
  36.         lsr.w    #4,d4
  37.         subq.w    #1,d4
  38.         moveq    #0,d1
  39. .loop0        moveq    #1,d2
  40. .loop1        moveq    #7,d3
  41. .loop2        move.l    d1,(a0)+
  42.         addq.l    #2,d1
  43.         dbf    d3,.loop2
  44.         sub.l    #15,d1
  45.         dbf    d2,.loop1
  46.         add.l    #14,d1
  47.         dbf    d4,.loop0
  48.  
  49. ; column offsets for 2 wide pixels
  50.  
  51. ; 0,4,8,12,1,5,9,13,2,6,10,14,3,7,11,15,
  52. ; 16,20,24,28,17,...
  53.  
  54.         lsr.w    #4,d0
  55.         subq.w    #1,d0
  56.         moveq    #0,d1
  57. .loop3        moveq    #3,d2
  58. .loop4        moveq    #3,d3
  59. .loop5        move.l    d1,(a1)+
  60.         addq.l    #4,d1
  61.         dbf    d3,.loop5
  62.         sub.l    #15,d1
  63.         dbf    d2,.loop4
  64.         add.l    #12,d1
  65.         dbf    d0,.loop3
  66.  
  67.         rts
  68.  
  69. doc2p_1X8
  70. ; inputs:
  71. ; a0.l=src chunky buffer
  72. ; a1.l=dest chipmem bitmap
  73. ; d0.w=width (in pixels - multiple of 32) to convert
  74. ; d1.w=height (in pixels - even)
  75. ; d2.l=modulo from one bitplane to next (copmod-ish)
  76. ; d3.l=modulo from start of one line to start of next (linemod)
  77.  
  78.         movea.l    d2,a5        ; a5 = bpmod
  79.         lsl.l    #3,d2
  80.         sub.l    a5,d2
  81.         subq.l    #2,d2
  82.         movea.l    d2,a6        ; a6 = 7*bpmod-2
  83.  
  84.         lsr.w    #4,d0
  85.         ext.l    d0
  86.         move.l    d0,d4
  87.         subq.l    #1,d4
  88.         move.l    d4,-(sp)    ; (4,sp) = num of 16 pix per row - 1
  89.  
  90.         add.l    d0,d0        ; num of 8 pix per row (bytesperrow)
  91.         sub.l    d0,d3
  92.         sub.l    a6,d3
  93.         move.l    d3,-(sp)    ; (sp) = linemod-bytesperrow-7*bpmod+2
  94.  
  95.         move.w    d1,d7
  96.         subq.w    #1,d7        ; d7 = height-1
  97.  
  98.         movea.l    #$f0f0f0f0,a2    ; a2 = 4 bit mask
  99.         movea.l    #$cccccccc,a3    ; a3 = 2 bit mask
  100.         movea.l    #$aaaa5555,a4    ; a4 = 1 bit mask
  101.         move.l    a2,d6        ; 4 bit mask = #$f0f0f0f0
  102.  
  103. ;------------------------------------------------------------------------
  104. ;
  105. ; 00        a7a6a5a4a3a2a1a0 i7i6i5i4i3i2i1i0 b7b6b5b4b3b2b1b0 j7j6j5j4j3j2j1j0
  106. ; 01        c7c6c5c4c3c2c1c0 k7k6k5k4k3k2k1k0 d7d6d5d4d3d2d1d0 l7l6l5l4l3l2l1l0
  107. ; 02        e7e6e5e4e3e2e1e0 m7m6m5m4m3m2m1m0 f7f6f5f4f3f2f1f0 n7n6n5n4n3n2n1n0
  108. ; 03        g7g6g5g4g3g2g1g0 o7o6o5o4o3o2o1o0 h7h6h5h4h3h2h1h0 p7p6p5p4p3p2p1p0
  109. ;
  110. ; 10 00x02a a7a6a5a4e7e6e5e4 i7i6i5i4m7m6m5m4 b7b6b5b4f7f6f5f4 j7j6j5j4n7n6n5n4
  111. ; 11 00x02b a3a2a1a0e3e2e1e0 i3i2i1i0m3m2m1m0 b3b2b1b0f3f2f1f0 j3j2j1j0n3n2n1n0
  112. ; 12 01x03a c7c6c5c4g7g6g5g4 k7k6k5k4o7o6o5o4 d7d6d5d4h7h6h5h4 l7l6l5l4p7p6p5p4
  113. ; 13 01x03b c3c2c1c0g3g2g1g0 k3k2k1k0o3o2o1o0 d3d2d1d0h3h2h1h0 l3l2l1l0p3p2p1p0
  114. ;
  115. ; 20 10x12a a7a6c7c6e7e6g7g6 i7i6k7k6m7m6o7o6 b7b6d7d6f7f6h7h6 j7j6l7l6n7n6p7p6
  116. ; 21 10x12b a5a4c5c4e5e4g5g4 i5i4k5k4m5m4o5o4 b5b4d5d4f5f4h5h4 j5j4l5l4n5n4p5p4
  117. ;
  118. ; 30 20x20  a7b7c7d7e7f7g7h7 i7j7k7l7m7n7o7p7 a6b6c6d6e6f6g6h6 i6j6k6l6m6n6o6p6
  119. ; 31 21x21  a5b5c5d5e5f5g5h5 i5j5k5l5m5n5o5p5 a4b4c4d4e4f4g4h4 i4j4k4l4m4n4o4p4
  120. ;
  121. ; 22 11x13a a3a2c3c2e3e2g3g2 i3i2k3k2m3m2o3o2 b3b2d3d2f3f2h3h2 j3j2l3l2n3n2p3p2
  122. ; 23 11x13b a1a0c1c0e1e0g1g0 i1i0k1k0m1m0o1o0 b1b0d1d0f1f0h1h0 j1j0l1l0n1n0p1p0
  123. ;
  124. ; 32 22x22  a3b3c3d3e3f3g3h3 i3j3k3l3m3n3o3p3 a2b2c2d2e2f2g2h2 i2j2k2l2m2n2o2p2
  125. ; 33 23x23  a1b1c1d1e1f1g1h1 i1j1k1l1m1n1o1p1 a0b0c0d0e0f0g0h0 i0j0k0l0m0n0o0p0
  126. ;
  127. ;------------------------------------------------------------------------
  128.  
  129.         swap    d7
  130.         move.w    (6,sp),d7    ; num 16 pix per row - 1
  131.  
  132.         move.l    (a0)+,d0    ; get first 4 pixels 00
  133.         move.l    (a0)+,d1    ; get first 4 pixels 01
  134.         move.l    (a0)+,d2    ; get first 4 pixels 02
  135.         move.l    (a0)+,d3    ; get first 4 pixels 03
  136.  
  137.         move.l    d0,d4
  138.         and.l    d6,d0
  139.         eor.l    d0,d4
  140.         lsl.l    #4,d4
  141.  
  142.         bra.b    .same_from_here
  143.  
  144.         cnop    0,4
  145.  
  146. .outerloop    swap    d7
  147.         move.w    (6,sp),d7    ; num 16 pix per row - 1
  148.  
  149.         move.l    (a0)+,d0    ; get 4 next pixels 00
  150.         move.l    (a0)+,d1    ; get 4 next pixels 01
  151.         move.l    (a0)+,d2    ; get 4 next pixels 02
  152.         move.l    (a0)+,d3    ; get 4 next pixels 03
  153.  
  154.         move.w    d5,(a1)        ; 30 -> plane 6
  155.         adda.l    a5,a1        ; +bpmod
  156.         swap    d5
  157.  
  158.         move.l    d0,d4
  159.         and.l    d6,d0
  160.         eor.l    d0,d4
  161.         lsl.l    #4,d4
  162.  
  163.         move.w    d5,(a1)        ; 30 -> plane 7
  164.         adda.l    (sp),a1        ; +linemod-bytesperrow-7*bpmod+2
  165.  
  166.         bra.b    .same_from_here
  167.  
  168. .innerloop    move.l    (a0)+,d0    ; get 4 next pixels 00
  169.         move.l    (a0)+,d1    ; get 4 next pixels 01
  170.         move.l    (a0)+,d2    ; get 4 next pixels 02
  171.         move.l    (a0)+,d3    ; get 4 next pixels 03
  172.  
  173.         move.w    d5,(a1)        ; 30 -> plane 6
  174.         adda.l    a5,a1        ; +bpmod
  175.         swap    d5
  176.  
  177.         move.l    d0,d4
  178.         and.l    d6,d0
  179.         eor.l    d0,d4
  180.         lsl.l    #4,d4
  181.  
  182.         move.w    d5,(a1)        ; 30 -> plane 7
  183.         suba.l    a6,a1        ; - 7 * bpmod + 2
  184.  
  185. .same_from_here    move.l    d2,d5
  186.         and.l    d6,d5
  187.         eor.l    d5,d2
  188.         lsr.l    #4,d5
  189.         or.l    d5,d0
  190.         or.l    d4,d2        ; 00x02 -> 10 11
  191.         move.l    d1,d4
  192.         and.l    d6,d1
  193.         eor.l    d1,d4
  194.         move.l    d3,d5
  195.         and.l    d6,d5
  196.         eor.l    d5,d3
  197.         lsr.l    #4,d5
  198.         lsl.l    #4,d4
  199.         or.l    d5,d1
  200.         or.l    d4,d3        ; 01x03 -> 12 13
  201.         move.l    a3,d6        ; 2 bit mask = #$cccccccc
  202.         move.l    d2,d4
  203.         and.l    d6,d2
  204.         eor.l    d2,d4
  205.         move.l    d3,d5
  206.         and.l    d6,d5
  207.         eor.l    d5,d3
  208.         lsl.l    #2,d4
  209.         or.l    d4,d3        ; 11x13b -> 23
  210.         move.l    a4,d6        ; 1 bit mask = #$aaaa5555
  211.         move.l    d3,d4
  212.         and.l    d6,d3
  213.         eor.l    d3,d4
  214.         lsr.w    #1,d4
  215.         swap    d4
  216.         add.w    d4,d4
  217.         or.l    d4,d3        ; 23x23 -> 33
  218.  
  219.         move.w    d3,(a1)        ; 33 -> plane 0
  220.         adda.l    a5,a1        ; +bpmod
  221.  
  222.         lsr.l    #2,d5
  223.         or.l    d5,d2        ; 11x13a -> 22
  224.         move.l    d2,d4
  225.         and.l    d6,d2
  226.         eor.l    d2,d4
  227.         lsr.w    #1,d4
  228.  
  229.         swap    d3
  230.         move.w    d3,(a1)        ; 33 -> plane 1
  231.         adda.l    a5,a1        ; +bpmod
  232.  
  233.         swap    d4
  234.         add.w    d4,d4
  235.         or.l    d4,d2        ; 22x22 -> 32
  236.         move.l    a3,d6        ; 2 bit mask = #$cccccccc
  237.         move.l    d0,d4
  238.         and.l    d6,d0
  239.         eor.l    d0,d4
  240.  
  241.         move.w    d2,(a1)        ; 32 -> plane 2
  242.         adda.l    a5,a1        ; +bpmod
  243.  
  244.         move.l    d1,d5
  245.         and.l    d6,d5
  246.         eor.l    d5,d1
  247.         lsl.l    #2,d4
  248.         or.l    d4,d1        ; 10x12b -> 21
  249.         move.l    a4,d6        ; 1 bit mask = #$aaaa5555
  250.  
  251.         swap    d2
  252.         move.w    d2,(a1)        ; 32 -> plane 3
  253.         adda.l    a5,a1        ; +bpmod
  254.  
  255.         move.l    d1,d4
  256.         and.l    d6,d1
  257.         eor.l    d1,d4
  258.         lsr.w    #1,d4
  259.         swap    d4
  260.         add.w    d4,d4
  261.         or.l    d4,d1        ; 21x21 -> 31
  262.  
  263.         move.w    d1,(a1)        ; 31 -> plane 4
  264.         adda.l    a5,a1        ; +bpmod
  265.  
  266.         lsr.l    #2,d5
  267.         or.l    d5,d0        ; 10x12a -> 20
  268.         move.l    d0,d5
  269.         and.l    d6,d0
  270.         eor.l    d0,d5
  271.  
  272.         swap    d1
  273.         move.w    d1,(a1)        ; 31 -> plane 5
  274.         adda.l    a5,a1        ; +bpmod
  275.  
  276.         lsr.w    #1,d5
  277.         swap    d5
  278.         add.w    d5,d5
  279.         or.l    d0,d5        ; 20x20 -> 30
  280.  
  281.         move.l    a2,d6        ; 4 bit mask = #$f0f0f0f0
  282.  
  283.         dbra    d7,.innerloop
  284.  
  285.         swap    d7
  286.         dbra    d7,.outerloop
  287.  
  288.         move.w    d5,(a1)        ; 30 -> plane 6
  289.         adda.l    a5,a1        ; +bpmod
  290.         swap    d5
  291.         move.w    d5,(a1)        ; 30 -> plane 7
  292.  
  293.         addq.l    #8,sp        ; remove locals
  294.         rts
  295.  
  296. doc2p_1X6
  297. ; inputs:
  298. ; a0.l=src chunky buffer
  299. ; a1.l=dest chipmem bitmap
  300. ; d0.w=width (in pixels - multiple of 32) to convert
  301. ; d1.w=height (in pixels - even)
  302. ; d2.l=modulo from one bitplane to next (copmod-ish)
  303. ; d3.l=modulo from start of one line to start of next (linemod)
  304.  
  305.         movea.l    d2,a5        ; a5 = bpmod
  306.         lsl.l    #2,d2
  307.         add.l    a5,d2
  308.         subq.l    #2,d2
  309.         movea.l    d2,a6        ; a6 = 5*bpmod-2
  310.  
  311.         lsr.w    #4,d0
  312.         ext.l    d0
  313.         move.l    d0,d4
  314.         subq.l    #1,d4
  315.         move.l    d4,-(sp)    ; (4,sp) = num of 16 pix per row - 1
  316.  
  317.         add.l    d0,d0        ; num of 8 pix per row (bytesperrow)
  318.         sub.l    d0,d3
  319.         sub.l    a6,d3
  320.         move.l    d3,-(sp)    ; (sp) = linemod-bytesperrow-5*bpmod+2
  321.  
  322.         move.w    d1,d7
  323.         subq.w    #1,d7        ; d7 = height-1
  324.  
  325.         movea.l    #$f0f0f0f0,a2    ; a2 = 4 bit mask
  326.         movea.l    #$cccccccc,a3    ; a3 = 2 bit mask
  327.         movea.l    #$aaaa5555,a4    ; a4 = 1 bit mask
  328.         move.l    a2,d6        ; 4 bit mask = #$f0f0f0f0
  329.  
  330. ;------------------------------------------------------------------------
  331. ;
  332. ; 00        ....a5a4a3a2a1a0 ....i5i4i3i2i1i0 ....b5b4b3b2b1b0 ....j5j4j3j2j1j0
  333. ; 01        ....c5c4c3c2c1c0 ....k5k4k3k2k1k0 ....d5d4d3d2d1d0 ....l5l4l3l2l1l0
  334. ; 02        ....e5e4e3e2e1e0 ....m5m4m3m2m1m0 ....f5f4f3f2f1f0 ....n5n4n3n2n1n0
  335. ; 03        ....g5g4g3g2g1g0 ....o5o4o3o2o1o0 ....h5h4h3h2h1h0 ....p5p4p3p2p1p0
  336. ;
  337. ; 10 00x02a ....a5a4....e5e4 ....i5i4....m5m4 ....b5b4....f5f4 ....j5j4....n5n4
  338. ; 11 00x02b a3a2a1a0e3e2e1e0 i3i2i1i0m3m2m1m0 b3b2b1b0f3f2f1f0 j3j2j1j0n3n2n1n0
  339. ; 12 01x03a ....c5c4....g5g4 ....k5k4....o5o4 ....d5d4....h5h4 ....l5l4....p5p4
  340. ; 13 01x03b c3c2c1c0g3g2g1g0 k3k2k1k0o3o2o1o0 d3d2d1d0h3h2h1h0 l3l2l1l0p3p2p1p0
  341. ;
  342. ; 21 10x12b a5a4c5c4e5e4g5g4 i5i4k5k4m5m4o5o4 b5b4d5d4f5f4h5h4 j5j4l5l4n5n4p5p4
  343. ;
  344. ; 31 21x21  a5b5c5d5e5f5g5h5 i5j5k5l5m5n5o5p5 a4b4c4d4e4f4g4h4 i4j4k4l4m4n4o4p4
  345. ;
  346. ; 22 11x13a a3a2c3c2e3e2g3g2 i3i2k3k2m3m2o3o2 b3b2d3d2f3f2h3h2 j3j2l3l2n3n2p3p2
  347. ; 23 11x13b a1a0c1c0e1e0g1g0 i1i0k1k0m1m0o1o0 b1b0d1d0f1f0h1h0 j1j0l1l0n1n0p1p0
  348. ;
  349. ; 32 22x22  a3b3c3d3e3f3g3h3 i3j3k3l3m3n3o3p3 a2b2c2d2e2f2g2h2 i2j2k2l2m2n2o2p2
  350. ; 33 23x23  a1b1c1d1e1f1g1h1 i1j1k1l1m1n1o1p1 a0b0c0d0e0f0g0h0 i0j0k0l0m0n0o0p0
  351. ;
  352. ;------------------------------------------------------------------------
  353.  
  354.         swap    d7
  355.         move.w    (6,sp),d7    ; num 16 pix per row - 1
  356.  
  357.         move.l    (a0)+,d0    ; get first 4 pixels 00
  358.         move.l    (a0)+,d1    ; get first 4 pixels 01
  359.         move.l    (a0)+,d2    ; get first 4 pixels 02
  360.         move.l    (a0)+,d3    ; get first 4 pixels 03
  361.  
  362.         move.l    d0,d4
  363.         and.l    d6,d0
  364.         eor.l    d0,d4
  365.         lsl.l    #4,d4
  366.  
  367.         bra.b    .same_from_here
  368.  
  369.         cnop    0,4
  370.  
  371. .outerloop    swap    d7
  372.         move.w    (6,sp),d7    ; num 16 pix per row - 1
  373.  
  374.         move.l    (a0)+,d0    ; get 4 next pixels 00
  375.         move.l    (a0)+,d1    ; get 4 next pixels 01
  376.         move.l    (a0)+,d2    ; get 4 next pixels 02
  377.         move.l    (a0)+,d3    ; get 4 next pixels 03
  378.  
  379.         move.w    d5,(a1)        ; 31 -> plane 4
  380.         adda.l    a5,a1        ; +bpmod
  381.  
  382.         move.l    d0,d4
  383.         and.l    d6,d0
  384.         eor.l    d0,d4
  385.         lsl.l    #4,d4
  386.  
  387.         swap    d5
  388.         move.w    d5,(a1)        ; 31 -> plane 5
  389.         adda.l    (sp),a1        ; +linemod-bytesperrow-5*bpmod+2
  390.  
  391.         bra.b    .same_from_here
  392.  
  393. .innerloop    move.l    (a0)+,d0    ; get 4 next pixels 00
  394.         move.l    (a0)+,d1    ; get 4 next pixels 01
  395.         move.l    (a0)+,d2    ; get 4 next pixels 02
  396.         move.l    (a0)+,d3    ; get 4 next pixels 03
  397.  
  398.         move.w    d5,(a1)        ; 31 -> plane 4
  399.         adda.l    a5,a1        ; +bpmod
  400.  
  401.         move.l    d0,d4
  402.         and.l    d6,d0
  403.         eor.l    d0,d4
  404.         lsl.l    #4,d4
  405.  
  406.         swap    d5
  407.         move.w    d5,(a1)        ; 31 -> plane 5
  408.         suba.l    a6,a1        ; -5*bpmod+2
  409.  
  410. .same_from_here    move.l    d2,d5
  411.         and.l    d6,d5
  412.         eor.l    d5,d2
  413.         lsr.l    #4,d5
  414.         or.l    d5,d0
  415.         or.l    d4,d2        ; 00x02 -> 10 11
  416.         move.l    d1,d4
  417.         and.l    d6,d1
  418.         eor.l    d1,d4
  419.         move.l    d3,d5
  420.         and.l    d6,d5
  421.         eor.l    d5,d3
  422.         lsr.l    #4,d5
  423.         lsl.l    #4,d4
  424.         or.l    d5,d1
  425.         or.l    d4,d3        ; 01x03 -> 12 13
  426.         move.l    a3,d6        ; 2 bit mask = #$cccccccc
  427.         move.l    d2,d4
  428.         and.l    d6,d2
  429.         eor.l    d2,d4
  430.         move.l    d3,d5
  431.         and.l    d6,d5
  432.         eor.l    d5,d3
  433.         lsl.l    #2,d4
  434.         or.l    d4,d3        ; 11x13b -> 23
  435.         move.l    a4,d6        ; 1 bit mask = #$aaaa5555
  436.         move.l    d3,d4
  437.         and.l    d6,d3
  438.         eor.l    d3,d4
  439.         lsr.w    #1,d4
  440.         swap    d4
  441.         add.w    d4,d4
  442.         or.l    d4,d3        ; 23x23 -> 33
  443.  
  444.         move.w    d3,(a1)        ; 33 -> plane 0
  445.         adda.l    a5,a1        ; +bpmod
  446.  
  447.         lsr.l    #2,d5
  448.         or.l    d5,d2        ; 11x13a -> 22
  449.         move.l    d2,d4
  450.         and.l    d6,d2
  451.         eor.l    d2,d4
  452.  
  453.         swap    d3
  454.         move.w    d3,(a1)        ; 33 -> plane 1
  455.         adda.l    a5,a1        ; +bpmod
  456.  
  457.         lsr.w    #1,d4
  458.         swap    d4
  459.         add.w    d4,d4
  460.         or.l    d4,d2        ; 22x22 -> 32
  461.         lsl.l    #2,d0
  462.  
  463.         move.w    d2,(a1)        ; 32 -> plane 2
  464.         adda.l    a5,a1        ; +bpmod
  465.  
  466.         or.l    d0,d1        ; 10x12b -> 21
  467.         swap    d2
  468.         move.l    d1,d5
  469.         and.l    d6,d1
  470.         eor.l    d1,d5
  471.  
  472.         move.w    d2,(a1)        ; 32 -> plane 3
  473.         adda.l    a5,a1        ; +bpmod
  474.  
  475.         lsr.w    #1,d5
  476.         swap    d5
  477.         add.w    d5,d5
  478.         or.l    d1,d5        ; 21x21 -> 31
  479.         move.l    a2,d6        ; 4 bit mask = #$f0f0f0f0
  480.  
  481.         dbra    d7,.innerloop
  482.  
  483.         swap    d7
  484.         dbra    d7,.outerloop
  485.  
  486.         move.w    d5,(a1)        ; 31 -> plane 4
  487.         adda.l    a5,a1        ; +bpmod
  488.         swap    d5
  489.         move.w    d5,(a1)        ; 31 -> plane 5
  490.  
  491.         addq.l    #8,sp        ; remove locals
  492.         rts
  493.  
  494.  
  495. doc2p_2X8
  496. ; inputs:
  497. ; a0.l=src chunky buffer
  498. ; a1.l=dest chipmem bitmap
  499. ; d0.w=width (in pixels - multiple of 32) to convert
  500. ; d1.w=height (in pixels - even)
  501. ; d2.l=modulo from one bitplane to next (copmod-ish)
  502. ; d3.l=modulo from start of one line to start of next (linemod)
  503.  
  504.         movea.l    d2,a6        ; a6 = bpmod
  505.         move.l    d2,d4
  506.         lsl.l    #3,d4
  507.         sub.l    d2,d4
  508.         neg.l    d4
  509.         addq.l    #4,d4
  510.         movea.l    d4,a3        ; a3 = -7*bpmod+4
  511.         movea.l    d4,a4        ; a4 = -7*bpmod+4
  512.         lsr.w    #4,d0
  513.         movea.w    d0,a2
  514.         subq.l    #1,a2        ; a2 = num 16 pix per row - 1
  515.         lsl.w    #2,d0        ; d0 = num 4 pix per row (bytesperrow)
  516.         movea.l    d3,a5
  517.         suba.w    d0,a5
  518.         adda.l    a3,a5        ; a5 = linemod-bytesperrow-7*bpmod+4
  519.         move.w    d1,d7
  520.         subq.w    #1,d7        ; d7 = height - 1
  521.  
  522. ;------------------------------------------------------------------------
  523. ; original pixels
  524. ; 00        a7a6a5a4a3a2a1a0 e7e6e5e4e3e2e1e0 i7i6i5i4i3i2i1i0 m7m6m5m4m3m2m1m0
  525. ; 01        b7b6b5b4b3b2b1b0 f7f6f5f4f3f2f1f0 j7j6j5j4j3j2j1j0 n7n6n5n4n3n2n1n0
  526. ; 02        c7c6c5c4c3c2c1c0 g7g6g5g4g3g2g1g0 k7k6k5k4k3k2k1k0 o7o6o5o4o3o2o1o0
  527. ; 03        d7d6d5d4d3d2d1d0 h7h6h5h4h3h2h1h0 l7l6l5l4l3l2l1l0 p7p6p5p4p3p2p1p0
  528. ;
  529. ; after 4bit merge
  530. ; 10 00x02a a7a6a5a4c7c6c5c4 e7e6e5e4g7g6g5g4 i7i6i5i4k7k6k5k4 m7m6m5m4o7o6o5o4
  531. ; 11 00x02b a3a2a1a0c3c2c1c0 e3e2e1e0g3g2g1g0 i3i2i1i0k3k2k1k0 m3m2m1m0o3o2o1o0
  532. ; 12 01x03a b7b6b5b4d7d6d5d4 f7f6f5f4h7h6h5h4 j7j6j5j4l7l6l5l4 n7n6n5n4p7p6p5p4
  533. ; 13 01x03b b3b2b1b0d3d2d1d0 f3f2f1f0h3h2h1h0 j3j2j1j0l3l2l1l0 n3n2n1n0p3p2p1p0
  534. ;
  535. ; after 2bit merge
  536. ; 20 10x12a a7a6b7b6c7c6d7d6 e7e6f7f6g7g6h7h6 i7i6j7j6k7k6l7l6 m7m6n7n6o7o6p7p6
  537. ; 21 10x12b a5a4b5b4c5c4d5d4 e5e4f5f4g5g4h5h4 i5i4j5j4k5k4l5l4 m5m4n5n4o5o4p5p4
  538. ; 22 11x13a a3a2b3b2c3c2d3d2 e3e2f3f2g3g2h3h2 i3i2j3j2k3k2l3l2 m3m2n3n2o3o2p3p2
  539. ; 23 11x13b a1a0b1b0c1c0d1d0 e1e0f1f0g1g0h1h0 i1i0j1j0k1k0l1l0 m1m0n1n0o1o0p1p0
  540. ;
  541. ; after 1bit merge
  542. ; 30 20x20a a7a7b7b7c7c7d7d7 e7e7f7f7g7g7h7h7 i7i7j7j7k7k7l7l7 m7m7n7n7o7o7p7p7
  543. ; 31 20x20b a6a6b6b6c6c6d6d6 e6e6f6f6g6g6h6h6 i6i6j6j6k6k6l6l6 m6m6n6n6o6o6p6p6
  544. ; 32 21x21a a5a5b5b5c5c5d5d5 e5e5f5f5g5g5h5h5 i5i5j5j5k5k5l5l5 m5m5n5n5o5o5p5p5
  545. ; 33 21x21b a4a4b4b4c4c4d4d4 e4e4f4f4g4g4h4h4 i4i4j4j4k4k4l4l4 m4m4n4n4o4o4p4p4
  546. ; 34 22x22a a3a3b3b3c3c3d3d3 e3e3f3f3g3g3h3h3 i3i3j3j3k3k3l3l3 m3m3n3n3o3o3p3p3
  547. ; 35 22x22b a2a2b2b2c2c2d2d2 e2e2f2f2g2g2h2h2 i2i2j2j2k2k2l2l2 m2m2n2n2o2o2p2p2
  548. ; 36 23x23a a1a1b1b1c1c1d1d1 e1e1f1f1g1g1h1h1 i1i1j1j1k1k1l1l1 m1m1n1n1o1o1p1p1
  549. ; 37 23x23b a0a0b0b0c0c0d0d0 e0e0f0f0g0g0h0h0 i0i0j0j0k0k0l0l0 m0m0n0n0o0o0p0p0
  550. ;------------------------------------------------------------------------
  551.  
  552.         swap    d7
  553.         move.w    a2,d7        ; number of 16 (game) pixels per row - 1
  554.  
  555.         movem.l    (a0)+,d0-d2    ; read first 12 (game) pixels
  556.  
  557.         move.l    #$f0f0f0f0,d6
  558.  
  559.         move.l    d0,d4
  560.         move.l    d2,d5
  561.         and.l    d6,d0        ; #$f0f0f0f0
  562.         eor.l    d0,d4
  563.         lsl.l    #4,d4
  564.         and.l    d6,d5        ; #$f0f0f0f0
  565.         eor.l    d5,d2
  566.         lsr.l    #4,d5
  567.         or.l    d5,d0
  568.         or.l    d4,d2        ; 00x02 -> 10 11
  569.  
  570.         bra    .same_from_here
  571.  
  572.         cnop    0,4
  573.  
  574. .outerloop    swap    d7
  575.         move.w    a2,d7        ; number of 16 (game) pixels per row - 1
  576.  
  577. .innerloop    movem.l    (a0)+,d0-d2    ; read next 12 (game) pixels
  578.  
  579.         move.l    d6,(a1)        ; 32 -> plane 5
  580.         adda.l    a6,a1        ; +bpmod
  581.  
  582.         move.l    #$f0f0f0f0,d6
  583.  
  584.         move.l    d0,d4
  585.         and.l    d6,d0        ; #$f0f0f0f0
  586.         eor.l    d0,d4
  587.         lsl.l    #4,d4
  588.  
  589.         move.l    d5,(a1)        ; 31 -> plane 6
  590.         adda.l    a6,a1        ; +bpmod
  591.  
  592.         move.l    d2,d5
  593.         and.l    d6,d5        ; #$f0f0f0f0
  594.         eor.l    d5,d2
  595.         lsr.l    #4,d5
  596.         or.l    d5,d0
  597.         or.l    d4,d2        ; 00x02 -> 10 11
  598.  
  599.         move.l    d3,(a1)        ; 30 -> plane 7
  600.         adda.l    a4,a1        ; -7*bpmod+4 or
  601.                     ; +linemod-bytesperrow-7*bpmod+4
  602.  
  603. .same_from_here    move.l    d1,d4
  604.         and.l    d6,d1        ; #$f0f0f0f0
  605.         eor.l    d1,d4
  606.         lsl.l    #4,d4
  607.  
  608.         move.l    (a0)+,d3    ; read next 4 (game) pixels
  609.  
  610.         move.l    d3,d5
  611.         and.l    d6,d5        ; #$f0f0f0f0
  612.         eor.l    d5,d3
  613.         lsr.l    #4,d5
  614.         or.l    d5,d1
  615.         or.l    d4,d3        ; 01x03    -> 12 13
  616.  
  617.         move.l    #$cccccccc,d6
  618.  
  619.         move.l    d0,d4
  620.         and.l    d6,d0        ; #$cccccccc
  621.         eor.l    d0,d4
  622.         lsl.l    #2,d4
  623.         move.l    d1,d5
  624.         and.l    d6,d5        ; #$cccccccc
  625.         eor.l    d5,d1
  626.         lsr.l    #2,d5
  627.         or.l    d5,d0
  628.         or.l    d4,d1        ; 10x12 -> 20 21
  629.  
  630.         move.l    d2,d4
  631.         and.l    d6,d2        ; #$cccccccc
  632.         eor.l    d2,d4
  633.         lsl.l    #2,d4
  634.         move.l    d3,d5
  635.         and.l    d6,d5        ; #$cccccccc
  636.         eor.l    d5,d3
  637.         lsr.l    #2,d5
  638.         or.l    d5,d2
  639.         or.l    d4,d3        ; 11x13 -> 22 23
  640.  
  641.         move.l    #$aaaaaaaa,d6
  642.  
  643.         move.l    d3,d4
  644.         and.l    d6,d3        ; #$aaaaaaaa
  645.         eor.l    d3,d4
  646.  
  647.         move.l    d4,d5
  648.         add.l    d4,d4
  649.         or.l    d4,d5        ; 23x23b -> 37
  650.  
  651.         move.l    d5,(a1)        ; 37 -> plane 0
  652.         adda.l    a6,a1        ; +bpmod
  653.  
  654.         move.l    d3,d4
  655.         lsr.l    #1,d3
  656.         or.l    d3,d4        ; 23x23a -> 36
  657.         move.l    d2,d5
  658.         and.l    d6,d2        ; #$aaaaaaaa
  659.         eor.l    d2,d5
  660.  
  661.         move.l    d4,(a1)        ; 36 -> plane 1
  662.         adda.l    a6,a1        ; +bpmod
  663.  
  664.         move.l    d5,d3
  665.         add.l    d5,d5
  666.         or.l    d5,d3        ; 22x22b -> 35
  667.         move.l    d2,d5
  668.         lsr.l    #1,d2
  669.         or.l    d5,d2        ; 22x22a -> 34
  670.  
  671.         move.l    d3,(a1)        ; 35 -> plane 2
  672.         adda.l    a6,a1        ; +bpmod
  673.  
  674.         move.l    d1,d4
  675.         and.l    d6,d1        ; #$aaaaaaaa
  676.         eor.l    d1,d4
  677.         move.l    d0,d5
  678.         and.l    d6,d0        ; #$aaaaaaaa
  679.         eor.l    d0,d5
  680.  
  681.         move.l    d2,(a1)        ; 34 -> plane 3
  682.         adda.l    a6,a1        ; +bpmod
  683.  
  684.         move.l    d4,d2
  685.         add.l    d4,d4
  686.         or.l    d4,d2        ; 21x21b -> 33
  687.         move.l    d1,d6
  688.         lsr.l    #1,d1
  689.         or.l    d1,d6        ; 21x21a -> 32
  690.         move.l    d5,d3
  691.  
  692.         move.l    d2,(a1)        ; 33 -> plane 4
  693.         adda.l    a6,a1        ; +bpmod
  694.  
  695.         add.l    d5,d5
  696.         or.l    d3,d5        ; 20x20b -> 31
  697.         move.l    d0,d3
  698.         lsr.l    #1,d0
  699.         or.l    d0,d3        ; 20x20a -> 30
  700.  
  701.         movea.l    a3,a4        ; a4 = -7*bpmod+4
  702.  
  703.         dbra    d7,.innerloop
  704.  
  705.         movea.l    a5,a4        ; a4 = linemod-bytesperrow-7*bpmod+4
  706.  
  707.         swap    d7
  708.         dbra    d7,.outerloop
  709.  
  710.         move.l    d6,(a1)        ; 32 -> plane 5
  711.         adda.l    a6,a1        ; +bpmod
  712.         move.l    d5,(a1)        ; 31 -> plane 6
  713.         adda.l    a6,a1        ; +bpmod
  714.         move.l    d3,(a1)        ; 30 -> plane 7
  715.  
  716.         rts
  717.  
  718.  
  719. doc2p_2X6
  720. ; inputs:
  721. ; a0.l=src chunky buffer
  722. ; a1.l=dest chipmem bitmap
  723. ; d0.w=width (in pixels - multiple of 32) to convert
  724. ; d1.w=height (in pixels - even)
  725. ; d2.l=modulo from one bitplane to next (copmod-ish)
  726. ; d3.l=modulo from start of one line to start of next (linemod)
  727.  
  728.         movea.l    d2,a6        ; a6 = bpmod
  729.         move.l    d2,d4
  730.         lsl.l    #2,d4
  731.         add.l    d2,d4
  732.         neg.l    d4
  733.         addq.l    #4,d4
  734.         movea.l    d4,a3        ; a3 = -5*bpmod+4
  735.         movea.l    d4,a4        ; a4 = -5*bpmod+4
  736.         lsr.w    #4,d0
  737.         movea.w    d0,a2
  738.         subq.l    #1,a2        ; a2 = num 16 pix per row - 1
  739.         lsl.w    #2,d0        ; d0 = num 4 pix per row (bytesperrow)
  740.         movea.l    d3,a5
  741.         suba.w    d0,a5
  742.         adda.l    a3,a5        ; a5 = linemod-bytesperrow-5*bpmod+4
  743.         move.w    d1,d7
  744.         subq.w    #1,d7        ; d7 = height - 1
  745.  
  746. ;------------------------------------------------------------------------
  747. ; original pixels
  748. ; 00        ....a5a4a3a2a1a0 ....e5e4e3e2e1e0 ....i5i4i3i2i1i0 ....m5m4m3m2m1m0
  749. ; 01        ....b5b4b3b2b1b0 ....f5f4f3f2f1f0 ....j5j4j3j2j1j0 ....n5n4n3n2n1n0
  750. ; 02        ....c5c4c3c2c1c0 ....g5g4g3g2g1g0 ....k5k4k3k2k1k0 ....o5o4o3o2o1o0
  751. ; 03        ....d5d4d3d2d1d0 ....h5h4h3h2h1h0 ....l5l4l3l2l1l0 ....p5p4p3p2p1p0
  752. ;
  753. ; after 4bit merge
  754. ; 10 00x02a ....a5a4....c5c4 ....e5e4....g5g4 ....i5i4....k5k4 ....m5m4....o5o4
  755. ; 11 00x02b a3a2a1a0c3c2c1c0 e3e2e1e0g3g2g1g0 i3i2i1i0k3k2k1k0 m3m2m1m0o3o2o1o0
  756. ; 12 01x03a ....b5b4....d5d4 ....f5f4....h5h4 ....j5j4....l5l4 ....n5n4....p5p4
  757. ; 13 01x03b b3b2b1b0d3d2d1d0 f3f2f1f0h3h2h1h0 j3j2j1j0l3l2l1l0 n3n2n1n0p3p2p1p0
  758. ;
  759. ; after 2bit merge
  760. ; 21 10x12b a5a4b5b4c5c4d5d4 e5e4f5f4g5g4h5h4 i5i4j5j4k5k4l5l4 m5m4n5n4o5o4p5p4
  761. ; 22 11x13a a3a2b3b2c3c2d3d2 e3e2f3f2g3g2h3h2 i3i2j3j2k3k2l3l2 m3m2n3n2o3o2p3p2
  762. ; 23 11x13b a1a0b1b0c1c0d1d0 e1e0f1f0g1g0h1h0 i1i0j1j0k1k0l1l0 m1m0n1n0o1o0p1p0
  763. ;
  764. ; after 1bit merge
  765. ; 32 21x21a a5a5b5b5c5c5d5d5 e5e5f5f5g5g5h5h5 i5i5j5j5k5k5l5l5 m5m5n5n5o5o5p5p5
  766. ; 33 21x21b a4a4b4b4c4c4d4d4 e4e4f4f4g4g4h4h4 i4i4j4j4k4k4l4l4 m4m4n4n4o4o4p4p4
  767. ; 34 22x22a a3a3b3b3c3c3d3d3 e3e3f3f3g3g3h3h3 i3i3j3j3k3k3l3l3 m3m3n3n3o3o3p3p3
  768. ; 35 22x22b a2a2b2b2c2c2d2d2 e2e2f2f2g2g2h2h2 i2i2j2j2k2k2l2l2 m2m2n2n2o2o2p2p2
  769. ; 36 23x23a a1a1b1b1c1c1d1d1 e1e1f1f1g1g1h1h1 i1i1j1j1k1k1l1l1 m1m1n1n1o1o1p1p1
  770. ; 37 23x23b a0a0b0b0c0c0d0d0 e0e0f0f0g0g0h0h0 i0i0j0j0k0k0l0l0 m0m0n0n0o0o0p0p0
  771. ;------------------------------------------------------------------------
  772.  
  773.         swap    d7
  774.         move.w    a2,d7        ; number of 16 (game) pixels per row - 1
  775.  
  776.         movem.l    (a0)+,d0-d2    ; read first 12 (game) pixels
  777.  
  778.         move.l    #$f0f0f0f0,d6
  779.  
  780.         move.l    d0,d4
  781.         move.l    d2,d5
  782.         and.l    d6,d0        ; #$f0f0f0f0
  783.         eor.l    d0,d4
  784.         lsl.l    #4,d4
  785.         and.l    d6,d5        ; #$f0f0f0f0
  786.         eor.l    d5,d2
  787.         lsr.l    #4,d5
  788.         or.l    d5,d0
  789.         or.l    d4,d2        ; 00x02 -> 10 11
  790.  
  791.         bra    .same_from_here
  792.  
  793.         cnop    0,4
  794.  
  795. .outerloop    swap    d7
  796.         move.w    a2,d7        ; number of 16 (game) pixels per row - 1
  797.  
  798. .innerloop    movem.l    (a0)+,d0-d2    ; read next 12 (game) pixels
  799.  
  800.         move.l    d4,(a1)        ; 34 -> plane 3
  801.         adda.l    a6,a1        ; +bpmod
  802.  
  803.         move.l    #$f0f0f0f0,d6
  804.  
  805.         move.l    d0,d4
  806.         and.l    d6,d0
  807.         eor.l    d0,d4
  808.         lsl.l    #4,d4
  809.  
  810.         move.l    d5,(a1)        ; 33 -> plane 4
  811.         adda.l    a6,a1        ; +bpmod
  812.  
  813.         move.l    d2,d5
  814.         and.l    d6,d5
  815.         eor.l    d5,d2
  816.         lsr.l    #4,d5
  817.         or.l    d5,d0
  818.         or.l    d4,d2        ; 00x02 -> 10 11
  819.  
  820.         move.l    d3,(a1)        ; 32 -> plane 5
  821.         adda.l    a4,a1        ; -5*bpmod+4 or
  822.                     ; +linemod-bytesperrow-5*bpmod+4
  823.  
  824. .same_from_here    move.l    d1,d4
  825.         and.l    d6,d1
  826.         eor.l    d1,d4
  827.         lsl.l    #4,d4
  828.  
  829.         move.l    (a0)+,d3    ; read next 4 (game) pixels
  830.  
  831.         move.l    d3,d5
  832.         and.l    d6,d5        ; #$f0f0f0f0
  833.         eor.l    d5,d3
  834.         lsr.l    #4,d5
  835.         or.l    d5,d1
  836.         or.l    d4,d3        ; 01x03    -> 12 13
  837.         lsl.l    #2,d0
  838.         or.l    d0,d1        ; 10x12 ->    21
  839.  
  840.         move.l    #$cccccccc,d6
  841.  
  842.         move.l    d2,d4
  843.         and.l    d6,d2        ; #$cccccccc
  844.         eor.l    d2,d4
  845.         lsl.l    #2,d4
  846.         move.l    d3,d5
  847.         and.l    d6,d5        ; #$cccccccc
  848.         eor.l    d5,d3
  849.         lsr.l    #2,d5
  850.         or.l    d5,d2
  851.         or.l    d4,d3        ; 11x13 -> 22 23
  852.  
  853.         move.l    #$aaaaaaaa,d6
  854.  
  855.         move.l    d3,d0
  856.         and.l    d6,d3        ; #$aaaaaaaa
  857.         eor.l    d3,d0
  858.         move.l    d0,d5
  859.         add.l    d0,d0
  860.         or.l    d0,d5        ; 23x23b -> 37
  861.  
  862.         move.l    d5,(a1)        ; 37 -> plane 0
  863.         adda.l    a6,a1        ; +bpmod
  864.  
  865.         move.l    d3,d0
  866.         lsr.l    #1,d3
  867.         or.l    d3,d0        ; 23x23a -> 36
  868.         move.l    d2,d4
  869.         and.l    d6,d2        ; #$aaaaaaaa
  870.         eor.l    d2,d4
  871.         move.l    d4,d3
  872.         add.l    d4,d4
  873.  
  874.         move.l    d0,(a1)        ; 36 -> plane 1
  875.         adda.l    a6,a1        ; +bpmod
  876.  
  877.         or.l    d4,d3        ; 22x22b -> 35
  878.         move.l    d2,d4
  879.         lsr.l    #1,d2
  880.         or.l    d2,d4        ; 22x22a -> 34
  881.         move.l    d1,d0
  882.         and.l    d6,d1        ; #$aaaaaaaa
  883.         eor.l    d1,d0
  884.         move.l    d0,d5
  885.  
  886.         move.l    d3,(a1)        ; 35 -> plane 2
  887.         adda.l    a6,a1        ; +bpmod
  888.  
  889.         add.l    d0,d0
  890.         or.l    d0,d5        ; 21x21b -> 33
  891.         move.l    d1,d3
  892.         lsr.l    #1,d1
  893.         or.l    d1,d3        ; 21x21a -> 32
  894.  
  895.         movea.l    a3,a4        ; a4 = -5*bpmod+4
  896.  
  897.         dbra    d7,.innerloop
  898.  
  899.         movea.l    a5,a4        ; a4 = linemod-bytesperrow-5*bpmod+4
  900.  
  901.         swap    d7
  902.         dbra    d7,.outerloop
  903.  
  904.         move.l    d4,(a1)        ; 34 -> plane 3
  905.         adda.l    a6,a1        ; +bpmod
  906.         move.l    d5,(a1)        ; 33 -> plane 4
  907.         adda.l    a6,a1        ; +bpmod
  908.         move.l    d3,(a1)        ; 32 -> plane 5
  909.  
  910.         rts
  911.  
  912.         end
  913.