; <Lrz> 09.08.2006 произведена оптимизация работы конпок DEL и Backspace? уменьшен размер выполняемого кода.
;Эффективное программирование в KOLIBRI
;Оптимизированный компонент EditBox (Исходный вариант от Maxxxx32)
;Оптимизация команд.
;<Lrz>  - Теплов Алексей  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,30,0xffffff,0,0,0,512,ed_buffer.1,ed_focus
edit2 edit_box 168,5,10,0xffffff,0,0,0,99,ed_buffer.2,ed_figure_only
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 513;256
.2: rb 100
.3: rb 10
.4: rb 2
;text_b: db 'Кол-во символов'
;buffer: dd 0
buffer_end:
hed db   'EDITBOX optimization and retype <Lrz> date 26.01.2007',0
i_end1:
rb 1024
i_end:
keymap: