Subversion Repositories Kolibri OS

Rev

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