Subversion Repositories Kolibri OS

Rev

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

Rev 205 Rev 223
1
;--------------------------------------------------------------------
1
;--------------------------------------------------------------------
2
; Çàãðóçêà ïðîöåññîðà
2
; Çàãðóçêà ïðîöåññîðà
3
; OUT : AL - çàãðóçêà â ïðîöåíòàõ
3
; OUT : AL - çàãðóçêà â ïðîöåíòàõ
4
cpu_usage:
4
cpu_usage:
5
	pusha
5
	pusha
6
	mov	byte [c_u_t], 0
6
	mov	byte [c_u_t], 0
7
	mov	eax, 18		; TSC / SEC
7
	mov	eax, 18		; TSC / SEC
8
	mov	ebx, 5
8
	mov	ebx, 5
9
	int	0x40
9
	int	0x40
10
	shr	eax, 20
10
	shr	eax, 20
11
	push	eax
11
	push	eax
12
 
12
 
13
	mov	eax, 18		; IDLE / SEC
13
	mov	eax, 18		; IDLE / SEC
14
	mov	ebx, 4
14
	mov	ebx, 4
15
	int	0x40		; eax - ïóñòûõ öèêëîâ â ñåêóíäó
15
	int	0x40		; eax - ïóñòûõ öèêëîâ â ñåêóíäó
16
	shr	eax, 20		; eax = IDLE / 1048576
16
	shr	eax, 20		; eax = IDLE / 1048576
17
	pop	ebx
17
	pop	ebx
18
	cmp	eax, ebx	; BUG : time to time ICPS > TSCPS
18
	cmp	eax, ebx	; BUG : time to time ICPS > TSCPS
19
	jnl	c_u_o
19
	jnl	c_u_o
20
	push	ebx
20
	push	ebx
21
	xor	edx, edx
21
	xor	edx, edx
22
	mov	ebx, 100
22
	mov	ebx, 100
23
	mul	ebx		; eax =(IDLE / 1048576) * 100
23
	mul	ebx		; eax =(IDLE / 1048576) * 100
24
 
24
 
25
	xor	edx, edx
25
	xor	edx, edx
26
	pop	ebx		; ebx = (TSC/1048576)+1
26
	pop	ebx		; ebx = (TSC/1048576)+1
27
	inc	ebx
27
	inc	ebx
28
	div	ebx		; eax = ((IDLE / 1048576) * 100) / ((TSC/1048576)+1)
28
	div	ebx		; eax = ((IDLE / 1048576) * 100) / ((TSC/1048576)+1)
29
 
29
 
30
	mov	bl, 100
30
	mov	bl, 100
31
	sub	bl, al
31
	sub	bl, al
32
	cmp	bl, 101
32
	cmp	bl, 101
33
	jnl	c_u_o
33
	jnl	c_u_o
34
	mov	[c_u_t], bl
34
	mov	[c_u_t], bl
35
 
35
 
36
c_u_o:	popa
36
c_u_o:	popa
37
	mov	al, [c_u_t]
37
	mov	al, [c_u_t]
38
	ret
38
	ret
39
uglobal
39
uglobal
40
	c_u_t:	db	0
40
	c_u_t:	db	0
41
endg
41
endg
42
;--------------------------------------------------------------------
42
;--------------------------------------------------------------------
43
mem_usage:
43
mem_usage:
44
; Èñïðîëüçîâàíèå ïàìÿòè
44
; Èñïðîëüçîâàíèå ïàìÿòè
45
; OUT : al - ïðîöåòí èñïðîëüçóåìîé ïàìÿòè
45
; OUT : al - ïðîöåòí èñïðîëüçóåìîé ïàìÿòè
46
display nl, 'Memory usage : '
46
display nl, 'Memory usage : '
47
if (OS_version >= 0x0530)
47
if (OS_version >= 0x0530)
48
	display 'yes'
48
	display 'yes'
49
	pusha
49
	pusha
50
	mov	byte [m_u_t], 0
50
	mov	byte [m_u_t], 0
51
 
51
 
52
	mov	eax, 18		; full mem
52
	mov	eax, 18		; full mem
53
	mov	ebx, 17
53
	mov	ebx, 17
54
	int	0x40
54
	int	0x40
55
	shr	eax, 10
55
	shr	eax, 10
56
	push	eax
56
	push	eax
57
 
57
 
58
	mov	eax, 18		; free mem
58
	mov	eax, 18		; free mem
59
	mov	ebx, 16
59
	mov	ebx, 16
60
	int	0x40		; eax - free mem
60
	int	0x40		; eax - free mem
61
	shr	eax, 10		; eax = fmem / 1024
61
	shr	eax, 10		; eax = fmem / 1024
62
	xor	edx, edx
62
	xor	edx, edx
63
	mov	ebx, 100
63
	mov	ebx, 100
64
	mul	ebx		; eax =(free mem / 1024) * 100
64
	mul	ebx		; eax =(free mem / 1024) * 100
65
 
65
 
66
	xor	edx, edx
66
	xor	edx, edx
67
	pop	ebx		; ebx = (full mem/1024)+1
67
	pop	ebx		; ebx = (full mem/1024)+1
68
	inc	ebx
68
	inc	ebx
69
	div	ebx		; eax = ((free mem / 1024) * 100) / ((full mem/1024)+1)
69
	div	ebx		; eax = ((free mem / 1024) * 100) / ((full mem/1024)+1)
70
 
70
 
71
	mov	bl, 100
71
	mov	bl, 100
72
	sub	bl, al
72
	sub	bl, al
73
	cmp	bl, 101
73
	cmp	bl, 101
74
	jnb	m_u_o
74
	jnb	m_u_o
75
	mov	[m_u_t], bl
75
	mov	[m_u_t], bl
76
 
76
 
77
m_u_o:	popa
77
m_u_o:	popa
78
	mov	al, [m_u_t]
78
	mov	al, [m_u_t]
79
	ret
79
	ret
80
uglobal
80
uglobal
81
	m_u_t:	db	0
81
	m_u_t:	db	0
82
endg
82
endg
83
else
83
else
84
	display 'no'
84
	display 'no'
85
	xor	eax, eax
85
	xor	eax, eax
86
	ret
86
	ret
87
end if
87
end if
88
 
88
 
89
;#######################################################################
89
;#######################################################################
90
stop_test:
90
stop_test:
91
	; ïîðòÿòñÿ ðåãèñòðû
91
	; ïîðòÿòñÿ ðåãèñòðû
92
	display nl, 'Kill process type : '
92
	display nl, 'Kill process type : '
93
if (OS_version < 0x0400)
93
if (OS_version < 0x0400)
94
	; êîä äëÿ Menuet
94
	; êîä äëÿ Menuet
95
	display 'Menuet'
95
	display 'Menuet'
96
	mov	eax, 18
96
	mov	eax, 18
97
	mov	ebx, 2
97
	mov	ebx, 2
98
	mov	ecx, [test_pid]
98
	mov	ecx, [test_pid]
99
	int	0x40
99
	int	0x40
100
	mov	byte[test_id], 0
100
	mov	byte[test_id], 0
101
	ret
101
	ret
102
	; -------------------------------
102
	; -------------------------------
103
else if (OS_version >= 0x0400)
103
else if (OS_version >= 0x0400)
104
if (OS_version < 0x0580)
104
if (OS_version < 0x0580)
105
	display 'old Kolibri'
105
	display 'old Kolibri'
106
	; -- ñëåäóéøèé êîä óáèâàåò ïðîöåññ â Kolibri 4 è ñòàðøå
106
	; -- ñëåäóéøèé êîä óáèâàåò ïðîöåññ â Kolibri 4 è ñòàðøå
107
	mov	ebx, Buf
107
	mov	ebx, Buf
108
	xor	ecx, ecx
108
	xor	ecx, ecx
109
find_th:mov	eax, 9
109
find_th:mov	eax, 9
110
	int	0x40
110
	int	0x40
111
	mov	edx, dword [Buf + 30]
111
	mov	edx, dword [Buf + 30]
112
	cmp	edx, dword [test_pid]
112
	cmp	edx, dword [test_pid]
113
	je	kill_t
113
	je	kill_t
114
	inc	ecx
114
	inc	ecx
115
	cmp	ecx, eax		; eax - êîëè÷åñòâî ïðîöåññîâ
115
	cmp	ecx, eax		; eax - êîëè÷åñòâî ïðîöåññîâ
116
	jle	find_th
116
	jle	find_th
117
	jmp	cl_tinf			; ÎØÈÁÊÀ !!!! ïîòîê íå íàéäåí !!!!
117
	jmp	cl_tinf			; ÎØÈÁÊÀ !!!! ïîòîê íå íàéäåí !!!!
118
kill_t:	mov	ebx, 2			; óáèâàåì òåñòîâûé ïîòîê
118
kill_t:	mov	ebx, 2			; óáèâàåì òåñòîâûé ïîòîê
119
	mov	eax, 18
119
	mov	eax, 18
120
	int	0x40
120
	int	0x40
121
cl_tinf:
121
cl_tinf:
122
	mov	byte[test_id], 0
122
	mov	byte[test_id], 0
123
	ret
123
	ret
124
	uglobal
124
	uglobal
125
	Buf:		times	1024 db ?	; Áóôåð äëÿ íàõîæäåíèÿ PID`à çàïóùåííîãî òåñòà
125
	Buf:		times	1024 db ?	; Áóôåð äëÿ íàõîæäåíèÿ PID`à çàïóùåííîãî òåñòà
126
	endg
126
	endg
127
else
127
else
128
	; -------------------------------
128
	; -------------------------------
129
	; êîä äëÿ Kolibri 0.5.8.0 è ñòàðøå
129
	; êîä äëÿ Kolibri 0.5.8.0 è ñòàðøå
130
	display 'Kolibri 0.5.8.0'
130
	display 'Kolibri 0.5.8.0'
131
	mov	eax, 18
131
	mov	eax, 18
132
	mov	ebx, 18
132
	mov	ebx, 18
133
	mov	ecx, [test_pid]
133
	mov	ecx, [test_pid]
134
	int	0x40
134
	int	0x40
135
	mov	byte [test_id], 0
135
	mov	byte [test_id], 0
136
	ret
136
	ret
137
	; -------------------------------
137
	; -------------------------------
138
end if
138
end if
139
end if
139
end if
140
;#######################################################################
140
;#######################################################################
141
 
141
 
142
; Âûâîäèò ñòðîêè òåêñòà
142
; Âûâîäèò ñòðîêè òåêñòà
143
; in : edx - óêàçàòåëü íà mls
143
; in : edx - óêàçàòåëü íà mls
144
;      ebx - êîîðäèíàòû : X << 16 + Y
144
;      ebx - êîîðäèíàòû : X << 16 + Y
145
show_text:
145
show_text:
146
	mov	eax, 4
146
	mov	eax, 4
147
	mov	ecx, 0x10000000
147
	mov	ecx, 0x10000000
148
@@:
148
@@:
149
	movzx	esi, byte[edx]
149
	movzx	esi, byte[edx]
150
	inc	edx
150
	inc	edx
151
	int	0x40
151
	int	0x40
152
	add	ebx, 10
152
	add	ebx, 10
153
	add	edx, esi
153
	add	edx, esi
154
	cmp	byte[edx], -1
154
	cmp	byte[edx], -1
155
	jne	@b
155
	jne	@b
156
	ret
156
	ret
157
;---------------------------------------------------------------------	
157
;---------------------------------------------------------------------	
158
multiplier:
158
multiplier:
159
;--- âû÷èñëåíèå êîýôôèöèåíòà óìíîæåíèÿ -
159
;--- âû÷èñëåíèå êîýôôèöèåíòà óìíîæåíèÿ -
160
; ïîðòèò ðåãèñòðû
160
; ïîðòèò ðåãèñòðû
161
; out : CL = êîýôô.óìíîæåíèÿ * 10, èëè 0
161
; out : CL = êîýôô.óìíîæåíèÿ * 10, èëè 0
162
	xor	ecx, ecx
162
	xor	ecx, ecx
163
if (OS_version >= 0x0510)
163
if (OS_version >= 0x0510)
164
	display nl, 'Multiplier : yes'
164
	display nl, 'Multiplier (RDMSR) : yes'
165
	cmp	dword [Vendor + 8], 'cAMD'	; Check for Advanced Micro Devices CPU
