Super Typer/ru

From KolibriOS wiki
Revision as of 19:04, 19 January 2008 by Xenius (talk | contribs) (Super Typer moved to Super Typer/ru: Унификация названий статей. Возможно, будет создана версия с английскими комментариями.)
Jump to navigation Jump to search

Super Typer -- программа для KolibriOS, написанная Ксениусом. Является примером программирования, более интересным, чем Hello World, но тем не менее достаточно простым для понимания.

Исходный код версии от 16.04.2007:

<asm>; Super Typer 1.0 beta предоставит вам потрясающие

возможности по выводу на экран строки, набираемой вами.
Copileft (c) Xenius, 2007
Вы можете свободно распространять, изменять и использовать
данную программу на условиях GNU GPL (см www.gnu.org).
Часть программы основана на bye.asm из статьи
"Прикладное программирование для Kolibri OS. Вводный курс.", написанной Johnny_B

use32 ; используюся 32-х разрядные команды

Заголовок, используется Kolibri OS для запуска программы
 db 'MENUET01'   ; 1. идентификатор исполняемого файла (8 байт)
 dd 0x01	  ; 2. версия формата заголовка исполняемого файла
 dd START	  ; 3. адрес, на который система передаёт управление
 dd I_END	  ; 4. размер приложения
 dd I_END+0x1000 ; 5. объём необходимой приложению памяти
 dd I_END+0x1000 ; 6. вершина стека в диапазоне памяти, указанном выше
 dd 0x0	  ; 7. указатель на строку с параметрами.
 dd 0x0	  ; 8. указатель на строку, в которую записан путь запуска

START:  ; адрес начала программы call draw_window  ; вызываем функцию рисования окна xor esi,esi  ; инициализируем счетчик символов

затем переходим в цикл ожидания событий

event_wait: mov eax,10  ; функция 10: ожидание событие, int 0x40  ; его тип возвращён в eax cmp eax,1  ; запрос на перерисовку? je redraw cmp eax,2  ; нажата клавиша? je key cmp eax,3  ; нажата кнопка в окне программы? je button jmp event_wait  ; возвращаемся к началу цикла ожидания событий

после того, как событие идентифицировано, его надо обработать

redraw: call draw_window  ; вызываем функцию draw_window и jmp event_wait  ; возвращаемся назад к циклу ожидания key: mov eax,2  ; считываем код нажатой клавиши. Возвращен в ah. int 0x40 mov [I_END+esi],ah ; запишем этот код в конец строки inc esi ; увеличим счетчик символов cmp esi,255 ; проверка переполнения строки jg owerflow call typing ; выводим эту строку jmp event_wait

owerflow:			; при переполнении строки

xor esi,esi ; очистить ее jmp redraw ; и перерисовать окно button: mov eax,17  ; считываем идентификатор нажатой кнопки int 0x40  ; возвращен ah.

смотрим, какая кнопка была нажата и соответствующим образом реагируем.

cmp ah,1  ; кнопка с id=1("закрыть")? jne noclose

 clouse:

mov eax,-1  ; функция -1: завершить программу int 0x40

 noclose:
здесь проверяем остальные кнопки

jmp event_wait  ; и, конечно, возвращаемся к циклу ожидания :)


draw_window:  ; функция отрисовки окна mov eax,12 mov ebx,1  ; начало перерисовки int 0x40  ; ОКНО xor eax,eax  ; функция 0: определить и вывести окно mov ebx,100*65536+300  ; [x начальный] *65536 + [x размер] mov ecx,100*65536+120  ; [y начальный] *65536 + [y размер] mov edx,0x13ffffff  ; цвет рабочей области RRGGBB и стиль окна mov edi,text  ; текст в заголовке int 0x40

call typing  ; набранную строчку тоже надо перерисовать

mov eax,12 mov ebx,2  ; перерисовка окна окончена int 0x40 ret  ; конец функции typing:  ; функция прорисовки набираемой строки mov eax,4  ; четвертая функция рисует строку mov ebx,6*65536+30  ; координаты начала строки mov ecx,0x00000000  ; черный моноширинный шрифт mov edx,I_END  ; указатель на начало строки int 0x40  ; вызов прерывания Kolibri OS ret  ; возврат к точке вызова

ДАННЫЕ ПРОГРАММЫ

text db 'Type something:',0 I_END:  ; Указатель на конец файла и начало набираемой строки</asm>