home *** CD-ROM | disk | FTP | other *** search
/ Amiga ACS 1998 #2 / amigaacscoverdisc1998-021998.iso / games / doom / adoom / src / c2p_040.s < prev    next >
Text File  |  1998-01-06  |  11KB  |  551 lines

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