;Эффективное программирование в KOLIBRI
;Оптимизированный компонент CheckBox (Исходный вариант от Maxxxx32)
;Оптимизирован вывод строки, надписи для CheckBox'a + теперь при проверке не ;происходит подсчет кол-ва символов в строке
;Оптимизация команд.
;22.08.2006 произведена оптимизация команд, приняты во внимание замечания DIAMOND'а.
;<Lrz>  - Теплов Алексей  www.test-kolibri.narod.ru

;заголовок приложения
use32		; транслятор, использующий 32 разрядных команды
    org 0x0		; базовый адрес кода, всегда 0x0
    db 'MENUET01'	; идентификатор исполняемого файла (8 байт)
    dd 0x1		; версия формата заголовка исполняемого файла
    dd start		; адрес, на который система передаёт управление
	                ; после загрузки приложения в память
    dd i_end		; размер приложения
    dd (i_end+0x100) and not 3	; Объем используемой памяти, для стека отведем 0х100 байт и выровним на грницу 4 байта
    dd (i_end+0x100) and not 3	; расположим позицию стека в области памяти, сразу за телом программы. Вершина стека в диапазоне памяти, указанном выше
    dd 0x0,0x0		; указатель на строку с параметрами.
                 ;    если после запуска неравно нулю, приложение было
                 ;    запущено с параметрами из командной строки

		 ;    указатель на строку, в которую записан путь,
                 ;    откуда запущено приложение


;------------------
	include 'check.inc'	;включить файл check.inc
	use_check_box		;используя макросы внести процедуры для рисования чек бокса
;Область кода
start:				;Точка входа в программу
	mov	eax,40		;установить маску для ожидаемых событий
	mov 	ebx,0x25        ;система будет реагировать только на сообщение о перерисовке,нажата кнопка, определённая ранее, событие от мыши (что-то случилось - нажатие на кнопку мыши или перемещение; сбрасывается при прочтении)
        int	0x40
red_win:
    call draw_window 		;первоначально необходимо нарисовать окно
still:				;основной обработчик 
     mov  eax,10 		;Ожидать события
     int  0x40      		;ожидать событие в течение 2 миллисекунд
  
    cmp al,0x1    ;если изменилось положение окна
    jz red_win
    cmp al,0x3    ;если нажата кнопка то перейти
    jz button
     mouse_check_boxes check_boxes,check_boxes_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 ;далее выполняется выход из программы

;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
draw_window:		;рисование окна приложения
    mov eax,12		;в регистр внести значение = 12
    mov ebx,1 		;присвоить 1
    int 0x40

    xor eax,eax		;обнулить eax
    mov ebx,50*65536+180	;[координата по оси x]*65536 + [размер по оси x]
    mov ecx,30*65536+100	;[координата по оси y]*65536 + [размер по оси y]
    mov edx,0x03AABBCC		;0xXYRRGGBB  Y =3 - вывод рамки, используя скрин
    mov esi,0x805080DD		;0xXYRRGGBB - цвет заголовка
    mov edi,0x005080DD		;0x00RRGGBB - цвет рамки
    int 0x40			;нарисовать окно приложения
  
    add eax,4  ;если предполагается использовать скалярный процессор, то можно использовать данню инструкцию 
    mov ebx,8*65536+8		; [координата по оси x]*65536 + [координата по оси y]  mov ecx,0x10DDEEFF		; 0xX0RRGGBB, где RR, GG, BB задают цвет текста 
    mov edx,hed			; указатель на начало строки
    mov esi,i_end - hed	; длина строки, должна быть не больше 255
    int 0x40			;вывести текст
        
	draw_check_boxes check_boxes,check_boxes_end ;рисование чекбоксов

    add eax,8 			;Функция 12 - начать/закончить перерисовку окна.
    mov ebx,2			;Подфункция 2 - закончить перерисовку окна.
    int 0x40
    ret

;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
;DATA данные 
;Формат данных чек бокса:
;10 - координата чек бокса по х 
;30 - координата чек бокса по у
;0xffffff - цвет внутри чек бокса
;0 - цвет рамки чек бокса
;0 - цвет текста надписи
;ch_text.1 - указатель на начало строки
;ch_text.e1-ch_text.1 - длина строки
;
check_boxes:
ch1 check_box 10,30,0xffffff,0,0,ch_text.1,ch_text.e1-ch_text.1
ch2 check_box 10,45,0xffffff,0,0,ch_text.2,ch_text.e2-ch_text.2
ch3 check_box 10,60,0xffffff,0,0,ch_text.3,ch_text.e3-ch_text.3
check_boxes_end:

ch_text:		; Сопровождающий текст для чек боксов
.1 db 'Check_Box #1' 
.e1:
.2 db 'Check_Box #2'
.e2:
.3 db 'Check_Box #3'
.e3:

hed db 'Checkbox [22.08.2006]'	;заголовок приложения
i_end:			;конец кода