Subversion Repositories Kolibri OS

Rev

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