Subversion Repositories Kolibri OS

Rev

Rev 404 | Rev 449 | Go to most recent revision | Blame | Compare with Previous | Last modification | View Log | Download | RSS feed

  1. ; <Lrz> 30.03.2007 произведена оптимизация работы конпок DEL и Backspace? уменьшен размер выполняемого кода.
  2. ;Эффективное программирование в KOLIBRI
  3. ;Оптимизированный компонент EditBox (Исходный вариант от Maxxxx32)
  4. ;Оптимизация команд.
  5. ;<Lrz>  - Теплов Алексей  www.lrz.land.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            ; размер приложения
  15.     dd i_end and not 3  ; Объем используемой памяти, для стека отведем 0х100 байт и выровним на грницу 4 байта
  16.     dd i_end and not 3  ; расположим позицию стека в области памяти, сразу за телом программы. Вершина стека в диапазоне памяти, указанном выше
  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
  31. red_win:
  32.     call draw_window            ;первоначально необходимо нарисовать окно
  33. still:                          ;основной обработчик
  34.      mov  eax,10                ;Ожидать события
  35.      int  0x40                  ;ожидать событие в течение 2 миллисекунд
  36.  
  37.     cmp al,0x1    ;если изменилось положение окна
  38.     jz red_win
  39.     cmp al,0x2    ;если нажата клавиша то перейти
  40.     jz key
  41.     cmp al,0x3    ;если нажата кнопка то перейти
  42.     jz button
  43.         mouse_edit_boxes editboxes,editboxes_end
  44.         jmp still    ;если ничего из перечисленного то снова в цикл
  45. ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
  46. ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
  47. button:
  48. mov eax,17              ;получить идентификатор нажатой клавиши
  49.     int 0x40
  50.     test ah,ah          ;если в ah 0, то перейти на обработчик событий still
  51.     jz  still
  52.     or eax,-1           ;в eax,-1 - 5 ,байтов у нас же только 3  выйти
  53.     int 0x40            ;далее выполняется выход из программы
  54.    
  55. key:
  56.     mov eax,2           ;загрузим значение 2 в регистор eax
  57.     int 0x40            ;получим код нажатой клавиши
  58.     key_edit_boxes editboxes,editboxes_end    
  59.     jmp still
  60.  
  61. ;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
  62. draw_window:            ;рисование окна приложения
  63.     mov eax,12          ;в регистр внести значение = 12
  64.     mov ebx,1           ;присвоить 1
  65.     int 0x40
  66.  
  67.     xor eax,eax                 ;обнулить eax
  68.     mov ebx,50*65536+390        ;[координата по оси x]*65536 + [размер по оси x]
  69.     mov ecx,30*65536+200        ;[координата по оси y]*65536 + [размер по оси y]
  70.     mov edx,0xb3AABBCC          ;0xXYRRGGBB  Y =3 - вывод рамки, используя скрин
  71.     mov esi,0x805080DD          ;0xXYRRGGBB - цвет заголовка
  72.     mov edi,hed                 ;Указатель на строку с заголовком
  73.     int 0x40                    ;нарисовать окно приложения
  74.  
  75.         draw_edit_boxes editboxes,editboxes_end  ;рисование edit box'ов
  76.  
  77.     mov eax,12                  ;Функция 12 - начать/закончить перерисовку окна.
  78.     mov ebx,2                   ;Подфункция 2 - закончить перерисовку окна.
  79.     int 0x40
  80.     ret
  81. ;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
  82. ;DATA данные
  83. editboxes:
  84. edit1 edit_box 168,5,10,0xffffff,0,0,0,99,ed_buffer.2,ed_figure_only
  85. edit2 edit_box 250,5,30,0xffffff,0,0,0,308,hed,ed_focus,53
  86. edit3 edit_box 35,5,50,0xffffff,0,0,0,9,ed_buffer.3,ed_figure_only
  87. edit4 edit_box 16,5,70,0xffffff,0,0,0,1,ed_buffer.4,ed_figure_only
  88. editboxes_end:
  89. data_of_code dd 0
  90. ed_buffer:
  91. ;.1: rb 514;256
  92. .2: rb 101
  93. .3: rb 11
  94. .4: rb 3
  95. ;два запасных байта необходимы для того что бы не пепереписать следующией байты, в конце буфера 0
  96. buffer_end:
  97. hed db   'EDITBOX optimization and retype <Lrz> date 30.03.2007',0
  98. rb  256
  99. i_end1:
  100. rb 1024
  101. i_end: