Subversion Repositories Kolibri OS

Rev

Rev 1776 | Go to most recent revision | Blame | Compare with Previous | Last modification | View Log | Download | RSS feed

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