Subversion Repositories Kolibri OS

Rev

Rev 7389 | 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.3: Sep 25, 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.    jmp @f
  193. .next:
  194. ;êîíåö êîäà äëÿ çàìåíû
  195.  
  196.    mcall 70, struct70
  197. @@:
  198.    mov byte[state], LOCKd
  199.  
  200.    pop ecx
  201.    pop ebx
  202.    pop eax
  203. .end:
  204.    ret
  205.  
  206. struct70: ;Ôîðìàò èíôîðìàöèîííîé ñòðóêòóðû
  207.   .func       dd 7 ; íîìåð ïîäôóíêöèè
  208.   .mask       dd 0
  209.   .param_adr  dd 0 ; óêàçàòåëü íà ASCIIZ-ñòðîêó ñ ïàðàìåòðàìè
  210.   .other      dd 0, 0
  211.   .path       db 0 ; "/rd/1/TINYPAD",0 ; ïóòü
  212.   .path_adr   dd 0 ;testData.lu
  213.  
  214.  
  215. state: db 0 ; 0=unlock, 1=lock
  216. mode: db 0  ;ðåæèì ðàáîòû (äëÿ áóäóùåãî ðàñøèðåíèÿ ôóíêöèîíàëà)
  217.  
  218. ;testData:
  219. ;  .lu db '/rd/1/SHELL', 0
  220. ;  .ld db '/rd/1/RUN', 0
  221. ;  .ru db "/rd/1/TINYPAD", 0
  222. ;  .rd db '/rd/1/File Managers/EOLITE', 0
  223.  
  224. newData:  ;òàáëè÷êà àäðåñîâ êîìàíäíûõ ñòðîê
  225.   .lu dd 0
  226.   .ld dd 0
  227.   .ru dd 0
  228.   .rd dd 0
  229. newDataEnd:
  230.  
  231. ;èìÿ êîíôèãóðàöèîííîãî ôàéëà
  232. fileName: db 'SETTINGS/HOTANGLES.CFG', 0
  233.  
  234. loadConfig:
  235.    push eax ebx ecx 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 byte[esi-1], '-'
  280.    ;jne @f
  281.    push esi  ;åñëè ýòî áûë çíàê ìèíóñ, òî ìåíÿåì àäðåñ íà íîëü
  282.    mov esi, dword[edi-4]
  283.    cmp byte[esi], '-'
  284.    jne @f
  285.    cmp byte[esi+1], 0
  286.    jne @f
  287.    mov dword[edi-4], 0
  288. @@:
  289.    pop esi
  290.  
  291.    cmp edi, newDataEnd ;newData.end      ;åñëè âñÿ òàáëèöà àäðåñîâ çàïîëíåíà, òî âûõîäèì èç öèêëà
  292.    jb loadConfig.block
  293. .fileend:
  294.  
  295.    pop esi
  296.    pop edi
  297.  
  298.    jmp loadConfig.end
  299.  
  300. .propusk:
  301.    mov byte[esi], 0
  302.    jmp loadConfig.block
  303. .exit:
  304.    pop edx ecx ebx eax
  305.    mcall -1 ;çàêðûòü ýòó ïðîãðàììó
  306. .end:
  307.    pop edx ecx ebx eax
  308.    ret
  309.  
  310.  
  311.  
  312.  
  313. ;Âûíåñòè êîä íèæå â îòäåëüíûé îáùèé ìîäóëü
  314. selfName db '@HOTANGLES',0
  315. selfNameSize = 10 ;äî 11 byte
  316. ;
  317. compareBytes:
  318.    push edi esi ecx ebx
  319.    mov eax, 0 ;xor eax, eax
  320.    mov ecx, selfNameSize    ;max ðàçìåð ñòðîê 11
  321. @@:
  322.    mov bl, byte[edi]
  323.    cmp bl, byte[esi]
  324.    jne compareBytes.no
  325.    inc edi
  326.    inc esi
  327.    cmp ecx, 0
  328.    je @f
  329.    dec ecx
  330.    jmp @b
  331. .no:
  332.    mov eax, 1
  333. @@:
  334.    pop ebx ecx esi edi
  335.    ret
  336. ;
  337. slotMax dd 0
  338. selfPID dd 0
  339. buf db 1024 dup(0)
  340. copyKill:
  341.    push eax ebx ecx esi edi
  342.  
  343.    ;ñïåðâà ïðî÷ò¸ì ñâîþ èíôîðìàöèþ
  344.    mcall 9, buf, -1
  345.    mov eax, dword[buf+30]
  346.    mov dword[selfPID], eax
  347.  
  348.    ;óêàçàòåëè, êîòîðûå íèêîãäà íå ìåíÿþòñÿ:
  349.    mov esi, selfName       ;ïåðâàÿ ñòðîêà - èìÿ òåêóùåãî ïðèëîæåíèÿ
  350.    mov edi, buf            ;âòîðàÿ ñòðîêà - èìÿ òåêóùåãî ñëîòà
  351.    add edi, 10
  352.  
  353.    mov ecx, 1
  354. @@:
  355.    mcall 9, buf, ecx
  356.    mov dword[slotMax], eax
  357.  
  358.    ;åñëè ýòî ìû ñàìè, òî ïðîïóñêàåì ïðîâåðêó
  359.    mov eax, dword[buf+30]
  360.    cmp eax, dword[selfPID]
  361.    je copyKill.propusk
  362.  
  363.    call compareBytes   ;ñðàâíèâàåì 11 áàéò ñòðîê, ðåçóëüòàò â eax
  364.  
  365.    cmp eax, 0
  366.    je copyKill.selfKill
  367.  
  368. .propusk:
  369.    inc ecx
  370.    cmp ecx, dword[slotMax]
  371.    ja @f
  372.    jmp @b
  373.  
  374. .selfKill:
  375.    pop edi esi ecx ebx eax
  376.    mcall -1
  377.    ret
  378. @@:
  379.    pop edi esi ecx ebx eax
  380.    ret
  381.  
  382.  
  383.  
  384. I_END:
  385.