Subversion Repositories Kolibri OS

Rev

Rev 1931 | Go to most recent revision | Details | Compare with Previous | Last modification | View Log | RSS feed

Rev Author Line No. Line
1245 hidnplayr 1
 
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
9
 
10
;TEXTURE_SIZE EQU (TEX_X * TEX_Y)-1
11
;Ext = SSE
12
;SSE = 3
13
;MMX = 1
14
;NON = 0
15
;use32
16
;------- Big thanks to Majuma (www.majuma.xt.pl) for absolutely great---
17
;------- DOS 13h mode demos --------------------------------------------
18
;------- Procedure draws triangle with two overlapped textures, I use --
19
;--------Catmull Z-buffer algorithm- (Z coordinate interpolation)-------
20
;--------I calc texture pixel by this way: col1*col2/256 ---------------
21
two_tex_triangle_z:
22
;------------------in - eax - x1 shl 16 + y1 -----------
23
;---------------------- ebx - x2 shl 16 + y2 -----------
24
;---------------------- ecx - x3 shl 16 + y3 -----------
25
;---------------------- edx - pointer to b. texture-----
26
;---------------------- esi - pointer to e. texture-----
27
;---------------------- edi - pointer to screen buffer--
28
;---------------------- stack : b. tex coordinates------
29
;----------------------         e. tex coordinates------
30
;----------------------         Z position coordinates--
31
;----------------------         pointer io Z buffer-----
32
;-- Z-buffer - filled with coordinates as dword --------
33
;-- (Z coor. as word) shl CATMULL_SHIFT ----------------
34
.b_x1	equ ebp+4   ; procedure don't save registers !!!
35
.b_y1	equ ebp+6   ; each coordinate as word
36
.b_x2	equ ebp+8
37
.b_y2	equ ebp+10	 ; b - first texture
38
.b_x3	equ ebp+12
39
.b_y3	equ ebp+14	 ; e - second texture
40
.e_x1	equ ebp+16
41
.e_y1	equ ebp+18
42
.e_x2	equ ebp+20
43
.e_y2	equ ebp+22
44
.e_x3	equ ebp+24
45
.e_y3	equ ebp+26
46
.z1	equ word[ebp+28]
47
.z2	equ word[ebp+30]
48
.z3	equ word[ebp+32]
49
.z_buff equ dword[ebp+34]	; pointer to Z-buffer
50
51
 
52
 
53
.t_emap equ dword[ebp-8]	; pointer to e. texture
54
.x1	equ word[ebp-10]
55
.y1	equ word[ebp-12]
56
.x2	equ word[ebp-14]
57
.y2	equ word[ebp-16]
58
.x3	equ word[ebp-18]
59
.y3	equ word[ebp-20]
60
61
 
62
.dbx12 equ dword[ebp-28]
63
.dby12 equ dword[ebp-32]
64
.dby12q equ	[ebp-32]
65
.dex12 equ dword[ebp-36]
66
.dey12 equ dword[ebp-40]
67
.dey12q equ	[ebp-40]
68
.dz12  equ dword[ebp-44]
69
70
 
71
.dbx13 equ dword[ebp-52]
72
.dby13 equ dword[ebp-56]
73
.dby13q equ	[ebp-56]
74
.dex13 equ dword[ebp-60]
75
.dey13 equ dword[ebp-64]
76
.dey13q equ	[ebp-64]
77
.dz13  equ dword[ebp-68]
78
79
 
80
.dbx23 equ dword[ebp-76]
81
.dby23 equ dword[ebp-80]
82
.dby23q equ	[ebp-80]
83
.dex23 equ dword[ebp-84]
84
.dey23 equ dword[ebp-88]
85
.dey23q equ	[ebp-88]
86
.dz23  equ dword[ebp-92]
87
88
 
89
.cx2   equ dword[ebp-100]
90
;.cbx1q equ      [ebp-104]
91
.cbx1  equ dword[ebp-104]
92
.cby1  equ [ebp-108]
93
;.cbx2q          [ebp-112]
94
.cbx2  equ dword[ebp-112]
95
.cby2  equ [ebp-116]
96
;.cex1q equ      [ebp-120]
97
.cex1  equ dword[ebp-120]
98
.cey1  equ [ebp-124]
99
;.cex2q equ      [ebp-128]
100
.cex2  equ dword[ebp-128]
101
.cey2  equ [ebp-132]
102
103
 
104
.cz2   equ dword[ebp-140]
105
106
 
107
       emms
