Rev 1776 | Go to most recent revision | Only display areas with differences | Regard whitespace | Details | Blame | Last modification | View Log | RSS feed
Rev 1776 | Rev 1931 | ||
---|---|---|---|
1 | ;SIZE_X equ 350 |
1 | ;SIZE_X equ 350 |
2 | ;SIZE_Y equ 350 |
2 | ;SIZE_Y equ 350 |
3 | ROUND equ 8 |
3 | ROUND equ 8 |
4 | ;TEX_X equ 512 |
4 | ;TEX_X equ 512 |
5 | ;TEX_Y equ 512 |
5 | ;TEX_Y equ 512 |
6 | ;TEXTURE_SIZE EQU (512*512)-1 |
6 | ;TEXTURE_SIZE EQU (512*512)-1 |
7 | ;TEX_SHIFT EQU 9 |
7 | ;TEX_SHIFT EQU 9 |
8 | CATMULL_SHIFT equ 8 |
8 | CATMULL_SHIFT equ 8 |
9 | ;TEXTURE_SIZE EQU (TEX_X * TEX_Y)-1 |
9 | ;TEXTURE_SIZE EQU (TEX_X * TEX_Y)-1 |
10 | ;Ext = NON |
10 | ;Ext = NON |
11 | ;MMX = 1 |
11 | ;MMX = 1 |
12 | ;NON = 0 |
12 | ;NON = 0 |
13 | ;------- Big thanks to Majuma (www.majuma.xt.pl) for absolutely great--- |
13 | ;------- Big thanks to Majuma (www.majuma.xt.pl) for absolutely great--- |
14 | ;------- DOS 13h mode demos -------------------------------------------- |
14 | ;------- DOS 13h mode demos -------------------------------------------- |
15 | ;------- Procedure draws bump triangle using Catmull Z-buffer algorithm- |
15 | ;------- Procedure draws bump triangle using Catmull Z-buffer algorithm- |
16 | ;------- (Z coordinate interpolation)----------------------------------- |
16 | ;------- (Z coordinate interpolation)----------------------------------- |
17 | bump_triangle_z: |
17 | bump_triangle_z: |
18 | ;------------------in - eax - x1 shl 16 + y1 ----------- |
18 | ;------------------in - eax - x1 shl 16 + y1 ----------- |
19 | ;---------------------- ebx - x2 shl 16 + y2 ----------- |
19 | ;---------------------- ebx - x2 shl 16 + y2 ----------- |
20 | ;---------------------- ecx - x3 shl 16 + y3 ----------- |
20 | ;---------------------- ecx - x3 shl 16 + y3 ----------- |
21 | ;---------------------- edx - pointer to bump map ------ |
21 | ;---------------------- edx - pointer to bump map ------ |
22 | ;---------------------- esi - pointer to environment map |
22 | ;---------------------- esi - pointer to environment map |
23 | ;---------------------- edi - pointer to screen buffer-- |
23 | ;---------------------- edi - pointer to screen buffer-- |
24 | ;---------------------- stack : bump coordinates-------- |
24 | ;---------------------- stack : bump coordinates-------- |
25 | ;---------------------- environment coordinates- |
25 | ;---------------------- environment coordinates- |
26 | ;---------------------- Z position coordinates-- |
26 | ;---------------------- Z position coordinates-- |
27 | ;---------------------- pointer io Z buffer----- |
27 | ;---------------------- pointer io Z buffer----- |
28 | ;-- Z-buffer - filled with coordinates as dword -------- |
28 | ;-- Z-buffer - filled with coordinates as dword -------- |
29 | ;-- (Z coor. as word) shl CATMULL_SHIFT ---------------- |
29 | ;-- (Z coor. as word) shl CATMULL_SHIFT ---------------- |
30 | .b_x1 equ ebp+4 ; procedure don't save registers !!! |
30 | .b_x1 equ ebp+4 ; procedure don't save registers !!! |
31 | .b_y1 equ ebp+6 ; each coordinate as word |
31 | .b_y1 equ ebp+6 ; each coordinate as word |
32 | .b_x2 equ ebp+8 |
32 | .b_x2 equ ebp+8 |
33 | .b_y2 equ ebp+10 |
33 | .b_y2 equ ebp+10 |
34 | .b_x3 equ ebp+12 |
34 | .b_x3 equ ebp+12 |
35 | .b_y3 equ ebp+14 |
35 | .b_y3 equ ebp+14 |
36 | .e_x1 equ ebp+16 |
36 | .e_x1 equ ebp+16 |
37 | .e_y1 equ ebp+18 |
37 | .e_y1 equ ebp+18 |
38 | .e_x2 equ ebp+20 |
38 | .e_x2 equ ebp+20 |
39 | .e_y2 equ ebp+22 |
39 | .e_y2 equ ebp+22 |
40 | .e_x3 equ ebp+24 |
40 | .e_x3 equ ebp+24 |
41 | .e_y3 equ ebp+26 |
41 | .e_y3 equ ebp+26 |
42 | .z1 equ word[ebp+28] |
42 | .z1 equ word[ebp+28] |
43 | .z2 equ word[ebp+30] |
43 | .z2 equ word[ebp+30] |
44 | .z3 equ word[ebp+32] |
44 | .z3 equ word[ebp+32] |
45 | .z_buff equ dword[ebp+34] ; pointer to Z-buffer |
45 | .z_buff equ dword[ebp+34] ; pointer to Z-buffer |
46 | 46 | ||
47 | 47 | ||
48 | .t_bmap equ dword[ebp-4] ; pointer to bump map |
48 | .t_bmap equ dword[ebp-4] ; pointer to bump map |
49 | .t_emap equ dword[ebp-8] ; pointer to e. map |
49 | .t_emap equ dword[ebp-8] ; pointer to e. map |
50 | .x1 equ word[ebp-10] |
50 | .x1 equ word[ebp-10] |
51 | .y1 equ word[ebp-12] |
51 | .y1 equ word[ebp-12] |
52 | .x2 equ word[ebp-14] |
52 | .x2 equ word[ebp-14] |
53 | .y2 equ word[ebp-16] |
53 | .y2 equ word[ebp-16] |
54 | .x3 equ word[ebp-18] |
54 | .x3 equ word[ebp-18] |
55 | .y3 equ word[ebp-20] |
55 | .y3 equ word[ebp-20] |
56 | 56 | ||
57 | .dx12 equ dword[ebp-24] |
57 | .dx12 equ dword[ebp-24] |
58 | .dz12 equ [ebp-28] |
58 | .dz12 equ [ebp-28] |
59 | .dbx12 equ dword[ebp-32] |
59 | .dbx12 equ dword[ebp-32] |
60 | .dby12 equ [ebp-36] |
60 | .dby12 equ [ebp-36] |
61 | .dex12 equ dword[ebp-40] |
61 | .dex12 equ dword[ebp-40] |
62 | .dey12 equ [ebp-44] |
62 | .dey12 equ [ebp-44] |
63 | 63 | ||
64 | .dx13 equ dword[ebp-48] |
64 | .dx13 equ dword[ebp-48] |
65 | .dz13 equ [ebp-52] |
65 | .dz13 equ [ebp-52] |
66 | .dbx13 equ dword[ebp-56] |
66 | .dbx13 equ dword[ebp-56] |
67 | .dby13 equ [ebp-60] |
67 | .dby13 equ [ebp-60] |
68 | .dex13 equ dword[ebp-64] |
68 | .dex13 equ dword[ebp-64] |
69 | .dey13 equ [ebp-68] |
69 | .dey13 equ [ebp-68] |
70 | 70 | ||
71 | .dx23 equ dword[ebp-72] |
71 | .dx23 equ dword[ebp-72] |
72 | .dz23 equ [ebp-76] |
72 | .dz23 equ [ebp-76] |
73 | .dbx23 equ dword[ebp-80] |
73 | .dbx23 equ dword[ebp-80] |
74 | .dby23 equ [ebp-84] |
74 | .dby23 equ [ebp-84] |
75 | .dex23 equ dword[ebp-88] |
75 | .dex23 equ dword[ebp-88] |
76 | .dey23 equ [ebp-92] |
76 | .dey23 equ [ebp-92] |
77 | 77 | ||
78 | .cx1 equ dword[ebp-96] ; current variables |
78 | .cx1 equ dword[ebp-96] ; current variables |
79 | .cz1 equ [ebp-100] |
79 | .cz1 equ [ebp-100] |
80 | .cx2 equ dword[ebp-104] |
80 | .cx2 equ dword[ebp-104] |
81 | .cz2 equ [ebp-108] |
81 | .cz2 equ [ebp-108] |
82 | .cbx1 equ dword[ebp-112] |
82 | .cbx1 equ dword[ebp-112] |
83 | .cby1 equ [ebp-116] |
83 | .cby1 equ [ebp-116] |
84 | .cbx2 equ dword[ebp-120] |
84 | .cbx2 equ dword[ebp-120] |
85 | .cby2 equ [ebp-124] |
85 | .cby2 equ [ebp-124] |
86 | .cex1 equ dword[ebp-128] |
86 | .cex1 equ dword[ebp-128] |
87 | .cey1 equ [ebp-132] |
87 | .cey1 equ [ebp-132] |
88 | .cex2 equ dword[ebp-136] |
88 | .cex2 equ dword[ebp-136] |
89 | .cey2 equ [ebp-140] |
89 | .cey2 equ [ebp-140] |
90 | 90 | ||
91 | mov ebp,esp |
91 | mov ebp,esp |
92 | push edx ; store bump map |
92 | push edx ; store bump map |
93 | push esi ; store e. map |
93 | push esi ; store e. map |
94 | ; sub esp,120 |
94 | ; sub esp,120 |
95 | .sort3: ; sort triangle coordinates... |
95 | .sort3: ; sort triangle coordinates... |
96 | cmp ax,bx |
96 | cmp ax,bx |
97 | jle .sort1 |
97 | jle .sort1 |
98 | xchg eax,ebx |
98 | xchg eax,ebx |
99 | mov edx,dword[.b_x1] |
99 | mov edx,dword[.b_x1] |
100 | xchg edx,dword[.b_x2] |
100 | xchg edx,dword[.b_x2] |
101 | mov dword[.b_x1],edx |
101 | mov dword[.b_x1],edx |
102 | mov edx,dword[.e_x1] |
102 | mov edx,dword[.e_x1] |
103 | xchg edx,dword[.e_x2] |
103 | xchg edx,dword[.e_x2] |
104 | mov dword[.e_x1],edx |
104 | mov dword[.e_x1],edx |
105 | mov dx,.z1 |
105 | mov dx,.z1 |
106 | xchg dx,.z2 |
106 | xchg dx,.z2 |
107 | mov .z1,dx |
107 | mov .z1,dx |
108 | .sort1: |
108 | .sort1: |
109 | cmp bx,cx |
109 | cmp bx,cx |
110 | jle .sort2 |
110 | jle .sort2 |
111 | xchg ebx,ecx |
111 | xchg ebx,ecx |
112 | mov edx,dword[.b_x2] |
112 | mov edx,dword[.b_x2] |
113 | xchg edx,dword[.b_x3] |
113 | xchg edx,dword[.b_x3] |
114 | mov dword[.b_x2],edx |
114 | mov dword[.b_x2],edx |
115 | mov edx,dword[.e_x2] |
115 | mov edx,dword[.e_x2] |
116 | xchg edx,dword[.e_x3] |
116 | xchg edx,dword[.e_x3] |
117 | mov dword[.e_x2],edx |
117 | mov dword[.e_x2],edx |
118 | mov dx,.z2 |
118 | mov dx,.z2 |
119 | xchg dx,.z3 |
119 | xchg dx,.z3 |
120 | mov .z2,dx |
120 | mov .z2,dx |
121 | jmp .sort3 |
121 | jmp .sort3 |
122 | .sort2: |
122 | .sort2: |
123 | push eax ; store triangle coords in variables |
123 | push eax ; store triangle coords in variables |
124 | push ebx |
124 | push ebx |
125 | push ecx |
125 | push ecx |
126 | 126 | ||
127 | mov edx,80008000h ; eax,ebx,ecx are ANDd together into edx which means that |
127 | mov edx,80008000h ; eax,ebx,ecx are ANDd together into edx which means that |
128 | and edx,ebx ; if *all* of them are negative a sign flag is raised |
128 | and edx,ebx ; if *all* of them are negative a sign flag is raised |
129 | and edx,ecx |
129 | and edx,ecx |
130 | and edx,eax |
130 | and edx,eax |
131 | test edx,80008000h ; Check both X&Y at once |
131 | test edx,80008000h ; Check both X&Y at once |
132 | jne .loop23_done |
132 | jne .loop23_done |
133 | ; mov edx,eax ; eax,ebx,ecx are ORd together into edx which means that |
133 | ; mov edx,eax ; eax,ebx,ecx are ORd together into edx which means that |
134 | ; or edx,ebx ; if any *one* of them is negative a sign flag is raised |
134 | ; or edx,ebx ; if any *one* of them is negative a sign flag is raised |
135 | ; or edx,ecx |
135 | ; or edx,ecx |
136 | ; test edx,80000000h ; Check only X |
136 | ; test edx,80000000h ; Check only X |
137 | ; jne .loop23_done |
137 | ; jne .loop23_done |
138 | 138 | ||
139 | ; cmp .x1,SIZE_X ; { |
139 | ; cmp .x1,SIZE_X ; { |
140 | ; jg .loop23_done |
140 | ; jg .loop23_done |
141 | ; cmp .x2,SIZE_X ; This can be optimized with effort |
141 | ; cmp .x2,SIZE_X ; This can be optimized with effort |
142 | ; jg .loop23_done |
142 | ; jg .loop23_done |
143 | ; cmp .x3,SIZE_X |
143 | ; cmp .x3,SIZE_X |
144 | ; jg .loop23_done ; { |
144 | ; jg .loop23_done ; { |
145 | 145 | ||
146 | 146 | ||
147 | mov bx,.y2 ; calc delta 12 |
147 | mov bx,.y2 ; calc delta 12 |
148 | sub bx,.y1 |
148 | sub bx,.y1 |
149 | jnz .bt_dx12_make |
149 | jnz .bt_dx12_make |
150 | mov ecx,6 |
150 | mov ecx,6 |
151 | xor edx,edx |
151 | xor edx,edx |
152 | @@: |
152 | @@: |
153 | push edx ;dword 0 |
153 | push edx ;dword 0 |
154 | loop @b |
154 | loop @b |
155 | jmp .bt_dx12_done |
155 | jmp .bt_dx12_done |
156 | .bt_dx12_make: |
156 | .bt_dx12_make: |
157 | mov ax,.x2 |
157 | mov ax,.x2 |
158 | sub ax,.x1 |
158 | sub ax,.x1 |
159 | cwde |
159 | cwde |
160 | movsx ebx,bx |
160 | movsx ebx,bx |
161 | shl eax,ROUND |
161 | shl eax,ROUND |
162 | cdq |
162 | cdq |
163 | idiv ebx |
163 | idiv ebx |
164 | ; mov .dx12,eax |
164 | ; mov .dx12,eax |
165 | push eax |
165 | push eax |
166 | 166 | ||
167 | mov ax,.z2 |
167 | mov ax,.z2 |
168 | sub ax,.z1 |
168 | sub ax,.z1 |
169 | cwde |
169 | cwde |
170 | shl eax,CATMULL_SHIFT |
170 | shl eax,CATMULL_SHIFT |
171 | cdq |
171 | cdq |
172 | idiv ebx |
172 | idiv ebx |
173 | push eax |
173 | push eax |
174 | if Ext>=SSE |
174 | if Ext>=SSE |
175 | 175 | ||
176 | sub esp,16 |
176 | sub esp,16 |
177 | cvtsi2ss xmm3,ebx ;rcps |
177 | cvtsi2ss xmm3,ebx ;rcps |
178 | ; mov eax,255 |
178 | ; mov eax,255 |
179 | cvtsi2ss xmm4,[i255d] |
179 | cvtsi2ss xmm4,[i255d] |
180 | divss xmm3,xmm4 |
180 | divss xmm3,xmm4 |
181 | rcpss xmm3,xmm3 |
181 | rcpss xmm3,xmm3 |
182 | ; mulss xmm3,xmm4 |
182 | ; mulss xmm3,xmm4 |
183 | shufps xmm3,xmm3,0 |
183 | shufps xmm3,xmm3,0 |
184 | 184 | ||
185 | movd mm0,[.b_x1] |
185 | movd mm0,[.b_x1] |
186 | movd mm1,[.b_x2] |
186 | movd mm1,[.b_x2] |
187 | movd mm2,[.e_x1] |
187 | movd mm2,[.e_x1] |
188 | movd mm3,[.e_x2] |
188 | movd mm3,[.e_x2] |
189 | pxor mm4,mm4 |
189 | pxor mm4,mm4 |
190 | punpcklwd mm0,mm4 |
190 | punpcklwd mm0,mm4 |
191 | punpcklwd mm1,mm4 |
191 | punpcklwd mm1,mm4 |
192 | punpcklwd mm2,mm4 |
192 | punpcklwd mm2,mm4 |
193 | punpcklwd mm3,mm4 |
193 | punpcklwd mm3,mm4 |
194 | 194 | ||
195 | psubd mm1,mm0 |
195 | psubd mm1,mm0 |
196 | psubd mm3,mm2 |
196 | psubd mm3,mm2 |
197 | 197 | ||
198 | ; cvtpi2ps xmm0,mm0 |
198 | ; cvtpi2ps xmm0,mm0 |
199 | ; movlhps xmm0,xmm0 |
199 | ; movlhps xmm0,xmm0 |
200 | ; cvtpi2ps xmm0,mm2 |
200 | ; cvtpi2ps xmm0,mm2 |
201 | cvtpi2ps xmm1,mm1 |
201 | cvtpi2ps xmm1,mm1 |
202 | movlhps xmm1,xmm1 |
202 | movlhps xmm1,xmm1 |
203 | cvtpi2ps xmm1,mm3 |
203 | cvtpi2ps xmm1,mm3 |
204 | ; subps xmm1,xmm0 |
204 | ; subps xmm1,xmm0 |
205 | 205 | ||
206 | 206 | ||
207 | ; cvtpi2ps xmm0,mm3 |
207 | ; cvtpi2ps xmm0,mm3 |
208 | ; divps xmm1,xmm3 |
208 | ; divps xmm1,xmm3 |
209 | mulps xmm1,xmm3 |
209 | mulps xmm1,xmm3 |
210 | shufps xmm1,xmm1,10110001b |
210 | shufps xmm1,xmm1,10110001b |
211 | cvtps2pi mm0,xmm1 ; mm0 -> 2 delta dwords |
211 | cvtps2pi mm0,xmm1 ; mm0 -> 2 delta dwords |
212 | movhlps xmm1,xmm1 |
212 | movhlps xmm1,xmm1 |
213 | cvtps2pi mm1,xmm1 |
213 | cvtps2pi mm1,xmm1 |
214 | movq .dey12,mm0 |
214 | movq .dey12,mm0 |
215 | movq .dby12,mm1 |
215 | movq .dby12,mm1 |
216 | 216 | ||
217 | 217 | ||
218 | else |
218 | else |
219 | 219 | ||
220 | mov ax,word[.b_x2] |
220 | mov ax,word[.b_x2] |
221 | sub ax,word[.b_x1] |
221 | sub ax,word[.b_x1] |
222 | cwde |
222 | cwde |
223 | shl eax,ROUND |
223 | shl eax,ROUND |
224 | cdq |
224 | cdq |
225 | idiv ebx |
225 | idiv ebx |
226 | ; mov .dbx12,eax |
226 | ; mov .dbx12,eax |
227 | push eax |
227 | push eax |
228 | 228 | ||
229 | mov ax,word[.b_y2] |
229 | mov ax,word[.b_y2] |
230 | sub ax,word[.b_y1] |
230 | sub ax,word[.b_y1] |
231 | cwde |
231 | cwde |
232 | shl eax,ROUND |
232 | shl eax,ROUND |
233 | cdq |
233 | cdq |
234 | idiv ebx |
234 | idiv ebx |
235 | ; mov .dby12,eax |
235 | ; mov .dby12,eax |
236 | push eax |
236 | push eax |
237 | 237 | ||
238 | mov ax,word[.e_x2] |
238 | mov ax,word[.e_x2] |
239 | sub ax,word[.e_x1] |
239 | sub ax,word[.e_x1] |
240 | cwde |
240 | cwde |
241 | shl eax,ROUND |
241 | shl eax,ROUND |
242 | cdq |
242 | cdq |
243 | idiv ebx |
243 | idiv ebx |
244 | ; mov .dex12,eax |
244 | ; mov .dex12,eax |
245 | push eax |
245 | push eax |
246 | 246 | ||
247 | mov ax,word[.e_y2] |
247 | mov ax,word[.e_y2] |
248 | sub ax,word[.e_y1] |
248 | sub ax,word[.e_y1] |
249 | cwde |
249 | cwde |
250 | shl eax,ROUND |
250 | shl eax,ROUND |
251 | cdq |
251 | cdq |
252 | idiv ebx |
252 | idiv ebx |
253 | ; mov .dey12,eax |
253 | ; mov .dey12,eax |
254 | push eax |
254 | push eax |
255 | 255 | ||
256 | end if |
256 | end if |
257 | 257 | ||
258 | .bt_dx12_done: |
258 | .bt_dx12_done: |
259 | 259 | ||
260 | mov bx,.y3 ; calc delta13 |
260 | mov bx,.y3 ; calc delta13 |
261 | sub bx,.y1 |
261 | sub bx,.y1 |
262 | jnz .bt_dx13_make |
262 | jnz .bt_dx13_make |
263 | mov ecx,6 |
263 | mov ecx,6 |
264 | xor edx,edx |
264 | xor edx,edx |
265 | @@: |
265 | @@: |
266 | push edx ;dword 0 |
266 | push edx ;dword 0 |
267 | loop @b |
267 | loop @b |
268 | jmp .bt_dx13_done |
268 | jmp .bt_dx13_done |
269 | .bt_dx13_make: |
269 | .bt_dx13_make: |
270 | mov ax,.x3 |
270 | mov ax,.x3 |
271 | sub ax,.x1 |
271 | sub ax,.x1 |
272 | cwde |
272 | cwde |
273 | movsx ebx,bx |
273 | movsx ebx,bx |
274 | shl eax,ROUND |
274 | shl eax,ROUND |
275 | cdq |
275 | cdq |
276 | idiv ebx |
276 | idiv ebx |
277 | ; mov .dx13,eax |
277 | ; mov .dx13,eax |
278 | push eax |
278 | push eax |
279 | 279 | ||
280 | mov ax,.z3 |
280 | mov ax,.z3 |
281 | sub ax,.z1 |
281 | sub ax,.z1 |
282 | cwde |
282 | cwde |
283 | shl eax,CATMULL_SHIFT |
283 | shl eax,CATMULL_SHIFT |
284 | cdq |
284 | cdq |
285 | idiv ebx |
285 | idiv ebx |
286 | ; mov .dz13,eax |
286 | ; mov .dz13,eax |
287 | push eax |
287 | push eax |
288 | 288 | ||
289 | if Ext>=SSE |
289 | if Ext>=SSE |
290 | 290 | ||
291 | sub esp,16 |
291 | sub esp,16 |
292 | cvtsi2ss xmm3,ebx ;rcps |
292 | cvtsi2ss xmm3,ebx ;rcps |
293 | ; mov eax,255 |
293 | ; mov eax,255 |
294 | cvtsi2ss xmm4,[i255d] |
294 | cvtsi2ss xmm4,[i255d] |
295 | divss xmm3,xmm4 |
295 | divss xmm3,xmm4 |
296 | rcpss xmm3,xmm3 |
296 | rcpss xmm3,xmm3 |
297 | ; mulss xmm3,xmm4 |
297 | ; mulss xmm3,xmm4 |
298 | shufps xmm3,xmm3,0 |
298 | shufps xmm3,xmm3,0 |
299 | 299 | ||
300 | movd mm0,[.b_x1] |
300 | movd mm0,[.b_x1] |
301 | movd mm1,[.b_x3] |
301 | movd mm1,[.b_x3] |
302 | movd mm2,[.e_x1] |
302 | movd mm2,[.e_x1] |
303 | movd mm3,[.e_x3] |
303 | movd mm3,[.e_x3] |
304 | pxor mm4,mm4 |
304 | pxor mm4,mm4 |
305 | punpcklwd mm0,mm4 |
305 | punpcklwd mm0,mm4 |
306 | punpcklwd mm1,mm4 |
306 | punpcklwd mm1,mm4 |
307 | punpcklwd mm2,mm4 |
307 | punpcklwd mm2,mm4 |
308 | punpcklwd mm3,mm4 |
308 | punpcklwd mm3,mm4 |
309 | 309 | ||
310 | psubd mm1,mm0 |
310 | psubd mm1,mm0 |
311 | psubd mm3,mm2 |
311 | psubd mm3,mm2 |
312 | 312 | ||
313 | ; cvtpi2ps xmm0,mm0 |
313 | ; cvtpi2ps xmm0,mm0 |
314 | ; movlhps xmm0,xmm0 |
314 | ; movlhps xmm0,xmm0 |
315 | ; cvtpi2ps xmm0,mm2 |
315 | ; cvtpi2ps xmm0,mm2 |
316 | cvtpi2ps xmm1,mm1 |
316 | cvtpi2ps xmm1,mm1 |
317 | movlhps xmm1,xmm1 |
317 | movlhps xmm1,xmm1 |
318 | cvtpi2ps xmm1,mm3 |
318 | cvtpi2ps xmm1,mm3 |
319 | ; subps xmm1,xmm0 |
319 | ; subps xmm1,xmm0 |
320 | 320 | ||
321 | 321 | ||
322 | ; cvtpi2ps xmm0,mm3 |
322 | ; cvtpi2ps xmm0,mm3 |
323 | ; divps xmm1,xmm3 |
323 | ; divps xmm1,xmm3 |
324 | mulps xmm1,xmm3 |
324 | mulps xmm1,xmm3 |
325 | shufps xmm1,xmm1,10110001b |
325 | shufps xmm1,xmm1,10110001b |
326 | cvtps2pi mm0,xmm1 ; mm0 -> 2 delta dwords |
326 | cvtps2pi mm0,xmm1 ; mm0 -> 2 delta dwords |
327 | movhlps xmm1,xmm1 |
327 | movhlps xmm1,xmm1 |
328 | cvtps2pi mm1,xmm1 |
328 | cvtps2pi mm1,xmm1 |
329 | movq .dey13,mm0 |
329 | movq .dey13,mm0 |
330 | movq .dby13,mm1 |
330 | movq .dby13,mm1 |
331 | 331 | ||
332 | 332 | ||
333 | else |
333 | else |
334 | 334 | ||
335 | mov ax,word[.b_x3] |
335 | mov ax,word[.b_x3] |
336 | sub ax,word[.b_x1] |
336 | sub ax,word[.b_x1] |
337 | cwde |
337 | cwde |
338 | shl eax,ROUND |
338 | shl eax,ROUND |
339 | cdq |
339 | cdq |
340 | idiv ebx |
340 | idiv ebx |
341 | ; mov .dbx13,eax |
341 | ; mov .dbx13,eax |
342 | push eax |
342 | push eax |
343 | 343 | ||
344 | mov ax,word[.b_y3] |
344 | mov ax,word[.b_y3] |
345 | sub ax,word[.b_y1] |
345 | sub ax,word[.b_y1] |
346 | cwde |
346 | cwde |
347 | shl eax,ROUND |
347 | shl eax,ROUND |
348 | cdq |
348 | cdq |
349 | idiv ebx |
349 | idiv ebx |
350 | ; mov .dby13,eax |
350 | ; mov .dby13,eax |
351 | push eax |
351 | push eax |
352 | 352 | ||
353 | mov ax,word[.e_x3] |
353 | mov ax,word[.e_x3] |
354 | sub ax,word[.e_x1] |
354 | sub ax,word[.e_x1] |
355 | cwde |
355 | cwde |
356 | shl eax,ROUND |
356 | shl eax,ROUND |
357 | cdq |
357 | cdq |
358 | idiv ebx |
358 | idiv ebx |
359 | ; mov .dex13,eax |
359 | ; mov .dex13,eax |
360 | push eax |
360 | push eax |
361 | 361 | ||
362 | mov ax,word[.e_y3] |
362 | mov ax,word[.e_y3] |
363 | sub ax,word[.e_y1] |
363 | sub ax,word[.e_y1] |
364 | cwde |
364 | cwde |
365 | shl eax,ROUND |
365 | shl eax,ROUND |
366 | cdq |
366 | cdq |
367 | idiv ebx |
367 | idiv ebx |
368 | ; mov .dey13,eax |
368 | ; mov .dey13,eax |
369 | push eax |
369 | push eax |
370 | end if |
370 | end if |
371 | 371 | ||
372 | .bt_dx13_done: |
372 | .bt_dx13_done: |
373 | 373 | ||
374 | mov bx,.y3 ; calc delta23 |
374 | mov bx,.y3 ; calc delta23 |
375 | sub bx,.y2 |
375 | sub bx,.y2 |
376 | jnz .bt_dx23_make |
376 | jnz .bt_dx23_make |
377 | mov ecx,6 |
377 | mov ecx,6 |
378 | xor edx,edx |
378 | xor edx,edx |
379 | @@: |
379 | @@: |
380 | push edx ;dword 0 |
380 | push edx ;dword 0 |
381 | loop @b |
381 | loop @b |
382 | jmp .bt_dx23_done |
382 | jmp .bt_dx23_done |
383 | .bt_dx23_make: |
383 | .bt_dx23_make: |
384 | mov ax,.x3 |
384 | mov ax,.x3 |
385 | sub ax,.x2 |
385 | sub ax,.x2 |
386 | cwde |
386 | cwde |
387 | movsx ebx,bx |
387 | movsx ebx,bx |
388 | shl eax,ROUND |
388 | shl eax,ROUND |
389 | cdq |
389 | cdq |
390 | idiv ebx |
390 | idiv ebx |
391 | ; mov .dx23,eax |
391 | ; mov .dx23,eax |
392 | push eax |
392 | push eax |
393 | 393 | ||
394 | mov ax,.z3 |
394 | mov ax,.z3 |
395 | sub ax,.z2 |
395 | sub ax,.z2 |
396 | cwde |
396 | cwde |
397 | shl eax,CATMULL_SHIFT |
397 | shl eax,CATMULL_SHIFT |
398 | cdq |
398 | cdq |
399 | idiv ebx |
399 | idiv ebx |
400 | ; mov .dz23,eax |
400 | ; mov .dz23,eax |
401 | push eax |
401 | push eax |
402 | ; sub esp,40 |
402 | ; sub esp,40 |
403 | if Ext>=SSE |
403 | if Ext>=SSE |
404 | 404 | ||
405 | sub esp,16 |
405 | sub esp,16 |
406 | cvtsi2ss xmm3,ebx ;rcps |
406 | cvtsi2ss xmm3,ebx ;rcps |
407 | ; mov eax,255 |
407 | ; mov eax,255 |
408 | cvtsi2ss xmm4,[i255d] |
408 | cvtsi2ss xmm4,[i255d] |
409 | divss xmm3,xmm4 |
409 | divss xmm3,xmm4 |
410 | rcpss xmm3,xmm3 |
410 | rcpss xmm3,xmm3 |
411 | ; mulss xmm3,xmm4 |
411 | ; mulss xmm3,xmm4 |
412 | shufps xmm3,xmm3,0 |
412 | shufps xmm3,xmm3,0 |
413 | 413 | ||
414 | movd mm0,[.b_x2] |
414 | movd mm0,[.b_x2] |
415 | movd mm1,[.b_x3] |
415 | movd mm1,[.b_x3] |
416 | movd mm2,[.e_x2] |
416 | movd mm2,[.e_x2] |
417 | movd mm3,[.e_x3] |
417 | movd mm3,[.e_x3] |
418 | pxor mm4,mm4 |
418 | pxor mm4,mm4 |
419 | punpcklwd mm0,mm4 |
419 | punpcklwd mm0,mm4 |
420 | punpcklwd mm1,mm4 |
420 | punpcklwd mm1,mm4 |
421 | punpcklwd mm2,mm4 |
421 | punpcklwd mm2,mm4 |
422 | punpcklwd mm3,mm4 |
422 | punpcklwd mm3,mm4 |
423 | 423 | ||
424 | psubd mm1,mm0 |
424 | psubd mm1,mm0 |
425 | psubd mm3,mm2 |
425 | psubd mm3,mm2 |
426 | 426 | ||
427 | ; cvtpi2ps xmm0,mm0 |
427 | ; cvtpi2ps xmm0,mm0 |
428 | ; movlhps xmm0,xmm0 |
428 | ; movlhps xmm0,xmm0 |
429 | ; cvtpi2ps xmm0,mm2 |
429 | ; cvtpi2ps xmm0,mm2 |
430 | cvtpi2ps xmm1,mm1 |
430 | cvtpi2ps xmm1,mm1 |
431 | movlhps xmm1,xmm1 |
431 | movlhps xmm1,xmm1 |
432 | cvtpi2ps xmm1,mm3 |
432 | cvtpi2ps xmm1,mm3 |
433 | ; subps xmm1,xmm0 |
433 | ; subps xmm1,xmm0 |
434 | 434 | ||
435 | 435 | ||
436 | ; cvtpi2ps xmm0,mm3 |
436 | ; cvtpi2ps xmm0,mm3 |
437 | ; divps xmm1,xmm3 |
437 | ; divps xmm1,xmm3 |
438 | mulps xmm1,xmm3 |
438 | mulps xmm1,xmm3 |
439 | shufps xmm1,xmm1,10110001b |
439 | shufps xmm1,xmm1,10110001b |
440 | cvtps2pi mm0,xmm1 ; mm0 -> 2 delta dwords |
440 | cvtps2pi mm0,xmm1 ; mm0 -> 2 delta dwords |
441 | movhlps xmm1,xmm1 |
441 | movhlps xmm1,xmm1 |
442 | cvtps2pi mm1,xmm1 |
442 | cvtps2pi mm1,xmm1 |
443 | movq .dey23,mm0 |
443 | movq .dey23,mm0 |
444 | movq .dby23,mm1 |
444 | movq .dby23,mm1 |
445 | 445 | ||
446 | else |
446 | else |
447 | 447 | ||
448 | mov ax,word[.b_x3] |
448 | mov ax,word[.b_x3] |
449 | sub ax,word[.b_x2] |
449 | sub ax,word[.b_x2] |
450 | cwde |
450 | cwde |
451 | shl eax,ROUND |
451 | shl eax,ROUND |
452 | cdq |
452 | cdq |
453 | idiv ebx |
453 | idiv ebx |
454 | ; mov .dbx23,eax |
454 | ; mov .dbx23,eax |
455 | push eax |
455 | push eax |
456 | 456 | ||
457 | mov ax,word[.b_y3] |
457 | mov ax,word[.b_y3] |
458 | sub ax,word[.b_y2] |
458 | sub ax,word[.b_y2] |
459 | cwde |
459 | cwde |
460 | shl eax,ROUND |
460 | shl eax,ROUND |
461 | cdq |
461 | cdq |
462 | idiv ebx |
462 | idiv ebx |
463 | ; mov .dby23,eax |
463 | ; mov .dby23,eax |
464 | push eax |
464 | push eax |
465 | 465 | ||
466 | mov ax,word[.e_x3] |
466 | mov ax,word[.e_x3] |
467 | sub ax,word[.e_x2] |
467 | sub ax,word[.e_x2] |
468 | cwde |
468 | cwde |
469 | shl eax,ROUND |
469 | shl eax,ROUND |
470 | cdq |
470 | cdq |
471 | idiv ebx |
471 | idiv ebx |
472 | ; mov .dex23,eax |
472 | ; mov .dex23,eax |
473 | push eax |
473 | push eax |
474 | 474 | ||
475 | mov ax,word[.e_y3] |
475 | mov ax,word[.e_y3] |
476 | sub ax,word[.e_y2] |
476 | sub ax,word[.e_y2] |
477 | cwde |
477 | cwde |
478 | shl eax,ROUND |
478 | shl eax,ROUND |
479 | cdq |
479 | cdq |
480 | idiv ebx |
480 | idiv ebx |
481 | ; mov .dey23,eax |
481 | ; mov .dey23,eax |
482 | push eax |
482 | push eax |
483 | 483 | ||
484 | end if |
484 | end if |
485 | 485 | ||
486 | .bt_dx23_done: |
486 | .bt_dx23_done: |
487 | sub esp,48 |
487 | sub esp,48 |
488 | 488 | ||
489 | movsx eax,.x1 |
489 | movsx eax,.x1 |
490 | shl eax,ROUND |
490 | shl eax,ROUND |
491 | mov .cx1,eax |
491 | mov .cx1,eax |
492 | mov .cx2,eax |
492 | mov .cx2,eax |
493 | ; push eax |
493 | ; push eax |
494 | ; push eax |
494 | ; push eax |
495 | 495 | ||
496 | movsx eax,word[.b_x1] |
496 | movsx eax,word[.b_x1] |
497 | shl eax,ROUND |
497 | shl eax,ROUND |
498 | mov .cbx1,eax |
498 | mov .cbx1,eax |
499 | mov .cbx2,eax |
499 | mov .cbx2,eax |
500 | ; push eax |
500 | ; push eax |
501 | ; push eax |
501 | ; push eax |
502 | 502 | ||
503 | movsx eax,word[.b_y1] |
503 | movsx eax,word[.b_y1] |
504 | shl eax,ROUND |
504 | shl eax,ROUND |
505 | mov .cby1,eax |
505 | mov .cby1,eax |
506 | mov .cby2,eax |
506 | mov .cby2,eax |
507 | ; push eax |
507 | ; push eax |
508 | ; push eax |
508 | ; push eax |
509 | 509 | ||
510 | movsx eax,word[.e_x1] |
510 | movsx eax,word[.e_x1] |
511 | shl eax,ROUND |
511 | shl eax,ROUND |
512 | mov .cex1,eax |
512 | mov .cex1,eax |
513 | mov .cex2,eax |
513 | mov .cex2,eax |
514 | ; push eax |
514 | ; push eax |
515 | ; push eax |
515 | ; push eax |
516 | 516 | ||
517 | movsx eax,word[.e_y1] |
517 | movsx eax,word[.e_y1] |
518 | shl eax,ROUND |
518 | shl eax,ROUND |
519 | mov .cey1,eax |
519 | mov .cey1,eax |
520 | mov .cey2,eax |
520 | mov .cey2,eax |
521 | ; push eax |
521 | ; push eax |
522 | ; push eax |
522 | ; push eax |
523 | 523 | ||
524 | movsx eax,.z1 |
524 | movsx eax,.z1 |
525 | shl eax,CATMULL_SHIFT |
525 | shl eax,CATMULL_SHIFT |
526 | mov .cz1,eax |
526 | mov .cz1,eax |
527 | mov .cz2,eax |
527 | mov .cz2,eax |
528 | ; push eax |
528 | ; push eax |
529 | ; push eax |
529 | ; push eax |
530 | 530 | ||
531 | movsx ecx,.y1 |
531 | movsx ecx,.y1 |
532 | cmp cx,.y2 |
532 | cmp cx,.y2 |
533 | jge .loop12_done |
533 | jge .loop12_done |
534 | .loop12: |
534 | .loop12: |
535 | call .call_bump_line |
535 | call .call_bump_line |
536 | 536 | ||
537 | if Ext >= MMX |
537 | if Ext >= MMX |
538 | movq mm0,.cby2 |
538 | movq mm0,.cby2 |
539 | movq mm1,.cby1 |
539 | movq mm1,.cby1 |
540 | movq mm2,.cey2 |
540 | movq mm2,.cey2 |
541 | movq mm3,.cey1 |
541 | movq mm3,.cey1 |
542 | movq mm4,.cz1 |
542 | movq mm4,.cz1 |
543 | movq mm5,.cz2 |
543 | movq mm5,.cz2 |
544 | paddd mm0,.dby12 |
544 | paddd mm0,.dby12 |
545 | paddd mm1,.dby13 |
545 | paddd mm1,.dby13 |
546 | paddd mm2,.dey12 |
546 | paddd mm2,.dey12 |
547 | paddd mm3,.dey13 |
547 | paddd mm3,.dey13 |
548 | paddd mm4,.dz13 |
548 | paddd mm4,.dz13 |
549 | paddd mm5,.dz12 |
549 | paddd mm5,.dz12 |
550 | movq .cby2,mm0 |
550 | movq .cby2,mm0 |
551 | movq .cby1,mm1 |
551 | movq .cby1,mm1 |
552 | movq .cey1,mm3 |
552 | movq .cey1,mm3 |
553 | movq .cey2,mm2 |
553 | movq .cey2,mm2 |
554 | movq .cz1,mm4 |
554 | movq .cz1,mm4 |
555 | movq .cz2,mm5 |
555 | movq .cz2,mm5 |
556 | else |
556 | else |
557 | mov edx,.dbx13 |
557 | mov edx,.dbx13 |
558 | add .cbx1,edx |
558 | add .cbx1,edx |
559 | mov eax,.dbx12 |
559 | mov eax,.dbx12 |
560 | add .cbx2,eax |
560 | add .cbx2,eax |
561 | mov ebx,.dby13 |
561 | mov ebx,.dby13 |
562 | add .cby1,ebx |
562 | add .cby1,ebx |
563 | mov edx,.dby12 |
563 | mov edx,.dby12 |
564 | add .cby2,edx |
564 | add .cby2,edx |
565 | 565 | ||
566 | mov eax,.dex13 |
566 | mov eax,.dex13 |
567 | add .cex1,eax |
567 | add .cex1,eax |
568 | mov ebx,.dex12 |
568 | mov ebx,.dex12 |
569 | add .cex2,ebx |
569 | add .cex2,ebx |
570 | mov edx,.dey13 |
570 | mov edx,.dey13 |
571 | add .cey1,edx |
571 | add .cey1,edx |
572 | mov eax,.dey12 |
572 | mov eax,.dey12 |
573 | add .cey2,eax |
573 | add .cey2,eax |
574 | 574 | ||
575 | mov eax,.dx13 |
575 | mov eax,.dx13 |
576 | add .cx1,eax |
576 | add .cx1,eax |
577 | mov ebx,.dx12 |
577 | mov ebx,.dx12 |
578 | add .cx2,ebx |
578 | add .cx2,ebx |
579 | 579 | ||
580 | mov ebx,.dz13 |
580 | mov ebx,.dz13 |
581 | add .cz1,ebx |
581 | add .cz1,ebx |
582 | mov edx,.dz12 |
582 | mov edx,.dz12 |
583 | add .cz2,edx |
583 | add .cz2,edx |
584 | end if |
584 | end if |
585 | inc ecx |
585 | inc ecx |
586 | cmp cx,.y2 |
586 | cmp cx,.y2 |
587 | jl .loop12 |
587 | jl .loop12 |
588 | .loop12_done: |
588 | .loop12_done: |
589 | 589 | ||
590 | movsx ecx,.y2 |
590 | movsx ecx,.y2 |
591 | cmp cx,.y3 |
591 | cmp cx,.y3 |
592 | jge .loop23_done |
592 | jge .loop23_done |
593 | 593 | ||
594 | movsx eax,.z2 |
594 | movsx eax,.z2 |
595 | shl eax,CATMULL_SHIFT |
595 | shl eax,CATMULL_SHIFT |
596 | mov .cz2,eax |
596 | mov .cz2,eax |
597 | 597 | ||
598 | movsx eax,.x2 |
598 | movsx eax,.x2 |
599 | shl eax,ROUND |
599 | shl eax,ROUND |
600 | mov .cx2,eax |
600 | mov .cx2,eax |
601 | 601 | ||
602 | movzx eax,word[.b_x2] |
602 | movzx eax,word[.b_x2] |
603 | shl eax,ROUND |
603 | shl eax,ROUND |
604 | mov .cbx2,eax |
604 | mov .cbx2,eax |
605 | 605 | ||
606 | movzx eax,word[.b_y2] |
606 | movzx eax,word[.b_y2] |
607 | shl eax,ROUND |
607 | shl eax,ROUND |
608 | mov .cby2,eax |
608 | mov .cby2,eax |
609 | 609 | ||
610 | movzx eax,word[.e_x2] |
610 | movzx eax,word[.e_x2] |
611 | shl eax,ROUND |
611 | shl eax,ROUND |
612 | mov .cex2,eax |
612 | mov .cex2,eax |
613 | 613 | ||
614 | movzx eax,word[.e_y2] |
614 | movzx eax,word[.e_y2] |
615 | shl eax,ROUND |
615 | shl eax,ROUND |
616 | mov .cey2,eax |
616 | mov .cey2,eax |
617 | 617 | ||
618 | .loop23: |
618 | .loop23: |
619 | call .call_bump_line |
619 | call .call_bump_line |
620 | 620 | ||
621 | if Ext >= MMX |
621 | if Ext >= MMX |
622 | movq mm0,.cby2 |
622 | movq mm0,.cby2 |
623 | movq mm1,.cby1 |
623 | movq mm1,.cby1 |
624 | movq mm2,.cey2 |
624 | movq mm2,.cey2 |
625 | movq mm3,.cey1 |
625 | movq mm3,.cey1 |
626 | movq mm4,.cz1 |
626 | movq mm4,.cz1 |
627 | movq mm5,.cz2 |
627 | movq mm5,.cz2 |
628 | paddd mm0,.dby23 |
628 | paddd mm0,.dby23 |
629 | paddd mm1,.dby13 |
629 | paddd mm1,.dby13 |
630 | paddd mm2,.dey23 |
630 | paddd mm2,.dey23 |
631 | paddd mm3,.dey13 |
631 | paddd mm3,.dey13 |
632 | paddd mm4,.dz13 |
632 | paddd mm4,.dz13 |
633 | paddd mm5,.dz23 |
633 | paddd mm5,.dz23 |
634 | movq .cby2,mm0 |
634 | movq .cby2,mm0 |
635 | movq .cby1,mm1 |
635 | movq .cby1,mm1 |
636 | movq .cey1,mm3 |
636 | movq .cey1,mm3 |
637 | movq .cey2,mm2 |
637 | movq .cey2,mm2 |
638 | movq .cz1,mm4 |
638 | movq .cz1,mm4 |
639 | movq .cz2,mm5 |
639 | movq .cz2,mm5 |
640 | else |
640 | else |
641 | mov eax,.dx13 |
641 | mov eax,.dx13 |
642 | add .cx1,eax |
642 | add .cx1,eax |
643 | mov ebx,.dx23 |
643 | mov ebx,.dx23 |
644 | add .cx2,ebx |
644 | add .cx2,ebx |
645 | 645 | ||
646 | mov edx,.dbx13 |
646 | mov edx,.dbx13 |
647 | add .cbx1,edx |
647 | add .cbx1,edx |
648 | mov eax,.dbx23 |
648 | mov eax,.dbx23 |
649 | add .cbx2,eax |
649 | add .cbx2,eax |
650 | mov ebx,.dby13 |
650 | mov ebx,.dby13 |
651 | add .cby1,ebx |
651 | add .cby1,ebx |
652 | mov edx,.dby23 |
652 | mov edx,.dby23 |
653 | add .cby2,edx |
653 | add .cby2,edx |
654 | 654 | ||
655 | mov eax,.dex13 |
655 | mov eax,.dex13 |
656 | add .cex1,eax |
656 | add .cex1,eax |
657 | mov ebx,.dex23 |
657 | mov ebx,.dex23 |
658 | add .cex2,ebx |
658 | add .cex2,ebx |
659 | mov edx,.dey13 |
659 | mov edx,.dey13 |
660 | add .cey1,edx |
660 | add .cey1,edx |
661 | mov eax,.dey23 |
661 | mov eax,.dey23 |
662 | add .cey2,eax |
662 | add .cey2,eax |
663 | 663 | ||
664 | mov ebx,.dz13 |
664 | mov ebx,.dz13 |
665 | add .cz1,ebx |
665 | add .cz1,ebx |
666 | mov edx,.dz23 |
666 | mov edx,.dz23 |
667 | add .cz2,edx |
667 | add .cz2,edx |
668 | end if |
668 | end if |
669 | inc ecx |
669 | inc ecx |
670 | cmp cx,.y3 |
670 | cmp cx,.y3 |
671 | jl .loop23 |
671 | jl .loop23 |
672 | .loop23_done: |
672 | .loop23_done: |
673 | 673 | ||
674 | mov esp,ebp |
674 | mov esp,ebp |
675 | ret 34 |
675 | ret 34 |
676 | 676 | ||
677 | .call_bump_line: |
677 | .call_bump_line: |
678 | 678 | ||
679 | ; push ebp |
679 | ; push ebp |
680 | ; push ecx |
680 | ; push ecx |
681 | pushad |
681 | pushad |
682 | 682 | ||
683 | push dword .cz1 |
683 | push dword .cz1 |
684 | push dword .cz2 |
684 | push dword .cz2 |
685 | push .z_buff |
685 | push .z_buff |
686 | push .t_emap |
686 | push .t_emap |
687 | push .t_bmap |
687 | push .t_bmap |
688 | push dword .cey2 |
688 | push dword .cey2 |
689 | push .cex2 |
689 | push .cex2 |
690 | push dword .cey1 |
- | |
691 | push .cex1 |
- | |
692 | push dword .cby2 |
690 | push dword .cby2 |
693 | push .cbx2 |
691 | push .cbx2 |
- | 692 | push dword .cey1 |
|
- | 693 | push .cex1 |
|
694 | push dword .cby1 |
694 | push dword .cby1 |
695 | push .cbx1 |
695 | push .cbx1 |
696 | push ecx |
696 | push ecx |
697 | 697 | ||
698 | mov eax,.cx1 |
698 | mov eax,.cx1 |
699 | sar eax,ROUND |
699 | sar eax,ROUND |
700 | mov ebx,.cx2 |
700 | mov ebx,.cx2 |
701 | sar ebx,ROUND |
701 | sar ebx,ROUND |
702 | 702 | ||
703 | call bump_line_z |
703 | call bump_line_z |
704 | 704 | ||
705 | popad |
705 | popad |
706 | ret |
706 | ret |
707 | bump_line_z: |
707 | bump_line_z: |
708 | ;--------------in: eax - x1 |
708 | ;--------------in: eax - x1 |
709 | ;-------------- ebx - x2 |
709 | ;-------------- ebx - x2 |
710 | ;-------------- edi - pointer to screen buffer |
710 | ;-------------- edi - pointer to screen buffer |
711 | ;stack - another parameters : |
711 | ;stack - another parameters : |
712 | .y equ dword [ebp+4] |
712 | .y equ dword [ebp+4] |
713 | .bx1 equ [ebp+8] ; --- |
713 | .bx1 equ [ebp+8] ; --- |
714 | .by1 equ dword [ebp+12] ; | |
714 | .by1 equ dword [ebp+12] ; | |
715 | .bx2 equ [ebp+16] ; | |
715 | .ex1 equ [ebp+16] ; | |
716 | .by2 equ dword [ebp+20] ; |> bump and env coords |
716 | .ey1 equ dword [ebp+20] ; |> bump and env coords |
717 | .ex1 equ [ebp+24] ; |> shifted shl ROUND |
717 | .bx2 equ [ebp+24] ; |> shifted shl ROUND |
718 | .ey1 equ dword [ebp+28] ; | |
718 | .by2 equ dword [ebp+28] ; | |
719 | .ex2 equ [ebp+32] ; | |
719 | .ex2 equ [ebp+32] ; | |
720 | .ey2 equ dword [ebp+36] ; --- |
720 | .ey2 equ dword [ebp+36] ; --- |
721 | .bmap equ dword [ebp+40] |
721 | .bmap equ dword [ebp+40] |
722 | .emap equ dword [ebp+44] |
722 | .emap equ dword [ebp+44] |
723 | .z_buff equ dword [ebp+48] |
723 | .z_buff equ dword [ebp+48] |
724 | .z2 equ dword [ebp+52] ; -- |> z coords shifted |
724 | .z2 equ dword [ebp+52] ; -- |> z coords shifted |
725 | .z1 equ dword [ebp+56] ; -- shl CATMULL_SHIFT |
725 | .z1 equ dword [ebp+56] ; -- shl CATMULL_SHIFT |
726 | 726 | ||
727 | .x1 equ dword [ebp-4] |
727 | .x1 equ dword [ebp-4] |
728 | .x2 equ dword [ebp-8] |
728 | .x2 equ dword [ebp-8] |
729 | .dbx equ dword [ebp-12] |
729 | .dbx equ dword [ebp-12] |
730 | .dby equ [ebp-16] |
730 | .dby equ [ebp-16] |
731 | .dex equ dword [ebp-20] |
731 | .dex equ dword [ebp-20] |
732 | .dey equ [ebp-24] |
732 | .dey equ [ebp-24] |
733 | .dz equ dword [ebp-28] |
733 | .dz equ dword [ebp-28] |
734 | .cbx equ dword [ebp-32] |
734 | .cbx equ dword [ebp-32] |
735 | .cby equ [ebp-36] |
735 | .cby equ [ebp-36] |
736 | .cex equ dword [ebp-40] |
736 | .cex equ dword [ebp-40] |
737 | .cey equ [ebp-44] |
737 | .cey equ [ebp-44] |
738 | .cz equ dword [ebp-48] |
738 | .cz equ dword [ebp-48] |
739 | .czbuff equ dword [ebp-52] |
739 | .czbuff equ dword [ebp-52] |
740 | .temp1 equ ebp-60 |
740 | .temp1 equ ebp-60 |
741 | .temp2 equ ebp-68 |
741 | .temp2 equ ebp-68 |
742 | .temp3 equ ebp-76 |
742 | .temp3 equ ebp-76 |
743 | .temp4 equ ebp-84 |
743 | .temp4 equ ebp-84 |
744 | .temp5 equ ebp-92 |
744 | .temp5 equ ebp-92 |
745 | 745 | ||
746 | mov ebp,esp |
746 | mov ebp,esp |
747 | 747 | ||
748 | mov ecx,.y |
748 | mov ecx,.y |
749 | or ecx,ecx |
749 | or ecx,ecx |
750 | jl .bl_end |
750 | jl .bl_end |
751 | cmp ecx,SIZE_Y |
751 | cmp ecx,SIZE_Y |
752 | jge .bl_end |
752 | jge .bl_end |
753 | 753 | ||
754 | cmp eax,ebx |
754 | cmp eax,ebx |
755 | jl .bl_ok |
755 | jl .bl_ok |
756 | je .bl_end |
756 | je .bl_end |
757 | 757 | ||
758 | xchg eax,ebx |
758 | xchg eax,ebx |
759 | if Ext=NON |
759 | if Ext=NON |
760 | mov edx,.bx1 |
760 | mov edx,.bx1 |
761 | xchg edx,.bx2 |
761 | xchg edx,.bx2 |
762 | mov .bx1,edx |
762 | mov .bx1,edx |
763 | mov edx,.by1 |
763 | mov edx,.by1 |
764 | xchg edx,.by2 |
764 | xchg edx,.by2 |
765 | mov .by1,edx |
765 | mov .by1,edx |
766 | 766 | ||
767 | mov edx,.ex1 |
767 | mov edx,.ex1 |
768 | xchg edx,.ex2 |
768 | xchg edx,.ex2 |
769 | mov .ex1,edx |
769 | mov .ex1,edx |
770 | mov edx,.ey1 |
770 | mov edx,.ey1 |
771 | xchg edx,.ey2 |
771 | xchg edx,.ey2 |
772 | mov .ey1,edx |
772 | mov .ey1,edx |
773 | else |
773 | end if |
774 | 774 | if Ext = MMX |
|
775 | movq mm0,.bx1 |
775 | movq mm0,.bx1 |
776 | movq mm1,.ex1 |
776 | movq mm1,.ex1 |
777 | movq mm2,.bx2 |
777 | movq mm2,.bx2 |
778 | movq mm3,.ex2 |
778 | movq mm3,.ex2 |
779 | movq .bx2,mm0 |
779 | movq .bx2,mm0 |
780 | movq .ex2,mm1 |
780 | movq .ex2,mm1 |
781 | movq .bx1,mm2 |
781 | movq .bx1,mm2 |
782 | movq .ex1,mm3 |
782 | movq .ex1,mm3 |
783 | 783 | end if |
|
- | 784 | if Ext >= SSE |
|
- | 785 | movups xmm0,.bx1 |
|
- | 786 | movups xmm1,.bx2 |
|
- | 787 | movups .bx2,xmm0 |
|
- | 788 | movups .bx1,xmm1 |
|
784 | end if |
789 | end if |
785 | 790 | ||
786 | mov edx,.z1 |
791 | mov edx,.z1 |
787 | xchg edx,.z2 |
792 | xchg edx,.z2 |
788 | mov .z1,edx |
793 | mov .z1,edx |
789 | 794 | ||
790 | .bl_ok: |
795 | .bl_ok: |
791 | 796 | ||
792 | push eax |
797 | push eax |
793 | push ebx ;store x1, x2 |
798 | push ebx ;store x1, x2 |
794 | 799 | ||
795 | cmp .x1,SIZE_X |
800 | cmp .x1,SIZE_X |
796 | jge .bl_end |
801 | jge .bl_end |
797 | cmp .x2,0 |
802 | cmp .x2,0 |
798 | jle .bl_end |
803 | jle .bl_end |
799 | 804 | ||
800 | mov ebx,.x2 |
805 | mov ebx,.x2 |
801 | sub ebx,.x1 |
806 | sub ebx,.x1 |
802 | 807 | ||
803 | if Ext >= SSE |
808 | if Ext >= SSE |
804 | 809 | ||
805 | sub esp,16 |
810 | sub esp,16 |
806 | cvtsi2ss xmm3,ebx ;rcps |
811 | cvtsi2ss xmm3,ebx ;rcps |
807 | shufps xmm3,xmm3,0 |
812 | shufps xmm3,xmm3,0 |
808 | 813 | ||
809 | cvtpi2ps xmm0,.bx1 ;mm0 |
814 | cvtpi2ps xmm0,.bx1 ;mm0 |
810 | movlhps xmm0,xmm0 |
815 | movlhps xmm0,xmm0 |
811 | cvtpi2ps xmm0,.ex1 ;mm2 |
816 | cvtpi2ps xmm0,.ex1 ;mm2 |
812 | cvtpi2ps xmm1,.bx2 ;mm1 |
817 | cvtpi2ps xmm1,.bx2 ;mm1 |
813 | movlhps xmm1,xmm1 |
818 | movlhps xmm1,xmm1 |
814 | cvtpi2ps xmm1,.ex2 ;mm3 |
819 | cvtpi2ps xmm1,.ex2 ;mm3 |
815 | subps xmm1,xmm0 |
820 | subps xmm1,xmm0 |
816 | 821 | ||
817 | divps xmm1,xmm3 |
822 | divps xmm1,xmm3 |
818 | 823 | ||
819 | shufps xmm1,xmm1,10110001b |
824 | shufps xmm1,xmm1,10110001b |
820 | cvtps2pi mm0,xmm1 ; mm0 -> 2 delta dwords |
825 | cvtps2pi mm0,xmm1 ; mm0 -> 2 delta dwords |
821 | movhlps xmm1,xmm1 |
826 | movhlps xmm1,xmm1 |
822 | cvtps2pi mm1,xmm1 |
827 | cvtps2pi mm1,xmm1 |
823 | movq .dey,mm0 |
828 | movq .dey,mm0 |
824 | movq .dby,mm1 |
829 | movq .dby,mm1 |
825 | 830 | ||
826 | else |
831 | else |
827 | 832 | ||
828 | mov eax,.bx2 ; calc .dbx |
833 | mov eax,.bx2 ; calc .dbx |
829 | sub eax,.bx1 |
834 | sub eax,.bx1 |
830 | cdq |
835 | cdq |
831 | idiv ebx |
836 | idiv ebx |
832 | push eax |
837 | push eax |
833 | 838 | ||
834 | mov eax,.by2 ; calc .dby |
839 | mov eax,.by2 ; calc .dby |
835 | sub eax,.by1 |
840 | sub eax,.by1 |
836 | cdq |
841 | cdq |
837 | idiv ebx |
842 | idiv ebx |
838 | push eax |
843 | push eax |
839 | 844 | ||
840 | mov eax,.ex2 ; calc .dex |
845 | mov eax,.ex2 ; calc .dex |
841 | sub eax,.ex1 |
846 | sub eax,.ex1 |
842 | cdq |
847 | cdq |
843 | idiv ebx |
848 | idiv ebx |
844 | push eax |
849 | push eax |
845 | 850 | ||
846 | mov eax,.ey2 ; calc .dey |
851 | mov eax,.ey2 ; calc .dey |
847 | sub eax,.ey1 |
852 | sub eax,.ey1 |
848 | cdq |
853 | cdq |
849 | idiv ebx |
854 | idiv ebx |
850 | push eax |
855 | push eax |
851 | 856 | ||
852 | end if |
857 | end if |
853 | 858 | ||
854 | mov eax,.z2 ; calc .dz |
859 | mov eax,.z2 ; calc .dz |
855 | sub eax,.z1 |
860 | sub eax,.z1 |
856 | cdq |
861 | cdq |
857 | idiv ebx |
862 | idiv ebx |
858 | push eax |
863 | push eax |
859 | 864 | ||
860 | cmp .x1,0 ; set correctly begin variable |
865 | cmp .x1,0 ; set correctly begin variable |
861 | jge @f ; CLIPPING ON FUNCTION |
866 | jge @f ; CLIPPING ON FUNCTION |
862 | ; cutting triangle exceedes screen |
867 | ; cutting triangle exceedes screen |
863 | mov ebx,.x1 |
868 | mov ebx,.x1 |
864 | neg ebx |
869 | neg ebx |
865 | imul ebx ; eax = .dz * abs(.x1) |
870 | imul ebx ; eax = .dz * abs(.x1) |
866 | add .z1,eax |
871 | add .z1,eax |
867 | mov .x1,0 |
872 | mov .x1,0 |
868 | 873 | ||
869 | mov eax,.dbx |
874 | mov eax,.dbx |
870 | imul ebx |
875 | imul ebx |
871 | add .bx1,eax |
876 | add .bx1,eax |
872 | 877 | ||
873 | mov eax,.dby |
878 | mov eax,.dby |
874 | imul ebx |
879 | imul ebx |
875 | add .by1,eax |
880 | add .by1,eax |
876 | 881 | ||
877 | mov eax,.dex |
882 | mov eax,.dex |
878 | imul ebx |
883 | imul ebx |
879 | add .ex1,eax |
884 | add .ex1,eax |
880 | 885 | ||
881 | mov eax,.dey |
886 | mov eax,.dey |
882 | imul ebx |
887 | imul ebx |
883 | add .ey1,eax |
888 | add .ey1,eax |
884 | @@: |
889 | @@: |
885 | cmp .x2,SIZE_X |
890 | cmp .x2,SIZE_X |
886 | jl @f |
891 | jl @f |
887 | mov .x2,SIZE_X |
892 | mov .x2,SIZE_X |
888 | @@: |
893 | @@: |
889 | mov eax,SIZE_X ;calc memory begin in buffers |
894 | mov eax,SIZE_X ;calc memory begin in buffers |
890 | mov ebx,.y |
895 | mov ebx,.y |
891 | mul ebx |
896 | mul ebx |
892 | mov ebx,.x1 |
897 | mov ebx,.x1 |
893 | add eax,ebx |
898 | add eax,ebx |
894 | mov ebx,eax |
899 | mov ebx,eax |
895 | lea eax,[eax*3] |
900 | lea eax,[eax*3] |
896 | add edi,eax |
901 | add edi,eax |
897 | mov esi,.z_buff ; z-buffer filled with dd variables |
902 | mov esi,.z_buff ; z-buffer filled with dd variables |
898 | shl ebx,2 |
903 | shl ebx,2 |
899 | add esi,ebx |
904 | add esi,ebx |
900 | 905 | ||
901 | mov ecx,.x2 |
906 | mov ecx,.x2 |
902 | sub ecx,.x1 |
907 | sub ecx,.x1 |
903 | ; init current variables |
908 | ; init current variables |
904 | push dword .bx1 |
909 | push dword .bx1 |
905 | push .by1 |
910 | push .by1 |
906 | push dword .ex1 |
911 | push dword .ex1 |
907 | push .ey1 |
912 | push .ey1 |
908 | 913 | ||
909 | push .z1 ; current z shl CATMULL_SHIFT |
914 | push .z1 ; current z shl CATMULL_SHIFT |
910 | push esi |
915 | push esi |
911 | ; It's my first attempt at MMX :), have mercy - Macgub |
916 | ; It's my first attempt at MMX :), have mercy - Macgub |
912 | 917 | ||
913 | ;; if Ext = MMX |
918 | ;; if Ext = MMX |
914 | ; mov dword[.temp1],esi |
919 | ; mov dword[.temp1],esi |
915 | ; mov dword[.temp1+4],esi |
920 | ; mov dword[.temp1+4],esi |
916 | ;; movq mm0,.cbyq ; mm0 - current bump coords |
921 | ;; movq mm0,.cbyq ; mm0 - current bump coords |
917 | ;; movq mm1,.ceyq ; mm1 - current env coords |
922 | ;; movq mm1,.ceyq ; mm1 - current env coords |
918 | ;; movq mm2,.dbyq ; mm2 - delta bump |
923 | ;; movq mm2,.dbyq ; mm2 - delta bump |
919 | ;; movq mm3,.deyq ; mm3 - delta env |
924 | ;; movq mm3,.deyq ; mm3 - delta env |
920 | ; movd mm6,.z1 ; mm6 - cur z |
925 | ; movd mm6,.z1 ; mm6 - cur z |
921 | ; movq mm7,qword.[temp1] ; mm7 = lo = hi dword = current z buff |
926 | ; movq mm7,qword.[temp1] ; mm7 = lo = hi dword = current z buff |
922 | ;; mov dword [.temp2],1 |
927 | ;; mov dword [.temp2],1 |
923 | ;; mov dword [.temp2+4],-1 |
928 | ;; mov dword [.temp2+4],-1 |
924 | ;; mov dword [.temp3],TEXTURE_SIZE |
929 | ;; mov dword [.temp3],TEXTURE_SIZE |
925 | ;; mov dword [.temp3+4],TEXTURE_SIZE |
930 | ;; mov dword [.temp3+4],TEXTURE_SIZE |
926 | ;; mov esi,.bmap |
931 | ;; mov esi,.bmap |
927 | ;; mov dword [.temp4],esi |
932 | ;; mov dword [.temp4],esi |
928 | ;; mov dword [.temp4+4],esi |
933 | ;; mov dword [.temp4+4],esi |
929 | ;; mov dword [.temp5],TEX_X |
934 | ;; mov dword [.temp5],TEX_X |
930 | ;; mov dword [.temp5+4],- TEX_X |
935 | ;; mov dword [.temp5+4],- TEX_X |
931 | ; mov dword [.temp1],TEX_SHIFT |
936 | ; mov dword [.temp1],TEX_SHIFT |
932 | ; mov dword [.temp1+4],0 |
937 | ; mov dword [.temp1+4],0 |
933 | ;; end if |
938 | ;; end if |
934 | 939 | ||
935 | .draw: |
940 | .draw: |
936 | ; if TEX = SHIFTING ;bump drawing only in shifting mode |
941 | ; if TEX = SHIFTING ;bump drawing only in shifting mode |
937 | mov esi,.czbuff ; .czbuff current address in buffer |
942 | mov esi,.czbuff ; .czbuff current address in buffer |
938 | mov ebx,.cz ; .cz - cur z position |
943 | mov ebx,.cz ; .cz - cur z position |
939 | cmp ebx,dword[esi] |
944 | cmp ebx,dword[esi] |
940 | jge .skip |
945 | jge .skip |
941 | ;; if Ext=NON |
946 | ;; if Ext=NON |
942 | mov eax,.cby |
947 | mov eax,.cby |
943 | sar eax,ROUND |
948 | sar eax,ROUND |
944 | mov esi,.cbx |
949 | mov esi,.cbx |
945 | sar esi,ROUND |
950 | sar esi,ROUND |
946 | ;; else |
951 | ;; else |
947 | ;; movq mm4,mm0 ; mm4 - copies of cur bump coords |
952 | ;; movq mm4,mm0 ; mm4 - copies of cur bump coords |
948 | ;; psrad mm4,ROUND ; mm4 = lo dword = y b coord, hi dword = x b coord |
953 | ;; psrad mm4,ROUND ; mm4 = lo dword = y b coord, hi dword = x b coord |
949 | ;; movd eax,mm4 ; - |
954 | ;; movd eax,mm4 ; - |
950 | ;; psrlq mm4,32 ; - |
955 | ;; psrlq mm4,32 ; - |
951 | ;; movd esi,mm4 ; - |
956 | ;; movd esi,mm4 ; - |
952 | ;; |
957 | ;; |
953 | ;;; punpckldq mm5,mm4 ; |
958 | ;;; punpckldq mm5,mm4 ; |
954 | ;;; psllq mm5,TEX_SHIFT |
959 | ;;; psllq mm5,TEX_SHIFT |
955 | ;;; paddq mm4,mm5 ; mm4 - lo dword index to b. map |
960 | ;;; paddq mm4,mm5 ; mm4 - lo dword index to b. map |
956 | ;; |
961 | ;; |
957 | ;; ; packqd mm4,mm5 |
962 | ;; ; packqd mm4,mm5 |
958 | ; movq mm5,mm4 ; mm5 ~~ current bump map index? |
963 | ; movq mm5,mm4 ; mm5 ~~ current bump map index? |
959 | 964 | ||
960 | ;; end if |
965 | ;; end if |
961 | shl eax,TEX_SHIFT ;- |
966 | shl eax,TEX_SHIFT ;- |
962 | add esi,eax ;- ; esi - current bump map index |
967 | add esi,eax ;- ; esi - current bump map index |
963 | ;; if Ext = NON |
968 | ;; if Ext = NON |
964 | mov ebx,esi |
969 | mov ebx,esi |
965 | dec ebx |
970 | dec ebx |
966 | and ebx,TEXTURE_SIZE |
971 | and ebx,TEXTURE_SIZE |
967 | add ebx,.bmap |
972 | add ebx,.bmap |
968 | movzx eax,byte [ebx] |
973 | movzx eax,byte [ebx] |
969 | 974 | ||
970 | mov ebx,esi |
975 | mov ebx,esi |
971 | inc ebx |
976 | inc ebx |
972 | and ebx,TEXTURE_SIZE |
977 | and ebx,TEXTURE_SIZE |
973 | add ebx,.bmap |
978 | add ebx,.bmap |
974 | movzx ebx,byte [ebx] |
979 | movzx ebx,byte [ebx] |
975 | ;; else ;------------------------------------------- |
980 | ;; else ;------------------------------------------- |
976 | ;; mov dword [.temp1],esi ;- |
981 | ;; mov dword [.temp1],esi ;- |
977 | ;; mov dword [.temp1+4],esi ;- |
982 | ;; mov dword [.temp1+4],esi ;- |
978 | ;; movq mm5, qword[.temp1] ;- |
983 | ;; movq mm5, qword[.temp1] ;- |
979 | ;; paddd mm5, qword[.temp2] ; .temp2 == low dword = 1, high dword = -1 |
984 | ;; paddd mm5, qword[.temp2] ; .temp2 == low dword = 1, high dword = -1 |
980 | ;; pand mm5, qword[.temp3] ; .temp3 == low = high dword = TEX_SIZE |
985 | ;; pand mm5, qword[.temp3] ; .temp3 == low = high dword = TEX_SIZE |
981 | ;; paddd mm5, qword[.temp4] ; .temp4 == low = high dword = .bmap |
986 | ;; paddd mm5, qword[.temp4] ; .temp4 == low = high dword = .bmap |
982 | ;; movd ebx,mm5 |
987 | ;; movd ebx,mm5 |
983 | ;; psrlq mm5,32 |
988 | ;; psrlq mm5,32 |
984 | ;; movd eax,mm5 |
989 | ;; movd eax,mm5 |
985 | ;; movzx ebx,byte[ebx] |
990 | ;; movzx ebx,byte[ebx] |
986 | ;; movzx eax,byte[eax] |
991 | ;; movzx eax,byte[eax] |
987 | ;; end if |
992 | ;; end if |
988 | sub eax,ebx |
993 | sub eax,ebx |
989 | ;; if Ext=NON |
994 | ;; if Ext=NON |
990 | mov ebx,esi |
995 | mov ebx,esi |
991 | sub ebx,TEX_X |
996 | sub ebx,TEX_X |
992 | and ebx,TEXTURE_SIZE |
997 | and ebx,TEXTURE_SIZE |
993 | add ebx,.bmap |
998 | add ebx,.bmap |
994 | movzx edx,byte [ebx] |
999 | movzx edx,byte [ebx] |
995 | 1000 | ||
996 | mov ebx,esi |
1001 | mov ebx,esi |
997 | add ebx,TEX_X |
1002 | add ebx,TEX_X |
998 | and ebx,TEXTURE_SIZE |
1003 | and ebx,TEXTURE_SIZE |
999 | add ebx,.bmap |
1004 | add ebx,.bmap |
1000 | movzx ebx,byte [ebx] |
1005 | movzx ebx,byte [ebx] |
1001 | ;; else |
1006 | ;; else |
1002 | ;; movq mm5, qword[.temp1] ;- |
1007 | ;; movq mm5, qword[.temp1] ;- |
1003 | ;; paddd mm5, qword[.temp5] ; .temp5 == low dword = TEX_X, high dword = -TEX_X |
1008 | ;; paddd mm5, qword[.temp5] ; .temp5 == low dword = TEX_X, high dword = -TEX_X |
1004 | ;; pand mm5, qword[.temp3] ; .temp3 == low = high dword = TEX_SIZE |
1009 | ;; pand mm5, qword[.temp3] ; .temp3 == low = high dword = TEX_SIZE |
1005 | ;; paddd mm5, qword[.temp4] ; .temp4 == low = high dword = offset .bmap |
1010 | ;; paddd mm5, qword[.temp4] ; .temp4 == low = high dword = offset .bmap |
1006 | ;; movd ebx,mm5 |
1011 | ;; movd ebx,mm5 |
1007 | ;; psrlq mm5,32 |
1012 | ;; psrlq mm5,32 |
1008 | ;; movd edx,mm5 |
1013 | ;; movd edx,mm5 |
1009 | ;; movzx ebx,byte[ebx] |
1014 | ;; movzx ebx,byte[ebx] |
1010 | ;; movzx edx,byte[edx] |
1015 | ;; movzx edx,byte[edx] |
1011 | ;; end if |
1016 | ;; end if |
1012 | sub edx,ebx |
1017 | sub edx,ebx |
1013 | ; eax - horizontal sub |
1018 | ; eax - horizontal sub |
1014 | ; edx - vertical sub |
1019 | ; edx - vertical sub |
1015 | ;; if Ext=NON |
1020 | ;; if Ext=NON |
1016 | mov ebx,.cex ;.cex - current env map X |
1021 | mov ebx,.cex ;.cex - current env map X |
1017 | sar ebx,ROUND |
1022 | sar ebx,ROUND |
1018 | add eax,ebx ; eax - modified x coord |
1023 | add eax,ebx ; eax - modified x coord |
1019 | 1024 | ||
1020 | mov ebx,.cey ;.cey - current env map y |
1025 | mov ebx,.cey ;.cey - current env map y |
1021 | sar ebx,ROUND |
1026 | sar ebx,ROUND |
1022 | add edx,ebx ; edx - modified y coord |
1027 | add edx,ebx ; edx - modified y coord |
1023 | ;; else |
1028 | ;; else |
1024 | ;; movq mm5,mm1 ; mm5 - copy of cur env coords |
1029 | ;; movq mm5,mm1 ; mm5 - copy of cur env coords |
1025 | ;; psrad mm5,ROUND |
1030 | ;; psrad mm5,ROUND |
1026 | ;; movq qword[.temp1],mm5 |
1031 | ;; movq qword[.temp1],mm5 |
1027 | ;; add eax,dword [.temp1] |
1032 | ;; add eax,dword [.temp1] |
1028 | ;; add edx,dword [.temp1+4] |
1033 | ;; add edx,dword [.temp1+4] |
1029 | ;; ; movd ebx,mm5 |
1034 | ;; ; movd ebx,mm5 |
1030 | ;; ; add eax,ebx |
1035 | ;; ; add eax,ebx |
1031 | ;; ; psrlq mm5,32 |
1036 | ;; ; psrlq mm5,32 |
1032 | ;; ; movd ebx,mm5 |
1037 | ;; ; movd ebx,mm5 |
1033 | ; add edx,ebx |
1038 | ; add edx,ebx |
1034 | ;; end if |
1039 | ;; end if |
1035 | 1040 | ||
1036 | or eax,eax |
1041 | or eax,eax |
1037 | jl .black |
1042 | jl .black |
1038 | cmp eax,TEX_X |
1043 | cmp eax,TEX_X |
1039 | jg .black |
1044 | jg .black |
1040 | or edx,edx |
1045 | or edx,edx |
1041 | jl .black |
1046 | jl .black |
1042 | cmp edx,TEX_Y |
1047 | cmp edx,TEX_Y |
1043 | jg .black |
1048 | jg .black |
1044 | 1049 | ||
1045 | shl edx,TEX_SHIFT |
1050 | shl edx,TEX_SHIFT |
1046 | add edx,eax |
1051 | add edx,eax |
1047 | lea edx,[edx*3] |
1052 | lea edx,[edx*3] |
1048 | add edx,.emap |
1053 | add edx,.emap |
1049 | mov eax,dword[edx] |
1054 | mov eax,dword[edx] |
1050 | jmp .put_pixel |
1055 | jmp .put_pixel |
1051 | .black: |
1056 | .black: |
1052 | xor eax,eax |
1057 | xor eax,eax |
1053 | .put_pixel: |
1058 | .put_pixel: |
1054 | stosd |
1059 | stosd |
1055 | dec edi |
1060 | dec edi |
1056 | mov ebx,.cz |
1061 | mov ebx,.cz |
1057 | mov esi,.czbuff |
1062 | mov esi,.czbuff |
1058 | mov dword[esi],ebx |
1063 | mov dword[esi],ebx |
1059 | jmp .no_skip |
1064 | jmp .no_skip |
1060 | .skip: |
1065 | .skip: |
1061 | add edi,3 |
1066 | add edi,3 |
1062 | .no_skip: |
1067 | .no_skip: |
1063 | add .czbuff,4 |
1068 | add .czbuff,4 |
1064 | ;; if Ext = NON |
1069 | ;; if Ext = NON |
1065 | if Ext >= MMX |
1070 | if Ext >= MMX |
1066 | movq mm0,.cby |
1071 | movq mm0,.cby |
1067 | movq mm1,.cey |
1072 | movq mm1,.cey |
1068 | paddd mm0,.dby |
1073 | paddd mm0,.dby |
1069 | paddd mm1,.dey |
1074 | paddd mm1,.dey |
1070 | movq .cby,mm0 |
1075 | movq .cby,mm0 |
1071 | movq .cey,mm1 |
1076 | movq .cey,mm1 |
1072 | else |
1077 | else |
1073 | mov eax,.dbx |
1078 | mov eax,.dbx |
1074 | add .cbx,eax |
1079 | add .cbx,eax |
1075 | mov eax,.dby |
1080 | mov eax,.dby |
1076 | add .cby,eax |
1081 | add .cby,eax |
1077 | mov eax,.dex |
1082 | mov eax,.dex |
1078 | add .cex,eax |
1083 | add .cex,eax |
1079 | mov eax,.dey |
1084 | mov eax,.dey |
1080 | add .cey,eax |
1085 | add .cey,eax |
1081 | end if |
1086 | end if |
1082 | ;; else |
1087 | ;; else |
1083 | ;; paddd mm0,mm2 |
1088 | ;; paddd mm0,mm2 |
1084 | ;; paddd mm1,mm3 |
1089 | ;; paddd mm1,mm3 |
1085 | ;; end if |
1090 | ;; end if |
1086 | mov eax,.dz |
1091 | mov eax,.dz |
1087 | add .cz,eax |
1092 | add .cz,eax |
1088 | 1093 | ||
1089 | dec ecx |
1094 | dec ecx |
1090 | jnz .draw |
1095 | jnz .draw |
1091 | ; end if |
1096 | ; end if |
1092 | .bl_end: |
1097 | .bl_end: |
1093 | mov esp,ebp |
1098 | mov esp,ebp |
1094 | ret 56 |
1099 | ret 56 |