Subversion Repositories Kolibri OS

Rev

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