108
    else
109
       cld
110
    end if
111
       mov     ebp,esp
112
       push    edx esi	     ; store bump map
113
;       push    esi        ; store e. map
114
     ; sub     esp,120
115
 .sort3:		  ; sort triangle coordinates...
116
       cmp     ax,bx
117
       jle     .sort1
118
       xchg    eax,ebx
119
       mov     edx,dword[.b_x1]
120
       xchg    edx,dword[.b_x2]
121
       mov     dword[.b_x1],edx
122
       mov     edx,dword[.e_x1]
123
       xchg    edx,dword[.e_x2]
124
       mov     dword[.e_x1],edx
125
       mov     dx,.z1
126
       xchg    dx,.z2
127
       mov     .z1,dx
128
 .sort1:
129
       cmp	bx,cx
130
       jle	.sort2
131
       xchg	ebx,ecx
132
       mov	edx,dword[.b_x2]
133
       xchg	edx,dword[.b_x3]
134
       mov	dword[.b_x2],edx
135
       mov	edx,dword[.e_x2]
136
       xchg	edx,dword[.e_x3]
137
       mov	dword[.e_x2],edx
138
       mov     dx,.z2
139
       xchg    dx,.z3
140
       mov     .z2,dx
141
       jmp	.sort3
142
 .sort2:
143
       push	eax ebx ecx    ; store triangle coords in variables
144
;       push     ebx
145
;       push     ecx
146
147
 
148
	 and	  edx,ebx	 ; if *all* of them are negative a sign flag is raised
149
	 and	  edx,ecx
150
	 and	  edx,eax
151
	 test	  edx,80008000h  ; Check both X&Y at once
152
	 jne	  .loop23_done
153
    ;   mov     edx,eax         ; eax,ebx,ecx are ORd together into edx which means that
154
    ;   or      edx,ebx         ; if any *one* of them is negative a sign flag is raised
155
    ;   or      edx,ecx
156
    ;   test    edx,80000000h   ; Check only X
157
    ;   jne     .loop23_done
158
159
 
160
    ;   jg      .loop23_done
161
    ;   cmp     .x2,SIZE_X     ; This can be optimized with effort
162
    ;   jg      .loop23_done
163
    ;   cmp     .x3,SIZE_X
