/* Copyright (C) 1996-1997 Id Software, Inc. This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ // // surf16.s // x86 assembly-language 16 bpp surface block drawing code. // #define SWQUAKE #include "asm_i386.h" #include "quakeasm.h" #include "asm_draw.h" #if id386 //---------------------------------------------------------------------- // Surface block drawer //---------------------------------------------------------------------- .data k: .long 0 loopentry: .long 0 .align 4 blockjumptable16: .long LEnter2_16 .long LEnter4_16 .long 0, LEnter8_16 .long 0, 0, 0, LEnter16_16 .text .align 4 .globl C(R_Surf16Start) C(R_Surf16Start): .align 4 .globl C(R_DrawSurfaceBlock16) C(R_DrawSurfaceBlock16): pushl %ebp // preserve caller's stack frame pushl %edi pushl %esi // preserve register variables pushl %ebx movl C(blocksize),%eax movl C(prowdestbase),%edi movl C(pbasesource),%esi movl C(sourcesstep),%ebx movl blockjumptable16-4(,%eax,2),%ecx movl %eax,k movl %ecx,loopentry movl C(lightleft),%edx movl C(lightright),%ebp Lblockloop16: subl %edx,%ebp movb C(blockdivshift),%cl sarl %cl,%ebp jns Lp1_16 testl C(blockdivmask),%ebp jz Lp1_16 incl %ebp Lp1_16: subl %eax,%eax subl %ecx,%ecx // high words must be 0 in loop for addressing jmp *loopentry .align 4 #include "block16.h" movl C(pbasesource),%esi movl C(lightleft),%edx movl C(lightright),%ebp movl C(sourcetstep),%eax movl C(lightrightstep),%ecx movl C(prowdestbase),%edi addl %eax,%esi addl %ecx,%ebp movl C(lightleftstep),%eax movl C(surfrowbytes),%ecx addl %eax,%edx addl %ecx,%edi movl %esi,C(pbasesource) movl %ebp,C(lightright) movl k,%eax movl %edx,C(lightleft) decl %eax movl %edi,C(prowdestbase) movl %eax,k jnz Lblockloop16 popl %ebx // restore register variables popl %esi popl %edi popl %ebp // restore the caller's stack frame ret .globl C(R_Surf16End) C(R_Surf16End): //---------------------------------------------------------------------- // Code patching routines //---------------------------------------------------------------------- .data .align 4 LPatchTable16: .long LBPatch0-4 .long LBPatch1-4 .long LBPatch2-4 .long LBPatch3-4 .long LBPatch4-4 .long LBPatch5-4 .long LBPatch6-4 .long LBPatch7-4 .long LBPatch8-4 .long LBPatch9-4 .long LBPatch10-4 .long LBPatch11-4 .long LBPatch12-4 .long LBPatch13-4 .long LBPatch14-4 .long LBPatch15-4 .text .align 4 .globl C(R_Surf16Patch) C(R_Surf16Patch): pushl %ebx movl C(colormap),%eax movl $LPatchTable16,%ebx movl $16,%ecx LPatchLoop16: movl (%ebx),%edx addl $4,%ebx movl %eax,(%edx) decl %ecx jnz LPatchLoop16 popl %ebx ret #endif // id386