Subversion Repositories Kolibri OS

Rev

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

Rev Author Line No. Line
205 heavyiron 1
;
2
; Ghost Monitor - утилита (стресс) тестирования и мониторинга системы
3
; ВОЗМОЖНА ПОРЧА ОБОРУДОВАНИЯ!
4
; ИСПОЛЬЗУЙТЕ НА СВОЙ СТРАХ И РИСК!
5
;
6
; Заметки :
7
;	Дописать запуск тестов (rtst) (нет реакции на ошибку запуска)
8
;	Переделать обновление графика (сделать отдельным процессом)
9
;	Добавить реакцию на параметры датчиков
10
;
11
; История :
12
;         09/2005 - начало
13
;      04/10/2005 - откомментировал код
14
;      09/11/2005 - дописаны тесты (пока нет теста памяти)
15
;      30/01/2006 - добавленны графики
16
;      02/02/2006 - Добавлена настройка времени обновления
17
;      10/02/2006 - добавленна еще информация с датчиков, опт. wb_get_chip_name
18
;      01/03/2006 - добавленна еще информация с датчиков
19
;      16/03/2006 - оптимизирована по размеру
20
;      17/03/2006 - подсветка изменённых параметров, оптимизация, about
21
;      20/03/2006 - Публикация
22
;               ---  v 0.2 ---
23
;      24/03/2006 - Добавленна поддержка IT8705F, IT8712F и SIS950
24
;      25/03/2006 - Вывод трёх температур и трёх вентилей
25
;      28/03/2006 - График temp3 и изменение цвета графиков, обработка отрицательных значений графика
26
;      30/03/2006 - Оптимизация по размеру версии от 28/03/2006, переписал рисование графика
27
;      14/04/2006 - Исправил график (jle -> jbe), добавил mem usage, вычисление длинны чисел, закрытие по Esc
28
;      19/04/2006 - Очистка неинициализированных данных
29
;               ---  v 0.3 ---
30
;      01/07/2006 - Различие ITE 8705F, ITE 8712F и IT8716F
31
;      04/07/2006 - Добавленны напруги для чипов Winbond
32
;      10/07/2006 - добавленны напруги для чипов ITE, множители для AMD K6, Intel P6, P7, оптимизация по размеру
33
;      11/07/2006 - Реакция на изменение напруги, оптимизация по размеру
34
;      12/07/2006 - it87_get_fan_speed bug fix, завершение теста по 18/18
35
;      13/07/2006 - it87_get_fan_speed bug fix, исправлен вывод чисел с плавающей точкой
36
;      14/07/2006 - исправленны показания -12V для Winbond, осталась пробленма с -5V
37
;      17/07/2006 - исправленна ошибка определения множителя для P6, добавленны множители
38
;      18/07/2006 - Уличшил вывод множителя, исправленны множители для P6 Tualatin, config.inc
39
;      22/07/2006 - P6 multiplier bugfix
40
;      30/07/2006 - P6 multiplier bugfix
223 Ghost 41
;               --- v 0.4 ---
42
;      10/08/2006 - начата работа по поддержке SMBus, переписаны функции для чипов мониторинга
43
;      24/08/2006 - добавленна частота процессора
44
;      10/09/2006 - bugfix
45
;      25/11/2006 - добавлен ABIT uGuru
241 Ghost 46
;      20/12/2006 - W83627DHG, W83627EHF, W83627EHG, mutipliers for AthonXP-M, Athlon64, Athlon64-M,
47
;            Intel Dothan, Yonah, Conroe, Merom
243 Ghost 48
;      24/12/2006 - ITE chips model id bugfix by Serge
251 Ghost 49
;      26/15/2006 - исправленна глупая ошибка в определении ITE и uGuru
205 heavyiron 50
;
51
;    Эй! У меня нет много времени.
52
 
53
; Внешние файлы :
54
;	hwm*.inc	- процедуры работы с датчиками мониторинга
55
;	system.inc	- вычисление загрузки процессора, завершение теста, etc...
56
;	tests.inc	- тесты ;-)
57
;	diag.inc	- поддержка диаграм
223 Ghost 58
;	tab_*.inc	- процедуры отрисовки соответствуюших вкладок
205 heavyiron 59
 
60
 
61
; Идентификаторы кнопок :
62
;	01 - Exit
63
;	02 - Info tab
64
;	03 - Tests tab
65
;	04 - Config tab
66
;	05 - About tab
67
;	06 - P5 test
68
;	07 - P6 test
69
;	08 - K6 test
70
;	09 - K7 test
71
;	10 - MMX test	- not used
72
;	11 - Update time increment
73
;	12 - Update time decriment
74
;	13..17 - Изменение цвета CPU_load, Mem_usage, Temp1, Temp2, Temp3
75
 
76
include 'config.inc'
77
include 'macros.inc'
78
 
79
tcol	equ	0x5080d0
80
atcol	equ	0x4070c0
81
val_mod	equ	0x3090
82
 
83
MEOS_APP_START
84
include "tests.inc"	; <-- Много выравниваний, лучше здесь
85
CODE
86
;--- Init ------------------------------------------------------------
87
	; Очищаем неинициализированные данные
88
	mov	ecx, __memory - __udata
89
	mov	edi, __udata
90
	xor	eax, eax
91
	rep	stosb
92
 
93
	xor	eax, eax
94
	cpuid					; Узнаём производителя проца
95
	mov	[Vendor + 0], ebx
96
	mov	[Vendor + 4], edx
97
	mov	[Vendor + 8], ecx
98
	mov	eax, 1
99
	cpuid					; Есть ли MMX ?
100
	mov	ecx, eax
101
	shr	al, 4
102
	and	ax, 0x0F0F
103
	mov	[CPU_fam], ah
104
	mov	[CPU_mod], al
105
	shr	edx, 23
106
	and	dl, 1
107
	mov	[CPU_mmx], dl
108
	shr	ecx, 12
109
	and	cl, 11b
110
	mov	[CPU_type], cl
111
 
112
	; ! Цвета из массива colors
113
	mov	dword[d_cpu_load], 0xFF00	; инициализируем график загрузки АЛУ
114
	mov	dword[d_mem_usage], 0x8BA169	; -- mem usega
115
	mov	dword[d_temp1], 0xFF0000	; -- график температуры ЦПУ
116
	mov	dword[d_temp2], 0xFF		; -- график температуры МП
117
	mov	dword[d_temp3], 0xFF7E23
118
 
119
	call	hwm_init			; Инициализируем чип мониторинга
120
 
121
	jmp	draw_window
122
;--- Wait & translate event ------------------------------------------
123
wait_for_event:
124
	mov	byte[diag_add_v], 0	; добавляем данные к графику только по таймеру
125
	mov	ebx, [update_time]
126
	mov	eax, 23
127
	int	0x40
128
	test	eax, eax
129
	jnz	@f
130
	inc	byte [diag_add_v]
131
	inc	eax			; перерисуем окно (eax := 1)
132
@@:	dec	eax			; redraw request ?
133
	jz	draw_window
134
	dec	eax			; key in buffer ?
135
	jz	key
136
	dec	eax			; button in buffer ?
137
	jz	button
138
	jmp	wait_for_event
139
;--- Key pressed -----------------------------------------------------
140
key:
141
	mov	eax, 2
142
	int	0x40
143
	cmp	ah, 27			; Esc - завершение работы
144
	je	exit
145
	jmp	wait_for_event
146
;--- Button down -----------------------------------------------------
147
button:
148
	mov	eax, 17			; get id
149
	int	0x40
150
	cmp	ah, 1			; button id == 1 ?
151
	jne	noexit
152
exit:	cmp	byte[test_id], 0
153
	je	@f
154
	call	stop_test
155
@@:	mov	eax, -1		; close this program
156
	int	0x40
157
noexit:
158
	; кнопки вкладок (2 .. 5)
159
	cmp	ah, 5
160
	jg	no_tabs
161
	mov	byte[act_tab], ah
162
	jmp	draw_window
163
no_tabs:
164
	; кнопки запуска тество (6 .. 10)
165
	cmp	ah, 10
166
	jg	no_test_bt
167
	; если нет запущеных тестов - запускаем выбранный
168
	cmp	byte[test_id], 0
169
	je	run_test
170
	; если кнопка активного теста - останавливаем тест, иначе ничего не делаем
171
	cmp	[test_id], ah
172
	jne	wait_for_event
173
	call	stop_test
174
	jmp	draw_window
175
 
176
tsts:	dd	p5, p6, k6, k7
177
run_test:
178
	push	eax
179
	movzx	ecx, ah
180
	mov	ecx, [tsts + (ecx * 4) - (6 * 4)]
181
rtst:	mov	eax, 51
182
	mov	edx, stp
183
	mov	ebx, 1
184
	int	0x40
185
	cmp	eax, 0xFFFFFFF0	; -16
186
	je	wait_for_event	; <-- ошибка запуска теста, ПЕРЕПИСАТЬ
187
	mov	[test_pid], eax
188
	pop	eax
189
	mov	byte [test_id], ah
190
	jmp	draw_window
191
	;-------------------------
192
	; кнопки изменения времени обновления
193
no_test_bt:
194
	cmp	ah, 11
195
	jne	no_ut_inc
196
	add	dword[update_time], 10
197
	jmp	draw_window
198
no_ut_inc:
199
	cmp	ah, 12
200
	jne	no_ut_dec
201
	cmp	dword[update_time], 10
202
	jng	wait_for_event
203
	sub	dword[update_time], 10
204
	jmp	draw_window
205
no_ut_dec:
206
	;-------------------------
207
	; кнопки изменения цвета графиков (13..17)
208
	cmp	ah, 17
209
	jg	no_change_color
210
	sub	ah, 13
211
	movzx	ecx, ah
212
	mov	esi, [d_colors + ecx * 4]
213
	mov	eax, [esi]
223 Ghost 214
	mov	ecx, (colors_end - colors) / 4	; количество цветов
215
@@:	dec	ecx
216
	cmp	eax, [colors + ecx * 4]
217
	jne	@b
218
	mov	ebx, [colors + ecx * 4 - 4]
205 heavyiron 219
	mov	[esi], ebx
220
	jmp	draw_window
221
no_change_color:
222
	jmp	wait_for_event
223
;---------------------------------------------------------------------
224
draw_window:
225
	mov	eax,12
226
	mov	ebx,1
227
	int	0x40
228
	; Создаём окно
229
	xor	eax, eax
230
	mov	ebx, 300 * 65536 + 309
223 Ghost 231
	mov	ecx, 150 * 65536 + 450
205 heavyiron 232
	mov	edx, tcol + 0x3000000	; color of work area RRGGBB,8->color
233
	mov	esi, 0x805080d0		; color of grab bar  RRGGBB,8->color
234
	mov	edi, 0x005080d0		; color of frames    RRGGBB
235
	int	0x40
236
	; Создаём рамку графика
237
	mov	eax, 13
238
	mov	ebx, 10 * 65536 + 290
223 Ghost 239
	mov	ecx, 138 * 65536 + 105
205 heavyiron 240
	mov	edx, atcol
241
	int	0x40
242
	mov	ebx, 12 * 65536 + 286
223 Ghost 243
	mov	ecx, 140 * 65536 + 101
205 heavyiron 244
	mov	edx, tcol
245
	int	0x40
246
	mov	eax, 38
247
	mov	edx, atcol
248
	mov	ebx, 12 * 65536 + 286 + 12
223 Ghost 249
	mov	ecx, 140 * 65536 + 140
205 heavyiron 250
@@:	add	ecx, 10 * 65536 + 10
251
	int	0x40
223 Ghost 252
	cmp	cx, 230			; привязано к координатам окна
205 heavyiron 253
	jl	@b
254
	; Пишим заголовок
255
	mov	eax, 4
256
	mov	ebx, 8 * 65536 + 8
257
	mov	edx, title
258
	mov	ecx, 0x10FFFFFF
259
	mov	esi, 29
260
	int	0x40
261
 
262
	; Пишим названия параметров (Cpu load, temper, etc...)
263
	mov	edx, msgs_mon
264
	mov	ebx, 17 * 65536 + 30
265
	call	show_text
266
 
267
	mov	edx, msgs_mon2
268
	mov	ebx, 156 * 65536 + 30
269
	call	show_text
270
 
271
	; Рисуем кнопки смены цвета
272
	mov	eax, 8
273
	mov	ebx, 112 * 65536 + 5
274
	mov	ecx, 30 * 65536 + 6
275
	mov	edx, 13
276
@@:	mov	esi, [d_colors - 13 * 4 + edx * 4]
277
	mov	esi, [esi]
278
	int	0x40
279
	add	ecx, 10 * 65536
280
	inc	edx
281
	cmp	edx, 13 + 5		; 5 кнопок
282
	jne	@b
283
 
284
	; Пишим загрузку процессора
285
	call	cpu_usage
286
	;--- добавляем на график ---
287
	mov	esi, d_cpu_load
288
	call	d_add
289
	call	d_show
290
	;---------------------------
291
	movzx	ecx, al
292
	mov	eax, 47
293
	mov	edx, 121 * 65536 + 30
294
	xor	esi, esi
295
	call	digit_len
296
	int	0x40
297
 
298
	; Пишим используемую память
299
	call	mem_usage
300
	;--- добавляем на график ---
301
	mov	esi, d_mem_usage
302
	call	d_add
303
	call	d_show
304
	;---------------------------
305
	movzx	ecx, al
306
	mov	eax, 47
307
	mov	edx, 121 * 65536 + 40
308
	xor	esi, esi
309
	call	digit_len
310
	int	0x40
311
 
312
	cmp	byte[hwm_enable], 0
313
	jne	show_mon
314
	; Нет датчиков - пишем NO
223 Ghost 315
	mov	ecx, 8	;<- количество параметров
205 heavyiron 316
	mov	eax, 4
317
	mov	ebx, 121 * 65536 + 50
318
	mov	edx, msg_no
319
	mov	esi, 3
320
@@:	int	0x40
321
	add	ebx, 10
322
	loop	@b
323
 
324
	mov	ecx, 7	;<- количество параметров
325
	mov	ebx, 260 * 65536 + 30
326
@@:	int	0x40
327
	add	ebx, 10
328
	loop	@b
329
 
330
	jmp	no_monitor
331
show_mon:
332
	;Есть датчики пишим инфу
333
	call	hwm_get_params
334
	;---------------------------
335
	; Температуру
336
	mov	ecx, 3
223 Ghost 337
	mov	esi, hwm_temps
205 heavyiron 338
	mov	edx, 121 * 65536 + 50
339
	xor	eax, eax
340
sh_temp:push	ecx
341
	lodsw
342
	push	esi
343
	; реакция на изменения
344
	xor	esi, esi
345
	cmp	[old_t1 + ecx * 4 - 4], eax
346
	je	@f
347
	mov	[old_t1 + ecx * 4 - 4], eax
348
	mov	esi, val_mod
349
@@:	movzx	ecx, al
350
	push	eax
351
	mov	eax, 47
352
	mov	ebx, 0x20000
353
	int	0x40
354
	pop	eax
355
	mov	cl, ah
356
	mov	eax, 47
357
	mov	ebx, 0x10000
358
	add	edx, 15 * 65536
359
	int	0x40
360
	sub	edx, 15 * 65536 - 10
361
	pop	esi
362
	pop	ecx
363
	loop	sh_temp
364
	;;--- добавляем на график temp1 ---
223 Ghost 365
	movzx	eax, word[hwm_temps]
205 heavyiron 366
	mov	esi, d_temp1
367
	call	d_add
368
	call	d_show
