Super Typer/ru
Jump to navigation
Jump to search
The printable version is no longer supported and may have rendering errors. Please update your browser bookmarks and please use the default browser print function instead.
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: ; Указатель на конец файла и начало набираемой строки