9. Дополнительные средства BIOS для управления EGA и VGA

В этой главе описаны остальные функции BIOS, которые реализованы только на видеоадаптерах EGA и VGA. Так же, как и в предыдущей главе, использование каждой группы функций иллюстрируется соответствующими примерами программ.

9.1. Управление регистрами палитры - функция 10h

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

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

Номер подфункции Назначение
0 программирование одного регистра палитры
1 программирование регистра цвета рамки
2 программирование всех регистров палитры (таблицы цветов)
3 управление атрибутом мигания и атрибутом интенсивности

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

Номер подфункции Назначение
7 чтение одного регистра палитры
8 чтение регистра цвета рамки
9 чтение всех регистров палитры
10h программирование одного регистра ЦАП
12h прграммирование нескольких регистров ЦАП
13h выбор подмножества цветов
15h чтение одного регистра ЦАП
17h чтение несколььких регистров ЦАП
1Ah чтение состояния страницы цветов
1Bh преобразование регистров ЦАП для работы в монохромном режиме

Установка одного регистра палитры - подфункция 00h

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

На входе:   AH = 10h - функция 10h;
            AL = 00h - установка регистра палитры;
            BL = номер регистра палитры (0-Fh);
            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 = значение, записываемое в регистр (цвет).
На выходе:  Не используются.

Пример, приведенный ниже, использует подфункцию 01h для изменения цвета рамки экрана:

#include <dos.h>
#include <stdio.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 );

      // ожидаем нажатия на любую клавишу

      getch();
   }
}

Установка всех регистров палитры - подфункция 02h

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

На входе:   AH = 10h;
            AL = 02h - установка регистров палитры и
                 регистра цвета рамки;
            ES:DX = адрес таблицы с новыми значениями
                 регистров.
На выходе:  Не используются.

Управление атрибутом мигания и атрибутом интенсивности - подфункция 03h

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

На входе:   AH = 10h;
            AL = 03h - управление битом D7 байта атрибутов;
            BL = 0 - бит D7 управляет интенсивностью фона,
                 1 - бит D7 управляет миганием символа.
На выходе:  Не используются.
/**
*.Name         ControlBlinkIntens
*.Title        Управление атрибутом мигания/интенсивности
*
*.Descr        Эта функция управляет назначением бита D7 байта 
*              атрибутов символа. 
*
*.Proto        void ControlBlinkIntens(unsigneg char  blink)
*
*.Params       unsigneg char  blink - если параметр функции
*         равен нулю, то бит D7 будет определять
*         интенсивность фона символа. Если параметр равен
*         единице, то бит D7 управляет миганием символа.
*
*.Return       Не определено.
**/

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. Она позволяет прочитать содержимое любого регистра палитры:

На входе:   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. Позволяет прочитать содержимое регистра цвета рамки:

На входе:   AH = 10h;
            AL = 08h - чтение регистра цвета рамки.
На выходе:  BH = содержимое регистра цвета рамки.

Чтение всех регистров палитры - подфункция 09h

