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 |
Æåëòûé |
Áåëûé |
Использование функций 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();
}
}
Функция позволяет определить цвет любого пиксела экрана по его координатам. Функция используется только в графических режимах работы видеоадаптеров.
Íà âõîäå: |
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, ®s, ®s);
}
//======================================================
// Ôóíêöèÿ çàãðóçêè òàáëèöû öâåòîâ
//======================================================
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, ®s, ®s, &segregs);
}
//======================================================
// Ôóíêöèÿ ïðåîáðàçîâàíèÿ òàáëèöû öâåòîâ â ñåðûé öâåò
//======================================================
void GrayScale( void ) {
union REGS regs;
regs.x.ax = 0x101b;
regs.x.cx = 256;
regs.x.bx = 0x00;
int86(0x10, ®s, ®s);
}
Çàãðóçêà òàáëèö çíàêîãåíåðàòîðà - ôóíêöèÿ 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 |