165
	cmp	dword [Vendor + 8], 'cAMD'	; Check for Advanced Micro Devices CPU
166
	jne	noAMD
166
	jne	noAMD
167
	cmp	byte [CPU_fam], 5
167
	cmp	byte [CPU_fam], 5
168
	jne	noAMDK6
168
	jne	noAMDK6
169
	mov	eax, 68		; AMD-K6 (p.30)
169
	mov	eax, 68		; AMD-K6 (p.30)
170
	mov	ebx, 3
170
	mov	ebx, 3
171
	mov	edx, 0x0C0000087
171
	mov	edx, 0x0C0000087
172
	int	0x40		; eax - low dword
172
	int	0x40		; eax - low dword
173
	and	eax, 111b
173
	and	eax, 111b
174
	mov	cl, [athloncoef3 + eax]
174
	mov	cl, [athloncoef3 + eax]
175
	cmp	eax, 6
175
	cmp	eax, 6
176
	jne	@f
176
	jne	@f
177
	cmp	byte[CPU_mod], 8
177
	cmp	byte[CPU_mod], 8
178
	jae	@f
178
	jae	@f
179
	mov	cl, 20
179
	mov	cl, 20
180
@@:	ret	
180
@@:	ret	
181
	
181
	
182
noAMDK6:cmp	byte [CPU_fam], 6
182
noAMDK6:cmp	byte [CPU_fam], 6
183
	jne	noAMDK7
183
	jne	noAMDK7
184
	mov	eax, 68		; Athlon/AthlonXP
184
	mov	eax, 68		; Athlon/AthlonXP
185
	mov	ebx, 3
185
	mov	ebx, 3
186
	mov	edx, 0x0C0010015
186
	mov	edx, 0x0C0010015
187
	int	0x40
187
	int	0x40
188
	mov	ebx, eax
188
	mov	ebx, eax
189
	shr	ebx, 24
189
	shr	ebx, 24
190
	and	ebx, 0x0F
190
	and	ebx, 0x0F
191
	shr	eax, 20
191
	shr	eax, 20
192
	jc	@f
192
	jc	@f
193
	mov	cl, [athloncoef + ebx]
193
	mov	cl, [athloncoef + ebx]
194
	ret
194
	ret
195
@@:	mov	cl, [athloncoef2 + ebx]
195
@@:	mov	cl, [athloncoef2 + ebx]
196
	ret
196
	ret
197
	
197
	
198
noAMD:	cmp	dword [Vendor + 8], 'ntel'	; Check for International Electronics CPU
198
noAMD:	cmp	dword [Vendor + 8], 'ntel'	; Check for International Electronics CPU
199
	jne	noIntel
199
	jne	noIntel
200
	cmp	byte[CPU_fam], 0x0F
200
	cmp	byte[CPU_fam], 0x0F
201
	jne	noIntelP4
201
	jne	noIntelP4
202
	cmp	byte [CPU_type], 6
202
	cmp	byte [CPU_type], 6
203
	jne	@f
203
	jne	@f
204
	mov	eax, 68		; Pentium M
204
	mov	eax, 68		; Pentium M
205
	mov	ebx, 3
205
	mov	ebx, 3
206
	mov	edx, 0x2A
206
	mov	edx, 0x2A
207
	int	0x40
207
	int	0x40
208
	shr	eax, 22
208
	shr	eax, 22
209
	and	eax, 0x1F
209
	and	eax, 0x1F
210
	mov	dl, 10
210
	mov	dl, 10
211
	mul	dl
211
	mul	dl
212
	mov	cl, al
212
	mov	cl, al
213
	ret
213
	ret
214
@@:	cmp	byte [CPU_mod], 2
214
@@:	cmp	byte [CPU_mod], 2
215
	jae	@f
215
	jae	@f
216
	mov	eax, 68		; Pentium 4 / Xeon (model < 2)
216
	mov	eax, 68		; Pentium 4 / Xeon (model < 2)
217
	mov	ebx, 3
217
	mov	ebx, 3
218
	mov	edx, 0x2A
218
	mov	edx, 0x2A
219
	int	0x40
219
	int	0x40
220
	shr	eax, 8
220
	shr	eax, 8
221
	and	eax, 0x0F
221
	and	eax, 0x0F
222
	mov	cl, [p4coef + eax]
222
	mov	cl, [p4coef + eax]
223
	ret
223
	ret
224
@@:	mov	eax, 68		; Pentium 4 / Xeon (model >= 2)
224
@@:	mov	eax, 68		; Pentium 4 / Xeon (model >= 2)
225
	mov	ebx, 3
225
	mov	ebx, 3
226
	mov	edx, 0x2C
226
	mov	edx, 0x2C
227
	int	0x40
227
	int	0x40
228
	
228
	
229
	; shr	eax, 24
229
	; shr	eax, 24
230
	; and	eax, 0x1F
230
	; and	eax, 0x1F
231
	shr	eax, 27
231
	shr	eax, 27
232
	and	al, 0Fh
232
	and	al, 0Fh
233
	add	al, 8
233
	add	al, 8
234
	
234
	
235
	mov	dl, 10
235
	mov	dl, 10
236
	mul	dl
236
	mul	dl
237
	mov	cl, al
237
	mov	cl, al
238
	ret	
238
	ret	
239
noIntelP4:
239
noIntelP4:
240
	cmp	byte[CPU_fam], 6
240
	cmp	byte[CPU_fam], 6
241
	jne	noIntelP6
241
	jne	noIntelP6
242
	mov	eax, 68		; Pentium Pro / Pentium II / Pentium III
242
	mov	eax, 68		; Pentium Pro / Pentium II / Pentium III
243
	mov	ebx, 3
243
	mov	ebx, 3
244
	mov	edx, 0x2A
244
	mov	edx, 0x2A
245
	int	0x40
245
	int	0x40
246
	shr	eax, 22
246
	shr	eax, 22
247
	test	al, 0x20
247
	test	al, 0x20
248
	jz	@f
248
	jz	@f
249
	or	al, 0x10
249
	or	al, 0x10
250
@@:	and	eax, 0x1f
250
@@:	and	eax, 0x1f
251
 
251
 
252
	cmp	byte[CPU_mod], 0x06 ; ? 7
252
	cmp	byte[CPU_mod], 0x06 ; ? 7
253
	ja	@f
253
	ja	@f
254
	and	al, 0x0f
254
	and	al, 0x0f
255
@@:
255
@@:
256
	mov	cl, [coppercoeff + eax]
256
	mov	cl, [coppercoeff + eax]
257
	cmp	byte[CPU_mod], 0x0B
257
	cmp	byte[CPU_mod], 0x0B
258
	jb	@f
258
	jb	@f
259
	mov	cl, [tualatcoeff + eax]
259
	mov	cl, [tualatcoeff + eax]
260
@@:	ret
260
@@:	ret
261
 
261
 
262
noIntel:
262
noIntel:
263
noIntelP6:
263
noIntelP6:
264
noAMDK7:
264
noAMDK7:
265
	ret
265
	ret
266
 
266
 
267
athloncoef	db	110, 115, 120, 125, 50, 55, 60, 65, 70, 75, 80, 85, 90, 95, 100, 105
267
athloncoef	db	110, 115, 120, 125, 50, 55, 60, 65, 70, 75, 80, 85, 90, 95, 100, 105
268
athloncoef2	db	120, 190, 120, 200, 130, 135, 140, 210, 150, 220, 160, 165, 170, 180, 230, 240
268
athloncoef2	db	120, 190, 120, 200, 130, 135, 140, 210, 150, 220, 160, 165, 170, 180, 230, 240
269
athloncoef3	db	45, 50, 40, 55, 25, 30, 60, 35
269
athloncoef3	db	45, 50, 40, 55, 25, 30, 60, 35
270
p4coef		db	160, 170, 180, 190, 200, 210, 220, 230, 80, 90, 100, 110, 120, 130, 140, 150	; Pentium 4
270
p4coef		db	160, 170, 180, 190, 200, 210, 220, 230, 80, 90, 100, 110, 120, 130, 140, 150	; Pentium 4
271
coppercoeff	db	 50, 30, 40, 20, 55, 35,  45, 25,  35, 70, 80, 60, 20, 75, 15, 65, 90, 110, 120, 20, 95, 115, 85, 25, 35, 70,  80, 100,  20, 75,  15, 105
271
coppercoeff	db	 50, 30, 40, 20, 55, 35,  45, 25,  35, 70, 80, 60, 20, 75, 15, 65, 90, 110, 120, 20, 95, 115, 85, 25, 35, 70,  80, 100,  20, 75,  15, 105
272
tualatcoeff	db	120, 35, 35, 40, 55, 35, 115, 35, 160, 70, 80, 60, 40, 75, 35, 65, 90, 110,  35, 35, 95,  35, 85, 35, 35, 35, 130, 100, 140, 35, 150, 105
272
tualatcoeff	db	120, 35, 35, 40, 55, 35, 115, 35, 160, 70, 80, 60, 40, 75, 35, 65, 90, 110,  35, 35, 95,  35, 85, 35, 35, 35, 130, 100, 140, 35, 150, 105
273
else
273
else
274
	display nl, 'Multiplier : no'
274
	display nl, 'Multiplier : no'
275
	ret
275
	ret
276
end if
276
end if
277
;---------------------------------------------------------------------
277
;---------------------------------------------------------------------
278
digit_len:
278
digit_len:
279
	; Âû÷èñëåíèå äëèííû ÷èñëà äëÿ ôóíê. 47
279
	; Âû÷èñëåíèå äëèííû ÷èñëà äëÿ ôóíê. 47
280
	; ecx - ÷èñëî
280
	; ecx - ÷èñëî
281
	; ebx - äëèííà * 65536
281
	; ebx - äëèííà * 65536
282
	pusha
282
	pusha
283
	xor	ebx, ebx
283
	xor	ebx, ebx
284
	mov	eax, ecx
284
	mov	eax, ecx
285
	mov	esi, 10
285
	mov	esi, 10
286
@@:	xor	edx, edx
286
@@:	xor	edx, edx
287
	inc	ebx
287
	inc	ebx
288
	div	esi
288
	div	esi
289
	test	eax, eax
289
	test	eax, eax
290
	jnz	@b
290
	jnz	@b
291
	mov	[tdl], ebx
291
	mov	[tdl], ebx
292
	popa
292
	popa
293
	mov	ebx, [tdl]
293
	mov	ebx, [tdl]
294
	shl	ebx, 16
294
	shl	ebx, 16
295
	ret
295
	ret
296
uglobal
296
uglobal
297
	tdl	dd	0
297
	tdl	dd	0
298
endg
298
endg
299
 
299
 
300
 
300
 
301
;--------------------------------------------------------------------
301
;--------------------------------------------------------------------
302
ftoa:
302
ftoa:
303
; esi - ïðåîáðàçóåìîå ÷èñëî;
303
; esi - ïðåîáðàçóåìîå ÷èñëî;
304
; Data_String - ñòðîêà-ðåçóëüòàò.
304
; Data_String - ñòðîêà-ðåçóëüòàò.
305
 
305
 
306
	pusha
306
	pusha
307
	mov     edi, Data_String
307
	mov     edi, Data_String
308
	fninit
308
	fninit
309
	fld	dword [esi]
309
	fld	dword [esi]
310
	fmul	dword [MConst]
310
	fmul	dword [MConst]
311
	fbstp	[Data_BCD]
311
	fbstp	[Data_BCD]
312
	mov	ax, word[Data_BCD + 8]
312
	mov	ax, word[Data_BCD + 8]
313
	cmp	ax, 0xFFFF
313
	cmp	ax, 0xFFFF
314
	je      @@Overflow
314
	je      @@Overflow
315
	mov	al, byte[Data_BCD + 9]
315
	mov	al, byte[Data_BCD + 9]
316
	and	al, al
316
	and	al, al
317
	jz	@@NoSign
317
	jz	@@NoSign
318
	mov	AL,'-'
318
	mov	AL,'-'
319
	stosb
319
	stosb
320
@@NoSign:
320
@@NoSign:
321
	mov	ebx, 8
321
	mov	ebx, 8
322
	mov	ecx, 9
322
	mov	ecx, 9
323
	mov     edx, 18 - 2	; 2 çíàêà ïîñëå çàïÿòîé
323
	mov     edx, 18 - 2	; 2 çíàêà ïîñëå çàïÿòîé
324
@@NextPair:
324
@@NextPair:
325
	mov     al, byte[Data_BCD + ebx]
325
	mov     al, byte[Data_BCD + ebx]
326
	mov     AH,AL
326
	mov     AH,AL
327
	shr     AL,4
327
	shr     AL,4
328
	add     AL,'0'
328
	add     AL,'0'
329
	stosb
329
	stosb
330
	dec     edx
330
	dec     edx
331
	jnz     @@N0
331
	jnz     @@N0
332
	mov     AL,'.'
332
	mov     AL,'.'
333
	stosb
333
	stosb
334
@@N0:	mov     AL,AH
334
@@N0:	mov     AL,AH
335
	and     AL,0Fh
335
	and     AL,0Fh
336
	add     AL,'0'
336
	add     AL,'0'
337
	stosb
337
	stosb
338
	dec     edx
338
	dec     edx
339
	jnz     @@N1
339
	jnz     @@N1
340
	mov     AL,'.'
340
	mov     AL,'.'
341
	stosb
341
	stosb
342
@@N1:	dec     ebx
342
@@N1:	dec     ebx
343
	loop    @@NextPair
343
	loop    @@NextPair
344
	xor	al, al
344
	xor	al, al
345
	stosb
345
	stosb
346
	mov     edi, Data_String
346
	mov     edi, Data_String
347
	mov     esi, Data_String
347
	mov     esi, Data_String
348
	cmp     byte[esi], '-'
348
	cmp     byte[esi], '-'
349
	jne     @@N2
349
	jne     @@N2
350
	inc     esi
350
	inc     esi
351
	inc     edi
351
	inc     edi
352
@@N2:	mov     ecx, 18+1+1
352
@@N2:	mov     ecx, 18+1+1
353
@@N3:   cmp	byte[esi], '0'
353
@@N3:   cmp	byte[esi], '0'
354
	jne     @@N4
354
	jne     @@N4
355
	inc     esi
355
	inc     esi
356
	loop    @@N3
356
	loop    @@N3
357
	jmp	@@Error
357
	jmp	@@Error
358
@@N4:   rep movsb
358
@@N4:   rep movsb
359
	jmp	@@End
359
	jmp	@@End
360
@@Overflow:
360
@@Overflow:
361
@@Error:mov	eax, 'ERR'
361
@@Error:mov	eax, 'ERR'
362
	stosd
362
	stosd
363
@@End:	popa
363
@@End:	popa
364
	ret
364
	ret
365
MConst: dd 1.0E2	; 2 çíàêà ïîñëå çàïÿòîé
365
MConst: dd 1.0E2	; 2 çíàêà ïîñëå çàïÿòîé
366
 
366
 
367
uglobal
367
uglobal
368
	Data_BCD:	DT ?
368
	Data_BCD:	DT ?
369
	Data_String:	times 20 db 0	; ASCIIZ ñòîðêà ñ ïðåîáðàçîâàííûì ÷èñëîì
369
	Data_String:	times 20 db 0	; ASCIIZ ñòîðêà ñ ïðåîáðàçîâàííûì ÷èñëîì
370
endg
370
endg
371
;--------------------------------------------------------------------
371
;--------------------------------------------------------------------
-
 
372
ReservePorts:
-
 
373
	; In  : ecx - first port, edx - last port
-
 
374
	; Out : CF = 1 if error
-
 
375
	pusha
-
 
376
	mov	eax, 46
-
 
377
	xor	ebx, ebx
-
 
378
	int	0x40
-
 
379
	clc
-
 
380
	test	eax, eax
-
 
381
	jz	@f
-
 
382
	stc
-
 
383
@@:	popa
-
 
384
	ret
-
 
385
	
-
 
386
FreePorts:
-
 
387
	; In  : ecx - first port, edx - last port
-
 
388
	pusha
-
 
389
	mov	eax, 46		; îñâîáîæäàåì 0x295 è 0x296 ïîðòû
-
 
390
	xor	ebx, ebx
-
 
391
	inc	ebx
-
 
392
	int	0x40
-
 
393
	popa
-
 
394
	ret