Страница 7 из 20 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 ;если не установлен, то сопроцессора нет |