Subversion Repositories Kolibri OS

Rev

Rev 5153 | Only display areas with differences | Regard whitespace | Details | Blame | Last modification | View Log | RSS feed

Rev 5153 Rev 8408
1
;
1
;
2
; ä㭪樨 ¤«ï à ¡®âë á ç¨á« ¬¨ float
2
; ä㭪樨 ¤«ï à ¡®âë á ç¨á« ¬¨ float
3
;
3
;
4
 
4
 
5
; Š®«¨ç¥á⢮ §­ ª®¢ ç¨á«  ¯®á«¥ § ¯ï⮩ (1-17)
5
; Š®«¨ç¥á⢮ §­ ª®¢ ç¨á«  ¯®á«¥ § ¯ï⮩ (1-17)
6
NumberSymbolsAD DW 5
6
NumberSymbolsAD DW 5
7
; Š®­áâ ­âë (10 ¢ á⥯¥­¨ N)
7
; Š®­áâ ­âë (10 ¢ á⥯¥­¨ N)
8
MConst DQ 1.0E1,1.0E2,1.0E3,1.0E4,1.0E5
8
MConst: DQ 1.0E1,1.0E2,1.0E3,1.0E4,1.0E5
9
       DQ 1.0E6,1.0E7,1.0E8,1.0E9,1.0E10
9
       DQ 1.0E6,1.0E7,1.0E8,1.0E9,1.0E10
10
       DQ 1.0E11,1.0E12,1.0E13,1.0E14,1.0E15
10
       DQ 1.0E11,1.0E12,1.0E13,1.0E14,1.0E15
11
       DQ 1.0E16,1.0E17,1.0E18,1.0E19,1.0E20
11
       DQ 1.0E16,1.0E17,1.0E18,1.0E19,1.0E20
12
       DQ 1.0E21,1.0E22,1.0E23,1.0E24,1.0E25
12
       DQ 1.0E21,1.0E22,1.0E23,1.0E24,1.0E25
13
       DQ 1.0E26,1.0E27,1.0E28,1.0E29,1.0E30
13
       DQ 1.0E26,1.0E27,1.0E28,1.0E29,1.0E30
14
       DQ 1.0E31,1.0E32,1.0E33,1.0E34,1.0E35
14
       DQ 1.0E31,1.0E32,1.0E33,1.0E34,1.0E35
15
       DQ 1.0E36,1.0E37,1.0E38,1.0E39,1.0E40
15
       DQ 1.0E36,1.0E37,1.0E38,1.0E39,1.0E40
16
       DQ 1.0E41,1.0E42,1.0E43,1.0E44,1.0E45
16
       DQ 1.0E41,1.0E42,1.0E43,1.0E44,1.0E45
17
       DQ 1.0E46,1.0E47,1.0E48,1.0E49,1.0E50
17
       DQ 1.0E46,1.0E47,1.0E48,1.0E49,1.0E50
18
       DQ 1.0E51,1.0E52,1.0E53,1.0E54,1.0E55
18
       DQ 1.0E51,1.0E52,1.0E53,1.0E54,1.0E55
19
       DQ 1.0E56,1.0E57,1.0E58,1.0E59,1.0E60
19
       DQ 1.0E56,1.0E57,1.0E58,1.0E59,1.0E60
20
       DQ 1.0E61,1.0E62,1.0E63,1.0E64,1.0E65
20
       DQ 1.0E61,1.0E62,1.0E63,1.0E64,1.0E65
21
       DQ 1.0E66,1.0E67,1.0E68,1.0E69,1.0E70
21
       DQ 1.0E66,1.0E67,1.0E68,1.0E69,1.0E70
22
       DQ 1.0E71,1.0E72,1.0E73,1.0E74,1.0E75
22
       DQ 1.0E71,1.0E72,1.0E73,1.0E74,1.0E75
23
       DQ 1.0E76,1.0E77,1.0E78,1.0E79,1.0E80
23
       DQ 1.0E76,1.0E77,1.0E78,1.0E79,1.0E80
24
       DQ 1.0E81,1.0E82,1.0E83,1.0E84,1.0E85
24
       DQ 1.0E81,1.0E82,1.0E83,1.0E84,1.0E85
25
       DQ 1.0E86,1.0E87,1.0E88,1.0E89,1.0E90
25
       DQ 1.0E86,1.0E87,1.0E88,1.0E89,1.0E90
26
       DQ 1.0E91,1.0E92,1.0E93,1.0E94,1.0E95
26
       DQ 1.0E91,1.0E92,1.0E93,1.0E94,1.0E95
27
       DQ 1.0E96,1.0E97,1.0E98,1.0E99,1.0E100
27
       DQ 1.0E96,1.0E97,1.0E98,1.0E99,1.0E100
28
       DQ 1.0E101,1.0E102,1.0E103,1.0E104,1.0E105
28
       DQ 1.0E101,1.0E102,1.0E103,1.0E104,1.0E105
29
       DQ 1.0E106,1.0E107,1.0E108,1.0E109,1.0E110
29
       DQ 1.0E106,1.0E107,1.0E108,1.0E109,1.0E110
30
       DQ 1.0E111,1.0E112,1.0E113,1.0E114,1.0E115
30
       DQ 1.0E111,1.0E112,1.0E113,1.0E114,1.0E115
31
       DQ 1.0E116,1.0E117,1.0E118,1.0E119,1.0E120
31
       DQ 1.0E116,1.0E117,1.0E118,1.0E119,1.0E120
32
       DQ 1.0E121,1.0E122,1.0E123,1.0E124,1.0E125
32
       DQ 1.0E121,1.0E122,1.0E123,1.0E124,1.0E125
33
       DQ 1.0E126,1.0E127,1.0E128
33
       DQ 1.0E126,1.0E127,1.0E128
-
 
34
.end:
34
; —¨á«® á ¯« ¢ î饩 § ¯ï⮩ ¤¢®©­®© â®ç­®áâ¨
35
; —¨á«® á ¯« ¢ î饩 § ¯ï⮩ ¤¢®©­®© â®ç­®áâ¨
35
Data_Double   DQ ?
36
Data_Double   DQ ?
36
; —¨á«® ¢ BCD-ä®à¬ â¥ 
37
; —¨á«® ¢ BCD-ä®à¬ â¥ 
37
Data_BCD      DT ?
38
Data_BCD      DT ?
38
; ‚ᯮ¬®£ â¥«ì­ë© ä« £
39
; ‚ᯮ¬®£ â¥«ì­ë© ä« £
39
Data_Flag     DB ?
40
Data_Flag     DB ?
40
; ‡­ ª १ã«ìâ â  (¥á«¨ ­¥ 0 - ®âà¨æ â¥«ì­®¥ ç¨á«®)
41
; ‡­ ª १ã«ìâ â  (¥á«¨ ­¥ 0 - ®âà¨æ â¥«ì­®¥ ç¨á«®)
41
Data_Sign     DB ?
42
Data_Sign     DB ?
-
 
43
; ‡­ ª १ã«ìâ â  - 0 ¤«ï ..e+.. ¨ 1 ¤«ï ..e-..
-
 
44
Data_Sign_Exp DB ?
42
 
45
 
43
 
-
 
44
db 0 ;㪠§ â¥«ì ­  ᤢ¨£ ¢ ¯ ¬ïâ¨
46
align 4
45
; ‘âப  ¤«ï åà ­¥­¨ï ç¨á«  ¢ ª®¤¥ ASCII
47
; ‘âப  ¤«ï åà ­¥­¨ï ç¨á«  ¢ ª®¤¥ ASCII
46
Data_String   DB 32 DUP (?)
48
Data_String   DB 32 DUP (?)
47
 
49
 
48
 
50
 
49
 
51
 
50
;*******************************************************
52
;*******************************************************
51
;*  …Ž€‡Ž‚€ˆ… —ˆ‘‹€ ‘ ‹€‚€ž™…‰ ‡€Ÿ’Ž‰ ‚ ‘’ŽŠ“  *
53
;*  …Ž€‡Ž‚€ˆ… —ˆ‘‹€ ‘ ‹€‚€ž™…‰ ‡€Ÿ’Ž‰ ‚ ‘’ŽŠ“  *
52
;* —¨á«® ¨¬¥¥â ä®à¬ â á 㤢®¥­­®© â®ç­®áâìî, १ã«ìâ â *
54
;* —¨á«® ¨¬¥¥â ä®à¬ â á 㤢®¥­­®© â®ç­®áâìî, १ã«ìâ â *
53
;* ¢ë¤ ¥âáï ¢ ¤¥áïâ¨ç­®¬ ª®¤¥, ¢ "¡ë⮢®¬" ä®à¬ â¥ á   *
55
;* ¢ë¤ ¥âáï ¢ ¤¥áïâ¨ç­®¬ ª®¤¥, ¢ "¡ë⮢®¬" ä®à¬ â¥ á   *
54
;* 䨪á¨à®¢ ­­ë¬ ª®«¨ç¥á⢮¬ §­ ª®¢ ¯®á«¥ § ¯ï⮩.     *
56
;* 䨪á¨à®¢ ­­ë¬ ª®«¨ç¥á⢮¬ §­ ª®¢ ¯®á«¥ § ¯ï⮩.     *
55
;* ‚室­ë¥ ¯ à ¬¥âàë:                                  *
57
;* ‚室­ë¥ ¯ à ¬¥âàë:                                  *
56
;* Data_Double - ¯à¥®¡à §ã¥¬®¥ ç¨á«®;                  *
58
;* Data_Double - ¯à¥®¡à §ã¥¬®¥ ç¨á«®;                  *
57
;* NumberSymbolsAD - ª®«¨ç¥á⢮ §­ ª®¢ ¯®á«¥           *
59
;* NumberSymbolsAD - ª®«¨ç¥á⢮ §­ ª®¢ ¯®á«¥           *
58
;*                   § ¯ï⮩ (0-17).                   *
60
;*                   § ¯ï⮩ (0-17).                   *
59
;* ‚ë室­ë¥ ¯ à ¬¥âàë:                                 *
61
;* ‚ë室­ë¥ ¯ à ¬¥âàë:                                 *
60
;* Data_String - áâப -१ã«ìâ â.                     *
62
;* Data_String - áâப -१ã«ìâ â.                     *
61
;*******************************************************
63
;*******************************************************
-
 
64
align 4
62
DoubleFloat_to_String:
65
DoubleFloat_to_String:
63
	pushad
66
	pushad
64
	; ¥§ã«ìâ â § ¯¨á뢠âì ¢ áâபã Data_String
67
	; ¥§ã«ìâ â § ¯¨á뢠âì ¢ áâபã Data_String
65
	lea EDI, [Data_String]
68
	mov	EDI, Data_String
66
 
69
 
67
	; ‘¤¢¨£ ¥¬ ç¨á«® ¢«¥¢® ­  NumberSymbolsAD
70
	; ‘¤¢¨£ ¥¬ ç¨á«® ¢«¥¢® ­  NumberSymbolsAD
68
	; ¤¥áïâ¨ç­ëå à §à冷¢
71
	; ¤¥áïâ¨ç­ëå à §à冷¢
69
	fninit		       ;á¡à®á ᮯà®æ¥áá®à 
72
	fninit		       ;á¡à®á ᮯà®æ¥áá®à 
70
	fld	[Data_Double]  ;§ £à㧨âì ç¨á«®
73
	fld	[Data_Double]  ;§ £à㧨âì ç¨á«®
71
	xor ebx,ebx
74
	xor ebx,ebx
72
	mov	BX,[NumberSymbolsAD]
75
	mov	BX,[NumberSymbolsAD]
73
	cmp	BX, 0
76
	cmp	BX, 0
74
	je	.NoShifts     ;­¥â æ¨äà ¯®á«¥ § ¯ï⮩
77
	je	.NoShifts     ;­¥â æ¨äà ¯®á«¥ § ¯ï⮩
75
	jl	.Error	      ;®è¨¡ª 
78
	jl	.Error	      ;®è¨¡ª 
76
	dec	BX
79
	dec	BX
77
	shl	BX, 3		;㬭®¦ ¥¬ ­  8
-
 
78
	lea eax,[MConst]
80
	lea ebx,[MConst+8*ebx]
79
	add	EBX, eax
-
 
80
	fmul	qword [EBX] ;㬭®¦¨âì ­  ª®­áâ ­âã
81
	fmul	qword [EBX] ;㬭®¦¨âì ­  ª®­áâ ­âã
81
.NoShifts:
82
.NoShifts:
82
	; ˆ§¢«¥çì ç¨á«® ¢ ª®¤¥ BCD
83
	; ˆ§¢«¥çì ç¨á«® ¢ ª®¤¥ BCD
83
	fbstp	[Data_BCD]
84
	fbstp	[Data_BCD]
84
; à®¢¥à¨âì १ã«ìâ â ­  ¯¥à¥¯®«­¥­¨¥
85
; à®¢¥à¨âì १ã«ìâ â ­  ¯¥à¥¯®«­¥­¨¥
85
	mov	AX,word [Data_BCD + 8]
86
	mov	AX,word [Data_BCD + 8]
86
	cmp	AX,0FFFFh  ;"¤¥áïâ¨ç­®¥" ¯¥à¥¯®«­¥­¨¥?
87
	cmp	AX,0FFFFh  ;"¤¥áïâ¨ç­®¥" ¯¥à¥¯®«­¥­¨¥?
87
	je	.Overflow
88
	je	.Overflow
88
; ‚뤥«¨âì §­ ª ç¨á«  ¨ § ¯¨á âì ¥£® ¢ ASCII-ª®¤¥
89
; ‚뤥«¨âì §­ ª ç¨á«  ¨ § ¯¨á âì ¥£® ¢ ASCII-ª®¤¥
89
	mov	AL, byte [Data_BCD + 9]
90
	mov	AL, byte [Data_BCD + 9]
90
	and	AL,AL
91
	and	AL,AL
91
	jz	.NoSign
92
	jz	.NoSign
92
	mov	AL,'-'
93
	mov	AL,'-'
93
	stosb
94
	stosb
94
.NoSign:
95
.NoSign:
95
;  á¯ ª®¢ âì ç¨á«® ¢ ª®¤ ASCII
96
;  á¯ ª®¢ âì ç¨á«® ¢ ª®¤ ASCII
96
	mov	ebx,8	 ;ᬥ饭¨¥ ¯®á«¥¤­¥© ¯ àë æ¨äà
97
	mov	ebx,8	 ;ᬥ饭¨¥ ¯®á«¥¤­¥© ¯ àë æ¨äà
97
	mov	ecx,9	 ;áç¥â稪 ¯ à æ¨äà
98
	mov	ecx,9	 ;áç¥â稪 ¯ à æ¨äà
98
	; Ž¯à¥¤¥«¨âì ¯®§¨æ¨î ¤¥áïâ¨ç­®© â®çª¨ ¢ ç¨á«¥
99
	; Ž¯à¥¤¥«¨âì ¯®§¨æ¨î ¤¥áïâ¨ç­®© â®çª¨ ¢ ç¨á«¥
99
	mov	DX,18
100
	mov	DX,18
100
	sub	DX,[NumberSymbolsAD]
101
	sub	DX,[NumberSymbolsAD]
101
	js	.Error	;®è¨¡ª , ¥á«¨ ®âà¨æ â¥«ì­ ï
102
	js	.Error	;®è¨¡ª , ¥á«¨ ®âà¨æ â¥«ì­ ï
102
	jz	.Error	;¨«¨ ­ã«¥¢ ï ¯®§¨æ¨ï
103
	jz	.Error	;¨«¨ ­ã«¥¢ ï ¯®§¨æ¨ï
103
.NextPair:
104
.NextPair:
104
	; ‡ £à㧨âì ®ç¥à¥¤­ãî ¯ àã à §à冷¢
105
	; ‡ £à㧨âì ®ç¥à¥¤­ãî ¯ àã à §à冷¢
105
	mov	AL, byte [ebx + Data_BCD]
106
	mov	AL, byte [ebx + Data_BCD]
106
	mov	AH,AL