164
    ;   jg      .loop23_done    ; {
165
166
 
167
 
168
       sub	bx,.y1
169
       jnz	.bt_dx12_make
170
       mov	ecx,6
171
       xor	edx,edx
172
     @@:
173
       push	edx   ;dword 0
174
       loop	@b
175
       jmp	.bt_dx12_done
176
 .bt_dx12_make:
177
       mov	ax,.x2
178
       sub	ax,.x1
179
       cwde
180
       movsx	ebx,bx
181
       shl	eax,ROUND
182
       cdq
183
       idiv	ebx
184
;      mov      .dx12,eax
185
       push	 eax
186
187
 
188
189
 
190
       cvtsi2ss  xmm3,ebx	     ;rcps
191
    ;   mov       eax,255
192
       cvtsi2ss  xmm4,[i255d] ;eax
193
       divss	 xmm3,xmm4
194
       rcpss	 xmm3,xmm3
195
    ;   mulss     xmm3,xmm4
196
       shufps	 xmm3,xmm3,0
197
198
 
199
       movd	 mm1,[.b_x2]
200
       movd	 mm2,[.e_x1]
201
       movd	 mm3,[.e_x2]
202
     ;  psubsw    mm3,mm2
203
     ;  psubsw    mm1,mm0
204
       pxor	 mm4,mm4
205
       punpcklwd mm0,mm4
206
       punpcklwd mm1,mm4
207
       punpcklwd mm2,mm4
208
       punpcklwd mm3,mm4
209
   ;    pslld     mm0,ROUND
210
   ;    pslld     mm1,ROUND
211
   ;    pslld     mm2,ROUND
212
   ;    pslld     mm3,ROUND
213
       cvtpi2ps  xmm0,mm0
214
       movlhps	 xmm0,xmm0
215
       cvtpi2ps  xmm0,mm2
216
       cvtpi2ps  xmm1,mm1
217
       movlhps	 xmm1,xmm1
218
       cvtpi2ps  xmm1,mm3
219
       subps	 xmm1,xmm0
220
221
 
222
     ;  movq      mm5,mm1
223
     ;  movq      mm6,mm1
224
     ;  pcmpeqb   mm5,mm4
225
;       psubd     mm1,mm0
226
;       psubd     mm3,mm2
227
228
 
229
    ;   movq      mm1,[.e_x1]      ; ex1  ey1   ex2    ey2
230
    ;   pxor
231
    ;   punpcklhd mm0,mm1   ; lwd  ;
232
    ;   psubw     mm1,mm0   ; mm1, mm0
233
    ;   pxor      mm2,mm2
234
  ;     pmovmaskb eax,mm1
235
  ;     and       eax,10101010b
236
    ;   pcmpgtw   mm2,mm1
237
    ;   punpcklwd mm1,mm2
238
 ;      psllw     mm0,ROUND
239
 ;      psllw     mm1,ROUND
240
 ;      movq      mm2,mm0
241
 ;      psrlq     mm0,32
242
243
 
244
;       movlhps   xmm0,xmm0
245
;       cvtpi2ps  xmm0,mm3
246
  ;     divps     xmm1,xmm3
247
       mulps	 xmm1,xmm3
248
       shufps	 xmm1,xmm1,10110001b
249
       cvtps2pi  mm0,xmm1	   ; mm0 -> 2 delta dwords
250
       movhlps	 xmm1,xmm1
251
       cvtps2pi  mm1,xmm1
252
       movq	 .dey12q,mm0
253
       movq	 .dby12q,mm1
254
255
 
256
;       psrlq     mm0,32
257
;       movd      .dey12,mm0
258
;       movhlps   xmm1,xmm1
259
;       cvtps2pi  mm0,xmm1
260
;       movd      .dbx12,mm0
261
;       psrlq     mm0,32
262
;       movd      .dby12,mm0
263
264
 
265
       mov	ax,word[.b_x2]
266
       sub	ax,word[.b_x1]
267
       cwde
268
       shl	eax,ROUND
269
       cdq
270
       idiv	ebx
271
 ;     mov      .dbx12,eax
272
       push	 eax
273
274
 
275
       sub	ax,word[.b_y1]
276
       cwde
277
       shl	eax,ROUND
278
       cdq
279
       idiv	ebx
280
 ;     mov      .dby12,eax
281
       push	 eax
282
283
 
284
 ;     mov       ebx,.dby12
285
 ;     int3
286
287
 
288
       sub	ax,word[.e_x1]
289
       cwde
290
       shl	eax,ROUND
291
       cdq
292
       idiv	ebx
293
 ;      mov      .dex12,eax
294
       push	 eax
295
296
 
297
       sub	ax,word[.e_y1]
298
       cwde
299
       shl	eax,ROUND
300
       cdq
301
       idiv	ebx
302
 ;      mov      .dey12,eax
303
       push	 eax
304
305
 
306
	mov	ax,.z2
307
	sub	ax,.z1
308
	cwde
309
	shl	eax,CATMULL_SHIFT
310
	cdq
311
	idiv	ebx
312
	push	eax
313
   .bt_dx12_done:
314
315
 
316
       sub	bx,.y1
317
       jnz	.bt_dx13_make
318
       mov	ecx,6
319
       xor	edx,edx
320
     @@:
321
       push	edx   ;dword 0
322
       loop	@b
323
       jmp	.bt_dx13_done
324
 .bt_dx13_make:
325
       mov	ax,.x3
326
       sub	ax,.x1
327
       cwde
328
       movsx	ebx,bx
329
       shl	eax,ROUND
330
       cdq
331
       idiv	ebx
332
 ;      mov      .dx13,eax
333
       push	 eax
334
335
 
336
337
 
338
  ;     mov       eax,255
339
       cvtsi2ss  xmm4,[i255d]
340
       divss	 xmm3,xmm4
341
       rcpss	 xmm3,xmm3
342
;       mulss     xmm3,xmm4
343
       shufps	 xmm3,xmm3,0
344
       sub	 esp,16
345
346
 
347
       movd	 mm1,[.b_x3]
348
       movd	 mm2,[.e_x1]
349
       movd	 mm3,[.e_x3]
350
351
 
352
       punpcklwd mm0,mm4
353
       punpcklwd mm1,mm4
354
       punpcklwd mm2,mm4
355
       punpcklwd mm3,mm4
356
357
 
358
       movlhps	 xmm0,xmm0
359
       cvtpi2ps  xmm0,mm2
360
       cvtpi2ps  xmm1,mm1
361
       movlhps	 xmm1,xmm1
362
       cvtpi2ps  xmm1,mm3
363
       subps	 xmm1,xmm0
364
365
 
366
       mulps	 xmm1,xmm3
367
       shufps	 xmm1,xmm1,10110001b
368
       cvtps2pi  mm0,xmm1	   ; mm0 -> 2 delta dwords
369
       movhlps	 xmm1,xmm1
370
       cvtps2pi  mm1,xmm1
371
       movq	 .dey13q,mm0
372
       movq	 .dby13q,mm1
373
374
 
375
376
 
377
       sub	ax,word[.b_x1]
378
       cwde
379
       shl	eax,ROUND
380
       cdq
381
       idiv	ebx
382
 ;      mov      .dbx13,eax
383
       push	 eax
384
385
 
386
       sub	ax,word[.b_y1]
387
       cwde
388
       shl	eax,ROUND
389
       cdq
390
       idiv	ebx
391
 ;      mov      .dby13,eax
392
       push	 eax
393
394
 
395
       sub	ax,word[.e_x1]
396
       cwde
397
       shl	eax,ROUND
398
       cdq
399
       idiv	ebx
400
 ;      mov      .dex13,eax
401
       push	 eax
402
403
 
404
       sub	ax,word[.e_y1]
405
       cwde
406
       shl	eax,ROUND
407
       cdq
408
       idiv	ebx
409
 ;      mov      .dey13,eax
410
       push	 eax
411
412
 
413
414
 
415
       sub     ax,.z1
416
       cwde
417
       shl     eax,CATMULL_SHIFT
418
       cdq
419
       idiv    ebx
420
  ;    mov    .dz13,eax
421
       push    eax
422
   .bt_dx13_done:
423
424
 
425
       sub	bx,.y2
426
       jnz	.bt_dx23_make
427
       mov	ecx,6
428
       xor	edx,edx
429
     @@:
430
       push	edx   ;dword 0
431
       loop	@b
432
       jmp	.bt_dx23_done
433
 .bt_dx23_make:
434
       mov	ax,.x3
435
       sub	ax,.x2
436
       cwde
437
       movsx	ebx,bx
438
       shl	eax,ROUND
439
       cdq
440
       idiv	ebx
441
 ;      mov      .dx23,eax
442
       push	 eax
443
444
 
445
446
 
447
     ;  mov       eax,255
448
       cvtsi2ss  xmm4,[i255d] ;eax
449
       divss	 xmm3,xmm4
450
       shufps	 xmm3,xmm3,0
451
       sub	 esp,16
452
453
 
454
       movd	 mm1,[.b_x3]
455
       movd	 mm2,[.e_x2]
456
       movd	 mm3,[.e_x3]
457
458
 
459
       punpcklwd mm0,mm4
460
       punpcklwd mm1,mm4
461
       punpcklwd mm2,mm4
462
       punpcklwd mm3,mm4
463
464
 
465
       movlhps	 xmm0,xmm0
466
       cvtpi2ps  xmm0,mm2
467
       cvtpi2ps  xmm1,mm1
468
       movlhps	 xmm1,xmm1
469
       cvtpi2ps  xmm1,mm3
470
       subps	 xmm1,xmm0
471
472
 
473
       shufps	 xmm1,xmm1,10110001b
474
       cvtps2pi  mm0,xmm1	   ; mm0 -> 2 delta dwords
475
       movhlps	 xmm1,xmm1
476
       cvtps2pi  mm1,xmm1
477
       movq	 .dey23q,mm0
478
       movq	 .dby23q,mm1
479
480
 
481
482
 
483
       sub	ax,word[.b_x2]
484
       cwde
485
       shl	eax,ROUND
486
       cdq
487
       idiv	ebx
488
 ;      mov      .dbx23,eax
489
       push	 eax
490
491
 
492
       sub	ax,word[.b_y2]
493
       cwde
494
       shl	eax,ROUND
495
       cdq
496
       idiv	ebx
497
 ;      mov      .dby23,eax
498
       push	 eax
499
500
 
501
       sub	ax,word[.e_x2]
502
       cwde
503
       shl	eax,ROUND
504
       cdq
505
       idiv	ebx
506
 ;      mov      .dex23,eax
507
       push	 eax
508
509
 
510
       sub	ax,word[.e_y2]
511
       cwde
512
       shl	eax,ROUND
513
       cdq
514
       idiv	ebx
515
 ;      mov      .dey23,eax
516
       push	 eax
517
end if
518
       mov     ax,.z3
519
       sub     ax,.z2
520
       cwde
521
       shl     eax,CATMULL_SHIFT
522
       cdq
523
       idiv    ebx
524
      ; mov     .dz23,eax
525
       push    eax
526
      ;  sub     esp,40
527
   .bt_dx23_done:
528
       movsx	eax,.x1
529
       shl	eax,ROUND
530
     ;  mov      .cx1,eax
531
     ;  mov      .cx2,eax
532
       push	eax eax
533
     ; push     eax
534
535
 
536
       shl	eax,ROUND
537
       mov	.cbx1,eax
538
       mov	.cbx2,eax
539
     ;  push     eax eax
540
     ; push     eax
541
542
 
543
       shl	eax,ROUND
544
       mov	.cby1,eax
545
       mov	.cby2,eax
546
     ;  push     eax eax
547
     ; push     eax
548
549
 
550
       shl	eax,ROUND
551
       mov	.cex1,eax
552
       mov	.cex2,eax
553
      ; push     eax eax
554
      ;push     eax
555
556
 
557
       shl	eax,ROUND
558
       mov	.cey1,eax
559
       mov	.cey2,eax
560
       sub	esp,32
561
      ; push     eax eax
562
      ;push     eax
563
564
 
565
       shl	eax,CATMULL_SHIFT
566
      ; mov      .cz1,eax
567
      ; mov      .cz2,eax
568
      push     eax eax
569
      ;push     eax
570
571
 
572
       cmp	cx,.y2
573
       jge	.loop12_done
574
  .loop12:
575
       call	.call_line
576
577
 
578
       add	.cx1,eax
579
       mov	ebx,.dx12
580
       add	.cx2,ebx
581
582
 
583
       movq	mm0,.cby2	; with this optimization object
584
       movq	mm1,.cby1	; looks bit annoying
585
       movq	mm2,.cey2
586
       movq	mm3,.cey1
587
       paddd	mm0,.dby12q
588
       paddd	mm1,.dby13q
589
       paddd	mm2,.dey12q
590
       paddd	mm3,.dey13q
591
       movq	.cby2,mm0
592
       movq	.cby1,mm1
593
       movq	.cey1,mm3
594
       movq	.cey2,mm2
595
else
596
       mov	edx,.dbx13
597
       add	.cbx1,edx
598
       mov	eax,.dbx12
599
       add	.cbx2,eax
600
       mov	ebx,.dby13
601
       add	.cby1,ebx
602
       mov	edx,.dby12
603
       add	.cby2,edx
604
605
 
606
       add	.cex1,eax
607
       mov	ebx,.dex12
608
       add	.cex2,ebx
609
       mov	edx,.dey13
610
       add	.cey1,edx
611
       mov	eax,.dey12
612
       add	.cey2,eax
613
614
 
615
       mov	ebx,.dz13
616
       add	.cz1,ebx
617
       mov	edx,.dz12
618
       add	.cz2,edx
619
620
 
621
       cmp	cx,.y2
622
       jl	.loop12
623
    .loop12_done:
624
625
 
626
       cmp	cx,.y3
627
       jge	.loop23_done
628
629
 
630
       shl	eax,CATMULL_SHIFT
631
       mov	.cz2,eax
632
633
 
634
       shl	eax,ROUND
635
       mov	.cx2,eax
636
637
 
638
       shl	eax,ROUND
639
       mov	.cbx2,eax
640
641
 
642
       shl	eax,ROUND
643
       mov	.cby2,eax
644
645
 
646
       shl	eax,ROUND
647
       mov	.cex2,eax
648
649
 
650
       shl	eax,ROUND
651
       mov	.cey2,eax
652
653
 
654
       call	.call_line
655
;if Ext = NON
656
       mov	eax,.dx13
657
       add	.cx1,eax
658
       mov	ebx,.dx23
659
       add	.cx2,ebx
660
661
 
662
       movq	mm0,.cby2	 ;    with this mmx optimization object looks bit
663
       movq	mm1,.cby1	 ;    annoying
664
       movq	mm2,.cey2
665
       movq	mm3,.cey1
666
       paddd	mm0,.dby23q
667
       paddd	mm1,.dby13q
668
       paddd	mm2,.dey23q
669
       paddd	mm3,.dey13q
670
       movq	.cby2,mm0
671
       movq	.cby1,mm1
672
       movq	.cey2,mm2
673
       movq	.cey1,mm3
674
675
 
676
       mov	edx,.dbx13
677
       add	.cbx1,edx
678
       mov	eax,.dbx23
679
       add	.cbx2,eax
680
       mov	ebx,.dby13
681
       add	.cby1,ebx
682
       mov	edx,.dby23
683
       add	.cby2,edx
684
685
 
686
       add	.cex1,eax
687
       mov	ebx,.dex23
688
       add	.cex2,ebx
689
       mov	edx,.dey13
690
       add	.cey1,edx
691
       mov	eax,.dey23
692
       add	.cey2,eax
693
end if
694
695
 
696
       add	.cz1,ebx
697
       mov	edx,.dz23
698
       add	.cz2,edx
699
;else
700
;       movq     mm0,.db13q
701
;       movq     mm1,.cbx1q
702
703
 
704
       cmp	cx,.y3
705
       jl	.loop23
706
    .loop23_done:
707
708
 
709
ret   34
710
711
 
712
713
 
714
715
 
716
       push	.cz2
717
       push	.z_buff
718
       push	.t_bmap
1931 yogev_ezra 719
       push	.t_emap
1245 hidnplayr 720
       push	dword .cey2
721
       push	.cex2
722
       push	dword .cey1
723
       push	.cex1
724
       push	dword .cby2
725
       push	.cbx2
726
       push	dword .cby1
727
       push	.cbx1
728
       push	ecx
729
730
 
731
       sar	eax,ROUND
732
       mov	ebx,.cx2
733
       sar	ebx,ROUND
734
735
 
736
737
 
738
ret
739
two_tex_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]   ;   ---
1931 yogev_ezra 746
.by1	equ  [ebp+12]  ;       |
747
.bx2	equ  [ebp+16]  ;       |
748
.by2	equ  [ebp+20]  ;       |>   b. texture and e. texture coords
749
.ex1	equ  [ebp+24]  ;       |>   shifted shl ROUND
750
.ey1	equ  [ebp+28]  ;       |
751
.ex2	equ  [ebp+32]  ;       |
752
.ey2	equ  [ebp+36]  ;   ---
753
.emap	equ  [ebp+40]  ; b texture offset
754
.bmap	equ  [ebp+44]  ; e texture offset
755
.z_buff equ dword [ebp+48]
1245 hidnplayr 756
.z2	equ dword [ebp+52]  ;   -- |>   z coords shifted
757
.z1	equ dword [ebp+56]  ;   --       shl  CATMULL_SHIFT
758
759
 
