; 30.03.2007 произведена оптимизация работы конпок DEL и Backspace? уменьшен размер выполняемого кода. ;Эффективное программирование в KOLIBRI ;Оптимизированный компонент EditBox (Исходный вариант от Maxxxx32) ;Оптимизация команд. ; - Теплов Алексей www.lrz.land.ru ;заголовок приложения use32 ; транслятор, использующий 32 разрядных команды org 0x0 ; базовый адрес кода, всегда 0x0 db 'MENUET01' ; идентификатор исполняемого файла (8 байт) dd 0x1 ; версия формата заголовка исполняемого файла dd start ; адрес, на который система передаёт управление ; после загрузки приложения в память dd i_end ; размер приложения dd i_end and not 3 ; Объем используемой памяти, для стека отведем 0х100 байт и выровним на грницу 4 байта dd i_end and not 3 ; расположим позицию стека в области памяти, сразу за телом программы. Вершина стека в диапазоне памяти, указанном выше dd 0x0,0x0 ; указатель на строку с параметрами. ; если после запуска неравно нулю, приложение было ; запущено с параметрами из командной строки ; указатель на строку, в которую записан путь, ; откуда запущено приложение include 'editbox.inc' use_edit_box ;Область кода start: ;Точка входа в программу mov eax,40 ;установить маску для ожидаемых событий mov ebx,0x27 ;система будет реагировать только на сообщение о перерисовке,нажата кнопка, определённая ранее, событие от мыши (что-то случилось - нажатие на кнопку мыши или перемещение; сбрасывается при прочтении) и нажатие клавиши int 0x40 red_win: call draw_window ;первоначально необходимо нарисовать окно still: ;основной обработчик mov eax,10 ;Ожидать события int 0x40 ;ожидать событие в течение 2 миллисекунд cmp al,0x1 ;если изменилось положение окна jz red_win cmp al,0x2 ;если нажата клавиша то перейти jz key cmp al,0x3 ;если нажата кнопка то перейти jz button mouse_edit_boxes editboxes,editboxes_end jmp still ;если ничего из перечисленного то снова в цикл ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; button: mov eax,17 ;получить идентификатор нажатой клавиши int 0x40 test ah,ah ;если в ah 0, то перейти на обработчик событий still jz still or eax,-1 ;в eax,-1 - 5 ,байтов у нас же только 3 выйти int 0x40 ;далее выполняется выход из программы key: mov eax,2 ;загрузим значение 2 в регистор eax int 0x40 ;получим код нажатой клавиши key_edit_boxes editboxes,editboxes_end jmp still ;>>>>>>>>>>>>>>>>>>>>>>>>>>>>> draw_window: ;рисование окна приложения mov eax,12 ;в регистр внести значение = 12 mov ebx,1 ;присвоить 1 int 0x40 xor eax,eax ;обнулить eax mov ebx,50*65536+390 ;[координата по оси x]*65536 + [размер по оси x] mov ecx,30*65536+200 ;[координата по оси y]*65536 + [размер по оси y] mov edx,0xb3AABBCC ;0xXYRRGGBB Y =3 - вывод рамки, используя скрин mov esi,0x805080DD ;0xXYRRGGBB - цвет заголовка mov edi,hed ;Указатель на строку с заголовком int 0x40 ;нарисовать окно приложения draw_edit_boxes editboxes,editboxes_end ;рисование edit box'ов mov eax,12 ;Функция 12 - начать/закончить перерисовку окна. mov ebx,2 ;Подфункция 2 - закончить перерисовку окна. int 0x40 ret ;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> ;DATA данные editboxes: edit1 edit_box 168,5,10,0xffffff,0,0,0,99,ed_buffer.2,ed_figure_only edit2 edit_box 250,5,30,0xffffff,0,0,0,308,hed,ed_focus,53 edit3 edit_box 35,5,50,0xffffff,0,0,0,9,ed_buffer.3,ed_figure_only edit4 edit_box 16,5,70,0xffffff,0,0,0,1,ed_buffer.4,ed_figure_only editboxes_end: data_of_code dd 0 ed_buffer: ;.1: rb 514;256 .2: rb 101 .3: rb 11 .4: rb 3 ;два запасных байта необходимы для того что бы не пепереписать следующией байты, в конце буфера 0 buffer_end: hed db 'EDITBOX optimization and retype date 30.03.2007',0 rb 256 i_end1: rb 1024 i_end: