Hot Angles 0.3.7: support parameters for running programs; improved mode 3; more settings supported by the configurator; updated readme

git-svn-id: svn://kolibrios.org@7459 a494cfbc-eb01-0410-851d-a64ba20cac60
This commit is contained in:
theonlymirage 2018-10-14 02:39:53 +00:00
parent e8789d5ad4
commit f0f9d26273
4 changed files with 1195 additions and 125 deletions

View File

@ -2,7 +2,7 @@
; Hot Angles Config ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
; Compile with FASM
; Version 0.3.6: Oct 9, 2018
; Version 0.3.7: Oct 14, 2018
; Copyright (c) 2018, Efremenkov Sergey aka TheOnlyMirage
; All rights reserved.
@ -115,6 +115,7 @@ event_wait:
invoke edit_box_mouse, editRU
invoke edit_box_mouse, editRD
;stdcall [kmainmenu_dispatch_cursorevent], [modeMenu] ;ïðîâåðêà ìûøè äëÿ êîìáîáîêñà
invoke edit_box_mouse, editRadius
jmp event_wait
@ -127,10 +128,66 @@ key: ; Keypress event handler
mov eax, 2 ; The key is returned in ah. The key must be
mcall ; read and cleared from the system queue.
;push eax
invoke edit_box_key, editLU
invoke edit_box_key, editLD
invoke edit_box_key, editRU
invoke edit_box_key, editRD
invoke edit_box_key, editRadius
;pop eax
cmp eax, 1
je event_wait ;.end ;@f
cmp word[hkSymbol], 0
jne event_wait ;.end ;@f
cmp al, 0
jne .next
mov byte[hkSymbol], ah
push eax ecx esi ;ñîõðàíÿåì ñêàíêîä êëàâèøè
shr eax, 16
mov byte[keyscan], al
mov ecx, 0
mov cl, al ;byte[keyscan]
mov esi, keystr.data
call IntToStr
;ñ÷èòàåì ïîëó÷åííûé ðàçìåð ñòðîêè
xor ecx, ecx
mov esi, keystr.data
@@:
cmp byte[esi], 0
je @f
inc esi
inc ecx
;cmp ecx, 4
;je @f
jmp @b
@@:
;è ñîõðàíÿåì åãî
mov dword[keystr.size], ecx
; cmp ecx, 3
; jbe @f
; mcall -1
; @@:
pop esi ecx eax
jmp red
.next:
;cmp al, 2
;jne @f
;cmp ah, 0
;jne @f
;ñ÷èòûâàåì óïðàâëÿþùèå êëàâèøè
;shr eax, 16
;bt eax, 0 ;left shift
;jne @f
;mov byte[hkSymbol], 2
;jmp red
@@:
;.end:
jmp event_wait ; Just read the key, ignore it and jump to event_wait.
button: ; Buttonpress event handler
@ -182,12 +239,17 @@ noclose:
mov word[coordModeMenu.x], ax
mov eax, dword[pi+38]
add eax, buttonModeY + 17 ;20 ;42
add eax, buttonModeY + 13 ;17
mov word[coordModeMenu.y], ax
stdcall [ksubmenu_draw], [modeMenu], coordModeMenu
pop ecx ebx eax
jmp event_wait
@@:
cmp ah, 9
jne @f
mov word[hkSymbol], 0
jmp red ;event_wait
@@:
cmp ah, 110
jne @f
@ -227,8 +289,8 @@ createFile:
.path_adr dd fileName ;ïóòü
;ñòðîêà ïàðàìåòðîâ ïî óìîë÷àíèþ è å¸ ðàçìåð
defaultDataForConfig db 121,13,10,'/rd/1/HACONFIG',13,10,'/rd/1/HACONFIG',13,10,'/rd/1/HACONFIG',13,10,'/rd/1/HACONFIG',13,10
defaultDataSize = 48+19
defaultDataForConfig db 121,13,10,'/rd/1/HACONFIG',13,10,'/rd/1/HACONFIG',13,10,'/rd/1/HACONFIG',13,10,'/rd/1/HACONFIG',13,10,'Space',13,10,'57',13,10,'10',13,10,'s',13,10
defaultDataSize = 85 ;48+19+4
copyParam: ;êîïèðóåò ïàðàìåòð(êîìàíäó çàïóñêà) â áóôåð (ñì. äàëüøå)
@ -271,11 +333,21 @@ applyButton:
;mov dword[createFile.size], defaultDataSize
;âû÷èñëèì ðàçìåð ôàéëà êîíôèãóðàöèè â áàéòàõ
mov ecx, 5*2+1 ;1 байт на состояние активности и 5 пар переносов строк (символы 13, 10)
mov ecx, 9*2+1 ;1 áàéò íà ñîñòîÿíèå àêòèâíîñòè è 9 ïàð ïåðåíîñîâ ñòðîê (ñèìâîëû 13, 10)
add ecx, dword[editLU.size] ;ïëþñ ðàçìåð êàæäîé ñòðîêè â áàéòàõ
add ecx, dword[editLD.size]
add ecx, dword[editRU.size]
add ecx, dword[editRD.size] ;dataBuffer.size4]
add ecx, dword[editRadius.size]
add ecx, dword[hkSize] ;ðàçìåð èìåíè àêòèâàöèîííîé êíîïêè
add ecx, dword[keystr.size] ;ðàçìåð ñêàíêîäà àêòèâàöèîííîé êíîïêè
inc ecx ; åù¸ 1 áàéò äëÿ õðàíåíèÿ ðàçìåðà ýëåìåíòîâ
;mov ecx, 85
cmp dword[keystr.size], 3
jbe @f
;mcall -1
@@:
;åñëè çàäàíû ïóñòûå ñòðîêè, òî ìû àâòîìàòè÷åñêè äîáàâëÿåì çíàê ìèíóñ, çíà÷èò ðàçìåð +1 áàéò
cmp dword[editLU.size], 0
@ -304,7 +376,6 @@ applyButton:
;cmp byte[mode], 0
;jne @f
;@@:
;
push ebx ;ñîõðàíÿåì âûáðàííûé ðåæèì
mov bl, byte[mode]
@ -337,6 +408,41 @@ applyButton:
call copyParam
call addPerenos ;äîáàâëÿåì ïåðåíîñ ñòðîêè
;ñîõðàíÿåì êíîïêó àêòèâàöèè
call saveKey
call addPerenos
;ñîõðàíÿåì ñêàíêîä êíîïêè
mov esi, keystr.data ;çàïèñûâàåì ñòðîêó keystr â ôàéë
xor ebx, ebx
@@:
cmp byte[esi], 0
je @f
mov bl, byte[esi]
mov byte[eax], bl
inc eax
inc esi
cmp esi, keystr.size-1
jae @f
jmp @b
@@:
call addPerenos
;ñîõðàíÿåì ðàäèóñ
;!!! åñëè ðàäèóñ îñòàâëåí ïóñòûì, òî íóæíî ñîõðàíÿòü çíà÷åíèå ïî óìîë÷àíèþ (ñåé÷àñ ïèøåòñÿ '-')
mov esi, radiusBuffer.data
mov ebx, editRadius.size ;radiusBuffer.size
call copyParam
call addPerenos
;äîáàâëÿåì ðàçìåð ýëåìåíòîâ
push ebx ;ñîõðàíÿåì âûáðàííûé ðåæèì
mov bl, byte[sizeStyle]
mov byte[eax], bl
pop ebx
inc eax
call addPerenos
pop ebx esi
@ -440,6 +546,9 @@ UpdateEditsSizes:
mov eax, dword[editRD.size]
mov dword[dataBuffer.size4], eax
mov eax, dword[editRadius.size]
mov dword[radiusBuffer.size], eax
pop eax
ret
@ -474,7 +583,13 @@ loadConfig:
mov byte[mode], 48 ;'0'
jmp loadConfig.modeEnd
@@:
mov byte[mode], 49 ;'1' иначе по умолчанию включён классический режим работы
cmp bl, 'y' ;åñëè y - òî êëàññè÷åñêèé ðåæèì
jne @f
mov byte[mode], 49 ;'1'
jmp loadConfig.modeEnd
@@:
mov byte[mode], 48 ;'0' èíà÷å ïî óìîë÷àíèþ îòêëþ÷åíî
;mov byte[mode], 49 ;'1' èíà÷å ïî óìîë÷àíèþ âêëþ÷¸í êëàññè÷åñêèé ðåæèì ðàáîòû
.modeEnd:
pop ebx
;jmp loadConfig.end ;êîìàíäà äëÿ óäîáñòâà îòëàäêè è ïîèñêà îøèáîê
@ -530,6 +645,18 @@ loadConfig:
cmp edi, dataBuffer.size1 ;åñëè ýòî áûë ïîñëåäíèé áóôåð (è ìû âûøëè çà àäðåñà ðàçìåðîâ áóôåðîâ), òî âûõîäèì
jb loadConfig.block
call readOptKey ;ñ÷èòûâàåì êëàâèøó
call gotoEndString
;ñ÷èòûâàåì ñêàíêîä êëàâèøè
call readScanKey
call gotoEndString
call readOptRadius ;ñ÷èòûâàåì çíà÷åíèå ðàäèóñà äëÿ mode 3
call gotoEndString
call readOptSize ;ñ÷èòûâàåì ðàçìåð ýëåìåíòîâ
call gotoEndString
pop eax ebx ecx esi edi
jmp loadConfig.end
@ -544,10 +671,333 @@ loadConfig:
mcall 68, 13, ecx ;âûãðóæàåì ôàéë èç ïàìÿòè
@@:
call updateParams ;ïðèìåíÿåì íàñòðîéêè êàæäîãî áóôåðà
call setMySize ;ïðèìåíÿåì íàñòðîéêè ðàçìåðà ýëåìåíòîâ
pop edx ecx ebx eax
ret
setMySize:
push eax
;âûñòàâëÿåì mysize â çàâèñèìîñòè îò çíà÷åíèÿ sizeStyle
cmp byte[sizeStyle], '0'
jb @f
cmp byte[sizeStyle], '7'
ja @f
mov eax, 0 ;åñëè çíà÷åíèå ðàçìåðà çàäàíî, òî åãî è âûñòàâëÿåì
mov al, byte[sizeStyle]
sub al, '0'
jmp .end
@@:
cmp byte[sizeStyle], 'a'
je .auto
;cmp byte[sizeStyle], 's'
;je .system
.system: ;èíà÷å çíà÷åíèå ïî óìîë÷àíèþ: s - ñèñòåìíàÿ
; push ebx ecx
;!!!
; mov eax, 9
; mcall 48, 11 ;ïîëó÷àåì ñèñòåìíûé ðàçìåð øðèôòà
;eax - âûñîòà øðèôòà â ïèêñåëÿõ
; mov ecx, eax
; push eax
; mcall 48, 12, ecx ;ïðèìåíÿåì ðàçìåð øðèôòà
; pop eax
; pop ecx ebx
;temp fix - äåëèì íà òåêóùèé ðàçìåð øðèôòà and -1
; push ebx edx
; mov ebx, 9
;div ebx
; pop edx ebx
;cmp eax, 0
;je .end
;dec eax
mov eax, 0 ;xor eax, eax ;test temp
jmp .end
.auto: ;a - âûñòàâëÿåì â çàâèñèìîñòè îò ðàçðåøåíèÿ ýêðàíà
;!!!
mcall 14
push ebx
xor ebx, ebx
mov bx, ax
shr eax, 16
cmp ax, bx ;ïîëó÷àåì áîëüøèé ðàçìåð ñòîðîíû
jae .a
mov ax, bx
.a:
pop ebx
cmp ax, 1919 ;ðàçìåðû ïîëó÷åííûå âûøå îò 0 è íà 1 ìåíüøå
jb .size0
cmp ax, 2047
jb .size1
cmp ax, 4095
jb .size2
cmp ax, 8191
jb .size3
jmp .size4
.size0:
mov eax, 0
jmp .end
.size1:
mov eax, 1
jmp .end
.size2:
mov eax, 2
jmp .end
.size3:
mov eax, 3
jmp .end
.size4:
mov eax, 4
jmp .end
.size5:
mov eax, 5
jmp .end
.size6:
mov eax, 6
jmp .end
.size7:
mov eax, 7
jmp .end
;.default:
; mov eax, 1
.end:
mov byte[mysize], al ;mov dword[mysize], eax
pop eax
ret
readScanKey:
;ïðîïóñêàåì ïåðåíîñû ñòðîê â íà÷àëå
cmp eax, edx ;åñëè ôàéë çàêîí÷èëñÿ, òî
ja .default ;íàñòðîéêè ïî óìîë÷àíèþ
cmp byte[eax], 10
je @f
cmp byte[eax], 0
je @f
cmp byte[eax], 13
je @f
push ecx ebx esi
mov ecx, 0 ;xor ecx, ecx
mov esi, keystr.data
.copy:
mov bl, byte[eax]
cmp bl, 0
je .copyEnd
cmp bl, 10
je .copyEnd
cmp bl, 13
je .copyEnd
cmp esi, keystr.size-1
jae .copyEnd
mov byte[esi], bl
inc esi
inc eax
inc ecx
jmp .copy
.copyEnd:
mov byte[esi], 0
mov dword[keystr.size], ecx
pop esi ebx ecx
jmp .end
@@:
inc eax
jmp readScanKey
.default:
mov byte[keyscan], 57
mov word[keystr.data], '57'
mov byte[keystr.data+2], 0
mov dword[keystr.size], 2
.end:
ret
readOptKey: ;1;3;4;5 - space or shift
;ïðîïóñêàåì ïåðåíîñû ñòðîê â íà÷àëå
cmp eax, edx ;åñëè ôàéë çàêîí÷èëñÿ, òî
ja .default ;íàñòðîéêè ïî óìîë÷àíèþ
cmp byte[eax], 10
je @f
cmp byte[eax], 0
je @f
cmp byte[eax], 13
je @f
;èíà÷å ÷èòàåì êëàâèøó è âûõîäèì
cmp dword[eax], 'Ctrl'
jne .notCtrl
mov byte[hkSymbol], 3
mov dword[hkSize], 4
jmp .end
.notCtrl:
cmp dword[eax], 'Shif'
jne .notShift
mov byte[hkSymbol], 2
mov dword[hkSize], 5
jmp .end
.notShift:
cmp dword[eax], 'Spac'
jne .notSpace
mov byte[hkSymbol], 32
mov dword[hkSize], 5
jmp .end
.notSpace:
cmp word[eax], 'Al'
jne .notAlt
mov byte[hkSymbol], 1
mov dword[hkSize], 3
jmp .end
.notAlt:
;óáåäèìñÿ, ÷òî òàì 1 ñèìâîë, à íå ñòðîêà
cmp byte[eax+1], 10
je .oneSymb
cmp byte[eax+1], 0
je .oneSymb
cmp byte[eax+1], 13
je .oneSymb
jmp .default
.oneSymb:
;ïðîâåðÿåì, ÷òî ñèìâîë ðàçðåø¸ííûé !!!
;äîáàâëÿåì ñèìâîë êàê åñòü
push ebx
;xor ebx, ebx
mov bl, byte[eax]
mov byte[hkSymbol], bl
mov dword[hkSize], 1
pop ebx
jmp .end
@@:
inc eax
jmp readOptKey
.default:
mov byte[hkSymbol], 32
mov dword[hkSize], 5
.end:
mov byte[hkSymbol+1], 0
ret
;ïðîõîäèì äî êîíöà òåêóùåé ñòðîêè
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
readOptRadius:
;ïðîïóñêàåì ïåðåíîñû ñòðîê â íà÷àëå
cmp eax, edx ;åñëè ôàéë çàêîí÷èëñÿ, òî
ja .default ;íàñòðîéêè ïî óìîë÷àíèþ
cmp byte[eax], 10
je @f
cmp byte[eax], 0
je @f
cmp byte[eax], 13
je @f
;èíà÷å ñ÷èòûâàåì çíà÷åíèå
push ebx ecx
xor ecx, ecx
.readValue:
mov bl, byte[eax]
mov byte[radiusBuffer.data+ecx], bl
inc ecx
inc eax
cmp eax, edx ;åñëè ôàéë çàêîí÷èëñÿ, òî âûõîä
ja .readEnd
cmp byte[eax], 10
je .readEnd
cmp byte[eax], 0
je .readEnd
cmp byte[eax], 13
je .readEnd
cmp ecx, 6
jae .readEnd
jmp .readValue
.readEnd:
mov byte[radiusBuffer.data+ecx], 0
mov dword[radiusBuffer.size], ecx
pop ecx ebx
jmp .end
@@:
inc eax
jmp readOptRadius
.default:
mov byte[radiusBuffer.data], '0'
mov byte[radiusBuffer.data+1], 0
mov dword[radiusBuffer.size], 1
.end:
ret
readOptSize:
;ïðîïóñêàåì ïåðåíîñû ñòðîê â íà÷àëå
cmp eax, edx ;åñëè ôàéë çàêîí÷èëñÿ, òî
ja .default ;íàñòðîéêè ïî óìîë÷àíèþ
cmp byte[eax], 10
je @f
cmp byte[eax], 0
je @f
cmp byte[eax], 13
je @f
;ïðîâåðÿåì, ÷òî ýòî äîïóñòèìîå çíà÷åíèå: 1-7, a, s
cmp byte[eax], 'a'
je .setValue
cmp byte[eax], 's'
je .setValue
cmp byte[eax], '0'
je .setValue
cmp byte[eax], '1'
je .setValue
cmp byte[eax], '2'
je .setValue
cmp byte[eax], '3'
je .setValue
cmp byte[eax], '4'
je .setValue
cmp byte[eax], '5'
je .setValue
cmp byte[eax], '6'
je .setValue
cmp byte[eax], '7'
je .setValue
jmp .default ;èíà÷å ñòàâèì çíà÷åíèå ïî óìîë÷àíèþ
.setValue:
push ebx
mov bl, byte[eax]
mov byte[sizeStyle], bl
pop ebx
jmp .end
@@:
inc eax
jmp readOptSize
.default:
mov byte[sizeStyle], 's' ;ñèñòåìíûé
.end:
ret
updateParams: ;max, size, pos
push eax
mov eax, dword[dataBuffer.size1]
@ -565,6 +1015,10 @@ updateParams: ;max, size, pos
mov eax, dword[dataBuffer.size4]
mov dword[editRD.size], eax
mov dword[editRD.pos], eax
mov eax, dword[radiusBuffer.size]
mov dword[editRadius.size], eax
mov dword[editRadius.pos], eax
pop eax
ret
@ -639,7 +1093,7 @@ copyKill:
ret
WindowsWidth = 450
WindowsHeight = 195
WindowsHeight = 195 + 35 - 5
coord: ;êîîðäèíàòû îêíà ïðèëîæåíèÿ
.y dw 0
.x dw 0
@ -697,13 +1151,14 @@ draw_window:
invoke edit_box_draw, editRD
;ðèñóåì êíîïêó
buttonAppleY = WindowsHeight-35 ;160
mov ebx, (WindowsWidth-80-Otstup)*65536 + 80 ;êîîðäèíàòà X, øèðèíà êíîïêè
mov ecx, 160*65536 + 20 ;координата Y, высота кнопки
mov ecx, buttonAppleY*65536 + 20 ;êîîðäèíàòà Y, âûñîòà êíîïêè
mov edx, 0x00000002 ;2 ;íîìåð êíîïêè
mov esi, 0x00AABBCC ;öâåò êíîïêè
mcall 8
;ðèñóåì òåêñò êíîïêè
mov ebx, (WindowsWidth-80-Otstup+25-buttonTextXoffset) * 65536 + 166 ;координаты текста (x, y)
mov ebx, (WindowsWidth-80-Otstup+25-buttonTextXoffset) * 65536 + (buttonAppleY+6) ;êîîðäèíàòû òåêñòà (x, y)
mov ecx, 0xFFFFFF ;áåëûé öâåò òåêñòà
mov edx, buttonText
mov esi, buttonTextSize ;ðàçìåð òåêñòà â ñèìâîëàõ
@ -761,7 +1216,8 @@ draw_window:
buttonModeX = 30 ;433
buttonModeY = 160 ;50
buttonModeWidth = 221
buttonModeHeight = 20
buttonModeHeight = 14 ;20
buttonModeTextYoffset = 3;6
buttonModeTextXoffset = 5
mov ebx, buttonModeX*65536 + buttonModeWidth ;X + Width
mov ecx, buttonModeY*65536 + buttonModeHeight ;Y + Height
@ -773,21 +1229,73 @@ draw_window:
mov edx, 0xAABBCC
mcall 13
;draw text for button Mode
mov ebx, (buttonModeX+buttonModeTextXoffset) * 65536 + (buttonModeY+6) ;(x, y)
mov ebx, (buttonModeX+buttonModeTextXoffset) * 65536 + (buttonModeY+buttonModeTextYoffset) ;(x, y)
mov ecx, 0x000000
call setTextModeMenu
mov esi, valueModeMenuSize
mcall 4
mov ebx, (buttonModeX+buttonModeWidth-12) * 65536 + (buttonModeY+6)
mov ebx, (buttonModeX+buttonModeWidth-12) * 65536 + (buttonModeY+buttonModeTextYoffset)
mov ecx, 0x80FFFFFF
mov edx, symbolDownArrow
mcall 4
;êíîïêà âûáîðà ãîðÿ÷åé êëàâèøè
buttonHotKeyX = 280-10
buttonHotKeyWidth = 90
mov edx, 0x80000009 ;óäàëÿåì
mcall 8
cmp byte[mode], 49 ;ðèñóåì âûáîð êëàâèøè, òîëüêî åñëè mode > 1
jbe @f
;ðèñóåì íîâóþ
push eax ebx ecx edx esi
mov ebx, buttonHotKeyX*65536 + buttonHotKeyWidth ;X + Width
mov ecx, buttonModeY*65536 + buttonModeHeight ;Y + Height
mov edx, 0x00000009 ;button id
mov esi, 0x00FFFFFF ;color button
mcall 8
pop esi edx ecx ebx eax
;òåêñò ïîäñêàçêè äëÿ ãîðÿ÷åé êëàâèøè
mov ebx, (buttonHotKeyX+buttonModeTextXoffset) * 65536 + (buttonModeY+buttonModeTextYoffset) ;(x, y)
mov ecx, 0x80224466
call setTextForHotKey
mov esi, valueModeMenuSize
mcall 4
;çàãîëîâîê
push eax ebx ecx edx edi esi
mov ebx, buttonHotKeyX * 65536 + (buttonModeY-11)
mov ecx, 0x80224466
mov edx, hkCaption
mov esi, 3
mcall 4
pop esi edi edx ecx ebx eax
@@:
;îòîáðàæàåì íàñòðîéêó ðàäèóñà äåéñòâèÿ æåñòà, òîëüêî åñëè âûáðàí ðåæèì 3
cmp byte[mode], 51
jne @f
;çàãîëîâîê
push eax ebx ecx edx edi esi
mov ebx, (buttonHotKeyX + buttonHotKeyWidth + 20) * 65536 + (buttonModeY-11)
mov ecx, 0x80224466
mov edx, radiusCaption
mov esi, 3
mcall 4
pop esi edi edx ecx ebx eax
invoke edit_box_draw, editRadius
@@:
call draw_super_text
LineLength = 62
mov ebx, 40 * 65536 + 36 ; draw info text with function 4 (x, y)
;xor ecx, ecx
;mov cl, 1 ;byte[mysize]
;shl ecx, 24
;add ecx, 0x224466
;or ecx, 0x00224466 ;80224466
mov ecx, 0x224466
mov edx, text
mov esi, LineLength
mov eax, 4
@ -805,6 +1313,79 @@ draw_window:
ret
hkSymbol: db 0, 0
setTextForHotKey:
push eax
mov al, byte[hkSymbol]
cmp al, 0
jne @f
mov edx, hkHint
mov dword[hkSize], 5 ;çíà÷åíèå ïî óìîë÷àíèþ SPACE ;shift
jmp setTextForHotKey.end
@@:
cmp al, 1
jne @f
mov edx, hkAlt
mov dword[hkSize], 3
jmp setTextForHotKey.end
@@:
cmp al, 2
jne @f
mov edx, hkShift
mov dword[hkSize], 5
jmp setTextForHotKey.end
@@:
cmp al, 3
jne @f
mov edx, hkCtrl
mov dword[hkSize], 4
jmp setTextForHotKey.end
@@:
cmp al, 32
jne @f
mov edx, hkSpace
mov dword[hkSize], 5
jmp setTextForHotKey.end
@@:
cmp al, 96 ;'`'
je setTextForHotKey.symb
cmp al, 126 ;'~'
je setTextForHotKey.symb
cmp al, 48 ;'0'
jb @f
cmp al, 57 ;'9'
ja @f
.symb:
mov edx, hkSymbol
mov dword[hkSize], 1
jmp setTextForHotKey.end
@@:
cmp al, 97 ;'a'
jb @f
cmp al, 122 ;'z'
ja @f
;jmp setTextForHotKey.symb
mov edx, hkSymbol
mov dword[hkSize], 1
jmp setTextForHotKey.end
@@:
cmp al, 65 ;'A'
jb @f
cmp al, 90 ;'Z'
ja @f
;jmp setTextForHotKey.symb
mov edx, hkSymbol
mov dword[hkSize], 1
jmp setTextForHotKey.end
@@:
mov word[hkSymbol], 0 ;åñëè æå ïîïàëî ÷òî-òî íåèçâåñòíîå, òî ñîòð¸ì åãî
mov edx, hkHint
mov dword[hkSize], 5 ;shift or space - çíà÷åíèå ïî óìîë÷àíèþ
.end:
pop eax
ret
setTextModeMenu:
cmp byte[mode], 48
@ -831,6 +1412,49 @@ setTextModeMenu:
ret
saveKey:
cmp word[hkSymbol], 0
je .default
cmp byte[hkSymbol], 1
je .alt
cmp byte[hkSymbol], 2
je .shift
cmp byte[hkSymbol], 3
je .ctrl
cmp byte[hkSymbol], 32
je .space
.other:
mov esi, hkSymbol
mov byte[esi+1], 0
mov dword[hkSize], 1
jmp .end
.space:
mov esi, hkSpace
mov dword[hkSize], 5
jmp .end
.ctrl:
mov esi, hkCtrl
mov dword[hkSize], 4
jmp .end
.alt:
mov esi, hkAlt
mov dword[hkSize], 3
jmp .end
.default:
.shift:
mov esi, hkShift
mov dword[hkSize], 5
.end:
mov ebx, hkSize ;óêàçàòåëü íà dword[hkSize]
call copyParam
ret
align 16
@IMPORT:
@ -883,6 +1507,10 @@ head_f_i:
err_message_found_lib1 db '<27>¥ ­ ©¤¥­  ¡¨¡«¨®â¥ª  ',39,'kmenu.obj',39,0
err_message_import1 db 'Žè¨¡ª  ¯à¨ ¨¬¯®à⥠¡¨¡«¨®â¥ª¨ ',39,'kmenu',39,0
hkCaption: db 'Š« ¢¨è :',0
;hkHint: db '<27> ¦¬¨â¥ «î¡ãî ª« ¢¨èã',0
radiusCaption: db '<27> ¤¨ãá:',0
else ;èíà÷å àíãëèéñêèé òåêñò
text db "This is a Hot Angles Configurator. "
@ -917,13 +1545,29 @@ head_f_i:
err_message_found_lib1 db 'Could not find library ',39,'kmenu.obj',39,0
err_message_import1 db 'Error importing library ',39,'kmenu',39,0
hkCaption: db 'Key:',0
;hkHint: db 'press any key',0
radiusCaption: db 'Radius:',0
end if
hkAlt: db 'Alt',0
hkShift: db 'Shift',0
hkCtrl: db 'Ctrl',0
hkSpace: db 'Space',0
hkHint: db '?',0
hkSize: rd 1 ;ðàçìåð ñòðîêè ñ èìåíåì êëàâèøè
draw_super_text:
push eax ebx ecx edx edi esi
mov ecx, 0
mov ch, byte[mysize]
shl ecx, 16
add ecx, 0x224466
mov ebx, Otstup * 65536 + 74 ; draw info text with function 4 (x, y)
mov ecx, 0x224466
;mov ecx, 0x224466
mov eax, superText.lu
mov edx, eax
mov esi, superTextSize
@ -950,6 +1594,12 @@ draw_super_text:
mov esi, 3
mcall 4
; mov ebx, buttonHotKeyX * 65536 + (buttonModeY-11)
; or ecx, 0x80000000
; mov edx, hkCaption
; mov esi, 3
; mcall 4
pop esi edi edx ecx ebx eax
ret
@ -1027,6 +1677,72 @@ copyPath:
ret
IntToStr: ;in esi - ñòðîêà; eñx - ÷èñëî
push eax ecx edx esi
cmp ecx, 0
jne @f
mov byte[esi], 48 ; '0'
inc esi
jmp .end
@@:
mov eax, ecx
mov ecx, 10
.next:
mov edx, 0
div ecx
add edx, 48
mov byte[esi], dl
inc esi
cmp eax, 0
je .end
jmp .next
.end:
mov byte[esi], 0 ;êëàä¸ì çàâåðøàþùèé íîëü
pop esi edx ecx eax
call reverseString ;äåëàåì ðåâåðñ ñòðîêè
ret
;âõîä: esi - óêàçàòåëü íà ñòðîêó
reverseString:
push eax esi edi
mov al, byte[esi] ;åñëè ñòðîêà ïóñòàÿ òî âûõîäèì ðåâåðñ äåëàòü íå íàäî
cmp al, 0
je reverseString.end
mov edi, esi ;èíà÷å íàéä¸ì ïîçèöèþ ïîñëåäíåãî ñèìâîëà ñòðîêè è ïîëîæèì å¸ â edi
.go_last_symbol:
mov al, byte[edi+1]
cmp al, 0
je @f
inc edi
jmp reverseString.go_last_symbol
@@:
push ebx
.rev:
cmp esi, edi
jae @f
;ìåíÿåì ìåñòàìè ñèìâîëû â öèêëå
mov al, byte[edi]
mov bl, byte[esi]
mov byte[edi], bl
mov byte[esi], al
inc esi
dec edi
jmp reverseString.rev
@@:
pop ebx
.end:
pop edi esi eax
ret
align 4
but_open_dlg:
pushad
@ -1117,6 +1833,7 @@ editLU edit_box 180-buttonW,Otstup+buttonW,85, 0xffffff, 0x6a9480, 0, 0xAABBCC
editLD edit_box 180-buttonW,Otstup+buttonW,120, 0xffffff, 0x6a9480, 0, 0xAABBCC, 0, edMaxSize, dataBuffer.2, mouse_dd, 0, edMax, edMax
editRU edit_box 180-buttonW,240,85, 0xffffff, 0x6a9480, 0, 0xAABBCC, 0, edMaxSize, dataBuffer.3, mouse_dd, 0, edMax, edMax
editRD edit_box 180-buttonW,240,120, 0xffffff, 0x6a9480, 0, 0xAABBCC, 0, edMaxSize, dataBuffer.4, mouse_dd, 0, edMax, edMax
editRadius edit_box 40,(buttonHotKeyX + buttonHotKeyWidth + 20),buttonModeY, 0xffffff, 0x6a9480, 0, 0xAABBCC, 0, 4, radiusBuffer.data, mouse_dd, ed_figure_only, edMax, edMax
align 4
import_libkmenu:
@ -1142,8 +1859,16 @@ dd 0,0
akmenuitem_delete db 'kmenuitem_delete',0
akmenuitem_draw db 'kmenuitem_draw',0
mouse_dd dd ?
;mouse_dd dd ?
sc system_colors
mouse_dd rd 1
sizeStyle: rb 1 ;ðàçìåð òåêñòà è îñòàëüíûõ ýëåìåíòîâ îêíà
mysize: rb 1 ;rd 1
radiusBuffer: ;áóôåð äëÿ ïîëÿ ðàäèóñà æåñòà
.data: rb 6
.size: rd 1
radiusBufferEnd:
button_press rd 0 ;for kmenu
@ -1156,6 +1881,10 @@ rb 1024
procinfo process_information
pi rb 1024
keyscan: rb 1
keystr:
.data: rb 4 ;ñòðîêà ñî çíà÷åíèåì ñêàíêîäà àêòèâàöèîííîé êëàâèøè
.size: rd 1 ;ðàçìåð ñîäåðæèìîãî ñòðîêè áåç ïîñëåäíåãî íóëÿ
dataBuffer:
.1: rb 512

