home *** CD-ROM | disk | FTP | other *** search
/ Amiga Format CD 25 / amigaformatcd25.iso / websites / amidoom / adoom_src-0.7.lha / ADoom_src / c2p8_040_amlaukka.s < prev    next >
Text File  |  1998-01-16  |  9KB  |  550 lines

  1.         mc68020
  2.         multipass
  3.         debug    on,lattice4
  4. *
  5. *   c2p8_040_amlaukka.s - chunky to planar for bytes
  6. *   by Aki Laukkanen <amlaukka@cc.helsinki.fi>
  7. *
  8. *   This file is public domain.
  9. *
  10.  
  11. ;    include "graphics/gfx.i"
  12. ;    include "exec/types.i"
  13. ;    include "exec/memory.i"
  14. ;    include "lvo/exec_lib.i"
  15.  
  16.     XDEF    _c2p8
  17.     XDEF    @c2p8
  18.     XDEF    _c2p8_reloc
  19.     XDEF    @c2p8_reloc
  20.     XDEF    _c2p8_deinit
  21.     XDEF    @c2p8_deinit
  22.  
  23.     cnop    0,16
  24.  
  25. *
  26. * void __asm *c2p8_reloc(register __a0 void *chunky,
  27. *                        register __a1 struct BitMap *bitmap,
  28. *                        register __a6 struct ExecBase *SysBase);
  29. *
  30.  
  31. _c2p8_reloc
  32. @c2p8_reloc
  33.     movem.l a2/a3,-(sp)
  34.     move.l  a0,a2
  35.     move.l  a1,a3
  36.     move.l  #_c2p8_end-_c2p8,d0
  37.     move.l  #MEMF_FAST,d1
  38.     jsr     (_LVOAllocVec,a6)
  39.     tst.l   d0
  40.     beq     .fail
  41.     move.l  d0,a0                   ; FIXME: align by cache line
  42.                     ; size and make changes to
  43.                     ; the c2p too.
  44.     lea     _c2p8,a1
  45.     move.w  #_c2p8_end-_c2p8-1,d1
  46. .loop
  47.     move.b  (a1)+,(a0)+
  48.     dbf     d1,.loop
  49.  
  50.     move.l  d0,a0
  51.     move.l  (bm_Planes+4,a3),d1
  52.     sub.l   (bm_Planes,a3),d1
  53.     move.l  d1,(c2p8_p1_1-_c2p8-4,a0)
  54.     move.l  d1,(c2p8_p1_2-_c2p8-4,a0)
  55.     move.l  (bm_Planes+8,a3),d1
  56.     sub.l   (bm_Planes,a3),d1
  57.     move.l  d1,(c2p8_p2_1-_c2p8-4,a0)
  58.     move.l  d1,(c2p8_p2_2-_c2p8-4,a0)
  59.     move.l  (bm_Planes+12,a3),d1
  60.     sub.l   (bm_Planes,a3),d1
  61.     move.l  d1,(c2p8_p3_1-_c2p8-4,a0)
  62.     move.l  d1,(c2p8_p3_2-_c2p8-4,a0)
  63.     move.l  (bm_Planes+16,a3),d1
  64.     sub.l   (bm_Planes,a3),d1
  65.     move.l  d1,(c2p8_p4_1-_c2p8-4,a0)
  66.     move.l  d1,(c2p8_p4_2-_c2p8-4,a0)
  67.     move.l  (bm_Planes+20,a3),d1
  68.     sub.l   (bm_Planes,a3),d1
  69.     move.l  d1,(c2p8_p5_1-_c2p8-4,a0)
  70.     move.l  d1,(c2p8_p5_2-_c2p8-4,a0)
  71.     move.l  (bm_Planes+24,a3),d1
  72.     sub.l   (bm_Planes,a3),d1
  73.     move.l  d1,(c2p8_p6_1-_c2p8-4,a0)
  74.     move.l  d1,(c2p8_p6_2-_c2p8-4,a0)
  75.     move.l  (bm_Planes+28,a3),d1
  76.     sub.l   (bm_Planes,a3),d1
  77.     move.l  d1,(c2p8_p7_1-_c2p8-4,a0)
  78.     move.l  d1,(c2p8_p7_2-_c2p8-4,a0)
  79.  
  80.     move.l  d0,a2
  81.     jsr     (_LVOCacheClearU,a6)
  82.     move.l  a2,d0
  83.  
  84. .fail
  85.     movem.l (sp)+,a2/a3
  86.     rts
  87.  
  88.     cnop    0,16
  89.  
  90. *
  91. *   void __asm c2p8_deinit(register __a0 void *c2p,
  92. *                          register __a6 struct ExecBase *SysBase);
  93. *
  94.  
  95. _c2p8_deinit
  96. @c2p8_deinit
  97.     move.l  a0,a1
  98.     jsr     (_LVOFreeVec,a6)
  99.     rts
  100.  
  101. *
  102. *   void __asm c2p8(register __a0 const void *chunky,
  103. *                   register __a1 void *chip,
  104. *                   register __a2 const void *chunky_end);
  105. *
  106.  
  107. _c2p8
  108. @c2p8
  109.     movem.l d2-d7/a2-a6,-(sp)
  110.     move.l  a0,a6
  111.     move.l  a2,a3
  112.     move.l  a1,a2
  113. c2p8_start
  114. ; a6 - chunky
  115. ; a2 - bitplanes
  116. ; a3 - chunky end
  117.  
  118.     move.l  (a6)+,d0
  119.     move.l  (a6)+,d1
  120.     move.l  (a6)+,d2
  121.     move.l  (a6)+,d3
  122.     move.l  (a6)+,d4
  123.     move.l  (a6)+,d5
  124.     move.l  (a6)+,d6
  125.     move.l  (a6)+,a0
  126.  
  127. ; 16x4: (d0,d4),(d2,d6),(d1,d5)
  128. ; 2x4: (d0,d4),(d2,d6),(d1,d5)
  129. ; 16x4: (d3,d7)
  130. ; 2x4: (d3,d7)
  131. ; 8x2: (d0,d2),(d1,d3)
  132. ; 1x2: (d0,d2),(d1,d3)
  133. ; 4x1: (d0,d1)
  134. ; write d0
  135. ; 4x1: (d2,d3)
  136. ; 8x2: (d4,d6),(d5,d7)
  137. ; 1x2: (d4,d6),(d5,d7)
  138. ; 4x1: (d4,d5),(d6,d7)
  139.  
  140. ; 16x4: (d0,d4),(d1,d5),(d2,d6)
  141.     swap    d4
  142.     swap    d5
  143.     swap    d6
  144.     eor.w   d4,d0
  145.     eor.w   d5,d1
  146.     eor.w   d6,d2
  147.     eor.w   d0,d4
  148.     eor.w   d1,d5
  149.     eor.w   d2,d6
  150.     eor.w   d4,d0
  151.     eor.w   d5,d1
  152.     eor.w   d6,d2
  153.     swap    d4
  154.     swap    d5
  155.     swap    d6
  156.  
  157. ; 2x4: (d0,d4),(d1,d5),(d2,d6)
  158.     move.l  d4,d7
  159.     lsr.l   #2,d7
  160.     eor.l   d0,d7
  161.     and.l   #$33333333,d7
  162.     eor.l   d7,d0
  163.     lsl.l   #2,d7
  164.     eor.l   d7,d4
  165.  
  166.     move.l  d5,d7
  167.     lsr.l   #2,d7
  168.     eor.l   d1,d7
  169.     and.l   #$33333333,d7
  170.     eor.l   d7,d1
  171.     lsl.l   #2,d7
  172.     eor.l   d7,d5
  173.  
  174.     move.l  d6,d7
  175.     lsr.l   #2,d7
  176.     eor.l   d2,d7
  177.     and.l   #$33333333,d7
  178.     eor.l   d7,d2
  179.     lsl.l   #2,d7
  180.     eor.l   d7,d6
  181.  
  182.     exg     a0,d6           ; d7 -> d6
  183.                             ; d6 -> a2
  184.  
  185. ; 16x4: (d3,d7)
  186.  
  187.     swap    d6
  188.     eor.w   d6,d3
  189.     eor.w   d3,d6
  190.     eor.w   d6,d3
  191.     swap    d6
  192.  
  193. ; 2x4 (d3,d7)
  194.  
  195.     move.l  d6,d7
  196.     lsr.l   #2,d7
  197.     eor.l   d3,d7
  198.     and.l   #$33333333,d7
  199.     eor.l   d7,d3
  200.     lsl.l   #2,d7
  201.     eor.l   d7,d6
  202.  
  203. ; 8x2: (d0,d2),(d1,d3)
  204.  
  205.     move.l  d2,d7
  206.     lsr.l   #8,d7
  207.     eor.l   d0,d7
  208.     and.l   #$00ff00ff,d7
  209.     eor.l   d7,d0
  210.     lsl.l   #8,d7
  211.     eor.l   d7,d2
  212.  
  213.     move.l  d3,d7
  214.     lsr.l   #8,d7
  215.     eor.l   d1,d7
  216.     and.l   #$00ff00ff,d7
  217.     eor.l   d7,d1
  218.     lsl.l   #8,d7
  219.     eor.l   d7,d3
  220.  
  221. ; 1x2: (d0,d2),(d1,d3)
  222.  
  223.     move.l  d2,d7
  224.     lsr.l   #1,d7
  225.     eor.l   d0,d7
  226.     and.l   #$55555555,d7
  227.     eor.l   d7,d0
  228.     add.l   d7,d7
  229.     eor.l   d7,d2
  230.  
  231.     move.l  d3,d7
  232.     lsr.l   #1,d7
  233.     eor.l   d1,d7
  234.     and.l   #$55555555,d7
  235.     eor.l   d7,d1
  236.     add.l   d7,d7
  237.     eor.l   d7,d3
  238.  
  239. ; 4x1: (d0,d1)
  240.  
  241.     move.l  d1,d7
  242.     lsr.l   #4,d7
  243.     eor.l   d0,d7
  244.     and.l   #$0f0f0f0f,d7
  245.     eor.l   d7,d0
  246.     move.l  d0,($12341234,a2)
  247. c2p8_p7_1
  248.     lsl.l   #4,d7
  249.     eor.l   d7,d1
  250.  
  251. ; 4x1: (d2,d3)
  252.  
  253.     move.l  d3,d7
  254.     lsr.l   #4,d7
  255.     eor.l   d2,d7
  256.     and.l   #$0f0f0f0f,d7
  257.     eor.l   d7,d2
  258.     lsl.l   #4,d7
  259.     eor.l   d7,d3
  260.  
  261.     move.l  a0,d0               ; d6 -> d0
  262.  
  263. ; 8x2: (d4,d6),(d5,d7)
  264.  
  265.     move.l  d0,d7
  266.     lsr.l   #8,d7
  267.     eor.l   d4,d7
  268.     and.l   #$00ff00ff,d7
  269.     move.l  d1,($12341234,a2)
  270. c2p8_p3_1
  271.     eor.l   d7,d4
  272.     lsl.l   #8,d7
  273.     eor.l   d7,d0
  274.  
  275.     move.l  d6,d7
  276.     lsr.l   #8,d7
  277.     eor.l   d5,d7
  278.     and.l   #$00ff00ff,d7
  279.     eor.l   d7,d5
  280.     lsl.l   #8,d7
  281.     eor.l   d7,d6
  282.  
  283. ; 1x2: (d4,d6),(d5,d7)
  284.  
  285.     move.l  d0,d7
  286.     lsr.l   #1,d7
  287.     eor.l   d4,d7
  288.     and.l   #$55555555,d7
  289.     move.l  d2,($12341234,a2)
  290. c2p8_p6_1
  291.     eor.l   d7,d4
  292.     add.l   d7,d7
  293.     eor.l   d7,d0
  294.  
  295.     move.l  d6,d7
  296.     lsr.l   #1,d7
  297.     eor.l   d5,d7
  298.     and.l   #$55555555,d7
  299.     eor.l   d7,d5
  300.  
  301.     add.l   d7,d7
  302.     eor.l   d7,d6
  303.  
  304. ; 4x1: (d4,d5),(d6,d7)
  305.  
  306.     move.l  d5,d7
  307.     lsr.l   #4,d7
  308.     eor.l   d4,d7
  309.     and.l   #$0f0f0f0f,d7
  310.     move.l  d3,($12341234,a2)
  311. c2p8_p2_1
  312.     eor.l   d7,d4
  313.     lsl.l   #4,d7
  314.     eor.l   d7,d5
  315.  
  316.     move.l  d6,d7
  317.     lsr.l   #4,d7
  318.     eor.l   d0,d7
  319.     and.l   #$0f0f0f0f,d7
  320.     eor.l   d7,d0
  321.     lsl.l   #4,d7
  322.     eor.l   d7,d6
  323.  
  324.     move.l  d4,d7
  325.     move.l  d5,a4
  326.     move.l  d0,a5
  327.     move.l  d6,a1
  328.  
  329.     cmp.l   a3,a6
  330.     beq     c2p8_end
  331. c2p8_x1
  332.     move.l  (a6)+,d0
  333.     move.l  (a6)+,d1
  334.     move.l  (a6)+,d2
  335.     move.l  (a6)+,d3
  336.     move.l  (a6)+,d4
  337.     move.l  (a6)+,d5
  338.     move.l  (a6)+,d6
  339.     move.l  (a6)+,a0
  340.  
  341.     move.l  d7,($12341234,a2)
  342. c2p8_p5_1
  343.  
  344. ; 16x4: (d0,d4),(d1,d5),(d2,d6)
  345.     swap    d4
  346.     swap    d5
  347.     swap    d6
  348.     eor.w   d4,d0
  349.     eor.w   d5,d1
  350.     eor.w   d6,d2
  351.     eor.w   d0,d4
  352.     eor.w   d1,d5
  353.     eor.w   d2,d6
  354.     eor.w   d4,d0
  355.     eor.w   d5,d1
  356.     eor.w   d6,d2
  357.     swap    d4
  358.     swap    d5
  359.     swap    d6
  360. ; 2x4: (d0,d4),(d1,d5),(d2,d6)
  361.     move.l  d4,d7
  362.     lsr.l   #2,d7
  363.     eor.l   d0,d7
  364.     move.l  a4,($12341234,a2)
  365. c2p8_p1_1
  366.     and.l   #$33333333,d7
  367.     eor.l   d7,d0
  368.     lsl.l   #2,d7
  369.     eor.l   d7,d4
  370.  
  371.     move.l  d5,d7
  372.     lsr.l   #2,d7
  373.     eor.l   d1,d7
  374.     and.l   #$33333333,d7
  375.     eor.l   d7,d1
  376.     lsl.l   #2,d7
  377.     eor.l   d7,d5
  378.  
  379.     move.l  d6,d7
  380.     lsr.l   #2,d7
  381.     eor.l   d2,d7
  382.     and.l   #$33333333,d7
  383.     eor.l   d7,d2
  384.     lsl.l   #2,d7
  385.     eor.l   d7,d6
  386.     exg     a0,d6           ; d7 -> d6
  387.                             ; d6 -> a2
  388. ; 16x4: (d3,d7)
  389.  
  390.     swap    d6
  391.     move.l  a5,($12341234,a2)
  392. c2p8_p4_1
  393.     eor.w   d6,d3
  394.     eor.w   d3,d6
  395.     eor.w   d6,d3
  396.     swap    d6
  397.  
  398. ; 2x4 (d3,d7)
  399.  
  400.     move.l  d6,d7
  401.     lsr.l   #2,d7
  402.     eor.l   d3,d7
  403.     and.l   #$33333333,d7
  404.     eor.l   d7,d3
  405.     lsl.l   #2,d7
  406.     eor.l   d7,d6
  407.  
  408. ; 8x2: (d0,d2),(d1,d3)
  409.  
  410.     move.l  d2,d7
  411.     lsr.l   #8,d7
  412.     eor.l   d0,d7
  413.     and.l   #$00ff00ff,d7
  414.     eor.l   d7,d0
  415.     lsl.l   #8,d7
  416.     eor.l   d7,d2
  417.  
  418.     move.l  d3,d7
  419.     lsr.l   #8,d7
  420.     eor.l   d1,d7
  421.     and.l   #$00ff00ff,d7
  422.     move.l  a1,(a2)+
  423.     eor.l   d7,d1
  424.     lsl.l   #8,d7
  425.     eor.l   d7,d3
  426.  
  427. ; 1x2: (d0,d2),(d1,d3)
  428.  
  429.     move.l  d2,d7
  430.     lsr.l   #1,d7
  431.     eor.l   d0,d7
  432.     and.l   #$55555555,d7
  433.     eor.l   d7,d0
  434.     add.l   d7,d7
  435.     eor.l   d7,d2
  436.  
  437.     move.l  d3,d7
  438.     lsr.l   #1,d7
  439.     eor.l   d1,d7
  440.     and.l   #$55555555,d7
  441.     eor.l   d7,d1
  442.     add.l   d7,d7
  443.     eor.l   d7,d3
  444.  
  445. ; 4x1: (d0,d1)
  446.  
  447.     move.l  d1,d7
  448.     lsr.l   #4,d7
  449.     eor.l   d0,d7
  450.     and.l   #$0f0f0f0f,d7
  451.     eor.l   d7,d0
  452.     move.l  d0,($12341234,a2)
  453. c2p8_p7_2
  454.     lsl.l   #4,d7
  455.     eor.l   d7,d1
  456.  
  457. ; 4x1: (d2,d3)
  458.  
  459.     move.l  d3,d7
  460.     lsr.l   #4,d7
  461.     eor.l   d2,d7
  462.     and.l   #$0f0f0f0f,d7
  463.     eor.l   d7,d2
  464.     lsl.l   #4,d7
  465.     eor.l   d7,d3
  466.  
  467.     move.l  a0,d0               ; d6 -> d0
  468.  
  469. ; 8x2: (d4,d6),(d5,d7)
  470.  
  471.     move.l  d0,d7
  472.     lsr.l   #8,d7
  473.     eor.l   d4,d7
  474.     and.l   #$00ff00ff,d7
  475.     move.l  d1,($12341234,a2)
  476. c2p8_p3_2
  477.     eor.l   d7,d4
  478.     lsl.l   #8,d7
  479.     eor.l   d7,d0
  480.  
  481.     move.l  d6,d7
  482.     lsr.l   #8,d7
  483.     eor.l   d5,d7
  484.     and.l   #$00ff00ff,d7
  485.     eor.l   d7,d5
  486.     lsl.l   #8,d7
  487.     eor.l   d7,d6
  488.  
  489. ; 1x2: (d4,d6),(d5,d7)
  490.  
  491.     move.l  d0,d7
  492.     lsr.l   #1,d7
  493.     eor.l   d4,d7
  494.     and.l   #$55555555,d7
  495.     move.l  d2,($12341234,a2)
  496. c2p8_p6_2
  497.     eor.l   d7,d4
  498.     add.l   d7,d7
  499.     eor.l   d7,d0
  500.  
  501.     move.l  d6,d7
  502.     lsr.l   #1,d7
  503.     eor.l   d5,d7
  504.     and.l   #$55555555,d7
  505.     eor.l   d7,d5
  506.     add.l   d7,d7
  507.     eor.l   d7,d6
  508.  
  509. ; 4x1: (d4,d5),(d6,d7)
  510.  
  511.     move.l  d5,d7
  512.     lsr.l   #4,d7
  513.     eor.l   d4,d7
  514.     and.l   #$0f0f0f0f,d7
  515.     move.l  d3,($12341234,a2)
  516. c2p8_p2_2
  517.     eor.l   d7,d4
  518.     lsl.l   #4,d7
  519.     eor.l   d7,d5
  520.  
  521.     move.l  d6,d7
  522.     lsr.l   #4,d7
  523.     eor.l   d0,d7
  524.     and.l   #$0f0f0f0f,d7
  525.     eor.l   d7,d0
  526.     lsl.l   #4,d7
  527.     eor.l   d7,d6
  528.  
  529.     move.l  d4,d7
  530.     move.l  d5,a4
  531.     move.l  d0,a5
  532.     move.l  d6,a1
  533.  
  534.     cmp.l   a3,a6
  535.     bne     c2p8_x1
  536. c2p8_end
  537.     move.l  d7,($12341234,a2)
  538. c2p8_p5_2
  539.     move.l  a4,($12341234,a2)
  540. c2p8_p1_2
  541.     move.l  a5,($12341234,a2)
  542. c2p8_p4_2
  543.     move.l  a1,(a2)
  544.  
  545.     movem.l (sp)+,d2-d7/a2-a6
  546.     rts
  547. _c2p8_end
  548.  
  549.     end
  550.