Subversion Repositories Kolibri OS

Rev

Rev 7443 | 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 ;dword[newData.lu]
  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 ;dword[newData.ld]
  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 ;dword[newData.ru]
  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 ;dword[newData.rd]
  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], 8
  394.    je trim
  395.    cmp byte[esi], 32
  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.    ;call checkAdr ;ïðîâåðèì ñòðîêè íà '-' è ïóñòîòó è âûñòàâèì áèòîâóþ ìàñêó
  479.    call checkPathAdr
  480.  
  481.    pop edi esi
  482.  
  483.    ;ïðîïóñêàåì ñòðîêó ñ èìåíåì êëàâèøè
  484.    call gotoEndString
  485.    call gotoStartString
  486.  
  487.    ;ñ÷èòûâàåì ñêàíêîä àêòèâàöèîííîé êëàâèøè
  488.    ;call readKey
  489.    ;call gotoEndString
  490.    push esi edi ecx
  491.    mov esi, keystr
  492.    mov edi, keystr
  493.    call readPath
  494.    ;ïðåîáðàçóåì ñòðîêó â ÷èñëî
  495.    mov esi, keystr
  496.    call strToInteger
  497.    mov byte[keyActivate], cl
  498.    pop ecx edi esi
  499.    call gotoStartString
  500.  
  501.    ;ñ÷èòûâàåì ðàäèóñ
  502.    push esi edi ecx
  503.    mov esi, radstr
  504.    mov edi, radstr
  505.    call readPath
  506.    ;ïðåîáðàçóåì ñòðîêó â ÷èñëî
  507.    mov esi, radstr
  508.    call strToInteger
  509.    ;òåïåðü ecx - çíà÷åíèå ðàäèóñà
  510.    ;!!! äîáàâèòü ïðîâåðêó, ÷òîáû ÷èñëî íå áûëî áîëüøå îáëàñòè ýêðàíà
  511.    ;íàñ èíòåðåñóåò êâàäðàò ÷èñëà
  512.    push eax edx
  513.    mov eax, ecx ;dword[radius2]
  514.    mul ecx
  515.    mov dword[radius2], eax
  516.    pop edx eax
  517.  
  518.    pop ecx edi esi
  519.  
  520.    ;ñ÷èòûâàòü ðàçìåð ýëåìåíòîâ èíòåðôåéñà íàì íå íóæíî (ïîêà ÷òî ýòîò ïàðàìåòð òîëüêî äëÿ êîíôèãà)
  521.    jmp .end
  522. .exit:
  523.    pop edx ecx ebx eax
  524.    mcall -1 ;çàêðûòü ýòó ïðîãðàììó
  525. .end:
  526.    mov ecx, dword[cfgFileAdr]    ;åñëè ôàéë áûë çàãðóæåí, òî
  527.    cmp ecx, 0
  528.    je @f
  529.    mcall 68, 13, ecx  ;âûãðóæàåì ôàéë èç ïàìÿòè
  530. @@:
  531.    pop edx ecx ebx eax
  532.    ret
  533.  
  534.  
  535. ;readKey:
  536.    ;÷èòàåì êëàâèøó è âûõîäèì
  537. ;   cmp dword[eax], 'Ctrl'
  538. ;   jne .notCtrl
  539. ;   mov byte[keyActivate], 3
  540. ;   jmp .end
  541. ;.notCtrl:
  542. ;   cmp dword[eax], 'Shif'
  543. ;   jne .notShift
  544. ;   mov byte[keyActivate], 2
  545. ;   jmp .end
  546. ;.notShift:
  547. ;   cmp dword[eax], 'Spac'
  548. ;   jne .notSpace
  549. ;   mov byte[keyActivate], 32
  550. ;   jmp .end
  551. ;.notSpace:
  552. ;   cmp word[eax], 'Al'
  553. ;   jne .notAlt
  554. ;   mov byte[keyActivate], 1
  555. ;   jmp .end
  556. ;.notAlt:
  557.    ;óáåäèìñÿ, ÷òî òàì 1 ñèìâîë, à íå ñòðîêà
  558. ;   cmp byte[eax+1], 10
  559. ;   je .oneSymb
  560. ;   cmp byte[eax+1], 0
  561. ;   je .oneSymb
  562. ;   cmp byte[eax+1], 13
  563. ;   je .oneSymb
  564. ;   jmp .default    ;â ëþáîì äðóãîì ñëó÷àå îøèáêà êîíôèãà - âûõîä
  565. ;.oneSymb:
  566.    ;ïðîâåðÿåì, ÷òî ñèìâîë ðàçðåø¸ííûé  !!!  äîäåëàòü
  567.  
  568.    ;äîáàâëÿåì ñèìâîë êàê åñòü
  569. ;   push ebx
  570. ;   ;xor ebx, ebx
  571. ;   mov bl, byte[eax]
  572. ;   mov byte[keyActivate], bl
  573. ;   pop ebx
  574.  
  575. ;   jmp .end
  576. ;.default:
  577. ;   mcall -1
  578. ;   ;mov byte[keyActivate], 2
  579. ;.end:
  580. ;   ret
  581.  
  582.  
  583. checkPathAdr:
  584.    push eax ebx
  585.    xor eax, eax
  586.  
  587.    mov ebx, apps.path1
  588.    cmp byte[ebx], '-'
  589.    jne @f
  590.    ;cmp byte[ebx+1], 0
  591.    ;jne @f
  592.    mov byte[ebx], 0
  593. @@:
  594.    mov ebx, apps.path2
  595.    cmp byte[ebx], '-'
  596.    jne @f
  597.    ;cmp byte[ebx+1], 0
  598.    ;jne @f
  599.    mov byte[ebx], 0
  600. @@:
  601.    mov ebx, apps.path3
  602.    cmp byte[ebx], '-'
  603.    jne @f
  604.    ;cmp byte[ebx+1], 0
  605.    ;jne @f
  606.    mov byte[ebx], 0
  607. @@:
  608.    mov ebx, apps.path4
  609.    cmp byte[ebx], '-'
  610.    jne @f
  611.    ;cmp byte[ebx+1], 0
  612.    ;jne @f
  613.    mov byte[ebx], 0
  614. @@:
  615.    pop ebx eax
  616.    ret
  617.  
  618.  
  619. checkAdr:
  620.    push eax ebx
  621.    xor eax, eax
  622.  
  623.    mov ebx, apps.path1
  624.    cmp byte[ebx], '-'
  625.    jne @f
  626.    inc eax
  627. @@:
  628.    mov ebx, apps.path2
  629.    cmp byte[ebx], '-'
  630.    jne @f
  631.    add eax, 2
  632. @@:
  633.    mov ebx, apps.path3
  634.    cmp byte[ebx], '-'
  635.    jne @f
  636.    add eax, 4
  637. @@:
  638.    mov ebx, apps.path4
  639.    cmp byte[ebx], '-'
  640.    jne @f
  641.    add eax, 8
  642. @@:
  643.  
  644.    mov ebx, apps.param1
  645.    cmp byte[ebx], '-'
  646.    jne @f
  647.    add eax, 16
  648. @@:
  649.    mov ebx, apps.param2
  650.    cmp byte[ebx], '-'
  651.    jne @f
  652.    add eax, 32
  653. @@:
  654.    mov ebx, apps.param3
  655.    cmp byte[ebx], '-'
  656.    jne @f
  657.    add eax, 64
  658. @@:
  659.    mov ebx, apps.param4
  660.    cmp byte[ebx], '-'
  661.    jne @f
  662.    add eax, 128
  663. @@:
  664.  
  665.    mov byte[apps.bits], al
  666.    pop ebx eax
  667.    ret
  668.  
  669.  
  670.  
  671. ;ïðåîáðàçîâàíèå ñòðîêè â öåëîå ÷èñëî
  672. strToInteger: ;âõîä: esi - óêàçàòåëü íà ñòðîêó ñ äåñÿòè÷íîé çàïèñüþ ÷èñëà, âûõîä: eñx - ÷èñëî
  673.    push eax ebx edx edi
  674.    xor eax, eax  ;îáíóëÿåì eax
  675.    xor ecx, ecx
  676.    mov edi, esi
  677. .get_last_symbol:
  678.    ;÷èòàåì î÷åðåäíîé ñèìâîë
  679.    mov al, byte[edi]
  680.  
  681.    ;åñëè ýòî íîëü, òî ñòðîêà çàêîí÷èëàñü
  682.    cmp al, 0
  683.    je @f
  684.  
  685.    ;èíà÷å ïåðåõîäèì íà ñëåäóþùèé ñèìâîë
  686.    inc edi
  687.    jmp .get_last_symbol
  688. @@:   ;äîøëè äî ïîñëåäíåãî ñèìâîëà è êëàä¸ì àäðåñ íà íåãî â edi
  689.    dec edi
  690.  
  691.    cmp edi, esi    ;àäðåñ ïîñëåäíåãî ñèìâîëà äîëæåí áûòü äàëüøå àäðåñà ïåðâîãî ñèìâîëà
  692.    jae @f
  693.    jmp .error  ;èíà÷å îøèáêà
  694. @@:
  695.    ;òåïåðü â edi ïîñëåäíèé ñèìâîë, à esi óêàçûâàåò íà íà÷àëî ñòðîêè (íà ïåðâé ñèìâîë ñòðîêè)
  696.    mov cl, byte[edi]
  697.    sub cl, 48 ;0x30 ;'0'
  698.    dec edi         ;ïåðåõîäèì íà ñëåä ñèìâîë îò êîíöà
  699.    mov ebx, 10     ;ìíîæèòåëü ñòåïåíè
  700. .tranform_cicle:
  701.    cmp edi, esi        ;åñëè áîëüøå íåò ñèìâîëîâ ñòðîêå, òî ÷èñëî ïðåîáðàçîâàëè - âûõîäèì
  702.    jb .end
  703.  
  704.    mov eax, 0
  705.    mov al, byte[edi]
  706.    sub al, 48 ;'0'
  707.    cmp al, 9 ;0x39           ;åñëè ÷èñëî áîëüøå 9, òî âèäèìî â ñòðîêå áûëî ÷òî-òî íå òàê
  708.    ja .error
  709.    cmp al, 0 ;0x30           ;åñëè ÷èñëî ìåíüøå 0, òî âèäèìî â ñòðîêå áûëî ÷òî-òî íå òàê
  710.    jb .error
  711.    mov edx, 0
  712.    mul ebx
  713.  
  714.    add ecx, eax
  715.  
  716.    dec edi
  717.    mov edx, 0
  718.    mov eax, 10
  719.    mul ebx
  720.    mov ebx, eax
  721.    jmp .tranform_cicle
  722. .error:
  723.    mov ecx, 0
  724. .end:
  725.    pop edi edx ebx eax
  726.    ret
  727.  
  728.  
  729. ;Âûíåñòè êîä íèæå â îòäåëüíûé îáùèé ìîäóëü
  730. selfName db '@HOTANGLES',0
  731. selfNameSize = 10 ;äî 11 byte
  732. ;
  733. compareBytes:
  734.    push edi esi ecx ebx
  735.    xor eax, eax
  736.    mov ecx, selfNameSize    ;max ðàçìåð ñòðîê 11
  737. @@:
  738.    mov bl, byte[edi]
  739.    cmp bl, byte[esi]
  740.    jne compareBytes.no
  741.    inc edi
  742.    inc esi
  743.    cmp ecx, 0
  744.    je @f
  745.    dec ecx
  746.    jmp @b
  747. .no:
  748.    mov eax, 1
  749. @@:
  750.    pop ebx ecx esi edi
  751.    ret
  752. ;
  753. copyKill:
  754.    push eax ebx ecx esi edi
  755.  
  756.    ;ñïåðâà ïðî÷ò¸ì ñâîþ èíôîðìàöèþ
  757.    mcall 9, buf, -1
  758.    mov eax, dword[buf+30]
  759.    mov dword[selfPID], eax
  760.  
  761.    ;óêàçàòåëè, êîòîðûå íèêîãäà íå ìåíÿþòñÿ:
  762.    mov esi, selfName       ;ïåðâàÿ ñòðîêà - èìÿ òåêóùåãî ïðèëîæåíèÿ
  763.    mov edi, buf            ;âòîðàÿ ñòðîêà - èìÿ òåêóùåãî ñëîòà
  764.    add edi, 10
  765.  
  766.    mov ecx, 1
  767. @@:
  768.    mcall 9, buf, ecx
  769.    mov dword[slotMax], eax
  770.  
  771.    ;åñëè ýòî ìû ñàìè, òî ïðîïóñêàåì ïðîâåðêó
  772.    mov eax, dword[buf+30]
  773.    cmp eax, dword[selfPID]
  774.    je copyKill.propusk
  775.  
  776.    call compareBytes   ;ñðàâíèâàåì 11 áàéò ñòðîê, ðåçóëüòàò â eax
  777.  
  778.    cmp eax, 0
  779.    je copyKill.selfKill
  780.  
  781. .propusk:
  782.    inc ecx
  783.    cmp ecx, dword[slotMax]
  784.    ja @f
  785.    jmp @b
  786.  
  787. .selfKill:
  788.    pop edi esi ecx ebx eax
  789.    mcall -1
  790.    ret
  791. @@:
  792.    pop edi esi ecx ebx eax
  793.    ret
  794.  
  795.  
  796. ;MODE 3
  797. init03:
  798.    ;mov dword[radius2], 100; 10*10
  799.    mov dword[backAdr], mode03
  800.    call setHotKey
  801. mode03:
  802.    mcall 10
  803.    cmp eax, 2     ;îáðàáîòêà íàæàòèÿ êëàâèøè
  804.    je hotkey
  805.  
  806.    ;cmp byte[keyState], 0
  807.    ;je mode03
  808.    cmp   eax, 6   ;îáðàáîòêà ïåðåìåùåíèé è íàæàòèÿ ìûøè
  809.    je    mouse03
  810.  
  811.    jmp mode03
  812.  
  813. mouse03:
  814.    cmp byte[keyState], 0     ;åñëè êëàâèøà íå çàæàòà, òî îáíîâèì íà÷àëüíûå êîîðäèíàòû
  815.    je mouse03.updateCoord
  816.  
  817.    cmp byte[state], LOCKd    ;åñëè óãîë çàáëîêèðîâàí, òî îáíîâèì íà÷àëüíûå êîîðäèíàòû
  818.    je mouse03.updateCoord
  819.  
  820.    cmp byte[state], SUPERLOCKd  ;åñëè äåéñòâèå áûëî âûïîëíåíî è ïîëó÷èëè áëîêèðîâêó, òî æä¸ì îòïóñêàíèÿ êëàâèøè àêòèâàöèè
  821.    je @f
  822.  
  823.    call checkPointInCircle   ;èíà÷å åñëè ïðåîäîëåëè ðàäèóñ àêòèâàöèè, òî âûçûâàåì äåéñòâèå íóæíîãî óãëà
  824.    jmp @f
  825. .updateCoord:
  826.    push eax ebx
  827.    mcall 37, 0 ;çàïîìèíàåì òåêóùèå(íà÷àëüíûå) êîîðäèíàòû ìûøè
  828.    ;mov dword[o.x], eax
  829.    mov word[o.y], ax
  830.    shr eax, 16
  831.    mov word[o.x], ax
  832.    pop ebx eax
  833. @@:
  834.    jmp dword[backAdr]
  835.  
  836.  
  837. radius2 dd 0  ;êâàäðàò ðàäèóñà äëÿ mode 3
  838. o:            ;êîîðäèíàòû íà÷àëüíîé è òåêóùåé òî÷êè
  839.  .x:   dw 0
  840.  .y:   dw 0
  841.  .cx:  dw 0
  842.  .cy:  dw 0
  843.  
  844. ;ïðîâåðêà âûõîäà çà ïðåäåëû êðóãà
  845. ; sqrt( (x2-x1)^2 + (y2-y1)^2 ) <= radius
  846. ; (x2-x1)^2 + (y2-y1)^2 <= radius^2
  847. checkPointInCircle:
  848.    push eax ebx ecx edx
  849.    mcall 37, 0 ;ïîëó÷àåì òåêóùèå êîîðäèíàòû ìûøè
  850.    ;mov dword[o.cx], eax
  851.    mov word[o.cy], ax
  852.    shr eax, 16
  853.    mov word[o.cx], ax
  854.  
  855.    xor eax, eax
  856.    xor edx, edx
  857.    mov ax, word[o.x]
  858.    mov dx, word[o.cx]
  859.    cmp dx, ax
  860.    jae @f
  861.    sub ax, dx
  862.    mov dx, ax
  863.    jmp .xend
  864. @@:
  865.    sub dx, ax
  866. .xend:
  867.    mov eax, edx
  868.    mul dx
  869.  
  870.    mov ebx, eax
  871.  
  872.    xor eax, eax
  873.    xor edx, edx
  874.    mov ax, word[o.y]
  875.    mov dx, word[o.cy]
  876.    cmp dx, ax
  877.    jae @f
  878.    sub ax, dx
  879.    mov dx, ax
  880.    jmp .yend
  881. @@:
  882.    sub dx, ax
  883. .yend:
  884.    mov eax, edx
  885.    mul dx
  886.  
  887.    add ebx, eax
  888.  
  889.    cmp ebx, dword[radius2]
  890.    jbe @f
  891.    call activateCorner ;èíà÷å àêòèâèðóåì íóæíûé óãîë
  892.  @@:
  893.    pop edx ecx ebx eax
  894.    ret
  895.  
  896. ;âûÿñíèòü â ñòîðîíó êàêîãî óãëà óøëè è àêòèâèðîâàòü åãî
  897. activateCorner:
  898.    push eax ecx
  899.    xor eax, eax
  900.  
  901.    mov ax, word[o.cx]
  902.    cmp ax, word[o.x]
  903.    je activateCorner.end       ;åñëè êîîðäèíàòà ðàâíà, òî âûõîäèì (òàêîãî áûòü íå äîëæíî)
  904.    ja activateCorner.right
  905.  
  906.    ;èíà÷å ëåâàÿ ñòîðîíà
  907.    mov ax, word[o.cy]
  908.    cmp ax, word[o.y]
  909.    je activateCorner.end       ;åñëè êîîðäèíàòà ðàâíà, òî âûõîäèì (òàêîãî áûòü íå äîëæíî)
  910.    jb activateCorner.leftup
  911.  
  912.    ;èíà÷å ëåâûé íèæíèé óãîë
  913.    mov ecx, 1
  914.    call run_command
  915.    mov byte[keyState], 0
  916.    mov byte[state], SUPERLOCKd
  917.    jmp activateCorner.end
  918.  
  919. .leftup:
  920.    ;ëåâûé âåðõíèé óãîë
  921.    mov ecx, 0
  922.    call run_command
  923.    mov byte[keyState], 0
  924.    mov byte[state], SUPERLOCKd
  925.    jmp activateCorner.end
  926.  
  927. .right: ;ïðàâàÿ ñòîðîíà ýêðàíà
  928.    mov ax, word[o.cy]
  929.    cmp ax, word[o.y]
  930.    je activateCorner.end       ;åñëè êîîðäèíàòà ðàâíà, òî âûõîäèì (òàêîãî áûòü íå äîëæíî)
  931.    jb activateCorner.rightup
  932.  
  933.    ;èíà÷å ïðàâûé íèæíèé óãîë
  934.    mov ecx, 3
  935.    call run_command
  936.    mov byte[keyState], 0
  937.    mov byte[state], SUPERLOCKd
  938.    jmp activateCorner.end
  939.  
  940. .rightup:
  941.    ;ïðàâûé âåðõíèé óãîë
  942.    mov ecx, 2
  943.    call run_command
  944.    mov byte[keyState], 0
  945.    mov byte[state], SUPERLOCKd
  946.    jmp activateCorner.end
  947.  
  948. .end:
  949.    pop ecx eax
  950.    ret
  951.  
  952.  
  953.  
  954. keyActivate db 41 ;16 ;'Q' ;êëàâèøà àêòèâàöèè
  955. keyState    db 0  ;0-êëàâèøà íå àêòèâíà, 1 - êëàâèøà àêòèâíà
  956.  
  957. backAdr rd 1      ;àäðåñ äëÿ âîçâðàòà èç ïðîâåðêè ìûøè
  958. slotMax rd 1
  959. selfPID rd 1
  960. buf rb 1024
  961.  
  962. ;ñòðóêòóðêà äàííûõ äëÿ õðàíåíèÿ ïàðàìåòðîâ ýêðàíà
  963. screen:
  964.   .width  rw 1
  965.   .height rw 1
  966.  
  967. state: rb 1  ;ñîñòîÿíèå: 0=unlock, 1=lock, 2=superlock for mode 3
  968. mode:  rb 1  ;ðåæèì ðàáîòû ïðèëîæåíèÿ: 0=íå ðàáîòàåò, 1=êëàññè÷åñêèé, 2=ïî ãîðÿ÷åé êëàâèøå
  969.  
  970.  
  971. keystr: rb 4 ;ñòðîêà ñî çíà÷åíèåì ñêàíêîäà àêòèâàöèîííîé êëàâèøè
  972. radstr: rb 5 ;ñòðîêà ñî çíà÷åíèåì ðàäèóñà
  973. apps:
  974.  .bits: rb 1
  975.  .path1: rb 512
  976.  .path2: rb 512
  977.  .path3: rb 512
  978.  .path4: rb 512
  979.  .param1: rb 512
  980.  .param2: rb 512
  981.  .param3: rb 512
  982.  .param4: rb 512
  983. appsEnd:
  984.  
  985.  
  986. I_END:
  987.