369
	;;--- добавляем на график temp2 ---
223 Ghost 370
	movzx	eax, word[hwm_temps + 2]
205 heavyiron 371
	mov	esi, d_temp2
372
	call	d_add
373
	call	d_show
374
	;;--- добавляем на график temp3 ---
223 Ghost 375
	movzx	eax, word[hwm_temps + 4]
205 heavyiron 376
	mov	esi, d_temp3
377
	call	d_add
378
	call	d_show
379
 
380
	;---------------------------
381
	; Скорости врашения вентилей
223 Ghost 382
	mov	ecx, 5
383
	mov	esi, hwm_rpms
205 heavyiron 384
	mov	edx, 121 * 65536 + 80
385
sh_fan:	push	ecx
386
	lodsd
387
	push	esi
388
	;реакция на изменения
389
	xor	esi, esi
390
	cmp	[old_f1 + ecx * 4 - 4], eax
391
	je	@f
392
	mov	[old_f1 + ecx * 4 - 4], eax
393
	mov	esi, val_mod
394
@@:	mov	ecx, eax
395
	call	digit_len
396
	mov	eax, 47
397
	int	0x40
398
	add	edx, 10
399
	pop	esi
400
	pop	ecx
401
	loop	sh_fan
402
 
403
	;---------------------------
404
	; Напруги
223 Ghost 405
	mov	esi, hwm_voltages
205 heavyiron 406
	mov	edi, old_volts
407
	mov	ecx, 7
408
	mov	ebx, 260 * 65536 + 30
409
	mov	edx, Data_String
410
volt_nxt:
411
	push	ecx
412
	push	esi
413
	call	ftoa
414
	;реакция на изменения
415
	xor	ecx, ecx
416
	fld	dword [esi]
417
	fsub	dword [edi]
418
	fabs
419
 
420
	; fcomp	dword [c_eps]	; bug in MeOsEmul
421
	; fstsw	ax
422
	fcom	dword [c_eps]	; 0xBADCODE
423
	fstsw	ax
424
	finit
425
 
426
	sahf
427
	jc	@f
428
	mov	ecx, val_mod
429
@@:	mov	esi, Data_String	; считаем кол-во символов
430
@@:	lodsb
431
	test	al, al
432
	jnz	@b
433
	sub	esi, Data_String
434
 
435
	mov	eax, 4
436
	int	0x40
437
	add	ebx, 10
438
	pop	esi
439
	pop	ecx
440
	movsd
441
	loop	volt_nxt
442
 
443
no_monitor:
444
	;---------------------------
445
	; Создаём кнопки вкладок
223 Ghost 446
	mov	edi, 250 * 65536 + 25
205 heavyiron 447
	mov	ecx, 4
448
	mov	eax, 8
449
	mov	ebx, 10 * 65536 + 70
450
	mov	edx, 2
451
n_bt:	push	ecx
452
	mov	ecx, edi
453
	mov	esi, tcol
454
	cmp	byte [act_tab], dl
455
	jne	na1
456
	mov	esi, atcol
457
na1:	int	0x40
458
	inc	edx
459
	add	ebx, 73 * 65536
460
	pop	ecx
461
	loop	n_bt
462
	; Пишим названия вкладок
463
	mov	eax, 4
223 Ghost 464
	mov	ebx, 35 * 65536 + 260
205 heavyiron 465
	mov	edx, tab_lab
466
	mov	ecx, 0x10000000
467
	mov	esi, 39
468
	int	0x40
469
	; создаём рамку внизу экрана
470
	mov	eax, 13
471
	mov	ebx, 10 * 65536 + 290
223 Ghost 472
	mov	ecx, 275 * 65536 + 160
205 heavyiron 473
	mov	edx, atcol
474
	int	0x40
475
	mov	ebx, 12 * 65536 + 286
223 Ghost 476
	mov	ecx, 277 * 65536 + 156
205 heavyiron 477
	mov	edx, tcol
478
	int	0x40
479
	; рисуем выбранную вкладку
