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 // surf16.s
     22 // x86 assembly-language 16 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 //----------------------------------------------------------------------
     32 // Surface block drawer
     33 //----------------------------------------------------------------------
     34 
     35 	.data
     36 
     37 k:			.long	0
     38 loopentry:	.long	0
     39 
     40 	.align	4
     41 blockjumptable16:
     42 	.long	LEnter2_16
     43 	.long	LEnter4_16
     44 	.long	0, LEnter8_16
     45 	.long	0, 0, 0, LEnter16_16
     46 
     47 
     48 	.text
     49 
     50 	.align 4
     51 .globl C(R_Surf16Start)
     52 C(R_Surf16Start):
     53 
     54 	.align 4
     55 .globl C(R_DrawSurfaceBlock16)
     56 C(R_DrawSurfaceBlock16):
     57 	pushl	%ebp				// preserve caller's stack frame
     58 	pushl	%edi
     59 	pushl	%esi				// preserve register variables
     60 	pushl	%ebx
     61 
     62 	movl	C(blocksize),%eax
     63 	movl	C(prowdestbase),%edi
     64 	movl	C(pbasesource),%esi
     65 	movl	C(sourcesstep),%ebx
     66 	movl	blockjumptable16-4(,%eax,2),%ecx
     67 	movl	%eax,k
     68 	movl	%ecx,loopentry
     69 	movl	C(lightleft),%edx
     70 	movl	C(lightright),%ebp
     71 
     72 Lblockloop16:
     73 
     74 	subl	%edx,%ebp
     75 	movb	C(blockdivshift),%cl
     76 	sarl	%cl,%ebp
     77 	jns		Lp1_16
     78 	testl	C(blockdivmask),%ebp
     79 	jz		Lp1_16
     80 	incl	%ebp
     81 Lp1_16:
     82 
     83 	subl	%eax,%eax
     84 	subl	%ecx,%ecx	// high words must be 0 in loop for addressing
     85 
     86 	jmp		*loopentry
     87 
     88 	.align	4
     89 
     90 #include "block16.h"
     91 
     92 	movl	C(pbasesource),%esi
     93 	movl	C(lightleft),%edx
     94 	movl	C(lightright),%ebp
     95 	movl	C(sourcetstep),%eax
     96 	movl	C(lightrightstep),%ecx
     97 	movl	C(prowdestbase),%edi
     98 
     99 	addl	%eax,%esi
    100 	addl	%ecx,%ebp
    101 
    102 	movl	C(lightleftstep),%eax
    103 	movl	C(surfrowbytes),%ecx
    104 
    105 	addl	%eax,%edx
    106 	addl	%ecx,%edi
    107 
    108 	movl	%esi,C(pbasesource)
    109 	movl	%ebp,C(lightright)
    110 	movl	k,%eax
    111 	movl	%edx,C(lightleft)
    112 	decl	%eax
    113 	movl	%edi,C(prowdestbase)
    114 	movl	%eax,k
    115 	jnz		Lblockloop16
    116 
    117 	popl	%ebx				// restore register variables
    118 	popl	%esi
    119 	popl	%edi
    120 	popl	%ebp				// restore the caller's stack frame
    121 	ret
    122 
    123 .globl C(R_Surf16End)
    124 C(R_Surf16End):
    125 
    126 //----------------------------------------------------------------------
    127 // Code patching routines
    128 //----------------------------------------------------------------------
    129 	.data
    130 
    131 	.align 4
    132 LPatchTable16:
    133 	.long	LBPatch0-4
    134 	.long	LBPatch1-4
    135 	.long	LBPatch2-4
    136 	.long	LBPatch3-4
    137 	.long	LBPatch4-4
    138 	.long	LBPatch5-4
    139 	.long	LBPatch6-4
    140 	.long	LBPatch7-4
    141 	.long	LBPatch8-4
    142 	.long	LBPatch9-4
    143 	.long	LBPatch10-4
    144 	.long	LBPatch11-4
    145 	.long	LBPatch12-4
    146 	.long	LBPatch13-4
    147 	.long	LBPatch14-4
    148 	.long	LBPatch15-4
    149 
    150 	.text
    151 
    152 	.align 4
    153 .globl C(R_Surf16Patch)
    154 C(R_Surf16Patch):
    155 	pushl	%ebx
    156 
    157 	movl	C(colormap),%eax
    158 	movl	$LPatchTable16,%ebx
    159 	movl	$16,%ecx
    160 LPatchLoop16:
    161 	movl	(%ebx),%edx
    162 	addl	$4,%ebx
    163 	movl	%eax,(%edx)
    164 	decl	%ecx
    165 	jnz		LPatchLoop16
    166 
    167 	popl	%ebx
    168 
    169 	ret
    170 
    171 
    172 #endif	// id386
    173