Subversion Repositories Kolibri OS

Rev

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