From dd4bac7d4f7f494e183a857386af8c8109b9ffaf Mon Sep 17 00:00:00 2001 From: "Alexey Teplov (" Date: Fri, 13 Apr 2007 07:03:50 +0000 Subject: [PATCH] rewrite editbox, modify mouse function, modify key function git-svn-id: svn://kolibrios.org@461 a494cfbc-eb01-0410-851d-a64ba20cac60 --- .../examples/editbox/trunk/EDITBOX.INC | 1625 +++++++++-------- .../examples/editbox/trunk/editbox.asm | 117 +- .../examples/editbox/trunk/editbox.mac | 52 + .../develop/examples/editbox/trunk/macros.inc | 269 +++ 4 files changed, 1211 insertions(+), 852 deletions(-) create mode 100644 programs/develop/examples/editbox/trunk/editbox.mac create mode 100644 programs/develop/examples/editbox/trunk/macros.inc diff --git a/programs/develop/examples/editbox/trunk/EDITBOX.INC b/programs/develop/examples/editbox/trunk/EDITBOX.INC index 9330e03a9..4db647d0c 100644 --- a/programs/develop/examples/editbox/trunk/EDITBOX.INC +++ b/programs/develop/examples/editbox/trunk/EDITBOX.INC @@ -1,3 +1,4 @@ +; 04.04.2007 Исправлено управление мышкой, при удалении последнего символа в буфере пишеться 0 (спасибо Mario79) ; 04.04.2007 Модернизировал систему выделения, существенно переделано управление и обработка, добавленно блокирования обработки других боксов, во время выделения мышкой текста, для этого в текст программы необходимо добавить идентификатор бокса т.е. dd 0x0 и в него будет помещаться укаатель на editbox ; 30.03.2007 Переделал процедуру выделения, теперь текст выделяется только только мышкой ; 09.03.2007 Дописал управление mouse + shift выделение и перемещение @@ -55,86 +56,89 @@ ; активным. ; Если щелчок мыши был пройзведен за пределами edit box ; фокус теряется. +;;;;;;;;;;;;;;;;;; +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] ;цвет фона компонента -ed_focus_border_color equ [edi+16] ;цвет рамки компонента -ed_blur_border_color equ [edi+20] ;цвет не активного компонента -ed_text_color equ [edi+24] ;цвет текста -ed_max equ [edi+28] ;кол-во символов которые можно максимально ввести -ed_text equ [edi+32] ;указатель на буфер -ed_flags equ [edi+36] ;флаги -ed_size equ [edi+38] ;кол-во символов -ed_pos equ [edi+42] ;позиция курсора -ed_offset equ [edi+46] ;смещение -cl_curs_x equ [edi+50] ;предыдущее координата курсора по х -cl_curs_y equ [edi+54] ;предыдущее координата курсора по у -ed_shift_pos equ [edi+58] ;положение курсора -ed_shift_pos_old equ [edi+62] ;старое положение курсора +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+42] ;кол-во символов +ed_pos equ [edi+46] ;позиция курсора +ed_offset equ [edi+50] ;смещение +cl_curs_x equ [edi+54] ;предыдущее координата курсора по х +cl_curs_y equ [edi+58] ;предыдущее координата курсора по у +ed_shift_pos equ [edi+62] ;положение курсора +ed_shift_pos_old equ [edi+66] ;старое положение курсора ;========================================================== ;=== процедура прорисовки ================================= ;========================================================== .draw: pusha ;--- рисуем рамку --- - call .draw_border ; Функция стабильна + call .draw_border ; Функция стабильна .draw_bg_cursor_text: ;--- изменяем смещение, если надо --- - call .check_offset ;вычисление позиции курсора стабильна + call .check_offset ;вычисление позиции курсора стабильна ;--- рисуем внутреннюю область --- - call .draw_bg ;нарисовать прямоугольник рабочей области + call .draw_bg ;нарисовать прямоугольник рабочей области ;---- рисуем выделение, по shift если есть - call .draw_shift + call .draw_shift .draw_cursor_text: ;--- рисуем курсор --- - ;--- может его не надо рисовать ---- - test word ed_flags,ed_focus - je @f - call .draw_cursor + ;--- может его не надо рисовать ---- + test word ed_flags,ed_focus + je @f + call .draw_cursor @@: - call .draw_text -popa -ret + 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 - - + 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 ;чтобы не выходить за пределы экрана + 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 +@@: 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 ;---------------------------------------------------------- ;--- процедура прорисовки фона ---------------------------- @@ -144,111 +148,111 @@ ret ;---------------------------------------------------------- ;вход только цвет edx .draw_bg: - mov ebx,ed_left - add ebx,1 - shl ebx,16 - mov bx,ed_width - sub ebx,1 - mov edx,ed_color + 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 + 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 + 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 + 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 + 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 + 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 + 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 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 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 cx,si + mov ebp,ebx + sub bx,ed_width + int 0x40 ;--- справа --- - mov ebx,ebp - shl ebx,16 - mov bx,bp - int 0x40 + mov ebx,ebp + shl ebx,16 + mov bx,bp + int 0x40 ret ;---------------------------------------------------------- ;--- проверка, зашел ли курсор за границы и, если надо, --- @@ -258,368 +262,363 @@ ret ;---------------------------------------------------------- .check_offset: pusha - mov ecx,ed_pos - mov ebx,ed_offset - cmp ebx,ecx - ja .sub_8 + 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 + 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 + 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 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_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 + 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 -popa - ret +.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 -popa - ret + or word ed_flags,ed_offset_fl +edit_ex ;========================================================== ;=== обработка клавиатуры ================================= ;========================================================== .key: pusha - test word ed_flags,ed_focus ; если не в фокусе, выходим - je @b + test word ed_flags,ed_focus ; если не в фокусе, выходим + je @b ;Проверка на нажаты shift - call .check_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 + 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 ;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;Заглушка на обработку клавиш вверх и вниз -;;;;;;;;;;;;;;;;;;;;;;;;;;;; - cmp ah,177 - jz .no_figure - cmp ah,178 - jz .no_figure - cmp ah,27 ;ESC - клавиша )) - jz .no_figure +;;;;;;;;;;;;;;;;;;;;;;;;;;;; + cmp ah,177 + jz .no_figure + cmp ah,178 + jz .no_figure + cmp ah,27 ;ESC - клавиша )) + jz .no_figure ;--- нажата другая клавиша --- - test word ed_flags,ed_figure_only ; только цифры ? - jz @f - cmp ah,'0' - jb .no_figure - cmp ah,'9' - ja .no_figure + test word ed_flags,ed_figure_only ; только цифры ? + jz @f + cmp ah,'0' + jb .no_figure + cmp ah,'9' + ja .no_figure ;проверка на shift -@@: 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 +@@: 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 - mov ebp,edx ;ed_size - call .clear_bg - mov ebp,ed_color - mov ebx,dword ed_shift_pos - call .sh_cl_ + mov ebp,edx ;ed_size + call .clear_bg + mov ebp,ed_color + mov ebx,dword ed_shift_pos + call .sh_cl_ .sh_nxt:popa - call .del_char + call .del_char ;;;; - mov eax,dword ed_shift_pos - mov ebx,ed_size - sub ebx,eax - mov ed_size,ebx - pop eax + mov eax,dword ed_shift_pos + mov ebx,ed_size + sub ebx,eax + mov ed_size,ebx + pop eax ; проверяем, находится ли курсор в конце -@@: mov ecx,ed_size - mov edx, ed_max - test word ed_flags,ed_insert - jne @f - cmp ecx,edx - jae .no_figure -@@: mov ebx, ed_pos - cmp ebx,edx - jl @f ; если меньше или равно +@@: mov ecx,ed_size + mov edx, ed_max + test word ed_flags,ed_insert + jne @f + cmp ecx,edx + jae .no_figure +@@: mov ebx, ed_pos + cmp ebx,edx + jl @f ; если меньше или равно .no_figure: - popa - ret -.insert: test word ed_flags,ed_insert ;not word ed_insert +edit_ex +.insert: test word ed_flags,ed_insert ;not word ed_insert je .insert_1 - and word ed_flags,ed_insert_cl - jmp .no_figure + and word ed_flags,ed_insert_cl + jmp .no_figure .insert_1: - or word ed_flags,ed_insert - jmp .no_figure + or word ed_flags,ed_insert + jmp .no_figure .ins_v: - dec dword [ebp+38];ed_size ;processing is insert - sub esi,ecx - add esi,ebx - mov edi,esi + 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 + mov edi,ebp + mov ebp,ed_pos + call .clear_bg popa - jmp .In_k + jmp .In_k @@: ; сдвигаем символы после курсора вправо - 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 + 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 + cmp ecx,ebx ;Если у нас позиция курсора = текущему размеру напечатанных символов т.е. курсор стоит в конце + je .In_k - test word [ebp+36],ed_insert ;IF insert is enable т.к. edi изменен адресуем через ebp - jne .ins_v + 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 + 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 + 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;.draw_cursor_text -.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 - popa - ret -.bac_del: - call .del_char - jmp .draw_all + ; увеличиваем значение размера и позиции + inc dword ed_size + inc dword ed_pos + call .draw_all2 + jmp .shift;.draw_cursor_text +.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 edx,ed_size - mov ecx,ed_pos - test ecx,ecx - jnz .del_bac - test word ed_flags,ed_shift_on - jne .bac_del - popa - ret + ; проверяем, курсор у левого края ? + mov ecx,ed_pos + test ecx,ecx + jnz .del_bac + test word ed_flags,ed_shift_on + jne .bac_del + +edit_ex .del_bac: - 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 - + 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 + 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 + 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 + 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 + 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 +.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 +.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 + 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 + 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 ;Обработка Shift для снятия выделения неизвестной области .shift: ;;;;;;;SHIFT - test word ed_flags,ed_shift - je .f_exit + 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 +@@: 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 +.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 + 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 + 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 ;меньшее + 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 + 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 + 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 + 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 + call .draw_bg_eax +@@: call .enable_null + ret ;;;;;;;;;;;;;;;;;;;;; ;Установка- снятие выделения в один символ ;;;;;;;;;;;;;;;;;;;;; .drw_sim: - mov eax,dword ed_pos - call .draw_rectangle ;нарисовать прямоугольник с заданным цветом + mov eax,dword ed_pos + call .draw_rectangle ;нарисовать прямоугольник с заданным цветом jmp @b ;;;;;;;;;;;;;;;;;;;;; ;Фукция установки выделения при движения влево и вправо и нажатии shift @@ -627,231 +626,230 @@ popa ;;;;;;;;;; .draw_wigwag: ;функция установки переменных - mov ebp,shift_color - call .clear_cursor + 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 + 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 + 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 + 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 + 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 + 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 + 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 - popa - ret - + 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 + jne .sh_ext_en ;нарисовать закрашеный прямоугольник - test word ed_flags,ed_shift_bac + test word ed_flags,ed_shift_bac je @f - call .check_offset + 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 + 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 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 + 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 + 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 + 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 +.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 + 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_ + 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 +@@: 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 - add eax,ebx - inc eax - xor ebx,ebx - mov [eax],bl - popa - ret + 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 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 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 + 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 +@@: add esi,ecx ;указатель + смещение к реальному буфферу + mov ebx,esi + inc esi + cld - sub edx,ecx + sub edx,ecx .del_ch_sh: - push edi - mov edi,ebx + push edi + mov edi,ebx @@: - lodsb - stosb - dec edx - jns @b - - pop edi - ret + 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 + 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 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 +@@: 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 ;;;;;;;;;;;;;;;;;;; ;;; Обработка примитивов ;;;;;;;;;;;;;;;;;;;; @@ -860,206 +858,270 @@ popa ;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 + 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 ;сохраним все регистры - xor ecx,ecx - inc ecx - mov eax,66 - mov ebx,3 - int 0x40 - test al,0x03 - je @f + mcall 66,3,1 + test al,0x03 + je @f or word ed_flags,ed_shift ;установим флаг -@@: popa ;восстановим регистры - ret - +@@:edit_ex ;========================================================== ;=== обработка мыши ======================================= ;========================================================== .mouse: pusha - mov eax,dword [mouse_flag] - test eax,eax - jz @f - cmp eax,edi - je @f - - popa - ret +;debug ;---------------------------------------------------------- ;--- получаем состояние кнопок мыши ----------------------- -;---------------------------------------------------------- -@@: - mov eax,37 - mov ebx,2 - int 0x40 +;---------------------------------------------------------- + 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 - popa - ret -;---------------------------------------------------------- -;--- Обработка .mouse_wigwag -;---------------------------------------------------------- -.mouse_wigwag: - shr eax,16 - or word ed_flags,ed_shift_on+ed_shift - - mov ecx,structure_of_potock - mov ebx,dword [ecx+34] - add ebx,ed_left - add ebx,5 - cmp eax,ebx - jl .left - add ebx,ed_width - cmp eax,ebx - jg .right - jmp ._mvpos - + test eax,1 + jnz .mouse_left_button + and word ed_flags,ed_mouse_on_off + xor ebx,ebx + mov dword [mouse_flag],ebx +edit_ex .mouse_left_button: ;---------------------------------------------------------- +;--- блокировка от фокусировки в других боксах при попадании на них курсора +;---------------------------------------------------------- + mov eax,dword [mouse_flag] + test eax,eax + jz @f + cmp eax,edi + je @f + jmp ._blur +;---------------------------------------------------------- ;--- модифицируем координаты, т.е. добавляем координаты окна. ;---------------------------------------------------------- - mov eax,9 - mov ebx,structure_of_potock - or ecx,-1 - int 0x40 +@@: mcall 9,structure_of_potock,-1 ;---------------------------------------------------------- ;--- получаем координаты мыши относительно 0 т.е всей области экрана ;---------------------------------------------------------- - mov eax,37 - xor ebx,ebx - int 0x40 + mcall 37,0 ;---------------------------------------------------------- ;--- А не удерживаем ли мы клавишу мышки, перемещая курсор, во все разные стороны? ;---------------------------------------------------------- - mov ecx,structure_of_potock - test word ed_flags,ed_mouse_on - jne .mouse_wigwag + mov ecx,structure_of_potock + test word ed_flags,ed_mouse_on + jne .mouse_wigwag ;---------------------------------------------------------- ;--- проверяем, попадает ли курсор в edit box ------------- ;---------------------------------------------------------- - mov ebx,dword [ecx+38] - add ebx,ed_top - add ebx,22 - cmp ax,bx - jl ._blur;.mouse_end_no_focus + mov ebx,dword [ecx+38] + add ebx,ed_top + add ebx,22 + cmp ax,bx + jl ._blur;.mouse_end_no_focus - add ebx,ed_height - cmp ax,bx - jg ._blur;.mouse_end_no_focus + add ebx,ed_height + cmp ax,bx + jg ._blur;.mouse_end_no_focus - shr eax,16 + shr eax,16 - mov ebx,dword [ecx+34] - add ebx,ed_left - add ebx,5 - cmp ax,bx - jl ._blur;.mouse_end_no_focus + mov ebx,dword [ecx+34] + add ebx,ed_left + add ebx,5 + cmp ax,bx + jl ._blur;.mouse_end_no_focus - add ebx,ed_width - cmp ax,bx - jg ._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 + push eax + mov ebp,ed_color + call .clear_cursor + pop eax ._mvpos: - mov ecx,structure_of_potock - mov ebx,dword [ecx+34] - xor edx,edx - sub eax,ed_left - sub eax,ebx - sub eax,5-2 ;толщина обводки скина =5 - mov ebx,6 - div bx - add eax,ed_offset - cmp eax,ed_size - jna ._mshift - mov eax,ed_size + mov ecx,structure_of_potock + mov ebx,dword [ecx+34] + xor edx,edx + sub eax,ed_left + sub eax,ebx + sub eax,5-2 ;толщина обводки скина =5 + 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 + 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 + test word ed_flags,ed_mouse_on + jne @f - mov dword ed_shift_pos,eax - or word ed_flags,ed_mous_adn_b;ed_mouse_on - mov dword ed_pos,eax - jmp .m_sh -@@: - cmp eax,dword ed_shift_pos ;если позиции не изменились - je .mouse_ex - 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 + - mov dword [mouse_flag],edi -.m_sh: call .draw_text - call .draw_cursor + 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 .mouse_ex + 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 ;---------------------------------------------------------- ;--- процедура установки фокуса --------------------------- ;---------------------------------------------------------- - bts word ed_flags,1 - jc .mouse_ex - jmp .drc + jmp .drc ._blur: - test word ed_flags,ed_always_focus - jne .mouse_ex - btr word ed_flags,1 ; если не в фокусе, выходим - jnc .mouse_ex + test word ed_flags,ed_always_focus + jne .mouse_ex + btr word ed_flags,1 ; если не в фокусе, выходим + jnc .mouse_ex - mov ebp,ed_color - call .clear_cursor -.drc: call .draw_border + mov ebp,ed_color + call .clear_cursor +.drc: call .draw_border .mouse_ex: -popa -ret +edit_ex ;---------------------------------------------------------- ;--- процедура размывания фокуса -------------------------- ;---------------------------------------------------------- ;.blur: ;pusha ;._blur: - ;btr ed_flags,1 - ;jnc @f - ;call .draw_border - ;call .clear_cursor + ;btr ed_flags,1 + ;jnc @f + ;call .draw_border + ;call .clear_cursor ;@@: -;popa -;ret +;edit_ex + +;---------------------------------------------------------- +;--- Обработка .mouse_wigwag +;---------------------------------------------------------- +.mouse_wigwag: + shr eax,16 + or word ed_flags,ed_shift_bac +;;;;;;;;;;;;;;;;;; +;;процедура обработки положения выделенного текста, когда происходит выход за пределы editbox +;;;;;;;;;;;;;;;;;; + mov ecx,structure_of_potock + mov ebx,dword [ecx+34] + add ebx,ed_left + add ebx,5 + + 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 + test eax,eax + jz .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 + } ed_figure_only= 1000000000000000b ;одни символы ed_always_focus= 100000000000000b @@ -1071,6 +1133,7 @@ ed_shift_off= 1111111111111011b ed_shift_bac= 10000b ;бит для очистки выделеного shift т.е. при установке говорит что есть выделение ed_shift_bac_cl=1111111111101111b ;очистка при удалении выделения ed_shift_cl= 1111111111100011b +ed_shift_mcl= 1111111111110011b ed_left_fl= 100000b ed_right_fl= 1111111111011111b ed_offset_fl= 1000000b @@ -1081,44 +1144,44 @@ ed_mouse_on = 100000000b ed_mous_adn_b= 100011000b ed_mouse_on_off=1111111011111111b ed_height=14 ; высота -shift_color=0x6a9480 macro draw_edit_boxes start,end { - mov edi,start - mov ecx,((end-start)/ed_struc_size) + mov edi,start + mov ecx,((end-start)/ed_struc_size) @@: - call edit_box.draw - add edi,ed_struc_size - loop @b + 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) + mov edi,start + mov ecx,((end-start)/ed_struc_size) @@: - call edit_box.mouse - add edi,ed_struc_size - loop @b + 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) + mov edi,start + mov ecx,((end-start)/ed_struc_size) @@: - call edit_box.key - add edi,ed_struc_size - loop @b + call edit_box.key + add edi,ed_struc_size + loop @b } -ed_struc_size=66 -struc edit_box width,left,top,color,focus_border_color,\ - blur_border_color,text_color,max,text,flags,size +ed_struc_size=70 +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 @@ -1126,7 +1189,7 @@ struc edit_box width,left,top,color,focus_border_color,\ .text dd text .flags dw flags+0 .size dd size+0 -.pos dd 0 +.pos dd pos+0 .offset dd 0 .cl_curs_x dd 0 .cl_curs_y dd 0 @@ -1137,28 +1200,28 @@ struc edit_box width,left,top,color,focus_border_color,\ 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 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 + 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 diff --git a/programs/develop/examples/editbox/trunk/editbox.asm b/programs/develop/examples/editbox/trunk/editbox.asm index 402f18ac5..0e5bdfcdf 100644 --- a/programs/develop/examples/editbox/trunk/editbox.asm +++ b/programs/develop/examples/editbox/trunk/editbox.asm @@ -3,90 +3,68 @@ ;Оптимизированный компонент EditBox (Исходный вариант от Maxxxx32) ;Оптимизация команд. ; - Теплов Алексей www.lrz.land.ru - ;заголовок приложения -use32 ; транслятор, использующий 32 разрядных команды - org 0x0 ; базовый адрес кода, всегда 0x0 - db 'MENUET01' ; идентификатор исполняемого файла (8 байт) - dd 0x1 ; версия формата заголовка исполняемого файла - dd start ; адрес, на который система передаёт управление - ; после загрузки приложения в память - dd i_end ; размер приложения - dd i_end and not 3 ; Объем используемой памяти, для стека отведем 0х100 байт и выровним на грницу 4 байта - dd i_end and not 3 ; расположим позицию стека в области памяти, сразу за телом программы. Вершина стека в диапазоне памяти, указанном выше - dd 0x0,0x0 ; указатель на строку с параметрами. - ; если после запуска неравно нулю, приложение было - ; запущено с параметрами из командной строки - - ; указатель на строку, в которую записан путь, - ; откуда запущено приложение - - include 'editbox.inc' - use_edit_box +use32 ; транслятор, использующий 32 разрядных команды + org 0x0 ; базовый адрес кода, всегда 0x0 + db 'MENUET01' ; идентификатор исполняемого файла (8 байт) + dd 0x1 ; версия формата заголовка исполняемого файла + dd start ; адрес, на который система передаёт управление + ; после загрузки приложения в память + dd i_end ; размер приложения + dd i_end and not 3 ; Объем используемой памяти, для стека отведем 0х100 байт и выровним на грницу 4 байта + dd i_end and not 3 ; расположим позицию стека в области памяти, сразу за телом программы. Вершина стека в диапазоне памяти, указанном выше + dd 0x0,0x0 ; указатель на строку с параметрами. + include 'macros.inc' + include 'editbox.inc' + use_edit_box ;Область кода -start: ;Точка входа в программу - mov eax,40 ;установить маску для ожидаемых событий - mov ebx,0x27 ;система будет реагировать только на сообщение о перерисовке,нажата кнопка, определённая ранее, событие от мыши (что-то случилось - нажатие на кнопку мыши или перемещение; сбрасывается при прочтении) и нажатие клавиши - int 0x40 +start: ;Точка входа в программу + mcall 40,0x27 ;установить маску для ожидаемых событий + ;система будет реагировать только на сообщение о перерисовке,нажата кнопка, определённая ранее, событие от мыши (что-то случилось - нажатие на кнопку мыши или перемещение; сбрасывается при прочтении) и нажатие клавиши red_win: - call draw_window ;первоначально необходимо нарисовать окно -still: ;основной обработчик - mov eax,10 ;Ожидать события - int 0x40 ;ожидать событие в течение 2 миллисекунд + call draw_window ;первоначально необходимо нарисовать окно +still: ;основной обработчик + mcall 10 ;Ожидать события в течение 2 миллисекунд - cmp al,0x1 ;если изменилось положение окна - jz red_win - cmp al,0x2 ;если нажата клавиша то перейти - jz key - cmp al,0x3 ;если нажата кнопка то перейти - jz button - mouse_edit_boxes editboxes,editboxes_end - jmp still ;если ничего из перечисленного то снова в цикл + cmp al,0x1 ;если изменилось положение окна + jz red_win + cmp al,0x2 ;если нажата клавиша то перейти + jz key + cmp al,0x3 ;если нажата кнопка то перейти + jz button + mouse_edit_boxes editboxes,editboxes_end + jmp still ;если ничего из перечисленного то снова в цикл ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; button: -mov eax,17 ;получить идентификатор нажатой клавиши - int 0x40 - test ah,ah ;если в ah 0, то перейти на обработчик событий still - jz still - or eax,-1 ;в eax,-1 - 5 ,байтов у нас же только 3 выйти - int 0x40 ;далее выполняется выход из программы - + mcall 17 ;получить идентификатор нажатой клавиши + test ah,ah ;если в ah 0, то перейти на обработчик событий still + jz still + mcall -1 key: - mov eax,2 ;загрузим значение 2 в регистор eax - int 0x40 ;получим код нажатой клавиши - key_edit_boxes editboxes,editboxes_end + mcall 2 ;загрузим значение 2 в регистор eax и получим код нажатой клавиши + key_edit_boxes editboxes,editboxes_end jmp still ;>>>>>>>>>>>>>>>>>>>>>>>>>>>>> -draw_window: ;рисование окна приложения - mov eax,12 ;в регистр внести значение = 12 - mov ebx,1 ;присвоить 1 - int 0x40 - - xor eax,eax ;обнулить eax - mov ebx,50*65536+390 ;[координата по оси x]*65536 + [размер по оси x] - mov ecx,30*65536+200 ;[координата по оси y]*65536 + [размер по оси y] - mov edx,0xb3AABBCC ;0xXYRRGGBB Y =3 - вывод рамки, используя скрин - mov esi,0x805080DD ;0xXYRRGGBB - цвет заголовка - mov edi,hed ;Указатель на строку с заголовком - int 0x40 ;нарисовать окно приложения - - draw_edit_boxes editboxes,editboxes_end ;рисование edit box'ов - - mov eax,12 ;Функция 12 - начать/закончить перерисовку окна. - mov ebx,2 ;Подфункция 2 - закончить перерисовку окна. - int 0x40 +draw_window: ;рисование окна приложения + mcall 12,1 + mcall 0,(50*65536+390),(30*65536+200),0xb3AABBCC,0x805080DD,hed + draw_edit_boxes editboxes,editboxes_end ;рисование edit box'ов + mcall 12,2 ret ;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> ;DATA данные editboxes: -edit1 edit_box 168,5,10,0xffffff,0,0,0,99,ed_buffer.2,ed_figure_only -edit2 edit_box 250,5,30,0xffffff,0,0xAABBCC,0,308,hed,ed_focus,53 -edit3 edit_box 35,5,50,0xffffff,0,0,0,9,ed_buffer.3,ed_figure_only -edit4 edit_box 16,5,70,0xffffff,0,0,0,1,ed_buffer.4,ed_figure_only +edit1 edit_box 168,5,10,0xffffff,0x6a9480,0,0,0,99,ed_buffer.2,ed_figure_only +edit2 edit_box 250,5,30,0xffffff,0x6a9480,0,0xAABBCC,0,308,hed,ed_focus,53,53 +edit3 edit_box 35,5,50,0xffffff,0x6a9480,0,0,0,9,ed_buffer.3,ed_figure_only +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 13.04.2007',0 +rb 256 ed_buffer: ;.1: rb 514;256 .2: rb 101 @@ -94,10 +72,7 @@ ed_buffer: .4: rb 3 ;два запасных байта необходимы для того что бы не пепереписать следующией байты, в конце буфера 0 buffer_end: -hed db 'EDITBOX optimization and retype date 04.04.2007',0 -rb 256 -mouse_flag: dd 0x0 structure_of_potock: -rb 1024 ;1 кб для получения общей структуры +rb 1024 ;1 кб для получения общей структуры rb 1024 i_end: \ No newline at end of file diff --git a/programs/develop/examples/editbox/trunk/editbox.mac b/programs/develop/examples/editbox/trunk/editbox.mac new file mode 100644 index 000000000..155c65c81 --- /dev/null +++ b/programs/develop/examples/editbox/trunk/editbox.mac @@ -0,0 +1,52 @@ +; Макрос выхода +macro edit_ex +{ +popa +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 ;вернуться чень интересный ход т.к. пока в стеке храниться кол-во вызовов то столько раз мы и будем вызываться +} \ No newline at end of file diff --git a/programs/develop/examples/editbox/trunk/macros.inc b/programs/develop/examples/editbox/trunk/macros.inc new file mode 100644 index 000000000..6df8eca32 --- /dev/null +++ b/programs/develop/examples/editbox/trunk/macros.inc @@ -0,0 +1,269 @@ +; new application structure +macro meos_app_start + { + use32 + org 0x0 + + db 'MENUET01' + dd 0x01 + dd __start + dd __end + dd __memory + dd __stack + + if used __params & ~defined __params + dd __params + else + dd 0x0 + end if + + dd 0x0 + } +MEOS_APP_START fix meos_app_start + +macro code + { + __start: + } +CODE fix code + +macro data + { + __data: + } +DATA fix data + +macro udata + { + if used __params & ~defined __params + __params: + db 0 + __end: + rb 255 + else + __end: + end if + __udata: + } +UDATA fix udata + +macro meos_app_end + { + align 32 + rb 2048 + __stack: + __memory: + } +MEOS_APP_END fix meos_app_end + + +; macro for defining multiline text data +struc mstr [sstring] + { + forward + local ssize + virtual at 0 + db sstring + ssize = $ + end virtual + dd ssize + db sstring + common + dd -1 + } + + +; strings +macro sz name,[data] { ; from MFAR [mike.dld] + common + if used name + label name + end if + forward + if used name + db data + end if + common + if used name + .size = $-name + end if +} + +macro lsz name,[lng,data] { ; from MFAR [mike.dld] + common + if used name + label name + end if + forward + if (used name)&(lang eq lng) + db data + end if + common + if used name + .size = $-name + end if +} + + + +; easy system call macro +macro mpack dest, hsrc, lsrc +{ + if (hsrc eqtype 0) & (lsrc eqtype 0) + mov dest, (hsrc) shl 16 + lsrc + else + if (hsrc eqtype 0) & (~lsrc eqtype 0) + mov dest, (hsrc) shl 16 + add dest, lsrc + else + mov dest, hsrc + shl dest, 16 + add dest, lsrc + end if + end if +} + +macro __mov reg,a,b { ; mike.dld + if (~a eq)&(~b eq) + mpack reg,a,b + else if (~a eq)&(b eq) + mov reg,a + end if +} + +macro mcall a,b,c,d,e,f { ; mike.dld + __mov eax,a + __mov ebx,b + __mov ecx,c + __mov edx,d + __mov esi,e + __mov edi,f + int 0x40 +} + + + +; optimize the code for size +__regs fix + +macro add arg1,arg2 + { + if (arg2 eqtype 0) + if (arg2) = 1 + inc arg1 + else + add arg1,arg2 + end if + else + add arg1,arg2 + end if + } + +macro sub arg1,arg2 + { + if (arg2 eqtype 0) + if (arg2) = 1 + dec arg1 + else + sub arg1,arg2 + end if + else + sub arg1,arg2 + end if + } + +macro mov arg1,arg2 + { + if (arg1 in __regs) & ((arg2 eqtype 0) | (arg2 eqtype '0')) + if (arg2) = 0 + xor arg1,arg1 + else if (arg2) = 1 + xor arg1,arg1 + inc arg1 + else if (arg2) = -1 + or arg1,-1 + else if (arg2) > -128 & (arg2) < 128 + push arg2 + pop arg1 + else + mov arg1,arg2 + end if + else + mov arg1,arg2 + end if + } + + +macro struct name + { + virtual at 0 + name name + sizeof.#name = $ - name + end virtual + } + +; structures used in MeOS +struc process_information + { + .cpu_usage dd ? ; +0 + .window_stack_position dw ? ; +4 + .window_stack_value dw ? ; +6 + .not_used1 dw ? ; +8 + .process_name rb 12 ; +10 + .memory_start dd ? ; +22 + .used_memory dd ? ; +26 + .PID dd ? ; +30 + .x_start dd ? ; +34 + .y_start dd ? ; +38 + .x_size dd ? ; +42 + .y_size dd ? ; +46 + .slot_state dw ? ; +50 + dw ? ; +52 - reserved + .client_left dd ? ; +54 + .client_top dd ? ; +58 + .client_width dd ? ; +62 + .client_height dd ? ; +66 + .wnd_state db ? ; +70 + rb (1024-71) + } +;struct process_information + +struc system_colors + { + .frame dd ? + .grab dd ? + .grab_button dd ? + .grab_button_text dd ? + .grab_text dd ? + .work dd ? + .work_button dd ? + .work_button_text dd ? + .work_text dd ? + .work_graph dd ? + } +;struct system_colors + + +; constants + +; events +EV_IDLE = 0 +EV_TIMER = 0 +EV_REDRAW = 1 +EV_KEY = 2 +EV_BUTTON = 3 +EV_EXIT = 4 +EV_BACKGROUND = 5 +EV_MOUSE = 6 +EV_IPC = 7 +EV_STACK = 8 + +; event mask bits for function 40 +EVM_REDRAW = 1b +EVM_KEY = 10b +EVM_BUTTON = 100b +EVM_EXIT = 1000b +EVM_BACKGROUND = 10000b +EVM_MOUSE = 100000b +EVM_IPC = 1000000b +EVM_STACK = 10000000b \ No newline at end of file