r_polysa.asm (18057B)
1 .386P 2 .model FLAT 3 ; 4 ; d_polysa.s 5 ; x86 assembly-language polygon model drawing code 6 ; 7 8 include qasm.inc 9 include d_if.inc 10 11 if id386 12 13 ; !!! if this is changed, it must be changed in d_polyse.c too !!! 14 ;DPS_MAXSPANS equ (MAXHEIGHT+1) 15 ; 1 extra for spanpackage that marks end 16 17 ;SPAN_SIZE equ (((DPS_MAXSPANS + 1 + ((CACHE_SIZE - 1) / spanpackage_t_size)) + 1) * spanpackage_t_size) 18 19 MASK_1K equ 03FFh 20 21 _DATA SEGMENT 22 23 align 4 24 ;p10_minus_p20 dd 0 25 ;p01_minus_p21 dd 0 26 ;temp0 dd 0 27 ;temp1 dd 0 28 ;Ltemp dd 0 29 30 aff8entryvec_table dd LDraw8, LDraw7, LDraw6, LDraw5 31 dd LDraw4, LDraw3, LDraw2, LDraw1, LDraw8IR, LDraw7IR, LDraw6IR, LDraw5IR, LDraw4IR, LDraw3IR, LDraw2IR, LDraw1IR 32 33 lzistepx dd 0 34 35 externdef _rand1k:dword 36 externdef _rand1k_index:dword 37 externdef _alias_colormap:dword 38 39 ;PGM 40 externdef _irtable:dword 41 externdef _iractive:byte 42 ;PGM 43 44 _DATA ENDS 45 _TEXT SEGMENT 46 47 48 ;---------------------------------------------------------------------- 49 ; 8-bpp horizontal span drawing code for affine polygons, with smooth 50 ; shading and no transparency 51 ;---------------------------------------------------------------------- 52 53 ;=================================== 54 ;=================================== 55 56 pspans equ 4+8 57 58 public _D_PolysetAff8Start 59 _D_PolysetAff8Start: 60 61 public _R_PolysetDrawSpans8_Opaque 62 _R_PolysetDrawSpans8_Opaque: 63 64 push esi ; preserve register variables 65 push ebx 66 67 mov esi,ds:dword ptr[pspans+esp] ; point to the first span descriptor 68 mov ecx,ds:dword ptr[_r_zistepx] 69 70 push ebp ; preserve caller's stack frame 71 push edi 72 73 ror ecx,16 ; put high 16 bits of 1/z step in low word 74 mov edx,ds:dword ptr[spanpackage_t_count+esi] 75 76 mov ds:dword ptr[lzistepx],ecx 77 78 LSpanLoop: 79 80 ; lcount = d_aspancount - pspanpackage->count; 81 ; 82 ; errorterm += erroradjustup; 83 ; if (errorterm >= 0) 84 ; { 85 ; d_aspancount += d_countextrastep; 86 ; errorterm -= erroradjustdown; 87 ; } 88 ; else 89 ; { 90 ; d_aspancount += ubasestep; 91 ; } 92 93 mov eax,ds:dword ptr[_d_aspancount] 94 sub eax,edx 95 96 mov edx,ds:dword ptr[_erroradjustup] 97 mov ebx,ds:dword ptr[_errorterm] 98 add ebx,edx 99 js LNoTurnover 100 101 mov edx,ds:dword ptr[_erroradjustdown] 102 mov edi,ds:dword ptr[_d_countextrastep] 103 sub ebx,edx 104 mov ebp,ds:dword ptr[_d_aspancount] 105 mov ds:dword ptr[_errorterm],ebx 106 add ebp,edi 107 mov ds:dword ptr[_d_aspancount],ebp 108 jmp LRightEdgeStepped 109 110 LNoTurnover: 111 mov edi,ds:dword ptr[_d_aspancount] 112 mov edx,ds:dword ptr[_ubasestep] 113 mov ds:dword ptr[_errorterm],ebx 114 add edi,edx 115 mov ds:dword ptr[_d_aspancount],edi 116 117 LRightEdgeStepped: 118 cmp eax,1 119 120 jl LNextSpan 121 jz LExactlyOneLong 122 123 ; 124 ; set up advancetable 125 ; 126 mov ecx,ds:dword ptr[_a_ststepxwhole] 127 mov edx,ds:dword ptr[_r_affinetridesc+atd_skinwidth] 128 129 mov ds:dword ptr[advancetable+4],ecx ; advance base in t 130 add ecx,edx 131 132 mov ds:dword ptr[advancetable],ecx ; advance extra in t 133 mov ecx,ds:dword ptr[_a_tstepxfrac] 134 135 mov cx,ds:word ptr[_r_lstepx] 136 mov edx,eax ; count 137 138 mov ds:dword ptr[tstep],ecx 139 add edx,7 140 141 shr edx,3 ; count of full and partial loops 142 mov ebx,ds:dword ptr[spanpackage_t_sfrac+esi] 143 144 mov bx,dx 145 mov ecx,ds:dword ptr[spanpackage_t_pz+esi] 146 147 neg eax 148 149 mov edi,ds:dword ptr[spanpackage_t_pdest+esi] 150 and eax,7 ; 0->0, 1->7, 2->6, ... , 7->1 151 152 sub edi,eax ; compensate for hardwired offsets 153 sub ecx,eax 154 155 sub ecx,eax 156 mov edx,ds:dword ptr[spanpackage_t_tfrac+esi] 157 158 mov dx,ds:word ptr[spanpackage_t_light+esi] 159 mov ebp,ds:dword ptr[spanpackage_t_zi+esi] 160 161 ror ebp,16 ; put high 16 bits of 1/z in low word 162 push esi 163 164 push eax 165 mov al, [_iractive] 166 cmp al, 0 167 pop eax 168 jne IRInsert 169 170 mov esi,ds:dword ptr[spanpackage_t_ptex+esi] 171 jmp dword ptr[aff8entryvec_table+eax*4] 172 173 IRInsert: 174 mov esi,ds:dword ptr[spanpackage_t_ptex+esi] 175 add eax, 8 176 jmp dword ptr[aff8entryvec_table+eax*4] 177 178 ; %bx = count of full and partial loops 179 ; %ebx high word = sfrac 180 ; %ecx = pz 181 ; %dx = light 182 ; %edx high word = tfrac 183 ; %esi = ptex 184 ; %edi = pdest 185 ; %ebp = 1/z 186 ; tstep low word = C(r_lstepx) 187 ; tstep high word = C(a_tstepxfrac) 188 ; C(a_sstepxfrac) low word = 0 189 ; C(a_sstepxfrac) high word = C(a_sstepxfrac) 190 191 ;=== 192 ;Standard Draw Loop 193 ;=== 194 LDrawLoop: 195 196 mov al,[_iractive] 197 cmp al,0 198 jne LDrawLoopIR 199 200 ; FIXME: do we need to clamp light? We may need at least a buffer bit to 201 ; keep it from poking into tfrac and causing problems 202 203 LDraw8: 204 cmp bp,ds:word ptr[ecx] 205 jl Lp1 206 xor eax,eax 207 mov ah,dh 208 mov al,ds:byte ptr[esi] 209 mov ds:word ptr[ecx],bp 210 mov al,ds:byte ptr[12345678h+eax] 211 LPatch8: 212 mov ds:byte ptr[edi],al 213 Lp1: 214 add edx,ds:dword ptr[tstep] 215 sbb eax,eax 216 add ebp,ds:dword ptr[lzistepx] 217 adc ebp,0 218 add ebx,ds:dword ptr[_a_sstepxfrac] 219 adc esi,ds:dword ptr[advancetable+4+eax*4] 220 221 LDraw7: 222 cmp bp,ds:word ptr[2+ecx] 223 jl Lp2 224 xor eax,eax 225 mov ah,dh 226 mov al,ds:byte ptr[esi] 227 mov ds:word ptr[2+ecx],bp 228 mov al,ds:byte ptr[12345678h+eax] 229 LPatch7: 230 mov ds:byte ptr[1+edi],al 231 Lp2: 232 add edx,ds:dword ptr[tstep] 233 sbb eax,eax 234 add ebp,ds:dword ptr[lzistepx] 235 adc ebp,0 236 add ebx,ds:dword ptr[_a_sstepxfrac] 237 adc esi,ds:dword ptr[advancetable+4+eax*4] 238 239 LDraw6: 240 cmp bp,ds:word ptr[4+ecx] 241 jl Lp3 242 xor eax,eax 243 mov ah,dh 244 mov al,ds:byte ptr[esi] 245 mov ds:word ptr[4+ecx],bp 246 mov al,ds:byte ptr[12345678h+eax] 247 LPatch6: 248 mov ds:byte ptr[2+edi],al 249 Lp3: 250 add edx,ds:dword ptr[tstep] 251 sbb eax,eax 252 add ebp,ds:dword ptr[lzistepx] 253 adc ebp,0 254 add ebx,ds:dword ptr[_a_sstepxfrac] 255 adc esi,ds:dword ptr[advancetable+4+eax*4] 256 257 LDraw5: 258 cmp bp,ds:word ptr[6+ecx] 259 jl Lp4 260 xor eax,eax 261 mov ah,dh 262 mov al,ds:byte ptr[esi] 263 mov ds:word ptr[6+ecx],bp 264 mov al,ds:byte ptr[12345678h+eax] 265 LPatch5: 266 mov ds:byte ptr[3+edi],al 267 Lp4: 268 add edx,ds:dword ptr[tstep] 269 sbb eax,eax 270 add ebp,ds:dword ptr[lzistepx] 271 adc ebp,0 272 add ebx,ds:dword ptr[_a_sstepxfrac] 273 adc esi,ds:dword ptr[advancetable+4+eax*4] 274 275 LDraw4: 276 cmp bp,ds:word ptr[8+ecx] 277 jl Lp5 278 xor eax,eax 279 mov ah,dh 280 mov al,ds:byte ptr[esi] 281 mov ds:word ptr[8+ecx],bp 282 mov al,ds:byte ptr[12345678h+eax] 283 LPatch4: 284 mov ds:byte ptr[4+edi],al 285 Lp5: 286 add edx,ds:dword ptr[tstep] 287 sbb eax,eax 288 add ebp,ds:dword ptr[lzistepx] 289 adc ebp,0 290 add ebx,ds:dword ptr[_a_sstepxfrac] 291 adc esi,ds:dword ptr[advancetable+4+eax*4] 292 293 LDraw3: 294 cmp bp,ds:word ptr[10+ecx] 295 jl Lp6 296 xor eax,eax 297 mov ah,dh 298 mov al,ds:byte ptr[esi] 299 mov ds:word ptr[10+ecx],bp 300 mov al,ds:byte ptr[12345678h+eax] 301 LPatch3: 302 mov ds:byte ptr[5+edi],al 303 Lp6: 304 add edx,ds:dword ptr[tstep] 305 sbb eax,eax 306 add ebp,ds:dword ptr[lzistepx] 307 adc ebp,0 308 add ebx,ds:dword ptr[_a_sstepxfrac] 309 adc esi,ds:dword ptr[advancetable+4+eax*4] 310 311 LDraw2: 312 cmp bp,ds:word ptr[12+ecx] 313 jl Lp7 314 xor eax,eax 315 mov ah,dh 316 mov al,ds:byte ptr[esi] 317 mov ds:word ptr[12+ecx],bp 318 mov al,ds:byte ptr[12345678h+eax] 319 LPatch2: 320 mov ds:byte ptr[6+edi],al 321 Lp7: 322 add edx,ds:dword ptr[tstep] 323 sbb eax,eax 324 add ebp,ds:dword ptr[lzistepx] 325 adc ebp,0 326 add ebx,ds:dword ptr[_a_sstepxfrac] 327 adc esi,ds:dword ptr[advancetable+4+eax*4] 328 329 LDraw1: 330 cmp bp,ds:word ptr[14+ecx] 331 jl Lp8 332 xor eax,eax 333 mov ah,dh 334 mov al,ds:byte ptr[esi] 335 mov ds:word ptr[14+ecx],bp 336 mov al,ds:byte ptr[12345678h+eax] 337 LPatch1: 338 mov ds:byte ptr[7+edi],al 339 Lp8: 340 add edx,ds:dword ptr[tstep] 341 sbb eax,eax 342 add ebp,ds:dword ptr[lzistepx] 343 adc ebp,0 344 add ebx,ds:dword ptr[_a_sstepxfrac] 345 adc esi,ds:dword ptr[advancetable+4+eax*4] 346 347 add edi,8 348 add ecx,16 349 350 dec bx 351 jnz LDrawLoop 352 353 pop esi ; restore spans pointer 354 LNextSpan: 355 add esi,offset spanpackage_t_size ; point to next span 356 LNextSpanESISet: 357 mov edx,ds:dword ptr[spanpackage_t_count+esi] 358 cmp edx,offset -999999 ; any more spans? 359 jnz LSpanLoop ; yes 360 361 pop edi 362 pop ebp ; restore the caller's stack frame 363 pop ebx ; restore register variables 364 pop esi 365 ret 366 367 ;======= 368 ; IR active draw loop 369 ;======= 370 LDrawLoopIR: 371 372 ; FIXME: do we need to clamp light? We may need at least a buffer bit to 373 ; keep it from poking into tfrac and causing problems 374 375 LDraw8IR: 376 cmp bp,ds:word ptr[ecx] 377 jl Lp1IR 378 xor eax,eax 379 mov al,ds:byte ptr[esi] 380 mov al,ds:byte ptr[_irtable+eax] 381 mov ds:word ptr[ecx],bp 382 mov al,ds:byte ptr[12345678h+eax] 383 LPatch8IR: 384 mov ds:byte ptr[edi],al 385 Lp1IR: 386 add edx,ds:dword ptr[tstep] 387 sbb eax,eax 388 add ebp,ds:dword ptr[lzistepx] 389 adc ebp,0 390 add ebx,ds:dword ptr[_a_sstepxfrac] 391 adc esi,ds:dword ptr[advancetable+4+eax*4] 392 393 LDraw7IR: 394 cmp bp,ds:word ptr[2+ecx] 395 jl Lp2IR 396 xor eax,eax 397 mov al,ds:byte ptr[esi] 398 mov al,ds:byte ptr[_irtable+eax] 399 mov ds:word ptr[2+ecx],bp 400 mov al,ds:byte ptr[12345678h+eax] 401 LPatch7IR: 402 mov ds:byte ptr[1+edi],al 403 Lp2IR: 404 add edx,ds:dword ptr[tstep] 405 sbb eax,eax 406 add ebp,ds:dword ptr[lzistepx] 407 adc ebp,0 408 add ebx,ds:dword ptr[_a_sstepxfrac] 409 adc esi,ds:dword ptr[advancetable+4+eax*4] 410 411 LDraw6IR: 412 cmp bp,ds:word ptr[4+ecx] 413 jl Lp3IR 414 xor eax,eax 415 mov al,ds:byte ptr[esi] 416 mov al,ds:byte ptr[_irtable+eax] 417 mov ds:word ptr[4+ecx],bp 418 mov al,ds:byte ptr[12345678h+eax] 419 LPatch6IR: 420 mov ds:byte ptr[2+edi],al 421 Lp3IR: 422 add edx,ds:dword ptr[tstep] 423 sbb eax,eax 424 add ebp,ds:dword ptr[lzistepx] 425 adc ebp,0 426 add ebx,ds:dword ptr[_a_sstepxfrac] 427 adc esi,ds:dword ptr[advancetable+4+eax*4] 428 429 LDraw5IR: 430 cmp bp,ds:word ptr[6+ecx] 431 jl Lp4IR 432 xor eax,eax 433 mov al,ds:byte ptr[esi] 434 mov al,ds:byte ptr[_irtable+eax] 435 mov ds:word ptr[6+ecx],bp 436 mov al,ds:byte ptr[12345678h+eax] 437 LPatch5IR: 438 mov ds:byte ptr[3+edi],al 439 Lp4IR: 440 add edx,ds:dword ptr[tstep] 441 sbb eax,eax 442 add ebp,ds:dword ptr[lzistepx] 443 adc ebp,0 444 add ebx,ds:dword ptr[_a_sstepxfrac] 445 adc esi,ds:dword ptr[advancetable+4+eax*4] 446 447 LDraw4IR: 448 cmp bp,ds:word ptr[8+ecx] 449 jl Lp5IR 450 xor eax,eax 451 mov al,ds:byte ptr[esi] 452 mov al,ds:byte ptr[_irtable+eax] 453 mov ds:word ptr[8+ecx],bp 454 mov al,ds:byte ptr[12345678h+eax] 455 LPatch4IR: 456 mov ds:byte ptr[4+edi],al 457 Lp5IR: 458 add edx,ds:dword ptr[tstep] 459 sbb eax,eax 460 add ebp,ds:dword ptr[lzistepx] 461 adc ebp,0 462 add ebx,ds:dword ptr[_a_sstepxfrac] 463 adc esi,ds:dword ptr[advancetable+4+eax*4] 464 465 LDraw3IR: 466 cmp bp,ds:word ptr[10+ecx] 467 jl Lp6IR 468 xor eax,eax 469 mov al,ds:byte ptr[esi] 470 mov al,ds:byte ptr[_irtable+eax] 471 mov ds:word ptr[10+ecx],bp 472 mov al,ds:byte ptr[12345678h+eax] 473 LPatch3IR: 474 mov ds:byte ptr[5+edi],al 475 Lp6IR: 476 add edx,ds:dword ptr[tstep] 477 sbb eax,eax 478 add ebp,ds:dword ptr[lzistepx] 479 adc ebp,0 480 add ebx,ds:dword ptr[_a_sstepxfrac] 481 adc esi,ds:dword ptr[advancetable+4+eax*4] 482 483 LDraw2IR: 484 cmp bp,ds:word ptr[12+ecx] 485 jl Lp7IR 486 xor eax,eax 487 mov al,ds:byte ptr[esi] 488 mov al,ds:byte ptr[_irtable+eax] 489 mov ds:word ptr[12+ecx],bp 490 mov al,ds:byte ptr[12345678h+eax] 491 LPatch2IR: 492 mov ds:byte ptr[6+edi],al 493 Lp7IR: 494 add edx,ds:dword ptr[tstep] 495 sbb eax,eax 496 add ebp,ds:dword ptr[lzistepx] 497 adc ebp,0 498 add ebx,ds:dword ptr[_a_sstepxfrac] 499 adc esi,ds:dword ptr[advancetable+4+eax*4] 500 501 LDraw1IR: 502 cmp bp,ds:word ptr[14+ecx] 503 jl Lp8IR 504 xor eax,eax 505 mov al,ds:byte ptr[esi] 506 mov al,ds:byte ptr[_irtable+eax] 507 mov ds:word ptr[14+ecx],bp 508 mov al,ds:byte ptr[12345678h+eax] 509 LPatch1IR: 510 mov ds:byte ptr[7+edi],al 511 Lp8IR: 512 add edx,ds:dword ptr[tstep] 513 sbb eax,eax 514 add ebp,ds:dword ptr[lzistepx] 515 adc ebp,0 516 add ebx,ds:dword ptr[_a_sstepxfrac] 517 adc esi,ds:dword ptr[advancetable+4+eax*4] 518 519 add edi,8 520 add ecx,16 521 522 dec bx 523 jnz LDrawLoopIR 524 525 pop esi ; restore spans pointer 526 LNextSpanIR: 527 add esi,offset spanpackage_t_size ; point to next span 528 LNextSpanESISetIR: 529 mov edx,ds:dword ptr[spanpackage_t_count+esi] 530 cmp edx,offset -999999 ; any more spans? 531 jnz LSpanLoop ; yes 532 533 pop edi 534 pop ebp ; restore the caller's stack frame 535 pop ebx ; restore register variables 536 pop esi 537 ret 538 539 ;======= 540 ; Standard One-Long Draw 541 ;======= 542 ; draw a one-long span 543 544 LExactlyOneLong: 545 mov al,[_iractive] 546 cmp al,0 547 jne LExactlyOneLongIR 548 549 mov ecx,ds:dword ptr[spanpackage_t_pz+esi] 550 mov ebp,ds:dword ptr[spanpackage_t_zi+esi] 551 552 ror ebp,16 ; put high 16 bits of 1/z in low word 553 mov ebx,ds:dword ptr[spanpackage_t_ptex+esi] 554 555 cmp bp,ds:word ptr[ecx] 556 jl LNextSpan 557 xor eax,eax 558 mov edi,ds:dword ptr[spanpackage_t_pdest+esi] 559 mov ah,ds:byte ptr[spanpackage_t_light+1+esi] 560 add esi,offset spanpackage_t_size ; point to next span 561 mov al,ds:byte ptr[ebx] 562 mov ds:word ptr[ecx],bp 563 mov al,ds:byte ptr[12345678h+eax] 564 LPatch9: 565 mov ds:byte ptr[edi],al 566 567 jmp LNextSpanESISet 568 569 570 ;======== 571 ;======== 572 ; draw a one-long span 573 574 LExactlyOneLongIR: 575 576 mov ecx,ds:dword ptr[spanpackage_t_pz+esi] 577 mov ebp,ds:dword ptr[spanpackage_t_zi+esi] 578 579 ror ebp,16 ; put high 16 bits of 1/z in low word 580 mov ebx,ds:dword ptr[spanpackage_t_ptex+esi] 581 582 cmp bp,ds:word ptr[ecx] 583 jl LNextSpanIR 584 xor eax,eax 585 mov edi,ds:dword ptr[spanpackage_t_pdest+esi] 586 add esi,offset spanpackage_t_size ; point to next span 587 mov al,ds:byte ptr[ebx] 588 mov al,ds:byte ptr[_irtable+eax] 589 mov ds:word ptr[ecx],bp 590 mov al,ds:byte ptr[12345678h+eax] 591 LPatch9IR: 592 mov ds:byte ptr[edi],al 593 594 jmp LNextSpanESISetIR 595 596 ;=================================== 597 ;=================================== 598 public _D_Aff8Patch 599 _D_Aff8Patch: 600 mov eax,[_alias_colormap] 601 mov ds:dword ptr[LPatch1-4],eax 602 mov ds:dword ptr[LPatch2-4],eax 603 mov ds:dword ptr[LPatch3-4],eax 604 mov ds:dword ptr[LPatch4-4],eax 605 mov ds:dword ptr[LPatch5-4],eax 606 mov ds:dword ptr[LPatch6-4],eax 607 mov ds:dword ptr[LPatch7-4],eax 608 mov ds:dword ptr[LPatch8-4],eax 609 mov ds:dword ptr[LPatch9-4],eax 610 mov ds:dword ptr[LPatch1IR-4],eax 611 mov ds:dword ptr[LPatch2IR-4],eax 612 mov ds:dword ptr[LPatch3IR-4],eax 613 mov ds:dword ptr[LPatch4IR-4],eax 614 mov ds:dword ptr[LPatch5IR-4],eax 615 mov ds:dword ptr[LPatch6IR-4],eax 616 mov ds:dword ptr[LPatch7IR-4],eax 617 mov ds:dword ptr[LPatch8IR-4],eax 618 mov ds:dword ptr[LPatch9IR-4],eax 619 620 ret 621 622 623 624 ;=================================== 625 ;=================================== 626 627 height equ 4+16 628 629 public _R_PolysetScanLeftEdge 630 _R_PolysetScanLeftEdge: 631 push ebp ; preserve caller stack frame pointer 632 push esi ; preserve register variables 633 push edi 634 push ebx 635 636 mov eax,ds:dword ptr[height+esp] 637 mov ecx,ds:dword ptr[_d_sfrac] 638 639 and eax,0FFFFh 640 mov ebx,ds:dword ptr[_d_ptex] 641 or ecx,eax 642 mov esi,ds:dword ptr[_d_pedgespanpackage] 643 mov edx,ds:dword ptr[_d_tfrac] 644 mov edi,ds:dword ptr[_d_light] 645 mov ebp,ds:dword ptr[_d_zi] 646 647 ; %eax: scratch 648 ; %ebx: d_ptex 649 ; %ecx: d_sfrac in high word, count in low word 650 ; %edx: d_tfrac 651 ; %esi: d_pedgespanpackage, errorterm, scratch alternately 652 ; %edi: d_light 653 ; %ebp: d_zi 654 655 ; do 656 ; { 657 658 LScanLoop: 659 660 ; d_pedgespanpackage->ptex = ptex; 661 ; d_pedgespanpackage->pdest = d_pdest; 662 ; d_pedgespanpackage->pz = d_pz; 663 ; d_pedgespanpackage->count = d_aspancount; 664 ; d_pedgespanpackage->light = d_light; 665 ; d_pedgespanpackage->zi = d_zi; 666 ; d_pedgespanpackage->sfrac = d_sfrac << 16; 667 ; d_pedgespanpackage->tfrac = d_tfrac << 16; 668 mov ds:dword ptr[spanpackage_t_ptex+esi],ebx 669 mov eax,ds:dword ptr[_d_pdest] 670 mov ds:dword ptr[spanpackage_t_pdest+esi],eax 671 mov eax,ds:dword ptr[_d_pz] 672 mov ds:dword ptr[spanpackage_t_pz+esi],eax 673 mov eax,ds:dword ptr[_d_aspancount] 674 mov ds:dword ptr[spanpackage_t_count+esi],eax 675 mov ds:dword ptr[spanpackage_t_light+esi],edi 676 mov ds:dword ptr[spanpackage_t_zi+esi],ebp 677 mov ds:dword ptr[spanpackage_t_sfrac+esi],ecx 678 mov ds:dword ptr[spanpackage_t_tfrac+esi],edx 679 680 ; pretouch the next cache line 681 mov al,ds:byte ptr[spanpackage_t_size+esi] 682 683 ; d_pedgespanpackage++; 684 add esi,offset spanpackage_t_size 685 mov eax,ds:dword ptr[_erroradjustup] 686 mov ds:dword ptr[_d_pedgespanpackage],esi 687 688 ; errorterm += erroradjustup; 689 mov esi,ds:dword ptr[_errorterm] 690 add esi,eax 691 mov eax,ds:dword ptr[_d_pdest] 692 693 ; if (errorterm >= 0) 694 ; { 695 js LNoLeftEdgeTurnover 696 697 ; errorterm -= erroradjustdown; 698 ; d_pdest += d_pdestextrastep; 699 sub esi,ds:dword ptr[_erroradjustdown] 700 add eax,ds:dword ptr[_d_pdestextrastep] 701 mov ds:dword ptr[_errorterm],esi 702 mov ds:dword ptr[_d_pdest],eax 703 704 ; d_pz += d_pzextrastep; 705 ; d_aspancount += d_countextrastep; 706 ; d_ptex += d_ptexextrastep; 707 ; d_sfrac += d_sfracextrastep; 708 ; d_ptex += d_sfrac >> 16; 709 ; d_sfrac &= 0xFFFF; 710 ; d_tfrac += d_tfracextrastep; 711 mov eax,ds:dword ptr[_d_pz] 712 mov esi,ds:dword ptr[_d_aspancount] 713 add eax,ds:dword ptr[_d_pzextrastep] 714 add ecx,ds:dword ptr[_d_sfracextrastep] 715 adc ebx,ds:dword ptr[_d_ptexextrastep] 716 add esi,ds:dword ptr[_d_countextrastep] 717 mov ds:dword ptr[_d_pz],eax 718 mov eax,ds:dword ptr[_d_tfracextrastep] 719 mov ds:dword ptr[_d_aspancount],esi 720 add edx,eax 721 722 ; if (d_tfrac & 0x10000) 723 ; { 724 jnc LSkip1 725 726 ; d_ptex += r_affinetridesc.skinwidth; 727 ; d_tfrac &= 0xFFFF; 728 add ebx,ds:dword ptr[_r_affinetridesc+atd_skinwidth] 729 730 ; } 731 732 LSkip1: 733 734 ; d_light += d_lightextrastep; 735 ; d_zi += d_ziextrastep; 736 add edi,ds:dword ptr[_d_lightextrastep] 737 add ebp,ds:dword ptr[_d_ziextrastep] 738 739 ; } 740 mov esi,ds:dword ptr[_d_pedgespanpackage] 741 dec ecx 742 test ecx,0FFFFh 743 jnz LScanLoop 744 745 pop ebx 746 pop edi 747 pop esi 748 pop ebp 749 ret 750 751 ; else 752 ; { 753 754 LNoLeftEdgeTurnover: 755 mov ds:dword ptr[_errorterm],esi 756 757 ; d_pdest += d_pdestbasestep; 758 add eax,ds:dword ptr[_d_pdestbasestep] 759 mov ds:dword ptr[_d_pdest],eax 760 761 ; d_pz += d_pzbasestep; 762 ; d_aspancount += ubasestep; 763 ; d_ptex += d_ptexbasestep; 764 ; d_sfrac += d_sfracbasestep; 765 ; d_ptex += d_sfrac >> 16; 766 ; d_sfrac &= 0xFFFF; 767 mov eax,ds:dword ptr[_d_pz] 768 mov esi,ds:dword ptr[_d_aspancount] 769 add eax,ds:dword ptr[_d_pzbasestep] 770 add ecx,ds:dword ptr[_d_sfracbasestep] 771 adc ebx,ds:dword ptr[_d_ptexbasestep] 772 add esi,ds:dword ptr[_ubasestep] 773 mov ds:dword ptr[_d_pz],eax 774 mov ds:dword ptr[_d_aspancount],esi 775 776 ; d_tfrac += d_tfracbasestep; 777 mov esi,ds:dword ptr[_d_tfracbasestep] 778 add edx,esi 779 780 ; if (d_tfrac & 0x10000) 781 ; { 782 jnc LSkip2 783 784 ; d_ptex += r_affinetridesc.skinwidth; 785 ; d_tfrac &= 0xFFFF; 786 add ebx,ds:dword ptr[_r_affinetridesc+atd_skinwidth] 787 788 ; } 789 790 LSkip2: 791 792 ; d_light += d_lightbasestep; 793 ; d_zi += d_zibasestep; 794 add edi,ds:dword ptr[_d_lightbasestep] 795 add ebp,ds:dword ptr[_d_zibasestep] 796 797 ; } 798 ; } while (--height); 799 mov esi,ds:dword ptr[_d_pedgespanpackage] 800 dec ecx 801 test ecx,0FFFFh 802 jnz LScanLoop 803 804 pop ebx 805 pop edi 806 pop esi 807 pop ebp 808 ret 809 810 _TEXT ENDS 811 endif ;id386 812 END