Subversion Repositories Kolibri OS

Compare Revisions

Regard whitespace Rev 9594 → Rev 9595

/programs/other/ha/HOTANGLES.ASM
File deleted
/programs/other/ha/HA.ASM
0,0 → 1,882
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
; Hot Angles ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
; Compile with FASM
; Version 0.3.7: Oct 14, 2018
 
; Copyright (c) 2018, Efremenkov Sergey aka TheOnlyMirage
; All rights reserved.
; Redistribution and use in source and binary forms, with or without modification,
; are permitted provided that the following conditions are met:
; * Redistributions of source code must retain the above copyright notice, this
; list of conditions and the following disclaimer.
; * Redistributions in binary form must reproduce the above copyright notice,
; this list of conditions and the following disclaimer in the documentation and/or
; other materials provided with the distribution.
; * Neither the name of the <organization> nor the names of its contributors may
; be used to endorse or promote products derived from this software without
; specific prior written permission.
 
; THE SOFTWARE IS PROVIDED “AS IS”, WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED,
; INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A
; PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT
; HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
; OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
; SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
; --------------------------------------------------------------------------------------
 
format binary as "" ;"kex"
use32
org 0x0 ; áàçîâûé àäðåñ ðàçìåùåíèÿ êîäà, âñåãäà 0x0
 
UNLOCKd = 0
LOCKd = 1
SUPERLOCKd = 2
 
; çàãîëîâîê
db 'MENUET01' ;ìàãè÷åñêèé èäåíòèôèêàòîð
dd 0x01 ;âåðñèÿ
dd START_DEBUG ;àäðåñ òî÷êè ñòàðòà ïðîãðàììû
dd I_END ;àäðåñ êîíöà, ïî ôàêòó ðàçìåð ôàéëà ïðîãðàììû
dd 0x100000 ;òðåáóåìîå êîë-âî ïàìÿòè äëÿ çàãðóçêè ïðîãðàììû
dd 0x7fff0 ;íà÷àëüíîå çíà÷åíèå ðåãèñòðà esp - àäðåñ êîíöà îáëàñòè ñòýêà òàê êàê ñòýê ðàñòåò â ñòîðîíó ìåíüøèõ àäðåñîâ
dd 0, 0 ;àäðåñ ñòðîêè ïàðàìåòðîâ è àäðåñ ñòðîêè ïóòè èñïîëíÿåìîãî ôàéëà
 
 
include '../../macros.inc'
 
START_DEBUG:
call copyKill ;ïðîñòåéøàÿ çàùèòà îò ïîâòîðíîãî çàïóñêà
mcall 68, 11 ;èíèöèàëèçàöèÿ êó÷è
call loadConfig ;çàãðóæàåì êîíôèãóðàöèþ ïðèëîæåíèÿ
 
cmp byte[mode], 0 ;ôóíêöèÿ îòêëþ÷åíà - âûõîä
jne @f
mcall -1
@@:
;ðåæèì æåñòà ïî ãîðÿ÷åé êëàâèøå?
cmp byte[mode], 3 ;ïîäïèñûâàåìñÿ íà èíòåðåñíûå íàì ñîáûòèÿ â çàâèñèìîñòè îò ðåæèìà ðàáîòû
jne @f
mov ebx, 00000100000000000000000000100010b ;åñëè äà, òî ïîäïèñûâàåìñÿ íà êëàâèøè
mcall 40
jmp init03
@@:
;ðåæèì àêòèâàöèè ãîðÿ÷åé êëàâèøåé?
cmp byte[mode], 2 ;ïîäïèñûâàåìñÿ íà èíòåðåñíûå íàì ñîáûòèÿ â çàâèñèìîñòè îò ðåæèìà ðàáîòû
jne @f
mov ebx, 00000100000000000000000000100010b ;åñëè äà, òî ïîäïèñûâàåìñÿ íà êëàâèøè
mcall 40
jmp init02
@@:
; âî âñåõ îñòàëüíûõ ñëó÷àÿõ - êëàññè÷åñêèé ðåæèì ðàáîòû
;mode=1 êëàññè÷åñêèé ðåæèì ðàáîòû - ðåàêöèÿ ïðè íàâåäåíèè â óãîë
mov byte[mode], 1
mov ebx, 00000100000000000000000000100000b
mcall 40
jmp init01
 
 
 
init02:
mov dword[backAdr], mode02
call setHotKey
mode02:
mcall 10
cmp eax, 2 ;îáðàáîòêà íàæàòèÿ êëàâèøè
je hotkey
 
cmp byte[keyState], 0
je mode02
cmp eax, 6 ;îáðàáîòêà ïåðåìåùåíèé è íàæàòèÿ ìûøè
je mouse
 
jmp mode02
 
 
setHotKey: ;óñòàíîâèòü ãîðÿ÷óþ êëàâèøó
push eax ebx ecx edx
xor ecx, ecx
mov cl, byte[keyActivate] ;íàæàòèå ãîðÿ÷åé êëàâèøè
mov edx, 0x000
mcall 66, 4, ecx, edx
 
;mov cl, byte[keyActivate]
add cl, 128 ;îòïóñêàíèå ãîðÿ÷åé êëàâèøè
;mov edx, 0x000
mcall 66, 4, ecx, edx
pop edx ecx ebx eax
ret
 
 
hotkey:
mcall 2
cmp eax, 1 ;áóôåð êëàâèø ïóñò?
je hotkey.end
 
cmp al, 2 ;íàñ èíòåðåñóåò òîëüêî ñêàí êîä ãîðÿ÷åé êëàâèøè, èíà÷å âûõîäèì
jne hotkey.end
 
cmp ah, byte[keyActivate] ;åñëè íàæàòà íàøà ãîðÿ÷àÿ êëàâèøà
jne @f
 
;ïðîâåðêè äëÿ mode 3
cmp byte[state], SUPERLOCKd
je hotkey.end
cmp byte[keyState], 1
je hotkey.end
 
push eax ebx
mcall 37, 0 ;çàïîìèíàåì òåêóùèå(íà÷àëüíûå) êîîðäèíàòû ìûøè
;mov dword[o.x], eax
mov word[o.y], ax
shr eax, 16
mov word[o.x], ax
pop ebx eax
 
mov byte[keyState], 1
mov byte[state], UNLOCKd
jmp hotkey.end
@@:
push edx
xor edx, edx
mov dl, byte[keyActivate]
add dl, 128
cmp ah, dl ;åñëè îòïóùåíà íàøà ãîðÿ÷àÿ êëàâèøà
jne @f ;hotkey.end
 
mov byte[keyState], 0
mov byte[state], LOCKd
@@:
pop edx
.end:
jmp dword[backAdr]
 
 
init01:
mov dword[backAdr], mode01
mode01:
mov eax, 10 ; function 10 : wait until event
mcall ; event type is returned in eax
 
cmp eax, 6 ;îáðàáîòêà ïåðåìåùåíèé è íàæàòèÿ ìûøè
je mouse
 
jmp mode01
 
 
mouse:
push ebx
mcall 37, 0 ;ïîëó÷àåì òåêóùèå êîîðäèíàòû ìûøè
pop ebx
 
cmp eax, 0 ;ëåâûé âåðõíèé óãîë
jne @f
; -- çäåñü âûçûâàåì ñîîòâ. âûçîâ äëÿ ëåâîãî âåðõíåãî óãëà (X=0, Y=0)
push ecx
mov ecx, 0
call run_command
pop ecx
 
jmp dword[backAdr] ;finish
@@:
call get_screen_size ;èíà÷å îáíîâëÿåì ðàçìåðû ýêðàíà
 
cmp ax, word[screen.height] ;Ymouse = Yscreen ?
je Ytrue
;åñëè Y íå ðàâíû, òî íàñ èíòåðåñóåò Y=0 è X=ScreenWidth (ïðàâûé âåðõíèé óãîë)
 
cmp ax, 0
jne unlockend
shr eax, 16
cmp ax, word[screen.width]
jne unlockend
; -- çäåñü âûçûâàåì äëÿ ïðàâîãî âåðõåíåãî óãëà
push ecx
mov ecx, 2
call run_command
pop ecx
 
jmp dword[backAdr]
Ytrue:
;åñëè Y ðàâíû, òî íàñ èíòåðåñóåò X=0 (ëåâûé íèæíèé óãîë) èëè X=ScreenWidth (ïðàâûé íèæíèé)
shr eax, 16
cmp ax, 0
jne @f
; -- X=0, Y = Height (ëåâûé íèæíèé óãîë)
push ecx
mov ecx, 1
call run_command
pop ecx
jmp dword[backAdr]
@@:
cmp ax, word[screen.width]
jne unlockend
; -- (ïðàâûé íèæíèé óãîë)
push ecx
mov ecx, 3
call run_command
pop ecx
 
jmp dword[backAdr]
 
unlockend:
mov byte[state], UNLOCKd
jmp dword[backAdr]
 
 
 
;ïîëó÷èòü ðàçìåð ýêðàíà
get_screen_size:
push eax
mcall 14
;òåïåðü â eax = [xsize]*65536 + [ysize]
;mov dword[screen], eax
mov word[screen.height], ax
shr eax, 16
mov word[screen.width], ax
pop eax
ret
 
 
 
 
 
;çàïóñê ïðèëîæåíèÿ: ecx - àêòèâíûé óãîë: lu=0, ld=1, ru=2, rd=3
run_command:
cmp byte[state], UNLOCKd
jne run_command.end
 
push eax ebx ecx
 
cmp ecx, 0
jne @f
mov eax, apps.path1
cmp byte[eax], 0 ;åñëè ïî àäðåñó ïóñòî (èëè ëåæàë ñèìâîë '-'), òî àäðåñ 0
je .set0
mov dword[struct70.path_adr], eax
mov eax, apps.param1
mov dword[struct70.param_adr], eax
jmp .end_set_path
@@:
cmp ecx, 1
jne @f
mov eax, apps.path2
cmp byte[eax], 0 ;åñëè ïî àäðåñó ïóñòî (èëè ëåæàë ñèìâîë '-'), òî àäðåñ 0
je .set0
mov dword[struct70.path_adr], eax
mov eax, apps.param2
mov dword[struct70.param_adr], eax
jmp .end_set_path
@@:
cmp ecx, 2
jne @f
mov eax, apps.path3
cmp byte[eax], 0 ;åñëè ïî àäðåñó ïóñòî (èëè ëåæàë ñèìâîë '-'), òî àäðåñ 0
je .set0
mov dword[struct70.path_adr], eax
mov eax, apps.param3
mov dword[struct70.param_adr], eax
jmp .end_set_path
@@:
cmp ecx, 3
jne .set0 ;.end_set_path
mov eax, apps.path4
cmp byte[eax], 0 ;åñëè ïî àäðåñó ïóñòî (èëè ëåæàë ñèìâîë '-'), òî àäðåñ 0
je .set0
mov dword[struct70.path_adr], eax
mov eax, apps.param4
mov dword[struct70.param_adr], eax
jmp .end_set_path
.set0:
;mov dword[struct70.path_adr], 0
;mov dword[struct70.param_adr], 0
jmp @f
.end_set_path:
mcall 70, struct70
@@:
mov byte[state], LOCKd
;mov byte[keyState], 0
pop ecx ebx eax
.end:
ret
 
struct70: ;Ôîðìàò èíôîðìàöèîííîé ñòðóêòóðû
.func dd 7 ; íîìåð ïîäôóíêöèè
.mask dd 0
.param_adr dd 0 ; óêàçàòåëü íà ASCIIZ-ñòðîêó ñ ïàðàìåòðàìè
.other dd 0, 0
.path db 0
.path_adr dd 0 ; óêàçàòåëü íà ñòðîêó ñ ïóò¸ì
 
