1//
2// d_scana.s
3// x86 assembly-language turbulent texture mapping code
4//
5
6#include "qasm.h"
7#include "d_ifacea.h"
8
9#if id386
10
11	.data
12
13	.text
14
15//----------------------------------------------------------------------
16// turbulent texture mapping code
17//----------------------------------------------------------------------
18
19	.align 4
20.globl C(D_DrawTurbulent8Span)
21C(D_DrawTurbulent8Span):
22	pushl	%ebp				// preserve caller's stack frame pointer
23	pushl	%esi				// preserve register variables
24	pushl	%edi
25	pushl	%ebx
26
27	movl	C(r_turb_s),%esi
28	movl	C(r_turb_t),%ecx
29	movl	C(r_turb_pdest),%edi
30	movl	C(r_turb_spancount),%ebx
31
32Llp:
33	movl	%ecx,%eax
34	movl	%esi,%edx
35	sarl	$16,%eax
36	movl	C(r_turb_turb),%ebp
37	sarl	$16,%edx
38	andl	$(CYCLE-1),%eax
39	andl	$(CYCLE-1),%edx
40	movl	(%ebp,%eax,4),%eax
41	movl	(%ebp,%edx,4),%edx
42	addl	%esi,%eax
43	sarl	$16,%eax
44	addl	%ecx,%edx
45	sarl	$16,%edx
46	andl	$(TURB_TEX_SIZE-1),%eax
47	andl	$(TURB_TEX_SIZE-1),%edx
48	shll	$6,%edx
49	movl	C(r_turb_pbase),%ebp
50	addl	%eax,%edx
51	incl	%edi
52	addl	C(r_turb_sstep),%esi
53	addl	C(r_turb_tstep),%ecx
54	movb	(%ebp,%edx,1),%dl
55	decl	%ebx
56	movb	%dl,-1(%edi)
57	jnz		Llp
58
59	movl	%edi,C(r_turb_pdest)
60
61	popl	%ebx				// restore register variables
62	popl	%edi
63	popl	%esi
64	popl	%ebp				// restore caller's stack frame pointer
65	ret
66
67#endif	// id386
68
69