Для видеоадаптера VGA данная функция позволяет прочитать значения всех регистров палитры и регистра цвета рамки. Для чтения регистров надо зарезервировать участок памяти (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 цветов;
            BH = 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. Она выполняет чтение одного из регистров таблицы цветов:

На входе:   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 = номер первого регистра таблицы цветов (0
                 -255);
            CX =  число модифицируемых регистров (1-256).
На выходе:  Не используются.

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

   mov   ah,10h
   mov   al,1Bh
   mov   bx,first_num   ; номер первого модифицируемого регистра
   mov   cx,end_num   ; номер последнего модифицируемого регистра
   sub   cx,bx      ; определяем число изменяемых регистров
   int   10h

9.2. Загрузка таблиц знакогенератора - функция 11h

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

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

Номер подфункции Назначение
00 загрузка самостоятельно разработанных таблиц знакогенератора
01 загрузка стандартного монохромного набора символов
02 загрузка стандартного набора символов видеоадаптера CGA
03 выбор активных таблиц знакогенератора (EGA)
04 загрузка стандартного набора символов видеоадаптера VGA
20h установка вектора прерывания 1Fh
21h использование графического режима для отображения символов пользователя
22h использование набора символов 8х14 из ПЗУ
23h использование набора символов 8х8 из ПЗУ
24h использование набора символов 8х16 из ПЗУ
30h получение информации об используемом наборе символов

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

Загрузка набора символов пользователя - подфункция 00h

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

На входе:   AH = 11h;
            AL = 00h, 10h - загрузка набора символов
                 пользователя;
            ES:BP =   адрес таблицы с новым набором символов;
            CX = число загружаемых символов (1-256);
            DX = смещение в таблице знакогенератора
                 (0-255), используется для загрузки части
                 набора символов;
            BL = номер загружаемой таблицы знакогенератора
                 - для EGA 0-3, для VGA 0-7;
            BH = число байт отводимых на символ в таблице
                 символов (1-32);
На выходе:  Не используются.

Загрузка монохромного набора символов - подфункция 01h

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

На входе:   AH = 11h;
            AL = 01h, 11h - загрузка монохромного набора
                 символов ;
            BL = номер загружаемой таблицы знакогенератора       (для EGA 0-4, для VGA 0-7).
На выходе:  Не используются.

Загрузка стандартного набора символов видеоадаптера CGA - подфункция 02h

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

На входе:   AH = 11h;
            AL = 02h, 12h - загрузка набора символов CGA;
            BL = номер загружаемой таблицы знакогенератора
                 (для EGA 0-4, для VGA 0-7);
На выходе:  Не используются.

Выбор активных таблиц знакогенератора (EGA) - подфункция 03h

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

На входе:   AH = 11h;
            AL = 03h - выбор активных таблиц
                 знакогенератора;
            BL     выбирает активные таблицы:
            D1-D0  номер таблицы, используемой, когда бит D3
                   атрибута равен нулю;
            D3-D2  номер таблицы используемой, когда бит D3 
                   атрибута равен единице;
            D4     только для VGA расширение для битов D0 и D1
            D5     только для VGA расширение для битов D2 и D3
            D7-D6  не используются.
На выходе:  Не используются.

Загрузка стандартного набора символов видеоадаптера VGA - подфункция 04h

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

На входе:   AH = 11h;
            AL = 04h, 14h - загрузка набора символов CGA;
            BL = номер загружаемой таблицы знакогенератора   (0-7).
На выходе:  Не используются.

Установка вектора прерывания 1Fh - подфункция 20h

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

На входе:   AH = 11h;
            AL = 20h - установка вектора прерывания 1Fh,
                 который хранит адрес таблицы
                 дополнительных символов;
            ES:BP - адрес таблицы дополнительных символов.
На выходе:  Не используются.

Использование графического режима для отображения символов пользователя - подфункция 21h

Позволяет программе отображать на экране одновременно графику и текст. Адаптер переходит в графический режим и вектор прервания 43h устанавливается так, что используется таблица знакогенератора пользователя.

В таком режиме может отображаться до 43 строк текста на экране. (Для этого необходим улучшенный цветной дисплей.)

На входе:   AH = 11h;
            AL = 21h - установка вектора прерывания 43h;
            ES:BP = адрес таблицы символов;
            CX = количество байт, кодирующих один символ в
                 таблице символов;
            BL = количество отображаемых на экране строк
                 текста:
                   1   -   14 строк,
                   2   -   25 строк,
                   3   -   43 строки,
                   0   -   число строк содержится в регистре DL.
На выходе:  Не используются.

Использование набора символов 8х14 из ПЗУ

На входе:   AH = 11h;
            AL = 22h установка вектора прерывания 43h;
            BL = количество отображаемых строк текста:
                   1   -   14 строк,
                   2   -   25 строк.
На выходе:  Не используются.

Использование набора символов 8х8 из ПЗУ

На входе:   AH = 11h;
            AL = 23h установка вектора прерывания 43h;
            BL = количество отображаемых строк текста:
                   2   -   25 строк,
                   3   -   43 строки.
На выходе:   Не используются.

Использование набора символов 8х16 из ПЗУ

На входе:   AH = 11h;
            AL = 24h установка вектора прерывания 43h;
            BL = количество отображаемых строк текста:
                   1   -   14 строк,
                   2   -   25 строк,
                   3   -   43 строки.
На выходе:  Не используются.

Получение информации об используемом наборе символов - подфункция 30h

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

На входе:   AH = 11h;
            AL = 30h;
            BH = вид запрашиваемой информации:
                0 - вернуть содержимое вектора INT 1Fh,
                1 - вернуть содержимое вектора INT 43h,
                2 - вернуть указатель на набор символов
                    8х14 пикселов,
                3 - вернуть указатель на набор символов 
                    8х8 пикселов,
                4 - вернуть указатель на символы с ASCII
                    кодами от 127 до 255 (8х8 пикселов),
                5 - вернуть указатель на альтернативный
                    набор символов размером 9х14 пикселов
                6 - вернуть указатель на альтернативный
                    набор символов размером 8х16 пикселов
                7 - вернуть указатель на альтернативный
                    набор символов размером 9х16 пикселов.
На выходе:  CL = высота символов в пикселах;
            DL = число текстовых строк на экране - 1;
            ES:BP = указатель (смысл зависит от BH).

9.3. Определение конфигурации и выбор программы распечатки экрана - функция 12h

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

Номер подфункции Назначение
10h определение конфигурации EGA/VGA
20h выбор программы печати экрана
30h выбор количества линий развертки в текстовом режиме
31h запрещение переустановки палитры цветов
32h управление доступом к VGA
33h управление преобразованием серого цвета
34h эмуляция курсора CGA
35h выбор активного дисплея (PS/2)
36h гашение экрана (VGA)

Определение конфигурации EGA/VGA - подфункция 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, то регистр 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

Программа, распечатывающая содержимое экрана по нажатию клавиши PrtScr, не работает в режиме с 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.

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

Запрещение переустановки палитры - подфункция 31h

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

На входе:   AH = 12h;
            BL = 31h - запрещение переустановки палитры;
            AL = разрешение/запрещение переустановки:
                 0 - разрешение загрузки палитры операцией
                 выбора режима,
                 1 - запрещение загрузки палитры операцией
                 выбора режима.
На выходе:  AL = 12h.

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

Управление доступом к VGA - подфункция 32h

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

На входе:   AH = 12h;
            BL = 32h - управление доступом к VGA;
            AL = разрешение/запрещение доступа:
                 0 - разрешение доступа к VGA,
                 1 - запрещение доступа к VGA.
На выходе:  AL = 12h.

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

Управление преобразованием серого цвета - подфункция 33h

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

На входе:   AH = 12h;
            BL = 33h - управление преобразованием серого
                 цвета;
            AL = разрешение/запрещение преобразования:
                 0 - разрешение преобразования,
                 1 - запрещение преобразования.
На выходе:  AL = 12h.

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

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

   .......

enable:

   ; разрешение преобразования содержимого регистров
   ; таблицы цветов в шкалу градаций серого цвета

   xor   al,al
   jmp   conversion

disable:

   ; запрещение преобразоваания содержимого регистров
   ; таблицы цветов

   mov   al,1

conversion:   

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

   .......

Эмуляция курсора CGA - подфункция 34h

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

На входе:   AH = 12h;
            BL = 34h - управление эмуляцией курсора CGA;
            AL = разрешение/запрещение эмуляции курсора:
                 0 - разрешение эмуляции,
                 1 - запрещение эмуляции;
На выходе:  AL = 12h.

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

Выбор активного дисплея - подфункция 35h

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

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

На входе:   AH = 12h;
            BL = 35h - выбор активного дисплея для PS/2;
            ES:DX - адрес буфера (128 байт);
            AL = 0 - выключение дополнительного
                 видеоадаптера (должно быть использовано
                 при первом вызове функции),
                 1 - включение видеоадаптера VGA (должно
                 быть использовано во втором вызове
                 функции),
                 2 - выключение активного видеоадаптера
                 (используется в последующих вызовах
                 функции),
                 3 - включение неактивного видеоадаптера
                 (используется в последующих вызовах
                 функции).
На выходе:  AL = 12h.

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

Гашение экрана - подфункция 36h

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

На входе:   AH = 12h;
            BL = 36h - управление гашением экрана дисплея;
            AL =   0 - включение экрана,
                   1 - гашение экрана.
На выходе:  AL = 12h.

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

9.4. Вывод текстовой сторки - функция 13h

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

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

На входе:   AH = 13h - вывод строки на экран;
            AL = режим отображения строки:
                 0 - курсор не перемещается, атрибуты
                 символов в строке одинаковы,
                 1 - курсор перемещается, атрибуты
                 символов в строке одинаковы,
                 2 - курсор не перемещается, атрибуты
                 каждого символа задаются отдельно,
                 3 - курсор перемещается, атрибуты
                 каждого символа задаются отдельно.
            BH = номер страницы видеопамяти;
            BL = атрибут, если AL содержит 0 или 1;
            CX = длина строки;
            DH = номер строки экрана, в которой
                 отображается строка;
            DL = номер столбца экрана, в котором начинается
                 строка;
            ES:BP = адрес строки в оперативной памяти;
На выходе:  Не используются.

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

9.5. Чтение/запись конфигурации видеосистемы - функция 1Ah

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

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

Чтение конфигурации видеосистемы - подфункция 00h

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

На входе:   AH = 1Ah;
            AL = 00h - чтение конфигурации видеосистемы.
На выходе:  AL = 1Ah;
            BL = тип первичного видеоадаптера:
            BH = тип дополнительного видеоадаптера:
                 0 - дисплей отсутствует,
                 1 - MDA,
                 2 - CGA,
                 3 - EGA с улучшенным цветным дисплеем,
                 4 - EGA с цветным дисплеем,
                 5 - EGA с монохромным аналоговым дисплеем,
                 6 - PGC (профессиональный графический
                     контроллер);
                 7 - VGA с монохромным аналоговым дисплеем,
                 8 - VGA с цветным аналоговым дисплеем,
                 0Ah - MCGA с цветным цифровым дисплеем.
                 0Bh - MCGA с монохромным аналоговым
                     дисплеем,
                 0Ch - MCGA с цветным аналоговым дисплеем.

Запись конфигурации видеосистемы - подфункция 01h

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

На входе:   AH = 1Ah;
            AL = 01h - запись конфигурации видеосистемы;
            BL = тип первичного видеоадаптера (см.
                 подфункцию 00h);
            BH = тип дополнительного видеоадаптера (см.
                 подфункцию 00h).
На выходе:  AL = 1Ah.

9.6. Получение данных о состоянии VGA - функция 1Bh

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

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

На входе:   AH = 1Bh - получение данных о видеосистеме;
            BX = 00h;
            ES:DI = адрес буфера для возвращаемых данных, 
                64 байта.
На выходе:  AL = 1Bh;
            ES:DI - буфер заполняется данными (см. таблицу
                10.1).
Смещение, байты Размер Содержание
0-3 двойное слово адрес статической таблицы функций (см. ниже)
4 байт номер текущего режима работы видеоадаптера
5,6 слово число символов в строке
7,8 слово размер области видеоданных (в байтах)
9,0Ah слово начальный адрес области видеоданных
0Bh-1Ah 8 слов позиции курсоров для каждой из 8 страниц видеопамяти (одно слово на страницу)
1Bh байт верхняя линия курсора
1Ch байт нижняя линия курсора
1Dh байт номер активной страницы видеопамяти
1Eh слово адрес порта контроллера ЭЛТ (3B4/3D4)
20h байт состояние регистра 3x8h
21h байт состояние регистра 3x9h
22h байт число текстовых строк на экране
23h байт высота символов текста (в пикселах)
25h байт код первичного видеоадаптера (см. функцию 1Ah подфункция 0h)
26h байт код дополнительного видеоадаптера (см. функцию 1Ah подфункция 0h)
27h,28h слово число цветов в текущем режиме
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 не используется
31h байт объем видеопамяти:
    0 - 64К байт,
    1 - 128К байт,
    2 - 192К байт,
    3 - 256К байт;
     
32h байт состояние указателя?:
     
    D0 бит равен единице, если используется набор из 512 символов;
    D1 бит равен единице, если используется область сохранения цветовой палитры;
    D2 бит равен единице, если используется текстовый набор символов пользователя;
    D3 бит равен единице, если используется графический набор символов пользователя;
    D4 бит равен единице, если используется цветовая палитра, определенная пользователем;
    D7-D5 зарезервировано;
33h - 3Fh   зарезервировано.

Таблица 10.1 Формат буфера данных.

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

Смещение,   Размер      Содержание
байты
0-2         3 байта     Таблица поддерживаемых режимов работы
                        видеоадаптера, если бит равен единице,
                        то режим поддерживается:
                        байт 0      
                            D0 Режим 0;
                            D1 режим 1;
                            D2 режим 2;
                            D3 режим 3;
                            D4 режим 4;
                            D5 режим 5;
                            D6 режим 6;
                            D7 режим 7.
                        байт 1
                            D0 Режим 8;
                            D1 режим 9;
                            D2 режим 0Ah;
                            D3 режим 0Bh;
                            D4 режим 0Ch;
                            D5 режим 0Dh;
                            D6 режим 0Eh;
                            D7 режим 0Fh.

                        байт 2
                            D0 Режим 10h;
                            D1 режим 11h;
                            D2 режим 12h;
                            D3 режим 13h;
                            D7-D4 не используются.

7           1 байт      Возможное число линий растра;
                        если бит равен единице, то режим поддерживается:
                            D0 200 линий;
                            D1 350 линий;
                            D2 400 линий;
                            D7-D3 не используются.

8           1 байт      Число таблиц знакогенератора в текстовом режиме

9           1 байт      Максимальное число одновременно используемых таблиц знакогенератора в текством режиме

0Ah         1 байт      Биты имеют различное назначение:
                            D0 не используется;
                            D1 поддердивается преобразование 
                               таблицы цветов в серые цвета;
                            D2 поддердивается загрузка шрифтов 
                                пользователя;
                            D3 поддердивается загрузка цветовой
                               палитры по умолчанию;
                            D4 поддердивается эмуляция курсора
                               CGA;
                            D5 присутствует палитра EGA;
                            D6 присутствует таблица цветов;
                            D7 поддерживается функция выбора
                               множества цветов;

0Bh         1 байт          Биты имеют различное
                            назначение:
                            7 6 5 4 3 2 1 0
                           +-+-+-+-+-+-+-+-+
                           | | | | | | | | |
                           +-+-+-+-+-+-+-+-+
                            L-----| | | | L-- поддерживается световое перо;
                                  | | | |   
                                  | | | L---- сохранение/восстановление
                                  | | |       видеосостояний, поддерживается
                                  | | |       функция 1Ch;
                                  | | |      
                                  | | L------ управление битотм D3 байта
                                  | |         атрибутов;
                                  | |        
                                  | L-------- код конфигурации дисплея;
                                  |             
                                  L---------- не используются

0Eh      1 байт             состояние указателя?:
                            7 6 5 4 3 2 1 0
                           +-+-+-+-+-+-+-+-+
                           | | | | | | | | |
                           +-+-+-+-+-+-+-+-+
                            L---| | | | | L-- бит равен единице, если
                                | | | | |     поддерживается набор из 512
                                | | | | |     символов;
                                | | | | |
                                | | | | L---  бит равен единице, если
                                | | | |       поддерживается область сохранения
                                | | | |       цветовой палитры;
                                | | | |
                                | | | L-----  бит равен единице, если
                                | | |         поддерживается текстовый набор
                                | | |         символов пользователя;
                                | | |
                                | | L-------  бит равен единице, если
                                | |           поддерживается графический набор
                                | |           символов пользователя;
                                | |
                                | L---------  бит равен единице, если
                                |             поддерживается цветовая палитра,
                                |             определенная пользователем;
                                |
                                L------------ зарезервированно

Таблица 10.2 Формат статической функциональной таблицы.

9.7. Сохранение/восстановление состояния видеоадаптера - функция 1Ch

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

Номер       Назначение
подфункции
00h         определение размера буфура,
            необходимого для сохранения текущего
            состояния видеоадаптера
01h         сохранение текущего состояния
            видеоадаптера
02h         восстановление текущего состояния
            видеоадаптера

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

Определение размера буфера - подфункция 00h

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

На входе:   AH = 1Ch;
            AL = 00h - определение размера буфера;
            CX = тип данных, который необходимо сохранить:
                 0 - регистры видеоадаптера,
                 1 - область переменных BIOS,
                 2 - таблица цветов (регистры ЦАП).
На выходе:  AL = 1Ch;
            BX = необходимый размер буфера в 64-байтных
                 блоках.

Сохранение текущего состояния видеоадаптера - подфункция 01h

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

На входе:   AH = 1Ch;
            AL = 01h - сохранение состяния видеоадаптера;
            CX = тип данных, который необходимо сохранить:
                 0 - регистры видеоадаптера,
                 1 - область переменных BIOS,
                 2 - таблица цветов (регистры ЦАП);
            ES:BX = адрес буфера для сохраняемых данных.
На выходе:  AL = 1Ch.

Восстановление текущего состояния видеоадаптера - подфункция 02h

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

На входе:   AH = 1Ch;
            AL = 02h - восстановление состояния
                 видеоадаптера;
            CX = тип восстанавливаемых данных:
                 0 - регистры видеоадаптера,
                 1 - область переменных BIOS,
                 2 - таблица цветов (регистры ЦАП);
            ES:BX = адрес буфера данных состояния
                 видеоадаптера.
На выходе:  AL = 1Ch.