Subversion Repositories Kolibri OS

Rev

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