Subversion Repositories Kolibri OS

Rev

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