kolibrios-gitea/programs/other/ha/HACONFIG.ASM
theonlymirage 5b0655cd78 Hot Angles: Little code cleaning
git-svn-id: svn://kolibrios.org@7460 a494cfbc-eb01-0410-851d-a64ba20cac60
2018-10-14 03:49:17 +00:00

1894 lines
50 KiB
NASM
Raw Blame History

This file contains invisible Unicode characters

This file contains invisible Unicode characters that are indistinguishable to humans but may be processed differently by a computer. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
; Hot Angles Config ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
; 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.
; --------------------------------------------------------------------------------------
;P.S. Êîäó òðåáóåòñÿ îïòèìèçàöèÿ è äîðàáîòêà (ñì. òåìó ôîðóìà)
format binary as "" ; Binary file format without extension
use32 ; Tell compiler to use 32 bit instructions
org 0 ; the base address of code, always 0x0
; Çàãîëîâîê èñïîëíÿåìîãî ôàéëà Êîëèáðè ÎÑ
db 'MENUET01'
dd 1
dd START
dd I_END
dd MEM
dd STACKTOP
dd 0, 0
; Íà÷àëî îáëàñòè êîäà
include 'lang.inc' ;ïîääåðæêà ÿçûêîâ ïðè êîìïèëÿöèè
include '../../macros.inc'
include '../../proc32.inc'
include '../../dll.inc'
include '../../develop/libraries/box_lib/trunk/box_lib.mac' ;êîìïîíåíòû checkBox è editBox
include '../../develop/libraries/box_lib/load_lib.mac' ;ìàêðîñ äëÿ çàãðóçêè áèáëèîòåê
@use_library
KMENUITEM_NORMAL equ 0
KMENUITEM_SUBMENU equ 1
KMENUITEM_SEPARATOR equ 2
Otstup = 30
START:
call copyKill ;ïðîñòåéøàÿ çàùèòà îò çàïóñêà âòîðîé êîïèè ïðèëîæåíèÿ
mcall 68, 11 ;èíèöèàëèçàöèÿ êó÷è
;mcall 48,3,sc,sizeof.system_colors ;ïîëó÷èòü ñèñòåìíûå öâåòà
mov eax,48 ;ïîëó÷èòü ñèñòåìíûå öâåòà
mov ebx,3
mov ecx, sc
mov edx, sizeof.system_colors
mcall
stdcall dll.Load, @IMPORT
or eax, eax
jnz exit
mov eax,40 ;óñòàíîâèòü ìàñêó äëÿ îæèäàåìûõ ñîáûòèé
mov ebx,0x27 ;ñèñòåìà áóäåò ðåàãèðîâàòü òîëüêî íà ñîîáùåíèå î ïåðåðèñîâêå, íàæàòà êíîïêà, îïðåäåë¸ííàÿ ðàíåå, ñîáûòèå îò ìûøè (÷òî-òî ñëó÷èëîñü - íàæàòèå íà êíîïêó ìûøè èëè ïåðåìåùåíèå; ñáðàñûâàåòñÿ ïðè ïðî÷òåíèè)
mcall
load_libraries l_libs_start,load_lib_end ;çàãðóçêà áèáëèîòåê(è)
stdcall [OpenDialog_Init],OpenDialog_data ;ïîäãîòîâêà äèàëîãà
;mode menu
stdcall [kmenu_init], sc ;kmenu initialisation
stdcall [ksubmenu_new]
mov [modeMenu], eax
stdcall [kmenuitem_new], KMENUITEM_NORMAL, valueModeMenu0, 110
stdcall [ksubmenu_add], [modeMenu], eax
stdcall [kmenuitem_new], KMENUITEM_NORMAL, valueModeMenu1, 111
stdcall [ksubmenu_add], [modeMenu], eax
stdcall [kmenuitem_new], KMENUITEM_NORMAL, valueModeMenu2, 112
stdcall [ksubmenu_add], [modeMenu], eax
stdcall [kmenuitem_new], KMENUITEM_NORMAL, valueModeMenu3, 113
stdcall [ksubmenu_add], [modeMenu], eax
stdcall [kmenuitem_new], KMENUITEM_SUBMENU, valueModeMenu1, [modeMenu]
call loadConfig ;çàãðóæàåì êîíôèãóðàöèþ èç ôàéëà, åñëè íåò - òî âûñòàâëÿåì ïàðàìåòðû ïî óìîë÷àíèþ
call draw_window ;îòðèñîâàòü îêíî ïðèëîæåíèÿ
; Îáðàáîòêà öèêëà ñîáûòèé
event_wait:
mov eax, 10 ; function 10 : wait until event
mcall ; event type is returned in eax
cmp eax, 1 ; Event redraw request ?
je red ; Expl.: there has been activity on screen and
; parts of the applications has to be redrawn.
cmp eax, 2 ; Event key in buffer ?
je key ; Expl.: User has pressed a key while the
; app is at the top of the window stack.
cmp eax, 3 ; Event button in buffer ?
je button ; Expl.: User has pressed one of the
; applications buttons.
invoke edit_box_mouse, editLU ;ïðîâåðêà ñîáûòèé ìûøè äëÿ editBox'îâ
invoke edit_box_mouse, editLD
invoke edit_box_mouse, editRU
invoke edit_box_mouse, editRD
;stdcall [kmainmenu_dispatch_cursorevent], [modeMenu] ;ïðîâåðêà ìûøè äëÿ êîìáîáîêñà
invoke edit_box_mouse, editRadius
jmp event_wait
red: ;îáðàáîòêà ñîáûòèÿ ïåðåðèñîâêè îêíà
call draw_window
jmp event_wait
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.
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
cmp eax, 1
je event_wait
cmp word[hkSymbol], 0
jne event_wait
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
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
@@:
jmp event_wait ; Just read the key, ignore it and jump to event_wait.
button: ; Buttonpress event handler
mov eax,17 ; The button number defined in window_draw
mcall ; is returned to ah.
cmp ah,1 ; button id=1 ?
jne noclose
exit:
mov eax,-1 ; Function -1 : close this program
mcall
noclose:
cmp ah, 2 ;êíîïêà "Ïðèìåíèòü"
jne @f ;butend
call applyButton ;âûçîâ íàøåãî îáðàáîò÷èêà íàæàòèÿ êíîïêè
jmp event_wait
@@:
cmp ah, 4
jne @f
mov byte[editID], 4
call but_open_dlg
jmp event_wait
@@:
cmp ah, 5
jne @f
mov byte[editID], 5
call but_open_dlg
jmp event_wait
@@:
cmp ah, 6
jne @f
mov byte[editID], 6
call but_open_dlg
jmp event_wait
@@:
cmp ah, 7
jne @f
mov byte[editID], 7
call but_open_dlg
jmp event_wait
@@:
cmp ah, 8
jne @f
push eax ebx ecx
mcall 9, pi, -1 ;get window coord
mov eax, dword[pi+34]
add eax, buttonModeX ;+ 5
mov word[coordModeMenu.x], ax
mov eax, dword[pi+38]
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
mov byte[mode], 48 ;'0'
jmp event_wait
@@:
cmp ah, 111
jne @f
mov byte[mode], 49 ;'1'
jmp event_wait
@@:
cmp ah, 112
jne @f
mov byte[mode], 50 ;'2'
jmp event_wait
@@:
cmp ah, 113
jne @f
mov byte[mode], 51 ;'3'
jmp event_wait
@@:
butend:
jmp event_wait ;this is for ignored events, useful at development
;èìÿ êîíôèãóðàöèîííîãî ôàéëà
fileName: db 'SETTINGS/HOTANGLES.CFG', 0
;ñòðóêòóðà äëÿ ñîçäàíèÿ/ïåðåçàïèñè ôàéëà
createFile:
.func dd 2 ;íîìåð ïîäôóíêöèè
.re dd 0, 0 ;çàðåçåðâèðîâàíî
.size dd 0 ;ñêîëüêî áàéò ïèñàòü
.data_adr dd 0 ;óêàçàòåëü íà äàííûå
.path db 0
.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,'Space',13,10,'57',13,10,'10',13,10,'s',13,10
defaultDataSize = 85 ;48+19+4
copyParam: ;êîïèðóåò ïàðàìåòð(êîìàíäó çàïóñêà) â áóôåð (ñì. äàëüøå)
push esi ebx ecx
mov ecx, dword[ebx] ;÷èòàåì ðàçìåð ñòðîêè
cmp ecx, 0 ;ïóñòà ëè ñòðîêà?
jne copyParam.copy ;åñëè íåò, òî ïåðåõîäèì ê êîïèðîâàíèþ ñîäåðæèìîãî ñòðîêè (ê öèêëó)
mov byte[eax], '-' ;åñëè æå ïóñòî, òî çàìåíÿåì ñèìâîëîì ìèíóñ '-'
inc eax
;jmp copyParam.copyEnd ;è âûõîäèì
;äàëåå â íà÷àëå öèêëà ïðîèçîéä¸ò ñðàâíåíèå è âûõîä
.copy: ;êîïèðóåì ñèìâîëû
cmp ecx, 0
je copyParam.copyEnd
mov bl, byte[esi]
mov byte[eax], bl
dec ecx
inc eax
inc esi
jmp copyParam.copy
.copyEnd:
pop ecx ebx esi
ret
addPerenos: ;äîáàâëÿåò ïåðåíîñ ñòðîêè â áóôåð
mov byte[eax], 13
inc eax
mov byte[eax], 10
inc eax
ret
;îáðàáîò÷èê êíîïêè "Ïðèìåíèòü"
applyButton:
push eax ebx ecx
;mov dword[createFile.data_adr], defaultDataForConfig
;mov dword[createFile.size], defaultDataSize
;âû÷èñëèì ðàçìåð ôàéëà êîíôèãóðàöèè â áàéòàõ
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 áàéò äëÿ õðàíåíèÿ ðàçìåðà ýëåìåíòîâ
;cmp dword[keystr.size], 3
;jbe @f
;mcall -1
;@@:
;åñëè çàäàíû ïóñòûå ñòðîêè, òî ìû àâòîìàòè÷åñêè äîáàâëÿåì çíàê ìèíóñ, çíà÷èò ðàçìåð +1 áàéò
cmp dword[editLU.size], 0
jne @f
inc ecx
@@:
cmp dword[editLD.size], 0
jne @f
inc ecx
@@:
cmp dword[editRU.size], 0
jne @f
inc ecx
@@:
cmp dword[editRD.size], 0
jne @f
inc ecx
@@:
;òåïåðü ðàçìåð ôàéëà êîíôèãóðàöèè â ecx
mov dword[createFile.size], ecx ;ïîëîæèì ðàçìåð áàéò â ñòðóêòóðó ñîçäàíèÿ/ïåðåçàïèñè ôàéëà
mcall 68, 12, ecx ;âûäåëÿåì áëîê ïàìÿòè ïîä áóôåð ñîäåðæèìîãî
mov dword[createFile.data_adr], eax ;ñîõðàíÿåì àäðåñ áóôåðà â ñòðóêòóðó
;çàïîëíèì áóôåð ñîäåðæèìîãî:
push ebx ;ñîõðàíÿåì âûáðàííûé ðåæèì
mov bl, byte[mode]
mov byte[eax], bl
pop ebx
inc eax
call addPerenos
push esi ebx
call UpdateEditsSizes ;îáíîâèòü ðàçìåðû òåêñòà â edit'àõ
mov esi, dataBuffer.1 ;editLU.text
mov ebx, dataBuffer.size1 ;editLU.size
call copyParam
call addPerenos ;äîáàâëÿåì ïåðåíîñ ñòðîêè
mov esi, dataBuffer.2
mov ebx, dataBuffer.size2
call copyParam
call addPerenos ;äîáàâëÿåì ïåðåíîñ ñòðîêè
mov esi, dataBuffer.3
mov ebx, dataBuffer.size3
call copyParam
call addPerenos ;äîáàâëÿåì ïåðåíîñ ñòðîêè
mov esi, dataBuffer.4
mov ebx, dataBuffer.size4
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
mov ebx, createFile
mcall 70
cmp eax, 0
je .end
;èíà÷å çäåñü íóæíî âûâåñòè îêíî ñ îøèáêîé !!!
.end:
mcall 68, 13, dword[createFile.data_adr] ;îñâîáîæäàåì ïàìÿòü ïîä áóôåð
call finishHotAnglesApp ;çàâåðøàåì ðàáîòó âñåõ êîïèé ñåðâèñà @HOTANGLES
call loadConfig ;ïåðåçàãðóæàåì ôàéë êîíôèãà
call draw_window ;ïåðåðèñîâûâàåì îêíî
call startHotAnglesApp ;ïåðåçàïóñêàåì @HOTANGLES
pop ecx ebx eax
ret
compareBytes2:
push edi esi ecx ebx
xor eax, eax
mov ecx, 10 ;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
finishHotAnglesApp:
;íàõîäèì âñå êîïèè ïðèëîæåíèÿ ïî èìåíè è çàâåðøàåì èõ
push eax ebx ecx esi edi
;óêàçàòåëè, êîòîðûå íèêîãäà íå ìåíÿþòñÿ:
mov esi, startAppData.file_name ;ïåðâàÿ ñòðîêà - èñêîìîå èìÿ ïðèëîæåíèÿ
mov edi, buf ;âòîðàÿ ñòðîêà - èìÿ òåêóùåãî ñëîòà
add edi, 10
mov ecx, 1
@@:
mcall 9, buf, ecx ;ïîëó÷àåì äàííûå î÷åðåäíîãî ñëîòà
mov dword[slotMax], eax
call compareBytes2 ;ñðàâíèâàåì èìÿ
cmp eax, 0
jne finishHotAnglesApp.next ;åñëè íå ñîâïàëî, òî ïåðåõîäèì íà ñëåäóþùèé ñëîò
mcall 18, 2, ecx ;èíà÷å çàâåðøàåì ñëîò
.next:
inc ecx
cmp ecx, dword[slotMax]
ja @f
jmp @b
@@:
pop edi esi ecx ebx eax
ret
startHotAnglesApp:
;çàïóñêàåì ïðèëîæåíèå çàíîâî
push eax ebx
mcall 70, startAppData
cmp eax, 0
ja @f ;åñëè eax>0, òî óñïåøíî çàïóùåíî
;!!! èíà÷å òóò ïå÷àòàåì îøèáêó
@@:
pop ebx eax
ret
startAppData:
.subfunction dd 7
.flags dd 0
.param dd 0
.rezerv dd 0, 0
.full_name db '/rd/1/'
.file_name db '@HOTANGLES', 0
UpdateEditsSizes:
push eax
mov eax, dword[editLU.size]
mov dword[dataBuffer.size1], eax
mov eax, dword[editLD.size]
mov dword[dataBuffer.size2], eax
mov eax, dword[editRU.size]
mov dword[dataBuffer.size3], eax
mov eax, dword[editRD.size]
mov dword[dataBuffer.size4], eax
mov eax, dword[editRadius.size]
mov dword[radiusBuffer.size], eax
pop eax
ret
fileAdr dd 0
loadConfig:
push eax ebx ecx edx
mcall 68, 27, fileName ;çàãðóæàåì êîíôèãóðàöèîííûé ôàéë â ÎÇÓ
mov dword[fileAdr], eax ;ñîõðàíÿåì àäðåñ áëîêà ïàìÿòè ôàéëà
cmp eax, 0
je loadConfig.default ;åñëè ôàéëà êîíôèãóðàöèè íåò, òî ñòàâèì íàñòðîéêè ïî óìîë÷àíèþ
;èíà÷å äàííûå çàãðóæåíû â ÎÇÓ, ðàçìåð â edx
cmp edx, 0 ;åñëè ôàéë ïóñò, â í¸ì íåò äàííûõ, òî ñòàâèì íàñòðîéêè ïî óìîë÷àíèþ
je loadConfig.default
.start:
add edx, eax ;êëàä¸ì â edx - àäðåñ êîíöà êîíôèã.äàííûõ
.chStart:
push ebx
mov bl, byte[eax]
cmp bl, 48 ; åñëè çíà÷åíèå âûõîäèò çà äîïóñòèìûå ïðåäåëû, òî ïðîâåðÿåì íà 'n' (äëÿ ñîâìåñòèìîñòè)
jb loadConfig.checkN
cmp bl, 51
ja loadConfig.checkN
mov byte[mode], bl ;èíà÷å óñòàíàâëèâàåì ýòîò ðåæèì êàê åñòü
jmp loadConfig.modeEnd ;è èä¸ì äàëüøå
.checkN:
cmp bl, 'n' ;åñëè n - òî ðåæèì "îòêëþ÷åíî"
jne @f
mov byte[mode], 48 ;'0'
jmp loadConfig.modeEnd
@@:
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 ;êîìàíäà äëÿ óäîáñòâà îòëàäêè è ïîèñêà îøèáîê
;êîïèðóåì ñîäåðæèìîå ñòðîê â áóôåð
push edi esi ecx ebx eax
;èíèöèàëèçèðóåì óêàçàòåëè íà àäðåñà áóôåðà ñòðîêè è å¸ ðàçìåðà
mov edi, dataBuffer.1
mov esi, dataBuffer.size1
;ecx - ñ÷¸ò÷èê áàéò â ñòðîêå
.block:
xor ecx, ecx ;îáíóëÿåì ñ÷¸ò÷èê
inc eax
cmp byte[eax], 10 ;åñëè î÷åðåäíîé êîä ñèìâîëà 10 èëè 13, òî ïðîïóñêàåì ñèìâîëû
je loadConfig.block ;äî ïåðâîãî îòëè÷íîãî îò íèõ
cmp byte[eax], 13
je loadConfig.block
; ñèìâîë îòëè÷åí îò ïåðåíîñà ñòðîêè è âîçâðàòà êàðåòêè - íà÷èíàåì êîïèðîâàòü îòñþäà â áóôåð
mov bl, byte[eax]
mov byte[edi], bl
inc edi
inc eax
inc ecx ;óâåëè÷èâàåì ñ÷¸ò÷èê ñèìâîëîâ â ñòðîêå
;èä¸ì äî êîíöà ýòîé ñòðîêè: ïîêà íå âñòðåòèì î÷åðåäíîé 10, 13, 0 èëè file end
.while: ;è êîïèðóåì âñ¸ â áóôåð
cmp eax, edx ;ïðîâåðÿåì çàêîí÷èëñÿ ëè ôàéë, à êîíöà ñòðîêè íå áûëî !!!
ja loadConfig.ura
cmp byte[eax], 10
je loadConfig.ura
cmp byte[eax], 0
je loadConfig.ura
cmp byte[eax], 13
je loadConfig.ura
mov bl, byte[eax]
mov byte[edi], bl
inc edi
inc eax
inc ecx
cmp ecx, 511
jae loadConfig.ura
jmp loadConfig.while
.ura:
mov byte[edi], 0 ;êëàä¸ì çàâåðøàþùèé 0 â ñòðîêó
mov dword[esi], ecx ;ñîõðàíÿåì ðàçìåð ñòðîêè
add esi, 4 ;ïåðåõîäèì íà ðàçìåð ñëåäóþùåãî áóôåðà
sub edi, ecx ;ïåðåõîäèì íà ñëåäóþùèé áóôåð
add edi, 512
;xor ecx, ecx ;îáíóëÿåì ðàçìåð ñòðîêè
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
.default:
mov eax, defaultDataForConfig
mov edx, defaultDataSize
jmp loadConfig.start
.end:
mov ecx, dword[fileAdr] ;åñëè ôàéë áûë çàãðóæåí, òî
cmp ecx, 0
je @f
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]
mov dword[editLU.size], eax
mov dword[editLU.pos], eax
mov eax, dword[dataBuffer.size2]
mov dword[editLD.size], eax
mov dword[editLD.pos], eax
mov eax, dword[dataBuffer.size3]
mov dword[editRU.size], eax
mov dword[editRU.pos], eax
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
selfName db 'HACONFIG', 0
selfNameSize = 8 ;äî 11 byte
;
compareBytes:
push edi esi ecx ebx
mov eax, 0 ;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
;
slotMax dd 0
selfPID dd 0
buf db 1024 dup(0)
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
WindowsWidth = 450
WindowsHeight = 195 + 35 - 5
coord: ;êîîðäèíàòû îêíà ïðèëîæåíèÿ
.y dw 0
.x dw 0
draw_window:
;óäàëÿåì êíîïêó, åñëè åñòü
mov edx, 0x80000002
mcall 8
;óäàëÿåì åù¸ 4 êíîïêè åñëè îíè åñòü
mov edx, 0x80000004
mcall 8
mov edx, 0x80000005
mcall 8
mov edx, 0x80000006
mcall 8
mov edx, 0x80000007
mcall 8
mov eax, 12 ; function 12: tell os about windowdraw
mov ebx, 1 ; 1, start of draw
mcall
;îòîáðàçèì îêíî ïî öåíòðó ýêðàíà äëÿ ýòîãî:
mcall 14 ;ïîëó÷èì ðàçìåðû ýêðàíà
mov dword[coord], eax ;ïîëîæèì ðàçìåðû ýêðàíà â êîîðäèíàòû
shr word[coord.x], 1 ;âåðíåå ïîëîæèì èõ ïîëîâèíó
shr word[coord.y], 1
;âû÷èñëÿåì êîîðäèíàòû îêíà, ÷òîáû îêíî áûëî ïî ñåðåäèíå ýêðàíà
sub word[coord.x], WindowsWidth/2
sub word[coord.y], WindowsHeight/2
mov eax, 0 ; function 0 : define and draw window
mov ebx, 0 ; [x start] *65536 + [x size]
mov bx, word[coord.x]
shl ebx, 16
mov bx, WindowsWidth
mov ecx, 0
mov cx, word[coord.y] ; [y start] *65536 + [y size]
shl ecx, 16
mov cx, WindowsHeight
mov edx, 0x14ffffff ; color of work area RRGGBB
; 0x02000000 = window type 4 (fixed size, skinned window)
mov esi, 0x808899ff ; color of grab bar RRGGBB
; 0x80000000 = color glide
mov edi, title
mcall
invoke edit_box_draw, editLU ;ðèñîâàíèå edit box'îâ
invoke edit_box_draw, editLD
invoke edit_box_draw, editRU
invoke edit_box_draw, editRD
;ðèñóåì êíîïêó
buttonAppleY = WindowsHeight-35 ;160
mov ebx, (WindowsWidth-80-Otstup)*65536 + 80 ;êîîðäèíàòà X, øèðèíà êíîïêè
mov ecx, buttonAppleY*65536 + 20 ;êîîðäèíàòà Y, âûñîòà êíîïêè
mov edx, 0x00000002 ;2 ;íîìåð êíîïêè
mov esi, 0x00AABBCC ;öâåò êíîïêè
mcall 8
;ðèñóåì òåêñò êíîïêè
mov ebx, (WindowsWidth-80-Otstup+25-buttonTextXoffset) * 65536 + (buttonAppleY+6) ;êîîðäèíàòû òåêñòà (x, y)
mov ecx, 0xFFFFFF ;áåëûé öâåò òåêñòà
mov edx, buttonText
mov esi, buttonTextSize ;ðàçìåð òåêñòà â ñèìâîëàõ
mcall 4
;ðèñóåì åù¸ 4 êíîïêè äëÿ äèàëîãîâîãî îêíà âûáîðà ôàéëà
;íîìåðà 4,5,6 è 7
buttonH = 14
buttonW = 30
;ëåâûé âåðõíèé óãîë
mov ebx, Otstup*65536 + buttonW ;êîîðäèíàòà X, øèðèíà êíîïêè
mov ecx, 85*65536 + buttonH ;êîîðäèíàòà Y, âûñîòà êíîïêè
mov edx, 0x00000004 ;íîìåð êíîïêè
mov esi, 0x00AABBCC ;öâåò êíîïêè
mcall 8
;ëåâûé íèæíèé óãîë
mov ebx, Otstup*65536 + buttonW ;êîîðäèíàòà X, øèðèíà êíîïêè
mov ecx, 120*65536 + buttonH ;êîîðäèíàòà Y, âûñîòà êíîïêè
mov edx, 0x00000005 ;íîìåð êíîïêè
mov esi, 0x00AABBCC ;öâåò êíîïêè
mcall 8
;ïðàâûé âåðõíèé óãîë
mov ebx, (WindowsWidth-Otstup-buttonW)*65536 + buttonW ;êîîðäèíàòà X, øèðèíà êíîïêè
mov ecx, 85*65536 + buttonH ;êîîðäèíàòà Y, âûñîòà êíîïêè
mov edx, 0x00000006 ;íîìåð êíîïêè
mov esi, 0x00AABBCC ;öâåò êíîïêè
mcall 8
;ïðàâûé íèæíèé óãîë
mov ebx, (WindowsWidth-Otstup-buttonW)*65536 + buttonW ;êîîðäèíàòà X, øèðèíà êíîïêè
mov ecx, 120*65536 + buttonH ;êîîðäèíàòà Y, âûñîòà êíîïêè
mov edx, 0x00000007 ;íîìåð êíîïêè
mov esi, 0x00AABBCC ;öâåò êíîïêè
mcall 8
;ðèñóåì òåêñòû äëÿ ýòèõ 4 êíîïîê
mov ecx, 0xFFFFFF ;áåëûé öâåò òåêñòà
mov edx, commonButtonText ;ñòðîêà òåêñòà
mov esi, commonButtonTextSize ;ðàçìåð òåêñòà â ñèìâîëàõ
;êîîðäèíàòû òåêñòà (x, y)
deltaCommonTextX = 7
deltaCommonTextY = 2
mov ebx, (Otstup+deltaCommonTextX) * 65536 + (85 + deltaCommonTextY)
mcall 4
mov ebx, (Otstup+deltaCommonTextX) * 65536 + (120 + deltaCommonTextY)
mcall 4
mov ebx, (WindowsWidth-Otstup-buttonW+deltaCommonTextX) * 65536 + (85 + deltaCommonTextY)
mcall 4
mov ebx, (WindowsWidth-Otstup-buttonW+deltaCommonTextX) * 65536 + (120 + deltaCommonTextY)
mcall 4
;delete mode button, if it exist
mov edx, 0x80000008
mcall 8
;draw button Mode
buttonModeX = 30 ;433
buttonModeY = 160 ;50
buttonModeWidth = 221
buttonModeHeight = 14 ;20
buttonModeTextYoffset = 3;6
buttonModeTextXoffset = 5
mov ebx, buttonModeX*65536 + buttonModeWidth ;X + Width
mov ecx, buttonModeY*65536 + buttonModeHeight ;Y + Height
mov edx, 0x00000008 ;button id
mov esi, 0x00FFFFFF ;color button
mcall 8
mov ebx, (buttonModeX+2+buttonModeWidth-20)*65536 + (20-2) ;X + Width
mov ecx, (buttonModeY+1)*65536 + buttonModeHeight-2 ;Y + Height
mov edx, 0xAABBCC
mcall 13
;draw text for button Mode
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+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
.newline: ; text from the DATA AREA
mcall
add ebx, 12
add edx, LineLength
cmp byte[edx], 0
jne .newline
mov eax, 12 ; function 12:tell os about windowdraw
mov ebx, 2 ; 2, end of draw
mcall
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
jne @f
mov edx, valueModeMenu0
ret
@@:
cmp byte[mode], 49
jne @f
mov edx, valueModeMenu1
ret
@@:
cmp byte[mode], 50
jne @f
mov edx, valueModeMenu2
ret
@@:
cmp byte[mode], 51
jne @f
mov edx, valueModeMenu3
ret
@@:
mov edx, valueModeMenu1
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:
library box_lib, 'box_lib.obj'
import box_lib,\
edit_box_draw, 'edit_box',\
edit_box_key, 'edit_box_key',\
edit_box_mouse, 'edit_box_mouse',\
init_checkbox, 'init_checkbox2',\
check_box_draw, 'check_box_draw2',\
check_box_mouse, 'check_box_mouse2',\
option_box_draw, 'option_box_draw',\
option_box_mouse, 'option_box_mouse'
commonButtonText db '...', 0 ;òåêñò äëÿ êíîïîê âûçîâà OpenDial
commonButtonTextSize = 3
if lang eq ru ;åñëè ÿçûê ñáîðêè ðóññêèé
text db "Š®­ä¨£ãà â®à Hot Angles ®â¢¥ç ¥â §  ­ áâனªã  ªâ¨¢­ëå 㣫®¢. "
db "<22> áâன⥠¯ à ¬¥âàë ¯®¤ á¥¡ï ¨«¨ ®âª«îç¨â¥ íâã ®¯æ¨î. "
db " ", 0
hed:
title db "Š®­ä¨£ãà â®à ã⨫¨âë Hot Angles", 0
buttonText db "<22>ਬ¥­¨âì", 0
buttonTextSize = 9
buttonTextXoffset = 12
ch_text db '‚ª«îç¨âì/ ªâ¨¢¨à®¢ âì "Hot Angles"', 0
superText:
.lu db 'Š®¬ ­¤  «¥¢®£® ¢¥àå­¥£® 㣫 : ', 0
.ld db 'Š®¬ ­¤  «¥¢®£® ­¨¦­¥£® 㣫 : ', 0
.ru db 'Š®¬ ­¤  ¯à ¢®£® ¢¥àå­¥£® 㣫 :', 0
.rd db 'Š®¬ ­¤  ¯à ¢®£® ­¨¦­¥£® 㣫 : ', 0
superTextSize = 30
valueModeMenuSize = 32
ModeMenu db '<27>¥¦¨¬ à ¡®âë:',0
valueModeMenu0 db '®âª«î祭® ',0
valueModeMenu1 db 'ª« áá¨ç¥áª¨© ०¨¬ ',0
valueModeMenu2 db '०¨¬ £®àï祩 ª« ¢¨è¨ ',0
valueModeMenu3 db '०¨¬ ¦¥áâ  ¯® ª« ¢¨è¥  ªâ¨¢ æ¨¨',0
head_f_i:
head_f_l db '‘¨á⥬­ ï ®è¨¡ª ',0
err_message_found_lib0 db '<27>¥ ­ ©¤¥­  ¡¨¡«¨®â¥ª  ',39,'proc_lib.obj',39,0
err_message_import0 db 'Žè¨¡ª  ¯à¨ ¨¬¯®à⥠¡¨¡«¨®â¥ª¨ ',39,'proc_lib.obj',39,0
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. "
db "Set the parameters bellow for yourself or disable this option."
db " ", 0
hed:
title db "Hot Angles Configurator", 0
buttonText db "Apply", 0
buttonTextSize = 5
buttonTextXoffset = 0
ch_text db 'Activate "Hot Angles"',0 ;ñîïðîâîæäàþùèé òåêñò äëÿ ÷åê áîêñà
superText:
.lu db 'Left up angle command: ', 0
.ld db 'Left down angle command: ', 0
.ru db 'Right up angle command: ', 0
.rd db 'Right down angle command:', 0
superTextSize = 25
valueModeMenuSize = 32
ModeMenu db 'Mode:',0
valueModeMenu0 db 'disabled ',0
valueModeMenu1 db 'classic mode ',0
valueModeMenu2 db 'hot key mode ',0
valueModeMenu3 db 'activation key gesture mode ',0
head_f_i:
head_f_l db 'System error',0
err_message_found_lib0 db 'Could not find library ',39,'proc_lib.obj',39,0
err_message_import0 db 'Error importing library ',39,'proc_lib.obj',39,0
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 eax, superText.lu
mov edx, eax
mov esi, superTextSize
mcall 4
mov ebx, Otstup * 65536 + 109
mov edx, superText.ld
mov esi, superTextSize
mcall 4
mov ebx, 240 * 65536 + 74
mov edx, superText.ru
mov esi, superTextSize
mcall 4
mov ebx, 240 * 65536 + 109
mov edx, superText.rd
mov esi, superTextSize
mcall 4
mov ebx, Otstup * 65536 + (buttonModeY-11)
or ecx, 0x80000000
mov edx, ModeMenu
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
editID db 0
initEBX:
cmp byte[editID], 4
jne @f
mov ebx, dataBuffer.1
ret
@@:
cmp byte[editID], 5
jne @f
mov ebx, dataBuffer.2
ret
@@:
cmp byte[editID], 6
jne @f
mov ebx, dataBuffer.3
ret
@@:
cmp byte[editID], 7
jne @f
mov ebx, dataBuffer.4
ret
@@:
ret
setRESULT:
cmp byte[editID], 4
jne @f
mov dword[dataBuffer.size1], ecx
mov dword[editLU.size], ecx
mov dword[editLU.pos], ecx
ret
@@:
cmp byte[editID], 5
jne @f
mov dword[dataBuffer.size2], ecx
mov dword[editLD.size], ecx
mov dword[editLD.pos], ecx
ret
@@:
cmp byte[editID], 6
jne @f
mov dword[dataBuffer.size3], ecx
mov dword[editRU.size], ecx
mov dword[editRU.pos], ecx
ret
@@:
cmp byte[editID], 7
jne @f
mov dword[dataBuffer.size4], ecx
mov dword[editRD.size], ecx
mov dword[editRD.pos], ecx
ret
@@:
ret
copyPath:
push eax ebx ecx edx ;copy file name path
mov eax, openfile_path ;dword[OpenDialog_data.openfile_path]
call initEBX ;mov ebx, dataBuffer.1 ;.data
mov ecx, 0
@@:
mov dl, byte[eax]
cmp dl, 0 ;byte[eax], 0
je @f
mov byte[ebx], dl
inc eax
inc ebx
inc ecx
jmp @b
@@:
mov byte[ebx], 0
call setRESULT
pop edx ecx ebx eax
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
copy_path open_dialog_name,communication_area_default_path,file_name,0
mov [OpenDialog_data.type],0
stdcall[OpenDialog_Start], OpenDialog_data
cmp [OpenDialog_data.status],2
je @f
cmp [OpenDialog_data.status],0 ;ïîëüçîâàòåëü íàæàë Cancel?
je .end_open
;êîä ïðè óäà÷íîì îòêðûòèè äèàëîãà
call copyPath
jmp .end_open
@@:
;êîä ïðè íå óäà÷íîì îòêðûòèè äèàëîãà
;...
.end_open:
popad
ret
;äàííûå äëÿ äèàëîãà îòêðûòèÿ ôàéëîâ
align 4
OpenDialog_data:
.type dd 0 ;0 - îòêðûòü, 1 - ñîõðàíèòü, 2 - âûáðàòü äèðåêòîðèþ
.procinfo dd procinfo
.com_area_name dd communication_area_name ;+8
.com_area dd 0 ;+12
.opendir_path dd plugin_path ;+16
.dir_default_path dd default_dir ;+20
.start_path dd file_name ;+24 ïóòü ê äèàëîãó îòêðûòèÿ ôàéëîâ
.draw_window dd draw_window ;+28
.status dd 0 ;+32
.openfile_path dd openfile_path ;+36 ïóòü ê îòêðûâàåìîìó ôàéëó
.filename_area dd filename_area ;+40
.filter_area dd Filter
.x:
.x_size dw 420 ;+48 ; Window X size
.x_start dw 10 ;+50 ; Window X position
.y:
.y_size dw 320 ;+52 ; Window y size
.y_start dw 10 ;+54 ; Window Y position
default_dir db '/rd/1',0 ;äèðåêòîðèÿ ïî óìîë÷àíèþ
communication_area_name: db 'FFFFFFFF_open_dialog',0
open_dialog_name: db 'opendial',0
communication_area_default_path: db '/rd/1/File managers/',0
Filter:
dd Filter.end - Filter.1
.1:
;db 'KEX',0
.end:
db 0
mode db 49 ;'1'
modeMenu dd 0
coordModeMenu:
.x dw 100
.y dw 200
align 4
proclib_import: ;îïèñàíèå ýêñïîðòèðóåìûõ ôóíêöèé
OpenDialog_Init dd aOpenDialog_Init
OpenDialog_Start dd aOpenDialog_Start
dd 0,0
aOpenDialog_Init db 'OpenDialog_init',0
aOpenDialog_Start db 'OpenDialog_start',0
system_dir0 db '/sys/lib/'
lib0_name db 'proc_lib.obj',0
lib1_name db 'kmenu.obj',0
symbolDownArrow db 25,0
;library structures
l_libs_start:
lib0 l_libs lib0_name, sys_path, file_name, system_dir0, err_message_found_lib0, head_f_l, proclib_import,err_message_import0, head_f_i
lib1 l_libs lib1_name, sys_path, file_name, system_dir0, err_message_found_lib1, head_f_l, import_libkmenu,err_message_import1,head_f_i
load_lib_end:
edMaxSize = 510 ;òåïåðü ñ íîâûì êîìïîíåíòîì ìîæíî è 511 óêàçàòü
edMax = 0 ;max, size, pos
align 4
editLU edit_box 180-buttonW,Otstup+buttonW,85, 0xffffff, 0x6a9480, 0, 0xAABBCC, 0, edMaxSize, dataBuffer.1, mouse_dd, 0, edMax, edMax ;ed_focus
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:
kmenu_init dd akmenu_init
kmainmenu_draw dd akmainmenu_draw
kmainmenu_dispatch_cursorevent dd akmainmenu_dispatch_cursorevent
ksubmenu_new dd aksubmenu_new
ksubmenu_delete dd aksubmenu_delete
ksubmenu_draw dd aksubmenu_draw
ksubmenu_add dd aksubmenu_add
kmenuitem_new dd akmenuitem_new
kmenuitem_delete dd akmenuitem_delete
kmenuitem_draw dd akmenuitem_draw
dd 0,0
akmenu_init db 'kmenu_init',0
akmainmenu_draw db 'kmainmenu_draw',0
akmainmenu_dispatch_cursorevent db 'kmainmenu_dispatch_cursorevent',0
aksubmenu_new db 'ksubmenu_new',0
aksubmenu_delete db 'ksubmenu_delete',0
aksubmenu_draw db 'ksubmenu_draw',0
aksubmenu_add db 'ksubmenu_add',0
akmenuitem_new db 'kmenuitem_new',0
akmenuitem_delete db 'kmenuitem_delete',0
akmenuitem_draw db 'kmenuitem_draw',0
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
sys_path: rb 4096
file_name: rb 4096
plugin_path: rb 4096
openfile_path: rb 4096
filename_area: rb 256
rb 1024
procinfo process_information
pi rb 1024
keyscan: rb 1
keystr:
.data: rb 4 ;ñòðîêà ñî çíà÷åíèåì ñêàíêîäà àêòèâàöèîííîé êëàâèøè
.size: rd 1 ;ðàçìåð ñîäåðæèìîãî ñòðîêè áåç ïîñëåäíåãî íóëÿ
dataBuffer:
.1: rb 512
.2: rb 512
.3: rb 512
.4: rb 512
.size1: rd 1
.size2: rd 1
.size3: rd 1
.size4: rd 1
;255+255+2 = 512
;äâà çàïàñíûõ áàéòà íåîáõîäèìû äëÿ òîãî ÷òî áû íå ïåïåðåïèñàòü ñëåäóþùèåé áàéòû, â êîíöå áóôåðà 0
dataBufferEnd:
I_END:
rb 4096
align 16
STACKTOP:
MEM: