1;
2; d_polysa3.asm -- for MASM
3; x86 assembly-language polygon model drawing code
4; with translucency handling, #2.
5;
6; Copyright (C) 1996-1997  Id Software, Inc.
7; Copyright (C) 1997-1998  Raven Software Corp.
8;
9; This program is free software; you can redistribute it and/or
10; modify it under the terms of the GNU General Public License
11; as published by the Free Software Foundation; either version 2
12; of the License, or (at your option) any later version.
13;
14; This program is distributed in the hope that it will be useful,
15; but WITHOUT ANY WARRANTY; without even the implied warranty of
16; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
17;
18; See the GNU General Public License for more details.
19;
20; You should have received a copy of the GNU General Public License
21; along with this program; if not, write to:
22; Free Software Foundation, Inc.
23; 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA
24;
25
26 .386P
27 .model FLAT
28; externs from C code
29 externdef _d_viewbuffer:dword
30 externdef _d_scantable:dword
31 externdef _r_refdef:dword
32 externdef _a_sstepxfrac:dword
33 externdef _r_affinetridesc:dword
34 externdef _acolormap:dword
35 externdef _d_pcolormap:dword
36 externdef _d_sfrac:dword
37 externdef _d_ptex:dword
38 externdef _d_pedgespanpackage:dword
39 externdef _d_tfrac:dword
40 externdef _d_light:dword
41 externdef _d_zi:dword
42 externdef _d_pdest:dword
43 externdef _d_pz:dword
44 externdef _d_aspancount:dword
45 externdef _erroradjustup:dword
46 externdef _erroradjustdown:dword
47 externdef _errorterm:dword
48 externdef _d_xdenom:dword
49 externdef _r_p0:dword
50 externdef _r_p1:dword
51 externdef _r_p2:dword
52 externdef _a_tstepxfrac:dword
53 externdef _a_ststepxwhole:dword
54 externdef _zspantable:dword
55 externdef _skintable:dword
56 externdef _d_countextrastep:dword
57 externdef _ubasestep:dword
58 externdef _a_spans:dword
59 externdef _d_pdestextrastep:dword
60 externdef _d_pzextrastep:dword
61 externdef _d_sfracextrastep:dword
62 externdef _d_ptexextrastep:dword
63 externdef _d_tfracextrastep:dword
64 externdef _d_lightextrastep:dword
65 externdef _d_ziextrastep:dword
66 externdef _d_pdestbasestep:dword
67 externdef _d_pzbasestep:dword
68 externdef _d_sfracbasestep:dword
69 externdef _d_ptexbasestep:dword
70 externdef _d_tfracbasestep:dword
71 externdef _d_lightbasestep:dword
72 externdef _d_zibasestep:dword
73 externdef _r_lstepx:dword
74 externdef _r_lstepy:dword
75 externdef _r_sstepx:dword
76 externdef _r_sstepy:dword
77 externdef _r_tstepx:dword
78 externdef _r_tstepy:dword
79 externdef _r_zistepx:dword
80 externdef _r_zistepy:dword
81 externdef _mainTransTable:dword
82 externdef _D_PolysetSetEdgeTable:dword
83 externdef _D_RasterizeAliasPolySmooth:dword
84
85; externs from ASM-only code
86 externdef float_point5:dword
87 externdef float_1:dword
88 externdef float_minus_1:dword
89 externdef float_0:dword
90 externdef advancetable:dword
91 externdef sstep:dword
92 externdef tstep:dword
93 externdef ceil_cw:dword
94 externdef single_cw:dword
95
96_DATA SEGMENT
97 align 4
98p10_minus_p20 dd 0
99p01_minus_p21 dd 0
100temp0 dd 0
101temp1 dd 0
102Ltemp dd 0
103aff8entryvec_table dd LDraw8, LDraw7, LDraw6, LDraw5
104 dd LDraw4, LDraw3, LDraw2, LDraw1
105lzistepx dd 0
106_DATA ENDS
107_TEXT SEGMENT
108 externdef _D_PolysetSetEdgeTable:dword
109 externdef _D_RasterizeAliasPolySmooth:dword
110 public _D_PolysetAff8StartT2
111_D_PolysetAff8StartT2:
112 public _D_PolysetCalcGradientsT2
113_D_PolysetCalcGradientsT2:
114 fild ds:dword ptr[_r_p0+0]
115 fild ds:dword ptr[_r_p2+0]
116 fild ds:dword ptr[_r_p0+4]
117 fild ds:dword ptr[_r_p2+4]
118 fild ds:dword ptr[_r_p1+0]
119 fild ds:dword ptr[_r_p1+4]
120 fxch st(3)
121 fsub st(0),st(2)
122 fxch st(1)
123 fsub st(0),st(4)
124 fxch st(5)
125 fsubrp st(4),st(0)
126 fxch st(2)
127 fsubrp st(1),st(0)
128 fxch st(1)
129 fld ds:dword ptr[_d_xdenom]
130 fxch st(4)
131 fstp ds:dword ptr[p10_minus_p20]
132 fstp ds:dword ptr[p01_minus_p21]
133 fxch st(2)
134 fild ds:dword ptr[_r_p2+16]
135 fild ds:dword ptr[_r_p0+16]
136 fild ds:dword ptr[_r_p1+16]
137 fxch st(2)
138 fld st(0)
139 fsubp st(2),st(0)
140 fsubp st(2),st(0)
141 fld st(0)
142 fmul st(0),st(5)
143 fxch st(2)
144 fld st(0)
145 fmul ds:dword ptr[p01_minus_p21]
146 fxch st(2)
147 fmul ds:dword ptr[p10_minus_p20]
148 fxch st(1)
149 fmul st(0),st(5)
150 fxch st(2)
151 fsubrp st(3),st(0)
152 fsubp st(1),st(0)
153 fld st(2)
154 fmul ds:dword ptr[float_minus_1]
155 fxch st(2)
156 fmul st(0),st(3)
157 fxch st(1)
158 fmul st(0),st(2)
159 fldcw ds:word ptr[ceil_cw]
160 fistp ds:dword ptr[_r_lstepy]
161 fistp ds:dword ptr[_r_lstepx]
162 fldcw ds:word ptr[single_cw]
163 fild ds:dword ptr[_r_p2+8]
164 fild ds:dword ptr[_r_p0+8]
165 fild ds:dword ptr[_r_p1+8]
166 fxch st(2)
167 fld st(0)
168 fsubp st(2),st(0)
169 fsubp st(2),st(0)
170 fld st(0)
171 fmul st(0),st(6)
172 fxch st(2)
173 fld st(0)
174 fmul ds:dword ptr[p01_minus_p21]
175 fxch st(2)
176 fmul ds:dword ptr[p10_minus_p20]
177 fxch st(1)
178 fmul st(0),st(6)
179 fxch st(2)
180 fsubrp st(3),st(0)
181 fsubp st(1),st(0)
182 fmul st(0),st(2)
183 fxch st(1)
184 fmul st(0),st(3)
185 fxch st(1)
186 fistp ds:dword ptr[_r_sstepy]
187 fistp ds:dword ptr[_r_sstepx]
188 fild ds:dword ptr[_r_p2+12]
189 fild ds:dword ptr[_r_p0+12]
190 fild ds:dword ptr[_r_p1+12]
191 fxch st(2)
192 fld st(0)
193 fsubp st(2),st(0)
194 fsubp st(2),st(0)
195 fld st(0)
196 fmul st(0),st(6)
197 fxch st(2)
198 fld st(0)
199 fmul ds:dword ptr[p01_minus_p21]
200 fxch st(2)
201 fmul ds:dword ptr[p10_minus_p20]
202 fxch st(1)
203 fmul st(0),st(6)
204 fxch st(2)
205 fsubrp st(3),st(0)
206 fsubp st(1),st(0)
207 fmul st(0),st(2)
208 fxch st(1)
209 fmul st(0),st(3)
210 fxch st(1)
211 fistp ds:dword ptr[_r_tstepy]
212 fistp ds:dword ptr[_r_tstepx]
213 fild ds:dword ptr[_r_p2+20]
214 fild ds:dword ptr[_r_p0+20]
215 fild ds:dword ptr[_r_p1+20]
216 fxch st(2)
217 fld st(0)
218 fsubp st(2),st(0)
219 fsubp st(2),st(0)
220 fld st(0)
221 fmulp st(6),st(0)
222 fxch st(1)
223 fld st(0)
224 fmul ds:dword ptr[p01_minus_p21]
225 fxch st(2)
226 fmul ds:dword ptr[p10_minus_p20]
227 fxch st(1)
228 fmulp st(5),st(0)
229 fxch st(5)
230 fsubp st(1),st(0)
231 fxch st(3)
232 fsubrp st(4),st(0)
233 fxch st(1)
234 fmulp st(2),st(0)
235 fmulp st(2),st(0)
236 fistp ds:dword ptr[_r_zistepx]
237 fistp ds:dword ptr[_r_zistepy]
238 mov eax,ds:dword ptr[_r_sstepx]
239 mov edx,ds:dword ptr[_r_tstepx]
240 shl eax,16
241 shl edx,16
242 mov ds:dword ptr[_a_sstepxfrac],eax
243 mov ds:dword ptr[_a_tstepxfrac],edx
244 mov ecx,ds:dword ptr[_r_sstepx]
245 mov eax,ds:dword ptr[_r_tstepx]
246 sar ecx,16
247 sar eax,16
248 imul ds:dword ptr[4+0+esp]
249 add eax,ecx
250 mov ds:dword ptr[_a_ststepxwhole],eax
251 ret
252 public _D_PolysetRecursiveTriangleT2
253_D_PolysetRecursiveTriangleT2:
254 push ebp
255 push esi
256 push edi
257 push ebx
258 mov esi,ds:dword ptr[8+16+esp]
259 mov ebx,ds:dword ptr[4+16+esp]
260 mov edi,ds:dword ptr[12+16+esp]
261 mov eax,ds:dword ptr[0+esi]
262 mov edx,ds:dword ptr[0+ebx]
263 mov ebp,ds:dword ptr[4+esi]
264 sub eax,edx
265 mov ecx,ds:dword ptr[4+ebx]
266 sub ebp,ecx
267 inc eax
268 cmp eax,2
269 ja LSplit
270 mov eax,ds:dword ptr[0+edi]
271 inc ebp
272 cmp ebp,2
273 ja LSplit
274 mov edx,ds:dword ptr[0+esi]
275 mov ebp,ds:dword ptr[4+edi]
276 sub eax,edx
277 mov ecx,ds:dword ptr[4+esi]
278 sub ebp,ecx
279 inc eax
280 cmp eax,2
281 ja LSplit2
282 mov eax,ds:dword ptr[0+ebx]
283 inc ebp
284 cmp ebp,2
285 ja LSplit2
286 mov edx,ds:dword ptr[0+edi]
287 mov ebp,ds:dword ptr[4+ebx]
288 sub eax,edx
289 mov ecx,ds:dword ptr[4+edi]
290 sub ebp,ecx
291 inc eax
292 inc ebp
293 mov edx,ebx
294 cmp eax,2
295 ja LSplit3
296 cmp ebp,2
297 jna LDone
298LSplit3:
299 mov ebx,edi
300 mov edi,esi
301 mov esi,edx
302 jmp LSplit
303LSplit2:
304 mov eax,ebx
305 mov ebx,esi
306 mov esi,edi
307 mov edi,eax
308LSplit:
309 sub esp,24
310 mov eax,ds:dword ptr[8+ebx]
311 mov edx,ds:dword ptr[8+esi]
312 mov ecx,ds:dword ptr[12+ebx]
313 add eax,edx
314 mov edx,ds:dword ptr[12+esi]
315 sar eax,1
316 add ecx,edx
317 mov ds:dword ptr[8+esp],eax
318 mov eax,ds:dword ptr[20+ebx]
319 sar ecx,1
320 mov edx,ds:dword ptr[20+esi]
321 mov ds:dword ptr[12+esp],ecx
322 add eax,edx
323 mov ecx,ds:dword ptr[0+ebx]
324 mov edx,ds:dword ptr[0+esi]
325 sar eax,1
326 add edx,ecx
327 mov ds:dword ptr[20+esp],eax
328 mov eax,ds:dword ptr[4+ebx]
329 sar edx,1
330 mov ebp,ds:dword ptr[4+esi]
331 mov ds:dword ptr[0+esp],edx
332 add ebp,eax
333 sar ebp,1
334 mov ds:dword ptr[4+esp],ebp
335 cmp ds:dword ptr[4+esi],eax
336 jg LNoDraw
337 mov edx,ds:dword ptr[0+esi]
338 jnz LDraw
339 cmp edx,ecx
340 jl LNoDraw
341LDraw:
342 mov edx,ds:dword ptr[20+esp]
343 mov ecx,ds:dword ptr[4+esp]
344 sar edx,16
345 mov ebp,ds:dword ptr[0+esp]
346 mov eax,ds:dword ptr[_zspantable+ecx*4]
347 cmp dx,ds:word ptr[eax+ebp*2]
348 jnge LNoDraw
349 mov ds:word ptr[eax+ebp*2],dx
350 mov eax,ds:dword ptr[12+esp]
351 sar eax,16
352 mov edx,ds:dword ptr[8+esp]
353 sar edx,16
354 sub ecx,ecx
355 mov eax,ds:dword ptr[_skintable+eax*4]
356 mov ebp,ds:dword ptr[4+esp]
357 mov cl,ds:byte ptr[eax+edx]  ; texture pixel
358 or cl,cl
359 jz Skip1B  ; color 0 = no draw
360 mov edx,ds:dword ptr[_d_pcolormap]
361 mov dh,ds:byte ptr[edx+ecx]
362 mov eax,ds:dword ptr[0+esp]
363 add eax,ds:dword ptr[_d_scantable+ebp*4]
364 add eax,ds:dword ptr[_d_viewbuffer]
365 bt cx,0
366 jnc Skip1
367
368; trans stuff
369 mov dl,ds:byte ptr[eax]
370 and edx, 0ffffh
371 mov dh,ds:byte ptr[12345678h + edx]
372TranPatch1:
373
374Skip1:
375 mov ds:byte ptr[eax],dh
376; rjr   distance
377;  mov ds:byte ptr[eax],0
378
379
380Skip1B:
381LNoDraw:
382 push esp
383 push ebx
384 push edi
385 call near ptr _D_PolysetRecursiveTriangleT2
386 mov ebx,esp
387 push esi
388 push ebx
389 push edi
390 call near ptr _D_PolysetRecursiveTriangleT2
391 add esp,24
392LDone:
393 pop ebx
394 pop edi
395 pop esi
396 pop ebp
397 ret 12
398 public _D_PolysetDrawSpans8T2
399_D_PolysetDrawSpans8T2:
400 push esi
401 push ebx
402 mov esi,ds:dword ptr[4+8+esp]
403 mov ecx,ds:dword ptr[_r_zistepx]
404 push ebp
405 push edi
406 ror ecx,16
407 mov edx,ds:dword ptr[8+esi]
408 mov ds:dword ptr[lzistepx],ecx
409LSpanLoop:
410 mov eax,ds:dword ptr[_d_aspancount]
411 sub eax,edx
412 mov edx,ds:dword ptr[_erroradjustup]
413 mov ebx,ds:dword ptr[_errorterm]
414 add ebx,edx
415 js LNoTurnover
416 mov edx,ds:dword ptr[_erroradjustdown]
417 mov edi,ds:dword ptr[_d_countextrastep]
418 sub ebx,edx
419 mov ebp,ds:dword ptr[_d_aspancount]
420 mov ds:dword ptr[_errorterm],ebx
421 add ebp,edi
422 mov ds:dword ptr[_d_aspancount],ebp
423 jmp LRightEdgeStepped
424LNoTurnover:
425 mov edi,ds:dword ptr[_d_aspancount]
426 mov edx,ds:dword ptr[_ubasestep]
427 mov ds:dword ptr[_errorterm],ebx
428 add edi,edx
429 mov ds:dword ptr[_d_aspancount],edi
430LRightEdgeStepped:
431 cmp eax,1
432 jl LNextSpan
433 jz LExactlyOneLong
434 mov ecx,ds:dword ptr[_a_ststepxwhole]
435 mov edx,ds:dword ptr[_r_affinetridesc+8]
436 mov ds:dword ptr[advancetable+4],ecx
437 add ecx,edx
438 mov ds:dword ptr[advancetable],ecx
439 mov ecx,ds:dword ptr[_a_tstepxfrac]
440 mov cx,ds:word ptr[_r_lstepx]
441 mov edx,eax
442 mov ds:dword ptr[tstep],ecx
443 add edx,7
444 shr edx,3
445 mov ebx,ds:dword ptr[16+esi]
446 mov bx,dx
447 mov ecx,ds:dword ptr[4+esi]
448 neg eax
449 mov edi,ds:dword ptr[0+esi]
450 and eax,7
451 sub edi,eax
452 sub ecx,eax
453 sub ecx,eax
454 mov edx,ds:dword ptr[20+esi]
455 mov dx,ds:word ptr[24+esi]
456 mov ebp,ds:dword ptr[28+esi]
457 ror ebp,16
458 push esi
459 mov esi,ds:dword ptr[12+esi]
460 jmp dword ptr[aff8entryvec_table+eax*4]
461LDrawLoop:
462LDraw8:
463 cmp bp,ds:word ptr[ecx]
464 jl Lp1
465 xor eax,eax
466 mov ah,dh  ; light
467 mov al,ds:byte ptr[esi]   ; texture pixel
468 or al,al
469 jz SkipA2  ; color 0 = no draw
470 mov ds:word ptr[ecx],bp
471 mov ah,ds:byte ptr[12345678h+eax]
472LPatch8:
473 bt ax,0
474 jnc SkipA
475
476; trans stuff
477 mov al,ds:byte ptr[edi]
478 mov ah,ds:byte ptr[12345678h + eax]
479TranPatch2:
480
481SkipA:
482 mov ds:byte ptr[edi],ah
483 ; rj
484 ;mov ds:byte ptr[edi],0
485SkipA2:
486
487
488Lp1:
489 add edx,ds:dword ptr[tstep]
490 sbb eax,eax
491 add ebp,ds:dword ptr[lzistepx]
492 adc ebp,0
493 add ebx,ds:dword ptr[_a_sstepxfrac]
494 adc esi,ds:dword ptr[advancetable+4+eax*4]
495LDraw7:
496 cmp bp,ds:word ptr[2+ecx]
497 jl Lp2
498 xor eax,eax
499 mov ah,dh
500 mov al,ds:byte ptr[esi] ; texture pixel
501 or al,al
502 jz SkipB2  ; color 0 = no draw
503 mov ds:word ptr[2+ecx],bp
504 mov ah,ds:byte ptr[12345678h+eax]
505LPatch7:
506 bt ax,0
507 jnc SkipB
508
509; trans stuff
510 mov al,ds:byte ptr[edi+1]
511 mov ah,ds:byte ptr[12345678h + eax]
512TranPatch3:
513
514SkipB:
515 mov ds:byte ptr[1+edi],ah
516 ; rj
517 ;mov ds:byte ptr[1+edi],0
518SkipB2:
519
520
521Lp2:
522 add edx,ds:dword ptr[tstep]
523 sbb eax,eax
524 add ebp,ds:dword ptr[lzistepx]
525 adc ebp,0
526 add ebx,ds:dword ptr[_a_sstepxfrac]
527 adc esi,ds:dword ptr[advancetable+4+eax*4]
528LDraw6:
529 cmp bp,ds:word ptr[4+ecx]
530 jl Lp3
531 xor eax,eax
532 mov ah,dh
533 mov al,ds:byte ptr[esi] ; texture pixel
534 or al,al
535 jz SkipC2  ; color 0 = no draw
536 mov ds:word ptr[4+ecx],bp
537 mov ah,ds:byte ptr[12345678h+eax]
538LPatch6:
539 bt ax,0
540 jnc SkipC
541
542; trans stuff
543 mov al,ds:byte ptr[edi+2]
544 mov ah,ds:byte ptr[12345678h + eax]
545TranPatch4:
546
547SkipC:
548 mov ds:byte ptr[2+edi],ah
549 ; rj
550 ;mov ds:byte ptr[2+edi],0
551SkipC2:
552
553Lp3:
554 add edx,ds:dword ptr[tstep]
555 sbb eax,eax
556 add ebp,ds:dword ptr[lzistepx]
557 adc ebp,0
558 add ebx,ds:dword ptr[_a_sstepxfrac]
559 adc esi,ds:dword ptr[advancetable+4+eax*4]
560LDraw5:
561 cmp bp,ds:word ptr[6+ecx]
562 jl Lp4
563 xor eax,eax
564 mov ah,dh
565 mov al,ds:byte ptr[esi] ; texture pixel
566 or al,al
567 jz SkipD2  ; color 0 = no draw
568 mov ds:word ptr[6+ecx],bp
569 mov ah,ds:byte ptr[12345678h+eax]
570LPatch5:
571 bt ax,0
572 jnc SkipD
573
574; trans stuff
575 mov al,ds:byte ptr[edi+3]
576 mov ah,ds:byte ptr[12345678h + eax]
577TranPatch5:
578
579SkipD:
580 mov ds:byte ptr[3+edi],ah
581 ; rj
582 ;mov ds:byte ptr[3+edi],0
583SkipD2:
584
585Lp4:
586 add edx,ds:dword ptr[tstep]
587 sbb eax,eax
588 add ebp,ds:dword ptr[lzistepx]
589 adc ebp,0
590 add ebx,ds:dword ptr[_a_sstepxfrac]
591 adc esi,ds:dword ptr[advancetable+4+eax*4]
592LDraw4:
593 cmp bp,ds:word ptr[8+ecx]
594 jl Lp5
595 xor eax,eax
596 mov ah,dh
597 mov al,ds:byte ptr[esi] ; texture pixel
598 or al,al
599 jz SkipE2  ; color 0 = no draw
600 mov ds:word ptr[8+ecx],bp
601 mov ah,ds:byte ptr[12345678h+eax]
602LPatch4:
603 bt ax,0
604 jnc SkipE
605
606; trans stuff
607 mov al,ds:byte ptr[edi+4]
608 mov ah,ds:byte ptr[12345678h + eax]
609TranPatch6:
610
611SkipE:
612 mov ds:byte ptr[4+edi],ah
613 ; rj
614 ;mov ds:byte ptr[4+edi],0
615SkipE2:
616
617Lp5:
618 add edx,ds:dword ptr[tstep]
619 sbb eax,eax
620 add ebp,ds:dword ptr[lzistepx]
621 adc ebp,0
622 add ebx,ds:dword ptr[_a_sstepxfrac]
623 adc esi,ds:dword ptr[advancetable+4+eax*4]
624LDraw3:
625 cmp bp,ds:word ptr[10+ecx]
626 jl Lp6
627 xor eax,eax
628 mov ah,dh
629 mov al,ds:byte ptr[esi] ; texture pixel
630 or al,al
631 jz SkipF2  ; color 0 = no draw
632 mov ds:word ptr[10+ecx],bp
633 mov ah,ds:byte ptr[12345678h+eax]
634LPatch3:
635 bt ax,0
636 jnc SkipF
637
638; trans stuff
639 mov al,ds:byte ptr[edi+5]
640 mov ah,ds:byte ptr[12345678h + eax]
641TranPatch7:
642
643SkipF:
644 mov ds:byte ptr[5+edi],ah
645 ; rj
646 ;mov ds:byte ptr[5+edi],0
647SkipF2:
648
649Lp6:
650 add edx,ds:dword ptr[tstep]
651 sbb eax,eax
652 add ebp,ds:dword ptr[lzistepx]
653 adc ebp,0
654 add ebx,ds:dword ptr[_a_sstepxfrac]
655 adc esi,ds:dword ptr[advancetable+4+eax*4]
656LDraw2:
657 cmp bp,ds:word ptr[12+ecx]
658 jl Lp7
659 xor eax,eax
660 mov ah,dh
661 mov al,ds:byte ptr[esi] ; texture pixel
662 or al,al
663 jz SkipG2  ; color 0 = no draw
664 mov ds:word ptr[12+ecx],bp
665 mov ah,ds:byte ptr[12345678h+eax]
666LPatch2:
667 bt ax,0
668 jnc SkipG
669
670; trans stuff
671 mov al,ds:byte ptr[edi+6]
672 mov ah,ds:byte ptr[12345678h + eax]
673TranPatch8:
674
675SkipG:
676 mov ds:byte ptr[6+edi],ah
677 ; rj
678 ;mov ds:byte ptr[6+edi],0
679SkipG2:
680
681Lp7:
682 add edx,ds:dword ptr[tstep]
683 sbb eax,eax
684 add ebp,ds:dword ptr[lzistepx]
685 adc ebp,0
686 add ebx,ds:dword ptr[_a_sstepxfrac]
687 adc esi,ds:dword ptr[advancetable+4+eax*4]
688LDraw1:
689 cmp bp,ds:word ptr[14+ecx]
690 jl Lp8
691 xor eax,eax
692 mov ah,dh
693 mov al,ds:byte ptr[esi] ; texture pixel
694 or al,al
695 jz SkipH2  ; color 0 = no draw
696 mov ds:word ptr[14+ecx],bp
697 mov ah,ds:byte ptr[12345678h+eax]
698LPatch1:
699 bt ax,0
700 jnc SkipH
701
702; trans stuff
703 mov al,ds:byte ptr[edi+7]
704 mov ah,ds:byte ptr[12345678h + eax]
705TranPatch9:
706
707SkipH:
708 mov ds:byte ptr[7+edi],ah
709 ; rj
710 ;mov ds:byte ptr[7+edi],0
711SkipH2:
712
713Lp8:
714 add edx,ds:dword ptr[tstep]
715 sbb eax,eax
716 add ebp,ds:dword ptr[lzistepx]
717 adc ebp,0
718 add ebx,ds:dword ptr[_a_sstepxfrac]
719 adc esi,ds:dword ptr[advancetable+4+eax*4]
720 add edi,8
721 add ecx,16
722 dec bx
723 jnz LDrawLoop
724 pop esi
725LNextSpan:
726 add esi,32
727LNextSpanESISet:
728 mov edx,ds:dword ptr[8+esi]
729 cmp edx,offset -999999
730 jnz LSpanLoop
731 pop edi
732 pop ebp
733 pop ebx
734 pop esi
735 ret
736LExactlyOneLong:
737 mov ecx,ds:dword ptr[4+esi]
738 mov ebp,ds:dword ptr[28+esi]
739 ror ebp,16
740 mov ebx,ds:dword ptr[12+esi]
741 cmp bp,ds:word ptr[ecx]
742 jl LNextSpan
743 xor eax,eax
744 mov edi,ds:dword ptr[0+esi]
745 mov ah,ds:byte ptr[24+1+esi]
746 add esi,32
747 mov al,ds:byte ptr[ebx] ; texture pixel
748 or al,al
749 jz SkipI2  ; color 0 = no draw
750 mov ds:word ptr[ecx],bp
751 mov ah,ds:byte ptr[12345678h+eax]
752LPatch9:
753 bt ax,0
754 jnc SkipI
755
756; trans stuff
757 mov al,ds:byte ptr[edi]
758 mov ah,ds:byte ptr[12345678h + eax]
759TranPatch10:
760
761SkipI:
762 mov ds:byte ptr[edi],ah
763 ; rjr
764  ;mov ds:byte ptr[edi],0
765SkipI2:
766
767 jmp LNextSpanESISet
768 public _D_Aff8PatchT2
769_D_Aff8PatchT2:
770 mov eax,ds:dword ptr[4+esp]
771 mov ds:dword ptr[LPatch1-4],eax
772 mov ds:dword ptr[LPatch2-4],eax
773 mov ds:dword ptr[LPatch3-4],eax
774 mov ds:dword ptr[LPatch4-4],eax
775 mov ds:dword ptr[LPatch5-4],eax
776 mov ds:dword ptr[LPatch6-4],eax
777 mov ds:dword ptr[LPatch7-4],eax
778 mov ds:dword ptr[LPatch8-4],eax
779 mov ds:dword ptr[LPatch9-4],eax
780 ret
781
782 public _D_PolysetDrawT2
783_D_PolysetDrawT2:
784 sub esp,offset (((1024+1 + 1 + ((32 - 1) / 32)) + 1) * 32)
785 mov eax,esp
786 add eax,32 - 1
787 and eax,offset not (32 - 1)
788 mov ds:dword ptr[_a_spans],eax
789 mov eax,ds:dword ptr[_r_affinetridesc+28]
790 test eax,eax
791 jz _D_DrawNonSubdivT2
792; push ebp
793; mov ebp,ds:dword ptr[_r_affinetridesc+24]
794 push esi
795; shl ebp,4
796 push ebx
797 mov ebx,ds:dword ptr[_r_affinetridesc+16]
798 push edi
799 mov edi,ds:dword ptr[_r_affinetridesc+20]
800Llooptop:
801 xor ecx,ecx
802 xor esi,esi
803 xor edx,edx
804 mov cx,word ptr[4+0+ebx]
805 mov si,word ptr[4+2+ebx]
806 mov dx,word ptr[4+4+ebx]
807 shl ecx,5
808 shl esi,5
809 add ecx,edi
810 shl edx,5
811 add esi,edi
812 add edx,edi
813 fild ds:dword ptr[0+4+ecx]
814 fild ds:dword ptr[0+4+esi]
815 fild ds:dword ptr[0+0+ecx]
816 fild ds:dword ptr[0+0+edx]
817 fxch st(2)
818 fsubr st(0),st(3)
819 fild ds:dword ptr[0+0+esi]
820 fxch st(2)
821 fsubr st(3),st(0)
822 fild ds:dword ptr[0+4+edx]
823 fxch st(1)
824 fsubrp st(3),st(0)
825 fxch st(1)
826 fmulp st(3),st(0)
827 fsubp st(3),st(0)
828 mov eax,ds:dword ptr[0+16+ecx]
829 and eax,0FF00h
830 fmulp st(2),st(0)
831 add eax,ds:dword ptr[_acolormap]
832 fsubrp st(1),st(0)
833 mov ds:dword ptr[_d_pcolormap],eax
834 fstp ds:dword ptr[Ltemp]
835 mov eax,ds:dword ptr[Ltemp]
836 sub eax,080000001h
837 jc Lskip
838 mov eax,ds:dword ptr[0+ebx]
839 test eax,eax
840 jz Lfacesback
841 push edx
842 push esi
843 push ecx
844 call near ptr _D_PolysetRecursiveTriangleT2
845; sub ebp,16
846; jnz Llooptop
847 jmp Ldone2
848Lfacesback:
849 mov eax,ds:dword ptr[0+8+ecx]
850 push eax
851 mov eax,ds:dword ptr[0+8+esi]
852 push eax
853 mov eax,ds:dword ptr[0+8+edx]
854 push eax
855 push ecx
856 push edx
857 mov eax,ds:dword ptr[_r_affinetridesc+32]
858 test ds:dword ptr[24+ecx],00020h
859 jz Lp11
860 add ds:dword ptr[0+8+ecx],eax
861Lp11:
862 test ds:dword ptr[24+esi],00020h
863 jz Lp12
864 add ds:dword ptr[0+8+esi],eax
865Lp12:
866 test ds:dword ptr[24+edx],00020h
867 jz Lp13
868 add ds:dword ptr[0+8+edx],eax
869Lp13:
870 push edx
871 push esi
872 push ecx
873 call near ptr _D_PolysetRecursiveTriangleT2
874 pop edx
875 pop ecx
876 pop eax
877 mov ds:dword ptr[0+8+edx],eax
878 pop eax
879 mov ds:dword ptr[0+8+esi],eax
880 pop eax
881 mov ds:dword ptr[0+8+ecx],eax
882Lskip:
883; sub ebp,16
884; jnz Llooptop
885Ldone2:
886 pop edi
887 pop ebx
888 pop esi
889; pop ebp
890 add esp,offset (((1024+1 + 1 + ((32 - 1) / 32)) + 1) * 32)
891 ret
892
893 public _D_PolysetScanLeftEdgeT2
894_D_PolysetScanLeftEdgeT2:
895 push ebp
896 push esi
897 push edi
898 push ebx
899 mov eax,ds:dword ptr[4+16+esp]
900 mov ecx,ds:dword ptr[_d_sfrac]
901 and eax,0FFFFh
902 mov ebx,ds:dword ptr[_d_ptex]
903 or ecx,eax
904 mov esi,ds:dword ptr[_d_pedgespanpackage]
905 mov edx,ds:dword ptr[_d_tfrac]
906 mov edi,ds:dword ptr[_d_light]
907 mov ebp,ds:dword ptr[_d_zi]
908LScanLoop:
909 mov ds:dword ptr[12+esi],ebx
910 mov eax,ds:dword ptr[_d_pdest]
911 mov ds:dword ptr[0+esi],eax
912 mov eax,ds:dword ptr[_d_pz]
913 mov ds:dword ptr[4+esi],eax
914 mov eax,ds:dword ptr[_d_aspancount]
915 mov ds:dword ptr[8+esi],eax
916 mov ds:dword ptr[24+esi],edi
917 mov ds:dword ptr[28+esi],ebp
918 mov ds:dword ptr[16+esi],ecx
919 mov ds:dword ptr[20+esi],edx
920 mov al,ds:byte ptr[32+esi]
921 add esi,32
922 mov eax,ds:dword ptr[_erroradjustup]
923 mov ds:dword ptr[_d_pedgespanpackage],esi
924 mov esi,ds:dword ptr[_errorterm]
925 add esi,eax
926 mov eax,ds:dword ptr[_d_pdest]
927 js LNoLeftEdgeTurnover
928 sub esi,ds:dword ptr[_erroradjustdown]
929 add eax,ds:dword ptr[_d_pdestextrastep]
930 mov ds:dword ptr[_errorterm],esi
931 mov ds:dword ptr[_d_pdest],eax
932 mov eax,ds:dword ptr[_d_pz]
933 mov esi,ds:dword ptr[_d_aspancount]
934 add eax,ds:dword ptr[_d_pzextrastep]
935 add ecx,ds:dword ptr[_d_sfracextrastep]
936 adc ebx,ds:dword ptr[_d_ptexextrastep]
937 add esi,ds:dword ptr[_d_countextrastep]
938 mov ds:dword ptr[_d_pz],eax
939 mov eax,ds:dword ptr[_d_tfracextrastep]
940 mov ds:dword ptr[_d_aspancount],esi
941 add edx,eax
942 jnc LSkip1
943 add ebx,ds:dword ptr[_r_affinetridesc+8]
944LSkip1:
945 add edi,ds:dword ptr[_d_lightextrastep]
946 add ebp,ds:dword ptr[_d_ziextrastep]
947 mov esi,ds:dword ptr[_d_pedgespanpackage]
948 dec ecx
949 test ecx,0FFFFh
950 jnz LScanLoop
951 pop ebx
952 pop edi
953 pop esi
954 pop ebp
955 ret
956LNoLeftEdgeTurnover:
957 mov ds:dword ptr[_errorterm],esi
958 add eax,ds:dword ptr[_d_pdestbasestep]
959 mov ds:dword ptr[_d_pdest],eax
960 mov eax,ds:dword ptr[_d_pz]
961 mov esi,ds:dword ptr[_d_aspancount]
962 add eax,ds:dword ptr[_d_pzbasestep]
963 add ecx,ds:dword ptr[_d_sfracbasestep]
964 adc ebx,ds:dword ptr[_d_ptexbasestep]
965 add esi,ds:dword ptr[_ubasestep]
966 mov ds:dword ptr[_d_pz],eax
967 mov ds:dword ptr[_d_aspancount],esi
968 mov esi,ds:dword ptr[_d_tfracbasestep]
969 add edx,esi
970 jnc LSkip2
971 add ebx,ds:dword ptr[_r_affinetridesc+8]
972LSkip2:
973 add edi,ds:dword ptr[_d_lightbasestep]
974 add ebp,ds:dword ptr[_d_zibasestep]
975 mov esi,ds:dword ptr[_d_pedgespanpackage]
976 dec ecx
977 test ecx,0FFFFh
978 jnz LScanLoop
979 pop ebx
980 pop edi
981 pop esi
982 pop ebp
983 ret
984
985_L_PDFVertT2:
986 push esi
987 push edi
988 mov eax,ds:dword ptr[0+0+ebx]
989 mov edx,ds:dword ptr[_r_refdef+40]
990 cmp eax,edx
991 jge LNextVert
992 mov esi,ds:dword ptr[0+4+ebx]
993 mov edx,ds:dword ptr[_r_refdef+44]
994 cmp esi,edx
995 jge LNextVert
996 mov edi,ds:dword ptr[_zspantable+esi*4]
997 mov edx,ds:dword ptr[0+20+ebx]
998 shr edx,16
999 cmp dx,ds:word ptr[edi+eax*2]
1000 jl LNextVert
1001 mov ds:word ptr[edi+eax*2],dx
1002 mov edi,ds:dword ptr[0+12+ebx]
1003 shr edi,16
1004 mov edi,ds:dword ptr[_skintable+edi*4]
1005 mov edx,ds:dword ptr[0+8+ebx]
1006 shr edx,16
1007 mov dl,ds:byte ptr[edi+edx]   ; texture pixel
1008 or dl,dl
1009 jz Skip2B  ; color 0 = no draw
1010 mov edi,ds:dword ptr[0+16+ebx]
1011 and edi,0FF00h
1012 and edx,000FFh
1013 add edi,edx
1014 add edi,ds:dword ptr[_acolormap]
1015 mov dh,ds:byte ptr[edi]
1016
1017 mov edi,ds:dword ptr[_d_scantable+esi*4]
1018 mov esi,ds:dword ptr[_d_viewbuffer]
1019 add edi,eax
1020
1021 bt dx,0
1022 jnc Skip2
1023
1024; trans stuff
1025 mov dl,ds:byte ptr[esi+edi]
1026 and edx, 0ffffh
1027 mov dh,ds:byte ptr[12345678h + edx]
1028TranPatch11:
1029
1030Skip2:
1031 mov ds:byte ptr[esi+edi],dh
1032 ; rjr   distance
1033 ;mov ds:byte ptr[esi+edi],0
1034Skip2B:
1035LNextVert:
1036 pop edi
1037 pop esi
1038ret
1039
1040 public _D_PolysetDrawFinalVertsT2
1041_D_PolysetDrawFinalVertsT2:
1042 push ebp
1043 push ebx
1044 mov ebx,dword ptr[4+8+esp]	;pv1
1045 call _L_PDFVertT2
1046 mov ebx,dword ptr[8+8+esp]	;pv2
1047 call _L_PDFVertT2
1048 mov ebx,dword ptr[12+8+esp];pv3
1049 call _L_PDFVertT2
1050 pop ebx
1051 pop ebp
1052 ret
1053
1054 public _D_DrawNonSubdivT2
1055_D_DrawNonSubdivT2:
1056; push ebp
1057; mov ebp,ds:dword ptr[_r_affinetridesc+24]
1058 push ebx
1059; shl ebp,4
1060 push esi
1061 mov esi,ds:dword ptr[_r_affinetridesc+16]
1062 push edi
1063LNDLoop:
1064 mov edi,ds:dword ptr[_r_affinetridesc+20]
1065 xor ecx,ecx;	//clear i1
1066 xor edx,edx;	//clear i2
1067 xor ebx,ebx;	//clear i3
1068 mov cx, word ptr[4+0+esi] ;ptri->vertindex[0]
1069 mov dx, word ptr[4+2+esi] ;ptri->vertindex[1]
1070 mov bx, word ptr[4+4+esi] ;ptri->vertindex[2]
1071 shl ecx,5
1072 shl edx,5
1073 shl ebx,5
1074 add ecx,edi
1075 add edx,edi
1076 add ebx,edi
1077 mov eax,ds:dword ptr[0+4+ecx]
1078 mov esi,ds:dword ptr[0+0+ecx]
1079 sub eax,ds:dword ptr[0+4+edx]
1080 sub esi,ds:dword ptr[0+0+ebx]
1081 imul eax,esi
1082 mov esi,ds:dword ptr[0+0+ecx]
1083 mov edi,ds:dword ptr[0+4+ecx]
1084 sub esi,ds:dword ptr[0+0+edx]
1085 sub edi,ds:dword ptr[0+4+ebx]
1086 imul edi,esi
1087 sub eax,edi
1088 jns LNextTri
1089 mov ds:dword ptr[_d_xdenom],eax
1090 fild ds:dword ptr[_d_xdenom]
1091 mov eax,ds:dword ptr[0+0+ecx]
1092 mov esi,ds:dword ptr[0+4+ecx]
1093 mov ds:dword ptr[_r_p0+0],eax
1094 mov ds:dword ptr[_r_p0+4],esi
1095 mov eax,ds:dword ptr[0+8+ecx]
1096 mov esi,ds:dword ptr[0+12+ecx]
1097 mov ds:dword ptr[_r_p0+8],eax
1098 mov ds:dword ptr[_r_p0+12],esi
1099 mov eax,ds:dword ptr[0+16+ecx]
1100 mov esi,ds:dword ptr[0+20+ecx]
1101 mov ds:dword ptr[_r_p0+16],eax
1102 mov ds:dword ptr[_r_p0+20],esi
1103 fdivr ds:dword ptr[float_1]
1104 mov eax,ds:dword ptr[0+0+edx]
1105 mov esi,ds:dword ptr[0+4+edx]
1106 mov ds:dword ptr[_r_p1+0],eax
1107 mov ds:dword ptr[_r_p1+4],esi
1108 mov eax,ds:dword ptr[0+8+edx]
1109 mov esi,ds:dword ptr[0+12+edx]
1110 mov ds:dword ptr[_r_p1+8],eax
1111 mov ds:dword ptr[_r_p1+12],esi
1112 mov eax,ds:dword ptr[0+16+edx]
1113 mov esi,ds:dword ptr[0+20+edx]
1114 mov ds:dword ptr[_r_p1+16],eax
1115 mov ds:dword ptr[_r_p1+20],esi
1116 mov eax,ds:dword ptr[0+0+ebx]
1117 mov esi,ds:dword ptr[0+4+ebx]
1118 mov ds:dword ptr[_r_p2+0],eax
1119 mov ds:dword ptr[_r_p2+4],esi
1120 mov eax,ds:dword ptr[0+8+ebx]
1121 mov esi,ds:dword ptr[0+12+ebx]
1122 mov ds:dword ptr[_r_p2+8],eax
1123 mov ds:dword ptr[_r_p2+12],esi
1124 mov eax,ds:dword ptr[0+16+ebx]
1125 mov esi,ds:dword ptr[0+20+ebx]
1126 mov ds:dword ptr[_r_p2+16],eax
1127 mov edi,ds:dword ptr[_r_affinetridesc+16]
1128 mov ds:dword ptr[_r_p2+20],esi
1129 mov eax,ds:dword ptr[0+edi]
1130 test eax,eax
1131 jnz LFacesFront
1132 mov eax,ds:dword ptr[24+ecx]
1133 mov esi,ds:dword ptr[24+edx]
1134 mov edi,ds:dword ptr[24+ebx]
1135 test eax,00020h
1136 mov eax,ds:dword ptr[_r_affinetridesc+32]
1137 jz LOnseamDone0
1138 add ds:dword ptr[_r_p0+8],eax
1139LOnseamDone0:
1140 test esi,00020h
1141 jz LOnseamDone1
1142 add ds:dword ptr[_r_p1+8],eax
1143LOnseamDone1:
1144 test edi,00020h
1145 jz LOnseamDone2
1146 add ds:dword ptr[_r_p2+8],eax
1147LOnseamDone2:
1148LFacesFront:
1149 fstp ds:dword ptr[_d_xdenom]
1150 call near ptr _D_PolysetSetEdgeTable
1151 call near ptr _D_RasterizeAliasPolySmooth
1152LNextTri:
1153 mov esi,ds:dword ptr[_r_affinetridesc+16]
1154; sub ebp,16
1155; jnz LNDLoop
1156 pop edi
1157 pop esi
1158 pop ebx
1159; pop ebp
1160 add esp,offset (((1024+1 + 1 + ((32 - 1) / 32)) + 1) * 32)
1161 ret
1162
1163 public _D_PolysetAff8EndT2
1164_D_PolysetAff8EndT2:
1165_TEXT ENDS
1166_DATA SEGMENT
1167 align 4
1168LPatchTable:
1169 dd TranPatch1-4
1170 dd TranPatch2-4
1171 dd TranPatch3-4
1172 dd TranPatch4-4
1173 dd TranPatch5-4
1174 dd TranPatch6-4
1175 dd TranPatch7-4
1176 dd TranPatch8-4
1177 dd TranPatch9-4
1178 dd TranPatch10-4
1179 dd TranPatch11-4
1180_DATA ENDS
1181_TEXT SEGMENT
1182 align 4
1183 public _R_TranPatch2
1184_R_TranPatch2:
1185 push ebx
1186 mov eax,ds:dword ptr[_mainTransTable]
1187 mov ebx,offset LPatchTable
1188 mov ecx,11
1189LPatchLoop:
1190 mov edx,ds:dword ptr[ebx]
1191 add ebx,4
1192 mov ds:dword ptr[edx],eax
1193 dec ecx
1194 jnz LPatchLoop
1195 pop ebx
1196 ret
1197_TEXT ENDS
1198 END
1199