Subversion Repositories Kolibri OS

Rev

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

  1.  
  2. ;SIZE_X equ 350
  3. ;SIZE_Y equ 350
  4. ;ROUND equ 8
  5. ;TEX_X equ 512
  6. ;TEX_Y equ 512
  7. ;TEXTURE_SIZE EQU (512*512)-1
  8. ;TEX_SHIFT EQU 9
  9.  
  10. ;CATMULL_SHIFT equ 8
  11. ;TEXTURE_SIZE EQU (TEX_X * TEX_Y)-1
  12. ;Ext = SSE
  13. ;SSE = 3
  14. ;MMX = 1
  15. ;NON = 0
  16. ;use32
  17. ;------- Big thanks to Majuma (www.majuma.xt.pl) for absolutely great---
  18. ;------- DOS 13h mode demos --------------------------------------------
  19. ;------- Procedure draws triangle with two overlapped textures, I use --
  20. ;--------Catmull Z-buffer algorithm- (Z coordinate interpolation)-------
  21. ;--------I calc texture pixel by this way: col1*col2/256 ---------------
  22. two_tex_triangle_z:
  23. ;------------------in - eax - x1 shl 16 + y1 -----------
  24. ;---------------------- ebx - x2 shl 16 + y2 -----------
  25. ;---------------------- ecx - x3 shl 16 + y3 -----------
  26. ;---------------------- edx - pointer to b. texture-----
  27. ;---------------------- esi - pointer to e. texture-----
  28. ;---------------------- edi - pointer to screen buffer--
  29. ;---------------------- stack : b. tex coordinates------
  30. ;----------------------         e. tex coordinates------
  31. ;----------------------         Z position coordinates--
  32. ;----------------------         pointer io Z buffer-----
  33. ;-- Z-buffer - filled with coordinates as dword --------
  34. ;-- (Z coor. as word) shl CATMULL_SHIFT ----------------
  35. .b_x1   equ ebp+4   ; procedure don't save registers !!!
  36. .b_y1   equ ebp+6   ; each coordinate as word
  37. .b_x2   equ ebp+8
  38. .b_y2   equ ebp+10       ; b - first texture
  39. .b_x3   equ ebp+12
  40. .b_y3   equ ebp+14       ; e - second texture
  41. .e_x1   equ ebp+16
  42. .e_y1   equ ebp+18
  43. .e_x2   equ ebp+20
  44. .e_y2   equ ebp+22
  45. .e_x3   equ ebp+24
  46. .e_y3   equ ebp+26
  47. .z1     equ word[ebp+28]
  48. .z2     equ word[ebp+30]
  49. .z3     equ word[ebp+32]
  50. .z_buff equ dword[ebp+34]       ; pointer to Z-buffer
  51.  
  52.  
  53. .t_bmap equ dword[ebp-4]        ; pointer to b. texture
  54. .t_emap equ dword[ebp-8]        ; pointer to e. texture
  55. .x1     equ word[ebp-10]
  56. .y1     equ word[ebp-12]
  57. .x2     equ word[ebp-14]
  58. .y2     equ word[ebp-16]
  59. .x3     equ word[ebp-18]
  60. .y3     equ word[ebp-20]
  61.  
  62. .dx12  equ dword[ebp-24]
  63. .dbx12 equ dword[ebp-28]
  64. .dby12 equ dword[ebp-32]
  65. .dby12q equ     [ebp-32]
  66. .dex12 equ dword[ebp-36]
  67. .dey12 equ dword[ebp-40]
  68. .dey12q equ     [ebp-40]
  69. .dz12  equ dword[ebp-44]
  70.  
  71. .dx13  equ dword[ebp-48]
  72. .dbx13 equ dword[ebp-52]
  73. .dby13 equ dword[ebp-56]
  74. .dby13q equ     [ebp-56]
  75. .dex13 equ dword[ebp-60]
  76. .dey13 equ dword[ebp-64]
  77. .dey13q equ     [ebp-64]
  78. .dz13  equ dword[ebp-68]
  79.  
  80. .dx23  equ dword[ebp-72]
  81. .dbx23 equ dword[ebp-76]
  82. .dby23 equ dword[ebp-80]
  83. .dby23q equ     [ebp-80]
  84. .dex23 equ dword[ebp-84]
  85. .dey23 equ dword[ebp-88]
  86. .dey23q equ     [ebp-88]
  87. .dz23  equ dword[ebp-92]
  88.  
  89. .cx1   equ dword[ebp-96]   ; current variables
  90. .cx2   equ dword[ebp-100]
  91. .cbx1  equ dword[ebp-104]
  92. .cby1  equ [ebp-108]
  93. .cex1  equ dword[ebp-112]
  94. .cey1  equ [ebp-116]
  95. .cbx2  equ dword[ebp-120]
  96. .cby2  equ [ebp-124]
  97. .cex2  equ dword[ebp-128]
  98. .cey2  equ [ebp-132]
  99.  
  100. .cz1   equ dword[ebp-136]
  101. .cz2   equ dword[ebp-140]
  102.  
  103.     if Ext >= MMX
  104.        emms
  105.     else
  106.        cld
  107.     end if
  108.        mov     ebp,esp
  109.        push    edx esi       ; store bump map
  110. ;       push    esi        ; store e. map
  111.      ; sub     esp,120
  112.  .sort3:                  ; sort triangle coordinates...
  113.        cmp     ax,bx
  114.        jle     .sort1
  115.        xchg    eax,ebx
  116.        mov     edx,dword[.b_x1]
  117.        xchg    edx,dword[.b_x2]
  118.        mov     dword[.b_x1],edx
  119.        mov     edx,dword[.e_x1]
  120.        xchg    edx,dword[.e_x2]
  121.        mov     dword[.e_x1],edx
  122.        mov     dx,.z1
  123.        xchg    dx,.z2
  124.        mov     .z1,dx
  125.  .sort1:
  126.        cmp      bx,cx
  127.        jle      .sort2
  128.        xchg     ebx,ecx
  129.        mov      edx,dword[.b_x2]
  130.        xchg     edx,dword[.b_x3]
  131.        mov      dword[.b_x2],edx
  132.        mov      edx,dword[.e_x2]
  133.        xchg     edx,dword[.e_x3]
  134.        mov      dword[.e_x2],edx
  135.        mov     dx,.z2
  136.        xchg    dx,.z3
  137.        mov     .z2,dx
  138.        jmp      .sort3
  139.  .sort2:
  140.        push     eax ebx ecx    ; store triangle coords in variables
  141. ;       push     ebx
  142. ;       push     ecx
  143.  
  144.          mov      edx,80008000h  ; eax,ebx,ecx are ANDd together into edx which means that
  145.          and      edx,ebx        ; if *all* of them are negative a sign flag is raised
  146.          and      edx,ecx
  147.          and      edx,eax
  148.          test     edx,80008000h  ; Check both X&Y at once
  149.          jne      .loop23_done
  150.     ;   mov     edx,eax         ; eax,ebx,ecx are ORd together into edx which means that
  151.     ;   or      edx,ebx         ; if any *one* of them is negative a sign flag is raised
  152.     ;   or      edx,ecx
  153.     ;   test    edx,80000000h   ; Check only X
  154.     ;   jne     .loop23_done
  155.  
  156.     ;   cmp     .x1,SIZE_X    ; {
  157.     ;   jg      .loop23_done
  158.     ;   cmp     .x2,SIZE_X     ; This can be optimized with effort
  159.     ;   jg      .loop23_done
  160.     ;   cmp     .x3,SIZE_X
  161.     ;   jg      .loop23_done    ; {
  162.  
  163.  
  164.        mov      bx,.y2       ; calc delta 12
  165.        sub      bx,.y1
  166.        jnz      .bt_dx12_make
  167.        mov      ecx,6
  168.        xor      edx,edx
  169.      @@:
  170.        push     edx   ;dword 0
  171.        loop     @b
  172.        jmp      .bt_dx12_done
  173.  .bt_dx12_make:
  174.        mov      ax,.x2
  175.        sub      ax,.x1
  176.        cwde
  177.        movsx    ebx,bx
  178.        shl      eax,ROUND
  179.        cdq
  180.        idiv     ebx
  181. ;      mov      .dx12,eax
  182.        push      eax
  183.  
  184. if Ext=SSE
  185.  
  186.        sub       esp,16
  187.        cvtsi2ss  xmm3,ebx            ;rcps
  188.     ;   mov       eax,255
  189.        cvtsi2ss  xmm4,[i255d] ;eax
  190.        divss     xmm3,xmm4
  191.        rcpss     xmm3,xmm3
  192.     ;   mulss     xmm3,xmm4
  193.        shufps    xmm3,xmm3,0
  194.  
  195.        movd      mm0,[.b_x1]
  196.        movd      mm1,[.b_x2]
  197.        movd      mm2,[.e_x1]
  198.        movd      mm3,[.e_x2]
  199.      ;  psubsw    mm3,mm2
  200.      ;  psubsw    mm1,mm0
  201.        pxor      mm4,mm4
  202.        punpcklwd mm0,mm4
  203.        punpcklwd mm1,mm4
  204.        punpcklwd mm2,mm4
  205.        punpcklwd mm3,mm4
  206.    ;    pslld     mm0,ROUND
  207.    ;    pslld     mm1,ROUND
  208.    ;    pslld     mm2,ROUND
  209.    ;    pslld     mm3,ROUND
  210.        cvtpi2ps  xmm0,mm0
  211.        movlhps   xmm0,xmm0
  212.        cvtpi2ps  xmm0,mm2
  213.        cvtpi2ps  xmm1,mm1
  214.        movlhps   xmm1,xmm1
  215.        cvtpi2ps  xmm1,mm3
  216.        subps     xmm1,xmm0
  217.  
  218.      ;  pxor      mm4,mm4
  219.      ;  movq      mm5,mm1
  220.      ;  movq      mm6,mm1
  221.      ;  pcmpeqb   mm5,mm4
  222. ;       psubd     mm1,mm0
  223. ;       psubd     mm3,mm2
  224.  
  225.     ;   movq      mm0,[.b_x1]      ; bx1  by1   bx2    by2
  226.     ;   movq      mm1,[.e_x1]      ; ex1  ey1   ex2    ey2
  227.     ;   pxor
  228.     ;   punpcklhd mm0,mm1   ; lwd  ;
  229.     ;   psubw     mm1,mm0   ; mm1, mm0
  230.     ;   pxor      mm2,mm2
  231.   ;     pmovmaskb eax,mm1
  232.   ;     and       eax,10101010b
  233.     ;   pcmpgtw   mm2,mm1
  234.     ;   punpcklwd mm1,mm2
  235.  ;      psllw     mm0,ROUND
  236.  ;      psllw     mm1,ROUND
  237.  ;      movq      mm2,mm0
  238.  ;      psrlq     mm0,32
  239.  
  240. ;       cvtpi2ps  xmm0,mm1
  241. ;       movlhps   xmm0,xmm0
  242. ;       cvtpi2ps  xmm0,mm3
  243.   ;     divps     xmm1,xmm3
  244.        mulps     xmm1,xmm3
  245.        shufps    xmm1,xmm1,10110001b
  246.        cvtps2pi  mm0,xmm1          ; mm0 -> 2 delta dwords
  247.        movhlps   xmm1,xmm1
  248.        cvtps2pi  mm1,xmm1
  249.        movq      .dey12q,mm0
  250.        movq      .dby12q,mm1
  251.  
  252. ;       movd      .dex12,mm0
  253. ;       psrlq     mm0,32
  254. ;       movd      .dey12,mm0
  255. ;       movhlps   xmm1,xmm1
  256. ;       cvtps2pi  mm0,xmm1
  257. ;       movd      .dbx12,mm0
  258. ;       psrlq     mm0,32
  259. ;       movd      .dby12,mm0
  260.  
  261. else
  262.        mov      ax,word[.b_x2]
  263.        sub      ax,word[.b_x1]
  264.        cwde
  265.        shl      eax,ROUND
  266.        cdq
  267.        idiv     ebx
  268.  ;     mov      .dbx12,eax
  269.        push      eax
  270.  
  271.        mov      ax,word[.b_y2]
  272.        sub      ax,word[.b_y1]
  273.        cwde
  274.        shl      eax,ROUND
  275.        cdq
  276.        idiv     ebx
  277.  ;     mov      .dby12,eax
  278.        push      eax
  279.  
  280.  ;     mov       eax,.dbx12
  281.  ;     mov       ebx,.dby12
  282.  ;     int3
  283.  
  284.        mov      ax,word[.e_x2]
  285.        sub      ax,word[.e_x1]
  286.        cwde
  287.        shl      eax,ROUND
  288.        cdq
  289.        idiv     ebx
  290.  ;      mov      .dex12,eax
  291.        push      eax
  292.  
  293.        mov      ax,word[.e_y2]
  294.        sub      ax,word[.e_y1]
  295.        cwde
  296.        shl      eax,ROUND
  297.        cdq
  298.        idiv     ebx
  299.  ;      mov      .dey12,eax
  300.        push      eax
  301.  
  302. end if
  303.         mov     ax,.z2
  304.         sub     ax,.z1
  305.         cwde
  306.         shl     eax,CATMULL_SHIFT
  307.         cdq
  308.         idiv    ebx
  309.         push    eax
  310.    .bt_dx12_done:
  311.  
  312.        mov      bx,.y3       ; calc delta13
  313.        sub      bx,.y1
  314.        jnz      .bt_dx13_make
  315.        mov      ecx,6
  316.        xor      edx,edx
  317.      @@:
  318.        push     edx   ;dword 0
  319.        loop     @b
  320.        jmp      .bt_dx13_done
  321.  .bt_dx13_make:
  322.        mov      ax,.x3
  323.        sub      ax,.x1
  324.        cwde
  325.        movsx    ebx,bx
  326.        shl      eax,ROUND
  327.        cdq
  328.        idiv     ebx
  329.  ;      mov      .dx13,eax
  330.        push      eax
  331.  
  332. if Ext=SSE
  333.  
  334.        cvtsi2ss  xmm3,ebx
  335.   ;     mov       eax,255
  336.        cvtsi2ss  xmm4,[i255d]
  337.        divss     xmm3,xmm4
  338.        rcpss     xmm3,xmm3
  339. ;       mulss     xmm3,xmm4
  340.        shufps    xmm3,xmm3,0
  341.        sub       esp,16
  342.  
  343.        movd      mm0,[.b_x1]
  344.        movd      mm1,[.b_x3]
  345.        movd      mm2,[.e_x1]
  346.        movd      mm3,[.e_x3]
  347.  
  348.        pxor      mm4,mm4
  349.        punpcklwd mm0,mm4
  350.        punpcklwd mm1,mm4
  351.        punpcklwd mm2,mm4
  352.        punpcklwd mm3,mm4
  353.  
  354.        cvtpi2ps  xmm0,mm0
  355.        movlhps   xmm0,xmm0
  356.        cvtpi2ps  xmm0,mm2
  357.        cvtpi2ps  xmm1,mm1
  358.        movlhps   xmm1,xmm1
  359.        cvtpi2ps  xmm1,mm3
  360.        subps     xmm1,xmm0
  361.  
  362.    ;    divps     xmm1,xmm3
  363.        mulps     xmm1,xmm3
  364.        shufps    xmm1,xmm1,10110001b
  365.        cvtps2pi  mm0,xmm1          ; mm0 -> 2 delta dwords
  366.        movhlps   xmm1,xmm1
  367.        cvtps2pi  mm1,xmm1
  368.        movq      .dey13q,mm0
  369.        movq      .dby13q,mm1
  370.  
  371. else
  372.  
  373.        mov      ax,word[.b_x3]
  374.        sub      ax,word[.b_x1]
  375.        cwde
  376.        shl      eax,ROUND
  377.        cdq
  378.        idiv     ebx
  379.  ;      mov      .dbx13,eax
  380.        push      eax
  381.  
  382.        mov      ax,word[.b_y3]
  383.        sub      ax,word[.b_y1]
  384.        cwde
  385.        shl      eax,ROUND
  386.        cdq
  387.        idiv     ebx
  388.  ;      mov      .dby13,eax
  389.        push      eax
  390.  
  391.        mov      ax,word[.e_x3]
  392.        sub      ax,word[.e_x1]
  393.        cwde
  394.        shl      eax,ROUND
  395.        cdq
  396.        idiv     ebx
  397.  ;      mov      .dex13,eax
  398.        push      eax
  399.  
  400.        mov      ax,word[.e_y3]
  401.        sub      ax,word[.e_y1]
  402.        cwde
  403.        shl      eax,ROUND
  404.        cdq
  405.        idiv     ebx
  406.  ;      mov      .dey13,eax
  407.        push      eax
  408.  
  409. end if
  410.  
  411.        mov     ax,.z3
  412.        sub     ax,.z1
  413.        cwde
  414.        shl     eax,CATMULL_SHIFT
  415.        cdq
  416.        idiv    ebx
  417.   ;    mov    .dz13,eax
  418.        push    eax
  419.    .bt_dx13_done:
  420.  
  421.        mov      bx,.y3       ; calc delta23
  422.        sub      bx,.y2
  423.        jnz      .bt_dx23_make
  424.        mov      ecx,6
  425.        xor      edx,edx
  426.      @@:
  427.        push     edx   ;dword 0
  428.        loop     @b
  429.        jmp      .bt_dx23_done
  430.  .bt_dx23_make:
  431.        mov      ax,.x3
  432.        sub      ax,.x2
  433.        cwde
  434.        movsx    ebx,bx
  435.        shl      eax,ROUND
  436.        cdq
  437.        idiv     ebx
  438.  ;      mov      .dx23,eax
  439.        push      eax
  440.  
  441. if Ext=SSE
  442.  
  443.        cvtsi2ss  xmm3,ebx
  444.      ;  mov       eax,255
  445.        cvtsi2ss  xmm4,[i255d] ;eax
  446.        divss     xmm3,xmm4
  447.        shufps    xmm3,xmm3,0
  448.        sub       esp,16
  449.  
  450.        movd      mm0,[.b_x2]
  451.        movd      mm1,[.b_x3]
  452.        movd      mm2,[.e_x2]
  453.        movd      mm3,[.e_x3]
  454.  
  455.        pxor      mm4,mm4
  456.        punpcklwd mm0,mm4
  457.        punpcklwd mm1,mm4
  458.        punpcklwd mm2,mm4
  459.        punpcklwd mm3,mm4
  460.  
  461.        cvtpi2ps  xmm0,mm0
  462.        movlhps   xmm0,xmm0
  463.        cvtpi2ps  xmm0,mm2
  464.        cvtpi2ps  xmm1,mm1
  465.        movlhps   xmm1,xmm1
  466.        cvtpi2ps  xmm1,mm3
  467.        subps     xmm1,xmm0
  468.  
  469.        divps     xmm1,xmm3
  470.        shufps    xmm1,xmm1,10110001b
  471.        cvtps2pi  mm0,xmm1          ; mm0 -> 2 delta dwords
  472.        movhlps   xmm1,xmm1
  473.        cvtps2pi  mm1,xmm1
  474.        movq      .dey23q,mm0
  475.        movq      .dby23q,mm1
  476.  
  477. else
  478.  
  479.        mov      ax,word[.b_x3]
  480.        sub      ax,word[.b_x2]
  481.        cwde
  482.        shl      eax,ROUND
  483.        cdq
  484.        idiv     ebx
  485.  ;      mov      .dbx23,eax
  486.        push      eax
  487.  
  488.        mov      ax,word[.b_y3]
  489.        sub      ax,word[.b_y2]
  490.        cwde
  491.        shl      eax,ROUND
  492.        cdq
  493.        idiv     ebx
  494.  ;      mov      .dby23,eax
  495.        push      eax
  496.  
  497.        mov      ax,word[.e_x3]
  498.        sub      ax,word[.e_x2]
  499.        cwde
  500.        shl      eax,ROUND
  501.        cdq
  502.        idiv     ebx
  503.  ;      mov      .dex23,eax
  504.        push      eax
  505.  
  506.        mov      ax,word[.e_y3]
  507.        sub      ax,word[.e_y2]
  508.        cwde
  509.        shl      eax,ROUND
  510.        cdq
  511.        idiv     ebx
  512.  ;      mov      .dey23,eax
  513.        push      eax
  514. end if
  515.        mov     ax,.z3
  516.        sub     ax,.z2
  517.        cwde
  518.        shl     eax,CATMULL_SHIFT
  519.        cdq
  520.        idiv    ebx
  521.       ; mov     .dz23,eax
  522.        push    eax
  523.       ;  sub     esp,40
  524.    .bt_dx23_done:
  525.        movsx    eax,.x1
  526.        shl      eax,ROUND
  527.      ;  mov      .cx1,eax
  528.      ;  mov      .cx2,eax
  529.        push     eax eax
  530.      ; push     eax
  531.  
  532.        movsx    eax,word[.b_x1]
  533.        shl      eax,ROUND
  534.        mov      .cbx1,eax
  535.        mov      .cbx2,eax
  536.      ;  push     eax eax
  537.      ; push     eax
  538.  
  539.        movsx    eax,word[.b_y1]
  540.        shl      eax,ROUND
  541.        mov      .cby1,eax
  542.        mov      .cby2,eax
  543.      ;  push     eax eax
  544.      ; push     eax
  545.  
  546.        movsx    eax,word[.e_x1]
  547.        shl      eax,ROUND
  548.        mov      .cex1,eax
  549.        mov      .cex2,eax
  550.       ; push     eax eax
  551.       ;push     eax
  552.  
  553.        movsx    eax,word[.e_y1]
  554.        shl      eax,ROUND
  555.        mov      .cey1,eax
  556.        mov      .cey2,eax
  557.        sub      esp,32
  558.       ; push     eax eax
  559.       ;push     eax
  560.  
  561.        movsx    eax,.z1
  562.        shl      eax,CATMULL_SHIFT
  563.       ; mov      .cz1,eax
  564.       ; mov      .cz2,eax
  565.       push     eax eax
  566.       ;push     eax
  567.  
  568.        movsx    ecx,.y1
  569.        cmp      cx,.y2
  570.        jge      .loop12_done
  571.   .loop12:
  572.        call     .call_line
  573.  
  574.        mov      eax,.dx13
  575.        add      .cx1,eax
  576.        mov      ebx,.dx12
  577.        add      .cx2,ebx
  578. if Ext>= SSE2
  579.        movups   xmm0,.cey1
  580.        movups   xmm1,.cey2
  581.        movups   xmm2,.dey12q
  582.        movups   xmm3,.dey13q
  583.        paddd    xmm0,xmm3
  584.        paddd    xmm1,xmm2
  585.        movups   .cey1,xmm0
  586.        movups   .cey2,xmm1
  587. else if (Ext = MMX) | (Ext=SSE)
  588.        movq     mm0,.cby2       ; with this optimization object
  589.        movq     mm1,.cby1       ; looks bit annoying
  590.        movq     mm2,.cey2
  591.        movq     mm3,.cey1
  592.        paddd    mm0,.dby12q
  593.        paddd    mm1,.dby13q
  594.        paddd    mm2,.dey12q
  595.        paddd    mm3,.dey13q
  596.        movq     .cby2,mm0
  597.        movq     .cby1,mm1
  598.        movq     .cey1,mm3
  599.        movq     .cey2,mm2
  600. else
  601.        mov      edx,.dbx13
  602.        add      .cbx1,edx
  603.        mov      eax,.dbx12
  604.        add      .cbx2,eax
  605.        mov      ebx,.dby13
  606.        add      .cby1,ebx
  607.        mov      edx,.dby12
  608.        add      .cby2,edx
  609.  
  610.        mov      eax,.dex13
  611.        add      .cex1,eax
  612.        mov      ebx,.dex12
  613.        add      .cex2,ebx
  614.        mov      edx,.dey13
  615.        add      .cey1,edx
  616.        mov      eax,.dey12
  617.        add      .cey2,eax
  618.  
  619. end if
  620.        mov      ebx,.dz13
  621.        add      .cz1,ebx
  622.        mov      edx,.dz12
  623.        add      .cz2,edx
  624.  
  625.        inc      ecx
  626.        cmp      cx,.y2
  627.        jl       .loop12
  628.     .loop12_done:
  629.  
  630.        movsx    ecx,.y2
  631.        cmp      cx,.y3
  632.        jge      .loop23_done
  633.  
  634.        movsx    eax,.z2
  635.        shl      eax,CATMULL_SHIFT
  636.        mov      .cz2,eax
  637.  
  638.        movsx    eax,.x2
  639.        shl      eax,ROUND
  640.        mov      .cx2,eax
  641.  
  642.        movzx    eax,word[.b_x2]
  643.        shl      eax,ROUND
  644.        mov      .cbx2,eax
  645.  
  646.        movzx    eax,word[.b_y2]
  647.        shl      eax,ROUND
  648.        mov      .cby2,eax
  649.  
  650.        movzx    eax,word[.e_x2]
  651.        shl      eax,ROUND
  652.        mov      .cex2,eax
  653.  
  654.        movzx    eax,word[.e_y2]
  655.        shl      eax,ROUND
  656.        mov      .cey2,eax
  657.  
  658.      .loop23:
  659.        call     .call_line
  660. ;if Ext = NON
  661.        mov      eax,.dx13
  662.        add      .cx1,eax
  663.        mov      ebx,.dx23
  664.        add      .cx2,ebx
  665. if Ext>= SSE2
  666.        movups   xmm0,.cey1
  667.        movups   xmm1,.cey2
  668.        movups   xmm2,.dey23q
  669.        movups   xmm3,.dey13q
  670.        paddd    xmm0,xmm3
  671.        paddd    xmm1,xmm2
  672.        movups   .cey1,xmm0
  673.        movups   .cey2,xmm1
  674. else if (Ext = MMX) | ( Ext = SSE)
  675.        movq     mm0,.cby2        ;    with this mmx optimization object looks bit
  676.        movq     mm1,.cby1        ;    annoying
  677.        movq     mm2,.cey2
  678.        movq     mm3,.cey1
  679.        paddd    mm0,.dby23q
  680.        paddd    mm1,.dby13q
  681.        paddd    mm2,.dey23q
  682.        paddd    mm3,.dey13q
  683.        movq     .cby2,mm0
  684.        movq     .cby1,mm1
  685.        movq     .cey2,mm2
  686.        movq     .cey1,mm3
  687.  
  688. else
  689.        mov      edx,.dbx13
  690.        add      .cbx1,edx
  691.        mov      eax,.dbx23
  692.        add      .cbx2,eax
  693.        mov      ebx,.dby13
  694.        add      .cby1,ebx
  695.        mov      edx,.dby23
  696.        add      .cby2,edx
  697.  
  698.        mov      eax,.dex13
  699.        add      .cex1,eax
  700.        mov      ebx,.dex23
  701.        add      .cex2,ebx
  702.        mov      edx,.dey13
  703.        add      .cey1,edx
  704.        mov      eax,.dey23
  705.        add      .cey2,eax
  706. end if
  707.  
  708.        mov      ebx,.dz13
  709.        add      .cz1,ebx
  710.        mov      edx,.dz23
  711.        add      .cz2,edx
  712. ;else
  713. ;       movq     mm0,.db13q
  714. ;       movq     mm1,.cbx1q
  715.  
  716.        inc      ecx
  717.        cmp      cx,.y3
  718.        jl       .loop23
  719.     .loop23_done:
  720.  
  721.        mov      esp,ebp
  722. ret   34
  723.  
  724. .call_line:
  725.  
  726.        pushad
  727.  
  728.        push     .cz1
  729.        push     .cz2
  730.        push     .z_buff
  731.        push     .t_bmap
  732.        push     .t_emap
  733.        push     dword .cey2
  734.        push     .cex2
  735.        push     dword .cey1
  736.        push     .cex1
  737.        push     dword .cby2
  738.        push     .cbx2
  739.        push     dword .cby1
  740.        push     .cbx1
  741.        push     ecx
  742.  
  743.        mov      eax,.cx1
  744.        sar      eax,ROUND
  745.        mov      ebx,.cx2
  746.        sar      ebx,ROUND
  747.  
  748.        call     two_tex_line_z
  749.  
  750.        popad
  751. ret
  752. two_tex_line_z:
  753. ;--------------in: eax - x1
  754. ;--------------    ebx - x2
  755. ;--------------    edi - pointer to screen buffer
  756. ;stack - another parameters :
  757. .y      equ dword [ebp+4]
  758. .bx1    equ  [ebp+8]   ;   ---
  759. .by1    equ  [ebp+12]  ;       |
  760. .bx2    equ  [ebp+16]  ;       |
  761. .by2    equ  [ebp+20]  ;       |>   b. texture and e. texture coords
  762. .ex1    equ  [ebp+24]  ;       |>   shifted shl ROUND
  763. .ey1    equ  [ebp+28]  ;       |
  764. .ex2    equ  [ebp+32]  ;       |
  765. .ey2    equ  [ebp+36]  ;   ---
  766. .emap   equ  [ebp+40]  ; b texture offset
  767. .bmap   equ  [ebp+44]  ; e texture offset
  768. .z_buff equ dword [ebp+48]
  769. .z2     equ dword [ebp+52]  ;   -- |>   z coords shifted
  770. .z1     equ dword [ebp+56]  ;   --       shl  CATMULL_SHIFT
  771.  
  772. .x1     equ dword [ebp-4]
  773. .x2     equ dword [ebp-8]
  774. .dbx    equ [ebp-12]
  775. .dex    equ [ebp-16]
  776. .dby    equ [ebp-20]
  777. .dey    equ [ebp-24]
  778. .dz     equ dword [ebp-28]
  779. .cbx    equ [ebp-32]
  780. .cex    equ [ebp-36]
  781. .cby    equ [ebp-40]
  782. .cey    equ [ebp-44]
  783. .cz     equ dword [ebp-48]
  784. .czbuff equ dword [ebp-52]
  785.  
  786.         mov     ebp,esp
  787.  
  788.         mov     ecx,.y
  789.         or      ecx,ecx
  790.         jl      .bl_end
  791.         cmp     ecx,SIZE_Y
  792.         jge     .bl_end
  793.  
  794.         cmp     eax,ebx
  795.         jl      @f
  796.         je      .bl_end
  797.  
  798.         xchg    eax,ebx
  799. if Ext=NON
  800.         mov     edx,.bx1
  801.         xchg    edx,.bx2
  802.         mov     .bx1,edx
  803.         mov     edx,.by1
  804.         xchg    edx,.by2
  805.         mov     .by1,edx
  806.  
  807.         mov     edx,.ex1
  808.         xchg    edx,.ex2
  809.         mov     .ex1,edx
  810.         mov     edx,.ey1
  811.         xchg    edx,.ey2
  812.         mov     .ey1,edx
  813. else
  814.         movq    mm0,.bx1
  815.         movq    mm1,.ex1
  816.         movq    mm2,.bx2
  817.         movq    mm3,.ex2
  818.         movq    .bx2,mm0
  819.         movq    .ex2,mm1
  820.         movq    .bx1,mm2
  821.         movq    .ex1,mm3
  822. end if
  823.         mov     edx,.z1
  824.         xchg    edx,.z2
  825.         mov     .z1,edx
  826.     @@:
  827.         push    eax ebx
  828. ;        push    ebx           ;store x1, x2
  829.  
  830.         cmp     .x1,SIZE_X
  831.         jge     .bl_end
  832.         cmp     .x2,0
  833.         jle     .bl_end
  834.  
  835.         mov     ebx,.x2
  836.         sub     ebx,.x1
  837.  
  838. if Ext>=SSE
  839.  
  840.        sub       esp,16
  841.        cvtsi2ss  xmm3,ebx            ;rcps
  842.        shufps    xmm3,xmm3,0
  843.  
  844.   ;     movq      mm0,.bx1q
  845.   ;     movq      mm1,.bx2q
  846.   ;     movq      mm2,.ex1q
  847.   ;     movq      mm3,.ex2q
  848.   ;     psubd     mm1,mm0
  849.   ;     psubd     mm3,mm2
  850.   ;     cvtpi2ps  xmm1,mm1
  851.   ;     movlhps   xmm1,xmm1
  852.   ;     cvtpi2ps  xmm1,mm3
  853.  
  854.        cvtpi2ps  xmm0,.bx1 ;mm0     ; bx1; by1
  855.        movlhps   xmm0,xmm0
  856.        cvtpi2ps  xmm0,.ex1 ;mm2     ; ex1; ey1
  857.        cvtpi2ps  xmm1,.bx2 ;mm1     ; bx2; by2
  858.        movlhps   xmm1,xmm1
  859.        cvtpi2ps  xmm1,.ex2 ;mm3     ; ex2; ey2
  860.        subps     xmm1,xmm0
  861.                                     ; hi             lo
  862.        divps     xmm1,xmm3 ; xmm1 -> dby; dbx; dey; dex
  863.  
  864.        shufps    xmm1,xmm1,11011000b
  865.        cvtps2pi  mm0,xmm1          ; mm0 -> 2 delta dwords
  866.        movhlps   xmm1,xmm1
  867.        cvtps2pi  mm1,xmm1
  868.        movq      .dex,mm0 ; hi - lo  ->  dbx, dex
  869.        movq      .dey,mm1 ; hi - lo  ->  dby, dey
  870.  
  871. else
  872.  
  873.         mov     eax,.bx2       ; calc .dbx
  874.         sub     eax,.bx1
  875.         cdq
  876.         idiv    ebx
  877.         push    eax
  878.  
  879.         mov     eax,.ex2       ; calc .dby
  880.         sub     eax,.ex1
  881.         cdq
  882.         idiv    ebx
  883.         push    eax
  884.  
  885.         mov     eax,.by2       ; calc .dex
  886.         sub     eax,.by1
  887.         cdq
  888.         idiv    ebx
  889.         push    eax
  890.  
  891.         mov     eax,.ey2       ; calc .dey
  892.         sub     eax,.ey1
  893.         cdq
  894.         idiv    ebx
  895.         push    eax
  896.  
  897. end if
  898.  
  899.         mov     eax,.z2        ; calc .dz
  900.         sub     eax,.z1
  901.         cdq
  902.         idiv    ebx
  903.         push    eax
  904.  
  905.         cmp     .x1,0         ; set correctly begin variable
  906.         jge     @f            ; CLIPPING ON FUNCTION
  907.                               ; cutting triangle exceedes screen
  908.         mov     ebx,.x1
  909.         neg     ebx
  910.         imul    ebx           ; eax = .dz * abs(.x1)
  911.         add     .z1,eax
  912.         mov     .x1,0
  913.  
  914.         mov     eax,.dbx
  915.         imul    ebx
  916.         add    .bx1,eax
  917.  
  918.         mov     eax,.dby
  919.         imul    ebx
  920.         add     .by1,eax
  921.  
  922.         mov     eax,.dex
  923.         imul    ebx
  924.         add     .ex1,eax
  925.  
  926.         mov     eax,.dey
  927.         imul    ebx
  928.         add     .ey1,eax
  929.       @@:
  930.         cmp     .x2,SIZE_X
  931.         jl      @f
  932.         mov     .x2,SIZE_X
  933.       @@:
  934.         mov     eax,SIZE_X       ;calc memory begin in buffers
  935.         mov     ebx,.y
  936.         mul     ebx
  937.         mov     ebx,.x1
  938.         add     eax,ebx
  939.         mov     ebx,eax
  940.         lea     eax,[eax*3]
  941.         add     edi,eax           ; edi - screen
  942.         mov     esi,.z_buff       ; z-buffer filled with dd variables
  943.         shl     ebx,2
  944.         add     esi,ebx           ; esi - Z buffer
  945.  
  946.         mov     ecx,.x2
  947.         sub     ecx,.x1
  948.         ; init current variables
  949.         push    dword .bx1 ;.by1 .ex1 .ey1 .z1 esi
  950.         push    dword .ex1
  951.         push    dword .by1
  952.         push    dword .ey1
  953.  
  954.         push    .z1              ; current z shl CATMULL_SHIFT
  955.         push    esi
  956.  
  957. if Ext >= MMX
  958.      pxor   mm0,mm0
  959.      movq   mm3,.cex   ; hi - lo -> cbx; cex
  960.      movq   mm4,.cey   ; hi - lo -> cby; cey
  961. ;     movq   mm5,mm3
  962. ;     movq   mm6,mm4
  963. ;     psrad  mm5,ROUND
  964. ;     psrad  mm6,ROUND
  965. ;     movq   .ceyq,mm5
  966. ;     movq   .cbyq,mm6
  967.      mov    edx,.czbuff
  968. else
  969.      cld
  970. end if
  971.      .draw:
  972.     ; if TEX = SHIFTING   ;bump drawing only in shifting mode
  973. if Ext=NON
  974.         mov     esi,.czbuff      ; .czbuff current address in buffer
  975.         mov     ebx,.cz          ; .cz - cur z position
  976.         cmp     ebx,dword[esi]
  977. else
  978.         mov     ebx,.cz
  979.         cmp     ebx,dword[edx]
  980. end if
  981.         jge     .skip
  982.  
  983. if Ext=NON
  984.         mov     eax,.cby
  985.         mov     esi,.cbx
  986.         sar     eax,ROUND
  987.         sar     esi,ROUND
  988.         shl     eax,TEX_SHIFT   ;-
  989.         add     esi,eax
  990.         lea     esi,[esi*3]         ;-  ; esi - current b. texture addres
  991.         add     esi,.bmap
  992.  
  993.         mov     ebx,.cex       ;.cex - current env map X
  994.         mov     eax,.cey       ;.cey - current  env map y
  995.         sar     ebx,ROUND
  996.         sar     eax,ROUND
  997.  
  998.         shl     eax,TEX_SHIFT
  999.         add     ebx,eax
  1000.         lea     ebx,[ebx*3]
  1001.         add     ebx,.emap
  1002.  
  1003.  
  1004. else
  1005.         movq    mm5,mm4 ;.cey
  1006.         psrad   mm5,ROUND
  1007.         pslld   mm5,TEX_SHIFT
  1008.         movq    mm6,mm3 ;.cex
  1009.         psrad   mm6,ROUND
  1010.         paddd   mm5,mm6
  1011.         movq    mm6,mm5
  1012.         paddd   mm5,mm5
  1013.         paddd   mm5,mm6
  1014.         paddd   mm5,.emap
  1015.         movd    esi,mm5
  1016.         psrlq   mm5,32
  1017.         movd    ebx,mm5
  1018. end if
  1019. if Ext>=MMX
  1020.         movd      mm1,[esi]
  1021.         movd      mm2,[ebx]
  1022.         punpcklbw mm1,mm0
  1023.         punpcklbw mm2,mm0
  1024.         pmullw    mm1,mm2
  1025.         psrlw     mm1,8
  1026.         packuswb  mm1,mm0
  1027.         movd      [edi],mm1
  1028.         mov       ebx,.cz
  1029.         mov       dword[edx],ebx
  1030. else
  1031.         cld                     ; esi - tex e.
  1032.         lodsb                   ; ebx - tex b.
  1033.         mov     dl,[ebx]
  1034.         mul     dl
  1035.         shr     ax,8
  1036.         stosb
  1037.         inc     ebx
  1038.         lodsb
  1039.         mov     dl,[ebx]
  1040.         mul     dl
  1041.         shr     ax,8
  1042.         stosb
  1043.         inc     ebx
  1044.         lodsb
  1045.         mov     dl,[ebx]
  1046.         mul     dl
  1047.         shr     ax,8
  1048.         stosb
  1049.         mov     ebx,.cz
  1050.         mov     esi,.czbuff
  1051.         mov     dword[esi],ebx
  1052.         jmp     .no_skip
  1053. end if
  1054.      .skip:
  1055.         add     edi,3
  1056.  
  1057.    if Ext = NON
  1058.      .no_skip:
  1059.         add     .czbuff,4
  1060.         mov     eax,.dbx
  1061.         add     .cbx,eax
  1062.         mov     eax,.dby
  1063.         add     .cby,eax
  1064.         mov     eax,.dex
  1065.         add     .cex,eax
  1066.         mov     eax,.dey
  1067.         add     .cey,eax
  1068.     else
  1069.         add     edx,4
  1070.         paddd   mm3,.dex
  1071.         paddd   mm4,.dey
  1072.   ;      movq    mm5,mm3
  1073.   ;      movq    mm6,mm4
  1074.   ;      psrad   mm5,ROUND
  1075.   ;      psrad   mm6,ROUND
  1076.      ;   movq    .cex,mm3
  1077.      ;   movq    .cey,mm4
  1078.     end if
  1079.         mov     eax,.dz
  1080.         add     .cz,eax
  1081.     if Ext = NON
  1082.         dec     ecx
  1083.         jnz     .draw
  1084.     else
  1085.         loop    .draw
  1086.     end if
  1087.  
  1088.   .bl_end:
  1089.         mov     esp,ebp
  1090. ret 56
  1091.  
  1092.