5. Èñïîëüçîâàíèå ôóíêöèé BIOS äëÿ ðàáîòû ñ âèäåîàäàïòåðàìè

У всех компьютеров, совместимых с IBM PC/XT/AT и PS/2, на системной плате установлена микросхема ПЗУ BIOS. В ней записан набор различных программ или функций, предназначенных для управления различными подсистемами компьютера: дисковой подсистемой, асинхронными последовательными и параллельными портами ввода/вывода, видеоадаптером. Нас в первую очередь будут интересовать функции, предназначенные для управления видеоподсистемой компьютера.

Микросхема ПЗУ BIOS, расположенная на системной плате содержит функции для управления видеоадаптерами. Однако практически все видеоадаптеры имеют собственную микросхему ПЗУ BIOS, расположенную на самой плате адаптера. На практике для управления видеоадаптером используются функции, записанные в его ПЗУ BIOS.

Использование функций BIOS для управления видеоадаптерами имеет как преимущества, так и недостатки. Основным преимуществом функций BIOS является то, что они скрывают всю кропотливую работу по программированию регистров видеоадаптера и видеопамяти, предоставляя программисту достаточно простой интерфейс. Но это еще не все. Так как функции BIOS создаются самими разработчиками видеоадаптера, то они учитывают все особенности конкретной модели адаптера, выравнивая все различия. Как вы узнаете позже, это особенно важно для программирования видеоадаптеров SVGA, так как набор регистров и организация видеопамяти разных моделей может сильно различаться.

К недостаткам функций BIOS можно отнести невысокую скорость их работы. Отчасти это вызвано тем, что доступ к данным, записанным в ПЗУ происходит медленнее, чем к оперативной памяти. Многие системные платы позволяют перенести содержимое медленного ПЗУ BIOS в более быструю оперативную память. Эта область оперативной памяти получила название теневой памяти, так как ее содержимое полностью повторяет соответствующую область ПЗУ. Подключение теневой памяти выполняется с помощью программы BIOS Setup. Отметим, что ПЗУ BIOS видеоадаптера обычно занимает адресное пространство начиная с адреса C000:0000h до адреса C000:7FFFh.

Второй недостаток функций ПЗУ BIOS состоит в том, что большинство их нереентерабельно. То есть пока не завершится вызов функции BIOS нельзя вызвать другую функцию BIOS. Вследствие этого вы не можете как обычно пользоваться функциями BIOS в резидентных программах.

Практически ни одна функция BIOS видеоадаптера не проверяет результат своего выполнения и не сообщает о произошедших ошибках. Поэтому любая неточность в исходном тексте программы может привести к ошибке, причину которой будет трудно выявить.

И, наконец, последний недостаток функций BIOS состоит в том, что они предназначены только для работы в реальном режиме процессора. При вызове функций BIOS из защищенного режима процессора будет происходить переключение процессора в реальный режим.

Для доступа к функциям BIOS видеоадаптера предназначено прерывание INT 10h. Загрузите в регистр AH номер функции BIOS видеоадаптера, которую необходимо вызвать, загрузите остальные регистры процессора в соответствии с вызываемой функцией и выполните прерывание INT 10h.

Большинство функций BIOS видеоадаптера не изменяют содержимое неиспользуемых регистров процессора, однако рекомендуется сохранить наиболее важные регистры.

Âûáîð ðåæèìà ðàáîòû - ôóíêöèÿ 00h

Функция 00h прерывания 10h позволяет задать любой стандартный режим работы видеоадаптера:

Íà âõîäå:

AH

00h

 

AL

Íîìåð óñòàíàâëèâàåìîãî ðåæèìà ðàáîòû âèäåîàäàïòåðà, åñëè áèò D7 = 1, òî ïðè óñòàíîâêå ðåæèìà âèäåîïàìÿòü íå î÷èùàåòñÿ

Íà âûõîäå:

Íå èñïîëüçóþòñÿ

Приведем пример выбора режима видеоадаптера:

mov ah, 0
mov al, 3 ; Âûáèðàåì ðåæèì íîìåð 3 (16 öâåòíîé, òåêñòîâûé,
int 10h ; ðàçðåøåíèå 25õ80 ñèìâîëîâ)

Èçìåíåíèå ôîðìû êóðñîðà - ôóíêöèÿ 01h

Функция 01h позволяет изменить вертикальные размеры курсора путем задания верхней и нижней границ курсора (рис. 5.1). Горизонтальные размеры курсора всегда одинаковы и равны ширине одного символа. Курсор отображается только в текстовых режимах работы видеоадаптера.

Íà âõîäå:

AH

00h

 

CH

Âåðõíÿÿ ãðàíèöà êóðñîðà. Åñëè ðåãèñòð CH ñîäåðæèò çíà÷åíèå 20h êóðñîð íå îòîáðàæàåòñÿ

 

CL

Íèæíÿÿ ãðàíèöà êóðñîðà

Íà âûõîäå:

 

Íå èñïîëüçóþòñÿ

При выборе режима работы видеоадаптера BIOS устанавливает следующие значения для верхней и нижней границ курсора:

w Äëÿ ìîíîõðîìíîãî è óëó÷øåííîãî öâåòíîãî ìîíèòîðà âåðõíÿÿ ãðàíèöà = 11h, à íèæíÿÿ = 12h.

w Äëÿ öâåòíîãî ìîíèòîðà âåðõíÿÿ ãðàíèöà = 6h, à íèæíÿÿ = 7h.

PICTURE._FIG_35.PCX;6";4.308";PCX

Ðèñóíîê 5.1 Èçìåíåíèå ïîëîæåíèÿ êóðñîðà

Èçìåíåíèå ïîëîæåíèÿ êóðñîðà - ôóíêöèÿ 02h

Функция 02h задает текущее положение курсора на экране монитора. Если видеопамять разделена на несколько страниц, то каждая из них имеет свой курсор, координаты которого можно устанавливать отдельно.

Координаты курсора определяют не только место на экране, где он отображается, но также и позицию, начиная с которой соответствующие функции BIOS будут выводить на экран строки или отдельные символы.

Íà âõîäå:

AH

02h

 

BH

Íîìåð ñòðàíèöû âèäåîïàìÿòè

 

DH

Íîìåð ñòðîêè

 

DL

Íîìåð ñòîëáöà

Íà âûõîäå:

 

Íå èñïîëüçóþòñÿ

Îïðåäåëåíèå ïîëîæåíèÿ è ôîðìû êóðñîðà - ôóíêöèÿ 03h

Функция 03h позволяет узнать размер и текущие координаты курсора для любой страницы видеопамяти:

Íà âõîäå:

AH

03h

 

BH

Íîìåð ñòðàíèöû âèäåîïàìÿòè

Íà âûõîäå:

CH

Âåðõíÿÿ ãðàíèöà êóðñîðà

 

CL

Íèæíÿÿ ãðàíèöà êóðñîðà

 

DH

Ïîçèöèÿ òåêóùåé ñòðîêè êóðñîðà

 

DL

Ïîçèöèÿ òåêóùåãî ñòîëáöà êóðñîðà

Данная функция предназначена для использования только в текстовых режимах видеоадаптера.

Èñïîëüçîâàíèå ñâåòîâîãî ïåðà - ôóíêöèÿ 04h

Функция 04h позволяет определить подключено ли к видеоадаптеру световое перо или нет. Если световое перо подключено, можно определить его координаты. Функция позволяет узнать позицию светового пера в текстовых и в графических координатах.

Световое перо видеоадаптера EGA программно не полностью совместимо с CGA, в результате чего программы поддерживающие возможность использования светового пера для видеоадаптера CGA будут работать неправильно с видеоадаптером EGA. Видеоадаптеры VGA и SVGA не имеют светового пера.

Íà âõîäå:

AH

04h

Íà âûõîäå:

AH

0 - ñâåòîâîå ïåðî íå ïîäêëþ÷åíî (âñå îñòàëüíûå ðåãèñòðû íå ñîäåðæàò ïîëåçíîé èíôîðìàöèè);

1 - ñâåòîâîå ïåðî ïîäêëþ÷åíî

 

CH

Êîîðäèíàòû âåðòèêàëüíîé ïîçèöèè êóðñîðà â ïèêñåëàõ (ãðàôè÷åñêèå ðåæèìû ñ íèçêèì ðàçðåøåíèåì - 04h, 05h, 06h)

 

CX

Êîîðäèíàòû âåðòèêàëüíîé ïîçèöèè êóðñîðà â ïèêñåëàõ (ãðàôè÷åñêèå ðåæèìû ñ âûñîêèì ðàçðåøåíèåì)

 

BX

Êîîðäèíàòû ãîðèçîíòàëüíîé ïîçèöèè êóðñîðà â ïèêñåëàõ

 

DH

Íîìåð ñòðîêè, íà êîòîðîé ðàñïîëîæåí êóðñîð

 

DL

Íîìåð ñòîëáöà íà êîòîðîì ðàñïîëîæåí êóðñîð

Âûáîð àêòèâíîé ñòðàíèöû âèäåîïàìÿòè - ôóíêöèÿ 05h

Функция 05h позволяет изменить активную страницу видеопамяти. Активная страница видеопамяти отображается на экране монитора. Функция не проверяет физического наличия выбранной страницы видеопамяти. Если вы неправильно указали номер страницы результат работы функции не определен.

Íà âõîäå:

AH

05h

 

AL

Íîìåð ñòðàíèöû âèäåîïàìÿòè, êîòîðàÿ ñòàíåò àêòèâíîé

Íà âûõîäå:

 

Íå èñïîëüçóþòñÿ

Ñâåðòêà îêíà ââåðõ - ôóíêöèÿ 06h

Свернуть содержимое окна экрана вверх можно при помощи функции 06h. Окно задается координатами верхнего левого и нижнего правого углов. При свертке окна снизу появляются новые пустые строки (строки, заполненные пробелами). Верхние строки исчезают. Область экрана вне окна не изменяется. Функция позволяет работать только с активной страницей видеопамяти.

Íà âõîäå:

AH

06h

 

AL

Êîëè÷åñòâî ñâåðòûâàåìûõ ëèíèé. Åñëè îíî ðàâíî íóëþ, òî îêíî ïðîêðó÷èâàåòñÿ öåëèêîì

 

BH

Àòðèáóò, èñïîëüçóåìûé äëÿ ñèìâîëîâ ñòðîê, âîçíèêàþùèõ ñíèçó îêíà

 

CH

Íîìåð ñòðîêè âåðõíåãî ëåâîãî óãëà îêíà

 

CL

Íîìåð ñòîëáöà âåðõíåãî ëåâîãî óãëà îêíà

 

DH

Íîìåð ñòðîêè íèæíåãî ïðàâîãî óãëà îêíà

 

DL

Íîìåð ñòîëáöà íèæíåãî ïðàâîãî óãëà îêíà

Íà âûõîäå:

 

Íå èñïîëüçóþòñÿ

Функцию 06h можно использовать не только в текстовых, но и в графических режимах работы видеоадаптера. Если вы используете функцию в графическом режиме, то цвет области, появляющийся внизу окна после его свертки зависит от значения регистра BH и номера режима видеоадаптера.

В монохромном графическом режиме с разрешением 640х200 пикселов значение регистра BH определяет цвет 8-и последовательно расположенных пикселов. Задав разный цвет пикселов вы можете закрасить свертываемую область вертикальными штрихами.

В 4-х цветном графическом режиме с разрешением 320х200 пикселов значение регистра BH определяет цвет 4-х последовательно расположенных пикселов. Благодаря этому вы можете закрасить свертываемую область вертикальными штрихами различного цвета.

В остальных графических режимах значение регистра BH определяет цвет всех пикселов в свертываемой области экрана.

Тот факт, что при свертке в нижней части окна возникают чистые строки, впоследствии заполняющие все окно, можно использовать для быстрой очистки экрана. Для этого достаточно задать размеры окна, равные размерам экрана и прокрутить его вверх на 25 или 0 строк. Приведем фрагмент программы на языке ассемблера, который можно использовать для очистки экрана монитора:

push es ; Ñîõðàíÿåì ñîäåðæèìîå ðåãèñòðà ES

xor ax,ax ; Óñòàíàâëèâàåì ðåãèñòð ES íà íóëåâîé
mov es,ax ; ñåãìåíò ïàìÿòè

mov ah,6 ; Ôóíêöèÿ ñâåðòêè ýêðàíà ââåðõ
mov al,0 ; Î÷èùàåì âñå îêíî
mov bh,7 ; Óñòàíàâëèâàåì íîðìàëüíûé àòðèáóò
xor cx,cx ; Óñòàíàâëèâàåì ëåâûé âåðõíèé óãîë îêíà â (0,0)

