123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173 |
- /*
- 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.
- //
- #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
|