760
.x2	equ dword [ebp-8]
761
.dbx	equ [ebp-12]
1931 yogev_ezra 762
.dex	equ [ebp-16]
763
.dby	equ [ebp-20]
764
.dey	equ [ebp-24]
765
.dz	equ dword [ebp-28]
1245 hidnplayr 766
.cbx	equ [ebp-32]
1931 yogev_ezra 767
.cex	equ [ebp-36]
768
.cby	equ [ebp-40]
769
.cey	equ [ebp-44]
770
.cz	equ dword [ebp-48]
1245 hidnplayr 771
.czbuff equ dword [ebp-52]
772
773
 
774
775
 
776
	or	ecx,ecx
777
	jl	.bl_end
778
	cmp	ecx,SIZE_Y
779
	jge	.bl_end
780
781
 
782
	jl	@f
783
	je	.bl_end
784
785
 
786
if Ext=NON
787
	mov	edx,.bx1
788
	xchg	edx,.bx2
789
	mov	.bx1,edx
790
	mov	edx,.by1
791
	xchg	edx,.by2
792
	mov	.by1,edx
793
794
 
795
	xchg	edx,.ex2
796
	mov	.ex1,edx
797
	mov	edx,.ey1
798
	xchg	edx,.ey2
799
	mov	.ey1,edx
800
else
801
	movq	mm0,.bx1
1931 yogev_ezra 802
	movq	mm1,.ex1
803
	movq	mm2,.bx2
804
	movq	mm3,.ex2
805
	movq	.bx2,mm0
806
	movq	.ex2,mm1
807
	movq	.bx1,mm2
808
	movq	.ex1,mm3
809
end if
1245 hidnplayr 810
	mov	edx,.z1
811
	xchg	edx,.z2
812
	mov	.z1,edx
813
    @@:
814
	push	eax ebx
815
;        push    ebx           ;store x1, x2
816
817
 
818
	jge	.bl_end
819
	cmp	.x2,0
820
	jle	.bl_end
821
822
 
823
	sub	ebx,.x1
824
825
 
1931 yogev_ezra 826
1245 hidnplayr 827
 
828
       cvtsi2ss  xmm3,ebx	     ;rcps
829
       shufps	 xmm3,xmm3,0
830
831
 
832
  ;     movq      mm1,.bx2q
833
  ;     movq      mm2,.ex1q
834
  ;     movq      mm3,.ex2q
835
  ;     psubd     mm1,mm0
836
  ;     psubd     mm3,mm2
837
  ;     cvtpi2ps  xmm1,mm1
838
  ;     movlhps   xmm1,xmm1
839
  ;     cvtpi2ps  xmm1,mm3
840
841
 
1931 yogev_ezra 842
       movlhps	 xmm0,xmm0
1245 hidnplayr 843
       cvtpi2ps  xmm0,.ex1 ;mm2     ; ex1; ey1
1931 yogev_ezra 844
       cvtpi2ps  xmm1,.bx2 ;mm1     ; bx2; by2
845
       movlhps	 xmm1,xmm1
1245 hidnplayr 846
       cvtpi2ps  xmm1,.ex2 ;mm3     ; ex2; ey2
1931 yogev_ezra 847
       subps	 xmm1,xmm0
1245 hidnplayr 848
				    ; hi             lo
1931 yogev_ezra 849
       divps	 xmm1,xmm3 ; xmm1 -> dby; dbx; dey; dex
850
1245 hidnplayr 851
 
1931 yogev_ezra 852
       cvtps2pi  mm0,xmm1	   ; mm0 -> 2 delta dwords
1245 hidnplayr 853
       movhlps	 xmm1,xmm1
854
       cvtps2pi  mm1,xmm1
855
       movq	 .dex,mm0 ; hi - lo  ->  dbx, dex
1931 yogev_ezra 856
       movq	 .dey,mm1 ; hi - lo  ->  dby, dey