; Îïðåäåëÿåì ÷èñëî ñòðîê â äàííîì ðåæèìå
mov dh,es:[484h]
; Îïðåäåëÿåì ÷èñëî ñèìâîëîâ â ñòðîêå
mov dl,es:[44Ah]
dec dl

; Âûçûâàåì ñâåðòêó ýêðàíà ââåðõ
int 10h
; Âîññòàíàâëèâàåì ðåãèñòð ES
pop es

Для определения размеров экрана используется содержимое переменных видеофункций BIOS. Ячейка памяти, расположенная по адресу 0000:0484h содержит число, на единицу меньшее, чем количество строк на экране. По адресу 0000:044Ah находится переменная, определяющая число символов в строке. Более подробно переменные видеофункциий BIOS будут рассмотрены позже.

Ñâåðòêà òåêñòîâîãî îêíà âíèç - ôóíêöèÿ 07h

Свернуть активное окно экрана вниз можно при помощи функции 07h. Окно задается координатами верхнего левого и нижнего правого углов. При свертке в верхней части окна появляются новые пустые строки, а нижние строки исчезают. Область экрана вне окна не изменяется.

Íà âõîäå:

AH

07h - ñâåðòêà îêíà âíèç

 

AL

×èñëî ñâåðòûâàåìûõ ëèíèé, åñëè îíî ðàâíî íóëþ, òî îêíî ïðîêðó÷èâàåòñÿ öåëèêîì

 

BH

Àòðèáóò, èñïîëüçóåìûé äëÿ ñòðîê, âîçíèêàþùèõ â âåðõíåé ÷àñòè îêíà

 

CH

Íîìåð ñòðîêè ëåâîãî âåðõíåãî óãëà îêíà

 

CL

Íîìåð ñòîëáöà ëåâîãî âåðõíåãî óãëà îêíà

 

DH

Íîìåð ñòðîêè ïðàâîãî íèæíåãî óãëà îêíà

 

DL

Íîìåð ñòîëáöà ïðàâîãî íèæíåãî óãëà îêíà

Íà âûõîäå:

 

Íå èñïîëüçóþòñÿ

Функция работает аналогично функции 06h (за исключением направления свертки).

×òåíèå ñèìâîëà è åãî àòðèáóòîâ - ôóíêöèÿ 08h

Данная функция позволяет прочитать символ и его атрибуты из позиции экрана, определенной текущим положением курсора. Чтение можно производить как из активной, так и из неактивных страниц памяти:

Íà âõîäå:

AH

08h

 

BH

Íîìåð ñòðàíèöû âèäåîïàìÿòè

Íà âûõîäå:

AL

ASCII-êîä ñèìâîëà

 

AH

Áàéò àòðèáóòîâ ñèìâîëà äëÿ òåêñòîâûõ ðåæèìîâ

Следующий пример считывает символ и его атрибут из текущей позиции курсора на странице page:

mov ah,8
mov bh,page ; Âûáèðàåì ñòðàíèöó âèäåîïàìÿòè page

int 10h ; Ñ÷èòûâàåì ñèìâîë è åãî àòðèáóò

mov char,al ; Ñîõðàíÿåì ïîëó÷åííûé ASCII-êîä ñèìâîëà
mov attr,ah ; è åãî àòðèáóò

Что удивительно данная функция может работать не только в текстовых, но также и в графических режимах. В этом случае она сравнивает пикселы в текущей позиции курсора с записями в таблице определения символов графического режима. Пикселы, значение которых не равно нулю, воспринимаются как пикселы символа. Остальные пикселы рассматриваются в качестве фона. Если соответствующий образ символа не обнаружен, функция возвращает в регистре AL значение 0. Если символ определен, в регистре AL возвращается его ASCII-код.

В качестве таблицы определения символов графического режима используется таблица, на которую указывает вектор прерывания 43h. Для графических режимов низкого разрешения (режимы номер 4, 5, 6) используется таблица символов, на которую указывает вектор прерывания 1Fh. Эта таблица содержит определение символов с ASCII-кодами 80h - FFh.

Çàïèñü ñèìâîëà ñ àòðèáóòàìè â òåêóùåé ïîçèöèè êóðñîðà - ôóíêöèÿ 09h

Функция позволяет записать один или несколько одинаковых символов в текущей позиции курсора. Запись может происходить как в активную, так и в неактивные страницы видеопамяти. После выполнения операции записи положение курсора не изменяется. Управляющие символы, такие как возврат каретки и перевод строки, не действуют и записываются в видеопамять, как обычные символы. Данная функция работает как в текстовых, так и в графических режимах.

Íà âõîäå:

AH

09h

 

AL

ASCII-êîä çàïèñûâàåìîãî ñèìâîëà

 

BH

Íîìåð ñòðàíèöû âèäåîïàìÿòè èëè öâåò ïèêñåëîâ ôîíà (äëÿ ãðàôè÷åñêîãî ðåæèìà íîìåð 13h)

 

BL

Àòðèáóò ñèìâîëîâ (äëÿ òåêñòîâîãî ðåæèìà) èëè öâåò ïèêñåëîâ ñèìâîëà (äëÿ ãðàôè÷åñêîãî ðåæèìà);

 

CX

Êîëè÷åñòâî çàïèñûâàåìûõ ñèìâîëîâ

Íà âûõîäå:

 

Íå èñïîëüçóþòñÿ

Если бит D7 регистра BL содержит единицу, то записываемый символ накладывается на текущее содержимое экрана по логике булевой операции ИСКЛЮЧАЮЩЕЕ ИЛИ. Естественно, за исключением режима номер 13h, в котором все биты регистра BL используются для задания цвета пикселов символа.

Ниже приведен пример (листинг 5.1), использующий рассмотренные функции BIOS для выбора режима работы видеоадаптера, выбора активной страницы видеопамяти, изменения формы и координат курсора и отображения символов на экране монитора.

Ëèñòèíã 5.1. Ôàéë BIOSFUN.ASM

TITLE BIOS_FUNCTION

.MODEL small

DOSSEG

.STACK 100h

.DATA
message DB "INT 10h", 0
video_page DB 2

.CODE
.STARTUP

; Âûáèðàåì ðåæèì 3 âèäåîàäàïòåðà
xor ah,ah
mov al,3
int 10h

; Èçìåíÿåì ôîðìó êóðñîðà
mov ah,1
mov ch,0 ; íà÷àëî êóðñîðà - ëèíèÿ 0
mov cl,7 ; êîíåö êóðñîðà - ëèíèÿ 7
int 10h

; Âûáèðàåì àêòèâíóþ ñòðàíèöó âèäåîïàìÿòè
mov ah,5
mov al,video_page ; âûáèðàåì ñòðàíèöó video_page
int 10h

mov ah,6
mov al,0
mov bh,0ffh
mov cl,10
mov ch,5
mov dl,30
mov dh,15
int 10h

; Óñòàíàâëèâàåì êîîðäèíàòû êóðñîðà
mov ah,2
mov bh,video_page ; âûáèðàåì ñòðàíèöó video_page
mov dh,12 ; ñòðîêà 12
mov dl,20 ; êîëîíêà 20
int 10h

; Îòîáðàæàåì íà àêòèâíîé ñòðàíèöå ýêðàíà ñòðîêó message
mov si,OFFSET message
call WriteString

.EXIT 0


; Ïðîöåäóðà WriteString âûâîäèò íà ýêðàí ñòðîêó, èìåþùóþ
; ñìåùåíèå si â ñåãìåíòå ds
WriteString PROC

; Îïðåäåëÿåì òåêóùóþ àêòèâíóþ ñòðàíèöó ýêðàíà
mov ah,0Fh
int 10h ; íîìåð àêòèâíîé ñòðàíèöû â ðåãèñòðå bh

; Ïîëó÷àåì â dx êîîðäèíàòû êóðñîðà
mov ah,3
int 10h

; Â öèêëå âûâîäèì íà ýêðàí ñèìâîëû ñòðîêè

next_char:

mov ah,9
lodsb
cmp al,0 ; íàõîäèì êîíåö ñòðîêè

; Åñëè äîñòèãíóò êîíåö ñòðîêè îêàí÷èâàåì ïðîöåäóðó
je exit_proc

; Äëÿ îòîáðàæàåìûõ ñèìâîëîâ èñïîëüçóåì àòðèáóò 7
; ñèìâîëû ñòðîêè âûâîäÿòñÿ áåç ïîâòîðà
mov bl,7 ;
mov cx,1 ;
int 10h

; Ïåðåìåùàåì êóðñîð â ñëåäóþùóþ ïîçèöèþ ñòðîêè
mov ah,2
inc dl
int 10h

jmp next_char

exit_proc:

ret

WriteString ENDP

END

Çàïèñü ñèìâîëà â òåêóùåé ïîçèöèè êóðñîðà - ôóíêöèÿ 0Ah

Функция позволяет записать символ в текущей позиции курсора на любой странице видеопамяти. Как и в предыдущей функции, можно производить запись сразу нескольких одинаковых символов. Атрибуты символа не задаются, а используются их старые значения из предыдущих операций записи. После операции записи положение курсора не изменяется. Управляющие символы, такие как возврат каретки и перевод строки, не действуют и записываются в видеопамять, как обычные символы.

Íà âõîäå:

AH

10h

 

AL

ASCII-êîä çàïèñûâàåìîãî ñèìâîëà

 

BH

Íîìåð ñòðàíèöû âèäåîïàìÿòè èëè öâåò ïèêñåëîâ ôîíà (äëÿ ãðàôè÷åñêîãî ðåæèìà íîìåð 13h)

 

BL

Öâåò ïèêñåëîâ ñèìâîëà (äëÿ ãðàôè÷åñêîãî ðåæèìà)

 

CX

Êîëè÷åñòâî çàïèñûâàåìûõ ñèìâîëîâ

Íà âûõîäå:

 

Íå èñïîëüçóþòñÿ

Во всех режимах (за исключением режима номер 13h) если бит D7 регистра BL содержит единицу, то записываемый символ накладывается на текущее содержимое экрана по логике булевой операции ИСКЛЮЧАЮЩЕЕ ИЛИ.

Óñòàíîâêà öâåòîâîé ïàëèòðû (ðåæèìû 4,5,6) - ôóíêöèÿ 0Bh

Данная функция позволяет выбрать одну из двух стандартных цветовых палитр (см. таблицу 9.1). Функция используется для обеспечения совместимости с видеоадаптером CGA и предназначена для использования в текстовых режимах и графических режимах с низким разрешением.

Функция 0Bh имеет следующий формат вызова:

Íà âõîäå:

AH

0Bh

 

BH

0, òîãäà

 

BL

Öâåò ôîíà è ðàìêè (äëÿ ãðàôè÷åñêîãî ðåæèìà) èëè öâåò ðàìêè (äëÿ òåêñòîâîãî ðåæèìà)

 

BH

1, òîãäà

 

BL

Íîìåð ïàëèòðû (0 èëè 1)

Íà âûõîäå:

 

Íå èñïîëüçóþòñÿ

В следующей таблице описаны стандартные цветовые палитры для режимов 4, 5, 6:

Íîìåð öâåòà

Ïàëèòðà 0

Ïàëèòðà 1

0

Öâåò ôîíà

Öâåò ôîíà

1

Çåëåíûé

Ñèíèé

2

Êðàñíûé

Ôèîëåòîâûé

3

Æåëòûé

Áåëûé

Âûâîä ïèêñåëà - ôóíêöèÿ 0Ch

Использование функций BIOS для создания изображений, в частности для отображения отдельных пикселов, хотя и медленнее, чем прямая запись в видеопамять и программирование регистров, но более надежно с точки зрения совместимости для различных режимов и видеоадаптеров.

Функция используется в графических режимах для записи пиксела заданного цвета в любую страницу видеопамяти. Необходимо отметить, что у видеоадаптера CGA в графических режимах определена только одна страница видеопамяти.

Формат вызова функции 0Ch представлен ниже:

Íà âõîäå:

AH

0Ch

 

AL

Íîìåð öâåòà (çíà÷åíèå ÿ÷åéêè âèäåîïàìÿòè, ñîîòâåòñòâóþùåå ïèêñåëó)

 

BH

Íîìåð ñòðàíèöû (äëÿ âèäåîàäàïòåðà CGA íå èñïîëüçóåòñÿ)

 

CX

Êîîðäèíàòà X ïèêñåëà

 

DX

Êîîðäèíàòà Y ïèêñåëà

Íà âûõîäå:

 

