Subversion Repositories Kolibri OS

Rev

Rev 234 | Rev 289 | Go to most recent revision | Details | Compare with Previous | Last modification | View Log | RSS feed

Rev Author Line No. Line
234 Lrz 1
;  09.08.2006 произведена оптимизация работы конпок DEL и Backspace? уменьшен размер выполняемого кода.
2
;Эффективное программирование в KOLIBRI
3
;Оптимизированный компонент EditBox (Исходный вариант от Maxxxx32)
4
;Оптимизация команд.
5
;  - Теплов Алексей  www.test-kolibri.narod.ru
6
 
7
;заголовок приложения
8
use32		; транслятор, использующий 32 разрядных команды
9
    org 0x0		; базовый адрес кода, всегда 0x0
10
    db 'MENUET01'	; идентификатор исполняемого файла (8 байт)
11
    dd 0x1		; версия формата заголовка исполняемого файла
12
    dd start		; адрес, на который система передаёт управление
13
	                ; после загрузки приложения в память
14
    dd i_end		; размер приложения
282 Lrz 15
    dd i_end and not 3	; Объем используемой памяти, для стека отведем 0х100 байт и выровним на грницу 4 байта
16
    dd i_end and not 3	; расположим позицию стека в области памяти, сразу за телом программы. Вершина стека в диапазоне памяти, указанном выше
234 Lrz 17
    dd 0x0,0x0		; указатель на строку с параметрами.
18
                 ;    если после запуска неравно нулю, приложение было
19
                 ;    запущено с параметрами из командной строки
20
 
21
		 ;    указатель на строку, в которую записан путь,
22
                 ;    откуда запущено приложение
23
 
24
	include 'editbox.inc'
25
	use_edit_box
26
;Область кода
27
start:				;Точка входа в программу
28
	mov	eax,40		;установить маску для ожидаемых событий
29
	mov 	ebx,0x27        ;система будет реагировать только на сообщение о перерисовке,нажата кнопка, определённая ранее, событие от мыши (что-то случилось - нажатие на кнопку мыши или перемещение; сбрасывается при прочтении) и нажатие клавиши
30
        int	0x40
282 Lrz 31
 
32
;	mov  eax,66    ; keyboard mode definitions
33
;	mov  ebx,1     ; set
34
;	xor	ecx,ecx
35
;	inc  ecx      ; return scancodes
36
;	int  0x40
37
 
38
;	mov  eax,26    ; get setup for keyboard
39
;	inc	ebx
40
;	mov  ebx,2
41
;	mov  ecx,1     ; base keymap
42
;	mov  edx,keymap
43
;	int  0x40
44
 
234 Lrz 45
red_win:
46
    call draw_window  		;первоначально необходимо нарисовать окно
47
still:				;основной обработчик
48
     mov  eax,10 		;Ожидать события
49
     int  0x40      		;ожидать событие в течение 2 миллисекунд
50
 
51
    cmp al,0x1    ;если изменилось положение окна
52
    jz red_win
53
    cmp al,0x2    ;если нажата клавиша то перейти
54
    jz key
55
    cmp al,0x3    ;если нажата кнопка то перейти
56
    jz button
57
	mouse_edit_boxes editboxes,editboxes_end
58
	jmp still    ;если ничего из перечисленного то снова в цикл
59
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
60
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
61
button:
62
mov eax,17		;получить идентификатор нажатой клавиши
63
    int 0x40
64
    test ah,ah		;если в ah 0, то перейти на обработчик событий still
65
    jz  still
66
    or eax,-1		;в eax,-1 - 5 ,байтов у нас же только 3  выйти
67
    int 0x40 		;далее выполняется выход из программы
68
 
69
key:
70
    mov eax,2		;загрузим значение 2 в регистор eax
71
    int 0x40            ;получим код нажатой клавиши
72
    key_edit_boxes editboxes,editboxes_end
73
    jmp still
74
 
75
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
76
draw_window:		;рисование окна приложения
77
    mov eax,12		;в регистр внести значение = 12
78
    mov ebx,1 		;присвоить 1
79
    int 0x40
80
 
81
    xor eax,eax			;обнулить eax
82
    mov ebx,50*65536+390	;[координата по оси x]*65536 + [размер по оси x]
83
    mov ecx,30*65536+200	;[координата по оси y]*65536 + [размер по оси y]
84
    mov edx,0x03AABBCC		;0xXYRRGGBB  Y =3 - вывод рамки, используя скрин
85
    mov esi,0x805080DD		;0xXYRRGGBB - цвет заголовка
86
    mov edi,0x005080DD		;0x00RRGGBB - цвет рамки
87
    int 0x40			;нарисовать окно приложения
88
 
89
    add eax,4  			;если предполагается использовать скалярный процессор, то можно использовать данню инструкцию
90
    mov ebx,8*65536+8		; [координата по оси x]*65536 + [координата по оси y]  mov ecx,0x10DDEEFF		; 0xX0RRGGBB, где RR, GG, BB задают цвет текста
91
    mov edx,hed			; указатель на начало строки
282 Lrz 92
    mov esi,i_end1 - hed	; длина строки, должна быть не больше 255
234 Lrz 93
    int 0x40			;вывести текст
94
 
95
	draw_edit_boxes editboxes,editboxes_end  ;рисование edit box'ов
96
 
97
    add eax,8 			;Функция 12 - начать/закончить перерисовку окна.
98
    mov ebx,2			;Подфункция 2 - закончить перерисовку окна.
99
    int 0x40
100
    ret
101
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
102
;DATA данные
103
editboxes:
104
edit1 edit_box 168,10,50,0xffffff,0,0,0,512,ed_buffer.1,ed_focus
105
edit2 edit_box 168,10,30,0xffffff,0,0,0,99,ed_buffer.2,ed_figure_only
106
edit3 edit_box 35,10,70,0xffffff,0,0,0,9,ed_buffer.3,ed_figure_only
107
edit4 edit_box 16,10,90,0xffffff,0,0,0,1,ed_buffer.4,ed_figure_only
108
editboxes_end:
109
data_of_code dd 0
110
data_of_code1 dd 0
111
ed_buffer:
112
.1: rb 513;512;256
113
.2: rb 100
114
.3: rb 10
115
.4: rb 2
116
;text_b: db 'Кол-во символов'
117
;buffer: dd 0
118
buffer_end:
282 Lrz 119
hed db   'EDITBOX optimization and retype  date 19.01.2007'
120
i_end1:
121
rb 2048
122
i_end:
123
keymap: