; 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: ; Указатель на конец файла и начало набираемой строки