Super Typer/ru

From KolibriOS wiki
Revision as of 11:37, 18 January 2008 by 81.18.125.53 (talk) (Создание страницы.)
(diff) ← Older revision | Latest revision (diff) | Newer revision → (diff)
Jump to navigation Jump to search

Super Typer -- программа для KolibryOS, написанная Xenius. Является примером программирования, более интересным, чем 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>