Subversion Repositories Kolibri OS

Rev

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