Subversion Repositories Kolibri OS

Rev

Rev 7460 | Blame | Last modification | View Log | Download | RSS feed

  1. ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
  2. ; Hot Angles ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
  3. ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
  4. ; Compile with FASM
  5. ; Version 0.3.7: 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. format binary as "" ;"kex"
  29. use32
  30. org 0x0    ; áàçîâûé àäðåñ ðàçìåùåíèÿ êîäà, âñåãäà 0x0
  31.  
  32. UNLOCKd = 0
  33. LOCKd   = 1
  34. SUPERLOCKd = 2
  35.  
  36. ; çàãîëîâîê
  37. db 'MENUET01'     ;ìàãè÷åñêèé èäåíòèôèêàòîð
  38. dd 0x01           ;âåðñèÿ
  39. dd START_DEBUG    ;àäðåñ òî÷êè ñòàðòà ïðîãðàììû
  40. dd I_END          ;àäðåñ êîíöà, ïî ôàêòó ðàçìåð ôàéëà ïðîãðàììû
  41. dd 0x100000       ;òðåáóåìîå êîë-âî ïàìÿòè äëÿ çàãðóçêè ïðîãðàììû
  42. dd 0x7fff0        ;íà÷àëüíîå çíà÷åíèå ðåãèñòðà esp - àäðåñ êîíöà îáëàñòè ñòýêà òàê êàê ñòýê ðàñòåò â ñòîðîíó ìåíüøèõ àäðåñîâ
  43. dd 0, 0           ;àäðåñ ñòðîêè ïàðàìåòðîâ è àäðåñ ñòðîêè ïóòè èñïîëíÿåìîãî ôàéëà
  44.  
  45.  
  46. include '../../macros.inc'
  47.  
  48. START_DEBUG:
  49.    call copyKill         ;ïðîñòåéøàÿ çàùèòà îò ïîâòîðíîãî çàïóñêà
  50.    mcall  68, 11         ;èíèöèàëèçàöèÿ êó÷è
  51.    call loadConfig       ;çàãðóæàåì êîíôèãóðàöèþ ïðèëîæåíèÿ
  52.  
  53.    cmp byte[mode], 0     ;ôóíêöèÿ îòêëþ÷åíà - âûõîä
  54.    jne @f
  55.    mcall -1
  56. @@:
  57.    ;ðåæèì æåñòà ïî ãîðÿ÷åé êëàâèøå?
  58.    cmp byte[mode], 3 ;ïîäïèñûâàåìñÿ íà èíòåðåñíûå íàì ñîáûòèÿ â çàâèñèìîñòè îò ðåæèìà ðàáîòû
  59.    jne @f
  60.    mov ebx, 00000100000000000000000000100010b    ;åñëè äà, òî ïîäïèñûâàåìñÿ íà êëàâèøè
  61.    mcall 40
  62.    jmp init03
  63. @@:
  64.    ;ðåæèì àêòèâàöèè ãîðÿ÷åé êëàâèøåé?
  65.    cmp byte[mode], 2 ;ïîäïèñûâàåìñÿ íà èíòåðåñíûå íàì ñîáûòèÿ â çàâèñèìîñòè îò ðåæèìà ðàáîòû
  66.    jne @f
  67.    mov ebx, 00000100000000000000000000100010b    ;åñëè äà, òî ïîäïèñûâàåìñÿ íà êëàâèøè
  68.    mcall 40
  69.    jmp init02
  70. @@:
  71.    ; âî âñåõ îñòàëüíûõ ñëó÷àÿõ - êëàññè÷åñêèé ðåæèì ðàáîòû
  72.    ;mode=1 êëàññè÷åñêèé ðåæèì ðàáîòû - ðåàêöèÿ ïðè íàâåäåíèè â óãîë
  73.    mov byte[mode], 1
  74.    mov ebx, 00000100000000000000000000100000b
  75.    mcall 40
  76.    jmp init01
  77.  
  78.  
  79.  
  80. init02:
  81.    mov dword[backAdr], mode02
  82.    call setHotKey
  83. mode02:
  84.    mcall 10
  85.    cmp eax, 2     ;îáðàáîòêà íàæàòèÿ êëàâèøè
  86.    je hotkey
  87.  
  88.    cmp byte[keyState], 0
  89.    je mode02
  90.    cmp   eax, 6   ;îáðàáîòêà ïåðåìåùåíèé è íàæàòèÿ ìûøè
  91.    je    mouse
  92.  
  93.    jmp mode02
  94.  
  95.  
  96. setHotKey:    ;óñòàíîâèòü ãîðÿ÷óþ êëàâèøó
  97.    push eax ebx ecx edx
  98.    xor ecx, ecx
  99.    mov cl, byte[keyActivate]  ;íàæàòèå ãîðÿ÷åé êëàâèøè
  100.    mov edx, 0x000
  101.    mcall 66, 4, ecx, edx
  102.  
  103.    ;mov cl, byte[keyActivate]
  104.    add cl, 128              ;îòïóñêàíèå ãîðÿ÷åé êëàâèøè
  105.    ;mov edx, 0x000
  106.    mcall 66, 4, ecx, edx
  107.    pop edx ecx ebx eax
  108.    ret
  109.  
  110.  
  111. hotkey:
  112.    mcall 2
  113.    cmp eax, 1     ;áóôåð êëàâèø ïóñò?
  114.    je hotkey.end
  115.  
  116.    cmp al, 2      ;íàñ èíòåðåñóåò òîëüêî ñêàí êîä ãîðÿ÷åé êëàâèøè, èíà÷å âûõîäèì
  117.    jne hotkey.end
  118.  
  119.    cmp ah, byte[keyActivate]   ;åñëè íàæàòà íàøà ãîðÿ÷àÿ êëàâèøà
  120.    jne @f
  121.  
  122.    ;ïðîâåðêè äëÿ mode 3
  123.    cmp byte[state], SUPERLOCKd
  124.    je hotkey.end
  125.    cmp byte[keyState], 1
  126.    je hotkey.end
  127.  
  128.    push eax ebx
  129.    mcall 37, 0 ;çàïîìèíàåì òåêóùèå(íà÷àëüíûå) êîîðäèíàòû ìûøè
  130.    ;mov dword[o.x], eax
  131.    mov word[o.y], ax
  132.    shr eax, 16
  133.    mov word[o.x], ax
  134.    pop ebx eax
  135.  
  136.    mov byte[keyState], 1
  137.    mov byte[state], UNLOCKd
  138.    jmp hotkey.end
  139. @@:
  140.    push edx
  141.    xor edx, edx
  142.    mov dl, byte[keyActivate]
  143.    add dl, 128
  144.    cmp ah, dl   ;åñëè îòïóùåíà íàøà ãîðÿ÷àÿ êëàâèøà
  145.    jne @f       ;hotkey.end
  146.  
  147.    mov byte[keyState], 0
  148.    mov byte[state], LOCKd
  149. @@:
  150.    pop edx
  151. .end:
  152.    jmp dword[backAdr]
  153.  
  154.  
  155. init01:
  156.    mov dword[backAdr], mode01
  157. mode01:
  158.   mov     eax, 10                 ; function 10 : wait until event
  159.   mcall                           ; event type is returned in eax
  160.  
  161.   cmp   eax, 6           ;îáðàáîòêà ïåðåìåùåíèé è íàæàòèÿ ìûøè
  162.   je    mouse
  163.  
  164.   jmp mode01
  165.  
  166.  
  167. mouse:
  168.    push ebx
  169.    mcall 37, 0   ;ïîëó÷àåì òåêóùèå êîîðäèíàòû ìûøè
  170.    pop ebx
  171.  
  172.   cmp eax, 0 ;ëåâûé âåðõíèé óãîë
  173.   jne @f
  174.   ; -- çäåñü âûçûâàåì ñîîòâ. âûçîâ äëÿ ëåâîãî âåðõíåãî óãëà  (X=0, Y=0)
  175.   push ecx
  176.   mov ecx, 0
  177.   call run_command
  178.   pop ecx
  179.  
  180.   jmp dword[backAdr] ;finish
  181. @@:
  182.   call get_screen_size ;èíà÷å îáíîâëÿåì ðàçìåðû ýêðàíà
  183.  
  184.   cmp ax, word[screen.height]    ;Ymouse = Yscreen ?
  185.   je Ytrue
  186.   ;åñëè Y íå ðàâíû, òî íàñ èíòåðåñóåò Y=0 è X=ScreenWidth (ïðàâûé âåðõíèé óãîë)
  187.  
  188.   cmp ax, 0
  189.   jne unlockend
  190.   shr eax, 16
  191.   cmp ax, word[screen.width]
  192.   jne unlockend
  193.   ; -- çäåñü âûçûâàåì äëÿ ïðàâîãî âåðõåíåãî óãëà
  194.   push ecx
  195.   mov ecx, 2
  196.   call run_command
  197.   pop ecx
  198.  
  199.   jmp dword[backAdr]
  200. Ytrue:
  201.   ;åñëè Y ðàâíû, òî íàñ èíòåðåñóåò X=0 (ëåâûé íèæíèé óãîë) èëè X=ScreenWidth (ïðàâûé íèæíèé)
  202.   shr eax, 16
  203.   cmp ax, 0
  204.   jne @f
  205.   ; -- X=0, Y = Height  (ëåâûé íèæíèé óãîë)
  206.   push ecx
  207.   mov ecx, 1
  208.   call run_command
  209.   pop ecx
  210.   jmp dword[backAdr]
  211. @@:
  212.   cmp ax, word[screen.width]
  213.   jne unlockend
  214.   ; -- (ïðàâûé íèæíèé óãîë)
  215.   push ecx
  216.   mov ecx, 3
  217.   call run_command
  218.   pop ecx
  219.  
  220.   jmp dword[backAdr]
  221.  
  222. unlockend:
  223.   mov byte[state], UNLOCKd
  224.   jmp dword[backAdr]
  225.  
  226.  
  227.  
  228. ;ïîëó÷èòü ðàçìåð ýêðàíà
  229. get_screen_size:
  230.    push eax
  231.    mcall 14
  232.    ;òåïåðü â eax = [xsize]*65536 + [ysize]
  233.    ;mov dword[screen], eax
  234.    mov word[screen.height], ax
  235.    shr eax, 16
  236.    mov word[screen.width], ax
  237.    pop eax
  238.    ret
  239.  
  240.  
  241.  
  242.  
  243.  
  244. ;çàïóñê ïðèëîæåíèÿ: ecx - àêòèâíûé óãîë: lu=0, ld=1, ru=2, rd=3
  245. run_command:
  246.    cmp byte[state], UNLOCKd
  247.    jne run_command.end
  248.  
  249.    push eax ebx ecx
  250.  
  251.    cmp ecx, 0
  252.    jne @f
  253.    mov eax, apps.path1
  254.    cmp byte[eax], 0 ;åñëè ïî àäðåñó ïóñòî (èëè ëåæàë ñèìâîë '-'), òî àäðåñ 0
  255.    je .set0
  256.    mov dword[struct70.path_adr], eax
  257.    mov eax, apps.param1
  258.    mov dword[struct70.param_adr], eax
  259.    jmp .end_set_path
  260. @@:
  261.    cmp ecx, 1
  262.    jne @f
  263.    mov eax, apps.path2
  264.    cmp byte[eax], 0 ;åñëè ïî àäðåñó ïóñòî (èëè ëåæàë ñèìâîë '-'), òî àäðåñ 0
  265.    je .set0
  266.    mov dword[struct70.path_adr], eax
  267.    mov eax, apps.param2
  268.    mov dword[struct70.param_adr], eax
  269.    jmp .end_set_path
  270. @@:
  271.    cmp ecx, 2
  272.    jne @f
  273.    mov eax, apps.path3
  274.    cmp byte[eax], 0 ;åñëè ïî àäðåñó ïóñòî (èëè ëåæàë ñèìâîë '-'), òî àäðåñ 0
  275.    je .set0
  276.    mov dword[struct70.path_adr], eax
  277.    mov eax, apps.param3
  278.    mov dword[struct70.param_adr], eax
  279.    jmp .end_set_path
  280. @@:
  281.    cmp ecx, 3
  282.    jne .set0 ;.end_set_path
  283.    mov eax, apps.path4
  284.    cmp byte[eax], 0 ;åñëè ïî àäðåñó ïóñòî (èëè ëåæàë ñèìâîë '-'), òî àäðåñ 0
  285.    je .set0
  286.    mov dword[struct70.path_adr], eax
  287.    mov eax, apps.param4
  288.    mov dword[struct70.param_adr], eax
  289.    jmp .end_set_path
  290. .set0:
  291.    ;mov dword[struct70.path_adr], 0
  292.    ;mov dword[struct70.param_adr], 0
  293.    jmp @f
  294. .end_set_path:
  295.    mcall 70, struct70
  296. @@:
  297.    mov byte[state], LOCKd
  298.    ;mov byte[keyState], 0
  299.    pop ecx ebx eax
  300. .end:
  301.    ret
  302.  
  303. struct70: ;Ôîðìàò èíôîðìàöèîííîé ñòðóêòóðû
  304.   .func       dd 7 ; íîìåð ïîäôóíêöèè
  305.   .mask       dd 0
  306.   .param_adr  dd 0 ; óêàçàòåëü íà ASCIIZ-ñòðîêó ñ ïàðàìåòðàìè
  307.   .other      dd 0, 0
  308.   .path       db 0
  309.   .path_adr   dd 0 ; óêàçàòåëü íà ñòðîêó ñ ïóò¸ì
  310.  
  311. ;èìÿ êîíôèãóðàöèîííîãî ôàéëà
  312. fileName: db 'SETTINGS/HOTANGLES.CFG', 0
  313.  
  314.  
  315. ;ïðîõîäèì äî êîíöà òåêóùåé ñòðîêè
  316. gotoEndString:
  317.    cmp eax, edx  ;åñëè ôàéë çàêîí÷èëñÿ, òî
  318.    ja @f         ;âûõîäèì
  319.    cmp byte[eax], 10
  320.    je @f
  321.    cmp byte[eax], 0
  322.    je @f
  323.    cmp byte[eax], 13
  324.    je @f
  325.    ;èíà÷å ïåðåõîäèì íà ñëåäóþùèé ñèìâîë
  326.    inc eax
  327.    jmp gotoEndString
  328. @@:
  329.    ret
  330.  
  331. ;ïðîïóñêàåì ïåðåíîñû â íà÷àëå ñòðîêè äî ïåðâîãî àäåêâàòíîãî ñèìâîëà
  332. gotoStartString:
  333.    cmp eax, edx  ;åñëè ôàéë çàêîí÷èëñÿ, òî
  334.    ja @f         ;âûõîäèì
  335.    cmp byte[eax], 10
  336.    je .next
  337.    cmp byte[eax], 0
  338.    je .next
  339.    cmp byte[eax], 13
  340.    je .next
  341.    jmp @f ;åñëè ýòî äðóãîé ñèìâîë, òî âûõîäèì
  342. .next:   ;ïåðåõîäèì íà ñëåäóþùèé ñèìâîë
  343.    inc eax
  344.    jmp gotoStartString
  345. @@:
  346.    ret
  347.  
  348.  
  349. sep: db '|' ;ñèìâîë ðàçäåëèòåëü ñòðîêè ïóòè + ïàðàìåòðû çàïóñêà
  350. readPath:
  351.    push ebx esi edi
  352.    mov bh, 0 ; 0 -  çíàê òîãî, ÷òî ïàðàìåòðû åù¸ íå âñòðå÷àëèñü
  353.    mov byte[esi], 0   ;ïðîèíèöèàëèçèðóåì áóôåðû-ñòðîêè ïóñòîòîé (íà âñÿêèé ñëó÷àé)
  354.    mov byte[edi], 0
  355. @@:
  356.    cmp eax, edx  ;åñëè ôàéë çàêîí÷èëñÿ, òî
  357.    ja @f         ;âûõîäèì
  358.    mov bl, byte[eax]
  359.    ;åñëè î÷åðåäíîé ñèìâîë íå êîíåö ñòðîêè
  360.    cmp bl, 10
  361.    je @f  ;èíà÷å âûõîä
  362.    cmp bl, 0
  363.    je @f
  364.    cmp bl, 13
  365.    je @f
  366.    ;è íå íà÷àëî ïàðàìåòðîâ
  367.    cmp bl, byte[sep]
  368.    jne .read
  369.    ;åñëè sep óæå âñòðå÷àëè ðàíåå, òî
  370.    cmp bh, 0
  371.    jne .read ;ïðîñòî ïðîäîëæàåì ñ÷èòûâàòü ïàðàìåòðû äàëüøå  (â íèõ ìîæåò áûòü ÷òî óãîäíî)
  372.    ;èíà÷å êëàä¸ì çàâåðøàþùèé 0 è ïåðåõîäèì ê áóôåðó ñ ïàðàìåòðàìè
  373.    mov byte[esi], 0
  374.    call trim ;åù¸ íå çàáóäåì óáðàòü ëèøíèå òàáóëÿöèè è ïðîáåëû íà êîíöå íàøåé ñòðîêè
  375.    mov esi, edi
  376.    mov bh, 1
  377.    inc eax
  378.    jmp @b
  379. .read: ;òî çàïèñûâàåì ñèìâîë â íàø áóôåð è ïåðåõîäèì íà ñëåäóþùèé ñèìâîë
  380.    mov byte[esi], bl
  381.    inc esi
  382.    inc eax
  383.    jmp @b
  384. @@:
  385.    mov byte[esi], 0 ;êëàä¸ì çàâåðøàþùèé íîëü
  386.    pop edi esi ebx
  387.    ret
  388.  
  389. trim:  ;esi - ïîñëåäíèé íóëåâîé ñèìâîë ñòðîêè
  390.    ;push esi
  391.    mov byte[esi], 0
  392.    dec esi
  393.    cmp byte[esi], 9   ;tab
  394.    je trim
  395.    cmp byte[esi], 32  ;space
  396.    je trim
  397.    inc esi
  398.    ;pop esi
  399.    ret
  400.  
  401.  
  402. cfgFileAdr: dd 0     ;àäðåñ êîíôèãóðàöèîííîãî ôàéëà â ïàìÿòè
  403.  
  404. loadConfig:
  405.    push eax ebx ecx edx
  406.    mcall 68, 27, fileName   ;çàãðóæàåì êîíôèãóðàöèîííûé ôàéë â ÎÇÓ
  407.    mov dword[cfgFileAdr], eax
  408.    cmp eax, 0
  409.    je loadConfig.exit       ;åñëè ôàéëà êîíôèãóðàöèè íåò, òî çàâåðøàåì ðàáîòó ïðèëîæåíèÿ
  410.    ;èíà÷å äàííûå çàãðóæåíû â ÎÇÓ, ðàçìåð â edx
  411.    cmp edx, 0               ;åñëè ôàéë ïóñò, â í¸ì íåò äàííûõ, òî çàâåðøàåì ðàáîòó
  412.    je loadConfig.exit
  413.  
  414.    add edx, eax             ;èíà÷å êëàä¸ì â edx - àäðåñ êîíöà ôàéëà
  415.  
  416.    mov byte[mode], 0
  417.    cmp byte[eax], '0'       ;åñëè ïàðàìåòð àêòèâíîñòè ïðèëîæåíèÿ èìååò ñòàòóñ: íå àêòèâíî
  418.    je loadConfig.exit       ;òî çàâåðøàåì ðàáîòó ïðèëîæåíèÿ
  419.    cmp byte[eax], 110 ;'n'
  420.    je loadConfig.exit
  421.  
  422.    ;èíà÷å âûñòàâëÿåì ðåæèì
  423.    cmp byte[eax], 121 ;'y'  ;êëàññè÷åñêèé ðåæèì
  424.    jne @f
  425.    mov byte[mode], 1
  426.    jmp loadConfig.modeEnd
  427. @@:
  428.    cmp byte[eax], '1'       ;êëàññè÷åñêèé ðåæèì
  429.    jne @f
  430.    mov byte[mode], 1
  431.    jmp loadConfig.modeEnd
  432. @@:
  433.    cmp byte[eax], '2'       ;ðåæèì àêòèâàöèè ïî ãîðÿ÷åé êëàâèøå
  434.    jne @f
  435.    mov byte[mode], 2
  436.    jmp loadConfig.modeEnd
  437. @@:
  438.    cmp byte[eax], '3'       ;ðåæèì æåñòà ïðè çàæàòîé êëàâèøå
  439.    jne @f
  440.    mov byte[mode], 3
  441.    jmp loadConfig.modeEnd
  442. @@:
  443.    mov byte[mode], 0        ;âî âñåõ îñòàëüíûõ ñëó÷àÿõ - îòêëþ÷åíî
  444.    jmp loadConfig.exit
  445. .modeEnd:
  446.  
  447.    ;èä¸ì äî êîíöà ýòîé ñòðîêè
  448.    call gotoEndString
  449.    ;íàõîäèì íà÷àëî ñëåäóþùåé ñòðîêè
  450.    call gotoStartString
  451.  
  452.    push esi edi
  453.  
  454.    ;ñ÷èòûâàåì ïóòü äëÿ ëåâîãî âåðõíåãî óãëà
  455.    mov esi, apps.path1
  456.    mov edi, apps.param1
  457.    call readPath
  458.    call gotoStartString  ;íàõîäèì íà÷àëî ñëåäóþùåé ñòðîêè
  459.  
  460.    ;ñ÷èòûâàåì ïóòü äëÿ ëåâîãî íèæíåãî óãëà
  461.    mov esi, apps.path2
  462.    mov edi, apps.param2
  463.    call readPath
  464.    call gotoStartString
  465.  
  466.    ;ñ÷èòûâàåì ïóòü äëÿ ïðàâîãî âåðõíåãî óãëà
  467.    mov esi, apps.path3
  468.    mov edi, apps.param3
  469.    call readPath
  470.    call gotoStartString
  471.  
  472.    ;ñ÷èòûâàåì ïóòü äëÿ ïðàâîãî íèæíåãî óãëà
  473.    mov esi, apps.path4
  474.    mov edi, apps.param4
  475.    call readPath
  476.    call gotoStartString
  477.  
  478.    ;ïðîâåðèì ñòðîêè íà '-'
  479.    call checkPathAdr
  480.  
  481.    pop edi esi
  482.  
  483.    ;ïðîïóñêàåì ñòðîêó ñ èìåíåì êëàâèøè
  484.    call gotoEndString
  485.    call gotoStartString
  486.  
  487.    ;ñ÷èòûâàåì ñêàíêîä àêòèâàöèîííîé êëàâèøè
  488.    push esi edi ecx
  489.    mov esi, keystr
  490.    mov edi, keystr
  491.    call readPath
  492.    ;ïðåîáðàçóåì ñòðîêó â ÷èñëî
  493.    mov esi, keystr
  494.    call strToInteger
  495.    mov byte[keyActivate], cl
  496.    pop ecx edi esi
  497.    call gotoStartString
  498.  
  499.    ;ñ÷èòûâàåì ðàäèóñ
  500.    push esi edi ecx
  501.    mov esi, radstr
  502.    mov edi, radstr
  503.    call readPath
  504.    ;ïðåîáðàçóåì ñòðîêó â ÷èñëî
  505.    mov esi, radstr
  506.    call strToInteger
  507.    ;òåïåðü ecx - çíà÷åíèå ðàäèóñà
  508.    ;!!! äîáàâèòü ïðîâåðêó, ÷òîáû ÷èñëî íå áûëî áîëüøå îáëàñòè ýêðàíà
  509.    ;íàñ èíòåðåñóåò êâàäðàò ÷èñëà
  510.    push eax edx
  511.    mov eax, ecx ;dword[radius2]
  512.    mul ecx
  513.    mov dword[radius2], eax
  514.    pop edx eax
  515.  
  516.    pop ecx edi esi
  517.  
  518.    ;ñ÷èòûâàòü ðàçìåð ýëåìåíòîâ èíòåðôåéñà íàì íå íóæíî (ïîêà ÷òî ýòîò ïàðàìåòð òîëüêî äëÿ êîíôèãà)
  519.    jmp .end
  520. .exit:
  521.    pop edx ecx ebx eax
  522.    mcall -1 ;çàêðûòü ýòó ïðîãðàììó
  523. .end:
  524.    mov ecx, dword[cfgFileAdr]    ;åñëè ôàéë áûë çàãðóæåí, òî
  525.    cmp ecx, 0
  526.    je @f
  527.    mcall 68, 13, ecx  ;âûãðóæàåì ôàéë èç ïàìÿòè
  528. @@:
  529.    pop edx ecx ebx eax
  530.    ret
  531.  
  532.  
  533. checkPathAdr:
  534.    push eax ebx
  535.    xor eax, eax
  536.  
  537.    mov ebx, apps.path1
  538.    cmp byte[ebx], '-'
  539.    jne @f
  540.    ;cmp byte[ebx+1], 0
  541.    ;jne @f
  542.    mov byte[ebx], 0
  543. @@:
  544.    mov ebx, apps.path2
  545.    cmp byte[ebx], '-'
  546.    jne @f
  547.    ;cmp byte[ebx+1], 0
  548.    ;jne @f
  549.    mov byte[ebx], 0
  550. @@:
  551.    mov ebx, apps.path3
  552.    cmp byte[ebx], '-'
  553.    jne @f
  554.    ;cmp byte[ebx+1], 0
  555.    ;jne @f
  556.    mov byte[ebx], 0
  557. @@:
  558.    mov ebx, apps.path4
  559.    cmp byte[ebx], '-'
  560.    jne @f
  561.    ;cmp byte[ebx+1], 0
  562.    ;jne @f
  563.    mov byte[ebx], 0
  564. @@:
  565.    pop ebx eax
  566.    ret
  567.  
  568. ;ïðåîáðàçîâàíèå ñòðîêè â öåëîå ÷èñëî
  569. strToInteger: ;âõîä: esi - óêàçàòåëü íà ñòðîêó ñ äåñÿòè÷íîé çàïèñüþ ÷èñëà, âûõîä: eñx - ÷èñëî
  570.    push eax ebx edx edi
  571.    xor eax, eax  ;îáíóëÿåì eax
  572.    xor ecx, ecx
  573.    mov edi, esi
  574. .get_last_symbol:
  575.    ;÷èòàåì î÷åðåäíîé ñèìâîë
  576.    mov al, byte[edi]
  577.  
  578.    ;åñëè ýòî íîëü, òî ñòðîêà çàêîí÷èëàñü
  579.    cmp al, 0
  580.    je @f
  581.  
  582.    ;èíà÷å ïåðåõîäèì íà ñëåäóþùèé ñèìâîë
  583.    inc edi
  584.    jmp .get_last_symbol
  585. @@:   ;äîøëè äî ïîñëåäíåãî ñèìâîëà è êëàä¸ì àäðåñ íà íåãî â edi
  586.    dec edi
  587.  
  588.    cmp edi, esi    ;àäðåñ ïîñëåäíåãî ñèìâîëà äîëæåí áûòü äàëüøå àäðåñà ïåðâîãî ñèìâîëà
  589.    jae @f
  590.    jmp .error  ;èíà÷å îøèáêà
  591. @@:
  592.    ;òåïåðü â edi ïîñëåäíèé ñèìâîë, à esi óêàçûâàåò íà íà÷àëî ñòðîêè (íà ïåðâé ñèìâîë ñòðîêè)
  593.    mov cl, byte[edi]
  594.    sub cl, 48 ;0x30 ;'0'
  595.    dec edi         ;ïåðåõîäèì íà ñëåä ñèìâîë îò êîíöà
  596.    mov ebx, 10     ;ìíîæèòåëü ñòåïåíè
  597. .tranform_cicle:
  598.    cmp edi, esi        ;åñëè áîëüøå íåò ñèìâîëîâ ñòðîêå, òî ÷èñëî ïðåîáðàçîâàëè - âûõîäèì
  599.    jb .end
  600.  
  601.    mov eax, 0
  602.    mov al, byte[edi]
  603.    sub al, 48 ;'0'
  604.    cmp al, 9 ;0x39           ;åñëè ÷èñëî áîëüøå 9, òî âèäèìî â ñòðîêå áûëî ÷òî-òî íå òàê
  605.    ja .error
  606.    cmp al, 0 ;0x30           ;åñëè ÷èñëî ìåíüøå 0, òî âèäèìî â ñòðîêå áûëî ÷òî-òî íå òàê
  607.    jb .error
  608.    mov edx, 0
  609.    mul ebx
  610.  
  611.    add ecx, eax
  612.  
  613.    dec edi
  614.    mov edx, 0
  615.    mov eax, 10
  616.    mul ebx
  617.    mov ebx, eax
  618.    jmp .tranform_cicle
  619. .error:
  620.    mov ecx, 0
  621. .end:
  622.    pop edi edx ebx eax
  623.    ret
  624.  
  625.  
  626. ;Âûíåñòè êîä íèæå â îòäåëüíûé îáùèé ìîäóëü
  627. selfName db '@HOTANGLES',0
  628. selfNameSize = 10 ;äî 11 byte
  629. ;
  630. compareBytes:
  631.    push edi esi ecx ebx
  632.    xor eax, eax
  633.    mov ecx, selfNameSize    ;max ðàçìåð ñòðîê 11
  634. @@:
  635.    mov bl, byte[edi]
  636.    cmp bl, byte[esi]
  637.    jne compareBytes.no
  638.    inc edi
  639.    inc esi
  640.    cmp ecx, 0
  641.    je @f
  642.    dec ecx
  643.    jmp @b
  644. .no:
  645.    mov eax, 1
  646. @@:
  647.    pop ebx ecx esi edi
  648.    ret
  649. ;
  650. copyKill:
  651.    push eax ebx ecx esi edi
  652.  
  653.    ;ñïåðâà ïðî÷ò¸ì ñâîþ èíôîðìàöèþ
  654.    mcall 9, buf, -1
  655.    mov eax, dword[buf+30]
  656.    mov dword[selfPID], eax
  657.  
  658.    ;óêàçàòåëè, êîòîðûå íèêîãäà íå ìåíÿþòñÿ:
  659.    mov esi, selfName       ;ïåðâàÿ ñòðîêà - èìÿ òåêóùåãî ïðèëîæåíèÿ
  660.    mov edi, buf            ;âòîðàÿ ñòðîêà - èìÿ òåêóùåãî ñëîòà
  661.    add edi, 10
  662.  
  663.    mov ecx, 1
  664. @@:
  665.    mcall 9, buf, ecx
  666.    mov dword[slotMax], eax
  667.  
  668.    ;åñëè ýòî ìû ñàìè, òî ïðîïóñêàåì ïðîâåðêó
  669.    mov eax, dword[buf+30]
  670.    cmp eax, dword[selfPID]
  671.    je copyKill.propusk
  672.  
  673.    call compareBytes   ;ñðàâíèâàåì 11 áàéò ñòðîê, ðåçóëüòàò â eax
  674.  
  675.    cmp eax, 0
  676.    je copyKill.selfKill
  677.  
  678. .propusk:
  679.    inc ecx
  680.    cmp ecx, dword[slotMax]
  681.    ja @f
  682.    jmp @b
  683.  
  684. .selfKill:
  685.    pop edi esi ecx ebx eax
  686.    mcall -1
  687.    ret
  688. @@:
  689.    pop edi esi ecx ebx eax
  690.    ret
  691.  
  692.  
  693. ;MODE 3
  694. init03:
  695.    ;mov dword[radius2], 100; 10*10
  696.    mov dword[backAdr], mode03
  697.    call setHotKey
  698. mode03:
  699.    mcall 10
  700.    cmp eax, 2     ;îáðàáîòêà íàæàòèÿ êëàâèøè
  701.    je hotkey
  702.  
  703.    ;cmp byte[keyState], 0
  704.    ;je mode03
  705.    cmp   eax, 6   ;îáðàáîòêà ïåðåìåùåíèé è íàæàòèÿ ìûøè
  706.    je    mouse03
  707.  
  708.    jmp mode03
  709.  
  710. mouse03:
  711.    cmp byte[keyState], 0     ;åñëè êëàâèøà íå çàæàòà, òî îáíîâèì íà÷àëüíûå êîîðäèíàòû
  712.    je mouse03.updateCoord
  713.  
  714.    cmp byte[state], LOCKd    ;åñëè óãîë çàáëîêèðîâàí, òî îáíîâèì íà÷àëüíûå êîîðäèíàòû
  715.    je mouse03.updateCoord
  716.  
  717.    cmp byte[state], SUPERLOCKd  ;åñëè äåéñòâèå áûëî âûïîëíåíî è ïîëó÷èëè áëîêèðîâêó, òî æä¸ì îòïóñêàíèÿ êëàâèøè àêòèâàöèè
  718.    je @f
  719.  
  720.    call checkPointInCircle   ;èíà÷å åñëè ïðåîäîëåëè ðàäèóñ àêòèâàöèè, òî âûçûâàåì äåéñòâèå íóæíîãî óãëà
  721.    jmp @f
  722. .updateCoord:
  723.    push eax ebx
  724.    mcall 37, 0 ;çàïîìèíàåì òåêóùèå(íà÷àëüíûå) êîîðäèíàòû ìûøè
  725.    ;mov dword[o.x], eax
  726.    mov word[o.y], ax
  727.    shr eax, 16
  728.    mov word[o.x], ax
  729.    pop ebx eax
  730. @@:
  731.    jmp dword[backAdr]
  732.  
  733.  
  734. radius2 dd 0  ;êâàäðàò ðàäèóñà äëÿ mode 3
  735. o:            ;êîîðäèíàòû íà÷àëüíîé è òåêóùåé òî÷êè
  736.  .x:   dw 0
  737.  .y:   dw 0
  738.  .cx:  dw 0
  739.  .cy:  dw 0
  740.  
  741. ;ïðîâåðêà âûõîäà çà ïðåäåëû êðóãà
  742. ; sqrt( (x2-x1)^2 + (y2-y1)^2 ) <= radius
  743. ; (x2-x1)^2 + (y2-y1)^2 <= radius^2
  744. checkPointInCircle:
  745.    push eax ebx ecx edx
  746.    mcall 37, 0 ;ïîëó÷àåì òåêóùèå êîîðäèíàòû ìûøè
  747.    ;mov dword[o.cx], eax
  748.    mov word[o.cy], ax
  749.    shr eax, 16
  750.    mov word[o.cx], ax
  751.  
  752.    xor eax, eax
  753.    xor edx, edx
  754.    mov ax, word[o.x]
  755.    mov dx, word[o.cx]
  756.    cmp dx, ax
  757.    jae @f
  758.    sub ax, dx
  759.    mov dx, ax
  760.    jmp .xend
  761. @@:
  762.    sub dx, ax
  763. .xend:
  764.    mov eax, edx
  765.    mul dx
  766.  
  767.    mov ebx, eax
  768.  
  769.    xor eax, eax
  770.    xor edx, edx
  771.    mov ax, word[o.y]
  772.    mov dx, word[o.cy]
  773.    cmp dx, ax
  774.    jae @f
  775.    sub ax, dx
  776.    mov dx, ax
  777.    jmp .yend
  778. @@:
  779.    sub dx, ax
  780. .yend:
  781.    mov eax, edx
  782.    mul dx
  783.  
  784.    add ebx, eax
  785.  
  786.    cmp ebx, dword[radius2]
  787.    jbe @f
  788.    call activateCorner ;èíà÷å àêòèâèðóåì íóæíûé óãîë
  789.  @@:
  790.    pop edx ecx ebx eax
  791.    ret
  792.  
  793. ;âûÿñíèòü â ñòîðîíó êàêîãî óãëà óøëè è àêòèâèðîâàòü åãî
  794. activateCorner:
  795.    push eax ecx
  796.    xor eax, eax
  797.  
  798.    mov ax, word[o.cx]
  799.    cmp ax, word[o.x]
  800.    je activateCorner.end       ;åñëè êîîðäèíàòà ðàâíà, òî âûõîäèì (òàêîãî áûòü íå äîëæíî)
  801.    ja activateCorner.right
  802.  
  803.    ;èíà÷å ëåâàÿ ñòîðîíà
  804.    mov ax, word[o.cy]
  805.    cmp ax, word[o.y]
  806.    je activateCorner.end       ;åñëè êîîðäèíàòà ðàâíà, òî âûõîäèì (òàêîãî áûòü íå äîëæíî)
  807.    jb activateCorner.leftup
  808.  
  809.    ;èíà÷å ëåâûé íèæíèé óãîë
  810.    mov ecx, 1
  811.    call run_command
  812.    mov byte[keyState], 0
  813.    mov byte[state], SUPERLOCKd
  814.    jmp activateCorner.end
  815.  
  816. .leftup:
  817.    ;ëåâûé âåðõíèé óãîë
  818.    mov ecx, 0
  819.    call run_command
  820.    mov byte[keyState], 0
  821.    mov byte[state], SUPERLOCKd
  822.    jmp activateCorner.end
  823.  
  824. .right: ;ïðàâàÿ ñòîðîíà ýêðàíà
  825.    mov ax, word[o.cy]
  826.    cmp ax, word[o.y]
  827.    je activateCorner.end       ;åñëè êîîðäèíàòà ðàâíà, òî âûõîäèì (òàêîãî áûòü íå äîëæíî)
  828.    jb activateCorner.rightup
  829.  
  830.    ;èíà÷å ïðàâûé íèæíèé óãîë
  831.    mov ecx, 3
  832.    call run_command
  833.    mov byte[keyState], 0
  834.    mov byte[state], SUPERLOCKd
  835.    jmp activateCorner.end
  836.  
  837. .rightup:
  838.    ;ïðàâûé âåðõíèé óãîë
  839.    mov ecx, 2
  840.    call run_command
  841.    mov byte[keyState], 0
  842.    mov byte[state], SUPERLOCKd
  843.    jmp activateCorner.end
  844.  
  845. .end:
  846.    pop ecx eax
  847.    ret
  848.  
  849.  
  850.  
  851. keyActivate db 41 ;16 ;'Q' ;êëàâèøà àêòèâàöèè
  852. keyState    db 0  ;0-êëàâèøà íå àêòèâíà, 1 - êëàâèøà àêòèâíà
  853.  
  854. backAdr rd 1      ;àäðåñ äëÿ âîçâðàòà èç ïðîâåðêè ìûøè
  855. slotMax rd 1
  856. selfPID rd 1
  857. buf rb 1024
  858.  
  859. ;ñòðóêòóðêà äàííûõ äëÿ õðàíåíèÿ ïàðàìåòðîâ ýêðàíà
  860. screen:
  861.   .width  rw 1
  862.   .height rw 1
  863.  
  864. state: rb 1  ;ñîñòîÿíèå: 0=unlock, 1=lock, 2=superlock for mode 3
  865. mode:  rb 1  ;ðåæèì ðàáîòû ïðèëîæåíèÿ: 0=íå ðàáîòàåò, 1=êëàññè÷åñêèé, 2=ïî ãîðÿ÷åé êëàâèøå
  866.  
  867.  
  868. keystr: rb 4 ;ñòðîêà ñî çíà÷åíèåì ñêàíêîäà àêòèâàöèîííîé êëàâèøè
  869. radstr: rb 5 ;ñòðîêà ñî çíà÷åíèåì ðàäèóñà
  870. apps:
  871.  .path1: rb 512
  872.  .path2: rb 512
  873.  .path3: rb 512
  874.  .path4: rb 512
  875.  .param1: rb 512
  876.  .param2: rb 512
  877.  .param3: rb 512
  878.  .param4: rb 512
  879. appsEnd:
  880.  
  881.  
  882. I_END:
  883.