480
	mov	al, [act_tab]
481
	cmp	al, 2
482
	je	info_tab
483
	cmp	al, 3
484
	je	test_tab
485
	cmp	al, 4
486
	je	config_tab
487
	jmp	about_tab
488
end_drow_tab:
489
	mov	eax, 12
490
	mov	ebx, 2
491
	int	0x40
492
	jmp	wait_for_event
493
;--- Drow Info tab ---------------
494
info_tab:
223 Ghost 495
	include	"tab_info.inc"
205 heavyiron 496
;--- Drow test tab ---------------
497
test_tab:
223 Ghost 498
	include "tab_test.inc"
205 heavyiron 499
;--- Drow Config tab -------------
500
config_tab:
223 Ghost 501
	include "tab_conf.inc"
205 heavyiron 502
;--- Drow About tab --------------
503
about_tab:
223 Ghost 504
	include "tab_about.inc"
205 heavyiron 505
;---------------------------------------------------------------------
506
	include	"system.inc"
507
	include "hwm.inc"
508
	include "diag.inc"
509
 
510
 
511
DATA
512
act_tab		db	2 			; Номер активной вкладки
513
tab_lab		db	'Info       Tests      Configs     About'
250 Ghost 514
title		db	'Ghost Monitor v0.4 [26/12/06]'
205 heavyiron 515
 
516
msgs_mon mls \
517
	'CPU Load (%)',\
518
	'Mem Usage(%)',\
519
	'Temp1',\
520
	'Temp2',\
521
	'Temp3',\
522
	'Fan1',\
523
	'Fan2',\
223 Ghost 524
	'Fan3',\
525
	'Fan4',\
526
	'Fan5'
205 heavyiron 527
 
528
msgs_mon2 mls \
529
	'Vcore',\
530
	'AGP',\
531
	'+3.3V',\
532
	'AVcc (+5V)',\
533
	'+12V',\
534
	'-12V',\
535
	'-5V'
536
 
537
msg_yes		db	'Yes'
538
msg_no		db	'N/A'
539
 
540
update_time	dd	300			; период обновления в сотых долях секунды
541
d_colors	dd	d_cpu_load, d_mem_usage, d_temp1, d_temp2, d_temp3
542
c_eps		dd	0.01
223 Ghost 543
 
544
; Цвета графиков
545
colors:		dd	0xff0000, 0xff00, 0xff, 0xffffff, tcol, 0xFF7E23, 0x8BA169, 0xff0000	; первый и последний равны
546
colors_end:
205 heavyiron 547
;---------------------------------------------------------------------
548
UDATA
549
 
550
test_pid	dd	?			; если test_id == 0 - не имеет смысла
551
test_id		db	?			; 0 - тест не запушен (соответствует № кнопки 6..10)
552
diag_add_v	db	?			; 0 - не добавлять данные на график, !0 - добавлять
553
 
554
Vendor:		times	12 db ?
555
CPU_fam:	db	?
556
CPU_mod:	db	?
557
CPU_type:	db	?
558
CPU_mmx:	db	?
559
 
560
; Для реакции на изменения
561
old_t1:		dd	?	; последнее значение temp1
562
old_t2:		dd	?	; ...
563
old_t3:		dd	?
564
old_f1:		dd	?
565
old_f2:		dd	?
566
old_f3:		dd	?
567
old_volts:	times	7 dd ?
568
 
569
; Грфики
570
diag_beg:
571
d_cpu_load:	dd	?
572
		times 286 db ?
573
 
574
d_mem_usage:	dd	?
575
		times 286 db ?
576
 
577
d_temp1:	dd	?
578
		times 286 db ?
579
 
580
d_temp2:	dd	?
581
		times 286 db ?
582
 
583
d_temp3:	dd	?
584
		times 286 db ?
585
diag_end:
586
 
587
; --- стек теста, воизбежание глюков не переносить в другое место ----
588
th_stack:	times	1024 db ?
589
stp:
590
;---------------------------------------------------------------------
591
MEOS_APP_END