Subversion Repositories Kolibri OS

Rev

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