Subversion Repositories Kolibri OS

Rev

Rev 1245 | Go to most recent revision | Blame | 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
  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. else
  509.        mov      edx,.dc13b
  510.        add      .cur1b,edx
  511.        mov      esi,.dc13g
  512.        add      .cur1g,esi
  513.        mov      edi,.dc13r
  514.        add      .cur1r,edi
  515.        mov      edx,.dz13
  516.        add      .zz1,edx
  517.        mov      edx,.tex_dx13
  518.        add      .scan_x1,edx
  519.        mov      esi,.tex_dy13
  520.        add      .scan_y1,esi
  521.  
  522.        mov      edi,.dc12b
  523.        add      .cur2b,edi
  524.        mov      esi,.dc12g
  525.        add      .cur2g,esi
  526.        mov      edx,.dc12r
  527.        add      .cur2r,edx
  528.        mov      edi,.tex_dx12
  529.        add      .scan_x2,edi
  530.        mov      esi,.tex_dy12
  531.        add      .scan_y2,esi
  532.        mov      edx,.dz12
  533.        add      .zz2,edx
  534. end if
  535.        add      eax,.dx13
  536.        add      ebx,.dx12
  537.        inc      cx
  538.        cmp      cx,.y2
  539.        jl      .loop_1
  540.  .loop1_end:
  541.        movzx    ecx,.y2
  542.        cmp      cx,.y3
  543.        jge      .loop2_end
  544.  
  545.        movsx    ebx,.x2                    ; eax - cur x1
  546.        shl      ebx,ROUND                  ; ebx - cur x2
  547.  
  548.        movsx    edx,word .z2
  549.        shl      edx,CATMULL_SHIFT
  550. ;       mov      .zz1,edx
  551.        mov      .zz2,edx
  552.  
  553.        movzx    edi,word .col2r
  554.        shl      edi,ROUND
  555.    ;    mov      .cur1r,edi
  556.        mov      .cur2r,edi
  557.        movzx    esi,word .col2g
  558.        shl      esi,ROUND
  559.    ;    mov      .cur1g,esi
  560.        mov      .cur2g,esi
  561.        movzx    edx,word .col2b
  562.        shl      edx,ROUND
  563.    ;    mov      .cur1b,edx
  564.        mov      .cur2b,edx
  565.  
  566.        movzx    edi,word .tex_x2
  567.        shl      edi,ROUND
  568.  ;      mov      .scan_x1,edi
  569.        mov      .scan_x2,edi
  570.        movzx    edx,word .tex_y2
  571.        shl      edx,ROUND
  572.  ;      mov      .scan_y1,edx
  573.        mov      .scan_y2,edx
  574.  
  575.   .loop_2:
  576.        pushad
  577.  
  578.        push     .tex_ptr
  579.        push     .scr_buff
  580.        push     .z_ptr
  581.        push     cx
  582.  
  583.        push     .zz2
  584.  
  585.        push     .scan_x2
  586.        push     dword .scan_y2
  587.        push     dword .cur2r
  588.        push     .cur2g
  589.        push     dword .cur2b
  590.  
  591.        push     .zz1
  592.  
  593.        push     .scan_x1
  594.        push     dword .scan_y1
  595.        push     dword .cur1r
  596.        push     .cur1g
  597.        push     dword .cur1b
  598.  
  599.        sar      eax,ROUND
  600.        sar      ebx,ROUND
  601.        call     horizontal_tex_grd_line
  602.  
  603.        popad
  604.  
  605. if Ext >= MMX
  606.        movq     mm0,.cur1b
  607.        movq     mm1,.cur1r
  608.        movq     mm2,.scan_y1
  609.        movq     mm3,.cur2b
  610.        movq     mm4,.cur2r
  611.        movq     mm5,.scan_y2
  612.        paddd    mm0,.dc13b
  613.        paddd    mm1,.dc13r
  614.        paddd    mm2,.tex_dy13
  615.        paddd    mm3,.dc23b
  616.        paddd    mm4,.dc23r
  617.        paddd    mm5,.tex_dy23
  618.        movq     .cur1b,mm0
  619.        movq     .cur1r,mm1
  620.        movq     .scan_y1,mm2
  621.        movq     .cur2b,mm3
  622.        movq     .cur2r,mm4
  623.        movq     .scan_y2,mm5
  624. else
  625.        mov      edx,.dc13b
  626.        add      .cur1b,edx
  627.        mov      esi,.dc13g
  628.        add      .cur1g,esi
  629.        mov      edi,.dc13r
  630.        add      .cur1r,edi
  631.        mov      edx,.tex_dx13
  632.        add      .scan_x1,edx
  633.        mov      esi,.tex_dy13
  634.        add      .scan_y1,esi
  635.        mov      edx,.dz13
  636.        add      .zz1,edx
  637.  
  638.        mov      edi,.dc23b
  639.        add      .cur2b,edi
  640.        mov      esi,.dc23g
  641.        add      .cur2g,esi
  642.        mov      edx,.dc23r
  643.        add      .cur2r,edx
  644.        mov      edi,.tex_dx23
  645.        add      .scan_x2,edi
  646.        mov      esi,.tex_dy23
  647.        add      .scan_y2,esi
  648.        mov      edx,.dz23
  649.        add      .zz2,edx
  650. end if
  651.        add      eax,.dx13
  652.        add      ebx,.dx23
  653.        inc      cx
  654.        cmp      cx,.y3
  655.        jl       .loop_2
  656.  
  657. .loop2_end:
  658.        mov      esp,ebp
  659. ret 36
  660. horizontal_tex_grd_line:
  661. ;in:
  662. ; eax : x1, ebx : x2
  663.  
  664. .tex_ptr  equ [ebp+62]
  665. .screen   equ [ebp+58]
  666. .z_buffer equ [ebp+54]
  667. .y        equ [ebp+52]
  668.  
  669. .z2     equ [ebp+48]
  670. .tex_x2 equ [ebp+44]
  671. .tex_y2 equ [ebp+40]
  672. .r2     equ [ebp+36]
  673. .g2     equ [ebp+32]
  674. .b2     equ [ebp+28]
  675.  
  676. .z1     equ [ebp+24]
  677. .tex_x1 equ [ebp+20]
  678. .tex_y1 equ [ebp+16]
  679. .r1     equ [ebp+12]
  680. .g1     equ [ebp+8]
  681. .b1     equ [ebp+4]
  682.  
  683. .x1 equ  word[ebp-2]
  684. .x2 equ  word[ebp-4]
  685. .dz equ dword[ebp-8]
  686. .db equ dword[ebp-12]
  687. .dg equ dword[ebp-16]
  688. .dr equ dword[ebp-20]
  689. .dtex_x equ dword[ebp-24]
  690. .dtex_y equ dword[ebp-28]
  691.  
  692. .c_ty equ [ebp-32]
  693. .c_tx equ [ebp-36]
  694. .cb  equ  [ebp-40]
  695. .cg  equ  [ebp-44]
  696. .cr  equ  [ebp-48]
  697. .t_col equ [ebp-52]
  698.  
  699. .dtex_yM equ qword[ebp-28]
  700. .drM equ qword[ebp-20]
  701. .dbM equ qword[ebp-12]
  702.  
  703.         mov     ebp,esp
  704.   ;      sub     esp,30
  705.  
  706.         mov     cx,word .y
  707.         or      cx,cx
  708.         jl      .quit_l
  709.  
  710.         cmp     cx,SIZE_Y
  711.         jge     .quit_l
  712.  
  713.         cmp     ax,bx
  714.         je      .quit_l
  715.         jl      @f
  716.  
  717.         xchg    eax,ebx
  718.  
  719. if Ext=NON
  720.         mov     ecx,dword .r1
  721.         xchg    ecx, .r2
  722.         mov     dword .r1, ecx
  723.  
  724.         mov     ecx,dword .g1
  725.         xchg    ecx, .g2
  726.         mov     dword .g1, ecx
  727.  
  728.         mov     ecx,dword .b1
  729.         xchg    ecx, .b2
  730.         mov     dword .b1, ecx
  731.  
  732.         mov     ecx,dword .tex_x1
  733.         xchg    ecx, .tex_x2
  734.         mov     dword .tex_x1, ecx
  735.  
  736.         mov     ecx,dword .tex_y1
  737.         xchg    ecx, .tex_y2
  738.         mov     dword .tex_y1, ecx
  739.  
  740.         mov     ecx,dword .z1
  741.         xchg    ecx, .z2
  742.         mov     dword .z1, ecx
  743.  
  744. else
  745.         movq    mm0,.b1        ; b, g
  746.         movq    mm1,.b2
  747.         movq    .b1, mm1
  748.         movq    .b2, mm0
  749.         movq    mm2,.r1        ; r, y
  750.         movq    mm3,.r2
  751.         movq    .r1,mm3
  752.         movq    .r2,mm2
  753.         movq    mm4,.tex_x1    ; x, z
  754.         movq    mm5,.tex_x2
  755.         movq    .tex_x1,mm5
  756.         movq    .tex_x2,mm4
  757.  
  758. end if
  759.  
  760.     @@:
  761.         or      bx,bx
  762.         jle     .quit_l
  763.         cmp     ax,SIZE_X
  764.         jge     .quit_l
  765.  
  766.         push    ax
  767.         push    bx
  768.  
  769.         mov     eax,.z2            ; delta zone************
  770.         sub     eax,.z1
  771.         cdq
  772.         mov     bx,.x2
  773.         sub     bx,.x1
  774.         movsx   ebx,bx
  775.         idiv    ebx
  776.         push    eax  ; .dz
  777.  
  778.         mov     eax,.b2
  779.         sub     eax,.b1
  780.         cdq
  781.         idiv    ebx
  782.         push    eax  ; .db
  783.  
  784.         mov     eax,.g2
  785.         sub     eax,.g1
  786.         cdq
  787.         idiv    ebx
  788.         push    eax  ; .dg
  789.  
  790.         mov     eax,.r2
  791.         sub     eax,.r1
  792.         cdq
  793.         idiv    ebx
  794.         push    eax  ; .dr
  795.  
  796.         mov     eax,.tex_x2
  797.         sub     eax,.tex_x1
  798.         cdq
  799.         idiv    ebx
  800.         push    eax  ; .dtex_x
  801.  
  802.         mov     eax,.tex_y2
  803.         sub     eax,.tex_y1
  804.         cdq
  805.         idiv    ebx
  806.         push    eax  ; .dtey_x
  807.  
  808.         cmp     .x1,0
  809.         jg      @f
  810.  
  811.         mov     eax,.dz     ; clipping
  812.         movsx   ebx,.x1
  813.         neg     ebx
  814.         imul    ebx
  815.         add     .z1,eax
  816.         mov     .x1,0
  817.  
  818.         mov    eax,.dr
  819.         imul   ebx
  820.         add    .r1,eax
  821. ;if  Ext=NON
  822.         mov    eax,.dg
  823.         imul   ebx
  824.         add    .g1,eax
  825.  
  826.         mov    eax,.db
  827.         imul   ebx
  828.         add    .b1,eax
  829.  
  830.         mov    eax,.dtex_x
  831.         imul   ebx
  832.         add    .tex_x1,eax
  833.  
  834.         mov    eax,.dtex_y
  835.         imul   ebx
  836.         add    .tex_y1,eax
  837.    @@:
  838.         mov       edx,SIZE_X
  839.         cmp       .x2,dx
  840.         jl        @f
  841.         mov       .x2,dx
  842.     @@:
  843. ; calc line addres begin in screen and Z buffer
  844.         movsx     eax,word .y
  845.         mul       edx
  846.         movsx     edx,.x1
  847.         add       eax,edx
  848.  
  849.         mov       esi,eax
  850.         shl       esi,2
  851.         add       esi,.z_buffer
  852.  
  853.         lea       eax,[eax*3]
  854.         mov       edi,.screen
  855.         add       edi,eax
  856.  
  857.         mov       cx,.x2
  858.         sub       cx,.x1
  859.         movzx     ecx,cx
  860.  
  861. ; init current variables
  862.         push      dword .tex_y1
  863. ;if  Ext=NON
  864.         push      dword .tex_x1
  865.  
  866.         push      dword .b1
  867.         push      dword .g1
  868.         push      dword .r1
  869.  
  870. if Ext>=MMX
  871.         movq      mm4,.cr  ; lo -> r,g
  872.         movq      mm6,.cb  ; hi -> b, tex_x
  873.         pxor      mm0,mm0
  874. end if
  875.         mov       ebx,.z1
  876.       .ddraw:
  877.         cmp       ebx,dword[esi]
  878.         jge       @f
  879.         mov       eax,.c_ty
  880. ;  if ROUND<TEX_SHIFT
  881. ;        shl        eax,TEX_SHIFT-ROUND
  882. ;  end if
  883. ;  if ROUND>TEX_SHIFT
  884. ;        shr        eax,ROUND-TEX_SHIFT
  885. ;  end if
  886.         shr       eax,ROUND
  887.         shl       Eax,TEX_SHIFT
  888.         mov       edx,.c_tx   ; calc texture pixel mem addres
  889.         shr       edx,ROUND
  890.         add       eax,edx
  891.         and       eax,TEXTURE_SIZE   ; cutting
  892.         lea       eax,[3*eax]
  893.         add       eax,.tex_ptr
  894.         mov       dword[esi],ebx
  895. if    Ext = NON
  896.         mov       eax,dword[eax]
  897.  ;      mov        .tex_col,eax
  898.         push      ax
  899.         shl       eax,8
  900.         pop       ax
  901.         mov       edx,.cr
  902.         sar       edx,ROUND
  903.         mul       dl         ; al*dl
  904.         shr       ax,8
  905.         stosb
  906.         ror       eax,16
  907.         push      ax
  908.         mov       edx,.cg
  909.         sar       edx,ROUND
  910.         mul       dl
  911.         shr       ax,8
  912.         stosb
  913.         pop       ax
  914.         shr       ax,8
  915.         mov       edx,.cb
  916.         sar       edx,ROUND
  917.         mul       dl
  918.         shr       ax,8
  919.         stosb
  920.         jmp       .no_skip
  921. else
  922.         movd      mm1,[eax]
  923.         punpcklbw mm1,mm0
  924.         movq      mm3,mm4  ;.cr     ; lo -> r,g
  925.         movq      mm5,mm6  ;.cb     ; lo -> b,tex_x
  926.         psrld     mm3,ROUND  ;
  927.         psrld     mm5,ROUND  ;
  928.         packssdw  mm3,mm5
  929.         pmullw    mm1,mm3
  930.         psrlw     mm1,8
  931.         packuswb  mm1,mm0
  932.         movd      [edi],mm1
  933. end if
  934.        mov        dword[esi],ebx
  935. if Ext = NON
  936.        jmp        .no_skip
  937. end if
  938.      @@:
  939.        add        edi,3
  940.      .no_skip:
  941.        add        esi,4
  942.        add        ebx,.dz
  943.  
  944.        mov        eax,.dtex_x
  945.        add        .c_tx, eax
  946.        mov        edx,.dtex_y
  947.        add        .c_ty, edx
  948. if Ext=NON
  949.        mov        eax,.dr
  950.        add        .cr,eax
  951.        mov        edx,.dg
  952.        add        .cg,edx
  953.        mov        eax,.db
  954.        add        .cb,eax
  955.  
  956. else
  957.         paddd      mm4,.drM
  958.         paddd      mm6,.dbM
  959. ;;        paddd      mm7,.dtex_y      ; mm4 - b, g
  960. ;;        movq       .c_tx,mm7
  961.                                     ; mm6 - r, x
  962. end if                              ; mm7 - y, x
  963.  
  964.        dec      ecx
  965.        jnz      .ddraw
  966.  
  967.   .quit_l:
  968.  
  969.         mov     esp,ebp
  970. ret 42+20  ; horizontal line
  971.  
  972.