Subversion Repositories Kolibri OS

Rev

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