Difference between revisions of "Super Typer/ru"
(Поменял ссылку на страницу автора в связи со своей регистрацией) |
m (Исправление опечатки) |
||
Line 5: | Line 5: | ||
<asm>; Super Typer 1.0 beta предоставит вам потрясающие | <asm>; Super Typer 1.0 beta предоставит вам потрясающие | ||
; возможности по выводу на экран строки, набираемой вами. | ; возможности по выводу на экран строки, набираемой вами. | ||
− | ; | + | ; Copyleft (c) Xenius, 2007 |
; Вы можете свободно распространять, изменять и использовать | ; Вы можете свободно распространять, изменять и использовать | ||
; данную программу на условиях GNU GPL (см www.gnu.org). | ; данную программу на условиях GNU GPL (см www.gnu.org). |
Revision as of 17:48, 15 March 2009
Super Typer -- программа для KolibriOS, написанная Ксениусом. Является примером программирования, более интересным, чем Hello World, но тем не менее достаточно простым для понимания.
Исходный код версии от 16.04.2007:
<asm>; 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: ; Указатель на конец файла и начало набираемой строки</asm>