Íå èñïîëüçóþòñÿ

Во всех режимах (кроме режима номер 13h) если бит D7 регистра AL содержит единицу, то новый пиксел накладывается на текущее содержимое экрана по логике булевой операции ИСКЛЮЧАЮЩЕЕ ИЛИ.

Номера цветов, которые можно использовать в различных режимах, перечислены в таблице, приведенной ниже. Цвета, соответствующие номерам цветов в таблице можно посмотреть в главе "Режимы работы видеоадаптеров".

Íîìåð ðåæèìà

Èñïîëüçóåìûå íîìåðà öâåòîâ

4, 5

0 - 3

6

0 è 1

0Dh

0 - 15

0Eh

0 - 15

0Fh

0 è 1

10h

0 - 15

Начало системы координат находится в левом верхнем углу экрана. Оси координат направлены следующим образом: ось X - вправо, ось Y - вниз. Далее, если особо не оговорено, мы всегда будем использовать эту систему координат.

Программа, представленная в листинге 5.2, демонстрирует использование функций выбора цветовой палитры и вывода пиксела.

Ëèñòèíã 5.2. Ôàéë BIOS_C.C

#include <dos.h>
#include <stdio.h>
#include <conio.h>

void main(void);

void main(void) {

union REGS inregs, outregs;
unsigned char i, j;

// Óñòàíàâëèâàåì ðåæèì 4 âèäåîàäàïòåðà
// (ãðàôè÷åñêèé - 320õ200 ïèêñåëîâ, 4 öâåòà)
inregs.h.ah = 0x0;
inregs.h.al = 0x4;

int86( 0x10, &inregs, &outregs );

// Óñòàíàâëèâàåì öâåò ôîíà

inregs.h.ah = 0x0B;
inregs.h.bh = 0x0; // óñòàíàâëèâàåì öâåò ôîíà
inregs.h.bl = 0x6; // íîìåð óñòàíàâëèâàåìîãî öâåòà ôîíà

int86( 0x10, &inregs, &outregs );

for(i = 0; i < 2; i++) {

// Óñòàíàâëèâàåì öâåòîâóþ ïàëèòðó
inregs.h.ah = 0x0B;
inregs.h.bh = 0x1; // óñòàíîâêà ïàëèòðû
inregs.h.bl = i; // íîìåð ïàëèòðû

int86( 0x10, &inregs, &outregs );

// Âûâîäèì ìàññèâ òî÷åê
for(j = 0; j < 64; j++) {

inregs.h.ah = 0x0C;

// Íîìåð öâåòà
inregs.h.al = (unsigned char)(j / 16);

// X-êîîðäèíàòà òî÷êè
inregs.x.cx = 0x10 + j;
// Y-êîîðäèíàòà òî÷êè
inregs.x.dx = 0x10 + j;

int86( 0x10, &inregs, &outregs );
}
getch();
}
}

×òåíèå ïèêñåëà - ôóíêöèÿ 0Dh

Функция позволяет определить цвет любого пиксела экрана по его координатам. Функция используется только в графических режимах работы видеоадаптеров.

Íà âõîäå:

AH

0Dh

 

BH

Íîìåð ñòðàíèöû (äëÿ âèäåîàäàïòåðà CGA íå èñïîëüçóåòñÿ)

 

CX

Êîîðäèíàòà X ïèêñåëà

 

DX

Êîîðäèíàòà Y ïèêñåëà

Íà âûõîäå:

 

AL = íîìåð öâåòà ïèêñåëà

Приведем фрагмент программы, который определяет номер цвета пиксела, имеющего координаты x_pos и y_pos:

mov ah,0Dh
mov cx,x_pos
mov dx,y_pos
int 10h

; Ñîõðàíÿåì ïîëó÷åííóþ âåëè÷èíó
mov color_number

Çàïèñü ñèìâîëà â ðåæèìå òåëåòàéïà - ôóíêöèÿ 0Eh

Функция обеспечивает запись символа на экран в режиме телетайпа: символ отображается в текущей позиции курсора, после чего курсор сдвигается вправо на одну позицию. При необходимости курсор автоматически перемещается на новую строку, а когда весь экран заполняется, происходит вертикальная свертка экрана. В последнем случае верхняя строка экрана исчезает, а снизу возникает новая пустая строка и курсор помещается в ее начало. В текстовых режимах цветовые атрибуты строк, возникающих из-за свертки экрана соответствуют атрибутам отображаемых символов.

