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// d_scana.s
22// x86 assembly-language turbulent texture mapping code
23//
24
25#include "asm_i386.h"
26#include "quakeasm.h"
27#include "asm_draw.h"
28#include "d_ifacea.h"
29
30#if id386
31
32	.data
33
34	.text
35
36//----------------------------------------------------------------------
37// turbulent texture mapping code
38//----------------------------------------------------------------------
39
40	.align 4
41.globl C(D_DrawTurbulent8Span)
42C(D_DrawTurbulent8Span):
43	pushl	%ebp				// preserve caller's stack frame pointer
44	pushl	%esi				// preserve register variables
45	pushl	%edi
46	pushl	%ebx
47
48	movl	C(r_turb_s),%esi
49	movl	C(r_turb_t),%ecx
50	movl	C(r_turb_pdest),%edi
51	movl	C(r_turb_spancount),%ebx
52
53Llp:
54	movl	%ecx,%eax
55	movl	%esi,%edx
56	sarl	$16,%eax
57	movl	C(r_turb_turb),%ebp
58	sarl	$16,%edx
59	andl	$(CYCLE-1),%eax
60	andl	$(CYCLE-1),%edx
61	movl	(%ebp,%eax,4),%eax
62	movl	(%ebp,%edx,4),%edx
63	addl	%esi,%eax
64	sarl	$16,%eax
65	addl	%ecx,%edx
66	sarl	$16,%edx
67	andl	$(TURB_TEX_SIZE-1),%eax
68	andl	$(TURB_TEX_SIZE-1),%edx
69	shll	$6,%edx
70	movl	C(r_turb_pbase),%ebp
71	addl	%eax,%edx
72	incl	%edi
73	addl	C(r_turb_sstep),%esi
74	addl	C(r_turb_tstep),%ecx
75	movb	(%ebp,%edx,1),%dl
76	decl	%ebx
77	movb	%dl,-1(%edi)
78	jnz		Llp
79
80	movl	%edi,C(r_turb_pdest)
81
82	popl	%ebx				// restore register variables
83	popl	%edi
84	popl	%esi
85	popl	%ebp				// restore caller's stack frame pointer
86	ret
87
88#endif	// id386
89
90