Subversion Repositories Kolibri OS

Rev

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