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