Subversion Repositories Kolibri OS

Rev

Rev 2984 | Blame | Last modification | View Log | Download | RSS feed

  1.  
  2. ;CATMULL_SHIFT equ 8
  3. ;TEXTURE_SIZE EQU (TEX_X * TEX_Y)-1
  4. ;ROUND equ 8
  5. ;Ext = NON
  6. ;MMX = 1
  7. ;NON = 0
  8. ;------- Big thanks to Majuma (www.majuma.xt.pl) for absolutely great---
  9. ;------- DOS 13h mode demos --------------------------------------------
  10. ;------- Procedure draws bump triangle with texture, I use -------------
  11. ;--------Catmull Z-buffer algorithm- (Z coordinate interpolation)-------
  12. ;--------I calc texture pixel by this way: col1*col2/256 ---------------
  13. bump_tex_triangle_z:
  14. ;------------------in - eax - x1 shl 16 + y1 -----------
  15. ;---------------------- ebx - x2 shl 16 + y2 -----------
  16. ;---------------------- ecx - x3 shl 16 + y3 -----------
  17. ;---------------------- edx - pointer to bump map-------
  18. ;---------------------- esi - pointer to env map--------
  19. ;---------------------- edi - pointer to screen buffer--
  20. ;---------------------- stack : bump coordinates--------
  21. ;----------------------         environment coordinates-
  22. ;----------------------         Z position coordinates--
  23. ;----------------------         pointer to Z buffer-----
  24. ;----------------------         pointer to texture------
  25. ;----------------------         texture coordinates-----
  26. ;-- Z-buffer - filled with coordinates as dword --------
  27. ;-- (Z coor. as word) shl CATMULL_SHIFT ----------------
  28. .b_x1   equ ebp+4   ; procedure don't save registers !!!
  29. .b_y1   equ ebp+6   ; each coordinate as word
  30. .b_x2   equ ebp+8
  31. .b_y2   equ ebp+10       ; b - bump map coords
  32. .b_x3   equ ebp+12       ; e - env map coords
  33. .b_y3   equ ebp+14
  34. .e_x1   equ ebp+16
  35. .e_y1   equ ebp+18
  36. .e_x2   equ ebp+20
  37. .e_y2   equ ebp+22
  38. .e_x3   equ ebp+24
  39. .e_y3   equ ebp+26
  40. .z1     equ word[ebp+28]
  41. .z2     equ word[ebp+30]
  42. .z3     equ word[ebp+32]
  43. .z_buff equ dword[ebp+34]       ; pointer to Z-buffer
  44. .tex_ptr equ dword[ebp+38]      ; ptr to texture
  45. .t_x1   equ ebp+42              ; texture coords
  46. .t_y1   equ ebp+44
  47. .t_x2   equ ebp+46
  48. .t_y2   equ ebp+48
  49. .t_x3   equ ebp+50
  50. .t_y3   equ ebp+52
  51.  
  52.  
  53.  
  54. .t_bmap equ dword[ebp-4]        ; pointer to bump map
  55. .t_emap equ dword[ebp-8]        ; pointer to env map
  56. .x1     equ word[ebp-10]
  57. .y1     equ word[ebp-12]
  58. .x2     equ word[ebp-14]
  59. .y2     equ word[ebp-16]
  60. .x3     equ word[ebp-18]
  61. .y3     equ word[ebp-20]
  62.  
  63. if 0 ;Ext <= SSE2
  64.  
  65. .dx12   equ dword[edi-4]
  66. .dz12   equ      [edi-8]
  67. .dbx12  equ dword[edi-12]
  68. .dby12  equ      [edi-16]
  69. .dex12  equ dword[edi-20]
  70. .dey12  equ      [edi-24]
  71. .dtx12  equ dword[edi-28]
  72. .dty12  equ      [edi-32]
  73.  
  74. .dx13  equ dword[ebp-52-4*1]
  75. .dz13  equ      [ebp-52-4*2]
  76. .dbx13 equ dword[ebp-52-4*3]
  77. .dby13 equ      [ebp-52-4*4]
  78. .dex13 equ dword[ebp-52-4*5]
  79. .dey13 equ      [ebp-52-4*6]
  80. .dtx13 equ dword[ebp-52-4*7]
  81. .dty13 equ      [ebp-52-4*8]
  82.  
  83.  
  84. .dx23  equ dword[ebp-(52+4*9)]
  85. .dz23  equ      [ebp-(52+4*10)]
  86. .dbx23 equ dword[ebp-(52+4*11)]
  87. .dby23 equ      [ebp-(52+4*12)]
  88. .dex23 equ dword[ebp-(52+4*13)]
  89. .dey23 equ      [ebp-(52+4*14)]
  90. .dtx23 equ dword[ebp-(52+4*15)]
  91. .dty23 equ      [ebp-(52+4*16)]
  92.  
  93. else
  94.  
  95. .dx12   equ dword[ebp-24]
  96. .dz12   equ      [ebp-28]
  97. .dbx12  equ dword[ebp-32]
  98. .dby12  equ      [ebp-36]
  99. .dex12  equ dword[ebp-40]
  100. .dey12  equ      [ebp-44]
  101. .dtx12  equ dword[ebp-48]
  102. .dty12  equ      [ebp-52]
  103.  
  104. .dx13  equ dword[ebp-52-4*1]
  105. .dz13  equ      [ebp-52-4*2]
  106. .dbx13 equ dword[ebp-52-4*3]
  107. .dby13 equ      [ebp-52-4*4]
  108. .dex13 equ dword[ebp-52-4*5]
  109. .dey13 equ      [ebp-52-4*6]
  110. .dtx13 equ dword[ebp-52-4*7]
  111. .dty13 equ      [ebp-52-4*8]
  112.  
  113.  
  114. .dx23  equ dword[ebp-(52+4*9)]
  115. .dz23  equ      [ebp-(52+4*10)]
  116. .dbx23 equ dword[ebp-(52+4*11)]
  117. .dby23 equ      [ebp-(52+4*12)]
  118. .dex23 equ dword[ebp-(52+4*13)]
  119. .dey23 equ      [ebp-(52+4*14)]
  120. .dtx23 equ dword[ebp-(52+4*15)]
  121. .dty23 equ      [ebp-(52+4*16)]
  122.  
  123. end if
  124.  
  125. if Ext < SSE
  126.  
  127. .cx1   equ dword[ebp-(52+4*17)]         ; current variables
  128. .cz1   equ      [ebp-(52+4*18)]
  129. .cx2   equ dword[ebp-(52+4*19)]
  130. .cz2   equ      [ebp-(52+4*20)]
  131. .cbx1  equ dword[ebp-(52+4*21)]
  132. .cby1  equ      [ebp-(52+4*22)]
  133. .cbx2  equ dword[ebp-(52+4*23)]
  134. .cby2  equ      [ebp-(52+4*24)]
  135. .cex1  equ dword[ebp-(52+4*25)]
  136. .cey1  equ      [ebp-(52+4*26)]
  137. .cex2  equ dword[ebp-(52+4*27)]
  138. .cey2  equ      [ebp-(52+4*28)]
  139.  
  140. .ctx1  equ dword[ebp-(52+4*29)]
  141. .cty1  equ      [ebp-(52+4*30)]
  142. .ctx2  equ dword[ebp-(52+4*31)]
  143. .cty2  equ      [ebp-(52+4*32)]
  144.  
  145. else
  146.  
  147. .cx1   equ dword[ebp-(52+4*17)]         ; current variables
  148. .cz1   equ      [ebp-(52+4*18)]
  149. .cbx1  equ dword[ebp-(52+4*19)]
  150. .cby1  equ      [ebp-(52+4*20)]
  151. .cex1  equ dword[ebp-(52+4*21)]
  152. .cey1  equ      [ebp-(52+4*22)]
  153. .ctx1  equ dword[ebp-(52+4*23)]
  154. .cty1  equ      [ebp-(52+4*24)]
  155.  
  156. .cx2   equ dword[ebp-(52+4*25)]
  157. .cz2   equ      [ebp-(52+4*26)]
  158. .cbx2  equ dword[ebp-(52+4*27)]
  159. .cby2  equ      [ebp-(52+4*28)]
  160. .cex2  equ dword[ebp-(52+4*29)]
  161. .cey2  equ      [ebp-(52+4*30)]
  162. .ctx2  equ dword[ebp-(52+4*31)]
  163. .cty2  equ      [ebp-(52+4*32)]
  164.  
  165. end if
  166.        cld
  167.        mov     ebp,esp
  168.        push    edx        ; store bump map
  169.        push    esi        ; store e. map
  170.      ; sub     esp,120
  171.  .sort3:                  ; sort triangle coordinates...
  172.        cmp     ax,bx
  173.        jle     .sort1
  174.        xchg    eax,ebx
  175.        mov     edx,dword[.b_x1]
  176.        xchg    edx,dword[.b_x2]
  177.        mov     dword[.b_x1],edx
  178.        mov     edx,dword[.e_x1]
  179.        xchg    edx,dword[.e_x2]
  180.        mov     dword[.e_x1],edx
  181.        mov     edx,dword[.t_x1]
  182.        xchg    edx,dword[.t_x2]
  183.        mov     dword[.t_x1],edx
  184.        mov     dx,.z1
  185.        xchg    dx,.z2
  186.        mov     .z1,dx
  187.  .sort1:
  188.        cmp      bx,cx
  189.        jle      .sort2
  190.        xchg     ebx,ecx
  191.        mov      edx,dword[.b_x2]
  192.        xchg     edx,dword[.b_x3]
  193.        mov      dword[.b_x2],edx
  194.        mov      edx,dword[.e_x2]
  195.        xchg     edx,dword[.e_x3]
  196.        mov      dword[.e_x2],edx
  197.        mov      edx,dword[.t_x2]
  198.        xchg     edx,dword[.t_x3]
  199.        mov      dword[.t_x2],edx
  200.        mov     dx,.z2
  201.        xchg    dx,.z3
  202.        mov     .z2,dx
  203.        jmp      .sort3
  204.  .sort2:
  205.        push     eax     ; store triangle coords in variables
  206.        push     ebx
  207.        push     ecx
  208.          mov      edx,80008000h  ; eax,ebx,ecx are ANDd together into edx which means that
  209.          and      edx,ebx        ; if *all* of them are negative a sign flag is raised
  210.          and      edx,ecx
  211.          and      edx,eax
  212.          test     edx,80008000h  ; Check both X&Y at once
  213.          jne      .loop23_done
  214.     ;   mov     edx,eax         ; eax,ebx,ecx are ORd together into edx which means that
  215.     ;   or      edx,ebx         ; if any *one* of them is negative a sign flag is raised
  216.     ;   or      edx,ecx
  217.     ;   test    edx,80000000h   ; Check only X
  218.     ;   jne     .loop23_done
  219.  
  220.     ;   cmp     .x1,SIZE_X    ; {
  221.     ;   jg      .loop23_done
  222.     ;   cmp     .x2,SIZE_X     ; This can be optimized with effort
  223.     ;   jg      .loop23_done
  224.     ;   cmp     .x3,SIZE_X
  225.     ;   jg      .loop23_done    ; {
  226.  
  227.  
  228.        mov      bx,.y2       ; calc delta 12
  229.        sub      bx,.y1
  230.        jnz      .bt_dx12_make
  231. if 0 ;Ext >= SSE2
  232.        pxor     xmm0,xmm0
  233.        movups   .dty12,xmm0
  234.        movups   .dey12,xmm0
  235.        sub      esp,16
  236. else
  237.        mov      ecx,8
  238.        xor      edx,edx
  239.      @@:
  240.        push     edx   ;dword 0
  241.        loop     @b
  242. end if
  243.        jmp      .bt_dx12_done
  244.  .bt_dx12_make:
  245.        movsx    ebx,bx
  246.  
  247.  
  248. if Ext>=SSE
  249.        sub       esp,32
  250.    ;    mov       eax,256
  251.        cvtsi2ss  xmm4,[i255d]
  252.        cvtsi2ss  xmm3,ebx ;rcps
  253. if 0 ;Ext >= SSE2
  254.        mov       edi,ebp
  255.        sub       edi,512
  256.        or        edi,0x0000000f
  257. end if
  258.        divss     xmm3,xmm4
  259.        shufps    xmm3,xmm3,0
  260.  
  261.        movd      mm0,[.b_x1]
  262.        movd      mm1,[.b_x2]
  263.        movd      mm2,[.e_x1]
  264.        movd      mm3,[.e_x2]
  265.  
  266.        pxor       mm4,mm4
  267.        punpcklwd  mm0,mm4
  268.        punpcklwd  mm1,mm4
  269.        punpcklwd  mm2,mm4
  270.        punpcklwd  mm3,mm4
  271.  
  272.        psubd      mm1,mm0
  273.        psubd      mm3,mm2
  274.  
  275.        cvtpi2ps  xmm1,mm1
  276.        movlhps   xmm1,xmm1
  277.        cvtpi2ps  xmm1,mm3
  278.  
  279.        divps     xmm1,xmm3   ;xmm1--> | dby | dbx | dey | dex |
  280.  
  281.        shufps    xmm1,xmm1,10110001b
  282.                              ;xmm1--> | dbx | dby | dex | dey |
  283. ;1       movups    .dey12,xmm1
  284.        cvtps2pi  mm0,xmm1 ;mm0,xmm1          ; mm0 -> 2 delta dwords
  285.        movhlps   xmm1,xmm1
  286.        cvtps2pi  mm1,xmm1 ;mm1,xmm1
  287.        movq      .dey12,mm0
  288.        movq      .dby12,mm1
  289. ;-------------
  290.   ;    pxor      mm0,mm0
  291.   ;    pxor      mm1,mm1
  292.    ;/   pinsrw    mm0,.z1,1
  293.    ;/   pinsrw    mm0,.x1,0
  294.    ;/   pinsrw    mm1,.z2,1
  295.    ;/   pinsrw    mm1,.x2,0
  296.        mov       ax,.z2
  297.        sub       ax,.z1
  298.        cwde
  299.  
  300.        mov      dx,.x2
  301.        sub      dx,.x1
  302.        movsx    edx,dx
  303.  
  304.    ;/    movd      mm1,eax
  305.  
  306.    ;/    punpcklwd  mm0,mm4
  307.    ;/    punpcklwd  mm1,mm4
  308.  
  309.   ;     cvtpi2ps   xmm1,mm1
  310.   ;     cvtpi2ps   xmm2,mm0
  311.   ;     subps      xmm1,xmm2
  312.  
  313.    ;/   psubd      mm1,mm0
  314.  
  315.        movd       mm2,[.t_x1]
  316.        movd       mm3,[.t_x2]
  317.  
  318.        punpcklwd  mm2,mm4
  319.        punpcklwd  mm3,mm4
  320.        psubd      mm3,mm2
  321.  
  322.    ;/  cvtpi2ps  xmm1,mm1
  323.        cvtsi2ss  xmm1,eax
  324.        movlhps   xmm1,xmm1
  325.        cvtsi2ss  xmm1,edx
  326.    ;    movss     xmm1,xmm4
  327.        shufps    xmm1,xmm1,00101111b
  328.        cvtpi2ps  xmm1,mm3
  329.  
  330.        divps     xmm1,xmm3   ; xmm1--> | dx | dz | dty | dtx |
  331.  
  332.        shufps    xmm1,xmm1,11100001b
  333.                              ; xmm1--> | dx | dz | dtx | dty |
  334. ;1       movlps    .dty12,xmm1
  335. ;1       movhps    .dz12,xmm1
  336.        cvtps2pi  mm0,xmm1    ; mm0 -> 2 delta dwords  | dtx | dty |
  337.        movhlps   xmm1,xmm1
  338.        cvtps2pi  mm1,xmm1
  339.        movq      .dty12,mm0
  340.        movq      .dz12,mm1
  341. ;----
  342. ;       mov       ax,.z2
  343. ;       sub       ax,.z1
  344. ;       cwde
  345. ;       mov       bx,.x2
  346. ;       sub       bx,.x1
  347. ;       movsx     ebx,bx
  348. ;       movd      mm1,eax
  349. ;       psllq     mm1,32
  350. ;       movd      mm1,ebx
  351.  
  352. ;;       push      ebx
  353. ;;       push      eax
  354. ;;       movq      mm1,[esp]
  355. ;;       add       esp,8
  356. ;;;       mov       ax,.z1
  357. ;;;       mov       bx,.z2
  358. ;;;       shl       eax,16
  359. ;;;       shl       ebx,16
  360. ;;;       mov       ax,.x1
  361. ;;;       mov       bx,.x2
  362. ;       movd       mm2,[.t_x1]
  363. ;       movd       mm3,[.t_x2]
  364. ;;       movd      mm0,eax
  365. ;;       movd      mm1,ebx
  366.  
  367. ;       pxor       mm4,mm4
  368. ;;       punpcklwd  mm0,mm4
  369. ;;       punpcklwd  mm1,mm4
  370. ;       punpcklwd  mm2,mm4
  371. ;       punpcklwd  mm3,mm4
  372.  
  373. ;;       psubd    mm1,mm0
  374. ;       psubd      mm3,mm2
  375.  
  376.  
  377. ;       cvtpi2ps  xmm1,mm1
  378. ;       movlhps   xmm1,xmm1
  379. ;       cvtpi2ps  xmm1,mm3
  380.  
  381. ;       divps     xmm1,xmm3   ; xmm1--> | dz | dx | dty | dtx |
  382.  
  383. ;       shufps    xmm1,xmm1,10110001b
  384.                              ; xmm1--> | dx | dz | dtx | dty |
  385. ;       cvtps2pi  mm0,xmm1    ; mm0 -> 2 delta dwords  | dtx | dty |
  386. ;       movhlps   xmm1,xmm1
  387. ;       cvtps2pi  mm1,xmm1    ; mm1 --> 2 delta dwords | dx | dz |
  388. ;       movq      .dty12,mm0
  389. ;       movq      .dz12,mm1
  390. else
  391.        mov      ax,.x2
  392.        sub      ax,.x1
  393.        cwde
  394.        shl      eax,ROUND
  395.        cdq
  396.        idiv     ebx
  397.  ;     mov      .dx12,eax
  398.        push      eax
  399.  
  400.        mov     ax,.z2
  401.        sub     ax,.z1
  402.        cwde
  403.        shl     eax,CATMULL_SHIFT
  404.        cdq
  405.        idiv    ebx
  406.        push    eax
  407.  
  408.        mov      ax,word[.b_x2]
  409.        sub      ax,word[.b_x1]
  410.        cwde
  411.        shl      eax,ROUND
  412.        cdq
  413.        idiv     ebx
  414.  ;     mov      .dbx12,eax
  415.        push      eax
  416.  
  417.        mov      ax,word[.b_y2]
  418.        sub      ax,word[.b_y1]
  419.        cwde
  420.        shl      eax,ROUND
  421.        cdq
  422.        idiv     ebx
  423.  ;     mov      .dby12,eax
  424.        push      eax
  425.  
  426.        mov      ax,word[.e_x2]
  427.        sub      ax,word[.e_x1]
  428.        cwde
  429.        shl      eax,ROUND
  430.        cdq
  431.        idiv     ebx
  432.  ;     mov      .dex12,eax
  433.        push      eax
  434.  
  435.        mov      ax,word[.e_y2]
  436.        sub      ax,word[.e_y1]
  437.        cwde
  438.        shl      eax,ROUND
  439.        cdq
  440.        idiv     ebx
  441.  ;     mov      .dey12,eax
  442.        push      eax
  443.  
  444.        mov      ax,word[.t_x2]
  445.        sub      ax,word[.t_x1]
  446.        cwde
  447.        shl      eax,ROUND
  448.        cdq
  449.        idiv     ebx
  450.  ;     mov      .dtx12,eax
  451.        push      eax
  452.  
  453.        mov      ax,word[.t_y2]
  454.        sub      ax,word[.t_y1]
  455.        cwde
  456.        shl      eax,ROUND
  457.        cdq
  458.        idiv     ebx
  459.  ;     mov      .dty12,eax
  460.        push      eax
  461. end if
  462.    .bt_dx12_done:
  463.  
  464.        mov      bx,.y3       ; calc delta13
  465.        sub      bx,.y1
  466.        jnz      .bt_dx13_make
  467.        mov      ecx,8
  468.        xor      edx,edx
  469.      @@:
  470.        push     edx   ;dword 0
  471.        loop     @b
  472.        jmp      .bt_dx13_done
  473.  .bt_dx13_make:
  474.        movsx    ebx,bx
  475.  
  476. if Ext>=SSE
  477.  
  478.        sub       esp,32
  479.    ;    mov       eax,256
  480.        cvtsi2ss  xmm4,[i255d]
  481.        cvtsi2ss  xmm3,ebx            ;rcps
  482.        divss     xmm3,xmm4
  483.        shufps    xmm3,xmm3,0
  484.  
  485.        movd      mm0,[.b_x1]
  486.        movd      mm1,[.b_x3]
  487.        movd      mm2,[.e_x1]
  488.        movd      mm3,[.e_x3]
  489.  
  490.        pxor       mm4,mm4
  491.        punpcklwd  mm0,mm4
  492.        punpcklwd  mm1,mm4
  493.        punpcklwd  mm2,mm4
  494.        punpcklwd  mm3,mm4
  495.  
  496.        psubd      mm1,mm0
  497.        psubd      mm3,mm2
  498.  
  499.        cvtpi2ps  xmm1,mm1
  500.        movlhps   xmm1,xmm1
  501.        cvtpi2ps  xmm1,mm3
  502.  
  503.        divps     xmm1,xmm3   ;xmm1--> | dby | dbx | dey | dex |
  504.  
  505.        shufps    xmm1,xmm1,10110001b
  506.                              ;xmm1--> | dbx | dby | dex | dey |
  507. ;1       movups    .dey13,xmm1
  508.  
  509.        cvtps2pi  mm0,xmm1 ;mm0,xmm1          ; mm0 -> 2 delta dwords
  510.        movhlps   xmm1,xmm1
  511.        cvtps2pi  mm1,xmm1 ;mm1,xmm1
  512.        movq      .dey13,mm0
  513.        movq      .dby13,mm1
  514.  
  515.        mov       ax,.z3
  516.        sub       ax,.z1
  517.        cwde
  518.  
  519.        mov      dx,.x3
  520.        sub      dx,.x1
  521.        movsx    edx,dx
  522.  
  523.        movd       mm2,[.t_x1]
  524.        movd       mm3,[.t_x3]
  525.  
  526.        punpcklwd  mm2,mm4
  527.        punpcklwd  mm3,mm4
  528.        psubd      mm3,mm2
  529.  
  530.        cvtsi2ss  xmm1,eax
  531.        movlhps   xmm1,xmm1
  532.        cvtsi2ss  xmm1,edx
  533.        shufps    xmm1,xmm1,00101111b
  534.        cvtpi2ps  xmm1,mm3
  535.  
  536.        divps     xmm1,xmm3   ; xmm1--> | dx | dz | dty | dtx |
  537.  
  538.        shufps    xmm1,xmm1,11100001b
  539.                              ; xmm1--> | dx | dz | dtx | dty |
  540. ;1       movlps    .dty13,xmm1
  541. ;1       movhps    .dz13,xmm1
  542.  
  543.        cvtps2pi  mm0,xmm1    ; mm0 -> 2 delta dwords  | dtx | dty |
  544.        movhlps   xmm1,xmm1
  545.        cvtps2pi  mm1,xmm1
  546.        movq      .dty13,mm0
  547.        movq      .dz13,mm1
  548.  
  549. else
  550.  
  551.        mov      ax,.x3
  552.        sub      ax,.x1
  553.        cwde
  554.        shl      eax,ROUND
  555.        cdq
  556.        idiv     ebx
  557.  ;     mov      .dx13,eax
  558.        push      eax
  559.  
  560.        mov     ax,.z3
  561.        sub     ax,.z1
  562.        cwde
  563.        shl     eax,CATMULL_SHIFT
  564.        cdq
  565.        idiv    ebx
  566.   ;    mov    .dz13,eax
  567.        push    eax
  568.  
  569.  
  570.        mov      ax,word[.b_x3]
  571.        sub      ax,word[.b_x1]
  572.        cwde
  573.        shl      eax,ROUND
  574.        cdq
  575.        idiv     ebx
  576.  ;     mov      .dbx13,eax
  577.        push      eax
  578.  
  579.        mov      ax,word[.b_y3]
  580.        sub      ax,word[.b_y1]
  581.        cwde
  582.        shl      eax,ROUND
  583.        cdq
  584.        idiv     ebx
  585.  ;     mov      .dby13,eax
  586.        push      eax
  587.  
  588.        mov      ax,word[.e_x3]
  589.        sub      ax,word[.e_x1]
  590.        cwde
  591.        shl      eax,ROUND
  592.        cdq
  593.        idiv     ebx
  594.  ;     mov      .dex13,eax
  595.        push      eax
  596.  
  597.        mov      ax,word[.e_y3]
  598.        sub      ax,word[.e_y1]
  599.        cwde
  600.        shl      eax,ROUND
  601.        cdq
  602.        idiv     ebx
  603.  ;     mov      .dey13,eax
  604.        push      eax
  605.  
  606.        mov      ax,word[.t_x3]
  607.        sub      ax,word[.t_x1]
  608.        cwde
  609.        shl      eax,ROUND
  610.        cdq
  611.        idiv     ebx
  612.  ;     mov      .dtx13,eax
  613.        push      eax
  614.  
  615.        mov      ax,word[.t_y3]
  616.        sub      ax,word[.t_y1]
  617.        cwde
  618.        shl      eax,ROUND
  619.        cdq
  620.        idiv     ebx
  621.  ;     mov      .dty13,eax
  622.        push      eax
  623. end if
  624.    .bt_dx13_done:
  625.  
  626.        mov      bx,.y3       ; calc delta23
  627.        sub      bx,.y2
  628.        jnz      .bt_dx23_make
  629.        mov      ecx,8
  630.        xor      edx,edx
  631.      @@:
  632.        push     edx   ;dword 0
  633.        loop     @b
  634.        jmp      .bt_dx23_done
  635.  .bt_dx23_make:
  636.        movsx    ebx,bx
  637.  
  638. if Ext>=SSE
  639.  
  640.        sub       esp,32
  641.    ;    mov       eax,256
  642.        cvtsi2ss  xmm4,[i255d]
  643.        cvtsi2ss  xmm3,ebx            ;rcps
  644.        divss     xmm3,xmm4
  645.        shufps    xmm3,xmm3,0
  646.  
  647.        movd      mm0,[.b_x2]
  648.        movd      mm1,[.b_x3]
  649.        movd      mm2,[.e_x2]
  650.        movd      mm3,[.e_x3]
  651.  
  652.        pxor       mm4,mm4
  653.        punpcklwd  mm0,mm4
  654.        punpcklwd  mm1,mm4
  655.        punpcklwd  mm2,mm4
  656.        punpcklwd  mm3,mm4
  657.  
  658.        psubd      mm1,mm0
  659.        psubd      mm3,mm2
  660.  
  661.        cvtpi2ps  xmm1,mm1
  662.        movlhps   xmm1,xmm1
  663.        cvtpi2ps  xmm1,mm3
  664.  
  665.        divps     xmm1,xmm3   ;xmm1--> | dby | dbx | dey | dex |
  666.  
  667.        shufps    xmm1,xmm1,10110001b
  668.                              ;xmm1--> | dbx | dby | dex | dey |
  669. ;1       movups    .dey23,xmm1
  670.  
  671.        cvtps2pi  mm0,xmm1 ;mm0,xmm1          ; mm0 -> 2 delta dwords
  672.        movhlps   xmm1,xmm1
  673.        cvtps2pi  mm1,xmm1 ;mm1,xmm1
  674.        movq      .dey23,mm0
  675.        movq      .dby23,mm1
  676.  
  677.        mov       ax,.z3
  678.        sub       ax,.z2
  679.        cwde
  680.  
  681.        mov      dx,.x3
  682.        sub      dx,.x2
  683.        movsx    edx,dx
  684.  
  685.        movd       mm2,[.t_x2]
  686.        movd       mm3,[.t_x3]
  687.  
  688.        punpcklwd  mm2,mm4
  689.        punpcklwd  mm3,mm4
  690.        psubd      mm3,mm2
  691.  
  692.        cvtsi2ss  xmm1,eax
  693.        movlhps   xmm1,xmm1
  694.        cvtsi2ss  xmm1,edx
  695.        shufps    xmm1,xmm1,00101111b
  696.        cvtpi2ps  xmm1,mm3
  697.  
  698.        divps     xmm1,xmm3   ; xmm1--> | dx | dz | dty | dtx |
  699.  
  700.        shufps    xmm1,xmm1,11100001b
  701.                             ; xmm1--> | dx | dz | dtx | dty |
  702. ;       movlps    .dty23,xmm1
  703. ;       movhps    .dz23,xmm1
  704.        cvtps2pi  mm0,xmm1    ; mm0 -> 2 delta dwords  | dtx | dty |
  705.        movhlps   xmm1,xmm1
  706.        cvtps2pi  mm1,xmm1    ; mm1 --> 2 delta dwords | dx  |  dz |
  707.        movq      .dty23,mm0
  708.        movq      .dz23,mm1
  709.  
  710.  
  711. else
  712.        mov      ax,.x3
  713.        sub      ax,.x2
  714.        cwde
  715.        shl      eax,ROUND
  716.        cdq
  717.        idiv     ebx
  718.  ;     mov      .dx23,eax
  719.        push      eax
  720.  
  721.        mov     ax,.z3
  722.        sub     ax,.z2
  723.        cwde
  724.        shl     eax,CATMULL_SHIFT
  725.        cdq
  726.        idiv    ebx
  727.      ; mov     .dz23,eax
  728.        push    eax
  729.  
  730.        mov      ax,word[.b_x3]
  731.        sub      ax,word[.b_x2]
  732.        cwde
  733.        shl      eax,ROUND
  734.        cdq
  735.        idiv     ebx
  736.  ;     mov      .dbx23,eax
  737.        push      eax
  738.  
  739.        mov      ax,word[.b_y3]
  740.        sub      ax,word[.b_y2]
  741.        cwde
  742.        shl      eax,ROUND
  743.        cdq
  744.        idiv     ebx
  745.  ;     mov      .dby23,eax
  746.        push      eax
  747.  
  748.        mov      ax,word[.e_x3]
  749.        sub      ax,word[.e_x2]
  750.        cwde
  751.        shl      eax,ROUND
  752.        cdq
  753.        idiv     ebx
  754.  ;     mov      .dex23,eax
  755.        push      eax
  756.  
  757.        mov      ax,word[.e_y3]
  758.        sub      ax,word[.e_y2]
  759.        cwde
  760.        shl      eax,ROUND
  761.        cdq
  762.        idiv     ebx
  763.  ;     mov      .dey23,eax
  764.        push      eax
  765.  
  766.  
  767.        mov      ax,word[.t_x3]
  768.        sub      ax,word[.t_x2]
  769.        cwde
  770.        shl      eax,ROUND
  771.        cdq
  772.        idiv     ebx
  773.  ;     mov      .dtx23,eax
  774.        push      eax
  775.  
  776.        mov      ax,word[.t_y3]
  777.        sub      ax,word[.t_y2]
  778.        cwde
  779.        shl      eax,ROUND
  780.        cdq
  781.        idiv     ebx
  782.  ;     mov      .dty23,eax
  783.        push      eax
  784. end if
  785.       ;  sub     esp,40
  786.    .bt_dx23_done:
  787.        sub       esp,64
  788.  
  789.        movsx    eax,.x1
  790.        shl      eax,ROUND
  791.        mov      .cx1,eax
  792.        mov      .cx2,eax
  793.   ;     push     eax
  794.   ;     push     eax
  795.  
  796.        movsx    ebx,word[.b_x1]
  797.        shl      ebx,ROUND
  798.        mov      .cbx1,ebx
  799.        mov      .cbx2,ebx
  800.       ; push     ebx
  801.       ; push     ebx
  802.  
  803.        movsx    ecx,word[.b_y1]
  804.        shl      ecx,ROUND
  805.        mov      .cby1,ecx
  806.        mov      .cby2,ecx
  807.       ; push     ecx
  808.       ; push     ecx
  809.  
  810.        movsx    edx,word[.e_x1]
  811.        shl      edx,ROUND
  812.        mov      .cex1,edx
  813.        mov      .cex2,edx
  814.     ;   push     edx
  815.     ;   push     edx
  816.  
  817.        movsx    eax,word[.e_y1]
  818.        shl      eax,ROUND
  819.        mov      .cey1,eax
  820.        mov      .cey2,eax
  821.     ;   push     eax
  822.     ;   push     eax
  823.  
  824.        movsx    ebx,.z1
  825.        shl      ebx,CATMULL_SHIFT
  826.        mov      .cz1,ebx
  827.        mov      .cz2,ebx
  828.    ;    push     ebx
  829.    ;    push     ebx
  830.  
  831.       ; sub      esp,16
  832.        movsx    ecx,word[.t_x1]
  833.        shl      ecx,ROUND
  834.        mov      .ctx1,ecx
  835.        mov      .ctx2,ecx
  836.        ;push     ecx
  837.        ;push     ecx
  838.  
  839.        movsx    edx,word[.t_y1]
  840.        shl      edx,ROUND
  841.        mov      .cty1,edx
  842.        mov      .cty2,edx
  843.       ; push     edx
  844.       ; push     edx
  845.  
  846. if Ext >= SSE2
  847.        movups  xmm0,.cby1
  848.        movups  xmm1,.cty1
  849.        movups  xmm2,.cby2
  850.        movups  xmm3,.cty2
  851.        movups  xmm4,.dby13
  852.        movups  xmm5,.dty13
  853.        movups  xmm6,.dby12
  854.        movups  xmm7,.dty12
  855.        .scby1  equ [edi]
  856.        .scty1  equ [edi+16]
  857.        .scby2  equ [edi+32]
  858.        .scty2  equ [edi+48]
  859.        .sdby13 equ [edi+64]
  860.        .sdty13 equ [edi+80]
  861.        .sdby12 equ [edi+96]
  862.        .sdty12 equ [edi+128]
  863.        push    edi
  864.        mov     edi,sse_repository
  865.        movaps  .scby1,xmm0
  866.        movaps  .scty1,xmm1
  867.        movaps  .scby2,xmm2
  868.        movaps  .scty2,xmm3
  869.        movaps  .sdby13,xmm4
  870.        movaps  .sdty13,xmm5
  871.        movaps  .sdby12,xmm6
  872.        movaps  .sdty12,xmm7
  873.        pop     edi
  874.  
  875. end if
  876.        movsx    ecx,.y1
  877.        cmp      cx,.y2
  878.        jge      .loop12_done
  879.   .loop12:
  880. ;if Ext >= SSE2
  881. ;       fxsave  [sse_repository]
  882. ;end if
  883.        call     .call_line
  884. if Ext >= SSE2
  885. ;       fxrstor [sse_repository]
  886.        movups  xmm0,.cby1
  887.        movups  xmm1,.cty1
  888.        movups  xmm2,.cby2
  889.        movups  xmm3,.cty2
  890.     ;   movups  xmm4,.dby13
  891.     ;   movups  xmm5,.dty13
  892.     ;   movups  xmm6,.dby12
  893.     ;   movups  xmm7,.dty12
  894.     ;   paddd   xmm0,xmm4
  895.     ;   paddd   xmm1,xmm5
  896.     ;   paddd   xmm2,xmm6
  897.     ;   paddd   xmm3,xmm7
  898.        push    edi
  899.        mov     edi,sse_repository
  900.        paddd   xmm0,.sdby13
  901.        paddd   xmm1,.sdty13
  902.        paddd   xmm2,.sdby12
  903.        paddd   xmm3,.sdty12
  904.        pop     edi
  905.        movups  .cby1,xmm0
  906.        movups  .cty1,xmm1
  907.        movups  .cby2,xmm2
  908.        movups  .cty2,xmm3
  909. end if
  910.  
  911. if (Ext = MMX) | (Ext = SSE)
  912.        movq     mm0,.cby2
  913.        movq     mm1,.cby1
  914.        movq     mm2,.cey2
  915.        movq     mm3,.cey1
  916.        movq     mm4,.cty1
  917.        movq     mm5,.cty2
  918.        movq     mm6,.cz1
  919.        movq     mm7,.cz2
  920.        paddd    mm0,.dby12
  921.        paddd    mm1,.dby13
  922.        paddd    mm2,.dey12
  923.        paddd    mm3,.dey13
  924.        paddd    mm4,.dty13
  925.        paddd    mm5,.dty12
  926.        paddd    mm6,.dz13
  927.        paddd    mm7,.dz12
  928.        movq     .cby2,mm0
  929.        movq     .cby1,mm1
  930.        movq     .cey1,mm3
  931.        movq     .cey2,mm2
  932.        movq     .cty1,mm4
  933.        movq     .cty2,mm5
  934.        movq     .cz1,mm6
  935.        movq     .cz2,mm7
  936. end if
  937. if Ext = NON
  938.        mov      edx,.dbx13
  939.        add      .cbx1,edx
  940.        mov      eax,.dbx12
  941.        add      .cbx2,eax
  942.        mov      ebx,.dby13
  943.        add      .cby1,ebx
  944.        mov      edx,.dby12
  945.        add      .cby2,edx
  946.  
  947.        mov      eax,.dex13
  948.        add      .cex1,eax
  949.        mov      ebx,.dex12
  950.        add      .cex2,ebx
  951.        mov      edx,.dey13
  952.        add      .cey1,edx
  953.        mov      eax,.dey12
  954.        add      .cey2,eax
  955.  
  956.        mov      eax,.dtx13
  957.        add      .ctx1,eax
  958.        mov      ebx,.dtx12
  959.        add      .ctx2,ebx
  960.        mov      edx,.dty13
  961.        add      .cty1,edx
  962.        mov      eax,.dty12
  963.        add      .cty2,eax
  964.  
  965.        mov      eax,.dx13
  966.        add      .cx1,eax
  967.        mov      ebx,.dx12
  968.        add      .cx2,ebx
  969.        mov      ebx,.dz13
  970.        add      .cz1,ebx
  971.        mov      edx,.dz12
  972.        add      .cz2,edx
  973. end if
  974.        inc      ecx
  975.        cmp      cx,.y2
  976.        jl       .loop12
  977.     .loop12_done:
  978.  
  979.        movsx    ecx,.y2
  980.        cmp      cx,.y3
  981.        jge      .loop23_done
  982.  
  983.  
  984.        movsx    eax,.z2
  985.        shl      eax,CATMULL_SHIFT
  986.        mov      .cz2,eax
  987.  
  988.        movsx    ebx,.x2
  989.        shl      ebx,ROUND
  990.        mov      .cx2,ebx
  991.  
  992.        movzx    edx,word[.b_x2]
  993.        shl      edx,ROUND
  994.        mov      .cbx2,edx
  995.  
  996.        movzx    eax,word[.b_y2]
  997.        shl      eax,ROUND
  998.        mov      .cby2,eax
  999.  
  1000.        movzx    ebx,word[.e_x2]
  1001.        shl      ebx,ROUND
  1002.        mov      .cex2,ebx
  1003.  
  1004.        movzx    edx,word[.e_y2]
  1005.        shl      edx,ROUND
  1006.        mov      .cey2,edx
  1007.  
  1008.        movzx    eax,word[.t_x2]
  1009.        shl      eax,ROUND
  1010.        mov      .ctx2,eax
  1011.  
  1012.        movzx    ebx,word[.t_y2]
  1013.        shl      ebx,ROUND
  1014.        mov      .cty2,ebx
  1015. if Ext >= SSE2
  1016.        movups  xmm2,.cby2
  1017.        movups  xmm3,.cty2
  1018.    ;    movups  xmm4,.dby13
  1019.    ;    movups  xmm5,.dty13
  1020.        movups  xmm6,.dby23
  1021.        movups  xmm7,.dty23
  1022. ;       .scby1  equ [edi]
  1023. ;       .scty1  equ [edi+16]
  1024. ;       .scby2  equ [edi+32]
  1025. ;       .scty2  equ [edi+48]
  1026. ;       .sdby13 equ [edi+64]
  1027. ;       .sdty13 equ [edi+80]
  1028.        .sdby23 equ [edi+160]
  1029.        .sdty23 equ [edi+192]
  1030.        push    edi
  1031.        mov     edi,sse_repository
  1032. ;       movaps  .scby1,xmm0
  1033. ;       movaps  .scty1,xmm1
  1034.        movaps  .scby2,xmm2
  1035.        movaps  .scty2,xmm3
  1036. ;       movaps  .sdby13,xmm4
  1037. ;       movaps  .sdty13,xmm5
  1038.        movaps  .sdby23,xmm6
  1039.        movaps  .sdty23,xmm7
  1040.        pop     edi
  1041.  
  1042. end if
  1043.  
  1044.      .loop23:
  1045. ;if Ext >= SSE2
  1046. ;       fxsave  [sse_repository]
  1047. ;end if
  1048.        call     .call_line
  1049.  
  1050. if Ext >= SSE2
  1051.  
  1052.        movups  xmm0,.cby1
  1053.        movups  xmm1,.cty1
  1054.        movups  xmm2,.cby2
  1055.        movups  xmm3,.cty2
  1056.  
  1057.  
  1058.        push    edi
  1059.        mov     edi,sse_repository
  1060.        paddd   xmm0,.sdby13
  1061.        paddd   xmm1,.sdty13
  1062.        paddd   xmm2,.sdby23
  1063.        paddd   xmm3,.sdty23
  1064.        pop     edi
  1065.        movups  .cby1,xmm0
  1066.        movups  .cty1,xmm1
  1067.        movups  .cby2,xmm2
  1068.        movups  .cty2,xmm3
  1069.  
  1070.  
  1071.  
  1072.  
  1073. ;       fxrstor [sse_repository]
  1074. ;       movups  xmm0,.cby1
  1075. ;       movups  xmm1,.cty1
  1076. ;       movups  xmm2,.cby2
  1077. ;       movups  xmm3,.cty2
  1078. ;       movups  xmm4,.dby13
  1079. ;       movups  xmm5,.dty13
  1080. ;       movups  xmm6,.dby23
  1081. ;       movups  xmm7,.dty23
  1082. ;       paddd   xmm0,xmm4
  1083. ;       paddd   xmm1,xmm5
  1084. ;       paddd   xmm2,xmm6
  1085.  ;      paddd   xmm3,xmm7
  1086.  ;      movups  .cby1,xmm0
  1087.  ;      movups  .cty1,xmm1
  1088.  ;      movups  .cby2,xmm2
  1089.  ;      movups  .cty2,xmm3
  1090. ;
  1091. end if
  1092. if (Ext = MMX) | (Ext = SSE)
  1093.        movq     mm0,.cby2
  1094.        movq     mm1,.cby1
  1095.        movq     mm2,.cey2
  1096.        movq     mm3,.cey1
  1097.        movq     mm4,.cty1
  1098.        movq     mm5,.cty2
  1099.        movq     mm6,.cz1
  1100.        movq     mm7,.cz2
  1101.        paddd    mm0,.dby23
  1102.        paddd    mm1,.dby13
  1103.        paddd    mm2,.dey23
  1104.        paddd    mm3,.dey13
  1105.        paddd    mm4,.dty13
  1106.        paddd    mm5,.dty23
  1107.        paddd    mm6,.dz13
  1108.        paddd    mm7,.dz23
  1109.        movq     .cby2,mm0
  1110.        movq     .cby1,mm1
  1111.        movq     .cey2,mm2
  1112.        movq     .cey1,mm3
  1113.        movq     .cty1,mm4
  1114.        movq     .cty2,mm5
  1115.        movq     .cz1,mm6
  1116.        movq     .cz2,mm7
  1117. end if
  1118. If Ext = NON
  1119.        mov      edx,.dbx13
  1120.        add      .cbx1,edx
  1121.        mov      eax,.dbx23
  1122.        add      .cbx2,eax
  1123.        mov      ebx,.dby13
  1124.        add      .cby1,ebx
  1125.        mov      edx,.dby23
  1126.        add      .cby2,edx
  1127.  
  1128.        mov      eax,.dex13
  1129.        add      .cex1,eax
  1130.        mov      ebx,.dex23
  1131.        add      .cex2,ebx
  1132.        mov      edx,.dey13
  1133.        add      .cey1,edx
  1134.        mov      eax,.dey23
  1135.        add      .cey2,eax
  1136.  
  1137.        mov      eax,.dx13
  1138.        add      .cx1,eax
  1139.        mov      ebx,.dx23
  1140.        add      .cx2,ebx
  1141.        mov      ebx,.dz13
  1142.        add      .cz1,ebx
  1143.        mov      edx,.dz23
  1144.        add      .cz2,edx
  1145.  
  1146.        mov      eax,.dtx13
  1147.        add      .ctx1,eax
  1148.        mov      ebx,.dtx23
  1149.        add      .ctx2,ebx
  1150.        mov      edx,.dty13
  1151.        add      .cty1,edx
  1152.        mov      eax,.dty23
  1153.        add      .cty2,eax
  1154. end if
  1155.        inc      ecx
  1156.        cmp      cx,.y3
  1157.        jl       .loop23
  1158.     .loop23_done:
  1159.  
  1160.        mov      esp,ebp
  1161. ret   50
  1162.  
  1163. .call_line:
  1164.  
  1165.        pushad
  1166.        ; xmm0= cby1,cbx1,cz1,cx1
  1167.        ; xmm1= cty1,ctx1,cey1,cex1
  1168. if Ext >= SSE2
  1169.        sub      esp,8
  1170.        shufps   xmm1,xmm1,10110001b
  1171.        shufps   xmm3,xmm3,10110001b
  1172.        movlps   [esp],xmm1
  1173. else
  1174.        push     dword .cty1
  1175.        push     .ctx1
  1176. end if
  1177.        push     dword .cz1
  1178. if Ext>=SSE2
  1179.        sub      esp,8
  1180.        movlps   [esp],xmm3
  1181. else
  1182.        push     dword .cty2
  1183.        push     .ctx2
  1184. end if
  1185.        push     dword .cz2
  1186. if Ext>=SSE2
  1187.        sub      esp,32
  1188.        movhps   [esp+24],xmm3
  1189.        shufps   xmm2,xmm2,10110001b
  1190.        movlps   [esp+16],xmm2
  1191.        movhps   [esp+8],xmm1
  1192.        shufps   xmm0,xmm0,10110001b
  1193.        movlps   [esp],xmm0 ;================================
  1194.  
  1195. else
  1196.        push     dword .cey2
  1197.        push     .cex2
  1198.        push     dword .cby2
  1199.        push     .cbx2
  1200.        push     dword .cey1
  1201.        push     .cex1
  1202.        push     dword .cby1
  1203.        push     .cbx1
  1204. end if
  1205.  
  1206.        push     .tex_ptr
  1207.        push     .z_buff
  1208.        push     .t_emap
  1209.        push     .t_bmap
  1210.  
  1211.        push     ecx
  1212.  
  1213.        mov      eax,.cx1
  1214.        sar      eax,ROUND
  1215.        mov      ebx,.cx2
  1216.        sar      ebx,ROUND
  1217.  
  1218.        call     bump_tex_line_z
  1219.  
  1220.        popad
  1221. ;end if
  1222. ret
  1223. bump_tex_line_z:
  1224. ;--------------in: eax - x1
  1225. ;--------------    ebx - x2
  1226. ;--------------    edi - pointer to screen buffer
  1227. ;stack - another parameters :
  1228. .y      equ dword [ebp+4]
  1229. .bmap   equ dword [ebp+8]        ; bump map pointer
  1230. .emap   equ dword [ebp+12]       ; env map pointer
  1231. .z_buff equ dword [ebp+16]       ; z buffer
  1232. .tex_map equ dword [ebp+20]      ; texture pointer
  1233.  
  1234. .bx1    equ  [ebp+24]   ;   ---
  1235. .by1    equ  [ebp+28]  ;       |
  1236. .ex1    equ  [ebp+32]  ;       |
  1237. .ey1    equ  [ebp+36]  ;       |
  1238. .bx2    equ  [ebp+40]  ;       |
  1239. .by2    equ  [ebp+44]  ;       |>   b. map and e. map coords
  1240. .ex2    equ  [ebp+48]  ;       |>   shifted shl ROUND
  1241. .ey2    equ  [ebp+52]  ;   ---
  1242. .z2     equ  [ebp+56]
  1243. .tx2    equ  [ebp+60]
  1244. .ty2    equ  [ebp+64]
  1245. .z1     equ  [ebp+68]
  1246. .tx1    equ  [ebp+72]
  1247. .ty1    equ  [ebp+76]
  1248.  
  1249.  
  1250.  
  1251. .x1     equ [ebp-4]
  1252. .x2     equ [ebp-8]
  1253. .dbx    equ [ebp-12]
  1254. .dby    equ [ebp-16]
  1255. .dex    equ [ebp-20]
  1256. .dey    equ [ebp-24]
  1257. .dz     equ [ebp-28]
  1258. .dtx    equ [ebp-32]
  1259. .dty    equ [ebp-36]
  1260.  
  1261. .cbx    equ [ebp-40]
  1262. .cby    equ [ebp-44]
  1263. .cex    equ [ebp-48]
  1264. .cey    equ [ebp-52]
  1265. .cz     equ [ebp-56]
  1266. .czbuff equ [ebp-60]
  1267. .ctx    equ [ebp-64]
  1268. .cty    equ [ebp-68]
  1269. .c_scr  equ [ebp-72]
  1270.  
  1271. .temp1  equ        ebp-80
  1272. .temp2  equ        ebp-88
  1273. .temp3  equ        ebp-76
  1274. .temp4  equ        ebp-84
  1275. .temp5  equ        ebp-92
  1276.  
  1277.         mov     ebp,esp
  1278.  
  1279.         mov     ecx,.y
  1280.         or      ecx,ecx
  1281.         jl      .bl_end
  1282.         movzx   edx,word[size_y_var]
  1283.         cmp     ecx,edx  ;SIZE_Y
  1284.         jge     .bl_end
  1285.  
  1286.         cmp     eax,ebx
  1287.         jl      .bl_ok
  1288.         je      .bl_end
  1289.  
  1290.  
  1291. if Ext=NON
  1292.         mov     edx,.bx1
  1293.         xchg    edx,.bx2
  1294.         mov     .bx1,edx
  1295.         mov     edx,.by1
  1296.         xchg    edx,.by2
  1297.         mov     .by1,edx
  1298.  
  1299.         mov     edx,.ex1
  1300.         xchg    edx,.ex2
  1301.         mov     .ex1,edx
  1302.         mov     edx,.ey1
  1303.         xchg    edx,.ey2
  1304.         mov     .ey1,edx
  1305.  
  1306.         mov     edx,.tx1
  1307.         xchg    edx,.tx2
  1308.         mov     .tx1,edx
  1309.         mov     edx,.ty1
  1310.         xchg    edx,.ty2
  1311.         mov     .ty1,edx
  1312. end if
  1313. if Ext = MMX
  1314.         movq    mm0,.bx1
  1315.         movq    mm1,.bx2
  1316.         movq    mm2,.ex1
  1317.         movq    mm3,.ex2
  1318.         movq    mm4,.tx1
  1319.         movq    mm5,.tx2
  1320.         movq    .bx2,mm0
  1321.         movq    .bx1,mm1
  1322.         movq    .ex1,mm3
  1323.         movq    .ex2,mm2
  1324.         movq    .tx1,mm5
  1325.         movq    .tx2,mm4
  1326. end if
  1327. if Ext>=SSE
  1328.         movups xmm0,.bx1
  1329.         movups xmm1,.bx2
  1330.         movups .bx1,xmm1
  1331.         movups .bx2,xmm0
  1332.         movq    mm0,.tx1
  1333.         movq    mm1,.tx2
  1334.         movq    .tx1,mm1
  1335.         movq    .tx2,mm0
  1336. end if
  1337. ;if Ext>=SSE2
  1338. ;        movaps  xmm4,xmm0
  1339. ;        movaps  xmm0,xmm2
  1340. ;        movaps  xmm2,xmm4
  1341. ;        movaps  xmm5,xmm1
  1342. ;        movaps  xmm1,xmm3
  1343. ;        movaps  xmm3,xmm5
  1344. ;else
  1345.  
  1346.         xchg    eax,ebx
  1347.         mov     edx,.z1
  1348.         xchg    edx,.z2
  1349.         mov     .z1,edx
  1350. ;end if
  1351.   .bl_ok:
  1352. ;if Ext >= SSE2
  1353. ;        shufps  xmm0,xmm0,11100001b
  1354. ;        shufps  xmm2,xmm2,11100001b
  1355. ;        movlps  .bx1,xmm0
  1356. ;        movlps  .bx2,xmm2
  1357.  
  1358.  
  1359. ;        shufps  xmm0,xmm0,00011011b
  1360. ;        shufps  xmm2,xmm2,00011011b
  1361. ;        movd    eax,xmm0
  1362. ;        movd    ebx,xmm2
  1363. ;        shufps  xmm0,xmm0,11000110b
  1364. ;        shufps  xmm2,xmm2,11000110b
  1365. ;        movd    .z1,xmm0
  1366. ;        movd    .z2,xmm2
  1367. ;        shufps  xmm1,xmm1,10110001b
  1368. ;        shufps  xmm3,xmm3,10110001b
  1369. ;        movlps  .ex1,xmm1
  1370. ;        movlps  .ex2,xmm2
  1371. ;        movhps  .tx1,xmm1
  1372. ;        movhps  .tx2,xmm2
  1373.  
  1374. ;        xchg    eax,ebx
  1375. ;        mov     edx,.z1
  1376. ;        xchg    edx,.z2
  1377. ;        mov     .z1,edx
  1378.  
  1379.  
  1380. ;end if
  1381.  
  1382.         push    eax
  1383.         push    ebx           ;store x1, x2
  1384.         movzx   ebx,word[size_x_var]
  1385.     ;    mov     eax,.x1
  1386.         cmp     dword .x1,ebx  ;dword .x1,SIZE_X
  1387.         jge     .bl_end
  1388.         cmp     dword .x2,0
  1389.         jle     .bl_end
  1390.  
  1391.         mov     ebx,.x2
  1392.         sub     ebx,.x1
  1393.  
  1394. if Ext>=SSE
  1395.  
  1396.        sub       esp,28
  1397.        cvtsi2ss  xmm3,ebx            ;rcps
  1398.        shufps    xmm3,xmm3,0
  1399. ; float using SSE variant  ::-->
  1400. ;       movups    xmm0,.bx1  ; new
  1401. ;       movups    xmm1,.bx2  ; new
  1402.  
  1403.        cvtpi2ps  xmm0,.bx1 ;mm0    ; variant fixed point
  1404.        movlhps   xmm0,xmm0
  1405.        cvtpi2ps  xmm0,.ex1 ;mm2
  1406.        cvtpi2ps  xmm1,.bx2 ;mm1
  1407.        movlhps   xmm1,xmm1
  1408.        cvtpi2ps  xmm1,.ex2 ;mm3
  1409.        subps     xmm1,xmm0
  1410.  
  1411.        divps     xmm1,xmm3
  1412.  
  1413.        shufps    xmm1,xmm1,10110001b
  1414. ;       movups    .dey,xmm1  ; new
  1415.        cvtps2pi  mm0,xmm1          ; mm0 -> 2 delta dwords
  1416.        movhlps   xmm1,xmm1
  1417.        cvtps2pi  mm1,xmm1
  1418.        movq      .dey,mm0
  1419.        movq      .dby,mm1
  1420.  
  1421.        movd      mm2,.z1
  1422.        movd      mm3,.z2
  1423.  
  1424.        cvtpi2ps  xmm0,.tx1 ;mm0
  1425.        movlhps   xmm0,xmm0
  1426.        cvtpi2ps  xmm0,mm2
  1427.        cvtpi2ps  xmm1,.tx2 ;mm1
  1428.        movlhps   xmm1,xmm1
  1429.        cvtpi2ps  xmm1,mm3
  1430. ;       movups    xmm0,,z1  ; new
  1431. ;       movups    xmm1,.z2  ; new
  1432.        subps     xmm1,xmm0
  1433.  
  1434.        divps     xmm1,xmm3
  1435.  
  1436. ;       movups    .dz,xmm1  ;new
  1437.  
  1438.        shufps    xmm1,xmm1,10110100b
  1439.        cvtps2pi  mm0,xmm1          ; mm0 -> 2 delta dwords
  1440.        movhlps   xmm1,xmm1
  1441.        cvtps2pi  mm1,xmm1
  1442.        movd      .dz,mm0
  1443.        movq      .dty,mm1
  1444.  
  1445. else
  1446.  
  1447.         mov     eax,.bx2       ; calc .dbx
  1448.         sub     eax,.bx1
  1449.         cdq
  1450.         idiv    ebx
  1451.         push    eax
  1452.  
  1453.         mov     eax,.by2       ; calc .dby
  1454.         sub     eax,.by1
  1455.         cdq
  1456.         idiv    ebx
  1457.         push    eax
  1458.  
  1459.         mov     eax,.ex2       ; calc .dex
  1460.         sub     eax,.ex1
  1461.         cdq
  1462.         idiv    ebx
  1463.         push    eax
  1464.  
  1465.         mov     eax,.ey2       ; calc .dey
  1466.         sub     eax,.ey1
  1467.         cdq
  1468.         idiv    ebx
  1469.         push    eax
  1470.  
  1471.  
  1472.         mov     eax,.z2        ; calc .dz
  1473.         sub     eax,.z1
  1474.         cdq
  1475.         idiv    ebx
  1476.         push    eax
  1477.  
  1478.         mov     eax,.tx2       ; calc .dtx
  1479.         sub     eax,.tx1
  1480.         cdq
  1481.         idiv    ebx
  1482.         push    eax
  1483.  
  1484.         mov     eax,.ty2       ; calc .dty
  1485.         sub     eax,.ty1
  1486.         cdq
  1487.         idiv    ebx
  1488.         push    eax
  1489.  
  1490. end if
  1491.         cmp     dword .x1,0         ; set correctly begin variable
  1492.         jge     @f            ; CLIPPING ON FUNCTION
  1493.                               ; cutting triangle exceedes screen
  1494.         mov     ebx,.x1
  1495.         neg     ebx
  1496.  
  1497. ;if Ext >= SSE
  1498.  
  1499. ;        cvtsi2ss xmm0,ebx
  1500. ;        shufps   xmm0,xmm0,0
  1501. ;        movups   xmm1,.dey
  1502. ;        mulps    xmm1,xmm0
  1503. ;        shufps   xmm1,xmm1,00011011b
  1504. ;        movups   xmm2,.bx1
  1505. ;        addps    xmm2,xmm1
  1506. ;        movups   .bx1,xmm2
  1507.  
  1508.         mov     eax,.dz
  1509.         imul    ebx           ; eax = .dz * abs(.x1)
  1510.         add     .z1,eax
  1511.         mov     dword .x1,0
  1512.  
  1513.         mov     eax,.dbx
  1514.         imul    ebx
  1515.         add    .bx1,eax
  1516.  
  1517.         mov     eax,.dby
  1518.         imul    ebx
  1519.         add     .by1,eax
  1520.  
  1521.         mov     eax,.dex
  1522.         imul    ebx
  1523.         add     .ex1,eax
  1524.  
  1525.         mov     eax,.dey
  1526.         imul    ebx
  1527.         add     .ey1,eax
  1528.  
  1529.         mov     eax,.dtx
  1530.         imul    ebx
  1531.         add     .tx1,eax
  1532.  
  1533.         mov     eax,.dty
  1534.         imul    ebx
  1535.         add     .ty1,eax
  1536.  
  1537.       @@:
  1538.    ;     mov     ebx,.x2
  1539.         movzx   eax,word[size_x_var]
  1540.        ; cmp     dword .x2,SIZE_X
  1541.         cmp     dword .x2,eax  ; eax,ebx
  1542.         jl      @f
  1543.         mov     dword .x2,eax  ;SIZE_X
  1544.       @@:
  1545.         movzx   eax,word[size_x_var]  ;SIZE_X       ;calc memory begin in buffers
  1546.         mul     .y
  1547.         add     eax,.x1
  1548.         lea     esi,[4*eax]
  1549.         add     esi,.z_buff       ; z-buffer filled with dd variables
  1550.         lea     eax,[eax*3]
  1551.         add     edi,eax
  1552.  
  1553.  
  1554.         mov     ecx,.x2
  1555.         sub     ecx,.x1
  1556.         ; init current variables
  1557.         push    dword .bx1   ; current b, e and t shifted shl ROUND   .cbx
  1558.         push    dword .by1                                         ;  .cby
  1559.         push    dword .ex1                                         ;  .cex
  1560.         push    dword .ey1                                         ;  .cey
  1561.  
  1562.         push    dword .z1    ; current z shl CATMULL_SHIFT         ; .cz
  1563.         push    esi                                          ; .czbuff
  1564.  
  1565.         push    dword .tx1      ;         .ctx
  1566.         push    dword .ty1      ;         .cty
  1567.         push    edi       ;         .c_scr
  1568. if Ext = SSE2
  1569.         mov    eax,TEXTURE_SIZE
  1570.         movd   xmm1,eax
  1571.         shufps xmm1,xmm1,0
  1572.         push   dword  TEX_X
  1573.         push   dword  -TEX_X
  1574.         push   dword  1
  1575.         push   dword  -1
  1576.         movups xmm2,[esp]
  1577.         movd   xmm3,.bmap
  1578.         shufps xmm3,xmm3,0
  1579. end if
  1580.  
  1581. if Ext>=MMX
  1582.         movq    mm7,.cty
  1583.         movq    mm6,.cby
  1584.         movq    mm5,.cey
  1585. ;        movq    mm4,.dtyq
  1586. ;        movq    mm3,.dbyq
  1587. end if
  1588.  
  1589.      .draw:
  1590.     ; if TEX = SHIFTING   ;bump drawing only in shifting mode
  1591.         mov     esi,.czbuff      ; .czbuff current address in buffer
  1592.         mov     ebx,.cz          ; .cz - cur z position
  1593.         cmp     ebx,dword[esi]
  1594.         jge     .skip
  1595. if Ext=NON
  1596.         mov     eax,.cby
  1597.         shr     eax,ROUND
  1598.         mov     esi,.cbx
  1599.         shr     esi,ROUND
  1600. else
  1601.         movq    mm1,mm6
  1602.         psrld   mm1,ROUND
  1603.         movd    eax,mm1
  1604.         psrlq   mm1,32
  1605.         movd    esi,mm1
  1606. end if
  1607.  
  1608.         shl     eax,TEX_SHIFT
  1609.         add     esi,eax         ;-  ; esi - current bump map index
  1610.  
  1611. if Ext = SSE2
  1612.  
  1613.         movd    xmm0,esi
  1614.         shufps  xmm0,xmm0,0
  1615.         paddd   xmm0,xmm2
  1616.         pand    xmm0,xmm1
  1617.         paddd   xmm0,xmm3
  1618.  
  1619.         movd    ebx,xmm0
  1620.         movzx   eax,byte[ebx]
  1621. ;
  1622. ;        shufps  xmm0,xmm0,11100001b
  1623.         psrldq  xmm0,4
  1624.         movd    ebx,xmm0
  1625.         movzx   ebx,byte[ebx]
  1626.         sub     eax,ebx
  1627. ;
  1628. ;        shufps  xmm0,xmm0,11111110b
  1629.         psrldq  xmm0,4
  1630.         movd    ebx,xmm0
  1631.         movzx   edx, byte [ebx]
  1632. ;
  1633. ;        shufps  xmm0,xmm0,11111111b
  1634.         psrldq  xmm0,4
  1635.         movd    ebx,xmm0
  1636.         movzx   ebx, byte [ebx]
  1637.         sub     edx,ebx
  1638. ;
  1639. else
  1640. ;        mov     ebx,esi
  1641. ;        dec     ebx
  1642.         lea     ebx,[esi-1]
  1643.         and     ebx,TEXTURE_SIZE
  1644.         add     ebx,.bmap
  1645.         movzx   eax,byte [ebx]
  1646.  
  1647. ;        mov     ebx,esi
  1648. ;        inc     ebx
  1649.         lea     ebx,[esi+1]
  1650.         and     ebx,TEXTURE_SIZE
  1651.         add     ebx,.bmap
  1652.         movzx   ebx,byte [ebx]
  1653.         sub     eax,ebx
  1654.  
  1655. ;        mov     ebx,esi
  1656. ;        sub     ebx,TEX_X
  1657.         lea     ebx,[esi-TEX_X]
  1658.         and     ebx,TEXTURE_SIZE
  1659.         add     ebx,.bmap
  1660.         movzx   edx,byte [ebx]
  1661.  
  1662. ;        mov     ebx,esi
  1663. ;        add     ebx,TEX_X
  1664.         lea     ebx,[esi+TEX_X]
  1665.         and     ebx,TEXTURE_SIZE
  1666.         add     ebx,.bmap
  1667.         movzx   ebx,byte [ebx]
  1668.         sub     edx,ebx
  1669. end if
  1670.  
  1671.      ;  eax - horizontal sub    modificated x coord
  1672.      ;  edx - vertical   sub    modificated y coord
  1673. if Ext=NON
  1674.         mov     ebx,.cex       ;.cex - current env map X
  1675.         shr     ebx,ROUND
  1676.         add     eax,ebx
  1677.  
  1678.  
  1679.         mov     ebx,.cey       ;.cey - current  env map y
  1680.         shr     ebx,ROUND
  1681.         add     edx,ebx
  1682.  
  1683. else
  1684.         movq    mm1,mm5        ; mm5 - copy of cur env coords
  1685.         psrld   mm1,ROUND
  1686.         movd    ebx,mm1
  1687.         psrlq   mm1,32
  1688.         add     eax,ebx
  1689.         movd    ebx,mm1
  1690.         add     edx,ebx
  1691. ;        movq    qword[.temp1],mm3
  1692. ;        add     eax,dword [.temp1]
  1693. ;        add     edx,dword [.temp1+4]
  1694. end if
  1695.  
  1696.         or      eax,eax
  1697.         jl      .black
  1698.         cmp     eax,TEX_X
  1699.         jg      .black
  1700.         or      edx,edx
  1701.         jl      .black
  1702.         cmp     edx,TEX_Y
  1703.         jg      .black
  1704.  
  1705.         shl     edx,TEX_SHIFT   ; zaburzenie w emapie = zaburzenie w teksturze
  1706.         add     edx,eax         ; proponuje nie stawiac czarnego pixela tylko
  1707.         lea     esi,[edx*3]     ; niezaburzony.
  1708.         add     esi,.emap       ;
  1709.         lodsd
  1710.  
  1711. if Ext=NON
  1712.         mov     edx,.cty
  1713.         shr     edx,ROUND  ; sar
  1714.  
  1715.         mov     edi,.ctx
  1716.         shr     edi,ROUND  ; sar
  1717. else
  1718.         movq    mm1,mm7
  1719.         psrld   mm1,ROUND
  1720.         movd    edx,mm1
  1721.         psrlq   mm1,32
  1722.         movd    edi,mm1
  1723.  
  1724. end if
  1725.  
  1726.         shl     edx,TEX_SHIFT
  1727.         add     edi,edx
  1728.         and     edi,TEXTURE_SIZE
  1729.         lea     esi,[edi*3]
  1730.         add     esi,.tex_map
  1731.  
  1732. if Ext=NON
  1733.         mov     edx,eax
  1734.         lodsd
  1735.         push    ax
  1736.         mul     dl
  1737.         mov     dl,ah
  1738.         pop     ax
  1739.         shr     ax,8
  1740.         mul     dh
  1741.         mov     al,dl
  1742.         mov     edi,.c_scr
  1743.         stosw
  1744.         shr     edx,16
  1745.         shr     eax,16
  1746.         mul     dl
  1747.         shr     ax,8
  1748.         stosb
  1749. else
  1750.         movd       mm0,eax
  1751.         pxor       mm1,mm1
  1752.         punpcklbw  mm0,mm1
  1753.         movd       mm2,[esi]
  1754.         punpcklbw  mm2,mm1
  1755.         pmullw     mm0,mm2
  1756.         psrlw      mm0,8
  1757.         packuswb   mm0,mm1
  1758.         mov        edi,.c_scr
  1759.         movd       [edi],mm0
  1760.  
  1761. end if
  1762.  
  1763.         jmp     .actual_zbuff   ; actualize z buffer
  1764.      @@:
  1765.      .black:
  1766.         xor     eax,eax
  1767.         mov     edi,.c_scr
  1768.         stosd
  1769.      .actual_zbuff:
  1770.         mov     eax,.cz
  1771.         mov     edi,.czbuff
  1772.         stosd
  1773.  
  1774.       .skip:
  1775.         add     dword .czbuff,4
  1776.         add     dword .c_scr,3
  1777.  
  1778. if Ext=NON
  1779.         mov     eax,.dbx
  1780.         add     .cbx,eax
  1781.         mov     ebx,.dby
  1782.         add     .cby,ebx
  1783.  
  1784.         mov     edx,.dex
  1785.         add     .cex,edx
  1786.         mov     eax,.dey
  1787.         add     .cey,eax
  1788.  
  1789.         mov     ebx,.dtx
  1790.         add     .ctx,ebx
  1791.         mov     edx,.dty
  1792.         add     .cty,edx
  1793.  
  1794. else
  1795.         paddd   mm7,.dty
  1796.         paddd   mm6,.dby
  1797.         paddd   mm5,.dey
  1798. end if
  1799.         mov     eax,.dz
  1800.         add     .cz,eax
  1801.  
  1802.         dec     ecx
  1803.         jnz     .draw
  1804.  
  1805.   .bl_end:
  1806.         mov     esp,ebp
  1807. ret 76
  1808. ;Ext = MMX
  1809.  
  1810. ;     else
  1811. ;        movq    mm5, qword[.temp1]  ;-
  1812. ;        paddd   mm5, qword[.temp5]  ; .temp5 == low dword = TEX_X, high dword = -TEX_X
  1813. ;        pand    mm5, qword[.temp3]  ; .temp3 == low = high dword = TEX_SIZE
  1814. ;        paddd   mm5, qword[.temp4]  ; .temp4 == low = high dword = offset .bmap
  1815. ;        movd    ebx,mm5
  1816. ;        psrlq   mm5,32
  1817. ;     end if
  1818.