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. ;------- Big thanks to Majuma (www.majuma.xt.pl) for absolutely great---
  11. ;------- DOS 13h mode demos --------------------------------------------
  12. ;------- Procedure draws bump triangle using Catmull Z-buffer algorithm-
  13. ;------- (Z coordinate interpolation)-----------------------------------
  14. bump_triangle_z:
  15. ;------------------in - eax - x1 shl 16 + y1 -----------
  16. ;---------------------- ebx - x2 shl 16 + y2 -----------
  17. ;---------------------- ecx - x3 shl 16 + y3 -----------
  18. ;---------------------- edx - pointer to bump map ------
  19. ;---------------------- esi - pointer to environment map
  20. ;---------------------- edi - pointer to screen buffer--
  21. ;---------------------- stack : bump coordinates--------
  22. ;----------------------         environment coordinates-
  23. ;----------------------         Z position coordinates--
  24. ;----------------------         pointer io Z buffer-----
  25. ;-- Z-buffer - filled with coordinates as dword --------
  26. ;-- (Z coor. as word) shl CATMULL_SHIFT ----------------
  27. .b_x1   equ ebp+4   ; procedure don't save registers !!!
  28. .b_y1   equ ebp+6   ; each coordinate as word
  29. .b_x2   equ ebp+8
  30. .b_y2   equ ebp+10
  31. .b_x3   equ ebp+12
  32. .b_y3   equ ebp+14
  33. .e_x1   equ ebp+16
  34. .e_y1   equ ebp+18
  35. .e_x2   equ ebp+20
  36. .e_y2   equ ebp+22
  37. .e_x3   equ ebp+24
  38. .e_y3   equ ebp+26
  39. .z1     equ word[ebp+28]
  40. .z2     equ word[ebp+30]
  41. .z3     equ word[ebp+32]
  42. .z_buff equ dword[ebp+34]       ; pointer to Z-buffer
  43.  
  44.  
  45. .t_bmap equ dword[ebp-4]        ; pointer to bump map
  46. .t_emap equ dword[ebp-8]        ; pointer to e. map
  47. .x1     equ word[ebp-10]
  48. .y1     equ word[ebp-12]
  49. .x2     equ word[ebp-14]
  50. .y2     equ word[ebp-16]
  51. .x3     equ word[ebp-18]
  52. .y3     equ word[ebp-20]
  53.  
  54. .dx12  equ dword[ebp-24]
  55. .dbx12 equ dword[ebp-28]
  56. .dby12 equ dword[ebp-32]
  57. .dex12 equ dword[ebp-36]
  58. .dey12 equ dword[ebp-40]
  59. .dz12  equ dword[ebp-44]
  60.  
  61. .dx13  equ dword[ebp-48]
  62. .dbx13 equ dword[ebp-52]
  63. .dby13 equ dword[ebp-56]
  64. .dex13 equ dword[ebp-60]
  65. .dey13 equ dword[ebp-64]
  66. .dz13  equ dword[ebp-68]
  67.  
  68. .dx23  equ dword[ebp-72]
  69. .dbx23 equ dword[ebp-76]
  70. .dby23 equ dword[ebp-80]
  71. .dex23 equ dword[ebp-84]
  72. .dey23 equ dword[ebp-88]
  73. .dz23  equ dword[ebp-92]
  74.  
  75. .cx1   equ dword[ebp-96]   ; current variables
  76. .cx2   equ dword[ebp-100]
  77. .cbx1  equ dword[ebp-104]
  78. .cbx2  equ dword[ebp-108]
  79. .cby1  equ dword[ebp-112]
  80. .cby2  equ dword[ebp-116]
  81. .cex1  equ dword[ebp-120]
  82. .cex2  equ dword[ebp-124]
  83. .cey1  equ dword[ebp-128]
  84. .cey2  equ dword[ebp-132]
  85. .cz1   equ dword[ebp-136]
  86. .cz2   equ dword[ebp-140]
  87.  
  88.        mov     ebp,esp
  89.        push    edx        ; store bump map
  90.        push    esi        ; store e. map
  91.      ; sub     esp,120
  92.  .sort3:                  ; sort triangle coordinates...
  93.        cmp     ax,bx
  94.        jle     .sort1
  95.        xchg    eax,ebx
  96.        mov     edx,dword[.b_x1]
  97.        xchg    edx,dword[.b_x2]
  98.        mov     dword[.b_x1],edx
  99.        mov     edx,dword[.e_x1]
  100.        xchg    edx,dword[.e_x2]
  101.        mov     dword[.e_x1],edx
  102.        mov     dx,.z1
  103.        xchg    dx,.z2
  104.        mov     .z1,dx
  105.  .sort1:
  106.        cmp      bx,cx
  107.        jle      .sort2
  108.        xchg     ebx,ecx
  109.        mov      edx,dword[.b_x2]
  110.        xchg     edx,dword[.b_x3]
  111.        mov      dword[.b_x2],edx
  112.        mov      edx,dword[.e_x2]
  113.        xchg     edx,dword[.e_x3]
  114.        mov      dword[.e_x2],edx
  115.        mov     dx,.z2
  116.        xchg    dx,.z3
  117.        mov     .z2,dx
  118.        jmp      .sort3
  119.  .sort2:
  120.        push     eax     ; store triangle coords in variables
  121.        push     ebx
  122.        push     ecx
  123.  
  124.          mov      edx,80008000h  ; eax,ebx,ecx are ANDd together into edx which means that
  125.          and      edx,ebx        ; if *all* of them are negative a sign flag is raised
  126.          and      edx,ecx
  127.          and      edx,eax
  128.          test     edx,80008000h  ; Check both X&Y at once
  129.          jne      .loop23_done
  130.     ;   mov     edx,eax         ; eax,ebx,ecx are ORd together into edx which means that
  131.     ;   or      edx,ebx         ; if any *one* of them is negative a sign flag is raised
  132.     ;   or      edx,ecx
  133.     ;   test    edx,80000000h   ; Check only X
  134.     ;   jne     .loop23_done
  135.  
  136.     ;   cmp     .x1,SIZE_X    ; {
  137.     ;   jg      .loop23_done
  138.     ;   cmp     .x2,SIZE_X     ; This can be optimized with effort
  139.     ;   jg      .loop23_done
  140.     ;   cmp     .x3,SIZE_X
  141.     ;   jg      .loop23_done    ; {
  142.  
  143.  
  144.        mov      bx,.y2       ; calc delta 12
  145.        sub      bx,.y1
  146.        jnz      .bt_dx12_make
  147.        mov      ecx,6
  148.        xor      edx,edx
  149.      @@:
  150.        push     edx   ;dword 0
  151.        loop     @b
  152.        jmp      .bt_dx12_done
  153.  .bt_dx12_make:
  154.        mov      ax,.x2
  155.        sub      ax,.x1
  156.        cwde
  157.        movsx    ebx,bx
  158.        shl      eax,ROUND
  159.        cdq
  160.        idiv     ebx
  161.  ;      mov      .dx12,eax
  162.        push      eax
  163.  
  164.        mov      ax,word[.b_x2]
  165.        sub      ax,word[.b_x1]
  166.        cwde
  167.        shl      eax,ROUND
  168.        cdq
  169.        idiv     ebx
  170.  ;      mov      .dbx12,eax
  171.        push      eax
  172.  
  173.        mov      ax,word[.b_y2]
  174.        sub      ax,word[.b_y1]
  175.        cwde
  176.        shl      eax,ROUND
  177.        cdq
  178.        idiv     ebx
  179.  ;      mov      .dby12,eax
  180.        push      eax
  181.  
  182.        mov      ax,word[.e_x2]
  183.        sub      ax,word[.e_x1]
  184.        cwde
  185.        shl      eax,ROUND
  186.        cdq
  187.        idiv     ebx
  188.  ;      mov      .dex12,eax
  189.        push      eax
  190.  
  191.        mov      ax,word[.e_y2]
  192.        sub      ax,word[.e_y1]
  193.        cwde
  194.        shl      eax,ROUND
  195.        cdq
  196.        idiv     ebx
  197.  ;      mov      .dey12,eax
  198.        push      eax
  199.  
  200.         mov     ax,.z2
  201.         sub     ax,.z1
  202.         cwde
  203.         shl     eax,CATMULL_SHIFT
  204.         cdq
  205.         idiv    ebx
  206.         push    eax
  207.    .bt_dx12_done:
  208.  
  209.        mov      bx,.y3       ; calc delta13
  210.        sub      bx,.y1
  211.        jnz      .bt_dx13_make
  212.        mov      ecx,6
  213.        xor      edx,edx
  214.      @@:
  215.        push     edx   ;dword 0
  216.        loop     @b
  217.        jmp      .bt_dx13_done
  218.  .bt_dx13_make:
  219.        mov      ax,.x3
  220.        sub      ax,.x1
  221.        cwde
  222.        movsx    ebx,bx
  223.        shl      eax,ROUND
  224.        cdq
  225.        idiv     ebx
  226.  ;      mov      .dx13,eax
  227.        push      eax
  228.  
  229.        mov      ax,word[.b_x3]
  230.        sub      ax,word[.b_x1]
  231.        cwde
  232.        shl      eax,ROUND
  233.        cdq
  234.        idiv     ebx
  235.  ;      mov      .dbx13,eax
  236.        push      eax
  237.  
  238.        mov      ax,word[.b_y3]
  239.        sub      ax,word[.b_y1]
  240.        cwde
  241.        shl      eax,ROUND
  242.        cdq
  243.        idiv     ebx
  244.  ;      mov      .dby13,eax
  245.        push      eax
  246.  
  247.        mov      ax,word[.e_x3]
  248.        sub      ax,word[.e_x1]
  249.        cwde
  250.        shl      eax,ROUND
  251.        cdq
  252.        idiv     ebx
  253.  ;      mov      .dex13,eax
  254.        push      eax
  255.  
  256.        mov      ax,word[.e_y3]
  257.        sub      ax,word[.e_y1]
  258.        cwde
  259.        shl      eax,ROUND
  260.        cdq
  261.        idiv     ebx
  262.  ;      mov      .dey13,eax
  263.        push      eax
  264.  
  265.      ;  nop                     here bug ????!!!
  266.  
  267.        mov     ax,.z3
  268.        sub     ax,.z1
  269.        cwde
  270.        shl     eax,CATMULL_SHIFT
  271.        cdq
  272.        idiv    ebx
  273.   ;    mov    .dz13,eax
  274.        push    eax
  275.    .bt_dx13_done:
  276.  
  277.        mov      bx,.y3       ; calc delta23
  278.        sub      bx,.y2
  279.        jnz      .bt_dx23_make
  280.        mov      ecx,6
  281.        xor      edx,edx
  282.      @@:
  283.        push     edx   ;dword 0
  284.        loop     @b
  285.        jmp      .bt_dx23_done
  286.  .bt_dx23_make:
  287.        mov      ax,.x3
  288.        sub      ax,.x2
  289.        cwde
  290.        movsx    ebx,bx
  291.        shl      eax,ROUND
  292.        cdq
  293.        idiv     ebx
  294.  ;      mov      .dx23,eax
  295.        push      eax
  296.  
  297.        mov      ax,word[.b_x3]
  298.        sub      ax,word[.b_x2]
  299.        cwde
  300.        shl      eax,ROUND
  301.        cdq
  302.        idiv     ebx
  303.  ;      mov      .dbx23,eax
  304.        push      eax
  305.  
  306.        mov      ax,word[.b_y3]
  307.        sub      ax,word[.b_y2]
  308.        cwde
  309.        shl      eax,ROUND
  310.        cdq
  311.        idiv     ebx
  312.  ;      mov      .dby23,eax
  313.        push      eax
  314.  
  315.        mov      ax,word[.e_x3]
  316.        sub      ax,word[.e_x2]
  317.        cwde
  318.        shl      eax,ROUND
  319.        cdq
  320.        idiv     ebx
  321.  ;      mov      .dex23,eax
  322.        push      eax
  323.  
  324.        mov      ax,word[.e_y3]
  325.        sub      ax,word[.e_y2]
  326.        cwde
  327.        shl      eax,ROUND
  328.        cdq
  329.        idiv     ebx
  330.  ;      mov      .dey23,eax
  331.        push      eax
  332.  
  333.        mov     ax,.z3
  334.        sub     ax,.z2
  335.        cwde
  336.        shl     eax,CATMULL_SHIFT
  337.        cdq
  338.        idiv    ebx
  339.       ; mov     .dz23,eax
  340.        push    eax
  341.       ;  sub     esp,40
  342.    .bt_dx23_done:
  343.        movsx    eax,.x1
  344.        shl      eax,ROUND
  345.      ; mov      .cx1,eax
  346.      ; mov      .cx2,eax
  347.        push     eax
  348.        push     eax
  349.  
  350.        movsx    eax,word[.b_x1]
  351.        shl      eax,ROUND
  352.      ; mov      .cbx1,eax
  353.      ; mov      .cbx2,eax
  354.        push     eax
  355.        push     eax
  356.  
  357.        movsx    eax,word[.b_y1]
  358.        shl      eax,ROUND
  359.      ; mov      .cby1,eax
  360.      ; mov      .cby2,eax
  361.        push     eax
  362.        push     eax
  363.  
  364.        movsx    eax,word[.e_x1]
  365.        shl      eax,ROUND
  366.       ;mov      .cex1,eax
  367.       ;mov      .cex2,eax
  368.        push     eax
  369.        push     eax
  370.  
  371.        movsx    eax,word[.e_y1]
  372.        shl      eax,ROUND
  373.       ;mov      .cey1,eax
  374.       ;mov      .cey2,eax
  375.        push     eax
  376.        push     eax
  377.  
  378.        movsx    eax,.z1
  379.        shl      eax,CATMULL_SHIFT
  380.       ;mov      .cz1,eax
  381.       ;mov      .cz2,eax
  382.        push     eax
  383.        push     eax
  384.  
  385.        movsx    ecx,.y1
  386.        cmp      cx,.y2
  387.        jge      .loop12_done
  388.   .loop12:
  389.        call     .call_bump_line
  390.  
  391.        mov      eax,.dx13
  392.        add      .cx1,eax
  393.        mov      eax,.dx12
  394.        add      .cx2,eax
  395.  
  396.        mov      eax,.dbx13
  397.        add      .cbx1,eax
  398.        mov      eax,.dbx12
  399.        add      .cbx2,eax
  400.        mov      eax,.dby13
  401.        add      .cby1,eax
  402.        mov      eax,.dby12
  403.        add      .cby2,eax
  404.  
  405.        mov      eax,.dex13
  406.        add      .cex1,eax
  407.        mov      eax,.dex12
  408.        add      .cex2,eax
  409.        mov      eax,.dey13
  410.        add      .cey1,eax
  411.        mov      eax,.dey12
  412.        add      .cey2,eax
  413.  
  414.        mov      eax,.dz13
  415.        add      .cz1,eax
  416.        mov      eax,.dz12
  417.        add      .cz2,eax
  418.  
  419.        inc      ecx
  420.        cmp      cx,.y2
  421.        jl       .loop12
  422.     .loop12_done:
  423.  
  424.        movsx    ecx,.y2
  425.        cmp      cx,.y3
  426.        jge      .loop23_done
  427.  
  428.        movsx    eax,.z2
  429.        shl      eax,CATMULL_SHIFT
  430.        mov      .cz2,eax
  431.  
  432.        movsx    eax,.x2
  433.        shl      eax,ROUND
  434.        mov      .cx2,eax
  435.  
  436.        movzx    eax,word[.b_x2]
  437.        shl      eax,ROUND
  438.        mov      .cbx2,eax
  439.  
  440.        movzx    eax,word[.b_y2]
  441.        shl      eax,ROUND
  442.        mov      .cby2,eax
  443.  
  444.        movzx    eax,word[.e_x2]
  445.        shl      eax,ROUND
  446.        mov      .cex2,eax
  447.  
  448.        movzx    eax,word[.e_y2]
  449.        shl      eax,ROUND
  450.        mov      .cey2,eax
  451.  
  452.      .loop23:
  453.        call     .call_bump_line
  454.  
  455.        mov      eax,.dx13
  456.        add      .cx1,eax
  457.        mov      eax,.dx23
  458.        add      .cx2,eax
  459.  
  460.        mov      eax,.dbx13
  461.        add      .cbx1,eax
  462.        mov      eax,.dbx23
  463.        add      .cbx2,eax
  464.        mov      eax,.dby13
  465.        add      .cby1,eax
  466.        mov      eax,.dby23
  467.        add      .cby2,eax
  468.  
  469.        mov      eax,.dex13
  470.        add      .cex1,eax
  471.        mov      eax,.dex23
  472.        add      .cex2,eax
  473.        mov      eax,.dey13
  474.        add      .cey1,eax
  475.        mov      eax,.dey23
  476.        add      .cey2,eax
  477.  
  478.        mov      eax,.dz13
  479.        add      .cz1,eax
  480.        mov      eax,.dz23
  481.        add      .cz2,eax
  482.  
  483.        inc      ecx
  484.        cmp      cx,.y3
  485.        jl       .loop23
  486.     .loop23_done:
  487.  
  488.        mov      esp,ebp
  489. ret   34
  490.  
  491. .call_bump_line:
  492.  
  493.       ; push     ebp
  494.       ; push     ecx
  495.        pushad
  496.  
  497.        push     .cz1
  498.        push     .cz2
  499.        push     .z_buff
  500.        push     .t_emap
  501.        push     .t_bmap
  502.        push     .cey2
  503.        push     .cex2
  504.        push     .cey1
  505.        push     .cex1
  506.        push     .cby2
  507.        push     .cbx2
  508.        push     .cby1
  509.        push     .cbx1
  510.        push     ecx
  511.  
  512.        mov      eax,.cx1
  513.        sar      eax,ROUND
  514.        mov      ebx,.cx2
  515.        sar      ebx,ROUND
  516.  
  517.        call     bump_line_z
  518.  
  519.        popad
  520. ret
  521. bump_line_z:
  522. ;--------------in: eax - x1
  523. ;--------------    ebx - x2
  524. ;--------------    edi - pointer to screen buffer
  525. ;stack - another parameters :
  526. .y      equ dword [ebp+4]
  527. .bx1    equ dword [ebp+8]   ;   ---
  528. .by1    equ dword [ebp+12]  ;       |
  529. .bx2    equ dword [ebp+16]  ;       |
  530. .by2    equ dword [ebp+20]  ;       |>   bump and env coords
  531. .ex1    equ dword [ebp+24]  ;       |>   shifted shl ROUND
  532. .ey1    equ dword [ebp+28]  ;       |
  533. .ex2    equ dword [ebp+32]  ;       |
  534. .ey2    equ dword [ebp+36]  ;   ---
  535. .bmap   equ dword [ebp+40]
  536. .emap   equ dword [ebp+44]
  537. .z_buff equ dword [ebp+48]
  538. .z2     equ dword [ebp+52]  ;   -- |>   z coords shifted
  539. .z1     equ dword [ebp+56]  ;   --       shl  CATMULL_SHIFT
  540.  
  541. .x1     equ dword [ebp-4]
  542. .x2     equ dword [ebp-8]
  543. .dbx    equ dword [ebp-12]
  544. .dby    equ dword [ebp-16]
  545. .dex    equ dword [ebp-20]
  546. .dey    equ dword [ebp-24]
  547. .dz     equ dword [ebp-28]
  548. .cbx    equ dword [ebp-32]
  549. .cby    equ dword [ebp-36]
  550. .cex    equ dword [ebp-40]
  551. .cey    equ dword [ebp-44]
  552. .cz     equ dword [ebp-48]
  553. .czbuff equ dword [ebp-52]
  554.         mov     ebp,esp
  555.  
  556.         mov     ecx,.y
  557.         or      ecx,ecx
  558.         jl      .bl_end
  559.         cmp     ecx,SIZE_Y
  560.         jge     .bl_end
  561.  
  562.         cmp     eax,ebx
  563.         jl      .bl_ok
  564.         je      .bl_end
  565.  
  566.         xchg    eax,ebx
  567.  
  568.         mov     edx,.bx1
  569.         xchg    edx,.bx2
  570.         mov     .bx1,edx
  571.         mov     edx,.by1
  572.         xchg    edx,.by2
  573.         mov     .by1,edx
  574.  
  575.         mov     edx,.ex1
  576.         xchg    edx,.ex2
  577.         mov     .ex1,edx
  578.         mov     edx,.ey1
  579.         xchg    edx,.ey2
  580.         mov     .ey1,edx
  581.  
  582.         mov     edx,.z1
  583.         xchg    edx,.z2
  584.         mov     .z1,edx
  585.   .bl_ok:
  586.         push    eax
  587.         push    ebx           ;store x1, x2
  588.  
  589.         cmp     .x1,SIZE_X
  590.         jge     .bl_end
  591.         cmp     .x2,0
  592.         jle     .bl_end
  593.  
  594.         mov     ebx,.x2
  595.         sub     ebx,.x1
  596.  
  597.         mov     eax,.bx2       ; calc .dbx
  598.         sub     eax,.bx1
  599.         cdq
  600.         idiv    ebx
  601.         push    eax
  602.  
  603.         mov     eax,.by2       ; calc .dby
  604.         sub     eax,.by1
  605.         cdq
  606.         idiv    ebx
  607.         push    eax
  608.  
  609.         mov     eax,.ex2       ; calc .dex
  610.         sub     eax,.ex1
  611.         cdq
  612.         idiv    ebx
  613.         push    eax
  614.  
  615.         mov     eax,.ey2       ; calc .dey
  616.         sub     eax,.ey1
  617.         cdq
  618.         idiv    ebx
  619.         push    eax
  620.  
  621.         mov     eax,.z2        ; calc .dz
  622.         sub     eax,.z1
  623.         cdq
  624.         idiv    ebx
  625.         push    eax
  626.  
  627.         cmp     .x1,0         ; set correctly begin variable
  628.         jge     @f            ; CLIPPING ON FUNCTION
  629.                               ; cutting triangle exceedes screen
  630.         mov     ebx,.x1
  631.         neg     ebx
  632.         imul    ebx           ; eax = .dz * abs(.x1)
  633.         add     .z1,eax
  634.         mov     .x1,0
  635.  
  636.         mov     eax,.dbx
  637.         imul    ebx
  638.         add    .bx1,eax
  639.  
  640.         mov     eax,.dby
  641.         imul    ebx
  642.         add     .by1,eax
  643.  
  644.         mov     eax,.dex
  645.         imul    ebx
  646.         add     .ex1,eax
  647.  
  648.         mov     eax,.dey
  649.         imul    ebx
  650.         add     .ey1,eax
  651.       @@:
  652.         cmp     .x2,SIZE_X
  653.         jl      @f
  654.         mov     .x2,SIZE_X
  655.       @@:
  656.         mov     eax,SIZE_X       ;calc memory begin in buffers
  657.         mov     ebx,.y
  658.         mul     ebx
  659.         mov     ebx,.x1
  660.         add     eax,ebx
  661.         mov     ebx,eax
  662.         lea     eax,[eax*3]
  663.         add     edi,eax
  664.         mov     esi,.z_buff       ; z-buffer filled with dd variables
  665.         shl     ebx,2
  666.         add     esi,ebx
  667.  
  668.         mov     ecx,.x2
  669.         sub     ecx,.x1
  670.         ; init current variables
  671.         push    .bx1
  672.         push    .by1
  673.         push    .ex1
  674.         push    .ey1
  675.         push    .z1              ; current z shl CATMULL_SHIFT
  676.         push    esi
  677.      .draw:
  678.     ; if TEX = SHIFTING   ;bump drawing only in shifting mode
  679.         mov     esi,.czbuff      ; .czbuff current address in buffer
  680.         mov     ebx,.cz          ; .cz - cur z position
  681.         cmp     ebx,dword[esi]
  682.         jge     .skip
  683.  
  684.         mov     eax,.cby
  685.         sar     eax,ROUND
  686.         shl     eax,TEX_SHIFT
  687.         mov     esi,.cbx
  688.         sar     esi,ROUND
  689.         add     esi,eax
  690.  
  691.         mov     ebx,esi
  692.         dec     ebx
  693.         and     ebx,TEXTURE_SIZE
  694.         add     ebx,.bmap
  695.         movzx   eax,byte [ebx]
  696.  
  697.         mov     ebx,esi
  698.         inc     ebx
  699.         and     ebx,TEXTURE_SIZE
  700.         add     ebx,.bmap
  701.         movzx   ebx,byte [ebx]
  702.         sub     eax,ebx
  703.  
  704.         mov     ebx,esi
  705.         sub     ebx,TEX_X
  706.         and     ebx,TEXTURE_SIZE
  707.         add     ebx,.bmap
  708.         movzx   edx,byte [ebx]
  709.  
  710.         mov     ebx,esi
  711.         add     ebx,TEX_X
  712.         and     ebx,TEXTURE_SIZE
  713.         add     ebx,.bmap
  714.         movzx   ebx,byte [ebx]
  715.         sub     edx,ebx
  716.  
  717.         mov     ebx,.cex       ;.cex - current env map X
  718.         sar     ebx,ROUND
  719.         add     eax,ebx        ; eax - modified x coord
  720.  
  721.         mov     ebx,.cey       ;.cey - current  env map y
  722.         sar     ebx,ROUND
  723.         add     edx,ebx        ; edx - modified y coord
  724.  
  725.         or      eax,eax
  726.         jl      .black
  727.         cmp     eax,TEX_X
  728.         jg      .black
  729.         or      edx,edx
  730.         jl      .black
  731.         cmp     edx,TEX_Y
  732.         jg      .black
  733.  
  734.         shl     edx,TEX_SHIFT
  735.         add     edx,eax
  736.         lea     edx,[edx*3]
  737.         add     edx,.emap
  738.         mov     eax,dword[edx]
  739.         jmp     .put_pixel
  740.      .black:
  741.         xor     eax,eax
  742.      .put_pixel:
  743.         stosd
  744.         dec     edi
  745.         mov     ebx,.cz
  746.         mov     esi,.czbuff
  747.         mov     dword[esi],ebx
  748.         jmp     .no_skip
  749.      .skip:
  750.         add     edi,3
  751.      .no_skip:
  752.         add     .czbuff,4
  753.         mov     eax,.dbx
  754.         add     .cbx,eax
  755.         mov     eax,.dby
  756.         add     .cby,eax
  757.         mov     eax,.dex
  758.         add     .cex,eax
  759.         mov     eax,.dey
  760.         add     .cey,eax
  761.         mov     eax,.dz
  762.         add     .cz,eax
  763.  
  764.         dec     ecx
  765.         jnz     .draw
  766.    ;   end if
  767.   .bl_end:
  768.         mov     esp,ebp
  769. ret 56