Программирование EGA и VGA
3. BIOS экранного ввода/вывода
Описываемый ниже набор функций BIOS (номера 8 - fh) работает непосредственно с экранными изображениями, то есть осуществляет запись или чтение содержимого экранной памяти или схемы управления цветом. Исключение составляет функция fh, которая возвращает текущий видеорежим. Как и функции 0 - 7, функции видеообмена поддерживаются всеми IBM-адаптерами. Рассматриваемые процедуры обмена с видеопамятью достаточно медленные, поэтому большинство программистов стараются свести к минимуму их использование в конечном продукте. Однако некоторые из процедур успешно используются в прикладных программах.
Например, процедура записи символа работает во всех режимах. Эта возможность особенно полезна для вывода текста в графических режимах в тех случаях, когда не требуется сложная обработка текста (такая как различение размера букв или выравнивание пикселей). Процедуры вывода символа в графическом режиме сложны для написания и, возможно, данная задача не стоит затрачиваемых усилий.
Вызов функции 8: Чтение атрибута/символа в текущей позиции курсора.
Комментарии
Функция может быть использована для чтения символа с любой страницы. Возвращаемая информация содержит символ, расположенный в текущей позиции курсора указанной страницы (см. функцию 2 для установки текущей позиции курсора). Атрибут представляет собой однобайтовое значение, описывающее символ и фон в соответствии со следующим форматом:

При работе с цветными мониторами три бита цвета фона и символа позволяют получить восемь различных цветов. При использовании монохромных мониторов могут быть установлены следующие значения битов, описывающих цвет фона: все 0 - черный, все 1 - альтернативный цвет. Биты, описывающие цвет символа, могут принимать значения: 000 - черный, 001 для подчеркивания, 111 - для обычного символа. Байт атрибута имеет смысл только в алфавитно-цифровых (текстовых) режимах. См. функции 10h и 11h для получения дополнительных сведений о кодах атрибутов и символов.
Исходные данные
Регистры (устанавливаются до вызова функции):
- AH: устанавливается 8
- BH: номер страницы (см. функцию 5)
Выходные данные
Регистры (опрашиваются после вызова функции):
- AL: ASCII-код символа в текущей позиции курсора
- AH: код атрибута (для текстового режима)
Приводимая ниже программа возвращает символ ASCII (и значение байта атрибута), расположенного на строке 5 столбца 15. Можно попробовать выполнить эту программу после работы одного из двух следующих примеров (вызов функции 9 или 0ah). Если используются оба примера, их выполнение рекомендуется провести в следующем порядке: функции 0ah, 8, 9 и 8. Это позволит продемонстрировать изменение байта атрибута.
Пример на языке ассемблера:
data segment public
msg db 'Row 5, Column 15 contains ASCII'
db 'character'
char db 3 dup (?)
db ', and attribute value '
attr db 3 dup (?)
m_len equ $-msg ;формирование константы от текущей
;метки до начала сообщения
data ends
code segment public
assume CS:code
main proc far
start: push DS
sub AX,AX
push AX
mov AX,data
mov DS,AX
assume DS:data
mov AX,data
mov ES,AX
assume ES:data
mov BH,0 ;страница 0
mov DH,5 ;строка 5
mov DL,15 ;столбец 15
mov AH,2 ;функция 2 - установка позиции курсора
int 10h ;обращение к видео-BIOS
mov BH,0 ;страница 0
mov AH,8 ;функция 8 - чтение символа и атрибута
int 10h ;обращение к видео-BIOS
mov BL,AH ;временная запись атрибута в BL
mov DI,offset char
call bin2asc
mov AL,BL ;получение атрибута
mov DI,offset attr
call bin2asc
mov DH,20 ;строка 20
mov DL,0 ;столбец 0
mov BH,0 ;страница 0
mov BP,offset msg ;ES:BP указатель на строку
mov BL,0fh ;белый высокой яркости
mov CX,m_len ;длина строки
mov AL,1 ;курсор перемещается
;только строка символов
;атрибут в BL
mov AH,13h ;функция 13h - запись строки
int 10h ;вызов видео-BIOS
ret
main endp
bin2asc proc near
COMMENT*Эта подпрограмма перевода двоичных чисел в формат
ASCII написана специально для рассматриваемой в приме-
ре программы и позволяет работать только с числами,
меньшими 256. AL:8-битовое переводимое значение,DI:
смещение в DS, получающее 2-байтовое значение ASCII
*
xor AH,AH ;0 в AH
mov DL,100
div DL ;перевод в десятичные сотни
add AL,30h ;перевод сотен в ASCII
mov [DI],AL
mov AL,AH
xor AH,AH ;0 в AH
mov DL,10
div DL ;перевод в десятичные цифры
add AL,3030h ;увеличение на 30h для получения
;ASCII-кода
mov [DI+1],AL ;запись десятков
mov [DI+2],AH ;запись единиц
ret
mov DH,21 ;строка 21
mov DL,0 ;столбец 0
mov AH,2 ;функция 2 - установка поз. курсора
int 10h ;вызов видео-BIOS
bin2asc endp
code ends
end start
Вызов функции 9: Запись атрибута/символа в текущую позицию курсора.
Комментарии
Функция может быть использована для записи символа (или копий символа) на любую страницу. Символы записываются начиная с текущей позиции курсора, которая определяется с помощью обращения к функции 2. Атрибут представляет собой однобайтовое значение, описывающее символ и фон в соответствии со следующим форматом:

