home *** CD-ROM | disk | FTP | other *** search
/ Enigma Amiga Life 113 / EnigmaAmiga113CD.iso / software / sviluppo / quake_src / vid_c2p_040.s < prev    next >
Text File  |  2000-06-17  |  12KB  |  578 lines

  1. * Copyright (C) 1996-1997 Id Software, Inc. 
  2. * This program is free software; you can redistribute it and/or 
  3. * modify it under the terms of the GNU General Public License 
  4. * as published by the Free Software Foundation; either version 2 
  5. * of the License, or (at your option) any later version. 
  6. * This program is distributed in the hope that it will be useful, 
  7. * but WITHOUT ANY WARRANTY; without even the implied warranty of 
  8. * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.   
  9. * See the GNU General Public License for more details. 
  10. * You should have received a copy of the GNU General Public License 
  11. * along with this program; if not, write to the Free Software 
  12. * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA. 
  13.  
  14.     mc68020
  15.  
  16.     IFD    depth8
  17. depth    set    8
  18.     ENDC
  19.     IFD    depth6
  20. depth    set    6
  21.     ENDC
  22.  
  23. ; Chunky2Planar algorithm, originally by James McCoull
  24. ; Modified by Peter McGavin for variable size and depth
  25. ; and "compare buffer" (hope I didn't slow it down too much)
  26. ;
  27. ; 09-Jan-98 svent
  28. ;           Longword alignment for stack
  29. ;
  30. ;     Cpu only solution VERSION 2
  31. ;    Optimised for 040+fastram
  32. ;    bitplanes are assumed contiguous!
  33. ;    analyse instruction offsets to check performance
  34.  
  35. ;void __asm c2p_6_040 (register __a0 UBYTE *chunky_data,
  36. ;                      register __a1 PLANEPTR raster,
  37. ;                      register __a2 UBYTE *compare_buffer,
  38. ;                      register __a4 UBYTE *xlate,
  39. ;                      register __d1 ULONG plsiz,
  40. ;                      register __d2 BOOL force_update);
  41.  
  42. ;void __asm c2p_8_040 (register __a0 UBYTE *chunky_data,
  43. ;                      register __a1 PLANEPTR raster,
  44. ;                      register __a2 UBYTE *compare_buffer,
  45. ;                      register __d1 ULONG plsiz);
  46.  
  47. ; a0 -> width*height chunky pixels
  48. ; a1 -> contiguous bitplanes
  49. ; a2 -> compare buffer
  50. ; d1 = width*height/8   (width*height must be a multiple of 32)
  51.  
  52.  
  53.     ifeq    depth-8
  54.         xdef    _c2p_8_040
  55. _c2p_8_040:
  56.     else
  57.     ifeq    depth-6
  58.         xdef    _c2p_6_040
  59. _c2p_6_040:
  60.     else
  61.         fail    "unsupported depth!"
  62.     endc
  63.     endc
  64.  
  65. merge        macro ; in1,in2,tmp3,tmp4,mask,shift
  66. ; \1 = abqr
  67. ; \2 = ijyz
  68.         move.l    \2,\4
  69.         move.l    #\5,\3
  70.         and.l    \3,\2    ; \2 = 0j0z
  71.         and.l    \1,\3    ; \3 = 0b0r
  72.         eor.l    \3,\1    ; \1 = a0q0
  73.         eor.l    \2,\4    ; \4 = i0y0
  74.         ifeq    \6-1
  75.         add.l    \3,\3
  76.         else
  77.         lsl.l    #\6,\3    ; \3 = b0r0
  78.         endc
  79.         lsr.l    #\6,\4    ; \4 = 0i0y
  80.         or.l    \3,\2    ; \2 = bjrz
  81.         or.l    \4,\1    ; \1 = aiqy
  82.         endm
  83.  
  84. xlate        macro    ; translate 4 8-bit pixels to 6-bit EHB
  85.         move.b    (\1,a0),d7
  86.         move.b    (a4,d7.w),\2
  87.         lsl.w    #8,\2
  88.         move.b    (\1+8,a0),d7
  89.         move.b    (a4,d7.w),\2
  90.         swap    \2
  91.         move.b    (\1+16,a0),d7
  92.         move.b    (a4,d7.w),\2
  93.         lsl.w    #8,\2
  94.         move.b    (\1+24,a0),d7
  95.         move.b    (a4,d7.w),\2
  96.         endm
  97.  
  98. start:        movem.l    d2-d7/a2-a6,-(sp)
  99.  
  100.         sub.w    #48,sp        ; space for temporary variables
  101.  
  102.     ifle depth-6
  103.         move.w    d2,(44,sp)    ; video_force_update
  104.     endc
  105.  
  106. ; a0 = chunky buffer
  107. ; a1 = output area
  108. ; a2 = compare buffer
  109. ; d1 = plsiz
  110.  
  111.         movea.l    d1,a3        ; a3 = plsiz
  112.  
  113.         move.l    a0,(40,sp)
  114.         lsl.l    #3,d1
  115.         add.l    d1,(40,sp)    ; (40,sp) -> end of chunky data
  116.  
  117. first_loop:
  118.     ifle depth-6
  119.         tst.w    (44,sp)        ; force_update?
  120.         bne.b    first_case
  121.     endc
  122.         cmpm.l    (a0)+,(a2)+
  123.         bne.b    stub1
  124.         cmpm.l    (a0)+,(a2)+
  125.         bne.b    stub2
  126.         cmpm.l    (a0)+,(a2)+
  127.         bne.b    stub3
  128.         cmpm.l    (a0)+,(a2)+
  129.         bne.b    stub4
  130.         cmpm.l    (a0)+,(a2)+
  131.         bne.b    stub5
  132.         cmpm.l    (a0)+,(a2)+
  133.         bne.b    stub6
  134.         cmpm.l    (a0)+,(a2)+
  135.         bne.b    stub7
  136.         cmpm.l    (a0)+,(a2)+
  137.         bne.b    stub8
  138.  
  139.         addq.l    #4,a1        ; skip 32 pixels on output
  140.  
  141.         cmpa.l    (40,sp),a0
  142.         bcs.b    first_loop
  143.         bra.w    exit        ; exit if no changes found
  144.  
  145. stub8:        subq.l    #4,a0
  146.         subq.l    #4,a2
  147. stub7:        subq.l    #4,a0
  148.         subq.l    #4,a2
  149. stub6:        subq.l    #4,a0
  150.         subq.l    #4,a2
  151. stub5:        subq.l    #4,a0
  152.         subq.l    #4,a2
  153. stub4:        subq.l    #4,a0
  154.         subq.l    #4,a2
  155. stub3:        subq.l    #4,a0
  156.         subq.l    #4,a2
  157. stub2:        subq.l    #4,a0
  158.         subq.l    #4,a2
  159. stub1:        subq.l    #4,a0
  160.         subq.l    #4,a2
  161.  
  162. first_case:
  163.     ifgt depth-6        ; depth 8 code --- no need to xlate pixels
  164.         move.l    (0,a0),d1
  165.          move.l    (4,a0),d3
  166.         move.l    (8,a0),d0
  167.         move.l    (12,a0),d2
  168.         move.l    (2,a0),d4
  169.          move.l    (10,a0),d5
  170.         move.l    (6,a0),d6
  171.         move.l    (14,a0),d7
  172.  
  173.         move.l    d1,(0,a2)
  174.         move.l    d3,(4,a2)
  175.         move.l    d0,(8,a2)
  176.         move.l    d2,(12,a2)
  177.  
  178.          move.w    (16,a0),d1
  179.          move.w    (24,a0),d0
  180.         move.w    (20,a0),d3
  181.         move.w    (28,a0),d2
  182.          move.w    (18,a0),d4
  183.          move.w    (26,a0),d5
  184.         move.w    (22,a0),d6
  185.         move.w    (30,a0),d7
  186.  
  187.          move.w    d1,(16,a2)
  188.          move.w    d0,(24,a2)
  189.         move.w    d3,(20,a2)
  190.         move.w    d2,(28,a2)
  191.          move.w    d4,(18,a2)
  192.          move.w    d5,(26,a2)
  193.         move.w    d6,(22,a2)
  194.         move.w    d7,(30,a2)
  195.  
  196.         move.l    d6,a5
  197.         move.l    d7,a6
  198.  
  199.         merge    d1,d0,d6,d7,$00ff00ff,8
  200.         merge    d3,d2,d6,d7,$00ff00ff,8
  201.  
  202.         merge    d1,d3,d6,d7,$0f0f0f0f,4    
  203.         merge    d0,d2,d6,d7,$0f0f0f0f,4
  204.  
  205.         exg    d1,a5
  206.         exg    d0,a6
  207.  
  208.         merge    d4,d5,d6,d7,$00ff00ff,8
  209.         merge    d1,d0,d6,d7,$00ff00ff,8
  210.  
  211.         merge    d4,d1,d6,d7,$0f0f0f0f,4
  212.         merge    d5,d0,d6,d7,$0f0f0f0f,4
  213.  
  214.         merge    d3,d1,d6,d7,$33333333,2
  215.         merge    d2,d0,d6,d7,$33333333,2    
  216.  
  217.         merge    d3,d2,d6,d7,$55555555,1
  218.         merge    d1,d0,d6,d7,$55555555,1
  219.  
  220.         move.l    d0,(0*4,sp)        ;plane0 (movem.l is slower!)
  221.         move.l    d1,(1*4,sp)        ;plane1
  222.         move.l    d2,(2*4,sp)        ;plane2
  223.         move.l    d3,(3*4,sp)        ;plane3
  224.  
  225.         move.l    a5,d3
  226.         move.l    a6,d2
  227.  
  228.         merge    d3,d4,d6,d7,$33333333,2
  229.         merge    d2,d5,d6,d7,$33333333,2
  230.  
  231.         merge    d3,d2,d6,d7,$55555555,1
  232.         merge    d4,d5,d6,d7,$55555555,1
  233.  
  234.         move.l    d5,(4*4,sp)        ;plane4
  235.         move.l    d4,(5*4,sp)        ;plane5
  236.  
  237.         move.l    d2,(6*4,sp)        ;plane6
  238.         move.l    d3,(7*4,sp)        ;plane7
  239.  
  240.     else            ; depth 6 code, xlate from 8-bit to 6-bit EHB
  241.         moveq    #0,d7
  242.  
  243.         move.l    (a0),(a2)    ; copy to compare buffer
  244.         move.l    (4,a0),(4,a2)
  245.         move.l    (8,a0),(8,a2)
  246.         move.l    (12,a0),(12,a2)
  247.         move.l    (16,a0),(16,a2)
  248.         move.l    (20,a0),(20,a2)
  249.         move.l    (24,a0),(24,a2)
  250.         move.l    (28,a0),(28,a2)
  251.  
  252.         xlate    0,d1        ; does 8-bit to EHB colour translate
  253.         xlate    1,d0        ; 4 pixels at a time
  254.         xlate    4,d3
  255.         xlate    5,d2
  256.  
  257.         merge    d1,d3,d6,d7,$0f0f0f0f,4    
  258.         merge    d0,d2,d6,d7,$0f0f0f0f,4
  259.  
  260.         movea.l    d1,a5
  261.         movea.l    d0,a6
  262.  
  263.         moveq    #0,d7
  264.  
  265.         xlate    2,d4
  266.         xlate    3,d5
  267.         xlate    6,d1
  268.         xlate    7,d0
  269.  
  270.         merge    d4,d1,d6,d7,$0f0f0f0f,4
  271.         merge    d5,d0,d6,d7,$0f0f0f0f,4
  272.  
  273.         merge    d3,d1,d6,d7,$33333333,2
  274.         merge    d2,d0,d6,d7,$33333333,2    
  275.  
  276.         merge    d3,d2,d6,d7,$55555555,1
  277.         merge    d1,d0,d6,d7,$55555555,1
  278.  
  279.         move.l    d0,(0*4,sp)        ;plane0 (movem.l is slower!)
  280.         move.l    d1,(1*4,sp)        ;plane1
  281.         move.l    d2,(2*4,sp)        ;plane2
  282.         move.l    d3,(3*4,sp)        ;plane3
  283.  
  284.         move.l    a5,d3
  285.         move.l    a6,d2
  286.  
  287.         merge    d3,d4,d6,d7,$33333333,2
  288.         merge    d2,d5,d6,d7,$33333333,2
  289.  
  290.         merge    d4,d5,d6,d7,$55555555,1
  291.  
  292.         move.l    d5,(4*4,sp)        ;plane4
  293.         move.l    d4,(5*4,sp)        ;plane5
  294.  
  295.     endc
  296.  
  297.         adda.w    #32,a0
  298.         adda.w    #32,a2
  299.  
  300.         move.l    a1,(32,sp)        ; save output address
  301.         addq.l    #4,a1            ; skip 32 pixels on output
  302.  
  303.         cmpa.l    (40,sp),a0
  304.         bcc.w    final_case
  305.  
  306.  
  307. main_loop:
  308.     ifle depth-6
  309.         tst.w    (44,sp)        ; force_update?
  310.         bne.b    main_case
  311.     endc
  312.         cmpm.l    (a0)+,(a2)+    ; compare next 32 pixels
  313.         bne.b    mstub1
  314.         cmpm.l    (a0)+,(a2)+
  315.         bne.b    mstub2
  316.         cmpm.l    (a0)+,(a2)+
  317.         bne.b    mstub3
  318.         cmpm.l    (a0)+,(a2)+
  319.         bne.b    mstub4
  320.         cmpm.l    (a0)+,(a2)+
  321.         bne.b    mstub5
  322.         cmpm.l    (a0)+,(a2)+
  323.         bne.b    mstub6
  324.         cmpm.l    (a0)+,(a2)+
  325.         bne.b    mstub7
  326.         cmpm.l    (a0)+,(a2)+
  327.         bne.b    mstub8
  328.  
  329.         addq.l    #4,a1        ; skip 32 pixels on output
  330.  
  331.         cmpa.l    (40,sp),a0
  332.         bcs.b    main_loop
  333.         bra.w    final_case    ; exit if no more changes found
  334.  
  335. mstub8:        subq.l    #4,a0
  336.         subq.l    #4,a2
  337. mstub7:        subq.l    #4,a0
  338.         subq.l    #4,a2
  339. mstub6:        subq.l    #4,a0
  340.         subq.l    #4,a2
  341. mstub5:        subq.l    #4,a0
  342.         subq.l    #4,a2
  343. mstub4:        subq.l    #4,a0
  344.         subq.l    #4,a2
  345. mstub3:        subq.l    #4,a0
  346.         subq.l    #4,a2
  347. mstub2:        subq.l    #4,a0
  348.         subq.l    #4,a2
  349. mstub1:        subq.l    #4,a0
  350.         subq.l    #4,a2
  351.  
  352. main_case:    move.l    a1,(36,sp)    ; save current output address
  353.         move.l    (32,sp),a1    ; a1 = previous output address
  354.  
  355.     ifgt depth-6
  356.         move.l    (0,a0),d1
  357.          move.l    (4,a0),d3
  358.          move.l    (8,a0),d0
  359.         move.l    (12,a0),d2
  360.         move.l    (2,a0),d4
  361.          move.l    (10,a0),d5
  362.         move.l    (6,a0),d6
  363.         move.l    (14,a0),d7
  364.  
  365.         move.l    d1,(0,a2)
  366.         move.l    d3,(4,a2)
  367.         move.l    d0,(8,a2)
  368.         move.l    d2,(12,a2)
  369.  
  370.          move.w    (16,a0),d1
  371.          move.w    (24,a0),d0
  372.         move.w    (20,a0),d3
  373.         move.w    (28,a0),d2
  374.          move.w    (18,a0),d4
  375.          move.w    (26,a0),d5
  376.         move.w    (22,a0),d6
  377.         move.w    (30,a0),d7
  378.  
  379.          move.w    d1,(16,a2)
  380.          move.w    d0,(24,a2)
  381.         move.w    d3,(20,a2)
  382.         move.w    d2,(28,a2)
  383.          move.w    d4,(18,a2)
  384.          move.w    d5,(26,a2)
  385.         move.w    d6,(22,a2)
  386.         move.w    d7,(30,a2)
  387.  
  388.         move.l    d6,a5
  389.         move.l    d7,a6
  390.  
  391.         move.l    (0*4,sp),(a1)        ;plane0
  392.         adda.l    a3,a1            ;a1+=plsiz
  393.  
  394.         merge    d1,d0,d6,d7,$00ff00ff,8
  395.         merge    d3,d2,d6,d7,$00ff00ff,8
  396.  
  397.         move.l    (1*4,sp),(a1)        ;plane1
  398.         adda.l    a3,a1            ;a1+=plsiz
  399.  
  400.         merge    d1,d3,d6,d7,$0f0f0f0f,4    
  401.         merge    d0,d2,d6,d7,$0f0f0f0f,4
  402.  
  403.         exg    d1,a5
  404.         exg    d0,a6
  405.  
  406.         move.l    (2*4,sp),(a1)        ;plane2
  407.         adda.l    a3,a1            ;a1+=plsiz
  408.  
  409.         merge    d4,d5,d6,d7,$00ff00ff,8
  410.         merge    d1,d0,d6,d7,$00ff00ff,8
  411.  
  412.         move.l    (3*4,sp),(a1)        ;plane3
  413.         adda.l    a3,a1            ;a1+=plsiz
  414.  
  415.         merge    d4,d1,d6,d7,$0f0f0f0f,4
  416.         merge    d5,d0,d6,d7,$0f0f0f0f,4
  417.  
  418.         move.l    (4*4,sp),(a1)        ;plane4
  419.         adda.l    a3,a1            ;a1+=plsiz
  420.  
  421.         merge    d3,d1,d6,d7,$33333333,2
  422.         merge    d2,d0,d6,d7,$33333333,2    
  423.  
  424.         move.l    (5*4,sp),(a1)        ;plane5
  425.         adda.l    a3,a1            ;a1+=plsiz
  426.  
  427.         merge    d3,d2,d6,d7,$55555555,1
  428.         merge    d1,d0,d6,d7,$55555555,1
  429.  
  430.         move.l    d0,(0*4,sp)        ;plane0 (movem.l is slower!)
  431.         move.l    d1,(1*4,sp)        ;plane1
  432.         move.l    d2,(2*4,sp)        ;plane2
  433.         move.l    d3,(3*4,sp)        ;plane3
  434.  
  435.         move.l    a5,d3
  436.         move.l    a6,d2
  437.  
  438.         move.l    (6*4,sp),(a1)        ;plane6
  439.         adda.l    a3,a1            ;a1+=plsiz
  440.  
  441.         merge    d3,d4,d6,d7,$33333333,2
  442.         merge    d2,d5,d6,d7,$33333333,2
  443.  
  444.         move.l    (7*4,sp),(a1)        ;plane7
  445.         adda.l    a3,a1            ;a1+=plsiz
  446.  
  447.         merge    d3,d2,d6,d7,$55555555,1
  448.         merge    d4,d5,d6,d7,$55555555,1
  449.  
  450.         move.l    d5,(4*4,sp)        ;plane4
  451.         move.l    d4,(5*4,sp)        ;plane5
  452.  
  453.         move.l    d2,(6*4,sp)        ;plane6
  454.         move.l    d3,(7*4,sp)        ;plane7
  455.  
  456.     else            ; depth 6 code, xlate from 8-bit to 6-bit EHB
  457.         moveq    #0,d7
  458.  
  459.         move.l    (a0),(a2)
  460.         move.l    (4,a0),(4,a2)
  461.         move.l    (8,a0),(8,a2)
  462.         move.l    (12,a0),(12,a2)
  463.         move.l    (16,a0),(16,a2)
  464.         move.l    (20,a0),(20,a2)
  465.         move.l    (24,a0),(24,a2)
  466.         move.l    (28,a0),(28,a2)
  467.  
  468.         xlate    0,d1        ; does 8-bit to EHB colour translate
  469.         xlate    1,d0        ; 4 pixels at a time
  470.         xlate    4,d3
  471.         xlate    5,d2
  472.  
  473.         move.l    (0*4,sp),(a1)        ;plane0
  474.         adda.l    a3,a1            ;a1+=plsiz
  475.  
  476.         merge    d1,d3,d6,d7,$0f0f0f0f,4    
  477.         merge    d0,d2,d6,d7,$0f0f0f0f,4
  478.  
  479.         movea.l    d1,a5
  480.         movea.l    d0,a6
  481.  
  482.         moveq    #0,d7
  483.  
  484.         xlate    2,d4
  485.         xlate    3,d5
  486.         xlate    6,d1
  487.         xlate    7,d0
  488.  
  489.         move.l    (1*4,sp),(a1)        ;plane1
  490.         adda.l    a3,a1            ;a1+=plsiz
  491.  
  492.         merge    d4,d1,d6,d7,$0f0f0f0f,4
  493.         merge    d5,d0,d6,d7,$0f0f0f0f,4
  494.  
  495.         move.l    (2*4,sp),(a1)        ;plane2
  496.         adda.l    a3,a1            ;a1+=plsiz
  497.  
  498.         merge    d3,d1,d6,d7,$33333333,2
  499.         merge    d2,d0,d6,d7,$33333333,2    
  500.  
  501.         move.l    (3*4,sp),(a1)        ;plane3
  502.         adda.l    a3,a1            ;a1+=plsiz
  503.  
  504.         merge    d3,d2,d6,d7,$55555555,1
  505.         merge    d1,d0,d6,d7,$55555555,1
  506.  
  507.         move.l    d0,(0*4,sp)        ;plane0 (movem.l is slower!)
  508.         move.l    d1,(1*4,sp)        ;plane1
  509.         move.l    d2,(2*4,sp)        ;plane2
  510.         move.l    d3,(3*4,sp)        ;plane3
  511.  
  512.         move.l    (4*4,sp),(a1)        ;plane4
  513.         adda.l    a3,a1            ;a1+=plsiz
  514.  
  515.         move.l    a5,d3
  516.         move.l    a6,d2
  517.  
  518.         merge    d3,d4,d6,d7,$33333333,2
  519.  
  520.         move.l    (5*4,sp),(a1)        ;plane5
  521.         adda.l    a3,a1            ;a1+=plsiz
  522.  
  523.         merge    d2,d5,d6,d7,$33333333,2
  524.  
  525.         merge    d4,d5,d6,d7,$55555555,1
  526.  
  527.         move.l    d5,(4*4,sp)        ;plane4
  528.         move.l    d4,(5*4,sp)        ;plane5
  529.  
  530.     endc
  531.  
  532.         adda.w    #32,a0
  533.         adda.w    #32,a2
  534.  
  535.         movea.l    (36,sp),a1    ; restore current output address
  536.         move.l    a1,(32,sp)    ; save output address
  537.  
  538.         addq.l    #4,a1        ; skip 32 pixels on output
  539.  
  540.         cmpa.l    (40,sp),a0
  541.         bcs.w    main_loop
  542.  
  543.  
  544. final_case:    move.l    (32,sp),a1    ; a1 = previous output address
  545.  
  546.         move.l    (0*4,sp),(a1)        ;plane0
  547.         adda.l    a3,a1            ;a1+=plsiz
  548.         move.l    (1*4,sp),(a1)         ;plane1
  549.         adda.l    a3,a1            ;a1+=plsiz
  550.         move.l    (2*4,sp),(a1)        ;plane2
  551.         adda.l    a3,a1            ;a1+=plsiz
  552.         move.l    (3*4,sp),(a1)        ;plane3
  553.         adda.l    a3,a1            ;a1+=plsiz
  554.         move.l    (4*4,sp),(a1)        ;plane4    
  555.         adda.l    a3,a1            ;a1+=plsiz
  556.         move.l    (5*4,sp),(a1)        ;plane5
  557.     ifgt depth-6
  558.         adda.l    a3,a1            ;a1+=plsiz
  559.         move.l    (6*4,sp),(a1)        ;plane6
  560.         adda.l    a3,a1            ;a1+=plsiz
  561.         move.l    (7*4,sp),(a1)        ;plane7
  562.     endc
  563.  
  564. exit:        add.w    #48,sp
  565.         movem.l    (sp)+,d2-d7/a2-a6
  566.         rts
  567.  
  568.         cnop    0,4
  569. end:
  570.  
  571.         end
  572.