Subversion Repositories Kolibri OS

Rev

Go to most recent revision | Details | 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_emap
719
       push	.t_bmap
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
.bx1q	equ	  [ebp+8]
746
.bx1	equ dword [ebp+8]   ;   ---
747
.by1	equ dword [ebp+12]  ;       |
748
.bx2q	equ	  [ebp+16]
749
.bx2	equ dword [ebp+16]  ;       |
750
.by2	equ dword [ebp+20]  ;       |>   b. texture and e. texture coords
751
.ex1q	equ	  [ebp+24]
752
.ex1	equ dword [ebp+24]  ;       |>   shifted shl ROUND
753
.ey1	equ dword [ebp+28]  ;       |
754
.ex2q	equ	  [ebp+32]
755
.ex2	equ dword [ebp+32]  ;       |
756
.ey2	equ dword [ebp+36]  ;   ---
757
.bmap	equ dword [ebp+40]  ; b texture offset
758
.emap	equ dword [ebp+44]  ; e texture offset
759
.z_buff equ dword [ebp+48]
760
.z2	equ dword [ebp+52]  ;   -- |>   z coords shifted
761
.z1	equ dword [ebp+56]  ;   --       shl  CATMULL_SHIFT
762
763
 
764
.x2	equ dword [ebp-8]
765
.dbx	equ dword [ebp-12]
766
.dby	equ dword [ebp-16]
767
.dbyq	equ qword [ebp-16]  ; - new
768
.dex	equ dword [ebp-20]
769
.dey	equ dword [ebp-24]
770
.deyq	equ qword [ebp-24]  ; - new
771
.dz	equ dword [ebp-28]
772
.cbx	equ dword [ebp-32]
773
.cby	equ dword [ebp-36]
774
.cbyq	equ qword [ebp-36]  ; - new
775
.cex	equ dword [ebp-40]
776
.cey	equ dword [ebp-44]
777
.ceyq	equ qword [ebp-44]  ; - new
778
.cz	equ dword [ebp-48]
779
.czbuff equ dword [ebp-52]
780
781
 
782
783
 
784
	or	ecx,ecx
785
	jl	.bl_end
786
	cmp	ecx,SIZE_Y
787
	jge	.bl_end
788
789
 
790
	jl	@f
791
	je	.bl_end
792
793
 
794
if Ext=NON
795
	mov	edx,.bx1
796
	xchg	edx,.bx2
797
	mov	.bx1,edx
798
	mov	edx,.by1
799
	xchg	edx,.by2
800
	mov	.by1,edx
801
802
 
803
	xchg	edx,.ex2
804
	mov	.ex1,edx
805
	mov	edx,.ey1
806
	xchg	edx,.ey2
807
	mov	.ey1,edx
808
else
809
	movq	mm0,.bx1q
810
	movq	mm1,.ex1q
811
	movq	mm2,.bx2q
812
	movq	mm3,.ex2q
813
	movq	.bx2q,mm0
814
	movq	.ex2q,mm1
815
	movq	.bx1q,mm2
816
	movq	.ex1q,mm3
817
end if
818
	mov	edx,.z1
819
	xchg	edx,.z2
820
	mov	.z1,edx
821
    @@:
822
	push	eax ebx
823
;        push    ebx           ;store x1, x2
824
825
 
826
	jge	.bl_end
827
	cmp	.x2,0
828
	jle	.bl_end
829
830
 
831
	sub	ebx,.x1
832
833
 
834
835
 
836
       cvtsi2ss  xmm3,ebx	     ;rcps
837
       shufps	 xmm3,xmm3,0
838
839
 
840
  ;     movq      mm1,.bx2q
841
  ;     movq      mm2,.ex1q
842
  ;     movq      mm3,.ex2q
843
  ;     psubd     mm1,mm0
844
  ;     psubd     mm3,mm2
845
  ;     cvtpi2ps  xmm1,mm1
846
  ;     movlhps   xmm1,xmm1
847
  ;     cvtpi2ps  xmm1,mm3
848
849
 
850
       movlhps	 xmm0,xmm0
851
       cvtpi2ps  xmm0,.ex1q ;mm2
852
       cvtpi2ps  xmm1,.bx2q ;mm1
853
       movlhps	 xmm1,xmm1
854
       cvtpi2ps  xmm1,.ex2q ;mm3
855
       subps	 xmm1,xmm0
856
857
 
858
859
 
860
       cvtps2pi  mm0,xmm1	   ; mm0 -> 2 delta dwords
861
       movhlps	 xmm1,xmm1
862
       cvtps2pi  mm1,xmm1
863
       movq	 .deyq,mm0
864
       movq	 .dbyq,mm1
865
866
 
867
868
 
869
	sub	eax,.bx1
870
	cdq
871
	idiv	ebx
872
	push	eax
873
874
 
875
	sub	eax,.by1
876
	cdq
877
	idiv	ebx
878
	push	eax
879
880
 
881
	sub	eax,.ex1
882
	cdq
883
	idiv	ebx
884
	push	eax
885
886
 
887
	sub	eax,.ey1
888
	cdq
889
	idiv	ebx
890
	push	eax
891
892
 
893
894
 
895
	sub	eax,.z1
896
	cdq
897
	idiv	ebx
898
	push	eax
899
900
 
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
908
909
 
910
	imul	ebx
911
	add    .bx1,eax
912
913
 
914
	imul	ebx
915
	add	.by1,eax
916
917
 
918
	imul	ebx
919
	add	.ex1,eax
920
921
 
922
	imul	ebx
923
	add	.ey1,eax
924
      @@:
925
	cmp	.x2,SIZE_X
926
	jl	@f
927
	mov	.x2,SIZE_X
928
      @@:
929
	mov	eax,SIZE_X	 ;calc memory begin in buffers
930
	mov	ebx,.y
931
	mul	ebx
932
	mov	ebx,.x1
933
	add	eax,ebx
934
	mov	ebx,eax
935
	lea	eax,[eax*3]
936
	add	edi,eax 	  ; edi - screen
937
	mov	esi,.z_buff	  ; z-buffer filled with dd variables
938
	shl	ebx,2
939
	add	esi,ebx 	  ; esi - Z buffer
940
941
 
942
	sub	ecx,.x1
943
	; init current variables
944
	push	.bx1 .by1 .ex1 .ey1 .z1 esi
945
;        push    .by1
946
;        push    .ex1
947
;        push    .ey1
948
949
 
950
;        push    esi
951
952
 
953
     pxor   mm0,mm0
954
     movq   mm3,.ceyq
955
     movq   mm4,.cbyq
956
;     movq   mm5,mm3
957
;     movq   mm6,mm4
958
;     psrad  mm5,ROUND
959
;     psrad  mm6,ROUND
960
;     movq   .ceyq,mm5
961
;     movq   .cbyq,mm6
962
     mov    edx,.czbuff
963
else
964
     cld
965
end if
966
     .draw:
967
    ; if TEX = SHIFTING   ;bump drawing only in shifting mode
968
if Ext=NON
969
	mov	esi,.czbuff	 ; .czbuff current address in buffer
970
	mov	ebx,.cz 	 ; .cz - cur z position
971
	cmp	ebx,dword[esi]
972
else
973
	mov	ebx,.cz
974
	cmp	ebx,dword[edx]
975
end if
976
	jge	.skip
977
978
 
979
	mov	eax,.cby
980
	mov	esi,.cbx
981
	sar	eax,ROUND
982
	sar	esi,ROUND
983
;else
984
;        movd    eax,mm6
985
;        psrlq   mm6,32
986
;        movd    esi,mm6
987
;end if
988
	shl	eax,TEX_SHIFT	;-
989
	add	esi,eax
990
	lea	esi,[esi*3]	    ;-  ; esi - current b. texture addres
991
	add	esi,.bmap
992
993
 
994
	mov	ebx,.cex       ;.cex - current env map X
995
	mov	eax,.cey       ;.cey - current  env map y
996
	sar	ebx,ROUND
997
	sar	eax,ROUND
998
;else
999
;        movd    eax,mm5
1000
;        psrlq   mm5,32
1001
;        movd    ebx,mm5
1002
;end if
1003
	shl	eax,TEX_SHIFT
1004
	add	ebx,eax
1005
	lea	ebx,[ebx*3]
1006
	add	ebx,.emap
1007
if Ext>=MMX
1008
	movd	  mm1,[esi]
1009
	movd	  mm2,[ebx]
1010
	punpcklbw mm1,mm0
1011
	punpcklbw mm2,mm0
1012
	pmullw	  mm1,mm2
1013
	psrlw	  mm1,8
1014
	packuswb  mm1,mm0
1015
	movd	  [edi],mm1
1016
	mov	  ebx,.cz
1017
	mov	  dword[edx],ebx
1018
else
1019
	cld			; esi - tex e.
1020
	lodsb			; ebx - tex b.
1021
	mov	dl,[ebx]
1022
	mul	dl
1023
	shr	ax,8
1024
	stosb
1025
	inc	ebx
1026
	lodsb
1027
	mov	dl,[ebx]
1028
	mul	dl
1029
	shr	ax,8
1030
	stosb
1031
	inc	ebx
1032
	lodsb
1033
	mov	dl,[ebx]
1034
	mul	dl
1035
	shr	ax,8
1036
	stosb
1037
	mov	ebx,.cz
1038
	mov	esi,.czbuff
1039
	mov	dword[esi],ebx
1040
	jmp	.no_skip
1041
end if
1042
     .skip:
1043
	add	edi,3
1044
1045
 
1046
     .no_skip:
1047
	add	.czbuff,4
1048
	mov	eax,.dbx
1049
	add	.cbx,eax
1050
	mov	eax,.dby
1051
	add	.cby,eax
1052
	mov	eax,.dex
1053
	add	.cex,eax
1054
	mov	eax,.dey
1055
	add	.cey,eax
1056
    else
1057
	add	edx,4
1058
	paddd	mm3,.deyq
1059
	paddd	mm4,.dbyq
1060
  ;      movq    mm5,mm3
1061
  ;      movq    mm6,mm4
1062
  ;      psrad   mm5,ROUND
1063
  ;      psrad   mm6,ROUND
1064
	movq	.ceyq,mm3
1065
	movq	.cbyq,mm4
1066
    end if
1067
	mov	eax,.dz
1068
	add	.cz,eax
1069
    if Ext = NON
1070
	dec	ecx
1071
	jnz	.draw
1072
    else
1073
	loop	.draw
1074
    end if
1075
1076
 
1077
	mov	esp,ebp
1078
ret 56
1079