Subversion Repositories Kolibri OS

Rev

Rev 7408 | Rev 7443 | 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.3.2: Sep 24, 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 'lang.inc'       ;ïîääåðæêà ÿçûêîâ ïðè êîìïèëÿöèè
  44. include '../../macros.inc'
  45. include '../../proc32.inc'
  46. include '../../dll.inc'
  47. include '../../develop/libraries/box_lib/trunk/box_lib.mac' ;êîìïîíåíòû checkBox è editBox
  48.  
  49. Otstup = 30
  50.  
  51. START:
  52.     call copyKill        ;ïðîñòåéøàÿ çàùèòà îò çàïóñêà âòîðîé êîïèè ïðèëîæåíèÿ
  53.     mcall  68, 11        ;èíèöèàëèçàöèÿ êó÷è
  54.  
  55.     mov  eax,48          ;ïîëó÷èòü ñèñòåìíûå öâåòà
  56.     mov  ebx,3
  57.     mov  ecx, sc
  58.     mov  edx, sizeof.system_colors
  59.     mcall
  60.  
  61.  
  62.     stdcall dll.Load, @IMPORT
  63.     or      eax, eax
  64.     jnz     exit
  65.  
  66.     invoke  init_checkbox, ch1
  67.  
  68.     mov  eax,40          ;óñòàíîâèòü ìàñêó äëÿ îæèäàåìûõ ñîáûòèé
  69.     mov  ebx,0x27        ;ñèñòåìà áóäåò ðåàãèðîâàòü òîëüêî íà ñîîáùåíèå î ïåðåðèñîâêå, íàæàòà êíîïêà, îïðåäåë¸ííàÿ ðàíåå, ñîáûòèå îò ìûøè (÷òî-òî ñëó÷èëîñü - íàæàòèå íà êíîïêó ìûøè èëè ïåðåìåùåíèå; ñáðàñûâàåòñÿ ïðè ïðî÷òåíèè)
  70.     mcall
  71.  
  72.     call  loadConfig     ;çàãðóæàåì êîíôèãóðàöèþ èç ôàéëà, åñëè íåò - òî âûñòàâëÿåì ïàðàìåòðû ïî óìîë÷àíèþ
  73.     call  draw_window    ;îòðèñîâàòü îêíî ïðèëîæåíèÿ
  74.  
  75. ; Îáðàáîòêà öèêëà ñîáûòèé
  76. event_wait:
  77.     mov     eax, 10      ; function 10 : wait until event
  78.     mcall                ; event type is returned in eax
  79.  
  80.     cmp     eax, 1       ; Event redraw request ?
  81.     je      red          ; Expl.: there has been activity on screen and
  82.                          ; parts of the applications has to be redrawn.
  83.  
  84.     cmp     eax, 2       ; Event key in buffer ?
  85.     je      key          ; Expl.: User has pressed a key while the
  86.                          ; app is at the top of the window stack.
  87.  
  88.     cmp     eax, 3       ; Event button in buffer ?
  89.     je      button       ; Expl.: User has pressed one of the
  90.                          ; applications buttons.
  91.  
  92.     invoke  edit_box_mouse, editLU   ;ïðîâåðêà ñîáûòèé ìûøè äëÿ editBox'îâ
  93.     invoke  edit_box_mouse, editLD
  94.     invoke  edit_box_mouse, editRU
  95.     invoke  edit_box_mouse, editRD
  96.     invoke  check_box_mouse, ch1     ;ïðîâåðêà ÷åê áîêñà
  97.  
  98.     jmp     event_wait
  99.  
  100.  
  101. red:                     ;îáðàáîòêà ñîáûòèÿ ïåðåðèñîâêè îêíà
  102.    call    draw_window
  103.    jmp     event_wait
  104.  
  105. key:                                    ; Keypress event handler
  106.         mov     eax, 2                  ; The key is returned in ah. The key must be
  107.         mcall                           ; read and cleared from the system queue.
  108.  
  109.         invoke  edit_box_key, editLU
  110.         invoke  edit_box_key, editLD
  111.         invoke  edit_box_key, editRU
  112.         invoke  edit_box_key, editRD
  113.         jmp     event_wait              ; Just read the key, ignore it and jump to event_wait.
  114.  
  115. button:                                 ; Buttonpress event handler
  116.     mov     eax,17                  ; The button number defined in window_draw
  117.     mcall                           ; is returned to ah.
  118.  
  119.     cmp     ah,1                    ; button id=1 ?
  120.     jne     noclose
  121. exit:
  122.     mov     eax,-1                  ; Function -1 : close this program
  123.     mcall
  124. noclose:
  125.     cmp  ah, 2         ;êíîïêà "Ïðèìåíèòü"
  126.     jne  butend
  127.     call applyButton   ;âûçîâ íàøåãî îáðàáîò÷èêà íàæàòèÿ êíîïêè
  128. butend:
  129.     jmp  event_wait    ;this is for ignored events, useful at development
  130.  
  131.  
  132.  
  133. ;èìÿ êîíôèãóðàöèîííîãî ôàéëà
  134. fileName: db 'SETTINGS/HOTANGLES.CFG', 0
  135.  
  136. ;ñòðóêòóðà äëÿ ñîçäàíèÿ/ïåðåçàïèñè ôàéëà
  137. createFile:
  138.   .func     dd 2    ;íîìåð ïîäôóíêöèè
  139.   .re       dd 0, 0 ;çàðåçåðâèðîâàíî
  140.   .size     dd 0    ;ñêîëüêî áàéò ïèñàòü
  141.   .data_adr dd 0    ;óêàçàòåëü íà äàííûå
  142.   .path     db 0
  143.   .path_adr dd fileName    ;ïóòü
  144.  
  145. ;ñòðîêà ïàðàìåòðîâ ïî óìîë÷àíèþ è å¸ ðàçìåð
  146. 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
  147. defaultDataSize = 48+19
  148.  
  149.  
  150. copyParam:  ;êîïèðóåò ïàðàìåòð(êîìàíäó çàïóñêà) â áóôåð (ñì. äàëüøå)
  151.    push esi ebx ecx
  152.    mov ecx, dword[ebx] ;÷èòàåì ðàçìåð ñòðîêè
  153.  
  154.    cmp ecx, 0          ;ïóñòà ëè ñòðîêà?
  155.    jne copyParam.copy  ;åñëè íåò, òî ïåðåõîäèì ê êîïèðîâàíèþ ñîäåðæèìîãî ñòðîêè (ê  öèêëó)
  156.  
  157.    mov byte[eax], '-'  ;åñëè æå ïóñòî, òî çàìåíÿåì ñèìâîëîì ìèíóñ '-'
  158.    inc eax
  159.    ;jmp copyParam.copyEnd ;è âûõîäèì
  160.    ;äàëåå â íà÷àëå öèêëà ïðîèçîéä¸ò ñðàâíåíèå è âûõîä
  161.  
  162. .copy:  ;êîïèðóåì ñèìâîëû
  163.    cmp ecx, 0
  164.    je copyParam.copyEnd
  165.    mov bl, byte[esi]
  166.    mov byte[eax], bl
  167.    dec ecx
  168.    inc eax
  169.    inc esi
  170.    jmp copyParam.copy
  171. .copyEnd:
  172.    pop ecx ebx esi
  173.    ret
  174.  
  175.  
  176. addPerenos:  ;äîáàâëÿåò ïåðåíîñ ñòðîêè â áóôåð
  177.    mov byte[eax], 13
  178.    inc eax
  179.    mov byte[eax], 10
  180.    inc eax
  181.    ret
  182.  
  183. ;îáðàáîò÷èê êíîïêè "Ïðèìåíèòü"
  184. applyButton:
  185.     push eax ebx ecx
  186.         ;mov dword[createFile.data_adr], defaultDataForConfig
  187.         ;mov dword[createFile.size], defaultDataSize
  188.  
  189.         ;âû÷èñëèì ðàçìåð ôàéëà êîíôèãóðàöèè â áàéòàõ
  190.         mov ecx, 5*2+1 ;1 áàéò íà ñîñòîÿíèå àêòèâíîñòè è 5 ïàð ïåðåíîñîâ ñòðîê (ñèìâîëû 13, 10)
  191.         add ecx, dword[editLU.size] ;ïëþñ ðàçìåð êàæäîé ñòðîêè â áàéòàõ
  192.         add ecx, dword[editLD.size]
  193.         add ecx, dword[editRU.size]
  194.         add ecx, dword[editRD.size] ;dataBuffer.size4]
  195.  
  196.         ;åñëè çàäàíû ïóñòûå ñòðîêè, òî ìû àâòîìàòè÷åñêè äîáàâëÿåì çíàê ìèíóñ, çíà÷èò ðàçìåð +1 áàéò
  197.         cmp dword[editLU.size], 0
  198.         jne @f
  199.         inc ecx
  200. @@:
  201.         cmp dword[editLD.size], 0
  202.         jne @f
  203.         inc ecx
  204. @@:
  205.         cmp dword[editRU.size], 0
  206.         jne @f
  207.         inc ecx
  208. @@:
  209.         cmp dword[editRD.size], 0
  210.         jne @f
  211.         inc ecx
  212. @@:
  213.  
  214.         ;òåïåðü ðàçìåð ôàéëà êîíôèãóðàöèè â ecx
  215.         mov dword[createFile.size], ecx ;ïîëîæèì ðàçìåð áàéò â ñòðóêòóðó ñîçäàíèÿ/ïåðåçàïèñè ôàéëà
  216.         mcall 68, 12, ecx ;âûäåëÿåì áëîê ïàìÿòè ïîä áóôåð ñîäåðæèìîãî
  217.         mov dword[createFile.data_adr], eax ;ñîõðàíÿåì àäðåñ áóôåðà â ñòðóêòóðó
  218.  
  219.         ;çàïîëíèì áóôåð ñîäåðæèìîãî:
  220.         mov byte[eax], 110; 'n' ;ïî óìîë÷àíèþ ôëàã ñíÿò
  221.         cmp word[ch1.flags], 110b ;ch_flag_en and ch_flag_middle ;âûñòàâëåí checkBox èëè íåò?
  222.         jne applyButton.no
  223.         mov byte[eax], 121 ;èíà÷å êëàä¸ì 'y'
  224. .no:
  225.         inc eax
  226.         call addPerenos
  227.  
  228.         push esi ebx
  229.         call UpdateEditsSizes ;îáíîâèòü ðàçìåðû òåêñòà â edit'àõ
  230.  
  231.         mov esi, dataBuffer.1     ;editLU.text
  232.         mov ebx, dataBuffer.size1 ;editLU.size
  233.         call copyParam
  234.         call addPerenos     ;äîáàâëÿåì ïåðåíîñ ñòðîêè
  235.  
  236.         mov esi, dataBuffer.2
  237.         mov ebx, dataBuffer.size2
  238.         call copyParam
  239.         call addPerenos     ;äîáàâëÿåì ïåðåíîñ ñòðîêè
  240.  
  241.         mov esi, dataBuffer.3
  242.         mov ebx, dataBuffer.size3
  243.         call copyParam
  244.         call addPerenos     ;äîáàâëÿåì ïåðåíîñ ñòðîêè
  245.  
  246.         mov esi, dataBuffer.4
  247.         mov ebx, dataBuffer.size4
  248.         call copyParam
  249.         call addPerenos     ;äîáàâëÿåì ïåðåíîñ ñòðîêè
  250.  
  251.         pop ebx esi
  252.  
  253.  
  254.     mov ebx, createFile
  255.     mcall 70
  256.         cmp eax, 0
  257.         je .end
  258.         ;èíà÷å çäåñü íóæíî âûâåñòè îêíî ñ îøèáêîé !!!
  259. .end:
  260.         mcall 68, 13, dword[createFile.data_adr]  ;îñâîáîæäàåì ïàìÿòü ïîä áóôåð
  261.         call finishHotAnglesApp ;çàâåðøàåì ðàáîòó âñåõ êîïèé ñåðâèñà @HOTANGLES
  262.         call loadConfig         ;ïåðåçàãðóæàåì ôàéë êîíôèãà
  263.         call draw_window        ;ïåðåðèñîâûâàåì îêíî
  264.         call startHotAnglesApp  ;ïåðåçàïóñêàåì @HOTANGLES
  265.         pop ecx ebx eax
  266.     ret
  267.  
  268.  
  269.  
  270.  
  271.  
  272.  
  273. compareBytes2:
  274.    push edi esi ecx ebx
  275.    xor eax, eax
  276.    mov ecx, 10  ;max ðàçìåð ñòðîê 11
  277. @@:
  278.    mov bl, byte[edi]
  279.    cmp bl, byte[esi]
  280.    jne compareBytes.no
  281.    inc edi
  282.    inc esi
  283.    cmp ecx, 0
  284.    je @f
  285.    dec ecx
  286.    jmp @b
  287. .no:
  288.    mov eax, 1
  289. @@:
  290.    pop ebx ecx esi edi
  291.    ret
  292.  
  293.  
  294. finishHotAnglesApp:
  295.    ;íàõîäèì âñå êîïèè ïðèëîæåíèÿ ïî èìåíè è çàâåðøàåì èõ
  296.    push eax ebx ecx esi edi
  297.    ;óêàçàòåëè, êîòîðûå íèêîãäà íå ìåíÿþòñÿ:
  298.    mov esi, startAppData.file_name       ;ïåðâàÿ ñòðîêà - èñêîìîå èìÿ ïðèëîæåíèÿ
  299.    mov edi, buf            ;âòîðàÿ ñòðîêà - èìÿ òåêóùåãî ñëîòà
  300.    add edi, 10
  301.  
  302.    mov ecx, 1
  303. @@:
  304.    mcall 9, buf, ecx              ;ïîëó÷àåì äàííûå î÷åðåäíîãî ñëîòà
  305.    mov dword[slotMax], eax
  306.  
  307.    call compareBytes2 ;ñðàâíèâàåì èìÿ
  308.    cmp eax, 0
  309.    jne finishHotAnglesApp.next   ;åñëè íå ñîâïàëî, òî ïåðåõîäèì íà ñëåäóþùèé ñëîò
  310.  
  311.    ;push eax ebx ecx
  312.    mcall 18, 2, ecx               ;èíà÷å çàâåðøàåì ñëîò
  313.    ;pop ecx ebx eax
  314.  
  315. .next:
  316.    inc  ecx
  317.    cmp ecx, dword[slotMax]
  318.    ja @f
  319.    jmp @b
  320. @@:
  321.    pop edi esi ecx ebx eax
  322.    ret
  323.  
  324. startHotAnglesApp:
  325.    ;çàïóñêàåì ïðèëîæåíèå çàíîâî
  326.    push eax ebx
  327.    mcall 70, startAppData
  328.    cmp eax, 0
  329.    ja @f       ;åñëè eax>0, òî óñïåøíî çàïóùåíî
  330.    ;!!! èíà÷å òóò ïå÷àòàåì îøèáêó
  331. @@:
  332.    pop ebx eax
  333.    ret
  334.  
  335. startAppData:
  336.     .subfunction dd   7
  337.     .flags       dd   0
  338.     .param       dd   0
  339.     .rezerv      dd   0, 0
  340.     .full_name   db   '/rd/1/'
  341.     .file_name   db   '@HOTANGLES', 0
  342.     ;db 0
  343.     ;.name: dd HotAnglesAppName
  344. ;HotAnglesAppName db '@HOTANGLES', 0
  345.  
  346.  
  347. UpdateEditsSizes:
  348.    push eax
  349.    mov eax, dword[editLU.size]
  350.    mov dword[dataBuffer.size1], eax
  351.  
  352.    mov eax, dword[editLD.size]
  353.    mov dword[dataBuffer.size2], eax
  354.  
  355.    mov eax, dword[editRU.size]
  356.    mov dword[dataBuffer.size3], eax
  357.  
  358.    mov eax, dword[editRD.size]
  359.    mov dword[dataBuffer.size4], eax
  360.  
  361.    pop eax
  362.    ret
  363.  
  364. fileAdr dd 0
  365.  
  366. loadConfig:
  367.    push eax ebx ecx edx
  368.    mcall 68, 27, fileName   ;çàãðóæàåì êîíôèãóðàöèîííûé ôàéë â ÎÇÓ
  369.    mov dword[fileAdr], eax  ;ñîõðàíÿåì àäðåñ áëîêà ïàìÿòè ôàéëà
  370.    cmp eax, 0
  371.    je loadConfig.default       ;åñëè ôàéëà êîíôèãóðàöèè íåò, òî ñòàâèì íàñòðîéêè ïî óìîë÷àíèþ
  372.    ;èíà÷å äàííûå çàãðóæåíû â ÎÇÓ, ðàçìåð â edx
  373.    cmp edx, 0               ;åñëè ôàéë ïóñò, â í¸ì íåò äàííûõ, òî ñòàâèì íàñòðîéêè ïî óìîë÷àíèþ
  374.    je loadConfig.default
  375. .start:
  376.    add edx, eax             ;êëàä¸ì â edx - àäðåñ êîíöà êîíôèã.äàííûõ
  377.  
  378. .chStart:
  379.    cmp byte[eax], 121 ;'y'  ;âûñòàâëÿåì checkBox - ïàðàìåòð àêòèâíîñòè ïðèëîæåíèÿ
  380.    jne loadConfig.no
  381. .yes:
  382.    mov word[ch1.flags], 110b ;ch_flag_en and ch_flag_middle
  383.    jmp loadConfig.chEnd
  384. .no:
  385.    mov word[ch1.flags], 100b ;ch_flag_middle
  386. .chEnd:
  387.    ;jmp loadConfig.end   ;êîìàíäà äëÿ óäîáñòâà îòëàäêè è ïîèñêà îøèáîê
  388.  
  389.    ;êîïèðóåì ñîäåðæèìîå ñòðîê â áóôåð
  390.    push edi esi ecx ebx eax
  391.    ;èíèöèàëèçèðóåì óêàçàòåëè íà àäðåñà áóôåðà ñòðîêè è å¸ ðàçìåðà
  392.    mov edi, dataBuffer.1
  393.    mov esi, dataBuffer.size1
  394.    ;ecx - ñ÷¸ò÷èê áàéò â ñòðîêå
  395. .block:
  396.    xor ecx, ecx ;îáíóëÿåì ñ÷¸ò÷èê
  397.    inc eax
  398.    cmp byte[eax], 10         ;åñëè î÷åðåäíîé êîä ñèìâîëà 10 èëè 13, òî ïðîïóñêàåì ñèìâîëû
  399.    je loadConfig.block       ;äî ïåðâîãî îòëè÷íîãî îò íèõ
  400.    cmp byte[eax], 13
  401.    je loadConfig.block
  402.  
  403.    ; ñèìâîë îòëè÷åí îò ïåðåíîñà ñòðîêè è âîçâðàòà êàðåòêè - íà÷èíàåì êîïèðîâàòü îòñþäà â áóôåð
  404.    mov bl, byte[eax]
  405.    mov byte[edi], bl
  406.    inc edi
  407.    inc eax
  408.    inc ecx ;óâåëè÷èâàåì ñ÷¸ò÷èê ñèìâîëîâ â ñòðîêå
  409.  
  410.    ;èä¸ì äî êîíöà ýòîé ñòðîêè: ïîêà íå âñòðåòèì î÷åðåäíîé 10, 13, 0 èëè file end
  411. .while:     ;è êîïèðóåì âñ¸ â áóôåð
  412.    cmp eax, edx           ;ïðîâåðÿåì çàêîí÷èëñÿ ëè ôàéë, à êîíöà ñòðîêè íå áûëî !!!
  413.    ja loadConfig.ura
  414.    cmp byte[eax], 10
  415.    je loadConfig.ura
  416.    cmp byte[eax], 0
  417.    je loadConfig.ura
  418.    cmp byte[eax], 13
  419.    je loadConfig.ura
  420.  
  421.    mov bl, byte[eax]
  422.    mov byte[edi], bl
  423.    inc edi
  424.    inc eax
  425.    inc ecx
  426.    cmp ecx, 511
  427.    jae loadConfig.ura
  428.    jmp loadConfig.while
  429. .ura:
  430.    mov byte[edi], 0      ;êëàä¸ì çàâåðøàþùèé 0 â ñòðîêó
  431.    mov dword[esi], ecx   ;ñîõðàíÿåì ðàçìåð ñòðîêè
  432.    add esi, 4            ;ïåðåõîäèì íà ðàçìåð ñëåäóþùåãî áóôåðà
  433.    sub edi, ecx          ;ïåðåõîäèì íà ñëåäóþùèé áóôåð
  434.    add edi, 512
  435.    ;xor ecx, ecx          ;îáíóëÿåì ðàçìåð ñòðîêè
  436.  
  437.    cmp edi, dataBuffer.size1 ;åñëè ýòî áûë ïîñëåäíèé áóôåð (è ìû âûøëè çà àäðåñà ðàçìåðîâ áóôåðîâ), òî âûõîäèì
  438.    jb loadConfig.block
  439.  
  440.    pop eax ebx ecx esi edi
  441.  
  442.    jmp loadConfig.end
  443. .default:
  444.    mov eax, defaultDataForConfig
  445.    mov edx, defaultDataSize
  446.    jmp loadConfig.start
  447. .end:
  448.    mov ecx, dword[fileAdr]    ;åñëè ôàéë áûë çàãðóæåí, òî
  449.    cmp ecx, 0
  450.    je @f
  451.    mcall 68, 13, ecx  ;âûãðóæàåì ôàéë èç ïàìÿòè
  452. @@:
  453.    call updateParams ;ïðèìåíÿåì íàñòðîéêè êàæäîãî áóôåðà
  454.    pop edx ecx ebx eax
  455.    ret
  456.  
  457.  
  458. updateParams: ;max, size, pos
  459.    push eax
  460.    mov eax, dword[dataBuffer.size1]
  461.    mov dword[editLU.size], eax
  462.    mov dword[editLU.pos], eax
  463.  
  464.    mov eax, dword[dataBuffer.size2]
  465.    mov dword[editLD.size], eax
  466.    mov dword[editLD.pos], eax
  467.  
  468.    mov eax, dword[dataBuffer.size3]
  469.    mov dword[editRU.size], eax
  470.    mov dword[editRU.pos], eax
  471.  
  472.    mov eax, dword[dataBuffer.size4]
  473.    mov dword[editRD.size], eax
  474.    mov dword[editRD.pos], eax
  475.    pop eax
  476.    ret
  477.  
  478.  
  479.  
  480. selfName db 'HACONFIG', 0
  481. selfNameSize = 8 ;äî 11 byte
  482. ;
  483. compareBytes:
  484.    push edi esi ecx ebx
  485.    mov eax, 0 ;xor eax, eax
  486.    mov ecx, selfNameSize    ;max ðàçìåð ñòðîê 11
  487. @@:
  488.    mov bl, byte[edi]
  489.    cmp bl, byte[esi]
  490.    jne compareBytes.no
  491.    inc edi
  492.    inc esi
  493.    cmp ecx, 0
  494.    je @f
  495.    dec ecx
  496.    jmp @b
  497. .no:
  498.    mov eax, 1
  499. @@:
  500.    pop ebx ecx esi edi
  501.    ret
  502. ;
  503. slotMax dd 0
  504. selfPID dd 0
  505. buf db 1024 dup(0)
  506. copyKill:
  507.    push eax ebx ecx esi edi
  508.  
  509.    ;ñïåðâà ïðî÷ò¸ì ñâîþ èíôîðìàöèþ
  510.    mcall 9, buf, -1
  511.    mov eax, dword[buf+30]
  512.    mov dword[selfPID], eax
  513.  
  514.    ;óêàçàòåëè, êîòîðûå íèêîãäà íå ìåíÿþòñÿ:
  515.    mov esi, selfName       ;ïåðâàÿ ñòðîêà - èìÿ òåêóùåãî ïðèëîæåíèÿ
  516.    mov edi, buf            ;âòîðàÿ ñòðîêà - èìÿ òåêóùåãî ñëîòà
  517.    add edi, 10
  518.  
  519.    mov ecx, 1
  520. @@:
  521.    mcall 9, buf, ecx
  522.    mov dword[slotMax], eax
  523.  
  524.    ;åñëè ýòî ìû ñàìè, òî ïðîïóñêàåì ïðîâåðêó
  525.    mov eax, dword[buf+30]
  526.    cmp eax, dword[selfPID]
  527.    je copyKill.propusk
  528.  
  529.    call compareBytes   ;ñðàâíèâàåì 11 áàéò ñòðîê, ðåçóëüòàò â eax
  530.  
  531.    cmp eax, 0
  532.    je copyKill.selfKill
  533.  
  534. .propusk:
  535.    inc ecx
  536.    cmp ecx, dword[slotMax]
  537.    ja @f
  538.    jmp @b
  539.  
  540. .selfKill:
  541.    pop edi esi ecx ebx eax
  542.    mcall -1
  543.    ret
  544. @@:
  545.    pop edi esi ecx ebx eax
  546.    ret
  547.  
  548.  WindowsWidth  = 450
  549.  WindowsHeight = 195
  550. coord:      ;êîîðäèíàòû îêíà ïðèëîæåíèÿ
  551.  .y dw 0
  552.  .x dw 0
  553.  
  554. draw_window:
  555.         ;óäàëÿåì êíîïêó, åñëè åñòü
  556.         mov edx, 0x80000002
  557.         mcall 8
  558.  
  559.         mov     eax, 12                 ; function 12: tell os about windowdraw
  560.         mov     ebx, 1                  ; 1, start of draw
  561.         mcall
  562.  
  563.         ;îòîáðàçèì îêíî ïî öåíòðó ýêðàíà äëÿ ýòîãî:
  564.         mcall 14 ;ïîëó÷èì ðàçìåðû ýêðàíà
  565.         mov dword[coord], eax       ;ïîëîæèì ðàçìåðû ýêðàíà â êîîðäèíàòû
  566.         shr word[coord.x], 1        ;âåðíåå ïîëîæèì èõ ïîëîâèíó
  567.         shr word[coord.y], 1
  568.  
  569.         ;âû÷èñëÿåì êîîðäèíàòû îêíà, ÷òîáû îêíî áûëî ïî ñåðåäèíå ýêðàíà
  570.         sub word[coord.x], WindowsWidth/2
  571.         sub word[coord.y], WindowsHeight/2
  572.  
  573.         mov     eax, 0                  ; function 0 : define and draw window
  574.         mov     ebx, 0                  ; [x start] *65536 + [x size]
  575.         mov bx, word[coord.x]
  576.         shl  ebx, 16
  577.         mov bx, WindowsWidth
  578.  
  579.         mov ecx, 0
  580.         mov     cx, word[coord.y]       ; [y start] *65536 + [y size]
  581.         shl ecx, 16
  582.         mov cx, WindowsHeight
  583.  
  584.         mov     edx, 0x14ffffff         ; color of work area RRGGBB
  585.                                         ; 0x02000000 = window type 4 (fixed size, skinned window)
  586.         mov     esi, 0x808899ff         ; color of grab bar  RRGGBB
  587.                                         ; 0x80000000 = color glide
  588.         mov     edi, title
  589.         mcall
  590.  
  591.         invoke  edit_box_draw, editLU  ;ðèñîâàíèå edit box'îâ
  592.         invoke  edit_box_draw, editLD
  593.         invoke  edit_box_draw, editRU
  594.         invoke  edit_box_draw, editRD
  595.  
  596.         invoke  check_box_draw, ch1    ;ðèñîâàíèå ÷åêáîêñîâ
  597.  
  598.         ;ðèñóåì êíîïêó
  599.         mov ebx, (WindowsWidth-80-Otstup)*65536 + 80 ;êîîðäèíàòà X, øèðèíà êíîïêè
  600.         mov ecx, 160*65536 + 20   ;êîîðäèíàòà Y, âûñîòà êíîïêè
  601.         mov edx, 0x00000002 ;2    ;íîìåð êíîïêè
  602.         mov esi, 0x00AABBCC       ;öâåò êíîïêè
  603.         mcall 8
  604.         ;ðèñóåì òåêñò êíîïêè
  605.         mov     ebx, (WindowsWidth-80-Otstup+25-buttonTextXoffset) * 65536 + 166    ;êîîðäèíàòû òåêñòà (x, y)
  606.         mov     ecx, 0xFFFFFF     ;áåëûé öâåò òåêñòà
  607.         mov     edx, buttonText
  608.         mov     esi, buttonTextSize ;5            ;ðàçìåð òåêñòà â ñèìâîëàõ
  609.         mcall 4
  610.  
  611.         call draw_super_text
  612.  
  613.         LineLength = 62
  614.         mov     ebx, 40 * 65536 + 36    ; draw info text with function 4 (x, y)
  615.         mov     ecx, 0x224466
  616.         mov     edx, text
  617.         mov     esi, LineLength
  618.         mov     eax, 4
  619.  
  620.   .newline:                             ; text from the DATA AREA
  621.         mcall
  622.         add     ebx, 12
  623.         add     edx, LineLength
  624.         cmp     byte[edx], 0
  625.         jne     .newline
  626.  
  627.         mov     eax, 12                 ; function 12:tell os about windowdraw
  628.         mov     ebx, 2                  ; 2, end of draw
  629.         mcall
  630.  
  631.         ret
  632.  
  633.  
  634.  
  635.  
  636. align 16
  637. @IMPORT:
  638.  
  639. library box_lib, 'box_lib.obj'
  640.  
  641. import  box_lib,\
  642.         edit_box_draw,          'edit_box',\
  643.         edit_box_key,           'edit_box_key',\
  644.         edit_box_mouse,         'edit_box_mouse',\
  645.         init_checkbox,          'init_checkbox2',\
  646.         check_box_draw,         'check_box_draw2',\
  647.         check_box_mouse,        'check_box_mouse2',\
  648.         option_box_draw,        'option_box_draw',\
  649.         option_box_mouse,       'option_box_mouse'
  650.  
  651.  
  652. ;DATA äàííûå check_box èñïîëüçóåò ñèñòåìíûå öâåòà
  653.  
  654. ;êîîðäèíàòû (x,y) = (30, 160) ðàçìåð ÷åêáîêñà 12, öâåò òåêñòà 0x224466
  655. ch1     check_box2 30 shl 16 + 12, 160 shl 16 + 12, 6, 0xFFFFFFFF, 0xAABBCC, 0x224466, ch_text, 110b ; ch_flag_en and ch_flag_middle
  656.  
  657.  
  658. if lang eq ru  ;åñëè ÿçûê ñáîðêè ðóññêèé
  659.  
  660. text    db  "Š®­ä¨£ãà â®à Hot Angles ®â¢¥ç ¥â §  ­ áâனªã  ªâ¨¢­ëå 㣫®¢. "
  661.         db  " áâன⥠¯ à ¬¥âàë ¯®¤ á¥¡ï ¨«¨ ®âª«îç¨â¥ íâã ®¯æ¨î.         "
  662.         db  "                                                              ", 0
  663.  hed:
  664. title   db  "Š®­ä¨£ãà â®à ã⨫¨âë Hot Angles", 0
  665. buttonText db "à¨¬¥­¨âì", 0
  666. buttonTextSize = 9
  667. buttonTextXoffset = 12
  668.  
  669. ch_text db '‚ª«îç¨âì/ ªâ¨¢¨à®¢ âì "Hot Angles"', 0
  670.  
  671. superText:
  672.   .lu db 'Š®¬ ­¤  «¥¢®£® ¢¥àå­¥£® 㣫 : ', 0
  673.   .ld db 'Š®¬ ­¤  «¥¢®£® ­¨¦­¥£® 㣫 :  ', 0
  674.   .ru db 'Š®¬ ­¤  ¯à ¢®£® ¢¥àå­¥£® 㣫 :', 0
  675.   .rd db 'Š®¬ ­¤  ¯à ¢®£® ­¨¦­¥£® 㣫 : ', 0
  676. superTextSize = 30
  677.  
  678. else  ;èíà÷å àíãëèéñêèé òåêñò
  679.  
  680. text    db  "This is a Hot Angles Configurator.                            "
  681.         db  "Set the parameters bellow for yourself or disable this option."
  682.         db  "                                                              ", 0
  683.  hed:
  684. title   db  "Hot Angles Configurator", 0
  685. buttonText db "Apply", 0
  686. buttonTextSize = 5
  687. buttonTextXoffset = 0
  688.  
  689. ch_text db 'Activate "Hot Angles"',0       ;ñîïðîâîæäàþùèé òåêñò äëÿ ÷åê áîêñà
  690.  
  691. superText:
  692.   .lu db 'Left up angle command:   ', 0
  693.   .ld db 'Left down angle command: ', 0
  694.   .ru db 'Right up angle command:  ', 0
  695.   .rd db 'Right down angle command:', 0
  696. superTextSize = 25
  697.  
  698. end if
  699.  
  700.  
  701. draw_super_text:
  702.    push eax ebx ecx edx edi esi
  703.    mov     ebx, Otstup * 65536 + 74    ; draw info text with function 4 (x, y)
  704.    mov     ecx, 0x224466
  705.    mov eax, superText.lu
  706.    mov     edx, eax
  707.    mov     esi, superTextSize
  708.    mcall 4
  709.  
  710.    mov     ebx, Otstup * 65536 + 109
  711.    mov     edx, superText.ld
  712.    mov     esi, superTextSize
  713.    mcall 4
  714.  
  715.    mov     ebx, 240 * 65536 + 74
  716.    mov     edx, superText.ru
  717.    mov     esi, superTextSize
  718.    mcall 4
  719.  
  720.    mov     ebx, 240 * 65536 + 109
  721.    mov     edx, superText.rd
  722.    mov     esi, superTextSize
  723.    mcall 4
  724.  
  725.    pop esi edi edx ecx ebx eax
  726.    ret
  727.  
  728.  
  729. edMaxSize = 510 ;òåïåðü ñ íîâûì êîìïîíåíòîì ìîæíî è 511 óêàçàòü
  730. edMax = 0 ;max, size, pos
  731.  
  732. align 4
  733. editLU   edit_box 180,Otstup,85, 0xffffff, 0x6a9480, 0, 0xAABBCC, 0, edMaxSize, dataBuffer.1, mouse_dd, 0, edMax, edMax  ;ed_focus
  734. editLD   edit_box 180,Otstup,120, 0xffffff, 0x6a9480, 0, 0xAABBCC, 0, edMaxSize, dataBuffer.2, mouse_dd, 0, edMax, edMax
  735. editRU   edit_box 180,240,85, 0xffffff, 0x6a9480, 0, 0xAABBCC, 0, edMaxSize, dataBuffer.3, mouse_dd, 0, edMax, edMax
  736. editRD   edit_box 180,240,120, 0xffffff, 0x6a9480, 0, 0xAABBCC, 0, edMaxSize, dataBuffer.4, mouse_dd, 0, edMax, edMax
  737.  
  738. dataBuffer:
  739. .1: rb 512
  740. .2: rb 512
  741. .3: rb 512
  742. .4: rb 512
  743. .size1: rd 1
  744. .size2: rd 1
  745. .size3: rd 1
  746. .size4: rd 1
  747. ;255+255+2
  748. ;äâà çàïàñíûõ áàéòà íåîáõîäèìû äëÿ òîãî ÷òî áû íå ïåïåðåïèñàòü ñëåäóþùèåé áàéòû, â êîíöå áóôåðà 0
  749. dataBufferEnd:
  750.  
  751. mouse_dd  dd ?
  752. sc  system_colors
  753.  
  754. I_END:
  755.         rb 4096
  756. align 16
  757. STACKTOP:
  758.  
  759. MEM:
  760.