Rev 5922 | Rev 6111 | Go to most recent revision | Show entire file | Regard whitespace | Details | Blame | Last modification | View Log | RSS feed
Rev 5922 | Rev 6108 | ||
---|---|---|---|
Line -... | Line 1... | ||
- | 1 | ; |
|
- | 2 | ; Макрос DRAW_LINE имеет параметр code, от которого зависит |
|
- | 3 | ; будет ли включен код или объявлены переменные. |
|
- | 4 | ; В версии на C++ параметра code нет, потому что там переменные |
|
- | 5 | ; можно ставить в любом месте функции, в asm версии такое не проходит. |
|
- | 6 | ; |
|
Line 1... | Line 7... | ||
1 | INTERP_Z equ 1 |
7 | |
Line 2... | Line 8... | ||
2 | 8 | INTERP_Z equ 1 |
|
3 | macro DRAW_INIT |
9 | |
Line 109... | Line 115... | ||
109 | add [ob1],eax |
115 | mov eax,[dbdx] |
110 | end if |
116 | add [ob1],eax |
111 | } |
117 | end if |
112 | 118 | } |
|
Line 113... | Line -... | ||
113 | ;;;DRAW_LINE_M equ 1 |
- | |
114 | - | ||
115 | macro DRAW_LINE code |
119 | |
116 | { |
120 | macro DRAW_LINE code |
117 | local .cycle_0 |
121 | { |
118 | local .cycle_1 |
122 | local .cycle_0 |
119 | if TGL_FEATURE_RENDER_BITS eq 16 |
123 | local .cycle_1 |
120 | if code eq 0 |
124 | if TGL_FEATURE_RENDER_BITS eq 16 |
121 | pz dd ? ;uint* |
- | |
122 | tmp dd ? ;uint |
125 | if code eq 0 |
123 | z dd ? ;uint |
- | |
124 | zz dd ? ;uint |
- | |
125 | rgb dd ? ;uint |
126 | tmp dd ? ;uint |
126 | drgbdx dd ? ;uint |
127 | rgb dd ? ;uint |
127 | n dd ? ;int |
- | |
128 | end if |
128 | drgbdx dd ? ;uint |
129 | if code eq 1 |
129 | end if |
130 | mov eax,[x2] |
130 | if code eq 1 |
131 | sar eax,16 |
131 | mov eax,[x2] |
132 | sub eax,[x1] |
132 | sar eax,16 |
133 | mov [n],eax ;n = (x2 >> 16) - x1 |
133 | sub eax,[x1] |
- | 134 | mov [n],eax ;n = (x2 >> 16) - x1 |
|
- | 135 | mov edi,[pp1] |
|
- | 136 | add edi,[x1] ;pp = pp1 + x1 |
|
134 | ; pp=pp1+x1; |
137 | mov eax,[pz1] |
- | 138 | add eax,[x1] |
|
- | 139 | mov [pz],eax ;pz = pz1 + x1 |
|
- | 140 | mov eax,[z1] |
|
135 | ; pz=pz1+x1; |
141 | mov [z],eax ;z = z1 |
136 | ; z=z1; |
142 | mov eax,[r1] |
- | 143 | shl eax,16 |
|
137 | ; rgb=(r1 << 16) & 0xFFC00000; |
144 | and eax,0xFFC00000 |
- | 145 | mov [rgb],eax ;rgb = (r1 << 16) & 0xFFC00000 |
|
- | 146 | mov eax,[g1] |
|
- | 147 | shr eax,5 |
|
138 | ; rgb|=(g1 >> 5) & 0x000007FF; |
148 | and eax,0x000007FF |
- | 149 | or [rgb],eax ;rgb |= (g1 >> 5) & 0x000007FF |
|
- | 150 | mov eax,[b1] |
|
- | 151 | shl eax,5 |
|
139 | ; rgb|=(b1 << 5) & 0x001FF000; |
152 | and eax,0x001FF000 |
140 | ; drgbdx=_drgbdx; |
153 | or [rgb],eax ;rgb |= (b1 << 5) & 0x001FF000 |
- | 154 | mov eax,[_drgbdx] |
|
141 | align 4 |
155 | mov [drgbdx],eax ;drgbdx = _drgbdx |
142 | .cycle_0: ;while (n>=3) |
156 | align 4 |
143 | cmp dword[n],3 |
157 | .cycle_0: ;while (n>=3) |
144 | jl .cycle_1 |
158 | cmp dword[n],3 |
145 | PUT_PIXEL 0 |
159 | jl .cycle_1 |
146 | PUT_PIXEL 1 |
160 | PUT_PIXEL 0 |
147 | PUT_PIXEL 2 |
161 | PUT_PIXEL 1 |
148 | PUT_PIXEL 3 |
162 | PUT_PIXEL 2 |
149 | add dword[pz],8 |
163 | PUT_PIXEL 3 |
150 | add edi,4 |
164 | add dword[pz],8 |
151 | sub [n],4 |
165 | add edi,4*3 |
152 | jmp .cycle_0 |
166 | sub [n],4 |
153 | .cycle_1: ;while (n>=0) |
167 | jmp .cycle_0 |
154 | cmp dword[n],0 |
168 | .cycle_1: ;while (n>=0) |
155 | jl .cycle_1_end |
169 | cmp dword[n],0 |
156 | PUT_PIXEL 0 |
170 | jl .cycle_1_end |
157 | add dword[pz],2 |
171 | PUT_PIXEL 0 |
158 | inc edi |
172 | add dword[pz],2 |
159 | dec dword[n] |
173 | add edi,3 |
160 | jmp .cycle_1 |
174 | dec dword[n] |
161 | .cycle_1_end: |
175 | jmp .cycle_1 |
162 | end if |
176 | .cycle_1_end: |
163 | end if |
177 | end if |
Line 200... | Line 214... | ||
200 | jl .end_0 |
214 | cmp ax,word[ebx+2*_a] ;if (zz >= pz[_a]) |
201 | ;edi = pp |
215 | jl .end_0 |
202 | mov word[ebx+2*_a],ax ;пишем в буфер глубины новое значение |
216 | ;edi = pp |
203 | if TGL_FEATURE_RENDER_BITS eq 24 |
217 | mov word[ebx+2*_a],ax ;пишем в буфер глубины новое значение |
204 | ; unsigned char *ptr; |
218 | if TGL_FEATURE_RENDER_BITS eq 24 |
- | 219 | mov ebx,[t] |
|
205 | ; ptr = texture + (((t & 0x3FC00000) | s) >> 14) * 3; |
220 | and ebx,0x3fc00000 |
- | 221 | or ebx,[s] |
|
- | 222 | shr ebx,14 |
|
- | 223 | imul ebx,3 |
|
206 | ; pp[3 * _a]= ptr[0]; |
224 | add ebx,[texture] ;ptr = texture + (((t & 0x3fc00000) | s) >> 14) * 3 |
- | 225 | mov ax,word[ebx] |
|
207 | ; pp[3 * _a + 1]= ptr[1]; |
226 | mov word[edi+3*_a],ax ;pp[3 * _a]= ptr[0,1] |
208 | ; pp[3 * _a + 2]= ptr[2]; |
227 | mov al,byte[ebx+2] |
209 | else |
228 | mov byte[edi+3*_a +2],al ;pp[3 * _a + 2]= ptr[2] |
210 | ; pp[_a]=texture[((t & 0x3FC00000) | s) >> 14]; |
229 | else |
211 | end if |
230 | ; pp[_a]=texture[((t & 0x3FC00000) | s) >> 14]; |
212 | .end_0: |
231 | end if |
213 | mov eax,[dzdx] |
232 | .end_0: |
214 | add [z],eax |
233 | mov eax,[dzdx] |
Line 240... | Line 259... | ||
240 | { |
259 | macro DRAW_INIT |
241 | mov eax,[zb] |
260 | { |
242 | mov eax,[eax+offs_zbuf_current_texture] |
261 | mov eax,[zb] |
243 | mov [texture],eax |
262 | mov eax,[eax+offs_zbuf_current_texture] |
244 | fild dword[dzdx] |
263 | mov [texture],eax |
- | 264 | mov dword[esp-4],NB_INTERP |
|
- | 265 | fild dword[esp-4] |
|
245 | fstp dword[fdzdx] |
266 | fild dword[dzdx] |
- | 267 | fst dword[fdzdx] ;fdzdx = (float)dzdx |
|
- | 268 | fmul st0,st1 |
|
- | 269 | fstp dword[fndzdx] ;fndzdx = NB_INTERP * fdzdx |
|
246 | ; fndzdx=NB_INTERP * fdzdx; |
270 | fld dword[fdzdx] |
- | 271 | fmul st0,st1 |
|
247 | ; ndszdx=NB_INTERP * dszdx; |
272 | fstp dword[ndszdx] ;ndszdx = NB_INTERP * dszdx |
248 | ; ndtzdx=NB_INTERP * dtzdx; |
273 | fmul dword[dtzdx] |
249 | } |
274 | fstp dword[ndtzdx] ;ndtzdx = NB_INTERP * dtzdx |
250 | 275 | } |
|
Line 251... | Line 276... | ||
251 | macro PUT_PIXEL _a |
276 | |
252 | { |
277 | macro PUT_PIXEL _a |
253 | local .end_0 |
278 | { |
Line 259... | Line 284... | ||
259 | jl .end_0 |
284 | cmp ax,word[ebx+2*_a] ;if (zz >= pz[_a]) |
260 | ;edi = pp |
285 | jl .end_0 |
261 | mov word[ebx+2*_a],ax ;пишем в буфер глубины новое значение |
286 | ;edi = pp |
262 | if TGL_FEATURE_RENDER_BITS eq 24 |
287 | mov word[ebx+2*_a],ax ;пишем в буфер глубины новое значение |
263 | ; unsigned char *ptr; |
288 | if TGL_FEATURE_RENDER_BITS eq 24 |
- | 289 | mov ebx,[t] |
|
- | 290 | and ebx,0x3fc00000 |
|
- | 291 | mov eax,[s] |
|
264 | ; ptr = texture + (((t & 0x3FC00000) | (s & 0x003FC000)) >> 14) * 3; |
292 | and eax,0x003fc000 |
- | 293 | or ebx,eax |
|
- | 294 | shr ebx,14 |
|
- | 295 | imul ebx,3 |
|
265 | ; pp[3 * _a]= ptr[0]; |
296 | add ebx,[texture] ;ptr = texture + (((t & 0x3fc00000) | (s & 0x003FC000)) >> 14) * 3 |
- | 297 | mov ax,word[ebx] |
|
266 | ; pp[3 * _a + 1]= ptr[1]; |
298 | mov word[edi+3*_a],ax ;pp[3 * _a]= ptr[0,1] |
267 | ; pp[3 * _a + 2]= ptr[2]; |
299 | mov al,byte[ebx+2] |
268 | else |
300 | mov byte[edi+3*_a +2],al ;pp[3 * _a + 2]= ptr[2] |
269 | ; pp[_a]=*(PIXEL *)((char *)texture+ |
301 | else |
270 | ; (((t & 0x3FC00000) | (s & 0x003FC000)) >> (17 - PSZSH))); |
302 | ; pp[_a]=*(PIXEL *)((char *)texture+ |
271 | end if |
303 | ; (((t & 0x3FC00000) | (s & 0x003FC000)) >> (17 - PSZSH))); |
272 | .end_0: |
304 | end if |
273 | mov eax,[dzdx] |
305 | .end_0: |
Line 283... | Line 315... | ||
283 | macro DRAW_LINE code |
315 | |
284 | { |
316 | macro DRAW_LINE code |
285 | if TGL_FEATURE_RENDER_BITS eq 24 |
317 | { |
286 | if code eq 0 |
318 | if TGL_FEATURE_RENDER_BITS eq 24 |
287 | pz dd ? ;uint * |
- | |
288 | s dd ? ;uint |
319 | if code eq 0 |
289 | t dd ? ;uint |
320 | s dd ? ;uint |
290 | z dd ? ;uint |
- | |
291 | zz dd ? ;uint |
- | |
292 | n1 dd ? ;int - длинна горизонтальной линии в пикселях |
321 | t dd ? ;uint |
293 | dsdx dd ? ;int |
322 | n1 dd ? ;int - длинна горизонтальной линии в пикселях |
294 | dtdx dd ? ;int |
323 | dsdx dd ? ;int |
295 | s_z dd ? ;float |
- | |
296 | t_z dd ? ;float |
- | |
297 | fz dd ? ;float |
324 | dtdx dd ? ;int |
298 | zinv dd ? ;float |
325 | fz dd ? ;float |
299 | end if |
326 | zinv dd ? ;float |
300 | if code eq 1 |
327 | end if |
- | 328 | if code eq 1 |
|
- | 329 | mov eax,[x2] |
|
- | 330 | sar eax,16 |
|
301 | ; n1=(x2>>16)-x1; |
331 | sub eax,[x1] |
- | 332 | mov [n1],eax ;n1 = (x2 >> 16) - x1 |
|
- | 333 | fld1 |
|
302 | ; fz=(float)z1; |
334 | fild dword[z1] |
- | 335 | fst dword[fz] ;fz = (float)z1 |
|
- | 336 | ;fld1 |
|
303 | ; zinv=1.0 / fz; |
337 | fdivp |
- | 338 | fstp dword[zinv] ;zinv = 1.0 / fz |
|
- | 339 | mov edi,[x1] |
|
304 | ; pp=(pp1 + x1 * PSZB); |
340 | imul edi,PSZB |
- | 341 | add edi,[pp1] ;pp = (pp1 + x1 * PSZB) |
|
305 | ; pz=pz1+x1; |
342 | mov eax,[pz1] |
- | 343 | add eax,[x1] |
|
306 | ; z=z1; |
344 | mov [pz],eax ;pz = pz1 + x1 |
- | 345 | mov eax,[z1] |
|
307 | ; sz=sz1; |
346 | mov [z],eax ;z = z1 |
- | 347 | mov eax,[sz1] |
|
308 | ; tz=tz1; |
348 | mov [s_z],eax ;sz = sz1 |
- | 349 | mov eax,[tz1] |
|
- | 350 | mov [t_z],eax ;tz = tz1 |
|
309 | ; while (n1>=(NB_INTERP-1)) { |
351 | align 4 |
- | 352 | .cycle_2: ;while (n1>=(NB_INTERP-1)) |
|
310 | ; { |
353 | cmp dword[n1],NB_INTERP-1 |
311 | ; float ss,tt; |
354 | jl .cycle_2_end |
- | 355 | fld dword[zinv] |
|
312 | ; ss=(sz * zinv); |
356 | fld st0 |
313 | ; tt=(tz * zinv); |
357 | fmul dword[s_z] ;ss = (sz * zinv) |
- | 358 | fist dword[s] ;s = (int) ss |
|
- | 359 | fmul dword[fdzdx] |
|
314 | ; s=(int) ss; |
360 | fchs |
315 | ; t=(int) tt; |
361 | fadd dword[dszdx] |
316 | ; dsdx= (int)( (dszdx - ss*fdzdx)*zinv ); |
362 | fmul dword[zinv] |
- | 363 | fistp dword[dsdx] ;dsdx = (int)( (dszdx - ss*fdzdx)*zinv ) |
|
- | 364 | fmul dword[t_z] ;tt = (tz * zinv) |
|
- | 365 | fist dword[t] ;t = (int) tt |
|
- | 366 | fmul dword[fdzdx] |
|
- | 367 | fchs |
|
- | 368 | fadd dword[dtzdx] |
|
317 | ; dtdx= (int)( (dtzdx - tt*fdzdx)*zinv ); |
369 | fmul dword[zinv] |
- | 370 | fistp dword[dtdx] ;dtdx = (int)( (dtzdx - tt*fdzdx)*zinv ) |
|
- | 371 | fld1 |
|
318 | ; fz+=fndzdx; |
372 | fld dword[fz] |
319 | ; zinv=1.0 / fz; |
373 | fadd dword[fndzdx] |
- | 374 | fst dword[fz] ;fz += fndzdx |
|
320 | ; } |
375 | ;fld1 |
- | 376 | fdivp |
|
321 | ; PUT_PIXEL(0); |
377 | fstp dword[zinv] ;zinv = 1.0 / fz |
322 | ; PUT_PIXEL(1); |
378 | PUT_PIXEL 0 |
323 | ; PUT_PIXEL(2); |
379 | PUT_PIXEL 1 |
324 | ; PUT_PIXEL(3); |
380 | PUT_PIXEL 2 |
325 | ; PUT_PIXEL(4); |
381 | PUT_PIXEL 3 |
326 | ; PUT_PIXEL(5); |
382 | PUT_PIXEL 4 |
327 | ; PUT_PIXEL(6); |
383 | PUT_PIXEL 5 |
328 | ; PUT_PIXEL(7); |
384 | PUT_PIXEL 6 |
329 | ; pz+=NB_INTERP; |
385 | PUT_PIXEL 7 |
330 | ; pp=(pp + NB_INTERP * PSZB); |
386 | add dword[pz],2*NB_INTERP ;pz += NB_INTERP |
331 | ; n1-=NB_INTERP; |
387 | add edi,NB_INTERP*PSZB ;pp += NB_INTERP * PSZB |
332 | ; sz+=ndszdx; |
388 | sub dword[n1],NB_INTERP ;n1 -= NB_INTERP |
- | 389 | fld dword[ndszdx] |
|
- | 390 | fadd dword[s_z] |
|
333 | ; tz+=ndtzdx; |
391 | fstp dword[s_z] ;s_z += ndszdx |
- | 392 | fld dword[ndtzdx] |
|
- | 393 | fadd dword[t_z] |
|
- | 394 | fstp dword[t_z] ;tz += ndtzdx |
|
- | 395 | jmp .cycle_2 |
|
- | 396 | .cycle_2_end: |
|
334 | ; } |
397 | fld dword[zinv] |
- | 398 | fld st0 |
|
- | 399 | fmul dword[s_z] ;ss = (sz * zinv) |
|
- | 400 | fist dword[s] ;s = (int) ss |
|
335 | ; { |
401 | fmul dword[fdzdx] |
336 | ; float ss,tt; |
402 | fchs |
337 | ; ss=(sz * zinv); |
403 | fadd dword[dszdx] |
- | 404 | fmul dword[zinv] |
|
338 | ; tt=(tz * zinv); |
405 | fistp dword[dsdx] ;dsdx = (int)( (dszdx - ss*fdzdx)*zinv ) |
339 | ; s=(int) ss; |
406 | fmul dword[t_z] ;tt = (tz * zinv) |
340 | ; t=(int) tt; |
407 | fist dword[t] ;t = (int) tt |
- | 408 | fmul dword[fdzdx] |
|
341 | ; dsdx= (int)( (dszdx - ss*fdzdx)*zinv ); |
409 | fchs |
- | 410 | fadd dword[dtzdx] |
|
342 | ; dtdx= (int)( (dtzdx - tt*fdzdx)*zinv ); |
411 | fmul dword[zinv] |
343 | ; } |
412 | fistp dword[dtdx] ;dtdx = (int)( (dtzdx - tt*fdzdx)*zinv ) |
344 | ; while (n1>=0) { |
413 | align 4 |
- | 414 | .cycle_3: ;while (n1>=0) |
|
- | 415 | cmp dword[n1],0 |
|
345 | ;;; PUT_PIXEL 0 |
416 | jl .cycle_3_end |
346 | ; pz+=1; |
417 | PUT_PIXEL 0 |
347 | ; pp=(PIXEL *)((char *)pp + PSZB); |
418 | add dword[pz],2 ;pz += 1 |
348 | dec dword[n1] |
419 | add edi,PSZB ;pp += PSZB |
349 | ; } |
420 | dec dword[n1] |
- | 421 | jmp .cycle_3 |
|
350 | end if |
422 | .cycle_3_end: |
351 | end if |
423 | end if |
352 | } |
424 | end if |
Line 353... | Line 425... | ||
353 | 425 | } |