Subversion Repositories Kolibri OS

Rev

Rev 2254 | Go to most recent revision | Only display areas with differences | Regard whitespace | Details | Blame | Last modification | View Log | RSS feed

Rev 2254 Rev 7128
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
; —¨á«® á ¯« ¢ î饩 § ¯ï⮩ ¤¢®©­®© â®ç­®áâ¨
34
; —¨á«® á ¯« ¢ î饩 § ¯ï⮩ ¤¢®©­®© â®ç­®áâ¨
35
Data_Double   DQ ?
35
Data_Double   DQ ?
36
; —¨á«® ¢ BCD-ä®à¬ â¥ 
36
; —¨á«® ¢ BCD-ä®à¬ â¥ 
37
Data_BCD      DT ?
37
Data_BCD      DT ?
38
; ‚ᯮ¬®£ â¥«ì­ë© ä« £
38
; ‚ᯮ¬®£ â¥«ì­ë© ä« £
39
Data_Flag     DB ?
39
Data_Flag     DB ?
40
; ‡­ ª १ã«ìâ â  (¥á«¨ ­¥ 0 - ®âà¨æ â¥«ì­®¥ ç¨á«®)
40
; ‡­ ª १ã«ìâ â  (¥á«¨ ­¥ 0 - ®âà¨æ â¥«ì­®¥ ç¨á«®)
41
Data_Sign     DB ?
41
Data_Sign     DB ?
42
 
42
 
43
 
43
 
44
db 0 ;㪠§ â¥«ì ­  ᤢ¨£ ¢ ¯ ¬ïâ¨
44
db 0 ;㪠§ â¥«ì ­  ᤢ¨£ ¢ ¯ ¬ïâ¨
45
; ‘âப  ¤«ï åà ­¥­¨ï ç¨á«  ¢ ª®¤¥ ASCII
45
; ‘âப  ¤«ï åà ­¥­¨ï ç¨á«  ¢ ª®¤¥ ASCII
46
Data_String   DB 32 DUP (?)
46
Data_String   DB 32 DUP (?)
47
 
47
 
48
 
48
 
49
 
49
 
50
;*******************************************************
50
;*******************************************************
51
;*  …Ž€‡Ž‚€ˆ… —ˆ‘‹€ ‘ ‹€‚€ž™…‰ ‡€Ÿ’Ž‰ ‚ ‘’ŽŠ“  *
51
;*  …Ž€‡Ž‚€ˆ… —ˆ‘‹€ ‘ ‹€‚€ž™…‰ ‡€Ÿ’Ž‰ ‚ ‘’ŽŠ“  *
52
;* —¨á«® ¨¬¥¥â ä®à¬ â á 㤢®¥­­®© â®ç­®áâìî, १ã«ìâ â *
52
;* —¨á«® ¨¬¥¥â ä®à¬ â á 㤢®¥­­®© â®ç­®áâìî, १ã«ìâ â *
53
;* ¢ë¤ ¥âáï ¢ ¤¥áïâ¨ç­®¬ ª®¤¥, ¢ "¡ë⮢®¬" ä®à¬ â¥ á   *
53
;* ¢ë¤ ¥âáï ¢ ¤¥áïâ¨ç­®¬ ª®¤¥, ¢ "¡ë⮢®¬" ä®à¬ â¥ á   *
54
;* 䨪á¨à®¢ ­­ë¬ ª®«¨ç¥á⢮¬ §­ ª®¢ ¯®á«¥ § ¯ï⮩.     *
54
;* 䨪á¨à®¢ ­­ë¬ ª®«¨ç¥á⢮¬ §­ ª®¢ ¯®á«¥ § ¯ï⮩.     *
55
;* ‚室­ë¥ ¯ à ¬¥âàë:                                  *
55
;* ‚室­ë¥ ¯ à ¬¥âàë:                                  *
56
;* Data_Double - ¯à¥®¡à §ã¥¬®¥ ç¨á«®;                  *
56
;* Data_Double - ¯à¥®¡à §ã¥¬®¥ ç¨á«®;                  *
57
;* NumberSymbolsAD - ª®«¨ç¥á⢮ §­ ª®¢ ¯®á«¥           *
57
;* NumberSymbolsAD - ª®«¨ç¥á⢮ §­ ª®¢ ¯®á«¥           *
58
;*                   § ¯ï⮩ (0-17).                   *
58
;*                   § ¯ï⮩ (0-17).                   *
59
;* ‚ë室­ë¥ ¯ à ¬¥âàë:                                 *
59
;* ‚ë室­ë¥ ¯ à ¬¥âàë:                                 *
60
;* Data_String - áâப -१ã«ìâ â.                     *
60
;* Data_String - áâப -१ã«ìâ â.                     *
61
;*******************************************************
61
;*******************************************************
-
 