107
	mov	AH,AL
107
	; ‚뤥«¨âì, ¯¥à¥¢¥á⨠¢ ASCII ¨
108
	; ‚뤥«¨âì, ¯¥à¥¢¥á⨠¢ ASCII ¨
108
	; á®åà ­¨âì áâ àèãî â¥âà ¤ã
109
	; á®åà ­¨âì áâ àèãî â¥âà ¤ã
109
	shr	AL,4
110
	shr	AL,4
110
	add	AL,'0'
111
	add	AL,'0'
111
	stosb
112
	stosb
112
	dec	DX
113
	dec	DX
113
	jnz	.N0
114
	jnz	.N0
114
	mov	AL,'.'
115
	mov	AL,'.'
115
	stosb
116
	stosb
116
.N0:   ; ‚뤥«¨âì, ¯¥à¥¢¥á⨠¢ ASCII ¨
117
.N0:   ; ‚뤥«¨âì, ¯¥à¥¢¥á⨠¢ ASCII ¨
117
	; á®åà ­¨âì ¬« ¤èãî â¥âà ¤ã
118
	; á®åà ­¨âì ¬« ¤èãî â¥âà ¤ã
118
	mov	AL,AH
119
	mov	AL,AH
119
	and	AL,0Fh
120
	and	AL,0Fh
120
	add	AL,'0'
121
	add	AL,'0'
121
	stosb
122
	stosb
122
	dec	DX
123
	dec	DX
123
	jnz	.N1
124
	jnz	.N1
124
	mov	AL,'.'
125
	mov	AL,'.'
125
	stosb
126
	stosb
126
.N1:
127
.N1:
127
	dec  BX
128
	dec  BX
128
	loop .NextPair
129
	loop .NextPair
129
	mov  AL,0
130
	mov  AL,0
130
	stosb
131
	stosb
131
 
132
 
132
; “¡à âì ­¥§­ ç é¨¥ ­ã«¨ á«¥¢ 
133
; “¡à âì ­¥§­ ç é¨¥ ­ã«¨ á«¥¢ 
133
	lea	EDI, [Data_String]
134
	mov	EDI, Data_String
134
	lea	ESI, [Data_String]
135
	mov	ESI, Data_String
135
	; à®¯ãáâ¨âì §­ ª ç¨á« , ¥á«¨ ®­ ¥áâì
136
	; à®¯ãáâ¨âì §­ ª ç¨á« , ¥á«¨ ®­ ¥áâì
136
	cmp	byte [ESI],'-'
137
	cmp	byte [ESI],'-'
137
	jne	.N2
138
	jne	.N2
138
	inc	ESI
139
	inc	ESI
139
	inc	EDI
140
	inc	EDI
140
.N2:   ; ‡ £à㧨âì ¢ áç¥â稪 横«  ª®«¨ç¥á⢮ à §à冷¢
141
.N2:   ; ‡ £à㧨âì ¢ áç¥â稪 横«  ª®«¨ç¥á⢮ à §à冷¢
141
	; ç¨á«  ¯«îá 1 (¡ ©â ¤¥áïâ¨ç­®© â®çª¨)
142
	; ç¨á«  ¯«îá 1 (¡ ©â ¤¥áïâ¨ç­®© â®çª¨)
142
	mov	ecx,18+1+1
143
	mov	ecx,18+1+1
143
	; à®¯ãáâ¨âì ­¥§­ ç é¨¥ ­ã«¨
144
	; à®¯ãáâ¨âì ­¥§­ ç é¨¥ ­ã«¨
144
.N3:
145
.N3:
145
	cmp byte [ESI],'0'
146
	cmp byte [ESI],'0'
146
	jne .N4
147
	jne .N4
147
	cmp byte [ESI+1],'.'
148
	cmp byte [ESI+1],'.'
148
	je .N4
149
	je .N4
149
	inc ESI
150
	inc ESI
150
	loop .N3
151
	loop .N3
151
	; Žè¨¡ª  - ­¥â §­ ç é¨å æ¨äà
152
	; Žè¨¡ª  - ­¥â §­ ç é¨å æ¨äà
152
	jmp	.Error
153
	jmp	.Error
153
; ‘ª®¯¨à®¢ âì §­ ç éãî ç áâì ç¨á«  ¢ ­ ç «® áâப¨
154
; ‘ª®¯¨à®¢ âì §­ ç éãî ç áâì ç¨á«  ¢ ­ ç «® áâப¨
-
 
155
align 4
154
.N4:	rep movsb
156
.N4:	rep movsb
155
	jmp    .End
157
	jmp    .End
156
 
-
 
157
; Žè¨¡ª 
158
; Žè¨¡ª 
-
 
159
align 4
158
.Error:
160
.Error:
159
	mov	AL,'E'
161
	mov	AL,'E'
160
	stosb
162
	stosb
161
	mov	AL,'R'
163
	mov	AL,'R'
162
	stosb
164
	stosb
163
	mov	AL,'R'
165
	mov	AL,'R'
164
	stosb
166
	stosb
165
	xor	AL,AL
167
	xor	AL,AL
166
	stosb
168
	stosb
167
	jmp	.End
169
	jmp	.End
168
; ¥à¥¯®«­¥­¨¥ à §à來®© á¥âª¨
170
; ¥à¥¯®«­¥­¨¥ à §à來®© á¥âª¨
-
 
171
align 4
169
.Overflow:
172
.Overflow:
170
	mov	AL,'#'
173
	mov	AL,'#'
171
	stosb
174
	stosb
172
	xor	AL,AL
175
	xor	AL,AL
173
	stosb
176
	stosb
174
; Š®­¥æ ¯à®æ¥¤ãàë
177
; Š®­¥æ ¯à®æ¥¤ãàë
-
 
178
align 4
175
.End:
179
.End:
176
	popad
180
	popad
177
	ret
181
	ret
178
 
182
 
179
;****************************************************
183
;****************************************************
180
;* …Ž€‡Ž‚€’œ ‘’ŽŠ“ ‚ —ˆ‘‹Ž ‘ ‹€‚€ž™…‰ ‡€Ÿ’Ž‰ *
184
;* …Ž€‡Ž‚€’œ ‘’ŽŠ“ ‚ —ˆ‘‹Ž ‘ ‹€‚€ž™…‰ ‡€Ÿ’Ž‰ *
181
;*      (ç¨á«® ¨¬¥¥â ®¡ëç­ë©, "¡ë⮢®©" ä®à¬ â)     *
185
;*      (ç¨á«® ¨¬¥¥â ®¡ëç­ë©, "¡ë⮢®©" ä®à¬ â)     *
182
;* ‚室­ë¥ ¯ à ¬¥âàë:                               *
186
;* ‚室­ë¥ ¯ à ¬¥âàë:                               *
183
;* Data_String - ç¨á«® ¢ ª®¤¥ ASCII.                *
187
;* Data_String - ç¨á«® ¢ ª®¤¥ ASCII.                *
184
;* ‚ë室­ë¥ ¯ à ¬¥âàë:                              *
188
;* ‚ë室­ë¥ ¯ à ¬¥âàë:                              *
185
;* Data_Double - ç¨á«® ¢ ¤¢®¨ç­®¬ ª®¤¥.             *
189
;* Data_Double - ç¨á«® ¢ ¤¢®¨ç­®¬ ª®¤¥.             *
186
;****************************************************
190
;****************************************************
-
 
191
align 4
187
String_to_DoubleFloat:
192
String_to_DoubleFloat:
188
	pushad
193
	pushad
189
	cld
194
	cld
190
	; Žç¨é ¥¬ Data_BCD 
195
	; Žç¨é ¥¬ Data_BCD 
191
	mov dword [Data_BCD],0
196
	mov dword [Data_BCD],0
192
	mov dword [Data_BCD+4],0
197
	mov dword [Data_BCD+4],0
193
	mov  word [Data_BCD+8],0
198
	mov  word [Data_BCD+8],0
194
	; Žç¨é ¥¬ ¡ ©â §­ ª 
199
	; Žç¨é ¥¬ ¡ ©â §­ ª 
195
	mov	[Data_Sign],0
200
	mov	[Data_Sign],0
196
	; ‡ ­®á¨¬ ¢ SI 㪠§ â¥«ì ­  áâபã
201
	; ‡ ­®á¨¬ ¢ esi 㪠§ â¥«ì ­  áâபã
197
	lea	ESI, [Data_String]
202
	mov	esi, Data_String
198
	; à®¯ã᪠¥¬ ¯à®¡¥«ë ¯¥à¥¤ ç¨á«®¬
203
	; à®¯ã᪠¥¬ ¯à®¡¥«ë ¯¥à¥¤ ç¨á«®¬
199
	mov	ecx,64 ;§ é¨â  ®â § æ¨ª«¨¢ ­¨ï
204
	mov	ecx,64 ;§ é¨â  ®â § æ¨ª«¨¢ ­¨ï
200
.ShiftIgnore:
205
.ShiftIgnore:
201
	lodsb
206
	lodsb
202
	cmp	AL,' '
207
	cmp	al,' '
203
	jne	.ShiftIgnoreEnd
208
	jne .ShiftIgnoreEnd
204
	loop	.ShiftIgnore
209
	loop .ShiftIgnore
205
	jmp	.Error
210
	jmp .Error
-
 
211
align 4
206
.ShiftIgnoreEnd:
212
.ShiftIgnoreEnd:
207
	; à®¢¥à塞 §­ ª ç¨á« 
213
	; à®¢¥à塞 §­ ª ç¨á« 
208
	cmp	AL,'-'
214
	cmp	al,'-'
209
	jne	.Positive
215
	jne	.Positive
210
	mov	[Data_Sign],80h
216
	mov	[Data_Sign],80h
211
	lodsb
217
	lodsb
212
.Positive:
218
.Positive:
213
	mov	[Data_Flag],0 ;¯à¨§­ ª ­ «¨ç¨ï â®çª¨
219
	mov	[Data_Flag],0 ;¯à¨§­ ª ­ «¨ç¨ï â®çª¨
214
	mov	DX,0	      ;¯®§¨æ¨ï â®çª¨
220
	xor	edx,edx	      ;¯®§¨æ¨ï â®çª¨
215
	mov	ecx,18	      ;¬ ªá. ç¨á«® à §à冷¢
221
	mov	ecx,18	      ;¬ ªá. ç¨á«® à §à冷¢
-
 
222
align 4
216
.ASCIItoBCDConversion:
223
.ASCIItoBCDConversion:
217
	cmp	AL,'.'	      ;â®çª ?
224
	cmp	al,'.'	      ;â®çª ?
218
	jne	.NotDot
225
	jne	.NotDot
219
	cmp	[Data_Flag],0 ;â®çª  ­¥ ¢áâà¥ç « áì?
