[docs] Replace cyrillic 'с' with latin 'c' in register names
[kolibrios.git] / programs / demos / view3ds / bump_cat.inc
blob7f6c97727d68fe41ce3d7f1092e8e737b6ffd9d2
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
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]
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]
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]
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]
78 .cx1   equ dword[ebp-96]   ; current variables
79 .cz1   equ      [ebp-100]
80 .cx2   equ dword[ebp-104]
81 .cz2   equ      [ebp-108]
82 .cbx1  equ dword[ebp-112]
83 .cby1  equ      [ebp-116]
84 .cex1  equ dword[ebp-120]
85 .cey1  equ      [ebp-124]
86 .cbx2  equ dword[ebp-128]
87 .cby2  equ      [ebp-132]
88 .cex2  equ dword[ebp-136]
89 .cey2  equ      [ebp-140]
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
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
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    ; {
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
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
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
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
195        psubd      mm1,mm0
196        psubd      mm3,mm2
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
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
218 else
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
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
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
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
256 end if
258    .bt_dx12_done:
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
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
289 if Ext>=SSE
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
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
310        psubd      mm1,mm0
311        psubd      mm3,mm2
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
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
333 else
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
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
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
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
372    .bt_dx13_done:
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
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
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
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
424        psubd      mm1,mm0
425        psubd      mm3,mm2
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
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
446 else
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
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
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
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
484 end if
486    .bt_dx23_done:
487        sub      esp,48
489        movsx    eax,.x1
490        shl      eax,ROUND
491        mov      .cx1,eax
492        mov      .cx2,eax
493      ;  push     eax
494      ;  push     eax
496        movsx    eax,word[.b_x1]
497        shl      eax,ROUND
498        mov      .cbx1,eax
499        mov      .cbx2,eax
500     ;   push     eax
501     ;   push     eax
503        movsx    eax,word[.b_y1]
504        shl      eax,ROUND
505        mov      .cby1,eax
506        mov      .cby2,eax
507     ;   push     eax
508     ;   push     eax
510        movsx    eax,word[.e_x1]
511        shl      eax,ROUND
512        mov      .cex1,eax
513        mov      .cex2,eax
514     ;   push     eax
515     ;   push     eax
517        movsx    eax,word[.e_y1]
518        shl      eax,ROUND
519        mov      .cey1,eax
520        mov      .cey2,eax
521     ;   push     eax
522     ;   push     eax
524        movsx    eax,.z1
525        shl      eax,CATMULL_SHIFT
526        mov      .cz1,eax
527        mov      .cz2,eax
528      ;  push     eax
529      ;  push     eax
531        movsx    ecx,.y1
532        cmp      cx,.y2
533        jge      .loop12_done
534   .loop12:
535        call     .call_bump_line
536 if Ext >= SSE2
537        movups   xmm0,.cey2
538        movups   xmm1,.cey1
539        movups   xmm2,.dey12
540        movups   xmm3,.dey13
541        paddd    xmm0,xmm2
542        paddd    xmm1,xmm3
543        movups   .cey2,xmm0
544        movups   .cey1,xmm1
545        movq     mm4,.cz1
546        movq     mm5,.cz2
547        paddd    mm4,.dz13
548        paddd    mm5,.dz12
549        movq     .cz1,mm4
550        movq     .cz2,mm5
551 end if
554 if (Ext = MMX) | (Ext = SSE)
555        movq     mm0,.cby2
556        movq     mm1,.cby1
557        movq     mm2,.cey2
558        movq     mm3,.cey1
559        movq     mm4,.cz1
560        movq     mm5,.cz2
561        paddd    mm0,.dby12
562        paddd    mm1,.dby13
563        paddd    mm2,.dey12
564        paddd    mm3,.dey13
565        paddd    mm4,.dz13
566        paddd    mm5,.dz12
567        movq     .cby2,mm0
568        movq     .cby1,mm1
569        movq     .cey1,mm3
570        movq     .cey2,mm2
571        movq     .cz1,mm4
572        movq     .cz2,mm5
573 else if Ext = NON
574        mov      edx,.dbx13
575        add      .cbx1,edx
576        mov      eax,.dbx12
577        add      .cbx2,eax
578        mov      ebx,.dby13
579        add      .cby1,ebx
580        mov      edx,.dby12
581        add      .cby2,edx
583        mov      eax,.dex13
584        add      .cex1,eax
585        mov      ebx,.dex12
586        add      .cex2,ebx
587        mov      edx,.dey13
588        add      .cey1,edx
589        mov      eax,.dey12
590        add      .cey2,eax
592        mov      eax,.dx13
593        add      .cx1,eax
594        mov      ebx,.dx12
595        add      .cx2,ebx
597        mov      ebx,.dz13
598        add      .cz1,ebx
599        mov      edx,.dz12
600        add      .cz2,edx
601 end if
602        inc      ecx
603        cmp      cx,.y2
604        jl       .loop12
605     .loop12_done:
607        movsx    ecx,.y2
608        cmp      cx,.y3
609        jge      .loop23_done
611        movsx    eax,.z2
612        shl      eax,CATMULL_SHIFT
613        mov      .cz2,eax
615        movsx    eax,.x2
616        shl      eax,ROUND
617        mov      .cx2,eax
619        movzx    eax,word[.b_x2]
620        shl      eax,ROUND
621        mov      .cbx2,eax
623        movzx    eax,word[.b_y2]
624        shl      eax,ROUND
625        mov      .cby2,eax
627        movzx    eax,word[.e_x2]
628        shl      eax,ROUND
629        mov      .cex2,eax
631        movzx    eax,word[.e_y2]
632        shl      eax,ROUND
633        mov      .cey2,eax
635      .loop23:
636        call     .call_bump_line
637 if Ext >=  SSE2
638        movups   xmm0,.cey2
639        movups   xmm1,.cey1
640        movups   xmm2,.dey23
641        movups   xmm3,.dey13
642        paddd    xmm0,xmm2
643        paddd    xmm1,xmm3
644        movups   .cey2,xmm0
645        movups   .cey1,xmm1
646        movq     mm4,.cz1
647        movq     mm5,.cz2
648        paddd    mm4,.dz13
649        paddd    mm5,.dz23
650        movq     .cz1,mm4
651        movq     .cz2,mm5
652 end if
653 if (Ext = MMX) | (Ext = SSE)
654        movq     mm0,.cby2
655        movq     mm1,.cby1
656        movq     mm2,.cey2
657        movq     mm3,.cey1
658        movq     mm4,.cz1
659        movq     mm5,.cz2
660        paddd    mm0,.dby23
661        paddd    mm1,.dby13
662        paddd    mm2,.dey23
663        paddd    mm3,.dey13
664        paddd    mm4,.dz13
665        paddd    mm5,.dz23
666        movq     .cby2,mm0
667        movq     .cby1,mm1
668        movq     .cey1,mm3
669        movq     .cey2,mm2
670        movq     .cz1,mm4
671        movq     .cz2,mm5
672 else if Ext = NON
673        mov      eax,.dx13
674        add      .cx1,eax
675        mov      ebx,.dx23
676        add      .cx2,ebx
678        mov      edx,.dbx13
679        add      .cbx1,edx
680        mov      eax,.dbx23
681        add      .cbx2,eax
682        mov      ebx,.dby13
683        add      .cby1,ebx
684        mov      edx,.dby23
685        add      .cby2,edx
687        mov      eax,.dex13
688        add      .cex1,eax
689        mov      ebx,.dex23
690        add      .cex2,ebx
691        mov      edx,.dey13
692        add      .cey1,edx
693        mov      eax,.dey23
694        add      .cey2,eax
696        mov      ebx,.dz13
697        add      .cz1,ebx
698        mov      edx,.dz23
699        add      .cz2,edx
700 end if
701        inc      ecx
702        cmp      cx,.y3
703        jl       .loop23
704     .loop23_done:
706        mov      esp,ebp
707 ret   34
709 .call_bump_line:
711       ; push     ebp
712       ; push     ecx
713        pushad
715        push     dword .cz1
716        push     dword .cz2
717        push     .z_buff
718        push     .t_emap
719        push     .t_bmap
720        push     dword .cey2
721        push     .cex2
722        push     dword .cby2
723        push     .cbx2
724        push     dword .cey1
725        push     .cex1
726        push     dword .cby1
727        push     .cbx1
728        push     ecx
730        mov      eax,.cx1
731        sar      eax,ROUND
732        mov      ebx,.cx2
733        sar      ebx,ROUND
735        call     bump_line_z
737        popad
739 bump_line_z:
740 ;--------------in: eax - x1
741 ;--------------    ebx - x2
742 ;--------------    edi - pointer to screen buffer
743 ;stack - another parameters :
744 .y      equ dword [ebp+4]
745 .bx1    equ       [ebp+8]   ;   ---
746 .by1    equ dword [ebp+12]  ;       |
747 .ex1    equ       [ebp+16]  ;       |
748 .ey1    equ dword [ebp+20]  ;       |>   bump and env coords
749 .bx2    equ       [ebp+24]  ;       |>   shifted shl ROUND
750 .by2    equ dword [ebp+28]  ;       |
751 .ex2    equ       [ebp+32]  ;       |
752 .ey2    equ dword [ebp+36]  ;   ---
753 .bmap   equ dword [ebp+40]
754 .emap   equ dword [ebp+44]
755 .z_buff equ dword [ebp+48]
756 .z2     equ dword [ebp+52]  ;   -- |>   z coords shifted
757 .z1     equ dword [ebp+56]  ;   --       shl  CATMULL_SHIFT
759 .x1     equ dword [ebp-4]
760 .x2     equ dword [ebp-8]
761 .dbx    equ dword [ebp-12]
762 .dby    equ       [ebp-16]
763 .dex    equ dword [ebp-20]
764 .dey    equ       [ebp-24]
765 .dz     equ dword [ebp-28]
766 .cbx    equ dword [ebp-32]
767 .cby    equ       [ebp-36]
768 .cex    equ dword [ebp-40]
769 .cey    equ       [ebp-44]
770 .cz     equ dword [ebp-48]
771 .czbuff equ dword [ebp-52]
772 .temp1  equ        ebp-60
773 .temp2  equ        ebp-68
774 .temp3  equ        ebp-76
775 .temp4  equ        ebp-84
776 .temp5  equ        ebp-92
778         mov     ebp,esp
780         mov     ecx,.y
781         or      ecx,ecx
782         jl      .bl_end
783   ;      mov     dx,[size_x_var]
784   ;      dec     dx
785         cmp     cx,[size_y_var]  ;SIZE_Y
786         jge     .bl_end
788         cmp     eax,ebx
789         jl      .bl_ok
790         je      .bl_end
792         xchg    eax,ebx
793 if Ext=NON
794         mov     edx,.bx1
795         xchg    edx,.bx2
796         mov     .bx1,edx
797         mov     edx,.by1
798         xchg    edx,.by2
799         mov     .by1,edx
801         mov     edx,.ex1
802         xchg    edx,.ex2
803         mov     .ex1,edx
804         mov     edx,.ey1
805         xchg    edx,.ey2
806         mov     .ey1,edx
807 end if
808 if Ext = MMX
809         movq    mm0,.bx1
810         movq    mm1,.ex1
811         movq    mm2,.bx2
812         movq    mm3,.ex2
813         movq    .bx2,mm0
814         movq    .ex2,mm1
815         movq    .bx1,mm2
816         movq    .ex1,mm3
817 end if
818 if Ext >= SSE
819         movups  xmm0,.bx1
820         movups  xmm1,.bx2
821         movups  .bx2,xmm0
822         movups  .bx1,xmm1
823 end if
825         mov     edx,.z1
826         xchg    edx,.z2
827         mov     .z1,edx
829   .bl_ok:
831         push    eax
832         push    ebx           ;store x1, x2
833         movzx   edx,word[size_x_var]
834         dec     edx
835         cmp     .x1,edx  ;SIZE_X
836         jge     .bl_end
837         cmp     .x2,0
838         jle     .bl_end
840         mov     ebx,.x2
841         sub     ebx,.x1
843 if  Ext >= SSE
845        sub       esp,16
846        cvtsi2ss  xmm3,ebx            ;rcps
847        shufps    xmm3,xmm3,0
849        cvtpi2ps  xmm0,.bx1 ;mm0
850        movlhps   xmm0,xmm0
851        cvtpi2ps  xmm0,.ex1 ;mm2
852        cvtpi2ps  xmm1,.bx2 ;mm1
853        movlhps   xmm1,xmm1
854        cvtpi2ps  xmm1,.ex2 ;mm3
855        subps     xmm1,xmm0
857        divps     xmm1,xmm3
859        shufps    xmm1,xmm1,10110001b
860        cvtps2pi  mm0,xmm1          ; mm0 -> 2 delta dwords
861        movhlps   xmm1,xmm1
862        cvtps2pi  mm1,xmm1
863        movq      .dey,mm0
864        movq      .dby,mm1
866 else
868         mov     eax,.bx2       ; calc .dbx
869         sub     eax,.bx1
870         cdq
871         idiv    ebx
872         push    eax
874         mov     eax,.by2       ; calc .dby
875         sub     eax,.by1
876         cdq
877         idiv    ebx
878         push    eax
880         mov     eax,.ex2       ; calc .dex
881         sub     eax,.ex1
882         cdq
883         idiv    ebx
884         push    eax
886         mov     eax,.ey2       ; calc .dey
887         sub     eax,.ey1
888         cdq
889         idiv    ebx
890         push    eax
892 end if
894         mov     eax,.z2        ; calc .dz
895         sub     eax,.z1
896         cdq
897         idiv    ebx
898         push    eax
900         cmp     .x1,0         ; set correctly begin variable
901         jge     @f            ; CLIPPING ON FUNCTION
902                               ; cutting triangle exceedes screen
903         mov     ebx,.x1
904         neg     ebx
905         imul    ebx           ; eax = .dz * abs(.x1)
906         add     .z1,eax
907         mov     .x1,0
909         mov     eax,.dbx
910         imul    ebx
911         add    .bx1,eax
913         mov     eax,.dby
914         imul    ebx
915         add     .by1,eax
917         mov     eax,.dex
918         imul    ebx
919         add     .ex1,eax
921         mov     eax,.dey
922         imul    ebx
923         add     .ey1,eax
924       @@:
925         movzx   edx,word[size_x_var]
926         dec     edx
927         cmp     .x2,edx  ;SIZE_X
928         jl      @f
929         mov     .x2,edx ;SIZE_X
930       @@:
931         movzx   eax,word[size_x_var]  ;SIZE_X       ;calc memory begin in buffers
932         mov     ebx,.y
933         mul     ebx
934         mov     ebx,.x1
935         add     eax,ebx
936         mov     ebx,eax
937         lea     eax,[eax*3]
938         add     edi,eax
939         mov     esi,.z_buff       ; z-buffer filled with dd variables
940         shl     ebx,2
941         add     esi,ebx
943         mov     ecx,.x2
944         sub     ecx,.x1
945         ; init current variables
946         push    dword .bx1
947         push    .by1
948         push    dword .ex1
949         push    .ey1
951         push    .z1              ; current z shl CATMULL_SHIFT
952         push    esi
953 ;if Ext = SSE2
954 ;        movups  xmm1,.dey
955 ;end if
956 if Ext>=MMX
957         movq    mm0,.cby
958         movq    mm1,.cey
959         movq    mm2,.dby
960         movq    mm3,.dey
961 end if
962 if Ext >= SSE2
963         mov    eax,TEXTURE_SIZE
964         movd   xmm1,eax
965         shufps xmm1,xmm1,0
966         push   dword  TEX_X
967         push   dword  -TEX_X
968         push   dword  1
969         push   dword  -1
970         movups xmm2,[esp]
971         movd   xmm3,.bmap
972         shufps xmm3,xmm3,0
973 end if
975 ;align 16
976      .draw:
977     ; if TEX = SHIFTING   ;bump drawing only in shifting mode
978         mov     esi,.czbuff      ; .czbuff current address in buffer
979         mov     ebx,.cz          ; .cz - cur z position
980         cmp     ebx,dword[esi]
981         jge     .skip
983 if Ext>=MMX
984         movq    mm6,mm0
985         psrld   mm6,ROUND
986         movd    eax,mm6
987         psrlq   mm6,32
988         movd    esi,mm6
989 else
990         mov     eax,.cby
991         sar     eax,ROUND
992         mov     esi,.cbx
993         sar     esi,ROUND
994 end if
995         shl     eax,TEX_SHIFT   ;-
996         add     esi,eax         ;-  ; esi - current bump map index
998 if Ext = SSE2
999         movd    xmm0,esi
1000         shufps  xmm0,xmm0,0
1001         paddd   xmm0,xmm2
1002         pand    xmm0,xmm1
1003         paddd   xmm0,xmm3
1005         movd    ebx,xmm0
1006         movzx   eax,byte[ebx]
1008 ;        shufps  xmm0,xmm0,11100001b
1009         psrldq  xmm0,4
1010         movd    ebx,xmm0
1011         movzx   ebx,byte[ebx]
1012         sub     eax,ebx
1014 ;        shufps  xmm0,xmm0,11111110b
1015         psrldq  xmm0,4
1016         movd    ebx,xmm0
1017         movzx   edx, byte [ebx]
1019 ;        shufps  xmm0,xmm0,11111111b
1020         psrldq  xmm0,4
1021         movd    ebx,xmm0
1022         movzx   ebx, byte [ebx]
1023         sub     edx,ebx
1025 else
1027         mov     ebx,esi
1028         dec     ebx
1029         and     ebx,TEXTURE_SIZE
1030         add     ebx,.bmap
1031         movzx   eax,byte [ebx]
1033         mov     ebx,esi
1034         inc     ebx
1035         and     ebx,TEXTURE_SIZE
1036         add     ebx,.bmap
1037         movzx   ebx,byte [ebx]
1039         sub     eax,ebx
1041         mov     ebx,esi
1042         sub     ebx,TEX_X
1043         and     ebx,TEXTURE_SIZE
1044         add     ebx,.bmap
1045         movzx   edx,byte [ebx]
1047         mov     ebx,esi
1048         add     ebx,TEX_X
1049         and     ebx,TEXTURE_SIZE
1050         add     ebx,.bmap
1051         movzx   ebx,byte [ebx]
1053         sub     edx,ebx
1054 end if
1055      ;  eax - horizontal sub
1056      ;  edx - vertical   sub
1057 if Ext = NON
1058         mov     ebx,.cex       ;.cex - current env map X
1059         sar     ebx,ROUND
1060         add     eax,ebx        ; eax - modified x coord
1062         mov     ebx,.cey       ;.cey - current  env map y
1063         sar     ebx,ROUND
1064         add     edx,ebx        ; edx - modified y coord
1065 else
1066         movq    mm6,mm1        ; mm5 - copy of cur env coords
1067         psrld   mm6,ROUND
1068         movd    ebx,mm6
1069         psrlq   mm6,32
1070         add     eax,ebx
1071         movd    ebx,mm6
1072         add     edx,ebx
1073 end if
1074         or      eax,eax
1075         jl      .black
1076         cmp     eax,TEX_X
1077         jg      .black
1078         or      edx,edx
1079         jl      .black
1080         cmp     edx,TEX_Y
1081         jg      .black
1083         shl     edx,TEX_SHIFT
1084         add     edx,eax
1085         lea     esi,[edx*3]
1086         add     esi,.emap
1087         lodsd
1088         jmp     .put_pixel
1089      .black:
1090         xor     eax,eax
1091      .put_pixel:
1092         stosd
1093         dec     edi
1094         mov     ebx,.cz
1095         mov     esi,.czbuff
1096         mov     dword[esi],ebx
1097         jmp     .no_skip
1098      .skip:
1099         add     edi,3
1100      .no_skip:
1101         add     .czbuff,4
1103 ;if Ext = SSE2
1104 ;        movups  xmm0,.cey
1105 ;        paddd   xmm0,xmm1
1106 ;        movups  .cey,xmm0
1108 ;end if
1109 if Ext >= MMX
1110         paddd   mm0,mm2
1111         paddd   mm1,mm3
1112 end if
1114 if Ext=NON
1115         mov     eax,.dbx
1116         add     .cbx,eax
1117         mov     eax,.dby
1118         add     .cby,eax
1119         mov     eax,.dex
1120         add     .cex,eax
1121         mov     eax,.dey
1122         add     .cey,eax
1123 end if
1124         mov     eax,.dz
1125         add     .cz,eax
1127         dec     ecx
1128         jnz     .draw
1129    ;   end if
1130   .bl_end:
1131         mov     esp,ebp
1132 ret 56