Данная функция обрабатывает следующие управляющие символы: звуковой сигнал (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

Îïðåäåëåíèå òåêóùåãî ðåæèìà ðàáîòû âèäåîàäàïòåðà - ôóíêöèÿ 0Fh

Функция позволяет определить номер текущего режима работы видеоадаптера, номер активной страницы и количество символов в строке экрана. Список различных режимов приведен в таблице 3.1. Формат функции имеет следующий вид:

Íà âõîäå:

AH

0Fh

Íà âûõîäå:

AH

Êîëè÷åñòâî ñèìâîëîâ â ñòðîêå

 

AL

Íîìåð òåêóùåãî ðåæèìà

 

BH

Íîìåð àêòèâíîé ñòðàíèöû âèäåîïàìÿòè

Бит D7 регистра AL соответствует значению бита D7 регистра AL, использованному при предыдущем выборе режима работы видеоадаптера (см. функцию 0).

Óïðàâëåíèå ðåãèñòðàìè ïàëèòðû - ôóíêöèÿ 10h

Функция 10h предоставляет возможность программирования регистров цветовой палитры, таблицы цветов (для видеоадаптеров VGA и SVGA), а также управляет некоторыми атрибутами символов. Вы можете использовать эту функцию и в текстовых и в графических режимах.

Для видеоадаптера EGA эта функция содержит четыре подфункции:

Íîìåð ïîäôóíêöèè

Íàçíà÷åíèå

0

Ïðîãðàììèðîâàíèå îäíîãî ðåãèñòðà ïàëèòðû

1

Ïðîãðàììèðîâàíèå ðåãèñòðà öâåòà ðàìêè

2

Ïðîãðàììèðîâàíèå âñåõ ðåãèñòðîâ ïàëèòðû (òàáëèöû öâåòîâ)

3

Óïðàâëåíèå àòðèáóòîì ìèãàíèÿ è àòðèáóòîì èíòåíñèâíîñòè

Видеоадаптеры VGA и SVGA дополнительно поддерживают еще 10 подфункций:

Íîìåð ïîäôóíêöèè

Íàçíà÷åíèå

7

×òåíèå ðåãèñòðà ïàëèòðû

8

×òåíèå ðåãèñòðà öâåòà ðàìêè

9

×òåíèå âñåõ ðåãèñòðîâ ïàëèòðû

10h

Ïðîãðàììèðîâàíèå ðåãèñòðà ÖÀÏ

12h

Ïðîãðàììèðîâàíèå íåñêîëüêèõ ðåãèñòðîâ ÖÀÏ

13h

Âûáîð ïîäìíîæåñòâà öâåòîâ

15h

×òåíèå ðåãèñòðà ÖÀÏ

17h

×òåíèå íåñêîëüêèõ ðåãèñòðîâ ÖÀÏ

1Ah

×òåíèå ñîñòîÿíèÿ ñòðàíèöû öâåòîâ

1Bh

Ïðåîáðàçîâàíèå ðåãèñòðîâ ÖÀÏ äëÿ ðàáîòû â ìîíîõðîìíîì ðåæèìå

Óñòàíîâêà ðåãèñòðà ïàëèòðû - ïîäôóíêöèÿ 00h

Функция выполняет запись в регистр палитры контроллера атрибутов:

Íà âõîäå:

AH

10h

 

AL

00h - óñòàíîâêà ðåãèñòðà ïàëèòðû

 

BL

Íîìåð ðåãèñòðà ïàëèòðû äëÿ çàïèñè

 

BH

Äàííûå, çàïèñûâàåìûå â ðåãèñòð ïàëèòðû

Íà âûõîäå:

 

Íå èñïîëüçóþòñÿ

Следующий фрагмент записывает в регистр палитры с номером reg_num содержимое переменной data:

mov ah,10h ; Ôóíêöèÿ 10h
xor al,al ; Ïîäôóíêöèÿ 0h
mov bl,num_reg ; Çàäàåì íîìåð ðåãèñòðà ïàëèòðû
mov bh,data ; Íîâîå çíà÷åíèå ðåãèñòðà
int 10h

Óñòàíîâêà öâåòà ðàìêè - ïîäôóíêöèÿ 01h

Функция выполняет запись значения в регистр цвета рамки контроллера атрибутов. Надо иметь в виду, что эта функция не работает в некоторых режимах видеоадаптера EGA.

Íà âõîäå:

AH

10h

 

AL

01h - óñòàíîâêà öâåòà ðàìêè

 

BH

Çíà÷åíèå, çàïèñûâàåìîå â ðåãèñòð (öâåò)

Íà âûõîäå:

 

Íå èñïîëüçóþòñÿ

Программа BORDER, приведенная в листинге 5.4, использует подфункцию 01h для изменения цвета рамки экрана.

Ëèñòèíã 5.4. Ôàéë BORDER.C

#include <dos.h>
#include <stdio.h>
#include <conio.h>

void main(void);

// Ãëàâíàÿ ôóíêöèÿ
void main(void) {

union REGS inregs, outregs;
unsigned char i;

// Ïðîáóåì 16 öâåòîâ äëÿ ðàìêè
for(i = 0; i < 16; i++) {

// Ôóíêöèÿ óïðàâëåíèÿ êîíòðîëëåðîì àòðèáóòîâ
inregs.h.ah = 0x10;

// Ïîäôóíêöèÿ óñòàíîâêè öâåòà ðàìêè
inregs.h.al = 0x1;

// Íîìåð íîâîãî öâåòà ðàìêè
inregs.h.bh = i;

int86( 0x10, &inregs, &outregs );

// Îæèäàåì íàæàòèÿ íà ëþáóþ êëàâèøó
printf("\nÄëÿ èçìåíåíèÿ öâåòà ðàìêè "
"íàæìèòå ëþáóþ êëàâèøó...");
getch();
}
}

Óñòàíîâêà âñåõ ðåãèñòðîâ ïàëèòðû - ïîäôóíêöèÿ 02h

Функция обеспечивает быстрое заполнение новыми значениями всех регистров палитры и регистра цвета рамки. Новые значения регистров должны быть записаны перед вызовом функции в таблице размером 17 байт, расположенной в оперативной памяти компьютера. Байты 0 - 15 этой таблицы содержат новые значения для регистров палитры, а байт 16 новое значение для регистра цвета рамки.

Íà âõîäå:

AH

10h

 

AL

02h - óñòàíîâêà ðåãèñòðîâ ïàëèòðû è ðåãèñòðà öâåòà ðàìêè

 

ES:DX

Àäðåñ òàáëèöû ñ íîâûìè çíà÷åíèÿìè ðåãèñòðîâ

Íà âûõîäå:

 

Íå èñïîëüçóþòñÿ

Óïðàâëåíèå àòðèáóòîì ìèãàíèÿ è àòðèáóòîì èíòåíñèâíîñòè - ïîäôóíêöèÿ 03h

Управляет битом D7 байта атрибутов символа (см. главу "Атрибуты символов"):

Íà âõîäå:

AH

10h

 

AL

03h - óïðàâëåíèå áèòîì D7 áàéòà àòðèáóòîâ

 

BL

0 - áèò D7 áàéòà àòðèáóòîâ óïðàâëÿåò èíòåíñèâíîñòüþ ôîíà ñèìâîëîâ (ñèìâîëû íå ìèãàþò),

1 - áèò D7 áàéòà àòðèáóòîâ óïðàâëÿåò ìèãàíèåì ñèìâîëîâ

Íà âûõîäå:

 

Íå èñïîëüçóþòñÿ

Функция ControlBlinkIntens, представленная листингом 5.4, иллюстрирует использование подфункции 03h для управления атрибутами символов.

Ëèñòèíã 5.4. Ôàéë CNRBLINK.C

//===========================================================
// void ControlBlinkIntens(unsigneg char blink)
// Ôóíêöèÿ óïðàâëÿåò íàçíà÷åíèåì áèòà D7 áàéòà àòðèáóòîâ
// ñèìâîëà
// Ïàðàìåòðû:
// blink - åñëè ïàðàìåòð ôóíêöèè ðàâåí íóëþ, òî áèò D7
// áóäåò îïðåäåëÿòü èíòåíñèâíîñòü ôîíà ñèìâîëà. Åñëè
// ïàðàìåòð ðàâåí åäèíèöå, òî áèò D7 óïðàâëÿåò ìèãàíèåì
// ñèìâîëà
//===========================================================
ControlBlinkIntens(unsigneg char blink) {

union REGS inregs, outregs;

// Ôóíêöèÿ óïðàâëåíèÿ êîíòðîëëåðîì àòðèáóòîâ
inregs.h.ah = 0x10;

// Ïîäôóíêöèÿ óïðàâëåíèÿ àòðèáóòîì ìèãàíèÿ/èíòåíñèâíîñòè
inregs.h.al = 0x3;

inregs.h.bl = blink;
int86( 0x10, &inregs, &outregs );
}

×òåíèå ðåãèñòðà ïàëèòðû - ïîäôóíêöèÿ 07h

Функция поддерживается только видеоадаптерами VGA и SVGA. Она позволяет прочитать содержимое любого регистра палитры:

Íà âõîäå:

AH

10h

 

AL

07h - ÷òåíèå ðåãèñòðà ïàëèòðû

 

BL

Íîìåð ðåãèñòðà ïàëèòðû (0-15)

Íà âûõîäå:

BH

Çíà÷åíèå óêàçàííîãî ðåãèñòðà ïàëèòðû

mov ah,10h
mov al,7h
mov bl,num_reg
int 10h

mov reg_value,bh

×òåíèå ðåãèñòðà öâåòà ðàìêè - ïîäôóíêöèÿ 08h

Функция поддерживается только видеоадаптерами VGA и SVGA. Позволяет прочитать содержимое регистра цвета рамки:

Íà âõîäå:

AH

10h

 

AL

08h - ÷òåíèå ðåãèñòðà öâåòà ðàìêè

Íà âûõîäå:

BH

Çíà÷åíèå ðåãèñòðà öâåòà ðàìêè

×òåíèå âñåõ ðåãèñòðîâ ïàëèòðû - ïîäôóíêöèÿ 09h

Функция позволяет прочитать значения всех регистров палитры и регистра цвета рамки. Для чтения регистров надо зарезервировать буфер в оперативной памяти размером 17 байт. После вызова функции байты 0 - 15 этого буфера будут содержать значения соответствующих регистров палитры, а байт 16 - значение регистра цвета рамки.

Íà âõîäå:

AH

10h

 

AL

9 - ÷òåíèå âñåõ ðåãèñòðîâ ïàëèòðû

 

ES:DX

Óêàçàòåëü íà áóôåð ðàçìåðîì 17 áàéò

Íà âûõîäå:

ES:DX

Óêàçàòåëü íà áóôåð, çàïîëíåííûé çíà÷åíèÿìè èç ðåãèñòðîâ ïàëèòðû è ðåãèñòðà öâåòà ðàìêè

Приведем фрагмент программы, который считывает значения всех регистров палитры и регистра цвета рамки в буфер памяти buffer:

; Îïðåäåëÿåì àäðåñ áóôåðà äëÿ çàïèñè çíà÷åíèé ðåãèñòðîâ
; ïàëèòðû è ðåãèñòðà öâåòà ðàìêè

mov ax,SEG buffer
mov es,ax
mov dx,OFFSET buffer

; Ñ÷èòûâàåì çíà÷åíèÿ âñåõ ðåãèñòðîâ ïàëèòðû è ðåãèñòðà
; öâåòà ðàìêè

mov ah,10h
mov al,9
int 10h

Óñòàíîâêà ðåãèñòðà òàáëèöû öâåòîâ (ðåãèñòðîâ ÖÀÏ) - ïîäôóíêöèÿ 10h

Функция производит запись 18-битной величины в один из 256 регистров таблицы цветов:

Íà âõîäå:

AH

10h

 

AL

10h - óñòàíîâêà ðåãèñòðà òàáëèöû öâåòîâ

 

BX

Íîìåð ðåãèñòðà òàáëèöû öâåòîâ (0-255)

 

DH

Èíòåíñèâíîñòü êðàñíîãî öâåòà (6 áèò)

 

CH

Èíòåíñèâíîñòü çåëåíîãî öâåòà (6 áèò)

 

CL

Èíòåíñèâíîñòü ñèíåãî öâåòà (6 áèò)

Íà âûõîäå:

 

Íå èñïîëüçóþòñÿ

Пример использования функции установки одного регистра таблицы цветов приведен ниже:

mov ah,10h

; Âûáèðàåì ôóíêöèþ óñòàíîâêè ðåãèñòðà öâåòîâ
mov al,ah

; Óñòàíàâëèâàåì íîìåð ðåãèñòðà òàáëèöû öâåòîâ
mov bx,num_reg

; Îïðåäåëÿåì âåëè÷èíû êðàñíîé, çåëåíîé è ñèíåé ñîñòàâëÿþùèõ
mov dh,red
mov ch,green
mov cl,blue

int 10h

Óñòàíîâêà íåñêîëüêèõ ðåãèñòðîâ òàáëèöû öâåòîâ (ðåãèñòðîâ ÖÀÏ) - ïîäôóíêöèÿ 12h

Функция производит запись 18-битной величины в несколько последовательно расположенных регистров таблицы цветов:

Íà âõîäå:

AH

10h

 

AL

12h - óñòàíîâêà íåñêîëüêèõ ðåãèñòðîâ òàáëèöû öâåòîâ

 

BX

Íîìåð ïåðâîãî ðåãèñòðà òàáëèöû öâåòîâ (0-255)

 

CX

Êîëè÷åñòâî ðåãèñòðîâ äëÿ çàïèñè (1-256)

 

ES:DX

Àäðåñ òàáëèöû öâåòîâ

Íà âûõîäå:

 

Íå èñïîëüçóþòñÿ

Таблица цветов содержит по три байта на один регистр таблицы цветов. В каждом байте значимыми являются только 6 младших бит.

Âûáîð ïîäìíîæåñòâà öâåòîâ - ïîäôóíêöèÿ 13h ???

Функция предназначена для выбора числа подмножеств цветов и выбора активного подмножества:

Íà âõîäå:

AH

10h

 

AL

13h - âûáîð ïîäìíîæåñòâà öâåòîâ

 

BL

0 - âûáîð ðåæèìà

 

BH

0 - 4 ïîäìíîæåñòâà èç 64 öâåòîâ

1 - 16 ïîäìíîæåñòâ èç 16 öâåòîâ

 

BL

1 - âûáîð àêòèâíîãî ïîäìíîæåñòâà

 

BH

Íîìåð ïîäìíîæåñòâà (0-4 èëè 0-15)

Íà âûõîäå:

 

Íå èñïîëüçóþòñÿ

Приведем фрагмент программы использующий данную функцию:

; Âûáèðàåì ðåæèì (bh = 1)
mov ah,10h
mov al,13h
xor bx,bx
inc bh
int 10h

; Óñòàíàâëèâàåì àêòèâíîå ïîäìíîæåñòâî subset_num
mov ah,10h
mov al,13h
mov bl,1
mov bh,subset_num
int 10h

×òåíèå ðåãèñòðà òàáëèöû öâåòîâ - ïîäôóíêöèÿ 15h

Функция поддерживается только для видеоадаптеров VGA и SVGA. Она выполняет чтение одного из регистров таблицы цветов:

Íà âõîäå:

AH

10h

 

AL

15h - ÷òåíèå ðåãèñòðà òàáëèöû öâåòîâ

 

BL

Íîìåð ðåãèñòðà (0-255)

Íà âûõîäå:

DH

Èíòåíñèâíîñòü êðàñíîãî öâåòà (6 áèò)

 

CH

Èíòåíñèâíîñòü çåëåíîãî öâåòà (6 áèò)

 

CL

Èíòåíñèâíîñòü ñèíåãî öâåòà (6 áèò)

Следующий пример позволяет считать значение регистра таблицы цветов с номером num_color_reg:

mov ah,10h
mov al,15h
mov bx,num_color_reg
int 10h
mov red_data,dh
mov green_data,ch
mov blue_data,cl

×òåíèå íåñêîëüêèõ ðåãèñòðîâ òàáëèöû öâåòîâ (ðåãèñòðîâ ÖÀÏ) - ïîäôóíêöèÿ 17h

Функция производит чтение 18-битовых значений из нескольких последовательно расположенных регистров таблицы цветов:

Íà âõîäå:

AH

10h

 

AL

17h - ÷òåíèå íåñêîëüêèõ ðåãèñòðîâ òàáëèöû öâåòîâ

 

BL

Íîìåð ïåðâîãî ðåãèñòðà òàáëèöû öâåòîâ (0 -255)

 

CX

Êîëè÷åñòâî ðåãèñòðîâ äëÿ ÷òåíèÿ (1-256)

 

ES:DX

Àäðåñ áóôåðà äëÿ òàáëèöû öâåòîâ

Íà âûõîäå:

ES:DX

Äàííûå ïðî÷èòàííûå èç òàáëèöû öâåòîâ

Таблица цветов содержит по три байта на один регистр таблицы цветов. В каждом байте значащими являются только младшие 6 бит.

Îïðåäåëåíèå ðåæèìà ïîäìíîæåñòâà öâåòîâ - ïîäôóíêöèÿ 1Ah ???

Возвращает количество текущих цветовых подмножеств:

Íà âõîäå:

AH

10h

 

AL

1Ah - îïðåäåëåíèå ÷èñëà öâåòîâûõ ïîäìíîæåñòâ

Íà âûõîäå:

BL

0 - èñïîëüçóþòñÿ 4 öâåòîâûõ ïîäìíîæåñòâà ïî 64 öâåòà;

1 - èñïîëüçóþòñÿ 16 öâåòîâûõ ïîäìíîæåñòâ ïî 16 öâåòîâ

 

BH

Íîìåð ïîäìíîæåñòâà, èñïîëüçóåìîãî â äàííûé ìîìåíò

 

mov ah,10h
mov al,1ah
int 10h
mov num_subset,bh

Óñòàíîâêà ïàëèòðû èç ãðàäàöèé ñåðîãî öâåòà - ïîäôóíêöèÿ 1Bh

Функция заполняет часть таблицы цветов значениями, соответствующими различным оттенкам серого цвета. Для каждого модифицируемого регистра таблицы цветов сначала читаются записанные в нем данные, а затем записываются обратно по следующему правилу: красного 30 - процентов, зеленого - 59 процентов и голубого - 11 процентов от считанного значения.

Íà âõîäå:

AH

10h

 

AL

1Bh - óñòàíîâêà ïàëèòðû èç ãðàäàöèé ñåðîãî öâåòà

 

BX

Íîìåð ïåðâîãî ðåãèñòðà òàáëèöû öâåòîâ

 

CX

Êîëè÷åñòâî ìîäèôèöèðóåìûõ ðåãèñòðîâ

Íà âûõîäå:

 

Íå èñïîëüçóþòñÿ

Следующий пример демонстрирует, как преобразовать таблицу цветов для отображения различных градаций серого цвета. Модифицируются значения регистров таблицы цветов, имеющих номера от first_num до end_num:

mov ah,10h
mov al,1Bh

; Íîìåð ïåðâîãî ìîäèôèöèðóåìîãî ðåãèñòðà
mov bx,first_num

; Íîìåð ïîñëåäíåãî ìîäèôèöèðóåìîãî ðåãèñòðà
mov cx,end_num

; Îïðåäåëÿåì ÷èñëî èçìåíÿåìûõ ðåãèñòðîâ
sub cx,bx
int 10h

Программа BIOSDAC демонстрирует использование функций BIOS для управления таблицей цветов. Исходный текст программы BIOSDAC представлен на листинге 5.5.

Ëèñòèíã 5.5. Ôàéë BIOSDAC.C

#include <conio.h>
#include <stdio.h>
#include <dos.h>
#include "sysp.h"

typedef struct _RGB_ {
unsigned char red;
unsigned char green;
unsigned char blue;
} RGB;

// Îáúÿâëåíèå ôóíêöèé
void main(void);
void SetVideoMode(unsigned char);
void SetVgaDAC(unsigned, unsigned);
void GrayScale(void);

//======================================================
// Ãëàâíàÿ ôóíêöèÿ
//======================================================
void main(void)
{
RGB color_table[256];
unsigned char i,j;
unsigned char far *ptr;
int error, x_num, y_num;
unsigned seg_table,off_table;

// Ôîðìèðóåì íîâûå çíà÷åíèÿ äëÿ òàáëèöû öâåòîâ
for(j = 0; j < 4; j++) {
for(i = 0; i < 64; i++) {
(color_table[i+j*64]).red =
(j == 0) ? i : (j == 4) ? i : 0;

(color_table[i+j*64]).green =
(j == 1) ? i : (j == 3) ? i : (j == 4) ? i : 0;

(color_table[i+j*64]).blue =
(j == 2) ? i : (j == 3) ? i : (j == 4) ? i : 0;
}
}

// Óñòàíàâëèâàåì ðåæèì íîìåð 13h
SetVideoMode(0x13);

ptr = (unsigned char far*) &color_table[0];
seg_table = FP_SEG(ptr);
off_table = FP_OFF(ptr);

// Çàãðóæàåì òàáëèöó öâåòîâ
SetVgaDAC(seg_table,off_table);

// Çàïèñûâàåì äàííûå â âèäåîïàìÿòü
ptr = (unsigned char far*) (FP_MAKE(0xA000, 0x0));

for(y_num = 0; y_num < 200; y_num++) {
for(x_num = 0; x_num < 320; x_num++) {
*ptr = (unsigned char) x_num;
ptr++;
}
}

// Îæèäàåì íàæàòèå íà êëàâèøó êëàâèàòóðû
getch();

// Ïðåîáðàçîâûâàåì äàííûå â òàáëèöå öâåòîâ ê ñåðîìó öâåòó
GrayScale();

// Îæèäàåì íàæàòèå íà êëàâèøó êëàâèàòóðû
getch();

// Óñòàíàâëèâàåì òåêñòîâûé ðåæèì
SetVideoMode(0x3);
}

//======================================================
// Ôóíêöèÿ óñòàíîâêè ðåæèìà
//======================================================
void SetVideoMode( unsigned char vmode ) {

union REGS regs;

regs.h.ah = 0x0;
regs.h.al = vmode;

int86(0x10, &regs, &regs);
}

//======================================================
// Ôóíêöèÿ çàãðóçêè òàáëèöû öâåòîâ
//======================================================
void SetVgaDAC(unsigned seg_table, unsigned off_table) {

union REGS regs;
struct SREGS segregs;

regs.x.ax = 0x1012;
regs.x.cx = 256;
regs.x.bx = 0x00;

segregs.es = seg_table;
regs.x.dx = off_table;

int86x(0x10, &regs, &regs, &segregs);
}

//======================================================
// Ôóíêöèÿ ïðåîáðàçîâàíèÿ òàáëèöû öâåòîâ â ñåðûé öâåò
//======================================================
void GrayScale( void ) {

union REGS regs;

regs.x.ax = 0x101b;
regs.x.cx = 256;
regs.x.bx = 0x00;

int86(0x10, &regs, &regs);
}

Çàãðóçêà òàáëèö çíàêîãåíåðàòîðà - ôóíêöèÿ 11h

Функция 11h прерывания 10h предназначена для загрузки в видеопамять таблиц знакогенератора (наборов символов). При помощи данной функции можно загружать как стандартные таблицы знакогенератора, так и таблицы, самостоятельно разработанные программистом. Загружается либо вся таблица, либо ее часть. Функция позволяет легко русифицировать видеоадаптер (если это не видеоадаптер CGA или Hercules).

Функция 11h имеет одиннадцать различных подфункций, перечисленных ниже:

Íîìåð ïîäôóíêöèè

Íàçíà÷åíèå

0

Çàãðóçêà òàáëèö çíàêîãåíåðàòîðà

1

Çàãðóçêà ñòàíäàðòíîãî ìîíîõðîìíîãî íàáîðà ñèìâîëîâ

2

Çàãðóçêà ñòàíäàðòíîãî íàáîðà ñèìâîëîâ âèäåîàäàïòåðà CGA

3

Âûáîð àêòèâíûõ òàáëèö çíàêîãåíåðàòîðà (EGA)

4

Çàãðóçêà ñòàíäàðòíîãî íàáîðà ñèìâîëîâ âèäåîàäàïòåðà VGA è SVGA

20h

Óñòàíîâêà âåêòîðà ïðåðûâàíèÿ 1Fh

21h

Èñïîëüçîâàíèå ãðàôè÷åñêîãî ðåæèìà äëÿ îòîáðàæåíèÿ ñèìâîëîâ ïîëüçîâàòåëÿ

22h

Èñïîëüçîâàíèå íàáîðà ñèìâîëîâ 8õ14 èç ÏÇÓ

23h

Èñïîëüçîâàíèå íàáîðà ñèìâîëîâ 8õ8 èç ÏÇÓ

24h

Èñïîëüçîâàíèå íàáîðà ñèìâîëîâ 8õ16 èç ÏÇÓ

30h

Ïîëó÷åíèå èíôîðìàöèè îá èñïîëüçóåìîì íàáîðå ñèìâîëîâ

Для подфункций 0, 1, 2, 3 и 4 установка бита D4 в регистре AL вызывает перезагрузку регистров контроллера ЭЛТ. Вновь устанавливаются значения принятые по умолчанию для регистров формы курсора и регистра высоты символа текста. Если используется эта возможность, вызов функции должен происходить сразу после выбора режима работы видеоадаптера. В противном случае вызов функции 11h может привести к непредсказуемым последствиям.

Çàãðóçêà íàáîðà ñèìâîëîâ ïîëüçîâàòåëÿ - ïîäôóíêöèÿ 00h

Функция заменяет текущий набор символов знакогенератора или его часть набором символов, определенных пользователем. Таблица знакогенератора пользователя должна быть загружена в буфер оперативной памяти до вызова функции. После вызова она может быть удалена из памяти.

Íà âõîäå:

AH

11h

 

AL

00h, 10h - çàãðóçêà íàáîðà ñèìâîëîâ ïîëüçîâàòåëÿ

 

CX

Êîëè÷åñòâî çàãðóæàåìûõ ñèìâîëîâ. Ìîæåò ïðèíèìàòü çíà÷åíèå îò 1 äî 256

 

DX

ASCII-êîä ïåðâîãî çàãðóæàåìîãî ñèìâîëà. Èñïîëüçóåòñÿ äëÿ çàãðóçêè ÷àñòè íàáîðà ñèìâîëîâ

 

BL

Íîìåð çàãðóæàåìîé òàáëèöû çíàêîãåíåðàòîðà - äëÿ âèäåîàäàïòåðà EGA äîñòóïíû òàáëèöû 0 - 3, äëÿ VGA è SVGA 0 - 7

 

BH

Êîëè÷åñòâî áàéò, îïðåäåëÿþùèõ îäèí ñèìâîë â òàáëèöå ñèìâîëîâ

 

ES:BP

Àäðåñ áóôåðà, ñîäåðæàùåãî îïðåäåëåíèå ñèìâîëîâ, çàãðóæàåìûõ â òàáëèöó çíàêîãåíåðàòîðà

Íà âûõîäå:

 

Íå èñïîëüçóþòñÿ

Çàãðóçêà íàáîðà ñèìâîëîâ èç BIOS - ïîäôóíêöèÿ 01h

Функция загружает стандартный набор символов размера 8х14 пикселов из ПЗУ BIOS во второй цветовой слой видеопамяти:

Íà âõîäå:

AH

11h

 

AL

01h, 11h - çàãðóçêà íàáîðà ñèìâîëîâ 8õ14

 

BL

Íîìåð çàãðóæàåìîé òàáëèöû çíàêîãåíåðàòîðà (äëÿ âèäåîàäàïòåðà EGA äîñòóïíû òàáëèöû 0 - 3, äëÿ VGA 0 - 7)

Íà âûõîäå:

 

Íå èñïîëüçóþòñÿ

Çàãðóçêà íàáîðà ñèìâîëîâ èç BIOS - ïîäôóíêöèÿ 02h

Функция загружает стандартный набор символов CGA размера 8х8 пикселов из ПЗУ BIOS во второй цветовой слой видеопамяти:

Íà âõîäå:

AH

11h

 

AL

02h, 12h - çàãðóçêà íàáîðà ñèìâîëîâ ðàçìåðà 8õ8 ïèêñåëîâ

 

BL

Íîìåð çàãðóæàåìîé òàáëèöû çíàêîãåíåðàòîðà (äëÿ âèäåîàäàïòåðà EGA äîñòóïíû òàáëèöû 0 - 3, äëÿ VGA 0 - 7)

Íà âûõîäå:

 

Íå èñïîëüçóþòñÿ

Âûáîð àêòèâíûõ òàáëèö çíàêîãåíåðàòîðà - ïîäôóíêöèÿ 03h

Программа через эту функцию может установить активные таблицы знакогенератора. Напомним, что видеоадаптер EGA имеет четыре таблицы, одна или две из которых могут быть активными, а VGA - восемь. Каждая таблица содержит 256 символов. Одновременно могут отображаться 512 символов. Номер используемой таблицы определяется битом D3 байта атрибутов символа.

Íà âõîäå:

AH

11h

 

AL

03h - âûáîð àêòèâíûõ òàáëèö çíàêîãåíåðàòîðà

 

BL

Âûáèðàåò àêòèâíûå òàáëèöû:

D1-D0 íîìåð òàáëèöû, èñïîëüçóåìîé, êîãäà áèò D3 àòðèáóòà ðàâåí íóëþ;

D3-D2 íîìåð òàáëèöû èñïîëüçóåìîé, êîãäà áèò D3 àòðèáóòà ðàâåí åäèíèöå;

D4 òîëüêî äëÿ VGA. Ðàñøèðåíèå äëÿ áèòîâ D0 è D1;

D5 òîëüêî äëÿ VGA. Ðàñøèðåíèå äëÿ áèòîâ D2 è D3;

D7-D6 íå èñïîëüçóþòñÿ

Íà âûõîäå:

 

Íå èñïîëüçóþòñÿ

Çàãðóçêà íàáîðà ñèìâîëîâ èç BIOS - ïîäôóíêöèÿ 04h

Функция загружает стандартный набор символов VGA размера 8х16 пикселов из ПЗУ BIOS во второй цветовой слой видеопамяти:

Íà âõîäå:

AH

11h

 

AL

04h, 14h - çàãðóçêà íàáîðà ñèìâîëîâ ðàçìåðà 8õ16 ïèêñåëîâ

 

BL

Íîìåð çàãðóæàåìîé òàáëèöû çíàêîãåíåðàòîðà (äëÿ âèäåîàäàïòåðà VGA äîñòóïíû òàáëèöû 0 - 7)

Íà âûõîäå:

 

Íå èñïîëüçóþòñÿ

Óñòàíîâêà âåêòîðà ïðåðûâàíèÿ 1Fh - ïîäôóíêöèÿ 20h

Используется в графических режимах 4, 5 и 6 (совместимых с CGA), если необходимо отображать одновременно больше 128 символов. Вектор 1Fh указывает на таблицу с дополнительными 128 символами, имеющими коды ASCII от 127 до 255. Программа должна поддерживать таблицы для дополнительных символов. Размер символов должен быть 8х8 пикселов.

Íà âõîäå:

AH

11h

 

AL

20h - óñòàíîâêà âåêòîðà ïðåðûâàíèÿ 1Fh, êîòîðûé õðàíèò àäðåñ òàáëèöû äîïîëíèòåëüíûõ ñèìâîëîâ

 

ES:BP

Àäðåñ òàáëèöû äîïîëíèòåëüíûõ ñèìâîëîâ, îïðåäåëåííîé ïîëüçîâàòåëåì

Íà âûõîäå:

 

Íå èñïîëüçóþòñÿ

Óñòàíîâêà íàáîðà ñèìâîëîâ äëÿ ãðàôè÷åñêèõ ðåæèìîâ - ïîäôóíêöèÿ 21h

Позволяет установить собственный набор символов для отображения текста в графических режимах видеоадаптера.

Íà âõîäå:

AH

11h

 

AL

21h - óñòàíîâêà âåêòîðà ïðåðûâàíèÿ 43h

 

ES:BP

Àäðåñ òàáëèöû ñèìâîëîâ, îïðåäåëåííîé ïîëüçîâàòåëåì

 

CX

Êîëè÷åñòâî áàéò, êîäèðóþùèõ îäèí ñèìâîë â òàáëèöå ñèìâîëîâ

 

BL

Êîëè÷åñòâî ñòðîê òåêñòà, îòîáðàæàåìûõ íà ýêðàíå ìîíèòîðà:

0 - êîëè÷åñòâî ñòðîê îïðåäåëÿåòñÿ ðåãèñòðîì DL;

1 - 14 ñòðîê;

2 - 25 ñòðîê;

3 - 43 ñòðîêè

 

DL

Êîëè÷åñòâî ñòðîê òåêñòà, îòîáðàæàåìûõ íà ýêðàíå. Èñïîëüçóåòñÿ òîëüêî åñëè ðåãèñòð BL ðàâåí íóëþ

Íà âûõîäå:

 

Íå èñïîëüçóþòñÿ

Óñòàíîâêà íàáîðà ñèìâîëîâ 8õ14 èç ÏÇÓ BIOS

Íà âõîäå:

AH

11h

 

AL

22h - óñòàíîâêà âåêòîðà ïðåðûâàíèÿ 43h

 

BL

Êîëè÷åñòâî ñòðîê òåêñòà, îòîáðàæàåìûõ íà ýêðàíå ìîíèòîðà:

0 - êîëè÷åñòâî ñòðîê îïðåäåëÿåòñÿ ðåãèñòðîì DL;

1 - 14 ñòðîê;

2 - 25 ñòðîê;

3 - 43 ñòðîêè

 

DL

Êîëè÷åñòâî ñòðîê òåêñòà, îòîáðàæàåìûõ íà ýêðàíå. Èñïîëüçóåòñÿ òîëüêî åñëè ðåãèñòð BL ðàâåí íóëþ

Íà âûõîäå:

 

Íå èñïîëüçóþòñÿ

Óñòàíîâêà íàáîðà ñèìâîëîâ 8õ8 èç ÏÇÓ BIOS

Íà âõîäå:

AH

11h

 

AL

23h óñòàíîâêà âåêòîðà ïðåðûâàíèÿ 43h

 

BL

Êîëè÷åñòâî ñòðîê òåêñòà, îòîáðàæàåìûõ íà ýêðàíå ìîíèòîðà:

0 - êîëè÷åñòâî ñòðîê îïðåäåëÿåòñÿ ðåãèñòðîì DL;

1 - 14 ñòðîê;

2 - 25 ñòðîê;

3 - 43 ñòðîêè

 

DL

Êîëè÷åñòâî ñòðîê òåêñòà, îòîáðàæàåìûõ íà ýêðàíå. Èñïîëüçóåòñÿ òîëüêî åñëè ðåãèñòð BL ðàâåí íóëþ

Íà âûõîäå:

 

Íå èñïîëüçóþòñÿ

Óñòàíîâêà íàáîðà ñèìâîëîâ 8õ16 èç ÏÇÓ BIOS

Íà âõîäå:

AH

11h

 

AL

24h óñòàíîâêà âåêòîðà ïðåðûâàíèÿ 43h

 

BL

Êîëè÷åñòâî ñòðîê òåêñòà, îòîáðàæàåìûõ íà ýêðàíå ìîíèòîðà:

0 - êîëè÷åñòâî ñòðîê îïðåäåëÿåòñÿ ðåãèñòðîì DL;

1 - 14 ñòðîê;

2 - 25 ñòðîê;

3 - 43 ñòðîêè

 

DL

Êîëè÷åñòâî ñòðîê òåêñòà, îòîáðàæàåìûõ íà ýêðàíå. Èñïîëüçóåòñÿ òîëüêî åñëè ðåãèñòð BL ðàâåí íóëþ

Íà âûõîäå:

 

Íå èñïîëüçóþòñÿ

Ïîëó÷åíèå èíôîðìàöèè îá èñïîëüçóåìîì íàáîðå ñèìâîëîâ - ïîäôóíêöèÿ 30h

Функция позволяет получить информацию об используемом наборе символов - высоту символа, число текстовых строк на экране и т.д.

Íà âõîäå:

AH

11h

 

AL

30h

 

BH

Òèï çàïðàøèâàåìîé èíôîðìàöèè:

0 - âåðíóòü ñîäåðæèìîå âåêòîðà INT 1Fh;

1 - âåðíóòü ñîäåðæèìîå âåêòîðà INT 43h;

2 - âåðíóòü óêàçàòåëü íà íàáîð ñèìâîëîâ ðàçìåðà 8õ14 ïèêñåëîâ, ðàñïîëîæåííûé â ÏÇÓ BIOS;

3 - âåðíóòü óêàçàòåëü íà íàáîð ñèìâîëîâ ðàçìåðà 8õ8 ïèêñåëîâ, ðàñïîëîæåííûé â ÏÇÓ BIOS;

4 - âåðíóòü óêàçàòåëü íà ñèìâîëû ñ ASCII êîäàìè îò 127 äî 255 (ðàçìåðà 8õ8 ïèêñåëîâ), ðàñïîëîæåííûå â ÏÇÓ BIOS;

5 - âåðíóòü óêàçàòåëü íà àëüòåðíàòèâíûé íàáîð ñèìâîëîâ ðàçìåðîì 9õ14 ïèêñåëîâ, ðàñïîëîæåííûé â ÏÇÓ BIOS;

6 - âåðíóòü óêàçàòåëü íà íàáîð ñèìâîëîâ ðàçìåðîì 8õ16 ïèêñåëîâ, ðàñïîëîæåííûé â ÏÇÓ BIOS;

7 - âåðíóòü óêàçàòåëü íà àëüòåðíàòèâíûé íàáîð ñèìâîëîâ ðàçìåðîì 9õ16 ïèêñåëîâ, ðàñïîëîæåííûé â ÏÇÓ BIOS

Íà âûõîäå:

CL

Âûñîòà ñèìâîëîâ â ïèêñåëàõ

 

DL

Êîëè÷åñòâî òåêñòîâûõ ñòðîê íà ýêðàíå - 1

 

ES:BP

Óêàçàòåëü íà òàáëèöó ñèìâîëîâ (çíà÷åíèå çàâèñèò îò çíà÷åíèÿ ðåãèñòðà BH)

Îïðåäåëåíèå êîíôèãóðàöèè è âûáîð ïðîãðàììû ðàñïå÷àòêè ýêðàíà - ôóíêöèÿ 12h

Функция 12h содержит девять различных подфункций:

Íîìåð ïîäôóíêöèè

Íàçíà÷åíèå

10h

Îïðåäåëåíèå êîíôèãóðàöèè âèäåîàäàïòåðà

20h

Âûáîð ïðîãðàììû ïå÷àòè ýêðàíà

30h

Âûáîð êîëè÷åñòâà ëèíèé ðàçâåðòêè â òåêñòîâîì ðåæèìå

31h

Çàïðåùåíèå çàãðóçêè ïàëèòðû öâåòîâ, ïðèíÿòîé ïî óìîë÷àíèþ

32h

Óïðàâëåíèå äîñòóïîì ê âèäåîïàìÿòè è ðåãèñòðàì âèäåîàäàïòåðà

33h

Óïðàâëåíèå ïðåîáðàçîâàíèåì ñåðîãî öâåòà

34h

Óïðàâëåíèå ýìóëÿöèåé êóðñîðà âèäåîàäàïòåðà CGA

35h

Âûáîð àêòèâíîãî ìîíèòîðà (PS/2)

36h

Ãàøåíèå ýêðàíà ìîíèòîðà

Îïðåäåëåíèå êîíôèãóðàöèè âèäåîàäàïòåðà - ïîäôóíêöèÿ 10h

Проверяет наличие видеоадаптеров EGA/VGA, а также позволяет получить данные о текущем состоянии видеоадаптера:

Íà âõîäå:

AH

12h

 

BL

10h - îïðåäåëåíèå êîíôèãóðàöèè EGA/VGA

Íà âûõîäå:

BH

Ðåæèì âèäåîàäàïòåðà óñòàíàâëèâàåìûé ïî óìîë÷àíèþ:

0 - öâåòíîé ðåæèì,

1 - ìîíîõðîìíûé ðåæèì

 

BL

Îáúåì âèäåîïàìÿòè (äëÿ âèäåîàäàïòåðà EGA):

0 - 64 Êáàéò,

1 - 128 Êáàéò,

2 - 192 Êáàéò,

3 - 256 Êáàéò

 

CH

Áèòû óïðàâëåíèÿ äîïîëíèòåëüíûì óñòðîéñòâîì

 

CL

Ïîëîæåíèå ïåðåêëþ÷àòåëåé íà ïëàòå âèäåîàäàïòåðà EGA

Если видеоадаптер, установленный на компьютере, не является видеоадаптером EGA, VGA или SVGA, то регистр BX не изменяет своего значения. Это можно использовать для проверки наличия видеоадаптеров EGA/VGA:

mov ah, 12h

; Îïðåäåëåíèå êîíôèãóðàöèè EGA/VGA
mov bl, 10h
mov bh, 55h
int 10h

; Èçìåíèëñÿ ëè ðåãèñòð BX
cmp bx, 5510h

; Åñëè íåò, òî âèäåîàäàïòåðû EGA/VGA íå îáíàðóæåíû
je ega_vga_not_found

Âûáîð ïðîãðàììû ïå÷àòè ýêðàíà - ïîäôóíêöèÿ 20h

Программа, распечатывающая содержимое экрана монитора по нажатию клавиши <Print Screen>, не работает в режиме 43 текстовых строк. Если вы желает иметь эту возможность, можете выбрать альтернативную программу печати экрана, воспользовавшись подфункцией номер 20h:

Íà âõîäå:

AH

12h

 

BL

20h - âûáîð àëüòåðíàòèâíîé ïðîãðàììû ïå÷àòè ýêðàíà ìîíèòîðà

Íà âûõîäå:

 

Íå èñïîëüçóþòñÿ

Âûáîð êîëè÷åñòâà ëèíèé ðàçâåðòêè â òåêñòîâîì ðåæèìå - ïîäôóíêöèÿ 30h

Функция используется для получения на видеоадаптере VGA текстовых режимов, внешне не отличающихся от CGA или MDA.

Íà âõîäå:

AH

12h

 

BL

30h - âûáîð ÷èñëà ëèíèé ðàçâåðòêè

 

AL

Êîëè÷åñòâî ñòðîê ðàçâåðòêè:

0 - 200 ñòðîê ðàçâåðòêè, ðàçìåð ñèìâîëà 8õ8 ïèêñåëîâ,

1 - 350 ñòðîê ðàçâåðòêè, ðàçìåð ñèìâîëà 8õ14 ïèêñåëîâ,

2 - 400 ñòðîê ðàçâåðòêè, ðàçìåð ñèìâîëà 8õ16 ïèêñåëîâ

Íà âûõîäå:

AL

12h

Функция 30h возвращает в регистре AL значение 12h, если компьютер имеет видеоадаптер VGA или SVGA. Эта особенность может использоваться для определения типа видеоадаптера.

Çàïðåùåíèå ïåðåóñòàíîâêè ïàëèòðû - ïîäôóíêöèÿ 31h

Функция применяется для предотвращения перезагрузки таблицы цветов при выполнении операции выбора режима работы видеоадаптера VGA:

Íà âõîäå:

AH

12h

 

BL

31h - çàïðåùåíèå ïåðåóñòàíîâêè ïàëèòðû

 

AL

Ðàçðåøåíèå/çàïðåùåíèå ïåðåóñòàíîâêè:

0 - ðàçðåøèòü çàãðóçêó ïàëèòðû ïðè âûïîëíåíèè îïåðàöèè âûáîðà ðåæèìà âèäåîàäàïòåðà,

1 - çàïðåòèòü çàãðóçêó ïàëèòðû ïðè âûïîëíåíèè îïåðàöèè âûáîðà ðåæèìà âèäåîàäàïòåðà

Íà âûõîäå:

AL

12h

Óïðàâëåíèå äîñòóïîì ê âèäåîàäàïòåðó - ïîäôóíêöèÿ 32h

Вызов функции позволяет запретить (разрешить) доступ к видеопамяти и регистрам адаптера VGA/SVGA.

Íà âõîäå:

AH

12h

 

BL

32h - óïðàâëåíèå äîñòóïîì ê âèäåîàäàïòåðó

 

AL

Ðàçðåøåíèå/çàïðåùåíèå äîñòóïà:

0 - ðàçðåøèòü äîñòóï,

1 - çàïðåòèòü äîñòóï

Íà âûõîäå:

AL

12h

 

Óïðàâëåíèå ïðåîáðàçîâàíèåì ñåðîãî öâåòà - ïîäôóíêöèÿ 33h

Поддерживается только видеоадаптерами VGA и SVGA. Если разрешено преобразование, то при загрузке регистров таблицы цветов (операцией выбора режима работы видеоадаптера или непосредственным вызовом функции загрузки этих регистров) происходит корректировка записываемых значений. После этого содержимое регистров будет соответствовать различным градациям серого цвета.

Íà âõîäå:

AH

12h

 

BL

33h - óïðàâëåíèå ïðåîáðàçîâàíèåì ñåðîãî öâåòà

 

AL

Ðàçðåøåíèå/çàïðåùåíèå ïðåîáðàçîâàíèÿ:

0 - ðàçðåøèòü ïðåîáðàçîâàíèå,

1 - çàïðåòèòü ïðåîáðàçîâàíèå

Íà âûõîäå:

AL

12h

Приведем фрагмент программы, использующий функцию 33h для управления преобразованием серого цвета:

enable:

; Ðàçðåøåíèå ïðåîáðàçîâàíèÿ ñîäåðæèìîãî ðåãèñòðîâ
; òàáëèöû öâåòîâ â øêàëó ãðàäàöèé ñåðîãî öâåòà
xor al,al
jmp conversion

disable:

; Çàïðåùåíèå ïðåîáðàçîâàíèÿ ñîäåðæèìîãî ðåãèñòðîâ
; òàáëèöû öâåòîâ
mov al,1

conversion:

mov ah,12h
mov bl,33h
int 10h

Ýìóëÿöèÿ êóðñîðà CGA - ïîäôóíêöèÿ 34h

Функция 34h управляет режимом эмуляции курсора CGA. При разрешении эмуляции курсора CGA, его размеры устанавливаются, исходя из того, что символы имеют высоту 8 пикселов.

Íà âõîäå:

AH

12h

 

BL

34h - óïðàâëåíèå ýìóëÿöèåé êóðñîðà CGA

 

AL

Ðàçðåøåíèå/çàïðåùåíèå ýìóëÿöèè êóðñîðà:

0 - ðàçðåøèòü ýìóëÿöèþ,

1 - çàïðåòèòü ýìóëÿöèþ

Íà âûõîäå:

AL

12h

Âûáîð àêòèâíîãî ìîíèòîðà - ïîäôóíêöèÿ 35h

Используется в системе PS/2 для переключения между видеоадаптером VGA, расположенным на системной плате компьютера, и дополнительным видеоадаптером. Функция работает даже если между видеоадаптерами существует конфликт по адресам видеопамяти или адресам портов ввода/вывода. Система PS/2 после загрузки в качестве первичного видеоадаптера использует дополнительный.

Программа, выполняющая переключение видеоадаптеров должна поддерживать 128-байтовый буфер для сохранения информации о состоянии неактивного видеоадаптера.

Íà âõîäå:

AH

12h

 

BL

35h - âûáîð àêòèâíîãî ìîíèòîðà äëÿ PS/2

 

ES:DX

Àäðåñ áóôåðà. Ðàçìåð áóôåðà äîëæåí ñîñòàâëÿòü 128 áàéò

 

AL

0 - âûêëþ÷èòü äîïîëíèòåëüíûé âèäåîàäàïòåð (äîëæíî áûòü èñïîëüçîâàíî ïðè ïåðâîì âûçîâå ôóíêöèè),

1 - âêëþ÷èòü âèäåîàäàïòåðà VGA, ðàñïîëîæåííûé íà ñèñòåìíîé ïëàòå (äîëæíî áûòü èñïîëüçîâàíî ïðè âòîðîì âûçîâå ôóíêöèè),

2 - âûêëþ÷èòü àêòèâíûé âèäåîàäàïòåð (èñïîëüçóåòñÿ â ïîñëåäóþùèõ âûçîâàõ ôóíêöèè),

3 - âêëþ÷èòü íåàêòèâíûé âèäåîàäàïòåð (èñïîëüçóåòñÿ â ïîñëåäóþùèõ âûçîâàõ ôóíêöèè)

Íà âûõîäå:

AL

12h

 

Ãàøåíèå ýêðàíà ìîíèòîðà - ïîäôóíêöèÿ 36h

Видеоадаптеры VGA и SVGA имеют возможность гашения экрана монитора:

Íà âõîäå:

AH

12h

 

BL

36h - óïðàâëåíèå ãàøåíèåì ýêðàíà ìîíèòîðà

 

AL

0 - âêëþ÷èòü îòîáðàæåíèå èíôîðìàöèè íà ýêðàíå ìîíèòîðà,

1 - ïîãàñèòü ýêðàí ìîíèòîðà

Íà âûõîäå:

AL

12h

Функция возвращает в регистре AL значение 12h, если компьютер имеет видеоадаптер VGA.

Âûâîä òåêñòîâîé ñòðîêè - ôóíêöèÿ 13h

Функция 13h предоставляет широкие возможности для вывода текстовых строк на экран монитора. В зависимости от параметров функции, можно определять атрибуты как строки в целом (атрибуты всех символов одинаковы), так и отдельных символов строки. После вывода строки на экран, курсор может либо оставаться на месте, либо переместиться в позицию за последним символом только что выведенной строки.

Данная функция обрабатывает следующие управляющие символы: звуковой сигнал (BELL), перевод курсора на одну позицию назад (BACKSPACE), возврат каретки (CARRIAGE RETURN) и перевод строки (LINEFEED).

Íà âõîäå:

AH

13h - âûâîä ñòðîêè íà ýêðàí

 

AL

Ðåæèì îòîáðàæåíèÿ ñòðîêè:

0 - êóðñîð íå ïåðåìåùàåòñÿ, àòðèáóòû ñèìâîëîâ â ñòðîêå îäèíàêîâû è îïðåäåëÿþòñÿ çíà÷åíèåì ðåãèñòðà BL,

1 - êóðñîð ïåðåìåùàåòñÿ çà êîíåö îòîáðàæàåìîé ñòðîêè, àòðèáóòû ñèìâîëîâ â ñòðîêå îäèíàêîâû è îïðåäåëÿþòñÿ çíà÷åíèåì ðåãèñòðà BL,

2 - êóðñîð íå ïåðåìåùàåòñÿ, àòðèáóòû êàæäîãî ñèìâîëà çàäàþòñÿ îòäåëüíî,

3 - êóðñîð ïåðåìåùàåòñÿ, àòðèáóòû êàæäîãî ñèìâîëà çàäàþòñÿ îòäåëüíî

 

BH

Íîìåð ñòðàíèöû âèäåîïàìÿòè

 

BL

Àòðèáóòû ñèìâîëîâ îòîáðàæàåìîãî òåêñòà. Èñïîëüçóåòñÿ åñëè ðåãèñòð AL ñîäåðæèò 0 èëè 1

 

CX

Äëèíà îòîáðàæàåìîé ñòðîêè

 

DH

Íîìåð ñòðîêè ýêðàíà, â êîòîðîé îòîáðàæàåòñÿ òåêñòîâàÿ ñòðîêà

 

DL

Ïîçèöèÿ â ñòðîêå ýêðàíà ñ êîòîðîé îòîáðàæàåòñÿ òåêñòîâàÿ ñòðîêà

 

ES:BP

Àäðåñ ñòðîêè â îïåðàòèâíîé ïàìÿòè

Íà âûõîäå:

 

Íå èñïîëüçóþòñÿ

В режимах 2 и 3 атрибуты каждого символа задаются вперемежку с самими символами строки. Сначала идет ASCII-код символа, а затем его атрибут.

×òåíèå/çàïèñü êîíôèãóðàöèè âèäåîñèñòåìû - ôóíêöèÿ 1Ah

Функция содержит две подфункции для чтения и записи текущей конфигурации видеосистемы компьютера.

Функция 1Ah реализована только для видеоадаптеров VGA и SVGA. Если после вызова функции регистр AL не содержит число 1Ah, это значит, что функция не поддерживается данным видеоадаптером и для определения конфигурации надо использовать другие способы.

×òåíèå êîíôèãóðàöèè âèäåîñèñòåìû - ïîäôóíêöèÿ 00h

При помощи этой функции можно определить конфигурацию видеосистемы компьютера:

Íà âõîäå:

AH

1Ah

 

AL

00h - ÷òåíèå êîíôèãóðàöèè âèäåîñèñòåìû

Íà âûõîäå:

AL

1Ah

 

BL

Òèï ïåðâè÷íîãî âèäåîàäàïòåðà:

0 - ìîíèòîð îòñóòñòâóåò, 1 - MDA ñ ìîíîõðîìíûì ìîíèòîðîì, 2 - CGA ñ öâåòíûì ìîíèòîðîì, 3 - EGA ñ óëó÷øåííûì öâåòíûì ìîíèòîðîì, 4 - EGA ñ öâåòíûì ìîíèòîðîì, 5 - EGA ñ ìîíîõðîìíûì ìîíèòîðîì, 6 - PGC (ïðîôåññèîíàëüíûé ãðàôè÷åñêèé êîíòðîëëåð); 7 - VGA ñ ìîíîõðîìíûì àíàëîãîâûì ìîíèòîðîì, 8 - VGA ñ öâåòíûì àíàëîãîâûì ìîíèòîðîì, 0Ah - MCGA ñ öâåòíûì öèôðîâûì ìîíèòîðîì. 0Bh - MCGA ñ ìîíîõðîìíûì àíàëîãîâûì ìîíèòîðîì, 0Ch - MCGA ñ öâåòíûì àíàëîãîâûì ìîíèòîðîì

 

BH

Òèï äîïîëíèòåëüíîãî âèäåîàäàïòåðà (ñì. ðåãèñòð BL)

Çàïèñü êîíôèãóðàöèè âèäåîñèñòåìû - ïîäôóíêöèÿ 01h

Данная функция позволяет изменить информацию о конфигурации видеосистемы компьютера:

Íà âõîäå:

AH

1Ah

 

AL

01h - çàïèñü êîíôèãóðàöèè âèäåîñèñòåìû

 

BL

Òèï ïåðâè÷íîãî âèäåîàäàïòåðà (ñì. ïîäôóíêöèþ 00h)

 

BH

Òèï äîïîëíèòåëüíîãî âèäåîàäàïòåðà (ñì. ïîäôóíêöèþ 00h)

Íà âûõîäå:

AL

1Ah

Ïîëó÷åíèå äàííûõ î ñîñòîÿíèè VGA - ôóíêöèÿ 1Bh

Функция позволяет получить различную информацию о видеоадаптере и мониторе. Программа, вызывающая данную функцию, должна зарезервировать буфер с размером 64 байта для получаемых данных.

Íà âõîäå:

AH

1Bh - ïîëó÷åíèå äàííûõ î âèäåîñèñòåìå

 

BX

00h

 

ES:DI

Àäðåñ áóôåðà äëÿ çàïèñè äàííûõ, 64 áàéòà

Íà âûõîäå:

AL

1Bh

 

ES:DI

Áóôåð çàïîëíåííûé äàííûìè (ñì. òàáëèöó íèæå)

Формат буфера представлен в следующей таблице:

Ñìåùåíèå, áàéò

Ðàçìåð

Ñîäåðæàíèå

0

Äâîéíîå ñëîâî

Àäðåñ ñòàòè÷åñêîé òàáëèöû ôóíêöèé (ñì. íèæå)

4

Áàéò

Íîìåð òåêóùåãî ðåæèìà ðàáîòû âèäåîàäàïòåðà

5

Ñëîâî

Êîëè÷åñòâî ñèìâîëîâ â ñòðîêå

7

Ñëîâî

Ðàçìåð îòîáðàæàåìîé îáëàñòè âèäåîäàííûõ (â áàéòàõ)

9

Ñëîâî

Íà÷àëüíûé àäðåñ îòîáðàæàåìîé îáëàñòè âèäåîäàííûõ

0Bh

8 ñëîâ

Ïîçèöèè êóðñîðîâ äëÿ êàæäîé èç 8 ñòðàíèö âèäåîïàìÿòè (îäíî ñëîâî íà ñòðàíèöó). Â ñòàðøåì áàéòå çàïèñàí íîìåð êîëîíêè, â ìëàäøåì áàéòå íîìåð ñòðîêè êóðñîðà

1Bh

Áàéò

Íèæíÿÿ ëèíèÿ êóðñîðà

1Ch

Áàéò

Âåðõíÿÿ ëèíèÿ êóðñîðà

1Dh

Áàéò

Íîìåð àêòèâíîé ñòðàíèöû âèäåîïàìÿòè

1Eh

Ñëîâî

Àäðåñ èíäåêñíîãî ïîðòà êîíòðîëëåðà ÝËÒ (3B4/3D4)

20h

Áàéò

Ñîñòîÿíèå ðåãèñòðà 3x8h

21h

Áàéò

Ñîñòîÿíèå ðåãèñòðà 3x9h

22h

Áàéò

Êîëè÷åñòâî òåêñòîâûõ ñòðîê íà ýêðàíå

23h

Áàéò

Âûñîòà ñèìâîëîâ òåêñòà â ïèêñåëàõ

25h

Áàéò

Êîä ïåðâè÷íîãî âèäåîàäàïòåðà (ñì. ôóíêöèþ 1Ah ïîäôóíêöèÿ 0h)

26h

Áàéò

Êîä äîïîëíèòåëüíîãî âèäåîàäàïòåðà (ñì. ôóíêöèþ 1Ah ïîäôóíêöèÿ 0h)

27h

Ñëîâî

Êîëè÷åñòâî îäíîâðåìåííî îòîáðàæàåìûõ öâåòîâ â òåêóùåì ðåæèìå

29h

Áàéò

Êîëè÷åñòâî ñòðàíèö âèäåîïàìÿòè, äîñòóïíûõ â òåêóùåì ðåæèìå

2Ah

Áàéò

Êîëè÷åñòâî ñòðîê ðàçâåðòêè â òåêóùåì ðåæèìå:

0 - 200;

1 - 350;

2 - 400;

3 - 480

2Bh

Áàéò

Íîìåð ïåðâîé òàáëèöû çíàêîãåíåðàòîðà

2Ch

Áàéò

Íîìåð âòîðîé òàáëèöû çíàêîãåíåðàòîðà

2Dh

Áàéò

Áàéò, ñîäåðæàùèé ðàçëè÷íûå äàííûå:

D0 íå èñïîëüçóåòñÿ;

D1 áèò ðàâåí åäèíèöå, åñëè ðàçðåøåíî ïðåîáðàçîâàíèå ïàëèòðû â ñåðûé öâåò;

D2 áèò ðàâåí åäèíèöå, åñëè ïîäêëþ÷åí ìîíîõðîìíûé ìîíèòîð;

D3 çàïðåùåíà ïåðåçàãðóçêà ðåãèñòðîâ ïàëèòðû ïðè âûáîðå ðåæèìà âèäåîàäàïòåðà;

D4 áèò ðàâåí åäèíèöå, åñëè ðàçðåøåíà ýìóëÿöèÿ êóðñîðà CGA;

D5 îïðåäåëÿåò íàçíà÷åíèå áèòà D3 áàéòà àòðèáóòîâ: åñëè áèò ðàâåí 1, òî îí óïðàâëÿåò ìèãàíèåì ñèìâîëà, åñëè áèò ðàâåí íóëþ, òî áèò D3 óïðàâëÿåò èíòåíñèâíîñòüþ ôîíà ñèìâîëà;

D7-D6 íå èñïîëüçóåòñÿ

2Eh

Áàéò

Çàðåçåðâèðîâàíî

2Fh

Áàéò

Çàðåçåðâèðîâàíî

31h

Áàéò

Îáúåì âèäåîïàìÿòè àäàïòåðà:

0 - 64 Êáàéò,

1 - 128 Êáàéò,

2 - 192 Êáàéò,

3 - 256 Êáàéò

32h

Áàéò

Ñîñòîÿíèå îáëàñòè ñîõðàíåíèÿ: ???

D0 áèò ðàâåí åäèíèöå, åñëè èñïîëüçóåòñÿ íàáîð èç 512 ñèìâîëîâ;

D1 áèò ðàâåí åäèíèöå, åñëè èñïîëüçóåòñÿ îáëàñòü ñîõðàíåíèÿ öâåòîâîé ïàëèòðû;

D2 áèò ðàâåí åäèíèöå, åñëè èñïîëüçóåòñÿ òåêñòîâûé íàáîð ñèìâîëîâ ïîëüçîâàòåëÿ;

D3 áèò ðàâåí åäèíèöå, åñëè èñïîëüçóåòñÿ ãðàôè÷åñêèé íàáîð ñèìâîëîâ ïîëüçîâàòåëÿ;

D4 áèò ðàâåí åäèíèöå, åñëè èñïîëüçóåòñÿ öâåòîâàÿ ïàëèòðà, îïðåäåëåííàÿ ïîëüçîâàòåëåì;

D7-D5 çàðåçåðâèðîâàíî

33h - 3Fh

 

Çàðåçåðâèðîâàíî

Далее следует описание статической функциональной таблицы:

Ñìåùåíèå, áàéò

Ðàçìåð

Ñîäåðæàíèå

0

Áàéò

Òàáëèöà ðåæèìîâ ðàáîòû âèäåîàäàïòåðà. Åñëè áèò ðàâåí åäèíèöå, òî ðåæèì ïîääåðæèâàåòñÿ:

D0 Ðåæèì 00h;

D1 ðåæèì 01h;

D2 ðåæèì 02h;

D3 ðåæèì 03h;

D4 ðåæèì 04h;

D5 ðåæèì 05h;

D6 ðåæèì 06h;

D7 ðåæèì 07h

1

Áàéò

D0 Ðåæèì 08h;

D1 ðåæèì 09h;

D2 ðåæèì 0Ah;

D3 ðåæèì 0Bh;

D4 ðåæèì 0Ch;

D5 ðåæèì 0Dh;

D6 ðåæèì 0Eh;

D7 ðåæèì 0Fh

2

Áàéò

D0 Ðåæèì 10h;

D1 ðåæèì 11h;

D2 ðåæèì 12h;

D3 ðåæèì 13h;

D7-D4 Íå èñïîëüçóþòñÿ

3

4 áàéòà

Çàðåçåðâèðîâàíî

7

Áàéò

Êîëè÷åñòâî ñòðîê ðàñòðà â òåêñòîâûõ ðåæèìàõ. Åñëè áèò ðàâåí åäèíèöå, òî ðåæèì ïîääåðæèâàåòñÿ:

D0 200 ñòðîê ðàñòðà;

D1 350 ñòðîê ðàñòðà;

D2 400 ñòðîê ðàñòðà;

D7-D3 íå èñïîëüçóþòñÿ

8

Áàéò

Êîëè÷åñòâî òàáëèö çíàêîãåíåðàòîðà, êîòîðûå ìîæíî îäíîâðåìåííî èñïîëüçîâàòü (äëÿ òåêñòîâûõ ðåæèìîâ)

9

Áàéò

Êîëè÷åñòâî òàáëèö çíàêîãåíåðàòîðà, äîñòóïíûõ â òåêñòîâîì ðåæèìå

0Ah

Áàéò

Áèòû èìåþò ðàçëè÷íîå íàçíà÷åíèå: ???

D0 íå èñïîëüçóåòñÿ;

D1 ïîääåðæèâàåòñÿ ïðåîáðàçîâàíèå òàáëèöû öâåòîâ â ñåðûå öâåòà;

D2 ïîääåðæèâàåòñÿ çàãðóçêà øðèôòîâ ïîëüçîâàòåëÿ;

D3 ïîääåðæèâàåòñÿ çàãðóçêà öâåòîâîé ïàëèòðû ïî óìîë÷àíèþ;

D4 ïîääåðæèâàåòñÿ ýìóëÿöèÿ êóðñîðà CGA;

D5 ïðèñóòñòâóåò ïàëèòðà EGA;

D6 ïðèñóòñòâóåò òàáëèöà öâåòîâ;

D7 ïîääåðæèâàåòñÿ ôóíêöèÿ âûáîðà ìíîæåñòâà öâåòîâ

0Bh

Áàéò

Áèòû èìåþò ðàçëè÷íîå íàçíà÷åíèå: ???

D0 ïîääåðæèâàåòñÿ ñâåòîâîå ïåðî;

D1 ñîõðàíåíèå/âîññòàíîâëåíèå âèäåîñîñòîÿíèé, ïîääåðæèâàåòñÿ ôóíêöèÿ 1Ch;

D2 óïðàâëåíèå áèòîì D3 áàéòà àòðèáóòîâ;

D3 êîä êîíôèãóðàöèè ìîíèòîðà

D7-D4 íå èñïîëüçóþòñÿ

0Ch

2 áàéòà

Çàðåçåðâèðîâàíî

0Eh

Áàéò

Ñîñòîÿíèå óêàçàòåëÿ: ???

D0 áèò ðàâåí åäèíèöå, åñëè ïîääåðæèâàåòñÿ íàáîð èç 512 ñèìâîëîâ

D1 áèò ðàâåí åäèíèöå, åñëè ïîääåðæèâàåòñÿ îáëàñòü ñîõðàíåíèÿ öâåòîâîé ïàëèòðû

D2 áèò ðàâåí åäèíèöå, åñëè ïîääåðæèâàåòñÿ òåêñòîâûé íàáîð ñèìâîëîâ ïîëüçîâàòåëÿ

D3 áèò ðàâåí åäèíèöå, åñëè ïîääåðæèâàåòñÿ ãðàôè÷åñêèé íàáîð ñèìâîëîâ ïîëüçîâàòåëÿ

D4 áèò ðàâåí åäèíèöå, åñëè ïîääåðæèâàåòñÿ öâåòîâàÿ ïàëèòðà, îïðåäåëåííàÿ ïîëüçîâàòåëåì

D7-D5 çàðåçåðâèðîâàíî

0Fh

Áàéò

Çàðåçåðâèðîâàíî

Ñîõðàíåíèå/âîññòàíîâëåíèå ñîñòîÿíèÿ âèäåîàäàïòåðà - ôóíêöèÿ 1Ch

Функция имеет три подфункции, при помощи которых программа может быстро переключать режимы работы видеоадаптера:

Íîìåð ïîäôóíêöèè

Íàçíà÷åíèå

00h

Îïðåäåëåíèå ðàçìåðà áóôåðà, íåîáõîäèìîãî äëÿ ñîõðàíåíèÿ òåêóùåãî ñîñòîÿíèÿ âèäåîàäàïòåðà

01h

Ñîõðàíåíèå òåêóùåãî ñîñòîÿíèÿ âèäåîàäàïòåðà

02h

Âîññòàíîâëåíèå òåêóùåãî ñîñòîÿíèÿ âèäåîàäàïòåðà

Необходимо отметить, что данная функция поддерживается только для видеоадаптеров VGA и SVGA. Функцию можно использовать при переключении режима видеоадаптера в резидентных программах и мультизадачных системах.

Îïðåäåëåíèå ðàçìåðà áóôåðà - ïîäôóíêöèÿ 00h

Функция определяет размер буфера, необходимый для сохранения текущего состояния видеоадаптера. Буфер должен быть зарезервирован до вызова функции сохранения состояния видеоадаптера.

Íà âõîäå:

AH

1Ch

 

AL

00h - îïðåäåëåíèå ðàçìåðà áóôåðà

 

CX

Òèï äàííûõ, êîòîðûé íåîáõîäèìî ñîõðàíèòü (1 - íàäî ñîõðàíÿòü, 0 - íå íàäî ñîõðàíÿòü):

D0 - ðåãèñòðû âèäåîàäàïòåðà,

D1 - îáëàñòü ïåðåìåííûõ BIOS,

D2 - òàáëèöà öâåòîâ (ðåãèñòðû ÖÀÏ)

Íà âõîäå:

AL

1Ch

 

BX

Ðàçìåð áóôåðà â 64-áàéòíûõ áëîêàõ

Ñîõðàíåíèå òåêóùåãî ñîñòîÿíèÿ âèäåîàäàïòåðà - ïîäôóíêöèÿ 01h

Функция записывает данные состояния видеоадаптера в буфер, размер которого определяется подфункцией 00h.

Íà âõîäå:

AH

1Ch

 

AL

01h - ñîõðàíåíèå ñîñòîÿíèÿ âèäåîàäàïòåðà

 

CX

Òèï äàííûõ, êîòîðûé íåîáõîäèìî ñîõðàíèòü:

D0 - ðåãèñòðû âèäåîàäàïòåðà,

D1 - îáëàñòü ïåðåìåííûõ BIOS,

D2 - òàáëèöà öâåòîâ (ðåãèñòðû ÖÀÏ)

 

ES:BX

Àäðåñ áóôåðà äëÿ ñîõðàíÿåìûõ äàííûõ

Íà âûõîäå:

AL

1Ch

Âîññòàíîâëåíèå òåêóùåãî ñîñòîÿíèÿ âèäåîàäàïòåðà - ïîäôóíêöèÿ 02h

Функция восстанавливает состояние видеоадаптера из буфера, заполненного подфункцией 01h.

Íà âõîäå:

AH

1Ch

 

AL

02h - âîññòàíîâëåíèå ñîñòîÿíèÿ âèäåîàäàïòåðà

 

CX

Òèï âîññòàíàâëèâàåìûõ äàííûõ:

D0 - ðåãèñòðû âèäåîàäàïòåðà,

D1 - îáëàñòü ïåðåìåííûõ BIOS,

D2 - òàáëèöà öâåòîâ (ðåãèñòðû ÖÀÏ)

 

ES:BX

Àäðåñ áóôåðà äàííûõ ñîñòîÿíèÿ âèäåîàäàïòåðà

Íà âûõîäå:

AL

1Ch