Subversion Repositories Kolibri OS

Rev

Blame | 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. .cbx2  equ dword[ebp-120]
  85. .cby2  equ      [ebp-124]
  86. .cex1  equ dword[ebp-128]
  87. .cey1  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.  
  537. if Ext >= MMX
  538.        movq     mm0,.cby2
  539.        movq     mm1,.cby1
  540.        movq     mm2,.cey2
  541.        movq     mm3,.cey1
  542.        movq     mm4,.cz1
  543.        movq     mm5,.cz2
  544.        paddd    mm0,.dby12
  545.        paddd    mm1,.dby13
  546.        paddd    mm2,.dey12
  547.        paddd    mm3,.dey13
  548.        paddd    mm4,.dz13
  549.        paddd    mm5,.dz12
  550.        movq     .cby2,mm0
  551.        movq     .cby1,mm1
  552.        movq     .cey1,mm3
  553.        movq     .cey2,mm2
  554.        movq     .cz1,mm4
  555.        movq     .cz2,mm5
  556. else
  557.        mov      edx,.dbx13
  558.        add      .cbx1,edx
  559.        mov      eax,.dbx12
  560.        add      .cbx2,eax
  561.        mov      ebx,.dby13
  562.        add      .cby1,ebx
  563.        mov      edx,.dby12
  564.        add      .cby2,edx
  565.  
  566.        mov      eax,.dex13
  567.        add      .cex1,eax
  568.        mov      ebx,.dex12
  569.        add      .cex2,ebx
  570.        mov      edx,.dey13
  571.        add      .cey1,edx
  572.        mov      eax,.dey12
  573.        add      .cey2,eax
  574.  
  575.        mov      eax,.dx13
  576.        add      .cx1,eax
  577.        mov      ebx,.dx12
  578.        add      .cx2,ebx
  579.  
  580.        mov      ebx,.dz13
  581.        add      .cz1,ebx
  582.        mov      edx,.dz12
  583.        add      .cz2,edx
  584. end if
  585.        inc      ecx
  586.        cmp      cx,.y2
  587.        jl       .loop12
  588.     .loop12_done:
  589.  
  590.        movsx    ecx,.y2
  591.        cmp      cx,.y3
  592.        jge      .loop23_done
  593.  
  594.        movsx    eax,.z2
  595.        shl      eax,CATMULL_SHIFT
  596.        mov      .cz2,eax
  597.  
  598.        movsx    eax,.x2
  599.        shl      eax,ROUND
  600.        mov      .cx2,eax
  601.  
  602.        movzx    eax,word[.b_x2]
  603.        shl      eax,ROUND
  604.        mov      .cbx2,eax
  605.  
  606.        movzx    eax,word[.b_y2]
  607.        shl      eax,ROUND
  608.        mov      .cby2,eax
  609.  
  610.        movzx    eax,word[.e_x2]
  611.        shl      eax,ROUND
  612.        mov      .cex2,eax
  613.  
  614.        movzx    eax,word[.e_y2]
  615.        shl      eax,ROUND
  616.        mov      .cey2,eax
  617.  
  618.      .loop23:
  619.        call     .call_bump_line
  620.  
  621. if Ext >= MMX
  622.        movq     mm0,.cby2
  623.        movq     mm1,.cby1
  624.        movq     mm2,.cey2
  625.        movq     mm3,.cey1
  626.        movq     mm4,.cz1
  627.        movq     mm5,.cz2
  628.        paddd    mm0,.dby23
  629.        paddd    mm1,.dby13
  630.        paddd    mm2,.dey23
  631.        paddd    mm3,.dey13
  632.        paddd    mm4,.dz13
  633.        paddd    mm5,.dz23
  634.        movq     .cby2,mm0
  635.        movq     .cby1,mm1
  636.        movq     .cey1,mm3
  637.        movq     .cey2,mm2
  638.        movq     .cz1,mm4
  639.        movq     .cz2,mm5
  640. else
  641.        mov      eax,.dx13
  642.        add      .cx1,eax
  643.        mov      ebx,.dx23
  644.        add      .cx2,ebx
  645.  
  646.        mov      edx,.dbx13
  647.        add      .cbx1,edx
  648.        mov      eax,.dbx23
  649.        add      .cbx2,eax
  650.        mov      ebx,.dby13
  651.        add      .cby1,ebx
  652.        mov      edx,.dby23
  653.        add      .cby2,edx
  654.  
  655.        mov      eax,.dex13
  656.        add      .cex1,eax
  657.        mov      ebx,.dex23
  658.        add      .cex2,ebx
  659.        mov      edx,.dey13
  660.        add      .cey1,edx
  661.        mov      eax,.dey23
  662.        add      .cey2,eax
  663.  
  664.        mov      ebx,.dz13
  665.        add      .cz1,ebx
  666.        mov      edx,.dz23
  667.        add      .cz2,edx
  668. end if
  669.        inc      ecx
  670.        cmp      cx,.y3
  671.        jl       .loop23
  672.     .loop23_done:
  673.  
  674.        mov      esp,ebp
  675. ret   34
  676.  
  677. .call_bump_line:
  678.  
  679.       ; push     ebp
  680.       ; push     ecx
  681.        pushad
  682.  
  683.        push     dword .cz1
  684.        push     dword .cz2
  685.        push     .z_buff
  686.        push     .t_emap
  687.        push     .t_bmap
  688.        push     dword .cey2
  689.        push     .cex2
  690.        push     dword .cey1
  691.        push     .cex1
  692.        push     dword .cby2
  693.        push     .cbx2
  694.        push     dword .cby1
  695.        push     .cbx1
  696.        push     ecx
  697.  
  698.        mov      eax,.cx1
  699.        sar      eax,ROUND
  700.        mov      ebx,.cx2
  701.        sar      ebx,ROUND
  702.  
  703.        call     bump_line_z
  704.  
  705.        popad
  706. ret
  707. bump_line_z:
  708. ;--------------in: eax - x1
  709. ;--------------    ebx - x2
  710. ;--------------    edi - pointer to screen buffer
  711. ;stack - another parameters :
  712. .y      equ dword [ebp+4]
  713. .bx1q   equ       [ebp+8]
  714. .bx2q   equ       [ebp+16]
  715. .ex1q   equ       [ebp+24]
  716. .ex2q   equ       [ebp+32]
  717. .bx1    equ dword [ebp+8]   ;   ---
  718. .by1    equ dword [ebp+12]  ;       |
  719. .bx2    equ dword [ebp+16]  ;       |
  720. .by2    equ dword [ebp+20]  ;       |>   bump and env coords
  721. .ex1    equ dword [ebp+24]  ;       |>   shifted shl ROUND
  722. .ey1    equ dword [ebp+28]  ;       |
  723. .ex2    equ dword [ebp+32]  ;       |
  724. .ey2    equ dword [ebp+36]  ;   ---
  725. ;.bx1q   equ qword [ebp+8]   ; - new
  726. ;.ex1q   equ qword [ebp+24]  ; - new
  727. .bmap   equ dword [ebp+40]
  728. .emap   equ dword [ebp+44]
  729. .z_buff equ dword [ebp+48]
  730. .z2     equ dword [ebp+52]  ;   -- |>   z coords shifted
  731. .z1     equ dword [ebp+56]  ;   --       shl  CATMULL_SHIFT
  732.  
  733. .x1     equ dword [ebp-4]
  734. .x2     equ dword [ebp-8]
  735. .dbx    equ dword [ebp-12]
  736. .dby    equ dword [ebp-16]
  737. .dbyq   equ qword [ebp-16]  ; - new
  738. .dex    equ dword [ebp-20]
  739. .dey    equ dword [ebp-24]
  740. .deyq   equ qword [ebp-24]  ; - new
  741. .dz     equ dword [ebp-28]
  742. .cbx    equ dword [ebp-32]
  743. .cby    equ dword [ebp-36]
  744. .cbyq   equ qword [ebp-36]  ; - new
  745. .cex    equ dword [ebp-40]
  746. .cey    equ dword [ebp-44]
  747. .ceyq   equ qword [ebp-44]  ; - new
  748. .cz     equ dword [ebp-48]
  749. .czbuff equ dword [ebp-52]
  750. .temp1  equ        ebp-60
  751. .temp2  equ        ebp-68
  752. .temp3  equ        ebp-76
  753. .temp4  equ        ebp-84
  754. .temp5  equ        ebp-92
  755.  
  756.         mov     ebp,esp
  757.  
  758.         mov     ecx,.y
  759.         or      ecx,ecx
  760.         jl      .bl_end
  761.         cmp     ecx,SIZE_Y
  762.         jge     .bl_end
  763.  
  764.         cmp     eax,ebx
  765.         jl      .bl_ok
  766.         je      .bl_end
  767.  
  768.         xchg    eax,ebx
  769. if Ext=NON
  770.         mov     edx,.bx1
  771.         xchg    edx,.bx2
  772.         mov     .bx1,edx
  773.         mov     edx,.by1
  774.         xchg    edx,.by2
  775.         mov     .by1,edx
  776.  
  777.         mov     edx,.ex1
  778.         xchg    edx,.ex2
  779.         mov     .ex1,edx
  780.         mov     edx,.ey1
  781.         xchg    edx,.ey2
  782.         mov     .ey1,edx
  783. else
  784.  
  785.         movq    mm0,.bx1q
  786.         movq    mm1,.ex1q
  787.         movq    mm2,.bx2q
  788.         movq    mm3,.ex2q
  789.         movq    .bx2q,mm0
  790.         movq    .ex2q,mm1
  791.         movq    .bx1q,mm2
  792.         movq    .ex1q,mm3
  793.  
  794. end if
  795.  
  796.         mov     edx,.z1
  797.         xchg    edx,.z2
  798.         mov     .z1,edx
  799.  
  800.   .bl_ok:
  801.  
  802.         push    eax
  803.         push    ebx           ;store x1, x2
  804.  
  805.         cmp     .x1,SIZE_X
  806.         jge     .bl_end
  807.         cmp     .x2,0
  808.         jle     .bl_end
  809.  
  810.         mov     ebx,.x2
  811.         sub     ebx,.x1
  812.  
  813. if Ext >= SSE
  814.  
  815.        sub       esp,16
  816.        cvtsi2ss  xmm3,ebx            ;rcps
  817.        shufps    xmm3,xmm3,0
  818.  
  819.        cvtpi2ps  xmm0,.bx1q ;mm0
  820.        movlhps   xmm0,xmm0
  821.        cvtpi2ps  xmm0,.ex1q ;mm2
  822.        cvtpi2ps  xmm1,.bx2q ;mm1
  823.        movlhps   xmm1,xmm1
  824.        cvtpi2ps  xmm1,.ex2q ;mm3
  825.        subps     xmm1,xmm0
  826.  
  827.        divps     xmm1,xmm3
  828.  
  829.        shufps    xmm1,xmm1,10110001b
  830.        cvtps2pi  mm0,xmm1          ; mm0 -> 2 delta dwords
  831.        movhlps   xmm1,xmm1
  832.        cvtps2pi  mm1,xmm1
  833.        movq      .deyq,mm0
  834.        movq      .dbyq,mm1
  835.  
  836. else
  837.  
  838.         mov     eax,.bx2       ; calc .dbx
  839.         sub     eax,.bx1
  840.         cdq
  841.         idiv    ebx
  842.         push    eax
  843.  
  844.         mov     eax,.by2       ; calc .dby
  845.         sub     eax,.by1
  846.         cdq
  847.         idiv    ebx
  848.         push    eax
  849.  
  850.         mov     eax,.ex2       ; calc .dex
  851.         sub     eax,.ex1
  852.         cdq
  853.         idiv    ebx
  854.         push    eax
  855.  
  856.         mov     eax,.ey2       ; calc .dey
  857.         sub     eax,.ey1
  858.         cdq
  859.         idiv    ebx
  860.         push    eax
  861.  
  862. end if
  863.  
  864.         mov     eax,.z2        ; calc .dz
  865.         sub     eax,.z1
  866.         cdq
  867.         idiv    ebx
  868.         push    eax
  869.  
  870.         cmp     .x1,0         ; set correctly begin variable
  871.         jge     @f            ; CLIPPING ON FUNCTION
  872.                               ; cutting triangle exceedes screen
  873.         mov     ebx,.x1
  874.         neg     ebx
  875.         imul    ebx           ; eax = .dz * abs(.x1)
  876.         add     .z1,eax
  877.         mov     .x1,0
  878.  
  879.         mov     eax,.dbx
  880.         imul    ebx
  881.         add    .bx1,eax
  882.  
  883.         mov     eax,.dby
  884.         imul    ebx
  885.         add     .by1,eax
  886.  
  887.         mov     eax,.dex
  888.         imul    ebx
  889.         add     .ex1,eax
  890.  
  891.         mov     eax,.dey
  892.         imul    ebx
  893.         add     .ey1,eax
  894.       @@:
  895.         cmp     .x2,SIZE_X
  896.         jl      @f
  897.         mov     .x2,SIZE_X
  898.       @@:
  899.         mov     eax,SIZE_X       ;calc memory begin in buffers
  900.         mov     ebx,.y
  901.         mul     ebx
  902.         mov     ebx,.x1
  903.         add     eax,ebx
  904.         mov     ebx,eax
  905.         lea     eax,[eax*3]
  906.         add     edi,eax
  907.         mov     esi,.z_buff       ; z-buffer filled with dd variables
  908.         shl     ebx,2
  909.         add     esi,ebx
  910.  
  911.         mov     ecx,.x2
  912.         sub     ecx,.x1
  913.         ; init current variables
  914.         push    .bx1
  915.         push    .by1
  916.         push    .ex1
  917.         push    .ey1
  918.  
  919.         push    .z1              ; current z shl CATMULL_SHIFT
  920.         push    esi
  921. ; It's my first attempt at MMX :), have mercy - Macgub
  922.  
  923. ;;     if Ext = MMX
  924. ;      mov     dword[.temp1],esi
  925. ;      mov     dword[.temp1+4],esi
  926. ;;        movq    mm0,.cbyq          ; mm0 - current bump coords
  927. ;;        movq    mm1,.ceyq          ; mm1 - current env  coords
  928. ;;        movq    mm2,.dbyq          ; mm2 - delta bump
  929. ;;        movq    mm3,.deyq          ; mm3 - delta env
  930. ;     movd    mm6,.z1            ; mm6 - cur z
  931. ;     movq    mm7,qword.[temp1]  ; mm7 = lo = hi dword = current z buff
  932. ;;        mov     dword [.temp2],1
  933. ;;        mov     dword [.temp2+4],-1
  934. ;;        mov     dword [.temp3],TEXTURE_SIZE
  935. ;;        mov     dword [.temp3+4],TEXTURE_SIZE
  936. ;;        mov     esi,.bmap
  937. ;;        mov     dword [.temp4],esi
  938. ;;        mov     dword [.temp4+4],esi
  939. ;;        mov     dword [.temp5],TEX_X
  940. ;;        mov     dword [.temp5+4],- TEX_X
  941. ;     mov     dword [.temp1],TEX_SHIFT
  942. ;     mov     dword [.temp1+4],0
  943. ;;     end if
  944.  
  945.      .draw:
  946.     ; if TEX = SHIFTING   ;bump drawing only in shifting mode
  947.         mov     esi,.czbuff      ; .czbuff current address in buffer
  948.         mov     ebx,.cz          ; .cz - cur z position
  949.         cmp     ebx,dword[esi]
  950.         jge     .skip
  951. ;;      if Ext=NON
  952.         mov     eax,.cby
  953.         sar     eax,ROUND
  954.         mov     esi,.cbx
  955.         sar     esi,ROUND
  956. ;;      else
  957. ;;        movq    mm4,mm0          ; mm4 - copies of cur bump coords
  958. ;;        psrad   mm4,ROUND        ; mm4 =  lo dword = y b coord, hi dword = x b coord
  959. ;;        movd    eax,mm4    ; -
  960. ;;        psrlq   mm4,32     ; -
  961. ;;        movd    esi,mm4    ; -
  962. ;;
  963. ;;;       punpckldq  mm5,mm4     ;
  964. ;;;       psllq   mm5,TEX_SHIFT
  965. ;;;       paddq   mm4,mm5   ; mm4 - lo dword index to b. map
  966. ;;
  967. ;; ;       packqd  mm4,mm5
  968.  ;       movq    mm5,mm4       ; mm5 ~~ current bump map index?
  969.  
  970. ;;      end if
  971.         shl     eax,TEX_SHIFT   ;-
  972.         add     esi,eax         ;-  ; esi - current bump map index
  973. ;;     if  Ext = NON
  974.         mov     ebx,esi
  975.         dec     ebx
  976.         and     ebx,TEXTURE_SIZE
  977.         add     ebx,.bmap
  978.         movzx   eax,byte [ebx]
  979.  
  980.         mov     ebx,esi
  981.         inc     ebx
  982.         and     ebx,TEXTURE_SIZE
  983.         add     ebx,.bmap
  984.         movzx   ebx,byte [ebx]
  985. ;;      else                   ;-------------------------------------------
  986. ;;        mov     dword [.temp1],esi       ;-
  987. ;;        mov     dword [.temp1+4],esi     ;-
  988. ;;        movq    mm5, qword[.temp1]       ;-
  989. ;;        paddd   mm5, qword[.temp2]  ; .temp2 == low dword = 1, high dword = -1
  990. ;;        pand    mm5, qword[.temp3]  ; .temp3 == low = high dword = TEX_SIZE
  991. ;;        paddd   mm5, qword[.temp4]  ; .temp4 == low = high dword = .bmap
  992. ;;        movd    ebx,mm5
  993. ;;        psrlq   mm5,32
  994. ;;        movd    eax,mm5
  995. ;;        movzx   ebx,byte[ebx]
  996. ;;        movzx   eax,byte[eax]
  997. ;;     end if
  998.         sub     eax,ebx
  999. ;;     if Ext=NON
  1000.         mov     ebx,esi
  1001.         sub     ebx,TEX_X
  1002.         and     ebx,TEXTURE_SIZE
  1003.         add     ebx,.bmap
  1004.         movzx   edx,byte [ebx]
  1005.  
  1006.         mov     ebx,esi
  1007.         add     ebx,TEX_X
  1008.         and     ebx,TEXTURE_SIZE
  1009.         add     ebx,.bmap
  1010.         movzx   ebx,byte [ebx]
  1011. ;;     else
  1012. ;;        movq    mm5, qword[.temp1]  ;-
  1013. ;;        paddd   mm5, qword[.temp5]  ; .temp5 == low dword = TEX_X, high dword = -TEX_X
  1014. ;;        pand    mm5, qword[.temp3]  ; .temp3 == low = high dword = TEX_SIZE
  1015. ;;        paddd   mm5, qword[.temp4]  ; .temp4 == low = high dword = offset .bmap
  1016. ;;        movd    ebx,mm5
  1017. ;;        psrlq   mm5,32
  1018. ;;        movd    edx,mm5
  1019. ;;        movzx   ebx,byte[ebx]
  1020. ;;        movzx   edx,byte[edx]
  1021. ;;     end if
  1022.         sub     edx,ebx
  1023.      ;  eax - horizontal sub
  1024.      ;  edx - vertical   sub
  1025. ;;    if Ext=NON
  1026.         mov     ebx,.cex       ;.cex - current env map X
  1027.         sar     ebx,ROUND
  1028.         add     eax,ebx        ; eax - modified x coord
  1029.  
  1030.         mov     ebx,.cey       ;.cey - current  env map y
  1031.         sar     ebx,ROUND
  1032.         add     edx,ebx        ; edx - modified y coord
  1033. ;;    else
  1034. ;;        movq    mm5,mm1        ; mm5 - copy of cur env coords
  1035. ;;        psrad   mm5,ROUND
  1036. ;;        movq    qword[.temp1],mm5
  1037. ;;        add     eax,dword [.temp1]
  1038. ;;        add     edx,dword [.temp1+4]
  1039. ;;      ;  movd    ebx,mm5
  1040. ;;      ;  add     eax,ebx
  1041. ;;      ;  psrlq   mm5,32
  1042. ;;      ;  movd    ebx,mm5
  1043.       ;  add     edx,ebx
  1044. ;;    end if
  1045.  
  1046.         or      eax,eax
  1047.         jl      .black
  1048.         cmp     eax,TEX_X
  1049.         jg      .black
  1050.         or      edx,edx
  1051.         jl      .black
  1052.         cmp     edx,TEX_Y
  1053.         jg      .black
  1054.  
  1055.         shl     edx,TEX_SHIFT
  1056.         add     edx,eax
  1057.         lea     edx,[edx*3]
  1058.         add     edx,.emap
  1059.         mov     eax,dword[edx]
  1060.         jmp     .put_pixel
  1061.      .black:
  1062.         xor     eax,eax
  1063.      .put_pixel:
  1064.         stosd
  1065.         dec     edi
  1066.         mov     ebx,.cz
  1067.         mov     esi,.czbuff
  1068.         mov     dword[esi],ebx
  1069.         jmp     .no_skip
  1070.      .skip:
  1071.         add     edi,3
  1072.      .no_skip:
  1073.         add     .czbuff,4
  1074. ;;   if Ext = NON
  1075.         mov     eax,.dbx
  1076.         add     .cbx,eax
  1077.         mov     eax,.dby
  1078.         add     .cby,eax
  1079.         mov     eax,.dex
  1080.         add     .cex,eax
  1081.         mov     eax,.dey
  1082.         add     .cey,eax
  1083. ;;    else
  1084. ;;        paddd   mm0,mm2
  1085. ;;        paddd   mm1,mm3
  1086. ;;    end if
  1087.         mov     eax,.dz
  1088.         add     .cz,eax
  1089.  
  1090.         dec     ecx
  1091.         jnz     .draw
  1092.    ;   end if
  1093.   .bl_end:
  1094.         mov     esp,ebp
  1095. ret 56
  1096.