Subversion Repositories Kolibri OS

Rev

Rev 9512 | Go to most recent revision | Details | Last modification | View Log | RSS feed

Rev Author Line No. Line
9237 leency 1
; Ray casted shadows
2
; by Maciej Guba.
3
; http://macgub.co.pl
4
 
5
 
6
ROUND2 equ 10
7
ray_shad:
8
;--- Procedure render triangle with ray casted shadow ---
9
;--- effect. Calc intersection with all triangles in ----
10
;--- everypixel. Its not real time process, especially --
11
;--- when many triangles are computed. ------------------
12
;------in - eax - x1 shl 16 + y1 ------------------------
13
;---------- ebx - x2 shl 16 + y2 ------------------------
14
;---------- ecx - x3 shl 16 + y3 ------------------------
15
;---------- edx - ptr to fur coords struct --------------
16
;---------- esi - pointer to stencil / Z-buffer, filled -
17
;--------------   with dword float variables, it masks --
18
;--------------   'Z' position (coord) of every front ---
19
;--------------   pixel. --------------------------------
20
;---------- edi - pointer to screen buffer --------------
21
;---------- xmm0 - 1st normal vector --------------------
22
;---------- xmm1 - 2cond normal vector ------------------
23
;---------- xmm2 - 3rd normal vector --------------------
24
;---------- xmm3 - --------------------------------------
25
;---------- xmm4 - lo -> hi z1, z2, z3 coords -----------
26
;---------------   as dwords floats ---------------------
27
;---------- xmm5 - lo -> hi y_min, y_max, x_min, x_max --
28
;---------------   as dword integers --------------------
29
;-----------mm7  - current triangle index ---------------
30
;---------------------- stack - no parameters -----------
31
;--------------------------------------------------------
32
;----------------- procedure don't save registers !! ----
33
 
34
  push  ebp
35
  mov   ebp,esp
36
  sub   esp,1024
37
  sub   ebp,16
38
  and   ebp,0xfffffff0
39
 
40
  .1_nv equ [ebp-16]
41
  .2_nv equ [ebp-32]
42
  .3_nv equ [ebp-48]
43
  .l_v  equ [ebp-64]
44
  .z3   equ [ebp-72]
45
  .z2   equ [ebp-76]
46
  .z1   equ [ebp-80]
47
  .x1   equ [ebp-82]
48
  .y1   equ [ebp-84]
49
  .x2   equ [ebp-86]
50
  .y2   equ [ebp-88]
51
  .x3   equ [ebp-90]
52
  .y3   equ [ebp-92]
53
  .Zbuf equ [ebp-96]
54
  .x_max  equ [ebp-100]
55
  .x_min  equ [ebp-104]
56
  .y_max  equ [ebp-108]
57
  .y_min  equ [ebp-112]
58
  .screen equ [ebp-116]
59
  .dx12   equ [ebp-120]
60
  .dx13   equ [ebp-124]
61
  .dx23   equ [ebp-128]
62
  .dn12   equ [ebp-144]
63
  .dn13   equ [ebp-160]
64
  .dn23   equ [ebp-176]
65
  .dz12   equ [ebp-180]
66
  .dz13   equ [ebp-184]
67
  .dz23   equ [ebp-188]
68
  .cnv1   equ [ebp-208] ; current normal vectors
69
  .cnv2   equ [ebp-240]
70
  .cz2    equ [ebp-244]
71
  .cz1    equ [ebp-248]
72
  .tri_no equ [ebp-252]
73
 
74
 
75
 .sort3:                  ; sort triangle coordinates...
76
       cmp     ax,bx
77
       jle     .sort1
78
       xchg    eax,ebx
79
       shufps  xmm4,xmm4,11100001b
80
       movaps  xmm6,xmm0
81
       movaps  xmm0,xmm1
82
       movaps  xmm1,xmm6
83
 
84
 .sort1:
85
       cmp      bx,cx
86
       jle      .sort2
87
       xchg     ebx,ecx
88
       shufps   xmm4,xmm4,11011000b
89
       movaps   xmm6,xmm1
90
       movaps   xmm1,xmm2
91
       movaps   xmm2,xmm6
92
 
93
       jmp .sort3
94
 
95
 .sort2:
96
 
97
   movaps .z1,xmm4
98
   mov    .y1,eax
99
   mov    .y2,ebx
100
   mov    .y3,ecx
101
 
102
   movdqa   .y_min,xmm5
103
if 1                            ; check if at last only fragment
104
   packssdw xmm5,xmm5       ; of triangle is in visable area
105
   pshuflw  xmm5,xmm5,11011000b
106
   movdqu   xmm7,.y3
107
   movdqa   xmm6,xmm5
108
   pshufd   xmm5,xmm5,0  ; xmm5 lo-hi -> broadcasted y_min, x_min
109
   pshufd   xmm6,xmm6,01010101b ;xmm6 -> brd y_max x_max
110
   movdqa   xmm4,xmm7
111
   pcmpgtw  xmm7,xmm5
112
   pcmpgtw  xmm4,xmm6
113
   pxor     xmm7,xmm4
114
   pmovmskb eax,xmm7
115
   and      eax,0x00aaaaaa
116
   or       eax,eax
117
   jz       .rpt_loop2_end
118
end if
119
   movd     .tri_no,mm7
120
   movaps   .1_nv,xmm0
121
   movaps   .2_nv,xmm1
122
   movaps   .3_nv,xmm2
123
 ;  movaps   .l_v,xmm3
124
   mov      .Zbuf,esi
125
   mov      .screen,edi
126
 
127
 
128
 
129
       mov      bx,.y2       ; calc deltas
130
       sub      bx,.y1
131
       jnz      .rpt_dx12_make
132
 
133
       xorps    xmm7,xmm7
134
       mov      dword .dx12,0
135
       mov      dword .dz12,0
136
       movaps   .dn12,xmm7
137
       jmp      .rpt_dx12_done
138
 
139
  .rpt_dx12_make:
140
       mov      ax,.x2
141
       sub      ax,.x1
142
       cwde
143
       movsx    ebx,bx
144
       shl      eax,ROUND2
145
       cdq
146
       idiv     ebx
147
       mov      .dx12,eax
148
 
149
       cvtsi2ss xmm6,ebx
150
       movss    xmm5,.z2
151
       rcpss    xmm6,xmm6
152
       subss    xmm5,.z1
153
       mulss    xmm5,xmm6
154
       movss    .dz12,xmm5
155
 
156
       shufps   xmm6,xmm6,0
157
       movaps   xmm0,.2_nv
158
       subps    xmm0,.1_nv
159
       mulps    xmm0,xmm6
160
       movaps   .dn12,xmm0
161
;       subps    xmm3,xmm0
162
;       mulps    xmm3,xmm6
163
 
164
   .rpt_dx12_done:
165
       mov      bx,.y3       ; calc deltas
166
       sub      bx,.y1
167
       jnz      .rpt_dx13_make
168
 
169
       xorps    xmm7,xmm7
170
       mov      dword .dx13,0
171
       mov      dword .dz13,0
172
       movaps   .dn13,xmm7
173
       jmp      .rpt_dx13_done
174
 
175
  .rpt_dx13_make:
176
       mov      ax,.x3
177
       sub      ax,.x1
178
       cwde
179
       movsx    ebx,bx
180
       shl      eax,ROUND2
181
       cdq
182
       idiv     ebx
183
       mov      .dx13,eax
184
 
185
       cvtsi2ss xmm6,ebx
186
       movss    xmm5,.z3
187
       rcpss    xmm6,xmm6
188
       subss    xmm5,.z1
189
       mulss    xmm5,xmm6
190
       movss    .dz13,xmm5
191
 
192
       movaps   xmm0,.3_nv
193
       subps    xmm0,.1_nv
194
       shufps   xmm6,xmm6,0
195
       mulps    xmm0,xmm6
196
       movaps   .dn13,xmm0
197
 
198
 ;      mulps    xmm0,xmm6
199
 
200
  .rpt_dx13_done:
201
 
202
       mov      bx,.y3       ; calc deltas
203
       sub      bx,.y2
204
       jnz      .rpt_dx23_make
205
 
206
       xorps    xmm7,xmm7
207
       mov      dword .dx23,0
208
       mov      dword .dz23,0
209
       movaps   .dn23,xmm7
210
 
211
       jmp      .rpt_dx23_done
212
 
213
  .rpt_dx23_make:
214
       mov      ax,.x3
215
       sub      ax,.x2
216
       cwde
217
       movsx    ebx,bx
218
       shl      eax,ROUND2
219
       cdq
220
       idiv     ebx
221
       mov      .dx23,eax
222
 
223
       cvtsi2ss xmm6,ebx
224
       movss    xmm5,.z3
225
       rcpss    xmm6,xmm6
226
       subss    xmm5,.z2
227
       mulss    xmm5,xmm6
228
       movss    .dz23,xmm5
229
 
230
       movaps   xmm0,.3_nv
231
       subps    xmm0,.2_nv
232
       shufps   xmm6,xmm6,0
233
       mulps    xmm0,xmm6
234
       movaps   .dn23,xmm0
235
  ;     mulps    xmm0,xmm6
236
 
237
   .rpt_dx23_done:
238
 
239
       movsx   eax,word .x1
240
       shl     eax,ROUND2
241
       mov     ebx,eax
242
       mov     ecx,.z1
243
       mov     .cz1,ecx
244
       mov     .cz2,ecx
245
       movaps  xmm0,.1_nv
246
       movaps  .cnv1,xmm0
247
       movaps  .cnv2,xmm0
248
       mov      edi,.screen
249
       mov      esi,.Zbuf
250
       movsx    ecx,word .y1
251
       cmp      cx,.y2
252
 
253
       jge      .rpt_loop1_end
254
 
255
    .rpt_loop1:
256
       pushad
257
 
258
       movaps   xmm2,.y_min
259
       movaps   xmm0,.cnv1
260
       movaps   xmm1,.cnv2
261
       movlps   xmm3,.cz1
262
    ;   movaps   xmm4,.l_v
263
       sar      ebx,ROUND2
264
       sar      eax,ROUND2
265
       movd     mm7,.tri_no
266
 
267
       call     ray_shd_l
268
 
269
       popad
270
       movaps   xmm0,.cnv1
271
       movaps   xmm1,.cnv2
272
       ; fur x,y
273
       movss    xmm2,.cz1
274
       movss    xmm3,.cz2
275
       shufps   xmm4,xmm4,01001110b
276
       addps    xmm0,.dn13
277
       addps    xmm1,.dn12
278
       addss    xmm2,.dz13
279
       addss    xmm3,.dz12
280
 
281
 
282
       add      eax,.dx13
283
       add      ebx,.dx12
284
 
285
       shufps   xmm4,xmm4,01001110b
286
       movaps   .cnv1,xmm0
287
       movaps   .cnv2,xmm1
288
       movss    .cz1,xmm2
289
       movss    .cz2,xmm3
290
 
291
       add      ecx,1
292
       cmp      cx,.y2
293
       jl       .rpt_loop1
294
 
295
 
296
   .rpt_loop1_end:
297
       movsx    ecx,word .y2
298
       cmp      cx,.y3
299
       jge      .rpt_loop2_end
300
 
301
       movsx    ebx,word .x2               ; eax - cur x1
302
       shl      ebx,ROUND2                 ; ebx - cur x2
303
       push     dword .z2
304
       pop      dword .cz2
305
       movaps   xmm0,.2_nv
306
       movaps   .cnv2,xmm0
307
 
308
       mov      edi,.screen
309
       mov      esi,.Zbuf
310
 
311
 
312
     .rpt_loop2:
313
       pushad
314
       movaps   xmm2,.y_min
315
       movaps   xmm0,.cnv1
316
       movaps   xmm1,.cnv2
317
       movlps   xmm3,.cz1
318
   ;    movaps   xmm4,.l_v
319
       sar      ebx,ROUND2
320
       sar      eax,ROUND2
321
       movd     mm7,.tri_no
322
 
323
       call     ray_shd_l
324
 
325
       popad
326
       movaps   xmm0,.cnv1
327
       movaps   xmm1,.cnv2
328
       movss    xmm2,.cz1
329
       movss    xmm3,.cz2
330
 
331
       addps    xmm0,.dn13
332
       addps    xmm1,.dn23
333
       addss    xmm2,.dz13
334
       addss    xmm3,.dz23
335
       add      eax,.dx13
336
       add      ebx,.dx23
337
       addps    xmm4,xmm6
338
 
339
       movaps   .cnv1,xmm0
340
       movaps   .cnv2,xmm1
341
       movss    .cz1,xmm2
342
       movss    .cz2,xmm3
343
 
344
       add      ecx,1
345
       cmp      cx,.y3
346
       jl       .rpt_loop2
347
 
348
    .rpt_loop2_end:
349
 
350
      add   esp,1024
351
      pop   ebp
352
 
353
 
354
 
355
ret
356
align 16
357
ray_shd_l:
358
; in:
359
;    xmm0 - normal vector 1
360
;    xmm1 - normal vect 2
361
;    xmm3 - lo -> hi z1, z2 coords as dwords floats
362
;    xmm2 - lo -> hi y_min, y_max, x_min, x_max
363
;           as dword integers
364
;    xmm4 - ----
365
;    mm7  - current triangle index
366
;    eax  - x1
367
;    ebx  - x2
368
;    ecx  - y
369
;    edx  - -----
370
;    edi  - screen buffer
371
;    esi  - z buffer / stencil buffer filled with dd floats
372
 
373
   push  ebp
374
   mov   ebp,esp
375
   sub   esp,320
376
   sub   ebp,16
377
   and   ebp,0xfffffff0
378
 
379
 .n1  equ [ebp-16]
380
 .n2  equ [ebp-32]
381
 .lv  equ [ebp-48]
382
 .lx1 equ [ebp-52]
383
 .lx2 equ [ebp-56]
384
 .z2  equ [ebp-60]
385
 .z1  equ [ebp-64]
386
 .screen    equ [ebp-68]
387
 .zbuff     equ [ebp-72]
388
 .x_max     equ [ebp-74]
389
 .x_min     equ [ebp-76]
390
 .y_max     equ [ebp-78]
391
 .y_min     equ [ebp-80]
392
 .dn        equ [ebp-96]
393
 .dz        equ [ebp-100]
394
 .y         equ [ebp-104]
395
; .cur_tri   equ [ebp-108]
396
 .cnv       equ [ebp-128]
397
 .Rlen      equ [ebp-128-16]
398
 .r1        equ [ebp-128-32]
399
 .vect_t    equ [ebp-128-48]
400
 .cur_tri    equ [ebp-128-64]
401
; .p3t       equ [ebp-128-80]
402
 .nray      equ [ebp-128-96]
403
 .final_col equ [ebp-128-112]
404
 .aabb_mask equ dword[ebp-128-112-4]
405
 
406
        mov     .y,ecx
407
        movdqa   xmm4,xmm2
408
        packssdw xmm2,xmm2
409
        movq    .y_min,xmm2
410
        cmp     cx,.y_min
411
        jl      .end_rp_line
412
        cmp     cx,.y_max
413
        jge     .end_rp_line          ;
414
        cmp     eax,ebx
415
        je      .end_rp_line
416
        jl      @f
417
        xchg    eax,ebx
418
        movaps  xmm7,xmm0
419
        movaps  xmm0,xmm1
420
        movaps  xmm1,xmm7
421
        shufps  xmm3,xmm3,11100001b
422
    @@:
423
        movd    .cur_tri,mm7
424
        cmp     ax,.x_max
425
        jge     .end_rp_line
426
        cmp     bx,.x_min
427
        jle     .end_rp_line
428
     ;   movaps  .lv,xmm4
429
        andps    xmm0,[zero_hgst_dd]
430
        andps    xmm1,[zero_hgst_dd]
431
        movaps  .n1,xmm0
432
        movaps  .n2,xmm1
433
        mov     .lx1,eax
434
        mov     .lx2,ebx
435
        movlps  .z1,xmm3
436
 
437
        sub     ebx,eax
438
        cvtsi2ss xmm7,ebx
439
        rcpss   xmm7,xmm7
440
        shufps  xmm7,xmm7,0
441
        subps   xmm1,xmm0
442
        mulps   xmm1,xmm7
443
        movaps  .dn,xmm1
444
        shufps  xmm3,xmm3,11111001b
445
        subss   xmm3,.z1
446
        mulss   xmm3,xmm7
447
        movss   .dz,xmm3
448
 
449
        subps   xmm6,xmm5
450
        mulps   xmm6,xmm7
451
 
452
        mov      ebx,.lx1
453
        cmp      bx,.x_min     ; clipping on function4
454
        jge      @f
455
        movzx    eax,word .x_min
456
        sub      eax,ebx
457
        cvtsi2ss xmm7,eax
458
        shufps   xmm7,xmm7,0
459
        mulss    xmm3,xmm7
460
        mulps    xmm1,xmm7
461
        mulps    xmm6,xmm7
462
        addss    xmm3,.z1
463
        addps    xmm1,.n1
464
        addps    xmm6,xmm5
465
        movsx    eax,word .x_min
466
        movss    .z1,xmm3
467
        movaps   .n1,xmm1
468
        mov      dword .lx1,eax
469
      @@:
470
 
471
        movzx   eax,word .x_max
472
        cmp     .lx2,eax
473
        jl      @f
474
        mov     .lx2,eax
475
      @@:
476
        movzx   eax,word[xres_var]
477
        mul     dword .y
478
        add     eax,.lx1
479
        mov     .zbuff,esi
480
        mov     .screen,edi
481
        shl     eax,2
482
        add     edi,eax
483
        add     esi,eax
484
        mov     ecx,.lx2
485
        sub     ecx,.lx1
486
 
487
        movd       xmm0,[vect_x]
488
        punpcklwd  xmm0,[the_zero]
489
        cvtdq2ps   xmm0,xmm0
490
        movaps     .vect_t,xmm0
491
 
492
 
493
   .ddraw:
494
 
495
        xorps    xmm0,xmm0
496
        movss    xmm2,.z1
497
        movss    xmm5,.z1
498
        movaps   .final_col,xmm0
499
        addss    xmm2,[f1]
500
        subss    xmm5,[f1]
501
        cmpnltss xmm2,dword[esi]
502
        cmpnltss xmm5,dword[esi]
503
        pxor     xmm2,xmm5
504
        movd     eax,xmm2
505
        or       eax,eax
506
        jz       .skips
507
 
508
        movaps   xmm7,.n1
509
        andps    xmm7,[zero_hgst_dd]
510
        mulps    xmm7,xmm7 ; normalize
511
        haddps   xmm7,xmm7
512
        haddps   xmm7,xmm7
513
        rsqrtps  xmm7,xmm7
514
        mulps    xmm7,.n1
515
        movaps   .cnv,xmm7
516
        mov      ebx,point_light_coords
517
        mov      edx,lights_aligned
518
        xor      eax,eax
519
  .nx_light:
520
   pushad
521
   cvtsi2ss xmm0,.lx1
522
   cvtsi2ss xmm1,.y
523
   movss    xmm2,.z1
524
   movlhps  xmm0,xmm1
525
   shufps   xmm0,xmm2,11001000b
526
   subps    xmm0,[ebx] ; xmm0 - ray end, -> current vertex
527
   movaps   xmm3,[ebx]
528
   andps    xmm0,[zero_hgst_dd]
529
   movaps   xmm1,xmm0
530
   mulps    xmm0,xmm0
531
   haddps   xmm0,xmm0
532
   haddps   xmm0,xmm0
533
   sqrtps   xmm0,xmm0
534
   movss    .Rlen,xmm0
535
   rcpps    xmm0,xmm0
536
   mulps    xmm0,xmm1    ; xmm0 - normalized ray vector
537
   andps    xmm0,[zero_hgst_dd]
538
   movaps   .nray,xmm0
539
   movaps   .r1,xmm3   ; ray orgin
540
 if 0
541
   movaps   xmm1,xmm3
542
   call     calc_bounding_box
543
 
544
   mov      .aabb_mask,eax
545
end if
546
   mov      edi,[triangles_ptr]
547
   xor      ecx,ecx
548
 .nx_tri:  ; next triangle
549
 
550
   cmp     ecx,.cur_tri ; prevent self shadowing
551
   je      .skipp
552
 if 0
553
   mov     edi,ecx
554
   imul    edi,[i12]
555
   add     edi,[triangles_ptr]
556
   mov     eax,[edi]
557
   mov     ebx,[edi+4]
558
   mov     edx,[edi+8]
559
   imul    eax,[i12]
560
   imul    ebx,[i12]
561
   imul    edx,[i12]
562
   add     eax,[points_ptr]
563
   add     ebx,[points_ptr]
564
   add     edx,[points_ptr]
565
   movups   xmm2,[eax]
566
   movups   xmm3,[ebx]
567
   movups   xmm4,[edx]
568
   andps    xmm2,[sign_mask]
569
   andps    xmm3,[sign_mask]
570
   andps    xmm4,[sign_mask]
571
   movmskps ebx,xmm4
572
   cmpeqps  xmm2,xmm3
573
   cmpeqps  xmm3,xmm4
574
   andps    xmm2,xmm3
575
   movmskps eax,xmm2
576
   and      eax,111b
577
   and      ebx,111b
578
   cmp      eax,111b
579
   jne      @f
580
   bt       .aabb_mask,ebx
581
   jnc      .skipp
582
  @@:
583
end if
584
   mov     edi,ecx
585
   imul    edi,[i12]
586
   add     edi,[triangles_ptr]
587
   mov     eax,[edi]
588
   mov     ebx,[edi+4]
589
   mov     edx,[edi+8]
590
   imul    eax,[i12]
591
   imul    ebx,[i12]
592
   imul    edx,[i12]
593
   add     eax,[points_rotated_ptr]
594
   add     ebx,[points_rotated_ptr]
595
   add     edx,[points_rotated_ptr]
596
   movups   xmm2,[eax]
597
   movups   xmm3,[ebx]
598
   movups   xmm4,[edx]
599
   addps    xmm2,.vect_t
600
   addps    xmm3,.vect_t
601
   addps    xmm4,.vect_t
602
 
603
 
604
;intersect_tri: procs header
605
; in:
606
;     xmm0 - ray direction  ; should be normalized
607
;     xmm1 - ray orgin
608
;     xmm2 - tri vert1
609
;     xmm3 - tri vert2
610
;     xmm4 - tri vert3
611
;     if  eax = 1 - intersction with edge
612
;        xmm6 - edge lenght
613
;     if  eax = 0 - intersect with ray (classic)
614
; out:
615
;     eax  = 1 - intersection occured
616
;     xmm0 - float lo -> hi = t, v, u, ...
617
 
618
   movss     xmm6,.Rlen
619
   movaps    xmm0,.nray
620
   movaps    xmm1,.r1
621
   subss     xmm6,[the_one]
622
   mov       eax,1
623
   push      ecx
624
   call      intersect_tri
625
   pop       ecx
626
   cmp       eax,1
627
   je        .inter
628
 .skipp:
629
 .skp:
630
   inc       ecx
631
   cmp       ecx,[triangles_count_var]
632
   jnz       .nx_tri
633
;   jz        .do_process
634
;   comiss  xmm0,.Rlen
635
;   jl      .inter
636
 
637
   popad
638
 .do_process:
639
        movaps    xmm5,.nray  ;[edx]
640
        andps     xmm5,[zero_hgst_dd]  ; global
641
        mulps    xmm5,.cnv  ;.lv   ; last dword should be zeroed
642
 ;       andps     xmm5,[sign_z]   ; global
643
        haddps   xmm5,xmm5
644
        haddps   xmm5,xmm5
645
        andps     xmm5,[abs_mask]  ; global
646
        movaps   xmm7,xmm5
647
        mulps    xmm7,xmm7
648
        mulps    xmm7,xmm7
649
        mulps    xmm5,[edx+16]
650
        mulps    xmm7,xmm7
651
        mulps    xmm7,xmm7
652
        mulps    xmm7,[edx+48]
653
        addps    xmm5,xmm7
654
        minps    xmm5,[mask_255f]  ; global
655
        maxps    xmm5,.final_col     ;  addps  maxps
656
        movaps   .final_col,xmm5
657
        jmp     .nx_loop
658
  .inter:
659
 
660
        popad
661
      .nx_loop:
662
      ;  add      edx,64    ; unncomment to achive 3 lights
663
      ;  add      ebx,16
664
      ;  cmp      edx,lights_aligned_end    ; global
665
      ;  jnz      .nx_light
666
 
667
        movaps    xmm1,.final_col
668
        cvtps2dq  xmm1,xmm1
669
        packssdw  xmm1,xmm1
670
        packuswb  xmm1,xmm1
671
        movd      [edi],xmm1
672
  .skips:
673
        movaps   xmm0,.n1
674
        movss    xmm2,.z1
675
        add      edi,4
676
        add      esi,4
677
        add      dword .lx1,1
678
        addps    xmm0,.dn
679
        addss    xmm2,.dz
680
        movaps   .n1,xmm0
681
        movss    .z1,xmm2
682
        dec      ecx
683
        jnz      .ddraw
684
  .end_rp_line:
685
        add      esp,320
686
        pop      ebp
687
 
688
ret