home *** CD-ROM | disk | FTP | other *** search
/ Amiga Format 82 / af082b.adf / blackmagic_1.s next >
Text File  |  1995-12-12  |  10KB  |  689 lines

  1.  
  2.     ;offset 0: initialization routines
  3.     bra    initc2p
  4.  
  5.     ;offset 4: one pixel wide versions...AGA
  6.     bra    doc2p_1X8
  7.  
  8.     ;offset 8: one pixel wide versions...EHB
  9.     bra    doc2p_1X6
  10.  
  11.     ;offset 12: two pixel wide versions...AGA
  12.     bra    doc2p_2X8
  13.  
  14.     ;offset 16: two pixel wide versions...EHB
  15.     bra    doc2p_2X6
  16.  
  17.     ;offset 20: address of description string
  18.     dc.l    string
  19.  
  20. string    dc.b    'A Chunky to planar routine by Mark Sibly. '
  21.     dc.b    'Supports 6/8 bitplane, single/double width pixels.',0
  22.     even
  23.  
  24. initc2p    ;create 2 tables for Gloom
  25.     ;
  26.     ;a0=columns buffer to fill in (array of longs) for 1 wide pixs.
  27.     ;a1=columns buffer for 2 wide pixs
  28.     ;d0=how many columns (multiple of 32)
  29.     ;a2=palette remapping array (do 256)
  30.     ;
  31.     move    #255,d1    ;#colours
  32. .loop    move.b    d1,0(a2,d1)
  33.     dbf    d1,.loop
  34.     ;
  35.     move.l    d0,-(a7)
  36.     ;
  37. make1wideoffs    ;column offsets for 1 wide pixels
  38.     ;
  39.     ;0,2,4,6,8,10,12,14
  40.     ;1,3,5,7,9,11,13,15
  41.     ;16,18,20...
  42.     ;
  43.     lsr    #4,d0
  44.     subq    #1,d0
  45.     moveq    #0,d1
  46.     ;
  47. .loop2    moveq    #7,d2
  48.     ;
  49. .loop3    move.l    d1,(a0)+
  50.     addq.l    #2,d1
  51.     dbf    d2,.loop3
  52.     ;
  53.     sub.l    #15,d1
  54.     moveq    #7,d2
  55.     ;
  56. .loop4    move.l    d1,(a0)+
  57.     addq.l    #2,d1
  58.     dbf    d2,.loop4
  59.     ;
  60.     subq.l    #1,d1
  61.     ;
  62.     dbf    d0,.loop2
  63.     ;
  64.     move.l    (a7)+,d0
  65.     ;
  66. make2wideoffs    ;column offsets for 2 wide pixels
  67.     ;
  68.     ;0,2,4,6,1,3,5,7,8,10,12,14...
  69.     ;
  70.     lsr    #3,d0
  71.     subq    #1,d0
  72.     moveq    #0,d1
  73.     ;
  74. .loop2    moveq    #3,d2
  75.     ;
  76. .loop3    move.l    d1,(a1)+
  77.     addq.l    #2,d1
  78.     dbf    d2,.loop3
  79.     ;
  80.     sub.l    #7,d1
  81.     moveq    #3,d2
  82.     ;
  83. .loop4    move.l    d1,(a1)+
  84.     addq.l    #2,d1
  85.     dbf    d2,.loop4
  86.     ;
  87.     subq.l    #1,d1
  88.     ;
  89.     dbf    d0,.loop2
  90.     ;
  91.     rts
  92.  
  93. rotbits    macro    ;macro for rotating/merging bits.
  94.     ;
  95.     ;rotbits    reg1,reg2,shift
  96.     ;
  97.     move.l    \1,d4
  98.     and.l    d6,\1
  99.     eor.l    \1,d4
  100.     lsl.l    #\3,\1
  101.     ;
  102.     move.l    \2,d5
  103.     and.l    d6,d5
  104.     eor.l    d5,\2
  105.     lsr.l    #\3,\2
  106.     or.l    d4,\2
  107.     or.l    d5,\1
  108.     ;
  109.     endm
  110.  
  111. doc2p_1X8    ;
  112.     ;inputs:
  113.     ;a0.l=src chunky buffer
  114.     ;a1.l=dest chipmem bitmap
  115.     ;d0.w=width (in pixels - multiple of 32) to convert
  116.     ;d1.w=height (in pixels - even)
  117.     ;d2.l=modulo from one bitplane to next (copmod-ish)
  118.     ;d3.l=modulo from start of one line to start of next (linemod)
  119.     ;
  120.     ;internal:
  121.     ;d6=current and reg.
  122.     ;d7=loop counter
  123.     ;a2=4 bit and
  124.     ;a3=2 bit and
  125.     ;a4=1 bit and
  126.     ;a5=bitplane modulo, 1 bp to next
  127.     ;a6=subtract at end of one loop
  128.     ;
  129.     move.l    #$0f0f0f0f,a2
  130.     move.l    #$33333333,a3
  131.     move.l    #$5555aaaa,a4
  132.     move.l    d2,a5    ;one bp to next.
  133.     ;
  134.     lsl.l    #3,d2    ;8 bitplanes
  135.     move.l    d2,a6
  136.     sub.l    a5,a6    ;7 * bpmod
  137.     subq.l    #2,a6    ;to next word
  138.     ;
  139.     lsr    #4,d0    ;16 pixels at a time
  140.     move    d0,d2
  141.     ext.l    d2
  142.     add.l    d2,d2
  143.     add.l    a6,d2
  144.     sub.l    d2,d3
  145.     move.l    d3,-(a7)
  146.     ;
  147.     subq    #1,d1
  148.     move    d1,d7    ;hite dbf
  149.     swap    d7
  150.     subq    #1,d0
  151.     move    d0,d7
  152.     subq    #2,a7    ;long align stack
  153.     move    d7,-(a7)
  154.     ;
  155.     movem.l    (a0)+,d0-d3    ;next 16 pixels.
  156.     move.l    a2,d6    ;4 bit and
  157.     bra.s    .here
  158.     ;
  159. .loop2    swap    d7
  160.     bra.s    .here
  161.     ;
  162. .loop    movem.l    (a0)+,d0-d3    ;next 16 pixels.
  163.     move.l    a2,d6    ;4 bit and
  164.     ;
  165.     swap    d4
  166.     move    d4,(a1)    ;plane 7
  167.     sub.l    a6,a1    ;back to start of next pixel.
  168.     ;
  169. .here    rotbits    d0,d2,4
  170.     rotbits    d1,d3,4
  171.     ;
  172.     move.l    a3,d6    ;2 bit and
  173.     rotbits    d0,d1,2
  174.     move.l    a4,d6    ;1 bit and
  175.     ;
  176.     move.l    d0,d4
  177.     and.l    d6,d4
  178.     eor.l    d4,d0
  179.     lsr    #1,d4
  180.     swap    d4
  181.     add    d4,d4
  182.     or.l    d4,d0
  183.     ;
  184.     move    d0,(a1)    ;plane 0
  185.     add.l    a5,a1
  186.     ;
  187.     move.l    d1,d4
  188.     and.l    d6,d4
  189.     eor.l    d4,d1
  190.     ;
  191.     swap    d0
  192.     move    d0,(a1)
  193.     add.l    a5,a1
  194.     ;
  195.     lsr    #1,d4
  196.     swap    d4
  197.     add    d4,d4
  198.     or.l    d4,d1
  199.     ;
  200.     move    d1,(a1)    ;plane 2
  201.     add.l    a5,a1
  202.     ;
  203.     move.l    a3,d6    ;2 bit and
  204.     rotbits    d2,d3,2
  205.     move.l    a4,d6    ;1 bit and
  206.     ;
  207.     move.l    d2,d4
  208.     and.l    d6,d4
  209.     eor.l    d4,d2
  210.     ;
  211.     swap    d1
  212.     move    d1,(a1)    ;plane 3
  213.     add.l    a5,a1
  214.     ;
  215.     lsr    #1,d4
  216.     swap    d4
  217.     add    d4,d4
  218.     or.l    d4,d2
  219.     ;
  220.     move    d2,(a1)    ;plane 4
  221.     add.l    a5,a1
  222.     ;
  223.     move.l    d3,d4
  224.     and.l    d6,d4
  225.     eor.l    d4,d3
  226.     ;
  227.     swap    d2
  228.     move    d2,(a1)    ;plane 5
  229.     add.l    a5,a1
  230.     ;
  231.     lsr    #1,d4
  232.     swap    d4
  233.     add    d4,d4
  234.     or.l    d3,d4
  235.     ;
  236.     move    d4,(a1)    ;plane 6
  237.     add.l    a5,a1
  238.     ;
  239.     dbf    d7,.loop    ;end of width?
  240.     move    (a7),d7
  241.     swap    d7
  242.     ;
  243.     movem.l    (a0)+,d0-d3    ;get next 16 pixels.
  244.     move.l    a2,d6    ;4 bit and
  245.     ;
  246.     swap    d4
  247.     move    d4,(a1)    ;plane 7.
  248.     add.l    4(a7),a1    ;start of next line
  249.     ;
  250.     dbf    d7,.loop2
  251.     ;
  252.     list
  253. .check    set    *-.loop2    ;loop size (<256?)
  254.     nolist
  255.     ;
  256.     addq    #8,a7
  257.     ;
  258.     rts
  259.  
  260. doc2p_1X6    ;
  261.     ;inputs:
  262.     ;a0.l=src chunky buffer
  263.     ;a1.l=dest chipmem bitmap
  264.     ;d0.w=width (in pixels - multiple of 32) to convert
  265.     ;d1.w=height (in pixels - even)
  266.     ;d2.l=modulo from one bitplane to next (copmod-ish)
  267.     ;d3.l=modulo from start of one line to start of next (linemod)
  268.     ;
  269.     ;internal:
  270.     ;d6=current and reg.
  271.     ;d7=loop counter
  272.     ;a2=4 bit and
  273.     ;a3=2 bit and
  274.     ;a4=1 bit and
  275.     ;a5=bitplane modulo, 1 bp to next
  276.     ;a6=subtract at end of one loop
  277.     ;
  278.     move.l    #$0f0f0f0f,a2
  279.     move.l    #$33333333,a3
  280.     move.l    #$5555aaaa,a4
  281.     move.l    d2,a5    ;one bp to next.
  282.     ;
  283.     lsl.l    #2,d2    ;*4
  284.     add.l    a5,d2    ;*5
  285.     move.l    d2,a6
  286.     subq.l    #2,a6
  287.     ;
  288.     lsr    #4,d0    ;16 pixels at a time
  289.     move    d0,d2
  290.     ext.l    d2
  291.     add.l    d2,d2    ;bytes
  292.     add.l    a6,d2
  293.     sub.l    d2,d3
  294.     move.l    d3,-(a7)
  295.     ;
  296.     subq    #1,d1
  297.     move    d1,d7    ;hite dbf
  298.     swap    d7
  299.     subq    #1,d0
  300.     move    d0,d7
  301.     subq    #2,a7    ;long align
  302.     move    d7,-(a7)
  303.     ;
  304.     movem.l    (a0)+,d0-d3    ;next 16 pixels.
  305.     move.l    a2,d6    ;4 bit and
  306.     bra.s    .here
  307.     ;
  308. .loop2    swap    d7
  309.     bra.s    .here
  310.     ;
  311. .loop    movem.l    (a0)+,d0-d3    ;next 16 pixels.
  312.     move.l    a2,d6    ;4 bit and
  313.     ;
  314.     swap    d4
  315.     move    d4,(a1)    ;plane 7
  316.     sub.l    a6,a1    ;back to start of next pixel.
  317.     ;
  318. .here    rotbits    d0,d2,4
  319.     rotbits    d1,d3,4
  320.     ;
  321.     move.l    a3,d6    ;2 bit and
  322.     rotbits    d0,d1,2
  323.     move.l    a4,d6    ;1 bit and
  324.     ;
  325.     move.l    d0,d4
  326.     and.l    d6,d4
  327.     eor.l    d4,d0
  328.     lsr    #1,d4
  329.     swap    d4
  330.     add    d4,d4
  331.     or.l    d4,d0
  332.     ;
  333.     move    d0,(a1)    ;plane 0
  334.     add.l    a5,a1
  335.     ;
  336.     move.l    d1,d4
  337.     and.l    d6,d4
  338.     eor.l    d4,d1
  339.     ;
  340.     swap    d0
  341.     move    d0,(a1)    ;plane 1
  342.     add.l    a5,a1
  343.     ;
  344.     lsr    #1,d4
  345.     swap    d4
  346.     add    d4,d4
  347.     or.l    d4,d1
  348.     ;
  349.     move    d1,(a1)    ;plane 2
  350.     add.l    a5,a1
  351.     ;
  352.     move.l    a3,d6    ;2 bit and
  353.     rotbits    d2,d3,2
  354.     move.l    a4,d6    ;1 bit and
  355.     ;
  356.     move.l    d2,d4
  357.     and.l    d6,d4
  358.     eor.l    d4,d2
  359.     ;
  360.     swap    d1
  361.     move    d1,(a1)    ;plane 3
  362.     add.l    a5,a1
  363.     ;
  364.     lsr    #1,d4
  365.     swap    d4
  366.     add    d4,d4
  367.     or.l    d2,d4
  368.     ;
  369.     move    d4,(a1)    ;plane 4
  370.     add.l    a5,a1
  371.     ;
  372.     dbf    d7,.loop    ;end of width?
  373.     move    (a7),d7
  374.     swap    d7
  375.     ;
  376.     movem.l    (a0)+,d0-d3    ;get next 16 pixels.
  377.     move.l    a2,d6    ;4 bit and
  378.     ;
  379.     swap    d4
  380.     move    d4,(a1)    ;plane 7.
  381.     add.l    4(a7),a1    ;start of next line
  382.     ;
  383.     dbf    d7,.loop2
  384.     ;
  385.     list
  386. .check    set    *-.loop2    ;loop size (<256?)
  387.     nolist
  388.     ;
  389.     addq    #8,a7
  390.     ;
  391.     rts
  392.  
  393. expand    macro
  394.     move.l    d1,d2
  395.     swap    d1
  396.     move.l    d1,d3
  397.     move    d2,d3
  398.     move    d1,d2
  399.     move.l    d0,d1
  400.     swap    d1
  401.     move    d1,d5
  402.     move    d0,d1
  403.     move    d5,d0
  404.     endm
  405.  
  406. doc2p_2X8    ;
  407.     ;inputs:
  408.     ;a0.l=src chunky buffer
  409.     ;a1.l=dest chipmem bitmap
  410.     ;d0.w=width (in pixels - multiple of 32) to convert
  411.     ;d1.w=height (in pixels - even)
  412.     ;d2.l=modulo from one bitplane to next (copmod-ish)
  413.     ;d3.l=modulo from start of one line to start of next (linemod)
  414.     ;
  415.     ;internal:
  416.     ;d6=current and reg.
  417.     ;d7=loop counter
  418.     ;a2=4 bit and
  419.     ;a3=2 bit and
  420.     ;a4=1 bit and
  421.     ;a5=bitplane modulo, 1 bp to next
  422.     ;a6=subtract at end of one loop
  423.     ;
  424.     move.l    #$0f0f0f0f,a2
  425.     move.l    #$33333333,a3
  426.     move.l    #$5555aaaa,a4
  427.     move.l    d2,a5    ;one bp to next.
  428.     ;
  429.     lsl.l    #3,d2    ;8 bitplanes
  430.     move.l    d2,a6
  431.     sub.l    a5,a6    ;7 * bpmod
  432.     subq.l    #2,a6    ;to next word
  433.     ;
  434.     lsr    #3,d0
  435.     move    d0,d2
  436.     ext.l    d2
  437.     add.l    d2,d2
  438.     add.l    a6,d2
  439.     sub.l    d2,d3
  440.     move.l    d3,-(a7)
  441.     ;
  442.     subq    #1,d1
  443.     move    d1,d7    ;hite dbf
  444.     swap    d7
  445.     subq    #1,d0
  446.     move    d0,d7
  447.     subq    #2,a7    ;long align
  448.     move    d7,-(a7)
  449.     ;
  450.     movem.l    (a0)+,d0-d1    ;next 16 pixels.
  451.     move.l    a2,d6    ;4 bit and
  452.     bra.s    .here
  453.     ;
  454. .loop2    swap    d7
  455.     bra.s    .here
  456.     ;
  457. .loop    movem.l    (a0)+,d0-d1    ;next 16 pixels.
  458.     move.l    a2,d6    ;4 bit and
  459.     ;
  460.     swap    d4
  461.     move    d4,(a1)    ;plane 7
  462.     sub.l    a6,a1    ;back to start of next pixel.
  463.     ;
  464. .here    expand
  465.     rotbits    d0,d2,4
  466.     rotbits    d1,d3,4
  467.     ;
  468.     move.l    a3,d6    ;2 bit and
  469.     rotbits    d0,d1,2
  470.     move.l    a4,d6    ;1 bit and
  471.     ;
  472.     move.l    d0,d4
  473.     and.l    d6,d4
  474.     eor.l    d4,d0
  475.     lsr    #1,d4
  476.     swap    d4
  477.     add    d4,d4
  478.     or.l    d4,d0
  479.     ;
  480.     move    d0,(a1)    ;plane 0
  481.     add.l    a5,a1
  482.     ;
  483.     move.l    d1,d4
  484.     and.l    d6,d4
  485.     eor.l    d4,d1
  486.     ;
  487.     swap    d0
  488.     move    d0,(a1)
  489.     add.l    a5,a1
  490.     ;
  491.     lsr    #1,d4
  492.     swap    d4
  493.     add    d4,d4
  494.     or.l    d4,d1
  495.     ;
  496.     move    d1,(a1)    ;plane 2
  497.     add.l    a5,a1
  498.     ;
  499.     move.l    a3,d6    ;2 bit and
  500.     rotbits    d2,d3,2
  501.     move.l    a4,d6    ;1 bit and
  502.     ;
  503.     move.l    d2,d4
  504.     and.l    d6,d4
  505.     eor.l    d4,d2
  506.     ;
  507.     swap    d1
  508.     move    d1,(a1)    ;plane 3
  509.     add.l    a5,a1
  510.     ;
  511.     lsr    #1,d4
  512.     swap    d4
  513.     add    d4,d4
  514.     or.l    d4,d2
  515.     ;
  516.     move    d2,(a1)    ;plane 4
  517.     add.l    a5,a1
  518.     ;
  519.     move.l    d3,d4
  520.     and.l    d6,d4
  521.     eor.l    d4,d3
  522.     ;
  523.     swap    d2
  524.     move    d2,(a1)    ;plane 5
  525.     add.l    a5,a1
  526.     ;
  527.     lsr    #1,d4
  528.     swap    d4
  529.     add    d4,d4
  530.     or.l    d3,d4
  531.     ;
  532.     move    d4,(a1)    ;plane 6
  533.     add.l    a5,a1
  534.     ;
  535.     dbf    d7,.loop    ;end of width?
  536.     move    (a7),d7
  537.     swap    d7
  538.     ;
  539.     movem.l    (a0)+,d0-d1    ;get next 16 pixels.
  540.     move.l    a2,d6    ;4 bit and
  541.     ;
  542.     swap    d4
  543.     move    d4,(a1)    ;plane 7.
  544.     add.l    4(a7),a1    ;start of next line
  545.     ;
  546.     dbf    d7,.loop2
  547.     ;
  548.     list
  549. .check    set    *-.loop2    ;loop size (<256?)
  550.     nolist
  551.     ;
  552.     addq    #8,a7
  553.     ;
  554.     rts
  555.  
  556. doc2p_2X6    ;
  557.     ;inputs:
  558.     ;a0.l=src chunky buffer
  559.     ;a1.l=dest chipmem bitmap
  560.     ;d0.w=width (in pixels - multiple of 32) to convert
  561.     ;d1.w=height (in pixels - even)
  562.     ;d2.l=modulo from one bitplane to next (bplmod-ish)
  563.     ;d3.l=modulo from start of one line to start of next (linemod)
  564.     ;
  565.     ;internal:
  566.     ;d6=current and reg.
  567.     ;d7=loop counter
  568.     ;a2=4 bit and
  569.     ;a3=2 bit and
  570.     ;a4=1 bit and
  571.     ;a5=bitplane modulo, 1 bp to next
  572.     ;a6=subtract at end of one loop
  573.     ;
  574.     move.l    #$0f0f0f0f,a2
  575.     move.l    #$33333333,a3
  576.     move.l    #$5555aaaa,a4
  577.     move.l    d2,a5    ;one bp to next.
  578.     ;
  579.     lsl.l    #2,d2    ;*4
  580.     add.l    a5,d2    ;*5
  581.     move.l    d2,a6
  582.     subq.l    #2,a6
  583.     ;
  584.     lsr    #3,d0    ;16 pixels at a time
  585.     move    d0,d2
  586.     ext.l    d2
  587.     add.l    d2,d2    ;bytes
  588.     add.l    a6,d2
  589.     sub.l    d2,d3
  590.     move.l    d3,-(a7)
  591.     ;
  592.     subq    #1,d1
  593.     move    d1,d7    ;hite dbf
  594.     swap    d7
  595.     subq    #1,d0
  596.     move    d0,d7
  597.     subq    #2,a7    ;long align
  598.     move    d7,-(a7)
  599.     ;
  600.     movem.l    (a0)+,d0-d1    ;next 16 pixels.
  601.     move.l    a2,d6    ;4 bit and
  602.     bra.s    .here
  603.     ;
  604. .loop2    swap    d7
  605.     bra.s    .here
  606.     ;
  607. .loop    movem.l    (a0)+,d0-d1    ;next 16 pixels.
  608.     move.l    a2,d6    ;4 bit and
  609.     ;
  610.     swap    d4
  611.     move    d4,(a1)    ;plane 7
  612.     sub.l    a6,a1    ;back to start of next pixel.
  613.     ;
  614. .here    expand
  615.     rotbits    d0,d2,4
  616.     rotbits    d1,d3,4
  617.     ;
  618.     move.l    a3,d6    ;2 bit and
  619.     rotbits    d0,d1,2
  620.     move.l    a4,d6    ;1 bit and
  621.     ;
  622.     move.l    d0,d4
  623.     and.l    d6,d4
  624.     eor.l    d4,d0
  625.     lsr    #1,d4
  626.     swap    d4
  627.     add    d4,d4
  628.     or.l    d4,d0
  629.     ;
  630.     move    d0,(a1)    ;plane 0
  631.     add.l    a5,a1
  632.     ;
  633.     move.l    d1,d4
  634.     and.l    d6,d4
  635.     eor.l    d4,d1
  636.     ;
  637.     swap    d0
  638.     move    d0,(a1)    ;plane 1
  639.     add.l    a5,a1
  640.     ;
  641.     lsr    #1,d4
  642.     swap    d4
  643.     add    d4,d4
  644.     or.l    d4,d1
  645.     ;
  646.     move    d1,(a1)    ;plane 2
  647.     add.l    a5,a1
  648.     ;
  649.     move.l    a3,d6    ;2 bit and
  650.     rotbits    d2,d3,2
  651.     move.l    a4,d6    ;1 bit and
  652.     ;
  653.     move.l    d2,d4
  654.     and.l    d6,d4
  655.     eor.l    d4,d2
  656.     ;
  657.     swap    d1
  658.     move    d1,(a1)    ;plane 3
  659.     add.l    a5,a1
  660.     ;
  661.     lsr    #1,d4
  662.     swap    d4
  663.     add    d4,d4
  664.     or.l    d2,d4
  665.     ;
  666.     move    d4,(a1)    ;plane 4
  667.     add.l    a5,a1
  668.     ;
  669.     dbf    d7,.loop    ;end of width?
  670.     move    (a7),d7
  671.     swap    d7
  672.     ;
  673.     movem.l    (a0)+,d0-d1    ;get next 16 pixels.
  674.     move.l    a2,d6    ;4 bit and
  675.     ;
  676.     swap    d4
  677.     move    d4,(a1)    ;plane 7.
  678.     add.l    4(a7),a1    ;start of next line
  679.     ;
  680.     dbf    d7,.loop2
  681.     ;
  682.     list
  683. .check    set    *-.loop2    ;loop size (<256?)
  684.     nolist
  685.     ;
  686.     addq    #8,a7
  687.     ;
  688.     rts
  689.