From fcf5e6d6b91ab98bbc521f87f511d4d67cef4317 Mon Sep 17 00:00:00 2001 From: heavyiron Date: Fri, 16 Feb 2007 02:22:14 +0000 Subject: [PATCH] *added OptionBox *temporary links to editbox and checkbox (..\..\..\develop\examples...) for rdsave, run, scrshoot *optimised circle git-svn-id: svn://kolibrios.org@353 a494cfbc-eb01-0410-851d-a64ba20cac60 --- .../develop/examples/circle/trunk/build.bat | 2 + .../examples/circle/trunk/build_en.bat | 4 - .../examples/circle/trunk/build_ru.bat | 4 - .../develop/examples/circle/trunk/circle.asm | 37 +- .../examples/optionbox/trunk/build.bat | 2 + .../examples/optionbox/trunk/macros.inc | 269 +++++ .../examples/optionbox/trunk/optbox.inc | 112 ++ .../examples/optionbox/trunk/optxampl.asm | 165 +++ programs/media/scrshoot/checkbox.inc | 196 ---- programs/media/scrshoot/editbox.inc | 978 ------------------ programs/media/scrshoot/macros.inc | 4 +- programs/system/rdsave/trunk/editbox.inc | 978 ------------------ programs/system/rdsave/trunk/rdsave.asm | 2 +- programs/system/run/trunk/editbox.inc | 978 ------------------ 14 files changed, 567 insertions(+), 3164 deletions(-) create mode 100644 programs/develop/examples/circle/trunk/build.bat delete mode 100644 programs/develop/examples/circle/trunk/build_en.bat delete mode 100644 programs/develop/examples/circle/trunk/build_ru.bat create mode 100644 programs/develop/examples/optionbox/trunk/build.bat create mode 100644 programs/develop/examples/optionbox/trunk/macros.inc create mode 100644 programs/develop/examples/optionbox/trunk/optbox.inc create mode 100644 programs/develop/examples/optionbox/trunk/optxampl.asm delete mode 100644 programs/media/scrshoot/checkbox.inc delete mode 100644 programs/media/scrshoot/editbox.inc delete mode 100644 programs/system/rdsave/trunk/editbox.inc delete mode 100644 programs/system/run/trunk/editbox.inc diff --git a/programs/develop/examples/circle/trunk/build.bat b/programs/develop/examples/circle/trunk/build.bat new file mode 100644 index 0000000000..658f34a0cd --- /dev/null +++ b/programs/develop/examples/circle/trunk/build.bat @@ -0,0 +1,2 @@ +@fasm circle.asm circle +@pause \ No newline at end of file diff --git a/programs/develop/examples/circle/trunk/build_en.bat b/programs/develop/examples/circle/trunk/build_en.bat deleted file mode 100644 index ced4751a63..0000000000 --- a/programs/develop/examples/circle/trunk/build_en.bat +++ /dev/null @@ -1,4 +0,0 @@ -@erase lang.inc -@echo lang fix en >lang.inc -@fasm circle.asm circle -@pause \ No newline at end of file diff --git a/programs/develop/examples/circle/trunk/build_ru.bat b/programs/develop/examples/circle/trunk/build_ru.bat deleted file mode 100644 index 3b3d4fd6b5..0000000000 --- a/programs/develop/examples/circle/trunk/build_ru.bat +++ /dev/null @@ -1,4 +0,0 @@ -@erase lang.inc -@echo lang fix ru >lang.inc -@fasm circle.asm circle -@pause \ No newline at end of file diff --git a/programs/develop/examples/circle/trunk/circle.asm b/programs/develop/examples/circle/trunk/circle.asm index 2940c8cad5..b0f33d9394 100644 --- a/programs/develop/examples/circle/trunk/circle.asm +++ b/programs/develop/examples/circle/trunk/circle.asm @@ -16,7 +16,6 @@ use32 dd 0x1000 ; esp dd 0x00000000 ; reserved=no extended header -include 'lang.inc' include 'macros.inc' @@ -24,7 +23,7 @@ include 'macros.inc' START: ; start of execution call shape_window ; function for shaping - + red: call draw_window ; at first, draw the window still: @@ -32,32 +31,24 @@ still: mov eax,10 ; wait here for event int 0x40 - cmp eax,1 ; redraw request ? - je red - cmp eax,2 ; key in buffer ? - je key - cmp eax,3 ; button in buffer ? - je button + dec eax ; redraw request ? + jz red + dec eax ; key in buffer ? + jz key - jmp still - - red: ; redraw - call draw_window - jmp still - - key: ; key - mov eax,2 ; just read it and ignore - int 0x40 - jmp still - - button: ; button - mov eax,17 ; get id + button: + mov al,17 ; get id int 0x40 cmp ah,1 ; button id=1 ? jne noclose - mov eax,-1 ; close this program + or eax,-1 ; close this program int 0x40 + + key: ; key + mov al,2 ; just read it and ignore + int 0x40 + jmp still noclose: jmp still @@ -130,7 +121,7 @@ draw_window: int 0x40 ; DRAW WINDOW - mov eax,0 ; function 0 : define and draw window + xor eax,eax ; function 0 : define and draw window mov ebx,100*65536 ; [x start] *65536 + [x size] mov ecx,100*65536 ; [y start] *65536 + [y size] mov bx,word [x_size] diff --git a/programs/develop/examples/optionbox/trunk/build.bat b/programs/develop/examples/optionbox/trunk/build.bat new file mode 100644 index 0000000000..48d6648889 --- /dev/null +++ b/programs/develop/examples/optionbox/trunk/build.bat @@ -0,0 +1,2 @@ +@fasm optxampl.asm optxample +@pause \ No newline at end of file diff --git a/programs/develop/examples/optionbox/trunk/macros.inc b/programs/develop/examples/optionbox/trunk/macros.inc new file mode 100644 index 0000000000..14185dbfce --- /dev/null +++ b/programs/develop/examples/optionbox/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 diff --git a/programs/develop/examples/optionbox/trunk/optbox.inc b/programs/develop/examples/optionbox/trunk/optbox.inc new file mode 100644 index 0000000000..9837aec8e6 --- /dev/null +++ b/programs/develop/examples/optionbox/trunk/optbox.inc @@ -0,0 +1,112 @@ +; +;OptionBox for MenuetOS +; +;by Harald Weber +;kitemaster@gmx.at +; +;16.02.07 Heavyiorn - optimizations for kolibri system functions +; +;######### USAGE ############ +;include "optionbox.inc" +; +;//in end of draw_window procedure +;draw_optionboxes: +; mov eax, [pos_x] shl 16 + [pos_y] +; mov cl, buttonid +; mov edx, Text ;pointer to text beginning +;call optionbox +; +; +;Text db 'Optionbox Text',0 +; +;//for more info see optxampl.asm +;########################## + +optionbox: + +mov [optionbox_pos_y],ax +shr eax,16 +mov [optionbox_pos_x],ax +mov [optionbox_text],edx +mov [optionbox_id],cl +;######### Draw Checkbox ######## +optionbox_draw: + + mov eax, 13 + mov bx, [optionbox_pos_x] + shl ebx, 16 + add bx, 11 + mov cx, [optionbox_pos_y] + shl ecx, 16 + add cx, 11 + mov edx,[sc.work_text] + int 0x40 + + mov edx,[sc.work] + add ebx, 1 shl 16 - 2 + add ecx, 1 shl 16 -2 + int 0x40 + + +;######### Draw Hidden Button ###### +optionbox_hid_button: +mov eax,8 +mov bx,[optionbox_pos_x] +sub bx,1 +shl ebx,16 +mov bx,13 +mov cx,[optionbox_pos_y] +sub cx,1 +shl ecx,16 +mov cx,13 +mov dl,[optionbox_id] ;buttonid +or edx,0x60000000 ;button in invisible without frame +int 0x40 +;######### Draw X ####### +optionbox_x_draw: +mov al,[optionbox_id] +cmp [optionbox_checked],al +jne optionbox_dis + + mov eax, 13 + mov bx, [optionbox_pos_x] + add bx, 3 + shl ebx, 16 + add bx, 5 + mov cx, [optionbox_pos_y] + add cx, 3 + shl ecx, 16 + add cx, 5 + mov edx,[sc.work_text] + int 0x40 + +optionbox_dis: + +;######### Checkbox Text ##### +optionbox_draw_text: + mov eax,4 ; function 4 : write text to window + mov bx,[optionbox_pos_x] + add bx, 14 + shl ebx,16 + mov bx,[optionbox_pos_y] + add bx, 2 ; [x start] *65536 + [y start] + mov ecx,[sc.work_text] ; color of text RRGGBB + or ecx,0x80000000 + mov edx,[optionbox_text] ; pointer to text beginning + int 0x40 + +ret + +;######### Set OptionBox ##### +set_optionbox: + mov [optionbox_checked],ah + call draw_optionboxes +ret + +;########## Data Area ######## + +optionbox_pos_x dw ? +optionbox_pos_y dw ? +optionbox_text dd ? +optionbox_checked db ? +optionbox_id db ? \ No newline at end of file diff --git a/programs/develop/examples/optionbox/trunk/optxampl.asm b/programs/develop/examples/optionbox/trunk/optxampl.asm new file mode 100644 index 0000000000..e1fa052e90 --- /dev/null +++ b/programs/develop/examples/optionbox/trunk/optxampl.asm @@ -0,0 +1,165 @@ +; +; EXAMPLE APPLICATION +; +; Compile with FASM for Menuet +; +include 'macros.inc' + +use32 + + org 0x0 + + db 'MENUET01' ; 8 byte id + dd 0x01 ; header version + dd START ; start of code + dd I_END ; size of image + dd 0x1000 ; memory for app + dd 0x1000 ; esp + dd 0x0 , 0x0 ; I_Param , I_Icon + +START: ; start of execution + +red: + call draw_window + +still: + + push 10 ; wait here for event + pop eax + int 0x40 + + dec eax ; redraw request ? + jz red + dec eax ; key in buffer ? + jz key + + button: ; button + mov al,17 ; get id + int 0x40 + + cmp ah,2 + je button2 + + cmp ah,3 + je button3 + + cmp ah,4 + je button4 + + cmp ah,5 + je button5 + + cmp ah,1 ; button id=1 ? + jne noclose + + or eax,-1 ; close this program + int 0x40 + + noclose: + jmp still + + button2: ;option 1 + call set_optionbox + jmp still + + button3: ;option 2 + call set_optionbox + jmp still + + button4: ;option 3 + call set_optionbox + jmp still + + button5: + mov eax,4 ; function 4 : write text to window + mov ebx,170*65536+35 ; [x start] *65536 + [y start] + mov ecx,[sc.work_button_text] ; font 1 & color ( 0xF0RRGGBB ) + mov edx,options-1 + add dl, [optionbox_checked] ; pointer to text beginning + mov esi,1 ; text length + int 0x40 + + jmp still + +key: ; key + mov al,2 ; just read it and ignore + int 0x40 + jmp still + + +; ********************************************* +; ******* WINDOW DEFINITIONS AND DRAW ******** +; ********************************************* + + +draw_window: + + mov eax,48 + mov ebx,3 + mov ecx,sc + mov edx,sizeof.system_colors + int 0x40 + + + mov eax,12 ; function 12:tell os about windowdraw + mov ebx,1 ; 1, start of draw + int 0x40 + + ; DRAW WINDOW + xor eax,eax ; function 0 : define and draw window + mov ebx,100*65536+300 ; [x start] *65536 + [x size] + mov ecx,100*65536+120 ; [y start] *65536 + [y size] + mov edx,[sc.work] ; color of work area RRGGBB,8->color gl + or edx,0x33000000 + mov edi,header ; WINDOW LABEL + int 0x40 + + mov eax,8 ; function 8 : define and draw button + mov ebx,165*65536+15 ; [x start] *65536 + [x size] + mov ecx,30*65536+15 ; [y start] *65536 + [y size] + mov edx,5 ; button id + mov esi,[sc.work_button] ; button color RRGGBB + int 0x40 + + draw_optionboxes: + ;draw optionbox1 + mov eax, 45 shl 16 + 20 ; [x start] shl 16 + [y start] + mov cl, 2 ; button id + mov edx, optiontext1 ; pointer to text beginning + call optionbox + + ;draw optionbox2 + mov eax, 45 shl 16 + 40 ; [x start] shl 16 + [y start] + mov cl, 3 ; button id + mov edx, optiontext2 ; pointer to text beginning + call optionbox + + ;draw optionbox3 + mov eax, 45 shl 16 + 60 ; [x start] shl 16 + [y start] + mov cl, 4 ; button id + mov edx, optiontext3 ; pointer to text beginning + call optionbox + + + mov eax,12 ; function 12:tell os about windowdraw + mov ebx,2 ; 2, end of draw + int 0x40 + + ret + +include "optbox.inc" + +; DATA AREA + +optiontext1: db 'OptionBox1',0 +optiontext2: db 'OptionBox2',0 +optiontext3: db 'OptionBox3',0 + +options: db '0123' + +header db 'OptionBox example',0 + +I_END: + +sc system_colors + diff --git a/programs/media/scrshoot/checkbox.inc b/programs/media/scrshoot/checkbox.inc deleted file mode 100644 index 216b866947..0000000000 --- a/programs/media/scrshoot/checkbox.inc +++ /dev/null @@ -1,196 +0,0 @@ -macro use_check_box -{ -ch_text_margin=3 -ch_size=10 -ch_left equ [edi] -ch_top equ [edi+2] -ch_color equ [edi+4] -ch_border_color equ [edi+8] -ch_text_color equ [edi+12] -ch_text_ptr equ [edi+16] -ch_flags equ [edi+20] -check_box: -.draw: -pusha - mov eax,38 - mov bx,ch_left - push bx - shl ebx,16 - pop bx - mov cx,ch_top - push cx - shl ecx,16 - pop cx - push cx - add cx,ch_size - mov edx,ch_border_color - int 0x40 - push bx - add bx,ch_size - ror ebx,16 - add bx,ch_size - int 0x40 - pop bx - pop cx - int 0x40 - add cx,ch_size - push cx - shl ecx,16 - pop cx - int 0x40 - - mov eax,13 - mov bx,ch_left - inc bx - shl ebx,16 - mov bx,ch_size - dec bx - push bx - mov cx,ch_top - inc cx - shl ecx,16 - pop cx - mov edx,ch_color - int 0x40 - - bt dword ch_flags,1 - jnc @f - call .draw_ch -@@: - - call .get_text_n - mov bx,ch_left - add bx,(ch_size+ch_text_margin) - shl ebx,16 - mov bx,ch_top - add bx,(ch_size-9+2) - mov ecx,ch_text_color - mov eax,4 - int 0x40 -popa -ret - -.get_text_n: - push eax - xor esi,esi - mov edx,ch_text_ptr -@@: - mov ah,[edx+esi] - inc esi - test ah,ah - jnz @b - dec esi - pop eax -ret - -.clear_ch: - mov edx,ch_color - jmp @f -.draw_ch: - mov edx,ch_border_color -@@: - mov bx,ch_left - add bx,(ch_size/3) - shl ebx,16 - mov bx,(ch_size/2) - push bx - mov cx,ch_top - add cx,(ch_size/3) - shl ecx,16 - pop cx - mov eax,13 - int 0x40 -ret - -.mouse: -pusha - mov eax,37 - mov ebx,2 - int 0x40 - bt eax,0 - jc @f - btr dword ch_flags,2 - popa - ret -@@: - bts dword ch_flags,2 - jc .mouse_end - call .get_text_n - imul esi,6 - add si,ch_text_margin - mov eax,37 - xor ebx,ebx - inc ebx - int 0x40 - mov bx,ch_top - cmp ax,bx - jl .mouse_end - add bx,ch_size - cmp ax,bx - jg .mouse_end - shr eax,16 - mov bx,ch_left - cmp ax,bx - jl .mouse_end - add bx,ch_size - add bx,si - cmp ax,bx - jg .mouse_end - - bts dword ch_flags,1 - jc @f - call .draw_ch - jmp .mouse_end -@@: - btr dword ch_flags,1 - call .clear_ch -.mouse_end: -popa -ret -} - -struc check_box left,top,color,border_color,text_color,text,flags -{ -.left: dw left ;+0 -.top: dw top ;+2 -.color: dd color ;+4 -.border_color: dd border_color ;+8 -.text_color: dd text_color ;+12 -.text: dd text ;+16 -.flags: dd flags+0 ;+20 -} - -ch_struc_size=24 -macro draw_check_boxes start,end -{ - mov edi,start - mov ecx,((end-start)/ch_struc_size) -@@: - call check_box.draw - add edi,ch_struc_size - loop @b -} - -macro mouse_check_boxes start,end -{ - mov edi,start - mov ecx,((end-start)/ch_struc_size) -@@: - call check_box.mouse - add edi,ch_struc_size - loop @b -} - -macro check_boxes_set_sys_color start,end,color_table -{ - mov edi,start - mov ecx,((end-start)/ch_struc_size) - mov esi,color_table -@@: - push dword [esi+32] - pop dword ch_text_color - push dword [esi+36] - pop dword ch_border_color - add edi,ch_struc_size - loop @b -} \ No newline at end of file diff --git a/programs/media/scrshoot/editbox.inc b/programs/media/scrshoot/editbox.inc deleted file mode 100644 index 004835f904..0000000000 --- a/programs/media/scrshoot/editbox.inc +++ /dev/null @@ -1,978 +0,0 @@ -; 01.02.2007 доработка edit_box, исправил баги. -; 26.01.2007 нормальная работа компанента исправил фукцию .check_offset -; 24.01.2007 пофиксел баги вызваные не правильным кодом )). -; 22.01.2007 избавился от глюков при работе с выделением и удаление, корректная работа клавишей del & backspase -; 20.01.2007 реализовал выделение текста по shift -; 12.12.2006 реализовал поддержку кнопки insert и сегодя компонент почти работает!!!! -; 07.12.2006 продолжается работа над переработкой компонента,изменениям подверглись многие функции, переработан вывод текста, а така же алгоритм внесения символов. -; 03.09.2006 по возможности отказался от 16 битной арифметики, добавил новые баги -; 09.08.2006 произведена оптимизация работы конпок DEL и Backspace, уменьшен размер выполняемого кода. -; 21.07.2006 добавлена функция кнопки Del, теперь можно удалять символы при помощи данной клавиши -; Автор: Евтихов Максим (Maxxxx32) email: maxxxxm@mail.ru -; Дата последних изменений: 13.06.06 10:40 -; Напишите в исходном коде своей программы use_edit_box, -; это вставит необходимые процедуры в код вашей программы. -; Процедуры: -; edit_box.draw - полная перерисовка; -; edit_box.key - обработка клавиатуры; -; edit_box.mouse - обработка мыши; -; edit_box.focus - установка фокуса; -; edit_box.blur - его размывание; -; edit_box.get_n - получить количество прорисовываемых символов. -; При вызове любых из этих процедур в регистре edi следует -; оставить указатель на структуру. -; Пример структуры: -; some_edit edit_box 100,10,30,0x00ffffff,0,0x00aaaaaa,0,255,some_edit_text -; длина, высота, верх, цвет фона, цвет рамки, если выбран, -; цвет рамки, если не выбран, максимальное количество символов, -; указатель на буфер, где будут хранится символы. Буфер должен -; оканчиваться нулем, например если максимальное количество 255: -; some_edit_text: -; rb 256 ;255+1 - -; Пример вызова процедуры: -; mov edi,some_edit -; call edit_box.draw - -; При вызове процедуры edit_box.key код клавиши должен -; находится в ah, то есть перед вызовом этой процедуры надо вызвать -; 2-ую сисемную функцию, например: -; mov eax,2 -; int 0x40 -; mov edi,some_edit1 -; call edit_box.key -; mov edi,some_edit2 -; call edit_box.key -; Перед вызовом обработчика мыши следует проверить, является ли окно -; активным. -; Если щелчок мыши был пройзведен за пределами edit box -; фокус теряется. -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_height=14 ; высота -shift_color=0x6a9480 -ed_insert=10000b -ed_insert_cl=1111111111101111b -;========================================================== -;=== процедура прорисовки ================================= -;========================================================== -.draw: -pusha -;--- рисуем рамку --- - call .draw_border ; Функция стабильна -.draw_bg_cursor_text: -;--- изменяем смещение, если надо --- - call .check_offset ;вычисление позиции курсора стабильна -;--- рисуем внутреннюю область --- - call .draw_bg ;нарисовать прямоугольник рабочей области -.draw_cursor_text: -;--- рисуем курсор --- - ;--- может его не надо рисовать ---- - test word ed_flags,ed_focus - je @f - call .draw_cursor -@@: - call .draw_text -popa -ret - -;.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 ;вернуться чень интересный ход т.к. пока в стеке храниться кол-во вызовов то столько раз мы и будем вызываться - -;---------------------------------------------------------- -;--- процедура прорисовки текста -------------------------- -;---------------------------------------------------------- -.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 -;---------------------------------------------------------- -.draw_bg_eax: - mov ecx,ed_top - add ecx,1 - shl ecx,16 - mov cx,13 - mov eax,13 - int 0x40 -ret - - jmp @f -.draw_bg: - mov ebx,ed_left - add ebx,1 - shl ebx,16 - mov bx,ed_width - sub ebx,1 - -@@: - mov ecx,ed_top - mov eax,13 - add ecx,1 - shl ecx,16 - mov edx,ed_color - mov cx,ed_height - sub ecx,1 - 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 - -;---------------------------------------------------------- -;--- процедура рисования курсора -------------------------- -;---------------------------------------------------------- -.clear_cursor: - mov edx,ed_color - test word ed_flags,ed_shift - je @f - mov edx,shift_color -@@: - 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 dword 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: -pushad - 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 - 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 - -; ;----------- отладка -; pushad -; mov [data_of_code],0 -; mov eax,ebx;ed_offset -; mov edi,data_of_code -; call .str -; ;рисование фона -; mov eax,13 -; mov ebx,178*65536+36 -; mov ecx,28*65536+10 -; xor edx,edx -; int 0x40 -; ;вывод значения на экран -; mov eax,4 -; mov ebx,180*65536+30 -; mov ecx,0x10DDBBCC -; mov edx,data_of_code -; mov esi,4 -; int 0x40 -; popad -; ;----------- отладка - -.chk_d: mov ed_offset,ebx - - call .draw_bg - mov dword [esp+28],-1 -popad - ret - -@@: - mov dword [esp+28],0 -popad - ret - - -;;;;;;;;;;;;;;;;;;;;;;;;;;;; -; mov ebx,eax -; mov eax,ed_pos -; xor edx,edx -; idiv ebx -; xor edx,edx -; imul eax,ebx -; mov ed_offset,eax -; pop ebx -; cmp ax,bx -; je @f -;;;;;;;; данные для закрашивания всей полосы прямоугольника -; mov ebx,ed_left -; inc ebx -; shl ebx,16 -; mov bx,ed_width -; dec ebx -; mov edx,ed_color -; call .draw_bg_eax -; mov dword [esp+28],0 -;@@: popad -; ret -;========================================================== -;=== обработка клавиатуры ================================= -;========================================================== -.key: -pusha - test word ed_flags,ed_focus ; если не в фокусе, выходим - je .no_figure ;@f - - xor ecx,ecx - push eax - inc ecx - mov eax,66 - mov ebx,3 - int 0x40 - test al,0x03 - je @f - or word ed_flags,ed_shift - -@@: pop eax -;---------------------------------------------------------- -;--- проверяем, что нажато -------------------------------- -;---------------------------------------------------------- - 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 -;--- нажата другая клавиша --- - 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 - call .del_char -;;;; - mov eax,ed_shift_pos - mov ebx,ed_size - sub ebx,eax - mov ed_size,ebx - pop eax - - ; проверяем, находится ли курсор в конце -@@: mov ecx,ed_size - mov edx, ed_max - 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 - je .insert_1 - and word ed_flags,ed_insert_cl - jmp .no_figure -.insert_1: - 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 - 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 - - cmp ecx,ebx ;Если у нас позиция курсора = текущему размеру напечатанных символов т.е. курсор стоит в конце - je .In_k - - test word [ebp+36],ed_insert ;IF insert is enable т.к. edi изменен адресуем через ebp - jne .ins_v - - 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 - -;--- нажата клавиша 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 -.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 - -.draw_all: - push .shift;.draw_cursor_text;eax - - test word ed_flags,ed_shift_on - je @f - mov eax,ed_shift_pos - mov ebx,ed_size - sub ebx,eax - mov ed_size,ebx - jmp .draw_all2 - -@@: dec dword ed_size - -.draw_all2: - and word ed_flags,ed_shift_cl - call .clear_cursor - call .check_offset -;;;;;;;;;;;;;;; - test eax,eax - jne @f - call .draw_bg - ret -;;;;;;;;;;;;;;; -@@: call .get_n - push eax - mov ebx,ed_offset - add eax,ebx ;eax = w_off= ed_offset+width - mov ebx,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 -; jmp .shift -;--- нажата клавиша left --- -.left: call .sh_enable - mov ebx,ed_pos - test ebx,ebx - jz .nd_k - call .clear_cursor - dec dword ed_pos - jmp .nd_k -;--- нажата клавиша right --- -.right: call .sh_enable - mov ebx,ed_pos - cmp ebx,ed_size - je .nd_k - call .clear_cursor - inc dword ed_pos - jmp .nd_k -.home: call .sh_enable - mov ebx,ed_pos - test ebx,ebx - jz .nd_k - call .clear_cursor - xor eax,eax - mov ed_pos,eax - jmp .nd_k - -.end: call .sh_enable - mov ebx,ed_pos - cmp ebx,dword ed_size - je .nd_k - call .clear_cursor - mov eax,ed_size - mov ed_pos,eax -.nd_k: call .check_offset - ;test eax,eax - ;jz .draw_bg_cursor_text - call .draw_cursor - -.shift: ;;;;;;;SHIFT - - call .draw_bg ;не оптимально - test word ed_flags,ed_shift - je .f_exit -;;;;;;SHIFT end - mov eax,dword ed_pos - mov ebx,dword ed_shift_pos - cmp eax,ebx - jae .sh_n - push eax ;меньшее в eax - push ebx ;большее - jmp .sh_n1 - ;если иначе -.sh_n: push ebx - push eax -.sh_n1: -; jmp .draw_all2 -;;;;;;;;;;;;;;;;;;;;;;;;; - ;call .clear_cursor - call .check_offset - call .get_n - mov edx,eax ;size of ed_box -; push eax - mov ecx,ed_offset - add eax,ecx ;eax = w_off= ed_offset+width - mov ebp,eax ;save - pop ebx ;большее - pop eax ;меньшее - - - cmp eax,ecx ;сравнение с меньшего с offset. - jae .f_f ;если больше - xor eax,eax - cmp ebp,ebx ;cравним размер w_off с большим - jb @f - sub ebx,ecx - jmp .nxt_f -@@: mov ebx,ebp - sub ebx,ecx - jmp .nxt_f - -.f_f: - sub eax,ecx - cmp ebp,ebx ;cравним размер w_off с большим - jle @f - sub ebx,ecx - sub ebx,eax - jmp .nxt_f -@@: - mov ebx,ebp - 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 - mov edx,shift_color - call .draw_bg_eax - and word ed_flags,1111111111111011b - jmp .draw_cursor_text -;;;;;;;;;;;;;;;;;;;;; - -.f_exit: and word ed_flags,ed_shift_cl - jmp .draw_cursor_text - -;проверка состояния shift был ли он нажат раньше? -.sh_enable: - test word ed_flags,ed_shift - je @f - test word ed_flags,ed_shift_on - jne .sh_ext_en - push dword ed_pos - pop dword ed_shift_pos - or word ed_flags,ed_shift_on - ret - -@@: and word ed_flags,ed_shift_cl -.sh_ext_en: ret - - ;- удаление символа - ;Входные данные 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 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 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 -;========================================================== -;=== обработка мыши ======================================= -;========================================================== -.mouse: -pusha -;---------------------------------------------------------- -;--- получаем состояние кнопок мыши ----------------------- -;---------------------------------------------------------- - mov eax,37 - mov ebx,2 - int 0x40 -;---------------------------------------------------------- -;--- проверяем состояние ---------------------------------- -;---------------------------------------------------------- - test eax,1 - jnz .mouse_left_button -@@: popa - ret - -.mouse_left_button: -;---------------------------------------------------------- -;--- получаем координаты мыши ----------------------------- -;---------------------------------------------------------- - mov eax,37 - xor ebx,ebx - inc ebx - int 0x40 -;---------------------------------------------------------- -;--- проверяем, попадает ли курсор в edit box ------------- -;---------------------------------------------------------- - mov ebx,ed_top - cmp ax,bx - jl ._blur;.mouse_end_no_focus - - add bx,ed_height - cmp ax,bx - jg ._blur;.mouse_end_no_focus - - shr eax,16 - - mov bx,ed_left - cmp ax,bx - jl ._blur;.mouse_end_no_focus - - add bx,ed_width - cmp ax,bx - jg ._blur;.mouse_end_no_focus -;--- изменяем позицию курсора --- - push eax - call .clear_cursor - pop eax - xor dx,dx - sub ax,ed_left - add ax,2 - mov bx,6 - div bx - add ax,ed_offset - cmp ax,ed_size - jna @f - mov ax,ed_size -@@: - mov ed_pos,ax - call .check_offset - call .draw_cursor -;---------------------------------------------------------- -;--- процедура установки фокуса --------------------------- -;---------------------------------------------------------- - bts word ed_flags,1 - jc .mouse_pressed - call .draw_cursor - call .draw_border -.mouse_pressed: -popa -ret -;.mouse_end_no_focus: -; call .blur -;popa -;ret -;.blur: -;pusha -._blur: - test word ed_flags,ed_always_focus - jne @f - btr word ed_flags,1 ; если не в фокусе, выходим - jnc @f - call .clear_cursor - call .draw_border -@@: -popa -ret - -;---------------------------------------------------------- -;--- процедура размывания фокуса -------------------------- -;---------------------------------------------------------- -;.blur: -;pusha -;._blur: - ;btr ed_flags,1 - ;jnc @f - ;call .draw_border - ;call .clear_cursor -;@@: -;popa -;ret -} -ed_figure_only=1000000000000000b -ed_always_focus=100000000000000b -ed_focus=10b -ed_shift_on=1000b -ed_shift=100b -ed_shift_cl=1111111111110011b -macro draw_edit_boxes start,end -{ - mov edi,start - mov ecx,((end-start)/ed_struc_size) -@@: - 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) -@@: - 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) -@@: - call edit_box.key - add edi,ed_struc_size - loop @b -} -ed_struc_size=62 -struc edit_box width,left,top,color,focus_border_color,\ - blur_border_color,text_color,max,text,flags,size -{ -.width dd width -.left dd left -.top dd top -.color dd color -.focus_border_color dd focus_border_color -.blur_border_color dd blur_border_color -.text_color dd text_color -.max dd max -.text dd text -.flags dw flags+0 -.size dd size+0 -.pos dd 0 -.offset dd 0 -.cl_curs_x dd 0 -.cl_curs_y dd 0 -.shift dd 0 -} - -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 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 -{ - mov edi,ed_ptr - call edit_box.draw -} - -macro mouse_edit_box ed_ptr -{ - mov edi,ed_ptr - call edit_box.mouse -} - -macro key_edit_box ed_ptr -{ - mov edi,ed_ptr - call edit_box.key -} \ No newline at end of file diff --git a/programs/media/scrshoot/macros.inc b/programs/media/scrshoot/macros.inc index cc7c4d64e4..6e39ffb313 100644 --- a/programs/media/scrshoot/macros.inc +++ b/programs/media/scrshoot/macros.inc @@ -1,9 +1,9 @@ ;--- другие макросы --- -include 'editbox.inc' +include '..\..\develop\examples\editbox\trunk\editbox.inc' include 'txtbut.inc' ;include 'gp.inc' include 'label.inc' -;include 'checkbox.inc' +;include '..\..\develop\examples\checkbox\trunk\checkbox.inc' include 'check.inc' include 'file_sys.inc' include 'textwork.inc' diff --git a/programs/system/rdsave/trunk/editbox.inc b/programs/system/rdsave/trunk/editbox.inc deleted file mode 100644 index 28233e5d39..0000000000 --- a/programs/system/rdsave/trunk/editbox.inc +++ /dev/null @@ -1,978 +0,0 @@ -; 01.02.2007 доработка edit_box, исправил баги. -; 26.01.2007 нормальная работа компонента исправил фукцию .check_offset -; 24.01.2007 пофиксил баги, вызванные неправильным кодом )). -; 22.01.2007 избавился от глюков при работе с выделением и удалением, корректная работа клавиш del & backspase -; 20.01.2007 реализовал выделение текста по shift -; 12.12.2006 реализовал поддержку кнопки insert и сегодя компонент почти работает!!!! -; 07.12.2006 продолжается работа над переработкой компонента,изменениям подверглись многие функции, переработан вывод текста, а также алгоритм внесения символов. -; 03.09.2006 по возможности отказался от 16 битной арифметики, добавил новые баги -; 09.08.2006 произведена оптимизация работы конпок DEL и Backspace, уменьшен размер выполняемого кода. -; 21.07.2006 добавлена функция кнопки Del, теперь можно удалять символы при помощи данной клавиши -; Автор: Евтихов Максим (Maxxxx32) email: maxxxxm@mail.ru -; Дата последних изменений: 13.06.06 10:40 -; Напишите в исходном коде своей программы use_edit_box, -; это вставит необходимые процедуры в код вашей программы. -; Процедуры: -; edit_box.draw - полная перерисовка; -; edit_box.key - обработка клавиатуры; -; edit_box.mouse - обработка мыши; -; edit_box.focus - установка фокуса; -; edit_box.blur - его размывание; -; edit_box.get_n - получить количество прорисовываемых символов. -; При вызове любых из этих процедур в регистре edi следует -; оставить указатель на структуру. -; Пример структуры: -; some_edit edit_box 100,10,30,0x00ffffff,0,0x00aaaaaa,0,255,some_edit_text -; длина, высота, верх, цвет фона, цвет рамки, если выбран, -; цвет рамки, если не выбран, максимальное количество символов, -; указатель на буфер, где будут хранится символы. Буфер должен -; оканчиваться нулем, например если максимальное количество 255: -; some_edit_text: -; rb 256 ;255+1 - -; Пример вызова процедуры: -; mov edi,some_edit -; call edit_box.draw - -; При вызове процедуры edit_box.key код клавиши должен -; находится в ah, то есть перед вызовом этой процедуры надо вызвать -; 2-ую сисемную функцию, например: -; mov eax,2 -; int 0x40 -; mov edi,some_edit1 -; call edit_box.key -; mov edi,some_edit2 -; call edit_box.key -; Перед вызовом обработчика мыши следует проверить, является ли окно -; активным. -; Если щелчок мыши был пройзведен за пределами edit box -; фокус теряется. -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_height=14 ; высота -shift_color=0x6a9480 -ed_insert=10000b -ed_insert_cl=1111111111101111b -;========================================================== -;=== процедура прорисовки ================================= -;========================================================== -.draw: -pusha -;--- рисуем рамку --- - call .draw_border ; Функция стабильна -.draw_bg_cursor_text: -;--- изменяем смещение, если надо --- - call .check_offset ;вычисление позиции курсора стабильна -;--- рисуем внутреннюю область --- - call .draw_bg ;нарисовать прямоугольник рабочей области -.draw_cursor_text: -;--- рисуем курсор --- - ;--- может его не надо рисовать ---- - test word ed_flags,ed_focus - je @f - call .draw_cursor -@@: - call .draw_text -popa -ret - -;.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 ;вернуться чень интересный ход т.к. пока в стеке храниться кол-во вызовов то столько раз мы и будем вызываться - -;---------------------------------------------------------- -;--- процедура прорисовки текста -------------------------- -;---------------------------------------------------------- -.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 -;---------------------------------------------------------- -.draw_bg_eax: - mov ecx,ed_top - add ecx,1 - shl ecx,16 - mov cx,13 - mov eax,13 - int 0x40 -ret - - jmp @f -.draw_bg: - mov ebx,ed_left - add ebx,1 - shl ebx,16 - mov bx,ed_width - sub ebx,1 - -@@: - mov ecx,ed_top - mov eax,13 - add ecx,1 - shl ecx,16 - mov edx,ed_color - mov cx,ed_height - sub ecx,1 - 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 - -;---------------------------------------------------------- -;--- процедура рисования курсора -------------------------- -;---------------------------------------------------------- -.clear_cursor: - mov edx,ed_color - test word ed_flags,ed_shift - je @f - mov edx,shift_color -@@: - 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 dword 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: -pushad - 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 - 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 - -; ;----------- отладка -; pushad -; mov [data_of_code],0 -; mov eax,ebx;ed_offset -; mov edi,data_of_code -; call .str -; ;рисование фона -; mov eax,13 -; mov ebx,178*65536+36 -; mov ecx,28*65536+10 -; xor edx,edx -; int 0x40 -; ;вывод значения на экран -; mov eax,4 -; mov ebx,180*65536+30 -; mov ecx,0x10DDBBCC -; mov edx,data_of_code -; mov esi,4 -; int 0x40 -; popad -; ;----------- отладка - -.chk_d: mov ed_offset,ebx - - call .draw_bg - mov dword [esp+28],-1 -popad - ret - -@@: - mov dword [esp+28],0 -popad - ret - - -;;;;;;;;;;;;;;;;;;;;;;;;;;;; -; mov ebx,eax -; mov eax,ed_pos -; xor edx,edx -; idiv ebx -; xor edx,edx -; imul eax,ebx -; mov ed_offset,eax -; pop ebx -; cmp ax,bx -; je @f -;;;;;;;; данные для закрашивания всей полосы прямоугольника -; mov ebx,ed_left -; inc ebx -; shl ebx,16 -; mov bx,ed_width -; dec ebx -; mov edx,ed_color -; call .draw_bg_eax -; mov dword [esp+28],0 -;@@: popad -; ret -;========================================================== -;=== обработка клавиатуры ================================= -;========================================================== -.key: -pusha - test word ed_flags,ed_focus ; если не в фокусе, выходим - je .no_figure ;@f - - xor ecx,ecx - push eax - inc ecx - mov eax,66 - mov ebx,3 - int 0x40 - test al,0x03 - je @f - or word ed_flags,ed_shift - -@@: pop eax -;---------------------------------------------------------- -;--- проверяем, что нажато -------------------------------- -;---------------------------------------------------------- - 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 -;--- нажата другая клавиша --- - 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 - call .del_char -;;;; - mov eax,ed_shift_pos - mov ebx,ed_size - sub ebx,eax - mov ed_size,ebx - pop eax - - ; проверяем, находится ли курсор в конце -@@: mov ecx,ed_size - mov edx, ed_max - 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 - je .insert_1 - and word ed_flags,ed_insert_cl - jmp .no_figure -.insert_1: - 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 - 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 - - cmp ecx,ebx ;Если у нас позиция курсора = текущему размеру напечатанных символов т.е. курсор стоит в конце - je .In_k - - test word [ebp+36],ed_insert ;IF insert is enable т.к. edi изменен адресуем через ebp - jne .ins_v - - 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 - -;--- нажата клавиша 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 -.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 - -.draw_all: - push .shift;.draw_cursor_text;eax - - test word ed_flags,ed_shift_on - je @f - mov eax,ed_shift_pos - mov ebx,ed_size - sub ebx,eax - mov ed_size,ebx - jmp .draw_all2 - -@@: dec dword ed_size - -.draw_all2: - and word ed_flags,ed_shift_cl - call .clear_cursor - call .check_offset -;;;;;;;;;;;;;;; - test eax,eax - jne @f - call .draw_bg - ret -;;;;;;;;;;;;;;; -@@: call .get_n - push eax - mov ebx,ed_offset - add eax,ebx ;eax = w_off= ed_offset+width - mov ebx,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 -; jmp .shift -;--- нажата клавиша left --- -.left: call .sh_enable - mov ebx,ed_pos - test ebx,ebx - jz .nd_k - call .clear_cursor - dec dword ed_pos - jmp .nd_k -;--- нажата клавиша right --- -.right: call .sh_enable - mov ebx,ed_pos - cmp ebx,ed_size - je .nd_k - call .clear_cursor - inc dword ed_pos - jmp .nd_k -.home: call .sh_enable - mov ebx,ed_pos - test ebx,ebx - jz .nd_k - call .clear_cursor - xor eax,eax - mov ed_pos,eax - jmp .nd_k - -.end: call .sh_enable - mov ebx,ed_pos - cmp ebx,dword ed_size - je .nd_k - call .clear_cursor - mov eax,ed_size - mov ed_pos,eax -.nd_k: call .check_offset - ;test eax,eax - ;jz .draw_bg_cursor_text - call .draw_cursor - -.shift: ;;;;;;;SHIFT - - call .draw_bg ;не оптимально - test word ed_flags,ed_shift - je .f_exit -;;;;;;SHIFT end - mov eax,dword ed_pos - mov ebx,dword ed_shift_pos - cmp eax,ebx - jae .sh_n - push eax ;меньшее в eax - push ebx ;большее - jmp .sh_n1 - ;если иначе -.sh_n: push ebx - push eax -.sh_n1: -; jmp .draw_all2 -;;;;;;;;;;;;;;;;;;;;;;;;; - ;call .clear_cursor - call .check_offset - call .get_n - mov edx,eax ;size of ed_box -; push eax - mov ecx,ed_offset - add eax,ecx ;eax = w_off= ed_offset+width - mov ebp,eax ;save - pop ebx ;большее - pop eax ;меньшее - - - cmp eax,ecx ;сравнение с меньшего с offset. - jae .f_f ;если больше - xor eax,eax - cmp ebp,ebx ;cравним размер w_off с большим - jb @f - sub ebx,ecx - jmp .nxt_f -@@: mov ebx,ebp - sub ebx,ecx - jmp .nxt_f - -.f_f: - sub eax,ecx - cmp ebp,ebx ;cравним размер w_off с большим - jle @f - sub ebx,ecx - sub ebx,eax - jmp .nxt_f -@@: - mov ebx,ebp - 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 - mov edx,shift_color - call .draw_bg_eax - and word ed_flags,1111111111111011b - jmp .draw_cursor_text -;;;;;;;;;;;;;;;;;;;;; - -.f_exit: and word ed_flags,ed_shift_cl - jmp .draw_cursor_text - -;проверка состояния shift был ли он нажат раньше? -.sh_enable: - test word ed_flags,ed_shift - je @f - test word ed_flags,ed_shift_on - jne .sh_ext_en - push dword ed_pos - pop dword ed_shift_pos - or word ed_flags,ed_shift_on - ret - -@@: and word ed_flags,ed_shift_cl -.sh_ext_en: ret - - ;- удаление символа - ;Входные данные 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 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 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 -;========================================================== -;=== обработка мыши ======================================= -;========================================================== -.mouse: -pusha -;---------------------------------------------------------- -;--- получаем состояние кнопок мыши ----------------------- -;---------------------------------------------------------- - mov eax,37 - mov ebx,2 - int 0x40 -;---------------------------------------------------------- -;--- проверяем состояние ---------------------------------- -;---------------------------------------------------------- - test eax,1 - jnz .mouse_left_button -@@: popa - ret - -.mouse_left_button: -;---------------------------------------------------------- -;--- получаем координаты мыши ----------------------------- -;---------------------------------------------------------- - mov eax,37 - xor ebx,ebx - inc ebx - int 0x40 -;---------------------------------------------------------- -;--- проверяем, попадает ли курсор в edit box ------------- -;---------------------------------------------------------- - mov ebx,ed_top - cmp ax,bx - jl ._blur;.mouse_end_no_focus - - add bx,ed_height - cmp ax,bx - jg ._blur;.mouse_end_no_focus - - shr eax,16 - - mov bx,ed_left - cmp ax,bx - jl ._blur;.mouse_end_no_focus - - add bx,ed_width - cmp ax,bx - jg ._blur;.mouse_end_no_focus -;--- изменяем позицию курсора --- - push eax - call .clear_cursor - pop eax - xor dx,dx - sub ax,ed_left - add ax,2 - mov bx,6 - div bx - add ax,ed_offset - cmp ax,ed_size - jna @f - mov ax,ed_size -@@: - mov ed_pos,ax - call .check_offset - call .draw_cursor -;---------------------------------------------------------- -;--- процедура установки фокуса --------------------------- -;---------------------------------------------------------- - bts word ed_flags,1 - jc .mouse_pressed - call .draw_cursor - call .draw_border -.mouse_pressed: -popa -ret -;.mouse_end_no_focus: -; call .blur -;popa -;ret -;.blur: -;pusha -._blur: - test word ed_flags,ed_always_focus - jne @f - btr word ed_flags,1 ; если не в фокусе, выходим - jnc @f - call .clear_cursor - call .draw_border -@@: -popa -ret - -;---------------------------------------------------------- -;--- процедура размывания фокуса -------------------------- -;---------------------------------------------------------- -;.blur: -;pusha -;._blur: - ;btr ed_flags,1 - ;jnc @f - ;call .draw_border - ;call .clear_cursor -;@@: -;popa -;ret -} -ed_figure_only=1000000000000000b -ed_always_focus=100000000000000b -ed_focus=10b -ed_shift_on=1000b -ed_shift=100b -ed_shift_cl=1111111111110011b -macro draw_edit_boxes start,end -{ - mov edi,start - mov ecx,((end-start)/ed_struc_size) -@@: - 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) -@@: - 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) -@@: - call edit_box.key - add edi,ed_struc_size - loop @b -} -ed_struc_size=62 -struc edit_box width,left,top,color,focus_border_color,\ - blur_border_color,text_color,max,text,flags,size -{ -.width dd width -.left dd left -.top dd top -.color dd color -.focus_border_color dd focus_border_color -.blur_border_color dd blur_border_color -.text_color dd text_color -.max dd max -.text dd text -.flags dw flags+0 -.size dd size+0 -.pos dd 0 -.offset dd 0 -.cl_curs_x dd 0 -.cl_curs_y dd 0 -.shift dd 0 -} - -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 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 -{ - mov edi,ed_ptr - call edit_box.draw -} - -macro mouse_edit_box ed_ptr -{ - mov edi,ed_ptr - call edit_box.mouse -} - -macro key_edit_box ed_ptr -{ - mov edi,ed_ptr - call edit_box.key -} \ No newline at end of file diff --git a/programs/system/rdsave/trunk/rdsave.asm b/programs/system/rdsave/trunk/rdsave.asm index 6d6bdcbad8..2652cc085d 100644 --- a/programs/system/rdsave/trunk/rdsave.asm +++ b/programs/system/rdsave/trunk/rdsave.asm @@ -25,7 +25,7 @@ version equ '1.2' dd 0x0 ; адрес буфера для параметров (не используется) dd 0x0 ; зарезервировано -include 'editbox.inc' +include '..\..\..\develop\examples\editbox\trunk\editbox.inc' use_edit_box ;--------------------------------------------------------------------- diff --git a/programs/system/run/trunk/editbox.inc b/programs/system/run/trunk/editbox.inc deleted file mode 100644 index 150fb57c7b..0000000000 --- a/programs/system/run/trunk/editbox.inc +++ /dev/null @@ -1,978 +0,0 @@ -; 01.02.2007 доработка edit_box, исправил баги. -; 26.01.2007 нормальная работа компанента исправил фукцию .check_offset -; 24.01.2007 пофиксел баги вызваные не правильным кодом )). -; 22.01.2007 избавился от глюков при работе с выделением и удаление, корректная работа клавишей del & backspase -; 20.01.2007 реализовал выделение текста по shift -; 12.12.2006 реализовал поддержку кнопки insert и сегодя компонент почти работает!!!! -; 07.12.2006 продолжается работа над переработкой компонента,изменениям подверглись многие функции, переработан вывод текста, а така же алгоритм внесения символов. -; 03.09.2006 по возможности отказался от 16 битной арифметики, добавил новые баги -; 09.08.2006 произведена оптимизация работы конпок DEL и Backspace, уменьшен размер выполняемого кода. -; 21.07.2006 добавлена функция кнопки Del, теперь можно удалять символы при помощи данной клавиши -; Автор: Евтихов Максим (Maxxxx32) email: maxxxxm@mail.ru -; Дата последних изменений: 13.06.06 10:40 -; Напишите в исходном коде своей программы use_edit_box, -; это вставит необходимые процедуры в код вашей программы. -; Процедуры: -; edit_box.draw - полная перерисовка; -; edit_box.key - обработка клавиатуры; -; edit_box.mouse - обработка мыши; -; edit_box.focus - установка фокуса; -; edit_box.blur - его размывание; -; edit_box.get_n - получить количество прорисовываемых символов. -; При вызове любых из этих процедур в регистре edi следует -; оставить указатель на структуру. -; Пример структуры: -; some_edit edit_box 100,10,30,0x00ffffff,0,0x00aaaaaa,0,255,some_edit_text -; длина, высота, верх, цвет фона, цвет рамки, если выбран, -; цвет рамки, если не выбран, максимальное количество символов, -; указатель на буфер, где будут хранится символы. Буфер должен -; оканчиваться нулем, например если максимальное количество 255: -; some_edit_text: -; rb 256 ;255+1 - -; Пример вызова процедуры: -; mov edi,some_edit -; call edit_box.draw - -; При вызове процедуры edit_box.key код клавиши должен -; находится в ah, то есть перед вызовом этой процедуры надо вызвать -; 2-ую сисемную функцию, например: -; mov eax,2 -; int 0x40 -; mov edi,some_edit1 -; call edit_box.key -; mov edi,some_edit2 -; call edit_box.key -; Перед вызовом обработчика мыши следует проверить, является ли окно -; активным. -; Если щелчок мыши был пройзведен за пределами edit box -; фокус теряется. -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_height=14 ; высота -shift_color=0x6a9480 -ed_insert=10000b -ed_insert_cl=1111111111101111b -;========================================================== -;=== процедура прорисовки ================================= -;========================================================== -.draw: -pusha -;--- рисуем рамку --- - call .draw_border ; Функция стабильна -.draw_bg_cursor_text: -;--- изменяем смещение, если надо --- - call .check_offset ;вычисление позиции курсора стабильна -;--- рисуем внутреннюю область --- - call .draw_bg ;нарисовать прямоугольник рабочей области -.draw_cursor_text: -;--- рисуем курсор --- - ;--- может его не надо рисовать ---- - test word ed_flags,ed_focus - je @f - call .draw_cursor -@@: - call .draw_text -popa -ret - -;.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 ;вернуться чень интересный ход т.к. пока в стеке храниться кол-во вызовов то столько раз мы и будем вызываться - -;---------------------------------------------------------- -;--- процедура прорисовки текста -------------------------- -;---------------------------------------------------------- -.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 -;---------------------------------------------------------- -.draw_bg_eax: - mov ecx,ed_top - add ecx,1 - shl ecx,16 - mov cx,13 - mov eax,13 - int 0x40 -ret - - jmp @f -.draw_bg: - mov ebx,ed_left - add ebx,1 - shl ebx,16 - mov bx,ed_width - sub ebx,1 - -@@: - mov ecx,ed_top - mov eax,13 - add ecx,1 - shl ecx,16 - mov edx,ed_color - mov cx,ed_height - sub ecx,1 - 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 - -;---------------------------------------------------------- -;--- процедура рисования курсора -------------------------- -;---------------------------------------------------------- -.clear_cursor: - mov edx,ed_color - test word ed_flags,ed_shift - je @f - mov edx,shift_color -@@: - 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 dword 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: -pushad - 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 - 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 - -; ;----------- отладка -; pushad -; mov [data_of_code],0 -; mov eax,ebx;ed_offset -; mov edi,data_of_code -; call .str -; ;рисование фона -; mov eax,13 -; mov ebx,178*65536+36 -; mov ecx,28*65536+10 -; xor edx,edx -; int 0x40 -; ;вывод значения на экран -; mov eax,4 -; mov ebx,180*65536+30 -; mov ecx,0x10DDBBCC -; mov edx,data_of_code -; mov esi,4 -; int 0x40 -; popad -; ;----------- отладка - -.chk_d: mov ed_offset,ebx - - call .draw_bg - mov dword [esp+28],-1 -popad - ret - -@@: - mov dword [esp+28],0 -popad - ret - - -;;;;;;;;;;;;;;;;;;;;;;;;;;;; -; mov ebx,eax -; mov eax,ed_pos -; xor edx,edx -; idiv ebx -; xor edx,edx -; imul eax,ebx -; mov ed_offset,eax -; pop ebx -; cmp ax,bx -; je @f -;;;;;;;; данные для закрашивания всей полосы прямоугольника -; mov ebx,ed_left -; inc ebx -; shl ebx,16 -; mov bx,ed_width -; dec ebx -; mov edx,ed_color -; call .draw_bg_eax -; mov dword [esp+28],0 -;@@: popad -; ret -;========================================================== -;=== обработка клавиатуры ================================= -;========================================================== -.key: -pusha - test word ed_flags,ed_focus ; если не в фокусе, выходим - je .no_figure ;@f - - xor ecx,ecx - push eax - inc ecx - mov eax,66 - mov ebx,3 - int 0x40 - test al,0x03 - je @f - or word ed_flags,ed_shift - -@@: pop eax -;---------------------------------------------------------- -;--- проверяем, что нажато -------------------------------- -;---------------------------------------------------------- - 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 -;--- нажата другая клавиша --- - 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 - call .del_char -;;;; - mov eax,ed_shift_pos - mov ebx,ed_size - sub ebx,eax - mov ed_size,ebx - pop eax - - ; проверяем, находится ли курсор в конце -@@: mov ecx,ed_size - mov edx, ed_max - 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 - je .insert_1 - and word ed_flags,ed_insert_cl - jmp .no_figure -.insert_1: - 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 - 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 - - cmp ecx,ebx ;Если у нас позиция курсора = текущему размеру напечатанных символов т.е. курсор стоит в конце - je .In_k - - test word [ebp+36],ed_insert ;IF insert is enable т.к. edi изменен адресуем через ebp - jne .ins_v - - 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 - -;--- нажата клавиша 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 -.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 - -.draw_all: - push .shift;.draw_cursor_text;eax - - test word ed_flags,ed_shift_on - je @f - mov eax,ed_shift_pos - mov ebx,ed_size - sub ebx,eax - mov ed_size,ebx - jmp .draw_all2 - -@@: dec dword ed_size - -.draw_all2: - and word ed_flags,ed_shift_cl - call .clear_cursor - call .check_offset -;;;;;;;;;;;;;;; - test eax,eax - jne @f - call .draw_bg - ret -;;;;;;;;;;;;;;; -@@: call .get_n - push eax - mov ebx,ed_offset - add eax,ebx ;eax = w_off= ed_offset+width - mov ebx,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 -; jmp .shift -;--- нажата клавиша left --- -.left: call .sh_enable - mov ebx,ed_pos - test ebx,ebx - jz .nd_k - call .clear_cursor - dec dword ed_pos - jmp .nd_k -;--- нажата клавиша right --- -.right: call .sh_enable - mov ebx,ed_pos - cmp ebx,ed_size - je .nd_k - call .clear_cursor - inc dword ed_pos - jmp .nd_k -.home: call .sh_enable - mov ebx,ed_pos - test ebx,ebx - jz .nd_k - call .clear_cursor - xor eax,eax - mov ed_pos,eax - jmp .nd_k - -.end: call .sh_enable - mov ebx,ed_pos - cmp ebx,dword ed_size - je .nd_k - call .clear_cursor - mov eax,ed_size - mov ed_pos,eax -.nd_k: call .check_offset - ;test eax,eax - ;jz .draw_bg_cursor_text - call .draw_cursor - -.shift: ;;;;;;;SHIFT - - call .draw_bg ;не оптимально - test word ed_flags,ed_shift - je .f_exit -;;;;;;SHIFT end - mov eax,dword ed_pos - mov ebx,dword ed_shift_pos - cmp eax,ebx - jae .sh_n - push eax ;меньшее в eax - push ebx ;большее - jmp .sh_n1 - ;если иначе -.sh_n: push ebx - push eax -.sh_n1: -; jmp .draw_all2 -;;;;;;;;;;;;;;;;;;;;;;;;; - ;call .clear_cursor - call .check_offset - call .get_n - mov edx,eax ;size of ed_box -; push eax - mov ecx,ed_offset - add eax,ecx ;eax = w_off= ed_offset+width - mov ebp,eax ;save - pop ebx ;большее - pop eax ;меньшее - - - cmp eax,ecx ;сравнение с меньшего с offset. - jae .f_f ;если больше - xor eax,eax - cmp ebp,ebx ;cравним размер w_off с большим - jb @f - sub ebx,ecx - jmp .nxt_f -@@: mov ebx,ebp - sub ebx,ecx - jmp .nxt_f - -.f_f: - sub eax,ecx - cmp ebp,ebx ;cравним размер w_off с большим - jle @f - sub ebx,ecx - sub ebx,eax - jmp .nxt_f -@@: - mov ebx,ebp - 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 - mov edx,shift_color - call .draw_bg_eax - and word ed_flags,1111111111111011b - jmp .draw_cursor_text -;;;;;;;;;;;;;;;;;;;;; - -.f_exit: and word ed_flags,ed_shift_cl - jmp .draw_cursor_text - -;проверка состояния shift был ли он нажат раньше? -.sh_enable: - test word ed_flags,ed_shift - je @f - test word ed_flags,ed_shift_on - jne .sh_ext_en - push dword ed_pos - pop dword ed_shift_pos - or word ed_flags,ed_shift_on - ret - -@@: and word ed_flags,ed_shift_cl -.sh_ext_en: ret - - ;- удаление символа - ;Входные данные 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 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 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 -;========================================================== -;=== обработка мыши ======================================= -;========================================================== -.mouse: -pusha -;---------------------------------------------------------- -;--- получаем состояние кнопок мыши ----------------------- -;---------------------------------------------------------- - mov eax,37 - mov ebx,2 - int 0x40 -;---------------------------------------------------------- -;--- проверяем состояние ---------------------------------- -;---------------------------------------------------------- - test eax,1 - jnz .mouse_left_button -@@: popa - ret - -.mouse_left_button: -;---------------------------------------------------------- -;--- получаем координаты мыши ----------------------------- -;---------------------------------------------------------- - mov eax,37 - xor ebx,ebx - inc ebx - int 0x40 -;---------------------------------------------------------- -;--- проверяем, попадает ли курсор в edit box ------------- -;---------------------------------------------------------- - mov ebx,ed_top - cmp ax,bx - jl ._blur;.mouse_end_no_focus - - add bx,ed_height - cmp ax,bx - jg ._blur;.mouse_end_no_focus - - shr eax,16 - - mov bx,ed_left - cmp ax,bx - jl ._blur;.mouse_end_no_focus - - add bx,ed_width - cmp ax,bx - jg ._blur;.mouse_end_no_focus -;--- изменяем позицию курсора --- - push eax - call .clear_cursor - pop eax - xor dx,dx - sub ax,ed_left - add ax,2 - mov bx,6 - div bx - add ax,ed_offset - cmp ax,ed_size - jna @f - mov ax,ed_size -@@: - mov ed_pos,ax - call .check_offset - call .draw_cursor -;---------------------------------------------------------- -;--- процедура установки фокуса --------------------------- -;---------------------------------------------------------- - bts word ed_flags,1 - jc .mouse_pressed - call .draw_cursor - call .draw_border -.mouse_pressed: -popa -ret -;.mouse_end_no_focus: -; call .blur -;popa -;ret -;.blur: -;pusha -._blur: - test word ed_flags,ed_always_focus - jne @f - btr word ed_flags,1 ; если не в фокусе, выходим - jnc @f - call .clear_cursor - call .draw_border -@@: -popa -ret - -;---------------------------------------------------------- -;--- процедура размывания фокуса -------------------------- -;---------------------------------------------------------- -;.blur: -;pusha -;._blur: - ;btr ed_flags,1 - ;jnc @f - ;call .draw_border - ;call .clear_cursor -;@@: -;popa -;ret -} -ed_figure_only=1000000000000000b -ed_always_focus=100000000000000b -ed_focus=10b -ed_shift_on=1000b -ed_shift=100b -ed_shift_cl=1111111111110011b -macro draw_edit_boxes start,end -{ - mov edi,start - mov ecx,((end-start)/ed_struc_size) -@@: - 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) -@@: - 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) -@@: - call edit_box.key - add edi,ed_struc_size - loop @b -} -ed_struc_size=62 -struc edit_box width,left,top,color,focus_border_color,\ - blur_border_color,text_color,max,text,flags,size -{ -.width dd width -.left dd left -.top dd top -.color dd color -.focus_border_color dd focus_border_color -.blur_border_color dd blur_border_color -.text_color dd text_color -.max dd max -.text dd text -.flags dw flags+0 -.size dd size+0 -.pos dd 0 -.offset dd 0 -.cl_curs_x dd 0 -.cl_curs_y dd 0 -.shift dd 0 -} - -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 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 -{ - mov edi,ed_ptr - call edit_box.draw -} - -macro mouse_edit_box ed_ptr -{ - mov edi,ed_ptr - call edit_box.mouse -} - -macro key_edit_box ed_ptr -{ - mov edi,ed_ptr - call edit_box.key -} \ No newline at end of file