Subversion Repositories Kolibri OS

Rev

Rev 1776 | Rev 1979 | Go to most recent revision | 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. .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 .cby2
  691.        push     .cbx2
  692.        push     dword .cey1
  693.        push     .cex1
  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. .bx1    equ       [ebp+8]   ;   ---
  714. .by1    equ dword [ebp+12]  ;       |
  715. .ex1    equ       [ebp+16]  ;       |
  716. .ey1    equ dword [ebp+20]  ;       |>   bump and env coords
  717. .bx2    equ       [ebp+24]  ;       |>   shifted shl ROUND
  718. .by2    equ dword [ebp+28]  ;       |
  719. .ex2    equ       [ebp+32]  ;       |
  720. .ey2    equ dword [ebp+36]  ;   ---
  721. .bmap   equ dword [ebp+40]
  722. .emap   equ dword [ebp+44]
  723. .z_buff equ dword [ebp+48]
  724. .z2     equ dword [ebp+52]  ;   -- |>   z coords shifted
  725. .z1     equ dword [ebp+56]  ;   --       shl  CATMULL_SHIFT
  726.  
  727. .x1     equ dword [ebp-4]
  728. .x2     equ dword [ebp-8]
  729. .dbx    equ dword [ebp-12]
  730. .dby    equ       [ebp-16]
  731. .dex    equ dword [ebp-20]
  732. .dey    equ       [ebp-24]
  733. .dz     equ dword [ebp-28]
  734. .cbx    equ dword [ebp-32]
  735. .cby    equ       [ebp-36]
  736. .cex    equ dword [ebp-40]
  737. .cey    equ       [ebp-44]
  738. .cz     equ dword [ebp-48]
  739. .czbuff equ dword [ebp-52]
  740. .temp1  equ        ebp-60
  741. .temp2  equ        ebp-68
  742. .temp3  equ        ebp-76
  743. .temp4  equ        ebp-84
  744. .temp5  equ        ebp-92
  745.  
  746.         mov     ebp,esp
  747.  
  748.         mov     ecx,.y
  749.         or      ecx,ecx
  750.         jl      .bl_end
  751.         cmp     ecx,SIZE_Y
  752.         jge     .bl_end
  753.  
  754.         cmp     eax,ebx
  755.         jl      .bl_ok
  756.         je      .bl_end
  757.  
  758.         xchg    eax,ebx
  759. if Ext=NON
  760.         mov     edx,.bx1
  761.         xchg    edx,.bx2
  762.         mov     .bx1,edx
  763.         mov     edx,.by1
  764.         xchg    edx,.by2
  765.         mov     .by1,edx
  766.  
  767.         mov     edx,.ex1
  768.         xchg    edx,.ex2
  769.         mov     .ex1,edx
  770.         mov     edx,.ey1
  771.         xchg    edx,.ey2
  772.         mov     .ey1,edx
  773. end if
  774. if Ext = MMX
  775.         movq    mm0,.bx1
  776.         movq    mm1,.ex1
  777.         movq    mm2,.bx2
  778.         movq    mm3,.ex2
  779.         movq    .bx2,mm0
  780.         movq    .ex2,mm1
  781.         movq    .bx1,mm2
  782.         movq    .ex1,mm3
  783. end if
  784. if Ext >= SSE
  785.         movups  xmm0,.bx1
  786.         movups  xmm1,.bx2
  787.         movups  .bx2,xmm0
  788.         movups  .bx1,xmm1
  789. end if
  790.  
  791.         mov     edx,.z1
  792.         xchg    edx,.z2
  793.         mov     .z1,edx
  794.  
  795.   .bl_ok:
  796.  
  797.         push    eax
  798.         push    ebx           ;store x1, x2
  799.  
  800.         cmp     .x1,SIZE_X
  801.         jge     .bl_end
  802.         cmp     .x2,0
  803.         jle     .bl_end
  804.  
  805.         mov     ebx,.x2
  806.         sub     ebx,.x1
  807.  
  808. if Ext >= SSE
  809.  
  810.        sub       esp,16
  811.        cvtsi2ss  xmm3,ebx            ;rcps
  812.        shufps    xmm3,xmm3,0
  813.  
  814.        cvtpi2ps  xmm0,.bx1 ;mm0
  815.        movlhps   xmm0,xmm0
  816.        cvtpi2ps  xmm0,.ex1 ;mm2
  817.        cvtpi2ps  xmm1,.bx2 ;mm1
  818.        movlhps   xmm1,xmm1
  819.        cvtpi2ps  xmm1,.ex2 ;mm3
  820.        subps     xmm1,xmm0
  821.  
  822.        divps     xmm1,xmm3
  823.  
  824.        shufps    xmm1,xmm1,10110001b
  825.        cvtps2pi  mm0,xmm1          ; mm0 -> 2 delta dwords
  826.        movhlps   xmm1,xmm1
  827.        cvtps2pi  mm1,xmm1
  828.        movq      .dey,mm0
  829.        movq      .dby,mm1
  830.  
  831. else
  832.  
  833.         mov     eax,.bx2       ; calc .dbx
  834.         sub     eax,.bx1
  835.         cdq
  836.         idiv    ebx
  837.         push    eax
  838.  
  839.         mov     eax,.by2       ; calc .dby
  840.         sub     eax,.by1
  841.         cdq
  842.         idiv    ebx
  843.         push    eax
  844.  
  845.         mov     eax,.ex2       ; calc .dex
  846.         sub     eax,.ex1
  847.         cdq
  848.         idiv    ebx
  849.         push    eax
  850.  
  851.         mov     eax,.ey2       ; calc .dey
  852.         sub     eax,.ey1
  853.         cdq
  854.         idiv    ebx
  855.         push    eax
  856.  
  857. end if
  858.  
  859.         mov     eax,.z2        ; calc .dz
  860.         sub     eax,.z1
  861.         cdq
  862.         idiv    ebx
  863.         push    eax
  864.  
  865.         cmp     .x1,0         ; set correctly begin variable
  866.         jge     @f            ; CLIPPING ON FUNCTION
  867.                               ; cutting triangle exceedes screen
  868.         mov     ebx,.x1
  869.         neg     ebx
  870.         imul    ebx           ; eax = .dz * abs(.x1)
  871.         add     .z1,eax
  872.         mov     .x1,0
  873.  
  874.         mov     eax,.dbx
  875.         imul    ebx
  876.         add    .bx1,eax
  877.  
  878.         mov     eax,.dby
  879.         imul    ebx
  880.         add     .by1,eax
  881.  
  882.         mov     eax,.dex
  883.         imul    ebx
  884.         add     .ex1,eax
  885.  
  886.         mov     eax,.dey
  887.         imul    ebx
  888.         add     .ey1,eax
  889.       @@:
  890.         cmp     .x2,SIZE_X
  891.         jl      @f
  892.         mov     .x2,SIZE_X
  893.       @@:
  894.         mov     eax,SIZE_X       ;calc memory begin in buffers
  895.         mov     ebx,.y
  896.         mul     ebx
  897.         mov     ebx,.x1
  898.         add     eax,ebx
  899.         mov     ebx,eax
  900.         lea     eax,[eax*3]
  901.         add     edi,eax
  902.         mov     esi,.z_buff       ; z-buffer filled with dd variables
  903.         shl     ebx,2
  904.         add     esi,ebx
  905.  
  906.         mov     ecx,.x2
  907.         sub     ecx,.x1
  908.         ; init current variables
  909.         push    dword .bx1
  910.         push    .by1
  911.         push    dword .ex1
  912.         push    .ey1
  913.  
  914.         push    .z1              ; current z shl CATMULL_SHIFT
  915.         push    esi
  916. ; It's my first attempt at MMX :), have mercy - Macgub
  917.  
  918. ;;     if Ext = MMX
  919. ;      mov     dword[.temp1],esi
  920. ;      mov     dword[.temp1+4],esi
  921. ;;        movq    mm0,.cbyq          ; mm0 - current bump coords
  922. ;;        movq    mm1,.ceyq          ; mm1 - current env  coords
  923. ;;        movq    mm2,.dbyq          ; mm2 - delta bump
  924. ;;        movq    mm3,.deyq          ; mm3 - delta env
  925. ;     movd    mm6,.z1            ; mm6 - cur z
  926. ;     movq    mm7,qword.[temp1]  ; mm7 = lo = hi dword = current z buff
  927. ;;        mov     dword [.temp2],1
  928. ;;        mov     dword [.temp2+4],-1
  929. ;;        mov     dword [.temp3],TEXTURE_SIZE
  930. ;;        mov     dword [.temp3+4],TEXTURE_SIZE
  931. ;;        mov     esi,.bmap
  932. ;;        mov     dword [.temp4],esi
  933. ;;        mov     dword [.temp4+4],esi
  934. ;;        mov     dword [.temp5],TEX_X
  935. ;;        mov     dword [.temp5+4],- TEX_X
  936. ;     mov     dword [.temp1],TEX_SHIFT
  937. ;     mov     dword [.temp1+4],0
  938. ;;     end if
  939.  
  940.      .draw:
  941.     ; if TEX = SHIFTING   ;bump drawing only in shifting mode
  942.         mov     esi,.czbuff      ; .czbuff current address in buffer
  943.         mov     ebx,.cz          ; .cz - cur z position
  944.         cmp     ebx,dword[esi]
  945.         jge     .skip
  946. ;;      if Ext=NON
  947.         mov     eax,.cby
  948.         sar     eax,ROUND
  949.         mov     esi,.cbx
  950.         sar     esi,ROUND
  951. ;;      else
  952. ;;        movq    mm4,mm0          ; mm4 - copies of cur bump coords
  953. ;;        psrad   mm4,ROUND        ; mm4 =  lo dword = y b coord, hi dword = x b coord
  954. ;;        movd    eax,mm4    ; -
  955. ;;        psrlq   mm4,32     ; -
  956. ;;        movd    esi,mm4    ; -
  957. ;;
  958. ;;;       punpckldq  mm5,mm4     ;
  959. ;;;       psllq   mm5,TEX_SHIFT
  960. ;;;       paddq   mm4,mm5   ; mm4 - lo dword index to b. map
  961. ;;
  962. ;; ;       packqd  mm4,mm5
  963.  ;       movq    mm5,mm4       ; mm5 ~~ current bump map index?
  964.  
  965. ;;      end if
  966.         shl     eax,TEX_SHIFT   ;-
  967.         add     esi,eax         ;-  ; esi - current bump map index
  968. ;;     if  Ext = NON
  969.         mov     ebx,esi
  970.         dec     ebx
  971.         and     ebx,TEXTURE_SIZE
  972.         add     ebx,.bmap
  973.         movzx   eax,byte [ebx]
  974.  
  975.         mov     ebx,esi
  976.         inc     ebx
  977.         and     ebx,TEXTURE_SIZE
  978.         add     ebx,.bmap
  979.         movzx   ebx,byte [ebx]
  980. ;;      else                   ;-------------------------------------------
  981. ;;        mov     dword [.temp1],esi       ;-
  982. ;;        mov     dword [.temp1+4],esi     ;-
  983. ;;        movq    mm5, qword[.temp1]       ;-
  984. ;;        paddd   mm5, qword[.temp2]  ; .temp2 == low dword = 1, high dword = -1
  985. ;;        pand    mm5, qword[.temp3]  ; .temp3 == low = high dword = TEX_SIZE
  986. ;;        paddd   mm5, qword[.temp4]  ; .temp4 == low = high dword = .bmap
  987. ;;        movd    ebx,mm5
  988. ;;        psrlq   mm5,32
  989. ;;        movd    eax,mm5
  990. ;;        movzx   ebx,byte[ebx]
  991. ;;        movzx   eax,byte[eax]
  992. ;;     end if
  993.         sub     eax,ebx
  994. ;;     if Ext=NON
  995.         mov     ebx,esi
  996.         sub     ebx,TEX_X
  997.         and     ebx,TEXTURE_SIZE
  998.         add     ebx,.bmap
  999.         movzx   edx,byte [ebx]
  1000.  
  1001.         mov     ebx,esi
  1002.         add     ebx,TEX_X
  1003.         and     ebx,TEXTURE_SIZE
  1004.         add     ebx,.bmap
  1005.         movzx   ebx,byte [ebx]
  1006. ;;     else
  1007. ;;        movq    mm5, qword[.temp1]  ;-
  1008. ;;        paddd   mm5, qword[.temp5]  ; .temp5 == low dword = TEX_X, high dword = -TEX_X
  1009. ;;        pand    mm5, qword[.temp3]  ; .temp3 == low = high dword = TEX_SIZE
  1010. ;;        paddd   mm5, qword[.temp4]  ; .temp4 == low = high dword = offset .bmap
  1011. ;;        movd    ebx,mm5
  1012. ;;        psrlq   mm5,32
  1013. ;;        movd    edx,mm5
  1014. ;;        movzx   ebx,byte[ebx]
  1015. ;;        movzx   edx,byte[edx]
  1016. ;;     end if
  1017.         sub     edx,ebx
  1018.      ;  eax - horizontal sub
  1019.      ;  edx - vertical   sub
  1020. ;;    if Ext=NON
  1021.         mov     ebx,.cex       ;.cex - current env map X
  1022.         sar     ebx,ROUND
  1023.         add     eax,ebx        ; eax - modified x coord
  1024.  
  1025.         mov     ebx,.cey       ;.cey - current  env map y
  1026.         sar     ebx,ROUND
  1027.         add     edx,ebx        ; edx - modified y coord
  1028. ;;    else
  1029. ;;        movq    mm5,mm1        ; mm5 - copy of cur env coords
  1030. ;;        psrad   mm5,ROUND
  1031. ;;        movq    qword[.temp1],mm5
  1032. ;;        add     eax,dword [.temp1]
  1033. ;;        add     edx,dword [.temp1+4]
  1034. ;;      ;  movd    ebx,mm5
  1035. ;;      ;  add     eax,ebx
  1036. ;;      ;  psrlq   mm5,32
  1037. ;;      ;  movd    ebx,mm5
  1038.       ;  add     edx,ebx
  1039. ;;    end if
  1040.  
  1041.         or      eax,eax
  1042.         jl      .black
  1043.         cmp     eax,TEX_X
  1044.         jg      .black
  1045.         or      edx,edx
  1046.         jl      .black
  1047.         cmp     edx,TEX_Y
  1048.         jg      .black
  1049.  
  1050.         shl     edx,TEX_SHIFT
  1051.         add     edx,eax
  1052.         lea     edx,[edx*3]
  1053.         add     edx,.emap
  1054.         mov     eax,dword[edx]
  1055.         jmp     .put_pixel
  1056.      .black:
  1057.         xor     eax,eax
  1058.      .put_pixel:
  1059.         stosd
  1060.         dec     edi
  1061.         mov     ebx,.cz
  1062.         mov     esi,.czbuff
  1063.         mov     dword[esi],ebx
  1064.         jmp     .no_skip
  1065.      .skip:
  1066.         add     edi,3
  1067.      .no_skip:
  1068.         add     .czbuff,4
  1069. ;;   if Ext = NON
  1070. if Ext >= MMX
  1071.         movq    mm0,.cby
  1072.         movq    mm1,.cey
  1073.         paddd   mm0,.dby
  1074.         paddd   mm1,.dey
  1075.         movq    .cby,mm0
  1076.         movq    .cey,mm1
  1077. else
  1078.         mov     eax,.dbx
  1079.         add     .cbx,eax
  1080.         mov     eax,.dby
  1081.         add     .cby,eax
  1082.         mov     eax,.dex
  1083.         add     .cex,eax
  1084.         mov     eax,.dey
  1085.         add     .cey,eax
  1086. end if
  1087. ;;    else
  1088. ;;        paddd   mm0,mm2
  1089. ;;        paddd   mm1,mm3
  1090. ;;    end if
  1091.         mov     eax,.dz
  1092.         add     .cz,eax
  1093.  
  1094.         dec     ecx
  1095.         jnz     .draw
  1096.    ;   end if
  1097.   .bl_end:
  1098.         mov     esp,ebp
  1099. ret 56
  1100.