Subversion Repositories Kolibri OS

Rev

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

  1. ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
  2. ; Hot Angles Config ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
  3. ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
  4. ; Compile with FASM
  5. ; Version 0.1: Sep 18, 2018
  6.  
  7. ; Copyright (c) 2018, Efremenkov Sergey aka TheOnlyMirage
  8. ; All rights reserved.
  9. ; Redistribution and use in source and binary forms, with or without modification,
  10. ; are permitted provided that the following conditions are met:
  11. ;    * Redistributions of source code must retain the above copyright notice, this
  12. ;    list of conditions and the following disclaimer.
  13. ;    * Redistributions in binary form must reproduce the above copyright  notice,
  14. ;    this list of conditions and the following disclaimer in the documentation and/or
  15. ;    other materials provided with the distribution.
  16. ;    * Neither the name of the <organization> nor the names of its contributors may
  17. ;    be used to endorse or promote products derived from this software without
  18. ;    specific prior written permission.
  19.  
  20. ; THE SOFTWARE IS PROVIDED “AS IS”, WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED,
  21. ; INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A
  22. ; PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT
  23. ; HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
  24. ; OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
  25. ; SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
  26. ; --------------------------------------------------------------------------------------
  27.  
  28. ;P.S. Êîä ñûðîé, òðåáóåòñÿ îïòèìèçàöèÿ è äîðàáîòêà (ñì. òåìó ôîðóìà)
  29. format binary as ""     ; Binary file format without extension
  30. use32                   ; Tell compiler to use 32 bit instructions
  31. org 0                   ; the base address of code, always 0x0
  32.  
  33. ; Çàãîëîâîê èñïîëíÿåìîãî ôàéëà Êîëèáðè ÎÑ
  34. db 'MENUET01'
  35. dd 1
  36. dd START
  37. dd I_END
  38. dd MEM
  39. dd STACKTOP
  40. dd 0, 0
  41.  
  42. ; Íà÷àëî îáëàñòè êîäà
  43. include '../../macros.inc'
  44. include 'editbox.inc'
  45. use_edit_box
  46. include 'check.inc'      ;âêëþ÷èòü ôàéë check.inc
  47. version_ch1              ;íåîáõîäèìûé ìàêðîñ äëÿ âêëþ÷åíèÿ new âåðñèè check_box1
  48. use_check_box            ;èñïîëüçóÿ ìàêðîñû, âíåñòè ïðîöåäóðû äëÿ ðèñîâàíèÿ ÷åê áîêñà
  49.  
  50. Otstup = 30
  51.  
  52. START:
  53.     call copyKill        ;ïðîñòåéøàÿ çàùèòà îò çàïóñêà âòîðîé êîïèè ïðèëîæåíèÿ
  54.     mcall  68, 11        ;èíèöèàëèçàöèÿ êó÷è
  55.  
  56.     mov  eax,48          ;ïîëó÷èòü ñèñòåìíûå öâåòà
  57.     mov  ebx,3
  58.     mov  ecx, sc
  59.     mov  edx, sizeof.system_colors
  60.     mcall
  61.  
  62.     mov  eax,40          ;óñòàíîâèòü ìàñêó äëÿ îæèäàåìûõ ñîáûòèé
  63.     mov  ebx,0x27        ;ñèñòåìà áóäåò ðåàãèðîâàòü òîëüêî íà ñîîáùåíèå î ïåðåðèñîâêå, íàæàòà êíîïêà, îïðåäåë¸ííàÿ ðàíåå, ñîáûòèå îò ìûøè (÷òî-òî ñëó÷èëîñü - íàæàòèå íà êíîïêó ìûøè èëè ïåðåìåùåíèå; ñáðàñûâàåòñÿ ïðè ïðî÷òåíèè)
  64.     mcall
  65.  
  66.     call  loadConfig     ;çàãðóæàåì êîíôèãóðàöèþ èç ôàéëà, åñëè íåò - òî âûñòàâëÿåì ïàðàìåòðû ïî óìîë÷àíèþ
  67.     call  draw_window    ;îòðèñîâàòü îêíî ïðèëîæåíèÿ
  68.  
  69. ; Îáðàáîòêà öèêëà ñîáûòèé
  70. event_wait:
  71.     mov     eax, 10      ; function 10 : wait until event
  72.     mcall                ; event type is returned in eax
  73.  
  74.     cmp     eax, 1       ; Event redraw request ?
  75.     je      red          ; Expl.: there has been activity on screen and
  76.                          ; parts of the applications has to be redrawn.
  77.  
  78.     cmp     eax, 2       ; Event key in buffer ?
  79.     je      key          ; Expl.: User has pressed a key while the
  80.                          ; app is at the top of the window stack.
  81.  
  82.     cmp     eax, 3       ; Event button in buffer ?
  83.     je      button       ; Expl.: User has pressed one of the
  84.                          ; applications buttons.
  85.  
  86.     mouse_edit_boxes editboxes,editboxes_end
  87.     mouse_check_boxes check_boxes,check_boxes_end  ;ïðîâåðêà ÷åê áîêñà
  88.     jmp     event_wait
  89.  
  90.  
  91. red:                     ;îáðàáîòêà ñîáûòèÿ ïåðåðèñîâêè îêíà
  92.    call    draw_window
  93.    jmp     event_wait
  94.  
  95. key:                                    ; Keypress event handler
  96.         mov     eax, 2                  ; The key is returned in ah. The key must be
  97.         mcall                           ; read and cleared from the system queue.
  98.         key_edit_boxes editboxes,editboxes_end
  99.         jmp     event_wait              ; Just read the key, ignore it and jump to event_wait.
  100.  
  101. button:                                 ; Buttonpress event handler
  102.     mov     eax,17                  ; The button number defined in window_draw
  103.     mcall                           ; is returned to ah.
  104.  
  105.     cmp     ah,1                    ; button id=1 ?
  106.     jne     noclose
  107.     mov     eax,-1                  ; Function -1 : close this program
  108.     mcall
  109. noclose:
  110.     cmp  ah, 2         ;êíîïêà "Ïðèìåíèòü"
  111.     jne  butend
  112.     call applyButton   ;âûçîâ íàøåãî îáðàáîò÷èêà íàæàòèÿ êíîïêè
  113. butend:
  114.     jmp  event_wait    ;this is for ignored events, useful at development
  115.  
  116.  
  117.  
  118. ;èìÿ êîíôèãóðàöèîííîãî ôàéëà
  119. fileName: db 'SETTINGS/HOTANGLES.CFG', 0
  120.  
  121. ;ñòðóêòóðà äëÿ ñîçäàíèÿ/ïåðåçàïèñè ôàéëà
  122. createFile:
  123.   .func     dd 2    ;íîìåð ïîäôóíêöèè
  124.   .re       dd 0, 0 ;çàðåçåðâèðîâàíî
  125.   .size     dd 0    ;ñêîëüêî áàéò ïèñàòü
  126.   .data_adr dd 0    ;óêàçàòåëü íà äàííûå
  127.   .path     db 0
  128.   .path_adr dd fileName    ;ïóòü
  129.  
  130. ;ñòðîêà ïàðàìåòðîâ ïî óìîë÷àíèþ è å¸ ðàçìåð
  131. defaultDataForConfig db 121,13,10,'/rd/1/HACONFIG',13,10,'/rd/1/HACONFIG',13,10,'/rd/1/HACONFIG',13,10,'/rd/1/HACONFIG',13,10
  132. defaultDataSize = 48+19
  133.  
  134.  
  135. copyParam:  ;êîïèðóåò ïàðàìåòð(êîìàíäó çàïóñêà) â áóôåð (ñì. äàëüøå)
  136.    push esi ebx ecx
  137.    mov ecx, dword[ebx] ;÷èòàåì ðàçìåð ñòðîêè
  138. .copy:  ;êîïèðóåì ñèìâîëû
  139.    cmp ecx, 0
  140.    je copyParam.copyEnd
  141.    mov bl, byte[esi]
  142.    mov byte[eax], bl
  143.    dec ecx
  144.    inc eax
  145.    inc esi
  146.    jmp copyParam.copy
  147. .copyEnd:
  148.    pop ecx ebx esi
  149.    ret
  150.  
  151.  
  152. addPerenos:  ;äîáàâëÿåò ïåðåíîñ ñòðîêè â áóôåð
  153.    mov byte[eax], 13
  154.    inc eax
  155.    mov byte[eax], 10
  156.    inc eax
  157.    ret
  158.  
  159. ;îáðàáîò÷èê êíîïêè "Ïðèìåíèòü"
  160. applyButton:
  161.     push eax ebx ecx
  162.         ;mov dword[createFile.data_adr], defaultDataForConfig
  163.         ;mov dword[createFile.size], defaultDataSize
  164.  
  165.         ;âû÷èñëèì ðàçìåð ôàéëà êîíôèãóðàöèè â áàéòàõ
  166.         mov ecx, 5*2+1 ;1 áàéò íà ñîñòîÿíèå àêòèâíîñòè è 5 ïàð ïåðåíîñîâ ñòðîê (ñèìâîëû 13, 10)
  167.         add ecx, dword[editLU.size] ;dataBuffer.size1]      ;ïëþñ ðàçìåð êàæäîé ñòðîêè â áàéòàõ
  168.         add ecx, dword[editLD.size] ;dataBuffer.size2]
  169.         add ecx, dword[editRU.size] ;dataBuffer.size3]
  170.         add ecx, dword[editRD.size] ;dataBuffer.size4]
  171.         ;òåïåðü ðàçìåð ôàéëà êîíôèãóðàöèè â ecx
  172.         mov dword[createFile.size], ecx ;ïîëîæèì ðàçìåð áàéò â ñòðóêòóðó ñîçäàíèÿ/ïåðåçàïèñè ôàéëà
  173.         mcall 68, 12, ecx ;âûäåëÿåì áëîê ïàìÿòè ïîä áóôåð ñîäåðæèìîãî
  174.         mov dword[createFile.data_adr], eax ;ñîõðàíÿåì àäðåñ áóôåðà â ñòðóêòóðó
  175.  
  176.         ;çàïîëíèì áóôåð ñîäåðæèìîãî:
  177.         mov byte[eax], 110; 'n' ;ïî óìîë÷àíèþ ôëàã ñíÿò
  178.         cmp word[ch1.flags], ch_flag_en   ;âûñòàâëåí checkBox èëè íåò?
  179.         jne applyButton.no
  180.         mov byte[eax], 121 ;èíà÷å êëàä¸ì 'y'
  181. .no:
  182.         inc eax
  183.         call addPerenos
  184.  
  185.         push esi ebx
  186.         call UpdateEditsSizes ;îáíîâèòü ðàçìåðû òåêñòà â edit'àõ
  187.  
  188.         mov esi, dataBuffer.1 ;editLU.text
  189.         mov ebx, dataBuffer.size1 ;editLU.size
  190.         call copyParam
  191.         call addPerenos     ;äîáàâëÿåì ïåðåíîñ ñòðîêè
  192.  
  193.         mov esi, dataBuffer.2 ;editLD.text
  194.         mov ebx, dataBuffer.size2 ;editLD.size
  195.         call copyParam
  196.         call addPerenos     ;äîáàâëÿåì ïåðåíîñ ñòðîêè
  197.  
  198.         mov esi, dataBuffer.3
  199.         mov ebx, dataBuffer.size3
  200.         call copyParam
  201.         call addPerenos     ;äîáàâëÿåì ïåðåíîñ ñòðîêè
  202.  
  203.         mov esi, dataBuffer.4
  204.         mov ebx, dataBuffer.size4
  205.         call copyParam
  206.         call addPerenos     ;äîáàâëÿåì ïåðåíîñ ñòðîêè
  207.  
  208.         pop ebx esi
  209.  
  210.  
  211.     mov ebx, createFile
  212.     mcall 70
  213.         cmp eax, 0
  214.         je .end
  215.         ;èíà÷å çäåñü íóæíî âûâåñòè îêíî ñ îøèáêîé !!!
  216. .end:
  217.         mcall 68, 13, dword[createFile.data_adr]  ;îñâîáîæäàåì ïàìÿòü ïîä áóôåð
  218.         call restartHotAnglesApp ;ïåðåçàïóñêàåì @HOTANGLES
  219.         pop ecx ebx eax
  220.     ret
  221.  
  222.  
  223.  
  224.  
  225.  
  226.  
  227. compareBytes2:
  228.    push edi esi ecx ebx
  229.    xor eax, eax
  230.    mov ecx, 10  ;max ðàçìåð ñòðîê 11
  231. @@:
  232.    mov bl, byte[edi]
  233.    cmp bl, byte[esi]
  234.    jne compareBytes.no
  235.    inc edi
  236.    inc esi
  237.    cmp ecx, 0
  238.    je @f
  239.    dec ecx
  240.    jmp @b
  241. .no:
  242.    mov eax, 1
  243. @@:
  244.    pop ebx ecx esi edi
  245.    ret
  246.  
  247.  
  248. restartHotAnglesApp:   ;!!!
  249.    ;íàõîäèì âñå êîïèè ïðèëîæåíèÿ ïî èìåíè è çàâåðøàåì èõ
  250.    push eax ebx ecx esi edi
  251.    ;óêàçàòåëè, êîòîðûå íèêîãäà íå ìåíÿþòñÿ:
  252.    mov esi, startAppData.file_name       ;ïåðâàÿ ñòðîêà - èñêîìîå èìÿ ïðèëîæåíèÿ
  253.    mov edi, buf            ;âòîðàÿ ñòðîêà - èìÿ òåêóùåãî ñëîòà
  254.    add edi, 10
  255.  
  256.    mov ecx, 1
  257. @@:
  258.    mcall 9, buf, ecx              ;ïîëó÷àåì äàííûå î÷åðåäíîãî ñëîòà
  259.    mov dword[slotMax], eax
  260.  
  261.    call compareBytes2 ;ñðàâíèâàåì èìÿ
  262.    cmp eax, 0
  263.    jne restartHotAnglesApp.next   ;åñëè íå ñîâïàëî, òî ïåðåõîäèì íà ñëåäóþùèé ñëîò
  264.  
  265.    ;push eax ebx ecx
  266.    mcall 18, 2, ecx               ;èíà÷å çàâåðøàåì ñëîò
  267.    ;pop ecx ebx eax
  268.  
  269. .next:
  270.    inc  ecx
  271.    cmp ecx, dword[slotMax]
  272.    ja @f
  273.    jmp @b
  274. @@:
  275.    pop edi esi ecx ebx eax
  276.  
  277.    ;çàïóñêàåì ïðèëîæåíèå çàíîâî
  278.    push eax ebx
  279.    mcall 70, startAppData
  280.    cmp eax, 0
  281.    ja @f       ;åñëè eax>0, òî óñïåøíî çàïóùåíî
  282.    ;!!! èíà÷å òóò ïå÷àòàåì îøèáêó
  283. @@:
  284.    pop ebx eax
  285.    ret
  286.  
  287. startAppData:
  288.     .subfunction dd   7
  289.     .flags       dd   0
  290.     .param       dd   0
  291.     .rezerv      dd   0, 0
  292.     .full_name   db   '/rd/1/'
  293.     .file_name   db   '@HOTANGLES', 0
  294.     ;db 0
  295.     ;.name: dd HotAnglesAppName
  296. ;HotAnglesAppName db '@HOTANGLES', 0
  297.  
  298.  
  299. UpdateEditsSizes:
  300.    push eax
  301.    mov eax, dword[editLU.size]
  302.    mov dword[dataBuffer.size1], eax
  303.  
  304.    mov eax, dword[editLD.size]
  305.    mov dword[dataBuffer.size2], eax
  306.  
  307.    mov eax, dword[editRU.size]
  308.    mov dword[dataBuffer.size3], eax
  309.  
  310.    mov eax, dword[editRD.size]
  311.    mov dword[dataBuffer.size4], eax
  312.  
  313.    pop eax
  314.    ret
  315.  
  316. fileAdr dd 0
  317.  
  318. loadConfig:
  319.    push eax ebx ecx edx
  320.    mcall 68, 27, fileName   ;çàãðóæàåì êîíôèãóðàöèîííûé ôàéë â ÎÇÓ
  321.    mov dword[fileAdr], eax  ;ñîõðàíÿåì àäðåñ áëîêà ïàìÿòè ôàéëà
  322.    cmp eax, 0
  323.    je loadConfig.default       ;åñëè ôàéëà êîíôèãóðàöèè íåò, òî ñòàâèì íàñòðîéêè ïî óìîë÷àíèþ
  324.    ;èíà÷å äàííûå çàãðóæåíû â ÎÇÓ, ðàçìåð â edx
  325.    cmp edx, 0               ;åñëè ôàéë ïóñò, â í¸ì íåò äàííûõ, òî ñòàâèì íàñòðîéêè ïî óìîë÷àíèþ
  326.    je loadConfig.default
  327. .start:
  328.    add edx, eax             ;êëàä¸ì â edx - àäðåñ êîíöà êîíôèã.äàííûõ
  329.  
  330. .chStart:
  331.    cmp byte[eax], 121 ;'y'  ;âûñòàâëÿåì checkBox - ïàðàìåòð àêòèâíîñòè ïðèëîæåíèÿ
  332.    jne loadConfig.no
  333. .yes:
  334.    mov word[ch1.flags], ch_flag_en
  335.    jmp loadConfig.chEnd
  336. .no:
  337.    mov word[ch1.flags], 0
  338. .chEnd:
  339.    ;jmp loadConfig.end   ;êîìàíäà äëÿ óäîáñòâà îòëàäêè è ïîèñêà îøèáîê
  340.  
  341.    ;êîïèðóåì ñîäåðæèìîå ñòðîê â áóôåð
  342.    push edi esi ecx ebx eax
  343.    ;èíèöèàëèçèðóåì óêàçàòåëè íà àäðåñà áóôåðà ñòðîêè è å¸ ðàçìåðà
  344.    mov edi, dataBuffer.1     ;dword[dataBuffer.1]
  345.    mov esi, dataBuffer.size1 ;dword[dataBuffer.size1]
  346.    ;ecx - ñ÷¸ò÷èê áàéò â ñòðîêå
  347. ;   mov ecx, 0 ;xor ecx, ecx
  348. .block:
  349.    xor ecx, ecx ;îáíóëÿåì ñ÷¸ò÷èê
  350.    inc eax
  351.    cmp byte[eax], 10         ;åñëè î÷åðåäíîé êîä ñèìâîëà 10 èëè 13, òî ïðîïóñêàåì ñèìâîëû
  352.    je loadConfig.block ;propusk     ;äî ïåðâîãî îòëè÷íîãî îò íèõ
  353.    cmp byte[eax], 13
  354.    je loadConfig.block ;propusk
  355.  
  356.    ; ñèìâîë îòëè÷åí îò ïåðåíîñà ñòðîêè è âîçâðàòà êàðåòêè - íà÷èíàåì êîïèðîâàòü îòñþäà â áóôåð
  357.    mov bl, byte[eax]
  358.    mov byte[edi], bl
  359.    inc edi
  360.    inc eax
  361.    inc ecx ;óâåëè÷èâàåì ñ÷¸ò÷èê ñèìâîëîâ â ñòðîêå
  362.  
  363.    ;èä¸ì äî êîíöà ýòîé ñòðîêè: ïîêà íå âñòðåòèì î÷åðåäíîé 10, 13, 0 èëè file end
  364. .while:     ;è êîïèðóåì âñ¸ â áóôåð
  365.    cmp eax, edx           ;ïðîâåðÿåì çàêîí÷èëñÿ ëè ôàéë, à êîíöà ñòðîêè íå áûëî !!!
  366.    ja loadConfig.ura
  367.    cmp byte[eax], 10
  368.    je loadConfig.ura
  369.    cmp byte[eax], 0
  370.    je loadConfig.ura
  371.    cmp byte[eax], 13
  372.    je loadConfig.ura
  373.  
  374.    mov bl, byte[eax]
  375.    mov byte[edi], bl
  376.    inc edi
  377.    inc eax
  378.    inc ecx
  379.    cmp ecx, 511
  380.    jae loadConfig.ura
  381.    jmp loadConfig.while
  382. .ura:
  383.    mov byte[edi], 0      ;êëàä¸ì çàâåðøàþùèé 0 â ñòðîêó
  384.    mov dword[esi], ecx   ;ñîõðàíÿåì ðàçìåð ñòðîêè
  385.    add esi, 4            ;ïåðåõîäèì íà ðàçìåð ñëåäóþùåãî áóôåðà
  386.    sub edi, ecx          ;ïåðåõîäèì íà ñëåäóþùèé áóôåð
  387.    add edi, 512
  388. ;   mov ecx, 0 ;xor ecx, ecx ;îáíóëÿåì ðàçìåð ñòðîêè
  389.  
  390.    cmp edi, dataBuffer.size1 ;åñëè ýòî áûë ïîñëåäíèé áóôåð (è ìû âûøëè çà àäðåñà ðàçìåðîâ áóôåðîâ), òî âûõîäèì
  391.    jb loadConfig.block
  392.  
  393.    pop eax ebx ecx esi edi
  394.  
  395.    jmp loadConfig.end
  396. .default:
  397.    mov eax, defaultDataForConfig
  398.    mov edx, defaultDataSize
  399.    jmp loadConfig.start
  400. .end:
  401.    mov ecx, dword[fileAdr]    ;åñëè ôàéë áûë çàãðóæåí, òî
  402.    cmp ecx, 0
  403.    je @f
  404.    mcall 68, 13, ecx  ;âûãðóæàåì ôàéë èç ïàìÿòè
  405. @@:
  406.    call updateParams ;ïðèìåíÿåì íàñòðîéêè êàæäîãî áóôåðà
  407.    pop edx ecx ebx eax
  408.    ret
  409.  
  410.  
  411. updateParams: ;max, size, pos
  412.    push eax
  413.    mov eax, dword[dataBuffer.size1]
  414.    mov dword[editLU.size], eax
  415.    mov dword[editLU.pos], eax
  416.  
  417.    mov eax, dword[dataBuffer.size2]
  418.    mov dword[editLD.size], eax
  419.    mov dword[editLD.pos], eax
  420.  
  421.    mov eax, dword[dataBuffer.size3]
  422.    mov dword[editRU.size], eax
  423.    mov dword[editRU.pos], eax
  424.  
  425.    mov eax, dword[dataBuffer.size4]
  426.    mov dword[editRD.size], eax
  427.    mov dword[editRD.pos], eax
  428.    pop eax
  429.    ret
  430.  
  431.  
  432.  
  433. selfName db 'HACONFIG', 0 ;'@HOTANGLES',0
  434. selfNameSize = 8;9 ;äî 11 byte
  435. ;
  436. compareBytes:
  437.    push edi esi ecx ebx
  438.    mov eax, 0 ;xor eax, eax
  439.    mov ecx, selfNameSize ;11    ;max ðàçìåð ñòðîê 11
  440. @@:
  441.    mov bl, byte[edi]
  442.    cmp bl, byte[esi]
  443.    jne compareBytes.no
  444.    inc edi
  445.    inc esi
  446.    cmp ecx, 0
  447.    je @f
  448.    dec ecx
  449.    jmp @b
  450. .no:
  451.    mov eax, 1
  452. @@:
  453.    pop ebx ecx esi edi
  454.    ret
  455. ;
  456. slotMax dd 0
  457. selfPID dd 0
  458. buf db 1024 dup(0)
  459. copyKill:
  460.    push eax ebx ecx esi edi
  461.  
  462.    ;ñïåðâà ïðî÷ò¸ì ñâîþ èíôîðìàöèþ
  463.    mcall 9, buf, -1
  464.    mov eax, dword[buf+30]
  465.    mov dword[selfPID], eax
  466.  
  467.    ;óêàçàòåëè, êîòîðûå íèêîãäà íå ìåíÿþòñÿ:
  468.    mov esi, selfName       ;ïåðâàÿ ñòðîêà - èìÿ òåêóùåãî ïðèëîæåíèÿ
  469.    mov edi, buf            ;âòîðàÿ ñòðîêà - èìÿ òåêóùåãî ñëîòà
  470.    add edi, 10
  471.  
  472.    mov ecx, 1
  473. @@:
  474.    mcall 9, buf, ecx
  475.    mov dword[slotMax], eax
  476.  
  477.    ;åñëè ýòî ìû ñàìè, òî ïðîïóñêàåì ïðîâåðêó
  478.    mov eax, dword[buf+30]
  479.    cmp eax, dword[selfPID]
  480.    je copyKill.propusk
  481.  
  482.    call compareBytes   ;ñðàâíèâàåì 11 áàéò ñòðîê, ðåçóëüòàò â eax
  483.  
  484.    cmp eax, 0
  485.    je copyKill.selfKill
  486.  
  487. .propusk:
  488.    inc ecx
  489.    cmp ecx, dword[slotMax]
  490.    ja @f
  491.    jmp @b
  492.  
  493. .selfKill:
  494.    pop edi esi ecx ebx eax
  495.    mcall -1
  496.    ret
  497. @@:
  498.    pop edi esi ecx ebx eax
  499.    ret
  500.  
  501.  WindowsWidth  = 450
  502.  WindowsHeight = 195
  503. coord:      ;êîîðäèíàòû îêíà ïðèëîæåíèÿ
  504.  .y dw 0
  505.  .x dw 0
  506.  
  507. draw_window:
  508.         ;óäàëÿåì êíîïêó, åñëè åñòü
  509.         mov edx, 0x80000002
  510.         mcall 8
  511.  
  512.         mov     eax, 12                 ; function 12: tell os about windowdraw
  513.         mov     ebx, 1                  ; 1, start of draw
  514.         mcall
  515.  
  516.         ;îòîáðàçèì îêíî ïî öåíòðó ýêðàíà äëÿ ýòîãî:
  517.         mcall 14 ;ïîëó÷èì ðàçìåðû ýêðàíà
  518.         mov dword[coord], eax       ;ïîëîæèì ðàçìåðû ýêðàíà â êîîðäèíàòû
  519.         shr word[coord.x], 1        ;âåðíåå ïîëîæèì èõ ïîëîâèíó
  520.         shr word[coord.y], 1
  521.  
  522.         ;âû÷èñëÿåì êîîðäèíàòû îêíà, ÷òîáû îêíî áûëî ïî ñåðåäèíå ýêðàíà
  523.         sub word[coord.x], WindowsWidth/2
  524.         sub word[coord.y], WindowsHeight/2
  525.  
  526.         mov     eax, 0                  ; function 0 : define and draw window
  527.         mov     ebx, 0 ;* 65536 + WindowsWidth   ; [x start] *65536 + [x size]
  528.         mov bx, word[coord.x]
  529.         shl  ebx, 16
  530.         mov bx, WindowsWidth
  531.  
  532.         mov ecx, 0
  533.         mov     cx, word[coord.y] ;* 65536 + WindowsHeight  ; [y start] *65536 + [y size]
  534.         shl ecx, 16
  535.         mov cx, WindowsHeight
  536.  
  537.         mov     edx, 0x14ffffff         ; color of work area RRGGBB
  538.                                         ; 0x02000000 = window type 4 (fixed size, skinned window)
  539.         mov     esi, 0x808899ff         ; color of grab bar  RRGGBB
  540.                                         ; 0x80000000 = color glide
  541.         mov     edi, title
  542.         mcall
  543.  
  544.         draw_check_boxes check_boxes,check_boxes_end ;ðèñîâàíèå ÷åêáîêñîâ
  545.         draw_edit_boxes editboxes,editboxes_end      ;ðèñîâàíèå edit box'îâ
  546.  
  547.         ;ðèñóåì êíîïêó
  548.         mov ebx, (WindowsWidth-80-Otstup)*65536 + 80 ;êîîðäèíàòà X, øèðèíà êíîïêè
  549.         mov ecx, 160*65536 + 20   ;êîîðäèíàòà Y, âûñîòà êíîïêè
  550.         mov edx, 0x00000002 ;2    ;íîìåð êíîïêè
  551.         mov esi, 0x00AABBCC       ;öâåò êíîïêè
  552.         mcall 8
  553.         ;ðèñóåì òåêñò êíîïêè
  554.         mov     ebx, (WindowsWidth-80-Otstup+25) * 65536 + 166    ;êîîðäèíàòû òåêñòà (x, y)
  555.         mov     ecx, 0xFFFFFF     ;áåëûé öâåò òåêñòà
  556.         mov     edx, buttonText
  557.         mov     esi, 5            ;ðàçìåð òåêñòà â ñèìâîëàõ
  558.                 mcall 4
  559.  
  560.         call draw_super_text
  561.  
  562.         LineLength = 62 ;42
  563.         mov     ebx, 40 * 65536 + 36    ; draw info text with function 4 (x, y)
  564.         mov     ecx, 0x224466
  565.         mov     edx, text
  566.         mov     esi, LineLength
  567.         mov     eax, 4
  568.  
  569.   .newline:                             ; text from the DATA AREA
  570.         mcall
  571.         add     ebx, 12
  572.         add     edx, LineLength
  573.         cmp     byte[edx], 0
  574.         jne     .newline
  575.  
  576.         mov     eax, 12                 ; function 12:tell os about windowdraw
  577.         mov     ebx, 2                  ; 2, end of draw
  578.         mcall
  579.  
  580.         ret
  581.  
  582.  
  583. text    db  "This is a Hot Angles Configurator.                            "
  584.         db  "Set the parameters bellow for yourself or disable this option."
  585.         db  "                                                              ", 0
  586.  hed:
  587. title   db  "Hot Angles Configurator", 0
  588. buttonText db "Apply", 0
  589.  
  590. align 4
  591. ;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
  592. ;DATA äàííûå  äëÿ check_box1 - èñïîëüçóåò ñèñòåìíûå öâåòà
  593. ;Ôîðìàò äàííûõ ÷åê áîêñà:
  594. ;   êîîðäèíàòà õ, êîîðäèíàòà ó, óêàçàòåëü íà íà÷àëî ñòðîêè, äëèíà ñòðîêè
  595. ;ñîñòîÿíèå ðàáîòû óòèëèòû: àêòèâíà/íåò
  596. check_boxes:
  597.    ch1 check_box1 30,160,ch_text.1,ch_text.e1-ch_text.1,ch_flag_en
  598. check_boxes_end:
  599.  
  600. ch_text:        ;ñîïðîâîæäàþùèé òåêñò äëÿ ÷åê áîêñîâ
  601. .1 db 'Activate "Hot Angles"'
  602. .e1:
  603.  
  604. superText:
  605.   .lu db 'Left up angle command:', 0
  606.   .ld db 'Left down angle command:', 0
  607.   .ru db "Right up angle command:", 0
  608.   .rd db 'Right down angle command:', 0
  609.  
  610. draw_super_text:
  611.    push eax ebx ecx edx edi esi
  612.    mov     ebx, Otstup * 65536 + 74    ; draw info text with function 4 (x, y)
  613.    mov     ecx, 0x224466
  614.    mov eax, superText.lu
  615.    mov     edx, eax
  616.    mov     esi, 22
  617.    mcall 4
  618.  
  619.    mov     ebx, Otstup * 65536 + 109
  620.    mov     edx, superText.ld
  621.    mov     esi, 24
  622.    mcall 4
  623.  
  624.    mov     ebx, 240 * 65536 + 74
  625.    mov     edx, superText.ru
  626.    mov     esi, 23
  627.    mcall 4
  628.  
  629.    mov     ebx, 240 * 65536 + 109
  630.    mov     edx, superText.rd
  631.    mov     esi, 25
  632.    mcall 4
  633.  
  634.    pop esi edi edx ecx ebx eax
  635.    ret
  636.  
  637.  
  638. edMaxSize = 510
  639. edMax = 0 ;max, size, pos
  640.  
  641. editboxes:
  642. editLU edit_box 180,Otstup,85,0xffffff,0x6a9480,0,0xAABBCC,0,edMaxSize,dataBuffer.1,ed_focus,edMax,edMax
  643. editLD edit_box 180,Otstup,120,0xffffff,0x6a9480,0,0xAABBCC,0,edMaxSize,dataBuffer.2,ed_focus,edMax,edMax
  644. editRU edit_box 180,240,85,0xffffff,0x6a9480,0,0xAABBCC,0,edMaxSize,dataBuffer.3,ed_focus,edMax,edMax
  645. editRD edit_box 180,240,120,0xffffff,0x6a9480,0,0xAABBCC,0,edMaxSize,dataBuffer.4,ed_focus,edMax,edMax
  646. editboxes_end:
  647.  
  648. data_of_code dd 0
  649. mouse_flag dd 0x0
  650.  
  651. dataBuffer:
  652. .1: rb 512
  653. .2: rb 512
  654. .3: rb 512
  655. .4: rb 512
  656. .size1: rd 1
  657. .size2: rd 1
  658. .size3: rd 1
  659. .size4: rd 1
  660. ;255+255+2
  661. ;äâà çàïàñíûõ áàéòà íåîáõîäèìû äëÿ òîãî ÷òî áû íå ïåïåðåïèñàòü ñëåäóþùèåé áàéòû, â êîíöå áóôåðà 0
  662. dataBufferEnd:
  663.  
  664. sc  system_colors
  665.  
  666. I_END:
  667.         rb 4096
  668. align 16
  669. STACKTOP:
  670.  
  671. MEM:
  672.