Rev 2192 | Go to most recent revision | Only display areas with differences | Regard whitespace | Details | Blame | Last modification | View Log | RSS feed
Rev 2192 | Rev 6619 | ||
---|---|---|---|
1 | CATMULL_SHIFT equ 8 |
1 | CATMULL_SHIFT equ 8 |
2 | ROUND equ 8 |
2 | ROUND equ 8 |
3 | ;NON=0 |
3 | ;NON=0 |
4 | ;MMX=1 |
4 | ;MMX=1 |
5 | ;Ext=MMX |
5 | ;Ext=MMX |
6 | ;TEX_SIZE=0x3fff |
6 | ;TEX_SIZE=0x3fff |
7 | ;SIZE_X equ 512 |
7 | ;SIZE_X equ 512 |
8 | ;SIZE_Y equ 512 |
8 | ;SIZE_Y equ 512 |
9 | ;ROUND = 8 |
9 | ;ROUND = 8 |
10 | ;TEX_SHIFT equ 6 |
10 | ;TEX_SHIFT equ 6 |
11 | 11 | ||
12 | ; procedure drawing textured triangle with Gouraud shading |
12 | ; procedure drawing textured triangle with Gouraud shading |
13 | ; Z-buffer alghoritm included, Z coord interpolation ---- |
13 | ; Z-buffer alghoritm included, Z coord interpolation ---- |
14 | ; I set the color by this way -- (col1 * col2)/256 ------ |
14 | ; I set the color by this way -- (col1 * col2)/256 ------ |
15 | ;------------------in - eax - x1 shl 16 + y1 ------------ |
15 | ;------------------in - eax - x1 shl 16 + y1 ------------ |
16 | ;---------------------- ebx - x2 shl 16 + y2 ------------ |
16 | ;---------------------- ebx - x2 shl 16 + y2 ------------ |
17 | ;---------------------- ecx - x3 shl 16 + y3 ------------ |
17 | ;---------------------- ecx - x3 shl 16 + y3 ------------ |
18 | ;---------------------- esi - pointer to Z-buffer-------- |
18 | ;---------------------- esi - pointer to Z-buffer-------- |
19 | ;---------------------- edx - pointer to texture--------- |
19 | ;---------------------- edx - pointer to texture--------- |
20 | ;---------------------- Z-buffer filled with dd variables |
20 | ;---------------------- Z-buffer filled with dd variables |
21 | ;---------------------- shifted CATMULL_SHIFT------------ |
21 | ;---------------------- shifted CATMULL_SHIFT------------ |
22 | ;---------------------- edi - pointer to screen buffer--- |
22 | ;---------------------- edi - pointer to screen buffer--- |
23 | ;---------------------- stack : colors------------------- |
23 | ;---------------------- stack : colors------------------- |
24 | 24 | ||
25 | 25 | ||
26 | 26 | ||
27 | tex_plus_grd_triangle: |
27 | tex_plus_grd_triangle: |
28 | ; parameters : |
28 | ; parameters : |
29 | .tex_y3 equ [ebp+38] ; 36 bytes through stack |
29 | .tex_y3 equ [ebp+38] ; 36 bytes through stack |
30 | .tex_x3 equ [ebp+36] |
30 | .tex_x3 equ [ebp+36] |
31 | .tex_y2 equ [ebp+34] |
31 | .tex_y2 equ [ebp+34] |
32 | .tex_x2 equ [ebp+32] |
32 | .tex_x2 equ [ebp+32] |
33 | .tex_y1 equ [ebp+30] |
33 | .tex_y1 equ [ebp+30] |
34 | .tex_x1 equ [ebp+28] |
34 | .tex_x1 equ [ebp+28] |
35 | 35 | ||
36 | .z3 equ [ebp+26] |
36 | .z3 equ [ebp+26] |
37 | .col3b equ [ebp+24] |
37 | .col3b equ [ebp+24] |
38 | .col3g equ [ebp+22] |
38 | .col3g equ [ebp+22] |
39 | .col3r equ [ebp+20] |
39 | .col3r equ [ebp+20] |
40 | 40 | ||
41 | .z2 equ [ebp+18] |
41 | .z2 equ [ebp+18] |
42 | .col2b equ [ebp+16] |
42 | .col2b equ [ebp+16] |
43 | .col2g equ [ebp+14] |
43 | .col2g equ [ebp+14] |
44 | .col2r equ [ebp+12] |
44 | .col2r equ [ebp+12] |
45 | 45 | ||
46 | .z1 equ [ebp+10] |
46 | .z1 equ [ebp+10] |
47 | .col1b equ [ebp+8] |
47 | .col1b equ [ebp+8] |
48 | .col1g equ [ebp+6] |
48 | .col1g equ [ebp+6] |
49 | .col1r equ [ebp+4] |
49 | .col1r equ [ebp+4] |
50 | 50 | ||
51 | ; local variables: |
51 | ; local variables: |
52 | 52 | ||
53 | .tex_ptr equ dword[ebp-4] |
53 | .tex_ptr equ dword[ebp-4] |
54 | .z_ptr equ dword[ebp-8] |
54 | .z_ptr equ dword[ebp-8] |
55 | .scr_buff equ dword[ebp-12] |
55 | .scr_buff equ dword[ebp-12] |
56 | 56 | ||
57 | .x1 equ word[ebp-14] ;dw ? ;equ word[ebp-10] |
57 | .x1 equ word[ebp-14] ;dw ? ;equ word[ebp-10] |
58 | .y1 equ word[ebp-16] ;dw ? ;equ word[ebp-12] |
58 | .y1 equ word[ebp-16] ;dw ? ;equ word[ebp-12] |
59 | .x2 equ word[ebp-18] ;dw ? ;equ word[ebp-14] |
59 | .x2 equ word[ebp-18] ;dw ? ;equ word[ebp-14] |
60 | .y2 equ word[ebp-20] ;dw ? ;equ word[ebp-16] |
60 | .y2 equ word[ebp-20] ;dw ? ;equ word[ebp-16] |
61 | .x3 equ word[ebp-22] ;dw ? ;equ word[ebp-18] |
61 | .x3 equ word[ebp-22] ;dw ? ;equ word[ebp-18] |
62 | .y3 equ word[ebp-24] ;dw ? ;equ word[ebp-20] |
62 | .y3 equ word[ebp-24] ;dw ? ;equ word[ebp-20] |
63 | 63 | ||
64 | .dx12 equ dword[ebp-28] ;dd ? |
64 | .dx12 equ dword[ebp-28] ;dd ? |
65 | .tex_dx12 equ dword[ebp-32] ;dd ? |
65 | .tex_dx12 equ dword[ebp-32] ;dd ? |
66 | .tex_dy12 equ [ebp-36] ;dd ? |
66 | .tex_dy12 equ [ebp-36] ;dd ? |
67 | .dz12 equ dword[ebp-40] ;dd ? |
67 | .dz12 equ dword[ebp-40] ;dd ? |
68 | .dc12r equ [ebp-44] ;dd ? |
68 | .dc12r equ [ebp-44] ;dd ? |
69 | .dc12g equ dword[ebp-48] ;dd ? |
69 | .dc12g equ dword[ebp-48] ;dd ? |
70 | .dc12b equ [ebp-52] ;dd ? |
70 | .dc12b equ [ebp-52] ;dd ? |
71 | 71 | ||
72 | .dx23 equ dword[ebp-56] ;dd ? |
72 | .dx23 equ dword[ebp-56] ;dd ? |
73 | .tex_dx23 equ dword[ebp-60] ;dd ? |
73 | .tex_dx23 equ dword[ebp-60] ;dd ? |
74 | .tex_dy23 equ [ebp-64] ;dd ? |
74 | .tex_dy23 equ [ebp-64] ;dd ? |
75 | .dz23 equ dword[ebp-68] ;dd ? |
75 | .dz23 equ dword[ebp-68] ;dd ? |
76 | .dc23r equ [ebp-72] ;dd ? |
76 | .dc23r equ [ebp-72] ;dd ? |
77 | .dc23g equ dword[ebp-76] ;dd ? |
77 | .dc23g equ dword[ebp-76] ;dd ? |
78 | .dc23b equ [ebp-80] ;dword[ebp-8]dd ? |
78 | .dc23b equ [ebp-80] ;dword[ebp-8]dd ? |
79 | 79 | ||
80 | .dx13 equ dword[ebp-84] ;dd ? |
80 | .dx13 equ dword[ebp-84] ;dd ? |
81 | .tex_dx13 equ dword[ebp-88] ;dd ? |
81 | .tex_dx13 equ dword[ebp-88] ;dd ? |
82 | .tex_dy13 equ [ebp-92] ;dd ? |
82 | .tex_dy13 equ [ebp-92] ;dd ? |
83 | .dz13 equ dword[ebp-96] ;dd ? |
83 | .dz13 equ dword[ebp-96] ;dd ? |
84 | .dc13r equ [ebp-100] ;dd ? |
84 | .dc13r equ [ebp-100] ;dd ? |
85 | .dc13g equ dword[ebp-104] ;dd ? |
85 | .dc13g equ dword[ebp-104] ;dd ? |
86 | .dc13b equ [ebp-108] ;dd ? |
86 | .dc13b equ [ebp-108] ;dd ? |
87 | 87 | ||
88 | .scan_x1 equ dword[ebp-112] ;dd ? |
88 | .scan_x1 equ dword[ebp-112] ;dd ? |
89 | .scan_y1 equ [ebp-116] ;dd ? |
89 | .scan_y1 equ [ebp-116] ;dd ? |
90 | .zz1 equ dword[ebp-120] ;dw ? |
90 | .zz1 equ dword[ebp-120] ;dw ? |
91 | .cur1r equ [ebp-124] ;dw ? |
91 | .cur1r equ [ebp-124] ;dw ? |
92 | .cur1g equ dword[ebp-128] ;dw ? |
92 | .cur1g equ dword[ebp-128] ;dw ? |
93 | .cur1b equ [ebp-132] ;dw ? |
93 | .cur1b equ [ebp-132] ;dw ? |
94 | 94 | ||
95 | .scan_x2 equ dword[ebp-136] ;dd ? |
95 | .scan_x2 equ dword[ebp-136] ;dd ? |
96 | .scan_y2 equ [ebp-140] ;dd ? |
96 | .scan_y2 equ [ebp-140] ;dd ? |
97 | .zz2 equ dword[ebp-144] ;dw ? |
97 | .zz2 equ dword[ebp-144] ;dw ? |
98 | .cur2r equ [ebp-148] ;dw ? |
98 | .cur2r equ [ebp-148] ;dw ? |
99 | .cur2g equ dword[ebp-152] ;dw ? |
99 | .cur2g equ dword[ebp-152] ;dw ? |
100 | .cur2b equ [ebp-156] ;dw ? |
100 | .cur2b equ [ebp-156] ;dw ? |
101 | 101 | ||
102 | 102 | ||
103 | mov ebp,esp |
103 | mov ebp,esp |
104 | 104 | ||
105 | ; mov .tex_ptr,edx |
105 | ; mov .tex_ptr,edx |
106 | ; mov .z_ptr,esi |
106 | ; mov .z_ptr,esi |
107 | ; mov .scr_buff,edi |
107 | ; mov .scr_buff,edi |
108 | push edx esi edi |
108 | push edx esi edi |
109 | ; push esi |
109 | ; push esi |
110 | ; push edi |
110 | ; push edi |
111 | mov edx,80008000h ; eax,ebx,ecx are ANDd together into edx which means that |
111 | mov edx,80008000h ; eax,ebx,ecx are ANDd together into edx which means that |
112 | and edx,ebx ; if *all* of them are negative a sign flag is raised |
112 | and edx,ebx ; if *all* of them are negative a sign flag is raised |
113 | and edx,ecx |
113 | and edx,ecx |
114 | and edx,eax |
114 | and edx,eax |
115 | test edx,80008000h ; Check both X&Y at once |
115 | test edx,80008000h ; Check both X&Y at once |
116 | jne .loop2_end |
116 | jne .loop2_end |
117 | 117 | ||
118 | .sort3: |
118 | .sort3: |
119 | cmp ax,bx |
119 | cmp ax,bx |
120 | jle .sort1 |
120 | jle .sort1 |
121 | xchg eax,ebx |
121 | xchg eax,ebx |
122 | if Ext>=MMX |
122 | if Ext>=MMX |
123 | movq mm0, .col1r ; exchange r, g, b, z |
123 | movq mm0, .col1r ; exchange r, g, b, z |
124 | movq mm1, .col2r |
124 | movq mm1, .col2r |
125 | movq .col1r ,mm1 |
125 | movq .col1r ,mm1 |
126 | movq .col2r ,mm0 |
126 | movq .col2r ,mm0 |
127 | else |
127 | else |
128 | mov edx,dword .col1r ; exchange both r and g |
128 | mov edx,dword .col1r ; exchange both r and g |
129 | xchg edx,dword .col2r |
129 | xchg edx,dword .col2r |
130 | mov dword .col1r ,edx |
130 | mov dword .col1r ,edx |
131 | 131 | ||
132 | mov edx,dword .col1b ; b and z |
132 | mov edx,dword .col1b ; b and z |
133 | xchg edx,dword .col2b |
133 | xchg edx,dword .col2b |
134 | mov dword .col1b ,edx |
134 | mov dword .col1b ,edx |
135 | end if |
135 | end if |
136 | 136 | ||
137 | mov edx,dword .tex_x1 |
137 | mov edx,dword .tex_x1 |
138 | xchg edx,dword .tex_x2 |
138 | xchg edx,dword .tex_x2 |
139 | mov dword .tex_x1 ,edx |
139 | mov dword .tex_x1 ,edx |
140 | 140 | ||
141 | .sort1: |
141 | .sort1: |
142 | cmp bx,cx |
142 | cmp bx,cx |
143 | jle .sort2 |
143 | jle .sort2 |
144 | xchg ebx,ecx |
144 | xchg ebx,ecx |
145 | 145 | ||
146 | if Ext>=MMX |
146 | if Ext>=MMX |
147 | movq mm0, .col2r ; exchange r, g, b, z |
147 | movq mm0, .col2r ; exchange r, g, b, z |
148 | movq mm1, .col3r |
148 | movq mm1, .col3r |
149 | movq .col3r ,mm0 |
149 | movq .col3r ,mm0 |
150 | movq .col2r ,mm1 |
150 | movq .col2r ,mm1 |
151 | else |
151 | else |
152 | 152 | ||
153 | mov edx,dword .col2r ; r, g |
153 | mov edx,dword .col2r ; r, g |
154 | xchg edx,dword .col3r |
154 | xchg edx,dword .col3r |
155 | mov dword .col2r,edx |
155 | mov dword .col2r,edx |
156 | 156 | ||
157 | mov edx,dword .col2b ; b, z |
157 | mov edx,dword .col2b ; b, z |
158 | xchg edx,dword .col3b |
158 | xchg edx,dword .col3b |
159 | mov dword .col2b,edx |
159 | mov dword .col2b,edx |
160 | end if |
160 | end if |
161 | 161 | ||
162 | mov edx,dword .tex_x2 |
162 | mov edx,dword .tex_x2 |
163 | xchg edx,dword .tex_x3 |
163 | xchg edx,dword .tex_x3 |
164 | mov dword .tex_x2,edx |
164 | mov dword .tex_x2,edx |
165 | 165 | ||
166 | jmp .sort3 |
166 | jmp .sort3 |
167 | 167 | ||
168 | .sort2: |
168 | .sort2: |
169 | 169 | ||
170 | push eax ebx ecx ; store in variables |
170 | push eax ebx ecx ; store in variables |
171 | ; push ebx |
171 | ; push ebx |
172 | ; push ecx |
172 | ; push ecx |
173 | 173 | ||
174 | ;****************** delta computng zone ************** |
174 | ;****************** delta computng zone ************** |
175 | ;+++++++++ first zone |
175 | ;+++++++++ first zone |
176 | mov bx,.y2 ; calc delta12 |
176 | mov bx,.y2 ; calc delta12 |
177 | sub bx,.y1 |
177 | sub bx,.y1 |
178 | jnz .dx12_make |
178 | jnz .dx12_make |
179 | mov ecx,7 |
179 | mov ecx,7 |
180 | @@: |
180 | @@: |
181 | push dword 0 |
181 | push dword 0 |
182 | loop @b |
182 | loop @b |
183 | jmp .dx12_done |
183 | jmp .dx12_done |
184 | .dx12_make: |
184 | .dx12_make: |
185 | 185 | ||
186 | 186 | ||
187 | mov ax,.x2 |
187 | mov ax,.x2 |
188 | sub ax,.x1 |
188 | sub ax,.x1 |
189 | cwde |
189 | cwde |
190 | movsx ebx,bx |
190 | movsx ebx,bx |
191 | shl eax,ROUND |
191 | shl eax,ROUND |
192 | cdq |
192 | cdq |
193 | idiv ebx |
193 | idiv ebx |
194 | ; mov .dx12,eax |
194 | ; mov .dx12,eax |
195 | push eax |
195 | push eax |
196 | 196 | ||
197 | if 0 ; Ext=SSE |
197 | if 0 ; Ext=SSE |
198 | movd mm0,.col1r ; 2 words r, g |
198 | movd mm0,.col1r ; 2 words r, g |
199 | pxor mm1,mm1 |
199 | pxor mm1,mm1 |
200 | punpcklwd mm0,mm1 |
200 | punpcklwd mm0,mm1 |
201 | cvtpi2ps xmm0,mm0 |
201 | cvtpi2ps xmm0,mm0 |
202 | movlhps xmm0,xmm0 |
202 | movlhps xmm0,xmm0 |
203 | movd mm0,.col1g ; 2 words b, z |
203 | movd mm0,.col1g ; 2 words b, z |
204 | punpcklwd mm0,mm1 |
204 | punpcklwd mm0,mm1 |
205 | cvtpi2ps xmm0,mm0 |
205 | cvtpi2ps xmm0,mm0 |
206 | ; xmm0=four float double words |
206 | ; xmm0=four float double words |
207 | divss xmm0,.pack3 |
207 | divss xmm0,.pack3 |
208 | ;convert and insert mm0 to lower xmm1 .. |
208 | ;convert and insert mm0 to lower xmm1 .. |
209 | end if |
209 | end if |
210 | 210 | ||
211 | mov ax,word .tex_x2 |
211 | mov ax,word .tex_x2 |
212 | sub ax,word .tex_x1 |
212 | sub ax,word .tex_x1 |
213 | cwde |
213 | cwde |
214 | shl eax,ROUND |
214 | shl eax,ROUND |
215 | cdq |
215 | cdq |
216 | idiv ebx |
216 | idiv ebx |
217 | ; mov .tex_dx12r,eax |
217 | ; mov .tex_dx12r,eax |
218 | push eax |
218 | push eax |
219 | 219 | ||
220 | mov ax,word .tex_y2 |
220 | mov ax,word .tex_y2 |
221 | sub ax,word .tex_y1 |
221 | sub ax,word .tex_y1 |
222 | cwde |
222 | cwde |
223 | shl eax,ROUND |
223 | shl eax,ROUND |
224 | cdq |
224 | cdq |
225 | idiv ebx |
225 | idiv ebx |
226 | ; mov .tex_dx12,eax |
226 | ; mov .tex_dx12,eax |
227 | push eax |
227 | push eax |
228 | 228 | ||
229 | mov ax,word .z2 |
229 | mov ax,word .z2 |
230 | sub ax,word .z1 |
230 | sub ax,word .z1 |
231 | cwde |
231 | cwde |
232 | shl eax,CATMULL_SHIFT |
232 | shl eax,CATMULL_SHIFT |
233 | cdq |
233 | cdq |
234 | idiv ebx |
234 | idiv ebx |
235 | ; mov .dz12,eax |
235 | ; mov .dz12,eax |
236 | push eax ; .dza12 |
236 | push eax ; .dza12 |
237 | 237 | ||
238 | mov ax,word .col2r |
238 | mov ax,word .col2r |
239 | sub ax,word .col1r |
239 | sub ax,word .col1r |
240 | cwde |
240 | cwde |
241 | shl eax,ROUND |
241 | shl eax,ROUND |
242 | cdq |
242 | cdq |
243 | idiv ebx |
243 | idiv ebx |
244 | ; mov .dc12r,eax |
244 | ; mov .dc12r,eax |
245 | push eax |
245 | push eax |
246 | 246 | ||
247 | mov ax,word .col2g |
247 | mov ax,word .col2g |
248 | sub ax,word .col1g |
248 | sub ax,word .col1g |
249 | cwde |
249 | cwde |
250 | shl eax,ROUND |
250 | shl eax,ROUND |
251 | cdq |
251 | cdq |
252 | idiv ebx |
252 | idiv ebx |
253 | ; mov .dc12g,eax |
253 | ; mov .dc12g,eax |
254 | push eax |
254 | push eax |
255 | 255 | ||
256 | mov ax,word .col2b ;;--- |
256 | mov ax,word .col2b ;;--- |
257 | sub ax,word .col1b |
257 | sub ax,word .col1b |
258 | cwde |
258 | cwde |
259 | shl eax,ROUND |
259 | shl eax,ROUND |
260 | cdq |
260 | cdq |
261 | idiv ebx |
261 | idiv ebx |
262 | ; mov .dc12b,eax |
262 | ; mov .dc12b,eax |
263 | push eax |
263 | push eax |
264 | 264 | ||
265 | ;+++++++++++++++++ second zone +++++++++++++ |
265 | ;+++++++++++++++++ second zone +++++++++++++ |
266 | .dx12_done: |
266 | .dx12_done: |
267 | 267 | ||
268 | mov bx,.y3 ; calc delta23 |
268 | mov bx,.y3 ; calc delta23 |
269 | sub bx,.y2 |
269 | sub bx,.y2 |
270 | jnz .dx23_make |
270 | jnz .dx23_make |
271 | mov ecx,7 |
271 | mov ecx,7 |
272 | @@: |
272 | @@: |
273 | push dword 0 |
273 | push dword 0 |
274 | loop @b |
274 | loop @b |
275 | jmp .dx23_done |
275 | jmp .dx23_done |
276 | 276 | ||
277 | .dx23_make: |
277 | .dx23_make: |
278 | mov ax,.x3 |
278 | mov ax,.x3 |
279 | sub ax,.x2 |
279 | sub ax,.x2 |
280 | cwde |
280 | cwde |
281 | movsx ebx,bx |
281 | movsx ebx,bx |
282 | shl eax,ROUND |
282 | shl eax,ROUND |
283 | cdq |
283 | cdq |
284 | idiv ebx |
284 | idiv ebx |
285 | ; mov .dx23,eax |
285 | ; mov .dx23,eax |
286 | push eax |
286 | push eax |
287 | 287 | ||
288 | mov ax,word .tex_x3 |
288 | mov ax,word .tex_x3 |
289 | sub ax,word .tex_x2 |
289 | sub ax,word .tex_x2 |
290 | cwde |
290 | cwde |
291 | shl eax,ROUND |
291 | shl eax,ROUND |
292 | cdq |
292 | cdq |
293 | idiv ebx |
293 | idiv ebx |
294 | ; mov .tex_dx23,eax |
294 | ; mov .tex_dx23,eax |
295 | push eax |
295 | push eax |
296 | 296 | ||
297 | mov ax,word .tex_y3 |
297 | mov ax,word .tex_y3 |
298 | sub ax,word .tex_y2 |
298 | sub ax,word .tex_y2 |
299 | cwde |
299 | cwde |
300 | shl eax,ROUND |
300 | shl eax,ROUND |
301 | cdq |
301 | cdq |
302 | idiv ebx |
302 | idiv ebx |
303 | ; mov .tex_dy23,eax |
303 | ; mov .tex_dy23,eax |
304 | push eax |
304 | push eax |
305 | 305 | ||
306 | mov ax,word .z3 |
306 | mov ax,word .z3 |
307 | sub ax,word .z2 |
307 | sub ax,word .z2 |
308 | cwde ; |
308 | cwde ; |
309 | shl eax,CATMULL_SHIFT ; 2222222 |
309 | shl eax,CATMULL_SHIFT ; 2222222 |
310 | cdq ; 2 2 |
310 | cdq ; 2 2 |
311 | idiv ebx ; 2 |
311 | idiv ebx ; 2 |
312 | ; mov .dz23,eax ; 2 |
312 | ; mov .dz23,eax ; 2 |
313 | push eax ; .dza12 ; 2 |
313 | push eax ; .dza12 ; 2 |
314 | ; 2 |
314 | ; 2 |
315 | mov ax,word .col3r ; 2 |
315 | mov ax,word .col3r ; 2 |
316 | sub ax,word .col2r ; 2222222 |
316 | sub ax,word .col2r ; 2222222 |
317 | cwde ; second delta |
317 | cwde ; second delta |
318 | shl eax,ROUND ; |
318 | shl eax,ROUND ; |
319 | cdq ; |
319 | cdq ; |
320 | idiv ebx ; |
320 | idiv ebx ; |
321 | ; mov .dc23r,eax ; |
321 | ; mov .dc23r,eax ; |
322 | push eax |
322 | push eax |
323 | 323 | ||
324 | mov ax,word .col3g |
324 | mov ax,word .col3g |
325 | sub ax,word .col2g |
325 | sub ax,word .col2g |
326 | cwde |
326 | cwde |
327 | shl eax,ROUND |
327 | shl eax,ROUND |
328 | cdq |
328 | cdq |
329 | idiv ebx |
329 | idiv ebx |
330 | ; mov .dc23g,eax |
330 | ; mov .dc23g,eax |
331 | push eax |
331 | push eax |
332 | 332 | ||
333 | mov ax,word .col3b ;;--- |
333 | mov ax,word .col3b ;;--- |
334 | sub ax,word .col2b |
334 | sub ax,word .col2b |
335 | cwde |
335 | cwde |
336 | shl eax,ROUND |
336 | shl eax,ROUND |
337 | cdq |
337 | cdq |
338 | idiv ebx |
338 | idiv ebx |
339 | ; mov .dc23b,eax |
339 | ; mov .dc23b,eax |
340 | push eax |
340 | push eax |
341 | 341 | ||
342 | .dx23_done: |
342 | .dx23_done: |
343 | ;++++++++++++++++++third zone++++++++++++++++++++++++ |
343 | ;++++++++++++++++++third zone++++++++++++++++++++++++ |
344 | mov bx,.y3 ; calc delta13 |
344 | mov bx,.y3 ; calc delta13 |
345 | sub bx,.y1 |
345 | sub bx,.y1 |
346 | jnz .dx13_make |
346 | jnz .dx13_make |
347 | mov ecx,7 |
347 | mov ecx,7 |
348 | @@: |
348 | @@: |
349 | push dword 0 |
349 | push dword 0 |
350 | loop @b |
350 | loop @b |
351 | jmp .dx13_done |
351 | jmp .dx13_done |
352 | .dx13_make: |
352 | .dx13_make: |
353 | mov ax,.x3 |
353 | mov ax,.x3 |
354 | sub ax,.x1 |
354 | sub ax,.x1 |
355 | cwde |
355 | cwde |
356 | movsx ebx,bx |
356 | movsx ebx,bx |
357 | shl eax,ROUND |
357 | shl eax,ROUND |
358 | cdq |
358 | cdq |
359 | idiv ebx |
359 | idiv ebx |
360 | ; mov .dx13,eax |
360 | ; mov .dx13,eax |
361 | push eax |
361 | push eax |
362 | 362 | ||
363 | mov ax,word .tex_x3 ; triangle b |
363 | mov ax,word .tex_x3 ; triangle b |
364 | sub ax,word .tex_x1 |
364 | sub ax,word .tex_x1 |
365 | cwde |
365 | cwde |
366 | shl eax,ROUND |
366 | shl eax,ROUND |
367 | cdq |
367 | cdq |
368 | idiv ebx |
368 | idiv ebx |
369 | ; mov .tex_dx13r,eax |
369 | ; mov .tex_dx13r,eax |
370 | push eax |
370 | push eax |
371 | 371 | ||
372 | mov ax,word .tex_y3 |
372 | mov ax,word .tex_y3 |
373 | sub ax,word .tex_y1 |
373 | sub ax,word .tex_y1 |
374 | cwde |
374 | cwde |
375 | shl eax,ROUND |
375 | shl eax,ROUND |
376 | cdq |
376 | cdq |
377 | idiv ebx |
377 | idiv ebx |
378 | ; mov .tex_dy13,eax |
378 | ; mov .tex_dy13,eax |
379 | push eax |
379 | push eax |
380 | 380 | ||
381 | mov ax,word .z3 |
381 | mov ax,word .z3 |
382 | sub ax,word .z1 ; 333333333 |
382 | sub ax,word .z1 ; 333333333 |
383 | cwde ; 3 3 |
383 | cwde ; 3 3 |
384 | shl eax,CATMULL_SHIFT ; 3 |
384 | shl eax,CATMULL_SHIFT ; 3 |
385 | cdq ; 3 |
385 | cdq ; 3 |
386 | idiv ebx ; 3 |
386 | idiv ebx ; 3 |
387 | ; mov .dz13,eax ; 3 |
387 | ; mov .dz13,eax ; 3 |
388 | push eax ; .dza12 ; 3 |
388 | push eax ; .dza12 ; 3 |
389 | ; 3 |
389 | ; 3 |
390 | mov ax,word .col3r ; 3333333333 |
390 | mov ax,word .col3r ; 3333333333 |
391 | sub ax,word .col1r ; 3 |
391 | sub ax,word .col1r ; 3 |
392 | cwde ; 3 |
392 | cwde ; 3 |
393 | shl eax,ROUND ; 3 |
393 | shl eax,ROUND ; 3 |
394 | cdq ; 3 |
394 | cdq ; 3 |
395 | idiv ebx ; 3 |
395 | idiv ebx ; 3 |
396 | ; mov .dc13r,eax ; 3 3 |
396 | ; mov .dc13r,eax ; 3 3 |
397 | push eax ; 33333333 |
397 | push eax ; 33333333 |
398 | 398 | ||
399 | mov ax,word .col3g |
399 | mov ax,word .col3g |
400 | sub ax,word .col1g |
400 | sub ax,word .col1g |
401 | cwde |
401 | cwde |
402 | shl eax,ROUND |
402 | shl eax,ROUND |
403 | cdq |
403 | cdq |
404 | idiv ebx |
404 | idiv ebx |
405 | ; mov .dc13g,eax |
405 | ; mov .dc13g,eax |
406 | push eax |
406 | push eax |
407 | 407 | ||
408 | mov ax,word .col3b ;;--- |
408 | mov ax,word .col3b ;;--- |
409 | sub ax,word .col1b |
409 | sub ax,word .col1b |
410 | cwde |
410 | cwde |
411 | shl eax,ROUND |
411 | shl eax,ROUND |
412 | cdq |
412 | cdq |
413 | idiv ebx |
413 | idiv ebx |
414 | ; mov .dc13b,eax |
414 | ; mov .dc13b,eax |
415 | push eax |
415 | push eax |
416 | 416 | ||
417 | .dx13_done: |
417 | .dx13_done: |
418 | 418 | ||
419 | ; <<<<<<< ::delta zone end+++++++++++++++++++++ >>>>>>>> |
419 | ; <<<<<<< ::delta zone end+++++++++++++++++++++ >>>>>>>> |
420 | sub esp,55 ;(12*4) |
420 | sub esp,55 ;(12*4) |
421 | 421 | ||
422 | movsx eax,.x1 ; eax - cur x1 |
422 | movsx eax,.x1 ; eax - cur x1 |
423 | shl eax,ROUND ; ebx - cur x2 |
423 | shl eax,ROUND ; ebx - cur x2 |
424 | mov ebx,eax |
424 | mov ebx,eax |
425 | movsx edx,word .z1 |
425 | movsx edx,word .z1 |
426 | shl edx,CATMULL_SHIFT |
426 | shl edx,CATMULL_SHIFT |
427 | mov .zz1,edx |
427 | mov .zz1,edx |
428 | mov .zz2,edx |
428 | mov .zz2,edx |
429 | 429 | ||
430 | movzx edi,word .col1r |
430 | movzx edi,word .col1r |
431 | shl edi,ROUND |
431 | shl edi,ROUND |
432 | mov .cur1r,edi |
432 | mov .cur1r,edi |
433 | mov .cur2r,edi |
433 | mov .cur2r,edi |
434 | movzx esi,word .col1g |
434 | movzx esi,word .col1g |
435 | shl esi,ROUND |
435 | shl esi,ROUND |
436 | mov .cur1g,esi |
436 | mov .cur1g,esi |
437 | mov .cur2g,esi |
437 | mov .cur2g,esi |
438 | movzx edx,word .col1b |
438 | movzx edx,word .col1b |
439 | shl edx,ROUND |
439 | shl edx,ROUND |
440 | mov .cur1b,edx |
440 | mov .cur1b,edx |
441 | mov .cur2b,edx |
441 | mov .cur2b,edx |
442 | 442 | ||
443 | movzx edi,word .tex_x1 |
443 | movzx edi,word .tex_x1 |
444 | shl edi,ROUND |
444 | shl edi,ROUND |
445 | mov .scan_x1,edi |
445 | mov .scan_x1,edi |
446 | mov .scan_x2,edi |
446 | mov .scan_x2,edi |
447 | movzx edx,word .tex_y1 |
447 | movzx edx,word .tex_y1 |
448 | shl edx,ROUND |
448 | shl edx,ROUND |
449 | mov .scan_y1,edx |
449 | mov .scan_y1,edx |
450 | mov .scan_y2,edx |
450 | mov .scan_y2,edx |
451 | 451 | ||
452 | mov cx,.y1 |
452 | mov cx,.y1 |
453 | cmp cx,.y2 |
453 | cmp cx,.y2 |
454 | jge .loop1_end |
454 | jge .loop1_end |
455 | .loop_1: |
455 | .loop_1: |
456 | ; push eax ebx ebp |
456 | ; push eax ebx ebp |
457 | pushad |
457 | pushad |
458 | 458 | ||
459 | push .tex_ptr |
459 | push .tex_ptr |
460 | push .scr_buff |
460 | push .scr_buff |
461 | push .z_ptr |
461 | push .z_ptr |
462 | push cx |
462 | push cx |
463 | 463 | ||
464 | push .zz2 |
464 | push .zz2 |
465 | 465 | ||
466 | push .scan_x2 |
466 | push .scan_x2 |
467 | push dword .scan_y2 |
467 | push dword .scan_y2 |
468 | push dword .cur2r |
468 | push dword .cur2r |
469 | push .cur2g |
469 | push .cur2g |
470 | push dword .cur2b |
470 | push dword .cur2b |
471 | 471 | ||
472 | push .zz1 |
472 | push .zz1 |
473 | 473 | ||
474 | push .scan_x1 |
474 | push .scan_x1 |
475 | push dword .scan_y1 |
475 | push dword .scan_y1 |
476 | push dword .cur1r |
476 | push dword .cur1r |
477 | push .cur1g |
477 | push .cur1g |
478 | push dword .cur1b |
478 | push dword .cur1b |
479 | 479 | ||
480 | sar eax,ROUND |
480 | sar eax,ROUND |
481 | sar ebx,ROUND |
481 | sar ebx,ROUND |
482 | call horizontal_tex_grd_line |
482 | call horizontal_tex_grd_line |
483 | 483 | ||
484 | ; pop ebp ebx eax |
484 | ; pop ebp ebx eax |
485 | popad |
485 | popad |
486 | 486 | ||
487 | if (Ext = MMX)|(Ext=SSE) |
487 | if (Ext = MMX)|(Ext=SSE) |
488 | movq mm0,.cur1b |
488 | movq mm0,.cur1b |
489 | movq mm1,.cur1r |
489 | movq mm1,.cur1r |
490 | movq mm2,.scan_y1 |
490 | movq mm2,.scan_y1 |
491 | movq mm3,.cur2b |
491 | movq mm3,.cur2b |
492 | movq mm4,.cur2r |
492 | movq mm4,.cur2r |
493 | movq mm5,.scan_y2 |
493 | movq mm5,.scan_y2 |
494 | paddd mm0,.dc13b |
494 | paddd mm0,.dc13b |
495 | paddd mm1,.dc13r |
495 | paddd mm1,.dc13r |
496 | paddd mm2,.tex_dy13 |
496 | paddd mm2,.tex_dy13 |
497 | paddd mm3,.dc12b |
497 | paddd mm3,.dc12b |
498 | paddd mm4,.dc12r |
498 | paddd mm4,.dc12r |
499 | paddd mm5,.tex_dy12 |
499 | paddd mm5,.tex_dy12 |
500 | movq .cur1b,mm0 |
500 | movq .cur1b,mm0 |
501 | movq .cur1r,mm1 |
501 | movq .cur1r,mm1 |
502 | movq .scan_y1,mm2 |
502 | movq .scan_y1,mm2 |
503 | movq .cur2b,mm3 |
503 | movq .cur2b,mm3 |
504 | movq .cur2r,mm4 |
504 | movq .cur2r,mm4 |
505 | movq .scan_y2,mm5 |
505 | movq .scan_y2,mm5 |
506 | end if |
506 | end if |
507 | if Ext >= SSE2 |
507 | if Ext >= SSE2 |
508 | movups xmm0,.cur1b |
508 | movups xmm0,.cur1b |
509 | movups xmm1,.dc13b |
509 | movups xmm1,.dc13b |
510 | movups xmm2,.cur2b |
510 | movups xmm2,.cur2b |
511 | movups xmm3,.dc12b |
511 | movups xmm3,.dc12b |
512 | movq mm2,.scan_y1 |
512 | movq mm2,.scan_y1 |
513 | movq mm5,.scan_y2 |
513 | movq mm5,.scan_y2 |
514 | paddd xmm0,xmm1 |
514 | paddd xmm0,xmm1 |
515 | paddd xmm2,xmm3 |
515 | paddd xmm2,xmm3 |
516 | paddd mm2,.tex_dy13 |
516 | paddd mm2,.tex_dy13 |
517 | paddd mm5,.tex_dy12 |
517 | paddd mm5,.tex_dy12 |
518 | movq .scan_y1,mm2 |
518 | movq .scan_y1,mm2 |
519 | movq .scan_y2,mm5 |
519 | movq .scan_y2,mm5 |
520 | movups .cur1b,xmm0 |
520 | movups .cur1b,xmm0 |
521 | movups .cur2b,xmm2 |
521 | movups .cur2b,xmm2 |
522 | end if |
522 | end if |
523 | 523 | ||
524 | if Ext = NON |
524 | if Ext = NON |
525 | mov edx,.dc13b |
525 | mov edx,.dc13b |
526 | add .cur1b,edx |
526 | add .cur1b,edx |
527 | mov esi,.dc13g |
527 | mov esi,.dc13g |
528 | add .cur1g,esi |
528 | add .cur1g,esi |
529 | mov edi,.dc13r |
529 | mov edi,.dc13r |
530 | add .cur1r,edi |
530 | add .cur1r,edi |
531 | mov edx,.dz13 |
531 | mov edx,.dz13 |
532 | add .zz1,edx |
532 | add .zz1,edx |
533 | mov edx,.tex_dx13 |
533 | mov edx,.tex_dx13 |
534 | add .scan_x1,edx |
534 | add .scan_x1,edx |
535 | mov esi,.tex_dy13 |
535 | mov esi,.tex_dy13 |
536 | add .scan_y1,esi |
536 | add .scan_y1,esi |
537 | 537 | ||
538 | mov edi,.dc12b |
538 | mov edi,.dc12b |
539 | add .cur2b,edi |
539 | add .cur2b,edi |
540 | mov esi,.dc12g |
540 | mov esi,.dc12g |
541 | add .cur2g,esi |
541 | add .cur2g,esi |
542 | mov edx,.dc12r |
542 | mov edx,.dc12r |
543 | add .cur2r,edx |
543 | add .cur2r,edx |
544 | mov edi,.tex_dx12 |
544 | mov edi,.tex_dx12 |
545 | add .scan_x2,edi |
545 | add .scan_x2,edi |
546 | mov esi,.tex_dy12 |
546 | mov esi,.tex_dy12 |
547 | add .scan_y2,esi |
547 | add .scan_y2,esi |
548 | mov edx,.dz12 |
548 | mov edx,.dz12 |
549 | add .zz2,edx |
549 | add .zz2,edx |
550 | end if |
550 | end if |
551 | add eax,.dx13 |
551 | add eax,.dx13 |
552 | add ebx,.dx12 |
552 | add ebx,.dx12 |
553 | inc cx |
553 | inc cx |
554 | cmp cx,.y2 |
554 | cmp cx,.y2 |
555 | jl .loop_1 |
555 | jl .loop_1 |
556 | .loop1_end: |
556 | .loop1_end: |
557 | movzx ecx,.y2 |
557 | movzx ecx,.y2 |
558 | cmp cx,.y3 |
558 | cmp cx,.y3 |
559 | jge .loop2_end |
559 | jge .loop2_end |
560 | 560 | ||
561 | movsx ebx,.x2 ; eax - cur x1 |
561 | movsx ebx,.x2 ; eax - cur x1 |
562 | shl ebx,ROUND ; ebx - cur x2 |
562 | shl ebx,ROUND ; ebx - cur x2 |
563 | 563 | ||
564 | movsx edx,word .z2 |
564 | movsx edx,word .z2 |
565 | shl edx,CATMULL_SHIFT |
565 | shl edx,CATMULL_SHIFT |
566 | ; mov .zz1,edx |
566 | ; mov .zz1,edx |
567 | mov .zz2,edx |
567 | mov .zz2,edx |
568 | 568 | ||
569 | movzx edi,word .col2r |
569 | movzx edi,word .col2r |
570 | shl edi,ROUND |
570 | shl edi,ROUND |
571 | ; mov .cur1r,edi |
571 | ; mov .cur1r,edi |
572 | mov .cur2r,edi |
572 | mov .cur2r,edi |
573 | movzx esi,word .col2g |
573 | movzx esi,word .col2g |
574 | shl esi,ROUND |
574 | shl esi,ROUND |
575 | ; mov .cur1g,esi |
575 | ; mov .cur1g,esi |
576 | mov .cur2g,esi |
576 | mov .cur2g,esi |
577 | movzx edx,word .col2b |
577 | movzx edx,word .col2b |
578 | shl edx,ROUND |
578 | shl edx,ROUND |
579 | ; mov .cur1b,edx |
579 | ; mov .cur1b,edx |
580 | mov .cur2b,edx |
580 | mov .cur2b,edx |
581 | 581 | ||
582 | movzx edi,word .tex_x2 |
582 | movzx edi,word .tex_x2 |
583 | shl edi,ROUND |
583 | shl edi,ROUND |
584 | ; mov .scan_x1,edi |
584 | ; mov .scan_x1,edi |
585 | mov .scan_x2,edi |
585 | mov .scan_x2,edi |
586 | movzx edx,word .tex_y2 |
586 | movzx edx,word .tex_y2 |
587 | shl edx,ROUND |
587 | shl edx,ROUND |
588 | ; mov .scan_y1,edx |
588 | ; mov .scan_y1,edx |
589 | mov .scan_y2,edx |
589 | mov .scan_y2,edx |
590 | 590 | ||
591 | .loop_2: |
591 | .loop_2: |
592 | pushad |
592 | pushad |
593 | 593 | ||
594 | push .tex_ptr |
594 | push .tex_ptr |
595 | push .scr_buff |
595 | push .scr_buff |
596 | push .z_ptr |
596 | push .z_ptr |
597 | push cx |
597 | push cx |
598 | 598 | ||
599 | push .zz2 |
599 | push .zz2 |
600 | 600 | ||
601 | push .scan_x2 |
601 | push .scan_x2 |
602 | push dword .scan_y2 |
602 | push dword .scan_y2 |
603 | push dword .cur2r |
603 | push dword .cur2r |
604 | push .cur2g |
604 | push .cur2g |
605 | push dword .cur2b |
605 | push dword .cur2b |
606 | 606 | ||
607 | push .zz1 |
607 | push .zz1 |
608 | 608 | ||
609 | push .scan_x1 |
609 | push .scan_x1 |
610 | push dword .scan_y1 |
610 | push dword .scan_y1 |
611 | push dword .cur1r |
611 | push dword .cur1r |
612 | push .cur1g |
612 | push .cur1g |
613 | push dword .cur1b |
613 | push dword .cur1b |
614 | 614 | ||
615 | sar eax,ROUND |
615 | sar eax,ROUND |
616 | sar ebx,ROUND |
616 | sar ebx,ROUND |
617 | call horizontal_tex_grd_line |
617 | call horizontal_tex_grd_line |
618 | 618 | ||
619 | popad |
619 | popad |
620 | 620 | ||
621 | if (Ext = MMX)|(Ext=SSE) |
621 | if (Ext = MMX)|(Ext=SSE) |
622 | movq mm0,.cur1b |
622 | movq mm0,.cur1b |
623 | movq mm1,.cur1r |
623 | movq mm1,.cur1r |
624 | movq mm2,.scan_y1 |
624 | movq mm2,.scan_y1 |
625 | movq mm3,.cur2b |
625 | movq mm3,.cur2b |
626 | movq mm4,.cur2r |
626 | movq mm4,.cur2r |
627 | movq mm5,.scan_y2 |
627 | movq mm5,.scan_y2 |
628 | paddd mm0,.dc13b |
628 | paddd mm0,.dc13b |
629 | paddd mm1,.dc13r |
629 | paddd mm1,.dc13r |
630 | paddd mm2,.tex_dy13 |
630 | paddd mm2,.tex_dy13 |
631 | paddd mm3,.dc23b |
631 | paddd mm3,.dc23b |
632 | paddd mm4,.dc23r |
632 | paddd mm4,.dc23r |
633 | paddd mm5,.tex_dy23 |
633 | paddd mm5,.tex_dy23 |
634 | movq .cur1b,mm0 |
634 | movq .cur1b,mm0 |
635 | movq .cur1r,mm1 |
635 | movq .cur1r,mm1 |
636 | movq .scan_y1,mm2 |
636 | movq .scan_y1,mm2 |
637 | movq .cur2b,mm3 |
637 | movq .cur2b,mm3 |
638 | movq .cur2r,mm4 |
638 | movq .cur2r,mm4 |
639 | movq .scan_y2,mm5 |
639 | movq .scan_y2,mm5 |
640 | end if |
640 | end if |
641 | if Ext >= SSE2 |
641 | if Ext >= SSE2 |
642 | movups xmm0,.cur1b |
642 | movups xmm0,.cur1b |
643 | movups xmm1,.dc13b |
643 | movups xmm1,.dc13b |
644 | movups xmm2,.cur2b |
644 | movups xmm2,.cur2b |
645 | movups xmm3,.dc23b |
645 | movups xmm3,.dc23b |
646 | movq mm2,.scan_y1 |
646 | movq mm2,.scan_y1 |
647 | movq mm5,.scan_y2 |
647 | movq mm5,.scan_y2 |
648 | paddd xmm0,xmm1 |
648 | paddd xmm0,xmm1 |
649 | paddd xmm2,xmm3 |
649 | paddd xmm2,xmm3 |
650 | paddd mm2,.tex_dy13 |
650 | paddd mm2,.tex_dy13 |
651 | paddd mm5,.tex_dy23 |
651 | paddd mm5,.tex_dy23 |
652 | movq .scan_y1,mm2 |
652 | movq .scan_y1,mm2 |
653 | movq .scan_y2,mm5 |
653 | movq .scan_y2,mm5 |
654 | movups .cur1b,xmm0 |
654 | movups .cur1b,xmm0 |
655 | movups .cur2b,xmm2 |
655 | movups .cur2b,xmm2 |
656 | end if |
656 | end if |
657 | if Ext = NON |
657 | if Ext = NON |
658 | mov edx,.dc13b |
658 | mov edx,.dc13b |
659 | add .cur1b,edx |
659 | add .cur1b,edx |
660 | mov esi,.dc13g |
660 | mov esi,.dc13g |
661 | add .cur1g,esi |
661 | add .cur1g,esi |
662 | mov edi,.dc13r |
662 | mov edi,.dc13r |
663 | add .cur1r,edi |
663 | add .cur1r,edi |
664 | mov edx,.tex_dx13 |
664 | mov edx,.tex_dx13 |
665 | add .scan_x1,edx |
665 | add .scan_x1,edx |
666 | mov esi,.tex_dy13 |
666 | mov esi,.tex_dy13 |
667 | add .scan_y1,esi |
667 | add .scan_y1,esi |
668 | mov edx,.dz13 |
668 | mov edx,.dz13 |
669 | add .zz1,edx |
669 | add .zz1,edx |
670 | 670 | ||
671 | mov edi,.dc23b |
671 | mov edi,.dc23b |
672 | add .cur2b,edi |
672 | add .cur2b,edi |
673 | mov esi,.dc23g |
673 | mov esi,.dc23g |
674 | add .cur2g,esi |
674 | add .cur2g,esi |
675 | mov edx,.dc23r |
675 | mov edx,.dc23r |
676 | add .cur2r,edx |
676 | add .cur2r,edx |
677 | mov edi,.tex_dx23 |
677 | mov edi,.tex_dx23 |
678 | add .scan_x2,edi |
678 | add .scan_x2,edi |
679 | mov esi,.tex_dy23 |
679 | mov esi,.tex_dy23 |
680 | add .scan_y2,esi |
680 | add .scan_y2,esi |
681 | mov edx,.dz23 |
681 | mov edx,.dz23 |
682 | add .zz2,edx |
682 | add .zz2,edx |
683 | end if |
683 | end if |
684 | add eax,.dx13 |
684 | add eax,.dx13 |
685 | add ebx,.dx23 |
685 | add ebx,.dx23 |
686 | inc cx |
686 | inc cx |
687 | cmp cx,.y3 |
687 | cmp cx,.y3 |
688 | jl .loop_2 |
688 | jl .loop_2 |
689 | 689 | ||
690 | .loop2_end: |
690 | .loop2_end: |
691 | mov esp,ebp |
691 | mov esp,ebp |
692 | ret 36 |
692 | ret 36 |
693 | horizontal_tex_grd_line: |
693 | horizontal_tex_grd_line: |
694 | ;in: |
694 | ;in: |
695 | ; eax : x1, ebx : x2 |
695 | ; eax : x1, ebx : x2 |
696 | 696 | ||
697 | .tex_ptr equ [ebp+62] |
697 | .tex_ptr equ [ebp+62] |
698 | .screen equ [ebp+58] |
698 | .screen equ [ebp+58] |
699 | .z_buffer equ [ebp+54] |
699 | .z_buffer equ [ebp+54] |
700 | .y equ [ebp+52] |
700 | .y equ [ebp+52] |
701 | 701 | ||
702 | .z2 equ [ebp+48] |
702 | .z2 equ [ebp+48] |
703 | .tex_x2 equ [ebp+44] |
703 | .tex_x2 equ [ebp+44] |
704 | .tex_y2 equ [ebp+40] |
704 | .tex_y2 equ [ebp+40] |
705 | .r2 equ [ebp+36] |
705 | .r2 equ [ebp+36] |
706 | .g2 equ [ebp+32] |
706 | .g2 equ [ebp+32] |
707 | .b2 equ [ebp+28] |
707 | .b2 equ [ebp+28] |
708 | 708 | ||
709 | .z1 equ [ebp+24] |
709 | .z1 equ [ebp+24] |
710 | .tex_x1 equ [ebp+20] |
710 | .tex_x1 equ [ebp+20] |
711 | .tex_y1 equ [ebp+16] |
711 | .tex_y1 equ [ebp+16] |
712 | .r1 equ [ebp+12] |
712 | .r1 equ [ebp+12] |
713 | .g1 equ [ebp+8] |
713 | .g1 equ [ebp+8] |
714 | .b1 equ [ebp+4] |
714 | .b1 equ [ebp+4] |
715 | 715 | ||
716 | .x1 equ word[ebp-2] |
716 | .x1 equ word[ebp-2] |
717 | .x2 equ word[ebp-4] |
717 | .x2 equ word[ebp-4] |
718 | .dz equ dword[ebp-8] |
718 | .dz equ dword[ebp-8] |
719 | .db equ dword[ebp-12] |
719 | .db equ dword[ebp-12] |
720 | .dg equ dword[ebp-16] |
720 | .dg equ dword[ebp-16] |
721 | .dr equ dword[ebp-20] |
721 | .dr equ dword[ebp-20] |
722 | .dtex_x equ dword[ebp-24] |
722 | .dtex_x equ dword[ebp-24] |
723 | .dtex_y equ dword[ebp-28] |
723 | .dtex_y equ dword[ebp-28] |
724 | 724 | ||
725 | .c_ty equ [ebp-32] |
725 | .c_ty equ [ebp-32] |
726 | .c_tx equ [ebp-36] |
726 | .c_tx equ [ebp-36] |
727 | .cb equ [ebp-40] |
727 | .cb equ [ebp-40] |
728 | .cg equ [ebp-44] |
728 | .cg equ [ebp-44] |
729 | .cr equ [ebp-48] |
729 | .cr equ [ebp-48] |
730 | .t_col equ [ebp-52] |
730 | .t_col equ [ebp-52] |
731 | 731 | ||
732 | .dtex_yM equ qword[ebp-28] |
732 | .dtex_yM equ qword[ebp-28] |
733 | .drM equ qword[ebp-20] |
733 | .drM equ qword[ebp-20] |
734 | .dbM equ qword[ebp-12] |
734 | .dbM equ qword[ebp-12] |
735 | 735 | ||
736 | mov ebp,esp |
736 | mov ebp,esp |
737 | ; sub esp,30 |
737 | ; sub esp,30 |
738 | 738 | ||
739 | mov cx,word .y |
739 | mov cx,word .y |
740 | or cx,cx |
740 | or cx,cx |
741 | jl .quit_l |
741 | jl .quit_l |
742 | 742 | ||
743 | cmp cx,SIZE_Y |
743 | cmp cx,word[size_y_var] ;SIZE_Y |
744 | jge .quit_l |
744 | jge .quit_l |
745 | 745 | ||
746 | cmp ax,bx |
746 | cmp ax,bx |
747 | je .quit_l |
747 | je .quit_l |
748 | jl @f |
748 | jl @f |
749 | 749 | ||
750 | xchg eax,ebx |
750 | xchg eax,ebx |
751 | 751 | ||
752 | if Ext=NON |
752 | if Ext=NON |
753 | mov ecx,dword .r1 |
753 | mov ecx,dword .r1 |
754 | xchg ecx, .r2 |
754 | xchg ecx, .r2 |
755 | mov dword .r1, ecx |
755 | mov dword .r1, ecx |
756 | 756 | ||
757 | mov ecx,dword .g1 |
757 | mov ecx,dword .g1 |
758 | xchg ecx, .g2 |
758 | xchg ecx, .g2 |
759 | mov dword .g1, ecx |
759 | mov dword .g1, ecx |
760 | 760 | ||
761 | mov ecx,dword .b1 |
761 | mov ecx,dword .b1 |
762 | xchg ecx, .b2 |
762 | xchg ecx, .b2 |
763 | mov dword .b1, ecx |
763 | mov dword .b1, ecx |
764 | 764 | ||
765 | mov ecx,dword .tex_x1 |
765 | mov ecx,dword .tex_x1 |
766 | xchg ecx, .tex_x2 |
766 | xchg ecx, .tex_x2 |
767 | mov dword .tex_x1, ecx |
767 | mov dword .tex_x1, ecx |
768 | 768 | ||
769 | mov ecx,dword .tex_y1 |
769 | mov ecx,dword .tex_y1 |
770 | xchg ecx, .tex_y2 |
770 | xchg ecx, .tex_y2 |
771 | mov dword .tex_y1, ecx |
771 | mov dword .tex_y1, ecx |
772 | 772 | ||
773 | mov ecx,dword .z1 |
773 | mov ecx,dword .z1 |
774 | xchg ecx, .z2 |
774 | xchg ecx, .z2 |
775 | mov dword .z1, ecx |
775 | mov dword .z1, ecx |
776 | end if |
776 | end if |
777 | if (Ext=MMX) |
777 | if (Ext=MMX) |
778 | movq mm0,.b1 ; b, g |
778 | movq mm0,.b1 ; b, g |
779 | movq mm1,.b2 |
779 | movq mm1,.b2 |
780 | movq .b1, mm1 |
780 | movq .b1, mm1 |
781 | movq .b2, mm0 |
781 | movq .b2, mm0 |
782 | movq mm2,.r1 ; r, y |
782 | movq mm2,.r1 ; r, y |
783 | movq mm3,.r2 |
783 | movq mm3,.r2 |
784 | movq .r1,mm3 |
784 | movq .r1,mm3 |
785 | movq .r2,mm2 |
785 | movq .r2,mm2 |
786 | movq mm4,.tex_x1 ; x, z |
786 | movq mm4,.tex_x1 ; x, z |
787 | movq mm5,.tex_x2 |
787 | movq mm5,.tex_x2 |
788 | movq .tex_x1,mm5 |
788 | movq .tex_x1,mm5 |
789 | movq .tex_x2,mm4 |
789 | movq .tex_x2,mm4 |
790 | 790 | ||
791 | end if |
791 | end if |
792 | if Ext>=SSE |
792 | if Ext>=SSE |
793 | movups xmm0,.b1 |
793 | movups xmm0,.b1 |
794 | movups xmm1,.b2 |
794 | movups xmm1,.b2 |
795 | movups .b1,xmm1 |
795 | movups .b1,xmm1 |
796 | movups .b2,xmm0 |
796 | movups .b2,xmm0 |
797 | movq mm4,.tex_x1 ; x, z |
797 | movq mm4,.tex_x1 ; x, z |
798 | movq mm5,.tex_x2 |
798 | movq mm5,.tex_x2 |
799 | movq .tex_x1,mm5 |
799 | movq .tex_x1,mm5 |
800 | movq .tex_x2,mm4 |
800 | movq .tex_x2,mm4 |
801 | end if |
801 | end if |
802 | 802 | ||
803 | @@: |
803 | @@: |
804 | or bx,bx |
804 | or bx,bx |
805 | jle .quit_l |
805 | jle .quit_l |
806 | cmp ax,SIZE_X |
806 | cmp ax,word[size_x_var] ;SIZE_X |
807 | jge .quit_l |
807 | jge .quit_l |
808 | 808 | ||
809 | push ax |
809 | push ax |
810 | push bx |
810 | push bx |
811 | 811 | ||
812 | mov eax,.z2 ; delta zone************ |
812 | mov eax,.z2 ; delta zone************ |
813 | sub eax,.z1 |
813 | sub eax,.z1 |
814 | cdq |
814 | cdq |
815 | mov bx,.x2 |
815 | mov bx,.x2 |
816 | sub bx,.x1 |
816 | sub bx,.x1 |
817 | movsx ebx,bx |
817 | movsx ebx,bx |
818 | idiv ebx |
818 | idiv ebx |
819 | push eax ; .dz |
819 | push eax ; .dz |
820 | 820 | ||
821 | mov eax,.b2 |
821 | mov eax,.b2 |
822 | sub eax,.b1 |
822 | sub eax,.b1 |
823 | cdq |
823 | cdq |
824 | idiv ebx |
824 | idiv ebx |
825 | push eax ; .db |
825 | push eax ; .db |
826 | 826 | ||
827 | mov eax,.g2 |
827 | mov eax,.g2 |
828 | sub eax,.g1 |
828 | sub eax,.g1 |
829 | cdq |
829 | cdq |
830 | idiv ebx |
830 | idiv ebx |
831 | push eax ; .dg |
831 | push eax ; .dg |
832 | 832 | ||
833 | mov eax,.r2 |
833 | mov eax,.r2 |
834 | sub eax,.r1 |
834 | sub eax,.r1 |
835 | cdq |
835 | cdq |
836 | idiv ebx |
836 | idiv ebx |
837 | push eax ; .dr |
837 | push eax ; .dr |
838 | 838 | ||
839 | mov eax,.tex_x2 |
839 | mov eax,.tex_x2 |
840 | sub eax,.tex_x1 |
840 | sub eax,.tex_x1 |
841 | cdq |
841 | cdq |
842 | idiv ebx |
842 | idiv ebx |
843 | push eax ; .dtex_x |
843 | push eax ; .dtex_x |
844 | 844 | ||
845 | mov eax,.tex_y2 |
845 | mov eax,.tex_y2 |
846 | sub eax,.tex_y1 |
846 | sub eax,.tex_y1 |
847 | cdq |
847 | cdq |
848 | idiv ebx |
848 | idiv ebx |
849 | push eax ; .dtey_x |
849 | push eax ; .dtey_x |
850 | 850 | ||
851 | cmp .x1,0 |
851 | cmp .x1,0 |
852 | jg @f |
852 | jg @f |
853 | 853 | ||
854 | mov eax,.dz ; clipping |
854 | mov eax,.dz ; clipping |
855 | movsx ebx,.x1 |
855 | movsx ebx,.x1 |
856 | neg ebx |
856 | neg ebx |
857 | imul ebx |
857 | imul ebx |
858 | add .z1,eax |
858 | add .z1,eax |
859 | mov .x1,0 |
859 | mov .x1,0 |
860 | 860 | ||
861 | mov eax,.dr |
861 | mov eax,.dr |
862 | imul ebx |
862 | imul ebx |
863 | add .r1,eax |
863 | add .r1,eax |
864 | ;if Ext=NON |
864 | ;if Ext=NON |
865 | mov eax,.dg |
865 | mov eax,.dg |
866 | imul ebx |
866 | imul ebx |
867 | add .g1,eax |
867 | add .g1,eax |
868 | 868 | ||
869 | mov eax,.db |
869 | mov eax,.db |
870 | imul ebx |
870 | imul ebx |
871 | add .b1,eax |
871 | add .b1,eax |
872 | 872 | ||
873 | mov eax,.dtex_x |
873 | mov eax,.dtex_x |
874 | imul ebx |
874 | imul ebx |
875 | add .tex_x1,eax |
875 | add .tex_x1,eax |
876 | 876 | ||
877 | mov eax,.dtex_y |
877 | mov eax,.dtex_y |
878 | imul ebx |
878 | imul ebx |
879 | add .tex_y1,eax |
879 | add .tex_y1,eax |
880 | @@: |
880 | @@: |
881 | mov edx,SIZE_X |
881 | movsx edx,word[size_x_var] ;SIZE_X |
882 | cmp .x2,dx |
882 | cmp .x2,dx |
883 | jl @f |
883 | jl @f |
884 | mov .x2,dx |
884 | mov .x2,dx |
885 | @@: |
885 | @@: |
886 | ; calc line addres begin in screen and Z buffer |
886 | ; calc line addres begin in screen and Z buffer |
887 | movsx eax,word .y |
887 | movsx eax,word .y |
888 | mul edx |
888 | mul edx |
889 | movsx edx,.x1 |
889 | movsx edx,.x1 |
890 | add eax,edx |
890 | add eax,edx |
891 | 891 | ||
892 | mov esi,eax |
892 | mov esi,eax |
893 | shl esi,2 |
893 | shl esi,2 |
894 | add esi,.z_buffer |
894 | add esi,.z_buffer |
895 | 895 | ||
896 | lea eax,[eax*3] |
896 | lea eax,[eax*3] |
897 | mov edi,.screen |
897 | mov edi,.screen |
898 | add edi,eax |
898 | add edi,eax |
899 | 899 | ||
900 | mov cx,.x2 |
900 | mov cx,.x2 |
901 | sub cx,.x1 |
901 | sub cx,.x1 |
902 | movzx ecx,cx |
902 | movzx ecx,cx |
903 | 903 | ||
904 | ; init current variables |
904 | ; init current variables |
905 | push dword .tex_y1 |
905 | push dword .tex_y1 |
906 | ;if Ext=NON |
906 | ;if Ext=NON |
907 | push dword .tex_x1 |
907 | push dword .tex_x1 |
908 | 908 | ||
909 | push dword .b1 |
909 | push dword .b1 |
910 | push dword .g1 |
910 | push dword .g1 |
911 | push dword .r1 |
911 | push dword .r1 |
912 | 912 | ||
913 | if Ext>=MMX |
913 | if Ext>=MMX |
914 | movq mm4,.cr ; lo -> r,g |
914 | movq mm4,.cr ; lo -> r,g |
915 | movq mm6,.cb ; hi -> b, tex_x |
915 | movq mm6,.cb ; hi -> b, tex_x |
916 | pxor mm0,mm0 |
916 | pxor mm0,mm0 |
917 | end if |
917 | end if |
918 | mov ebx,.z1 |
918 | mov ebx,.z1 |
919 | .ddraw: |
919 | .ddraw: |
920 | cmp ebx,dword[esi] |
920 | cmp ebx,dword[esi] |
921 | jge @f |
921 | jge @f |
922 | mov eax,.c_ty |
922 | mov eax,.c_ty |
923 | ; if ROUND |
923 | ; if ROUND |
924 | ; shl eax,TEX_SHIFT-ROUND |
924 | ; shl eax,TEX_SHIFT-ROUND |
925 | ; end if |
925 | ; end if |
926 | ; if ROUND>TEX_SHIFT |
926 | ; if ROUND>TEX_SHIFT |
927 | ; shr eax,ROUND-TEX_SHIFT |
927 | ; shr eax,ROUND-TEX_SHIFT |
928 | ; end if |
928 | ; end if |
929 | shr eax,ROUND |
929 | shr eax,ROUND |
930 | shl Eax,TEX_SHIFT |
930 | shl Eax,TEX_SHIFT |
931 | mov edx,.c_tx ; calc texture pixel mem addres |
931 | mov edx,.c_tx ; calc texture pixel mem addres |
932 | shr edx,ROUND |
932 | shr edx,ROUND |
933 | add eax,edx |
933 | add eax,edx |
934 | and eax,TEXTURE_SIZE ; cutting |
934 | and eax,TEXTURE_SIZE ; cutting |
935 | lea eax,[3*eax] |
935 | lea eax,[3*eax] |
936 | add eax,.tex_ptr |
936 | add eax,.tex_ptr |
937 | mov dword[esi],ebx |
937 | mov dword[esi],ebx |
938 | if Ext = NON |
938 | if Ext = NON |
939 | mov eax,dword[eax] |
939 | mov eax,dword[eax] |
940 | ; mov .tex_col,eax |
940 | ; mov .tex_col,eax |
941 | push ax |
941 | push ax |
942 | shl eax,8 |
942 | shl eax,8 |
943 | pop ax |
943 | pop ax |
944 | mov edx,.cr |
944 | mov edx,.cr |
945 | sar edx,ROUND |
945 | sar edx,ROUND |
946 | mul dl ; al*dl |
946 | mul dl ; al*dl |
947 | shr ax,8 |
947 | shr ax,8 |
948 | stosb |
948 | stosb |
949 | ror eax,16 |
949 | ror eax,16 |
950 | push ax |
950 | push ax |
951 | mov edx,.cg |
951 | mov edx,.cg |
952 | sar edx,ROUND |
952 | sar edx,ROUND |
953 | mul dl |
953 | mul dl |
954 | shr ax,8 |
954 | shr ax,8 |
955 | stosb |
955 | stosb |
956 | pop ax |
956 | pop ax |
957 | shr ax,8 |
957 | shr ax,8 |
958 | mov edx,.cb |
958 | mov edx,.cb |
959 | sar edx,ROUND |
959 | sar edx,ROUND |
960 | mul dl |
960 | mul dl |
961 | shr ax,8 |
961 | shr ax,8 |
962 | stosb |
962 | stosb |
963 | jmp .no_skip |
963 | jmp .no_skip |
964 | else |
964 | else |
965 | movd mm1,[eax] |
965 | movd mm1,[eax] |
966 | punpcklbw mm1,mm0 |
966 | punpcklbw mm1,mm0 |
967 | movq mm3,mm4 ;.cr ; lo -> r,g |
967 | movq mm3,mm4 ;.cr ; lo -> r,g |
968 | movq mm5,mm6 ;.cb ; lo -> b,tex_x |
968 | movq mm5,mm6 ;.cb ; lo -> b,tex_x |
969 | psrld mm3,ROUND ; |
969 | psrld mm3,ROUND ; |
970 | psrld mm5,ROUND ; |
970 | psrld mm5,ROUND ; |
971 | packssdw mm3,mm5 |
971 | packssdw mm3,mm5 |
972 | pmullw mm1,mm3 |
972 | pmullw mm1,mm3 |
973 | psrlw mm1,8 |
973 | psrlw mm1,8 |
974 | packuswb mm1,mm0 |
974 | packuswb mm1,mm0 |
975 | movd [edi],mm1 |
975 | movd [edi],mm1 |
976 | end if |
976 | end if |
977 | mov dword[esi],ebx |
977 | mov dword[esi],ebx |
978 | if Ext = NON |
978 | if Ext = NON |
979 | jmp .no_skip |
979 | jmp .no_skip |
980 | end if |
980 | end if |
981 | @@: |
981 | @@: |
982 | add edi,3 |
982 | add edi,3 |
983 | .no_skip: |
983 | .no_skip: |
984 | add esi,4 |
984 | add esi,4 |
985 | add ebx,.dz |
985 | add ebx,.dz |
986 | 986 | ||
987 | mov eax,.dtex_x |
987 | mov eax,.dtex_x |
988 | add .c_tx, eax |
988 | add .c_tx, eax |
989 | mov edx,.dtex_y |
989 | mov edx,.dtex_y |
990 | add .c_ty, edx |
990 | add .c_ty, edx |
991 | if Ext=NON |
991 | if Ext=NON |
992 | mov eax,.dr |
992 | mov eax,.dr |
993 | add .cr,eax |
993 | add .cr,eax |
994 | mov edx,.dg |
994 | mov edx,.dg |
995 | add .cg,edx |
995 | add .cg,edx |
996 | mov eax,.db |
996 | mov eax,.db |
997 | add .cb,eax |
997 | add .cb,eax |
998 | 998 | ||
999 | else |
999 | else |
1000 | paddd mm4,.drM |
1000 | paddd mm4,.drM |
1001 | paddd mm6,.dbM |
1001 | paddd mm6,.dbM |
1002 | ;; paddd mm7,.dtex_y ; mm4 - b, g |
1002 | ;; paddd mm7,.dtex_y ; mm4 - b, g |
1003 | ;; movq .c_tx,mm7 |
1003 | ;; movq .c_tx,mm7 |
1004 | ; mm6 - r, x |
1004 | ; mm6 - r, x |
1005 | end if ; mm7 - y, x |
1005 | end if ; mm7 - y, x |
1006 | 1006 | ||
1007 | dec ecx |
1007 | dec ecx |
1008 | jnz .ddraw |
1008 | jnz .ddraw |
1009 | 1009 | ||
1010 | .quit_l: |
1010 | .quit_l: |
1011 | 1011 | ||
1012 | mov esp,ebp |
1012 | mov esp,ebp |
1013 | ret 42+20 ; horizontal line |
1013 | ret 42+20 ; horizontal line |
1014 | ;>><><<><<<><<<<><<<<<><<<<<<> |
1014 | ;>><><<><<<><<<<><<<<<><<<<<<> |