Subversion Repositories Kolibri OS

Rev

Rev 7416 | Go to most recent revision | Blame | Last modification | View Log | Download | RSS feed

  1. ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
  2. ; Hot Angles ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
  3. ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
  4. ; Compile with FASM
  5. ; Version 0.3.5: Oct 5, 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.  
  35. ; çàãîëîâîê
  36. db 'MENUET01'     ;ìàãè÷åñêèé èäåíòèôèêàòîð
  37. dd 0x01           ;âåðñèÿ
  38. dd START_DEBUG    ;àäðåñ òî÷êè ñòàðòà ïðîãðàììû
  39. dd I_END          ;àäðåñ êîíöà, ïî ôàêòó ðàçìåð ôàéëà ïðîãðàììû
  40. dd 0x100000       ;òðåáóåìîå êîë-âî ïàìÿòè äëÿ çàãðóçêè ïðîãðàììû
  41. dd 0x7fff0        ;íà÷àëüíîå çíà÷åíèå ðåãèñòðà esp - àäðåñ êîíöà îáëàñòè ñòýêà òàê êàê ñòýê ðàñòåò â ñòîðîíó ìåíüøèõ àäðåñîâ
  42. dd 0, 0           ;àäðåñ ñòðîêè ïàðàìåòðîâ è àäðåñ ñòðîêè ïóòè èñïîëíÿåìîãî ôàéëà
  43.  
  44.  
  45. include '../../macros.inc'
  46.  
  47. START_DEBUG:
  48.    call copyKill         ;ïðîñòåéøàÿ çàùèòà îò ïîâòîðíîãî çàïóñêà
  49.    mcall  68, 11         ;èíèöèàëèçàöèÿ êó÷è
  50.    call loadConfig       ;çàãðóæàåì êîíôèãóðàöèþ ïðèëîæåíèÿ
  51.  
  52.    cmp byte[mode], 0     ;ôóíêöèÿ îòêëþ÷åíà - âûõîä
  53.    jne @f
  54.    mcall -1
  55. @@:
  56.    ;ðåæèì àêòèâàöèè ãîðÿ÷åé êëàâèøåé?
  57.    cmp byte[mode], 2 ;ïîäïèñûâàåìñÿ íà èíòåðåñíûå íàì ñîáûòèÿ â çàâèñèìîñòè îò ðåæèìà ðàáîòû
  58.    jne @f
  59.    mov ebx, 00000100000000000000000000100010b    ;åñëè äà, òî ïîäïèñûâàåìñÿ íà êëàâèøè
  60.    mcall 40
  61.    jmp init02
  62. @@:
  63.    ; âî âñåõ îñòàëüíûõ ñëó÷àÿõ - êëàññè÷åñêèé ðåæèì ðàáîòû
  64.    ;mode=1 êëàññè÷åñêèé ðåæèì ðàáîòû - ðåàêöèÿ ïðè íàâåäåíèè â óãîë
  65.    mov byte[mode], 1
  66.    mov ebx, 00000100000000000000000000100000b
  67.    mcall 40
  68.    jmp init01
  69.  
  70.  
  71.  
  72. init02:
  73.    mov dword[backAdr], mode02
  74.    call setHotKey
  75. mode02:
  76.    mcall 10
  77.    cmp eax, 2     ;îáðàáîòêà íàæàòèÿ êëàâèøè
  78.    je hotkey
  79.  
  80.    cmp byte[keyState], 0
  81.    je mode02
  82.    cmp   eax, 6   ;îáðàáîòêà ïåðåìåùåíèé è íàæàòèÿ ìûøè
  83.    je    mouse
  84.  
  85.    jmp mode02
  86.  
  87.  
  88. setHotKey:    ;óñòàíîâèòü ãîðÿ÷óþ êëàâèøó
  89.    push eax ebx ecx edx
  90.    xor ecx, ecx
  91.    mov cl, byte[keyActivate]  ;íàæàòèå ãîðÿ÷åé êëàâèøè
  92.    mov edx, 0x000
  93.    mcall 66, 4, ecx, edx
  94.  
  95.    ;mov cl, byte[keyActivate]
  96.    add cl, 128              ;îòïóñêàíèå ãîðÿ÷åé êëàâèøè
  97.    ;mov edx, 0x000
  98.    mcall 66, 4, ecx, edx
  99.    pop edx ecx ebx eax
  100.    ret
  101.  
  102.  
  103. hotkey:
  104.    mcall 2
  105.    cmp eax, 1     ;áóôåð êëàâèø ïóñò?
  106.    je hotkey.end
  107.  
  108.    cmp al, 2      ;íàñ èíòåðåñóåò òîëüêî ñêàí êîä ãîðÿ÷åé êëàâèøè, èíà÷å âûõîäèì
  109.    jne hotkey.end
  110.  
  111.    cmp ah, byte[keyActivate]   ;åñëè íàæàòà íàøà ãîðÿ÷àÿ êëàâèøà
  112.    jne @f
  113.    mov byte[keyState], 1
  114.    mov byte[state], UNLOCKd
  115.    jmp hotkey.end
  116. @@:
  117.    push edx
  118.    xor edx, edx
  119.    mov dl, byte[keyActivate]
  120.    add dl, 128
  121.    cmp ah, dl   ;åñëè îòïóùåíà íàøà ãîðÿ÷àÿ êëàâèøà
  122.    jne @f       ;hotkey.end
  123.    ;mov ecx, 0  ;ñòðîêè äëÿ îòëàäêè è òåñòà
  124.    ;call run_command
  125.    mov byte[keyState], 0
  126.    mov byte[state], LOCKd
  127. @@:
  128.    pop edx
  129. .end:
  130.    jmp mode02
  131.  
  132.  
  133. init01:
  134.    mov dword[backAdr], mode01
  135. mode01:
  136.   mov     eax, 10                 ; function 10 : wait until event
  137.   mcall                           ; event type is returned in eax
  138.  
  139.   cmp   eax, 6           ;îáðàáîòêà ïåðåìåùåíèé è íàæàòèÿ ìûøè
  140.   je    mouse
  141.  
  142.   jmp mode01
  143.  
  144.  
  145. mouse:
  146.    push ebx
  147.    mcall 37, 0   ;ïîëó÷àåì òåêóùèå êîîðäèíàòû ìûøè
  148.    pop ebx
  149.  
  150.   cmp eax, 0 ;ëåâûé âåðõíèé óãîë
  151.   jne @f
  152.   ; -- çäåñü âûçûâàåì ñîîòâ. âûçîâ äëÿ ëåâîãî âåðõíåãî óãëà  (X=0, Y=0)
  153.   push ecx
  154.   mov ecx, 0
  155.   call run_command
  156.   pop ecx
  157.  
  158.   jmp dword[backAdr] ;finish
  159. @@:
  160.   call get_screen_size ;èíà÷å îáíîâëÿåì ðàçìåðû ýêðàíà
  161.  
  162.   cmp ax, word[screen.height]    ;Ymouse = Yscreen ?
  163.   je Ytrue
  164.   ;åñëè Y íå ðàâíû, òî íàñ èíòåðåñóåò Y=0 è X=ScreenWidth (ïðàâûé âåðõíèé óãîë)
  165.  
  166.   cmp ax, 0
  167.   jne unlockend
  168.   shr eax, 16
  169.   cmp ax, word[screen.width]
  170.   jne unlockend
  171.   ; -- çäåñü âûçûâàåì äëÿ ïðàâîãî âåðõåíåãî óãëà
  172.   push ecx
  173.   mov ecx, 2
  174.   call run_command
  175.   pop ecx
  176.  
  177.   jmp dword[backAdr]
  178. Ytrue:
  179.   ;åñëè Y ðàâíû, òî íàñ èíòåðåñóåò X=0 (ëåâûé íèæíèé óãîë) èëè X=ScreenWidth (ïðàâûé íèæíèé)
  180.   shr eax, 16
  181.   cmp ax, 0
  182.   jne @f
  183.   ; -- X=0, Y = Height  (ëåâûé íèæíèé óãîë)
  184.   push ecx
  185.   mov ecx, 1
  186.   call run_command
  187.   pop ecx
  188.   jmp dword[backAdr]
  189. @@:
  190.   cmp ax, word[screen.width]
  191.   jne unlockend
  192.   ; -- (ïðàâûé íèæíèé óãîë)
  193.   push ecx
  194.   mov ecx, 3
  195.   call run_command
  196.   pop ecx
  197.  
  198.   jmp dword[backAdr]
  199.  
  200. unlockend:
  201.   mov byte[state], UNLOCKd
  202.   jmp dword[backAdr]
  203.  
  204.  
  205.  
  206. ;ïîëó÷èòü ðàçìåð ýêðàíà
  207. get_screen_size:
  208.    push eax
  209.    mcall 14
  210.    ;òåïåðü â eax = [xsize]*65536 + [ysize]
  211.    ;mov dword[screen], eax
  212.    mov word[screen.height], ax
  213.    shr eax, 16
  214.    mov word[screen.width], ax
  215.    pop eax
  216.    ret
  217.  
  218.  
  219.  
  220.  
  221.  
  222. ;çàïóñê ïðèëîæåíèÿ: ecx - àêòèâíûé óãîë: lu=0, ld=1, ru=2, rd=3
  223. run_command:
  224.    cmp byte[state], UNLOCKd
  225.    jne run_command.end
  226.  
  227. ;   cmp byte[mode], 2     ;åñëè ðåæèì âòîðîé
  228. ;   jne @f
  229.  
  230.    push eax ebx ecx
  231.  
  232.    cmp ecx, 0
  233.    jne @f
  234.    mov eax, dword[newData.lu]
  235.    mov dword[struct70.path_adr], eax
  236.    jmp .end_set_path
  237. @@:
  238.    cmp ecx, 1
  239.    jne @f
  240.    mov eax, dword[newData.ld]
  241.    mov dword[struct70.path_adr], eax
  242.    jmp .end_set_path
  243. @@:
  244.    cmp ecx, 2
  245.    jne @f
  246.    mov eax, dword[newData.ru]
  247.    mov dword[struct70.path_adr], eax
  248.    jmp .end_set_path
  249. @@:
  250.    cmp ecx, 3
  251.    jne .end_set_path
  252.    mov eax, dword[newData.rd]
  253.    mov dword[struct70.path_adr], eax
  254.    jmp .end_set_path
  255. .end_set_path:
  256.  
  257.    ;ïàðàìåòðû
  258.    ;mov dword[struct.adr],
  259.  
  260. ;åñëè àäðåñ 0, òî íè÷åãî íå äåëàòü
  261.    cmp dword[struct70.path_adr], 0
  262.    jne .next
  263.    ;mov eax, testData.ld
  264.    ;mov dword[struct70.path_adr], eax
  265.    jmp @f
  266. .next:
  267. ;êîíåö êîäà äëÿ çàìåíû
  268.  
  269.    mcall 70, struct70
  270. @@:
  271.    mov byte[state], LOCKd
  272.    ;mov byte[keyState], 0
  273.  
  274.    pop ecx ebx eax
  275. .end:
  276.    ret
  277.  
  278. struct70: ;Ôîðìàò èíôîðìàöèîííîé ñòðóêòóðû
  279.   .func       dd 7 ; íîìåð ïîäôóíêöèè
  280.   .mask       dd 0
  281.   .param_adr  dd 0 ; óêàçàòåëü íà ASCIIZ-ñòðîêó ñ ïàðàìåòðàìè
  282.   .other      dd 0, 0
  283.   .path       db 0 ; "/rd/1/TINYPAD",0 ; ïóòü
  284.   .path_adr   dd 0 ;testData.lu
  285.  
  286. ;èìÿ êîíôèãóðàöèîííîãî ôàéëà
  287. fileName: db 'SETTINGS/HOTANGLES.CFG', 0
  288.  
  289. loadConfig:
  290.    push eax ebx ecx edx
  291.    mcall 68, 27, fileName   ;çàãðóæàåì êîíôèãóðàöèîííûé ôàéë â ÎÇÓ
  292.    cmp eax, 0
  293.    je loadConfig.exit       ;åñëè ôàéëà êîíôèãóðàöèè íåò, òî çàâåðøàåì ðàáîòó ïðèëîæåíèÿ
  294.    ;èíà÷å äàííûå çàãðóæåíû â ÎÇÓ, ðàçìåð â edx
  295.    cmp edx, 0               ;åñëè ôàéë ïóñò, â í¸ì íåò äàííûõ, òî çàâåðøàåì ðàáîòó
  296.    je loadConfig.exit
  297.  
  298.    add edx, eax             ;èíà÷å êëàä¸ì â edx - àäðåñ êîíöà ôàéëà
  299.  
  300.    mov byte[mode], 0
  301.    cmp byte[eax], '0' ;121 ;'y'  ;åñëè ïàðàìåòð àêòèâíîñòè ïðèëîæåíèÿ èìååò ñòàòóñ: íå àêòèâíî
  302.    je loadConfig.exit      ;òî çàâåðøàåì ðàáîòó ïðèëîæåíèÿ
  303.    cmp byte[eax], 110 ;'n'
  304.    je loadConfig.exit
  305.  
  306.    ;èíà÷å âûñòàâëÿåì ðåæèì
  307.    cmp byte[eax], '2'       ;ðåæèì àêòèâàöèè ïî ãîðÿ÷åé êëàâèøå
  308.    jne @f
  309.    mov byte[mode], 2
  310.    jmp loadConfig.modeEnd
  311. @@:
  312.    cmp byte[eax], '3'       ;ðåæèì æåñòà ïðè çàæàòîé êëàâèøå
  313.    jne @f
  314.    mov byte[mode], 3
  315.    jmp loadConfig.modeEnd
  316. @@:
  317.    mov byte[mode], 1        ;âî âñåõ îñòàëüíûõ ñëó÷àÿõ - êëàññè÷åñêèé ðåæèì
  318. .modeEnd:
  319.  
  320.    push edi
  321.    push esi
  322.    ; ñîõðàíÿåì â edi óêàçàòåëü íà íà÷àëî òàáëèöû àäðåñîâ íàøèõ êîìàíä
  323.    mov edi, newData
  324.    ; ñîõðàíÿåì àäðåñà ñòðîê è äîáàâëÿåì 0 â êîíöå
  325.    mov esi, eax
  326. .block:
  327.    inc esi
  328.    cmp byte[esi], 10         ;åñëè î÷åðåäíîé êîä ñèìâîëà 10 èëè 13, òî ïðîïóñêàåì ñèìâîëû
  329.    je loadConfig.propusk     ;äî ïåðâîãî îòëè÷íîãî îò íèõ
  330.    cmp byte[esi], 13
  331.    je loadConfig.propusk
  332.  
  333.    ; ñèìâîë îòëè÷åí îò ïåðåíîñà ñòðîêè è âîçâðàòà êàðåòêè - åñëè ýòî íà çíàê ìèíóñ, òî çàïîìèíàåì åãî
  334.    mov dword[edi], esi
  335.    add edi, 4
  336.  
  337.    ;èä¸ì äî êîíöà ýòîé ñòðîêè: ïîêà íå âñòðåòèì î÷åðåäíîé 10, 13, 0 èëè file end
  338. .while:
  339.    inc esi
  340.    cmp esi, edx           ;òóò áóäåò ïðîáëåìà - òê ôàéë çàêîí÷èëñÿ, à íóëÿ íå áûëî !!! èñïðàâèòü
  341.    jae loadConfig.fileend
  342.    cmp byte[esi], 10
  343.    je loadConfig.ura
  344.    cmp byte[esi], 0
  345.    je loadConfig.ura
  346.    cmp byte[esi], 13
  347.    jne loadConfig.while
  348. .ura:
  349.    mov byte[esi], 0
  350.  
  351.    ;cmp byte[esi-1], '-'
  352.    ;jne @f
  353.    push esi  ;åñëè ýòî áûë çíàê ìèíóñ, òî ìåíÿåì àäðåñ íà íîëü
  354.    mov esi, dword[edi-4]
  355.    cmp byte[esi], '-'
  356.    jne @f
  357.    cmp byte[esi+1], 0
  358.    jne @f
  359.    mov dword[edi-4], 0
  360. @@:
  361.    pop esi
  362.  
  363.    cmp edi, newDataEnd ;newData.end      ;åñëè âñÿ òàáëèöà àäðåñîâ çàïîëíåíà, òî âûõîäèì èç öèêëà
  364.    jb loadConfig.block
  365. .fileend:
  366.  
  367.    pop esi
  368.    pop edi
  369.  
  370.    jmp loadConfig.end
  371.  
  372. .propusk:
  373.    mov byte[esi], 0
  374.    jmp loadConfig.block
  375. .exit:
  376.    pop edx ecx ebx eax
  377.    mcall -1 ;çàêðûòü ýòó ïðîãðàììó
  378. .end:
  379.    pop edx ecx ebx eax
  380.    ret
  381.  
  382.  
  383.  
  384.  
  385. ;Âûíåñòè êîä íèæå â îòäåëüíûé îáùèé ìîäóëü
  386. selfName db '@HOTANGLES',0
  387. selfNameSize = 10 ;äî 11 byte
  388. ;
  389. compareBytes:
  390.    push edi esi ecx ebx
  391.    xor eax, eax
  392.    mov ecx, selfNameSize    ;max ðàçìåð ñòðîê 11
  393. @@:
  394.    mov bl, byte[edi]
  395.    cmp bl, byte[esi]
  396.    jne compareBytes.no
  397.    inc edi
  398.    inc esi
  399.    cmp ecx, 0
  400.    je @f
  401.    dec ecx
  402.    jmp @b
  403. .no:
  404.    mov eax, 1
  405. @@:
  406.    pop ebx ecx esi edi
  407.    ret
  408. ;
  409. copyKill:
  410.    push eax ebx ecx esi edi
  411.  
  412.    ;ñïåðâà ïðî÷ò¸ì ñâîþ èíôîðìàöèþ
  413.    mcall 9, buf, -1
  414.    mov eax, dword[buf+30]
  415.    mov dword[selfPID], eax
  416.  
  417.    ;óêàçàòåëè, êîòîðûå íèêîãäà íå ìåíÿþòñÿ:
  418.    mov esi, selfName       ;ïåðâàÿ ñòðîêà - èìÿ òåêóùåãî ïðèëîæåíèÿ
  419.    mov edi, buf            ;âòîðàÿ ñòðîêà - èìÿ òåêóùåãî ñëîòà
  420.    add edi, 10
  421.  
  422.    mov ecx, 1
  423. @@:
  424.    mcall 9, buf, ecx
  425.    mov dword[slotMax], eax
  426.  
  427.    ;åñëè ýòî ìû ñàìè, òî ïðîïóñêàåì ïðîâåðêó
  428.    mov eax, dword[buf+30]
  429.    cmp eax, dword[selfPID]
  430.    je copyKill.propusk
  431.  
  432.    call compareBytes   ;ñðàâíèâàåì 11 áàéò ñòðîê, ðåçóëüòàò â eax
  433.  
  434.    cmp eax, 0
  435.    je copyKill.selfKill
  436.  
  437. .propusk:
  438.    inc ecx
  439.    cmp ecx, dword[slotMax]
  440.    ja @f
  441.    jmp @b
  442.  
  443. .selfKill:
  444.    pop edi esi ecx ebx eax
  445.    mcall -1
  446.    ret
  447. @@:
  448.    pop edi esi ecx ebx eax
  449.    ret
  450.  
  451.  
  452. keyActivate db 41 ;16 ;'Q' ;êëàâèøà àêòèâàöèè
  453. keyState db 0 ;0-êëàâèøà íå àêòèâíà, 1 - êëàâèøà àêòèâíà
  454.  
  455. backAdr rd 1 ;dd 0 ; àäðåñ äëÿ âîçâðàòà èç ïðîâåðêè ìûøè
  456.  
  457. ;slotMax dd 0
  458. ;selfPID dd 0
  459. ;buf db 1024 dup(0)
  460. slotMax rd 1
  461. selfPID rd 1
  462. buf rb 1024
  463.  
  464. ;ñòðóêòóðêà äàííûõ äëÿ õðàíåíèÿ ïàðàìåòðîâ ýêðàíà
  465. screen:
  466.   .width  rw 1 ;dw 0
  467.   .height rw 1 ;dw 0
  468.  
  469. state: rb 1  ;ñîñòîÿíèå: 0=unlock, 1=lock
  470. mode:  rb 1  ;ðåæèì ðàáîòû ïðèëîæåíèÿ: 0=íå ðàáîòàåò, 1=êëàññè÷åñêèé, 2=ïî ãîðÿ÷åé êëàâèøå
  471.  
  472. newData:  ;òàáëè÷êà àäðåñîâ êîìàíäíûõ ñòðîê
  473.   .lu rd 1
  474.   .ld rd 1
  475.   .ru rd 1
  476.   .rd rd 1
  477. newDataEnd:
  478.  
  479. I_END:
  480.