modify macros and optimization

git-svn-id: svn://kolibrios.org@483 a494cfbc-eb01-0410-851d-a64ba20cac60
This commit is contained in:
Alexey Teplov ( committed 2007-05-10 04:03:05 +00:00
1 parent 9104b5cebc
commit b192d9260a
5 files changed
+680 -609

No files matched your search

@@ -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
}
@@ -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- хую Єю цх юс чрЄхы№эю эєцэю яхЁхфртрЄ№!!!!
┼ёыш т яЁюуЁрььх єцх шёяюы№чєхЄё  ¤Єр ЇєэЎш , Єю эх эєцэю єърч√трЄ№ фрээ√х ярЁрьхЄЁ!!!!
┴юы№°х эшъръшї ярЁрьхЄЁют яхЁхфртрЄ№ эх эєцэю.
**********
@@ -6,6 +6,7 @@ You bunny wrote .....
▌Єю эх ьэюую Їюы№ъыхЁр, ёт чрээюх, ё Єхь, ўЄю эряшёрэшх яЁюуЁрьь фышээ√х ш ьєЄюЁэ√щ яЁюЎхёё, ш юэ эх юсїюфшЄ№ё  схч т√Ёрцхэшщ яюфюсэюую ёюфхЁцрэш , эю эх яюярфр■∙хую т ъюьхэЄрЁшш ш юёэютэющ ъюф.....
╥хяыют └ыхъёхщ ▐Ё№хтшў aka <Lrz>
; <Lrz> 09.05.2007 ╬с∙р  фюЁрсюЄър ьръЁюёют,чрьхэр эхёъюы№ъю ьхЄюъ, ьшуЁрЎш  ъюфр т edit_box.mac
; <Lrz> 19.04.2007 ╬с∙р  фюЁрсюЄър ьръЁюёют
; <Lrz> 14.04.2007 ╚ёяЁртыхэю єяЁртыхэшх ь√°ъющ, яЁш єфрыхэшш яюёыхфэхую ёшьтюыр т сєЇхЁх яш°хЄ№ё  0 (ёярёшсю Mario79)
; <Lrz> 04.04.2007 ╠юфхЁэшчшЁютры ёшёЄхьє т√фхыхэш , ёє∙хёЄтхээю яхЁхфхырэю єяЁртыхэшх ш юсЁрсюЄър, фюсртыхээю сыюъшЁютрэш  юсЁрсюЄъш фЁєушї сюъёют, тю тЁхь  т√фхыхэш  ь√°ъющ ЄхъёЄр, фы  ¤Єюую т ЄхъёЄ яЁюуЁрьь√ эхюсїюфшью фюсртшЄ№ шфхэЄшЇшърЄюЁ сюъёр Є.х. dd 0x0 ш т эхую сєфхЄ яюьх∙рЄ№ё  єъррЄхы№ эр editbox
@@ -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 <Lrz> date 19.04.2007',0
hed db 'EDITBOX optimization and retype <Lrz> 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:
rb 1024 ;Stack
i_end:
@@ -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