Files
kolibrios/programs/develop/examples/editbox/trunk/editbox.asm
T
Alexey Teplov ( 94747a3d1a retype fuction .check_offset
git-svn-id: svn://kolibrios.org@295 a494cfbc-eb01-0410-851d-a64ba20cac60
2007-01-26 11:20:00 +00:00

108 lines
4.4 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,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_end1 - hed ; длина строки, должна быть не больше 255
int 0x40 ;вывести текст
draw_edit_boxes editboxes,editboxes_end ;рисование edit box'ов
add eax,8 ;Функция 12 - начать/закончить перерисовку окна.
mov ebx,2 ;Подфункция 2 - закончить перерисовку окна.
int 0x40
ret
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
;DATA данные
editboxes:
edit1 edit_box 168,10,50,0xffffff,0,0,0,512,ed_buffer.1,ed_focus
edit2 edit_box 168,10,30,0xffffff,0,0,0,99,ed_buffer.2,ed_figure_only
edit3 edit_box 35,10,70,0xffffff,0,0,0,9,ed_buffer.3,ed_figure_only
edit4 edit_box 16,10,90,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'
i_end1:
rb 2048
i_end:
keymap: