Subversion Repositories Kolibri OS

Rev

Rev 9237 | Details | Compare with Previous | Last modification | View Log | RSS feed

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