При работе с цветными мониторами три бита цвета фона и символа позволяют получить восемь различных цветов. При использовании монохромных мониторов могут быть установлены следующие значения битов, описывающих цвет фона: все 0 - черный, все 1 - альтернативный цвет. Биты, описывающие цвет символа, могут принимать значения: 000 - черный, 001 для подчеркивания, 111 - для обычного символа.
В графических режимах байт атрибута используется для установки цвета символа. Установка бита 7 приводит к тому, что символ накладывается на текущее содержимое экрана по принципу "Исключающее ИЛИ". См. вызов функций 10h и 11h для получения дополнительных сведений о кодах атрибутов и символов.
В алфавитно-цифровых режимах вывод большего количества копий символа, чем может поместиться на строке, приведет к переносу символов на следующую строку. В графическом режиме все выводимые копии должны помещаться на одной строке. После завершения обращения к функции позиция курсора не изменяется (даже при выводе большого количества копий символа). Позиционирование символа должно выполняться средствами программы.
Вывод управляющих символов выполняется так же, как и вывод отображаемых символов. Поэтому управляющие символы "Забой", "Возврат каретки", "Перевод строки" и т.д. должны выполняться путем позиционирования курсора.
Исходные данные
Регистры (устанавливаются до вызова функции):
- AH: устанавливается 9
- AL: ASCII-код символа
- BH: номер страницы (см. функцию 5). В режиме 13h [регистр BH используется для задания цвета фона]
- BL: атрибут символа
- CX: количество отображаемых символов
Приведенная ниже программа выполняет посимвольную печать сообщения, изменяя атрибут (цвет) каждого символа. Следует обратить внимание на действие управляющих кодов 7, 10 и 13. Сравните результат действия функций ah, eh и 13h.
Пример на языке ассемблера:
data segment public
msg db 'This line demonstrates printing'
db 'ASCII 7 (',7,'), 10(',10,') and'
db '13(',13,').'
m_len equ $-msg ;формирование константы от текущей
;метки до начала сообщения
;(длина сообщения)
data ends
code segment public
assume CS:code
main proc far
start: push DS
sub AX,AX
push AX
mov AX,data
mov DS,AX
assume DS:data
mov DH,05 ;строка 5( для вызова функции 2)
mov DL,0 ;столбец 0 (для вызова функции 2)
mov CX,m_len ;число итераций
mov BP,offset msg ;указатель на сообщение
mov BL,1 ;инициализация BL в 1
;начало с цвета 1
lp1: inc DX ;следующий столбец
mov AH,2 ;функция 2 - установка курсора
int 10h ;вызов видео-BIOS
push CX ;сохранение счетчика итераций
mov CX,1 ;запись одного символа
mov BH,0 ;страница 0
mov AL,msg[BP];получение ASCII-кода
mov AH,9 ;вызов функции 9
int 10h ;вызов видео-BIOS
inc BP ;указатель на следующий символ
inc BX ;следующий цвет
;(номер увеличивается на 1)
cmp BL,15 ;если 15
jbe skp ;пропустить до skp
mov BL,1 ;если 15, установить цвет 1
skp: pop CX ;восстановление счетчика итераций
loop lp1
mov DH,21 ;строка 21
mov DL,0 ;столбец 0
mov AH,2 ;функция 2 - установка курсора
int 10h ;вызов видео-BIOS
ret
main endp
code ends
end start
