Super Typer/ru
Jump to navigation
Jump to search
Super Typer -- программа для KolibriOS, написанная Ксениусом. Является примером программирования, более интересным, чем Hello World, но тем не менее достаточно простым для понимания.
Исходный код версии от 16.04.2007:
; Super Typer 1.0 beta предоставит вам потрясающие
; возможности по выводу на экран строки, набираемой вами.
; Copyleft (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: ; Указатель на конец файла и начало набираемой строки