;èìÿ êîíôèãóðàöèîííîãî ôàéëà
fileName: db 'SETTINGS/HA.CFG', 0
 
 
;ïðîõîäèì äî êîíöà òåêóùåé ñòðîêè
gotoEndString:
cmp eax, edx ;åñëè ôàéë çàêîí÷èëñÿ, òî
ja @f ;âûõîäèì
cmp byte[eax], 10
je @f
cmp byte[eax], 0
je @f
cmp byte[eax], 13
je @f
;èíà÷å ïåðåõîäèì íà ñëåäóþùèé ñèìâîë
inc eax
jmp gotoEndString
@@:
ret
 
;ïðîïóñêàåì ïåðåíîñû â íà÷àëå ñòðîêè äî ïåðâîãî àäåêâàòíîãî ñèìâîëà
gotoStartString:
cmp eax, edx ;åñëè ôàéë çàêîí÷èëñÿ, òî
ja @f ;âûõîäèì
cmp byte[eax], 10
je .next
cmp byte[eax], 0
je .next
cmp byte[eax], 13
je .next
jmp @f ;åñëè ýòî äðóãîé ñèìâîë, òî âûõîäèì
.next: ;ïåðåõîäèì íà ñëåäóþùèé ñèìâîë
inc eax
jmp gotoStartString
@@:
ret
 
 
sep: db '|' ;ñèìâîë ðàçäåëèòåëü ñòðîêè ïóòè + ïàðàìåòðû çàïóñêà
readPath:
push ebx esi edi
mov bh, 0 ; 0 - çíàê òîãî, ÷òî ïàðàìåòðû åù¸ íå âñòðå÷àëèñü
mov byte[esi], 0 ;ïðîèíèöèàëèçèðóåì áóôåðû-ñòðîêè ïóñòîòîé (íà âñÿêèé ñëó÷àé)
mov byte[edi], 0
@@:
cmp eax, edx ;åñëè ôàéë çàêîí÷èëñÿ, òî
ja @f ;âûõîäèì
mov bl, byte[eax]
;åñëè î÷åðåäíîé ñèìâîë íå êîíåö ñòðîêè
cmp bl, 10
je @f ;èíà÷å âûõîä
cmp bl, 0
je @f
cmp bl, 13
je @f
;è íå íà÷àëî ïàðàìåòðîâ
cmp bl, byte[sep]
jne .read
;åñëè sep óæå âñòðå÷àëè ðàíåå, òî
cmp bh, 0
jne .read ;ïðîñòî ïðîäîëæàåì ñ÷èòûâàòü ïàðàìåòðû äàëüøå (â íèõ ìîæåò áûòü ÷òî óãîäíî)
;èíà÷å êëàä¸ì çàâåðøàþùèé 0 è ïåðåõîäèì ê áóôåðó ñ ïàðàìåòðàìè
mov byte[esi], 0
call trim ;åù¸ íå çàáóäåì óáðàòü ëèøíèå òàáóëÿöèè è ïðîáåëû íà êîíöå íàøåé ñòðîêè
mov esi, edi
mov bh, 1
inc eax
jmp @b
.read: ;òî çàïèñûâàåì ñèìâîë â íàø áóôåð è ïåðåõîäèì íà ñëåäóþùèé ñèìâîë
mov byte[esi], bl
inc esi
inc eax
jmp @b
@@:
mov byte[esi], 0 ;êëàä¸ì çàâåðøàþùèé íîëü
pop edi esi ebx
ret
 
trim: ;esi - ïîñëåäíèé íóëåâîé ñèìâîë ñòðîêè
;push esi
mov byte[esi], 0
dec esi
cmp byte[esi], 9 ;tab
je trim
cmp byte[esi], 32 ;space
je trim
inc esi
;pop esi
ret
 
 
cfgFileAdr: dd 0 ;àäðåñ êîíôèãóðàöèîííîãî ôàéëà â ïàìÿòè
 
loadConfig:
push eax ebx ecx edx
mcall 68, 27, fileName ;çàãðóæàåì êîíôèãóðàöèîííûé ôàéë â ÎÇÓ
mov dword[cfgFileAdr], eax
cmp eax, 0
je loadConfig.exit ;åñëè ôàéëà êîíôèãóðàöèè íåò, òî çàâåðøàåì ðàáîòó ïðèëîæåíèÿ
;èíà÷å äàííûå çàãðóæåíû â ÎÇÓ, ðàçìåð â edx
cmp edx, 0 ;åñëè ôàéë ïóñò, â í¸ì íåò äàííûõ, òî çàâåðøàåì ðàáîòó
je loadConfig.exit
 
add edx, eax ;èíà÷å êëàä¸ì â edx - àäðåñ êîíöà ôàéëà
 
mov byte[mode], 0
cmp byte[eax], '0' ;åñëè ïàðàìåòð àêòèâíîñòè ïðèëîæåíèÿ èìååò ñòàòóñ: íå àêòèâíî
je loadConfig.exit ;òî çàâåðøàåì ðàáîòó ïðèëîæåíèÿ
cmp byte[eax], 110 ;'n'
je loadConfig.exit
 
;èíà÷å âûñòàâëÿåì ðåæèì
cmp byte[eax], 121 ;'y' ;êëàññè÷åñêèé ðåæèì
jne @f
mov byte[mode], 1
jmp loadConfig.modeEnd
@@:
cmp byte[eax], '1' ;êëàññè÷åñêèé ðåæèì
jne @f
mov byte[mode], 1
jmp loadConfig.modeEnd
@@:
cmp byte[eax], '2' ;ðåæèì àêòèâàöèè ïî ãîðÿ÷åé êëàâèøå
jne @f
mov byte[mode], 2
jmp loadConfig.modeEnd
@@:
cmp byte[eax], '3' ;ðåæèì æåñòà ïðè çàæàòîé êëàâèøå
jne @f
mov byte[mode], 3
jmp loadConfig.modeEnd
@@:
mov byte[mode], 0 ;âî âñåõ îñòàëüíûõ ñëó÷àÿõ - îòêëþ÷åíî
jmp loadConfig.exit
.modeEnd:
 
;èä¸ì äî êîíöà ýòîé ñòðîêè
call gotoEndString
;íàõîäèì íà÷àëî ñëåäóþùåé ñòðîêè
call gotoStartString
 
push esi edi
 
;ñ÷èòûâàåì ïóòü äëÿ ëåâîãî âåðõíåãî óãëà
mov esi, apps.path1
mov edi, apps.param1
call readPath
call gotoStartString ;íàõîäèì íà÷àëî ñëåäóþùåé ñòðîêè
 
;ñ÷èòûâàåì ïóòü äëÿ ëåâîãî íèæíåãî óãëà
mov esi, apps.path2
mov edi, apps.param2
call readPath
call gotoStartString
 
;ñ÷èòûâàåì ïóòü äëÿ ïðàâîãî âåðõíåãî óãëà
mov esi, apps.path3
mov edi, apps.param3
call readPath
call gotoStartString
 
;ñ÷èòûâàåì ïóòü äëÿ ïðàâîãî íèæíåãî óãëà
mov esi, apps.path4
mov edi, apps.param4
call readPath
call gotoStartString
 
;ïðîâåðèì ñòðîêè íà '-'
call checkPathAdr
 
pop edi esi
 
;ïðîïóñêàåì ñòðîêó ñ èìåíåì êëàâèøè
call gotoEndString
call gotoStartString
 
;ñ÷èòûâàåì ñêàíêîä àêòèâàöèîííîé êëàâèøè
push esi edi ecx
mov esi, keystr
mov edi, keystr
call readPath
;ïðåîáðàçóåì ñòðîêó â ÷èñëî
mov esi, keystr
call strToInteger
mov byte[keyActivate], cl
pop ecx edi esi
call gotoStartString
 
;ñ÷èòûâàåì ðàäèóñ
push esi edi ecx
mov esi, radstr
mov edi, radstr
call readPath
;ïðåîáðàçóåì ñòðîêó â ÷èñëî
mov esi, radstr
call strToInteger
;òåïåðü ecx - çíà÷åíèå ðàäèóñà
;!!! äîáàâèòü ïðîâåðêó, ÷òîáû ÷èñëî íå áûëî áîëüøå îáëàñòè ýêðàíà
;íàñ èíòåðåñóåò êâàäðàò ÷èñëà
push eax edx
mov eax, ecx ;dword[radius2]
mul ecx
mov dword[radius2], eax
pop edx eax
 
pop ecx edi esi
 
;ñ÷èòûâàòü ðàçìåð ýëåìåíòîâ èíòåðôåéñà íàì íå íóæíî (ïîêà ÷òî ýòîò ïàðàìåòð òîëüêî äëÿ êîíôèãà)
jmp .end
.exit:
pop edx ecx ebx eax
mcall -1 ;çàêðûòü ýòó ïðîãðàììó
.end:
mov ecx, dword[cfgFileAdr] ;åñëè ôàéë áûë çàãðóæåí, òî
cmp ecx, 0
je @f
mcall 68, 13, ecx ;âûãðóæàåì ôàéë èç ïàìÿòè
@@:
pop edx ecx ebx eax
ret
 
 
checkPathAdr:
push eax ebx
xor eax, eax
 
mov ebx, apps.path1
cmp byte[ebx], '-'
jne @f
;cmp byte[ebx+1], 0
;jne @f
mov byte[ebx], 0
@@:
mov ebx, apps.path2
cmp byte[ebx], '-'
jne @f
;cmp byte[ebx+1], 0
;jne @f
mov byte[ebx], 0
@@:
mov ebx, apps.path3
cmp byte[ebx], '-'
jne @f
;cmp byte[ebx+1], 0
;jne @f
mov byte[ebx], 0
@@:
mov ebx, apps.path4
cmp byte[ebx], '-'
jne @f
;cmp byte[ebx+1], 0
;jne @f
mov byte[ebx], 0
@@:
pop ebx eax
ret
 
;ïðåîáðàçîâàíèå ñòðîêè â öåëîå ÷èñëî
strToInteger: ;âõîä: esi - óêàçàòåëü íà ñòðîêó ñ äåñÿòè÷íîé çàïèñüþ ÷èñëà, âûõîä: eñx - ÷èñëî
push eax ebx edx edi
xor eax, eax ;îáíóëÿåì eax
xor ecx, ecx
mov edi, esi
.get_last_symbol:
;÷èòàåì î÷åðåäíîé ñèìâîë
mov al, byte[edi]
 
;åñëè ýòî íîëü, òî ñòðîêà çàêîí÷èëàñü
cmp al, 0
je @f
 
;èíà÷å ïåðåõîäèì íà ñëåäóþùèé ñèìâîë
inc edi
jmp .get_last_symbol
@@: ;äîøëè äî ïîñëåäíåãî ñèìâîëà è êëàä¸ì àäðåñ íà íåãî â edi
dec edi
 
cmp edi, esi ;àäðåñ ïîñëåäíåãî ñèìâîëà äîëæåí áûòü äàëüøå àäðåñà ïåðâîãî ñèìâîëà
jae @f
jmp .error ;èíà÷å îøèáêà
@@:
;òåïåðü â edi ïîñëåäíèé ñèìâîë, à esi óêàçûâàåò íà íà÷àëî ñòðîêè (íà ïåðâé ñèìâîë ñòðîêè)
mov cl, byte[edi]
sub cl, 48 ;0x30 ;'0'
dec edi ;ïåðåõîäèì íà ñëåä ñèìâîë îò êîíöà
mov ebx, 10 ;ìíîæèòåëü ñòåïåíè
.tranform_cicle:
cmp edi, esi ;åñëè áîëüøå íåò ñèìâîëîâ ñòðîêå, òî ÷èñëî ïðåîáðàçîâàëè - âûõîäèì
jb .end
 
