|
|
1.1 root 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
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.