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

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