62
align 4
62
DoubleFloat_to_String:
63
DoubleFloat_to_String:
63
	pushad
64
	pushad
64
	; ¥§ã«ìâ â § ¯¨á뢠âì ¢ áâபã Data_String
65
	; ¥§ã«ìâ â § ¯¨á뢠âì ¢ áâபã Data_String
65
	mov	EDI, Data_String
66
	mov	EDI, Data_String
66
 
67
 
67
	; ‘¤¢¨£ ¥¬ ç¨á«® ¢«¥¢® ­  NumberSymbolsAD
68
	; ‘¤¢¨£ ¥¬ ç¨á«® ¢«¥¢® ­  NumberSymbolsAD
68
	; ¤¥áïâ¨ç­ëå à §à冷¢
69
	; ¤¥áïâ¨ç­ëå à §à冷¢
69
	fninit		       ;á¡à®á ᮯà®æ¥áá®à 
70
	fninit		       ;á¡à®á ᮯà®æ¥áá®à 
70
	fld	[Data_Double]  ;§ £à㧨âì ç¨á«®
71
	fld	[Data_Double]  ;§ £à㧨âì ç¨á«®
71
	xor ebx,ebx
72
	xor ebx,ebx
72
	mov	BX,[NumberSymbolsAD]
73
	mov	BX,[NumberSymbolsAD]
73
	cmp	BX, 0
74
	cmp	BX, 0
74
	je	.NoShifts     ;­¥â æ¨äà ¯®á«¥ § ¯ï⮩
75
	je	.NoShifts     ;­¥â æ¨äà ¯®á«¥ § ¯ï⮩
75
	jl	.Error	      ;®è¨¡ª 
76
	jl	.Error	      ;®è¨¡ª 
76
	dec	BX
77
	dec	BX
77
	shl	BX, 3		;㬭®¦ ¥¬ ­  8
78
	shl	BX, 3		;㬭®¦ ¥¬ ­  8
78
	add	EBX, MConst
79
	add	EBX, MConst
79
	fmul	qword [EBX] ;㬭®¦¨âì ­  ª®­áâ ­âã
80
	fmul	qword [EBX] ;㬭®¦¨âì ­  ª®­áâ ­âã
80
.NoShifts:
81
.NoShifts:
81
	; ˆ§¢«¥çì ç¨á«® ¢ ª®¤¥ BCD
82
	; ˆ§¢«¥çì ç¨á«® ¢ ª®¤¥ BCD
82
	fbstp	[Data_BCD]
83
	fbstp	[Data_BCD]
83
; à®¢¥à¨âì १ã«ìâ â ­  ¯¥à¥¯®«­¥­¨¥
84
; à®¢¥à¨âì १ã«ìâ â ­  ¯¥à¥¯®«­¥­¨¥
84
	mov	AX,word [Data_BCD + 8]
85
	mov	AX,word [Data_BCD + 8]
85
	cmp	AX,0FFFFh  ;"¤¥áïâ¨ç­®¥" ¯¥à¥¯®«­¥­¨¥?
86
	cmp	AX,0FFFFh  ;"¤¥áïâ¨ç­®¥" ¯¥à¥¯®«­¥­¨¥?
86
	je	.Overflow
87
	je	.Overflow
87
; ‚뤥«¨âì §­ ª ç¨á«  ¨ § ¯¨á âì ¥£® ¢ ASCII-ª®¤¥
88
; ‚뤥«¨âì §­ ª ç¨á«  ¨ § ¯¨á âì ¥£® ¢ ASCII-ª®¤¥
88
	mov	AL, byte [Data_BCD + 9]
89
	mov	AL, byte [Data_BCD + 9]
89
	and	AL,AL
90
	and	AL,AL
90
	jz	.NoSign
91
	jz	.NoSign
91
	mov	AL,'-'
92
	mov	AL,'-'
92
	stosb
93
	stosb
93
.NoSign:
94
.NoSign:
94
;  á¯ ª®¢ âì ç¨á«® ¢ ª®¤ ASCII
95
;  á¯ ª®¢ âì ç¨á«® ¢ ª®¤ ASCII
95
	mov	ebx,8	 ;ᬥ饭¨¥ ¯®á«¥¤­¥© ¯ àë æ¨äà
96
	mov	ebx,8	 ;ᬥ饭¨¥ ¯®á«¥¤­¥© ¯ àë æ¨äà
96
	mov	ecx,9	 ;áç¥â稪 ¯ à æ¨äà
97
	mov	ecx,9	 ;áç¥â稪 ¯ à æ¨äà
97
	; Ž¯à¥¤¥«¨âì ¯®§¨æ¨î ¤¥áïâ¨ç­®© â®çª¨ ¢ ç¨á«¥
98
	; Ž¯à¥¤¥«¨âì ¯®§¨æ¨î ¤¥áïâ¨ç­®© â®çª¨ ¢ ç¨á«¥
98
	mov	DX,18
99
	mov	DX,18
99
	sub	DX,[NumberSymbolsAD]
100
	sub	DX,[NumberSymbolsAD]
100
	js	.Error	;®è¨¡ª , ¥á«¨ ®âà¨æ â¥«ì­ ï
101
	js	.Error	;®è¨¡ª , ¥á«¨ ®âà¨æ â¥«ì­ ï
101
	jz	.Error	;¨«¨ ­ã«¥¢ ï ¯®§¨æ¨ï
102
	jz	.Error	;¨«¨ ­ã«¥¢ ï ¯®§¨æ¨ï
102
.NextPair:
103
.NextPair:
103
	; ‡ £à㧨âì ®ç¥à¥¤­ãî ¯ àã à §à冷¢
104
	; ‡ £à㧨âì ®ç¥à¥¤­ãî ¯ àã à §à冷¢
104
	mov	AL, byte [ebx + Data_BCD]
105
	mov	AL, byte [ebx + Data_BCD]
105
	mov	AH,AL
106
	mov	AH,AL
106
	; ‚뤥«¨âì, ¯¥à¥¢¥á⨠¢ ASCII ¨
107
	; ‚뤥«¨âì, ¯¥à¥¢¥á⨠¢ ASCII ¨
107
	; á®åà ­¨âì áâ àèãî â¥âà ¤ã
108
	; á®åà ­¨âì áâ àèãî â¥âà ¤ã
108
	shr	AL,4
109
	shr	AL,4
109
	add	AL,'0'
110
	add	AL,'0'
110
	stosb
111
	stosb
111
	dec	DX
112
	dec	DX
112
	jnz	.N0
113
	jnz	.N0
113
	mov	AL,'.'
114
	mov	AL,'.'
114
	stosb
115
	stosb
115
.N0:   ; ‚뤥«¨âì, ¯¥à¥¢¥á⨠¢ ASCII ¨
116
.N0:   ; ‚뤥«¨âì, ¯¥à¥¢¥á⨠¢ ASCII ¨
116
	; á®åà ­¨âì ¬« ¤èãî â¥âà ¤ã
117
	; á®åà ­¨âì ¬« ¤èãî â¥âà ¤ã
117
	mov	AL,AH
118
	mov	AL,AH
118
	and	AL,0Fh
119
	and	AL,0Fh
119
	add	AL,'0'
120
	add	AL,'0'
120
	stosb
121
	stosb
121
	dec	DX
122
	dec	DX
122
	jnz	.N1
123
	jnz	.N1
123
	mov	AL,'.'
124
	mov	AL,'.'
124
	stosb
125
	stosb
125
.N1:
126
.N1:
126
	dec  BX
127
	dec  BX
127
	loop .NextPair
128
	loop .NextPair
128
	mov  AL,0
129
	mov  AL,0
129
	stosb
130
	stosb
130
 
131
 
131
; “¡à âì ­¥§­ ç é¨¥ ­ã«¨ á«¥¢ 
132
; “¡à âì ­¥§­ ç é¨¥ ­ã«¨ á«¥¢ 
132
	mov	EDI, Data_String
133
	mov	EDI, Data_String
133
	mov	ESI, Data_String
134
	mov	ESI, Data_String
134
	; à®¯ãáâ¨âì §­ ª ç¨á« , ¥á«¨ ®­ ¥áâì
135
	; à®¯ãáâ¨âì §­ ª ç¨á« , ¥á«¨ ®­ ¥áâì
135
	cmp	byte [ESI],'-'
136
	cmp	byte [ESI],'-'
136
	jne	.N2
137
	jne	.N2
137
	inc	ESI
138
	inc	ESI
138
	inc	EDI
139
	inc	EDI
139
.N2:   ; ‡ £à㧨âì ¢ áç¥â稪 横«  ª®«¨ç¥á⢮ à §à冷¢
140
.N2:   ; ‡ £à㧨âì ¢ áç¥â稪 横«  ª®«¨ç¥á⢮ à §à冷¢
140
	; ç¨á«  ¯«îá 1 (¡ ©â ¤¥áïâ¨ç­®© â®çª¨)
141
	; ç¨á«  ¯«îá 1 (¡ ©â ¤¥áïâ¨ç­®© â®çª¨)
141
	mov	ecx,18+1+1
142
	mov	ecx,18+1+1
142
	; à®¯ãáâ¨âì ­¥§­ ç é¨¥ ­ã«¨
143
	; à®¯ãáâ¨âì ­¥§­ ç é¨¥ ­ã«¨
143
.N3:
144
.N3:
144
	cmp byte [ESI],'0'
145
	cmp byte [ESI],'0'
145
	jne .N4
146
	jne .N4
146
	cmp byte [ESI+1],'.'
147
	cmp byte [ESI+1],'.'
147
	je .N4
148
	je .N4
148
	inc ESI
149
	inc ESI
149
	loop .N3
150
	loop .N3
150
	; Žè¨¡ª  - ­¥â §­ ç é¨å æ¨äà
151
	; Žè¨¡ª  - ­¥â §­ ç é¨å æ¨äà
151
	jmp	.Error
152
	jmp	.Error
152
; ‘ª®¯¨à®¢ âì §­ ç éãî ç áâì ç¨á«  ¢ ­ ç «® áâப¨
153
; ‘ª®¯¨à®¢ âì §­ ç éãî ç áâì ç¨á«  ¢ ­ ç «® áâப¨
-
 
154
align 4
153
.N4:	rep movsb
155
.N4:	rep movsb
154
	jmp    .End
156
	jmp    .End
155
 
-
 
156
; Žè¨¡ª 
157
; Žè¨¡ª 
-
 
158
align 4
157
.Error:
159
.Error:
158
	mov	AL,'E'
160
	mov	AL,'E'
159
	stosb
161
	stosb
160
	mov	AL,'R'
162
	mov	AL,'R'
161
	stosb
163
	stosb
162
	mov	AL,'R'
164
	mov	AL,'R'
163
	stosb
165
	stosb
164
	xor	AL,AL
166
	xor	AL,AL
165
	stosb
167
	stosb
166
	jmp	.End
168
	jmp	.End
167
; ¥à¥¯®«­¥­¨¥ à §à來®© á¥âª¨
169
; ¥à¥¯®«­¥­¨¥ à §à來®© á¥âª¨
-
 
170
align 4
168
.Overflow:
171
.Overflow:
169
	mov	AL,'#'
172
	mov	AL,'#'
170
	stosb
173
	stosb
171
	xor	AL,AL
174
	xor	AL,AL
172
	stosb
175
	stosb
173
; Š®­¥æ ¯à®æ¥¤ãàë
176
; Š®­¥æ ¯à®æ¥¤ãàë
-
 
177
align 4
174
.End:
178
.End:
175
	popad
179
	popad
176
	ret
180
	ret
177
 
181
 
178
;****************************************************
182
;****************************************************
179
;* …Ž€‡Ž‚€’œ ‘’ŽŠ“ ‚ —ˆ‘‹Ž ‘ ‹€‚€ž™…‰ ‡€Ÿ’Ž‰ *
183
;* …Ž€‡Ž‚€’œ ‘’ŽŠ“ ‚ —ˆ‘‹Ž ‘ ‹€‚€ž™…‰ ‡€Ÿ’Ž‰ *
180
;*      (ç¨á«® ¨¬¥¥â ®¡ëç­ë©, "¡ë⮢®©" ä®à¬ â)     *
184
;*      (ç¨á«® ¨¬¥¥â ®¡ëç­ë©, "¡ë⮢®©" ä®à¬ â)     *
181
;* ‚室­ë¥ ¯ à ¬¥âàë:                               *
185
;* ‚室­ë¥ ¯ à ¬¥âàë:                               *
182
;* Data_String - ç¨á«® ¢ ª®¤¥ ASCII.                *
186
;* Data_String - ç¨á«® ¢ ª®¤¥ ASCII.                *
183
;* ‚ë室­ë¥ ¯ à ¬¥âàë:                              *
187
;* ‚ë室­ë¥ ¯ à ¬¥âàë:                              *
184
;* Data_Double - ç¨á«® ¢ ¤¢®¨ç­®¬ ª®¤¥.             *
188
;* Data_Double - ç¨á«® ¢ ¤¢®¨ç­®¬ ª®¤¥.             *
185
;****************************************************
189
;****************************************************
-
 
190
align 4
186
String_to_DoubleFloat:
191
String_to_DoubleFloat:
187
	pushad
192
	pushad
188
	cld
193
	cld
189
	; Žç¨é ¥¬ Data_BCD 
194
	; Žç¨é ¥¬ Data_BCD 
190
	mov dword [Data_BCD],0
195
	mov dword [Data_BCD],0
191
	mov dword [Data_BCD+4],0
196
	mov dword [Data_BCD+4],0
192
	mov  word [Data_BCD+8],0
197
	mov  word [Data_BCD+8],0
193
	; Žç¨é ¥¬ ¡ ©â §­ ª 
198
	; Žç¨é ¥¬ ¡ ©â §­ ª 
194
	mov	[Data_Sign],0
199
	mov	[Data_Sign],0
195
	; ‡ ­®á¨¬ ¢ SI 㪠§ â¥«ì ­  áâபã
200
	; ‡ ­®á¨¬ ¢ SI 㪠§ â¥«ì ­  áâபã
196
	mov	ESI, Data_String
201
	mov	ESI, Data_String
197
	; à®¯ã᪠¥¬ ¯à®¡¥«ë ¯¥à¥¤ ç¨á«®¬
202
	; à®¯ã᪠¥¬ ¯à®¡¥«ë ¯¥à¥¤ ç¨á«®¬
198
	mov	ecx,64 ;§ é¨â  ®â § æ¨ª«¨¢ ­¨ï
203
	mov	ecx,64 ;§ é¨â  ®â § æ¨ª«¨¢ ­¨ï
199
.ShiftIgnore:
204
.ShiftIgnore:
200
	lodsb
205
	lodsb
201
	cmp	AL,' '
206
	cmp	AL,' '
202
	jne	.ShiftIgnoreEnd
207
	jne	.ShiftIgnoreEnd
203
	loop	.ShiftIgnore
208
	loop	.ShiftIgnore
204
	jmp	.Error
209
	jmp	.Error
-
 
210
align 4
205
.ShiftIgnoreEnd:
211
.ShiftIgnoreEnd:
206
	; à®¢¥à塞 §­ ª ç¨á« 
212
	; à®¢¥à塞 §­ ª ç¨á« 
207
	cmp	AL,'-'
213
	cmp	AL,'-'
208
	jne	.Positive
214
	jne	.Positive
209
	mov	[Data_Sign],80h
215
	mov	[Data_Sign],80h
210
	lodsb
216
	lodsb
211
.Positive:
217
.Positive:
212
	mov	[Data_Flag],0 ;¯à¨§­ ª ­ «¨ç¨ï â®çª¨
218
	mov	[Data_Flag],0 ;¯à¨§­ ª ­ «¨ç¨ï â®çª¨