857
1245 hidnplayr 858
 
859
860
 
861
	sub	eax,.bx1
862
	cdq
863
	idiv	ebx
864
	push	eax
865
866
 
1931 yogev_ezra 867
	sub	eax,.ex1
868
	cdq
1245 hidnplayr 869
	idiv	ebx
870
	push	eax
871
872
 
1931 yogev_ezra 873
	sub	eax,.by1
874
	cdq
1245 hidnplayr 875
	idiv	ebx
876
	push	eax
877
878
 
879
	sub	eax,.ey1
880
	cdq
881
	idiv	ebx
882
	push	eax
883
884
 
885
886
 
887
	sub	eax,.z1
888
	cdq
889
	idiv	ebx
890
	push	eax
891
892
 
893
	jge	@f	      ; CLIPPING ON FUNCTION
894
			      ; cutting triangle exceedes screen
895
	mov	ebx,.x1
896
	neg	ebx
897
	imul	ebx	      ; eax = .dz * abs(.x1)
898
	add	.z1,eax
899
	mov	.x1,0
900
901
 
902
	imul	ebx
903
	add    .bx1,eax
904
905
 
906
	imul	ebx
907
	add	.by1,eax
908
909
 
910
	imul	ebx
911
	add	.ex1,eax
912
913
 
914
	imul	ebx
915
	add	.ey1,eax
916
      @@:
917
	cmp	.x2,SIZE_X
918
	jl	@f
919
	mov	.x2,SIZE_X
920
      @@:
921
	mov	eax,SIZE_X	 ;calc memory begin in buffers
922
	mov	ebx,.y
923
	mul	ebx
924
	mov	ebx,.x1
925
	add	eax,ebx
926
	mov	ebx,eax
927
	lea	eax,[eax*3]
928
	add	edi,eax 	  ; edi - screen
929
	mov	esi,.z_buff	  ; z-buffer filled with dd variables
930
	shl	ebx,2
931
	add	esi,ebx 	  ; esi - Z buffer
932
933
 
934
	sub	ecx,.x1
935
	; init current variables
936
	push	dword .bx1 ;.by1 .ex1 .ey1 .z1 esi
1931 yogev_ezra 937
	push	dword .ex1
938
	push	dword .by1
939
	push	dword .ey1
940
1245 hidnplayr 941
 
1931 yogev_ezra 942
	push	esi
943
1245 hidnplayr 944
 
945
     pxor   mm0,mm0
946
     movq   mm3,.cex   ; hi - lo -> cbx; cex
1931 yogev_ezra 947
     movq   mm4,.cey   ; hi - lo -> cby; cey
948
;     movq   mm5,mm3
1245 hidnplayr 949
;     movq   mm6,mm4
950
;     psrad  mm5,ROUND
951
;     psrad  mm6,ROUND
952
;     movq   .ceyq,mm5
953
;     movq   .cbyq,mm6
954
     mov    edx,.czbuff
