Subversion Repositories Kolibri OS

Rev

Rev 205 | Rev 241 | Go to most recent revision | Details | Compare with Previous | Last modification | View Log | RSS feed

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