213
	mov	DX,0	      ;¯®§¨æ¨ï â®çª¨
219
	mov	DX,0	      ;¯®§¨æ¨ï â®çª¨
214
	mov	ecx,18	      ;¬ ªá. ç¨á«® à §à冷¢
220
	mov	ecx,18	      ;¬ ªá. ç¨á«® à §à冷¢
215
.ASCIItoBCDConversion:
221
.ASCIItoBCDConversion:
216
	cmp	AL,'.'	      ;â®çª ?
222
	cmp	AL,'.'	      ;â®çª ?
217
	jne	.NotDot
223
	jne	.NotDot
218
	cmp	[Data_Flag],0 ;â®çª  ­¥ ¢áâà¥ç « áì?
224
	cmp	[Data_Flag],0 ;â®çª  ­¥ ¢áâà¥ç « áì?
219
	jne	.Error
225
	jne	.Error
220
	mov	[Data_Flag],1
226
	mov	[Data_Flag],1
221
	lodsb
227
	lodsb
222
	cmp	AL,0	      ;ª®­¥æ áâப¨?
228
	cmp	AL,0	      ;ª®­¥æ áâப¨?
223
	jne	.NotDot
229
	jne	.NotDot
224
	jmp	.ASCIItoBCDConversionEnd
230
	jmp	.ASCIItoBCDConversionEnd
-
 
231
align 4
225
.NotDot:
232
.NotDot:
226
	; “¢¥«¨ç¨âì ­  1 §­ ç¥­¨¥ ¯®§¨æ¨¨ â®çª¨,
233
	; “¢¥«¨ç¨âì ­  1 §­ ç¥­¨¥ ¯®§¨æ¨¨ â®çª¨,
227
	; ¥á«¨ ®­  ¥é¥ ­¥ ¢áâà¥ç « áì
234
	; ¥á«¨ ®­  ¥é¥ ­¥ ¢áâà¥ç « áì
228
	cmp	[Data_Flag],0
235
	cmp	[Data_Flag],0
229
	jnz	.Figures
236
	jnz	.Figures
230
	inc	DX
237
	inc	DX
231
.Figures:
238
.Figures:
232
	; ‘¨¬¢®«ë ç¨á«  ¤®«¦­ë ¡ëâì æ¨äà ¬¨
239
	; ‘¨¬¢®«ë ç¨á«  ¤®«¦­ë ¡ëâì æ¨äà ¬¨
233
	cmp	AL,'0'
240
	cmp	AL,'0'
234
	jb	.Error
241
	jb	.Error
235
	cmp	AL,'9'
242
	cmp	AL,'9'
236
	ja	.Error
243
	ja	.Error
237
	; ¨è¥¬ ®ç¥à¥¤­ãî æ¨äàã ¢ ¬« ¤èãî â¥âà ¤ã BCD
244
	; ¨è¥¬ ®ç¥à¥¤­ãî æ¨äàã ¢ ¬« ¤èãî â¥âà ¤ã BCD
238
	and	AL,0Fh
245
	and	AL,0Fh
239
	or	byte [Data_BCD],AL
246
	or	byte [Data_BCD],AL
240
	; à®¢¥àª  ­  ª®­¥æ áâப¨
247
	; à®¢¥àª  ­  ª®­¥æ áâப¨
241
	cmp	byte [ESI],0
248
	cmp	byte [ESI],0
242
	je	.ASCIItoBCDConversionEnd
249
	je	.ASCIItoBCDConversionEnd
243
	; ‘¤¢¨£ ¥¬ BCD ­  4 à §à鸞 ¢«¥¢®
250
	; ‘¤¢¨£ ¥¬ BCD ­  4 à §à鸞 ¢«¥¢®
244
	; (ᤢ¨£ ¥¬ áâ à訥 2 ¡ ©â )
251
	; (ᤢ¨£ ¥¬ áâ à訥 2 ¡ ©â )
245
	mov	AX,word [Data_BCD+6]
252
	mov	AX,word [Data_BCD+6]
246
	shld	word [Data_BCD+8],AX,4
253
	shld	word [Data_BCD+8],AX,4
