Rev 4721 | Only display areas with differences | Regard whitespace | Details | Blame | Last modification | View Log | RSS feed
Rev 4721 | Rev 4887 | ||
---|---|---|---|
1 | ;-----------------------------------------------------------------------------+ |
1 | ;-----------------------------------------------------------------------------+ |
2 | ; ãªæ¨ï ¯¥à¥¢®¤ ¢¥é¥á⢥®£® ç¨á« ¢ áâபã [ by ManHunter / PCL ] | |
2 | ; ãªæ¨ï ¯¥à¥¢®¤ ¢¥é¥á⢥®£® ç¨á« ¢ áâபã [ by ManHunter / PCL ] | |
3 | ;-----------------------------------------------------------------------------| |
3 | ;-----------------------------------------------------------------------------| |
4 | ; à ¬¥âàë: | |
4 | ; à ¬¥âàë: | |
5 | ; lpFloat - 㪠§ â¥«ì ¢¥é¥á⢥®¥ ç¨á«® TBYTE | |
5 | ; lpFloat - 㪠§ â¥«ì ¢¥é¥á⢥®¥ ç¨á«® TBYTE | |
6 | ; lpResult - 㪠§ ⥫ì áâபã-¯à¨¥¬¨ª १ã«ìâ â | |
6 | ; lpResult - 㪠§ ⥫ì áâபã-¯à¨¥¬¨ª १ã«ìâ â | |
7 | ;-----------------------------------------------------------------------------+ |
7 | ;-----------------------------------------------------------------------------+ |
8 | 8 | ||
9 | proc FloatToString lpFloat:DWORD, lpResult:DWORD |
9 | proc FloatToString lpFloat:DWORD, lpResult:DWORD |
10 | ; ®ª «ìë¥ ¯¥à¥¬¥ë¥ |
10 | ; ®ª «ìë¥ ¯¥à¥¬¥ë¥ |
11 | local digits_count:DWORD |
11 | local digits_count:DWORD |
12 | local old_cw:WORD |
12 | local old_cw:WORD |
13 | local new_cw:WORD |
13 | local new_cw:WORD |
14 | local saved_float:TBYTE |
14 | local saved_float:TBYTE |
15 | local tmp1 rb 11h |
15 | local tmp1 rb 11h |
16 | local tmp2 rb 11h |
16 | local tmp2 rb 11h |
17 | 17 | ||
18 | ; ®åà ¨âì ¢á¥ à¥£¨áâàë |
18 | ; ®åà ¨âì ¢á¥ à¥£¨áâàë |
19 | pusha |
19 | pusha |
20 | 20 | ||
21 | ; ª § ⥫ì áâபã-¯à¨¥¬¨ª |
21 | ; ª § ⥫ì áâபã-¯à¨¥¬¨ª |
22 | mov edi,[lpResult] |
22 | mov edi,[lpResult] |
23 | 23 | ||
24 | ; â® ®«ì? |
24 | ; â® ®«ì? |
25 | lea esi,[lpFloat] |
25 | mov esi,[lpFloat] |
26 | cmp dword [esi],0 |
26 | cmp dword [esi],0 |
27 | jne loc_not_zero |
27 | jne loc_not_zero |
28 | cmp dword [esi+4],0 |
28 | cmp dword [esi+4],0 |
29 | jne loc_not_zero |
29 | jne loc_not_zero |
30 | cmp word [esi+8],0 |
30 | cmp word [esi+8],0 |
31 | jne loc_not_zero |
31 | jne loc_not_zero |
32 | ; ¯¨á âì ¢ áâப㠮«ì |
32 | ; ¯¨á âì ¢ áâப㠮«ì |
33 | mov al,'0' |
33 | mov al,'0' |
34 | stosb |
34 | stosb |
35 | jmp loc_ret |
35 | jmp loc_ret |
36 | 36 | ||
37 | loc_not_zero: |
37 | loc_not_zero: |
38 | ; ª®¯¨à®¢ âì ç¨á«® ¢ «®ª «ìãî ¯¥à¥¬¥ãî |
38 | ; ª®¯¨à®¢ âì ç¨á«® ¢ «®ª «ìãî ¯¥à¥¬¥ãî |
39 | push edi |
39 | push edi |
40 | mov esi,[lpFloat] |
40 | mov esi,[lpFloat] |
41 | lea edi,[saved_float] |
41 | lea edi,[saved_float] |
42 | movsd |
42 | movsd |
43 | movsd |
43 | movsd |
44 | movsw |
44 | movsw |
45 | pop edi |
45 | pop edi |
46 | ; ¨á«® ®âà¨æ ⥫쮥? |
46 | ; ¨á«® ®âà¨æ ⥫쮥? |
47 | cmp dword [saved_float+6],0 |
47 | cmp dword [saved_float+6],0 |
48 | jge loc_not_signed |
48 | jge loc_not_signed |
49 | ; ਢ¥á⨠ç¨á«® ª ¡á®«î⮬㠧 票î |
49 | ; ਢ¥á⨠ç¨á«® ª ¡á®«î⮬㠧 票î |
50 | and byte [saved_float+9],7Fh |
50 | and byte [saved_float+9],7Fh |
51 | ; ¯¨á âì ¢ áâப㠬¨ãá |
51 | ; ¯¨á âì ¢ áâப㠬¨ãá |
52 | mov al,'-' |
52 | mov al,'-' |
53 | stosb |
53 | stosb |
54 | 54 | ||
55 | loc_not_signed: |
55 | loc_not_signed: |
56 | ; ஢¥à¨âì ç¨á«® «¨ç¨¥ ¤à®¡®© ç á⨠¨ |
56 | ; ஢¥à¨âì ç¨á«® «¨ç¨¥ ¤à®¡®© ç á⨠¨ |
57 | ; ¯®¤áç¨â âì ª®«¨ç¥á⢮ æ¨äà ¢ ¥¬ |
57 | ; ¯®¤áç¨â âì ª®«¨ç¥á⢮ æ¨äà ¢ ¥¬ |
58 | fclex |
58 | fclex |
59 | ; ®åà ¨âì ã¯à ¢«ïî饥 á«®¢® |
59 | ; ®åà ¨âì ã¯à ¢«ïî饥 á«®¢® |
60 | fstcw [old_cw] |
60 | fstcw [old_cw] |
61 | ; áâ ®¢¨âì ã¯à ¢«ïî饥 á«®¢® |
61 | ; áâ ®¢¨âì ã¯à ¢«ïî饥 á«®¢® |
62 | mov [new_cw],0000001001111111b |
62 | mov [new_cw],0000001001111111b |
63 | fldcw [new_cw] |
63 | fldcw [new_cw] |
64 | lea esi,[saved_float] |
64 | lea esi,[saved_float] |
65 | fld tbyte [esi] |
65 | fld tbyte [esi] |
66 | fld st |
66 | fld st |
67 | ; 뤥«¨âì ¬ â¨ááã ¨ ¯®à冷ª |
67 | ; 뤥«¨âì ¬ â¨ááã ¨ ¯®à冷ª |
68 | fxtract |
68 | fxtract |
69 | fstp st |
69 | fstp st |
70 | fldlg2 |
70 | fldlg2 |
71 | ; ®«ãç¨âì ª®«¨ç¥á⢮ æ¨äà ¢ ç¨á«¥ |
71 | ; ®«ãç¨âì ª®«¨ç¥á⢮ æ¨äà ¢ ç¨á«¥ |
72 | fmulp st1,st |
72 | fmulp st1,st |
73 | fistp [digits_count] |
73 | fistp [digits_count] |
74 | ; ᫨ æ¨äà ¡®«ìè¥ 16, â® ç¨á«® ®â®¡à ¦ ¥âáï ¢ |
74 | ; ᫨ æ¨äà ¡®«ìè¥ 16, â® ç¨á«® ®â®¡à ¦ ¥âáï ¢ |
75 | ; ®à¬ «¨§®¢ ®¬ ¢¨¤¥ á ¬ â¨áᮩ ¨ íªá¯®¥â®© |
75 | ; ®à¬ «¨§®¢ ®¬ ¢¨¤¥ á ¬ â¨áᮩ ¨ íªá¯®¥â®© |
76 | cmp [digits_count],10h |
76 | cmp [digits_count],10h |
77 | jnb loc_not_integer |
77 | jnb loc_not_integer |
78 | ; ç¨á« ¥áâì ¤à®¡ ï ç áâì? |
78 | ; ç¨á« ¥áâì ¤à®¡ ï ç áâì? |
79 | fld st |
79 | fld st |
80 | frndint |
80 | frndint |
81 | fcomp st1 |
81 | fcomp st1 |
82 | fstsw ax |
82 | fstsw ax |
83 | test ah,01000000b |
83 | test ah,01000000b |
84 | ; , ®â®¡à ¦ âì ç¨á«® á ¤à®¡®© ç áâìî |
84 | ; , ®â®¡à ¦ âì ç¨á«® á ¤à®¡®© ç áâìî |
85 | jz loc_not_integer |
85 | jz loc_not_integer |
86 | 86 | ||
87 | ; ¥«®¥ ç¨á«® ¡¥§ ¤à®¡®© ç á⨠¨ íªá¯®¥âë |
87 | ; ¥«®¥ ç¨á«® ¡¥§ ¤à®¡®© ç á⨠¨ íªá¯®¥âë |
88 | lea eax,[tmp1] |
88 | lea eax,[tmp1] |
89 | fbstp [eax] |
89 | fbstp [eax] |
90 | 90 | ||
91 | ; ¥à¥¢¥á⨠BCD-ç¨á«® ¢ áâபã |
91 | ; ¥à¥¢¥á⨠BCD-ç¨á«® ¢ áâபã |
92 | push edi |
92 | push edi |
93 | lea esi,[tmp1+8] |
93 | lea esi,[tmp1+8] |
94 | lea edi,[tmp2] |
94 | lea edi,[tmp2] |
95 | mov ecx, 9 |
95 | mov ecx, 9 |
96 | @@: |
96 | @@: |
97 | std |
97 | std |
98 | xor eax,eax |
98 | xor eax,eax |
99 | lodsb |
99 | lodsb |
100 | cld |
100 | cld |
101 | rol ax,12 |
101 | rol ax,12 |
102 | rol ah,4 |
102 | rol ah,4 |
103 | add ax,'00' |
103 | add ax,'00' |
104 | stosw |
104 | stosw |
105 | loop @b |
105 | loop @b |
106 | pop edi |
106 | pop edi |
107 | 107 | ||
108 | ; யãáâ¨âì «¨¤¨àãî騩 ®«ì |
108 | ; யãáâ¨âì «¨¤¨àãî騩 ®«ì |
109 | mov eax,11h |
109 | mov eax,11h |
110 | mov ecx,[digits_count] |
110 | mov ecx,[digits_count] |
111 | sub eax,ecx |
111 | sub eax,ecx |
112 | inc ecx |
112 | inc ecx |
113 | lea esi,[tmp2+eax] |
113 | lea esi,[tmp2+eax] |
114 | cmp byte [esi],'0' |
114 | cmp byte [esi],'0' |
115 | jne @f |
115 | jne @f |
116 | inc esi |
116 | inc esi |
117 | dec ecx |
117 | dec ecx |
118 | @@: |
118 | @@: |
119 | ; ¥à¥¥á⨠¯®«ã祮¥ ç¨á«® ¨§ ¢à¥¬¥®£® ¡ãä¥à |
119 | ; ¥à¥¥á⨠¯®«ã祮¥ ç¨á«® ¨§ ¢à¥¬¥®£® ¡ãä¥à |
120 | rep movsb |
120 | rep movsb |
121 | jmp loc_clear_stack |
121 | jmp loc_clear_stack |
122 | 122 | ||
123 | loc_not_integer: |
123 | loc_not_integer: |
124 | mov eax,10h |
124 | mov eax,10h |
125 | sub eax,[digits_count] |
125 | sub eax,[digits_count] |
126 | 126 | ||
127 | ; ८¡à §®¢ âì ç¨á«® ¢ 楫®¥ ¤® 16 à §à冷¢ |
127 | ; ८¡à §®¢ âì ç¨á«® ¢ 楫®¥ ¤® 16 à §à冷¢ |
128 | mov ecx,eax |
128 | mov ecx,eax |
129 | cmp eax,0 |
129 | cmp eax,0 |
130 | jge @f |
130 | jge @f |
131 | neg eax |
131 | neg eax |
132 | @@: |
132 | @@: |
133 | ; «ï ç¨á¥« ¡®«ìè¥ 0 ª®à४â¨à®¢ª ®ªà㣫¥¨ï ¢ áâ®à®ã 0 |
133 | ; «ï ç¨á¥« ¡®«ìè¥ 0 ª®à४â¨à®¢ª ®ªà㣫¥¨ï ¢ áâ®à®ã 0 |
134 | mov [new_cw],0000101001111111b |
134 | mov [new_cw],0000101001111111b |
135 | cmp ecx,0 |
135 | cmp ecx,0 |
136 | jge @f |
136 | jge @f |
137 | mov [new_cw],0000011001111111b |
137 | mov [new_cw],0000011001111111b |
138 | @@: |
138 | @@: |
139 | ; áâ ®¢¨âì ã¯à ¢«ïî饥 á«®¢® |
139 | ; áâ ®¢¨âì ã¯à ¢«ïî饥 á«®¢® |
140 | fldcw [new_cw] |
140 | fldcw [new_cw] |
141 | 141 | ||
142 | ; ®§¢¥á⨠10 ¢ á⥯¥ì ª®«¨ç¥á⢠æ¨äà |
142 | ; ®§¢¥á⨠10 ¢ á⥯¥ì ª®«¨ç¥á⢠æ¨äà |
143 | fld [float2] |
143 | fld [float2] |
144 | fld [float2] |
144 | fld [float2] |
145 | @@: |
145 | @@: |
146 | fmul st,st1 |
146 | fmul st,st1 |
147 | dec eax |
147 | dec eax |
148 | cmp eax,1 |
148 | cmp eax,1 |
149 | ja @b |
149 | ja @b |
150 | 150 | ||
151 | ; ®ç¨áâ¨âì á⥪ |
151 | ; ®ç¨áâ¨âì á⥪ |
152 | fxch st1 |
152 | fxch st1 |
153 | fstp st |
153 | fstp st |
154 | 154 | ||
155 | ; ᫨ ç¨á«® ¬¥ìè¥ 0, ⮠㬮¦¨âì, ¨ ç¥ à §¤¥«¨âì |
155 | ; ᫨ ç¨á«® ¬¥ìè¥ 0, ⮠㬮¦¨âì, ¨ ç¥ à §¤¥«¨âì |
156 | cmp ecx,0 |
156 | cmp ecx,0 |
157 | jge @f |
157 | jge @f |
158 | fdivp st1,st |
158 | fdivp st1,st |
159 | jmp loc_rounded |
159 | jmp loc_rounded |
160 | @@: |
160 | @@: |
161 | fmulp st1,st |
161 | fmulp st1,st |
162 | 162 | ||
163 | loc_rounded: |
163 | loc_rounded: |
164 | ; ®«ã祮¥ § 票¥ ¬¥ìè¥ 1.0e16 ? |
164 | ; ®«ã祮¥ § 票¥ ¬¥ìè¥ 1.0e16 ? |
165 | fcom [float1] |
165 | fcom [float1] |
166 | fstsw ax |
166 | fstsw ax |
167 | test ah,1 |
167 | test ah,1 |
168 | jz @f |
168 | jz @f |
169 | fmul [float2] |
169 | fmul [float2] |
170 | dec [digits_count] |
170 | dec [digits_count] |
171 | @@: |
171 | @@: |
172 | ; ¥«®¥ ç¨á«® ¡¥§ ¤à®¡®© ç á⨠¨ íªá¯®¥âë |
172 | ; ¥«®¥ ç¨á«® ¡¥§ ¤à®¡®© ç á⨠¨ íªá¯®¥âë |
173 | lea eax,[tmp1] |
173 | lea eax,[tmp1] |
174 | fbstp [eax] |
174 | fbstp [eax] |
175 | 175 | ||
176 | ; ¥à¥¢¥á⨠BCD-ç¨á«® ¢ áâபã |
176 | ; ¥à¥¢¥á⨠BCD-ç¨á«® ¢ áâபã |
177 | push edi |
177 | push edi |
178 | lea esi,[tmp1+8] |
178 | lea esi,[tmp1+8] |
179 | lea edi,[tmp2] |
179 | lea edi,[tmp2] |
180 | mov ecx, 9 |
180 | mov ecx, 9 |
181 | @@: |
181 | @@: |
182 | std |
182 | std |
183 | xor eax,eax |
183 | xor eax,eax |
184 | lodsb |
184 | lodsb |
185 | cld |
185 | cld |
186 | rol ax,12 |
186 | rol ax,12 |
187 | rol ah,4 |
187 | rol ah,4 |
188 | add ax,'00' |
188 | add ax,'00' |
189 | stosw |
189 | stosw |
190 | loop @b |
190 | loop @b |
191 | pop edi |
191 | pop edi |
192 | 192 | ||
193 | ; ¨á«ã âॡã¥âáï ¬ â¨áá ¨ íªá¯®¥â ? |
193 | ; ¨á«ã âॡã¥âáï ¬ â¨áá ¨ íªá¯®¥â ? |
194 | lea esi,[tmp2+1] |
194 | lea esi,[tmp2+1] |
195 | mov ecx,[digits_count] |
195 | mov ecx,[digits_count] |
196 | cmp ecx,-0Fh |
196 | cmp ecx,-0Fh |
197 | jl loc_mantiss_and_exponent |
197 | jl loc_mantiss_and_exponent |
198 | cmp ecx,10h |
198 | cmp ecx,10h |
199 | jg loc_mantiss_and_exponent |
199 | jg loc_mantiss_and_exponent |
200 | 200 | ||
201 | ; ¯®«¨âì ¤à®¡ãî ç áâì ç¨á« |
201 | ; ¯®«¨âì ¤à®¡ãî ç áâì ç¨á« |
202 | inc ecx |
202 | inc ecx |
203 | cmp ecx,0 |
203 | cmp ecx,0 |
204 | jg @f |
204 | jg @f |
205 | mov ax,'0.' |
205 | mov ax,'0.' |
206 | stosw |
206 | stosw |
207 | neg ecx |
207 | neg ecx |
208 | mov al,'0' |
208 | mov al,'0' |
209 | rep stosb |
209 | rep stosb |
210 | mov ecx,10h |
210 | mov ecx,10h |
211 | jmp loc_fraction_filled |
211 | jmp loc_fraction_filled |
212 | @@: |
212 | @@: |
213 | rep movsb |
213 | rep movsb |
214 | mov al,'.' |
214 | mov al,'.' |
215 | stosb |
215 | stosb |
216 | mov ecx,10h |
216 | mov ecx,10h |
217 | sub ecx,[digits_count] |
217 | sub ecx,[digits_count] |
218 | 218 | ||
219 | loc_fraction_filled: |
219 | loc_fraction_filled: |
220 | rep movsb |
220 | rep movsb |
221 | jmp @f |
221 | jmp @f |
222 | 222 | ||
223 | loc_clear_fraction: |
223 | loc_clear_fraction: |
224 | ; ¤ «¨âì § ¢¥àè î騥 㫨 ¤à®¡®© ç á⨠|
224 | ; ¤ «¨âì § ¢¥àè î騥 㫨 ¤à®¡®© ç á⨠|
225 | dec edi |
225 | dec edi |
226 | @@: |
226 | @@: |
227 | cmp byte [edi-1],'0' |
227 | cmp byte [edi-1],'0' |
228 | jz loc_clear_fraction |
228 | jz loc_clear_fraction |
229 | cmp byte [edi-1],'.' |
229 | cmp byte [edi-1],'.' |
230 | jnz @f |
230 | jnz @f |
231 | dec edi |
231 | dec edi |
232 | @@: |
232 | @@: |
233 | jmp loc_clear_stack |
233 | jmp loc_clear_stack |
234 | 234 | ||
235 | loc_mantiss_and_exponent: |
235 | loc_mantiss_and_exponent: |
236 | ; ஡ ï ç áâì ¬ â¨ááë |
236 | ; ஡ ï ç áâì ¬ â¨ááë |
237 | movsb |
237 | movsb |
238 | mov al,'.' |
238 | mov al,'.' |
239 | stosb |
239 | stosb |
240 | movsd |
240 | movsd |
241 | movsd |
241 | movsd |
242 | movsw |
242 | movsw |
243 | ; ¤ «¨âì § ¢¥àè î騥 㫨 ¤à®¡®© ç á⨠|
243 | ; ¤ «¨âì § ¢¥àè î騥 㫨 ¤à®¡®© ç á⨠|
244 | @@: |
244 | @@: |
245 | cmp byte [edi-1],'0' |
245 | cmp byte [edi-1],'0' |
246 | jne @f |
246 | jne @f |
247 | cmp byte [edi-2],'.' |
247 | cmp byte [edi-2],'.' |
248 | je @f |
248 | je @f |
249 | dec edi |
249 | dec edi |
250 | jmp @b |
250 | jmp @b |
251 | @@: |
251 | @@: |
252 | ; ¨¬¢®« ¨ § ª íªá¯®¥âë |
252 | ; ¨¬¢®« ¨ § ª íªá¯®¥âë |
253 | mov al,'e' |
253 | mov al,'e' |
254 | stosb |
254 | stosb |
255 | mov al,'+' |
255 | mov al,'+' |
256 | mov ebx,[digits_count] |
256 | mov ebx,[digits_count] |
257 | cmp ebx, 0 |
257 | cmp ebx, 0 |
258 | jge @f |
258 | jge @f |
259 | mov al,'-' |
259 | mov al,'-' |
260 | neg ebx |
260 | neg ebx |
261 | @@: |
261 | @@: |
262 | stosb |
262 | stosb |
263 | 263 | ||
264 | ; 票¥ íªá¯®¥âë |
264 | ; 票¥ íªá¯®¥âë |
265 | mov eax,ebx |
265 | mov eax,ebx |
266 | mov ecx,10 |
266 | mov ecx,10 |
267 | mov ebx,4 |
267 | mov ebx,4 |
268 | @@: |
268 | @@: |
269 | dec ebx |
269 | dec ebx |
270 | xor edx,edx |
270 | xor edx,edx |
271 | div ecx |
271 | div ecx |
272 | add dl,'0' |
272 | add dl,'0' |
273 | mov [tmp1+ebx],dl |
273 | mov [tmp1+ebx],dl |
274 | or ebx,ebx |
274 | or ebx,ebx |
275 | jnz @b |
275 | jnz @b |
276 | 276 | ||
277 | ; யãáâ¨âì «¨¤¨àãî騥 㫨 íªá¯®¥âë |
277 | ; யãáâ¨âì «¨¤¨àãî騥 㫨 íªá¯®¥âë |
278 | mov ecx,4 |
278 | mov ecx,4 |
279 | lea esi,[tmp1] |
279 | lea esi,[tmp1] |
280 | @@: |
280 | @@: |
281 | lodsb |
281 | lodsb |
282 | cmp al,'0' |
282 | cmp al,'0' |
283 | jne @f |
283 | jne @f |
284 | dec ecx |
284 | dec ecx |
285 | jmp @b |
285 | jmp @b |
286 | @@: |
286 | @@: |
287 | dec esi |
287 | dec esi |
288 | rep movsb |
288 | rep movsb |
289 | 289 | ||
290 | loc_clear_stack: |
290 | loc_clear_stack: |
291 | ; ®ááâ ®¢¨âì ã¯à ¢«ïî饥 á«®¢® |
291 | ; ®ááâ ®¢¨âì ã¯à ¢«ïî饥 á«®¢® |
292 | fldcw [old_cw] |
292 | fldcw [old_cw] |
293 | loc_ret: |
293 | loc_ret: |
294 | ; ª®ç ¨¥ áâப¨ |
294 | ; ª®ç ¨¥ áâப¨ |
295 | mov al,0 |
295 | mov al,0 |
296 | stosb |
296 | stosb |
297 | 297 | ||
298 | ; ®ááâ ®¢¨âì ¢á¥ à¥£¨áâàë |
298 | ; ®ááâ ®¢¨âì ¢á¥ à¥£¨áâàë |
299 | popa |
299 | popa |
300 | ret |
300 | ret |
301 | 301 | ||
302 | float1 dq 1.0e16 |
302 | float1 dq 1.0e16 |
303 | float2 dq 10.0 |
303 | float2 dq 10.0 |
304 | 304 | ||
305 | endp |
305 | endp |