Программирование EGA и VGA
Вызов функции 0Ah: Запись атрибута/символа в текущую позицию курсора.
Комментарии
Обращение к этой функции идентично обращению к функции 9, которая описана выше, за исключением того, что атрибут не может быть установлен (существующие атрибуты не изменяются).
Исходные данные
Регистры (устанавливаются до вызова функции):
- AH: устанавливается ah
- AL: ASCII-код символа
- BH: номер страницы (см. функцию 5)
- CX: количество записываемых символов
Пример на языке ассемблера:
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,0ah ;вызов функции 0ah ;следует обратить внимание, ;что байт атрибута (BL) ;не задействован 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
Данный пример аналогичен предыдущему, за исключением номера функции. Выходная информация содержит действующее значение атрибута. Таким образом, при выполнении команды CLS до запуска приведенной выше программы выводимая информация будет иметь обычный белый цвет. Если программа вызывается после выполнения предыдущего примера, состояние изображения на экране не изменится. Поэтому новые символы сохранят прежние многоцветные атрибуты.
Вызов функции 0Bh: установка цветовой палитры.
Комментарии
Рассматриваемая функция предусмотрена для работы в совместимых режимах. См. функцию 10h для установки палитры в новых режимах.
Регистр BH определяет доступ либо к цвету фона (0), либо к набору цветов палитры в графическом режиме с разрешением 320х200 (1). Допустимо любое значение от 0 до 127, хотя достаточно указать 0 или 1 (четные числа рассматриваются как 0, нечетные - как 1).
Исходные данные
Регистры (устанавливаются до вызова функции):
- AH: устанавливается bh
- BH: идентификатор цветовой палитры
- BL: для BH=0 в графическом режиме - цвет фона (0 - 15); в текстовом режиме - цвет рамки (0 - 31). Следует отметить, что цвет фона в текстовом режиме является атрибутом символа (см. вызов функции 8). При BH=1 значение 0 означает выбор зеленого, красного и коричневого цветов, а 1 - голубого, пурпурного и белого. Эти цвета имеют номера 1, 2 и 3. Цвет фона - 0.
Приведенная ниже программа выполняет вывод цветных точек поперек экрана в режиме эмуляции CGA, после чего осуществляется смена палитры с принятой по умолчанию (голубой, пурпурный и белый) на зеленый, красный и коричневый цвета.
Пример на языке ассемблера:
data segment public clr db 3 ;установка начального цвета 3 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 AH,0 ;функция 0 - установка режима mov AL,5 ;выбор режима 5 int 10h ;вызов видео-BIOS mov BH,1 ;выбор графической палитры цветов mov BL,1 ;голубой, пурпурный, белый mov AH,0bh ;установка палитры int 10h ;вызов видео-BIOS mov BH,0 ;определение цвета фона mov BL,0 ;черный mov AH,0bh ;установка палитры int 10h ;вызов видео-BIOS mov CX,319 ;определение столбца lp: mov AH,0ch :функция ch - вывод точки mov AL,clr ;установка цвета dec AX ;уменьшение на 1 номера цвета mov clr,AL ;сохранение нового значения цвета jnz skip ;на skip, если номер цвета не 0 mov clr,3 ;повторить установку цвета 3 skip: mov BH,0 ;страница 0 mov DX,10 ;строка 10 int 10h ;вызов видео-BIOS loop lp ;декремент CX - следующий столбец mov CX,4 ;множитель задержки ;(для увеличения времени) ps1: push CX mov CX,0ffffh ;длительность паузы ps2: loop ps2 ;пустой цикл для задержки pop CX loop ps1 ;цикл через множитель mov BH,1 ;выбор графической палитры mov BL,0 ;зеленый, красный, коричневый mov AH,0bh ;установка палитры int 10h ;вызов видео-BIOS mov DH,10 ;строка 10 mov DL,0 ;столбец 0 mov BH,0 ;страница 0 mov AH,2 ;функция 2 - установка курсора int 10h ;вызов видео-BIOS ret main endp code ends end start
Вызов функции 0Ch: запись точки.
Комментарии
Обращение к этой функции применяется для построения точки на любой странице в графических режимах. Столбец 0 - самый левый, строка 0 самая верхняя (необходимо отметить, что в большинстве координатных систем нулевая строка расположена внизу).
Если в регистре AL установлен бит 7, то новый пиксель накладывается на текущее содержимое экрана с использованием операции "Исключающее ИЛИ".
Регистр BH (номер страницы) CGA не поддерживается, поскольку в CGA не предусмотрена работа с графическими страницами. Для EGA и VGA в регистре должно быть установлено соответствующее значение.
Исходные данные
Регистры (устанавливаются до вызова функции):
- AH: устанавливается ch
- AL: номер цвета
- BH: номер страницы (см. функцию 5)
- CX: номер столбца пикселя (0 - 319 или 0 - 639)
- DX: номер строки пикселя (0 - 199, 0 - 349 или 0 - 479)
Применение функции описывается в примере для функции 0 (Установка режима). Кроме того, в Приложении содержатся тексты похожих программ, в которых осуществляется непосредственная запись пикселей в память. Пример, приведенный для функции dh (Чтение точки), также содержит обращение к рассматриваемой функции. Для выполнения программы, содержащей функцию считывания точки, следует предварительно выполнить программу установки режима.
Вызов функции 0Dh: считывание точки
Комментарии
Обращение к функции применяется для получения цвета точки, расположенной на любой из страниц в графических режимах. Столбец 0 - самыйлевый, строка 0 - самая верхняя).
Регистр BH (номер страницы) CGA не поддерживается.
Исходные данные
Регистры (устанавливаются до вызова функции):
- AH: устанавливается dh
- BH: номер страницы (см. функцию 5)
- CX: номер столбца пикселя (0 - 319 или 0 - 639)
- DX: номер строки пикселя (0 - 199, 0 - 349 или 0 - 479)
Выходные данные
Регистры (читаются после вызова функции):
- AL: значение цвета точки
Приведенная ниже программа выполняет копирование строки 10 на строку 20. Необходимо задать графический режим высокого разрешения, использовав пример для функции 0.
Пример на языке ассемблера:
data segment public clr db 16 ;установка начального цвета 16 msg db 'The mode must be set to high ' db 'resolution.' m_end label byte 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 AH,0fh ;функция 0fh текущий режим int 10h ;вызов видео-BIOS cmp AL,0eh ;номер режима меньше 0eh? jl bad_mode cmp AL,13h ;режим низкого разрешения 256 цв.? je bad_mode mov CX,639 ;столбец lp: mov AH,0dh ;функция dh - считывание точки mov BH,0 ;страница 0 mov DX,10 ;строка 10 int 10h ;вызов видео-BIOS mov AH,0ch ;функция ch - запись точки mov DX,20 ;строка 20 int 10h ;вызов видео-BIOS loop lp ;декремент CX - следующий столбец ret bad_mode: mov AX,data mov ES,AX assume ES:data mov AH,3 ;функция 2 - чтение позиции курсора mov BH,0 ;страница 0 int 10h ;вызов видео-BIOS ;позиция курсора помещается в регистр DX mov DL,0 ;столбец 0 mov AX,1300h ;запись строки (символьные данные) mov BH,0 ;страница 0 mov BL,3 ;цвет 3 mov BP,offset msg ;ES:BP указатель на текст mov CX,offset m_end-msg ;длина текста int 10h ;вызов видео-BIOS ret main endp code ends end start