Subversion Repositories Kolibri OS

Rev

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

Rev Author Line No. Line
1245 hidnplayr 1
 
2
;TEXTURE_SIZE EQU (TEX_X * TEX_Y)-1
3
;ROUND equ 8
4
;Ext = NON
5
;MMX = 1
6
;NON = 0
7
;------- Big thanks to Majuma (www.majuma.xt.pl) for absolutely great---
8
;------- DOS 13h mode demos --------------------------------------------
9
;------- Procedure draws bump triangle with texture, I use -------------
10
;--------Catmull Z-buffer algorithm- (Z coordinate interpolation)-------
11
;--------I calc texture pixel by this way: col1*col2/256 ---------------
12
bump_tex_triangle_z:
13
;------------------in - eax - x1 shl 16 + y1 -----------
14
;---------------------- ebx - x2 shl 16 + y2 -----------
15
;---------------------- ecx - x3 shl 16 + y3 -----------
16
;---------------------- edx - pointer to bump map-------
17
;---------------------- esi - pointer to env map--------
18
;---------------------- edi - pointer to screen buffer--
19
;---------------------- stack : bump coordinates--------
20
;----------------------         environment coordinates-
21
;----------------------         Z position coordinates--
22
;----------------------         pointer to Z buffer-----
23
;----------------------         pointer to texture------
24
;----------------------         texture coordinates-----
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	 ; b - bump map coords
31
.b_x3	equ ebp+12	 ; e - env map coords
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
.tex_ptr equ dword[ebp+38]	; ptr to texture
44
.t_x1	equ ebp+42		; texture coords
45
.t_y1	equ ebp+44
46
.t_x2	equ ebp+46
47
.t_y2	equ ebp+48
48
.t_x3	equ ebp+50
49
.t_y3	equ ebp+52
50
51
 
52
 
53
 
54
.t_emap equ dword[ebp-8]	; pointer to env map
55
.x1	equ word[ebp-10]
56
.y1	equ word[ebp-12]
57
.x2	equ word[ebp-14]
58
.y2	equ word[ebp-16]
59
.x3	equ word[ebp-18]
60
.y3	equ word[ebp-20]
61
62
 
63
.dz12	equ	 [ebp-28]
64
.dbx12	equ dword[ebp-32]
65
.dby12	equ	 [ebp-36]
66
.dex12	equ dword[ebp-40]
67
.dey12	equ	 [ebp-44]
68
.dtx12	equ dword[ebp-48]
69
.dty12	equ	 [ebp-52]
70
71
 
72
.dz13  equ	[ebp-52-4*2]
73
.dbx13 equ dword[ebp-52-4*3]
74
.dby13 equ	[ebp-52-4*4]
75
.dex13 equ dword[ebp-52-4*5]
76
.dey13 equ	[ebp-52-4*6]
77
.dtx13 equ dword[ebp-52-4*7]
78
.dty13 equ	[ebp-52-4*8]
79
80
 
81
 
82
.dz23  equ	[ebp-(52+4*10)]
83
.dbx23 equ dword[ebp-(52+4*11)]
84
.dby23 equ	[ebp-(52+4*12)]
85
.dex23 equ dword[ebp-(52+4*13)]
86
.dey23 equ	[ebp-(52+4*14)]
87
.dtx23 equ dword[ebp-(52+4*15)]
88
.dty23 equ	[ebp-(52+4*16)]
89
90
 
1819 yogev_ezra 91
92
 
1245 hidnplayr 93
.cz1   equ	[ebp-(52+4*18)]
94
.cx2   equ dword[ebp-(52+4*19)]
95
.cz2   equ	[ebp-(52+4*20)]
96
.cbx1  equ dword[ebp-(52+4*21)]
97
.cby1  equ	[ebp-(52+4*22)]
98
.cbx2  equ dword[ebp-(52+4*23)]
99
.cby2  equ	[ebp-(52+4*24)]
100
.cex1  equ dword[ebp-(52+4*25)]
101
.cey1  equ	[ebp-(52+4*26)]
102
.cex2  equ dword[ebp-(52+4*27)]
103
.cey2  equ	[ebp-(52+4*28)]
104
105
 
106
.cty1  equ	[ebp-(52+4*30)]
107
.ctx2  equ dword[ebp-(52+4*31)]
108
.cty2  equ	[ebp-(52+4*32)]
109
110
 
1819 yogev_ezra 111
112
 
113
.cz1   equ	[ebp-(52+4*18)]
114
.cbx1  equ dword[ebp-(52+4*19)]
115
.cby1  equ	[ebp-(52+4*20)]
116
.cex1  equ dword[ebp-(52+4*21)]
117
.cey1  equ	[ebp-(52+4*22)]
118
.ctx1  equ dword[ebp-(52+4*23)]
119
.cty1  equ	[ebp-(52+4*24)]
120
121
 
122
.cz2   equ	[ebp-(52+4*26)]
123
.cbx2  equ dword[ebp-(52+4*27)]
124
.cby2  equ	[ebp-(52+4*28)]
125
.cex2  equ dword[ebp-(52+4*29)]
126
.cey2  equ	[ebp-(52+4*30)]
127
.ctx2  equ dword[ebp-(52+4*31)]
128
.cty2  equ	[ebp-(52+4*32)]
129
130
 
131
       cld
1245 hidnplayr 132
       mov     ebp,esp
133
       push    edx	  ; store bump map
134
       push    esi	  ; store e. map
135
     ; sub     esp,120
136
 .sort3:		  ; sort triangle coordinates...
137
       cmp     ax,bx
138
       jle     .sort1
139
       xchg    eax,ebx
140
       mov     edx,dword[.b_x1]
141
       xchg    edx,dword[.b_x2]
142
       mov     dword[.b_x1],edx
143
       mov     edx,dword[.e_x1]
144
       xchg    edx,dword[.e_x2]
145
       mov     dword[.e_x1],edx
146
       mov     edx,dword[.t_x1]
147
       xchg    edx,dword[.t_x2]
148
       mov     dword[.t_x1],edx
149
       mov     dx,.z1
150
       xchg    dx,.z2
151
       mov     .z1,dx
152
 .sort1:
153
       cmp	bx,cx
154
       jle	.sort2
155
       xchg	ebx,ecx
156
       mov	edx,dword[.b_x2]
157
       xchg	edx,dword[.b_x3]
158
       mov	dword[.b_x2],edx
159
       mov	edx,dword[.e_x2]
160
       xchg	edx,dword[.e_x3]
161
       mov	dword[.e_x2],edx
162
       mov	edx,dword[.t_x2]
163
       xchg	edx,dword[.t_x3]
164
       mov	dword[.t_x2],edx
165
       mov     dx,.z2
166
       xchg    dx,.z3
167
       mov     .z2,dx
168
       jmp	.sort3
169
 .sort2:
170
       push	eax	; store triangle coords in variables
171
       push	ebx
172
       push	ecx
173
	 mov	  edx,80008000h  ; eax,ebx,ecx are ANDd together into edx which means that
174
	 and	  edx,ebx	 ; if *all* of them are negative a sign flag is raised
175
	 and	  edx,ecx
176
	 and	  edx,eax
177
	 test	  edx,80008000h  ; Check both X&Y at once
178
	 jne	  .loop23_done
179
    ;   mov     edx,eax         ; eax,ebx,ecx are ORd together into edx which means that
180
    ;   or      edx,ebx         ; if any *one* of them is negative a sign flag is raised
181
    ;   or      edx,ecx
182
    ;   test    edx,80000000h   ; Check only X
183
    ;   jne     .loop23_done
184
185
 
186
    ;   jg      .loop23_done
187
    ;   cmp     .x2,SIZE_X     ; This can be optimized with effort
188
    ;   jg      .loop23_done
189
    ;   cmp     .x3,SIZE_X
190
    ;   jg      .loop23_done    ; {
191
192
 
193
 
194
       sub	bx,.y1
195
       jnz	.bt_dx12_make
196
       mov	ecx,8
197
       xor	edx,edx
198
     @@:
199
       push	edx   ;dword 0
200
       loop	@b
201
       jmp	.bt_dx12_done
202
 .bt_dx12_make:
203
       movsx	ebx,bx
1776 yogev_ezra 204
1245 hidnplayr 205
 
206
 
207
       sub	 esp,32
1819 yogev_ezra 208
   ;    mov       eax,256
1245 hidnplayr 209
       cvtsi2ss  xmm4,[i255d]
210
       cvtsi2ss  xmm3,ebx	     ;rcps
211
       divss	 xmm3,xmm4
212
       shufps	 xmm3,xmm3,0
213
214
 
215
       movd	 mm1,[.b_x2]
216
       movd	 mm2,[.e_x1]
217
       movd	 mm3,[.e_x2]
218
219
 
220
       punpcklwd  mm0,mm4
221
       punpcklwd  mm1,mm4
222
       punpcklwd  mm2,mm4
223
       punpcklwd  mm3,mm4
224
225
 
226
       psubd	  mm3,mm2
227
228
 
229
       movlhps	 xmm1,xmm1
230
       cvtpi2ps  xmm1,mm3
231
232
 
233
234
 
235
			     ;xmm1--> | dbx | dby | dex | dey |
236
;1       movups    .dey12,xmm1
1819 yogev_ezra 237
       cvtps2pi  mm0,xmm1 ;mm0,xmm1          ; mm0 -> 2 delta dwords
1776 yogev_ezra 238
       movhlps	 xmm1,xmm1
1245 hidnplayr 239
       cvtps2pi  mm1,xmm1 ;mm1,xmm1
1776 yogev_ezra 240
       movq	 .dey12,mm0
1245 hidnplayr 241
       movq	 .dby12,mm1
242
;-------------
243
  ;    pxor      mm0,mm0
1776 yogev_ezra 244
  ;    pxor      mm1,mm1
245
   ;/   pinsrw    mm0,.z1,1
246
   ;/   pinsrw    mm0,.x1,0
247
   ;/   pinsrw    mm1,.z2,1
248
   ;/   pinsrw    mm1,.x2,0
249
       mov	 ax,.z2
250
       sub	 ax,.z1
251
       cwde
252
1819 yogev_ezra 253
 
254
       sub	dx,.x1
255
       movsx	edx,dx
256
257
 
1776 yogev_ezra 258
259
 
260
   ;/    punpcklwd  mm1,mm4
261
262
 
263
  ;     cvtpi2ps   xmm2,mm0
264
  ;     subps      xmm1,xmm2
265
266
 
267
268
 
269
       movd	  mm3,[.t_x2]
270
271
 
272
       punpcklwd  mm3,mm4
273
       psubd	  mm3,mm2
274
275
 
276
       cvtsi2ss  xmm1,eax
277
       movlhps	 xmm1,xmm1
278
       cvtsi2ss  xmm1,edx
1819 yogev_ezra 279
   ;    movss     xmm1,xmm4
280
       shufps	 xmm1,xmm1,00101111b
281
       cvtpi2ps  xmm1,mm3
1776 yogev_ezra 282
283
 
1819 yogev_ezra 284
1776 yogev_ezra 285
 
286
			     ; xmm1--> | dx | dz | dtx | dty |
1819 yogev_ezra 287
;1       movlps    .dty12,xmm1
288
;1       movhps    .dz12,xmm1
289
       cvtps2pi  mm0,xmm1    ; mm0 -> 2 delta dwords  | dtx | dty |
1776 yogev_ezra 290
       movhlps	 xmm1,xmm1
291
       cvtps2pi  mm1,xmm1
1819 yogev_ezra 292
       movq	 .dty12,mm0
1776 yogev_ezra 293
       movq	 .dz12,mm1
1819 yogev_ezra 294
;temporaly conversion to keep upside down
295
;     fninit
296
;     fld      .dx12
297
;     fistp    .dx12
298
;     fld      dword .dz12
299
;     fistp    dword .dz12
300
;     fld      .dbx12
301
;     fistp    .dbx12
302
;     fld      dword .dby12
303
;     fistp    dword .dby12
304
;     fld      .dex12
305
;     fistp    .dex12
306
;     fld      dword .dey12
307
;     fistp    dword .dey12
308
;     fld      .dtx12
309
;     fistp    .dtx12
310
;     fld      dword .dty12
311
;     fistp    dword .dty12
312
;----
1776 yogev_ezra 313
;       mov       ax,.z2
1245 hidnplayr 314
;       sub       ax,.z1
315
;       cwde
316
;       mov       bx,.x2
317
;       sub       bx,.x1
318
;       movsx     ebx,bx
319
;       movd      mm1,eax
320
;       psllq     mm1,32
321
;       movd      mm1,ebx
322
1776 yogev_ezra 323
 
1245 hidnplayr 324
;;       push      eax
325
;;       movq      mm1,[esp]
326
;;       add       esp,8
327
;;;       mov       ax,.z1
328
;;;       mov       bx,.z2
329
;;;       shl       eax,16
330
;;;       shl       ebx,16
331
;;;       mov       ax,.x1
332
;;;       mov       bx,.x2
333
;       movd       mm2,[.t_x1]
334
;       movd       mm3,[.t_x2]
335
;;       movd      mm0,eax
336
;;       movd      mm1,ebx
337
338
 
339
;;       punpcklwd  mm0,mm4
340
;;       punpcklwd  mm1,mm4
341
;       punpcklwd  mm2,mm4
342
;       punpcklwd  mm3,mm4
343
344
 
345
;       psubd      mm3,mm2
346
347
 
348
 
349
;       movlhps   xmm1,xmm1
350
;       cvtpi2ps  xmm1,mm3
351
352
 
353
354
 
355
			     ; xmm1--> | dx | dz | dtx | dty |
356
;       cvtps2pi  mm0,xmm1    ; mm0 -> 2 delta dwords  | dtx | dty |
357
;       movhlps   xmm1,xmm1
358
;       cvtps2pi  mm1,xmm1    ; mm1 --> 2 delta dwords | dx | dz |
359
;       movq      .dty12,mm0
360
;       movq      .dz12,mm1
361
else
362
       mov	ax,.x2
1819 yogev_ezra 363
       sub	ax,.x1
364
       cwde
365
       shl	eax,ROUND
366
       cdq
367
       idiv	ebx
368
 ;     mov      .dx12,eax
369
       push	 eax
370
371
 
1776 yogev_ezra 372
       sub     ax,.z1
373
       cwde
374
       shl     eax,CATMULL_SHIFT
375
       cdq
376
       idiv    ebx
377
       push    eax
378
1245 hidnplayr 379
 
380
       sub	ax,word[.b_x1]
381
       cwde
382
       shl	eax,ROUND
383
       cdq
384
       idiv	ebx
385
 ;     mov      .dbx12,eax
386
       push	 eax
387
388
 
389
       sub	ax,word[.b_y1]
390
       cwde
391
       shl	eax,ROUND
392
       cdq
393
       idiv	ebx
394
 ;     mov      .dby12,eax
395
       push	 eax
396
397
 
398
       sub	ax,word[.e_x1]
399
       cwde
400
       shl	eax,ROUND
401
       cdq
402
       idiv	ebx
403
 ;     mov      .dex12,eax
404
       push	 eax
405
406
 
407
       sub	ax,word[.e_y1]
408
       cwde
409
       shl	eax,ROUND
410
       cdq
411
       idiv	ebx
412
 ;     mov      .dey12,eax
413
       push	 eax
414
415
 
416
       sub	ax,word[.t_x1]
417
       cwde
418
       shl	eax,ROUND
419
       cdq
420
       idiv	ebx
421
 ;     mov      .dtx12,eax
422
       push	 eax
423
424
 
425
       sub	ax,word[.t_y1]
426
       cwde
427
       shl	eax,ROUND
428
       cdq
429
       idiv	ebx
430
 ;     mov      .dty12,eax
431
       push	 eax
432
end if
1776 yogev_ezra 433
   .bt_dx12_done:
1245 hidnplayr 434
435
 
436
       sub	bx,.y1
437
       jnz	.bt_dx13_make
438
       mov	ecx,8
439
       xor	edx,edx
440
     @@:
441
       push	edx   ;dword 0
442
       loop	@b
443
       jmp	.bt_dx13_done
444
 .bt_dx13_make:
445
       movsx	ebx,bx
446
447
 
448
449
 
1819 yogev_ezra 450
   ;    mov       eax,256
451
       cvtsi2ss  xmm4,[i255d]
1245 hidnplayr 452
       cvtsi2ss  xmm3,ebx	     ;rcps
453
       divss	 xmm3,xmm4
454
       shufps	 xmm3,xmm3,0
455
456
 
457
       movd	 mm1,[.b_x3]
458
       movd	 mm2,[.e_x1]
459
       movd	 mm3,[.e_x3]
460
461
 
462
       punpcklwd  mm0,mm4
463
       punpcklwd  mm1,mm4
464
       punpcklwd  mm2,mm4
465
       punpcklwd  mm3,mm4
466
467
 
468
       psubd	  mm3,mm2
469
470
 
471
       movlhps	 xmm1,xmm1
472
       cvtpi2ps  xmm1,mm3
473
474
 
475
476
 
477
			     ;xmm1--> | dbx | dby | dex | dey |
478
;1       movups    .dey13,xmm1
1819 yogev_ezra 479
480
 
481
       movhlps	 xmm1,xmm1
1245 hidnplayr 482
       cvtps2pi  mm1,xmm1 ;mm1,xmm1
1819 yogev_ezra 483
       movq	 .dey13,mm0
1245 hidnplayr 484
       movq	 .dby13,mm1
485
1819 yogev_ezra 486
 
1776 yogev_ezra 487
       sub	 ax,.z1
488
       cwde
489
490
 
1819 yogev_ezra 491
       sub	dx,.x1
492
       movsx	edx,dx
493
494
 
1776 yogev_ezra 495
       movd	  mm3,[.t_x3]
496
497
 
498
       punpcklwd  mm3,mm4
499
       psubd	  mm3,mm2
500
501
 
502
       movlhps	 xmm1,xmm1
503
       cvtsi2ss  xmm1,edx
1819 yogev_ezra 504
       shufps	 xmm1,xmm1,00101111b
505
       cvtpi2ps  xmm1,mm3
1776 yogev_ezra 506
507
 
1819 yogev_ezra 508
1776 yogev_ezra 509
 
510
			     ; xmm1--> | dx | dz | dtx | dty |
1819 yogev_ezra 511
;1       movlps    .dty13,xmm1
512
;1       movhps    .dz13,xmm1
513
514
 
1776 yogev_ezra 515
       movhlps	 xmm1,xmm1
516
       cvtps2pi  mm1,xmm1
1819 yogev_ezra 517
       movq	 .dty13,mm0
1776 yogev_ezra 518
       movq	 .dz13,mm1
1819 yogev_ezra 519
520
 
521
;     fninit
522
;     fld      .dx13
523
;     fistp    .dx13
524
;     fld      dword .dz13
525
;     fistp    dword .dz13
526
;     fld      .dbx13
527
;     fistp    .dbx13
528
;     fld      dword .dby13
529
;     fistp    dword .dby13
530
;     fld      .dex13
531
;     fistp    .dex13
532
;     fld      dword .dey13
533
;     fistp    dword .dey13
534
;     fld      .dtx13
535
;     fistp    .dtx13
536
;     fld      dword .dty13
537
;     fistp    dword .dty13
538
539
 
1245 hidnplayr 540
1819 yogev_ezra 541
 
542
       sub	ax,.x1
543
       cwde
544
       shl	eax,ROUND
545
       cdq
546
       idiv	ebx
547
 ;     mov      .dx13,eax
548
       push	 eax
549
550
 
1776 yogev_ezra 551
       sub     ax,.z1
552
       cwde
553
       shl     eax,CATMULL_SHIFT
554
       cdq
555
       idiv    ebx
556
  ;    mov    .dz13,eax
557
       push    eax
558
559
 
560
 
1245 hidnplayr 561
       sub	ax,word[.b_x1]
562
       cwde
563
       shl	eax,ROUND
564
       cdq
565
       idiv	ebx
566
 ;     mov      .dbx13,eax
567
       push	 eax
568
569
 
570
       sub	ax,word[.b_y1]
571
       cwde
572
       shl	eax,ROUND
573
       cdq
574
       idiv	ebx
575
 ;     mov      .dby13,eax
576
       push	 eax
577
578
 
579
       sub	ax,word[.e_x1]
580
       cwde
581
       shl	eax,ROUND
582
       cdq
583
       idiv	ebx
584
 ;     mov      .dex13,eax
585
       push	 eax
586
587
 
588
       sub	ax,word[.e_y1]
589
       cwde
590
       shl	eax,ROUND
591
       cdq
592
       idiv	ebx
593
 ;     mov      .dey13,eax
594
       push	 eax
595
596
 
597
       sub	ax,word[.t_x1]
598
       cwde
599
       shl	eax,ROUND
600
       cdq
601
       idiv	ebx
602
 ;     mov      .dtx13,eax
603
       push	 eax
604
605
 
606
       sub	ax,word[.t_y1]
607
       cwde
608
       shl	eax,ROUND
609
       cdq
610
       idiv	ebx
611
 ;     mov      .dty13,eax
612
       push	 eax
613
end if
1776 yogev_ezra 614
   .bt_dx13_done:
1245 hidnplayr 615
616
 
617
       sub	bx,.y2
618
       jnz	.bt_dx23_make
619
       mov	ecx,8
620
       xor	edx,edx
621
     @@:
622
       push	edx   ;dword 0
623
       loop	@b
624
       jmp	.bt_dx23_done
625
 .bt_dx23_make:
626
       movsx	ebx,bx
627
628
 
629
630
 
1819 yogev_ezra 631
   ;    mov       eax,256
632
       cvtsi2ss  xmm4,[i255d]
1245 hidnplayr 633
       cvtsi2ss  xmm3,ebx	     ;rcps
634
       divss	 xmm3,xmm4
635
       shufps	 xmm3,xmm3,0
636
637
 
638
       movd	 mm1,[.b_x3]
639
       movd	 mm2,[.e_x2]
640
       movd	 mm3,[.e_x3]
641
642
 
643
       punpcklwd  mm0,mm4
644
       punpcklwd  mm1,mm4
645
       punpcklwd  mm2,mm4
646
       punpcklwd  mm3,mm4
647
648
 
649
       psubd	  mm3,mm2
650
651
 
652
       movlhps	 xmm1,xmm1
653
       cvtpi2ps  xmm1,mm3
654
655
 
656
657
 
658
			     ;xmm1--> | dbx | dby | dex | dey |
659
;1       movups    .dey23,xmm1
1819 yogev_ezra 660
661
 
662
       movhlps	 xmm1,xmm1
1245 hidnplayr 663
       cvtps2pi  mm1,xmm1 ;mm1,xmm1
1819 yogev_ezra 664
       movq	 .dey23,mm0
1245 hidnplayr 665
       movq	 .dby23,mm1
666
1819 yogev_ezra 667
 
1776 yogev_ezra 668
       sub	 ax,.z2
669
       cwde
670
671
 
1819 yogev_ezra 672
       sub	dx,.x2
673
       movsx	edx,dx
674
675
 
1776 yogev_ezra 676
       movd	  mm3,[.t_x3]
677
678
 
679
       punpcklwd  mm3,mm4
680
       psubd	  mm3,mm2
681
682
 
683
       movlhps	 xmm1,xmm1
684
       cvtsi2ss  xmm1,edx
1819 yogev_ezra 685
       shufps	 xmm1,xmm1,00101111b
686
       cvtpi2ps  xmm1,mm3
1776 yogev_ezra 687
688
 
1819 yogev_ezra 689
1776 yogev_ezra 690
 
691
			    ; xmm1--> | dx | dz | dtx | dty |
1819 yogev_ezra 692
;       movlps    .dty23,xmm1
693
;       movhps    .dz23,xmm1
694
       cvtps2pi  mm0,xmm1    ; mm0 -> 2 delta dwords  | dtx | dty |
1776 yogev_ezra 695
       movhlps	 xmm1,xmm1
696
       cvtps2pi  mm1,xmm1    ; mm1 --> 2 delta dwords | dx  |  dz |
1819 yogev_ezra 697
       movq	 .dty23,mm0
1776 yogev_ezra 698
       movq	 .dz23,mm1
1819 yogev_ezra 699
700
 
701
 
702
;     fninit
703
;     fld      .dx23
704
;     fistp    .dx23
705
;     fld      dword .dz23
706
;     fistp    dword .dz23
707
;     fld      .dbx23
708
;     fistp    .dbx23
709
;     fld      dword .dby23
710
;     fistp    dword .dby23
711
;     fld      .dex23
712
;     fistp    .dex23
713
;     fld      dword .dey23
714
;     fistp    dword .dey23
715
;     fld      .dtx23
716
;     fistp    .dtx23
717
;     fld      dword .dty23
718
;     fistp    dword .dty23
719
else
1245 hidnplayr 720
       mov	ax,.x3
1819 yogev_ezra 721
       sub	ax,.x2
722
       cwde
723
       shl	eax,ROUND
724
       cdq
725
       idiv	ebx
726
 ;     mov      .dx23,eax
727
       push	 eax
728
1776 yogev_ezra 729
 
730
       sub     ax,.z2
731
       cwde
732
       shl     eax,CATMULL_SHIFT
733
       cdq
734
       idiv    ebx
735
     ; mov     .dz23,eax
736
       push    eax
737
738
 
1245 hidnplayr 739
       sub	ax,word[.b_x2]
740
       cwde
741
       shl	eax,ROUND
742
       cdq
743
       idiv	ebx
744
 ;     mov      .dbx23,eax
745
       push	 eax
746
747
 
748
       sub	ax,word[.b_y2]
749
       cwde
750
       shl	eax,ROUND
751
       cdq
752
       idiv	ebx
753
 ;     mov      .dby23,eax
754
       push	 eax
755
756
 
757
       sub	ax,word[.e_x2]
758
       cwde
759
       shl	eax,ROUND
760
       cdq
761
       idiv	ebx
762
 ;     mov      .dex23,eax
763
       push	 eax
764
765
 
766
       sub	ax,word[.e_y2]
767
       cwde
768
       shl	eax,ROUND
769
       cdq
770
       idiv	ebx
771
 ;     mov      .dey23,eax
772
       push	 eax
773
774
 
1776 yogev_ezra 775
 
1245 hidnplayr 776
       sub	ax,word[.t_x2]
777
       cwde
778
       shl	eax,ROUND
779
       cdq
780
       idiv	ebx
781
 ;     mov      .dtx23,eax
782
       push	 eax
783
784
 
785
       sub	ax,word[.t_y2]
786
       cwde
787
       shl	eax,ROUND
788
       cdq
789
       idiv	ebx
790
 ;     mov      .dty23,eax
791
       push	 eax
792
end if
1776 yogev_ezra 793
      ;  sub     esp,40
1245 hidnplayr 794
   .bt_dx23_done:
795
       sub	 esp,64
796
;if Ext>=SSE
1819 yogev_ezra 797
;       movsx    eax,.x1
798
;       shl      eax,ROUND
799
;       cvtsi2ss xmm0,eax
800
;       movss    .cx1,xmm0
801
;       movss    .cx2,xmm0
802
;
803
;       movsx    ebx,word[.b_x1]
804
;       shl      ebx,ROUND
805
;       cvtsi2ss xmm0,ebx
806
;       movss    .cbx1,xmm0
807
;       movss    .cbx2,xmm0
808
;
809
;       movsx    ecx,word[.b_y1]
810
;       shl      ecx,ROUND
811
;       cvtsi2ss xmm0,ecx
812
;       movss    .cby1,xmm0
813
;       movss    .cby2,xmm0
814
815
 
816
;       shl      edx,ROUND
817
;       cvtsi2ss xmm0,edx
818
;       movss    .cex1,xmm0
819
;       movss    .cex2,xmm0
820
;
821
;       movsx    eax,word[.e_y1]
822
;       shl      eax,ROUND
823
;       cvtsi2ss xmm0,eax
824
;       movss    .cey1,xmm0
825
;       movss    .cey2,xmm0
826
;
827
828
 
829
;       shl      ebx,CATMULL_SHIFT
830
;       cvtsi2ss xmm0,ebx
831
;       movss    .cz1,xmm0
832
;       movss    .cz2,xmm0
833
;
834
;       movsx    ecx,word[.t_x1]
835
;       shl      ecx,ROUND
836
;       cvtsi2ss xmm0,ecx
837
;       movss    .ctx1,xmm0
838
;       movss    .ctx2,xmm0
839
840
 
841
;       shl      edx,ROUND
842
;       cvtsi2ss xmm0,edx
843
;       movss    .cty1,xmm0
844
;       movss    .cty2,xmm0
845
846
 
847
848
 
1245 hidnplayr 849
       shl	eax,ROUND
850
       mov	.cx1,eax
851
       mov	.cx2,eax
852
  ;     push     eax
853
  ;     push     eax
854
855
 
856
       shl	ebx,ROUND
857
       mov	.cbx1,ebx
858
       mov	.cbx2,ebx
859
      ; push     ebx
860
      ; push     ebx
861
862
 
863
       shl	ecx,ROUND
864
       mov	.cby1,ecx
865
       mov	.cby2,ecx
866
      ; push     ecx
867
      ; push     ecx
868
869
 
870
       shl	edx,ROUND
871
       mov	.cex1,edx
872
       mov	.cex2,edx
873
    ;   push     edx
874
    ;   push     edx
875
876
 
877
       shl	eax,ROUND
878
       mov	.cey1,eax
879
       mov	.cey2,eax
880
    ;   push     eax
881
    ;   push     eax
882
883
 
884
       shl	ebx,CATMULL_SHIFT
885
       mov	.cz1,ebx
886
       mov	.cz2,ebx
887
   ;    push     ebx
888
   ;    push     ebx
889
890
 
891
       movsx	ecx,word[.t_x1]
892
       shl	ecx,ROUND
893
       mov	.ctx1,ecx
894
       mov	.ctx2,ecx
895
       ;push     ecx
896
       ;push     ecx
897
898
 
899
       shl	edx,ROUND
900
       mov	.cty1,edx
901
       mov	.cty2,edx
902
      ; push     edx
903
      ; push     edx
904
;end if
1819 yogev_ezra 905
1245 hidnplayr 906
 
907
       cmp	cx,.y2
908
       jge	.loop12_done
909
  .loop12:
910
       call	.call_line
911
;if Ext >= SSE
1819 yogev_ezra 912
;       movups  xmm0,.cby1
913
;       movups  xmm1,.cty1
914
;       movups  xmm2,.cby2
915
;       movups  xmm3,.cty2
916
;       movups  xmm4,.dby13
917
;       movups  xmm5,.dty13
918
;       movups  xmm6,.dby12
919
;       movups  xmm7,.dty12
920
;       addps   xmm0,xmm4
921
;       addps   xmm1,xmm5
922
;       addps   xmm2,xmm6
923
;       addps   xmm3,xmm7
924
;
925
;;       addps   xmm0,.dby12
926
;;       addps   xmm1,.dty12
927
;;       addps   xmm2,.dby13
928
;;       addps   xmm3,.dty13
929
;       movups  .cby1,xmm0
930
;       movups  .cty1,xmm1
931
;       movups  .cby2,xmm2
932
;       movups  .cty2,xmm3
933
;end if
934
1245 hidnplayr 935
 
936
       movq	mm0,.cby2
937
       movq	mm1,.cby1
938
       movq	mm2,.cey2
939
       movq	mm3,.cey1
940
       movq	mm4,.cty1
941
       movq	mm5,.cty2
942
       movq	mm6,.cz1
943
       movq	mm7,.cz2
944
       paddd	mm0,.dby12
945
       paddd	mm1,.dby13
946
       paddd	mm2,.dey12
947
       paddd	mm3,.dey13
948
       paddd	mm4,.dty13
949
       paddd	mm5,.dty12
950
       paddd	mm6,.dz13
951
       paddd	mm7,.dz12
952
       movq	.cby2,mm0
953
       movq	.cby1,mm1
954
       movq	.cey1,mm3
955
       movq	.cey2,mm2
956
       movq	.cty1,mm4
957
       movq	.cty2,mm5
958
       movq	.cz1,mm6
959
       movq	.cz2,mm7
960
end if
1819 yogev_ezra 961
if Ext = NON
962
       mov	edx,.dbx13
1245 hidnplayr 963
       add	.cbx1,edx
964
       mov	eax,.dbx12
965
       add	.cbx2,eax
966
       mov	ebx,.dby13
967
       add	.cby1,ebx
968
       mov	edx,.dby12
969
       add	.cby2,edx
970
971
 
972
       add	.cex1,eax
973
       mov	ebx,.dex12
974
       add	.cex2,ebx
975
       mov	edx,.dey13
976
       add	.cey1,edx
977
       mov	eax,.dey12
978
       add	.cey2,eax
979
980
 
981
       add	.ctx1,eax
982
       mov	ebx,.dtx12
983
       add	.ctx2,ebx
984
       mov	edx,.dty13
985
       add	.cty1,edx
986
       mov	eax,.dty12
987
       add	.cty2,eax
988
989
 
990
       add	.cx1,eax
991
       mov	ebx,.dx12
992
       add	.cx2,ebx
993
       mov	ebx,.dz13
994
       add	.cz1,ebx
995
       mov	edx,.dz12
996
       add	.cz2,edx
997
end if
998
       inc	ecx
999
       cmp	cx,.y2
1000
       jl	.loop12
1001
    .loop12_done:
1002
1003
 
1004
       cmp	cx,.y3
1005
       jge	.loop23_done
1006
1007
 
1819 yogev_ezra 1008
1009
 
1245 hidnplayr 1010
       shl	eax,CATMULL_SHIFT
1011
       mov	.cz2,eax
1012
1013
 
1014
       shl	ebx,ROUND
1015
       mov	.cx2,ebx
1016
1017
 
1018
       shl	edx,ROUND
1019
       mov	.cbx2,edx
1020
1021
 
1022
       shl	eax,ROUND
1023
       mov	.cby2,eax
1024
1025
 
1026
       shl	ebx,ROUND
1027
       mov	.cex2,ebx
1028
1029
 
1030
       shl	edx,ROUND
1031
       mov	.cey2,edx
1032
1033
 
1034
       shl	eax,ROUND
1035
       mov	.ctx2,eax
1036
1037
 
1038
       shl	ebx,ROUND
1039
       mov	.cty2,ebx
1040
;else
1819 yogev_ezra 1041
;       movsx    eax,.z2
1042
;       shl      eax,CATMULL_SHIFT
1043
;       cvtsi2ss xmm0,eax
1044
;       movss    .cz2,xmm0
1045
;
1046
;       movsx    ebx,.x2
1047
;       shl      ebx,ROUND
1048
;       cvtsi2ss xmm1,ebx
1049
;       movss    .cx2,xmm1
1050
;
1051
;       movzx    edx,word[.b_x2]
1052
;       shl      edx,ROUND
1053
;       cvtsi2ss xmm2,edx
1054
;       movss    .cbx2,xmm2
1055
;
1056
;       movzx    eax,word[.b_y2]
1057
;       shl      eax,ROUND
1058
;       cvtsi2ss xmm0,eax
1059
;       movss    .cby2,xmm0
1060
;
1061
;       movzx    ebx,word[.e_x2]
1062
;       shl      ebx,ROUND
1063
;       cvtsi2ss xmm1,ebx
1064
;       movss    .cex2,xmm1
1065
;
1066
;       movzx    edx,word[.e_y2]
1067
;       shl      edx,ROUND
1068
;       cvtsi2ss xmm2,edx
1069
;       movss    .cey2,xmm2
1070
;
1071
;       movzx    eax,word[.t_x2]
1072
;       shl      eax,ROUND
1073
;       cvtsi2ss xmm0,eax
1074
;       movss    .ctx2,xmm0
1075
;
1076
;       movzx    ebx,word[.t_y2]
1077
;       shl      ebx,ROUND
1078
;       cvtsi2ss xmm1,ebx
1079
;       movss    .cty2,xmm1
1080
1245 hidnplayr 1081
 
1819 yogev_ezra 1082
1083
 
1245 hidnplayr 1084
       call	.call_line
1085
1086
 
1819 yogev_ezra 1087
1088
 
1089
;       movups  xmm1,.cty1
1090
;       movups  xmm2,.cby2
1091
;       movups  xmm3,.cty2
1092
;       movups  xmm4,.dby13
1093
;       movups  xmm5,.dty13
1094
;       movups  xmm6,.dby23
1095
;       movups  xmm7,.dty23
1096
;       addps   xmm0,xmm4
1097
;       addps   xmm1,xmm5
1098
;       addps   xmm2,xmm6
1099
;       addps   xmm3,xmm7
1100
; ;      addps   xmm0,.dby13
1101
; ;      addps   xmm1,.dty13
1102
; ;      addps   xmm2,.dby23
1103
; ;      addps   xmm3,.dty23
1104
;       movups  .cby1,xmm0
1105
;       movups  .cty1,xmm1
1106
;       movups  .cby2,xmm2
1107
;       movups  .cty2,xmm3
1108
;
1109
;end if
1110
if Ext >= MMX
1245 hidnplayr 1111
       movq	mm0,.cby2
1112
       movq	mm1,.cby1
1113
       movq	mm2,.cey2
1114
       movq	mm3,.cey1
1115
       movq	mm4,.cty1
1116
       movq	mm5,.cty2
1117
       movq	mm6,.cz1
1118
       movq	mm7,.cz2
1119
       paddd	mm0,.dby23
1120
       paddd	mm1,.dby13
1121
       paddd	mm2,.dey23
1122
       paddd	mm3,.dey13
1123
       paddd	mm4,.dty13
1124
       paddd	mm5,.dty23
1125
       paddd	mm6,.dz13
1126
       paddd	mm7,.dz23
1127
       movq	.cby2,mm0
1128
       movq	.cby1,mm1
1129
       movq	.cey2,mm2
1130
       movq	.cey1,mm3
1131
       movq	.cty1,mm4
1132
       movq	.cty2,mm5
1133
       movq	.cz1,mm6
1134
       movq	.cz2,mm7
1135
end if
1819 yogev_ezra 1136
If Ext = NON
1137
       mov	edx,.dbx13
1245 hidnplayr 1138
       add	.cbx1,edx
1139
       mov	eax,.dbx23
1140
       add	.cbx2,eax
1141
       mov	ebx,.dby13
1142
       add	.cby1,ebx
1143
       mov	edx,.dby23
1144
       add	.cby2,edx
1145
1146
 
1147
       add	.cex1,eax
1148
       mov	ebx,.dex23
1149
       add	.cex2,ebx
1150
       mov	edx,.dey13
1151
       add	.cey1,edx
1152
       mov	eax,.dey23
1153
       add	.cey2,eax
1154
1155
 
1156
       add	.cx1,eax
1157
       mov	ebx,.dx23
1158
       add	.cx2,ebx
1159
       mov	ebx,.dz13
1160
       add	.cz1,ebx
1161
       mov	edx,.dz23
1162
       add	.cz2,edx
1163
1164
 
1165
       add	.ctx1,eax
1166
       mov	ebx,.dtx23
1167
       add	.ctx2,ebx
1168
       mov	edx,.dty13
1169
       add	.cty1,edx
1170
       mov	eax,.dty23
1171
       add	.cty2,eax
1172
end if
1173
       inc	ecx
1174
       cmp	cx,.y3
1175
       jl	.loop23
1176
    .loop23_done:
1177
1178
 
1179
ret   50
1180
1181
 
1182
;if Ext >= SSE
1819 yogev_ezra 1183
;       pushad
1184
;       push     .tex_ptr
1185
;       fninit
1186
;       fld      dword .cty1
1187
;       fistp    dword [esp-4]
1188
;       sub      esp,4
1189
;;       push     dword .cty1
1190
;       fld      .ctx1
1191
;       fistp    dword [esp-4]
1192
;       sub      esp,4
1193
;;       push     .ctx1
1194
;       fld      dword .cz1
1195
;       fistp    dword [esp-4]
1196
;       sub      esp,4
1197
;    ;   push     dwod .cz1
1198
;       fld      dword .cty2
1199
;       fistp    dword [esp-4]
1200
;       sub      esp,4
1201
;    ;   push     .cty2
1202
;       fld      .ctx2
1203
;       fistp    dword [esp-4]
1204
;       sub      esp,4
1205
;  ;     push     dword .ctx2
1206
;       fld      dword .cz2
1207
;       fistp    dword [esp-4]
1208
;       sub      esp,4
1209
;;       push     dword .cz2
1210
;
1211
;       push     .z_buff
1212
;       push     .t_emap
1213
;       push     .t_bmap
1214
;--------------------------------------
1215
;       fld      dword .cey2
1216
;       fistp    dword [esp-4]
1217
;       sub      esp,4
1218
;;       push     dword .cey2
1219
;
1220
;       fld      .cex2
1221
;       fistp    dword [esp-4]
1222
;       sub      esp,4
1223
;;       push     .cex2
1224
;
1225
;       fld      dword .cby2
1226
;       fistp    dword [esp-4]
1227
;       sub      esp,4
1228
; ;      push     dword .cby2
1229
1245 hidnplayr 1230
 
1819 yogev_ezra 1231
;       fistp    dword [esp-4]
1232
;       sub      esp,4
1233
 ;      push     .cbx2
1234
;------------------------------------
1235
;       fld      dword .cey1
1236
;       fistp    dword [esp-4]
1237
;       sub      esp,4
1238
;;       push     dword .cey1
1239
;       fld      .cex1
1240
;       fistp    dword [esp-4]
1241
;       sub      esp,4
1242
;    ;   push     .cex1
1243
;       fld      dword .cby1
1244
;       fistp    dword [esp-4]
1245
;       sub      esp,4
1246
;;       push     dword .cby1
1247
;       fld      .cbx1
1248
;       fistp    dword [esp-4]
1249
;       sub      esp,4
1250
;;      push     .cbx1
1251
;       push     ecx
1252
1253
 
1254
;       fistp    dword [esp-4]
1255
;       mov      eax,[esp-4]
1256
;       sar      eax,ROUND
1257
;       fld      .cx2
1258
;       fistp    dword [esp-4]
1259
;       mov      ebx,[esp-4]
1260
;       sar      ebx,ROUND
1261
1262
 
1263
;
1264
;       popad
1265
;else
1266
       pushad
1245 hidnplayr 1267
       push	.tex_ptr
1268
       push	dword .cty1
1269
       push	.ctx1
1270
       push	dword .cz1
1271
       push	dword .cty2
1819 yogev_ezra 1272
       push	.ctx2
1273
       push	dword .cz2
1245 hidnplayr 1274
       push	.z_buff
1275
       push	.t_emap
1276
       push	.t_bmap
1277
       push	dword .cey2
1278
       push	.cex2
1279
       push	dword .cby2
1819 yogev_ezra 1280
       push	.cbx2
1281
       push	dword .cey1
1245 hidnplayr 1282
       push	.cex1
1283
       push	dword .cby1
1284
       push	.cbx1
1285
       push	ecx
1286
1287
 
1288
       sar	eax,ROUND
1289
       mov	ebx,.cx2
1290
       sar	ebx,ROUND
1291
1292
 
1293
1294
 
1295
;end if
1819 yogev_ezra 1296
ret
1245 hidnplayr 1297
bump_tex_line_z:
1298
;--------------in: eax - x1
1299
;--------------    ebx - x2
1300
;--------------    edi - pointer to screen buffer
1301
;stack - another parameters :
1302
.y	equ dword [ebp+4]
1303
1304
 
1819 yogev_ezra 1305
.by1	equ  [ebp+12]  ;       |
1306
.ex1	equ  [ebp+16]  ;       |
1307
.ey1	equ  [ebp+20]  ;       |
1308
.bx2	equ  [ebp+24]  ;       |
1309
.by2	equ  [ebp+28]  ;       |>   b. map and e. map coords
1310
.ex2	equ  [ebp+32]  ;       |>   shifted shl ROUND
1311
.ey2	equ  [ebp+36]  ;   ---
1312
.bmap	equ  [ebp+40]  ; bump map offset
1313
.emap	equ  [ebp+44]  ; env map offset
1314
.z_buff equ  [ebp+48]
1315
.z2	equ  [ebp+52]
1316
.tx2	equ  [ebp+56]
1317
.ty2	equ  [ebp+60]
1318
.z1	equ  [ebp+64]
1319
.tx1	equ  [ebp+68]
1320
.ty1	equ  [ebp+72]
1321
.tex_map equ dword [ebp+76]  ; texture offset  ( pointer )
1245 hidnplayr 1322
1323
 
1324
 
1819 yogev_ezra 1325
.x2	equ [ebp-8]
1326
.dbx	equ [ebp-12]
1327
.dby	equ [ebp-16]
1328
.dex	equ [ebp-20]
1329
.dey	equ [ebp-24]
1330
.dz	equ [ebp-28]
1331
.dtx	equ [ebp-32]
1332
.dty	equ [ebp-36]
1333
1245 hidnplayr 1334
 
1819 yogev_ezra 1335
.cby	equ [ebp-44]
1336
.cex	equ [ebp-48]
1337
.cey	equ [ebp-52]
1338
.cz	equ [ebp-56]
1339
.czbuff equ [ebp-60]
1340
.ctx	equ [ebp-64]
1341
.cty	equ [ebp-68]
1342
.c_scr	equ [ebp-72]
1343
1245 hidnplayr 1344
 
1345
.temp2	equ	   ebp-88
1346
.temp3	equ	   ebp-76
1347
.temp4	equ	   ebp-84
1348
.temp5	equ	   ebp-92
1349
1350
 
1351
1352
 
1353
	or	ecx,ecx
1354
	jl	.bl_end
1355
	cmp	ecx,SIZE_Y
1356
	jge	.bl_end
1357
1358
 
1359
	jl	.bl_ok
1360
	je	.bl_end
1361
1362
 
1363
if Ext=NON
1364
	mov	edx,.bx1
1365
	xchg	edx,.bx2
1366
	mov	.bx1,edx
1367
	mov	edx,.by1
1368
	xchg	edx,.by2
1369
	mov	.by1,edx
1370
1371
 
1372
	xchg	edx,.ex2
1373
	mov	.ex1,edx
1374
	mov	edx,.ey1
1375
	xchg	edx,.ey2
1376
	mov	.ey1,edx
1377
1378
 
1379
	xchg	edx,.tx2
1380
	mov	.tx1,edx
1381
	mov	edx,.ty1
1382
	xchg	edx,.ty2
1383
	mov	.ty1,edx
1384
end if
1385
if Ext = MMX
1819 yogev_ezra 1386
	movq	mm0,.bx1
1387
	movq	mm1,.bx2
1388
	movq	mm2,.ex1
1389
	movq	mm3,.ex2
1390
	movq	mm4,.tx1
1391
	movq	mm5,.tx2
1392
	movq	.bx2,mm0
1393
	movq	.bx1,mm1
1394
	movq	.ex1,mm3
1395
	movq	.ex2,mm2
1396
	movq	.tx1,mm5
1397
	movq	.tx2,mm4
1398
end if
1399
if Ext>=SSE
1400
	movups xmm0,.bx1
1401
	movups xmm1,.bx2
1402
	movups .bx1,xmm1
1403
	movups .bx2,xmm0
1404
	movq	mm0,.tx1
1405
	movq	mm1,.tx2
1406
	movq	.tx1,mm1
1407
	movq	.tx2,mm0
1408
end if
1409
1245 hidnplayr 1410
 
1411
	xchg	edx,.z2
1412
	mov	.z1,edx
1413
  .bl_ok:
1414
	push	eax
1415
	push	ebx	      ;store x1, x2
1416
	cmp	dword .x1,SIZE_X
1819 yogev_ezra 1417
	jge	.bl_end
1245 hidnplayr 1418
	cmp	dword .x2,0
1819 yogev_ezra 1419
	jle	.bl_end
1245 hidnplayr 1420
1421
 
1422
	sub	ebx,.x1
1423
1424
 
1425
1426
 
1427
       cvtsi2ss  xmm3,ebx	     ;rcps
1428
       shufps	 xmm3,xmm3,0
1429
; float using SSE variant  ::-->
1819 yogev_ezra 1430
;       movups    xmm0,.bx1  ; new
1431
;       movups    xmm1,.bx2  ; new
1432
1245 hidnplayr 1433
 
1819 yogev_ezra 1434
       movlhps	 xmm0,xmm0
1245 hidnplayr 1435
       cvtpi2ps  xmm0,.ex1 ;mm2
1819 yogev_ezra 1436
       cvtpi2ps  xmm1,.bx2 ;mm1
1437
       movlhps	 xmm1,xmm1
1245 hidnplayr 1438
       cvtpi2ps  xmm1,.ex2 ;mm3
1819 yogev_ezra 1439
       subps	 xmm1,xmm0
1245 hidnplayr 1440
1441
 
1442
1443
 
1444
;       movups    .dey,xmm1  ; new
1819 yogev_ezra 1445
       cvtps2pi  mm0,xmm1	   ; mm0 -> 2 delta dwords
1245 hidnplayr 1446
       movhlps	 xmm1,xmm1
1447
       cvtps2pi  mm1,xmm1
1448
       movq	 .dey,mm0
1819 yogev_ezra 1449
       movq	 .dby,mm1
1450
1245 hidnplayr 1451
 
1452
       movd	 mm3,.z2
1453
1454
 
1819 yogev_ezra 1455
       movlhps	 xmm0,xmm0
1245 hidnplayr 1456
       cvtpi2ps  xmm0,mm2
1457
       cvtpi2ps  xmm1,.tx2 ;mm1
1819 yogev_ezra 1458
       movlhps	 xmm1,xmm1
1245 hidnplayr 1459
       cvtpi2ps  xmm1,mm3
1460
;       movups    xmm0,,z1  ; new
1819 yogev_ezra 1461
;       movups    xmm1,.z2  ; new
1462
       subps	 xmm1,xmm0
1245 hidnplayr 1463
1464
 
1465
1466
 
1819 yogev_ezra 1467
1468
 
1245 hidnplayr 1469
       cvtps2pi  mm0,xmm1	   ; mm0 -> 2 delta dwords
1470
       movhlps	 xmm1,xmm1
1471
       cvtps2pi  mm1,xmm1
1472
       movd	 .dz,mm0
1473
       movq	 .dty,mm1
1819 yogev_ezra 1474
1245 hidnplayr 1475
 
1476
1477
 
1478
	sub	eax,.bx1
1479
	cdq
1480
	idiv	ebx
1481
	push	eax
1482
1483
 
1484
	sub	eax,.by1
1485
	cdq
1486
	idiv	ebx
1487
	push	eax
1488
1489
 
1490
	sub	eax,.ex1
1491
	cdq
1492
	idiv	ebx
1493
	push	eax
1494
1495
 
1496
	sub	eax,.ey1
1497
	cdq
1498
	idiv	ebx
1499
	push	eax
1500
1501
 
1502
 
1503
	sub	eax,.z1
1504
	cdq
1505
	idiv	ebx
1506
	push	eax
1507
1508
 
1509
	sub	eax,.tx1
1510
	cdq
1511
	idiv	ebx
1512
	push	eax
1513
1514
 
1515
	sub	eax,.ty1
1516
	cdq
1517
	idiv	ebx
1518
	push	eax
1519
1520
 
1521
	cmp	dword .x1,0	    ; set correctly begin variable
1819 yogev_ezra 1522
	jge	@f	      ; CLIPPING ON FUNCTION
1245 hidnplayr 1523
			      ; cutting triangle exceedes screen
1524
	mov	ebx,.x1
1525
	neg	ebx
1526
1819 yogev_ezra 1527
 
1528
1529
 
1530
;        shufps   xmm0,xmm0,0
1531
;        movups   xmm1,.dey
1532
;        mulps    xmm1,xmm0
1533
;        shufps   xmm1,xmm1,00011011b
1534
;        movups   xmm2,.bx1
1535
;        addps    xmm2,xmm1
1536
;        movups   .bx1,xmm2
1537
1538
 
1539
	imul	ebx	      ; eax = .dz * abs(.x1)
1245 hidnplayr 1540
	add	.z1,eax
1541
	mov	dword .x1,0
1819 yogev_ezra 1542
1245 hidnplayr 1543
 
1544
	imul	ebx
1545
	add    .bx1,eax
1546
1547
 
1548
	imul	ebx
1549
	add	.by1,eax
1550
1551
 
1552
	imul	ebx
1553
	add	.ex1,eax
1554
1555
 
1556
	imul	ebx
1557
	add	.ey1,eax
1558
1559
 
1560
	imul	ebx
1561
	add	.tx1,eax
1562
1563
 
1564
	imul	ebx
1565
	add	.ty1,eax
1566
1567
 
1568
	cmp	dword .x2,SIZE_X
1819 yogev_ezra 1569
	jl	@f
1245 hidnplayr 1570
	mov	dword .x2,SIZE_X
1819 yogev_ezra 1571
      @@:
1245 hidnplayr 1572
	mov	eax,SIZE_X	 ;calc memory begin in buffers
1573
	mul	.y
1574
	add	eax,.x1
1575
	lea	esi,[4*eax]
1576
	add	esi,.z_buff	  ; z-buffer filled with dd variables
1577
	lea	eax,[eax*3]
1578
	add	edi,eax
1579
1580
 
1581
 
1582
	sub	ecx,.x1
1583
	; init current variables
1584
	push	dword .bx1   ; current b, e and t shifted shl ROUND   .cbx
1819 yogev_ezra 1585
	push	dword .by1					   ;  .cby
1586
	push	dword .ex1					   ;  .cex
1587
	push	dword .ey1					   ;  .cey
1588
1245 hidnplayr 1589
 
1819 yogev_ezra 1590
	push	esi					     ; .czbuff
1245 hidnplayr 1591
1592
 
1819 yogev_ezra 1593
	push	dword .ty1	;         .cty
1594
	push	edi	  ;         .c_scr
1245 hidnplayr 1595
if Ext>=MMX
1596
	movq	mm7,.cty
1819 yogev_ezra 1597
	movq	mm6,.cby
1598
	movq	mm5,.cey
1599
;        movq    mm4,.dtyq
1245 hidnplayr 1600
;        movq    mm3,.dbyq
1601
end if
1602
1603
 
1604
    ; if TEX = SHIFTING   ;bump drawing only in shifting mode
1605
	mov	esi,.czbuff	 ; .czbuff current address in buffer
1606
	mov	ebx,.cz 	 ; .cz - cur z position
1607
	cmp	ebx,dword[esi]
1608
	jge	.skip
1609
if Ext=NON
1610
	mov	eax,.cby
1611
	shr	eax,ROUND
1612
	mov	esi,.cbx
1613
	shr	esi,ROUND
1614
else
1615
	movq	mm1,mm6
1616
	psrld	mm1,ROUND
1617
	movd	eax,mm1
1618
	psrlq	mm1,32
1619
	movd	esi,mm1
1620
end if
1621
1622
 
1623
 
1624
	add	esi,eax 	;-  ; esi - current bump map index
1625
1626
 
1627
	dec	ebx
1628
	and	ebx,TEXTURE_SIZE
1629
	add	ebx,.bmap
1630
	movzx	eax,byte [ebx]
1631
1632
 
1633
	inc	ebx
1634
	and	ebx,TEXTURE_SIZE
1635
	add	ebx,.bmap
1636
	movzx	ebx,byte [ebx]
1637
	sub	eax,ebx
1638
1639
 
1640
	sub	ebx,TEX_X
1641
	and	ebx,TEXTURE_SIZE
1642
	add	ebx,.bmap
1643
	movzx	edx,byte [ebx]
1644
1645
 
1646
	add	ebx,TEX_X
1647
	and	ebx,TEXTURE_SIZE
1648
	add	ebx,.bmap
1649
	movzx	ebx,byte [ebx]
1650
	sub	edx,ebx
1651
1652
 
1819 yogev_ezra 1653
 
1245 hidnplayr 1654
     ;  edx - vertical   sub    modificated y coord
1655
if Ext=NON
1656
	mov	ebx,.cex       ;.cex - current env map X
1657
	shr	ebx,ROUND
1658
	add	eax,ebx
1659
1660
 
1661
 
1662
	shr	ebx,ROUND
1663
	add	edx,ebx
1664
1665
 
1666
	movq	mm1,mm5        ; mm5 - copy of cur env coords
1667
	psrld	mm1,ROUND
1668
	movd	ebx,mm1
1669
	psrlq	mm1,32
1670
	add	eax,ebx
1671
	movd	ebx,mm1
1672
	add	edx,ebx
1673
;        movq    qword[.temp1],mm3
1674
;        add     eax,dword [.temp1]
1675
;        add     edx,dword [.temp1+4]
1676
end if
1677
1678
 
1679
	jl	.black
1680
	cmp	eax,TEX_X
1681
	jg	.black
1682
	or	edx,edx
1683
	jl	.black
1684
	cmp	edx,TEX_Y
1685
	jg	.black
1686
1687
 
1688
	add	edx,eax 	; proponuje nie stawiac czarnego pixela tylko
1689
	lea	esi,[edx*3]	; niezaburzony.
1690
	add	esi,.emap	;
1691
	lodsd
1692
1693
 
1694
	mov	edx,.cty
1695
	shr	edx,ROUND  ; sar
1696
1697
 
1698
	shr	edi,ROUND  ; sar
1699
else
1700
	movq	mm1,mm7
1701
	psrld	mm1,ROUND
1702
	movd	edx,mm1
1703
	psrlq	mm1,32
1704
	movd	edi,mm1
1705
1706
 
1707
1708
 
1709
	add	edi,edx
1710
	and	edi,TEXTURE_SIZE
1711
	lea	esi,[edi*3]
1712
	add	esi,.tex_map
1713
1714
 
1715
	mov	edx,eax
1716
	lodsd
1717
	push	ax
1718
	mul	dl
1719
	mov	dl,ah
1720
	pop	ax
1721
	shr	ax,8
1722
	mul	dh
1723
	mov	al,dl
1724
	mov	edi,.c_scr
1725
	stosw
1726
	shr	edx,16
1727
	shr	eax,16
1728
	mul	dl
1729
	shr	ax,8
1730
	stosb
1731
else
1732
	movd	   mm0,eax
1733
	pxor	   mm1,mm1
1734
	punpcklbw  mm0,mm1
1735
	movd	   mm2,[esi]
1736
	punpcklbw  mm2,mm1
1737
	pmullw	   mm0,mm2
1738
	psrlw	   mm0,8
1739
	packuswb   mm0,mm1
1740
	mov	   edi,.c_scr
1741
	movd	   [edi],mm0
1742
1743
 
1744
1745
 
1746
     @@:
1747
     .black:
1748
	xor	eax,eax
1749
	mov	edi,.c_scr
1750
	stosd
1751
     .actual_zbuff:
1752
	mov	eax,.cz
1753
	mov	edi,.czbuff
1754
	stosd
1755
1756
 
1757
	add	dword .czbuff,4
1819 yogev_ezra 1758
	add	dword .c_scr,3
1759
1245 hidnplayr 1760
 
1761
	mov	eax,.dbx
1762
	add	.cbx,eax
1763
	mov	ebx,.dby
1764
	add	.cby,ebx
1765
1766
 
1767
	add	.cex,edx
1768
	mov	eax,.dey
1769
	add	.cey,eax
1770
1771
 
1772
	add	.ctx,ebx
1773
	mov	edx,.dty
1774
	add	.cty,edx
1775
1776
 
1777
	paddd	mm7,.dty
1819 yogev_ezra 1778
	paddd	mm6,.dby
1779
	paddd	mm5,.dey
1780
end if
1245 hidnplayr 1781
	mov	eax,.dz
1782
	add	.cz,eax
1783
1784
 
1785
	jnz	.draw
1786
1787
 
1788
	mov	esp,ebp
1789
ret 76
1790
;Ext = MMX
1791
1792
 
1793
;        movq    mm5, qword[.temp1]  ;-
1794
;        paddd   mm5, qword[.temp5]  ; .temp5 == low dword = TEX_X, high dword = -TEX_X
1795
;        pand    mm5, qword[.temp3]  ; .temp3 == low = high dword = TEX_SIZE
1796
;        paddd   mm5, qword[.temp4]  ; .temp4 == low = high dword = offset .bmap
1797
;        movd    ebx,mm5
1798
;        psrlq   mm5,32
1799
;     end if
1800