Программа дисплея BIOS имеет много функций, все они перечислены на
Фиг.9.6. В связи с тем, что видеопрограмма имеет так много
функций, она использует таблицу переходов к этим функциям. Эта
таблица названа M1 и содержит смещения каждой точки входа программы
дисплея BIOS. Первая часть программы VIDEO_IO извлекает код из
регистра AH и преобразует его в адрес перехода. Первая часть
программы выполняет еще и некоторые другие действия, включая
проверку поля EQUIP_FLAG.
Фирма IBM написала видеопрограмму BIOS так, чтобы она могла
работать с двумя дисплейными адаптерами, как с цветным графическим,
так и с монохромным. Но BIOS также подразумевает, что из них
активен только один. Это означает, что вы не сможете использовать
BIOS для того, чтобы записать символ в цветной дисплей, а затем
сразу использовать BIOS для записи символа в монохромный дисплей.
Видеопрограмма BIOS может иметь дело только с одним дисплейным
адаптером.
AH Функция
-------------------------------------------------
0 Инициализация адаптера дисплея
1 Установка размера и формы курсора
2 Установка позиции курсора
3 Чтение позиции курсора
4 Чтение позиции светового пера
5 Назначение текущей страницы
6 Сдвиг вверх
7 Сдвиг вниз
8 Чтение символа
9 Запись символа и атрибута
10 Запись одного символа
11 Выбор палитры
12 Запись точки
13 Чтение точки
14 Запись на телетайп
-------------------------------------------------
Фиг. 9.4 Функции BIOS для видеомонитора
Всякий раз, когда программа вызывает видеопрограмму BIOS, она
определяет, какой дисплейный адаптер имеется в системе с помощью
проверки битов поля EQUIP_FLAG, которые соответствуют текущему
дисплею. Если биты 5 и 4 оба равны 1, то в системе присутствует
монохромный адаптер. Любая другая установка бит говорит о том, что
в системе работает цветной адаптер. Фирма IBM написала эту
программу таким способом, исходя из того, что система может иметь
только один дисплейный адаптер. Перед первым включением машины вы
должны установить переключатели на системной плате в положение,
показывающее, какой адаптер дисплея используется.
Информация флагов оборудования в поле EQUIP_FLAG определяет,
какой из адресов буфера будет использовать видеопрограмма BIOS. Для
монохромной платы BIOS загружает в регистр ES значение 0B000H, а
для цветной платы - значение 0B800H. Это позволяет остальным
программам дисплея BIOS работать без использования информации о
том, какой адаптер работает в системе. Все ссылки к буферу делаются
относительно регистра ES.
Вы можете решить, что, поскольку поле EQUIP_FLAG показывает,
какой адаптер используется, можно переключаться от одного адаптера
к другому просто изменяя биты в слове флагов. К сожалению, это не
так, Адрес ввода-вывода контроллера 6845 отличается для двух
адаптеров, и BIOS записывает этот базовый адрес в свою область
данных. Видеопрограмма BIOS заносит в переменную ADDR_6845 этот
адрес только при инициализации адаптера (команда AH = 0). Поэтому
переключение от одного дисплея к другому также требует
корректировки этой переменной.
Даже если переменная CURSOR_POSN содержит восемь позиций, она
не может обслуживать переключение на другой дисплей. Вы должны
сбрасывать положение курсора в области данных BIOS всякий раз при
переключении с одного адаптера на другой. Если вы не сделаете
этого, изображение курсора не будет соответствовать его положению,
записанному в области данных, и символ на экране будет записываться
в неверную позицию.
Фирма IBM опубликовала методы смены одного дисплея другим, как
с помощью программы на языке ассемблера, так и с помощью программы
на Бейсике. В этих методах требуется для указания адаптера, который
вы хотите использовать, изменить переменную EQUIP_FLAG, а затем
использовать видеопрерывание INT 10H при AH = 0. Эта функция
инициализирует адаптер и обеспечивает правильную установку всех
полей данных программы BIOS. После этого BIOS может работать с тем
дисплейным адаптером, который указан. При этом картинка на другом
дисплее остается видимой. Кроме того, дисплейный буфер того
адаптера продолжает отображать любые изменения текста и графики,
занесенной в него. Так что вы можете измекнять содержимое
дисплейного буфера с помощью вашей программы (а не с помощью BIOS),
чтобы скорректировать информацию, находящуюся на экране, с которого
вы только что переключились.
Давайте рассмотрим простой пример. Вы имеете IBM PC с двумя
адаптерами - цветным графическим и монохромным, и к каждому
адаптеру подключен дисплей. Когда вы сначала включаете машину,
система использует монохромный дисплей. Именно с учетом этого вы и
должны установить переключатели на системной плате, так как
монохромный дисплей может быть поврежден, если не будет
инициализирован сразу же после включения питания. Инструкция по
работе рекомендует, чтобы вы установили переключатели в положение,
показывающее, что в системе присутствует монохромный адаптер.
После этого вы можете использовать видеопрограмму BIOS с
монохромным дисплеем. Чтобы перейти на цветной адаптер, можно
выполнить программу на Фиг.П9.7. Эта программа включает цветной
адаптер в 80-символьном текстовом режиме. Символы, которые были
высвечены на монохромном дисплее, на нем и остаются, а вы теперь
можете использовать видеопрограмму BIOS для работы с цветным
графическим дисплеем. Но если вам потребуется изменить содержимое
монохромного дисплея, вы сможете сделать это, записав новые символы
или атрибуты в буфер дисплея по адресу 0B000H. Это не изменит
положения курсора, но изменит картинку. В этом случае если вы
хотите изменять текст одновременно на цветном и монохромном
дисплеях, вы должны написать собственную программу обслуживания
монохромного дисплея. Или вы можете выяснить, какие значения надо
изменить в поле данных BIOS, чтобы курсор перешел назад, и
выполнить нужные действия, не инициализируя адаптер каждый раз.
Microsoft (R) Macro Assembler Version 5.00 1/1/80 04:06:26
Фиг. 9.7 Переключение на цветной дисплей Page 1-1
PAGE ,132
TITLE Фиг. 9.7 Переключение на цветной дисплей
0000 STACK SEGMENT STACK
0000 0040[ DW 64 DUP (?)
????
]
0080 STACK ENDS
0000 ABS0 SEGMENT AT 0
0410 ORG 410H
0410 EQUIP_FLAG LABEL BYTE ; Будет изменяться только младший
0410 ABS0 ENDS ; байт поля флагов
0000 CODE SEGMENT
ASSUME CS:CODE,DS:ABS0
COLOR PROC FAR
0000 1E PUSH DS ; Адрес возврата в ДОС
0001 2B C0 SUB AX, AX
0003 50 PUSH AX
0004 8E D8 MOV DS, AX ; Загрузка адреса сегмента ABS0 в регистр DS
0006 80 26 0410 R CF AND EQUIP_FLAG, 11001111b ; Указание на цветной дисплей как
000B 80 0E 0410 R 20 OR EQUIP_FLAG, 00100000b ; на основной (режим 80*25)
0010 B8 0003 MOV AX, 3
0013 CD 10 INT 10H ; Сброс дисплея
0015 C3 RET ; Возврат в ДОС
COLOR ENDP
0016 CODE ENDS
END
Фиг. 9.7 Переключение на цветной дисплей