Subversion Repositories Kolibri OS

Rev

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