Rev 6100 | Go to most recent revision | Show entire file | Regard whitespace | Details | Blame | Last modification | View Log | RSS feed
Rev 6100 | Rev 6101 | ||
---|---|---|---|
Line 6... | Line 6... | ||
6 | proc calc_buf uses ebx ecx, buf:dword, shininess:dword |
6 | proc calc_buf uses ebx ecx, buf:dword, shininess:dword |
7 | locals |
7 | locals |
8 | val dd ? ;float |
8 | val dd ? ;float |
9 | f_inc dd ? ;float |
9 | f_inc dd ? ;float |
10 | endl |
10 | endl |
11 | mov dword[val],0.0f |
- | |
12 | mov dword[f_inc],SPECULAR_BUFFER_SIZE |
11 | mov dword[f_inc],SPECULAR_BUFFER_SIZE |
13 | fld1 |
- | |
14 | fidiv dword[f_inc] |
- | |
15 | fstp dword[f_inc] ;f_inc = 1.0f/SPECULAR_BUFFER_SIZE |
- | |
16 | mov ebx,[buf] |
12 | mov ebx,[buf] |
17 | add ebx,offs_spec_buf |
13 | add ebx,offs_spec_buf |
- | 14 | mov dword[ebx],0.0 ;buf.buf[0] = 0.0 |
|
18 | xor ecx,ecx |
15 | xor ecx,ecx |
- | 16 | inc ecx |
|
- | 17 | fld dword[shininess] ;сначала берем y |
|
- | 18 | fld1 |
|
- | 19 | fidiv dword[f_inc] |
|
- | 20 | fst dword[f_inc] ;f_inc = 1.0f/SPECULAR_BUFFER_SIZE |
|
- | 21 | fst dword[val] |
|
19 | align 4 |
22 | align 4 |
20 | .cycle_0: ;for (i = 0; i <= SPECULAR_BUFFER_SIZE; i++) |
23 | .cycle_0: ;for (i = 1; i <= SPECULAR_BUFFER_SIZE; i++) |
21 | cmp ecx,SPECULAR_BUFFER_SIZE |
24 | cmp ecx,SPECULAR_BUFFER_SIZE |
22 | jg @f |
25 | jg @f |
23 | ;Вычисляем x^y |
26 | ;Вычисляем x^y |
24 | fld dword[val] ;сначала берем y |
- | |
25 | fld dword[shininess] ;а потом x |
- | |
- | 27 | ||
26 | fyl2x ;Стек FPU теперь содержит: st0=z=y*log2(x): |
28 | fyl2x ;Стек FPU теперь содержит: st0=z=y*log2(x): |
27 | ;Теперь считаем 2**z: |
29 | ;Теперь считаем 2**z: |
28 | fld st0 ;Создаем еще одну копию z |
30 | fld st0 ;Создаем еще одну копию z |
29 | frndint ;Округляем |
31 | frndint ;Округляем |
30 | fsubr st0,st1 ;st1=z, st0=z-trunc(z) |
32 | fsubr st0,st1 ;st1=z, st0=z-trunc(z) |
Line 33... | Line 35... | ||
33 | faddp ;st1=z, st0=2**(z-trunc(z)) |
35 | faddp ;st1=z, st0=2**(z-trunc(z)) |
34 | fscale ;st1=z, st0=(2**trunc(z))*(2**(z-trunc(z)))=2**t |
36 | fscale ;st1=z, st0=(2**trunc(z))*(2**(z-trunc(z)))=2**t |
35 | fxch st1 |
37 | fxch st1 |
36 | fstp st ;Результат остается на вершине стека st0 |
38 | fstp st ;Результат остается на вершине стека st0 |
Line 37... | Line -... | ||
37 | - | ||
38 | fstp dword[ebx] ;buf.buf[i] = pow(val, shininess) |
39 | |
- | 40 | add ebx,4 |
|
- | 41 | fstp dword[ebx] ;buf.buf[i] = pow(val, shininess) |
|
- | 42 | ffree st0 ;испорченный shininess |
|
Line -... | Line 43... | ||
- | 43 | fincstp |
|
39 | add ebx,4 |
44 | |
40 | 45 | fld dword[shininess] ;сначала берем y |
|
41 | fld dword[val] |
46 | fld dword[val] |
42 | fadd dword[f_inc] |
47 | fadd dword[f_inc] |
43 | fstp dword[val] ;val += f_inc |
48 | fst dword[val] ;val += f_inc |
44 | inc ecx |
49 | inc ecx |
- | 50 | jmp .cycle_0 |
|
- | 51 | @@: |
|
- | 52 | ffree st0 ;val |
|
- | 53 | fincstp |
|
45 | jmp .cycle_0 |
54 | ffree st0 ;shininess |
46 | @@: |
55 | fincstp |
Line 47... | Line 56... | ||
47 | ret |
56 | ret |
48 | endp |
57 | endp |