Quake-2

Quake 2 GPL Source Release
Log | Files | Refs

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