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