From f4e4bccefb48e3a131db927bf4a2f7677337d0bc Mon Sep 17 00:00:00 2001 From: theonlymirage Date: Tue, 18 Sep 2018 02:52:36 +0000 Subject: [PATCH] Added utility "Hot Angles" version 0.1 (source code @HOTANGLES and HACONFIG). git-svn-id: svn://kolibrios.org@7377 a494cfbc-eb01-0410-851d-a64ba20cac60 --- programs/other/HotAngles/HA/@HOTANGLES | Bin 0 -> 1833 bytes programs/other/HotAngles/HA/@HOTANGLES.ASM | 378 ++++++ programs/other/HotAngles/HA/AUTORUN.DAT | 22 + .../other/HotAngles/HA/SETTINGS/HOTANGLES.CFG | 5 + programs/other/HotAngles/HA/Tupfile.lua | 9 + programs/other/HotAngles/HA/build.bat | 5 + programs/other/HotAngles/HAconfig/HACONFIG | Bin 0 -> 5871 bytes .../other/HotAngles/HAconfig/HACONFIG.asm | 671 ++++++++++ .../HotAngles/HAconfig/SETTINGS/HOTANGLES.CFG | 5 + programs/other/HotAngles/HAconfig/Tupfile.lua | 9 + programs/other/HotAngles/HAconfig/build.bat | 5 + programs/other/HotAngles/HAconfig/check.inc | 204 +++ programs/other/HotAngles/HAconfig/editbox.inc | 271 ++++ programs/other/HotAngles/HAconfig/editbox.mac | 1145 +++++++++++++++++ programs/other/HotAngles/ReadMe.txt | 75 ++ 15 files changed, 2804 insertions(+) create mode 100644 programs/other/HotAngles/HA/@HOTANGLES create mode 100644 programs/other/HotAngles/HA/@HOTANGLES.ASM create mode 100644 programs/other/HotAngles/HA/AUTORUN.DAT create mode 100644 programs/other/HotAngles/HA/SETTINGS/HOTANGLES.CFG create mode 100644 programs/other/HotAngles/HA/Tupfile.lua create mode 100644 programs/other/HotAngles/HA/build.bat create mode 100644 programs/other/HotAngles/HAconfig/HACONFIG create mode 100644 programs/other/HotAngles/HAconfig/HACONFIG.asm create mode 100644 programs/other/HotAngles/HAconfig/SETTINGS/HOTANGLES.CFG create mode 100644 programs/other/HotAngles/HAconfig/Tupfile.lua create mode 100644 programs/other/HotAngles/HAconfig/build.bat create mode 100644 programs/other/HotAngles/HAconfig/check.inc create mode 100644 programs/other/HotAngles/HAconfig/editbox.inc create mode 100644 programs/other/HotAngles/HAconfig/editbox.mac create mode 100644 programs/other/HotAngles/ReadMe.txt diff --git a/programs/other/HotAngles/HA/@HOTANGLES b/programs/other/HotAngles/HA/@HOTANGLES new file mode 100644 index 0000000000000000000000000000000000000000..ee9fb7850775bd5952d7b2028f125f2e589f5699 GIT binary patch literal 1833 zcmeHI&1(};5TB$?)UB=QRY8L&)Pu(2!H>|m!R{u(Bu%>cXbdD2Y(yz4=`K=4h%5;4 zDCj{?We*+{yuKx1(S=lzJ$R|ug9i^~%X%oD8a=Etn>OkHU>4qd{O0%O&CXk9Q$ji~ z$y)}}TS0(fHsJz{bCtT|m%a9H>lJ$H z4k%+;9WAh4qA1xL)*aNfu)964-r_nichQv;zZsEdc*=S6;`;_|` zDXVrsIlQutd9-IJ>j>)<7#IJfuB79)G68u3dgiPkco8QBXmu^ zTc)Q}o-_I_rdswtq593xWJrn&$s}~`*?fA}$|cgJOmuqJ6K^jr1XJ^O=Wi|4mqNl! zGLaMZXL4;x$lq-e^^QN0{{R3 literal 0 HcmV?d00001 diff --git a/programs/other/HotAngles/HA/@HOTANGLES.ASM b/programs/other/HotAngles/HA/@HOTANGLES.ASM new file mode 100644 index 0000000000..2dbf9e7489 --- /dev/null +++ b/programs/other/HotAngles/HA/@HOTANGLES.ASM @@ -0,0 +1,378 @@ +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +; Hot Angles ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +; Compile with FASM +; Version 0.1: Sep 18, 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 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 + +; чруюыютюъ +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 ;чруЁєцрхь ъюэЇшуєЁрЎш■ яЁшыюцхэш  + mov ebx, 00000100000000000000000000100000b ;яюфяшё√трхьё  эр шэЄхЁхёэ√х эрь ёюс√Єш  + mcall 40 + +START: + mov eax, 10 ; function 10 : wait until event + mcall ; event type is returned in eax + + cmp eax, 6 ;юсЁрсюЄър яхЁхьх∙хэшщ ш эрцрЄш  ь√°ш + je mouse + + jmp START + +mouse: + ;юёэютэющ Ўшъы яЁюуЁрьь√ + call get_mouse_pos ;яюыєўрхь Єхъє∙шх ъююЁфшэрЄ√ ь√°ш + + cmp eax, 0 ;ыхт√щ тхЁїэшщ єуюы + jne @f + ; -- чфхё№ т√ч√трхь ёююЄт. т√чют фы  ыхтюую тхЁїэхую єуыр (X=0, Y=0) + push ecx + mov ecx, 0 + call run_command + pop ecx + + jmp START ;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 START +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 START +@@: + cmp ax, word[screen.width] + jne unlockend + ; -- (яЁрт√щ эшцэшщ єуюы) + push ecx + mov ecx, 3 + call run_command + pop ecx + + jmp START + +unlockend: + mov byte[state], UNLOCKd + jmp START + + +;ёЄЁєъЄєЁър фрээ√ї фы  їЁрэхэш  ярЁрьхЄЁют ¤ъЁрэр +screen: + .width dw 0 + .height dw 0 +;яюыєўшЄ№ ЁрчьхЁ ¤ъЁрэр +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 + + +;яюыєўшЄ№ яючшЎш■ ь√°ш +get_mouse_pos: + ;push eax + push ebx + mcall 37, 0 + pop ebx + ;pop eax + ret + + +;чряєёъ яЁшыюцхэш : ecx - ръЄштэ√щ єуюы: lu=0, ld=1, ru=2, rd=3 +run_command: + cmp byte[state], UNLOCKd + jne run_command.end + + push eax + push ebx + push ecx + + + cmp ecx, 0 + jne @f + mov eax, dword[newData.lu] ;testData.lu + mov dword[struct70.path_adr], eax + jmp .end_set_path +@@: + cmp ecx, 1 + jne @f + mov eax, dword[newData.ld] + mov dword[struct70.path_adr], eax + jmp .end_set_path +@@: + cmp ecx, 2 + jne @f + mov eax, dword[newData.ru] + mov dword[struct70.path_adr], eax + jmp .end_set_path +@@: + cmp ecx, 3 + jne .end_set_path + mov eax, dword[newData.rd] + mov dword[struct70.path_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 +.next: +;ъюэхЎ ъюфр фы  чрьхэ√ + + mcall 70, struct70 + mov byte[state], LOCKd + + pop ecx + pop ebx + pop eax +.end: + ret + +struct70: ;╘юЁьрЄ шэЇюЁьрЎшюээющ ёЄЁєъЄєЁ√ + .func dd 7 ; эюьхЁ яюфЇєэъЎшш + .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 ;0 + + +state: db 0 ; 0=unlock, 1=lock + +testData: + .lu db '/rd/1/SHELL', 0 + .ld db '/rd/1/RUN', 0 + .ru db "/rd/1/TINYPAD", 0 + .rd db '/rd/1/File Managers/EOLITE', 0 + +newData: ;Єрсышўър рфЁхёют ъюьрэфэ√ї ёЄЁюъ + .lu dd 0 + .ld dd 0 + .ru dd 0 + .rd dd 0 +newDataEnd: + +;шь  ъюэЇшуєЁрЎшюээюую Їрщыр +fileName: db 'SETTINGS/HOTANGLES.CFG', 0 ;'ha.cfg', 0 + +loadConfig: + push eax + push ebx + push ecx + push edx + mcall 68, 27, fileName ;чруЁєцрхь ъюэЇшуєЁрЎшюээ√щ Їрщы т ╬╟╙ + cmp eax, 0 + je loadConfig.exit ;хёыш Їрщыр ъюэЇшуєЁрЎшш эхЄ, Єю чртхЁ°рхь ЁрсюЄє яЁшыюцхэш  + ;шэрўх фрээ√х чруЁєцхэ√ т ╬╟╙, ЁрчьхЁ т edx + cmp edx, 0 ;хёыш Їрщы яєёЄ, т э╕ь эхЄ фрээ√ї, Єю чртхЁ°рхь ЁрсюЄє + je loadConfig.exit + + add edx, eax ;шэрўх ъырф╕ь т edx - рфЁхё ъюэЎр Їрщыр + + cmp byte[eax], 121 ;'y' ;хёыш ярЁрьхЄЁ ръЄштэюёЄш яЁшыюцхэш  шьххЄ ёЄрЄєё: эх ръЄштэю + jne loadConfig.exit ;Єю чртхЁ°рхь ЁрсюЄє яЁшыюцхэш  + + 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 + + ; ёшьтюы юЄышўхэ юЄ яхЁхэюёр ёЄЁюъш ш тючтЁрЄр ърЁхЄъш - чряюьшэрхь хую + mov dword[edi], esi + add edi, 4 + + ;шф╕ь фю ъюэЎр ¤Єющ ёЄЁюъш: яюър эх тёЄЁхЄшь юўхЁхфэющ 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 + + cmp edi, newDataEnd ;newData.end ;хёыш тё  ЄрсышЎр рфЁхёют чряюыэхэр, Єю т√їюфшь шч Ўшъыр + jb loadConfig.block +.fileend: + + pop esi + pop edi + + jmp loadConfig.end + +.propusk: + mov byte[esi], 0 + jmp loadConfig.block +.exit: + pop edx + pop ecx + pop ebx + pop eax + mcall -1 ;чръЁ√Є№ ¤Єє яЁюуЁрььє +.end: + pop edx + pop ecx + pop ebx + pop eax + ret + + + + +;┬√эхёЄш ъюф эшцх т юЄфхы№э√щ юс∙шщ ьюфєы№ +selfName db '@HOTANGLES',0 +selfNameSize = 10 ;фю 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 + + + +I_END: diff --git a/programs/other/HotAngles/HA/AUTORUN.DAT b/programs/other/HotAngles/HA/AUTORUN.DAT new file mode 100644 index 0000000000..4a0819d71e --- /dev/null +++ b/programs/other/HotAngles/HA/AUTORUN.DAT @@ -0,0 +1,22 @@ +# Syntaxis is: +# Use "parameter value" for parameters with spaces. Use "" if no parameter is required. +# Delay time means how much the system should wait, before running the next line. It is measured in 1/100 seconds. +# If delay is negative, wait for termination of the spawned process. Otherwise, simply wait +# +#/SYS/CROPFLAT "XS800 YS480" 1 # set limits of screen +#/SYS/LOADDRV COMMOUSE 1 # serial mouse driver +#/SYS/DEVELOP/BOARD "" 0 # Load DEBUG board +/SYS/SETUP BOOT 0 # Load device settings +/SYS/LOADDRV RDC 0 # videodriver for RDC M2010/M2012 +/SYS/@TASKBAR "" 0 # Start taskbar +/SYS/@ICON "" 0 # Multithread icon +/SYS/ESKIN "" 0 # Set style +/SYS/@DOCKY "" 0 # Start docky +/SYS/NETWORK/NETCFG A 0 # +/SYS/NETWORK/@ZEROCONF "" 0 # Network configuration +/SYS/@VOLUME "" 0 # Start volume daemon +/SYS/@SS ASSM 0 # Screensaver +/SYS/TMPDISK A0 -1 # Add virtual RAM disk /tmp0/1 +/SYS/SEARCHAP "" -1 # Search and mount additional system directory +/SYS/@HOTANGLES "" 0 # Start Hot Angles +### Hello, ASM World! ### diff --git a/programs/other/HotAngles/HA/SETTINGS/HOTANGLES.CFG b/programs/other/HotAngles/HA/SETTINGS/HOTANGLES.CFG new file mode 100644 index 0000000000..afc4e21bc3 --- /dev/null +++ b/programs/other/HotAngles/HA/SETTINGS/HOTANGLES.CFG @@ -0,0 +1,5 @@ +y +/rd/1/SHELL +/rd/1/RUN +/rd/1/TINYPAD +/rd/1/File Managers/EOLITE diff --git a/programs/other/HotAngles/HA/Tupfile.lua b/programs/other/HotAngles/HA/Tupfile.lua new file mode 100644 index 0000000000..992f375b98 --- /dev/null +++ b/programs/other/HotAngles/HA/Tupfile.lua @@ -0,0 +1,9 @@ +if tup.getconfig("NO_FASM") ~= "" then return end +--[[tup.foreach_rule( + {"@HOTANGLES.asm"}, + "fasm %f %o " .. tup.getconfig("KPACK_CMD"), + "%B" +) +]]-- +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") diff --git a/programs/other/HotAngles/HA/build.bat b/programs/other/HotAngles/HA/build.bat new file mode 100644 index 0000000000..eb24315104 --- /dev/null +++ b/programs/other/HotAngles/HA/build.bat @@ -0,0 +1,5 @@ +@echo lang fix ru >lang.inc +@fasm.exe -m 16384 @HOTANGLES.asm @HOTANGLES +@erase lang.inc +@kpack @HOTANGLES +@pause \ No newline at end of file diff --git a/programs/other/HotAngles/HAconfig/HACONFIG b/programs/other/HotAngles/HAconfig/HACONFIG new file mode 100644 index 0000000000000000000000000000000000000000..e9dff4bc966d6073e5fb756c9003cbb396ef3757 GIT binary patch literal 5871 zcmeHLeQ;FO6~Avc2}`~<@}VgNvV&>OYLKMT${IgjOklw(yBH+VjM*%b1u7)W<}GWi zQ#O5x@_14^ww+q1PMb-mRYp5%RW{i+kUR|^X|O<@1}J`D>)iNMuo(@Ih3)U$-9V-) z+P~`?xO?w8=bn4c@7#0Fg*z56ziaWz(lUuLmXXQWRfUX|E=c|bNqi0b@ifNxaT;=I z=(jQ!7;_g}n3B%RiSjBaexo5p{Dgj)6#9_=X$oVJxXs?a1_wmquh`pVF?rtJ{;HV# z(cXSsOkT3LkBQ04_VyeL33uDu-^BTm_zTK!Bk>oNUq|Azl_w+d9OdVc_*CU5k$9S- zN8%Rc;YeIk+QgX=Wm+U&YX8xuL?RK1yX=pw#e_IErp)*1H6^;Iv_Wsq)_pR63Wn>= zCH(0O*v{)P>TX&0l{gK}S5m8cO7t2BZH=&y&2`YO7C@EmD|H=yD19W4=AM!ouXauk z7fA=SG1n1gPGD>?NiS>APLg5|DRv%lpR0Iw$BB5ncI(?adui?<|3qUT|5n+IA(p2IY8$JNdQ(wo|t&{)dPr9-3na?%gi{w%lL!fr^F8@Jf-XIzpz&3PI4UJ@Ot3SKcb-!gOTu*1k|;~ z?-Hw$sE09-gH2Fj0FsVl_VzhIGoX5k9efOK;Q)R;C?jv26QGs*O6=`t$zLdXi~o&8 z0K*Itc`+$MN`^t_J28~)*1&#%*gu`5AxivTV9?zqBv3;FK?pQNzX?QRu!{}J&)^=h z&~$<{alY)BHpjdiV)sIk9A_+$MbYwnqWPSrL|CS9>LU0@DxE)ZP}q~+-WfcA9#;i-3!azC7Z3VnDpl{ zWm@w7d3gcMB|J{nCQlB{(%dpdpGj~|yNQeq*n66bC38->Tei198BZj@(VJm|%qee3 zI$z?8aTb3OgDGw-lkFW%kj3V3v1C_QV@}pROkx8VM!dvLnv<1M_hYCt_)2i~aEb0) z=zP<4s>PxWM1e8jNYiT;s)nWS-8`$$rh5uhBh6Y}qj{ZPQ-B+!dlotew-?kMeAkMTJhn=; z&!QcN#(-vOLr@dYM%2Dc&9_MN+!*~9v_mI3U}1XAjF45Y$rn@@qa6|32CaqAqa6@? zKOT~`1F&R56=JP@tR26m5Ogzn3iLG~dEmHfFnnb-{~ofhPCF{~-|E^QzA2eSh0guz zS=;8hs$nx{t7n*!sgBz=r>myT%q}}-+MNB`VbdZV)_e>3zbKOt++BWy(n7`$%uQp; zOyErv5yNl5laUwBCK7xL&J$V2|BOJ4JO!HWE_DsJqO#DPQ%O~3d-5h?FF(xwi3Q>&%X2EI{|I5 zQhT4TfI5B$1s-SdQB2HJFpu9Wj3*m$)!e0Ixq~Tl&CBT)$zakIzCh35-K1ivIhJy9 zy5_5*sSTA=^U36`E#-a)MN(t|U=UUKiV43*cAQBfFg^iQs4OKroBLB|;@ZDQHY*dm z46^7CNNs*I=muYek#@;UDHT->SF6gkSIG}%xsHUV@p5c5^IS)QQ+O#&(|LAE)i_j% zm~=pe`620D1-&T~kR>p;imyxQM<9{MLjEoyQ9#Wo@5Tcuhn%lThI2nUNV9BSp}poDk_Mgq(f}=OppGtyJNMUUZ#}!? zw$^cdKcE(Ytr$1TyH2+<>$vA8Ov8d zTXMI!A(coz+z{2sz}@%`@fxDH;)cdhaglIOTa|QjG|g|I4AQJ1@C=KD)*W=2x2*kh$Vv2+&Dj@x&7EUD^fO_nt(Jd?Xu$L^4g z3U{Ujd4TGlX$jWT0r!8Jp$?=??pOAmJ`38;ow z{C+^Nr>ZC)xysBeafHN|gNVn2--cFLMWN0Tp^lc)oWkCnn9EpCags_uv8%+K{~g_n z|DN{Y*$AlA(~`1KJ#A6GtDd$h%XjUWiOtkIxbJi#q3&6F;?rHjGeD#B`Ba>%?#Vv! zskxi4h7z+onrz;a_C5DWYM=S5=w;#zJoG|SqS%@klJW8jrSm61A9)aj>cuNpE?e%d zUa-`&vSPXW_QloLRxWWfQu>*1A1rRo$y^Xzv!HCj(uzvY@+HgM|NDAX^$I=?u994{i7`2=aU`P`7Y{+T* zhUBhOAPumlfO^vjfMp3;2Ux4jpN5C4s`)}-*LxCMV|W!LMB#a`710lPLlpoeF^% zQG~Z^FcHq-+)!?G8Zjwk#H=XKA$Hhe?)TN>Y;U!&G1dp2!q6~-LHGy8XTD@$ZC|?5kQ?3jV^+v)*xlD{mx`qW@FV&*9DQe41mB)d;2yJ)w7ti zVIuWM7PW@50(;U$yqGyPHD!#j^6sK=_0q{@`{c-?OyzWBQI0aYEq`mFTdr{ZHS8eb z?8qXfTuz+JQk=Fk31Hb`G5;|zg=x7+edp_Kd+0v5B}iNF`C7u+v`5dtyq-#!GD83A z(Q|~Ih(~VH1qvg<$?>XX_fQPIour^kKr#kgIth&~fy*s0wv!;~65u>SOTwi~AoMzx zwZ=rk2>+r`%DR!j;yQ#fFI#AjcSEH-nk7$zH1$Z z-s>=YS+@}4<>@4^Wb)Q=JQ2{cvL>2^-5eCnBK1fx#6lGH9+b{Vlq%Jb9Hn*}qh5tM zG*Nkf56vfVa6V7|h*g_dy@MC%d|LZOv5P^R1@t*2DBgAbQg@P+LqhbZ>o!;qe4Ejm z_~q8ft{(L9A$iie%ntMu|{k zJ%^yPmkN67*~uS+GqEC8%(??r^Kklf@Nd4zSB-47|K`XIEHs+*opj^nxpLk576<$t>M-KaQ}b&ZZq{-A$jqtX~`ajb6Ku%S8Z z2s8&Bt<9leOXG%s1M@ZOTl}jxG(sAOHE&YZH#c2U^Cb>VvDgFO) zq?zcL756FYH~W=F$GnSs=H1>HP#mF64nO(qxUYHRMt{?q8<-%kX%092H{;IrYuA0= zh9v#-cF-%LW>xGq*dl@wJp+5R{$4cEiLk{sg4vUY9^8uu+y&}w>=f&967`Bn)Qv=~ zAS(T@K`QX|KGD)&0tIcF-G#q&K_Wl 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 '../../../macros.inc' +include 'editbox.inc' +use_edit_box +include 'check.inc' ;тъы■ўшЄ№ Їрщы check.inc +version_ch1 ;эхюсїюфшь√щ ьръЁюё фы  тъы■ўхэш  new тхЁёшш check_box1 +use_check_box ;шёяюы№чє  ьръЁюё√, тэхёЄш яЁюЎхфєЁ√ фы  Ёшёютрэш  ўхъ сюъёр + +Otstup = 30 + +START: + call copyKill ;яЁюёЄхщ°р  чр∙шЄр юЄ чряєёър тЄюЁющ ъюяшш яЁшыюцхэш  + mcall 68, 11 ;шэшЎшрышчрЎш  ъєўш + + mov eax,48 ;яюыєўшЄ№ ёшёЄхьэ√х ЎтхЄр + mov ebx,3 + mov ecx, sc + mov edx, sizeof.system_colors + mcall + + mov eax,40 ;єёЄрэютшЄ№ ьрёъє фы  юцшфрхь√ї ёюс√Єшщ + mov ebx,0x27 ;ёшёЄхьр сєфхЄ ЁхрушЁютрЄ№ Єюы№ъю эр ёююс∙хэшх ю яхЁхЁшёютъх, эрцрЄр ъэюяър, юяЁхфхы╕ээр  Ёрэхх, ёюс√Єшх юЄ ь√°ш (ўЄю-Єю ёыєўшыюё№ - эрцрЄшх эр ъэюяъє ь√°ш шыш яхЁхьх∙хэшх; ёсЁрё√трхЄё  яЁш яЁюўЄхэшш) + mcall + + 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. + + mouse_edit_boxes editboxes,editboxes_end + mouse_check_boxes check_boxes,check_boxes_end ;яЁютхЁър ўхъ сюъёр + 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. + key_edit_boxes editboxes,editboxes_end + 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 + mov eax,-1 ; Function -1 : close this program + mcall +noclose: + cmp ah, 2 ;ъэюяър "╧ЁшьхэшЄ№" + jne butend + call applyButton ;т√чют эр°хую юсЁрсюЄўшър эрцрЄш  ъэюяъш +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 +defaultDataSize = 48+19 + + +copyParam: ;ъюяшЁєхЄ ярЁрьхЄЁ(ъюьрэфє чряєёър) т сєЇхЁ (ёь. фры№°х) + push esi ebx ecx + mov ecx, dword[ebx] ;ўшЄрхь ЁрчьхЁ ёЄЁюъш +.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, 5*2+1 ;1 срщЄ эр ёюёЄю эшх ръЄштэюёЄш ш 5 ярЁ яхЁхэюёют ёЄЁюъ (ёшьтюы√ 13, 10) + add ecx, dword[editLU.size] ;dataBuffer.size1] ;яы■ё ЁрчьхЁ ърцфющ ёЄЁюъш т срщЄрї + add ecx, dword[editLD.size] ;dataBuffer.size2] + add ecx, dword[editRU.size] ;dataBuffer.size3] + add ecx, dword[editRD.size] ;dataBuffer.size4] + ;ЄхяхЁ№ ЁрчьхЁ Їрщыр ъюэЇшуєЁрЎшш т ecx + mov dword[createFile.size], ecx ;яюыюцшь ЁрчьхЁ срщЄ т ёЄЁєъЄєЁє ёючфрэш /яхЁхчряшёш Їрщыр + mcall 68, 12, ecx ;т√фхы хь сыюъ ярь Єш яюф сєЇхЁ ёюфхЁцшьюую + mov dword[createFile.data_adr], eax ;ёюїЁрэ хь рфЁхё сєЇхЁр т ёЄЁєъЄєЁє + + ;чряюыэшь сєЇхЁ ёюфхЁцшьюую: + mov byte[eax], 110; 'n' ;яю єьюыўрэш■ Їыру ёэ Є + cmp word[ch1.flags], ch_flag_en ;т√ёЄртыхэ checkBox шыш эхЄ? + jne applyButton.no + mov byte[eax], 121 ;шэрўх ъырф╕ь 'y' +.no: + 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 ;editLD.text + mov ebx, dataBuffer.size2 ;editLD.size + 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 ;фюсрты хь яхЁхэюё ёЄЁюъш + + pop ebx esi + + + mov ebx, createFile + mcall 70 + cmp eax, 0 + je .end + ;шэрўх чфхё№ эєцэю т√тхёЄш юъэю ё ю°шсъющ !!! +.end: + mcall 68, 13, dword[createFile.data_adr] ;юётюсюцфрхь ярь Є№ яюф сєЇхЁ + call restartHotAnglesApp ;яхЁхчряєёърхь @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 + + +restartHotAnglesApp: ;!!! + ;эрїюфшь тёх ъюяшш яЁшыюцхэш  яю шьхэш ш чртхЁ°рхь шї + 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 restartHotAnglesApp.next ;хёыш эх ёютярыю, Єю яхЁхїюфшь эр ёыхфє■∙шщ ёыюЄ + + ;push eax ebx ecx + mcall 18, 2, ecx ;шэрўх чртхЁ°рхь ёыюЄ + ;pop ecx ebx eax + +.next: + inc ecx + cmp ecx, dword[slotMax] + ja @f + jmp @b +@@: + pop edi esi ecx ebx eax + + ;чряєёърхь яЁшыюцхэшх чрэютю + 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 + ;db 0 + ;.name: dd HotAnglesAppName +;HotAnglesAppName 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 + + 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: + cmp byte[eax], 121 ;'y' ;т√ёЄрты хь checkBox - ярЁрьхЄЁ ръЄштэюёЄш яЁшыюцхэш  + jne loadConfig.no +.yes: + mov word[ch1.flags], ch_flag_en + jmp loadConfig.chEnd +.no: + mov word[ch1.flags], 0 +.chEnd: + ;jmp loadConfig.end ;ъюьрэфр фы  єфюсёЄтр юЄырфъш ш яюшёър ю°шсюъ + + ;ъюяшЁєхь ёюфхЁцшьюх ёЄЁюъ т сєЇхЁ + push edi esi ecx ebx eax + ;шэшЎшрышчшЁєхь єърчрЄхыш эр рфЁхёр сєЇхЁр ёЄЁюъш ш х╕ ЁрчьхЁр + mov edi, dataBuffer.1 ;dword[dataBuffer.1] + mov esi, dataBuffer.size1 ;dword[dataBuffer.size1] + ;ecx - ёў╕Єўшъ срщЄ т ёЄЁюъх +; mov ecx, 0 ;xor ecx, ecx +.block: + xor ecx, ecx ;юсэєы хь ёў╕Єўшъ + inc eax + cmp byte[eax], 10 ;хёыш юўхЁхфэющ ъюф ёшьтюыр 10 шыш 13, Єю яЁюяєёърхь ёшьтюы√ + je loadConfig.block ;propusk ;фю яхЁтюую юЄышўэюую юЄ эшї + cmp byte[eax], 13 + je loadConfig.block ;propusk + + ; ёшьтюы юЄышўхэ юЄ яхЁхэюёр ёЄЁюъш ш тючтЁрЄр ърЁхЄъш - эрўшэрхь ъюяшЁютрЄ№ юЄё■фр т сєЇхЁ + 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 +; mov ecx, 0 ;xor ecx, ecx ;юсэєы хь ЁрчьхЁ ёЄЁюъш + + cmp edi, dataBuffer.size1 ;хёыш ¤Єю с√ы яюёыхфэшщ сєЇхЁ (ш ь√ т√°ыш чр рфЁхёр ЁрчьхЁют сєЇхЁют), Єю т√їюфшь + jb loadConfig.block + + 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 ;яЁшьхэ хь эрёЄЁющъш ърцфюую сєЇхЁр + pop edx ecx ebx eax + 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 + pop eax + ret + + + +selfName db 'HACONFIG', 0 ;'@HOTANGLES',0 +selfNameSize = 8;9 ;фю 11 byte +; +compareBytes: + push edi esi ecx ebx + mov eax, 0 ;xor eax, eax + mov ecx, selfNameSize ;11 ;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 +coord: ;ъююЁфшэрЄ√ юъэр яЁшыюцхэш  + .y dw 0 + .x dw 0 + +draw_window: + ;єфры хь ъэюяъє, хёыш хёЄ№ + mov edx, 0x80000002 + 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 ;* 65536 + WindowsWidth ; [x start] *65536 + [x size] + mov bx, word[coord.x] + shl ebx, 16 + mov bx, WindowsWidth + + mov ecx, 0 + mov cx, word[coord.y] ;* 65536 + WindowsHeight ; [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 + + draw_check_boxes check_boxes,check_boxes_end ;Ёшёютрэшх ўхъсюъёют + draw_edit_boxes editboxes,editboxes_end ;Ёшёютрэшх edit box'ют + + ;Ёшёєхь ъэюяъє + mov ebx, (WindowsWidth-80-Otstup)*65536 + 80 ;ъююЁфшэрЄр X, °шЁшэр ъэюяъш + mov ecx, 160*65536 + 20 ;ъююЁфшэрЄр Y, т√ёюЄр ъэюяъш + mov edx, 0x00000002 ;2 ;эюьхЁ ъэюяъш + mov esi, 0x00AABBCC ;ЎтхЄ ъэюяъш + mcall 8 + ;Ёшёєхь ЄхъёЄ ъэюяъш + mov ebx, (WindowsWidth-80-Otstup+25) * 65536 + 166 ;ъююЁфшэрЄ√ ЄхъёЄр (x, y) + mov ecx, 0xFFFFFF ;схы√щ ЎтхЄ ЄхъёЄр + mov edx, buttonText + mov esi, 5 ;ЁрчьхЁ ЄхъёЄр т ёшьтюырї + mcall 4 + + call draw_super_text + + LineLength = 62 ;42 + mov ebx, 40 * 65536 + 36 ; draw info text with function 4 (x, y) + 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 + + +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 + +align 4 +;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> +;DATA фрээ√х фы  check_box1 - шёяюы№чєхЄ ёшёЄхьэ√х ЎтхЄр +;╘юЁьрЄ фрээ√ї ўхъ сюъёр: +; ъююЁфшэрЄр ї, ъююЁфшэрЄр є, єърчрЄхы№ эр эрўрыю ёЄЁюъш, фышэр ёЄЁюъш +;ёюёЄю эшх ЁрсюЄ√ єЄшышЄ√: ръЄштэр/эхЄ +check_boxes: + ch1 check_box1 30,160,ch_text.1,ch_text.e1-ch_text.1,ch_flag_en +check_boxes_end: + +ch_text: ;ёюяЁютюцфр■∙шщ ЄхъёЄ фы  ўхъ сюъёют +.1 db 'Activate "Hot Angles"' +.e1: + +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 + +draw_super_text: + push eax ebx ecx edx edi esi + 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, 22 + mcall 4 + + mov ebx, Otstup * 65536 + 109 + mov edx, superText.ld + mov esi, 24 + mcall 4 + + mov ebx, 240 * 65536 + 74 + mov edx, superText.ru + mov esi, 23 + mcall 4 + + mov ebx, 240 * 65536 + 109 + mov edx, superText.rd + mov esi, 25 + mcall 4 + + pop esi edi edx ecx ebx eax + ret + + +edMaxSize = 510 +edMax = 0 ;max, size, pos + +editboxes: +editLU edit_box 180,Otstup,85,0xffffff,0x6a9480,0,0xAABBCC,0,edMaxSize,dataBuffer.1,ed_focus,edMax,edMax +editLD edit_box 180,Otstup,120,0xffffff,0x6a9480,0,0xAABBCC,0,edMaxSize,dataBuffer.2,ed_focus,edMax,edMax +editRU edit_box 180,240,85,0xffffff,0x6a9480,0,0xAABBCC,0,edMaxSize,dataBuffer.3,ed_focus,edMax,edMax +editRD edit_box 180,240,120,0xffffff,0x6a9480,0,0xAABBCC,0,edMaxSize,dataBuffer.4,ed_focus,edMax,edMax +editboxes_end: + +data_of_code dd 0 +mouse_flag dd 0x0 + +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 +;фтр чрярёэ√ї срщЄр эхюсїюфшь√ фы  Єюую ўЄю с√ эх яхяхЁхяшёрЄ№ ёыхфє■∙шхщ срщЄ√, т ъюэЎх сєЇхЁр 0 +dataBufferEnd: + +sc system_colors + +I_END: + rb 4096 +align 16 +STACKTOP: + +MEM: diff --git a/programs/other/HotAngles/HAconfig/SETTINGS/HOTANGLES.CFG b/programs/other/HotAngles/HAconfig/SETTINGS/HOTANGLES.CFG new file mode 100644 index 0000000000..39663a95d8 --- /dev/null +++ b/programs/other/HotAngles/HAconfig/SETTINGS/HOTANGLES.CFG @@ -0,0 +1,5 @@ +y +/rd/1/HACONFIG +/rd/1/HACONFIG +/rd/1/HACONFIG +/rd/1/HACONFIG diff --git a/programs/other/HotAngles/HAconfig/Tupfile.lua b/programs/other/HotAngles/HAconfig/Tupfile.lua new file mode 100644 index 0000000000..b0741ff25c --- /dev/null +++ b/programs/other/HotAngles/HAconfig/Tupfile.lua @@ -0,0 +1,9 @@ +if tup.getconfig("NO_FASM") ~= "" then return end +--[[tup.foreach_rule( + {"HACONFIG.asm"}, + "fasm %f %o " .. tup.getconfig("KPACK_CMD"), + "%B" +) +]]-- +tup.rule("echo lang fix " .. ((tup.getconfig("LANG") == "") and "ru" or tup.getconfig("LANG")) .. " > lang.inc", {"lang.inc"}) +tup.rule({"HACONFIG.asm", extra_inputs = {"lang.inc"}}, "fasm %f %o " .. tup.getconfig("KPACK_CMD"), "HACONFIG") diff --git a/programs/other/HotAngles/HAconfig/build.bat b/programs/other/HotAngles/HAconfig/build.bat new file mode 100644 index 0000000000..ec3254f0ab --- /dev/null +++ b/programs/other/HotAngles/HAconfig/build.bat @@ -0,0 +1,5 @@ +@echo lang fix ru >lang.inc +@fasm.exe -m 16384 HACONFIG.asm HACONFIG +@erase lang.inc +@kpack HACONFIG +@pause \ No newline at end of file diff --git a/programs/other/HotAngles/HAconfig/check.inc b/programs/other/HotAngles/HAconfig/check.inc new file mode 100644 index 0000000000..f15df6bbb0 --- /dev/null +++ b/programs/other/HotAngles/HAconfig/check.inc @@ -0,0 +1,204 @@ +;Оптимизированный компонент CheckBox (Исходный вариант от Maxxxx32) +;Оптимизирован вывод строки надписи для CheckBox'a + теперь, при проверке не происходит подсчет кол-ва символов в строке +;Оптимизация команд - отказался от сохранения регистров в стеке. +;21.02.2007 добавил код от Heavyiron, дописал макросы для использования системных цветов +;19.02.2007 общее улучшение кода, уменьшение размера и использование системных цветов для отображения checkbox +;17.07.2006 произведена оптимизация, при установке чек бокса в положение включено последующие чек боксы в тот же промежуток времени не проверяются +;22.08.2006 произведена оптимизация команд, приняты во внимание замечания DIAMOND'а. +; - Теплов Алексей www.lrz.land.ru + +macro version_ch ;для совместимости со старыми версиями checkbox все цвета задаются ручками +{ +ch_struc_size=24 +ch_left equ [edi] ;координата начала рисования по х +ch_top equ [edi+2] ;координата начала рисования по у +ch_color equ [edi+4] +ch_border_color equ [edi+8] ; or [edi+4] ;цвет рамки checkbox ее можно задать самостоятельно +ch_text_color equ [edi+12];[edi+4] ;цвет текста +ch_text_ptr equ [edi+16] ;указатель на начало текстовой строки +ch_text_length equ [edi+20] ;длина надписи (2^64 такой длины может быть текст) +ch_flags equ [edi+22] ;флаги +} + +macro version_ch1 ;продвинутая версия, использует цвета скина. +{ +ch_struc_size=12 +ch_left equ [edi] ;координата начала рисования по х +ch_top equ [edi+2] ;координата начала рисования по у +ch_color equ [sc.work] ; +ch_border_color equ [sc.work_graph] ; or [edi+4] ;цвет рамки checkbox ее можно задать самостоятельно +ch_text_color equ [sc.work_text];[edi+4] ;цвет текста +ch_text_ptr equ [edi+4] ;указатель на начало текстовой строки +ch_text_length equ [edi+8] ;длина надписи (2^64 такой длины может быть текст) +ch_flags equ [edi+10] ;флаги +} + +macro use_check_box +{ +ch_text_margin=4 ;расстояние от прямоугольника чек бокса до надписи +ch_size=11 ;размер квадрата чек бокса +check_box: +.draw: + pusha ;сохраним все регистры + mov eax,13 + mov ebx,ch_left + shl ebx,16 + add ebx,ch_size + mov ecx,ch_top + shl ecx,16 + add ecx,ch_size + mov edx,ch_border_color + mcall ;рисуем рамку + + mov edx,ch_color + add ebx,1 shl 16 - 2 + add ecx,1 shl 16 - 2 + mcall ;закрашиваем внутренности чекбокса + + test word ch_flags,2 ;достать значение бита из переменной и поместить в флаг CF + jz @f ;в если CF=1, то выполним следующую процедуру иначе перейти на нижнюю @@ + call .draw_ch ;нарисовать включенный чек бокс +@@: +;---------------------------- +;расчет куда будет произведен вывод текста +;---------------------------- + movzx ebx,word ch_left ;загрузить значение х для чек бокса + add ebx,(ch_size+ch_text_margin) ;добавить размер стороны и расстояние на котором начнется вывод текста + shl ebx,16 ;сдвинем на 16 разрядов в лево (умножим на 65536) + mov bx,ch_top ;загрузим значение по y + add ebx,(ch_size-9+1) ;добавим значение длины стороны -9+1 + mov ecx,ch_text_color ;загрузим цвет надписи + + mov edx,ch_text_ptr ;укажем адрес от куда нужно выводить строку + movzx esi,word ch_text_length ;Загрузим длину надписи в esi + ;внесем в eax значение вывода надписи на канву + mov eax,4 + mcall ;Вывод +popa ;восстановить значения регистров из стека +ret ;выйдем из процедуры + +.clear_ch: ;очистка чек бокса + mov edx,ch_color ;цвет внутри чек бокса + jmp @f ;безусловный прыжок на нижнюю метку @@ + +.draw_ch: ;нарисовать включенный чек бокс + mov edx,ch_border_color ;загрузить цвет +@@: + movzx ebx,word ch_left ;загрузить координату по х + add ebx,(ch_size/3) ;добавить (сторона прямоугольника/3) + shl ebx,16 ;сдвинем на 16 разрядов в лево (умножим на 65536) + mov bx,(ch_size/2) ;загрузить (сторона прямоугольника/2) + mov bp,bx ;сохраним регистр bx в регистре указателя базы + ;push bx + movzx ecx,word ch_top ;загрузить координату по у + mov eax,13 ;в eax - значения функции для вывода полосы т.е. по сути прямоугольника, который отображает включенный компонент чек бокс + add ecx,(ch_size/3) ;добавить (сторона прямоугольника/3) + shl ecx,16 ;сдвинем на 16 разрядов в лево (умножим на 65536) + mov cx,bp ;загрузим значения регистра указателя базы в cx + ;pop cx + mcall ;вывод +ret ;выйти из процедуры +.mouse: ;обработка мыши +pusha + mov eax,37 ;будем что то делать если у нас что - нить нажато + mov ebx,2 ;внести в регистр значение 2 + mcall ;проверка не нажал ли пользователь кнопку мышки + test eax,eax ;проверка если у нас в eax=0, то установим флаг и выйдем + jnz @f ;перейти на нижнюю метку @@ + btr word ch_flags,2 ;извлечение значения заданного бита в флаг cf и изменение его значения на нулевое. + popa ;если ничего не произошло, то восстановим значения регистров из стека + ret ;выход +@@: + bts word ch_flags,2 ;проверка флага т.е. перенос в cf значение бита и установка бита в состояние включено + jc .mouse_end ;если CF=1 то перейти в конец т.е. это выход + movzx esi,word ch_text_length ;загрузить кол-во символов в текстовой строке + ;Умножение на 6 Быстрое умножение можно воспользоваться любым мз методов, но на старых Процессорах (386,486,P1)быстрее будет с инструкцией Lea + ;lea esi,[eax*2+eax] + ;shl eax,1 + imul esi,6 ; или можно и так умножить на 6 + add esi,ch_text_margin ;добавить 3 - расстояние от чек бокса до надписи + + mov eax,37 ;получим координаты мышки + mov ebx,1 ;добавить 1 + mcall ;получить координаты курсора относительно окна + + movzx ebx,word ch_top ;загрузить в bx значение координаты у + cmp ax,bx ;сравнить с с координатой курсора + jl .mouse_end ;SF <> OF если меньше + add ebx,ch_size ;добавить размер + cmp ax,bx ;сравнить + jg .mouse_end ;ZF = 0 и SF = OF если больше + + shr eax,16 ;разделим на 65536 или просто сдвинем биты на 16 значений + movzx ebx,word ch_left ;произведем аналогичное сравнение + cmp ax,bx ;сравнить регистры + jl .mouse_end ;если меньше + add ebx,ch_size ;добавить длину стороны прямоугольника + add ebx,esi ;Учесть в значении по х еще и длину надписи к чекбоксу + cmp ax,bx ;стравнить регистры + jg .mouse_end ;если больше + + bts word ch_flags,1 ;извлечение значения заданного бита в флаг cf и изменение его значения на 1. + jc @f ;CF=1 то перейти на нижнюю @@ + + call .draw_ch ;отобразить включенный чек бокс + mov dword [esp+24],1 ;дальнейшая проверка чек боксов бесмыслена, по этому в стек, где располагается ecx поместитм 0 + jmp .mouse_end ;выйти +@@: + btr word ch_flags,1 ;извлечение значения заданного бита в флаг cf и изменение его значения на нулевое. + call .clear_ch ;выключить чек бокс т.е. на месте закрашенного прямоугольника отобразить цвет фона. +.mouse_end: +popa ;восстановить регистры из стека +ret ;выйти +} + +struc check_box1 left,top,text,text_length,flags +{ ;структура параметров для чек бокса +.left: dw left ;+0 положение по х +.top: dw top ;+2 положение по у +.text: dd text ;+16 адрес в коде программы где расположен текстр +.text_length: dw text_length ;+20 длина текста +.flags: dw flags+0 ;+22 флаги +} +struc check_box left,top,color,border_color,text_color,text,text_length,flags +{ ;структура параметров для чек бокса +.left: dw left ;+0 ;положение по х +.top: dw top ;положение по у +.color: dd color ;цвет внутри чекбокса +.border_color: dd border_color ;цвет рамки +.text_color: dd text_color ;цвет надписи +.text: dd text ;адрес в коде программы где расположен текст +.text_length: dw text_length ;длина текста +.flags: dw flags+0 ;+22 +} +ch_flag_en=10b + +macro draw_check_boxes start,end ;рисовать чек боксы +{ + mov edi,start ;Указатель на начало данных чек боксов т.е. на начало данных первого чекбокса + mov ecx,((end-start)/ch_struc_size) ;Количество чек боксов +@@: + call check_box.draw ;Отобразить чек бокс + add edi,ch_struc_size ;Указатель на последующие чек боксы т.е. +28 + loop @b ;прыгнуть если в ecx/cx значение не 0 на верхнюю @@ +} +macro mouse_check_boxes start,end ;установка чек боксов, в зависимости от события +{ + mov edi,start ; Указатель на начало данных чек боксов т.е. на начало данных первого чекбокса + mov ecx,((end-start)/ch_struc_size) ;Количество чек боксов +@@: + call check_box.mouse ;проверка мышки и обработка событий + add edi,ch_struc_size ;Указатель на последующие чек боксы + loop @b ;прыгнуть если в ecx/cx значение не 0 на верхнюю @@ +} +;Если нужно отобразить один чекер +macro draw_check_box start ;рисовать чек боксы +{ + mov edi,start ;Указатель на начало данных чек боксов т.е. на начало данных первого чекбокса + call check_box.draw ;Отобразить чек бокс +} +macro mouse_check_box start ;установка чек боксов, в зависимости от события +{ + mov edi,start ; Указатель на начало данных чек боксов т.е. на начало данных первого чекбокса + call check_box.mouse ;проверка мышки и обработка событий +} \ No newline at end of file diff --git a/programs/other/HotAngles/HAconfig/editbox.inc b/programs/other/HotAngles/HAconfig/editbox.inc new file mode 100644 index 0000000000..ab9b98d8d6 --- /dev/null +++ b/programs/other/HotAngles/HAconfig/editbox.inc @@ -0,0 +1,271 @@ +; SEE YOU File FAQ.txt and HISTORY. Good Like! +;;;;;;;;;;;;;;;;;; +include 'editbox.mac' ;макрос который должен облегчить жизнь :) специально для editbox +;;;;;;;;;;;;;;;;;; +macro use_edit_box +{ +edit_box: +ed_width equ [edi] ;ширина компонента +ed_left equ [edi+4] ;положение по оси х +ed_top equ [edi+8] ;положение по оси у +ed_color equ [edi+12] ;цвет фона компонента +shift_color equ [edi+16] ;=0x6a9480 +ed_focus_border_color equ [edi+20] ;цвет рамки компонента +ed_blur_border_color equ [edi+24] ;цвет не активного компонента +ed_text_color equ [edi+28] ;цвет текста +ed_max equ [edi+32] ;кол-во символов которые можно максимально ввести +ed_text equ [edi+36] ;указатель на буфер +ed_flags equ [edi+40] ;флаги +ed_size equ [edi+44] ;кол-во символов +ed_pos equ [edi+48] ;позиция курсора +ed_offset equ [edi+52] ;смещение +cl_curs_x equ [edi+56] ;предыдущее координата курсора по х +cl_curs_y equ [edi+60] ;предыдущее координата курсора по у +ed_shift_pos equ [edi+64] ;положение курсора +ed_shift_pos_old equ [edi+68] ;старое положение курсора +;========================================================== +;=== процедура прорисовки ================================= +;========================================================== +.draw: +pushad +;--- рисуем рамку --- + call .draw_border ; Функция стабильна +.draw_bg_cursor_text: +;--- изменяем смещение, если надо --- + call .check_offset ;вычисление позиции курсора стабильна +;--- рисуем внутреннюю область --- + call .draw_bg ;нарисовать прямоугольник рабочей области +;---- рисуем выделение, по shift если есть + call .draw_shift +.draw_cursor_text: +;--- рисуем курсор --- + ;--- может его не надо рисовать ---- + test word ed_flags,ed_focus + je @f + call .draw_cursor +@@: + call .draw_text +;;;;;;;;;;;;;;;;;;;;;;;;;; +;Общий выход из editbox для всех функций и пост обработчиков +;;;;;;;;;;;;;;;;;;;;;;;;;; +.editbox_exit: +edit_ex +;========================================================== +;=== обработка клавиатуры ================================= +;========================================================== +.key: +pushad + test word ed_flags,ed_focus ; если не в фокусе, выходим + je .editbox_exit + test word ed_flags,ed_mouse_on + jne .editbox_exit + +;Проверка нажат shift ? + call .check_shift +;---------------------------------------------------------- +;--- проверяем, что нажато -------------------------------- +;---------------------------------------------------------- +use_key_process backspase,delete,left,right,home,end,insert +;;;;;;;;;;;;;;;;;;;;;;;;;;;; +;Заглушка на обработку клавиш вверх и вниз т.е. при обнаружении этих кодов происходит выход из обработчика +;;;;;;;;;;;;;;;;;;;;;;;;;;;; +use_key_no_process up,down,esc,enter,tab,numl,capsl,scrolll +;--- нажата другая клавиша --- +;;;;;;;;;;;;;;;;;;;;;;;;;;;; +;Проверка установлен ли флаг при котором нужно выводить только цифры в нужном боксе если такойнеобходимости нет нужно закоментировать макрос +;;;;;;;;;;;;;;;;;;;;;;;;;;;; +use_key_figures_only +;;;;;;;;;;;;;;;;;;;;;;;;;;;; +;проверка на shift был ли нажат +;;;;;;;;;;;;;;;;;;;;;;;;;;;; +are_key_shift_press +;;;;;;;;;;;;;;;;;;;;;;;;;;;; +; проверяем, находится ли курсор в конце + дальнейшая обработка +;;;;;;;;;;;;;;;;;;;;;;;;;;;; +are_key_cur_end +;;;;;;;;;;;;;;;;;;;;;;;;;;;; +;Обработка клавиш insert,delete.backspase,home,end,left,right +;;;;;;;;;;;;;;;;;;;;;;;;;;;; +use_work_key +;========================================================== +;=== обработка мыши ======================================= +;========================================================== +.mouse: +pushad +;debug +;---------------------------------------------------------- +;--- получаем состояние кнопок мыши ----------------------- +;---------------------------------------------------------- + mcall 37,2 +;---------------------------------------------------------- +;--- проверяем состояние ---------------------------------- +;---------------------------------------------------------- + test eax,1 + jnz .mouse_left_button + and word ed_flags,ed_mouse_on_off + xor ebx,ebx + mov dword [mouse_flag],ebx + jmp .editbox_exit +.mouse_left_button: +;---------------------------------------------------------- +;--- блокировка от фокусировки в других боксах при попадании на них курсора +;---------------------------------------------------------- + mov eax,dword [mouse_flag] + test eax,eax + jz @f + cmp eax,edi + je @f + jmp ._blur +;---------------------------------------------------------- +;--- получаем координаты мыши относительно окна +;---------------------------------------------------------- +@@: mcall 37,1 + +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +;Функция обработки мышки получение координат и проверка их + выделения +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +use_work_mouse +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +;Общие функции обработки +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +use_general_func +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +;Функции для работы с key +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +use_key_func +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +;Функции для работы с mouse +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +use_mouse_func +} +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +;Bit mask from editbox +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +ed_figure_only= 1000000000000000b ;одни символы +ed_always_focus= 100000000000000b +ed_focus= 10b ;фокус приложения +ed_shift_on= 1000b ;если не установлен -значит впервые нажат shift,если был установлен, значит мы уже что - то делали удерживая shift +ed_shift_on_off=1111111111110111b +ed_shift= 100b ;включается при нажатии на shift т.е. если нажимаю +ed_shift_off= 1111111111111011b +ed_shift_bac= 10000b ;бит для очистки выделеного shift т.е. при установке говорит что есть выделение +ed_shift_bac_cl=1111111111101111b ;очистка при удалении выделения +ed_shift_cl= 1111111111100011b +ed_shift_mcl= 1111111111111011b +ed_left_fl= 100000b +ed_right_fl= 1111111111011111b +ed_offset_fl= 1000000b +ed_offset_cl= 1111111110111111b +ed_insert= 10000000b +ed_insert_cl= 1111111101111111b +ed_mouse_on = 100000000b +ed_mous_adn_b= 100011000b +ed_mouse_on_off=1111111011111111b +ed_height=14 ; высота +macro draw_edit_boxes start,_end +{ + mov edi,start + mov ecx,((_end-start)/ed_struc_size) +@@: + call edit_box.draw + add edi,ed_struc_size + loop @b +} + +macro mouse_edit_boxes start,_end +{ + mov edi,start + mov ecx,((_end-start)/ed_struc_size) +@@: + call edit_box.mouse + add edi,ed_struc_size + loop @b +} + +macro key_edit_boxes start,end +{ + mov edi,start + mov ecx,((end-start)/ed_struc_size) +@@: + call edit_box.key + add edi,ed_struc_size + loop @b +} +ed_struc_size=72 +struc edit_box width,left,top,color,shift_color,focus_border_color,\ + blur_border_color,text_color,max,text,flags,size,pos +{ +.width dd width +.left dd left +.top dd top +.color dd color +.shift_color dd shift_color +.focus_border_color dd focus_border_color +.blur_border_color dd blur_border_color +.text_color dd text_color +.max dd max +.text dd text +.flags dd flags+0 +.size dd size+0 +.pos dd pos+0 +.offset dd 0 +.cl_curs_x dd 0 +.cl_curs_y dd 0 +.shift dd 0 +.shift_old dd 0 +} + + +macro edit_boxes_set_sys_color start,end,color_table +{ + mov edi,start + mov ecx,((end-start)/ed_struc_size) + mov esi,color_table +@@: + mov eax,[esi+36] + mov ebx,[esi+20] + mov ed_focus_border_color,eax + shr bh,1 + shr bl,1 + shr ah,1 + shr al,1 + add ah,bh + add al,bl + ror eax,16 + ror ebx,16 + shr bl,1 + shr al,1 + add al,bl + ror eax,16 + mov ed_blur_border_color,eax + add edi,ed_struc_size + loop @b +} + +macro draw_edit_box ed_ptr +{ + mov edi,ed_ptr + call edit_box.draw +} + +macro mouse_edit_box ed_ptr +{ + mov edi,ed_ptr + call edit_box.mouse +} + +macro key_edit_box ed_ptr +{ + mov edi,ed_ptr + call edit_box.key +} +macro default_box ed_ptr +{ +pusha +; xor eax,eax +; mov ed_shift_pos,eax +; mov ed_shift_pos_old,eax + and word ed_flags,ed_shift_cl +; mov ed_offset,eax +popa +} \ No newline at end of file diff --git a/programs/other/HotAngles/HAconfig/editbox.mac b/programs/other/HotAngles/HAconfig/editbox.mac new file mode 100644 index 0000000000..8a672b7e45 --- /dev/null +++ b/programs/other/HotAngles/HAconfig/editbox.mac @@ -0,0 +1,1145 @@ +;Макрос для вывода основных функций которые испльзуются боксом +macro use_general_func +{ +;debug_func +;---------------------------------------------------------- +;--- процедура прорисовки выделеной части ----------------- +;---------------------------------------------------------- +.draw_shift: + test word ed_flags,ed_shift_bac ;установка флага, выделенной области + jz @f + mov ebp,shift_color + mov ebx,dword ed_shift_pos + call .sh_cl_ +@@: ret +;---------------------------------------------------------- +;--- процедура прорисовки текста -------------------------- +;---------------------------------------------------------- +.draw_text: +;--- вычисляем, сколько помещается символов --- +;--- чтобы мусор не рисовать --- + call .get_n + mov esi,ed_size + mov ebx,ed_offset + sub esi,ebx + cmp eax,esi + jae @F + mov esi,eax ;чтобы не выходить за пределы экрана +;--- рисуем текст --- +@@: mov eax,4 + mov ebx,ed_left + mov edx,ed_offset + add ebx,2 + shl ebx,16 + add ebx,ed_top + mov ecx,ed_text_color + add ebx,4 + add edx,ed_text + mcall +ret +;---------------------------------------------------------- +;--- процедура прорисовки фона ---------------------------- +;входные данные +;eax +;edx - color +;---------------------------------------------------------- +;вход только цвет edx +.draw_bg: + mov ebx,ed_left + add ebx,1 + mov edx,ed_color + shl ebx,16 + add ebx,ed_width + sub ebx,1 +.draw_bg_eax: + mov ecx,ed_top + mov eax,13 + add ecx,1 + shl ecx,16 + add ecx,ed_height + dec ecx + mcall +ret +;---------------------------------------------------------- +;--- процедура получения количества символов в текущей щирине компонента +;---------------------------------------------------------- +.get_n: + mov eax,ed_width ;получем ширину компонента + xor edx,edx ;результат распологается в паре edx:eax в eax - остаток + sub eax,4 ;вычтим 4 + mov ebx,6 ;загрузми делитель + div ebx ;размделим на 6 +ret +;---------------------------------------------------------- +;--- процедура рисования курсора -------------------------- +;---------------------------------------------------------- +;входные ebp- цвет +.clear_cursor: + mov edx,ebp + mov ebx,cl_curs_x + mov ecx,cl_curs_y + jmp .draw_curs +.draw_cursor: + mov edx,ed_text_color + mov ebx,ed_pos + mov ecx,ed_offset + sub ebx,ecx + + lea ebx,[ebx*2+ebx] + shl ebx,1 + ;imul ebx,6 + add ebx,ed_left + mov ecx,ed_top + inc ebx + add ecx,2 + mov ebp,ebx + shl ebx,16 + mov bx,bp + mov ebp,ecx + + shl ecx,16 + mov cx,bp + add ecx,ed_height-4 + + mov cl_curs_x,ebx + mov cl_curs_y,ecx +.draw_curs: + mcall 38 +ret +;---------------------------------------------------------- +;--- процедура рисования рамки ---------------------------- +;---------------------------------------------------------- +.draw_border: +;--- цвет рамки --- + test word ed_flags,ed_focus + mov edx,ed_focus_border_color + jne @f + mov edx,ed_blur_border_color +@@: +;--- сверху --- + mov eax,38 + mov ebx,ed_left + mov ecx,ebx + shl ebx,16 + mov bx,cx + add ebx,ed_width + mov ecx,ed_top + mov esi,ecx + shl ecx,16 + mov cx,si + mcall +;--- снизу --- + mov esi,ecx + add ecx,ed_height + mov ebp,ecx + shl ecx,16 + mov cx,bp + mcall +;--- слева --- + mov cx,si + mov ebp,ebx + sub ebx,ed_width + mcall +;--- справа --- + mov ebx,ebp + shl ebx,16 + mov bx,bp + mcall +ret +;---------------------------------------------------------- +;--- проверка, зашел ли курсор за границы и, если надо, --- +;--- изменяем смещение ------------------------------------ +;--- если смещение было установка флага ed_offset_cl иначе +; если ничего не изменилось то выставление ed_offset_fl +; в общей битовой маррице состояния компонентов word ed_flags +;---------------------------------------------------------- +.check_offset: +pusha + mov ecx,ed_pos + mov ebx,ed_offset + cmp ebx,ecx + ja .sub_8 + + push ebx + call .get_n ;получим кол-во символов в паре регистров edx:eax + pop ebx + mov edx,ebx + add edx,eax ;ed_offset+width editbox + inc edx ;необходимо для номального положения курсора в крайней левой позиции + cmp edx,ecx + ja @f + + mov edx,ed_size + cmp edx,ecx + je .add_end + + sub edx,ecx + cmp edx,8 + jbe .add_8 + add ebx,8 + jmp .chk_d + +.sub_8: cmp ecx,0 + je .sub_min + cmp ebx,8 + jbe .sub_min + sub ebx,8 ;ebx=ed_offset + jmp .chk_d +.sub_min: + xor ebx,ebx + jmp .chk_d + +.add_end:sub edx,eax + mov ebx,edx + jmp .chk_d +.add_8: add ebx,edx +.chk_d: mov ed_offset,ebx + call .draw_bg + and word ed_flags,ed_offset_cl +edit_ex +@@: + or word ed_flags,ed_offset_fl +edit_ex +} + +macro use_key_func +{ +;Обработка Shift для снятия выделения неизвестной области +.shift: ;;;;;;;SHIFT + test word ed_flags,ed_shift + je .f_exit + +@@: mov ebp,shift_color + or word ed_flags,ed_shift_bac ;установка флага, выделенной области + mov ebx,dword ed_shift_pos + call .sh_cl_ + jmp .draw_cursor_text +;;;;;;;;;;;;;;;;;;;;; +.f_exit:call .check_offset + and word ed_flags,ed_shift_cl + call .enable_null + jmp .draw_cursor_text +.sh_cl_: +;;;;;;SHIFT end +;обработка очистки, при левом - правом движении выделения +;для обработки снятия выделения +;входные параметры ebp=color ebx=ed_shift_pos + mov eax,dword ed_pos + cmp eax,ebx + + jae .sh_n + push eax ;меньшее в eax + push ebx ;большее + jmp .sh_n1 + ;если иначе +.sh_n: push ebx + push eax +.sh_n1: + call .check_offset + call .get_n + mov edx,eax ;size of ed_box + mov ecx,ed_offset + add eax,ecx ;eax = w_off= ed_offset+width + mov edx,eax ;save + pop ebx ;большее + pop eax ;меньшее + + cmp eax,ecx ;сравнение с меньшего с offset. + jae .f_f ;если больше + xor eax,eax + cmp edx,ebx ;cравним размер w_off с большим + jb @f + sub ebx,ecx + jmp .nxt_f +@@: mov ebx,edx + sub ebx,ecx + jmp .nxt_f +.f_f: + sub eax,ecx + cmp edx,ebx ;cравним размер w_off с большим + jle @f + sub ebx,ecx + sub ebx,eax + jmp .nxt_f +@@: + mov ebx,edx + sub ebx,ecx + sub ebx,eax +.nxt_f: + mov edx,ebx + lea ebx,[eax*2+eax] + shl ebx,1 + add ebx,ed_left + inc ebx + shl ebx,16 + lea ecx,[edx*2+edx] + shl ecx,1 + mov bx,cx + inc ebx + mov edx,ebp;shift_color + + call .draw_bg_eax +@@: call .enable_null + ret +;;;;;;;;;;;;;;;;;;;;; +;Установка- снятие выделения в один символ +;;;;;;;;;;;;;;;;;;;;; +.drw_sim: + mov eax,dword ed_pos + call .draw_rectangle ;нарисовать прямоугольник с заданным цветом + jmp @b +;;;;;;;;;;;;;;;;;;;;; +;Фукция установки выделения при движения влево и вправо и нажатии shift +;Логика: +;;;;;;;;;; +.draw_wigwag: +;функция установки переменных + mov ebp,shift_color + call .clear_cursor + + or word ed_flags,ed_shift_bac ;установка флага, выделенной области + mov ebp,shift_color + mov eax,dword ed_pos + test word ed_flags,ed_left_fl + jz .low + jmp @f +;;;;;;;;;; +;Фукция удаления выделения при движения влево и вправо и нажатии shift +;Логика: +;;;;;;;;;; +.draw_wigwag_cl: +;функция установки переменных + mov ebp,ed_color + call .clear_cursor + + mov ebp,ed_color + mov eax,dword ed_pos + test word ed_flags,ed_left_fl + jz .low +@@: call .draw_rectangle ;нарисовать прямоугольник закрашиваемой области + ret +.low: dec eax + jmp @b +;входной параметр ebx - ed_pos +.sh_first_sh: + test word ed_flags,ed_shift + je @f + mov dword ed_shift_pos_old,ebx + test word ed_flags,ed_shift_on + jne @f + mov dword ed_shift_pos,ebx + or word ed_flags,ed_shift_on +@@: ret +;Обработка крайних положений в editbox при нажатом shift +;производит снятие выделение, если нет shift +;иначе вообще выходит +.sh_st_of: + test word ed_flags,ed_shift + jne @f + test word ed_flags,ed_shift_bac + je @f + mov ebp,ed_color + mov ebx,dword ed_shift_pos + call .sh_cl_ ;очистка выделеного фрагмента + and word ed_flags,ed_shift_cl ; очистка от того что убрали выделение + jmp .draw_cursor_text +@@: + and word ed_flags,ed_shift_off +edit_ex +;проверка состояния shift был ли он нажат раньше? +.sh_enable: + test word ed_flags,ed_shift + jne .sh_ext_en ;нарисовать закрашеный прямоугольник + + test word ed_flags,ed_shift_bac + je @f + call .check_offset + + mov ebp,ed_color + mov ebx,dword ed_shift_pos + call .sh_cl_ ;очистка выделеного фрагмента + call .draw_wigwag_cl + and word ed_flags,ed_shift_cl ; 1вар не нужно + ret + +@@: mov ebp,ed_color + call .clear_cursor + call .check_offset + ret +.sh_ext_en: + call .check_offset + test word ed_flags,ed_offset_fl + je @f +;Рисование закрашеных прямоугольников и очистка их + mov eax,dword ed_shift_pos + mov ebx,dword ed_pos + mov ecx,dword ed_shift_pos_old +;проверка и рисование закрашеных областей + cmp eax,ecx + je .1_shem + jb .smaller + cmp ecx,ebx + ja .1_shem + call .draw_wigwag_cl ;clear + jmp .sh_e_end +.smaller: + cmp ecx,ebx + jb .1_shem + call .draw_wigwag_cl ;clear + jmp .sh_e_end +;alike = +.1_shem: call .draw_wigwag +.sh_e_end: and word ed_flags,ed_shift_off + ret +@@: mov ebp,shift_color + mov ebx,dword ed_shift_pos + call .sh_cl_ + jmp .sh_e_end +;функция для обработки shift при нажатии home and end +.sh_home_end: + mov ebp,ed_color + call .clear_cursor + test word ed_flags,ed_shift_bac + je @f + mov ebp,ed_color + mov ebx,dword ed_shift_pos_old + call .sh_cl_ + +@@: test word ed_flags,ed_shift + je .sh_exit_ ;выйти + mov ebp,shift_color + mov ebx,dword ed_shift_pos + call .sh_cl_ + or word ed_flags,ed_shift_bac ;установка флага, выделенной области + jmp .sh_e_end +.sh_exit_: call .check_offset + ret +;функция внесения 0 по адресу ed_size+1 +.enable_null: + pusha + mov eax,ed_size + mov ebx,ed_text + test eax,eax + add eax,ebx + jne @f + inc eax +@@: xor ebx,ebx + mov [eax],bl +edit_ex +;- удаление символа +;Входные данные edx=ed_size;ecx=ed_pos +.del_char: + mov esi,ed_text + test word ed_flags,ed_shift_on + je @f + mov eax,dword ed_shift_pos + mov ebx,esi + cmp eax,ecx + jae .dh_n + + mov ed_pos,eax ;что бы не было убегания курсора + mov ebp,ecx + sub ebp,eax + add ebx,eax ;eax меньше + sub edx,ecx + add esi,ecx + + mov dword ed_shift_pos,ebp + jmp .del_ch_sh + ;если иначе +.dh_n: + mov ebp,eax + sub ebp,ecx + add ebx,ecx + sub edx,eax + add esi,eax + mov dword ed_shift_pos,ebp + jmp .del_ch_sh + +@@: add esi,ecx ;указатель + смещение к реальному буфферу + mov ebx,esi + inc esi + cld + + sub edx,ecx +.del_ch_sh: + + push edi + mov edi,ebx +@@: + lodsb + stosb + dec edx + jns @b + + pop edi + ret +;вычислить закрашиваемую область +;соглашение в ebp - передается ed_size +.clear_bg: + call .get_n ;получить размер в символах ширины компонента + push eax + mov ebx,ed_offset + add eax,ebx ;eax = w_off= ed_offset+width + mov ebx,ebp ;ed_size + + cmp eax,ebx + jb @f + mov eax,ed_pos + sub ebx,eax + mov ecx,ed_offset + sub eax,ecx + jmp .nxt +@@: mov ebx,ed_pos + push ebx + sub eax,ebx + mov ebx,eax ;It is don't optimal + + pop eax ;ed_pos + mov ecx,ed_offset + sub eax,ecx +.nxt: + mov ebp,eax ;проверка на выход закрашиваемой области за пределы длины + add ebp,ebx + pop edx + cmp ebp,edx + je @f + inc ebx + +@@: mov edx,ebx + lea ebx,[eax*2+eax] + shl ebx,1 + add ebx,ed_left + inc ebx + shl ebx,16 + lea ecx,[edx*2+edx] + shl ecx,1 + mov bx,cx + mov edx,ed_color + call .draw_bg_eax + ret +;;;;;;;;;;;;;;;;;;; +;;; Обработка примитивов +;;;;;;;;;;;;;;;;;;;; +;Нарисовать прямоугольник, цвет передается в ebp +;входные параметры: +;eax=dword ed_pos +;ebp=-цвет ed_color or shift_color +.draw_rectangle: + mov ecx,dword ed_offset + sub eax,ecx + lea ebx,[eax*2+eax] + shl ebx,1 + inc ebx + add ebx,ed_left + shl ebx,16 + add ebx,6 + mov edx,ebp + call .draw_bg_eax + ret +;;;;;;;;;;;;;;;;;; +;;Проверка нажат ли shift +;;;;;;;;;;;;;;;;;; +.check_shift: +pusha ;сохраним все регистры + mcall 66,3 + test al,0x03 + je @f + or word ed_flags,ed_shift ;установим флаг +@@:edit_ex +} +;макрос клавиш на которые происходит реакция +macro use_key_process backspase,delete,left,right,home,end,insert +{ +if backspase eq +else + cmp ah,8 + jz .backspace +end if +if delete eq +else + cmp ah,0xb6 + jz .delete +end if +if left eq +else + cmp ah,176 + jz .left +end if +if right eq +else + cmp ah,179 + jz .right +end if +if home eq +else + cmp ah,180 + jz .home +end if +if home eq +else + cmp ah,181 + jz .end +end if +if insert eq +else + cmp ah,185 ;insert + jz .insert +end if +} +macro use_key_no_process up,down,esc,enter,tab,numl,capsl,scrolll +{ +if up eq +else + cmp ah,177 + jz edit_box.editbox_exit +end if +if down eq +else + cmp ah,178 + jz edit_box.editbox_exit +end if +if esc eq +else + cmp ah,27 ;ESC - клавиша )) + jz edit_box.editbox_exit +end if +if enter eq +else + cmp ah,13 ;ENTER - клавиша )) + jz edit_box.editbox_exit +end if +if tab eq +else + cmp ah,9 ;TAB - клавиша )) + jz edit_box.editbox_exit +end if + +if numl eq +else + cmp ah,4 ;Num Lock - клавиша )) + jz edit_box.editbox_exit +end if + +if capsl eq +else + cmp ah,2 ;Caps Lock - клавиша )) + jz edit_box.editbox_exit +end if + +if scrolll eq +else + cmp ah,1 ;Scroll Lock - клавиша )) + jz edit_box.editbox_exit +end if + +} + +macro use_key_figures_only +{ + test word ed_flags,ed_figure_only ; только цифры ? + jz @f + cmp ah,'0' + jb .editbox_exit + cmp ah,'9' + ja .editbox_exit +@@: +} +macro are_key_shift_press +{ + test word ed_flags,ed_shift_on + je @f + ;Входные данные edx=ed_size;ecx=ed_pos + push eax + mov edx,ed_size + mov ecx, ed_pos + pusha +;;;;;;;;;;;;;;;;;;;;; +;clear input arrea + mov ebp,ed_color + mov ebx,dword ed_shift_pos + call .sh_cl_ + mov ebp,ed_size + call .clear_bg +;;;;;;;;;;;;;;;;;;;;; + popa + call .del_char +;;;; + mov eax,dword ed_shift_pos + mov ebx,ed_size + sub ebx,eax + mov ed_size,ebx + pop eax +@@: +} +macro are_key_cur_end +{ + mov ecx,ed_size + mov edx, ed_max + test word ed_flags,ed_insert + jne @f + cmp ecx,edx + jae .editbox_exit +@@: mov ebx, ed_pos + cmp ebx,edx + jl @f ; если меньше или равно + jmp .editbox_exit + +@@: ; сдвигаем символы после курсора вправо + mov ecx,ed_size + push edi eax + mov ebp,edi + mov esi,ed_text ; Указатель на буфер + ;Будем работать со строкой + add esi,ecx ;add ed_size добавим max size + mov edi,esi + + cmp ecx,ebx ;Если у нас позиция курсора = текущему размеру напечатанных символов т.е. курсор стоит в конце + je .In_k + + test word [ebp+40],ed_insert ;IF insert is enable т.к. edi изменен адресуем через ebp + jne .ins_v +;clear +pusha + mov edi,ebp + mov ebp,ed_size + call .clear_bg +popa + sub ecx,ebx ;Найдем кол-во символов для передвижения. + inc edi ;Сместим наши символы в право + std + inc ecx + @@: + ;-------- + lodsb + stosb + ;-------- + loop @b +.In_k: cld + pop eax + mov al,ah + stosb + pop edi +; вставляем код клавиши туда, где курсор + ; увеличиваем значение размера и позиции + inc dword ed_size + inc dword ed_pos + call .draw_all2 + jmp .shift +} +macro use_work_key +{ +.insert: test word ed_flags,ed_insert ;not word ed_insert + je @f + and word ed_flags,ed_insert_cl + jmp .editbox_exit +@@: + or word ed_flags,ed_insert + jmp .editbox_exit +.ins_v: + dec dword [ebp+42];ed_size ;processing is insert + sub esi,ecx + add esi,ebx + mov edi,esi +;clear +pusha + mov edi,ebp + mov ebp,ed_pos + call .clear_bg +popa + jmp .In_k +;;;;;;;;;;;;;;;;;;;;;;;;;;;; +.delete: + mov edx,ed_size + mov ecx,ed_pos + cmp edx,ecx + jg .bac_del + test word ed_flags,ed_shift_on + jne .del_bac +edit_ex +.bac_del: + call .del_char + jmp .draw_all +;;;;;;;;;;;;;;;;;;;;;;;;;;;; +;--- нажата клавиша backspace --- +.backspace: + ; проверяем, курсор у левого края ? + mov ecx,ed_pos + test ecx,ecx + jnz .del_bac + test word ed_flags,ed_shift_on + jne .bac_del + +edit_ex +.del_bac: + mov edx,ed_size + cmp edx,ecx ;if ed_pos=ed_size + je @f + dec ecx + call .del_char +@@: test word ed_flags,ed_shift_on + jne .bac_del + dec dword ed_pos +.draw_all: + push .shift;.draw_cursor_text;eax + + test word ed_flags,ed_shift_on + je @f + mov eax,dword ed_shift_pos + mov ebx,ed_size + sub ebx,eax + mov ed_size,ebx + + mov ebp,ed_color + call .clear_cursor + call .check_offset + call .draw_bg + ret +@@: dec dword ed_size + +.draw_all2: + and word ed_flags,ed_shift_cl + mov ebp,ed_color + call .clear_cursor + call .check_offset + mov ebp,ed_size + call .clear_bg + ret +;;;;;;;;;;;;;;;;;;;;;;;;;;;; +;--- нажата клавиша left --- +.left: mov ebx,ed_pos + test ebx,ebx + jz .sh_st_of + or word ed_flags,ed_left_fl + call .sh_first_sh + dec dword ed_pos + call .sh_enable + jmp .draw_cursor_text +;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +;--- нажата клавиша right --- +.right: mov ebx,ed_pos + cmp ebx,ed_size + je .sh_st_of + and word ed_flags,ed_right_fl + call .sh_first_sh + inc dword ed_pos + call .sh_enable + jmp .draw_cursor_text +;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +.home: + mov ebx,ed_pos + test ebx,ebx + jz .sh_st_of + call .sh_first_sh + xor eax,eax + mov ed_pos,eax + call .sh_home_end + jmp .draw_cursor_text +;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +.end: + mov ebx,ed_pos + cmp ebx,dword ed_size + je .sh_st_of + call .sh_first_sh + mov eax,ed_size + mov ed_pos,eax + call .sh_home_end + jmp .draw_cursor_text +} + +macro use_mouse_func +{ +;---------------------------------------------------------- +;--- Обработка .mouse_wigwag +;---------------------------------------------------------- +.mouse_wigwag: + shr eax,16 + or word ed_flags,ed_shift_bac+ed_shift_on+ed_shift +;;;;;;;;;;;;;;;;;; +;;процедура обработки положения выделенного текста, когда происходит выход за пределы editbox +;;;;;;;;;;;;;;;;;; + test ax,0x8000 + jnz .mleft + + mov ebx,ed_left + cmp eax,ebx + jb .mleft + + add ebx,ed_width + cmp eax,ebx + ja .mright + + sub ebx,ed_width + + xor edx,edx + sub eax,ebx ; вычтим из координат мышки по оси х координаты до editbox по оси х + mov ebx,6 + div ebx +;;;;;;;;;;;;;;;;;; +;;процедура обработки положения выделенного текста, в пределах области editbox +;;;;;;;;;;;;;;;;;; +;Получили координаты в eax мышки, т.е. куда она переместилась +;Рисование закрашеных прямоугольников и очистка их + add eax,ed_offset ;добавим смещение + cmp eax,dword ed_size ;если вышли за пределы, то ничего не делать + ja .mwigvag +.mdraw: + mov dword ed_pos,eax ;сохраним новое значение +;Рисование закрашеных прямоугольников и очистка их + mov ecx,dword ed_shift_pos + mov ebx,dword ed_shift_pos_old + mov dword ed_shift_pos_old,eax ;внесем новое значение старой позиции курсора +;проверка и рисование закрашеных областей + cmp ecx,ebx ;выясняем куда было движение на один шаг назад + je .m1_shem ;движения не было ранее + jb .msmaller ;движение было -> + cmp ebx,eax ;движение было до этого <- и тут мы проверяем сейчас куда движение происходит + ja .m1_shem ;если было движение <- то нужно закрасить область + je .mwigvag ;если изменения не было, то ничего не делать + mov ebp,ed_color ;тут нужно очистить область c ed_pos ed_shift_pos_old +;входные параметры ebp=color ebx=ed_shift_pos + call .sh_cl_ + jmp .mwigvag +.msmaller: + cmp ebx,eax + jb .m1_shem + mov ebp,ed_color +;входные параметры ebp=color ebx=ed_shift_pos + call .sh_cl_ + jmp .mwigvag +;alike = +.m1_shem: + mov ebp,shift_color +;входные параметры ebp=color ebx=ed_shift_pos + mov ebx,ecx + call .sh_cl_ + jmp .mwigvag +.mwigvag: + and word ed_flags,ed_shift_mcl + jmp .draw_cursor_text +; popa +; ret +.mleft: + + mov eax,ed_pos + cmp eax,0 + jbe .mwigvag + dec eax + call .check_offset + push eax + mov ebx,ed_shift_pos + mov ebp,shift_color + call .sh_cl_ + pop eax + jmp .mdraw +.mright: + mov eax,ed_pos + mov ebx,ed_size + cmp eax,ebx + jae .mwigvag + inc eax + call .check_offset + mov ebx,ed_shift_pos + mov ebp,shift_color + push eax + call .sh_cl_ + pop eax + jmp .mdraw +} + +macro use_work_mouse +;---------------------------------------------------------- +;--- А не удерживаем ли мы клавишу мышки, перемещая курсор, во все разные стороны? +;---------------------------------------------------------- +{ + test word ed_flags,ed_mouse_on + jne .mouse_wigwag +;---------------------------------------------------------- +;--- проверяем, попадает ли курсор в edit box ------------- +;---------------------------------------------------------- + + mov ebx,ed_top + cmp ax,bx + jl ._blur;.mouse_end_no_focus + + add ebx,ed_height + cmp ax,bx + jg ._blur;.mouse_end_no_focus + + shr eax,16 + + mov ebx,ed_left + cmp ax,bx + jl ._blur;.mouse_end_no_focus + + add ebx,ed_width + + cmp ax,bx + jg ._blur;.mouse_end_no_focus + +;--- изменяем позицию курсора --- + push eax + mov ebp,ed_color + call .clear_cursor + pop eax +._mvpos: + + xor edx,edx + sub eax,ed_left + + mov ebx,6 + div bx + add eax,ed_offset + cmp eax,ed_size + jna ._mshift + mov eax,ed_size +._mshift: +;;;;;;; +;;Секция обработки shift и выделения по shift +;;;;;;; + test word ed_flags,ed_shift_bac + je @f + mov ebp,dword ed_color + mov ebx,dword ed_shift_pos + push eax + call .sh_cl_ + and word ed_flags,ed_shift_bac_cl + pop eax +@@: + test word ed_flags,ed_mouse_on + jne @f + + mov dword ed_shift_pos,eax + or word ed_flags,ed_mouse_on + mov dword ed_pos,eax + mov dword [mouse_flag],edi ;установим идентификатор + bts word ed_flags,1 ;установка фокуса + jmp .m_sh +@@: + cmp eax,dword ed_shift_pos ;если позиции не изменились + je .editbox_exit + mov ed_pos,eax + mov ebp,dword shift_color + mov ebx,dword ed_shift_pos + call .sh_cl_ + or word ed_flags,ed_mous_adn_b ;установим бит что мы выделили +shift_on + +.m_sh: call .draw_text + call .draw_cursor +;---------------------------------------------------------- +;--- процедура установки фокуса --------------------------- +;---------------------------------------------------------- + jmp .drc +._blur: + test word ed_flags,ed_always_focus + jne .editbox_exit + btr word ed_flags,1 ; если не в фокусе, выходим + jnc .editbox_exit + + mov ebp,ed_color + call .clear_cursor +.drc: call .draw_border + jmp .editbox_exit +} + + +; Макрос выхода +macro edit_ex +{ +popad +ret +} +macro debug +{ + ;----------- отладка + pushad +; mov dword [ed_buffer.2],0 +; mov eax,edi + mov eax,dword [ed_buffer.2] + mov edi,ed_buffer.3 + call .str + ;рисование фона + mov eax,13 + mov ebx,178*65536+70 + mov ecx,28*65536+10 + xor edx,edx + int 0x40 + ;вывод значения на экран + mov eax,4 + mov ebx,180*65536+30 + mov ecx,0x10DDBBCC + mov edx,ed_buffer.3 + mov esi,8 + int 0x40 + popad + ;----------- отладка +} +macro debug_func +{ +.str: + mov ecx,0x0a ;задается система счисления изменяются регистры ebx,eax,ecx,edx входные параметры eax - число + ;преревод числа в ASCII строку взодные данные ecx=система счисленя edi адрес куда записывать, будем строку, причем конец переменной + cmp eax,ecx ;сравнить если в eax меньше чем в ecx то перейти на @@-1 т.е. на pop eax + jb @f + xor edx,edx ;очистить edx + div ecx ;разделить - остаток в edx + push edx ;положить в стек + ;dec edi ;смещение необходимое для записи с конца строки + call .str;перейти на саму себя т.е. вызвать саму себя и так до того момента пока в eax не станет меньше чем в ecx + pop eax + @@: ;cmp al,10 ;проверить не меньше ли значение в al чем 10 (для системы счисленя 10 данная команда - лишная)) + ;sbb al,$69 ;- честно данная инструкция меня заставляет задуматься т.е. я не знаю как это работает + ;das ;после данной команды как бы происходит уменьшение al на 66h (в книге написано другое) + or al,0x30 ;данная команда короче чем две выше + stosb ;записать элемент из регистра al в ячеку памяти es:edi + + ret ;вернуться чень интересный ход т.к. пока в стеке храниться кол-во вызовов то столько раз мы и будем вызываться +} + +;;;;;;;;;;;;;;; +;For LibGui +;;;;;;;;;;;;;;; +macro srt_ed_libgui +{ +ed_width equ [EditBox.ed_width] ;ширина компонента +ed_left equ [EditBox.ed_left] ;положение по оси х +ed_top equ [EditBox.ed_top] ;положение по оси у +ed_color equ [EditBox.ed_color] ;цвет фона компонента +shift_color equ [EditBox.shift_color] ;=0x6a9480 +ed_focus_border_color equ [EditBox.ed_focus_border_color] ;цвет рамки компонента +ed_blur_border_color equ [EditBox.ed_blur_border_color] ;цвет не активного компонента +ed_text_color equ [EditBox.ed_text_color] ;цвет текста +ed_max equ [EditBox.ed_max] ;кол-во символов которые можно максимально ввести +ed_text equ [EditBox.ed_text] ;указатель на буфер +ed_flags equ [EditBox.ed_flags] ;флаги +ed_size equ [EditBox.ed_size] ;кол-во символов +ed_pos equ [EditBox.ed_poz] ;позиция курсора +ed_offset equ [EditBox.ed_offset] ;смещение +cl_curs_x equ [EditBox.cl_curs_x] ;предыдущее координата курсора по х +cl_curs_y equ [EditBox.cl_curs_y] ;предыдущее координата курсора по у +ed_shift_pos equ [EditBox.ed_shift_pos] ;положение курсора +ed_shift_pos_old equ [EditBox.ed_shift_pos_old] ;старое положение курсора +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +;Bit mask from editbox +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +ed_figure_only= 1000000000000000b ;одни символы +ed_always_focus= 100000000000000b +ed_focus= 10b ;фокус приложения +ed_shift_on= 1000b ;если не установлен -значит впервые нажат shift,если был установлен, значит мы уже что - то делали удерживая shift +ed_shift_on_off=1111111111110111b +ed_shift= 100b ;включается при нажатии на shift т.е. если нажимаю +ed_shift_off= 1111111111111011b +ed_shift_bac= 10000b ;бит для очистки выделеного shift т.е. при установке говорит что есть выделение +ed_shift_bac_cl=1111111111101111b ;очистка при удалении выделения +ed_shift_cl= 1111111111100011b +ed_shift_mcl= 1111111111111011b +ed_left_fl= 100000b +ed_right_fl= 1111111111011111b +ed_offset_fl= 1000000b +ed_offset_cl= 1111111110111111b +ed_insert= 10000000b +ed_insert_cl= 1111111101111111b +ed_mouse_on = 100000000b +ed_mous_adn_b= 100011000b +ed_mouse_on_off=1111111011111111b +ed_height=14 ; высота +} \ No newline at end of file diff --git a/programs/other/HotAngles/ReadMe.txt b/programs/other/HotAngles/ReadMe.txt new file mode 100644 index 0000000000..b26083b5e7 --- /dev/null +++ b/programs/other/HotAngles/ReadMe.txt @@ -0,0 +1,75 @@ +Hot Angles + +Version 0.1: Sep 18, 2018 +RU + +╩юьяыхъЄ єЄшышЄ (рэрыюу Hot Corners т фЁєушї ╬╤) фы  Ёрё°шЁхэш  тючьюцэюёЄхщ Ёрсюўхую ёЄюыр яюы№чютрЄхы . ═рчтрэшх т√сЁрэю яєЄ╕ь уюыюёютрэш . ┬ ъюьяыхъЄ тїюф Є фтх єЄшышЄ√: +@HOTANGLES - юёэютэр  єЄшышЄр, яючтюы ■∙р  чряєёърЄ№ яЁшыюцхэш  яєЄ╕ь эртхфхэш  ъєЁёюЁр т єуюы ¤ъЁрэр (єуюы Ёрсюўхщ юсырёЄш); +HACONFIG - єЄшышЄр ъюэЇшуєЁрЄюЁ, яючтюы ■∙р  эрёЄЁюшЄ№ фхщёЄтш  эр ърцф√щ єуюы ш ръЄштшЁютрЄ№/фхръЄштшЁютрЄ№ ¤Єє юяЎш■. +╘рщы ъюэЇшуєЁрЎшш: RD/1/SETTINGS/HOTANGLES.CFG (уфх RD/1/ ¤Єю ЄюЄ цх SYS - яєЄ№ ъ ёшёЄхьэющ фшЁхъЄюЁшш). ╘рщы ёюёЄюшЄ шч я Єш ёЄЁюъ: +1) ёюёЄю эшх ръЄштэюёЄш юяЎшш: y - юяЎш  ръЄштэр, n шыш ы■сющ фЁєующ ёшьтюы - юяЎш  юЄъы■ўхэр; +2) ъюьрэфр (яюыэюх шь  яЁшыюцхэш ) фы  тхЁїэхую ыхтюую єуыр ¤ъЁрэр; +3) ъюьрэфр (яюыэюх шь  яЁшыюцхэш ) фы  ыхтюую эшцэхую єуыр ¤ъЁрэр; +4) ъюьрэфр (яюыэюх шь  яЁшыюцхэш ) фы  яЁртюую тхЁїэхую єуыр ¤ъЁрэр; +5) ъюьрэфр (яюыэюх шь  яЁшыюцхэш ) фы  яЁртюую эшцэхую єуыр ¤ъЁрэр. +┼ёыш эхюсїюфшью эрёЄЁюшЄ№ Єюы№ъю ўрёЄ№ єуыют, р юёЄры№э√х юёЄртшЄ№ схч фхщёЄтш , Єю т ъюэЇшуєЁрЄюЁх шыш эр эєцэющ ёЄЁюъх ъюэЇшуєЁрЎшюээюую Їрщыр єърцшЄх чэръ ьшэєё (ёшьтюы '-'). + +╬сх єЄшышЄ√ ёюфхЁцрЄ чр∙шЄє юЄ яютЄюЁэюую чряєёър. +╙ЄшышЄр @HOTANGLES фюсртыхэр т ртЄючруЁєчъє ╬╤. +@HOTANGLES эх чряєёЄшЄё , хёыш ъюэЇшуєЁрЎшюээ√щ Їрщы юЄёєЄёЄтєхЄ шыш с√ы яхЁхшьхэютрэ. +HACONFIG яЁш юЄёєЄёЄтшш ъюэЇшуєЁрЎшюээюую Їрщыр т√ёЄрты хЄ тёх яюы  яю єьюыўрэш■, эю эх ёючфр╕Є Їрщы ъюэЇшуєЁрЎшш ёрьюёЄю Єхы№эю (фы  ¤Єюую эхюсїюфшью эрцрЄ№ ъэюяъє "╧ЁшьхэшЄ№", Єюуфр юЄёєЄёЄтє■∙шщ Їрщы ъюэЇшуєЁрЎшш сєфхЄ ёючфрэ, р ёє∙хёЄтє■∙шщ яхЁхчряшёрэ). +╧Ёш яхЁтюь ёЄрЁЄх єЄшышЄ√ тёх єуы√ Ёрсюўхщ юсырёЄш эрёЄЁюхэ√ эр чряєёъ ъюэЇшуєЁрЄюЁр, уфх т√ ьюцхЄх эрёЄЁюшЄ№ єЄшышЄє яюф ёхс  шыш юЄъы■ўшЄ№ х╕. + +╧Ёюўшх ЁхъюьхэфрЎшш: +═хъюЄюЁ√ь яюы№чютрЄхы ь ьюцхЄ с√Є№ єфюсэю эрёЄЁюшЄ№ юЄъЁ√Єшх ьхэ■ яЁш яюярфрэшш т єуюы хую Ёрёяюыюцхэш . ═ряЁшьхЁ, хёыш є трё ъэюяър "╠хэ■" Ёрёёяюыюцхэр т ыхтюь эшцэхь єуыє, Єю чрфрщЄх фы  ¤Єюую єуыр ъюьрэфє: +/rd/1/@MENU + +┬ыш эшх эр яЁюшчтюфшЄхы№эюёЄ№: +┼ёыш т√ шёяюы№чєхЄх ёшёЄхьє т чрфрўрї Ёхры№эюую тЁхьхэш шыш т чрфрўрї ё т√ёюъющ эруЁєчъющ эр CPU юЄъы■ўшЄх ¤Єє юяЎш■. ╥ръ цх, хёыш т√ цхырхЄх фюсшЄ№ё  ьръёшьры№эющ ёъюЁюёЄш ЁрсюЄ√ ╬╤, Єю шёяюы№чютрэшх ¤Єющ юяЎшш эх ЁхъюьхэфєхЄё . +╧Ёшыюцхэшх ьюцхЄ єтхышўштрЄ№ эруЁєчъє эр ёшёЄхьє т фтр Ёрчр яЁш юс√ўэюь шёяюы№чютрэшш ь√°ш (яхЁхьх∙хэшх ъєЁёюЁр, ъышъш т юяЁхфхы╕ээ√ї юсырёЄ ї ¤ъЁрэр). +╧Ёш т√яюыэхэшш юёэютэющ ЇєэъЎшш (чряєёъ ы■сюую яЁшыюцхэш  яЁш эртхфхэшш ъєЁёюЁр т єуюы ¤ъЁрэр) эруЁєчър эр ёшёЄхьє тючЁрёЄрхЄ хёЄхёЄтхээ√ь юсЁрчюь. + +╚чтхёЄэ√х эхфюЁрсюЄъш, ъюЄюЁ√х сєфєЄ шёяЁртыхэ√ т ёыхфє■∙шї тхЁёш ї: +[-] юЄёєЄёЄтшх Ёєёёъюую  ч√ър; +[-] шёяюы№чєхЄё  ьрыхэ№ъшщ °ЁшЇЄ ЄхъёЄр; +[-] эхЄ тючьюцэюёЄш чряєёър яЁшыюцхэш  ё ярЁрьхЄЁрьш; +[-] чэръ ьшэєё эх тыш хЄ эр яюя√Єъє чряєёър т ъюэъЁхЄэюь єуыє; +[-] яєёЄюх яюых т ъюэЇшуєЁрЄюЁх ш яєёЄр  ёЄЁюър т ъюэЇшуєЁрЎшюээюь Їрщых эхтхЁэю юсЁрсрЄ√тр■Єё ; +[-] яЁшёєЄёЄтєхЄ эхшёяЁртыхээ√щ сру т ъюьяюэхэЄх EditBox; +[-] яЁшыюцхэшх ъюэЇшуєЁрЄюЁр эх фюсртыхэю т ёшёЄхьэє■ ярэхы№. + +╧юффхЁцрЄ№ ЁрчЁрсюЄўшър, ёё√ыър фы  фюэрЄр: +https://money.yandex.ru/to/410011935289152 + +╧ю эрщфхээ√ь ю°шсърь, тюяЁюёрь Єхїэшўхёъющ яюью∙ш ш яюффхЁцъш юсЁр∙рщЄхё№ эр +E-Mail: theonlymirage@gmail.com + +╧ЁюЎхёё ёючфрэш  Hot Angles ўрёЄшўэю чряхўрЄы╕э эр тшфхю: +https://youtu.be/l6mZflqOTJo +https://youtu.be/ssYuJSoBGrk +https://youtu.be/4slBjIoYJis +https://youtu.be/N69_Cky1vB0 + + +╙ЄшышЄ√ яюыэюёЄ№■ эряшёрэ√ эр FASM. └тЄюЁ: ╤хЁухщ ┼ЇЁхьхэъют. +╦шЎхэчшюээюх ёюуыр°хэшх: + + 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 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.