102 lines
4.1 KiB
FASM
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: |