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