Subversion Repositories Kolibri OS

Rev

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