0,0 → 1,393 |
; |
; DESKTOP CONTEXT MENU |
; written by Ivan Poddubny |
; |
; ¢â®à - ¢ ®¤¤ã¡ë© |
; e-mail: ivan-yar@bk.ru |
; |
; Compile with flat assembler |
; |
;------------------------------------------------------------------------------ |
; version: 1.1 |
; last update: 27/03/2012 |
; changed by: Marat Zakiyanov aka Mario79, aka Mario |
; changes: The program uses only 3404 bytes memory is now. |
; Optimisations and code refactoring. |
;------------------------------------------------------------------------------ |
include 'lang.inc' |
include '..\..\..\..\macros.inc' |
;------------------------------------------------------------------------------ |
use32 |
org 0x0 |
db 'MENUET01' ; 8 byte id |
dd 0x01 ; header version |
dd START ; start of code |
dd IM_END ; size of image |
dd I_END ; memory for app |
dd stack_area ; esp |
dd 0 ; boot parameters |
dd 0 ; path |
;------------------------------------------------------------------------------ |
START: |
; ¯®«ãç¨âì á¨áâ¥¬ë¥ æ¢¥â |
mcall 48,3,sc,sizeof.system_colors |
; ãáâ ®¢¨¬ ¬ áªã ᮡë⨩ - á ¨â¥à¥áã¥â ⮫쪮 ¬ëèì |
mcall 40,100000b |
;------------------------------------------------------------------------------ |
align 4 |
still: ; £« ¢ë© 横« ®á®¢®£® ¯à®æ¥áá |
mcall 10 ; ¦¤ñ¬ ᮡëâ¨ï |
|
mcall 37,2 ; ª ª¨¥ ¦ âë ª¯®¯ª¨? |
cmp eax,ebx ; ¥á«¨ ¥ ¯à ¢ ï, ¢®§¢à â |
jne still |
;-------------------------------------- |
; íâ® ¤«ï ®â« ¤ª¨ - ¥á«¨ ¬ëèì ¢ â®çª¥ (0;0), § ªà®¥¬áï |
; xor ebx,ebx |
; mcall 37 |
; test eax,eax ; ªãàá®à ¢ â®çª¥ (0;0), â.¥. eax = 0 |
; je exit |
;-------------------------------------- |
; ª®®à¤¨ âë ªãàá®à |
xor ebx,ebx |
mcall 37 |
|
mov ebx,eax ; eax = cursor_x |
shr eax,16 ; ebx = cursor_y |
and ebx,0xffff |
mov [curx1],eax ; curx1 = cursor_x |
mov [cury1],ebx ; cury1 = cursor_y |
; ª®¬ã ¯à¨ ¤«¥¦¨â â®çª ? |
mcall 34,[curx1],[cury1] |
cmp al,1 ; 1 - ï¤à® |
jne still |
;-------------------------------------- |
align 4 |
@@: ; ¯®¤®¦¤ñ¬, ¯®ª ¯®«ì§®¢ â¥«ì ¥ ®â¯ãá⨫ ¯à ¢ãî ª®¯ªã ¬ëè¨ |
mcall 37,2 ; ¦ âë «¨ ª®¯ª¨ ¬ëè¨? |
test eax,ebx ; ¥á«¨ ®â¯ãá⨫, (eax != 2) |
jz @f ; ¨¤ñ¬ ¢ ç «® £« ¢®£® 横« |
|
mcall 68,1 ; ¨ ç¥ ¯¥à¥ª«î稬áï á«¥¤ãî騩 ¯®â®ª á¨áâ¥¬ë ¨ ª®£¤ |
jmp @b ; ¢ë¯®«¥¨¥ ¢¥à¥âáï í⮬㠯®â®ªã, ¯à®¢¥à¨¬ ¬ëèì ®¯ïâì |
;-------------------------------------- |
align 4 |
@@: |
; ¥á«¨ 㦥 ¡ë«® ®âªàëâ® ¬¥î, 㦮 ¯®¤®¦¤ âì, ¯®ª ®® § ªà®¥âáï: |
cmp [menu_opened],0 |
je @f |
|
mcall 68,1 ; ¯¥à¥ª«î稬áï á«¥¤ãî騩 ¯®â®ª á¨á⥬ë |
; ¡®«¥¥ íää¥ªâ¨¢ë© á¯®á®¡ § ¤¥à¦ª¨ 祬 mcall 5 |
jmp @b |
;-------------------------------------- |
align 4 |
@@: |
; ⥯¥àì ¬®¦® ᬥ«® § ¯ã᪠âì ¯à®æ¥áá (¯®â®ª) ¬¥î |
mcall 51,1,start_wnd,stack_wnd |
jmp still |
;------------------------------------------------------------------------------ |
align 4 |
exit_menu: ; ¥á«¨ ¢ë室¨¬ ¨§ ¬¥î, ¤® § ¯¨á âì ¢ [menu_opened] 0 |
mov [menu_opened],0 |
;-------------------------------------- |
align 4 |
exit: ; áî¤ ¬ë ¨¤ñ¬, ª®£¤ ¢ë室¨¬ ¨§ ®á®¢®£® ¯à®æ¥áá |
or eax,-1 ; eax = -1 |
mcall |
;------------------------------------------------------------------------------ |
; §¤¥áì áâ àâã¥â ¯à®æ¥áá ¬¥î |
;------------------------------------------------------------------------------ |
align 4 |
start_wnd: |
mov [menu_opened],1 |
; ãáâ ®¢¨¬ ¬ áªã ¦¥« ¥¬ëå ᮡë⨩: ¬¥î + ª®¯ª¨ + ¯¥à¥à¨á®¢ª |
mcall 40,100101b |
;------------------------------------------------------------------------------ |
align 4 |
red: |
call draw_window |
;------------------------------------------------------------------------------ |
align 4 |
still2: ; £« ¢ë© 横« ¯à®æ¥áá ¬¥î |
mcall 10 ; ¦¤ñ¬ ᮡëâ¨ï |
|
cmp eax,1 ; ¯¥à¥à¨á®¢ª ? |
je red |
|
cmp eax,3 ; ª®¯ª ? |
je button |
|
cmp eax,6 ; ¬ëèì? |
je mouse |
|
jmp still2 ; ¢¥àñ¬áï ¢ ç «® £« ¢®£® 横« |
;------------------------------------------------------------------------------ |
align 4 |
; |
mouse: ; ª®£¤ ¯®«ì§®¢ â¥«ì ¦¬ñâ ª®¯ªã ¬ëè¨, § ªà®¥¬áï |
mcall 37,2 ; ª ª¨¥ ª®¯ª¨ ¦ âë? |
test eax,eax ; ¨ª ª¨¥? - ⮣¤ ¯à¥ªà á®! ¢¥àñ¬áï ¢ £« ¢ë© 横« |
jz still2 |
|
mcall 37,0 |
|
mov esi, eax |
shr esi, 16 |
movzx edi, ax |
mcall 9, procinfo, -1 |
|
mov eax, [procinfo.box.left] |
cmp esi, eax |
jl exit_menu |
|
add eax, [procinfo.box.width] |
cmp esi, eax |
jge exit_menu |
|
mov eax, [procinfo.box.top] |
cmp edi, eax |
jl exit_menu |
|
add eax, [procinfo.box.height] |
cmp edi, eax |
jge exit_menu |
|
jmp still2 |
;------------------------------------------------------------------------------ |
align 4 |
; |
button: |
mcall 17 ; ¯®«ãç¨âì ¨¤¥â¨ä¨ª â®à ¦ ⮩ ª®¯ª¨ |
|
sub ah,10 ; áà ¢¨¢ ¥¬ á 10 |
jl nofuncbtns ; ¥á«¨ ¬¥ìè¥ - § ªàë¢ ¥¬ ¬¥î |
|
movzx ebx,ah ; ¯®«ã稫¨ ®¬¥à ¯à®£à ¬¬ë ¢ ᯨ᪥ ¢ ebx |
mov esi,[startapps + ebx*4] |
mov edi,start_info.path |
cld |
;-------------------------------------- |
align 4 |
@@: |
lodsb |
stosb |
test al,al |
jnz @b |
mcall 70, start_info |
|
; mov eax,5 ; ¯®¤®¦¤ñ¬, ¯®ª ¯à®£à ¬¬ § ¯ãáâ¨âìáï |
; mov ebx,1 ; â® ¥ñ ®ª® ¥ ¡ã¤¥â ®âà¨á®¢ ® (¡ £ ¢ ï¤à¥???) |
; mcall ; à ᪮¬¬¥â¨àã©â¥ í⨠áâப¨, ¥á«¨ ã ¢ á ¯à®¡«¥¬ë |
; á ®âà¨á®¢ª®© |
;-------------------------------------- |
align 4 |
nofuncbtns: ; § ªàë¢ ¥¬ ¬¥î |
jmp exit_menu |
;------------------------------------------------------------------------------ |
_BTNS_ = 6 ; ª®«¨ç¥á⢮ ª®¯®ª ("¯ãªâ®¢ ¬¥î") |
|
if lang eq ru |
font = 0x00000000 |
string_length = 20 ; ¤«¨ áâப¨ |
wnd_x_size = 133 ; è¨à¨ ®ª |
title_pos = 36 shl 16 + 7 |
else |
font = 0x10000000 |
string_length = 12 ; ¤«¨ áâப¨ |
wnd_x_size = 105 ; è¨à¨ ®ª |
title_pos = 23 shl 16 + 7 |
end if |
;------------------------------------------------------------------------------ |
;******************************* |
;********
******** |
;******************************* |
draw_window: |
mcall 12,1 ; ç¨ ¥¬ "à¨á®¢ âì" |
|
mov eax,[curx1] ; ⥪ã騥 ª®®à¤¨ âë ªãàá®à |
mov [curx],eax ; § ¯¨è¥¬ ¢ ª®®à¤¨ âë ®ª |
mov eax,[cury1] |
mov [cury],eax |
; ⥯¥àì ¡ã¤¥¬ áç¨â âì ª®®à¤¨ âë ®ª , çâ®¡ë ®® § ªà © íªà ¥ ¢ë«¥§«® |
mcall 14 ; ¯®«ã稬 à §¬¥à íªà |
|
mov ebx,eax |
shr eax,16 ; ¢ eax - x_screen |
and ebx,0xffff ; ¢ ebx - y_screen |
add eax,-wnd_x_size ; eax = [x_screen - è¨à¨ ®ª ] |
add ebx,-_BTNS_*15-21 ; ebx = [y_screen - ¢ëá®â ®ª ] |
|
cmp eax,[curx] |
jg .okx ; ¥á«¨ ®ª® ᫨誮¬ ¡«¨§ª® ª ¯à ¢®¬ã ªà î, |
add [curx],-wnd_x_size ; ᤢ¨¥¬ ¥£® ¢«¥¢® 100 |
;-------------------------------------- |
align 4 |
.okx: |
cmp ebx, [cury] |
jg .oky ; ¯® ¢¥à⨪ «¨ â®ç® â ª¦¥ |
add [cury], -_BTNS_*15-21 |
;-------------------------------------- |
align 4 |
.oky: |
xor eax, eax ; äãªæ¨ï 0 - ᮧ¤ âì ®ª® |
mov ebx, [curx] ; ebx = [ª®®à¤¨ â ¯® x] shl 16 + [è¨à¨ ] |
shl ebx, 16 |
add ebx, wnd_x_size |
mov ecx, [cury] ; ecx = [ª®®à¤¨ â ¯® y] shl 16 + [¢ëá®â ] |
shl ecx, 16 |
add ecx, _BTNS_*15+21 |
mov edx, [sc.work] ; 梥â à ¡®ç¥© ®¡« á⨠|
mov esi, [sc.grab] ; 梥⠧ £®«®¢ª |
or esi, 0x81000000 |
mov edi, [sc.frame] ; 梥â à ¬ª¨ |
mcall |
|
mov eax, 4 ; § £®«®¢®ª |
mov ebx, title_pos ; [x] shl 16 + [y] |
mov ecx, [sc.grab_text]; èà¨äâ ¨ 梥â (á¥àë©) |
or ecx, 0x10000000 |
|
push ecx |
push ecx |
xor edx,edx |
;-------------------------------------- |
align 4 |
.dec_color: |
sub byte [esp+edx], 0x33 |
jae @f |
mov byte [esp+edx], 0 |
;-------------------------------------- |
align 4 |
@@: |
inc edx |
jnp .dec_color |
pop ecx |
mov edx, title ; ¤à¥á § £®«®¢ª |
mov esi, title.size ; ¤«¨ § £®«®¢ª ("M E N U") |
mcall |
pop ecx |
add ebx, 1 shl 16 ; ᤢ¨¥¬ ¢¯à ¢® 1 |
mcall |
|
mov ebx, 1*65536+wnd_x_size-2 ; ç¨ ¥¬ ¤¥« âì ª®¯ª¨ |
mov ecx, 20*65536+15 |
mov edx, 10 or 0x40000000 ; ¡¨â 30 ãáâ ®¢«¥ => ª®¯ª ¥ à¨áã¥âáï |
|
mov edi,_BTNS_ ; ª®«¨ç¥á⢮ ª®¯®ª (áçñâ稪) |
;-------------------------------------- |
align 4 |
newbtn: ; ç «® 横« |
mcall 8 ; ᮧ¤ ñ¬ ª®¯ªã |
|
; ¯¨è¥¬ ⥪áâ ª®¯ª¥ |
pushad ; á¯ á ¥¬ ॣ¨áâàë |
shr ecx, 16 |
and ebx, 0xffff0000 |
add ebx, ecx ; ebx = [x] shl 16 + [y]; |
add ebx, 10*65536+4 ; ebx += ᬥ饨¥ ®â®á¨â¥«ì® ªà ï ª®¯ª¨; |
mov ecx, [sc.work_text] ; èà¨äâ ¨ 梥â |
or ecx, font |
add edx, -10 ; edx = ®¬¥à ª®¯ª¨; |
imul edx, string_length ; edx *= ¤«¨ áâப¨; |
add edx, text ; edx += text; ⥯¥àì ¢ edx ¤à¥á áâப¨ |
mov esi, string_length ; ¢ esi - ¤«¨ áâப¨ |
mcall 4 |
popad |
|
inc edx ; ®¬¥à ª®¯ª¨++; |
add ecx,15*65536 ; 㢥«¨ç¨¬ ᬥ饨¥ ¯® y |
dec edi ; 㬥ì訬 áçñâ稪 |
jnz newbtn ; ¥á«¨ ¥ ®«ì, ¯®¢â®à¨¬ ¢áñ ¥éñ à § |
|
mcall 12,2 ; § ª®ç¨«¨ "à¨á®¢ âì" |
ret ; ¢®§¢à â |
;------------------------------------------------------------------------------ |
align 4 |
;
|
|
macro strtbl name, [string] |
{ |
common |
label name dword |
forward |
local str |
dd str |
forward |
str db string |
} |
|
strtbl startapps ,\ |
<"/sys/PIC4",0> ,\ |
<"/sys/DESKTOP",0> ,\ |
<"/sys/ICON",0>,\ |
<"/sys/SETUP",0> ,\ |
<"/sys/DEVELOP/BOARD",0> ,\ |
<"/sys/CPU",0> |
|
sz title, "KolibriOS" |
|
lsz text,\ |
en, 'Background ',\ |
en, 'Desktop ',\ |
en, 'Icon manager',\ |
en, 'Device setup',\ |
en, 'Debug board ',\ |
en, 'Processes ',\ |
\ |
ru, '¥¥à â®à ®¡®¥¢ ',\ |
ru, ' áâனª ®ª® ',\ |
ru, '¯à ¢«¥¨¥ ¨ª®ª ¬¨ ',\ |
ru, ' áâனª ãáâனá⢠',\ |
ru, ' ¥«ì ®â« ¤ª¨ ',\ |
ru, 'à®æ¥ááë ',\ |
\ |
et, 'Taust ',\ |
et, 'Töölaud ',\ |
et, 'Ikooni hald.',\ |
et, 'Seadme hald.',\ |
et, 'Silumis aken',\ |
et, 'Protsessid ' |
|
;------------------------------------------------------------------------------ |
align 4 |
start_info: |
.mode dd 7 |
dd 0 |
.params dd 0 |
dd 0 |
dd 0 |
db 0 |
dd start_info.path |
;------------------------------------------------------------------------------ |
IM_END: |
align 4 |
;
|
curx1 dd ? ; ª®®à¤¨ âë ªãàá®à |
cury1 dd ? |
curx dd ? ; ª®®à¤¨ âë ®ª ¬¥î |
cury dd ? |
|
menu_opened db ? ; ®âªàëâ® ¬¥î ¨«¨ ¥â? (1-¤ , 0-¥â) |
;------------------------------------------------------------------------------ |
align 4 |
start_info.path rb 256 |
;------------------------------------------------------------------------------ |
align 4 |
sc system_colors ; á¨áâ¥¬ë¥ æ¢¥â |
;------------------------------------------------------------------------------ |
align 4 |
procinfo process_information ; ¨ä®à¬ æ¨ï ® ¯à®æ¥áᥠ|
;------------------------------------------------------------------------------ |
align 4 |
rb 512 ; áâíª ¤«ï ®ª ¬¥î - å¢ â¨â ¨ 1 ¡ |
stack_wnd: |
;------------------------------------------------------------------------------ |
align 4 |
rb 512 |
stack_area: |
;------------------------------------------------------------------------------ |
I_END: |
;------------------------------------------------------------------------------ |
;
|
;------------------------------------------------------------------------------ |