Subversion Repositories Kolibri OS

Rev

Details | Last modification | View Log | RSS feed

Rev Author Line No. Line
5131 clevermous 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