Функция обеспечивает запись символа на экран в режиме телетайпа: символ отображается в текущей позиции курсора, после чего курсор сдвигается вправо на одну позицию. При необходимости курсор автоматически перемещается на новую строку, а когда весь экран заполняется, происходит вертикальная свертка экрана. В последнем случае верхняя строка экрана исчезает, а снизу возникает новая пустая строка и курсор помещается в ее начало. В текстовых режимах цветовые атрибуты строк, возникающих из-за свертки экрана соответствуют атрибутам отображаемых символов.
Данная функция обрабатывает следующие управляющие символы: звуковой сигнал (7 - BELL), возврат курсора назад на одну позицию (8 - BACKSPACE), возврат каретки (0Dh - CARRIAGE RETURN) и перевод строки (0Ah - LINEFEED).
В текстовых режимах символы отображаются с атрибутами, использованными ранее. Атрибуты символов экрана не меняются и определяют цвет отображаемых символов. Если вам надо отобразить на экране символы различных цветов, вы должны предварительно установить атрибуты всех символов на экране.
В графических режимах цвет отображаемого символа задается регистром BL. Если бит D7 регистра AL содержит единицу, то пикселы символа накладываются на текущее содержимое экрана по логике булевой операции ИСКЛЮЧАЮЩЕЕ ИЛИ (за исключением режима 13h).
Ниже приведен формат вызова функции 0Eh:
На входе: |
AH |
0Eh - запись символа в режиме телетайпа |
AL |
ASCII-код записываемого символа |
|
BH |
Номер страницы видеопамяти (только в текстовых режимах)? |
|
BL |
Цвет символа (в графических режимах) |
|
На выходе: |
Не используются |
Приведем текст процедуры WriteStringT, которая выводит на экран строку, имеющую смещение SI в сегменте DS, при помощи функции 0Eh прерывания INT 10h (листинг 5.3).
Листинг 5.3. Файл WRITESTR.C
WriteStringT PROC
; Определяем текущую активную страницу экрана
mov ah,0Fh
int 10h ; Номер активной страницы в регистре BH
; В цикле выводим на экран символы строки
next_char:
mov ah,0Eh
lodsb ; Получаем следующий символ строки
cmp al,0 ; Находим конец строки
je exit_proc ; Если конец строки достигнут, то
; оканчиваем процедуру
int 10h
jmp next_char
exit_proc:
ret
WriteStringT ENDP