Subversion Repositories Kolibri OS

Rev

Rev 5950 | Rev 7134 | Go to most recent revision | Blame | Compare with Previous | Last modification | View Log | Download | RSS feed

  1. ;
  2. ; Ghost Monitor - утилита (стресс) тестирования и мониторинга системы
  3. ; Copyright (C) 2005, 2006, 2007 Mihailov Ilia (ghost.nsk@mail.ru)
  4. ; All Right Reserved
  5. ;
  6. ; ВОЗМОЖНА ПОРЧА ОБОРУДОВАНИЯ!
  7. ; ИСПОЛЬЗУЙТЕ НА СВОЙ СТРАХ И РИСК!
  8. ;
  9. ; Заметки :
  10. ;       Дописать запуск тестов (rtst) (нет реакции на ошибку запуска)
  11. ;       Переделать обновление графика (сделать отдельным процессом)
  12. ;       Добавить реакцию на параметры датчиков
  13. ;
  14.  
  15. ; Внешние файлы :
  16. ;       hwm*.inc        - процедуры работы с датчиками мониторинга
  17. ;       system.inc      - вычисление загрузки процессора, завершение теста, etc...
  18. ;       tests.inc       - тесты ;-)
  19. ;       diag.inc        - поддержка диаграм
  20. ;       tab_*.inc       - процедуры отрисовки соответствуюших вкладок
  21.  
  22.  
  23. ; Identifier buttons :
  24. ;       01 - Exit
  25. ;       02 - Info tab
  26. ;       03 - Tests tab
  27. ;       04 - Config tab
  28. ;       05 - About tab
  29. ;       06 - P5 test (tab_test.inc)
  30. ;       07 - P6 test (tab_test.inc)
  31. ;       08 - K6 test (tab_test.inc)
  32. ;       09 - K7 test (tab_test.inc)
  33. ;       10 - MMX test   - not used (tab_test.inc)
  34. ;       11 - Update time increment (tab_conf.inc)
  35. ;       12 - Update time decriment (tab_conf.inc)
  36. ;       13..17 - Color Changing buttons CPU_load, Mem_usage, Temp1, Temp2, Temp3
  37.  
  38. include 'lang.inc'
  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                        ; Initialize monitoring chip
  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.         jmp     redraw
  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 - shutdown
  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.         ; button tabs (2 .. 5)
  122.         cmp     ah, 5
  123.         jg      no_tabs
  124.         mov     byte[act_tab], ah
  125.         jmp     redraw_tabs
  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     redraw_tabs
  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     redraw_tabs
  154.         ;-------------------------
  155.         ; кнопки изменения времени обновления
  156. no_test_bt:
  157.         cmp     ah, 11
  158.         jne     no_ut_inc
  159.         add     dword[update_time], 10
  160.         jmp     redraw_tabs
  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     redraw_tabs
  168. no_ut_dec:
  169.         ;-------------------------
  170.         ; color change button schedules (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  ; number of colors
  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     redraw_tabs
  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.         ; Create a graphic frame (not for graph)
  199.         mov     eax, 13
  200.         mov     ebx, 10 * 65536 + 290
  201.         mov     ecx, 138 * 65536 + 105
  202.         mov     edx, atcol
  203.         int     0x40
  204.  
  205.         ; write parameter names (Cpu load, temper, etc ...)
  206.         mov     edx, msgs_mon         ; text for indicators
  207.         mov     ebx, 17 * 65536 + 30
  208.         call    show_text
  209.  
  210.         mov     edx, msgs_mon2
  211.         mov     ebx, 166 * 65536 + 30
  212.         call    show_text
  213.  
  214.         jmp draw_tabs ; draw tabs for the first time
  215.  
  216. redraw_tabs: ; delete previously created tabs
  217.  
  218.         mov     ecx, 4
  219.         mov     eax, 8
  220.         mov     edx, 0x80000000 + 2
  221. del_tabs:
  222.         int     0x40
  223.         inc     edx
  224.         loop    del_tabs
  225.  
  226.         ; Delete color change buttons
  227.         mov     eax, 8
  228.         mov     edx, 0x80000000 + 13
  229. @@:
  230.         int     0x40
  231.         inc     edx
  232.         cmp     edx, 0x80000000 + 13 + 5        ; 5 (buttons)
  233.         jne     @b
  234.  
  235. draw_tabs:
  236.  
  237.         ; Drawing color change buttons
  238.         mov     eax, 8
  239.         mov     ebx, 112 * 65536 + 5
  240.         mov     ecx, 30 * 65536 + 6
  241.         mov     edx, 13
  242.  
  243. @@:
  244.         mov     esi, [d_colors - 13 * 4 + edx * 4]
  245.         mov     esi, [esi]
  246.         int     0x40
  247.         add     ecx, 10 * 65536
  248.         inc     edx
  249.         cmp     edx, 13 + 5             ; 5 (buttons)
  250.         jne     @b
  251.  
  252.         ; info, test, config, about buttons
  253.         ; Create 4 buttons
  254.         mov     edi, 250 * 65536 + 25
  255.         mov     ecx, 4
  256.         mov     eax, 8
  257.         mov     ebx, 10 * 65536 + 70
  258.         mov     edx, 2
  259. n_bt:  
  260.         push    ecx
  261.         mov     ecx, edi
  262.         mov     esi, tcol
  263.         cmp     byte [act_tab], dl
  264.         jne     na1
  265.         mov     esi, atcol
  266. na1:    
  267.         int     0x40
  268.         inc     edx
  269.         add     ebx, 73 * 65536
  270.         pop     ecx
  271.         loop    n_bt
  272.  
  273.         ; write name tabs
  274.         mov     eax, 4
  275.         mov     ebx, (18 shl 16) + 256
  276.         mov     edx, tab_lab
  277.         mov     ecx, 0x10000000
  278.         mov     esi, 4
  279.         int     0x40
  280.         add     ebx, (72 shl 16)
  281.         mov     edx, tab_lab.2
  282.         mov     esi, 5
  283.         int     0x40
  284.         add     ebx, (72 shl 16)
  285.         mov     edx, tab_lab.3
  286.         mov     esi, 7
  287.         int     0x40
  288.         add     ebx, (72 shl 16)
  289.         mov     edx, tab_lab.4
  290.         mov     esi, 5
  291.         int     0x40
  292.  
  293.         ; create a frame at the bottom of the screen
  294.         mov     eax, 13
  295.         mov     ebx, 10 * 65536 + 290
  296.         mov     ecx, 275 * 65536 + 160
  297.         mov     edx, atcol
  298.         int     0x40
  299.         mov     ebx, 12 * 65536 + 286
  300.         mov     ecx, 277 * 65536 + 156
  301.         mov     edx, tcol
  302.         int     0x40
  303.  
  304.         ; draw the selected tab
  305.         mov     al, [act_tab]
  306.         cmp     al, 2
  307.         je      info_tab
  308.         cmp     al, 3
  309.         je      test_tab
  310.         cmp     al, 4
  311.         je      config_tab
  312.         jmp     about_tab
  313.        
  314. ;--- Drow Info tab ---------------
  315. info_tab:
  316.         include "tab_info.inc"
  317. ;--- Drow test tab ---------------
  318. test_tab:
  319.         include "tab_test.inc"
  320. ;--- Drow Config tab -------------
  321. config_tab:
  322.         include "tab_conf.inc"
  323. ;--- Drow About tab --------------
  324. about_tab:
  325.         include "tab_about.inc"
  326.  
  327. redraw:
  328.  
  329.         ; frame for graph
  330.  
  331.         mov     eax, 13
  332.         mov     ebx, 12 * 65536 + 286
  333.         mov     ecx, 140 * 65536 + 101
  334.         mov     edx, tcol
  335.         int     0x40
  336.         mov     eax, 38
  337.         mov     edx, atcol
  338.         mov     ebx, 12 * 65536 + 286 + 12
  339.         mov     ecx, 140 * 65536 + 140
  340. @@:     add     ecx, 10 * 65536 + 10
  341.         int     0x40
  342.         cmp     cx, 230                 ; привязано к координатам окна
  343.         jl      @b
  344.  
  345.         ; write CPU usage
  346.         call    cpu_usage
  347.         ;--- добавляем на график ---
  348.         mov esi, d_cpu_load
  349.         call    d_add
  350.         call    d_show
  351.         ;---------------------------
  352.         movzx   ecx, al
  353.         mov     eax, 47
  354.         mov     edx, 121 * 65536 + 30
  355.         xor     esi, esi
  356.         call    digit_len
  357.         clear_prev_no edx
  358.         int     0x40
  359.  
  360.         ; write used memory
  361.         call    mem_usage
  362.         ;--- добавляем на график ---
  363.         mov     esi, d_mem_usage
  364.         call    d_add
  365.         call    d_show
  366.         ;---------------------------
  367.         movzx   ecx, al
  368.         mov     eax, 47
  369.         mov     edx, 121 * 65536 + 40
  370.         xor     esi, esi
  371.         call    digit_len
  372.         clear_prev_no edx
  373.         int     0x40
  374.  
  375.         cmp     byte[hwm_enable], 0
  376.         jne     show_mon
  377.         ; Нет датчиков - пишем NO
  378.         mov     ecx, 8  ;<- number of parameters
  379.         mov     eax, 4
  380.         mov     ebx, 121 * 65536 + 50
  381.         mov     edx, msg_no
  382.         mov     esi, 3
  383. @@:     int     0x40
  384.         add     ebx, 10
  385.         loop    @b
  386.  
  387.         mov     ecx, 7  ;<- number of parameters
  388.         mov     ebx, 260 * 65536 + 30
  389. @@:     int     0x40
  390.         add     ebx, 10
  391.         loop    @b
  392.  
  393.         jmp     no_monitor
  394. show_mon:
  395.         ;Есть датчики пишим инфу
  396.         call    hwm_get_params
  397.         ;---------------------------
  398.         ; Температуру
  399.         mov     ecx, 3
  400.         mov     esi, hwm_temps
  401.         mov     edx, 121 * 65536 + 50
  402.         xor     eax, eax
  403. sh_temp:push    ecx
  404.         lodsw
  405.         push    esi
  406.         ; реакция на изменения
  407.         xor     esi, esi
  408.         cmp     [old_t1 + ecx * 4 - 4], eax
  409.         je      @f
  410.         mov     [old_t1 + ecx * 4 - 4], eax
  411.         mov     esi, val_mod
  412. @@:     movzx   ecx, al
  413.         push    eax
  414.         mov     eax, 47
  415.         mov     ebx, 0x20000
  416.         clear_prev_no edx
  417.         int     0x40
  418.         pop     eax
  419.         mov     cl, ah
  420.         mov     eax, 47
  421.         mov     ebx, 0x10000
  422.         add     edx, 15 * 65536
  423.         int     0x40
  424.         sub     edx, 15 * 65536 - 10
  425.         pop     esi
  426.         pop     ecx
  427.         loop    sh_temp
  428.         ;;--- Add to the chart temp1 ---
  429.         movzx   eax, word[hwm_temps]
  430.         mov     esi, d_temp1
  431.         call    d_add
  432.         call    d_show
  433.         ;;--- Add to the chart temp2 ---
  434.         movzx   eax, word[hwm_temps + 2]
  435.         mov     esi, d_temp2
  436.         call    d_add
  437.         call    d_show
  438.         ;;--- Add to the chart temp3 ---
  439.         movzx   eax, word[hwm_temps + 4]
  440.         mov     esi, d_temp3
  441.         call    d_add
  442.         call    d_show
  443.  
  444.         ;---------------------------
  445.         ; Скорости врашения вентилей
  446.         mov     ecx, 5
  447.         mov     esi, hwm_rpms
  448.         mov     edx, 121 * 65536 + 80
  449. sh_fan: push    ecx
  450.         lodsd
  451.         push    esi
  452.         ;реакция на изменения
  453.         xor     esi, esi
  454.         cmp     [old_f1 + ecx * 4 - 4], eax
  455.         je      @f
  456.         mov     [old_f1 + ecx * 4 - 4], eax
  457.         mov     esi, val_mod
  458. @@:     mov     ecx, eax
  459.         call    digit_len
  460.         mov     eax, 47
  461.         clear_prev_no edx
  462.         int     0x40
  463.         add     edx, 10
  464.         pop     esi
  465.         pop     ecx
  466.         loop    sh_fan
  467.  
  468.         ;---------------------------
  469.         ; Напруги
  470.         mov     esi, hwm_voltages
  471.         mov     edi, old_volts
  472.         mov     ecx, 7
  473.         mov     ebx, 260 * 65536 + 30
  474.         mov     edx, Data_String
  475. volt_nxt:
  476.         push    ecx
  477.         push    esi
  478.         call    ftoa
  479.         ;реакция на изменения
  480.         xor     ecx, ecx
  481.         fld     dword [esi]
  482.         fsub    dword [edi]
  483.         fabs
  484.  
  485.         ; fcomp dword [c_eps]   ; bug in MeOsEmul
  486.         ; fstsw ax
  487.         fcom    dword [c_eps]   ; 0xBADCODE
  488.         fstsw   ax
  489.         finit
  490.  
  491.         sahf
  492.         jc      @f
  493.         mov     ecx, val_mod
  494. @@:     mov     esi, Data_String        ; считаем кол-во символов
  495. @@:     lodsb
  496.         test    al, al
  497.         jnz     @b
  498.         sub     esi, Data_String
  499.  
  500.         mov     eax, 4
  501.         int     0x40
  502.         add     ebx, 10
  503.         pop     esi
  504.         pop     ecx
  505.         movsd
  506.         loop    volt_nxt
  507.  
  508. no_monitor:
  509.         ;---------------------------
  510.         mov     al, [act_tab]   ; check if info tab is active
  511.         cmp     al, 2
  512.         jne     end_drow_tab
  513.         jmp     free_mem    ; in tab_info.inc
  514.  
  515. end_drow_tab:
  516.         mov     eax, 12
  517.         mov     ebx, 2
  518.         int     0x40
  519.         jmp     wait_for_event
  520. ;---------------------------------------------------------------------
  521.         include "system.inc"
  522.         include "hwm.inc"
  523.         include "diag.inc"
  524.  
  525.  
  526. DATA
  527. act_tab         db      2                       ; active tab number
  528. tab_lab:
  529. .1: db 'Info'
  530. .2: db 'Tests'
  531. .3: db 'Configs'
  532. .4: db 'About'
  533. title           db      'Ghost Monitor v0.4 [18/11/15]',0
  534.  
  535. msgs_mon mls \
  536.         'CPU Load (%)',\
  537.         'Mem Usage(%)',\
  538.         'Temp1',\
  539.         'Temp2',\
  540.         'Temp3',\
  541.         'Fan1',\
  542.         'Fan2',\
  543.         'Fan3',\
  544.         'Fan4',\
  545.         'Fan5'
  546.  
  547. msgs_mon2 mls \
  548.         'Vcore',\
  549.         'AGP',\
  550.         '+3.3V',\
  551.         'AVcc (+5V)',\
  552.         '+12V',\
  553.         '-12V',\
  554.         '-5V'
  555.  
  556. msg_yes         db      'Yes'
  557. msg_no          db      'N/A'
  558.  
  559. update_time     dd      300                     ; период обновления в сотых долях секунды
  560. d_colors        dd      d_cpu_load, d_mem_usage, d_temp1, d_temp2, d_temp3
  561. c_eps           dd      0.01
  562.  
  563. ; Цвета графиков
  564. colors:         dd      0xff0000, 0xff00, 0xff, 0xffffff, tcol, 0xFF7E23, 0x8BA169, 0xff0000    ; первый и последний равны
  565. colors_end:
  566. ;---------------------------------------------------------------------
  567. UDATA
  568.  
  569. test_pid        dd      ?                       ; если test_id == 0 - не имеет смысла
  570. test_id         db      ?                       ; 0 - тест не запушен (соответствует № кнопки 6..10)
  571. diag_add_v      db      ?                       ; 0 - не добавлять данные на график, !0 - добавлять
  572.  
  573. Vendor:         times   12 db ?
  574. CPU_fam:        db      ?
  575. CPU_mod:        db      ?
  576. CPU_type:       db      ?
  577. CPU_mmx:        db      ?
  578.  
  579. ; Для реакции на изменения
  580. old_t1:         dd      ?       ; последнее значение temp1
  581. old_t2:         dd      ?       ; ...
  582. old_t3:         dd      ?
  583. old_f1:         dd      ?
  584. old_f2:         dd      ?
  585. old_f3:         dd      ?
  586. old_volts:      times   7 dd ?
  587.  
  588. ; Грфики
  589. diag_beg:
  590. d_cpu_load:     dd      ?
  591.                 times 286 db ?
  592.  
  593. d_mem_usage:    dd      ?
  594.                 times 286 db ?
  595.  
  596. d_temp1:        dd      ?
  597.                 times 286 db ?
  598.  
  599. d_temp2:        dd      ?
  600.                 times 286 db ?
  601.  
  602. d_temp3:        dd      ?
  603.                 times 286 db ?
  604. diag_end:
  605.  
  606. ; --- стек теста, воизбежание глюков не переносить в другое место ----
  607. th_stack:       times   1024 db ?
  608. stp:
  609. ;---------------------------------------------------------------------
  610. MEOS_APP_END
  611.