Files
kolibrios/programs/develop/examples/editbox/trunk/editbox.asm
T
Alexey Teplov ( ce8943dff7 upgrade editbox 07.03.2007
git-svn-id: svn://kolibrios.org@396 a494cfbc-eb01-0410-851d-a64ba20cac60
2007-03-07 08:35:01 +00:00

102 lines
4.1 KiB
FASM

; <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,10,0xffffff,0,0,0,99,ed_buffer.2,ed_figure_only
edit2 edit_box 168,5,30,0xffffff,0,0,0,512,ed_buffer.1,ed_focus
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
;text_b: db 'Кол-во символов'
;buffer: dd 0
buffer_end:
hed db 'EDITBOX optimization and retype <Lrz> date 07.03.2007',0
i_end1:
rb 1024
i_end: