Страница 5 из 20 1.1.4 Определение числа и типов адаптеров дисплея. Программе может оказаться необходима информация о том, будет ли она работать в системе с монохромным адаптером, с цветной графической картой или с EGA, а также о наличии второго адаптера. В пункте [4.1.6] объяснено как передать управление от одного адаптера к другому. Байт статуса оборудования, хранящийся в об- ласти данных ROM-BIOS по адресу 0040:0010 сообщает установку переключателя 1, который показывает какая из карт активна. В принципе должны иметь значение 11 для монохромной карты, 10 - для цветной карты 80*25, 01 - для цветной карты 40*25 и 00 для EGA. Однако при наличии EGA он может установить биты отличными от 00, в зависимости от установки его собственных переключателей. Поэто- му Вы должны сначала другими средствами установить наличие EGA, а затем, если его нет, то по данным BIOS определить является ли активным цветной или монохромный адаптер. Для проверки наличия EGA надо прочитать байт по адресу 0040:0087. Если он равен 0, то EGA отсутствует. Если этот байт ненулевой, то когда бит 3=0, EGA является активным адаптером, а когда он равен 1, то активен вто- рой адаптер. Когда присутствует EGA, то проверка наличия монохромного или цветного адаптера осуществляется записью значения в регистр адре- са курсора микросхемы 6845 [4.1.1] и последующего чтения значения и проверки их на совпадение. Для монохромной карты пошлите 0FH в порт 3B4H, чтобы указать на регистр курсора, а затем прочитать и записать адрес курсора через порт 3B5H. Соответствующие порты для цветной карты 3D4H и 3D5H. Когда карта отсутствует, то порт возв- ращает значение 0FFH; но поскольку это значение может содержаться в регистре, то недостаточно простой проверки на это значение. Имеются два добавочных вопроса, на которые могут потребоваться ответы при наличии EGA: сколько имеется памяти на его карте и какой тип монитора подсоединен? Для определения типа дисплея проверьте бит 1 по адресу 0040:0087; когда он установлен, то подсоединен ммонохромный дисплей, а когда он равен нулю - цвет- ной. Если Ваша программа использует цветной графический режим с 350 строками, то надо также определить присоединен ли дисплей IRGB или R'G'B'RGB, где последняя аббревиатура соответствует улучшеному цветному дисплею IBM. Это определяется установкой четырех переключателей на карте EGA. Установка этих переключате- лей возвращается в CL при обращении к функции 12H прерывания 10H. Цепочка четырех младших битов должна быть 0110 для улучшенного цветного дисплея. Та же самая функция сообщает и наличие памяти на карте EGA. Она возвращает BL, содержащий 0 для 64K, 1 - для 128, 2 - для 192 и 3 - для полных 256K памяти дисплея. Высокий уровень. Приведенные фрагменты кода определяют тип текущего монитора и режим его работы, а также определяют какие типы видеоадаптеров имеются в машине: 100 '''определение активного адаптера 110 DEF SEG = &H40 'указываем на область данных BIOS 120 X = PEEK(&H87) 'проверка на наличие EGA 130 IF X = 0 THEN 200 'EGA отсутствует, идем дальше 140 IF X AND 8 = 0 THEN... 'активный монитор EGA . . 200 X = PEEK(&H10) 'читаем байт статуса оборудования 210 Y = X AND 48 'выделяем биты 4 и 5 220 IF Y = 48 THEN ... '... тогда монохромный (00110000) 230 IF Y = 32 THEN ... '... тогда цветной 80*25 (00100000) 240 IF Y = 16 THEN ... '... тогда цветной 40*25 (00010000) Следующий пример проверяет наличие монохромной карты, когда активной является карта EGA или цветная. Тот же пример можно использовать для проверки наличия цветной карты если использовать адреса портов &H3D4 и &H3D5. 100 '''проверка наличия монохромной карты 110 OUT &H3B4,&HF 'адрес регистра курсора 120 X = INP(&H3B5) 'чтение и сохранение значения 130 OUT &H3B5,100 'посылаем в регистр любое значение 140 IF INP(&H3B5)<>100 THEN... 'если карта есть - вернется то же 150 OUT &H3B5,X 'восстанавливаем значение регистра Низкий уровень. Приведенные примеры соответствуют примерам на Бейсике. ;--- Определение активного адаптера: MOV AX,40H ;указываем ES на область данных BIOS MOV ES,AX ; MOV AL,ES:[87H] ;проверяем наличие EGA CMP AL,0 ; JE NO_EGA ;если 0040:0087 = 0, то EGA нет TEST AL,00001000B ;EGA есть, проверяем бит 3 JNZ EGA_NOT_ACTIVE;если бит 3=1, то EGA неактивен . . EGA_NOT_ACTIVE: MOV AL,ES:[10H] ;проверяем байт статуса дисплея AND AL,00110000B ;выделяем биты 4 и 5 CMP AL,48 ;это монохромная карта? JE MONOCHROME ;переход если да Предполагая наличие монохромной карты проверим установлена ли цветная карта (неактивная): ;--- Установлена ли неактивная цветная карта? MOV DX,3D4H ;указываем на регистр адреса 6845 MOV AL,0FH ;запрашиваем регистр курсора OUT DX,AL ;указываем на регистр INC DX ;указываем на регистр данных IN AL,DX ;получаем текущее значение XCNG AH,AL ;сохраняем значение MOV AL,100 ;тестовое значение 100 OUT DX,AL ;посылаем его IN AL,DX ;считываем его снова CMP AL,100 ;сравниваем значения JNE NO_CARD ;переход если нет карты XCNG AH,AL ;иначе есть цветная карта OUT DX,AL ;тогда восстанавливаем значение |