View File

@ -2,7 +2,7 @@
; Hot Angles ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
; Compile with FASM
; Version 0.3.6: Oct 9, 2018
; Version 0.3.7: Oct 14, 2018
; Copyright (c) 2018, Efremenkov Sergey aka TheOnlyMirage
; All rights reserved.
@ -31,6 +31,7 @@ org 0x0 ;
UNLOCKd = 0
LOCKd = 1
SUPERLOCKd = 2
; çàãîëîâîê
db 'MENUET01' ;ìàãè÷åñêèé èäåíòèôèêàòîð
@ -118,9 +119,11 @@ hotkey:
cmp ah, byte[keyActivate] ;åñëè íàæàòà íàøà ãîðÿ÷àÿ êëàâèøà
jne @f
;for mode 3 [
;проверки для mode 3
cmp byte[state], SUPERLOCKd
je hotkey.end
cmp byte[keyState], 1
je hotkey.e
je hotkey.end
push eax ebx
mcall 37, 0 ;çàïîìèíàåì òåêóùèå(íà÷àëüíûå) êîîðäèíàòû ìûøè
@ -132,9 +135,6 @@ hotkey:
mov byte[keyState], 1
mov byte[state], UNLOCKd
.e:
;]
;mov byte[state], UNLOCKd
jmp hotkey.end
@@:
push edx
@ -143,8 +143,7 @@ hotkey:
add dl, 128
cmp ah, dl ;åñëè îòïóùåíà íàøà ãîðÿ÷àÿ êëàâèøà
jne @f ;hotkey.end
;mov ecx, 0 ;ñòðîêè äëÿ îòëàäêè è òåñòà
;call run_command
mov byte[keyState], 0
mov byte[state], LOCKd
@@:
@ -247,53 +246,56 @@ run_command:
cmp byte[state], UNLOCKd
jne run_command.end
; cmp byte[mode], 2 ;åñëè ðåæèì âòîðîé
; jne @f
push eax ebx ecx
cmp ecx, 0
jne @f
mov eax, dword[newData.lu]
mov eax, apps.path1 ;dword[newData.lu]
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, dword[newData.ld]
mov eax, apps.path2 ;dword[newData.ld]
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, dword[newData.ru]
mov eax, apps.path3 ;dword[newData.ru]
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 .end_set_path
mov eax, dword[newData.rd]
jne .set0 ;.end_set_path
mov eax, apps.path4 ;dword[newData.rd]
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
.end_set_path:
;ïàðàìåòðû
;mov dword[struct.adr],
;åñëè àäðåñ 0, òî íè÷åãî íå äåëàòü
cmp dword[struct70.path_adr], 0
jne .next
;mov eax, testData.ld
;mov dword[struct70.path_adr], eax
.set0:
;mov dword[struct70.path_adr], 0
;mov dword[struct70.param_adr], 0
jmp @f
.next:
;êîíåö êîäà äëÿ çàìåíû
.end_set_path:
mcall 70, struct70
@@:
mov byte[state], LOCKd
;mov byte[keyState], 0
pop ecx ebx eax
.end:
ret
@ -303,15 +305,106 @@ struct70: ;
.mask dd 0
.param_adr dd 0 ; óêàçàòåëü íà ASCIIZ-ñòðîêó ñ ïàðàìåòðàìè
.other dd 0, 0
.path db 0 ; "/rd/1/TINYPAD",0 ; ïóòü
.path_adr dd 0 ;testData.lu
.path db 0
.path_adr dd 0 ; указатель на строку с путём
;èìÿ êîíôèãóðàöèîííîãî ôàéëà
fileName: db 'SETTINGS/HOTANGLES.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], 8
je trim
cmp byte[esi], 32
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
@ -321,12 +414,22 @@ loadConfig:
add edx, eax ;èíà÷å êëàä¸ì â edx - àäðåñ êîíöà ôàéëà
mov byte[mode], 0
cmp byte[eax], '0' ;121 ;'y' ;åñëè ïàðàìåòð àêòèâíîñòè ïðèëîæåíèÿ èìååò ñòàòóñ: íå àêòèâíî
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
@ -337,72 +440,290 @@ loadConfig:
mov byte[mode], 3
jmp loadConfig.modeEnd
@@:
mov byte[mode], 1 ;âî âñåõ îñòàëüíûõ ñëó÷àÿõ - êëàññè÷åñêèé ðåæèì
mov byte[mode], 0 ;во всех остальных случаях - отключено
jmp loadConfig.exit
.modeEnd:
push edi
push esi
; ñîõðàíÿåì â edi óêàçàòåëü íà íà÷àëî òàáëèöû àäðåñîâ íàøèõ êîìàíä
mov edi, newData
; ñîõðàíÿåì àäðåñà ñòðîê è äîáàâëÿåì 0 â êîíöå
mov esi, eax
.block:
inc esi
cmp byte[esi], 10 ;åñëè î÷åðåäíîé êîä ñèìâîëà 10 èëè 13, òî ïðîïóñêàåì ñèìâîëû
je loadConfig.propusk ;äî ïåðâîãî îòëè÷íîãî îò íèõ
cmp byte[esi], 13
je loadConfig.propusk
;идём до конца этой строки
call gotoEndString
;находим начало следующей строки
call gotoStartString
; ñèìâîë îòëè÷åí îò ïåðåíîñà ñòðîêè è âîçâðàòà êàðåòêè - åñëè ýòî íà çíàê ìèíóñ, òî çàïîìèíàåì åãî
mov dword[edi], esi
add edi, 4
push esi edi
;èä¸ì äî êîíöà ýòîé ñòðîêè: ïîêà íå âñòðåòèì î÷åðåäíîé 10, 13, 0 èëè file end
.while:
inc esi
cmp esi, edx ;òóò áóäåò ïðîáëåìà - òê ôàéë çàêîí÷èëñÿ, à íóëÿ íå áûëî !!! èñïðàâèòü
jae loadConfig.fileend
cmp byte[esi], 10
je loadConfig.ura
cmp byte[esi], 0
je loadConfig.ura
cmp byte[esi], 13
jne loadConfig.while
.ura:
mov byte[esi], 0
;считываем путь для левого верхнего угла
mov esi, apps.path1
mov edi, apps.param1
call readPath
call gotoStartString ;находим начало следующей строки
;cmp byte[esi-1], '-'
;jne @f
push esi ;åñëè ýòî áûë çíàê ìèíóñ, òî ìåíÿåì àäðåñ íà íîëü
mov esi, dword[edi-4]
cmp byte[esi], '-'
jne @f
cmp byte[esi+1], 0
jne @f
mov dword[edi-4], 0
@@:
pop esi
;считываем путь для левого нижнего угла
mov esi, apps.path2
mov edi, apps.param2
call readPath
call gotoStartString
cmp edi, newDataEnd ;newData.end ;åñëè âñÿ òàáëèöà àäðåñîâ çàïîëíåíà, òî âûõîäèì èç öèêëà
jb loadConfig.block
.fileend:
;считываем путь для правого верхнего угла
mov esi, apps.path3
mov edi, apps.param3
call readPath
call gotoStartString
pop esi
pop edi
;считываем путь для правого нижнего угла
mov esi, apps.path4
mov edi, apps.param4
call readPath
call gotoStartString
jmp loadConfig.end
;call checkAdr ;проверим строки на '-' и пустоту и выставим битовую маску
call checkPathAdr
.propusk:
mov byte[esi], 0
jmp loadConfig.block
pop edi esi
;пропускаем строку с именем клавиши
call gotoEndString
call gotoStartString
;считываем сканкод активационной клавиши
;call readKey
;call gotoEndString
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
;readKey:
;читаем клавишу и выходим
; cmp dword[eax], 'Ctrl'
; jne .notCtrl
; mov byte[keyActivate], 3
; jmp .end
;.notCtrl:
; cmp dword[eax], 'Shif'
; jne .notShift
; mov byte[keyActivate], 2
; jmp .end
;.notShift:
; cmp dword[eax], 'Spac'
; jne .notSpace
; mov byte[keyActivate], 32
; jmp .end
;.notSpace:
; cmp word[eax], 'Al'
; jne .notAlt
; mov byte[keyActivate], 1
; jmp .end
;.notAlt:
;убедимся, что там 1 символ, а не строка
; cmp byte[eax+1], 10
; je .oneSymb
; cmp byte[eax+1], 0
; je .oneSymb
; cmp byte[eax+1], 13
; je .oneSymb
; jmp .default ;в любом другом случае ошибка конфига - выход
;.oneSymb:
;проверяем, что символ разрешённый !!! доделать
;добавляем символ как есть
; push ebx
; ;xor ebx, ebx
; mov bl, byte[eax]
; mov byte[keyActivate], bl
; pop ebx
; jmp .end
;.default:
; mcall -1
; ;mov byte[keyActivate], 2
;.end:
; 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
checkAdr:
push eax ebx
xor eax, eax
mov ebx, apps.path1
cmp byte[ebx], '-'
jne @f
inc eax
@@:
mov ebx, apps.path2
cmp byte[ebx], '-'
jne @f
add eax, 2
@@:
mov ebx, apps.path3
cmp byte[ebx], '-'
jne @f
add eax, 4
@@:
mov ebx, apps.path4
cmp byte[ebx], '-'
jne @f
add eax, 8
@@:
mov ebx, apps.param1
cmp byte[ebx], '-'
jne @f
add eax, 16
@@:
mov ebx, apps.param2
cmp byte[ebx], '-'
jne @f
add eax, 32
@@:
mov ebx, apps.param3
cmp byte[ebx], '-'
jne @f
add eax, 64
@@:
mov ebx, apps.param4
cmp byte[ebx], '-'
jne @f
add eax, 128
@@:
mov byte[apps.bits], al
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
;Âûíåñòè êîä íèæå â îòäåëüíûé îáùèé ìîäóëü
@ -474,7 +795,7 @@ copyKill:
;MODE 3
init03:
mov dword[radius2], 100; 10*10
;mov dword[radius2], 100; 10*10
mov dword[backAdr], mode03
call setHotKey
mode03:
@ -496,6 +817,9 @@ mouse03:
cmp byte[state], LOCKd ;åñëè óãîë çàáëîêèðîâàí, òî îáíîâèì íà÷àëüíûå êîîðäèíàòû
je mouse03.updateCoord
cmp byte[state], SUPERLOCKd ;если действие было выполнено и получили блокировку, то ждём отпускания клавиши активации
je @f
call checkPointInCircle ;èíà÷å åñëè ïðåîäîëåëè ðàäèóñ àêòèâàöèè, òî âûçûâàåì äåéñòâèå íóæíîãî óãëà
jmp @f
.updateCoord:
@ -589,7 +913,7 @@ activateCorner:
mov ecx, 1
call run_command
mov byte[keyState], 0
mov byte[state], LOCKd
mov byte[state], SUPERLOCKd
jmp activateCorner.end
.leftup:
@ -597,7 +921,7 @@ activateCorner:
mov ecx, 0
call run_command
mov byte[keyState], 0
mov byte[state], LOCKd
mov byte[state], SUPERLOCKd
jmp activateCorner.end
.right: ;ïðàâàÿ ñòîðîíà ýêðàíà
@ -610,7 +934,7 @@ activateCorner:
mov ecx, 3
call run_command
mov byte[keyState], 0
mov byte[state], LOCKd
mov byte[state], SUPERLOCKd
jmp activateCorner.end
.rightup:
@ -618,7 +942,7 @@ activateCorner:
mov ecx, 2
call run_command
mov byte[keyState], 0
mov byte[state], LOCKd
mov byte[state], SUPERLOCKd
jmp activateCorner.end
.end:
@ -631,10 +955,6 @@ keyActivate db 41 ;16 ;'Q' ;
keyState db 0 ;0-êëàâèøà íå àêòèâíà, 1 - êëàâèøà àêòèâíà
backAdr rd 1 ;àäðåñ äëÿ âîçâðàòà èç ïðîâåðêè ìûøè
;slotMax dd 0
;selfPID dd 0
;buf db 1024 dup(0)
slotMax rd 1
selfPID rd 1
buf rb 1024
@ -644,14 +964,23 @@ screen:
.width rw 1
.height rw 1
state: rb 1 ;ñîñòîÿíèå: 0=unlock, 1=lock
state: rb 1 ;состояние: 0=unlock, 1=lock, 2=superlock for mode 3
mode: rb 1 ;ðåæèì ðàáîòû ïðèëîæåíèÿ: 0=íå ðàáîòàåò, 1=êëàññè÷åñêèé, 2=ïî ãîðÿ÷åé êëàâèøå
newData: ;òàáëè÷êà àäðåñîâ êîìàíäíûõ ñòðîê
.lu rd 1
.ld rd 1
.ru rd 1
.rd rd 1
newDataEnd:
keystr: rb 4 ;строка со значением сканкода активационной клавиши
radstr: rb 5 ;строка со значением радиуса
apps:
.bits: rb 1
.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:

View File

@ -1,23 +1,31 @@
Hot Angles
Version 0.3.6: Oct 9, 2018
Version 0.3.7: Oct 14, 2018
RU
Комплект утилит (аналог Hot Corners в других ОС) для расширения возможностей рабочего стола пользователя. Название выбрано путём голосования. В комплект входят две утилиты:
@HOTANGLES - основная утилита, позволяющая запускать приложения путём наведения курсора в угол экрана (угол рабочей области);
HACONFIG - утилита конфигуратор, позволяющая настроить действия на каждый угол и активировать/деактивировать эту опцию.
Файл конфигурации: RD/1/SETTINGS/HOTANGLES.CFG (где RD/1/ это тот же SYS - путь к системной директории). Файл состоит из пяти строк:
Файл конфигурации: RD/1/SETTINGS/HOTANGLES.CFG (где RD/1/ это тот же SYS - путь к системной директории). Файл состоит из девяти строк:
1) состояние активности опции (один символ):
1 или y - опция активна, активирован классический режим работы уголков,
2 - опция активна, активирован режим работы по горячей клавише,
3 - опция активна, активирован режим жеста при зажатой активационной клавише,
n или 0 - опция отключена,
любой другой символ - поведение по умолчанию (зависит от версии);
любой другой символ - поведение по умолчанию (зависит от версии), в большинстве версий означает "опция отключена";
2) команда (полное имя приложения) для верхнего левого угла экрана;
3) команда (полное имя приложения) для левого нижнего угла экрана;
4) команда (полное имя приложения) для правого верхнего угла экрана;
5) команда (полное имя приложения) для правого нижнего угла экрана.
5) команда (полное имя приложения) для правого нижнего угла экрана;
6) клавиша активации (для режимов 2 и 3): '0'..'9','a'..'z','A'..'Z',Space,Shift,Alt,Ctrl,'~' (примечание: клавиши Shift,Alt,Ctrl не работают в версии 0.3.7);
7) сканкод клавиши активации (десятичное число, используется @HOTANGLES);
8) радиус срабатывания жеста от начальной точки в момент нажатия клавиши (для mode 3);
9) размер элементов окна конфигуратора:
a - auto, автоматически в зависимости от разрешения экрана;
значение от 1 до 7 - нужный размер на основе размера текста;
s - в зависимости от системных настроек (опция по умолчанию).
Если необходимо настроить только часть углов, а остальные оставить без действия, то в конфигураторе или на нужной строке конфигурационного файла укажите знак минус (символ '-').
Примечание: До версии 0.3.6 включительно файл конфигурации состоял только из 5 первых строк.
Обе утилиты содержат защиту от повторного запуска.
Утилита @HOTANGLES добавлена в автозагрузку ОС.

View File

@ -1,5 +1,9 @@
1
0
/rd/1/HACONFIG
/rd/1/HACONFIG
/rd/1/HACONFIG
/rd/1/HACONFIG
Space
57
10
s