Subversion Repositories Kolibri OS

Rev

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

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