955
else
956
     cld
957
end if
958
     .draw:
959
    ; if TEX = SHIFTING   ;bump drawing only in shifting mode
960
if Ext=NON
961
	mov	esi,.czbuff	 ; .czbuff current address in buffer
962
	mov	ebx,.cz 	 ; .cz - cur z position
963
	cmp	ebx,dword[esi]
964
else
965
	mov	ebx,.cz
966
	cmp	ebx,dword[edx]
967
end if
968
	jge	.skip
969
970
 
1931 yogev_ezra 971
	mov	eax,.cby
1245 hidnplayr 972
	mov	esi,.cbx
973
	sar	eax,ROUND
974
	sar	esi,ROUND
975
	shl	eax,TEX_SHIFT	;-
976
	add	esi,eax
977
	lea	esi,[esi*3]	    ;-  ; esi - current b. texture addres
978
	add	esi,.bmap
979
980
 
981
	mov	eax,.cey       ;.cey - current  env map y
982
	sar	ebx,ROUND
983
	sar	eax,ROUND
984
1931 yogev_ezra 985
 
1245 hidnplayr 986
	add	ebx,eax
987
	lea	ebx,[ebx*3]
988
	add	ebx,.emap
989
1931 yogev_ezra 990
 
991
 
992
	movq	mm5,mm4 ;.cey
1979 yogev_ezra 993
	psrad	mm5,ROUND
1931 yogev_ezra 994
	pslld	mm5,TEX_SHIFT
995
	movq	mm6,mm3 ;.cex
1979 yogev_ezra 996
	psrad	mm6,ROUND
1931 yogev_ezra 997
	paddd	mm5,mm6
998
	movq	mm6,mm5
999
	paddd	mm5,mm5
1000
	paddd	mm5,mm6
1001
	paddd	mm5,.emap
1002
	movd	esi,mm5
1003
	psrlq	mm5,32
1004
	movd	ebx,mm5
1005
end if
1006
if Ext>=MMX
1245 hidnplayr 1007
	movd	  mm1,[esi]
1008
	movd	  mm2,[ebx]
1009
	punpcklbw mm1,mm0
1010
	punpcklbw mm2,mm0
1011
	pmullw	  mm1,mm2
1012
	psrlw	  mm1,8
1013
	packuswb  mm1,mm0
1014
	movd	  [edi],mm1
1015
	mov	  ebx,.cz
1016
	mov	  dword[edx],ebx
1017
else
1018
	cld			; esi - tex e.
1019
	lodsb			; ebx - tex b.
1020
	mov	dl,[ebx]
1021
	mul	dl
1022
	shr	ax,8
1023
	stosb
1024
	inc	ebx
1025
	lodsb
1026
	mov	dl,[ebx]
1027
	mul	dl
1028
	shr	ax,8
1029
	stosb
1030
	inc	ebx
1031
	lodsb
1032
	mov	dl,[ebx]
1033
	mul	dl
1034
	shr	ax,8
1035
	stosb
1036
	mov	ebx,.cz
1037
	mov	esi,.czbuff
1038
	mov	dword[esi],ebx
1039
	jmp	.no_skip
1040
end if
1041
     .skip:
1042
	add	edi,3
1043
1044
 
1045
     .no_skip:
1046
	add	.czbuff,4
1047
	mov	eax,.dbx
1048
	add	.cbx,eax
1049
	mov	eax,.dby
1050
	add	.cby,eax
1051
	mov	eax,.dex
1052
	add	.cex,eax
1053
	mov	eax,.dey
1054
	add	.cey,eax
1055
    else
1056
	add	edx,4
1057
	paddd	mm3,.dex
1931 yogev_ezra 1058
	paddd	mm4,.dey
1059
  ;      movq    mm5,mm3
1245 hidnplayr 1060
  ;      movq    mm6,mm4
1061
  ;      psrad   mm5,ROUND
1062
  ;      psrad   mm6,ROUND
1063
     ;   movq    .cex,mm3
1979 yogev_ezra 1064
     ;   movq    .cey,mm4
1065
    end if
1245 hidnplayr 1066
	mov	eax,.dz
1067
	add	.cz,eax
1068
    if Ext = NON
1069
	dec	ecx
1070
	jnz	.draw
1071
    else
1072
	loop	.draw
1073
    end if
1074
1075
 
1076
	mov	esp,ebp
1077
ret 56
1078