Справочник программиста на персональном компьютере фирмы IBM. Системные ресурсы
Страница 7. Определение числа и типа периферийных устройств


 

1.1.6 Определение числа и типа периферийных устройств.

При старте ROM-BIOS проверяет присоединенное оборудование,
сообщая о результатах своей проверки в регистр статуса. Этот
регистр занимает два байта, начиная с 0040:0010. Нижеприведенные
значения битов относятся ко всем машинам, пока не оговорено об-
ратное:
бит 0 если 1, то присутствует НГМД
1 XT,AT:1 = есть мат. сопроцессор (PC,PCjr:не использ.)
2-3 11 = базовая память 64K (AT:не используется)
4-5 Активный видеоадаптер (11 = монохромный,
10 = цветной 80*25, 01 = цветной 40*25)
6-7 число НГМД (если бит 0 = 1)
8 PCjr:0 = есть DMA (PC,XT,AT:не используется)
9-11 число адаптеров коммуникации
12 1 = есть игровой порт (AT:не используется)
13 PCjr:есть серийный принтер (PC,XT,AT:не использ.)
14-15 число присоединенных принтеров
Большая часть информация расшифровывается примитивно. Но обра-
тите внимание, что информация о дисковых накопителях распределена
между битами 0 и 6-7. Значение 0 в битах 6-7 указывает, что име-
ется один дисковый накопитель; чтобы узнать об отсутствии накопи-
телей надо проверить бит 0.
Число портов коммуникации может быть получено из области дан-
ных BIOS. BIOS отводит четыре 2-байтных поля для хранения базовых
адресов вплоть до четырех COM портов (MS DOS использует только
два из них). Базовый адрес - это младший из адресов портов, отно-
сящихся к группе портов, имеющих доступ к данному каналу коммуни-
кации. Эти четыре поля начинаются с адреса 0040:0008. Порту COM1
соответствует адрес :0008, а COM2 - 000A. Если это поле содержит
0, то соответствующий порт отсутствует. Таким образом, если слово
по адресу :0008 отлично от нуля, а по адресу 000A - нулевое, то
имеется один порт коммуникации.
AT хранит информацию о периферии в регистре 14H микросхемы
конфигурации. Сначала запишите 14H в порт с адресом 70H, а затем
прочитайте содержимое регистра через порт 71H. Вот значение битов
этого регистра:
биты 7-6 00 = 1 НГМД, 01 = 2 НГМД
5-4 01 = вывод на цветной дисплей, 40 строк
10 = вывод на цветной дисплей, 80 строк
11 = вывод на монохромный дисплей
3-2 не используется
1 1 = имеется мат. сопроцессор
0 0 = нет НГМД, 1 = имеется НГМД

Высокий уровень.

В Бейсике нужно просто прочитать байты статуса из области
данных BIOS. В приложении Б объяснено выполнение битовых операций
в Бейсике. В приведенном примере проверка наличия дисковых нако-
пителей достигается проверкой четности младшего байта статусного
регистра (четный - нет накопителей).
100 DEF SEG = 0 'указывыаем на дно памяти
110 X = PEEK(&H410) 'получаем младший байт регистра
120 IF X MOD 2 = 0 THEN 140 'он четный - нет накопителей
130 PRINT "Имеется диск" 'иначе имеется накопитель
140 GOTO 160 'идем ко второму сообщению
150 PRINT "Нет накопителей" 'второе сообщение
160 ... 'продолжаем...
Проверка наличия COM1:
100 DEF SEG = 40H 'указываем на область данных BIOS
110 PORT = PEEK(0) + 256*PEEK(1) 'получаем слово со смещением 0
120 IF PORT = 0 THEN... '... то нет адаптера COM1
Средний уровень.
Прерывание 11H BIOS возвращает байт статуса оборудования в AX.
На входе ничего подавать не надо. В примере определяется число
дисковых накопителей.
; ---получение числа дисковых накопителей:
INT 11H ;получаем байт статуса
TEST AL,0 ;имеются накопители?
JZ NO_DRIVES ;переход, если нет
AND AL,1100000B ;выделяем биты 5-6
MOV CL,5 ;подготовка к сдвигу регистра
SHR AL,CL ;сдвиг вправо на 5 битов
INC AL ;добавляем 1, т.к. отсчет идет с 1

Низкий уровень.

Ассемблерная программа работает так же, как и программа на
Бейсике. В примере читается информация о конфигурации для AT,
определяя установлен ли математический сопроцессор:
MOV AL,14H ;номер регистра
OUT 70H,AL ;посылаем запрос
IN AL,71H ;читаем регистр
TEST AL,10B ;проверяем бит 1
JZ NO_COPROCESSOR ;если не установлен, то сопроцессора нет

 
« Предыдущая статья   Следующая статья »