Subversion Repositories Kolibri OS

Rev

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_emap
  720.        push     .t_bmap
  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. .bx1q   equ       [ebp+8]
  747. .bx1    equ dword [ebp+8]   ;   ---
  748. .by1    equ dword [ebp+12]  ;       |
  749. .bx2q   equ       [ebp+16]
  750. .bx2    equ dword [ebp+16]  ;       |
  751. .by2    equ dword [ebp+20]  ;       |>   b. texture and e. texture coords
  752. .ex1q   equ       [ebp+24]
  753. .ex1    equ dword [ebp+24]  ;       |>   shifted shl ROUND
  754. .ey1    equ dword [ebp+28]  ;       |
  755. .ex2q   equ       [ebp+32]
  756. .ex2    equ dword [ebp+32]  ;       |
  757. .ey2    equ dword [ebp+36]  ;   ---
  758. .bmap   equ dword [ebp+40]  ; b texture offset
  759. .emap   equ dword [ebp+44]  ; e texture offset
  760. .z_buff equ dword [ebp+48]
  761. .z2     equ dword [ebp+52]  ;   -- |>   z coords shifted
  762. .z1     equ dword [ebp+56]  ;   --       shl  CATMULL_SHIFT
  763.  
  764. .x1     equ dword [ebp-4]
  765. .x2     equ dword [ebp-8]
  766. .dbx    equ dword [ebp-12]
  767. .dby    equ dword [ebp-16]
  768. .dbyq   equ qword [ebp-16]  ; - new
  769. .dex    equ dword [ebp-20]
  770. .dey    equ dword [ebp-24]
  771. .deyq   equ qword [ebp-24]  ; - new
  772. .dz     equ dword [ebp-28]
  773. .cbx    equ dword [ebp-32]
  774. .cby    equ dword [ebp-36]
  775. .cbyq   equ qword [ebp-36]  ; - new
  776. .cex    equ dword [ebp-40]
  777. .cey    equ dword [ebp-44]
  778. .ceyq   equ qword [ebp-44]  ; - new
  779. .cz     equ dword [ebp-48]
  780. .czbuff equ dword [ebp-52]
  781.  
  782.         mov     ebp,esp
  783.  
  784.         mov     ecx,.y
  785.         or      ecx,ecx
  786.         jl      .bl_end
  787.         cmp     ecx,SIZE_Y
  788.         jge     .bl_end
  789.  
  790.         cmp     eax,ebx
  791.         jl      @f
  792.         je      .bl_end
  793.  
  794.         xchg    eax,ebx
  795. if Ext=NON
  796.         mov     edx,.bx1
  797.         xchg    edx,.bx2
  798.         mov     .bx1,edx
  799.         mov     edx,.by1
  800.         xchg    edx,.by2
  801.         mov     .by1,edx
  802.  
  803.         mov     edx,.ex1
  804.         xchg    edx,.ex2
  805.         mov     .ex1,edx
  806.         mov     edx,.ey1
  807.         xchg    edx,.ey2
  808.         mov     .ey1,edx
  809. else
  810.         movq    mm0,.bx1q
  811.         movq    mm1,.ex1q
  812.         movq    mm2,.bx2q
  813.         movq    mm3,.ex2q
  814.         movq    .bx2q,mm0
  815.         movq    .ex2q,mm1
  816.         movq    .bx1q,mm2
  817.         movq    .ex1q,mm3
  818. end if
  819.         mov     edx,.z1
  820.         xchg    edx,.z2
  821.         mov     .z1,edx
  822.     @@:
  823.         push    eax ebx
  824. ;        push    ebx           ;store x1, x2
  825.  
  826.         cmp     .x1,SIZE_X
  827.         jge     .bl_end
  828.         cmp     .x2,0
  829.         jle     .bl_end
  830.  
  831.         mov     ebx,.x2
  832.         sub     ebx,.x1
  833.  
  834. if Ext=SSE
  835.  
  836.        sub       esp,16
  837.        cvtsi2ss  xmm3,ebx            ;rcps
  838.        shufps    xmm3,xmm3,0
  839.  
  840.   ;     movq      mm0,.bx1q
  841.   ;     movq      mm1,.bx2q
  842.   ;     movq      mm2,.ex1q
  843.   ;     movq      mm3,.ex2q
  844.   ;     psubd     mm1,mm0
  845.   ;     psubd     mm3,mm2
  846.   ;     cvtpi2ps  xmm1,mm1
  847.   ;     movlhps   xmm1,xmm1
  848.   ;     cvtpi2ps  xmm1,mm3
  849.  
  850.        cvtpi2ps  xmm0,.bx1q ;mm0
  851.        movlhps   xmm0,xmm0
  852.        cvtpi2ps  xmm0,.ex1q ;mm2
  853.        cvtpi2ps  xmm1,.bx2q ;mm1
  854.        movlhps   xmm1,xmm1
  855.        cvtpi2ps  xmm1,.ex2q ;mm3
  856.        subps     xmm1,xmm0
  857.  
  858.        divps     xmm1,xmm3
  859.  
  860.        shufps    xmm1,xmm1,10110001b
  861.        cvtps2pi  mm0,xmm1          ; mm0 -> 2 delta dwords
  862.        movhlps   xmm1,xmm1
  863.        cvtps2pi  mm1,xmm1
  864.        movq      .deyq,mm0
  865.        movq      .dbyq,mm1
  866.  
  867. else
  868.  
  869.         mov     eax,.bx2       ; calc .dbx
  870.         sub     eax,.bx1
  871.         cdq
  872.         idiv    ebx
  873.         push    eax
  874.  
  875.         mov     eax,.by2       ; calc .dby
  876.         sub     eax,.by1
  877.         cdq
  878.         idiv    ebx
  879.         push    eax
  880.  
  881.         mov     eax,.ex2       ; calc .dex
  882.         sub     eax,.ex1
  883.         cdq
  884.         idiv    ebx
  885.         push    eax
  886.  
  887.         mov     eax,.ey2       ; calc .dey
  888.         sub     eax,.ey1
  889.         cdq
  890.         idiv    ebx
  891.         push    eax
  892.  
  893. end if
  894.  
  895.         mov     eax,.z2        ; calc .dz
  896.         sub     eax,.z1
  897.         cdq
  898.         idiv    ebx
  899.         push    eax
  900.  
  901.         cmp     .x1,0         ; set correctly begin variable
  902.         jge     @f            ; CLIPPING ON FUNCTION
  903.                               ; cutting triangle exceedes screen
  904.         mov     ebx,.x1
  905.         neg     ebx
  906.         imul    ebx           ; eax = .dz * abs(.x1)
  907.         add     .z1,eax
  908.         mov     .x1,0
  909.  
  910.         mov     eax,.dbx
  911.         imul    ebx
  912.         add    .bx1,eax
  913.  
  914.         mov     eax,.dby
  915.         imul    ebx
  916.         add     .by1,eax
  917.  
  918.         mov     eax,.dex
  919.         imul    ebx
  920.         add     .ex1,eax
  921.  
  922.         mov     eax,.dey
  923.         imul    ebx
  924.         add     .ey1,eax
  925.       @@:
  926.         cmp     .x2,SIZE_X
  927.         jl      @f
  928.         mov     .x2,SIZE_X
  929.       @@:
  930.         mov     eax,SIZE_X       ;calc memory begin in buffers
  931.         mov     ebx,.y
  932.         mul     ebx
  933.         mov     ebx,.x1
  934.         add     eax,ebx
  935.         mov     ebx,eax
  936.         lea     eax,[eax*3]
  937.         add     edi,eax           ; edi - screen
  938.         mov     esi,.z_buff       ; z-buffer filled with dd variables
  939.         shl     ebx,2
  940.         add     esi,ebx           ; esi - Z buffer
  941.  
  942.         mov     ecx,.x2
  943.         sub     ecx,.x1
  944.         ; init current variables
  945.         push    .bx1 .by1 .ex1 .ey1 .z1 esi
  946. ;        push    .by1
  947. ;        push    .ex1
  948. ;        push    .ey1
  949.  
  950. ;        push    .z1              ; current z shl CATMULL_SHIFT
  951. ;        push    esi
  952.  
  953. if Ext >= MMX
  954.      pxor   mm0,mm0
  955.      movq   mm3,.ceyq
  956.      movq   mm4,.cbyq
  957. ;     movq   mm5,mm3
  958. ;     movq   mm6,mm4
  959. ;     psrad  mm5,ROUND
  960. ;     psrad  mm6,ROUND
  961. ;     movq   .ceyq,mm5
  962. ;     movq   .cbyq,mm6
  963.      mov    edx,.czbuff
  964. else
  965.      cld
  966. end if
  967.      .draw:
  968.     ; if TEX = SHIFTING   ;bump drawing only in shifting mode
  969. if Ext=NON
  970.         mov     esi,.czbuff      ; .czbuff current address in buffer
  971.         mov     ebx,.cz          ; .cz - cur z position
  972.         cmp     ebx,dword[esi]
  973. else
  974.         mov     ebx,.cz
  975.         cmp     ebx,dword[edx]
  976. end if
  977.         jge     .skip
  978.  
  979. ;if Ext=NON
  980.         mov     eax,.cby
  981.         mov     esi,.cbx
  982.         sar     eax,ROUND
  983.         sar     esi,ROUND
  984. ;else
  985. ;        movd    eax,mm6
  986. ;        psrlq   mm6,32
  987. ;        movd    esi,mm6
  988. ;end if
  989.         shl     eax,TEX_SHIFT   ;-
  990.         add     esi,eax
  991.         lea     esi,[esi*3]         ;-  ; esi - current b. texture addres
  992.         add     esi,.bmap
  993.  
  994. ;if Ext=NON
  995.         mov     ebx,.cex       ;.cex - current env map X
  996.         mov     eax,.cey       ;.cey - current  env map y
  997.         sar     ebx,ROUND
  998.         sar     eax,ROUND
  999. ;else
  1000. ;        movd    eax,mm5
  1001. ;        psrlq   mm5,32
  1002. ;        movd    ebx,mm5
  1003. ;end if
  1004.         shl     eax,TEX_SHIFT
  1005.         add     ebx,eax
  1006.         lea     ebx,[ebx*3]
  1007.         add     ebx,.emap
  1008. if Ext>=MMX
  1009.         movd      mm1,[esi]
  1010.         movd      mm2,[ebx]
  1011.         punpcklbw mm1,mm0
  1012.         punpcklbw mm2,mm0
  1013.         pmullw    mm1,mm2
  1014.         psrlw     mm1,8
  1015.         packuswb  mm1,mm0
  1016.         movd      [edi],mm1
  1017.         mov       ebx,.cz
  1018.         mov       dword[edx],ebx
  1019. else
  1020.         cld                     ; esi - tex e.
  1021.         lodsb                   ; ebx - tex b.
  1022.         mov     dl,[ebx]
  1023.         mul     dl
  1024.         shr     ax,8
  1025.         stosb
  1026.         inc     ebx
  1027.         lodsb
  1028.         mov     dl,[ebx]
  1029.         mul     dl
  1030.         shr     ax,8
  1031.         stosb
  1032.         inc     ebx
  1033.         lodsb
  1034.         mov     dl,[ebx]
  1035.         mul     dl
  1036.         shr     ax,8
  1037.         stosb
  1038.         mov     ebx,.cz
  1039.         mov     esi,.czbuff
  1040.         mov     dword[esi],ebx
  1041.         jmp     .no_skip
  1042. end if
  1043.      .skip:
  1044.         add     edi,3
  1045.  
  1046.    if Ext = NON
  1047.      .no_skip:
  1048.         add     .czbuff,4
  1049.         mov     eax,.dbx
  1050.         add     .cbx,eax
  1051.         mov     eax,.dby
  1052.         add     .cby,eax
  1053.         mov     eax,.dex
  1054.         add     .cex,eax
  1055.         mov     eax,.dey
  1056.         add     .cey,eax
  1057.     else
  1058.         add     edx,4
  1059.         paddd   mm3,.deyq
  1060.         paddd   mm4,.dbyq
  1061.   ;      movq    mm5,mm3
  1062.   ;      movq    mm6,mm4
  1063.   ;      psrad   mm5,ROUND
  1064.   ;      psrad   mm6,ROUND
  1065.         movq    .ceyq,mm3
  1066.         movq    .cbyq,mm4
  1067.     end if
  1068.         mov     eax,.dz
  1069.         add     .cz,eax
  1070.     if Ext = NON
  1071.         dec     ecx
  1072.         jnz     .draw
  1073.     else
  1074.         loop    .draw
  1075.     end if
  1076.  
  1077.   .bl_end:
  1078.         mov     esp,ebp
  1079. ret 56
  1080.  
  1081.