Quake-2

Quake 2 GPL Source Release
Log | Files | Refs

r_surf8.asm (14632B)


      1  .386P
      2  .model FLAT
      3 ;
      4 ; surf8.s
      5 ; x86 assembly-language 8 bpp surface block drawing code.
      6 ;
      7 
      8 include qasm.inc
      9 
     10 if	id386
     11 
     12 _DATA SEGMENT	
     13 
     14 sb_v dd 0	
     15 
     16 _DATA ENDS
     17 _TEXT SEGMENT	
     18 
     19  align 4	
     20  public _R_Surf8Start	
     21 _R_Surf8Start:	
     22 
     23 ;----------------------------------------------------------------------
     24 ; Surface block drawer for mip level 0
     25 ;----------------------------------------------------------------------
     26 
     27  align 4	
     28  public _R_DrawSurfaceBlock8_mip0	
     29 _R_DrawSurfaceBlock8_mip0:	
     30  push ebp	; preserve caller's stack frame
     31  push edi	
     32  push esi	; preserve register variables
     33  push ebx	
     34 
     35 ;		for (v=0 ; v<numvblocks ; v++)
     36 ;		{
     37  mov ebx,ds:dword ptr[_r_lightptr]	
     38  mov eax,ds:dword ptr[_r_numvblocks]	
     39 
     40  mov ds:dword ptr[sb_v],eax	
     41  mov edi,ds:dword ptr[_prowdestbase]	
     42 
     43  mov esi,ds:dword ptr[_pbasesource]	
     44 
     45 Lv_loop_mip0:	
     46 
     47 ;			lightleft = lightptr[0];
     48 ;			lightright = lightptr[1];
     49 ;			lightdelta = (lightleft - lightright) & 0xFFFFF;
     50  mov eax,ds:dword ptr[ebx]	; lightleft
     51  mov edx,ds:dword ptr[4+ebx]	; lightright
     52 
     53  mov ebp,eax	
     54  mov ecx,ds:dword ptr[_r_lightwidth]	
     55 
     56  mov ds:dword ptr[_lightright],edx	
     57  sub ebp,edx	
     58 
     59  and ebp,0FFFFFh	
     60  lea ebx,ds:dword ptr[ebx+ecx*4]	
     61 
     62 ;			lightptr += lightwidth;
     63  mov ds:dword ptr[_r_lightptr],ebx	
     64 
     65 ;			lightleftstep = (lightptr[0] - lightleft) >> blockdivshift;
     66 ;			lightrightstep = (lightptr[1] - lightright) >> blockdivshift;
     67 ;			lightdeltastep = ((lightleftstep - lightrightstep) & 0xFFFFF) |
     68 ;					0xF0000000;
     69  mov ecx,ds:dword ptr[4+ebx]	; lightptr[1]
     70  mov ebx,ds:dword ptr[ebx]	; lightptr[0]
     71 
     72  sub ebx,eax	
     73  sub ecx,edx	
     74 
     75  sar ecx,4	
     76  or ebp,0F0000000h	
     77 
     78  sar ebx,4	
     79  mov ds:dword ptr[_lightrightstep],ecx	
     80 
     81  sub ebx,ecx	
     82  and ebx,0FFFFFh	
     83 
     84  or ebx,0F0000000h	
     85  sub ecx,ecx	; high word must be 0 in loop for addressing
     86 
     87  mov ds:dword ptr[_lightdeltastep],ebx	
     88  sub ebx,ebx	; high word must be 0 in loop for addressing
     89 
     90 Lblockloop8_mip0:	
     91  mov ds:dword ptr[_lightdelta],ebp	
     92  mov cl,ds:byte ptr[14+esi]	
     93 
     94  sar ebp,4	
     95  mov bh,dh	
     96 
     97  mov bl,ds:byte ptr[15+esi]	
     98  add edx,ebp	
     99 
    100  mov ch,dh	
    101  add edx,ebp	
    102 
    103  mov ah,ds:byte ptr[12345678h+ebx]	
    104 LBPatch0:	
    105  mov bl,ds:byte ptr[13+esi]	
    106 
    107  mov al,ds:byte ptr[12345678h+ecx]	
    108 LBPatch1:	
    109  mov cl,ds:byte ptr[12+esi]	
    110 
    111  mov bh,dh	
    112  add edx,ebp	
    113 
    114  ror eax,16	
    115  mov ch,dh	
    116 
    117  add edx,ebp	
    118  mov ah,ds:byte ptr[12345678h+ebx]	
    119 LBPatch2:	
    120 
    121  mov bl,ds:byte ptr[11+esi]	
    122  mov al,ds:byte ptr[12345678h+ecx]	
    123 LBPatch3:	
    124 
    125  mov cl,ds:byte ptr[10+esi]	
    126  mov ds:dword ptr[12+edi],eax	
    127 
    128  mov bh,dh	
    129  add edx,ebp	
    130 
    131  mov ch,dh	
    132  add edx,ebp	
    133 
    134  mov ah,ds:byte ptr[12345678h+ebx]	
    135 LBPatch4:	
    136  mov bl,ds:byte ptr[9+esi]	
    137 
    138  mov al,ds:byte ptr[12345678h+ecx]	
    139 LBPatch5:	
    140  mov cl,ds:byte ptr[8+esi]	
    141 
    142  mov bh,dh	
    143  add edx,ebp	
    144 
    145  ror eax,16	
    146  mov ch,dh	
    147 
    148  add edx,ebp	
    149  mov ah,ds:byte ptr[12345678h+ebx]	
    150 LBPatch6:	
    151 
    152  mov bl,ds:byte ptr[7+esi]	
    153  mov al,ds:byte ptr[12345678h+ecx]	
    154 LBPatch7:	
    155 
    156  mov cl,ds:byte ptr[6+esi]	
    157  mov ds:dword ptr[8+edi],eax	
    158 
    159  mov bh,dh	
    160  add edx,ebp	
    161 
    162  mov ch,dh	
    163  add edx,ebp	
    164 
    165  mov ah,ds:byte ptr[12345678h+ebx]	
    166 LBPatch8:	
    167  mov bl,ds:byte ptr[5+esi]	
    168 
    169  mov al,ds:byte ptr[12345678h+ecx]	
    170 LBPatch9:	
    171  mov cl,ds:byte ptr[4+esi]	
    172 
    173  mov bh,dh	
    174  add edx,ebp	
    175 
    176  ror eax,16	
    177  mov ch,dh	
    178 
    179  add edx,ebp	
    180  mov ah,ds:byte ptr[12345678h+ebx]	
    181 LBPatch10:	
    182 
    183  mov bl,ds:byte ptr[3+esi]	
    184  mov al,ds:byte ptr[12345678h+ecx]	
    185 LBPatch11:	
    186 
    187  mov cl,ds:byte ptr[2+esi]	
    188  mov ds:dword ptr[4+edi],eax	
    189 
    190  mov bh,dh	
    191  add edx,ebp	
    192 
    193  mov ch,dh	
    194  add edx,ebp	
    195 
    196  mov ah,ds:byte ptr[12345678h+ebx]	
    197 LBPatch12:	
    198  mov bl,ds:byte ptr[1+esi]	
    199 
    200  mov al,ds:byte ptr[12345678h+ecx]	
    201 LBPatch13:	
    202  mov cl,ds:byte ptr[esi]	
    203 
    204  mov bh,dh	
    205  add edx,ebp	
    206 
    207  ror eax,16	
    208  mov ch,dh	
    209 
    210  mov ah,ds:byte ptr[12345678h+ebx]	
    211 LBPatch14:	
    212  mov edx,ds:dword ptr[_lightright]	
    213 
    214  mov al,ds:byte ptr[12345678h+ecx]	
    215 LBPatch15:	
    216  mov ebp,ds:dword ptr[_lightdelta]	
    217 
    218  mov ds:dword ptr[edi],eax	
    219 
    220  add esi,ds:dword ptr[_sourcetstep]	
    221  add edi,ds:dword ptr[_surfrowbytes]	
    222 
    223  add edx,ds:dword ptr[_lightrightstep]	
    224  add ebp,ds:dword ptr[_lightdeltastep]	
    225 
    226  mov ds:dword ptr[_lightright],edx	
    227  jc Lblockloop8_mip0	
    228 
    229 ;			if (pbasesource >= r_sourcemax)
    230 ;				pbasesource -= stepback;
    231 
    232  cmp esi,ds:dword ptr[_r_sourcemax]	
    233  jb LSkip_mip0	
    234  sub esi,ds:dword ptr[_r_stepback]	
    235 LSkip_mip0:	
    236 
    237  mov ebx,ds:dword ptr[_r_lightptr]	
    238  dec ds:dword ptr[sb_v]	
    239 
    240  jnz Lv_loop_mip0	
    241 
    242  pop ebx	; restore register variables
    243  pop esi	
    244  pop edi	
    245  pop ebp	; restore the caller's stack frame
    246  ret	
    247 
    248 
    249 ;----------------------------------------------------------------------
    250 ; Surface block drawer for mip level 1
    251 ;----------------------------------------------------------------------
    252 
    253  align 4	
    254  public _R_DrawSurfaceBlock8_mip1	
    255 _R_DrawSurfaceBlock8_mip1:	
    256  push ebp	; preserve caller's stack frame
    257  push edi	
    258  push esi	; preserve register variables
    259  push ebx	
    260 
    261 ;		for (v=0 ; v<numvblocks ; v++)
    262 ;		{
    263  mov ebx,ds:dword ptr[_r_lightptr]	
    264  mov eax,ds:dword ptr[_r_numvblocks]	
    265 
    266  mov ds:dword ptr[sb_v],eax	
    267  mov edi,ds:dword ptr[_prowdestbase]	
    268 
    269  mov esi,ds:dword ptr[_pbasesource]	
    270 
    271 Lv_loop_mip1:	
    272 
    273 ;			lightleft = lightptr[0];
    274 ;			lightright = lightptr[1];
    275 ;			lightdelta = (lightleft - lightright) & 0xFFFFF;
    276  mov eax,ds:dword ptr[ebx]	; lightleft
    277  mov edx,ds:dword ptr[4+ebx]	; lightright
    278 
    279  mov ebp,eax	
    280  mov ecx,ds:dword ptr[_r_lightwidth]	
    281 
    282  mov ds:dword ptr[_lightright],edx	
    283  sub ebp,edx	
    284 
    285  and ebp,0FFFFFh	
    286  lea ebx,ds:dword ptr[ebx+ecx*4]	
    287 
    288 ;			lightptr += lightwidth;
    289  mov ds:dword ptr[_r_lightptr],ebx	
    290 
    291 ;			lightleftstep = (lightptr[0] - lightleft) >> blockdivshift;
    292 ;			lightrightstep = (lightptr[1] - lightright) >> blockdivshift;
    293 ;			lightdeltastep = ((lightleftstep - lightrightstep) & 0xFFFFF) |
    294 ;					0xF0000000;
    295  mov ecx,ds:dword ptr[4+ebx]	; lightptr[1]
    296  mov ebx,ds:dword ptr[ebx]	; lightptr[0]
    297 
    298  sub ebx,eax	
    299  sub ecx,edx	
    300 
    301  sar ecx,3	
    302  or ebp,070000000h	
    303 
    304  sar ebx,3	
    305  mov ds:dword ptr[_lightrightstep],ecx	
    306 
    307  sub ebx,ecx	
    308  and ebx,0FFFFFh	
    309 
    310  or ebx,0F0000000h	
    311  sub ecx,ecx	; high word must be 0 in loop for addressing
    312 
    313  mov ds:dword ptr[_lightdeltastep],ebx	
    314  sub ebx,ebx	; high word must be 0 in loop for addressing
    315 
    316 Lblockloop8_mip1:	
    317  mov ds:dword ptr[_lightdelta],ebp	
    318  mov cl,ds:byte ptr[6+esi]	
    319 
    320  sar ebp,3	
    321  mov bh,dh	
    322 
    323  mov bl,ds:byte ptr[7+esi]	
    324  add edx,ebp	
    325 
    326  mov ch,dh	
    327  add edx,ebp	
    328 
    329  mov ah,ds:byte ptr[12345678h+ebx]	
    330 LBPatch22:	
    331  mov bl,ds:byte ptr[5+esi]	
    332 
    333  mov al,ds:byte ptr[12345678h+ecx]	
    334 LBPatch23:	
    335  mov cl,ds:byte ptr[4+esi]	
    336 
    337  mov bh,dh	
    338  add edx,ebp	
    339 
    340  ror eax,16	
    341  mov ch,dh	
    342 
    343  add edx,ebp	
    344  mov ah,ds:byte ptr[12345678h+ebx]	
    345 LBPatch24:	
    346 
    347  mov bl,ds:byte ptr[3+esi]	
    348  mov al,ds:byte ptr[12345678h+ecx]	
    349 LBPatch25:	
    350 
    351  mov cl,ds:byte ptr[2+esi]	
    352  mov ds:dword ptr[4+edi],eax	
    353 
    354  mov bh,dh	
    355  add edx,ebp	
    356 
    357  mov ch,dh	
    358  add edx,ebp	
    359 
    360  mov ah,ds:byte ptr[12345678h+ebx]	
    361 LBPatch26:	
    362  mov bl,ds:byte ptr[1+esi]	
    363 
    364  mov al,ds:byte ptr[12345678h+ecx]	
    365 LBPatch27:	
    366  mov cl,ds:byte ptr[esi]	
    367 
    368  mov bh,dh	
    369  add edx,ebp	
    370 
    371  ror eax,16	
    372  mov ch,dh	
    373 
    374  mov ah,ds:byte ptr[12345678h+ebx]	
    375 LBPatch28:	
    376  mov edx,ds:dword ptr[_lightright]	
    377 
    378  mov al,ds:byte ptr[12345678h+ecx]	
    379 LBPatch29:	
    380  mov ebp,ds:dword ptr[_lightdelta]	
    381 
    382  mov ds:dword ptr[edi],eax	
    383  mov eax,ds:dword ptr[_sourcetstep]	
    384 
    385  add esi,eax	
    386  mov eax,ds:dword ptr[_surfrowbytes]	
    387 
    388  add edi,eax	
    389  mov eax,ds:dword ptr[_lightrightstep]	
    390 
    391  add edx,eax	
    392  mov eax,ds:dword ptr[_lightdeltastep]	
    393 
    394  add ebp,eax	
    395  mov ds:dword ptr[_lightright],edx	
    396 
    397  jc Lblockloop8_mip1	
    398 
    399 ;			if (pbasesource >= r_sourcemax)
    400 ;				pbasesource -= stepback;
    401 
    402  cmp esi,ds:dword ptr[_r_sourcemax]	
    403  jb LSkip_mip1	
    404  sub esi,ds:dword ptr[_r_stepback]	
    405 LSkip_mip1:	
    406 
    407  mov ebx,ds:dword ptr[_r_lightptr]	
    408  dec ds:dword ptr[sb_v]	
    409 
    410  jnz Lv_loop_mip1	
    411 
    412  pop ebx	; restore register variables
    413  pop esi	
    414  pop edi	
    415  pop ebp	; restore the caller's stack frame
    416  ret	
    417 
    418 
    419 ;----------------------------------------------------------------------
    420 ; Surface block drawer for mip level 2
    421 ;----------------------------------------------------------------------
    422 
    423  align 4	
    424  public _R_DrawSurfaceBlock8_mip2	
    425 _R_DrawSurfaceBlock8_mip2:	
    426  push ebp	; preserve caller's stack frame
    427  push edi	
    428  push esi	; preserve register variables
    429  push ebx	
    430 
    431 ;		for (v=0 ; v<numvblocks ; v++)
    432 ;		{
    433  mov ebx,ds:dword ptr[_r_lightptr]	
    434  mov eax,ds:dword ptr[_r_numvblocks]	
    435 
    436  mov ds:dword ptr[sb_v],eax	
    437  mov edi,ds:dword ptr[_prowdestbase]	
    438 
    439  mov esi,ds:dword ptr[_pbasesource]	
    440 
    441 Lv_loop_mip2:	
    442 
    443 ;			lightleft = lightptr[0];
    444 ;			lightright = lightptr[1];
    445 ;			lightdelta = (lightleft - lightright) & 0xFFFFF;
    446  mov eax,ds:dword ptr[ebx]	; lightleft
    447  mov edx,ds:dword ptr[4+ebx]	; lightright
    448 
    449  mov ebp,eax	
    450  mov ecx,ds:dword ptr[_r_lightwidth]	
    451 
    452  mov ds:dword ptr[_lightright],edx	
    453  sub ebp,edx	
    454 
    455  and ebp,0FFFFFh	
    456  lea ebx,ds:dword ptr[ebx+ecx*4]	
    457 
    458 ;			lightptr += lightwidth;
    459  mov ds:dword ptr[_r_lightptr],ebx	
    460 
    461 ;			lightleftstep = (lightptr[0] - lightleft) >> blockdivshift;
    462 ;			lightrightstep = (lightptr[1] - lightright) >> blockdivshift;
    463 ;			lightdeltastep = ((lightleftstep - lightrightstep) & 0xFFFFF) |
    464 ;					0xF0000000;
    465  mov ecx,ds:dword ptr[4+ebx]	; lightptr[1]
    466  mov ebx,ds:dword ptr[ebx]	; lightptr[0]
    467 
    468  sub ebx,eax	
    469  sub ecx,edx	
    470 
    471  sar ecx,2	
    472  or ebp,030000000h	
    473 
    474  sar ebx,2	
    475  mov ds:dword ptr[_lightrightstep],ecx	
    476 
    477  sub ebx,ecx	
    478 
    479  and ebx,0FFFFFh	
    480 
    481  or ebx,0F0000000h	
    482  sub ecx,ecx	; high word must be 0 in loop for addressing
    483 
    484  mov ds:dword ptr[_lightdeltastep],ebx	
    485  sub ebx,ebx	; high word must be 0 in loop for addressing
    486 
    487 Lblockloop8_mip2:	
    488  mov ds:dword ptr[_lightdelta],ebp	
    489  mov cl,ds:byte ptr[2+esi]	
    490 
    491  sar ebp,2	
    492  mov bh,dh	
    493 
    494  mov bl,ds:byte ptr[3+esi]	
    495  add edx,ebp	
    496 
    497  mov ch,dh	
    498  add edx,ebp	
    499 
    500  mov ah,ds:byte ptr[12345678h+ebx]	
    501 LBPatch18:	
    502  mov bl,ds:byte ptr[1+esi]	
    503 
    504  mov al,ds:byte ptr[12345678h+ecx]	
    505 LBPatch19:	
    506  mov cl,ds:byte ptr[esi]	
    507 
    508  mov bh,dh	
    509  add edx,ebp	
    510 
    511  ror eax,16	
    512  mov ch,dh	
    513 
    514  mov ah,ds:byte ptr[12345678h+ebx]	
    515 LBPatch20:	
    516  mov edx,ds:dword ptr[_lightright]	
    517 
    518  mov al,ds:byte ptr[12345678h+ecx]	
    519 LBPatch21:	
    520  mov ebp,ds:dword ptr[_lightdelta]	
    521 
    522  mov ds:dword ptr[edi],eax	
    523  mov eax,ds:dword ptr[_sourcetstep]	
    524 
    525  add esi,eax	
    526  mov eax,ds:dword ptr[_surfrowbytes]	
    527 
    528  add edi,eax	
    529  mov eax,ds:dword ptr[_lightrightstep]	
    530 
    531  add edx,eax	
    532  mov eax,ds:dword ptr[_lightdeltastep]	
    533 
    534  add ebp,eax	
    535  mov ds:dword ptr[_lightright],edx	
    536 
    537  jc Lblockloop8_mip2	
    538 
    539 ;			if (pbasesource >= r_sourcemax)
    540 ;				pbasesource -= stepback;
    541 
    542  cmp esi,ds:dword ptr[_r_sourcemax]	
    543  jb LSkip_mip2	
    544  sub esi,ds:dword ptr[_r_stepback]	
    545 LSkip_mip2:	
    546 
    547  mov ebx,ds:dword ptr[_r_lightptr]	
    548  dec ds:dword ptr[sb_v]	
    549 
    550  jnz Lv_loop_mip2	
    551 
    552  pop ebx	; restore register variables
    553  pop esi	
    554  pop edi	
    555  pop ebp	; restore the caller's stack frame
    556  ret	
    557 
    558 
    559 ;----------------------------------------------------------------------
    560 ; Surface block drawer for mip level 3
    561 ;----------------------------------------------------------------------
    562 
    563  align 4	
    564  public _R_DrawSurfaceBlock8_mip3	
    565 _R_DrawSurfaceBlock8_mip3:	
    566  push ebp	; preserve caller's stack frame
    567  push edi	
    568  push esi	; preserve register variables
    569  push ebx	
    570 
    571 ;		for (v=0 ; v<numvblocks ; v++)
    572 ;		{
    573  mov ebx,ds:dword ptr[_r_lightptr]	
    574  mov eax,ds:dword ptr[_r_numvblocks]	
    575 
    576  mov ds:dword ptr[sb_v],eax	
    577  mov edi,ds:dword ptr[_prowdestbase]	
    578 
    579  mov esi,ds:dword ptr[_pbasesource]	
    580 
    581 Lv_loop_mip3:	
    582 
    583 ;			lightleft = lightptr[0];
    584 ;			lightright = lightptr[1];
    585 ;			lightdelta = (lightleft - lightright) & 0xFFFFF;
    586  mov eax,ds:dword ptr[ebx]	; lightleft
    587  mov edx,ds:dword ptr[4+ebx]	; lightright
    588 
    589  mov ebp,eax	
    590  mov ecx,ds:dword ptr[_r_lightwidth]	
    591 
    592  mov ds:dword ptr[_lightright],edx	
    593  sub ebp,edx	
    594 
    595  and ebp,0FFFFFh	
    596  lea ebx,ds:dword ptr[ebx+ecx*4]	
    597 
    598  mov ds:dword ptr[_lightdelta],ebp	
    599 ;			lightptr += lightwidth;
    600  mov ds:dword ptr[_r_lightptr],ebx	
    601 
    602 ;			lightleftstep = (lightptr[0] - lightleft) >> blockdivshift;
    603 ;			lightrightstep = (lightptr[1] - lightright) >> blockdivshift;
    604 ;			lightdeltastep = ((lightleftstep - lightrightstep) & 0xFFFFF) |
    605 ;					0xF0000000;
    606  mov ecx,ds:dword ptr[4+ebx]	; lightptr[1]
    607  mov ebx,ds:dword ptr[ebx]	; lightptr[0]
    608 
    609  sub ebx,eax	
    610  sub ecx,edx	
    611 
    612  sar ecx,1	
    613 
    614  sar ebx,1	
    615  mov ds:dword ptr[_lightrightstep],ecx	
    616 
    617  sub ebx,ecx	
    618  and ebx,0FFFFFh	
    619 
    620  sar ebp,1	
    621  or ebx,0F0000000h	
    622 
    623  mov ds:dword ptr[_lightdeltastep],ebx	
    624  sub ebx,ebx	; high word must be 0 in loop for addressing
    625 
    626  mov bl,ds:byte ptr[1+esi]	
    627  sub ecx,ecx	; high word must be 0 in loop for addressing
    628 
    629  mov bh,dh	
    630  mov cl,ds:byte ptr[esi]	
    631 
    632  add edx,ebp	
    633  mov ch,dh	
    634 
    635  mov al,ds:byte ptr[12345678h+ebx]	
    636 LBPatch16:	
    637  mov edx,ds:dword ptr[_lightright]	
    638 
    639  mov ds:byte ptr[1+edi],al	
    640  mov al,ds:byte ptr[12345678h+ecx]	
    641 LBPatch17:	
    642 
    643  mov ds:byte ptr[edi],al	
    644  mov eax,ds:dword ptr[_sourcetstep]	
    645 
    646  add esi,eax	
    647  mov eax,ds:dword ptr[_surfrowbytes]	
    648 
    649  add edi,eax	
    650  mov eax,ds:dword ptr[_lightdeltastep]	
    651 
    652  mov ebp,ds:dword ptr[_lightdelta]	
    653  mov cl,ds:byte ptr[esi]	
    654 
    655  add ebp,eax	
    656  mov eax,ds:dword ptr[_lightrightstep]	
    657 
    658  sar ebp,1	
    659  add edx,eax	
    660 
    661  mov bh,dh	
    662  mov bl,ds:byte ptr[1+esi]	
    663 
    664  add edx,ebp	
    665  mov ch,dh	
    666 
    667  mov al,ds:byte ptr[12345678h+ebx]	
    668 LBPatch30:	
    669  mov edx,ds:dword ptr[_sourcetstep]	
    670 
    671  mov ds:byte ptr[1+edi],al	
    672  mov al,ds:byte ptr[12345678h+ecx]	
    673 LBPatch31:	
    674 
    675  mov ds:byte ptr[edi],al	
    676  mov ebp,ds:dword ptr[_surfrowbytes]	
    677 
    678  add esi,edx	
    679  add edi,ebp	
    680 
    681 ;			if (pbasesource >= r_sourcemax)
    682 ;				pbasesource -= stepback;
    683 
    684  cmp esi,ds:dword ptr[_r_sourcemax]	
    685  jb LSkip_mip3	
    686  sub esi,ds:dword ptr[_r_stepback]	
    687 LSkip_mip3:	
    688 
    689  mov ebx,ds:dword ptr[_r_lightptr]	
    690  dec ds:dword ptr[sb_v]	
    691 
    692  jnz Lv_loop_mip3	
    693 
    694  pop ebx	; restore register variables
    695  pop esi	
    696  pop edi	
    697  pop ebp	; restore the caller's stack frame
    698  ret	
    699 
    700 
    701  public _R_Surf8End	
    702 _R_Surf8End:	
    703 
    704 ;----------------------------------------------------------------------
    705 ; Code patching routines
    706 ;----------------------------------------------------------------------
    707 _TEXT ENDS
    708 _DATA SEGMENT	
    709 
    710  align 4	
    711 LPatchTable8:	
    712  dd LBPatch0-4	
    713  dd LBPatch1-4	
    714  dd LBPatch2-4	
    715  dd LBPatch3-4	
    716  dd LBPatch4-4	
    717  dd LBPatch5-4	
    718  dd LBPatch6-4	
    719  dd LBPatch7-4	
    720  dd LBPatch8-4	
    721  dd LBPatch9-4	
    722  dd LBPatch10-4	
    723  dd LBPatch11-4	
    724  dd LBPatch12-4	
    725  dd LBPatch13-4	
    726  dd LBPatch14-4	
    727  dd LBPatch15-4	
    728  dd LBPatch16-4	
    729  dd LBPatch17-4	
    730  dd LBPatch18-4	
    731  dd LBPatch19-4	
    732  dd LBPatch20-4	
    733  dd LBPatch21-4	
    734  dd LBPatch22-4	
    735  dd LBPatch23-4	
    736  dd LBPatch24-4	
    737  dd LBPatch25-4	
    738  dd LBPatch26-4	
    739  dd LBPatch27-4	
    740  dd LBPatch28-4	
    741  dd LBPatch29-4	
    742  dd LBPatch30-4	
    743  dd LBPatch31-4	
    744 
    745 _DATA ENDS
    746 _TEXT SEGMENT	
    747 
    748  align 4	
    749  public _R_Surf8Patch	
    750 _R_Surf8Patch:	
    751  push ebx	
    752 
    753  mov eax,ds:dword ptr[_colormap]	
    754  mov ebx,offset LPatchTable8
    755  mov ecx,32	
    756 LPatchLoop8:	
    757  mov edx,ds:dword ptr[ebx]	
    758  add ebx,4	
    759  mov ds:dword ptr[edx],eax	
    760  dec ecx	
    761  jnz LPatchLoop8	
    762 
    763  pop ebx	
    764 
    765  ret	
    766 
    767 _TEXT ENDS
    768 endif	;id386
    769 
    770  END
    771