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