From 8cdca726a042d20813a64ce8a38152e2eaba74b3 Mon Sep 17 00:00:00 2001 From: "Marat Zakiyanov (Mario79)" Date: Tue, 27 Mar 2012 09:57:38 +0000 Subject: [PATCH] @RB - some optimisations and code refactoring git-svn-id: svn://kolibrios.org@2510 a494cfbc-eb01-0410-851d-a64ba20cac60 --- programs/system/rb/trunk/@RB.ASM | 588 +++++++++++++------------- programs/system/rb/trunk/build_en.bat | 1 + programs/system/rb/trunk/build_ru.bat | 1 + 3 files changed, 301 insertions(+), 289 deletions(-) diff --git a/programs/system/rb/trunk/@RB.ASM b/programs/system/rb/trunk/@RB.ASM index 67b86b6ba..13e0d5b14 100644 --- a/programs/system/rb/trunk/@RB.ASM +++ b/programs/system/rb/trunk/@RB.ASM @@ -7,223 +7,229 @@ ; ; 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' - -meos_app_start -code - - mov eax, 48 ; получить системные цвета - mov ebx, 3 - mov ecx, sc ; адрес структуры - mov edx, sizeof.system_colors ; и ее размер - mcall - - mov eax,40 ; установим маску событий - mov ebx,100000b ; нас интересует только мышь - mcall - +;------------------------------------------------------------------------------ + 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 ; ждём события - mov eax,10 ; ждём события - mcall + 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 ecx,ecx + mcall 9,procinfo - mov eax,37 ; какие нажаты кпопки? - mov ebx,2 - mcall + inc eax ; теперь в eax содержится число процессов + 1 + mov [processes],eax + mov ecx,1 +;-------------------------------------- +align 4 +new_process: + pushad +; получим информацию о процессе; номер - в ecx + mcall 9,procinfo +; координаты курсора + xor ebx,ebx + mcall 37 - cmp eax,ebx ; если не правая, возврат - jne still - -;---поехали!--- - -; mov eax,37 ; это для отладки - если мышь в точке (0;0), закроемся -; xor ebx,ebx -; mcall -; test eax,eax ; курсор в точке (0;0), т.е. eax = 0 -; je exit - - - mov eax,9 ; получим число процессов в системе - mov ebx,procinfo - xor ecx,ecx - mcall - - inc eax ; теперь в eax содержится число процессов + 1 - mov [processes],eax - mov ecx,1 - - new_process: - pushad - mov eax,9 ; получим информацию о процессе; номер - в ecx - mov ebx,procinfo - mcall - mov eax,37 ; координаты курсора - xor ebx,ebx - mcall - 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 + 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 ; \begin{diamond}[18.09.2006] ; ignore minimized windows test [procinfo.wnd_state], 2 jnz ne_goden ; \end{diamond}[18.09.2006] - mov eax,[procinfo.box.left] ; eax = wnd_x_start - mov ebx,[procinfo.box.top] ; ebx = wnd_y_start + mov eax,[procinfo.box.left] ; eax = wnd_x_start + mov ebx,[procinfo.box.top] ; ebx = wnd_y_start - mov ecx,[procinfo.box.width] - add ecx,eax ; ecx = wnd_x_end - mov edx,[procinfo.box.height] - add edx,ebx ; ecx = wnd_y_end + mov ecx,[procinfo.box.width] + add ecx,eax ; ecx = wnd_x_end + mov edx,[procinfo.box.height] + add edx,ebx ; ecx = wnd_y_end - cmp eax,[curx1] ; wnd_x_start > cursor_x => курсор левее окна - jg ne_goden - cmp ecx,[curx1] ; wnd_x_end < cursor_x => курсор правее окна - jl ne_goden - cmp ebx,[cury1] ; wnd_y_start > cursor_y => курсор выше окна - jg ne_goden - cmp edx,[cury1] ; wnd_y_end < cursor_y => курсор ниже окна - jl ne_goden + cmp eax,[curx1] ; wnd_x_start > cursor_x => курсор левее окна + jg ne_goden + cmp ecx,[curx1] ; wnd_x_end < cursor_x => курсор правее окна + jl ne_goden + + cmp ebx,[cury1] ; wnd_y_start > cursor_y => курсор выше окна + jg ne_goden + + cmp edx,[cury1] ; wnd_y_end < cursor_y => курсор ниже окна + jl ne_goden +;-------------------------------------- +align 4 goden: ; клик был внутри какого-то окна, поэтому ничего не делаем - popad - jmp still - + popad + jmp still +;-------------------------------------- +align 4 ne_goden: ; клик был снаружи рассматриваемого окна, поэтому - popad - inc ecx - cmp ecx,[processes] - jl new_process ; либо сморим следующее окно, либо запускаем меню - - + popad + inc ecx + cmp ecx,[processes] + jl new_process ; либо сморим следующее окно, либо запускаем меню +;-------------------------------------- +align 4 @@: ; подождём, пока пользователь не отпустил правую кнопку мыши - mov eax,37 - mov ebx,2 ; функция 37-2: - mcall ; нажаты ли кнопки мыши? - test eax,ebx ; если отпустил, (eax != 2) - jz @f ; идём в начало главного цикла + mcall 37,2 ; нажаты ли кнопки мыши? + test eax,ebx ; если отпустил, (eax != 2) + jz @f ; идём в начало главного цикла - mov eax,5 ; иначе - ;mov ebx,2 ; подождём 2 мс - mcall - - jmp @b ; и проверим мышь опять + mcall 68,1 ; иначе переключимся на следующий поток системы и когда + jmp @b ; выполнение вернется этому потоку, проверим мышь опять +;-------------------------------------- +align 4 @@: - ; если уже было открыто меню, нужно подождать, пока оно закроется: + cmp [menu_opened],0 + je @f + + mcall 68,1 ; переключимся на следующий поток системы + ; более эффективный способ задержки чем mcall 5 + jmp @b +;-------------------------------------- +align 4 @@: - cmp [menu_opened],0 - je @f - mov eax,5 - mov ebx,3 ; ждём 3 мс - mcall - jmp @b -@@: - - mov eax,51 ; а теперь можно смело запускать процесс (поток) меню - mov ebx,1 ; создаём поток (thread) - mov ecx,start_wnd ; точка входа потока - mov edx,stack_wnd ; вершина стэка для потока - mcall - - jmp still - - - +; а теперь можно смело запускать процесс (поток) меню + mcall 51,1,start_wnd,stack_wnd + jmp still +;------------------------------------------------------------------------------ +align 4 exit_menu: ; если выходим из меню, надо записать в [menu_opened] 0 - mov [menu_opened],0 + mov [menu_opened],0 +;-------------------------------------- +align 4 exit: ; сюда мы идём, когда выходим из основного процесса - or eax,-1 ; eax = -1 - mcall - - - - + or eax,-1 ; eax = -1 + mcall +;------------------------------------------------------------------------------ ; здесь стартует процесс меню +;------------------------------------------------------------------------------ +align 4 start_wnd: - mov [menu_opened],1 - mov eax,40 ; установим маску желаемых событий для этого процесса - mov ebx,100101b ; меню + кнопки + перерисовка - mcall - + mov [menu_opened],1 +; установим маску желаемых событий: меню + кнопки + перерисовка + mcall 40,100101b +;------------------------------------------------------------------------------ +align 4 red: - call draw_window - + call draw_window +;------------------------------------------------------------------------------ +align 4 still2: ; главный цикл процесса меню + mcall 10 ; ждём события - mov eax,10 ; ждём события - mcall - - cmp eax,1 ; перерисовка? - je red - cmp eax,3 ; кнопка? - je button - cmp eax,6 ; мышь? - je mouse - - jmp still2 ; вернёмся в начало главного цикла - + cmp eax,1 ; перерисовка? + je red + + cmp eax,3 ; кнопка? + je button + + cmp eax,6 ; мышь? + je mouse + jmp still2 ; вернёмся в начало главного цикла +;------------------------------------------------------------------------------ +align 4 ; ОБРАБОТЧИК МЫШИ mouse: ; когда пользователь нажмёт кнопку мыши, закроемся - mov eax,37 - mov ebx,2 ; какие кнопки нажаты? - mcall - test eax,eax ; никакие? - тогда прекрасно! вернёмся в главный цикл - jz still2 + mcall 37,2 ; какие кнопки нажаты? + test eax,eax ; никакие? - тогда прекрасно! вернёмся в главный цикл + jz still2 + + mcall 37,0 - mcall 37, 0 mov esi, eax shr esi, 16 movzx edi, ax - mcall 9, procinfo2, -1 - mov eax, [procinfo2.box.left] + mcall 9, procinfo, -1 + + mov eax, [procinfo.box.left] cmp esi, eax jl exit_menu - add eax, [procinfo2.box.width] + + add eax, [procinfo.box.width] cmp esi, eax jge exit_menu - mov eax, [procinfo2.box.top] + + mov eax, [procinfo.box.top] cmp edi, eax jl exit_menu - add eax, [procinfo2.box.height] + + add eax, [procinfo.box.height] cmp edi, eax jge exit_menu jmp still2 - +;------------------------------------------------------------------------------ +align 4 ; НАЖАТА КНОПКА button: - mov eax,17 ; получить идентификатор нажатой кнопки - mcall + mcall 17 ; получить идентификатор нажатой кнопки - sub ah,10 ; сравниваем с 10 - jl nofuncbtns ; если меньше - закрываем меню + sub ah,10 ; сравниваем с 10 + jl nofuncbtns ; если меньше - закрываем меню - movzx ebx,ah ; получили номер программы в списке в ebx - mov esi, [startapps + ebx*4] - mov edi, start_info.path - cld - @@: - lodsb - stosb - test al, al - jnz @b - mcall 70, start_info + 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 ; раскомментируйте эти строки, если у вас проблемы +; mov eax,5 ; подождём, пока программа запуститься +; mov ebx,1 ; а то её окно не будет отрисовано (баг в ядре???) +; mcall ; раскомментируйте эти строки, если у вас проблемы ; с отрисовкой - +;-------------------------------------- +align 4 nofuncbtns: ; закрываем меню - jmp exit_menu - - - + jmp exit_menu +;------------------------------------------------------------------------------ _BTNS_ = 6 ; количество кнопок ("пунктов меню") if lang eq ru @@ -237,118 +243,113 @@ else wnd_x_size = 105 ; ширина окна title_pos = 23 shl 16 + 7 end if - +;------------------------------------------------------------------------------ ;******************************* ;******** РИСУЕМ ОКНО ******** ;******************************* - draw_window: + mcall 12,1 ; начинаем "рисовать" - mov eax,12 ; начинаем "рисовать" - mov ebx,1 - mcall - - mov eax,[curx1] ; текущие координаты курсора - mov [curx],eax ; запишем в координаты окна - mov eax,[cury1] - mov [cury],eax - + mov eax,[curx1] ; текущие координаты курсора + mov [curx],eax ; запишем в координаты окна + mov eax,[cury1] + mov [cury],eax ; теперь будем считать координаты окна, чтобы оно за край экрана не вылезло - mov eax,14 ; получим размер экрана - mcall - 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 - высота окна] + mcall 14 ; получим размер экрана - cmp eax,[curx] - jg .okx ; если окно слишком близко к правому краю, - add [curx],-wnd_x_size ; сдвинем его влево на 100 - .okx: + 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 ebx, [cury] - jg .oky ; по вертикали точно также - add [cury], -_BTNS_*15-21 - .oky: + 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 - 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 - mov eax, 4 ; заголовок - mov ebx, title_pos ; [x] shl 16 + [y] - mov ecx, [sc.grab_text]; шрифт и цвет (серый) - or ecx, 0x10000000 -; add ecx, -0x333333 - push ecx - push ecx - xor edx,edx + push ecx + push ecx + xor edx,edx +;-------------------------------------- +align 4 .dec_color: - sub byte [esp+edx], 0x33 - jae @f - mov byte [esp+edx], 0 + 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 + 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 ebx, 1*65536+wnd_x_size-2 ; начинаем делать кнопки + mov ecx, 20*65536+15 + mov edx, 10 or 0x40000000 ; бит 30 установлен => кнопка не рисуется - mov edi,_BTNS_ ; количество кнопок (счётчик) - - newbtn: ; начало цикла - mov eax,8 ; создаём кнопку - mcall + 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 - длина строки - mov eax, 4 ; функция 4 - вывод текста - mcall - popad - - inc edx ; номер кнопки++; - add ecx,15*65536 ; увеличим смещение по y - dec edi ; уменьшим счётчик - jnz newbtn ; если не ноль, повторим всё ещё раз - - mov eax,12 ; закончили "рисовать" - mov ebx,2 - mcall - -ret ; возврат - + 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 ; ДАННЫЕ ПРОГРАММЫ -DATA macro strtbl name, [string] { @@ -385,37 +386,46 @@ DATA ru, 'Настройка устройств ',\ ru, 'Настройка монитора ',\ ru, 'Процессы ' - -start_info: - .mode dd 7 - dd 0 - .params dd 0 - dd 0 - dd 0 - db 0 - dd start_info.path - -; НЕИНИЦИАЛИЗИРОВАННЫЕ ДАННЫЕ -UDATA - processes dd ? ; количество процессов в системе - curx1 dd ? ; координаты курсора - cury1 dd ? - curx dd ? ; координаты окна меню - cury dd ? - - menu_opened db ? ; открыто меню или нет? (1-да, 0-нет) - +;------------------------------------------------------------------------------ align 4 -start_info.path rb 256 +start_info: + .mode dd 7 + dd 0 + .params dd 0 + dd 0 + dd 0 + db 0 + dd start_info.path +;------------------------------------------------------------------------------ +IM_END: +align 4 +; НЕИНИЦИАЛИЗИРОВАННЫЕ ДАННЫЕ + processes dd ? ; количество процессов в системе + curx1 dd ? ; координаты курсора + cury1 dd ? + curx dd ? ; координаты окна меню + cury dd ? - sc system_colors ; системные цвета - procinfo process_information ; информация о процессе - procinfo2 process_information - - rb 1024 ; стэк для окна меню - хватит и 1 Кб - align 32 - stack_wnd: - - -MEOS_APP_END + 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: +;------------------------------------------------------------------------------ ; КОНЕЦ ПРОГРАММЫ +;------------------------------------------------------------------------------ diff --git a/programs/system/rb/trunk/build_en.bat b/programs/system/rb/trunk/build_en.bat index 239a8cd40..adcf5473c 100644 --- a/programs/system/rb/trunk/build_en.bat +++ b/programs/system/rb/trunk/build_en.bat @@ -1,5 +1,6 @@ @erase lang.inc @echo lang fix en >lang.inc @fasm @rb.asm @rb +@kpack @rb @erase lang.inc @pause \ No newline at end of file diff --git a/programs/system/rb/trunk/build_ru.bat b/programs/system/rb/trunk/build_ru.bat index 81244df8f..a90d1efe9 100644 --- a/programs/system/rb/trunk/build_ru.bat +++ b/programs/system/rb/trunk/build_ru.bat @@ -1,5 +1,6 @@ @erase lang.inc @echo lang fix ru >lang.inc @fasm @rb.asm @rb +@kpack @rb @erase lang.inc @pause \ No newline at end of file