Subversion Repositories Kolibri OS

Rev

Rev 1776 | Go to most recent revision | Blame | Compare with Previous | Last modification | View Log | Download | RSS feed

  1.  
  2.  
  3. CATMULL_SHIFT  equ 8
  4. ROUND equ 8
  5. ;NON=0
  6. ;MMX=1
  7. ;Ext=MMX
  8. ;TEX_SIZE=0x3fff
  9. ;SIZE_X equ 512
  10. ;SIZE_Y equ 512
  11. ;ROUND = 8
  12. ;TEX_SHIFT equ 6
  13.  
  14. ; procedure drawing textured triangle with Gouraud shading
  15. ; Z-buffer alghoritm included, Z coord interpolation ----
  16. ; I set the color by this way -- (col1 * col2)/256 ------
  17. ;------------------in - eax - x1 shl 16 + y1 ------------
  18. ;---------------------- ebx - x2 shl 16 + y2 ------------
  19. ;---------------------- ecx - x3 shl 16 + y3 ------------
  20. ;---------------------- esi - pointer to Z-buffer--------
  21. ;---------------------- edx - pointer to texture---------
  22. ;---------------------- Z-buffer filled with dd variables
  23. ;---------------------- shifted CATMULL_SHIFT------------
  24. ;---------------------- edi - pointer to screen buffer---
  25. ;---------------------- stack : colors-------------------
  26.  
  27.  
  28.  
  29. tex_plus_grd_triangle:
  30. ; parameters :
  31.    .tex_y3  equ [ebp+38]   ; 36 bytes through stack
  32.    .tex_x3  equ [ebp+36]
  33.    .tex_y2  equ [ebp+34]
  34.    .tex_x2  equ [ebp+32]
  35.    .tex_y1  equ [ebp+30]
  36.    .tex_x1  equ [ebp+28]
  37.  
  38.    .z3      equ [ebp+26]
  39.    .col3b   equ [ebp+24]
  40.    .col3g   equ [ebp+22]
  41.    .col3r   equ [ebp+20]
  42.  
  43.    .z2      equ [ebp+18]
  44.    .col2b   equ [ebp+16]
  45.    .col2g   equ [ebp+14]
  46.    .col2r   equ [ebp+12]
  47.  
  48.    .z1      equ [ebp+10]
  49.    .col1b   equ [ebp+8]
  50.    .col1g   equ [ebp+6]
  51.    .col1r   equ [ebp+4]
  52.  
  53. ; local variables:
  54.  
  55.    .tex_ptr   equ dword[ebp-4]
  56.    .z_ptr     equ dword[ebp-8]
  57.    .scr_buff  equ dword[ebp-12]
  58.  
  59.    .x1        equ  word[ebp-14] ;dw ? ;equ word[ebp-10]
  60.    .y1        equ  word[ebp-16] ;dw ? ;equ word[ebp-12]
  61.    .x2        equ  word[ebp-18] ;dw ? ;equ word[ebp-14]
  62.    .y2        equ  word[ebp-20] ;dw ? ;equ word[ebp-16]
  63.    .x3        equ  word[ebp-22] ;dw ? ;equ word[ebp-18]
  64.    .y3        equ  word[ebp-24] ;dw ? ;equ word[ebp-20]
  65.  
  66.    .dx12      equ  dword[ebp-28] ;dd ?
  67.    .tex_dx12  equ  dword[ebp-32] ;dd ?
  68.    .tex_dy12  equ       [ebp-36] ;dd ?
  69.    .dz12      equ  dword[ebp-40] ;dd ?
  70.    .dc12r     equ       [ebp-44] ;dd ?
  71.    .dc12g     equ  dword[ebp-48] ;dd ?
  72.    .dc12b     equ       [ebp-52] ;dd ?
  73.  
  74.    .dx23      equ  dword[ebp-56] ;dd ?
  75.    .tex_dx23  equ  dword[ebp-60] ;dd ?
  76.    .tex_dy23  equ       [ebp-64] ;dd ?
  77.    .dz23      equ  dword[ebp-68] ;dd ?
  78.    .dc23r     equ       [ebp-72] ;dd ?
  79.    .dc23g     equ  dword[ebp-76] ;dd ?
  80.    .dc23b     equ       [ebp-80] ;dword[ebp-8]dd ?
  81.  
  82.    .dx13      equ  dword[ebp-84] ;dd ?
  83.    .tex_dx13  equ  dword[ebp-88] ;dd ?
  84.    .tex_dy13  equ       [ebp-92] ;dd ?
  85.    .dz13      equ  dword[ebp-96] ;dd ?
  86.    .dc13r     equ       [ebp-100] ;dd ?
  87.    .dc13g     equ  dword[ebp-104] ;dd ?
  88.    .dc13b     equ       [ebp-108] ;dd ?
  89.  
  90.    .scan_x1   equ  dword[ebp-112] ;dd ?
  91.    .scan_y1   equ       [ebp-116] ;dd ?
  92.    .zz1       equ  dword[ebp-120] ;dw ?
  93.    .cur1r     equ       [ebp-124] ;dw ?
  94.    .cur1g     equ  dword[ebp-128] ;dw ?
  95.    .cur1b     equ       [ebp-132] ;dw ?
  96.  
  97.    .scan_x2   equ  dword[ebp-136] ;dd ?
  98.    .scan_y2   equ       [ebp-140] ;dd ?
  99.    .zz2       equ  dword[ebp-144] ;dw ?
  100.    .cur2r     equ       [ebp-148] ;dw ?
  101.    .cur2g     equ  dword[ebp-152] ;dw ?
  102.    .cur2b     equ       [ebp-156] ;dw ?
  103.  
  104.  
  105.        mov    ebp,esp
  106.  
  107.    ;    mov     .tex_ptr,edx
  108.    ;    mov     .z_ptr,esi
  109.    ;    mov     .scr_buff,edi
  110.          push    edx esi edi
  111. ;         push    esi
  112. ;         push    edi
  113.          mov      edx,80008000h  ; eax,ebx,ecx are ANDd together into edx which means that
  114.          and      edx,ebx        ; if *all* of them are negative a sign flag is raised
  115.          and      edx,ecx
  116.          and      edx,eax
  117.          test     edx,80008000h  ; Check both X&Y at once
  118.          jne      .loop2_end
  119.  
  120.    .sort3:
  121.        cmp     ax,bx
  122.        jle     .sort1
  123.        xchg    eax,ebx
  124. if Ext>=MMX
  125.        movq    mm0, .col1r       ; exchange r, g, b, z
  126.        movq    mm1, .col2r
  127.        movq    .col1r ,mm1
  128.        movq    .col2r ,mm0
  129. else
  130.        mov     edx,dword .col1r   ; exchange both r and g
  131.        xchg    edx,dword .col2r
  132.        mov     dword .col1r ,edx
  133.  
  134.        mov     edx,dword .col1b   ; b and z
  135.        xchg    edx,dword .col2b
  136.        mov     dword .col1b ,edx
  137. end if
  138.  
  139.        mov     edx,dword .tex_x1
  140.        xchg    edx,dword .tex_x2
  141.        mov     dword .tex_x1 ,edx
  142.  
  143.  .sort1:
  144.        cmp      bx,cx
  145.        jle      .sort2
  146.        xchg    ebx,ecx
  147.  
  148. if Ext>=MMX
  149.        movq    mm0, .col2r       ; exchange r, g, b, z
  150.        movq    mm1, .col3r
  151.        movq    .col3r ,mm0
  152.        movq    .col2r ,mm1
  153. else
  154.  
  155.        mov     edx,dword .col2r  ; r, g
  156.        xchg    edx,dword .col3r
  157.        mov     dword .col2r,edx
  158.  
  159.        mov     edx,dword .col2b  ; b, z
  160.        xchg    edx,dword .col3b
  161.        mov     dword .col2b,edx
  162. end if
  163.  
  164.        mov     edx,dword .tex_x2
  165.        xchg    edx,dword .tex_x3
  166.        mov     dword .tex_x2,edx
  167.  
  168.        jmp .sort3
  169.  
  170.  .sort2:
  171.  
  172.        push     eax ebx ecx         ; store in variables
  173.   ;     push     ebx
  174.   ;     push     ecx
  175.  
  176. ;****************** delta computng zone **************
  177. ;+++++++++ first zone
  178.        mov      bx,.y2       ; calc delta12
  179.        sub      bx,.y1
  180.        jnz      .dx12_make
  181.        mov      ecx,7
  182.      @@:
  183.        push     dword 0
  184.        loop     @b
  185.        jmp      .dx12_done
  186.   .dx12_make:
  187.  
  188.  
  189.        mov      ax,.x2
  190.        sub      ax,.x1
  191.        cwde
  192.        movsx    ebx,bx
  193.        shl      eax,ROUND
  194.        cdq
  195.        idiv     ebx
  196.  ;      mov      .dx12,eax
  197.        push      eax
  198.  
  199. if  0  ; Ext=SSE
  200.        movd      mm0,.col1r    ; 2 words  r, g
  201.        pxor      mm1,mm1
  202.        punpcklwd mm0,mm1
  203.        cvtpi2ps  xmm0,mm0
  204.        movlhps   xmm0,xmm0
  205.        movd      mm0,.col1g    ; 2 words  b, z
  206.        punpcklwd mm0,mm1
  207.        cvtpi2ps  xmm0,mm0
  208.        ; xmm0=four float double words
  209.        divss     xmm0,.pack3
  210.        ;convert and insert mm0 to lower xmm1     ..
  211. end if
  212.  
  213.        mov      ax,word .tex_x2
  214.        sub      ax,word .tex_x1
  215.        cwde
  216.        shl      eax,ROUND
  217.        cdq
  218.        idiv     ebx
  219. ;       mov      .tex_dx12r,eax
  220.        push       eax
  221.  
  222.        mov        ax,word .tex_y2
  223.        sub        ax,word .tex_y1
  224.        cwde
  225.        shl      eax,ROUND
  226.        cdq
  227.        idiv     ebx
  228. ;       mov      .tex_dx12,eax
  229.        push     eax
  230.  
  231.        mov      ax,word .z2
  232.        sub      ax,word .z1
  233.        cwde
  234.        shl      eax,CATMULL_SHIFT
  235.        cdq
  236.        idiv     ebx
  237.  ;      mov      .dz12,eax
  238.        push     eax       ; .dza12
  239.  
  240.        mov      ax,word .col2r
  241.        sub      ax,word .col1r
  242.        cwde
  243.        shl      eax,ROUND
  244.        cdq
  245.        idiv     ebx
  246.  ;      mov      .dc12r,eax
  247.        push       eax
  248.  
  249.        mov        ax,word .col2g
  250.        sub        ax,word .col1g
  251.        cwde
  252.        shl      eax,ROUND
  253.        cdq
  254.        idiv     ebx
  255.  ;      mov      .dc12g,eax
  256.        push     eax
  257.  
  258.        mov      ax,word .col2b         ;;---
  259.        sub      ax,word .col1b
  260.        cwde
  261.        shl      eax,ROUND
  262.        cdq
  263.        idiv     ebx
  264. ;       mov      .dc12b,eax
  265.        push     eax
  266.  
  267. ;+++++++++++++++++ second zone +++++++++++++
  268.    .dx12_done:
  269.  
  270.        mov      bx,.y3       ; calc delta23
  271.        sub      bx,.y2
  272.        jnz      .dx23_make
  273.        mov      ecx,7
  274.     @@:
  275.        push     dword 0
  276.        loop     @b
  277.        jmp      .dx23_done
  278.  
  279.   .dx23_make:
  280.        mov      ax,.x3
  281.        sub      ax,.x2
  282.        cwde
  283.        movsx    ebx,bx
  284.        shl      eax,ROUND
  285.        cdq
  286.        idiv     ebx
  287.  ;      mov      .dx23,eax
  288.        push      eax
  289.  
  290.        mov      ax,word .tex_x3
  291.        sub      ax,word .tex_x2
  292.        cwde
  293.        shl      eax,ROUND
  294.        cdq
  295.        idiv     ebx
  296. ;       mov      .tex_dx23,eax
  297.        push       eax
  298.  
  299.        mov        ax,word .tex_y3
  300.        sub        ax,word .tex_y2
  301.        cwde
  302.        shl      eax,ROUND
  303.        cdq
  304.        idiv     ebx
  305. ;       mov      .tex_dy23,eax
  306.        push     eax
  307.  
  308.        mov      ax,word .z3
  309.        sub      ax,word .z2
  310.        cwde                                ;
  311.        shl      eax,CATMULL_SHIFT          ;  2222222
  312.        cdq                                 ;  2     2
  313.        idiv     ebx                        ;        2
  314. ;       mov      .dz23,eax                 ;       2
  315.        push     eax       ; .dza12         ;      2
  316.                                            ;     2
  317.        mov      ax,word .col3r             ;    2
  318.        sub      ax,word .col2r             ;   2222222
  319.        cwde                                ;  second delta
  320.        shl      eax,ROUND                  ;
  321.        cdq                                 ;
  322.        idiv     ebx                        ;
  323. ;       mov      .dc23r,eax                 ;
  324.        push       eax
  325.  
  326.        mov        ax,word .col3g
  327.        sub        ax,word .col2g
  328.        cwde
  329.        shl      eax,ROUND
  330.        cdq
  331.        idiv     ebx
  332. ;       mov      .dc23g,eax
  333.        push     eax
  334.  
  335.        mov      ax,word .col3b         ;;---
  336.        sub      ax,word .col2b
  337.        cwde
  338.        shl      eax,ROUND
  339.        cdq
  340.        idiv     ebx
  341. ;       mov      .dc23b,eax
  342.        push     eax
  343.  
  344.    .dx23_done:
  345. ;++++++++++++++++++third zone++++++++++++++++++++++++
  346.        mov      bx,.y3       ; calc delta13
  347.        sub      bx,.y1
  348.        jnz      .dx13_make
  349.        mov      ecx,7
  350.      @@:
  351.        push     dword 0
  352.        loop     @b
  353.        jmp      .dx13_done
  354.   .dx13_make:
  355.        mov      ax,.x3
  356.        sub      ax,.x1
  357.        cwde
  358.        movsx    ebx,bx
  359.        shl      eax,ROUND
  360.        cdq
  361.        idiv     ebx
  362. ;       mov      .dx13,eax
  363.        push      eax
  364.  
  365.        mov      ax,word .tex_x3            ; triangle b
  366.        sub      ax,word .tex_x1
  367.        cwde
  368.        shl      eax,ROUND
  369.        cdq
  370.        idiv     ebx
  371. ;       mov      .tex_dx13r,eax
  372.        push       eax
  373.  
  374.        mov        ax,word .tex_y3
  375.        sub        ax,word .tex_y1
  376.        cwde
  377.        shl      eax,ROUND
  378.        cdq
  379.        idiv     ebx
  380. ;       mov      .tex_dy13,eax
  381.        push     eax
  382.  
  383.        mov      ax,word .z3
  384.        sub      ax,word .z1            ;    333333333
  385.        cwde                            ;   3        3
  386.        shl      eax,CATMULL_SHIFT      ;            3
  387.        cdq                             ;            3
  388.        idiv     ebx                    ;            3
  389. ;       mov      .dz13,eax             ;            3
  390.        push     eax       ; .dza12     ;            3
  391.                                        ;            3
  392.        mov      ax,word .col3r         ;    3333333333
  393.        sub      ax,word .col1r         ;            3
  394.        cwde                            ;            3
  395.        shl      eax,ROUND              ;            3
  396.        cdq                             ;            3
  397.        idiv     ebx                    ;            3
  398.   ;    mov      .dc13r,eax             ;    3       3
  399.        push       eax                 ;     33333333
  400.  
  401.        mov        ax,word .col3g
  402.        sub        ax,word .col1g
  403.        cwde
  404.        shl      eax,ROUND
  405.        cdq
  406.        idiv     ebx
  407.  ;      mov      .dc13g,eax
  408.        push     eax
  409.  
  410.        mov      ax,word .col3b         ;;---
  411.        sub      ax,word .col1b
  412.        cwde
  413.        shl      eax,ROUND
  414.        cdq
  415.        idiv     ebx
  416. ;       mov      .dc13b,eax
  417.        push     eax
  418.  
  419.    .dx13_done:
  420.  
  421. ; <<<<<<<  ::delta zone end+++++++++++++++++++++ >>>>>>>>
  422.        sub      esp,55   ;(12*4)
  423.  
  424.        movsx    eax,.x1                    ; eax - cur x1
  425.        shl      eax,ROUND                  ; ebx - cur x2
  426.        mov      ebx,eax
  427.        movsx    edx,word .z1
  428.        shl      edx,CATMULL_SHIFT
  429.        mov      .zz1,edx
  430.        mov      .zz2,edx
  431.  
  432.        movzx    edi,word .col1r
  433.        shl      edi,ROUND
  434.        mov      .cur1r,edi
  435.        mov      .cur2r,edi
  436.        movzx    esi,word .col1g
  437.        shl      esi,ROUND
  438.        mov      .cur1g,esi
  439.        mov      .cur2g,esi
  440.        movzx    edx,word .col1b
  441.        shl      edx,ROUND
  442.        mov      .cur1b,edx
  443.        mov      .cur2b,edx
  444.  
  445.        movzx    edi,word .tex_x1
  446.        shl      edi,ROUND
  447.        mov      .scan_x1,edi
  448.        mov      .scan_x2,edi
  449.        movzx    edx,word .tex_y1
  450.        shl      edx,ROUND
  451.        mov      .scan_y1,edx
  452.        mov      .scan_y2,edx
  453.  
  454.        mov      cx,.y1
  455.        cmp      cx,.y2
  456.        jge      .loop1_end
  457.     .loop_1:
  458.     ;   push     eax ebx ebp
  459.        pushad
  460.  
  461.        push     .tex_ptr
  462.        push     .scr_buff
  463.        push     .z_ptr
  464.        push     cx
  465.  
  466.        push     .zz2
  467.  
  468.        push     .scan_x2
  469.        push     dword .scan_y2
  470.        push     dword .cur2r
  471.        push     .cur2g
  472.        push     dword .cur2b
  473.  
  474.        push     .zz1
  475.  
  476.        push     .scan_x1
  477.        push     dword .scan_y1
  478.        push     dword .cur1r
  479.        push     .cur1g
  480.        push     dword .cur1b
  481.  
  482.        sar      eax,ROUND
  483.        sar      ebx,ROUND
  484.        call     horizontal_tex_grd_line
  485.  
  486.       ; pop      ebp ebx eax
  487.        popad
  488.  
  489. if (Ext = MMX)|(Ext=SSE)
  490.        movq     mm0,.cur1b
  491.        movq     mm1,.cur1r
  492.        movq     mm2,.scan_y1
  493.        movq     mm3,.cur2b
  494.        movq     mm4,.cur2r
  495.        movq     mm5,.scan_y2
  496.        paddd    mm0,.dc13b
  497.        paddd    mm1,.dc13r
  498.        paddd    mm2,.tex_dy13
  499.        paddd    mm3,.dc12b
  500.        paddd    mm4,.dc12r
  501.        paddd    mm5,.tex_dy12
  502.        movq     .cur1b,mm0
  503.        movq     .cur1r,mm1
  504.        movq     .scan_y1,mm2
  505.        movq     .cur2b,mm3
  506.        movq     .cur2r,mm4
  507.        movq     .scan_y2,mm5
  508. end if
  509. if Ext >= SSE2
  510.        movups   xmm0,.cur1b
  511.        movups   xmm1,.dc13b
  512.        movups   xmm2,.cur2b
  513.        movups   xmm3,.dc12b
  514.        movq     mm2,.scan_y1
  515.        movq     mm5,.scan_y2
  516.        paddd    xmm0,xmm1
  517.        paddd    xmm2,xmm3
  518.        paddd    mm2,.tex_dy13
  519.        paddd    mm5,.tex_dy12
  520.        movq     .scan_y1,mm2
  521.        movq     .scan_y2,mm5
  522.        movups   .cur1b,xmm0
  523.        movups   .cur2b,xmm2
  524. end if
  525.  
  526. if Ext = NON
  527.        mov      edx,.dc13b
  528.        add      .cur1b,edx
  529.        mov      esi,.dc13g
  530.        add      .cur1g,esi
  531.        mov      edi,.dc13r
  532.        add      .cur1r,edi
  533.        mov      edx,.dz13
  534.        add      .zz1,edx
  535.        mov      edx,.tex_dx13
  536.        add      .scan_x1,edx
  537.        mov      esi,.tex_dy13
  538.        add      .scan_y1,esi
  539.  
  540.        mov      edi,.dc12b
  541.        add      .cur2b,edi
  542.        mov      esi,.dc12g
  543.        add      .cur2g,esi
  544.        mov      edx,.dc12r
  545.        add      .cur2r,edx
  546.        mov      edi,.tex_dx12
  547.        add      .scan_x2,edi
  548.        mov      esi,.tex_dy12
  549.        add      .scan_y2,esi
  550.        mov      edx,.dz12
  551.        add      .zz2,edx
  552. end if
  553.        add      eax,.dx13
  554.        add      ebx,.dx12
  555.        inc      cx
  556.        cmp      cx,.y2
  557.        jl      .loop_1
  558.  .loop1_end:
  559.        movzx    ecx,.y2
  560.        cmp      cx,.y3
  561.        jge      .loop2_end
  562.  
  563.        movsx    ebx,.x2                    ; eax - cur x1
  564.        shl      ebx,ROUND                  ; ebx - cur x2
  565.  
  566.        movsx    edx,word .z2
  567.        shl      edx,CATMULL_SHIFT
  568. ;       mov      .zz1,edx
  569.        mov      .zz2,edx
  570.  
  571.        movzx    edi,word .col2r
  572.        shl      edi,ROUND
  573.    ;    mov      .cur1r,edi
  574.        mov      .cur2r,edi
  575.        movzx    esi,word .col2g
  576.        shl      esi,ROUND
  577.    ;    mov      .cur1g,esi
  578.        mov      .cur2g,esi
  579.        movzx    edx,word .col2b
  580.        shl      edx,ROUND
  581.    ;    mov      .cur1b,edx
  582.        mov      .cur2b,edx
  583.  
  584.        movzx    edi,word .tex_x2
  585.        shl      edi,ROUND
  586.  ;      mov      .scan_x1,edi
  587.        mov      .scan_x2,edi
  588.        movzx    edx,word .tex_y2
  589.        shl      edx,ROUND
  590.  ;      mov      .scan_y1,edx
  591.        mov      .scan_y2,edx
  592.  
  593.   .loop_2:
  594.        pushad
  595.  
  596.        push     .tex_ptr
  597.        push     .scr_buff
  598.        push     .z_ptr
  599.        push     cx
  600.  
  601.        push     .zz2
  602.  
  603.        push     .scan_x2
  604.        push     dword .scan_y2
  605.        push     dword .cur2r
  606.        push     .cur2g
  607.        push     dword .cur2b
  608.  
  609.        push     .zz1
  610.  
  611.        push     .scan_x1
  612.        push     dword .scan_y1
  613.        push     dword .cur1r
  614.        push     .cur1g
  615.        push     dword .cur1b
  616.  
  617.        sar      eax,ROUND
  618.        sar      ebx,ROUND
  619.        call     horizontal_tex_grd_line
  620.  
  621.        popad
  622.  
  623. if (Ext = MMX)|(Ext=SSE)
  624.        movq     mm0,.cur1b
  625.        movq     mm1,.cur1r
  626.        movq     mm2,.scan_y1
  627.        movq     mm3,.cur2b
  628.        movq     mm4,.cur2r
  629.        movq     mm5,.scan_y2
  630.        paddd    mm0,.dc13b
  631.        paddd    mm1,.dc13r
  632.        paddd    mm2,.tex_dy13
  633.        paddd    mm3,.dc23b
  634.        paddd    mm4,.dc23r
  635.        paddd    mm5,.tex_dy23
  636.        movq     .cur1b,mm0
  637.        movq     .cur1r,mm1
  638.        movq     .scan_y1,mm2
  639.        movq     .cur2b,mm3
  640.        movq     .cur2r,mm4
  641.        movq     .scan_y2,mm5
  642. end if
  643. if Ext >= SSE2
  644.        movups   xmm0,.cur1b
  645.        movups   xmm1,.dc13b
  646.        movups   xmm2,.cur2b
  647.        movups   xmm3,.dc23b
  648.        movq     mm2,.scan_y1
  649.        movq     mm5,.scan_y2
  650.        paddd    xmm0,xmm1
  651.        paddd    xmm2,xmm3
  652.        paddd    mm2,.tex_dy13
  653.        paddd    mm5,.tex_dy23
  654.        movq     .scan_y1,mm2
  655.        movq     .scan_y2,mm5
  656.        movups   .cur1b,xmm0
  657.        movups   .cur2b,xmm2
  658. end if
  659. if Ext = NON
  660.        mov      edx,.dc13b
  661.        add      .cur1b,edx
  662.        mov      esi,.dc13g
  663.        add      .cur1g,esi
  664.        mov      edi,.dc13r
  665.        add      .cur1r,edi
  666.        mov      edx,.tex_dx13
  667.        add      .scan_x1,edx
  668.        mov      esi,.tex_dy13
  669.        add      .scan_y1,esi
  670.        mov      edx,.dz13
  671.        add      .zz1,edx
  672.  
  673.        mov      edi,.dc23b
  674.        add      .cur2b,edi
  675.        mov      esi,.dc23g
  676.        add      .cur2g,esi
  677.        mov      edx,.dc23r
  678.        add      .cur2r,edx
  679.        mov      edi,.tex_dx23
  680.        add      .scan_x2,edi
  681.        mov      esi,.tex_dy23
  682.        add      .scan_y2,esi
  683.        mov      edx,.dz23
  684.        add      .zz2,edx
  685. end if
  686.        add      eax,.dx13
  687.        add      ebx,.dx23
  688.        inc      cx
  689.        cmp      cx,.y3
  690.        jl       .loop_2
  691.  
  692. .loop2_end:
  693.        mov      esp,ebp
  694. ret 36
  695. horizontal_tex_grd_line:
  696. ;in:
  697. ; eax : x1, ebx : x2
  698.  
  699. .tex_ptr  equ [ebp+62]
  700. .screen   equ [ebp+58]
  701. .z_buffer equ [ebp+54]
  702. .y        equ [ebp+52]
  703.  
  704. .z2     equ [ebp+48]
  705. .tex_x2 equ [ebp+44]
  706. .tex_y2 equ [ebp+40]
  707. .r2     equ [ebp+36]
  708. .g2     equ [ebp+32]
  709. .b2     equ [ebp+28]
  710.  
  711. .z1     equ [ebp+24]
  712. .tex_x1 equ [ebp+20]
  713. .tex_y1 equ [ebp+16]
  714. .r1     equ [ebp+12]
  715. .g1     equ [ebp+8]
  716. .b1     equ [ebp+4]
  717.  
  718. .x1 equ  word[ebp-2]
  719. .x2 equ  word[ebp-4]
  720. .dz equ dword[ebp-8]
  721. .db equ dword[ebp-12]
  722. .dg equ dword[ebp-16]
  723. .dr equ dword[ebp-20]
  724. .dtex_x equ dword[ebp-24]
  725. .dtex_y equ dword[ebp-28]
  726.  
  727. .c_ty equ [ebp-32]
  728. .c_tx equ [ebp-36]
  729. .cb  equ  [ebp-40]
  730. .cg  equ  [ebp-44]
  731. .cr  equ  [ebp-48]
  732. .t_col equ [ebp-52]
  733.  
  734. .dtex_yM equ qword[ebp-28]
  735. .drM equ qword[ebp-20]
  736. .dbM equ qword[ebp-12]
  737.  
  738.         mov     ebp,esp
  739.   ;      sub     esp,30
  740.  
  741.         mov     cx,word .y
  742.         or      cx,cx
  743.         jl      .quit_l
  744.  
  745.         cmp     cx,SIZE_Y
  746.         jge     .quit_l
  747.  
  748.         cmp     ax,bx
  749.         je      .quit_l
  750.         jl      @f
  751.  
  752.         xchg    eax,ebx
  753.  
  754. if Ext=NON
  755.         mov     ecx,dword .r1
  756.         xchg    ecx, .r2
  757.         mov     dword .r1, ecx
  758.  
  759.         mov     ecx,dword .g1
  760.         xchg    ecx, .g2
  761.         mov     dword .g1, ecx
  762.  
  763.         mov     ecx,dword .b1
  764.         xchg    ecx, .b2
  765.         mov     dword .b1, ecx
  766.  
  767.         mov     ecx,dword .tex_x1
  768.         xchg    ecx, .tex_x2
  769.         mov     dword .tex_x1, ecx
  770.  
  771.         mov     ecx,dword .tex_y1
  772.         xchg    ecx, .tex_y2
  773.         mov     dword .tex_y1, ecx
  774.  
  775.         mov     ecx,dword .z1
  776.         xchg    ecx, .z2
  777.         mov     dword .z1, ecx
  778. end if
  779. if (Ext=MMX)
  780.         movq    mm0,.b1        ; b, g
  781.         movq    mm1,.b2
  782.         movq    .b1, mm1
  783.         movq    .b2, mm0
  784.         movq    mm2,.r1        ; r, y
  785.         movq    mm3,.r2
  786.         movq    .r1,mm3
  787.         movq    .r2,mm2
  788.         movq    mm4,.tex_x1    ; x, z
  789.         movq    mm5,.tex_x2
  790.         movq    .tex_x1,mm5
  791.         movq    .tex_x2,mm4
  792.  
  793. end if
  794. if Ext>=SSE
  795.        movups  xmm0,.b1
  796.        movups  xmm1,.b2
  797.        movups  .b1,xmm1
  798.        movups  .b2,xmm0
  799.        movq    mm4,.tex_x1    ; x, z
  800.        movq    mm5,.tex_x2
  801.        movq    .tex_x1,mm5
  802.        movq    .tex_x2,mm4
  803. end if
  804.  
  805.     @@:
  806.         or      bx,bx
  807.         jle     .quit_l
  808.         cmp     ax,SIZE_X
  809.         jge     .quit_l
  810.  
  811.         push    ax
  812.         push    bx
  813.  
  814.         mov     eax,.z2            ; delta zone************
  815.         sub     eax,.z1
  816.         cdq
  817.         mov     bx,.x2
  818.         sub     bx,.x1
  819.         movsx   ebx,bx
  820.         idiv    ebx
  821.         push    eax  ; .dz
  822.  
  823.         mov     eax,.b2
  824.         sub     eax,.b1
  825.         cdq
  826.         idiv    ebx
  827.         push    eax  ; .db
  828.  
  829.         mov     eax,.g2
  830.         sub     eax,.g1
  831.         cdq
  832.         idiv    ebx
  833.         push    eax  ; .dg
  834.  
  835.         mov     eax,.r2
  836.         sub     eax,.r1
  837.         cdq
  838.         idiv    ebx
  839.         push    eax  ; .dr
  840.  
  841.         mov     eax,.tex_x2
  842.         sub     eax,.tex_x1
  843.         cdq
  844.         idiv    ebx
  845.         push    eax  ; .dtex_x
  846.  
  847.         mov     eax,.tex_y2
  848.         sub     eax,.tex_y1
  849.         cdq
  850.         idiv    ebx
  851.         push    eax  ; .dtey_x
  852.  
  853.         cmp     .x1,0
  854.         jg      @f
  855.  
  856.         mov     eax,.dz     ; clipping
  857.         movsx   ebx,.x1
  858.         neg     ebx
  859.         imul    ebx
  860.         add     .z1,eax
  861.         mov     .x1,0
  862.  
  863.         mov    eax,.dr
  864.         imul   ebx
  865.         add    .r1,eax
  866. ;if  Ext=NON
  867.         mov    eax,.dg
  868.         imul   ebx
  869.         add    .g1,eax
  870.  
  871.         mov    eax,.db
  872.         imul   ebx
  873.         add    .b1,eax
  874.  
  875.         mov    eax,.dtex_x
  876.         imul   ebx
  877.         add    .tex_x1,eax
  878.  
  879.         mov    eax,.dtex_y
  880.         imul   ebx
  881.         add    .tex_y1,eax
  882.    @@:
  883.         mov       edx,SIZE_X
  884.         cmp       .x2,dx
  885.         jl        @f
  886.         mov       .x2,dx
  887.     @@:
  888. ; calc line addres begin in screen and Z buffer
  889.         movsx     eax,word .y
  890.         mul       edx
  891.         movsx     edx,.x1
  892.         add       eax,edx
  893.  
  894.         mov       esi,eax
  895.         shl       esi,2
  896.         add       esi,.z_buffer
  897.  
  898.         lea       eax,[eax*3]
  899.         mov       edi,.screen
  900.         add       edi,eax
  901.  
  902.         mov       cx,.x2
  903.         sub       cx,.x1
  904.         movzx     ecx,cx
  905.  
  906. ; init current variables
  907.         push      dword .tex_y1
  908. ;if  Ext=NON
  909.         push      dword .tex_x1
  910.  
  911.         push      dword .b1
  912.         push      dword .g1
  913.         push      dword .r1
  914.  
  915. if Ext>=MMX
  916.         movq      mm4,.cr  ; lo -> r,g
  917.         movq      mm6,.cb  ; hi -> b, tex_x
  918.         pxor      mm0,mm0
  919. end if
  920.         mov       ebx,.z1
  921.       .ddraw:
  922.         cmp       ebx,dword[esi]
  923.         jge       @f
  924.         mov       eax,.c_ty
  925. ;  if ROUND<TEX_SHIFT
  926. ;        shl        eax,TEX_SHIFT-ROUND
  927. ;  end if
  928. ;  if ROUND>TEX_SHIFT
  929. ;        shr        eax,ROUND-TEX_SHIFT
  930. ;  end if
  931.         shr       eax,ROUND
  932.         shl       Eax,TEX_SHIFT
  933.         mov       edx,.c_tx   ; calc texture pixel mem addres
  934.         shr       edx,ROUND
  935.         add       eax,edx
  936.         and       eax,TEXTURE_SIZE   ; cutting
  937.         lea       eax,[3*eax]
  938.         add       eax,.tex_ptr
  939.         mov       dword[esi],ebx
  940. if    Ext = NON
  941.         mov       eax,dword[eax]
  942.  ;      mov        .tex_col,eax
  943.         push      ax
  944.         shl       eax,8
  945.         pop       ax
  946.         mov       edx,.cr
  947.         sar       edx,ROUND
  948.         mul       dl         ; al*dl
  949.         shr       ax,8
  950.         stosb
  951.         ror       eax,16
  952.         push      ax
  953.         mov       edx,.cg
  954.         sar       edx,ROUND
  955.         mul       dl
  956.         shr       ax,8
  957.         stosb
  958.         pop       ax
  959.         shr       ax,8
  960.         mov       edx,.cb
  961.         sar       edx,ROUND
  962.         mul       dl
  963.         shr       ax,8
  964.         stosb
  965.         jmp       .no_skip
  966. else
  967.         movd      mm1,[eax]
  968.         punpcklbw mm1,mm0
  969.         movq      mm3,mm4  ;.cr     ; lo -> r,g
  970.         movq      mm5,mm6  ;.cb     ; lo -> b,tex_x
  971.         psrld     mm3,ROUND  ;
  972.         psrld     mm5,ROUND  ;
  973.         packssdw  mm3,mm5
  974.         pmullw    mm1,mm3
  975.         psrlw     mm1,8
  976.         packuswb  mm1,mm0
  977.         movd      [edi],mm1
  978. end if
  979.        mov        dword[esi],ebx
  980. if Ext = NON
  981.        jmp        .no_skip
  982. end if
  983.      @@:
  984.        add        edi,3
  985.      .no_skip:
  986.        add        esi,4
  987.        add        ebx,.dz
  988.  
  989.        mov        eax,.dtex_x
  990.        add        .c_tx, eax
  991.        mov        edx,.dtex_y
  992.        add        .c_ty, edx
  993. if Ext=NON
  994.        mov        eax,.dr
  995.        add        .cr,eax
  996.        mov        edx,.dg
  997.        add        .cg,edx
  998.        mov        eax,.db
  999.        add        .cb,eax
  1000.  
  1001. else
  1002.         paddd      mm4,.drM
  1003.         paddd      mm6,.dbM
  1004. ;;        paddd      mm7,.dtex_y      ; mm4 - b, g
  1005. ;;        movq       .c_tx,mm7
  1006.                                     ; mm6 - r, x
  1007. end if                              ; mm7 - y, x
  1008.  
  1009.        dec      ecx
  1010.        jnz      .ddraw
  1011.  
  1012.   .quit_l:
  1013.  
  1014.         mov     esp,ebp
  1015. ret 42+20  ; horizontal line
  1016.  
  1017.