mov eax, 0
mov al, byte[edi]
sub al, 48 ;'0'
cmp al, 9 ;0x39 ;åñëè ÷èñëî áîëüøå 9, òî âèäèìî â ñòðîêå áûëî ÷òî-òî íå òàê
ja .error
cmp al, 0 ;0x30 ;åñëè ÷èñëî ìåíüøå 0, òî âèäèìî â ñòðîêå áûëî ÷òî-òî íå òàê
jb .error
mov edx, 0
mul ebx
 
add ecx, eax
 
dec edi
mov edx, 0
mov eax, 10
mul ebx
mov ebx, eax
jmp .tranform_cicle
.error:
mov ecx, 0
.end:
pop edi edx ebx eax
ret
 
 
;Âûíåñòè êîä íèæå â îòäåëüíûé îáùèé ìîäóëü
selfName db '@HA',0
selfNameSize = 10 ;äî 11 byte
;
compareBytes:
push edi esi ecx ebx
xor eax, eax
mov ecx, selfNameSize ;max ðàçìåð ñòðîê 11
@@:
mov bl, byte[edi]
cmp bl, byte[esi]
jne compareBytes.no
inc edi
inc esi
cmp ecx, 0
je @f
dec ecx
jmp @b
.no:
mov eax, 1
@@:
pop ebx ecx esi edi
ret
;
copyKill:
push eax ebx ecx esi edi
 
;ñïåðâà ïðî÷ò¸ì ñâîþ èíôîðìàöèþ
mcall 9, buf, -1
mov eax, dword[buf+30]
mov dword[selfPID], eax
 
;óêàçàòåëè, êîòîðûå íèêîãäà íå ìåíÿþòñÿ:
mov esi, selfName ;ïåðâàÿ ñòðîêà - èìÿ òåêóùåãî ïðèëîæåíèÿ
mov edi, buf ;âòîðàÿ ñòðîêà - èìÿ òåêóùåãî ñëîòà
add edi, 10
 
mov ecx, 1
@@:
mcall 9, buf, ecx
mov dword[slotMax], eax
 
;åñëè ýòî ìû ñàìè, òî ïðîïóñêàåì ïðîâåðêó
mov eax, dword[buf+30]
cmp eax, dword[selfPID]
je copyKill.propusk
 
call compareBytes ;ñðàâíèâàåì 11 áàéò ñòðîê, ðåçóëüòàò â eax
 
cmp eax, 0
je copyKill.selfKill
 
.propusk:
inc ecx
cmp ecx, dword[slotMax]
ja @f
jmp @b
 
.selfKill:
pop edi esi ecx ebx eax
mcall -1
ret
@@:
pop edi esi ecx ebx eax
ret
 
 
;MODE 3
init03:
;mov dword[radius2], 100; 10*10
mov dword[backAdr], mode03
call setHotKey
mode03:
mcall 10
cmp eax, 2 ;îáðàáîòêà íàæàòèÿ êëàâèøè
je hotkey
 
;cmp byte[keyState], 0
;je mode03
cmp eax, 6 ;îáðàáîòêà ïåðåìåùåíèé è íàæàòèÿ ìûøè
je mouse03
 
jmp mode03
 
mouse03:
cmp byte[keyState], 0 ;åñëè êëàâèøà íå çàæàòà, òî îáíîâèì íà÷àëüíûå êîîðäèíàòû
je mouse03.updateCoord
 
cmp byte[state], LOCKd ;åñëè óãîë çàáëîêèðîâàí, òî îáíîâèì íà÷àëüíûå êîîðäèíàòû
je mouse03.updateCoord
 
cmp byte[state], SUPERLOCKd ;åñëè äåéñòâèå áûëî âûïîëíåíî è ïîëó÷èëè áëîêèðîâêó, òî æä¸ì îòïóñêàíèÿ êëàâèøè àêòèâàöèè
je @f
 
call checkPointInCircle ;èíà÷å åñëè ïðåîäîëåëè ðàäèóñ àêòèâàöèè, òî âûçûâàåì äåéñòâèå íóæíîãî óãëà
jmp @f
.updateCoord:
push eax ebx
mcall 37, 0 ;çàïîìèíàåì òåêóùèå(íà÷àëüíûå) êîîðäèíàòû ìûøè
;mov dword[o.x], eax
mov word[o.y], ax
shr eax, 16
mov word[o.x], ax
pop ebx eax
@@:
jmp dword[backAdr]
 
 
radius2 dd 0 ;êâàäðàò ðàäèóñà äëÿ mode 3
o: ;êîîðäèíàòû íà÷àëüíîé è òåêóùåé òî÷êè
.x: dw 0
.y: dw 0
.cx: dw 0
.cy: dw 0
 
;ïðîâåðêà âûõîäà çà ïðåäåëû êðóãà
; sqrt( (x2-x1)^2 + (y2-y1)^2 ) <= radius
; (x2-x1)^2 + (y2-y1)^2 <= radius^2
checkPointInCircle:
push eax ebx ecx edx
mcall 37, 0 ;ïîëó÷àåì òåêóùèå êîîðäèíàòû ìûøè
;mov dword[o.cx], eax
mov word[o.cy], ax
shr eax, 16
mov word[o.cx], ax
 
xor eax, eax
xor edx, edx
mov ax, word[o.x]
mov dx, word[o.cx]
cmp dx, ax
jae @f
sub ax, dx
mov dx, ax
jmp .xend
@@:
sub dx, ax
.xend:
mov eax, edx
mul dx
 
mov ebx, eax
 
xor eax, eax
xor edx, edx
mov ax, word[o.y]
mov dx, word[o.cy]
cmp dx, ax
jae @f
sub ax, dx
mov dx, ax
jmp .yend
@@:
sub dx, ax
.yend:
mov eax, edx
mul dx
 
add ebx, eax
 
cmp ebx, dword[radius2]
jbe @f
call activateCorner ;èíà÷å àêòèâèðóåì íóæíûé óãîë
@@:
pop edx ecx ebx eax
ret
 
;âûÿñíèòü â ñòîðîíó êàêîãî óãëà óøëè è àêòèâèðîâàòü åãî
activateCorner:
push eax ecx
xor eax, eax
 
mov ax, word[o.cx]
cmp ax, word[o.x]
je activateCorner.end ;åñëè êîîðäèíàòà ðàâíà, òî âûõîäèì (òàêîãî áûòü íå äîëæíî)
ja activateCorner.right
 
;èíà÷å ëåâàÿ ñòîðîíà
mov ax, word[o.cy]
cmp ax, word[o.y]
je activateCorner.end ;åñëè êîîðäèíàòà ðàâíà, òî âûõîäèì (òàêîãî áûòü íå äîëæíî)
jb activateCorner.leftup
 
;èíà÷å ëåâûé íèæíèé óãîë
mov ecx, 1
call run_command
mov byte[keyState], 0
mov byte[state], SUPERLOCKd
jmp activateCorner.end
 
.leftup:
;ëåâûé âåðõíèé óãîë
mov ecx, 0
call run_command
mov byte[keyState], 0
mov byte[state], SUPERLOCKd
jmp activateCorner.end
 
.right: ;ïðàâàÿ ñòîðîíà ýêðàíà
mov ax, word[o.cy]
cmp ax, word[o.y]
je activateCorner.end ;åñëè êîîðäèíàòà ðàâíà, òî âûõîäèì (òàêîãî áûòü íå äîëæíî)
jb activateCorner.rightup
 
;èíà÷å ïðàâûé íèæíèé óãîë
mov ecx, 3
call run_command
mov byte[keyState], 0
mov byte[state], SUPERLOCKd
jmp activateCorner.end
 
.rightup:
;ïðàâûé âåðõíèé óãîë
mov ecx, 2
call run_command
mov byte[keyState], 0
mov byte[state], SUPERLOCKd
jmp activateCorner.end
 
.end:
pop ecx eax
ret
 
 
 
keyActivate db 41 ;16 ;'Q' ;êëàâèøà àêòèâàöèè
keyState db 0 ;0-êëàâèøà íå àêòèâíà, 1 - êëàâèøà àêòèâíà
 
backAdr rd 1 ;àäðåñ äëÿ âîçâðàòà èç ïðîâåðêè ìûøè
slotMax rd 1
selfPID rd 1
buf rb 1024
 
;ñòðóêòóðêà äàííûõ äëÿ õðàíåíèÿ ïàðàìåòðîâ ýêðàíà
screen:
.width rw 1
.height rw 1
 
state: rb 1 ;ñîñòîÿíèå: 0=unlock, 1=lock, 2=superlock for mode 3
mode: rb 1 ;ðåæèì ðàáîòû ïðèëîæåíèÿ: 0=íå ðàáîòàåò, 1=êëàññè÷åñêèé, 2=ïî ãîðÿ÷åé êëàâèøå
 
 
keystr: rb 4 ;ñòðîêà ñî çíà÷åíèåì ñêàíêîäà àêòèâàöèîííîé êëàâèøè
radstr: rb 5 ;ñòðîêà ñî çíà÷åíèåì ðàäèóñà
apps:
.path1: rb 512
.path2: rb 512
.path3: rb 512
.path4: rb 512
.param1: rb 512
.param2: rb 512
.param3: rb 512
.param4: rb 512
appsEnd:
 
 
I_END:
/programs/other/ha/HACONFIG.ASM
269,7 → 269,7
 
 
;èìß êîíôèãóðàöèîííîãî ôàéëà
fileName: db 'SETTINGS/HOTANGLES.CFG', 0
fileName: db 'SETTINGS/HA.CFG', 0
 
;ñòðóêòóðà äëß ñîçäàíèß/ïåðåçàïèñè ôàéëà
createFile:
440,10 → 440,10
;èíà÷å çäåñü íóæíî âûâåñòè îêíî ñ îøèáêîé !!!
.end:
mcall 68, 13, dword[createFile.data_adr] ;îñâîáîæäàåì ïàìßòü ïîä áóôåð
call finishHotAnglesApp ;çàâåðøàåì ðàáîòó âñåõ êîïèé ñåðâèñà @HOTANGLES
call finishHotAnglesApp ;çàâåðøàåì ðàáîòó âñåõ êîïèé ñåðâèñà @HA
call loadConfig ;ïåðåçàãðóæàåì ôàéë êîíôèãà
call draw_window ;ïåðåðèñîâûâàåì îêíî
call startHotAnglesApp ;ïåðåçàïóñêàåì @HOTANGLES
call startHotAnglesApp ;ïåðåçàïóñêàåì @HA
pop ecx ebx eax
ret
 
517,7 → 517,7
.param dd 0
.rezerv dd 0, 0
.full_name db '/sys/'
.file_name db '@HOTANGLES', 0
.file_name db '@HA', 0
 
UpdateEditsSizes:
push eax
/programs/other/ha/ReadMe.txt
4,9 → 4,9
RU
 
Êîìïëåêò óòèëèò (àíàëîã Hot Corners â äðóãèõ ÎÑ) äëÿ ðàñøèðåíèÿ âîçìîæíîñòåé ðàáî÷åãî ñòîëà ïîëüçîâàòåëÿ. Íàçâàíèå âûáðàíî ïóò¸ì ãîëîñîâàíèÿ.  êîìïëåêò âõîäÿò äâå óòèëèòû:
@HOTANGLES - îñíîâíàÿ óòèëèòà, ïîçâîëÿþùàÿ çàïóñêàòü ïðèëîæåíèÿ ïóò¸ì íàâåäåíèÿ êóðñîðà â óãîë ýêðàíà (óãîë ðàáî÷åé îáëàñòè);
@HA - îñíîâíàÿ óòèëèòà, ïîçâîëÿþùàÿ çàïóñêàòü ïðèëîæåíèÿ ïóò¸ì íàâåäåíèÿ êóðñîðà â óãîë ýêðàíà (óãîë ðàáî÷åé îáëàñòè);
HACONFIG - óòèëèòà êîíôèãóðàòîð, ïîçâîëÿþùàÿ íàñòðîèòü äåéñòâèÿ íà êàæäûé óãîë è àêòèâèðîâàòü/äåàêòèâèðîâàòü ýòó îïöèþ.
Ôàéë êîíôèãóðàöèè: SYS/SETTINGS/HOTANGLES.CFG (ãäå SYS/ - ïóòü ê ñèñòåìíîé äèðåêòîðèè). Ôàéë ñîñòîèò èç äåâÿòè ñòðîê:
Ôàéë êîíôèãóðàöèè: SYS/SETTINGS/HA.CFG (ãäå SYS/ - ïóòü ê ñèñòåìíîé äèðåêòîðèè). Ôàéë ñîñòîèò èç äåâÿòè ñòðîê:
1) ñîñòîÿíèå àêòèâíîñòè îïöèè (îäèí ñèìâîë):
1 èëè y - îïöèÿ àêòèâíà, àêòèâèðîâàí êëàññè÷åñêèé ðåæèì ðàáîòû óãîëêîâ,
2 - îïöèÿ àêòèâíà, àêòèâèðîâàí ðåæèì ðàáîòû ïî ãîðÿ÷åé êëàâèøå,
18,15 → 18,15
4) êîìàíäà (ïîëíîå èìÿ ïðèëîæåíèÿ) äëÿ ïðàâîãî âåðõíåãî óãëà ýêðàíà;
5) êîìàíäà (ïîëíîå èìÿ ïðèëîæåíèÿ) äëÿ ïðàâîãî íèæíåãî óãëà ýêðàíà;
6) êëàâèøà àêòèâàöèè (äëÿ ðåæèìîâ 2 è 3): '0'..'9','a'..'z','A'..'Z',Space,Shift,Alt,Ctrl,'~' (ïðèìå÷àíèå: êëàâèøè Shift,Alt,Ctrl íå ðàáîòàþò â âåðñèè 0.3.7);
7) ñêàíêîä êëàâèøè àêòèâàöèè (äåñÿòè÷íîå ÷èñëî, èñïîëüçóåòñÿ @HOTANGLES);
7) ñêàíêîä êëàâèøè àêòèâàöèè (äåñÿòè÷íîå ÷èñëî, èñïîëüçóåòñÿ @HA);
8) ðàäèóñ ñðàáàòûâàíèÿ æåñòà îò íà÷àëüíîé òî÷êè â ìîìåíò íàæàòèÿ êëàâèøè (äëÿ mode 3);
Åñëè íåîáõîäèìî íàñòðîèòü òîëüêî ÷àñòü óãëîâ, à îñòàëüíûå îñòàâèòü áåç äåéñòâèÿ, òî â êîíôèãóðàòîðå èëè íà íóæíîé ñòðîêå êîíôèãóðàöèîííîãî ôàéëà óêàæèòå çíàê ìèíóñ (ñèìâîë '-').
Ïðèìå÷àíèå: Äî âåðñèè 0.3.6 âêëþ÷èòåëüíî ôàéë êîíôèãóðàöèè ñîñòîÿë òîëüêî èç 5 ïåðâûõ ñòðîê.
 
Îáå óòèëèòû ñîäåðæàò çàùèòó îò ïîâòîðíîãî çàïóñêà.
Óòèëèòà @HOTANGLES äîáàâëåíà â àâòîçàãðóçêó ÎÑ (íî îòêëþ÷åíà â ñîáñòâåííîì ôàéëå êîíôèãóðàöèè íà ïîñëåäíèõ âåðñèÿõ ñáîðîê Êîëèáðè). Ñòðî÷êà èç ôàéëà àâòîçàïóñêà (AUTORUN.DAT):
/SYS/@HOTANGLES "" 0 # Start Hot Angles
@HOTANGLES íå çàïóñòèòñÿ, åñëè êîíôèãóðàöèîííûé ôàéë îòñóòñòâóåò èëè áûë ïåðåèìåíîâàí.
Óòèëèòà @HA äîáàâëåíà â àâòîçàãðóçêó ÎÑ (íî îòêëþ÷åíà â ñîáñòâåííîì ôàéëå êîíôèãóðàöèè íà ïîñëåäíèõ âåðñèÿõ ñáîðîê Êîëèáðè). Ñòðî÷êà èç ôàéëà àâòîçàïóñêà (AUTORUN.DAT):
/SYS/@HA "" 0 # Start Hot Angles
@HA íå çàïóñòèòñÿ, åñëè êîíôèãóðàöèîííûé ôàéë îòñóòñòâóåò èëè áûë ïåðåèìåíîâàí.
HACONFIG ïðè îòñóòñòâèè êîíôèãóðàöèîííîãî ôàéëà âûñòàâëÿåò âñå ïîëÿ ïî óìîë÷àíèþ, íî íå ñîçäà¸ò ôàéë êîíôèãóðàöèè ñàìîñòîÿòåëüíî (äëÿ ýòîãî íåîáõîäèìî íàæàòü êíîïêó "Ïðèìåíèòü", òîãäà îòñóòñòâóþùèé ôàéë êîíôèãóðàöèè áóäåò ñîçäàí, à ñóùåñòâóþùèé ïåðåçàïèñàí).
Ïðè ïåðâîì ñòàðòå óòèëèòû âñå óãëû ðàáî÷åé îáëàñòè íàñòðîåíû íà çàïóñê êîíôèãóðàòîðà, ãäå âû ìîæåòå íàñòðîèòü óòèëèòó ïîä ñåáÿ èëè îòêëþ÷èòü å¸.
Hot Angles íà÷èíàÿ ñ revision #7392 âêëþ÷åí â ñîñòàâ äèñòðèáóòèâà è äîáàâëåí â àâòîçàïóñê ïðè ñòàðòå ñèñòåìû. Ïîääåðæêà ðóññêîãî ÿçûêà äîáàâëåíà â revision #7395. Íà÷èíàÿ ñ âåðñèè 0.3.5 äîáàâëåí âòîðîé ðåæèì ðàáîòû óòèëèòû è âîçìîæíîñòü âûáîðà ïðîãðàìì ÷åðåç Open Dialog.  âåðñèè 0.3.8 çàðàáîòàëà îïöèÿ çàäàíèÿ ðàçìåðà òåêñòà, íî ïîñòðàäàë êîä è êà÷åñòâî èíòåðôåéñà.
42,7 → 42,7
 êëàññè÷åñêîì ðåæèìå óãîë àêòèâèðóåòñÿ ïóò¸ì íàâåäåíèÿ êóðñîðà. Âñ¸ ïðîèñõîäèò àâòîìàòè÷åñêè. Âû íàâîäèòå ìûøü â çàäàííûé óãîë ðàáî÷åãî ñòîëà, è çàïóñêàåòñÿ ïðèëîæåíèå, ñâÿçàííîå ñ ýòèì óãëîì.
Ýòîò ðåæèì àêòèâèðóåòñÿ ñèìâîëîì '1' â íà÷àëå êîíôèãóðàöèîííîãî ôàéëà.
 
Íà÷èíàÿ ñ âåðñèè 0.3.5 óòèëèòà @HOTANGLES ïîääåðæèâàåò âòîðîé ðåæèì ðàáîòû - àêòèâàöèþ óãëîâ ïî ãîðÿ÷åé êëàâèøå. Àêòèâèðóåòñÿ ðåæèì ñèìâîëîì '2' â íà÷àëå êîíôèãóðàöèîííîãî ôàéëà. Èçìåíèòü êëàâèøó àêòèâàöèè íåëüçÿ, ïî óìîë÷àíèþ ýòî ñèìâîë òèëüäà '~' èëè '`'.  ýòîì ðåæèìå äëÿ àêòèâàöèè óãëà òðåáóåòñÿ çàæàòü êëàâèøó òèëüäà è, îäíîâðåìåííî ñ ýòèì, íàâåñòè êóðñîð â íóæíûé óãîë ðàáî÷åãî ñòîëà.
Íà÷èíàÿ ñ âåðñèè 0.3.5 óòèëèòà @HA ïîääåðæèâàåò âòîðîé ðåæèì ðàáîòû - àêòèâàöèþ óãëîâ ïî ãîðÿ÷åé êëàâèøå. Àêòèâèðóåòñÿ ðåæèì ñèìâîëîì '2' â íà÷àëå êîíôèãóðàöèîííîãî ôàéëà. Èçìåíèòü êëàâèøó àêòèâàöèè íåëüçÿ, ïî óìîë÷àíèþ ýòî ñèìâîë òèëüäà '~' èëè '`'.  ýòîì ðåæèìå äëÿ àêòèâàöèè óãëà òðåáóåòñÿ çàæàòü êëàâèøó òèëüäà è, îäíîâðåìåííî ñ ýòèì, íàâåñòè êóðñîð â íóæíûé óãîë ðàáî÷åãî ñòîëà.
 
Íà÷èíàÿ ñ âåðñèè 0.3.6 ïîääåðæèâàåòñÿ òðåòèé ðåæèì ðàáîòû - àêòèâàöèÿ æåñòîì ïðè çàæàòîé àêòèâàöèîííîé êëàâèøå. Ýòîò ðåæèì íàõîäèòñÿ â òåñòèðîâàíèè. Êëàâèøà àêòèâàöèè - òèëüäà '~'. Èçìåíèòü êëàâèøó íåëüçÿ.  ýòîì ðåæèìå äëÿ àêòèâàöèè óãëà íåîáõîäèìî çàæàòü êëàâèøó òèëüäà è ñìåñòèòü êóðñîð íà ðàññòîÿíèå 10 ïèêñåëåé â ñòîðîíó íóæíîãî óãëà. Ñïîðíûå íàïðàâëåíèÿ (âåðòèêàëüíî ââåðõ èëè âíèç è ãîðèçîíòàëüíî âëåâî èëè âïðàâî) èãíîðèðóþòñÿ. Ðåæèì ïðåäïîëàãàåò èñïîëüçîâàíèå èç öåíòðà ýêðàíà, èç óãëà ýêðàíà ìîæíî âûçâàòü òîëüêî ïðîòèâîïîëîæíûé åìó ïî äèàãîíàëè óãîë. Ýòîò ðåæèì â ôàéëå êîíôèãóðàöèè îòìå÷àåòñÿ ñèìâîëîì '3'.
 
/programs/other/ha/SETTINGS/HOTANGLES.CFG
File deleted
/programs/other/ha/SETTINGS/HA.CFG
0,0 → 1,9
 
/sys/HACONFIG
/sys/HACONFIG
/sys/HACONFIG
/sys/HACONFIG
Space
57
10
s
/programs/other/ha/Tupfile.lua
1,4 → 1,4
if tup.getconfig("NO_FASM") ~= "" then return end
tup.rule("echo lang fix " .. ((tup.getconfig("LANG") == "") and "ru" or tup.getconfig("LANG")) .. " > lang.inc", {"lang.inc"})
tup.rule({"HOTANGLES.ASM", extra_inputs = {"lang.inc"}}, "fasm %f %o " .. tup.getconfig("KPACK_CMD"), "HOTANGLES")
tup.rule({"HA.ASM", extra_inputs = {"lang.inc"}}, "fasm %f %o " .. tup.getconfig("KPACK_CMD"), "HA")
tup.rule({"HACONFIG.ASM", extra_inputs = {"lang.inc"}}, "fasm %f %o " .. tup.getconfig("KPACK_CMD"), "HACONFIG")
/programs/other/ha/build.bat
1,7 → 1,7
@echo lang fix ru >lang.inc
@fasm.exe -m 16384 HOTANGLES.ASM HOTANGLES
@fasm.exe -m 16384 HA.ASM HA
@fasm.exe -m 16384 HACONFIG.ASM HACONFIG
@erase lang.inc
@kpack HOTANGLES
@kpack HA
@kpack HACONFIG
@pause