1/* 2Copyright (C) 1996-1997 Id Software, Inc. 3 4This program is free software; you can redistribute it and/or 5modify it under the terms of the GNU General Public License 6as published by the Free Software Foundation; either version 2 7of the License, or (at your option) any later version. 8 9This program is distributed in the hope that it will be useful, 10but WITHOUT ANY WARRANTY; without even the implied warranty of 11MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. 12 13See the GNU General Public License for more details. 14 15You should have received a copy of the GNU General Public License 16along with this program; if not, write to the Free Software 17Foundation, 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 37k: .long 0 38loopentry: .long 0 39 40 .align 4 41blockjumptable16: 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) 52C(R_Surf16Start): 53 54 .align 4 55.globl C(R_DrawSurfaceBlock16) 56C(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 72Lblockloop16: 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 81Lp1_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) 124C(R_Surf16End): 125 126//---------------------------------------------------------------------- 127// Code patching routines 128//---------------------------------------------------------------------- 129 .data 130 131 .align 4 132LPatchTable16: 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) 154C(R_Surf16Patch): 155 pushl %ebx 156 157 movl C(colormap),%eax 158 movl $LPatchTable16,%ebx 159 movl $16,%ecx 160LPatchLoop16: 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