Subversion Repositories Kolibri OS

Rev

Details | Last modification | View Log | RSS feed

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