Subversion Repositories Kolibri OS

Rev

Rev 9512 | Blame | Compare with Previous | Last modification | View Log | Download | RSS feed

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