Subversion Repositories Kolibri OS

Rev

Rev 6619 | 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.         mov     dx,word[size_y_var]
  792.         dec     dx
  793.         cmp     cx,dx   ;word[size_y_var]  ;SIZE_Y
  794.         jge     .bl_end
  795.  
  796.         cmp     eax,ebx
  797.         jl      @f
  798.         je      .bl_end
  799.  
  800.         xchg    eax,ebx
  801. if Ext=NON
  802.         mov     edx,.bx1
  803.         xchg    edx,.bx2
  804.         mov     .bx1,edx
  805.         mov     edx,.by1
  806.         xchg    edx,.by2
  807.         mov     .by1,edx
  808.  
  809.         mov     edx,.ex1
  810.         xchg    edx,.ex2
  811.         mov     .ex1,edx
  812.         mov     edx,.ey1
  813.         xchg    edx,.ey2
  814.         mov     .ey1,edx
  815. else
  816.         movq    mm0,.bx1
  817.         movq    mm1,.ex1
  818.         movq    mm2,.bx2
  819.         movq    mm3,.ex2
  820.         movq    .bx2,mm0
  821.         movq    .ex2,mm1
  822.         movq    .bx1,mm2
  823.         movq    .ex1,mm3
  824. end if
  825.         mov     edx,.z1
  826.         xchg    edx,.z2
  827.         mov     .z1,edx
  828.     @@:
  829.         push    eax ebx    ;store x1, x2
  830.         mov     ebx,.x1
  831.         movzx   edx,word[size_x_var]
  832.         dec     edx
  833.         cmp     ebx,edx
  834.   ;      cmp     bx,word[size_x_var]  ;SIZE_X
  835.         jg      .bl_end
  836.         cmp     .x2,0
  837.         jle     .bl_end
  838.  
  839.         mov     ebx,.x2
  840.         sub     ebx,.x1
  841.  
  842. if  Ext >= SSE
  843.  
  844.        sub       esp,16
  845.        cvtsi2ss  xmm3,ebx            ;rcps
  846.        shufps    xmm3,xmm3,0
  847.  
  848.   ;     movq      mm0,.bx1q
  849.   ;     movq      mm1,.bx2q
  850.   ;     movq      mm2,.ex1q
  851.   ;     movq      mm3,.ex2q
  852.   ;     psubd     mm1,mm0
  853.   ;     psubd     mm3,mm2
  854.   ;     cvtpi2ps  xmm1,mm1
  855.   ;     movlhps   xmm1,xmm1
  856.   ;     cvtpi2ps  xmm1,mm3
  857.  
  858.        cvtpi2ps  xmm0,.bx1 ;mm0     ; bx1; by1
  859.        movlhps   xmm0,xmm0
  860.        cvtpi2ps  xmm0,.ex1 ;mm2     ; ex1; ey1
  861.        cvtpi2ps  xmm1,.bx2 ;mm1     ; bx2; by2
  862.        movlhps   xmm1,xmm1
  863.        cvtpi2ps  xmm1,.ex2 ;mm3     ; ex2; ey2
  864.        subps     xmm1,xmm0
  865.                                     ; hi             lo
  866.        divps     xmm1,xmm3 ; xmm1 -> dby; dbx; dey; dex
  867.  
  868.        shufps    xmm1,xmm1,11011000b
  869.        cvtps2pi  mm0,xmm1          ; mm0 -> 2 delta dwords
  870.        movhlps   xmm1,xmm1
  871.        cvtps2pi  mm1,xmm1
  872.        movq      .dex,mm0 ; hi - lo  ->  dbx, dex
  873.        movq      .dey,mm1 ; hi - lo  ->  dby, dey
  874.  
  875. else
  876.  
  877.         mov     eax,.bx2       ; calc .dbx
  878.         sub     eax,.bx1
  879.         cdq
  880.         idiv    ebx
  881.         push    eax
  882.  
  883.         mov     eax,.ex2       ; calc .dby
  884.         sub     eax,.ex1
  885.         cdq
  886.         idiv    ebx
  887.         push    eax
  888.  
  889.         mov     eax,.by2       ; calc .dex
  890.         sub     eax,.by1
  891.         cdq
  892.         idiv    ebx
  893.         push    eax
  894.  
  895.         mov     eax,.ey2       ; calc .dey
  896.         sub     eax,.ey1
  897.         cdq
  898.         idiv    ebx
  899.         push    eax
  900.  
  901. end if
  902.  
  903.         mov     eax,.z2        ; calc .dz
  904.         sub     eax,.z1
  905.         cdq
  906.         idiv    ebx
  907.         push    eax
  908.  
  909.         cmp     .x1,0         ; set correctly begin variable
  910.         jge     @f            ; CLIPPING ON FUNCTION
  911.                               ; cutting triangle exceedes screen
  912.         mov     ebx,.x1
  913.         neg     ebx
  914.         imul    ebx           ; eax = .dz * abs(.x1)
  915.         add     .z1,eax
  916.         mov     .x1,0
  917.  
  918.         mov     eax,.dbx
  919.         imul    ebx
  920.         add    .bx1,eax
  921.  
  922.         mov     eax,.dby
  923.         imul    ebx
  924.         add     .by1,eax
  925.  
  926.         mov     eax,.dex
  927.         imul    ebx
  928.         add     .ex1,eax
  929.  
  930.         mov     eax,.dey
  931.         imul    ebx
  932.         add     .ey1,eax
  933.       @@:
  934.         movzx   eax,word[size_x_var] ;SIZE_X  ;word[size_x_var]
  935.         mov     ebx,.x2
  936.         cmp     eax,ebx
  937.         jg      @f
  938.         mov     .x2,eax
  939.       @@:
  940.       ;  movd    mm0,eax
  941.       ;  movd    mm1,.x2
  942.       ;  pminsw  mm0,mm1
  943.       ;  movd    .x2,mm0
  944.  ;       cmp     .x2,SIZE_X  ;eax   |
  945.  ;       jl      @f                 |>       this dont work idk cause
  946.  ;       mov     .x2,SIZE_X ;eax    |
  947.       @@:
  948.       ;  movzx   eax,word[size_x_var]       ;calc memory begin in buffers
  949.         mov     ebx,.y
  950.         mul     ebx
  951.         mov     ebx,.x1
  952.         add     eax,ebx
  953.         mov     ebx,eax
  954.         lea     eax,[eax*3]
  955.         add     edi,eax           ; edi - screen
  956.         mov     esi,.z_buff       ; z-buffer filled with dd variables
  957.         shl     ebx,2
  958.         add     esi,ebx           ; esi - Z buffer
  959.  
  960.         mov     ecx,.x2
  961.         sub     ecx,.x1
  962.         ; init current variables
  963.         push    dword .bx1 ;.by1 .ex1 .ey1 .z1 esi
  964.         push    dword .ex1
  965.         push    dword .by1
  966.         push    dword .ey1
  967.  
  968.         push    .z1              ; current z shl CATMULL_SHIFT
  969.         push    esi
  970.  
  971. if Ext >= MMX
  972.      pxor   mm0,mm0
  973.      movq   mm3,.cex   ; hi - lo -> cbx; cex
  974.      movq   mm4,.cey   ; hi - lo -> cby; cey
  975. ;     movq   mm5,mm3
  976. ;     movq   mm6,mm4
  977. ;     psrad  mm5,ROUND
  978. ;     psrad  mm6,ROUND
  979. ;     movq   .ceyq,mm5
  980. ;     movq   .cbyq,mm6
  981.      mov    edx,.czbuff
  982. else
  983.      cld
  984. end if
  985.      .draw:
  986.     ; if TEX = SHIFTING   ;bump drawing only in shifting mode
  987. if Ext=NON
  988.         mov     esi,.czbuff      ; .czbuff current address in buffer
  989.         mov     ebx,.cz          ; .cz - cur z position
  990.         cmp     ebx,dword[esi]
  991. else
  992.         mov     ebx,.cz
  993.         cmp     ebx,dword[edx]
  994. end if
  995.         jge     .skip
  996.  
  997. if Ext=NON
  998.         mov     eax,.cby
  999.         mov     esi,.cbx
  1000.         sar     eax,ROUND
  1001.         sar     esi,ROUND
  1002.         shl     eax,TEX_SHIFT   ;-
  1003.         add     esi,eax
  1004.         lea     esi,[esi*3]         ;-  ; esi - current b. texture addres
  1005.         add     esi,.bmap
  1006.  
  1007.         mov     ebx,.cex       ;.cex - current env map X
  1008.         mov     eax,.cey       ;.cey - current  env map y
  1009.         sar     ebx,ROUND
  1010.         sar     eax,ROUND
  1011.  
  1012.         shl     eax,TEX_SHIFT
  1013.         add     ebx,eax
  1014.         lea     ebx,[ebx*3]
  1015.         add     ebx,.emap
  1016.  
  1017.  
  1018. else
  1019.         movq    mm5,mm4 ;.cey
  1020.         psrad   mm5,ROUND
  1021.         pslld   mm5,TEX_SHIFT
  1022.         movq    mm6,mm3 ;.cex
  1023.         psrad   mm6,ROUND
  1024.         paddd   mm5,mm6
  1025.         movq    mm6,mm5
  1026.         paddd   mm5,mm5
  1027.         paddd   mm5,mm6
  1028.         paddd   mm5,.emap
  1029.         movd    esi,mm5
  1030.         psrlq   mm5,32
  1031.         movd    ebx,mm5
  1032. end if
  1033. if Ext>=MMX
  1034.         movd      mm1,[esi]
  1035.         movd      mm2,[ebx]
  1036.         punpcklbw mm1,mm0
  1037.         punpcklbw mm2,mm0
  1038.         pmullw    mm1,mm2
  1039.         psrlw     mm1,8
  1040.         packuswb  mm1,mm0
  1041.         movd      [edi],mm1
  1042.         mov       ebx,.cz
  1043.         mov       dword[edx],ebx
  1044. else
  1045.         cld                     ; esi - tex e.
  1046.         lodsb                   ; ebx - tex b.
  1047.         mov     dl,[ebx]
  1048.         mul     dl
  1049.         shr     ax,8
  1050.         stosb
  1051.         inc     ebx
  1052.         lodsb
  1053.         mov     dl,[ebx]
  1054.         mul     dl
  1055.         shr     ax,8
  1056.         stosb
  1057.         inc     ebx
  1058.         lodsb
  1059.         mov     dl,[ebx]
  1060.         mul     dl
  1061.         shr     ax,8
  1062.         stosb
  1063.         mov     ebx,.cz
  1064.         mov     esi,.czbuff
  1065.         mov     dword[esi],ebx
  1066.         jmp     .no_skip
  1067. end if
  1068.      .skip:
  1069.         add     edi,3
  1070.  
  1071.    if Ext = NON
  1072.      .no_skip:
  1073.         add     .czbuff,4
  1074.         mov     eax,.dbx
  1075.         add     .cbx,eax
  1076.         mov     eax,.dby
  1077.         add     .cby,eax
  1078.         mov     eax,.dex
  1079.         add     .cex,eax
  1080.         mov     eax,.dey
  1081.         add     .cey,eax
  1082.     else
  1083.         add     edx,4
  1084.         paddd   mm3,.dex
  1085.         paddd   mm4,.dey
  1086.   ;      movq    mm5,mm3
  1087.   ;      movq    mm6,mm4
  1088.   ;      psrad   mm5,ROUND
  1089.   ;      psrad   mm6,ROUND
  1090.      ;   movq    .cex,mm3
  1091.      ;   movq    .cey,mm4
  1092.     end if
  1093.         mov     eax,.dz
  1094.         add     .cz,eax
  1095.     if Ext = NON
  1096.         dec     ecx
  1097.         jnz     .draw
  1098.     else
  1099.         loop    .draw
  1100.     end if
  1101.  
  1102.   .bl_end:
  1103.         mov     esp,ebp
  1104. ret 56
  1105.  
  1106.