Subversion Repositories Kolibri OS

Rev

Rev 313 | Rev 500 | 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
340 heavyiron 236
	mov	edx, tcol + 0x13000000	; color of work area RRGGBB,8->color
237
	mov	edi, title		; color of frames    RRGGBB
205 heavyiron 238
	int	0x40
239
	; Создаём рамку графика
240
	mov	eax, 13
241
	mov	ebx, 10 * 65536 + 290
223 Ghost 242
	mov	ecx, 138 * 65536 + 105
205 heavyiron 243
	mov	edx, atcol
244
	int	0x40
245
	mov	ebx, 12 * 65536 + 286
223 Ghost 246
	mov	ecx, 140 * 65536 + 101
205 heavyiron 247
	mov	edx, tcol
248
	int	0x40
249
	mov	eax, 38
250
	mov	edx, atcol
251
	mov	ebx, 12 * 65536 + 286 + 12
223 Ghost 252
	mov	ecx, 140 * 65536 + 140
205 heavyiron 253
@@:	add	ecx, 10 * 65536 + 10
254
	int	0x40
223 Ghost 255
	cmp	cx, 230			; привязано к координатам окна
205 heavyiron 256
	jl	@b
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'
340 heavyiron 510
title		db	'Ghost Monitor v0.4 [26/12/06]',0
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