Subversion Repositories Kolibri OS

Rev

Rev 7377 | 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.1: Sep 18, 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.    mov ebx, 00000100000000000000000000100000b ;ïîäïèñûâàåìñÿ íà èíòåðåñíûå íàì ñîáûòèÿ
  52.    mcall 40
  53.  
  54. START:
  55.   mov     eax, 10                 ; function 10 : wait until event
  56.   mcall                           ; event type is returned in eax
  57.  
  58.   cmp   eax, 6           ;îáðàáîòêà ïåðåìåùåíèé è íàæàòèÿ ìûøè
  59.   je    mouse
  60.  
  61.   jmp START
  62.  
  63. mouse:
  64.   ;îñíîâíîé öèêë ïðîãðàììû
  65.   call get_mouse_pos ;ïîëó÷àåì òåêóùèå êîîðäèíàòû ìûøè
  66.  
  67.   cmp eax, 0 ;ëåâûé âåðõíèé óãîë
  68.   jne @f
  69.   ; -- çäåñü âûçûâàåì ñîîòâ. âûçîâ äëÿ ëåâîãî âåðõíåãî óãëà  (X=0, Y=0)
  70.   push ecx
  71.   mov ecx, 0
  72.   call run_command
  73.   pop ecx
  74.  
  75.   jmp START ;finish
  76. @@:
  77.   call get_screen_size ;èíà÷å îáíîâëÿåì ðàçìåðû ýêðàíà
  78.  
  79.   cmp ax, word[screen.height]    ;Ymouse = Yscreen ?
  80.   je Ytrue
  81.   ;åñëè Y íå ðàâíû, òî íàñ èíòåðåñóåò Y=0 è X=ScreenWidth (ïðàâûé âåðõíèé óãîë)
  82.  
  83.   cmp ax, 0
  84.   jne unlockend
  85.   shr eax, 16
  86.   cmp ax, word[screen.width]
  87.   jne unlockend
  88.   ; -- çäåñü âûçûâàåì äëÿ ïðàâîãî âåðõåíåãî óãëà
  89.   push ecx
  90.   mov ecx, 2
  91.   call run_command
  92.   pop ecx
  93.  
  94.   jmp START
  95. Ytrue:
  96.   ;åñëè Y ðàâíû, òî íàñ èíòåðåñóåò X=0 (ëåâûé íèæíèé óãîë) èëè X=ScreenWidth (ïðàâûé íèæíèé)
  97.   shr eax, 16
  98.   cmp ax, 0
  99.   jne @f
  100.   ; -- X=0, Y = Height  (ëåâûé íèæíèé óãîë)
  101.   push ecx
  102.   mov ecx, 1
  103.   call run_command
  104.   pop ecx
  105.   jmp START
  106. @@:
  107.   cmp ax, word[screen.width]
  108.   jne unlockend
  109.   ; -- (ïðàâûé íèæíèé óãîë)
  110.   push ecx
  111.   mov ecx, 3
  112.   call run_command
  113.   pop ecx
  114.  
  115.   jmp START
  116.  
  117. unlockend:
  118.   mov byte[state], UNLOCKd
  119.   jmp START
  120.  
  121.  
  122. ;ñòðóêòóðêà äàííûõ äëÿ õðàíåíèÿ ïàðàìåòðîâ ýêðàíà
  123. screen:
  124.    .width  dw 0
  125.    .height dw 0
  126. ;ïîëó÷èòü ðàçìåð ýêðàíà
  127. get_screen_size:
  128.    push eax
  129.    mcall 14
  130.    ;òåïåðü â eax = [xsize]*65536 + [ysize]
  131.    ;mov dword[screen], eax
  132.    mov word[screen.height], ax
  133.    shr eax, 16
  134.    mov word[screen.width], ax
  135.    pop eax
  136.    ret
  137.  
  138.  
  139. ;ïîëó÷èòü ïîçèöèþ ìûøè
  140. get_mouse_pos:
  141.    ;push eax
  142.    push ebx
  143.    mcall 37, 0
  144.    pop ebx
  145.    ;pop eax
  146.    ret
  147.  
  148.  
  149. ;çàïóñê ïðèëîæåíèÿ: ecx - àêòèâíûé óãîë: lu=0, ld=1, ru=2, rd=3
  150. run_command:
  151.    cmp byte[state], UNLOCKd
  152.    jne run_command.end
  153.  
  154.    push eax
  155.    push ebx
  156.    push ecx
  157.  
  158.  
  159.    cmp ecx, 0
  160.    jne @f
  161.    mov eax, dword[newData.lu] ;testData.lu
  162.    mov dword[struct70.path_adr], eax
  163.    jmp .end_set_path
  164. @@:
  165.    cmp ecx, 1
  166.    jne @f
  167.    mov eax, dword[newData.ld]
  168.    mov dword[struct70.path_adr], eax
  169.    jmp .end_set_path
  170. @@:
  171.    cmp ecx, 2
  172.    jne @f
  173.    mov eax, dword[newData.ru]
  174.    mov dword[struct70.path_adr], eax
  175.    jmp .end_set_path
  176. @@:
  177.    cmp ecx, 3
  178.    jne .end_set_path
  179.    mov eax, dword[newData.rd]
  180.    mov dword[struct70.path_adr], eax
  181.    jmp .end_set_path
  182. .end_set_path:
  183.  
  184.    ;ïàðàìåòðû
  185.    ;mov dword[struct.adr],
  186.  
  187. ;ýòîò êîä çàìåíèòü - åñëè àäðåñ 0, òî íè÷åãî íå äåëàòü
  188.    cmp dword[struct70.path_adr], 0
  189.    jne .next
  190.    mov eax, testData.ld    ;
  191.    mov dword[struct70.path_adr], eax
  192. .next:
  193. ;êîíåö êîäà äëÿ çàìåíû
  194.  
  195.    mcall 70, struct70
  196.    mov byte[state], LOCKd
  197.  
  198.    pop ecx
  199.    pop ebx
  200.    pop eax
  201. .end:
  202.    ret
  203.  
  204. struct70: ;Ôîðìàò èíôîðìàöèîííîé ñòðóêòóðû
  205.   .func       dd 7 ; íîìåð ïîäôóíêöèè
  206.   .mask       dd 0
  207.   .param_adr  dd 0 ; óêàçàòåëü íà ASCIIZ-ñòðîêó ñ ïàðàìåòðàìè
  208.   .other      dd 0, 0
  209.   .path       db 0 ; "/rd/1/TINYPAD",0 ; ïóòü
  210.   .path_adr   dd 0 ;testData.lu ;0
  211.  
  212.  
  213. state: db 0 ; 0=unlock, 1=lock
  214.  
  215. testData:
  216.   .lu db '/rd/1/SHELL', 0
  217.   .ld db '/rd/1/RUN', 0
  218.   .ru db "/rd/1/TINYPAD", 0
  219.   .rd db '/rd/1/File Managers/EOLITE', 0
  220.  
  221. newData:  ;òàáëè÷êà àäðåñîâ êîìàíäíûõ ñòðîê
  222.   .lu dd 0
  223.   .ld dd 0
  224.   .ru dd 0
  225.   .rd dd 0
  226. newDataEnd:
  227.  
  228. ;èìÿ êîíôèãóðàöèîííîãî ôàéëà
  229. fileName: db 'SETTINGS/HOTANGLES.CFG', 0  ;'ha.cfg', 0
  230.  
  231. loadConfig:
  232.    push eax
  233.    push ebx
  234.    push ecx
  235.    push edx
  236.    mcall 68, 27, fileName   ;çàãðóæàåì êîíôèãóðàöèîííûé ôàéë â ÎÇÓ
  237.    cmp eax, 0
  238.    je loadConfig.exit       ;åñëè ôàéëà êîíôèãóðàöèè íåò, òî çàâåðøàåì ðàáîòó ïðèëîæåíèÿ
  239.    ;èíà÷å äàííûå çàãðóæåíû â ÎÇÓ, ðàçìåð â edx
  240.    cmp edx, 0               ;åñëè ôàéë ïóñò, â í¸ì íåò äàííûõ, òî çàâåðøàåì ðàáîòó
  241.    je loadConfig.exit
  242.  
  243.    add edx, eax             ;èíà÷å êëàä¸ì â edx - àäðåñ êîíöà ôàéëà
  244.  
  245.    cmp byte[eax], 121 ;'y'  ;åñëè ïàðàìåòð àêòèâíîñòè ïðèëîæåíèÿ èìååò ñòàòóñ: íå àêòèâíî
  246.    jne loadConfig.exit      ;òî çàâåðøàåì ðàáîòó ïðèëîæåíèÿ
  247.  
  248.    push edi
  249.    push esi
  250.    ; ñîõðàíÿåì â edi óêàçàòåëü íà íà÷àëî òàáëèöû àäðåñîâ íàøèõ êîìàíä
  251.    mov edi, newData
  252.    ; ñîõðàíÿåì àäðåñà ñòðîê è äîáàâëÿåì 0 â êîíöå
  253.    mov esi, eax
  254. .block:
  255.    inc esi
  256.    cmp byte[esi], 10         ;åñëè î÷åðåäíîé êîä ñèìâîëà 10 èëè 13, òî ïðîïóñêàåì ñèìâîëû
  257.    je loadConfig.propusk     ;äî ïåðâîãî îòëè÷íîãî îò íèõ
  258.    cmp byte[esi], 13
  259.    je loadConfig.propusk
  260.  
  261.    ; ñèìâîë îòëè÷åí îò ïåðåíîñà ñòðîêè è âîçâðàòà êàðåòêè - çàïîìèíàåì åãî
  262.    mov dword[edi], esi
  263.    add edi, 4
  264.  
  265.    ;èä¸ì äî êîíöà ýòîé ñòðîêè: ïîêà íå âñòðåòèì î÷åðåäíîé 10, 13, 0 èëè file end
  266. .while:
  267.    inc esi
  268.    cmp esi, edx           ;òóò áóäåò ïðîáëåìà - òê ôàéë çàêîí÷èëñÿ, à íóëÿ íå áûëî !!! èñïðàâèòü
  269.    jae loadConfig.fileend
  270.    cmp byte[esi], 10
  271.    je loadConfig.ura
  272.    cmp byte[esi], 0
  273.    je loadConfig.ura
  274.    cmp byte[esi], 13
  275.    jne loadConfig.while
  276. .ura:
  277.    mov byte[esi], 0
  278.  
  279.    cmp edi, newDataEnd ;newData.end      ;åñëè âñÿ òàáëèöà àäðåñîâ çàïîëíåíà, òî âûõîäèì èç öèêëà
  280.    jb loadConfig.block
  281. .fileend:
  282.  
  283.    pop esi
  284.    pop edi
  285.  
  286.    jmp loadConfig.end
  287.  
  288. .propusk:
  289.    mov byte[esi], 0
  290.    jmp loadConfig.block
  291. .exit:
  292.    pop edx
  293.    pop ecx
  294.    pop ebx
  295.    pop eax
  296.    mcall -1 ;çàêðûòü ýòó ïðîãðàììó
  297. .end:
  298.    pop edx
  299.    pop ecx
  300.    pop ebx
  301.    pop eax
  302.    ret
  303.  
  304.  
  305.  
  306.  
  307. ;Âûíåñòè êîä íèæå â îòäåëüíûé îáùèé ìîäóëü
  308. selfName db '@HOTANGLES',0
  309. selfNameSize = 10 ;äî 11 byte
  310. ;
  311. compareBytes:
  312.    push edi esi ecx ebx
  313.    mov eax, 0 ;xor eax, eax
  314.    mov ecx, selfNameSize    ;max ðàçìåð ñòðîê 11
  315. @@:
  316.    mov bl, byte[edi]
  317.    cmp bl, byte[esi]
  318.    jne compareBytes.no
  319.    inc edi
  320.    inc esi
  321.    cmp ecx, 0
  322.    je @f
  323.    dec ecx
  324.    jmp @b
  325. .no:
  326.    mov eax, 1
  327. @@:
  328.    pop ebx ecx esi edi
  329.    ret
  330. ;
  331. slotMax dd 0
  332. selfPID dd 0
  333. buf db 1024 dup(0)
  334. copyKill:
  335.    push eax ebx ecx esi edi
  336.  
  337.    ;ñïåðâà ïðî÷ò¸ì ñâîþ èíôîðìàöèþ
  338.    mcall 9, buf, -1
  339.    mov eax, dword[buf+30]
  340.    mov dword[selfPID], eax
  341.  
  342.    ;óêàçàòåëè, êîòîðûå íèêîãäà íå ìåíÿþòñÿ:
  343.    mov esi, selfName       ;ïåðâàÿ ñòðîêà - èìÿ òåêóùåãî ïðèëîæåíèÿ
  344.    mov edi, buf            ;âòîðàÿ ñòðîêà - èìÿ òåêóùåãî ñëîòà
  345.    add edi, 10
  346.  
  347.    mov ecx, 1
  348. @@:
  349.    mcall 9, buf, ecx
  350.    mov dword[slotMax], eax
  351.  
  352.    ;åñëè ýòî ìû ñàìè, òî ïðîïóñêàåì ïðîâåðêó
  353.    mov eax, dword[buf+30]
  354.    cmp eax, dword[selfPID]
  355.    je copyKill.propusk
  356.  
  357.    call compareBytes   ;ñðàâíèâàåì 11 áàéò ñòðîê, ðåçóëüòàò â eax
  358.  
  359.    cmp eax, 0
  360.    je copyKill.selfKill
  361.  
  362. .propusk:
  363.    inc ecx
  364.    cmp ecx, dword[slotMax]
  365.    ja @f
  366.    jmp @b
  367.  
  368. .selfKill:
  369.    pop edi esi ecx ebx eax
  370.    mcall -1
  371.    ret
  372. @@:
  373.    pop edi esi ecx ebx eax
  374.    ret
  375.  
  376.  
  377.  
  378. I_END:
  379.