Subversion Repositories Kolibri OS

Rev

Rev 7460 | Rev 7776 | 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.8: Oct 14, 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. include '../../develop/libraries/box_lib/load_lib.mac'      ;ìàêðîñ äëÿ çàãðóçêè áèáëèîòåê
  49. @use_library
  50.  
  51. KMENUITEM_NORMAL    equ 0
  52. KMENUITEM_SUBMENU   equ 1
  53. KMENUITEM_SEPARATOR equ 2
  54.  
  55. Otstup = 30
  56.  
  57. START:
  58.     call copyKill        ;ïðîñòåéøàÿ çàùèòà îò çàïóñêà âòîðîé êîïèè ïðèëîæåíèÿ
  59.     mcall  68, 11        ;èíèöèàëèçàöèÿ êó÷è
  60.  
  61.     ;mcall 48,3,sc,sizeof.system_colors ;ïîëó÷èòü ñèñòåìíûå öâåòà
  62.     mov  eax,48          ;ïîëó÷èòü ñèñòåìíûå öâåòà
  63.     mov  ebx,3
  64.     mov  ecx, sc
  65.     mov  edx, sizeof.system_colors
  66.     mcall
  67.  
  68.     stdcall dll.Load, @IMPORT
  69.     or      eax, eax
  70.     jnz     exit
  71.  
  72.     mov  eax,40          ;óñòàíîâèòü ìàñêó äëÿ îæèäàåìûõ ñîáûòèé
  73.     mov  ebx,0x27        ;ñèñòåìà áóäåò ðåàãèðîâàòü òîëüêî íà ñîîáùåíèå î ïåðåðèñîâêå, íàæàòà êíîïêà, îïðåäåë¸ííàÿ ðàíåå, ñîáûòèå îò ìûøè (÷òî-òî ñëó÷èëîñü - íàæàòèå íà êíîïêó ìûøè èëè ïåðåìåùåíèå; ñáðàñûâàåòñÿ ïðè ïðî÷òåíèè)
  74.     mcall
  75.  
  76.     load_libraries l_libs_start,load_lib_end ;çàãðóçêà áèáëèîòåê(è)
  77.     stdcall [OpenDialog_Init],OpenDialog_data ;ïîäãîòîâêà äèàëîãà
  78.  
  79.     ;mode menu
  80.     stdcall [kmenu_init], sc    ;kmenu initialisation
  81.     stdcall [ksubmenu_new]
  82.     mov [modeMenu], eax
  83.     stdcall [kmenuitem_new], KMENUITEM_NORMAL, valueModeMenu0, 110
  84.     stdcall [ksubmenu_add], [modeMenu], eax
  85.     stdcall [kmenuitem_new], KMENUITEM_NORMAL, valueModeMenu1, 111
  86.     stdcall [ksubmenu_add], [modeMenu], eax
  87.     stdcall [kmenuitem_new], KMENUITEM_NORMAL, valueModeMenu2, 112
  88.     stdcall [ksubmenu_add], [modeMenu], eax
  89.     stdcall [kmenuitem_new], KMENUITEM_NORMAL, valueModeMenu3, 113
  90.     stdcall [ksubmenu_add], [modeMenu], eax
  91.         stdcall [kmenuitem_new], KMENUITEM_SUBMENU, valueModeMenu1, [modeMenu]
  92.  
  93.     call  loadConfig     ;çàãðóæàåì êîíôèãóðàöèþ èç ôàéëà, åñëè íåò - òî âûñòàâëÿåì ïàðàìåòðû ïî óìîë÷àíèþ
  94.     call  defaultElems   ;óñòàíàâëèâàåì ðàçìåðû ýëåìåíòîâ â çàâèñèìîñòè îò íàñòðîåê
  95.     call  resizeElems
  96.     call  draw_window    ;îòðèñîâàòü îêíî ïðèëîæåíèÿ
  97.  
  98. ; Îáðàáîòêà öèêëà ñîáûòèé
  99. event_wait:
  100.     mov     eax, 10      ; function 10 : wait until event
  101.     mcall                ; event type is returned in eax
  102.  
  103.     cmp     eax, 1       ; Event redraw request ?
  104.     je      red          ; Expl.: there has been activity on screen and
  105.                          ; parts of the applications has to be redrawn.
  106.  
  107.     cmp     eax, 2       ; Event key in buffer ?
  108.     je      key          ; Expl.: User has pressed a key while the
  109.                          ; app is at the top of the window stack.
  110.  
  111.     cmp     eax, 3       ; Event button in buffer ?
  112.     je      button       ; Expl.: User has pressed one of the
  113.                          ; applications buttons.
  114.  
  115.     invoke  edit_box_mouse, editLU   ;ïðîâåðêà ñîáûòèé ìûøè äëÿ editBox'îâ
  116.     invoke  edit_box_mouse, editLD
  117.     invoke  edit_box_mouse, editRU
  118.     invoke  edit_box_mouse, editRD
  119.     invoke  edit_box_mouse, editRadius
  120.  
  121.     jmp     event_wait
  122.  
  123.  
  124. red:                     ;îáðàáîòêà ñîáûòèÿ ïåðåðèñîâêè îêíà
  125.    call    draw_window
  126.    jmp     event_wait
  127.  
  128. key:                                    ; Keypress event handler
  129.         mov     eax, 2                  ; The key is returned in ah. The key must be
  130.         mcall                           ; read and cleared from the system queue.
  131.  
  132.         invoke  edit_box_key, editLU
  133.         invoke  edit_box_key, editLD
  134.         invoke  edit_box_key, editRU
  135.         invoke  edit_box_key, editRD
  136.         invoke  edit_box_key, editRadius
  137.  
  138.         cmp eax, 1
  139.         je event_wait
  140.         cmp word[hkSymbol], 0
  141.         jne event_wait
  142.         cmp al, 0
  143.         jne .next
  144.         mov byte[hkSymbol], ah
  145.  
  146.         push eax ecx esi            ;ñîõðàíÿåì ñêàíêîä êëàâèøè
  147.         shr eax, 16
  148.         mov byte[keyscan], al
  149.         mov ecx, 0
  150.         mov cl, al ;byte[keyscan]
  151.         mov esi, keystr.data
  152.         call IntToStr
  153.  
  154.         ;ñ÷èòàåì ïîëó÷åííûé ðàçìåð ñòðîêè
  155.         xor ecx, ecx
  156.         mov esi, keystr.data
  157.        @@:
  158.         cmp byte[esi], 0
  159.         je @f
  160.         inc esi
  161.         inc ecx
  162.         ;cmp ecx, 4
  163.         ;je @f
  164.         jmp @b
  165.        @@:
  166.         ;è ñîõðàíÿåì åãî
  167.         mov dword[keystr.size], ecx
  168.  
  169.         pop esi ecx eax
  170.         jmp red
  171. .next:
  172.         ;cmp al, 2
  173.         ;jne @f
  174.         ;cmp ah, 0
  175.         ;jne @f
  176.         ;ñ÷èòûâàåì óïðàâëÿþùèå êëàâèøè
  177.         ;shr eax, 16
  178.         ;bt eax, 0   ;left shift
  179.         ;jne @f
  180.         ;mov byte[hkSymbol], 2
  181.         ;jmp red
  182. @@:
  183.         jmp     event_wait              ; Just read the key, ignore it and jump to event_wait.
  184.  
  185. button:                                 ; Buttonpress event handler
  186.     mov     eax,17                  ; The button number defined in window_draw
  187.     mcall                           ; is returned to ah.
  188.  
  189.     cmp     ah,1                    ; button id=1 ?
  190.     jne     noclose
  191. exit:
  192.     mov     eax,-1                  ; Function -1 : close this program
  193.     mcall
  194. noclose:
  195.     cmp  ah, 2         ;êíîïêà "Ïðèìåíèòü"
  196.     jne  @f ;butend
  197.     call applyButton   ;âûçîâ íàøåãî îáðàáîò÷èêà íàæàòèÿ êíîïêè
  198.     jmp event_wait
  199. @@:
  200.     cmp ah, 4
  201.     jne @f
  202.     mov byte[editID], 4
  203.     call but_open_dlg
  204.     jmp  event_wait
  205. @@:
  206.     cmp ah, 5
  207.     jne @f
  208.     mov byte[editID], 5
  209.     call but_open_dlg
  210.     jmp  event_wait
  211. @@:
  212.     cmp ah, 6
  213.     jne @f
  214.     mov byte[editID], 6
  215.     call but_open_dlg
  216.     jmp  event_wait
  217. @@:
  218.     cmp ah, 7
  219.     jne @f
  220.     mov byte[editID], 7
  221.     call but_open_dlg
  222.     jmp  event_wait
  223. @@:
  224.     cmp ah, 8
  225.     jne @f
  226.     push eax ebx ecx
  227.     mcall 9, pi, -1 ;get window coord
  228.  
  229.     mov eax, dword[pi+34]
  230.     add eax, Otstup ;buttonModeX ;+ 5
  231.     mov word[coordModeMenu.x], ax
  232.  
  233.     mov eax, dword[pi+38]
  234.     add ax, word[elem.butModeY]
  235.     add ax, word[elem.butDialHeight]
  236.     dec ax ;add eax, buttonModeY + 13 ;17
  237.     mov word[coordModeMenu.y], ax
  238.  
  239.     stdcall [ksubmenu_draw], [modeMenu], coordModeMenu
  240.     pop ecx ebx eax
  241.     jmp  event_wait
  242. @@:
  243.     cmp ah, 9
  244.     jne @f
  245.     mov word[hkSymbol], 0
  246.     jmp red ;event_wait
  247. @@:
  248.     cmp ah, 110
  249.     jne @f
  250.     mov byte[mode], 48 ;'0'
  251.     jmp  event_wait
  252. @@:
  253.     cmp ah, 111
  254.     jne @f
  255.     mov byte[mode], 49 ;'1'
  256.     jmp  event_wait
  257. @@:
  258.     cmp ah, 112
  259.     jne @f
  260.     mov byte[mode], 50 ;'2'
  261.     jmp  event_wait
  262. @@:
  263.     cmp ah, 113
  264.     jne @f
  265.     mov byte[mode], 51 ;'3'
  266.     jmp  event_wait
  267. @@:
  268. butend:
  269.     jmp  event_wait    ;this is for ignored events, useful at development
  270.  
  271.  
  272.  
  273. ;èìÿ êîíôèãóðàöèîííîãî ôàéëà
  274. fileName: db 'SETTINGS/HOTANGLES.CFG', 0
  275.  
  276. ;ñòðóêòóðà äëÿ ñîçäàíèÿ/ïåðåçàïèñè ôàéëà
  277. createFile:
  278.   .func     dd 2    ;íîìåð ïîäôóíêöèè
  279.   .re       dd 0, 0 ;çàðåçåðâèðîâàíî
  280.   .size     dd 0    ;ñêîëüêî áàéò ïèñàòü
  281.   .data_adr dd 0    ;óêàçàòåëü íà äàííûå
  282.   .path     db 0
  283.   .path_adr dd fileName    ;ïóòü
  284.  
  285. ;ñòðîêà ïàðàìåòðîâ ïî óìîë÷àíèþ è å¸ ðàçìåð
  286. 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,'Space',13,10,'57',13,10,'10',13,10,'s',13,10
  287. defaultDataSize = 85 ;48+19+4
  288.  
  289.  
  290. copyParam:  ;êîïèðóåò ïàðàìåòð(êîìàíäó çàïóñêà) â áóôåð (ñì. äàëüøå)
  291.    push esi ebx ecx
  292.    mov ecx, dword[ebx] ;÷èòàåì ðàçìåð ñòðîêè
  293.  
  294.    cmp ecx, 0          ;ïóñòà ëè ñòðîêà?
  295.    jne copyParam.copy  ;åñëè íåò, òî ïåðåõîäèì ê êîïèðîâàíèþ ñîäåðæèìîãî ñòðîêè (ê  öèêëó)
  296.  
  297.    mov byte[eax], '-'  ;åñëè æå ïóñòî, òî çàìåíÿåì ñèìâîëîì ìèíóñ '-'
  298.    inc eax
  299.    ;jmp copyParam.copyEnd ;è âûõîäèì
  300.    ;äàëåå â íà÷àëå öèêëà ïðîèçîéä¸ò ñðàâíåíèå è âûõîä
  301.  
  302. .copy:  ;êîïèðóåì ñèìâîëû
  303.    cmp ecx, 0
  304.    je copyParam.copyEnd
  305.    mov bl, byte[esi]
  306.    mov byte[eax], bl
  307.    dec ecx
  308.    inc eax
  309.    inc esi
  310.    jmp copyParam.copy
  311. .copyEnd:
  312.    pop ecx ebx esi
  313.    ret
  314.  
  315.  
  316. addPerenos:  ;äîáàâëÿåò ïåðåíîñ ñòðîêè â áóôåð
  317.    mov byte[eax], 13
  318.    inc eax
  319.    mov byte[eax], 10
  320.    inc eax
  321.    ret
  322.  
  323. ;îáðàáîò÷èê êíîïêè "Ïðèìåíèòü"
  324. applyButton:
  325.     push eax ebx ecx
  326.         ;mov dword[createFile.data_adr], defaultDataForConfig
  327.         ;mov dword[createFile.size], defaultDataSize
  328.  
  329.         ;âû÷èñëèì ðàçìåð ôàéëà êîíôèãóðàöèè â áàéòàõ
  330.         mov ecx, 9*2+1 ;1 áàéò íà ñîñòîÿíèå àêòèâíîñòè è 9 ïàð ïåðåíîñîâ ñòðîê (ñèìâîëû 13, 10)
  331.         add ecx, dword[editLU.size] ;ïëþñ ðàçìåð êàæäîé ñòðîêè â áàéòàõ
  332.         add ecx, dword[editLD.size]
  333.         add ecx, dword[editRU.size]
  334.         add ecx, dword[editRD.size] ;dataBuffer.size4]
  335.         add ecx, dword[editRadius.size]
  336.         add ecx, dword[hkSize] ;ðàçìåð èìåíè àêòèâàöèîííîé êíîïêè
  337.         add ecx, dword[keystr.size] ;ðàçìåð ñêàíêîäà àêòèâàöèîííîé êíîïêè
  338.         inc ecx ; åù¸ 1 áàéò äëÿ õðàíåíèÿ ðàçìåðà ýëåìåíòîâ
  339.  
  340.         ;åñëè çàäàíû ïóñòûå ñòðîêè, òî ìû àâòîìàòè÷åñêè äîáàâëÿåì çíàê ìèíóñ, çíà÷èò ðàçìåð +1 áàéò
  341.         cmp dword[editLU.size], 0
  342.         jne @f
  343.         inc ecx
  344. @@:
  345.         cmp dword[editLD.size], 0
  346.         jne @f
  347.         inc ecx
  348. @@:
  349.         cmp dword[editRU.size], 0
  350.         jne @f
  351.         inc ecx
  352. @@:
  353.         cmp dword[editRD.size], 0
  354.         jne @f
  355.         inc ecx
  356. @@:
  357.  
  358.         ;òåïåðü ðàçìåð ôàéëà êîíôèãóðàöèè â ecx
  359.         mov dword[createFile.size], ecx ;ïîëîæèì ðàçìåð áàéò â ñòðóêòóðó ñîçäàíèÿ/ïåðåçàïèñè ôàéëà
  360.         mcall 68, 12, ecx ;âûäåëÿåì áëîê ïàìÿòè ïîä áóôåð ñîäåðæèìîãî
  361.         mov dword[createFile.data_adr], eax ;ñîõðàíÿåì àäðåñ áóôåðà â ñòðóêòóðó
  362.  
  363.         ;çàïîëíèì áóôåð ñîäåðæèìîãî:
  364.         push ebx    ;ñîõðàíÿåì âûáðàííûé ðåæèì
  365.         mov bl, byte[mode]
  366.         mov byte[eax], bl
  367.         pop ebx
  368.  
  369.         inc eax
  370.         call addPerenos
  371.  
  372.         push esi ebx
  373.         call UpdateEditsSizes ;îáíîâèòü ðàçìåðû òåêñòà â edit'àõ
  374.  
  375.         mov esi, dataBuffer.1
  376.         mov ebx, dataBuffer.size1
  377.         call copyParam
  378.         call addPerenos     ;äîáàâëÿåì ïåðåíîñ ñòðîêè
  379.  
  380.         mov esi, dataBuffer.2
  381.         mov ebx, dataBuffer.size2
  382.         call copyParam
  383.         call addPerenos     ;äîáàâëÿåì ïåðåíîñ ñòðîêè
  384.  
  385.         mov esi, dataBuffer.3
  386.         mov ebx, dataBuffer.size3
  387.         call copyParam
  388.         call addPerenos     ;äîáàâëÿåì ïåðåíîñ ñòðîêè
  389.  
  390.         mov esi, dataBuffer.4
  391.         mov ebx, dataBuffer.size4
  392.         call copyParam
  393.         call addPerenos     ;äîáàâëÿåì ïåðåíîñ ñòðîêè
  394.  
  395.         ;ñîõðàíÿåì êíîïêó àêòèâàöèè
  396.         call saveKey
  397.         call addPerenos
  398.  
  399.         ;ñîõðàíÿåì ñêàíêîä êíîïêè
  400.         mov esi, keystr.data    ;çàïèñûâàåì ñòðîêó keystr â ôàéë
  401.         xor ebx, ebx
  402.       @@:
  403.         cmp byte[esi], 0
  404.         je @f
  405.         mov bl, byte[esi]
  406.         mov byte[eax], bl
  407.         inc eax
  408.         inc esi
  409.         cmp esi, keystr.size-1
  410.         jae @f
  411.         jmp @b
  412.       @@:
  413.         call addPerenos
  414.  
  415.         ;ñîõðàíÿåì ðàäèóñ
  416.         ;!!! åñëè ðàäèóñ îñòàâëåí ïóñòûì, òî íóæíî ñîõðàíÿòü çíà÷åíèå ïî óìîë÷àíèþ (ñåé÷àñ ïèøåòñÿ '-')
  417.         mov esi, radiusBuffer.data
  418.         mov ebx, editRadius.size ;radiusBuffer.size
  419.         call copyParam
  420.         call addPerenos
  421.  
  422.         ;äîáàâëÿåì ðàçìåð ýëåìåíòîâ
  423.         push ebx    ;ñîõðàíÿåì âûáðàííûé ðåæèì
  424.         mov bl, byte[sizeStyle]
  425.         mov byte[eax], bl
  426.         pop ebx
  427.         inc eax
  428.         call addPerenos
  429.  
  430.         pop ebx esi
  431.  
  432.  
  433.     mov ebx, createFile
  434.     mcall 70
  435.         cmp eax, 0
  436.         je .end
  437.         ;èíà÷å çäåñü íóæíî âûâåñòè îêíî ñ îøèáêîé !!!
  438. .end:
  439.         mcall 68, 13, dword[createFile.data_adr]  ;îñâîáîæäàåì ïàìÿòü ïîä áóôåð
  440.         call finishHotAnglesApp ;çàâåðøàåì ðàáîòó âñåõ êîïèé ñåðâèñà @HOTANGLES
  441.         call loadConfig         ;ïåðåçàãðóæàåì ôàéë êîíôèãà
  442.         call draw_window        ;ïåðåðèñîâûâàåì îêíî
  443.         call startHotAnglesApp  ;ïåðåçàïóñêàåì @HOTANGLES
  444.         pop ecx ebx eax
  445.     ret
  446.  
  447.  
  448.  
  449.  
  450.  
  451.  
  452. compareBytes2:
  453.    push edi esi ecx ebx
  454.    xor eax, eax
  455.    mov ecx, 10  ;max ðàçìåð ñòðîê 11
  456. @@:
  457.    mov bl, byte[edi]
  458.    cmp bl, byte[esi]
  459.    jne compareBytes.no
  460.    inc edi
  461.    inc esi
  462.    cmp ecx, 0
  463.    je @f
  464.    dec ecx
  465.    jmp @b
  466. .no:
  467.    mov eax, 1
  468. @@:
  469.    pop ebx ecx esi edi
  470.    ret
  471.  
  472.  
  473. finishHotAnglesApp:
  474.    ;íàõîäèì âñå êîïèè ïðèëîæåíèÿ ïî èìåíè è çàâåðøàåì èõ
  475.    push eax ebx ecx esi edi
  476.    ;óêàçàòåëè, êîòîðûå íèêîãäà íå ìåíÿþòñÿ:
  477.    mov esi, startAppData.file_name       ;ïåðâàÿ ñòðîêà - èñêîìîå èìÿ ïðèëîæåíèÿ
  478.    mov edi, buf            ;âòîðàÿ ñòðîêà - èìÿ òåêóùåãî ñëîòà
  479.    add edi, 10
  480.  
  481.    mov ecx, 1
  482. @@:
  483.    mcall 9, buf, ecx              ;ïîëó÷àåì äàííûå î÷åðåäíîãî ñëîòà
  484.    mov dword[slotMax], eax
  485.  
  486.    call compareBytes2 ;ñðàâíèâàåì èìÿ
  487.    cmp eax, 0
  488.    jne finishHotAnglesApp.next   ;åñëè íå ñîâïàëî, òî ïåðåõîäèì íà ñëåäóþùèé ñëîò
  489.  
  490.    mcall 18, 2, ecx               ;èíà÷å çàâåðøàåì ñëîò
  491. .next:
  492.    inc  ecx
  493.    cmp ecx, dword[slotMax]
  494.    ja @f
  495.    jmp @b
  496. @@:
  497.    pop edi esi ecx ebx eax
  498.    ret
  499.  
  500. startHotAnglesApp:
  501.    ;çàïóñêàåì ïðèëîæåíèå çàíîâî
  502.    push eax ebx
  503.    mcall 70, startAppData
  504.    cmp eax, 0
  505.    ja @f       ;åñëè eax>0, òî óñïåøíî çàïóùåíî
  506.    ;!!! èíà÷å òóò ïå÷àòàåì îøèáêó
  507. @@:
  508.    pop ebx eax
  509.    ret
  510.  
  511. startAppData:
  512.     .subfunction dd   7
  513.     .flags       dd   0
  514.     .param       dd   0
  515.     .rezerv      dd   0, 0
  516.     .full_name   db   '/rd/1/'
  517.     .file_name   db   '@HOTANGLES', 0
  518.  
  519. UpdateEditsSizes:
  520.    push eax
  521.    mov eax, dword[editLU.size]
  522.    mov dword[dataBuffer.size1], eax
  523.  
  524.    mov eax, dword[editLD.size]
  525.    mov dword[dataBuffer.size2], eax
  526.  
  527.    mov eax, dword[editRU.size]
  528.    mov dword[dataBuffer.size3], eax
  529.  
  530.    mov eax, dword[editRD.size]
  531.    mov dword[dataBuffer.size4], eax
  532.  
  533.    mov eax, dword[editRadius.size]
  534.    mov dword[radiusBuffer.size], eax
  535.  
  536.    pop eax
  537.    ret
  538.  
  539. fileAdr dd 0
  540.  
  541. loadConfig:
  542.    push eax ebx ecx edx
  543.    mcall 68, 27, fileName   ;çàãðóæàåì êîíôèãóðàöèîííûé ôàéë â ÎÇÓ
  544.    mov dword[fileAdr], eax  ;ñîõðàíÿåì àäðåñ áëîêà ïàìÿòè ôàéëà
  545.    cmp eax, 0
  546.    je loadConfig.default       ;åñëè ôàéëà êîíôèãóðàöèè íåò, òî ñòàâèì íàñòðîéêè ïî óìîë÷àíèþ
  547.    ;èíà÷å äàííûå çàãðóæåíû â ÎÇÓ, ðàçìåð â edx
  548.    cmp edx, 0               ;åñëè ôàéë ïóñò, â í¸ì íåò äàííûõ, òî ñòàâèì íàñòðîéêè ïî óìîë÷àíèþ
  549.    je loadConfig.default
  550. .start:
  551.    add edx, eax             ;êëàä¸ì â edx - àäðåñ êîíöà êîíôèã.äàííûõ
  552.  
  553. .chStart:
  554.  
  555.    push ebx
  556.    mov bl, byte[eax]
  557.    cmp bl, 48          ; åñëè çíà÷åíèå âûõîäèò çà äîïóñòèìûå ïðåäåëû, òî ïðîâåðÿåì íà 'n' (äëÿ ñîâìåñòèìîñòè)
  558.    jb loadConfig.checkN
  559.    cmp bl, 51
  560.    ja loadConfig.checkN
  561.  
  562.    mov byte[mode], bl  ;èíà÷å óñòàíàâëèâàåì ýòîò ðåæèì êàê åñòü
  563.    jmp loadConfig.modeEnd   ;è èä¸ì äàëüøå
  564. .checkN:
  565.    cmp bl, 'n'             ;åñëè n - òî ðåæèì "îòêëþ÷åíî"
  566.    jne @f
  567.    mov byte[mode], 48 ;'0'
  568.    jmp loadConfig.modeEnd
  569. @@:
  570.    cmp bl, 'y'             ;åñëè y - òî êëàññè÷åñêèé ðåæèì
  571.    jne @f
  572.    mov byte[mode], 49 ;'1'
  573.    jmp loadConfig.modeEnd
  574. @@:
  575.    mov byte[mode], 48 ;'0' èíà÷å ïî óìîë÷àíèþ îòêëþ÷åíî
  576.    ;mov byte[mode], 49 ;'1' èíà÷å ïî óìîë÷àíèþ âêëþ÷¸í êëàññè÷åñêèé ðåæèì ðàáîòû
  577. .modeEnd:
  578.    pop ebx
  579.    ;jmp loadConfig.end   ;êîìàíäà äëÿ óäîáñòâà îòëàäêè è ïîèñêà îøèáîê
  580.  
  581.    ;êîïèðóåì ñîäåðæèìîå ñòðîê â áóôåð
  582.    push edi esi ecx ebx eax
  583.    ;èíèöèàëèçèðóåì óêàçàòåëè íà àäðåñà áóôåðà ñòðîêè è å¸ ðàçìåðà
  584.    mov edi, dataBuffer.1
  585.    mov esi, dataBuffer.size1
  586.    ;ecx - ñ÷¸ò÷èê áàéò â ñòðîêå
  587. .block:
  588.    xor ecx, ecx ;îáíóëÿåì ñ÷¸ò÷èê
  589.    inc eax
  590.    cmp byte[eax], 10         ;åñëè î÷åðåäíîé êîä ñèìâîëà 10 èëè 13, òî ïðîïóñêàåì ñèìâîëû
  591.    je loadConfig.block       ;äî ïåðâîãî îòëè÷íîãî îò íèõ
  592.    cmp byte[eax], 13
  593.    je loadConfig.block
  594.  
  595.    ; ñèìâîë îòëè÷åí îò ïåðåíîñà ñòðîêè è âîçâðàòà êàðåòêè - íà÷èíàåì êîïèðîâàòü îòñþäà â áóôåð
  596.    mov bl, byte[eax]
  597.    mov byte[edi], bl
  598.    inc edi
  599.    inc eax
  600.    inc ecx ;óâåëè÷èâàåì ñ÷¸ò÷èê ñèìâîëîâ â ñòðîêå
  601.  
  602.    ;èä¸ì äî êîíöà ýòîé ñòðîêè: ïîêà íå âñòðåòèì î÷åðåäíîé 10, 13, 0 èëè file end
  603. .while:     ;è êîïèðóåì âñ¸ â áóôåð
  604.    cmp eax, edx           ;ïðîâåðÿåì çàêîí÷èëñÿ ëè ôàéë, à êîíöà ñòðîêè íå áûëî !!!
  605.    ja loadConfig.ura
  606.    cmp byte[eax], 10
  607.    je loadConfig.ura
  608.    cmp byte[eax], 0
  609.    je loadConfig.ura
  610.    cmp byte[eax], 13
  611.    je loadConfig.ura
  612.  
  613.    mov bl, byte[eax]
  614.    mov byte[edi], bl
  615.    inc edi
  616.    inc eax
  617.    inc ecx
  618.    cmp ecx, 511
  619.    jae loadConfig.ura
  620.    jmp loadConfig.while
  621. .ura:
  622.    mov byte[edi], 0      ;êëàä¸ì çàâåðøàþùèé 0 â ñòðîêó
  623.    mov dword[esi], ecx   ;ñîõðàíÿåì ðàçìåð ñòðîêè
  624.    add esi, 4            ;ïåðåõîäèì íà ðàçìåð ñëåäóþùåãî áóôåðà
  625.    sub edi, ecx          ;ïåðåõîäèì íà ñëåäóþùèé áóôåð
  626.    add edi, 512
  627.    ;xor ecx, ecx          ;îáíóëÿåì ðàçìåð ñòðîêè
  628.  
  629.    cmp edi, dataBuffer.size1 ;åñëè ýòî áûë ïîñëåäíèé áóôåð (è ìû âûøëè çà àäðåñà ðàçìåðîâ áóôåðîâ), òî âûõîäèì
  630.    jb loadConfig.block
  631.  
  632.    call readOptKey        ;ñ÷èòûâàåì êëàâèøó
  633.    call gotoEndString
  634.  
  635.    ;ñ÷èòûâàåì ñêàíêîä êëàâèøè
  636.    call readScanKey
  637.    call gotoEndString
  638.  
  639.    call readOptRadius     ;ñ÷èòûâàåì çíà÷åíèå ðàäèóñà äëÿ mode 3
  640.    call gotoEndString
  641.    call readOptSize       ;ñ÷èòûâàåì ðàçìåð ýëåìåíòîâ
  642.    call gotoEndString
  643.  
  644.    pop eax ebx ecx esi edi
  645.  
  646.    jmp loadConfig.end
  647. .default:
  648.    mov eax, defaultDataForConfig
  649.    mov edx, defaultDataSize
  650.    jmp loadConfig.start
  651. .end:
  652.    mov ecx, dword[fileAdr]    ;åñëè ôàéë áûë çàãðóæåí, òî
  653.    cmp ecx, 0
  654.    je @f
  655.    mcall 68, 13, ecx  ;âûãðóæàåì ôàéë èç ïàìÿòè
  656. @@:
  657.    call updateParams ;ïðèìåíÿåì íàñòðîéêè êàæäîãî áóôåðà
  658.    call setMySize    ;ïðèìåíÿåì íàñòðîéêè ðàçìåðà ýëåìåíòîâ
  659.    pop edx ecx ebx eax
  660.    ret
  661.  
  662.  
  663. setMySize:
  664.    push eax
  665.    ;âûñòàâëÿåì mysize â çàâèñèìîñòè îò çíà÷åíèÿ sizeStyle
  666.    cmp byte[sizeStyle], '0'
  667.    jb @f
  668.    cmp byte[sizeStyle], '7'
  669.    ja @f
  670.    mov eax, 0                  ;åñëè çíà÷åíèå ðàçìåðà çàäàíî, òî åãî è âûñòàâëÿåì
  671.    mov al, byte[sizeStyle]
  672.    sub al, '0'
  673.    jmp .end
  674. @@:
  675.    cmp byte[sizeStyle], 'a'
  676.    je .auto
  677.    cmp byte[sizeStyle], 'x'
  678.    je .x
  679. .system:     ;èíà÷å çíà÷åíèå ïî óìîë÷àíèþ: s - ñèñòåìíàÿ
  680.    push ebx ecx edx
  681.    mcall 48, 11   ;ïîëó÷àåì ñèñòåìíûé ðàçìåð øðèôòà
  682.    ;òåïåðü eax - âûñîòà øðèôòà â ïèêñåëÿõ
  683.    mov ebx, 9     ;temp fix -  äåëèì íà òåêóùèé ðàçìåð øðèôòà and -1
  684.    mov edx, 0
  685.    div ebx
  686.    pop edx ecx ebx
  687.  
  688.    cmp eax, 0
  689.    je .end
  690.    cmp eax, 7
  691.    jae .size7
  692.    dec eax
  693.    ;mov eax, 0   ;test
  694.    jmp .end
  695. .x:
  696.    mov byte[sizeStyle], 'x'
  697.    mov eax, 0
  698.    jmp .end
  699. .auto:       ;a - âûñòàâëÿåì â çàâèñèìîñòè îò ðàçðåøåíèÿ ýêðàíà
  700.    mcall 14
  701.    push ebx
  702.    xor ebx, ebx
  703.    mov bx, ax
  704.    shr eax, 16
  705.    cmp ax, bx       ;ïîëó÷àåì áîëüøèé ðàçìåð ñòîðîíû
  706.    jae .a
  707.    mov ax, bx
  708. .a:
  709.    pop ebx
  710.    cmp ax, 1300 ;1919     ;ðàçìåðû ïîëó÷åííûå âûøå îò 0 è íà 1 ìåíüøå
  711.    jb .size0
  712.    cmp ax, 1899 ;919
  713.    jb .x
  714.    cmp ax, 2047
  715.    jb .size1
  716.    cmp ax, 4095
  717.    jb .size2
  718.    cmp ax, 8191
  719.    jb .size3
  720.    cmp ax, 16383
  721.    jb .size4
  722.    cmp ax, 32767
  723.    jb .size5
  724.    cmp ax, 65535
  725.    jb .size6
  726.  
  727.    jmp .size7
  728.  
  729. .size0:
  730.    mov eax, 0
  731.    jmp .end
  732. .size1:
  733.    mov eax, 1
  734.    jmp .end
  735. .size2:
  736.    mov eax, 2
  737.    jmp .end
  738. .size3:
  739.    mov eax, 3
  740.    jmp .end
  741. .size4:
  742.    mov eax, 4
  743.    jmp .end
  744. .size5:
  745.    mov eax, 5
  746.    jmp .end
  747. .size6:
  748.    mov eax, 6
  749.    jmp .end
  750. .size7:
  751.    mov eax, 7
  752.    jmp .end
  753.  
  754. ;.default:
  755. ;   mov eax, 1
  756. .end:
  757.    mov byte[mysize], al ;mov dword[mysize], eax
  758.    pop eax
  759.    ret
  760.  
  761.  
  762. readScanKey:
  763.    ;ïðîïóñêàåì ïåðåíîñû ñòðîê â íà÷àëå
  764.    cmp eax, edx  ;åñëè ôàéë çàêîí÷èëñÿ, òî
  765.    ja .default   ;íàñòðîéêè ïî óìîë÷àíèþ
  766.    cmp byte[eax], 10
  767.    je @f
  768.    cmp byte[eax], 0
  769.    je @f
  770.    cmp byte[eax], 13
  771.    je @f
  772.  
  773.    push ecx ebx esi
  774.    mov ecx, 0 ;xor ecx, ecx
  775.    mov esi, keystr.data
  776. .copy:
  777.    mov bl, byte[eax]
  778.    cmp bl, 0
  779.    je .copyEnd
  780.    cmp bl, 10
  781.    je .copyEnd
  782.    cmp bl, 13
  783.    je .copyEnd
  784.    cmp esi, keystr.size-1
  785.    jae .copyEnd
  786.    mov byte[esi], bl
  787.    inc esi
  788.    inc eax
  789.    inc ecx
  790.    jmp .copy
  791. .copyEnd:
  792.    mov byte[esi], 0
  793.    mov dword[keystr.size], ecx
  794.    pop esi ebx ecx
  795.  
  796.    jmp .end
  797. @@:
  798.    inc eax
  799.    jmp readScanKey
  800. .default:
  801.    mov byte[keyscan], 57
  802.    mov word[keystr.data], '57'
  803.    mov byte[keystr.data+2], 0
  804.    mov dword[keystr.size], 2
  805. .end:
  806.    ret
  807.  
  808. readOptKey:  ;1;3;4;5 - space or shift
  809.    ;ïðîïóñêàåì ïåðåíîñû ñòðîê â íà÷àëå
  810.    cmp eax, edx  ;åñëè ôàéë çàêîí÷èëñÿ, òî
  811.    ja .default   ;íàñòðîéêè ïî óìîë÷àíèþ
  812.    cmp byte[eax], 10
  813.    je @f
  814.    cmp byte[eax], 0
  815.    je @f
  816.    cmp byte[eax], 13
  817.    je @f
  818.    ;èíà÷å ÷èòàåì êëàâèøó è âûõîäèì
  819.    cmp dword[eax], 'Ctrl'
  820.    jne .notCtrl
  821.    mov byte[hkSymbol], 3
  822.    mov dword[hkSize], 4
  823.    jmp .end
  824. .notCtrl:
  825.    cmp dword[eax], 'Shif'
  826.    jne .notShift
  827.    mov byte[hkSymbol], 2
  828.    mov dword[hkSize], 5
  829.    jmp .end
  830. .notShift:
  831.    cmp dword[eax], 'Spac'
  832.    jne .notSpace
  833.    mov byte[hkSymbol], 32
  834.    mov dword[hkSize], 5
  835.    jmp .end
  836. .notSpace:
  837.    cmp word[eax], 'Al'
  838.    jne .notAlt
  839.    mov byte[hkSymbol], 1
  840.    mov dword[hkSize], 3
  841.    jmp .end
  842. .notAlt:
  843.    ;óáåäèìñÿ, ÷òî òàì 1 ñèìâîë, à íå ñòðîêà
  844.    cmp byte[eax+1], 10
  845.    je .oneSymb
  846.    cmp byte[eax+1], 0
  847.    je .oneSymb
  848.    cmp byte[eax+1], 13
  849.    je .oneSymb
  850.    jmp .default
  851. .oneSymb:
  852.    ;ïðîâåðÿåì, ÷òî ñèìâîë ðàçðåø¸ííûé  !!!
  853.  
  854.    ;äîáàâëÿåì ñèìâîë êàê åñòü
  855.    push ebx
  856.    ;xor ebx, ebx
  857.    mov bl, byte[eax]
  858.    mov byte[hkSymbol], bl
  859.    mov dword[hkSize], 1
  860.    pop ebx
  861.  
  862.    jmp .end
  863. @@:
  864.    inc eax
  865.    jmp readOptKey
  866.  
  867. .default:
  868.    mov byte[hkSymbol], 32
  869.    mov dword[hkSize], 5
  870. .end:
  871.    mov byte[hkSymbol+1], 0
  872.    ret
  873.  
  874. ;ïðîõîäèì äî êîíöà òåêóùåé ñòðîêè
  875. gotoEndString:
  876.    cmp eax, edx  ;åñëè ôàéë çàêîí÷èëñÿ, òî
  877.    ja @f         ;âûõîäèì
  878.    cmp byte[eax], 10
  879.    je @f
  880.    cmp byte[eax], 0
  881.    je @f
  882.    cmp byte[eax], 13
  883.    je @f
  884.    ;èíà÷å ïåðåõîäèì íà ñëåäóþùèé ñèìâîë
  885.    inc eax
  886.    jmp gotoEndString
  887. @@:
  888.    ret
  889.  
  890. readOptRadius:
  891.    ;ïðîïóñêàåì ïåðåíîñû ñòðîê â íà÷àëå
  892.    cmp eax, edx  ;åñëè ôàéë çàêîí÷èëñÿ, òî
  893.    ja .default   ;íàñòðîéêè ïî óìîë÷àíèþ
  894.    cmp byte[eax], 10
  895.    je @f
  896.    cmp byte[eax], 0
  897.    je @f
  898.    cmp byte[eax], 13
  899.    je @f
  900.  
  901.    ;èíà÷å ñ÷èòûâàåì çíà÷åíèå
  902.    push ebx ecx
  903.    xor ecx, ecx
  904. .readValue:
  905.    mov bl, byte[eax]
  906.    mov byte[radiusBuffer.data+ecx], bl
  907.    inc ecx
  908.    inc eax
  909.    cmp eax, edx  ;åñëè ôàéë çàêîí÷èëñÿ, òî âûõîä
  910.    ja .readEnd
  911.    cmp byte[eax], 10
  912.    je .readEnd
  913.    cmp byte[eax], 0
  914.    je .readEnd
  915.    cmp byte[eax], 13
  916.    je .readEnd
  917.    cmp ecx, 6
  918.    jae .readEnd
  919.    jmp .readValue
  920. .readEnd:
  921.    mov byte[radiusBuffer.data+ecx], 0
  922.    mov dword[radiusBuffer.size], ecx
  923.    pop ecx ebx
  924.  
  925.    jmp .end
  926. @@:
  927.    inc eax
  928.    jmp readOptRadius
  929. .default:
  930.    mov byte[radiusBuffer.data], '0'
  931.    mov byte[radiusBuffer.data+1], 0
  932.    mov dword[radiusBuffer.size], 1
  933. .end:
  934.  
  935.    ret
  936.  
  937.  
  938. readOptSize:
  939.    ;ïðîïóñêàåì ïåðåíîñû ñòðîê â íà÷àëå
  940.    cmp eax, edx  ;åñëè ôàéë çàêîí÷èëñÿ, òî
  941.    ja .default   ;íàñòðîéêè ïî óìîë÷àíèþ
  942.    cmp byte[eax], 10
  943.    je @f
  944.    cmp byte[eax], 0
  945.    je @f
  946.    cmp byte[eax], 13
  947.    je @f
  948.  
  949.    ;ïðîâåðÿåì, ÷òî ýòî äîïóñòèìîå çíà÷åíèå: 1-7, a, s
  950.    cmp byte[eax], 'a'
  951.    je .setValue
  952.    cmp byte[eax], 's'
  953.    je .setValue
  954.    cmp byte[eax], 'x'
  955.    je .setValue
  956.    cmp byte[eax], '0'
  957.    je .setValue
  958.    cmp byte[eax], '1'
  959.    je .setValue
  960.    cmp byte[eax], '2'
  961.    je .setValue
  962.    cmp byte[eax], '3'
  963.    je .setValue
  964.    cmp byte[eax], '4'
  965.    je .setValue
  966.    cmp byte[eax], '5'
  967.    je .setValue
  968.    cmp byte[eax], '6'
  969.    je .setValue
  970.    cmp byte[eax], '7'
  971.    je .setValue
  972.  
  973.    jmp .default    ;èíà÷å ñòàâèì çíà÷åíèå ïî óìîë÷àíèþ
  974.  
  975. .setValue:
  976.    push ebx
  977.    mov bl, byte[eax]
  978.    mov byte[sizeStyle], bl
  979.    pop ebx
  980.  
  981.    jmp .end
  982. @@:
  983.    inc eax
  984.    jmp readOptSize
  985. .default:
  986.    mov byte[sizeStyle], 's'   ;ñèñòåìíûé
  987. .end:
  988.    ret
  989.  
  990.  
  991.  
  992.  
  993. updateParams: ;max, size, pos
  994.    push eax
  995.    mov eax, dword[dataBuffer.size1]
  996.    mov dword[editLU.size], eax
  997.    mov dword[editLU.pos], eax
  998.  
  999.    mov eax, dword[dataBuffer.size2]
  1000.    mov dword[editLD.size], eax
  1001.    mov dword[editLD.pos], eax
  1002.  
  1003.    mov eax, dword[dataBuffer.size3]
  1004.    mov dword[editRU.size], eax
  1005.    mov dword[editRU.pos], eax
  1006.  
  1007.    mov eax, dword[dataBuffer.size4]
  1008.    mov dword[editRD.size], eax
  1009.    mov dword[editRD.pos], eax
  1010.  
  1011.    mov eax, dword[radiusBuffer.size]
  1012.    mov dword[editRadius.size], eax
  1013.    mov dword[editRadius.pos], eax
  1014.    pop eax
  1015.    ret
  1016.  
  1017.  
  1018.  
  1019. selfName db 'HACONFIG', 0
  1020. selfNameSize = 8 ;äî 11 byte
  1021. ;
  1022. compareBytes:
  1023.    push edi esi ecx ebx
  1024.    mov eax, 0 ;xor eax, eax
  1025.    mov ecx, selfNameSize    ;max ðàçìåð ñòðîê 11
  1026. @@:
  1027.    mov bl, byte[edi]
  1028.    cmp bl, byte[esi]
  1029.    jne compareBytes.no
  1030.    inc edi
  1031.    inc esi
  1032.    cmp ecx, 0
  1033.    je @f
  1034.    dec ecx
  1035.    jmp @b
  1036. .no:
  1037.    mov eax, 1
  1038. @@:
  1039.    pop ebx ecx esi edi
  1040.    ret
  1041. ;
  1042. slotMax dd 0
  1043. selfPID dd 0
  1044. buf db 1024 dup(0)
  1045. copyKill:
  1046.    push eax ebx ecx esi edi
  1047.  
  1048.    ;ñïåðâà ïðî÷ò¸ì ñâîþ èíôîðìàöèþ
  1049.    mcall 9, buf, -1
  1050.    mov eax, dword[buf+30]
  1051.    mov dword[selfPID], eax
  1052.  
  1053.    ;óêàçàòåëè, êîòîðûå íèêîãäà íå ìåíÿþòñÿ:
  1054.    mov esi, selfName       ;ïåðâàÿ ñòðîêà - èìÿ òåêóùåãî ïðèëîæåíèÿ
  1055.    mov edi, buf            ;âòîðàÿ ñòðîêà - èìÿ òåêóùåãî ñëîòà
  1056.    add edi, 10
  1057.  
  1058.    mov ecx, 1
  1059. @@:
  1060.    mcall 9, buf, ecx
  1061.    mov dword[slotMax], eax
  1062.  
  1063.    ;åñëè ýòî ìû ñàìè, òî ïðîïóñêàåì ïðîâåðêó
  1064.    mov eax, dword[buf+30]
  1065.    cmp eax, dword[selfPID]
  1066.    je copyKill.propusk
  1067.  
  1068.    call compareBytes   ;ñðàâíèâàåì 11 áàéò ñòðîê, ðåçóëüòàò â eax
  1069.  
  1070.    cmp eax, 0
  1071.    je copyKill.selfKill
  1072.  
  1073. .propusk:
  1074.    inc ecx
  1075.    cmp ecx, dword[slotMax]
  1076.    ja @f
  1077.    jmp @b
  1078.  
  1079. .selfKill:
  1080.    pop edi esi ecx ebx eax
  1081.    mcall -1
  1082.    ret
  1083. @@:
  1084.    pop edi esi ecx ebx eax
  1085.    ret
  1086.  
  1087.  
  1088.  
  1089.  
  1090. reg: dw 0
  1091. shlRegForSizeElems:
  1092.    push eax edx
  1093.    xor eax, eax
  1094.    xor edx, edx
  1095.    mov ax, word[reg]
  1096.    mov dl, byte[mysize]
  1097. @@:
  1098.    cmp dl, 0
  1099.    je @f
  1100.    shl ax, 1
  1101.    dec dl
  1102.    jmp @b
  1103. @@:
  1104.    mov word[reg], ax
  1105.    pop edx eax
  1106.    ret
  1107.  
  1108.  WindowsWidth  = 450
  1109.  WindowsHeight = 195 + 35 - 5
  1110. coord:      ;êîîðäèíàòû îêíà ïðèëîæåíèÿ
  1111.  .y dw 0
  1112.  .x dw 0
  1113.  
  1114.  
  1115.  
  1116.  
  1117.  
  1118. BaseY = 36  ;ñìåùåíèå äî ïåðâîãî, ñàìîãî âåðõíåãî, ýëåìåíòà âíóòðè îêíà
  1119.  
  1120. elem:
  1121.  .winWidth:  dw 450
  1122.  .winHeight: dw 225
  1123.  .butAppleWidth:  dw 80
  1124.  .butAppleHeight: dw 20
  1125.  .textDelta: dw 3 ;îòñòóï ìåæäó ñòðîêàìè ìíîãîñòðî÷íîãî òåêñòà
  1126.  .butDialWidth:  dw 30      ;âûñîòà è øèðèíà äëÿ 4 êíîïîê äèàëîãîâîãî îêíà
  1127.  .butDialHeight: dw 14
  1128.  .textHeight:    dw 9 ;ðàçìåð âûñîòà øðèôòà
  1129.  ;.editHeight:    dw
  1130.  .editCommandWidth: dw 150 ;180-butDialWidth
  1131.  .butModeWidth: dw 221
  1132.  ;.textCommandUpY: dw 74
  1133.  .butModeY: dw 160
  1134.  ;.editRadiusWidth: dw 40
  1135. elemEnd:
  1136.  
  1137.  
  1138. ;âûñòàâëÿåì âñå çíà÷åíèÿ ïî óìîë÷àíèþ
  1139. defaultElems:
  1140.    mov word[elem.winWidth], 450
  1141.    mov word[elem.winHeight], 225
  1142.    mov word[elem.butAppleWidth], 80
  1143.    mov word[elem.butAppleHeight], 20
  1144.    mov word[elem.textDelta], 3
  1145.    mov word[elem.butDialWidth], 30
  1146.    mov word[elem.butDialHeight], 14
  1147.    mov word[elem.textHeight], 9
  1148.    mov word[elem.editCommandWidth], 150
  1149.    mov word[elem.butModeWidth], 221
  1150.    mov word[elem.butModeY], 160
  1151.    ;mov word[elem.editRadiusWidth], 40
  1152.    ret
  1153.  
  1154. ;ïðîõîäèì ïî âñåì ýëåìåíòàì è ïåðåâû÷èñëÿåì ïàðàìåòðû (ôóíêöèÿ âûïîëíÿåòñÿ 1 ðàç ïðè çàãðóçêå êîíôèãóðàöèè)
  1155. resizeElems:
  1156.    push ebx esi
  1157.    xor ebx, ebx
  1158.    mov esi, elem
  1159. @@:
  1160.    cmp esi, elemEnd
  1161.    jae @f
  1162.  
  1163.    mov bx, word[esi]
  1164.    mov word[reg], bx
  1165.    call shlRegForSizeElems
  1166.    mov bx, word[reg]
  1167.    mov word[esi], bx
  1168.    add esi, 2
  1169.    jmp @b
  1170. @@:
  1171.    pop esi ebx
  1172.    ret
  1173.  
  1174.  
  1175.  
  1176.  
  1177.  
  1178.  
  1179.  
  1180.  
  1181. draw_window:
  1182.    ;óäàëÿåì êíîïêó, åñëè åñòü
  1183.    mov edx, 0x80000002
  1184.    mcall 8
  1185.  
  1186.    ;óäàëÿåì åù¸ 4 êíîïêè åñëè îíè åñòü
  1187.    mov edx, 0x80000004
  1188.    mcall 8
  1189.    mov edx, 0x80000005
  1190.    mcall 8
  1191.    mov edx, 0x80000006
  1192.    mcall 8
  1193.    mov edx, 0x80000007
  1194.    mcall 8
  1195.  
  1196.    mov     eax, 12                 ; function 12: tell os about windowdraw
  1197.    mov     ebx, 1                  ; 1, start of draw
  1198.    mcall
  1199.  
  1200.    cmp byte[sizeStyle], 'x'
  1201.    je draw_window_x
  1202.    jmp draw_window_old
  1203.  
  1204. draw_window_x:
  1205.     mov word[elem.winWidth], 450+150
  1206.     mov word[elem.winHeight], 225+220/2
  1207.     mov word[elem.butAppleWidth], 80+80/3
  1208.     mov word[elem.butAppleHeight], 20+20/3
  1209.     mov word[elem.textDelta], 3
  1210.     mov word[elem.butDialWidth], 30+10
  1211.     mov word[elem.butDialHeight], 14+7
  1212.     mov word[elem.textHeight], 9*2
  1213.     mov word[elem.editCommandWidth], 150+50
  1214.     mov word[elem.butModeWidth], 221
  1215.     mov word[elem.butModeY], 160+90
  1216.  
  1217. draw_window_old:
  1218.         ;îòîáðàçèì îêíî ïî öåíòðó ýêðàíà äëÿ ýòîãî:
  1219.         mcall 14 ;ïîëó÷èì ðàçìåðû ýêðàíà
  1220.         mov dword[coord], eax       ;ïîëîæèì ðàçìåðû ýêðàíà â êîîðäèíàòû
  1221.         shr word[coord.x], 1        ;âåðíåå ïîëîæèì èõ ïîëîâèíó
  1222.         shr word[coord.y], 1
  1223.  
  1224.         ;âû÷èñëÿåì êîîðäèíàòû îêíà, ÷òîáû îêíî áûëî ïî ñåðåäèíå ýêðàíà
  1225.         mov bx, word[elem.winWidth] ;îòíèìàåì îò ñåðåäèíû ýêðàíà ïîëîâèíó ðàçìåðà îêíà
  1226.         shr bx, 1
  1227.         sub word[coord.x], bx
  1228.  
  1229.         mov bx, word[elem.winHeight]
  1230.         shr bx, 1
  1231.         sub word[coord.y], bx
  1232.  
  1233.         mov     eax, 0                  ; function 0 : define and draw window
  1234.         mov     ebx, 0                  ; [x start] *65536 + [x size]
  1235.         mov bx, word[coord.x]
  1236.         shl  ebx, 16
  1237.         mov bx, word[elem.winWidth]
  1238.  
  1239.         mov ecx, 0
  1240.         mov     cx, word[coord.y]       ; [y start] *65536 + [y size]
  1241.         shl ecx, 16
  1242.         mov cx, word[elem.winHeight]
  1243.  
  1244.         mov     edx, 0x14ffffff         ; color of work area RRGGBB
  1245.                                         ; 0x02000000 = window type 4 (fixed size, skinned window)
  1246.         mov     esi, 0x808899ff         ; color of grab bar  RRGGBB
  1247.                                         ; 0x80000000 = color glide
  1248.         mov     edi, title
  1249.         mcall
  1250.  
  1251.  
  1252.         ;ðàçìåðû è êîîðäèíàòû
  1253.         ;push eax
  1254.         xor eax, eax ;mov eax, 0
  1255.         mov ax, word[elem.editCommandWidth]
  1256.         mov dword[editLU.width], eax
  1257.         mov dword[editLD.width], eax
  1258.         mov dword[editRU.width], eax
  1259.         mov dword[editRD.width], eax
  1260.  
  1261.         ;mov ax, word[elem.editRadiusWidth]
  1262.         mov ax, word[elem.winWidth]
  1263.         sub ax, word[elem.butModeWidth]
  1264.         sub ax, Otstup
  1265.         sub ax, word[elem.butAppleHeight] ;Otstup
  1266.         shr ax, 1
  1267.         sub ax, Otstup
  1268.         mov dword[editRadius.width], eax
  1269.  
  1270.         ;mov ax, word[elem.butDialHeight]
  1271.         xor ecx, ecx
  1272.         call setNewSizeForText
  1273.         mov dword[editLU.text_color], ecx ;0x90000000 ;eax
  1274.         mov dword[editLD.text_color], ecx
  1275.         mov dword[editRU.text_color], ecx
  1276.         mov dword[editRD.text_color], ecx
  1277.         mov dword[editRadius.text_color], ecx
  1278.  
  1279.         ;mov ecx, dword[editRadius.height]
  1280.         ;mov word[elem.butDialHeight], cx
  1281.  
  1282.         ;mov eax, 0
  1283.         mov ax, word[elem.winWidth]
  1284.         sub ax, Otstup
  1285.         sub ax, word[elem.butDialWidth]
  1286.         sub ax, word[elem.editCommandWidth]
  1287.         mov dword[editRU.left], eax
  1288.         mov dword[editRD.left], eax
  1289.  
  1290.         mov ax, Otstup
  1291.         add ax, word[elem.butDialWidth]
  1292.         mov dword[editLU.left], eax
  1293.         mov dword[editLD.left], eax
  1294.  
  1295.         mov ax, word[elem.textHeight]
  1296.         add ax, word[elem.textDelta]
  1297.         shl ax, 2
  1298.         add ax, BaseY+2
  1299.         mov dword[editLU.top], eax
  1300.         mov dword[editRU.top], eax
  1301.  
  1302.         add ax, 4
  1303.         ;mov ax, word[elem.textHeight]
  1304.         ;add ax, word[elem.textDelta]
  1305.         ;shl ax, 2
  1306.         sub ax, word[elem.textHeight]
  1307.         ;add ax, BaseY
  1308.         add ax, word[elem.textHeight]
  1309.         ;add ax, 6
  1310.         add ax, word[elem.butDialHeight]
  1311.         add ax, word[elem.textHeight]
  1312.         add ax, word[elem.textHeight]
  1313.         mov dword[editLD.top], eax
  1314.         mov dword[editRD.top], eax
  1315.  
  1316.         ;pop eax
  1317.         ;mcall   48,3,sc,40
  1318.         ;edit_boxes_set_sys_color editRadius, sc  ;editLU, editLD, editRU, editRD, editRadius, sc
  1319.  
  1320.         invoke  edit_box_draw, editLU  ;ðèñîâàíèå edit box'îâ
  1321.         invoke  edit_box_draw, editLD
  1322.         invoke  edit_box_draw, editRU
  1323.         invoke  edit_box_draw, editRD
  1324.  
  1325.         ;ðèñóåì êíîïêó
  1326.         mov bx, word[elem.winWidth]       ;êîîðäèíàòà X êíîïêè
  1327.         sub bx, word[elem.butAppleWidth]
  1328.         sub bx, Otstup
  1329.         shl ebx, 16
  1330.         add bx, word[elem.butAppleWidth]  ;øèðèíà êíîïêè
  1331.  
  1332.         mov cx, word[elem.winHeight]      ;êîîðäèíàòà Y
  1333.         sub cx, word[elem.butAppleHeight]
  1334.         sub cx, 15
  1335.         shl ecx, 16
  1336.         add cx, word[elem.butAppleHeight] ;âûñîòà êíîïêè
  1337.  
  1338.         mov edx, 0x00000002       ;íîìåð êíîïêè
  1339.         mov esi, 0x00AABBCC       ;öâåò êíîïêè
  1340.         mcall 8
  1341.         ;ðèñóåì òåêñò êíîïêè
  1342.         mov bx, word[elem.winWidth]       ;êîîðäèíàòà X òåêñòà
  1343.         sub bx, word[elem.butAppleWidth]
  1344.         sub bx, Otstup
  1345.         add bx, 25
  1346.         sub bx, buttonTextXoffset     ;!!!use size
  1347.         shl ebx, 16
  1348.         add bx, word[elem.winHeight]  ;êîîðäèíàòà Y òåêñòà
  1349.         sub bx, word[elem.butAppleHeight]
  1350.         sub bx, 15
  1351.         add bx, 6                     ;!!!use size
  1352.  
  1353.         mov     ecx, 0xFFFFFF     ;áåëûé öâåò òåêñòà
  1354.         call setNewSizeForText
  1355.         mov     edx, buttonText
  1356.         mov     esi, buttonTextSize  ;ðàçìåð òåêñòà â ñèìâîëàõ
  1357.         mcall 4
  1358.  
  1359.         ;ðèñóåì åù¸ 4 êíîïêè äëÿ äèàëîãîâîãî îêíà âûáîðà ôàéëà
  1360.         ;íîìåðà 4,5,6 è 7
  1361.         buttonH = 14
  1362.         buttonW = 30
  1363.  
  1364.  
  1365.         ;ëåâûé âåðõíèé óãîë
  1366.         mov ebx, Otstup ;êîîðäèíàòà X
  1367.         shl ebx, 16
  1368.         add bx, word[elem.butDialWidth] ;øèðèíà êíîïêè
  1369.  
  1370.         ;mov ecx, 85     ;êîîðäèíàòà Y      36+3*9+2*3+ 5 +9+2
  1371.         ;BaseY+4*(word[elem.textHeight]+word[elem.textDelta])+2
  1372.         mov cx, word[elem.textHeight]
  1373.         add cx, word[elem.textDelta]
  1374.         shl cx, 2
  1375.         add cx, BaseY+2
  1376.         shl ecx, 16
  1377.         add cx, word[elem.butDialHeight] ;âûñîòà êíîïêè
  1378.  
  1379.         mov edx, 0x00000004       ;íîìåð êíîïêè
  1380.         mov esi, 0x00AABBCC       ;öâåò êíîïêè
  1381.         mcall 8
  1382.  
  1383.         ;ëåâûé íèæíèé óãîë
  1384.         mov ebx, Otstup ;êîîðäèíàòà X
  1385.         shl ebx, 16
  1386.         add bx, word[elem.butDialWidth] ;øèðèíà êíîïêè
  1387.         ;mov ecx, 120    ;êîîðäèíàòà Y
  1388.         mov cx, word[elem.textHeight]
  1389.         add cx, word[elem.textDelta]
  1390.         shl cx, 2
  1391.         sub cx, word[elem.textHeight]
  1392.         add cx, BaseY
  1393.         add cx, word[elem.textHeight]
  1394.         add cx, 6
  1395.         add cx, word[elem.butDialHeight]
  1396.         add cx, word[elem.textHeight]
  1397.         add cx, word[elem.textHeight]
  1398.  
  1399.         shl ecx, 16
  1400.         add cx, word[elem.butDialHeight] ;âûñîòà êíîïêè
  1401.  
  1402.         mov edx, 0x00000005       ;íîìåð êíîïêè
  1403.         mov esi, 0x00AABBCC       ;öâåò êíîïêè
  1404.         mcall 8
  1405.  
  1406.         ;ïðàâûé âåðõíèé óãîë
  1407.         ;mov ebx, (WindowsWidth-Otstup-buttonW)*65536 + buttonW ;êîîðäèíàòà X, øèðèíà êíîïêè
  1408.         mov bx,  word[elem.winWidth] ;êîîðäèíàòà X
  1409.         sub bx, Otstup
  1410.         sub bx, word[elem.butDialWidth]
  1411.  
  1412.         shl ebx, 16
  1413.         add bx, word[elem.butDialWidth] ;øèðèíà êíîïêè
  1414.  
  1415.         ;mov ecx, 85     ;êîîðäèíàòà Y      36+3*9+2*3+ 5 +9+2
  1416.         ;BaseY+4*(word[elem.textHeight]+word[elem.textDelta])+2
  1417.         mov cx, word[elem.textHeight]
  1418.         add cx, word[elem.textDelta]
  1419.         shl cx, 2
  1420.         add cx, BaseY+2
  1421.         shl ecx, 16
  1422.         add cx, word[elem.butDialHeight] ;âûñîòà êíîïêè
  1423.  
  1424.         mov edx, 0x00000006       ;íîìåð êíîïêè
  1425.         mov esi, 0x00AABBCC       ;öâåò êíîïêè
  1426.         mcall 8
  1427.  
  1428.  
  1429.  
  1430.  
  1431.         ;ïðàâûé íèæíèé óãîë
  1432.         mov bx,  word[elem.winWidth]    ;êîîðäèíàòà X
  1433.         sub bx, Otstup
  1434.         sub bx, word[elem.butDialWidth]
  1435.         shl ebx, 16
  1436.         add bx, word[elem.butDialWidth] ;øèðèíà êíîïêè
  1437.  
  1438.         mov cx, word[elem.textHeight]   ;êîîðäèíàòà Y
  1439.         add cx, word[elem.textDelta]
  1440.         shl cx, 2
  1441.         sub cx, word[elem.textHeight]
  1442.         add cx, BaseY
  1443.         add cx, word[elem.textHeight]
  1444.         add cx, 6
  1445.         add cx, word[elem.butDialHeight]
  1446.         add cx, word[elem.textHeight]
  1447.         add cx, word[elem.textHeight]
  1448.         shl ecx, 16
  1449.         add cx, word[elem.butDialHeight] ;âûñîòà êíîïêè
  1450.  
  1451.         mov edx, 0x00000007       ;íîìåð êíîïêè
  1452.         mov esi, 0x00AABBCC       ;öâåò êíîïêè
  1453.         mcall 8
  1454.  
  1455.         ;ðèñóåì òåêñòû äëÿ ýòèõ 4 êíîïîê
  1456.         mov     ecx, 0xFFFFFF              ;áåëûé öâåò òåêñòà
  1457.         call setNewSizeForText
  1458.         mov     edx, commonButtonText      ;ñòðîêà òåêñòà
  1459.         mov     esi, commonButtonTextSize  ;ðàçìåð òåêñòà â ñèìâîëàõ
  1460.         ;êîîðäèíàòû òåêñòà (x, y)
  1461.         deltaCommonTextX = 7
  1462.         deltaCommonTextY = 2
  1463.         ;mov     ebx, (Otstup+deltaCommonTextX) * 65536 + (85 + deltaCommonTextY)
  1464.         mov ebx, Otstup+deltaCommonTextX
  1465.         shl ebx, 16
  1466.         mov bx, word[elem.textHeight]
  1467.         add bx, word[elem.textDelta]
  1468.         shl bx, 2
  1469.         add bx, BaseY+2
  1470.         add bx, deltaCommonTextY
  1471.  
  1472.         mcall 4
  1473.  
  1474. ;
  1475.         ;mov     ebx, (Otstup+deltaCommonTextX) * 65536 + (120 + deltaCommonTextY)
  1476.         mov ebx, Otstup+deltaCommonTextX
  1477.         shl ebx, 16
  1478.         mov bx, word[elem.textHeight]   ;êîîðäèíàòà Y
  1479.         add bx, word[elem.textDelta]
  1480.         shl bx, 2
  1481.         sub bx, word[elem.textHeight]
  1482.         add bx, BaseY
  1483.         add bx, word[elem.textHeight]
  1484.         add bx, 6
  1485.         add bx, word[elem.butDialHeight]
  1486.         add bx, word[elem.textHeight]
  1487.         add bx, word[elem.textHeight]
  1488.         add bx, deltaCommonTextY
  1489.  
  1490.         mcall 4
  1491.  
  1492.  
  1493.         ;mov     ebx, (WindowsWidth-Otstup-buttonW+deltaCommonTextX) * 65536 + (85 + deltaCommonTextY)
  1494.         mov bx,  word[elem.winWidth]    ;êîîðäèíàòà X
  1495.         sub bx, Otstup
  1496.         sub bx, word[elem.butDialWidth]
  1497.         add bx, deltaCommonTextX
  1498.         shl ebx, 16
  1499.         mov bx, word[elem.textHeight]
  1500.         add bx, word[elem.textDelta]
  1501.         shl bx, 2
  1502.         add bx, BaseY+2
  1503.         add bx, deltaCommonTextY
  1504.  
  1505.         mcall 4
  1506.  
  1507.         ;mov     ebx, (WindowsWidth-Otstup-buttonW+deltaCommonTextX) * 65536 + (120 + deltaCommonTextY)
  1508.         mov bx,  word[elem.winWidth]    ;êîîðäèíàòà X
  1509.         sub bx, Otstup
  1510.         sub bx, word[elem.butDialWidth]
  1511.         add bx, deltaCommonTextX
  1512.         shl ebx, 16
  1513.         mov bx, word[elem.textHeight]   ;êîîðäèíàòà Y
  1514.         add bx, word[elem.textDelta]
  1515.         shl bx, 2
  1516.         sub bx, word[elem.textHeight]
  1517.         add bx, BaseY
  1518.         add bx, word[elem.textHeight]
  1519.         add bx, 6
  1520.         add bx, word[elem.butDialHeight]
  1521.         add bx, word[elem.textHeight]
  1522.         add bx, word[elem.textHeight]
  1523.         add bx, deltaCommonTextY
  1524.  
  1525.         mcall 4
  1526.  
  1527.         ;delete mode button, if it exist
  1528.         mov edx, 0x80000008
  1529.         mcall 8
  1530.         ;draw button Mode
  1531.         buttonModeX = 30
  1532.         buttonModeY = 160
  1533.         buttonModeWidth = 221
  1534.         buttonModeHeight = 14
  1535.         buttonModeTextYoffset = 3
  1536.         buttonModeTextXoffset = 5
  1537.         ;mov ebx, buttonModeX*65536 + buttonModeWidth  ;X + Width
  1538.         mov ebx, Otstup
  1539.         shl ebx, 16
  1540.         add bx, word[elem.butModeWidth]
  1541.  
  1542.         mov cx, word[elem.butModeY] ;buttonModeY;*65536 + buttonModeHeight ;Y + Height
  1543.         shl ecx, 16
  1544.         mov cx, word[elem.butDialHeight]
  1545.  
  1546.         mov edx, 0x00000008    ;button id
  1547.         mov esi, 0x00FFFFFF    ;color button
  1548.         mcall 8
  1549.  
  1550.         ;mov ebx, (buttonModeX+2+buttonModeWidth-20)*65536 + (20-2)  ;X + Width
  1551.         mov ebx, Otstup+2
  1552.         add bx, word[elem.butModeWidth]
  1553.         sub bx, 20
  1554.         shl ebx, 16
  1555.         add bx, 20-2
  1556.  
  1557.        ; mov ecx, (buttonModeY+1)*65536 + buttonModeHeight-2   ;Y + Height
  1558.         mov cx, word[elem.butModeY]
  1559.         inc ecx
  1560.         shl ecx, 16
  1561.         mov cx, word[elem.butDialHeight]
  1562.         sub cx, 2
  1563.  
  1564.         mov edx, 0xAABBCC
  1565.         mcall 13
  1566.         ;draw text for button Mode
  1567.         mov     ebx, (Otstup+buttonModeTextXoffset) * 65536     ;(x, y)
  1568.         mov bx, word[elem.butModeY]
  1569.         add bx, buttonModeTextYoffset
  1570.         mov     ecx, 0x000000
  1571.         call setNewSizeForText
  1572.         and ecx, 0x7FFFFFFF
  1573.         call setTextModeMenu
  1574. mov     esi, valueModeMenuSize
  1575. cmp byte[sizeStyle], 'x'
  1576. jne @f
  1577.         mov     esi, 25 ;valueModeMenuSize -3     ;ðåæèì æåñòà ïî êëàâèøå àê
  1578. @@:
  1579.         mcall 4
  1580.  
  1581.         mov     ebx, (Otstup-12)
  1582.         add bx, word[elem.butModeWidth]
  1583.         shl ebx, 16
  1584.         mov bx, word[elem.butModeY]
  1585.         add bx, buttonModeTextYoffset
  1586.  
  1587.         mov     ecx, 0x80FFFFFF   ;80
  1588.         call setNewSizeForText
  1589.         and ecx, 0x7FFFFFFF
  1590.         ;or ecx, 0x80000000
  1591.  
  1592.         mov     edx, symbolDownArrow
  1593.         mov esi, 1
  1594.         mcall 4
  1595.  
  1596.         ;êíîïêà âûáîðà ãîðÿ÷åé êëàâèøè
  1597.         buttonHotKeyX = 270
  1598.         buttonHotKeyWidth = 90
  1599.         mov edx, 0x80000009    ;óäàëÿåì
  1600.         mcall 8
  1601.     cmp byte[mode], 49    ;ðèñóåì âûáîð êëàâèøè, òîëüêî åñëè mode > 1
  1602.     jbe @f
  1603.         ;ðèñóåì íîâóþ
  1604.         push eax ebx ecx edx esi
  1605.        ; mov ebx, buttonHotKeyX*65536 + buttonHotKeyWidth  ;X + Width
  1606.         mov ebx, Otstup
  1607.         add bx, word[elem.butModeWidth]
  1608.         add bx, word[elem.butAppleHeight]
  1609.         shl ebx, 16
  1610.         mov bx, word[elem.winWidth] ;buttonHotKeyWidth
  1611.         sub bx, word[elem.butModeWidth]
  1612.         sub bx, Otstup
  1613.         sub bx, word[elem.butAppleHeight] ;Otstup
  1614.         shr bx, 1
  1615.         sub bx, Otstup
  1616.        ; mov ecx, buttonModeY*65536 + buttonModeHeight ;Y + Height
  1617.         mov cx, word[elem.butModeY]
  1618.         shl ecx, 16
  1619.         mov cx, word[elem.butDialHeight]
  1620.  
  1621.         mov edx, 0x00000009    ;button id
  1622.         mov esi, 0x00FFFFFF    ;color button
  1623.         mcall 8
  1624.         pop esi edx ecx ebx eax
  1625.         ;òåêñò ïîäñêàçêè äëÿ ãîðÿ÷åé êëàâèøè
  1626.         ;mov     ebx, (buttonHotKeyX+buttonModeTextXoffset) * 65536 + (buttonModeY+buttonModeTextYoffset)    ;(x, y)
  1627.         mov ebx, Otstup
  1628.         add bx, word[elem.butModeWidth]
  1629.         add bx, word[elem.butAppleHeight]
  1630.         add bx, buttonModeTextYoffset
  1631.         shl ebx, 16
  1632.         mov bx, word[elem.butModeY]
  1633.         add bx, buttonModeTextYoffset
  1634.  
  1635. ;        xor ecx, ecx
  1636. ;        mov ch, byte[mysize]
  1637. ;        shl ecx, 16
  1638. ;        add ecx, 0x80224466
  1639.         mov ecx, 0x224466
  1640.         call setNewSizeForText
  1641.         ;and ecx, 0x7FFFFFFF
  1642.         or ecx, 0x80000000
  1643.  
  1644.         call setTextForHotKey
  1645.         mov     esi, valueModeMenuSize
  1646.         mcall 4
  1647.         ;çàãîëîâîê
  1648.         push eax ebx ecx edx edi esi
  1649.         ;mov     ebx, buttonHotKeyX * 65536 + (buttonModeY-11)
  1650.         mov ebx, Otstup ;buttonHotKeyX ;Otstup
  1651.         add bx, word[elem.butModeWidth]
  1652.         add bx, word[elem.butAppleHeight]
  1653.         shl ebx, 16
  1654.         add bx, word[elem.butModeY]
  1655.         sub bx, 2
  1656.         sub bx, word[elem.textHeight]
  1657.  
  1658. ;        xor ecx, ecx
  1659. ;        mov ch, byte[mysize]
  1660. ;        shl ecx, 16
  1661. ;        add ecx, 0x80224466
  1662.         mov ecx, 0x224466
  1663.         call setNewSizeForText
  1664.         ;and ecx, 0x7FFFFFFF
  1665.         or ecx, 0x80000000
  1666.  
  1667.         mov     edx, hkCaption
  1668.         mov     esi, 3
  1669.         mcall 4
  1670.         pop esi edi edx ecx ebx eax
  1671.     @@:
  1672.  
  1673.     ;îòîáðàæàåì íàñòðîéêó ðàäèóñà äåéñòâèÿ æåñòà, òîëüêî åñëè âûáðàí ðåæèì 3
  1674.     cmp byte[mode], 51
  1675.     jne @f
  1676.         ;çàãîëîâîê
  1677.         push eax ebx ecx edx edi esi
  1678.         xor ebx, ebx
  1679.         mov bx, word[elem.winWidth]
  1680.         sub bx, Otstup
  1681.         sub ebx, dword[editRadius.width]
  1682.         shl ebx, 16
  1683.         add bx, word[elem.butModeY]
  1684.         sub bx, 2
  1685.         sub bx, word[elem.textHeight]
  1686.  
  1687. ;        mov ecx, 0
  1688. ;        mov ch, byte[mysize]
  1689. ;        shl ecx, 16
  1690. ;        add ecx, 0x80224466
  1691.  
  1692.         mov ecx, 0x224466
  1693.         call setNewSizeForText
  1694.         ;and ecx, 0x7FFFFFFF
  1695.         or ecx, 0x80000000
  1696.  
  1697.         ;mov ecx, 0x80224466
  1698.         mov     edx, radiusCaption
  1699.         mov     esi, 3
  1700.         mcall 4
  1701.         pop esi edi edx ecx ebx eax
  1702.  
  1703.  
  1704.         xor eax, eax
  1705.         mov ax, word[elem.winWidth]
  1706.         sub ax, Otstup
  1707.         sub eax, dword[editRadius.width]
  1708.         mov dword[editRadius.left], eax
  1709.         mov ax, word[elem.butModeY]
  1710.         mov dword[editRadius.top], eax
  1711.  
  1712.         invoke  edit_box_draw, editRadius
  1713.     @@:
  1714.  
  1715.         call draw_super_text
  1716.  
  1717.         LineLength = 62
  1718.         mov     ebx, 40 * 65536 + BaseY    ; draw info text with function 4 (x, y)
  1719.  
  1720.         mov ecx, 0x224466
  1721.         call setNewSizeForText
  1722.         and ecx, 0x7FFFFFFF
  1723.  
  1724.         mov     edx, text
  1725.         mov     esi, LineLength
  1726.         mov     eax, 4
  1727.  
  1728.   .newline:                             ; text from the DATA AREA
  1729.         mcall
  1730.         add bx, word[elem.textHeight] ;9*n+3 ;12
  1731.         add bx, word[elem.textDelta]
  1732.  
  1733.         add     edx, LineLength
  1734.         cmp     byte[edx], 0
  1735.         jne     .newline
  1736.  
  1737.         mov     eax, 12                 ; function 12:tell os about windowdraw
  1738.         mov     ebx, 2                  ; 2, end of draw
  1739.         mcall
  1740.  
  1741.         ret
  1742.  
  1743.  
  1744. setNewSizeForText:
  1745.    push ebx
  1746.    mov ebx, ecx
  1747.    cmp byte[sizeStyle], 'x'
  1748.    je .x
  1749.    mov ecx, 0
  1750.    mov ch, byte[mysize]
  1751.    shl ecx, 16
  1752.    jmp @f
  1753. .x:
  1754.    mov ecx,[sc.work_text]
  1755.    or  ecx,0x90000000
  1756. @@:
  1757.    add ecx, ebx
  1758.    pop ebx
  1759.    ret
  1760.  
  1761. hkSymbol: db 0, 0
  1762.  
  1763. setTextForHotKey:
  1764.    push eax
  1765.    mov al, byte[hkSymbol]
  1766.    cmp al, 0
  1767.    jne @f
  1768.       mov edx, hkHint
  1769.       mov dword[hkSize], 5 ;çíà÷åíèå ïî óìîë÷àíèþ SPACE ;shift
  1770.       jmp setTextForHotKey.end
  1771. @@:
  1772.    cmp al, 1
  1773.    jne @f
  1774.       mov edx, hkAlt
  1775.       mov dword[hkSize], 3
  1776.       jmp setTextForHotKey.end
  1777. @@:
  1778.    cmp al, 2
  1779.    jne @f
  1780.       mov edx, hkShift
  1781.       mov dword[hkSize], 5
  1782.       jmp setTextForHotKey.end
  1783. @@:
  1784.    cmp al, 3
  1785.    jne @f
  1786.       mov edx, hkCtrl
  1787.       mov dword[hkSize], 4
  1788.       jmp setTextForHotKey.end
  1789. @@:
  1790.    cmp al, 32
  1791.    jne @f
  1792.       mov edx, hkSpace
  1793.       mov dword[hkSize], 5
  1794.       jmp setTextForHotKey.end
  1795. @@:
  1796.    cmp al, 96  ;'`'
  1797.    je  setTextForHotKey.symb
  1798.    cmp al, 126 ;'~'
  1799.    je  setTextForHotKey.symb
  1800.    cmp al, 48 ;'0'
  1801.    jb @f
  1802.    cmp al, 57 ;'9'
  1803.    ja @f
  1804. .symb:
  1805.       mov edx, hkSymbol
  1806.       mov dword[hkSize], 1
  1807.       jmp setTextForHotKey.end
  1808. @@:
  1809.    cmp al, 97  ;'a'
  1810.    jb @f
  1811.    cmp al, 122 ;'z'
  1812.    ja @f
  1813.       ;jmp setTextForHotKey.symb
  1814.       mov edx, hkSymbol
  1815.       mov dword[hkSize], 1
  1816.       jmp setTextForHotKey.end
  1817. @@:
  1818.    cmp al, 65  ;'A'
  1819.    jb @f
  1820.    cmp al, 90 ;'Z'
  1821.    ja @f
  1822.       ;jmp setTextForHotKey.symb
  1823.       mov edx, hkSymbol
  1824.       mov dword[hkSize], 1
  1825.       jmp setTextForHotKey.end
  1826. @@:
  1827.    mov word[hkSymbol], 0     ;åñëè æå ïîïàëî ÷òî-òî íåèçâåñòíîå, òî ñîòð¸ì åãî
  1828.    mov edx, hkHint
  1829.    mov dword[hkSize], 5 ;shift or space -  çíà÷åíèå ïî óìîë÷àíèþ
  1830. .end:
  1831.    pop eax
  1832.    ret
  1833.  
  1834.  
  1835. setTextModeMenu:
  1836.    cmp byte[mode], 48
  1837.    jne @f
  1838.         mov edx, valueModeMenu0
  1839.         ret
  1840. @@:
  1841.    cmp byte[mode], 49
  1842.    jne @f
  1843.         mov edx, valueModeMenu1
  1844.         ret
  1845. @@:
  1846.    cmp byte[mode], 50
  1847.    jne @f
  1848.         mov edx, valueModeMenu2
  1849.         ret
  1850. @@:
  1851.    cmp byte[mode], 51
  1852.    jne @f
  1853.         mov edx, valueModeMenu3
  1854.         ret
  1855. @@:
  1856.    mov edx, valueModeMenu1
  1857.    ret
  1858.  
  1859.  
  1860.  
  1861.  
  1862. saveKey:
  1863.    cmp word[hkSymbol], 0
  1864.    je .default
  1865.    cmp byte[hkSymbol], 1
  1866.    je .alt
  1867.    cmp byte[hkSymbol], 2
  1868.    je .shift
  1869.    cmp byte[hkSymbol], 3
  1870.    je .ctrl
  1871.    cmp byte[hkSymbol], 32
  1872.    je .space
  1873. .other:
  1874.    mov esi, hkSymbol
  1875.    mov byte[esi+1], 0
  1876.    mov dword[hkSize], 1
  1877.    jmp .end
  1878. .space:
  1879.    mov esi, hkSpace
  1880.    mov dword[hkSize], 5
  1881.    jmp .end
  1882. .ctrl:
  1883.    mov esi, hkCtrl
  1884.    mov dword[hkSize], 4
  1885.    jmp .end
  1886. .alt:
  1887.    mov esi, hkAlt
  1888.    mov dword[hkSize], 3
  1889.    jmp .end
  1890. .default:
  1891. .shift:
  1892.    mov esi, hkShift
  1893.    mov dword[hkSize], 5
  1894. .end:
  1895.    mov ebx, hkSize ;óêàçàòåëü íà dword[hkSize]
  1896.    call copyParam
  1897.    ret
  1898.  
  1899.  
  1900.  
  1901.  
  1902.  
  1903. align 16
  1904. @IMPORT:
  1905.  
  1906. library box_lib, 'box_lib.obj'
  1907.  
  1908. import  box_lib,\
  1909.         edit_box_draw,          'edit_box',\
  1910.         edit_box_key,           'edit_box_key',\
  1911.         edit_box_mouse,         'edit_box_mouse',\
  1912.         init_checkbox,          'init_checkbox2',\
  1913.         check_box_draw,         'check_box_draw2',\
  1914.         check_box_mouse,        'check_box_mouse2',\
  1915.         option_box_draw,        'option_box_draw',\
  1916.         option_box_mouse,       'option_box_mouse'
  1917.  
  1918. commonButtonText db '...', 0  ;òåêñò äëÿ êíîïîê âûçîâà OpenDial
  1919. commonButtonTextSize = 3
  1920.  
  1921. if lang eq ru  ;åñëè ÿçûê ñáîðêè ðóññêèé
  1922.  
  1923. text    db  "Š®­ä¨£ãà â®à Hot Angles ®â¢¥ç ¥â §  ­ áâனªã  ªâ¨¢­ëå 㣫®¢. "
  1924.         db  " áâன⥠¯ à ¬¥âàë ¯®¤ á¥¡ï ¨«¨ ®âª«îç¨â¥ íâã ®¯æ¨î.         ", 0
  1925. ;        db  "                                                              ", 0
  1926.  hed:
  1927. title   db  "Š®­ä¨£ãà â®à ã⨫¨âë Hot Angles", 0
  1928. buttonText db "à¨¬¥­¨âì", 0
  1929. buttonTextSize = 9
  1930. buttonTextXoffset = 12
  1931.  
  1932. ch_text db '‚ª«îç¨âì/ ªâ¨¢¨à®¢ âì "Hot Angles"', 0
  1933.  
  1934. superText:
  1935.   .lu db 'Š®¬ ­¤  «¥¢®£® ¢¥àå­¥£® 㣫 : ', 0
  1936.   .ld db 'Š®¬ ­¤  «¥¢®£® ­¨¦­¥£® 㣫 :  ', 0
  1937.   .ru db 'Š®¬ ­¤  ¯à ¢®£® ¢¥àå­¥£® 㣫 :', 0
  1938.   .rd db 'Š®¬ ­¤  ¯à ¢®£® ­¨¦­¥£® 㣫 : ', 0
  1939. superTextSize = 30
  1940.  
  1941. valueModeMenuSize = 32
  1942. ModeMenu  db '¥¦¨¬ à ¡®âë:',0
  1943. valueModeMenu0  db '®âª«î祭®                       ',0
  1944. valueModeMenu1  db 'ª« áá¨ç¥áª¨© ०¨¬              ',0
  1945. valueModeMenu2  db '०¨¬ £®àï祩 ª« ¢¨è¨           ',0
  1946. valueModeMenu3  db '०¨¬ ¦¥áâ  ¯® ª« ¢¨è¥  ªâ¨¢ æ¨¨',0
  1947.  
  1948. head_f_i:
  1949.         head_f_l  db '‘¨á⥬­ ï ®è¨¡ª ',0
  1950.         err_message_found_lib0 db '¥ ­ ©¤¥­  ¡¨¡«¨®â¥ª  ',39,'proc_lib.obj',39,0
  1951.         err_message_import0 db 'Žè¨¡ª  ¯à¨ ¨¬¯®à⥠¡¨¡«¨®â¥ª¨ ',39,'proc_lib.obj',39,0
  1952.         err_message_found_lib1 db '¥ ­ ©¤¥­  ¡¨¡«¨®â¥ª  ',39,'kmenu.obj',39,0
  1953.         err_message_import1 db 'Žè¨¡ª  ¯à¨ ¨¬¯®à⥠¡¨¡«¨®â¥ª¨ ',39,'kmenu',39,0
  1954.  
  1955. hkCaption: db 'Š« ¢¨è :',0
  1956. radiusCaption: db ' ¤¨ãá:',0
  1957.  
  1958. else  ;èíà÷å àíãëèéñêèé òåêñò
  1959.  
  1960. text    db  "This is a Hot Angles Configurator.                            "
  1961.         db  "Set the parameters bellow for yourself or disable this option.", 0
  1962. ;        db  "                                                              ", 0
  1963.  hed:
  1964. title   db  "Hot Angles Configurator", 0
  1965. buttonText db "Apply", 0
  1966. buttonTextSize = 5
  1967. buttonTextXoffset = 0
  1968.  
  1969. ch_text db 'Activate "Hot Angles"',0       ;ñîïðîâîæäàþùèé òåêñò äëÿ ÷åê áîêñà
  1970.  
  1971. superText:
  1972.   .lu db 'Left up angle command:   ', 0
  1973.   .ld db 'Left down angle command: ', 0
  1974.   .ru db 'Right up angle command:  ', 0
  1975.   .rd db 'Right down angle command:', 0
  1976. superTextSize = 25
  1977.  
  1978. valueModeMenuSize = 32
  1979. ModeMenu  db 'Mode:',0
  1980. valueModeMenu0  db 'disabled                        ',0
  1981. valueModeMenu1  db 'classic mode                    ',0
  1982. valueModeMenu2  db 'hot key mode                    ',0
  1983. valueModeMenu3  db 'activation key gesture mode     ',0
  1984.  
  1985. head_f_i:
  1986.         head_f_l  db 'System error',0
  1987.         err_message_found_lib0 db 'Could not find library ',39,'proc_lib.obj',39,0
  1988.         err_message_import0 db 'Error importing library ',39,'proc_lib.obj',39,0
  1989.         err_message_found_lib1 db 'Could not find library ',39,'kmenu.obj',39,0
  1990.         err_message_import1 db 'Error importing library ',39,'kmenu',39,0
  1991.  
  1992. hkCaption: db 'Key:',0
  1993. radiusCaption: db 'Radius:',0
  1994.  
  1995. end if
  1996.  
  1997. hkAlt:   db 'Alt',0
  1998. hkShift: db 'Shift',0
  1999. hkCtrl:  db 'Ctrl',0
  2000. hkSpace: db 'Space',0
  2001. hkHint: db '?',0
  2002. hkSize: rd 1 ;ðàçìåð ñòðîêè ñ èìåíåì êëàâèøè
  2003.  
  2004. draw_super_text:
  2005.    push eax ebx ecx edx edi esi
  2006.  
  2007. ;   mov ecx, 0
  2008. ;   mov ch, byte[mysize]
  2009. ;   shl ecx, 16
  2010. ;   add ecx, 0x224466
  2011.    mov ecx, 0x224466
  2012.    call setNewSizeForText
  2013.    ;and ecx, 0x7FFFFFFF
  2014.    or ecx, 0x80000000
  2015.  
  2016.    ;mov     ebx, Otstup * 65536 + 74    ; draw info text with function 4 (x, y)
  2017.    mov bx, Otstup
  2018.    shl ebx, 16
  2019.    mov bx, word[elem.textHeight]
  2020.    add bx, word[elem.textDelta]
  2021.    shl bx, 2
  2022.    sub bx, word[elem.textHeight]
  2023.    add bx, BaseY
  2024.  
  2025.    ;mov     ecx, 0x224466
  2026.    mov eax, superText.lu
  2027.    mov     edx, eax
  2028.    mov     esi, superTextSize
  2029.    mcall 4
  2030.  
  2031.    ;mov     ebx, Otstup * 65536 + 109      ;9+2+14+(9+1)
  2032.    add bx, word[elem.textHeight]
  2033.    add bx, 4;3
  2034.    add bx, word[elem.butDialHeight]
  2035.    add bx, word[elem.textHeight]
  2036.  
  2037.    mov     edx, superText.ld
  2038.    mov     esi, superTextSize
  2039.    mcall 4
  2040.  
  2041.    ;mov     ebx, 240 * 65536 + 74
  2042.    mov bx, word[elem.winWidth]
  2043.    sub bx, word[elem.butDialWidth]
  2044.    sub bx, word[elem.editCommandWidth]
  2045.    sub bx, Otstup
  2046.    shl ebx, 16
  2047.    mov bx, word[elem.textHeight]
  2048.    add bx, word[elem.textDelta]
  2049.    shl bx, 2
  2050.    sub bx, word[elem.textHeight]
  2051.    add bx, BaseY
  2052.  
  2053.    mov     edx, superText.ru
  2054.    mov     esi, superTextSize
  2055.    mcall 4
  2056.  
  2057.    ;mov     ebx, 240 * 65536 + 109
  2058.    add bx, word[elem.textHeight]
  2059.    add bx, 4;3;2
  2060.    add bx, word[elem.butDialHeight]
  2061.    add bx, word[elem.textHeight]
  2062.  
  2063.    mov     edx, superText.rd
  2064.    mov     esi, superTextSize
  2065.    mcall 4
  2066.  
  2067.    ;mov     ebx, Otstup * 65536 + (buttonModeY-11)
  2068.    mov ebx, Otstup
  2069.    shl ebx, 16
  2070.    add bx, word[elem.butModeY]
  2071.    sub bx, 2
  2072.    sub bx, word[elem.textHeight]
  2073.  
  2074.    or ecx, 0x80000000
  2075.    mov     edx, ModeMenu
  2076.    mov     esi, 3
  2077.    mcall 4
  2078.  
  2079.    pop esi edi edx ecx ebx eax
  2080.    ret
  2081.  
  2082. editID db 0
  2083. initEBX:
  2084.    cmp byte[editID], 4
  2085.    jne @f
  2086.    mov ebx, dataBuffer.1
  2087.    ret
  2088. @@:
  2089.    cmp byte[editID], 5
  2090.    jne @f
  2091.    mov ebx, dataBuffer.2
  2092.    ret
  2093. @@:
  2094.    cmp byte[editID], 6
  2095.    jne @f
  2096.    mov ebx, dataBuffer.3
  2097.    ret
  2098. @@:
  2099.    cmp byte[editID], 7
  2100.    jne @f
  2101.    mov ebx, dataBuffer.4
  2102.    ret
  2103. @@:
  2104.    ret
  2105. setRESULT:
  2106.    cmp byte[editID], 4
  2107.    jne @f
  2108.    mov dword[dataBuffer.size1], ecx
  2109.    mov dword[editLU.size], ecx
  2110.    mov dword[editLU.pos], ecx
  2111.    ret
  2112. @@:
  2113.    cmp byte[editID], 5
  2114.    jne @f
  2115.    mov dword[dataBuffer.size2], ecx
  2116.    mov dword[editLD.size], ecx
  2117.    mov dword[editLD.pos], ecx
  2118.    ret
  2119. @@:
  2120.    cmp byte[editID], 6
  2121.    jne @f
  2122.    mov dword[dataBuffer.size3], ecx
  2123.    mov dword[editRU.size], ecx
  2124.    mov dword[editRU.pos], ecx
  2125.    ret
  2126. @@:
  2127.    cmp byte[editID], 7
  2128.    jne @f
  2129.    mov dword[dataBuffer.size4], ecx
  2130.    mov dword[editRD.size], ecx
  2131.    mov dword[editRD.pos], ecx
  2132.    ret
  2133. @@:
  2134.    ret
  2135. copyPath:
  2136.    push eax ebx ecx edx ;copy file name path
  2137.         mov eax, openfile_path ;dword[OpenDialog_data.openfile_path]
  2138.         call initEBX ;mov ebx, dataBuffer.1 ;.data
  2139.         mov ecx, 0
  2140.       @@:
  2141.         mov dl, byte[eax]
  2142.         cmp dl, 0 ;byte[eax], 0
  2143.         je @f
  2144.         mov byte[ebx], dl
  2145.         inc eax
  2146.         inc ebx
  2147.         inc ecx
  2148.         jmp @b
  2149.       @@:
  2150.         mov byte[ebx], 0
  2151.         call setRESULT
  2152.    pop edx ecx ebx eax
  2153.    ret
  2154.  
  2155.  
  2156. IntToStr:  ;in esi - ñòðîêà; eñx - ÷èñëî
  2157.    push eax ecx edx esi
  2158.    cmp ecx, 0
  2159.    jne @f
  2160.    mov byte[esi], 48 ; '0'
  2161.    inc esi
  2162.    jmp .end
  2163. @@:
  2164.    mov eax, ecx
  2165.    mov ecx, 10
  2166. .next:
  2167.    mov edx, 0
  2168.    div ecx
  2169.    add edx, 48
  2170.  
  2171.    mov byte[esi], dl
  2172.  
  2173.    inc esi
  2174.    cmp eax, 0
  2175.    je .end
  2176.    jmp .next
  2177. .end:
  2178.    mov byte[esi], 0   ;êëàä¸ì çàâåðøàþùèé íîëü
  2179.    pop esi edx ecx eax
  2180.    call reverseString ;äåëàåì ðåâåðñ ñòðîêè
  2181.    ret
  2182.  
  2183. ;âõîä: esi - óêàçàòåëü íà ñòðîêó
  2184. reverseString:
  2185.    push eax esi edi
  2186.  
  2187.    mov al, byte[esi] ;åñëè ñòðîêà ïóñòàÿ òî âûõîäèì ðåâåðñ äåëàòü íå íàäî
  2188.    cmp al, 0
  2189.    je reverseString.end
  2190.  
  2191.    mov edi, esi  ;èíà÷å íàéä¸ì ïîçèöèþ ïîñëåäíåãî ñèìâîëà ñòðîêè è ïîëîæèì å¸ â edi
  2192. .go_last_symbol:
  2193.    mov al, byte[edi+1]
  2194.    cmp al, 0
  2195.    je @f
  2196.  
  2197.    inc edi
  2198.    jmp reverseString.go_last_symbol
  2199. @@:
  2200.    push ebx
  2201. .rev:
  2202.    cmp esi, edi
  2203.    jae @f
  2204.  
  2205.    ;ìåíÿåì ìåñòàìè ñèìâîëû â öèêëå
  2206.    mov al, byte[edi]
  2207.    mov bl, byte[esi]
  2208.    mov byte[edi], bl
  2209.    mov byte[esi], al
  2210.  
  2211.    inc esi
  2212.    dec edi
  2213.    jmp reverseString.rev
  2214. @@:
  2215.    pop ebx
  2216. .end:
  2217.    pop edi esi eax
  2218.    ret
  2219.  
  2220.  
  2221.  
  2222. align 4
  2223. but_open_dlg:
  2224.         pushad
  2225.         copy_path open_dialog_name,communication_area_default_path,file_name,0
  2226.         mov [OpenDialog_data.type],0
  2227.         stdcall[OpenDialog_Start], OpenDialog_data
  2228.         cmp [OpenDialog_data.status],2
  2229.         je @f
  2230.         cmp [OpenDialog_data.status],0 ;ïîëüçîâàòåëü íàæàë Cancel?
  2231.         je .end_open
  2232.                 ;êîä ïðè óäà÷íîì îòêðûòèè äèàëîãà
  2233.                 call copyPath
  2234.                 jmp .end_open
  2235.         @@:
  2236.                 ;êîä ïðè íå óäà÷íîì îòêðûòèè äèàëîãà
  2237.                 ;...
  2238.         .end_open:
  2239.         popad
  2240.         ret
  2241.  
  2242. ;äàííûå äëÿ äèàëîãà îòêðûòèÿ ôàéëîâ
  2243. align 4
  2244. OpenDialog_data:
  2245. .type                   dd 0 ;0 - îòêðûòü, 1 - ñîõðàíèòü, 2 - âûáðàòü äèðåêòîðèþ
  2246. .procinfo               dd procinfo
  2247. .com_area_name          dd communication_area_name ;+8
  2248. .com_area               dd 0           ;+12
  2249. .opendir_path           dd plugin_path ;+16
  2250. .dir_default_path       dd default_dir ;+20
  2251. .start_path             dd file_name   ;+24 ïóòü ê äèàëîãó îòêðûòèÿ ôàéëîâ
  2252. .draw_window            dd draw_window ;+28
  2253. .status                 dd 0           ;+32
  2254. .openfile_path          dd openfile_path ;+36 ïóòü ê îòêðûâàåìîìó ôàéëó
  2255. .filename_area          dd filename_area ;+40
  2256. .filter_area            dd Filter
  2257. .x:
  2258. .x_size                 dw 420 ;+48 ; Window X size
  2259. .x_start                dw 10  ;+50 ; Window X position
  2260. .y:
  2261. .y_size                 dw 320 ;+52 ; Window y size
  2262. .y_start                dw 10  ;+54 ; Window Y position
  2263.  
  2264. default_dir db '/rd/1',0 ;äèðåêòîðèÿ ïî óìîë÷àíèþ
  2265. communication_area_name: db 'FFFFFFFF_open_dialog',0
  2266. open_dialog_name:  db 'opendial',0
  2267. communication_area_default_path: db '/rd/1/File managers/',0
  2268.  
  2269. Filter:
  2270. dd Filter.end - Filter.1
  2271. .1:
  2272. ;db 'KEX',0
  2273. .end:
  2274. db 0
  2275.  
  2276. mode db 49 ;'1'
  2277. modeMenu dd 0
  2278. coordModeMenu:
  2279.   .x dw 100
  2280.   .y dw 200
  2281.  
  2282.  
  2283. align 4
  2284. proclib_import: ;îïèñàíèå ýêñïîðòèðóåìûõ ôóíêöèé
  2285.         OpenDialog_Init dd aOpenDialog_Init
  2286.         OpenDialog_Start dd aOpenDialog_Start
  2287. dd 0,0
  2288.         aOpenDialog_Init db 'OpenDialog_init',0
  2289.         aOpenDialog_Start db 'OpenDialog_start',0
  2290.  
  2291. system_dir0 db '/sys/lib/'
  2292. lib0_name db 'proc_lib.obj',0
  2293. lib1_name db 'kmenu.obj',0
  2294.  
  2295. symbolDownArrow db 25,0
  2296.  
  2297. ;library structures
  2298. l_libs_start:
  2299.     lib0 l_libs lib0_name, sys_path, file_name, system_dir0, err_message_found_lib0, head_f_l, proclib_import,err_message_import0, head_f_i
  2300.     lib1 l_libs lib1_name, sys_path, file_name, system_dir0, err_message_found_lib1, head_f_l, import_libkmenu,err_message_import1,head_f_i
  2301. load_lib_end:
  2302.  
  2303.  
  2304. edMaxSize = 510 ;òåïåðü ñ íîâûì êîìïîíåíòîì ìîæíî è 511 óêàçàòü
  2305. edMax = 0 ;max, size, pos
  2306.  
  2307. align 4
  2308. editLU   edit_box 180-buttonW,Otstup+buttonW,85, 0xffffff, 0x6a9480, 0, 0xAABBCC, 0, edMaxSize, dataBuffer.1, mouse_dd, 0, edMax, edMax  ;ed_focus
  2309. editLD   edit_box 180-buttonW,Otstup+buttonW,120, 0xffffff, 0x6a9480, 0, 0xAABBCC, 0, edMaxSize, dataBuffer.2, mouse_dd, 0, edMax, edMax
  2310. editRU   edit_box 180-buttonW,240,85, 0xffffff, 0x6a9480, 0, 0xAABBCC, 0, edMaxSize, dataBuffer.3, mouse_dd, 0, edMax, edMax
  2311. editRD   edit_box 180-buttonW,240,120, 0xffffff, 0x6a9480, 0, 0xAABBCC, 0, edMaxSize, dataBuffer.4, mouse_dd, 0, edMax, edMax
  2312. editRadius edit_box 40,(buttonHotKeyX + buttonHotKeyWidth + 20),buttonModeY, 0xffffff, 0x6a9480, 0, 0xAABBCC, 0, 4, radiusBuffer.data, mouse_dd, ed_figure_only, edMax, edMax
  2313.  
  2314. align 4
  2315. import_libkmenu:
  2316.         kmenu_init      dd akmenu_init
  2317.         kmainmenu_draw  dd akmainmenu_draw
  2318.         kmainmenu_dispatch_cursorevent dd akmainmenu_dispatch_cursorevent
  2319.         ksubmenu_new    dd aksubmenu_new
  2320.         ksubmenu_delete dd aksubmenu_delete
  2321.         ksubmenu_draw   dd aksubmenu_draw
  2322.         ksubmenu_add    dd aksubmenu_add
  2323.         kmenuitem_new   dd akmenuitem_new
  2324.         kmenuitem_delete dd akmenuitem_delete
  2325.         kmenuitem_draw  dd akmenuitem_draw
  2326. dd 0,0
  2327.         akmenu_init     db 'kmenu_init',0
  2328.         akmainmenu_draw db 'kmainmenu_draw',0
  2329.         akmainmenu_dispatch_cursorevent db 'kmainmenu_dispatch_cursorevent',0
  2330.         aksubmenu_new   db 'ksubmenu_new',0
  2331.         aksubmenu_delete db 'ksubmenu_delete',0
  2332.         aksubmenu_draw  db 'ksubmenu_draw',0
  2333.         aksubmenu_add   db 'ksubmenu_add',0
  2334.         akmenuitem_new  db 'kmenuitem_new',0
  2335.         akmenuitem_delete db 'kmenuitem_delete',0
  2336.         akmenuitem_draw  db 'kmenuitem_draw',0
  2337.  
  2338. sc  system_colors
  2339. mouse_dd  rd 1
  2340.  
  2341. sizeStyle: rb 1  ;ðàçìåð òåêñòà è îñòàëüíûõ ýëåìåíòîâ îêíà
  2342. mysize: rb 1     ;rd 1
  2343. radiusBuffer:    ;áóôåð äëÿ ïîëÿ ðàäèóñà æåñòà
  2344.  .data: rb 6
  2345.  .size: rd 1
  2346. radiusBufferEnd:
  2347.  
  2348. button_press  rd 0     ;for kmenu
  2349.  
  2350. sys_path:      rb 4096
  2351. file_name:     rb 4096
  2352. plugin_path:   rb 4096
  2353. openfile_path: rb 4096
  2354. filename_area: rb 256
  2355. rb 1024
  2356. procinfo process_information
  2357. pi rb 1024
  2358.  
  2359. keyscan: rb 1
  2360. keystr:
  2361.   .data: rb 4 ;ñòðîêà ñî çíà÷åíèåì ñêàíêîäà àêòèâàöèîííîé êëàâèøè
  2362.   .size: rd 1 ;ðàçìåð ñîäåðæèìîãî ñòðîêè áåç ïîñëåäíåãî íóëÿ
  2363.  
  2364. dataBuffer:
  2365. .1: rb 512
  2366. .2: rb 512
  2367. .3: rb 512
  2368. .4: rb 512
  2369. .size1: rd 1
  2370. .size2: rd 1
  2371. .size3: rd 1
  2372. .size4: rd 1
  2373. ;255+255+2 = 512
  2374. ;äâà çàïàñíûõ áàéòà íåîáõîäèìû äëÿ òîãî ÷òî áû íå ïåïåðåïèñàòü ñëåäóþùèåé áàéòû, â êîíöå áóôåðà 0
  2375. dataBufferEnd:
  2376.  
  2377.  
  2378. I_END:
  2379.         rb 256 ;1024 ;4096
  2380. align 4 ;16
  2381. STACKTOP:
  2382.  
  2383. MEM:
  2384.