226
	cmp	[Data_Flag],0 ;â®çª  ­¥ ¢áâà¥ç « áì?
220
	jne	.Error
227
	jne	.Error        ;¥á«¨ â®çª  㦥 ¡ë« 
221
	mov	[Data_Flag],1
228
	mov	[Data_Flag],1
222
	lodsb
229
	lodsb
223
	cmp	AL,0	      ;ª®­¥æ áâப¨?
230
	or al,al	      ;ª®­¥æ áâப¨?
224
	jne	.NotDot
231
	jnz	.NotDot
225
	jmp	.ASCIItoBCDConversionEnd
232
	jmp	.ASCIItoBCDConversionEnd
-
 
233
align 4
226
.NotDot:
234
.NotDot:
227
	; “¢¥«¨ç¨âì ­  1 §­ ç¥­¨¥ ¯®§¨æ¨¨ â®çª¨,
235
	; “¢¥«¨ç¨âì ­  1 §­ ç¥­¨¥ ¯®§¨æ¨¨ â®çª¨,
228
	; ¥á«¨ ®­  ¥é¥ ­¥ ¢áâà¥ç « áì
236
	; ¥á«¨ ®­  ¥é¥ ­¥ ¢áâà¥ç « áì
229
	cmp	[Data_Flag],0
237
	cmp	[Data_Flag],0
230
	jnz	.Figures
238
	jnz	.Figures
231
	inc	DX
239
	inc	edx
232
.Figures:
240
.Figures:
-
 
241
	cmp al,'e'
-
 
242
	je .exp_form
-
 
243
	cmp al,'E'
-
 
244
	jne @f
-
 
245
	.exp_form:
-
 
246
		call string_ExpForm ;¥á«¨ ç¨á«® ¢ ä®à¬ â¥ ..e..
-
 
247
		or al,al
-
 
248
		jnz .Error
-
 
249
		jmp	.ASCIItoBCDConversionEnd
-
 
250
	@@:
233
	; ‘¨¬¢®«ë ç¨á«  ¤®«¦­ë ¡ëâì æ¨äà ¬¨
251
	; ‘¨¬¢®«ë ç¨á«  ¤®«¦­ë ¡ëâì æ¨äà ¬¨
234
	cmp	AL,'0'
252
	cmp	al,'0'
235
	jb	.Error
253
	jb	.Error
236
	cmp	AL,'9'
254
	cmp	al,'9'
237
	ja	.Error
255
	ja	.Error
238
	; ¨è¥¬ ®ç¥à¥¤­ãî æ¨äàã ¢ ¬« ¤èãî â¥âà ¤ã BCD
256
	; ¨è¥¬ ®ç¥à¥¤­ãî æ¨äàã ¢ ¬« ¤èãî â¥âà ¤ã BCD
239
	and	AL,0Fh
257
	and	al,15 ;ᨬ¢®«ë 0-9 ¯¥à¥¢®¤¨¬ ¢ ç¨á«®
240
	or	byte [Data_BCD],AL
258
	or	byte [Data_BCD],al
241
	; à®¢¥àª  ­  ª®­¥æ áâப¨
259
	; à®¢¥àª  ­  ª®­¥æ áâப¨
242
	cmp	byte [ESI],0
260
	cmp	byte [esi],0
243
	je	.ASCIItoBCDConversionEnd
261
	je	.ASCIItoBCDConversionEnd
244
	; ‘¤¢¨£ ¥¬ BCD ­  4 à §à鸞 ¢«¥¢®
262
	; ‘¤¢¨£ ¥¬ BCD ­  4 à §à鸞 ¢«¥¢®
245
	; (ᤢ¨£ ¥¬ áâ à訥 2 ¡ ©â )
263
	; (ᤢ¨£ ¥¬ áâ à訥 2 ¡ ©â )
246
	mov	AX,word [Data_BCD+6]
264
	mov	ax,word [Data_BCD+6]
247
	shld	word [Data_BCD+8],AX,4
265
	shld	word [Data_BCD+8],ax,4
248
	; (ᤢ¨£ ¥¬ á।­¨¥ 4 ¡ ©â )
266
	; (ᤢ¨£ ¥¬ á।­¨¥ 4 ¡ ©â )
249
	mov	EAX, dword [Data_BCD]
267
	mov	eax,dword [Data_BCD]
250
	shld	dword [Data_BCD+4],EAX,4
268
	shld	dword [Data_BCD+4],eax,4
251
	; (ᤢ¨£ ¥¬ ¬« ¤è¨¥ 4 ¡ ©â )
269
	; (ᤢ¨£ ¥¬ ¬« ¤è¨¥ 4 ¡ ©â )
252
	shl	dword [Data_BCD],4
270
	shl	dword [Data_BCD],4
253
	; ‡ £à㦠¥¬ á«¥¤ãî騩 ᨬ¢®« ¢ AL
271
	; ‡ £à㦠¥¬ á«¥¤ãî騩 ᨬ¢®« ¢ AL
254
	lodsb
272
	lodsb
255
	loop	.ASCIItoBCDConversion
273
	loop .ASCIItoBCDConversion ;¥á«¨ ­¥ ª®¬¯¨«. â® ¯®áâ ¢¨âì dec ecx, jnz ...
256
	; …᫨ 19-© ᨬ¢®« ­¥ 0 ¨ ­¥ â®çª ,
274
	; …᫨ 19-© ᨬ¢®« ­¥ 0 ¨ ­¥ â®çª ,
257
	; â® ®è¨¡ª  ¯¥à¥¯®«­¥­¨ï
275
	; â® ®è¨¡ª  ¯¥à¥¯®«­¥­¨ï
258
	cmp	AL,'.'
276
	cmp	al,'.'
259
	jne	.NotDot2
277
	jne	.NotDot2
260
	inc	ecx
-
 
-
 
278
	inc	ecx ;¯à®¯ã᪠â®çª¨ ¢ ª®­æ¥ ®ç¥­ì ¡®«ì讣® ç¨á« 
261
	lodsb
279
	lodsb
262
.NotDot2:
280
.NotDot2:
-
 
281
	or al,al	;¯¥à¥¯®«­¥­¨¥ à §à來®© á¥âª¨?
-
 
282
	jz	.ASCIItoBCDConversionEnd
263
	cmp	AL,0
283
align 4
264
	jne	.Error ;¯¥à¥¯®«­¥­¨¥ à §à來®© á¥âª¨
284
.Error: ; à¨ «î¡®© ®è¨¡ª¥ ®¡­ã«¨âì १ã«ìâ â
-
 
285
	fldz	;§ ­¥á⨠­®«ì á á⥪ ᮯà®æ¥áá®à 
-
 
286
	fstp	[Data_Double]
-
 
287
	jmp	.End
265
 
288
 
266
; …Ž€‡Ž‚€’œ —ˆ‘‹Ž ˆ‡ ŠŽ„€ BCD ‚ ‚…™…‘’‚…Ž… —ˆ‘‹Ž
289
; …Ž€‡Ž‚€’œ —ˆ‘‹Ž ˆ‡ ŠŽ„€ BCD ‚ ‚…™…‘’‚…Ž… —ˆ‘‹Ž
267
.ASCIItoBCDConversionEnd:
290
.ASCIItoBCDConversionEnd:
268
	; ‚¯¨á âì §­ ª ¢ áâ à訩 ¡ ©â
291
	; ‚¯¨á âì §­ ª ¢ áâ à訩 ¡ ©â
269
	mov	AL,[Data_Sign]
292
	mov	al,[Data_Sign]
270
	mov	byte [Data_BCD+9],AL
293
	mov	byte [Data_BCD+9],al
271
	; ‘¡à®á¨âì ॣ¨áâàë ᮯà®æ¥áá®à 
294
	; ‘¡à®á¨âì ॣ¨áâàë ᮯà®æ¥áá®à 
272
	fninit
295
	fninit
273
	; ‡ £à㧨âì ¢ ᮯà®æ¥áá®à ç¨á«® ¢ BCD-ä®à¬ â¥
296
	; ‡ £à㧨âì ¢ ᮯà®æ¥áá®à ç¨á«® ¢ BCD-ä®à¬ â¥
274
	fbld	[Data_BCD]
297
	fbld	[Data_BCD]
275
	; ‚ëç¨á«¨âì ­®¬¥à ¤¥«¨â¥«ï
298
	; ‚ëç¨á«¨âì ­®¬¥à ¤¥«¨â¥«ï ¨«¨ ¬­®¦¨â¥«ï
-
 
299
	lea ebx,[ecx+edx-18]
276
	mov	EBX,18+1
300
	cmp ebx,0
-
 
301
	jle .NoMul ;¥á«¨ ç¨á«® e-..
277
	sub	BX,CX
302
	dec ebx
-
 
303
	jz .NoDiv ;¥á«¨ ç¨á«® e+0
278
	sub	BX,DX
304
	dec ebx
-
 
305
	lea ebx,[MConst+8*ebx]
-
 
306
	cmp ebx,MConst.end
-
 
307
	jl @f
279
	cmp	EBX,0
308
		ffree st0
-
 
309
		fincstp
-
 
310
		jmp .Error ;¥á«¨ ®ç¥­ì ¡®«ì讥 ç¨á«® e+**
-
 
311
	@@:
-
 
312
	fmul qword [ebx] ;㬭®¦¨âì ­  ª®­áâ ­âã (¤«ï ç¨á¥« á ¯à¨áâ ¢ª®© e+..)
280
	je	.NoDiv
313
	jmp .NoDiv
-
 
314
.NoMul:
281
	dec	EBX
315
	neg ebx
282
	shl	EBX,3		;㬭®¦ ¥¬ ­  8
316
	lea ebx,[MConst+8*ebx]
283
	lea eax,[MConst]
317
	cmp ebx,MConst.end
-
 
318
	jl @f
-
 
319
		ffree st0
284
	add	EBX,eax
320
		fincstp
-
 
321
		jmp .Error ;¥á«¨ ®ç¥­ì ¬ «¥­ìª®¥ ç¨á«® e-**
-
 
322
	@@:
285
	fdiv	qword [EBX] ;à §¤¥«¨âì ­  ª®­áâ ­âã
323
	fdiv qword [ebx] ;à §¤¥«¨âì ­  ª®­áâ ­âã
286
.NoDiv:; ‚ë£à㧨âì ç¨á«® ¢ ¤¢®¨ç­®¬ ä®à¬ â¥
324
.NoDiv: ;‚ë£à㧨âì ç¨á«® ¢ ¤¢®¨ç­®¬ ä®à¬ â¥
287
	fstp	[Data_Double]
325
	fstp [Data_Double]
288
	jmp	.End
-
 
289
 
-
 
290
.Error:; à¨ «î¡®© ®è¨¡ª¥ ®¡­ã«¨âì १ã«ìâ â
-
 
291
	fldz	;§ ­¥á⨠­®«ì á á⥪ ᮯà®æ¥áá®à 
-
 
292
	fstp	[Data_Double]
-
 
293
.End:
326
.End:
294
	popad
327
	popad
295
	ret
328
	ret
-
 
329
 
-
 
330
;output:
-
 
331
; eax - 1 if error
296
 
332
; edx += size
297
align 4
333
align 4
-
 
334
proc string_ExpForm uses ebx
-
 
335
	mov [Data_Sign_Exp],0
-
 
336
	xor eax,eax
-
 
337
	lodsb
-
 
338
	cmp al,'+'
-
 
339
	jne @f
-
 
340
		lodsb
-
 
341
	@@:
-
 
342
	cmp al,'-'
-
 
343
	jne @f
-
 
344
		inc [Data_Sign_Exp]
-
 
345
		lodsb
-
 
346
	@@:
-
 
347
	
-
 
348
	xor ebx,ebx
-
 
349
	.cycle0:
-
 
350
		cmp al,0
-
 
351
		je .cycle0end
-
 
352
		cmp al,9
-
 
353
		je .cycle0end
-
 
354
		cmp al,10
-
 
355
		je .cycle0end
-
 
356
		cmp al,13
-
 
357
		je .cycle0end
-
 
358
		cmp al,' '
-
 
359
		je .cycle0end
-
 
360
		cmp	al,'0'
-
 
361
		jb .Error
-
 
362
		cmp	al,'9'
-
 
363
		ja .Error
-
 
364
	
-
 
365
		imul ebx,10
-
 
366
		and	eax,15 ;ᨬ¢®«ë 0-9 ¯¥à¥¢®¤¨¬ ¢ ç¨á«®
-
 
367
		add ebx,eax
-
 
368
		lodsb
-
 
369
		jmp .cycle0
-
 
370
	.cycle0end:
-
 
371
	
-
 
372
	cmp ebx,328 ;308 - ¬ ªá. à §¬¥à á⥯¥­¨ ¤«ï double + 20 - ç¨á«® à §à冷¢ ¢ BCD
-
 
373
	ja .Error
-
 
374
	cmp [Data_Sign_Exp],0
-
 
375
	je @f
-
 
376
		neg ebx
-
 
377
	@@:
-
 
378
	cmp	[Data_Flag],0 ;â®çª  ­¥ ¢áâà¥ç « áì?
-
 
379
	jne @f
-
 
380
		dec edx
-
 
381
	@@:
-
 
382
	add edx,ebx
-
 
383
 
-
 
384
	xor eax,eax
-
 
385
	jmp @f
298
proc str_cat, str1:dword, str2:dword
386
	.Error:
-
 
387
		xor eax,eax
-
 
388
		inc eax
-
 
389
	@@:
-
 
390
	ret
-
 
391
endp
-
 
392
 
-
 
393
align 4
299
	push eax ecx edi esi
394
proc str_cat uses eax ecx edi esi, str1:dword, str2:dword
300
	mov esi,dword[str2]
395
	mov esi,dword[str2]
301
	stdcall str_len,esi
396
	stdcall str_len,esi
302
	mov ecx,eax
397
	mov ecx,eax
303
	inc ecx
398
	inc ecx
304
	mov edi,dword[str1]
399
	mov edi,dword[str1]
305
	stdcall str_len,edi
400
	stdcall str_len,edi
306
	add edi,eax
401
	add edi,eax
307
	cld
402
	cld
308
	repne movsb
403
	repne movsb
309
	pop esi edi ecx eax
-
 
310
	ret
404
	ret
311
endp
405
endp
312
 
406
 
313
;output:
407
;output:
314
; eax = strlen
408
; eax = strlen
315
align 4
409
align 4
316
proc str_len, str1:dword
410
proc str_len, str1:dword
317
	mov eax,[str1]
411
	mov eax,[str1]
318
	@@:
412
	@@:
319
		cmp byte[eax],0
413
		cmp byte[eax],0
320
		je @f
414
		je @f
321
		inc eax
415
		inc eax
322
		jmp @b
416
		jmp @b
323
	@@:
417
	@@:
324
	sub eax,[str1]
418
	sub eax,[str1]
325
	ret
419
	ret
-
 
420
endp
-
 
421
 
-
 
422
align 4
-
 
423
proc String_crop_0 uses eax ebx ecx edi
-
 
424
	mov edi,Data_String
-
 
425
	mov al,'.'
-
 
426
	mov ecx,32
-
 
427
	repne scasb
-
 
428
	mov ebx,edi
-
 
429
	mov edi,Data_String
-
 
430
	xor al,al
-
 
431
	mov ecx,32
-
 
432
	repne scasb
-
 
433
	cmp ebx,edi
-
 
434
	jg .end_f
-
 
435
	dec edi
-
 
436
	.cycle0:
-
 
437
		dec edi
-
 
438
		cmp edi,Data_String
-
 
439
		jle .end_f
-
 
440
		cmp byte[edi],'0'
-
 
441
		jne .cycle0end
-
 
442
		mov byte[edi],0
-
 
443
		jmp .cycle0
-
 
444
	.cycle0end:
-
 
445
	cmp byte[edi],'.'
-
 
446
	jne .end_f
-
 
447
		mov byte[edi],0
-
 
448
	.end_f:
-
 
449
	ret
326
endp
450
endp
327
451