From b192d9260af1d990bb181e620b1e1d15af607ece Mon Sep 17 00:00:00 2001 From: "Alexey Teplov (" Date: Thu, 10 May 2007 04:03:05 +0000 Subject: [PATCH] modify macros and optimization git-svn-id: svn://kolibrios.org@483 a494cfbc-eb01-0410-851d-a64ba20cac60 --- .../examples/editbox/trunk/EDITBOX.INC | 625 +---------------- .../develop/examples/editbox/trunk/FAQ.txt | 16 +- .../develop/examples/editbox/trunk/History | 1 + .../examples/editbox/trunk/editbox.asm | 20 +- .../examples/editbox/trunk/editbox.mac | 627 +++++++++++++++++- 5 files changed, 680 insertions(+), 609 deletions(-) diff --git a/programs/develop/examples/editbox/trunk/EDITBOX.INC b/programs/develop/examples/editbox/trunk/EDITBOX.INC index daca7ef758..cef3752827 100644 --- a/programs/develop/examples/editbox/trunk/EDITBOX.INC +++ b/programs/develop/examples/editbox/trunk/EDITBOX.INC @@ -2,7 +2,7 @@ ;;;;;;;;;;;;;;;;;; include 'editbox.mac' ;макрос который должен облегчить жизнь :) специально для editbox ;;;;;;;;;;;;;;;;;; -macro use_edit_box structure_of_potock,scr_h,scr_w +macro use_edit_box procinfo,scr_h,scr_w { edit_box: ed_width equ [edi] ;ширина компонента @@ -46,252 +46,28 @@ pusha @@: call .draw_text edit_ex - -;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 - mov bx,ed_top - add ebx,4 - mov ecx,ed_text_color - add edx,ed_text - int 0x40 -ret -;---------------------------------------------------------- -;--- процедура прорисовки фона ---------------------------- -;входные данные -;eax -;edx - color -;---------------------------------------------------------- -;вход только цвет edx -.draw_bg: - mov ebx,ed_left - add ebx,1 - shl ebx,16 - mov bx,ed_width - sub ebx,1 - mov edx,ed_color -.draw_bg_eax: - mov ecx,ed_top - mov eax,13 - add ecx,1 - shl ecx,16 - mov cx,ed_height - dec ecx - int 0x40 -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 bx,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 cx,ed_height-4 - - mov cl_curs_x,ebx - mov cl_curs_y,ecx -.draw_curs: - mov eax,38 - int 0x40 -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 bx,ed_width - mov ecx, ed_top - mov esi,ecx - shl ecx,16 - mov cx,si - int 0x40 - -;--- снизу --- - mov esi,ecx - add ecx,ed_height - mov ebp,ecx - shl ecx,16 - mov cx,bp - int 0x40 - -;--- слева --- - mov cx,si - mov ebp,ebx - sub bx,ed_width - int 0x40 - -;--- справа --- - mov ebx,ebp - shl ebx,16 - mov bx,bp - int 0x40 -ret -;---------------------------------------------------------- -;--- проверка, зашел ли курсор за границы и, если надо, --- -;--- изменяем смещение ------------------------------------ -;--- eax = -1, если не изменилось или eax = 0, если -; изменилось -;---------------------------------------------------------- -.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 ;========================================================== ;=== обработка клавиатуры ================================= ;========================================================== .key: pusha test word ed_flags,ed_focus ; если не в фокусе, выходим - je @b -;Проверка на нажаты shift + je .no_figure +;Проверка нажат shift ? call .check_shift ;---------------------------------------------------------- ;--- проверяем, что нажато -------------------------------- ;---------------------------------------------------------- - cmp ah,8 - jz .backspace - cmp ah,0xb6 - jz .delete - cmp ah,176 - jz .left - cmp ah,179 - jz .right - cmp ah,180 - jz .home - cmp ah,181 - jz .end - cmp ah,185 ;insert - jz .insert +use_key_process backspase,delete,left,right,home,end,insert ;;;;;;;;;;;;;;;;;;;;;;;;;;;; -;Заглушка на обработку клавиш вверх и вниз +;Заглушка на обработку клавиш вверх и вниз т.е. при обнаружении этих кодов происходит выход из обработчика ;;;;;;;;;;;;;;;;;;;;;;;;;;;; - cmp ah,177 - jz .no_figure - cmp ah,178 - jz .no_figure - cmp ah,27 ;ESC - клавиша )) - jz .no_figure +use_key_no_process up,down,esc ;--- нажата другая клавиша --- - test word ed_flags,ed_figure_only ; только цифры ? - jz @f - cmp ah,'0' - jb .no_figure - cmp ah,'9' - ja .no_figure +;;;;;;;;;;;;;;;;;;;;;;;;;;;; +;Проверка установлен ли флаг при котором нужно выводить только цифры в нужном боксе если такойнеобходимости нет нужно закоментировать макрос +;;;;;;;;;;;;;;;;;;;;;;;;;;;; +use_key_figures_only ;проверка на shift @@: test word ed_flags,ed_shift_on je @f @@ -301,8 +77,8 @@ pusha mov ecx,ed_pos pusha ;clear - mov ebp,edx ;ed_size - call .clear_bg +; mov ebp,edx ;ed_size +; call .clear_bg mov ebp,ed_color mov ebx,dword ed_shift_pos call .sh_cl_ @@ -479,349 +255,6 @@ edit_ex mov ed_pos,eax call .sh_home_end jmp .draw_cursor_text -;Обработка 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 - mov bx,6 - mov edx,ebp - call .draw_bg_eax - ret -;;;;;;;;;;;;;;;;;; -;;Проверка нажат ли shift -;;;;;;;;;;;;;;;;;; -.check_shift: -pusha ;сохраним все регистры - mcall 66,3,1 - test al,0x03 - je @f - or word ed_flags,ed_shift ;установим флаг -@@:edit_ex ;========================================================== ;=== обработка мыши ======================================= ;========================================================== @@ -858,7 +291,7 @@ edit_ex ;---------------------------------------------------------- ;--- А не удерживаем ли мы клавишу мышки, перемещая курсор, во все разные стороны? ;---------------------------------------------------------- - mov ecx,structure_of_potock + mov ecx,procinfo test word ed_flags,ed_mouse_on jne .mouse_wigwag ;---------------------------------------------------------- @@ -897,7 +330,7 @@ end if call .clear_cursor pop eax ._mvpos: - mov ecx,structure_of_potock + mov ecx,procinfo mov ebx,dword [ecx+34] xor edx,edx sub eax,ed_left @@ -961,6 +394,14 @@ end if .mouse_ex: edit_ex +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +;Общие функции обработки +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +use_general_func +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +;Функции для работы с key +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +use_key_func ;---------------------------------------------------------- ;--- процедура размывания фокуса -------------------------- ;---------------------------------------------------------- @@ -983,7 +424,7 @@ edit_ex ;;;;;;;;;;;;;;;;;; ;;процедура обработки положения выделенного текста, когда происходит выход за пределы editbox ;;;;;;;;;;;;;;;;;; - mov ecx,structure_of_potock + mov ecx,procinfo mov ebx,dword [ecx+34] add ebx,ed_left if scr_w eq @@ -1049,7 +490,7 @@ end if ; ret .mleft: mov eax,ed_pos - cmp eax,0 + cmp eax,0 jbe .mwigvag dec eax call .check_offset @@ -1095,11 +536,11 @@ ed_mouse_on = 100000000b ed_mous_adn_b= 100011000b ed_mouse_on_off=1111111011111111b ed_height=14 ; высота -macro draw_edit_boxes start,_end,use_f9,structure_of_potock +macro draw_edit_boxes start,_end,use_f9,procinfo { if use_f9 eq else - mcall 9,structure_of_potock,-1 + mcall 9,procinfo,-1 end if mov edi,start mov ecx,((_end-start)/ed_struc_size) @@ -1179,11 +620,11 @@ macro edit_boxes_set_sys_color start,end,color_table loop @b } -macro draw_edit_box ed_ptr,use_f9,structure_of_potock +macro draw_edit_box ed_ptr,use_f9,procinfo { if use_f9 eq else - mcall 9,structure_of_potock,-1 + mcall 9,procinfo,-1 end if mov edi,ed_ptr call edit_box.draw @@ -1203,10 +644,10 @@ macro key_edit_box ed_ptr 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 +; 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/develop/examples/editbox/trunk/FAQ.txt b/programs/develop/examples/editbox/trunk/FAQ.txt index b5f27a29cf..e0e11ccfac 100644 --- a/programs/develop/examples/editbox/trunk/FAQ.txt +++ b/programs/develop/examples/editbox/trunk/FAQ.txt @@ -1,6 +1,6 @@ ╧юёфхфэр  ьюфшЇшърЎш  ;;;;;;;;;;;;;;;;;;;;;;;;;;; -;;;╤ЄЁєъЄєЁэюх юяшёрэшх тючьюцэюёЄш ъюьяюхэЄр ш ьюфхыхщ хую шёяюы№чютрэш . +;;;╤ЄЁєъЄєЁэюх юяшёрэшх тючьюцэюёЄш ъюьяюэхЄр ш ьюфхыхщ хую шёяюы№чютрэш . ;;;;;;;;;;;;;;;;;;;;;;;;;;; ═ряш°шЄх т шёїюфэюь ъюфх ётюхщ яЁюуЁрьь√ use_edit_box, ¤Єю тёЄртшЄ эхюсїюфшь√х яЁюЎхфєЁ√ т ъюф тр°хщ яЁюуЁрьь√. @@ -43,7 +43,7 @@ some_edit edit_box 100,10,30,0x00ffffff,0,0x00aaaaaa,0,255,some_edit_text *********** use_edit_box фрээ√щ ьръЁюё тёЄрты хЄ юс∙шщ ъюф editbox -structure_of_potock - єърчрЄхы№ эр шэЇюЁьрЎшюээє■ ёЄЁъЄєЁє 9 ЇєэЎшш - юс чрЄхы№э√щ ярЁрьхЄЁ +procinfo - єърчрЄхы№ эр шэЇюЁьрЎшюээє■ ёЄЁъЄєЁє 9 ЇєэЎшш - юс чрЄхы№э√щ ярЁрьхЄЁ ┼ёыш т√ шёяюы№чєхЄх яЁш яЁюЁшёютъх юъэр mcall 0,(50*65536+390),(30*65536+200),0xb3AABBCC,0x805080DD,hed @@ -79,18 +79,18 @@ draw_edit_boxes - ╧хЁхфртрхь√х ярЁрьхЄЁ√ editboxes - єърчрЄхы№ эр шэЇюЁьрЎшюээє■ ёЄЁєъєЁє сюъёют editboxes_end - ъюэхЎ шэЇюЁьрЎшюээющ ёЄЁєъЄєЁ√ сюъёют -use_f9 ш structure_of_potock - яЁш яхЁхфрўх ¤Єюую ярЁрьхЄЁр - яЁш яхЁхЁшёютъш сюъёют сєфхЄ шёяюычютрэр ЇєэЎш  -mcall 9,structure_of_potock,-1 -ъюЄюЁр  яюыєўрхЄ фрээ√х ю юъэх ш ёъырф√трхЄ ярЁрьхЄЁ√ яю рфЁхёє structure_of_potock- хую Єю цх юс чрЄхы№эю эєцэю яхЁхфртрЄ№!!!! +use_f9 ш procinfo - яЁш яхЁхфрўх ¤Єюую ярЁрьхЄЁр - яЁш яхЁхЁшёютъш сюъёют сєфхЄ шёяюычютрэр ЇєэЎш  +mcall 9,procinfo,-1 +ъюЄюЁр  яюыєўрхЄ фрээ√х ю юъэх ш ёъырф√трхЄ ярЁрьхЄЁ√ яю рфЁхёє procinfo- хую Єю цх юс чрЄхы№эю эєцэю яхЁхфртрЄ№!!!! ┼ёыш т яЁюуЁрььх єцх шёяюы№чєхЄё  ¤Єр ЇєэЎш , Єю эх эєцэю єърч√трЄ№ фрээ√х ярЁрьхЄЁ!!!! ╩ръ яюф трЁшрэЄ ёє∙хёЄтєхЄ ьръЁюё draw_edit_box - юэ шёяюы№чєхЄё  хёыш т√тюфшЄ№ё ў юфшэ сюъё ╧хЁхфртрхь√щ ярЁрьхЄЁ editboxes - єърчрЄхы№ эр шэЇюЁьрЎшюээє■ ёЄЁєъєЁє сюъёют -use_f9 ш structure_of_potock - яЁш яхЁхфрўх ¤Єюую ярЁрьхЄЁр - яЁш яхЁхЁшёютъш сюъёют сєфхЄ шёяюычютрэр ЇєэЎш  -mcall 9,structure_of_potock,-1 -ъюЄюЁр  яюыєўрхЄ фрээ√х ю юъэх ш ёъырф√трхЄ ярЁрьхЄЁ√ яю рфЁхёє structure_of_potock- хую Єю цх юс чрЄхы№эю эєцэю яхЁхфртрЄ№!!!! +use_f9 ш procinfo - яЁш яхЁхфрўх ¤Єюую ярЁрьхЄЁр - яЁш яхЁхЁшёютъш сюъёют сєфхЄ шёяюычютрэр ЇєэЎш  +mcall 9,procinfo,-1 +ъюЄюЁр  яюыєўрхЄ фрээ√х ю юъэх ш ёъырф√трхЄ ярЁрьхЄЁ√ яю рфЁхёє procinfo- хую Єю цх юс чрЄхы№эю эєцэю яхЁхфртрЄ№!!!! ┼ёыш т яЁюуЁрььх єцх шёяюы№чєхЄё  ¤Єр ЇєэЎш , Єю эх эєцэю єърч√трЄ№ фрээ√х ярЁрьхЄЁ!!!! ┴юы№°х эшъръшї ярЁрьхЄЁют яхЁхфртрЄ№ эх эєцэю. ********** diff --git a/programs/develop/examples/editbox/trunk/History b/programs/develop/examples/editbox/trunk/History index 31aee4fca6..5877664d15 100644 --- a/programs/develop/examples/editbox/trunk/History +++ b/programs/develop/examples/editbox/trunk/History @@ -6,6 +6,7 @@ You bunny wrote ..... ▌Єю эх ьэюую Їюы№ъыхЁр, ёт чрээюх, ё Єхь, ўЄю эряшёрэшх яЁюуЁрьь фышээ√х ш ьєЄюЁэ√щ яЁюЎхёё, ш юэ эх юсїюфшЄ№ё  схч т√Ёрцхэшщ яюфюсэюую ёюфхЁцрэш , эю эх яюярфр■∙хую т ъюьхэЄрЁшш ш юёэютэющ ъюф..... ╥хяыют └ыхъёхщ ▐Ё№хтшў aka +; 09.05.2007 ╬с∙р  фюЁрсюЄър ьръЁюёют,чрьхэр эхёъюы№ъю ьхЄюъ, ьшуЁрЎш  ъюфр т edit_box.mac ; 19.04.2007 ╬с∙р  фюЁрсюЄър ьръЁюёют ; 14.04.2007 ╚ёяЁртыхэю єяЁртыхэшх ь√°ъющ, яЁш єфрыхэшш яюёыхфэхую ёшьтюыр т сєЇхЁх яш°хЄ№ё  0 (ёярёшсю Mario79) ; 04.04.2007 ╠юфхЁэшчшЁютры ёшёЄхьє т√фхыхэш , ёє∙хёЄтхээю яхЁхфхырэю єяЁртыхэшх ш юсЁрсюЄър, фюсртыхээю сыюъшЁютрэш  юсЁрсюЄъш фЁєушї сюъёют, тю тЁхь  т√фхыхэш  ь√°ъющ ЄхъёЄр, фы  ¤Єюую т ЄхъёЄ яЁюуЁрьь√ эхюсїюфшью фюсртшЄ№ шфхэЄшЇшърЄюЁ сюъёр Є.х. dd 0x0 ш т эхую сєфхЄ яюьх∙рЄ№ё  єъррЄхы№ эр editbox diff --git a/programs/develop/examples/editbox/trunk/editbox.asm b/programs/develop/examples/editbox/trunk/editbox.asm index ca361458d7..b4a2caaf23 100644 --- a/programs/develop/examples/editbox/trunk/editbox.asm +++ b/programs/develop/examples/editbox/trunk/editbox.asm @@ -10,18 +10,20 @@ use32 ; dd start ; адрес, на который система передаёт управление ; после загрузки приложения в память dd i_end ; размер приложения - dd i_end and not 3 ; Объем используемой памяти, для стека отведем 0х100 байт и выровним на грницу 4 байта - dd i_end and not 3 ; расположим позицию стека в области памяти, сразу за телом программы. Вершина стека в диапазоне памяти, указанном выше + dd i_end ; Объем используемой памяти, для стека отведем 0х100 байт и выровним на грницу 4 байта + dd i_end ; расположим позицию стека в области памяти, сразу за телом программы. Вершина стека в диапазоне памяти, указанном выше dd 0x0,0x0 ; указатель на строку с параметрами. include 'macros.inc' include 'editbox.inc' - use_edit_box structure_of_potock,22,5 +align 4 + use_edit_box procinfo,22,5 ;Область кода start: ;Точка входа в программу mcall 40,0x27 ;установить маску для ожидаемых событий ;система будет реагировать только на сообщение о перерисовке,нажата кнопка, определённая ранее, событие от мыши (что-то случилось - нажатие на кнопку мыши или перемещение; сбрасывается при прочтении) и нажатие клавиши red_win: call draw_window ;первоначально необходимо нарисовать окно +align 4 still: ;основной обработчик mcall 10 ;Ожидать события cmp al,0x1 ;если изменилось положение окна @@ -45,10 +47,11 @@ key: jmp still ;>>>>>>>>>>>>>>>>>>>>>>>>>>>>> +align 4 draw_window: ;рисование окна приложения mcall 12,1 mcall 0,(50*65536+390),(30*65536+200),0xb3AABBCC,0x805080DD,hed - draw_edit_boxes editboxes,editboxes_end,use_f9,structure_of_potock ;рисование edit box'ов + draw_edit_boxes editboxes,editboxes_end,use_f9,procinfo ;рисование edit box'ов mcall 12,2 ret ;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> @@ -61,7 +64,7 @@ edit4 edit_box 16,5,70,0xffffff,0x6a9480,0,0,0,1,ed_buffer.4,ed_figure_only editboxes_end: data_of_code dd 0 mouse_flag dd 0x0 -hed db 'EDITBOX optimization and retype date 19.04.2007',0 +hed db 'EDITBOX optimization and retype date 09.05.2007',0 rb 256 ed_buffer: ;.1: rb 514;256 @@ -70,7 +73,8 @@ ed_buffer: .4: rb 3 ;два запасных байта необходимы для того что бы не пепереписать следующией байты, в конце буфера 0 buffer_end: -structure_of_potock: +align 16 +procinfo: rb 1024 ;1 кб для получения общей структуры -rb 1024 -i_end: \ No newline at end of file +rb 1024 ;Stack +i_end: diff --git a/programs/develop/examples/editbox/trunk/editbox.mac b/programs/develop/examples/editbox/trunk/editbox.mac index 155c65c815..5ef4f93ede 100644 --- a/programs/develop/examples/editbox/trunk/editbox.mac +++ b/programs/develop/examples/editbox/trunk/editbox.mac @@ -1,7 +1,632 @@ +;Макрос для вывода основных функций которые испльзуются боксом +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 + mov bx,ed_top + add ebx,4 + mov ecx,ed_text_color + add edx,ed_text + mcall +ret +;---------------------------------------------------------- +;--- процедура прорисовки фона ---------------------------- +;входные данные +;eax +;edx - color +;---------------------------------------------------------- +;вход только цвет edx +.draw_bg: + mov ebx,ed_left + add ebx,1 + shl ebx,16 + mov bx,ed_width + sub ebx,1 + mov edx,ed_color +.draw_bg_eax: + mov ecx,ed_top + mov eax,13 + add ecx,1 + shl ecx,16 + mov cx,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 bx,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 cx,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 bx,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 bx,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 + mov bx,6 + mov edx,ebp + call .draw_bg_eax + ret +;;;;;;;;;;;;;;;;;; +;;Проверка нажат ли shift +;;;;;;;;;;;;;;;;;; +.check_shift: +pusha ;сохраним все регистры + mcall 66,3,1 + 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 +{ +if up eq +else + cmp ah,177 + jz .no_figure +end if +if down eq +else + cmp ah,178 + jz .no_figure +end if +if esc eq +else + cmp ah,27 ;ESC - клавиша )) + jz .no_figure +end if +} + +macro use_key_figures_only +{ + test word ed_flags,ed_figure_only ; только цифры ? + jz @f + cmp ah,'0' + jb .no_figure + cmp ah,'9' + ja .no_figure +} + + + + + + + ; Макрос выхода macro edit_ex { -popa +popa ret } macro debug