Subversion Repositories Kolibri OS

Rev

Rev 1819 | 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 = SSE2
1979 yogev_ezra 1596
;        mov    eax,TEXTURE_SIZE
1597
;        movd   xmm1,eax
1598
;        shufps xmm1,xmm1,0
1599
;        push   dword  TEX_X
1600
;        push   dword  -TEX_X
1601
;        push   dword  1
1602
;        push   dword  -1
1603
;        movups xmm2,[esp]
1604
;        movd   xmm3,.bmap
1605
;        shufps xmm3,xmm3,0
1606
;end if
1607
1608
 
1245 hidnplayr 1609
	movq	mm7,.cty
1819 yogev_ezra 1610
	movq	mm6,.cby
1611
	movq	mm5,.cey
1612
;        movq    mm4,.dtyq
1245 hidnplayr 1613
;        movq    mm3,.dbyq
1614
end if
1615
1616
 
1617
    ; if TEX = SHIFTING   ;bump drawing only in shifting mode
1618
	mov	esi,.czbuff	 ; .czbuff current address in buffer
1619
	mov	ebx,.cz 	 ; .cz - cur z position
1620
	cmp	ebx,dword[esi]
1621
	jge	.skip
1622
if Ext=NON
1623
	mov	eax,.cby
1624
	shr	eax,ROUND
1625
	mov	esi,.cbx
1626
	shr	esi,ROUND
1627
else
1628
	movq	mm1,mm6
1629
	psrld	mm1,ROUND
1630
	movd	eax,mm1
1631
	psrlq	mm1,32
1632
	movd	esi,mm1
1633
end if
1634
1635
 
1636
	add	esi,eax 	;-  ; esi - current bump map index
1637
1638
 
1979 yogev_ezra 1639
;
1640
;        movd    xmm0,esi
1641
;        shufps  xmm0,xmm0,0
1642
;        paddd   xmm0,xmm2
1643
;        pand    xmm0,xmm1
1644
;        paddd   xmm0,xmm3
1645
;
1646
;        movd    ebx,xmm0
1647
;        movzx   eax,byte[ebx]
1648
;
1649
;        shufps  xmm0,xmm0,11100001b
1650
;        movd    ebx,xmm0
1651
;        movzx   ebx,byte[ebx]
1652
;        sub     eax,ebx
1653
;
1654
;        shufps  xmm0,xmm0,11111110b
1655
;        movd    ebx,xmm0
1656
;        movzx   edx, byte [ebx]
1657
;
1658
;        shufps  xmm0,xmm0,11111111b
1659
;        movd    ebx,xmm0
1660
;        movzx   ebx, byte [ebx]
1661
;        sub     edx,ebx
1662
;
1663
;else
1664
	mov	ebx,esi
1245 hidnplayr 1665
	dec	ebx
1666
	and	ebx,TEXTURE_SIZE
1667
	add	ebx,.bmap
1668
	movzx	eax,byte [ebx]
1669
1670
 
1671
	inc	ebx
1672
	and	ebx,TEXTURE_SIZE
1673
	add	ebx,.bmap
1674
	movzx	ebx,byte [ebx]
1675
	sub	eax,ebx
1676
1677
 
1678
	sub	ebx,TEX_X
1679
	and	ebx,TEXTURE_SIZE
1680
	add	ebx,.bmap
1681
	movzx	edx,byte [ebx]
1682
1683
 
1684
	add	ebx,TEX_X
1685
	and	ebx,TEXTURE_SIZE
1686
	add	ebx,.bmap
1687
	movzx	ebx,byte [ebx]
1688
	sub	edx,ebx
1689
;end if
1979 yogev_ezra 1690
1245 hidnplayr 1691
 
1692
     ;  edx - vertical   sub    modificated y coord
1693
if Ext=NON
1694
	mov	ebx,.cex       ;.cex - current env map X
1695
	shr	ebx,ROUND
1696
	add	eax,ebx
1697
1698
 
1699
 
1700
	shr	ebx,ROUND
1701
	add	edx,ebx
1702
1703
 
1704
	movq	mm1,mm5        ; mm5 - copy of cur env coords
1705
	psrld	mm1,ROUND
1706
	movd	ebx,mm1
1707
	psrlq	mm1,32
1708
	add	eax,ebx
1709
	movd	ebx,mm1
1710
	add	edx,ebx
1711
;        movq    qword[.temp1],mm3
1712
;        add     eax,dword [.temp1]
1713
;        add     edx,dword [.temp1+4]
1714
end if
1715
1716
 
1717
	jl	.black
1718
	cmp	eax,TEX_X
1719
	jg	.black
1720
	or	edx,edx
1721
	jl	.black
1722
	cmp	edx,TEX_Y
1723
	jg	.black
1724
1725
 
1726
	add	edx,eax 	; proponuje nie stawiac czarnego pixela tylko
1727
	lea	esi,[edx*3]	; niezaburzony.
1728
	add	esi,.emap	;
1729
	lodsd
1730
1731
 
1732
	mov	edx,.cty
1733
	shr	edx,ROUND  ; sar
1734
1735
 
1736
	shr	edi,ROUND  ; sar
1737
else
1738
	movq	mm1,mm7
1739
	psrld	mm1,ROUND
1740
	movd	edx,mm1
1741
	psrlq	mm1,32
1742
	movd	edi,mm1
1743
1744
 
1745
1746
 
1747
	add	edi,edx
1748
	and	edi,TEXTURE_SIZE
1749
	lea	esi,[edi*3]
1750
	add	esi,.tex_map
1751
1752
 
1753
	mov	edx,eax
1754
	lodsd
1755
	push	ax
1756
	mul	dl
1757
	mov	dl,ah
1758
	pop	ax
1759
	shr	ax,8
1760
	mul	dh
1761
	mov	al,dl
1762
	mov	edi,.c_scr
1763
	stosw
1764
	shr	edx,16
1765
	shr	eax,16
1766
	mul	dl
1767
	shr	ax,8
1768
	stosb
1769
else
1770
	movd	   mm0,eax
1771
	pxor	   mm1,mm1
1772
	punpcklbw  mm0,mm1
1773
	movd	   mm2,[esi]
1774
	punpcklbw  mm2,mm1
1775
	pmullw	   mm0,mm2
1776
	psrlw	   mm0,8
1777
	packuswb   mm0,mm1
1778
	mov	   edi,.c_scr
1779
	movd	   [edi],mm0
1780
1781
 
1782
1783
 
1784
     @@:
1785
     .black:
1786
	xor	eax,eax
1787
	mov	edi,.c_scr
1788
	stosd
1789
     .actual_zbuff:
1790
	mov	eax,.cz
1791
	mov	edi,.czbuff
1792
	stosd
1793
1794
 
1795
	add	dword .czbuff,4
1819 yogev_ezra 1796
	add	dword .c_scr,3
1797
1245 hidnplayr 1798
 
1799
	mov	eax,.dbx
1800
	add	.cbx,eax
1801
	mov	ebx,.dby
1802
	add	.cby,ebx
1803
1804
 
1805
	add	.cex,edx
1806
	mov	eax,.dey
1807
	add	.cey,eax
1808
1809
 
1810
	add	.ctx,ebx
1811
	mov	edx,.dty
1812
	add	.cty,edx
1813
1814
 
1815
	paddd	mm7,.dty
1819 yogev_ezra 1816
	paddd	mm6,.dby
1817
	paddd	mm5,.dey
1818
end if
1245 hidnplayr 1819
	mov	eax,.dz
1820
	add	.cz,eax
1821
1822
 
1823
	jnz	.draw
1824
1825
 
1826
	mov	esp,ebp
1827
ret 76
1828
;Ext = MMX
1829
1830
 
1831
;        movq    mm5, qword[.temp1]  ;-
1832
;        paddd   mm5, qword[.temp5]  ; .temp5 == low dword = TEX_X, high dword = -TEX_X
1833
;        pand    mm5, qword[.temp3]  ; .temp3 == low = high dword = TEX_SIZE
1834
;        paddd   mm5, qword[.temp4]  ; .temp4 == low = high dword = offset .bmap
1835
;        movd    ebx,mm5
1836
;        psrlq   mm5,32
1837
;     end if
1838