247
	; (ᤢ¨£ ¥¬ á।­¨¥ 4 ¡ ©â )
254
	; (ᤢ¨£ ¥¬ á।­¨¥ 4 ¡ ©â )
248
	mov	EAX, dword [Data_BCD]
255
	mov	EAX, dword [Data_BCD]
249
	shld	dword [Data_BCD+4],EAX,4
256
	shld	dword [Data_BCD+4],EAX,4
250
	; (ᤢ¨£ ¥¬ ¬« ¤è¨¥ 4 ¡ ©â )
257
	; (ᤢ¨£ ¥¬ ¬« ¤è¨¥ 4 ¡ ©â )
251
	shl	dword [Data_BCD],4
258
	shl	dword [Data_BCD],4
252
	; ‡ £à㦠¥¬ á«¥¤ãî騩 ᨬ¢®« ¢ AL
259
	; ‡ £à㦠¥¬ á«¥¤ãî騩 ᨬ¢®« ¢ AL
253
	lodsb
260
	lodsb
254
	loop	.ASCIItoBCDConversion
261
	loop	.ASCIItoBCDConversion
255
	; …᫨ 19-© ᨬ¢®« ­¥ 0 ¨ ­¥ â®çª ,
262
	; …᫨ 19-© ᨬ¢®« ­¥ 0 ¨ ­¥ â®çª ,
256
	; â® ®è¨¡ª  ¯¥à¥¯®«­¥­¨ï
263
	; â® ®è¨¡ª  ¯¥à¥¯®«­¥­¨ï
257
	cmp	AL,'.'
264
	cmp	AL,'.'
258
	jne	.NotDot2
265
	jne	.NotDot2
259
	inc	ecx
266
	inc	ecx
260
	lodsb
267
	lodsb
261
.NotDot2:
268
.NotDot2:
262
	cmp	AL,0
269
	cmp	AL,0
263
	jne	.Error ;¯¥à¥¯®«­¥­¨¥ à §à來®© á¥âª¨
270
	jne	.Error ;¯¥à¥¯®«­¥­¨¥ à §à來®© á¥âª¨
264
 
271
 
265
; …Ž€‡Ž‚€’œ —ˆ‘‹Ž ˆ‡ ŠŽ„€ BCD ‚ ‚…™…‘’‚…Ž… —ˆ‘‹Ž
272
; …Ž€‡Ž‚€’œ —ˆ‘‹Ž ˆ‡ ŠŽ„€ BCD ‚ ‚…™…‘’‚…Ž… —ˆ‘‹Ž
266
.ASCIItoBCDConversionEnd:
273
.ASCIItoBCDConversionEnd:
267
	; ‚¯¨á âì §­ ª ¢ áâ à訩 ¡ ©â
274
	; ‚¯¨á âì §­ ª ¢ áâ à訩 ¡ ©â
268
	mov	AL,[Data_Sign]
275
	mov	AL,[Data_Sign]
269
	mov	byte [Data_BCD+9],AL
276
	mov	byte [Data_BCD+9],AL
270
	; ‘¡à®á¨âì ॣ¨áâàë ᮯà®æ¥áá®à 
277
	; ‘¡à®á¨âì ॣ¨áâàë ᮯà®æ¥áá®à 
271
	fninit
278
	fninit
272
	; ‡ £à㧨âì ¢ ᮯà®æ¥áá®à ç¨á«® ¢ BCD-ä®à¬ â¥
279
	; ‡ £à㧨âì ¢ ᮯà®æ¥áá®à ç¨á«® ¢ BCD-ä®à¬ â¥
273
	fbld	[Data_BCD]
280
	fbld	[Data_BCD]
274
	; ‚ëç¨á«¨âì ­®¬¥à ¤¥«¨â¥«ï
281
	; ‚ëç¨á«¨âì ­®¬¥à ¤¥«¨â¥«ï
275
	mov	EBX,18+1
282
	mov	EBX,18+1
276
	sub	BX,CX
283
	sub	BX,CX
277
	sub	BX,DX
284
	sub	BX,DX
278
	cmp	EBX,0
285
	cmp	EBX,0
279
	je	.NoDiv
286
	je	.NoDiv
280
	dec	EBX
287
	dec	EBX
281
	shl	EBX,3		;㬭®¦ ¥¬ ­  8
288
	shl	EBX,3		;㬭®¦ ¥¬ ­  8
282
	add	EBX, MConst
289
	add	EBX, MConst
283
	fdiv	qword [EBX] ;à §¤¥«¨âì ­  ª®­áâ ­âã
290
	fdiv	qword [EBX] ;à §¤¥«¨âì ­  ª®­áâ ­âã
284
.NoDiv:; ‚ë£à㧨âì ç¨á«® ¢ ¤¢®¨ç­®¬ ä®à¬ â¥
291
.NoDiv:; ‚ë£à㧨âì ç¨á«® ¢ ¤¢®¨ç­®¬ ä®à¬ â¥
285
	fstp	[Data_Double]
292
	fstp	[Data_Double]
286
	jmp	.End
293
	jmp	.End
287
 
294
align 4
288
.Error:; à¨ «î¡®© ®è¨¡ª¥ ®¡­ã«¨âì १ã«ìâ â
295
.Error:; à¨ «î¡®© ®è¨¡ª¥ ®¡­ã«¨âì १ã«ìâ â
289
	fldz	;§ ­¥á⨠­®«ì á á⥪ ᮯà®æ¥áá®à 
296
	fldz	;§ ­¥á⨠­®«ì á á⥪ ᮯà®æ¥áá®à 
290
	fstp	[Data_Double]
297
	fstp	[Data_Double]
291
.End:
298
.End:
292
	popad
299
	popad
293
	ret
300
	ret
294
 
301
 
295
align 4
302
align 4
296
proc str_cat, str1:dword, str2:dword
303
proc str_cat uses eax ecx edi esi, str1:dword, str2:dword
297
	push eax ecx edi esi
-
 
298
	mov esi,dword[str2]
304
	mov esi,dword[str2]
299
	stdcall str_len,esi
305
	stdcall str_len,esi
300
	mov ecx,eax
306
	mov ecx,eax
301
	inc ecx
307
	inc ecx
302
	mov edi,dword[str1]
308
	mov edi,dword[str1]
303
	stdcall str_len,edi
309
	stdcall str_len,edi
304
	add edi,eax
310
	add edi,eax
305
	cld
311
	cld
306
	repne movsb
312
	repne movsb
307
	pop esi edi ecx eax
-
 
308
	ret
313
	ret
309
endp
314
endp
310
 
315
 
311
;output:
316
;output:
312
; eax = strlen
317
; eax = strlen
313
align 4
318
align 4
314
proc str_len, str1:dword
319
proc str_len, str1:dword
315
	mov eax,[str1]
320
	mov eax,[str1]
316
	@@:
321
	@@:
317
		cmp byte[eax],0
322
		cmp byte[eax],0
318
		je @f
323
		je @f
319
		inc eax
324
		inc eax
320
		jmp @b
325
		jmp @b
321
	@@:
326
	@@:
322
	sub eax,[str1]
327
	sub eax,[str1]
323
	ret
328
	ret
-
 
329
endp
-
 
330
 
-
 
331
align 4
-
 
332
proc String_crop_0 uses eax ebx ecx edi
-
 
333
	mov edi,Data_String
-
 
334
	mov al,'.'
-
 
335
	mov ecx,32
-
 
336
	repne scasb
-
 
337
	mov ebx,edi
-
 
338
	mov edi,Data_String
-
 
339
	xor al,al
-
 
340
	mov ecx,32
-
 
341
	repne scasb
-
 
342
	cmp ebx,edi
-
 
343
	jg .end_f
-
 
344
	dec edi
-
 
345
	.cycle0:
-
 
346
		dec edi
-
 
347
		cmp edi,Data_String
-
 
348
		jle .end_f
-
 
349
		cmp byte[edi],'0'
-
 
350
		jne .cycle0end
-
 
351
		mov byte[edi],0
-
 
352
		jmp .cycle0
-
 
353
	.cycle0end:
-
 
354
	cmp byte[edi],'.'
-
 
355
	jne .end_f
-
 
356
		mov byte[edi],0
-
 
357
	.end_f:
-
 
358
	ret
324
endp
359
endp
325
360