Subversion Repositories Kolibri OS

Rev

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

  1.  
  2. ;SIZE_X equ 350
  3. ;SIZE_Y equ 350
  4. ;ROUND equ 8
  5. ;TEX_X equ 512
  6. ;TEX_Y equ 512
  7. ;TEXTURE_SIZE EQU (512*512)-1
  8.  
  9. ;TEX_SHIFT EQU 9
  10.  
  11. CATMULL_SHIFT equ 8
  12. TEXTURE_SIZE EQU (TEX_X * TEX_Y)-1
  13.  
  14. ;SSE3 = 4
  15. ;SSE2 = 3
  16. ;SSE = 2
  17. ;MMX = 1
  18. ;NON = 0
  19. ;Ext = NON
  20. ;use32
  21. ;------- Big thanks to Majuma (www.majuma.xt.pl) for absolutely great---
  22. ;------- DOS 13h mode demos --------------------------------------------
  23. ;------- Procedure draws triangle with two overlapped textures, I use --
  24. ;--------Catmull Z-buffer algorithm- (Z coordinate interpolation)-------
  25. ;--------I calc texture pixel by this way: col1*col2/256 ---------------
  26. two_tex_triangle_z:
  27. ;------------------in - eax - x1 shl 16 + y1 -----------
  28. ;---------------------- ebx - x2 shl 16 + y2 -----------
  29. ;---------------------- ecx - x3 shl 16 + y3 -----------
  30. ;---------------------- edx - pointer to b. texture-----
  31. ;---------------------- esi - pointer to e. texture-----
  32. ;---------------------- edi - pointer to screen buffer--
  33. ;---------------------- stack : b. tex coordinates------
  34. ;----------------------         e. tex coordinates------
  35. ;----------------------         Z position coordinates--
  36. ;----------------------         pointer io Z buffer-----
  37. ;-- Z-buffer - filled with coordinates as dword --------
  38. ;-- (Z coor. as word) shl CATMULL_SHIFT ----------------
  39. .e_x1   equ ebp+4   ; procedure don't save registers !!!
  40. .e_y1   equ ebp+6   ; each coordinate as word
  41. .b_x1   equ ebp+8
  42. .b_y1   equ ebp+10
  43. .e_x2   equ ebp+12
  44. .e_y2   equ ebp+14
  45. .b_x2   equ ebp+16
  46. .b_y2   equ ebp+18       ; b - first texture
  47. .e_x3   equ ebp+20
  48. .e_y3   equ ebp+22       ; e - second texture
  49. .b_x3   equ ebp+24
  50. .b_y3   equ ebp+26
  51. .z1     equ word[ebp+28]
  52. .z2     equ word[ebp+30]
  53. .z3     equ word[ebp+32]
  54. .z_buff equ dword[ebp+34]       ; pointer to Z-buffer
  55.  
  56.  
  57. .t_bmap equ dword[ebp-4]        ; pointer to b. texture
  58. .t_emap equ dword[ebp-8]        ; pointer to e. texture
  59. .x1     equ word[ebp-10]
  60. .y1     equ word[ebp-12]
  61. .x2     equ word[ebp-14]
  62. .y2     equ word[ebp-16]
  63. .x3     equ word[ebp-18]
  64. .y3     equ word[ebp-20]
  65.  
  66. .dx12  equ dword[ebp-24]
  67. .dbx12 equ      [ebp-28]
  68. .dby12 equ dword[ebp-32]
  69. .dby12q equ     [ebp-32]
  70. .dex12 equ dword[ebp-36]
  71. .dey12 equ dword[ebp-40]
  72. .dey12q equ     [ebp-40]
  73. .dz12  equ      [ebp-44]
  74.  
  75. .dx13  equ dword[ebp-48]
  76. .dbx13 equ      [ebp-52]
  77. .dby13 equ dword[ebp-56]
  78. .dby13q equ     [ebp-56]
  79. .dex13 equ dword[ebp-60]
  80. .dey13 equ dword[ebp-64]
  81. .dey13q equ     [ebp-64]
  82. .dz13  equ      [ebp-68]
  83.  
  84. .dx23  equ dword[ebp-72]
  85. .dbx23 equ      [ebp-76]
  86. .dby23 equ dword[ebp-80]
  87. .dby23q equ     [ebp-80]
  88. .dex23 equ dword[ebp-84]
  89. .dey23 equ dword[ebp-88]
  90. .dey23q equ     [ebp-88]
  91. .dz23  equ      [ebp-92]
  92.  
  93. .cx1   equ dword[ebp-96]   ; current variables
  94. .cx2   equ dword[ebp-100]
  95. .cbx1  equ dword[ebp-104]
  96. .cby1  equ [ebp-108]
  97. .cex1  equ dword[ebp-112]
  98. .cey1  equ [ebp-116]
  99. .cbx2  equ dword[ebp-120]
  100. .cby2  equ [ebp-124]
  101. .cex2  equ dword[ebp-128]
  102. .cey2  equ [ebp-132]
  103.  
  104. .cz1   equ dword[ebp-136]
  105. .cz2   equ dword[ebp-140]
  106.  
  107.     if Ext >= MMX
  108.        emms
  109.     else
  110.        cld
  111.     end if
  112.        mov     ebp,esp
  113.        push    edx esi       ; store bump map
  114. ;       push    esi        ; store e. map
  115.      ; sub     esp,120
  116.  .sort3:                  ; sort triangle coordinates...
  117.        cmp     ax,bx
  118.        jle     .sort1
  119.        xchg    eax,ebx
  120.        mov     edx,dword[.b_x1]
  121.        xchg    edx,dword[.b_x2]
  122.        mov     dword[.b_x1],edx
  123.        mov     edx,dword[.e_x1]
  124.        xchg    edx,dword[.e_x2]
  125.        mov     dword[.e_x1],edx
  126.        mov     dx,.z1
  127.        xchg    dx,.z2
  128.        mov     .z1,dx
  129.  .sort1:
  130.        cmp      bx,cx
  131.        jle      .sort2
  132.        xchg     ebx,ecx
  133.        mov      edx,dword[.b_x2]
  134.        xchg     edx,dword[.b_x3]
  135.        mov      dword[.b_x2],edx
  136.        mov      edx,dword[.e_x2]
  137.        xchg     edx,dword[.e_x3]
  138.        mov      dword[.e_x2],edx
  139.        mov     dx,.z2
  140.        xchg    dx,.z3
  141.        mov     .z2,dx
  142.        jmp      .sort3
  143.  .sort2:
  144.        push     eax ebx ecx    ; store triangle coords in variables
  145.  
  146.          mov      edx,80008000h  ; eax,ebx,ecx are ANDd together into edx which means that
  147.          and      edx,ebx        ; if *all* of them are negative a sign flag is raised
  148.          and      edx,ecx
  149.          and      edx,eax
  150.          test     edx,80008000h  ; Check both X&Y at once
  151.          jne      .loop23_done
  152.     ;   mov     edx,eax         ; eax,ebx,ecx are ORd together into edx which means that
  153.     ;   or      edx,ebx         ; if any *one* of them is negative a sign flag is raised
  154.     ;   or      edx,ecx
  155.     ;   test    edx,80000000h   ; Check only X
  156.     ;   jne     .loop23_done
  157.  
  158.     ;   cmp     .x1,SIZE_X    ; {
  159.     ;   jg      .loop23_done
  160.     ;   cmp     .x2,SIZE_X     ; This can be optimized with effort
  161.     ;   jg      .loop23_done
  162.     ;   cmp     .x3,SIZE_X
  163.     ;   jg      .loop23_done    ; {
  164. ;       sub       esp,18*4
  165. ;       pxor     xmm7,xmm7
  166.        mov      bx,.y2       ; calc delta 12
  167.        sub      bx,.y1
  168.        jnz      .bt_dx12_make
  169.        mov      ecx,6
  170.        xor      edx,edx
  171.      @@:
  172.        push     edx   ;dword 0
  173.        loop     @b
  174.        jmp      .bt_dx12_done
  175.  .bt_dx12_make:
  176.  
  177.        movsx    ebx,bx
  178.        mov      eax,1 shl 15
  179.        cdq
  180.        idiv     ebx
  181.        mov      ebx,eax
  182.  
  183.        mov      ax,.x2
  184.        sub      ax,.x1
  185.        cwde
  186.        imul     ebx
  187.        sar      eax,15 - ROUND
  188.        push     eax
  189.     ;   mov      .dx12,eax
  190.  
  191. if Ext >= SSE2
  192.        sub       esp,4*4
  193.        movd      xmm0,ebx
  194.        pshuflw   xmm0,xmm0,0
  195.        movq      xmm1,[.e_x1]
  196.        movq      xmm2,[.e_x2]
  197.        psubw     xmm2,xmm1
  198.        movdqa    xmm3,xmm2
  199.        pmullw    xmm2,xmm0
  200.        pmulhw    xmm3,xmm0
  201.        punpcklwd xmm2,xmm3
  202.        psrad     xmm2,15 - ROUND
  203.        pshufd    xmm2,xmm2,10110001b
  204.        movdqu    .dey12q,xmm2
  205. else
  206.  
  207.        mov      ax,word[.b_x2]
  208.        sub      ax,word[.b_x1]
  209.        cwde
  210.        imul      ebx
  211.        sar      eax,15 - ROUND
  212.  ;      mov      .dbx23,eax
  213.        push      eax
  214.  
  215.        mov      ax,word[.b_y2]
  216.        sub      ax,word[.b_y1]
  217.        cwde
  218.        imul     ebx
  219.        sar      eax,15 - ROUND
  220.  ;      mov      .dbx23,eax
  221.        push      eax
  222.  
  223.        mov      ax,word[.e_x2]
  224.        sub      ax,word[.e_x1]
  225.        cwde
  226.        imul      ebx
  227.        sar      eax,15 - ROUND
  228.  ;      mov      .dbx23,eax
  229.        push      eax
  230.  
  231.        mov      ax,word[.e_y2]
  232.        sub      ax,word[.e_y1]
  233.        cwde
  234.        imul      ebx
  235.        sar      eax,15 - ROUND
  236.  ;      mov      .dbx23,eax
  237.        push      eax
  238.  end if
  239.  
  240.  
  241.         mov     ax,.z2
  242.         sub     ax,.z1
  243.         cwde
  244.         imul    ebx
  245.         sar     eax,15 - ROUND
  246.         push    eax
  247.   ;      mov     .dz12,eax
  248.  
  249.  
  250.    .bt_dx12_done:
  251.  
  252.        mov      bx,.y3       ; calc delta13
  253.        sub      bx,.y1
  254.        jnz      .bt_dx13_make
  255.        mov      ecx,6
  256.        xor      edx,edx
  257.      @@:
  258.        push     edx   ;dword 0
  259.        loop     @b
  260.  ;      movq     .dbx13,xmm7
  261.  ;      movdqu   .dz13,xmm7
  262.        jmp      .bt_dx13_done
  263.  .bt_dx13_make:
  264.  ;      sub       esp,6*4
  265.  
  266.        movsx    ebx,bx
  267.        mov      eax,1 shl 15
  268.        cdq
  269.        idiv     ebx
  270.     ;   push     eax
  271.        mov      ebx,eax
  272.  
  273.  
  274.        mov      ax,.x3
  275.        sub      ax,.x1
  276.        cwde
  277.        imul     ebx
  278.        sar      eax,15 - ROUND
  279.        push     eax
  280.   ;     mov      .dx13,eax
  281. if 1
  282.        sub       esp,4*4
  283.        movd      xmm0,ebx
  284.        pshuflw   xmm0,xmm0,0
  285.        movq      xmm1,[.e_x1]
  286.        movq      xmm2,[.e_x3]
  287.        psubw     xmm2,xmm1
  288.        movdqa    xmm3,xmm2
  289.        pmullw    xmm2,xmm0
  290.        pmulhw    xmm3,xmm0
  291.        punpcklwd xmm2,xmm3
  292.        psrad     xmm2,15 - ROUND
  293.        pshufd    xmm2,xmm2,10110001b
  294.        movdqu    .dey13q,xmm2
  295.    ;    punpcklwd xmm4,xmm5
  296.     ;   psrad     xmm4,15 - ROUND
  297.   ;     movq      .tex_dx12,xmm4
  298. else
  299.        mov      ax,word[.b_x3]
  300.        sub      ax,word[.b_x1]
  301.        cwde
  302. ;       shl      eax,ROUND
  303. ;       cdq
  304.        imul      ebx
  305.        sar      eax,15 - ROUND
  306.  ;      mov      .dbx23,eax
  307.        push      eax
  308.  
  309.        mov      ax,word[.b_y3]
  310.        sub      ax,word[.b_y1]
  311.        cwde
  312.        imul     ebx
  313.        sar      eax,15 - ROUND
  314.  ;      mov      .dbx23,eax
  315.        push      eax
  316.  
  317.        mov      ax,word[.e_x3]
  318.        sub      ax,word[.e_x1]
  319.        cwde
  320.        imul      ebx
  321.        sar      eax,15 - ROUND
  322.  ;      mov      .dbx23,eax
  323.        push      eax
  324.  
  325.        mov      ax,word[.e_y3]
  326.        sub      ax,word[.e_y1]
  327.        cwde
  328.        imul      ebx
  329.        sar      eax,15 - ROUND
  330.  ;      mov      .dbx23,eax
  331.        push      eax
  332.  end if
  333.         mov     ax,.z3
  334.         sub     ax,.z1
  335.         cwde
  336.         imul    ebx
  337.         sar     eax,15 - ROUND
  338.         push    eax
  339.   ;      mov     .dz13,eax
  340.  
  341.    .bt_dx13_done:
  342.  
  343.  
  344.        mov      bx,.y3       ; calc delta23
  345.        sub      bx,.y2
  346.        jnz      .bt_dx23_make
  347.        mov      ecx,6
  348.        xor      edx,edx
  349.      @@:
  350.        push     edx   ;dword 0
  351.        loop     @b
  352.   ;     movq     .dbx23,xmm7
  353.   ;     movdqu   .dz23,xmm7
  354.  
  355.        jmp      .bt_dx23_done
  356.  .bt_dx23_make:
  357.  
  358.  
  359.        movsx    ebx,bx
  360.        mov      eax,1 shl 15
  361.        cdq
  362.        idiv     ebx
  363.     ;   push     eax
  364.        mov      ebx,eax
  365.  
  366.  
  367.        mov      ax,.x3
  368.        sub      ax,.x2
  369.        cwde
  370.        imul     ebx
  371.        sar      eax,15 - ROUND
  372.        push     eax
  373.  ;      mov      .dx23,eax
  374.  
  375. if Ext >= SSE2
  376.        sub       esp,4*4
  377.        movd      xmm0,ebx
  378.        pshuflw   xmm0,xmm0,0
  379.        movq      xmm1,[.e_x2]
  380.        movq      xmm2,[.e_x3]
  381.        psubw     xmm2,xmm1
  382.        movdqa    xmm3,xmm2
  383.        pmullw    xmm2,xmm0
  384.        pmulhw    xmm3,xmm0
  385.        punpcklwd xmm2,xmm3
  386.        psrad     xmm2,15 - ROUND
  387.        pshufd    xmm2,xmm2,10110001b
  388.        movdqu    .dey23q,xmm2
  389. else
  390.  
  391.        mov      ax,word[.b_x3]
  392.        sub      ax,word[.b_x2]
  393.        cwde
  394. ;       shl      eax,ROUND
  395. ;       cdq
  396.        imul      ebx
  397.        sar      eax,15 - ROUND
  398.  ;      mov      .dbx23,eax
  399.        push      eax
  400.  
  401.        mov      ax,word[.b_y3]
  402.        sub      ax,word[.b_y2]
  403.        cwde
  404.        imul     ebx
  405.        sar      eax,15 - ROUND
  406.  ;      mov      .dbx23,eax
  407.        push      eax
  408.  
  409.        mov      ax,word[.e_x3]
  410.        sub      ax,word[.e_x2]
  411.        cwde
  412.        imul      ebx
  413.        sar      eax,15 - ROUND
  414.  ;      mov      .dbx23,eax
  415.        push      eax
  416.  
  417.        mov      ax,word[.e_y3]
  418.        sub      ax,word[.e_y2]
  419.        cwde
  420.        imul      ebx
  421.        sar      eax,15 - ROUND
  422.  ;      mov      .dbx23,eax
  423.        push      eax
  424. end if
  425.  
  426.  
  427.         mov     ax,.z3
  428.         sub     ax,.z2
  429.         cwde
  430.         imul    ebx
  431.         sar     eax,15 - ROUND
  432.         push    eax
  433.   ;      mov     .dz23,eax
  434.  
  435.  
  436.  
  437.  
  438.  
  439.  
  440.  
  441.    .bt_dx23_done:
  442.  
  443.        movsx    eax,.x1
  444.        shl      eax,ROUND
  445.      ;  mov      .cx1,eax
  446.      ;  mov      .cx2,eax
  447.        push     eax eax
  448.      ; push     eax
  449.        sub      esp,32
  450.       ; push     eax eax
  451.       ;push     eax
  452.  
  453.        movsx    eax,.z1
  454.        shl      eax,CATMULL_SHIFT
  455.       ; mov      .cz1,eax
  456.       ; mov      .cz2,eax
  457.       push     eax eax
  458.       ;push     eax
  459.  
  460.        movsx    eax,word[.b_x1]
  461.        shl      eax,ROUND
  462.        mov      .cbx1,eax
  463.        mov      .cbx2,eax
  464.      ;  push     eax eax
  465.      ; push     eax
  466.  
  467.        movsx    eax,word[.b_y1]
  468.        shl      eax,ROUND
  469.        mov      .cby1,eax
  470.        mov      .cby2,eax
  471.      ;  push     eax eax
  472.      ; push     eax
  473.  
  474.        movsx    eax,word[.e_x1]
  475.        shl      eax,ROUND
  476.        mov      .cex1,eax
  477.        mov      .cex2,eax
  478.       ; push     eax eax
  479.       ;push     eax
  480.  
  481.        movsx    eax,word[.e_y1]
  482.        shl      eax,ROUND
  483.        mov      .cey1,eax
  484.        mov      .cey2,eax
  485.  
  486.        movsx    ecx,.y1
  487.        cmp      cx,.y2
  488.        jge      .loop12_done
  489.   .loop12:
  490.        call     .call_line
  491.  
  492.        mov      eax,.dx13
  493.        add      .cx1,eax
  494.        mov      ebx,.dx12
  495.        add      .cx2,ebx
  496. if Ext>= SSE2
  497.        movups   xmm0,.cey1
  498.        movups   xmm1,.cey2
  499.        movups   xmm2,.dey12q
  500.        movups   xmm3,.dey13q
  501.        paddd    xmm0,xmm3
  502.        paddd    xmm1,xmm2
  503.        movups   .cey1,xmm0
  504.        movups   .cey2,xmm1
  505. else if (Ext = MMX) | (Ext=SSE)
  506.        movq     mm0,.cby2       ; with this optimization object
  507.        movq     mm1,.cby1       ; looks bit annoying
  508.        movq     mm2,.cey2
  509.        movq     mm3,.cey1
  510.        paddd    mm0,.dby12q
  511.        paddd    mm1,.dby13q
  512.        paddd    mm2,.dey12q
  513.        paddd    mm3,.dey13q
  514.        movq     .cby2,mm0
  515.        movq     .cby1,mm1
  516.        movq     .cey1,mm3
  517.        movq     .cey2,mm2
  518. else
  519.        mov      edx,.dbx13
  520.        add      .cbx1,edx
  521.        mov      eax,.dbx12
  522.        add      .cbx2,eax
  523.        mov      ebx,.dby13
  524.        add      .cby1,ebx
  525.        mov      edx,.dby12
  526.        add      .cby2,edx
  527.  
  528.        mov      eax,.dex13
  529.        add      .cex1,eax
  530.        mov      ebx,.dex12
  531.        add      .cex2,ebx
  532.        mov      edx,.dey13
  533.        add      .cey1,edx
  534.        mov      eax,.dey12
  535.        add      .cey2,eax
  536.  
  537. end if
  538.        mov      ebx,.dz13
  539.        add      .cz1,ebx
  540.        mov      edx,.dz12
  541.        add      .cz2,edx
  542.  
  543.        inc      ecx
  544.        cmp      cx,.y2
  545.        jl       .loop12
  546.     .loop12_done:
  547.  
  548.        movsx    ecx,.y2
  549.        cmp      cx,.y3
  550.        jge      .loop23_done
  551.  
  552.        movsx    eax,.z2
  553.        shl      eax,CATMULL_SHIFT
  554.        mov      .cz2,eax
  555.  
  556.        movsx    eax,.x2
  557.        shl      eax,ROUND
  558.        mov      .cx2,eax
  559.  
  560.        movzx    eax,word[.b_x2]
  561.        shl      eax,ROUND
  562.        mov      .cbx2,eax
  563.  
  564.        movzx    eax,word[.b_y2]
  565.        shl      eax,ROUND
  566.        mov      .cby2,eax
  567.  
  568.        movzx    eax,word[.e_x2]
  569.        shl      eax,ROUND
  570.        mov      .cex2,eax
  571.  
  572.        movzx    eax,word[.e_y2]
  573.        shl      eax,ROUND
  574.        mov      .cey2,eax
  575.  
  576.      .loop23:
  577.        call     .call_line
  578. ;if Ext = NON
  579.        mov      eax,.dx13
  580.        add      .cx1,eax
  581.        mov      ebx,.dx23
  582.        add      .cx2,ebx
  583. if Ext>= SSE2
  584.        movups   xmm0,.cey1
  585.        movups   xmm1,.cey2
  586.        movups   xmm2,.dey23q
  587.        movups   xmm3,.dey13q
  588.        paddd    xmm0,xmm3
  589.        paddd    xmm1,xmm2
  590.        movups   .cey1,xmm0
  591.        movups   .cey2,xmm1
  592. else if (Ext = MMX) | ( Ext = SSE)
  593.        movq     mm0,.cby2        ;    with this mmx optimization object looks bit
  594.        movq     mm1,.cby1        ;    annoying
  595.        movq     mm2,.cey2
  596.        movq     mm3,.cey1
  597.        paddd    mm0,.dby23q
  598.        paddd    mm1,.dby13q
  599.        paddd    mm2,.dey23q
  600.        paddd    mm3,.dey13q
  601.        movq     .cby2,mm0
  602.        movq     .cby1,mm1
  603.        movq     .cey2,mm2
  604.        movq     .cey1,mm3
  605.  
  606. else
  607.        mov      edx,.dbx13
  608.        add      .cbx1,edx
  609.        mov      eax,.dbx23
  610.        add      .cbx2,eax
  611.        mov      ebx,.dby13
  612.        add      .cby1,ebx
  613.        mov      edx,.dby23
  614.        add      .cby2,edx
  615.  
  616.        mov      eax,.dex13
  617.        add      .cex1,eax
  618.        mov      ebx,.dex23
  619.        add      .cex2,ebx
  620.        mov      edx,.dey13
  621.        add      .cey1,edx
  622.        mov      eax,.dey23
  623.        add      .cey2,eax
  624. end if
  625.  
  626.        mov      ebx,.dz13
  627.        add      .cz1,ebx
  628.        mov      edx,.dz23
  629.        add      .cz2,edx
  630. ;else
  631. ;       movq     mm0,.db13q
  632. ;       movq     mm1,.cbx1q
  633.  
  634.        inc      ecx
  635.        cmp      cx,.y3
  636.        jl       .loop23
  637.     .loop23_done:
  638.  
  639.        mov      esp,ebp
  640. ret   34
  641.  
  642. .call_line:
  643.  
  644.        pushad
  645.  
  646.        push     .cz1
  647.        push     .cz2
  648.        push     .z_buff
  649.        push     .t_bmap
  650.        push     .t_emap
  651.        push     dword .cey2
  652.        push     .cex2
  653.        push     dword .cey1
  654.        push     .cex1
  655.        push     dword .cby2
  656.        push     .cbx2
  657.        push     dword .cby1
  658.        push     .cbx1
  659.        push     ecx
  660.  
  661.        mov      eax,.cx1
  662.        sar      eax,ROUND
  663.        mov      ebx,.cx2
  664.        sar      ebx,ROUND
  665.  
  666.        call     two_tex_line_z
  667.  
  668.        popad
  669. ret
  670. two_tex_line_z:
  671. ;--------------in: eax - x1
  672. ;--------------    ebx - x2
  673. ;--------------    edi - pointer to screen buffer
  674. ;stack - another parameters :
  675. .y      equ dword [ebp+4]
  676. .bx1    equ  [ebp+8]   ;   ---
  677. .by1    equ  [ebp+12]  ;       |
  678. .bx2    equ  [ebp+16]  ;       |
  679. .by2    equ  [ebp+20]  ;       |>   b. texture and e. texture coords
  680. .ex1    equ  [ebp+24]  ;       |>   shifted shl ROUND
  681. .ey1    equ  [ebp+28]  ;       |
  682. .ex2    equ  [ebp+32]  ;       |
  683. .ey2    equ  [ebp+36]  ;   ---
  684. .emap   equ  [ebp+40]  ; b texture offset
  685. .bmap   equ  [ebp+44]  ; e texture offset
  686. .z_buff equ dword [ebp+48]
  687. .z2     equ dword [ebp+52]  ;   -- |>   z coords shifted
  688. .z1     equ dword [ebp+56]  ;   --       shl  CATMULL_SHIFT
  689.  
  690. .x1     equ dword [ebp-4]
  691. .x2     equ dword [ebp-8]
  692. .dbx    equ [ebp-12]
  693. .dex    equ [ebp-16]
  694. .dby    equ [ebp-20]
  695. .dey    equ [ebp-24]
  696. .dz     equ dword [ebp-28]
  697. .cbx    equ [ebp-32]
  698. .cex    equ [ebp-36]
  699. .cby    equ [ebp-40]
  700. .cey    equ [ebp-44]
  701. .cz     equ dword [ebp-48]
  702. .czbuff equ dword [ebp-52]
  703.  
  704.         mov     ebp,esp
  705.  
  706.         mov     ecx,.y
  707.         or      ecx,ecx
  708.         jl      .bl_end
  709.         mov     dx,word[size_y_var]
  710.         dec     dx
  711.         cmp     cx,dx   ;word[size_y_var]  ;SIZE_Y
  712.         jge     .bl_end
  713.  
  714.         cmp     eax,ebx
  715.         jl      @f
  716.         je      .bl_end
  717.  
  718.         xchg    eax,ebx
  719. if Ext=NON
  720.         mov     edx,.bx1
  721.         xchg    edx,.bx2
  722.         mov     .bx1,edx
  723.         mov     edx,.by1
  724.         xchg    edx,.by2
  725.         mov     .by1,edx
  726.  
  727.         mov     edx,.ex1
  728.         xchg    edx,.ex2
  729.         mov     .ex1,edx
  730.         mov     edx,.ey1
  731.         xchg    edx,.ey2
  732.         mov     .ey1,edx
  733. else
  734.         movq    mm0,.bx1
  735.         movq    mm1,.ex1
  736.         movq    mm2,.bx2
  737.         movq    mm3,.ex2
  738.         movq    .bx2,mm0
  739.         movq    .ex2,mm1
  740.         movq    .bx1,mm2
  741.         movq    .ex1,mm3
  742. end if
  743.         mov     edx,.z1
  744.         xchg    edx,.z2
  745.         mov     .z1,edx
  746.     @@:
  747.         push    eax ebx    ;store x1, x2
  748.         mov     ebx,.x1
  749.         movzx   edx,word[size_x_var]
  750.         dec     edx
  751.         cmp     ebx,edx
  752.   ;      cmp     bx,word[size_x_var]  ;SIZE_X
  753.         jg      .bl_end
  754.         cmp     .x2,0
  755.         jle     .bl_end
  756.  
  757.         mov     ebx,.x2
  758.         sub     ebx,.x1
  759.  
  760. if  Ext >= SSE
  761.  
  762.        sub       esp,16
  763.        cvtsi2ss  xmm3,ebx            ;rcps
  764.        shufps    xmm3,xmm3,0
  765.  
  766.   ;     movq      mm0,.bx1q
  767.   ;     movq      mm1,.bx2q
  768.   ;     movq      mm2,.ex1q
  769.   ;     movq      mm3,.ex2q
  770.   ;     psubd     mm1,mm0
  771.   ;     psubd     mm3,mm2
  772.   ;     cvtpi2ps  xmm1,mm1
  773.   ;     movlhps   xmm1,xmm1
  774.   ;     cvtpi2ps  xmm1,mm3
  775.  
  776.        cvtpi2ps  xmm0,.bx1 ;mm0     ; bx1; by1
  777.        movlhps   xmm0,xmm0
  778.        cvtpi2ps  xmm0,.ex1 ;mm2     ; ex1; ey1
  779.        cvtpi2ps  xmm1,.bx2 ;mm1     ; bx2; by2
  780.        movlhps   xmm1,xmm1
  781.        cvtpi2ps  xmm1,.ex2 ;mm3     ; ex2; ey2
  782.        subps     xmm1,xmm0
  783.                                     ; hi             lo
  784.        divps     xmm1,xmm3 ; xmm1 -> dby; dbx; dey; dex
  785.  
  786.        shufps    xmm1,xmm1,11011000b
  787.        cvtps2pi  mm0,xmm1          ; mm0 -> 2 delta dwords
  788.        movhlps   xmm1,xmm1
  789.        cvtps2pi  mm1,xmm1
  790.        movq      .dex,mm0 ; hi - lo  ->  dbx, dex
  791.        movq      .dey,mm1 ; hi - lo  ->  dby, dey
  792.  
  793. else
  794.  
  795.  
  796.  
  797.  
  798.  
  799.  
  800.         mov     eax,.bx2       ; calc .dbx
  801.         sub     eax,.bx1
  802.         cdq
  803.         idiv    ebx
  804.         push    eax
  805.  
  806.         mov     eax,.ex2       ; calc .dby
  807.         sub     eax,.ex1
  808.         cdq
  809.         idiv    ebx
  810.         push    eax
  811.  
  812.         mov     eax,.by2       ; calc .dex
  813.         sub     eax,.by1
  814.         cdq
  815.         idiv    ebx
  816.         push    eax
  817.  
  818.         mov     eax,.ey2       ; calc .dey
  819.         sub     eax,.ey1
  820.         cdq
  821.         idiv    ebx
  822.         push    eax
  823.  
  824. end if
  825.  
  826.         mov     eax,.z2        ; calc .dz
  827.         sub     eax,.z1
  828.         cdq
  829.         idiv    ebx
  830.         push    eax
  831.  
  832.         cmp     .x1,0         ; set correctly begin variable
  833.         jge     @f            ; CLIPPING ON FUNCTION
  834.                               ; cutting triangle exceedes screen
  835.         mov     ebx,.x1
  836.         neg     ebx
  837.         imul    ebx           ; eax = .dz * abs(.x1)
  838.         add     .z1,eax
  839.         mov     .x1,0
  840.  
  841.         mov     eax,.dbx
  842.         imul    ebx
  843.         add    .bx1,eax
  844.  
  845.         mov     eax,.dby
  846.         imul    ebx
  847.         add     .by1,eax
  848.  
  849.         mov     eax,.dex
  850.         imul    ebx
  851.         add     .ex1,eax
  852.  
  853.         mov     eax,.dey
  854.         imul    ebx
  855.         add     .ey1,eax
  856.       @@:
  857.         movzx   eax,word[size_x_var] ;SIZE_X  ;word[size_x_var]
  858.         mov     ebx,.x2
  859.         cmp     eax,ebx
  860.         jg      @f
  861.         mov     .x2,eax
  862.       @@:
  863.       ;  movd    mm0,eax
  864.       ;  movd    mm1,.x2
  865.       ;  pminsw  mm0,mm1
  866.       ;  movd    .x2,mm0
  867.  ;       cmp     .x2,SIZE_X  ;eax   |
  868.  ;       jl      @f                 |>       this dont work idk cause
  869.  ;       mov     .x2,SIZE_X ;eax    |
  870.       @@:
  871.       ;  movzx   eax,word[size_x_var]       ;calc memory begin in buffers
  872.         mov     ebx,.y
  873.         mul     ebx
  874.         mov     ebx,.x1
  875.         add     eax,ebx
  876.         mov     ebx,eax
  877.         lea     eax,[eax*3]
  878.         add     edi,eax           ; edi - screen
  879.         mov     esi,.z_buff       ; z-buffer filled with dd variables
  880.         shl     ebx,2
  881.         add     esi,ebx           ; esi - Z buffer
  882.  
  883.         mov     ecx,.x2
  884.         sub     ecx,.x1
  885.         ; init current variables
  886.         push    dword .bx1 ;.by1 .ex1 .ey1 .z1 esi
  887.         push    dword .ex1
  888.         push    dword .by1
  889.         push    dword .ey1
  890.  
  891.         push    .z1              ; current z shl CATMULL_SHIFT
  892.         push    esi
  893.  
  894. if Ext >= MMX
  895.      pxor   mm0,mm0
  896.      movq   mm3,.cex   ; hi - lo -> cbx; cex
  897.      movq   mm4,.cey   ; hi - lo -> cby; cey
  898. ;     movq   mm5,mm3
  899. ;     movq   mm6,mm4
  900. ;     psrad  mm5,ROUND
  901. ;     psrad  mm6,ROUND
  902. ;     movq   .ceyq,mm5
  903. ;     movq   .cbyq,mm6
  904.      mov    edx,.czbuff
  905. else
  906.      cld
  907. end if
  908.      .draw:
  909.     ; if TEX = SHIFTING   ;bump drawing only in shifting mode
  910. if Ext=NON
  911.         mov     esi,.czbuff      ; .czbuff current address in buffer
  912.         mov     ebx,.cz          ; .cz - cur z position
  913.         cmp     ebx,dword[esi]
  914. else
  915.         mov     ebx,.cz
  916.         cmp     ebx,dword[edx]
  917. end if
  918.         jge     .skip
  919.  
  920. if Ext=NON
  921.         mov     eax,.cby
  922.         mov     esi,.cbx
  923.         sar     eax,ROUND
  924.         sar     esi,ROUND
  925.         shl     eax,TEX_SHIFT   ;-
  926.         add     esi,eax
  927.         lea     esi,[esi*3]         ;-  ; esi - current b. texture addres
  928.         add     esi,.bmap
  929.  
  930.         mov     ebx,.cex       ;.cex - current env map X
  931.         mov     eax,.cey       ;.cey - current  env map y
  932.         sar     ebx,ROUND
  933.         sar     eax,ROUND
  934.  
  935.         shl     eax,TEX_SHIFT
  936.         add     ebx,eax
  937.         lea     ebx,[ebx*3]
  938.         add     ebx,.emap
  939.  
  940.  
  941. else
  942.         movq    mm5,mm4 ;.cey
  943.         psrad   mm5,ROUND
  944.         pslld   mm5,TEX_SHIFT
  945.         movq    mm6,mm3 ;.cex
  946.         psrad   mm6,ROUND
  947.         paddd   mm5,mm6
  948.         movq    mm6,mm5
  949.         paddd   mm5,mm5
  950.         paddd   mm5,mm6
  951.         paddd   mm5,.emap
  952.         movd    esi,mm5
  953.         psrlq   mm5,32
  954.         movd    ebx,mm5
  955. end if
  956. if Ext>=MMX
  957.         movd      mm1,[esi]
  958.         movd      mm2,[ebx]
  959.         punpcklbw mm1,mm0
  960.         punpcklbw mm2,mm0
  961.         pmullw    mm1,mm2
  962.         psrlw     mm1,8
  963.         packuswb  mm1,mm0
  964.         movd      [edi],mm1
  965.         mov       ebx,.cz
  966.         mov       dword[edx],ebx
  967. else
  968.         cld                     ; esi - tex e.
  969.         lodsb                   ; ebx - tex b.
  970.         mov     dl,[ebx]
  971.         mul     dl
  972.         shr     ax,8
  973.         stosb
  974.         inc     ebx
  975.         lodsb
  976.         mov     dl,[ebx]
  977.         mul     dl
  978.         shr     ax,8
  979.         stosb
  980.         inc     ebx
  981.         lodsb
  982.         mov     dl,[ebx]
  983.         mul     dl
  984.         shr     ax,8
  985.         stosb
  986.         mov     ebx,.cz
  987.         mov     esi,.czbuff
  988.         mov     dword[esi],ebx
  989.         jmp     .no_skip
  990. end if
  991.      .skip:
  992.         add     edi,3
  993.  
  994.    if Ext = NON
  995.      .no_skip:
  996.         add     .czbuff,4
  997.         mov     eax,.dbx
  998.         add     .cbx,eax
  999.         mov     eax,.dby
  1000.         add     .cby,eax
  1001.         mov     eax,.dex
  1002.         add     .cex,eax
  1003.         mov     eax,.dey
  1004.         add     .cey,eax
  1005.     else
  1006.         add     edx,4
  1007.         paddd   mm3,.dex
  1008.         paddd   mm4,.dey
  1009.   ;      movq    mm5,mm3
  1010.   ;      movq    mm6,mm4
  1011.   ;      psrad   mm5,ROUND
  1012.   ;      psrad   mm6,ROUND
  1013.      ;   movq    .cex,mm3
  1014.      ;   movq    .cey,mm4
  1015.     end if
  1016.         mov     eax,.dz
  1017.         add     .cz,eax
  1018.     if Ext = NON
  1019.         dec     ecx
  1020.         jnz     .draw
  1021.     else
  1022.         loop    .draw
  1023.     end if
  1024.  
  1025.   .bl_end:
  1026.         mov     esp,ebp
  1027. ret 56
  1028. ;Ext = SSE2
  1029. ;the_zero:
  1030. ;size_y_var:
  1031. ;size_x_var:
  1032.  
  1033.