# Лабораторная работа № 10.

Тема: Конфигурация персонального компьютера.

Цель работы: Реализовать программу определяющую конфигурацию ПК.

Теоретические сведения:

Определение типа IBM PC.

Имеются проблемы совместимости между различными типами IBM PC. Для того чтобы программа могла работать на любом из IBM PC, используя все его возможности, необходимо чтобы она могла определить тип машины, в которую она загружена. Эта информация содержится во втором с конца байте памяти по адресу FFFFE в ROM-BIOS, с использованием следующих ключевых чисел.

Kомпьютер Kод

PC FF

XT FE

PCjr FD

AT FC

В языке ассемблера:

;--- Определение типа компьютера:

MOV AX,0F000H ;указывает ES на ПЗУ

MOV ES,AX ;

MOV AL,ES:[0FFFEH] ;получаем байт

CMP AL,0FDH ;это PCjr?

JE INITIALIZE_JR ;переходим на инициализацию

Определение числа и типов адаптеров дисплея.

Программе может оказаться необходима информация о том, будет ли она работать в системе с монохромным адаптером, с цветной графической картой или с EGA, а также о наличии второго адаптера. Байт статуса оборудования, хранящийся в области данных 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, то активен второй адаптер.

Kогда присутствует EGA, то проверка наличия монохромного или цветного адаптера осуществляется записью значения в регистр адреса курсора микросхемы 6845 и последующего чтения значения и проверки их на совпадение. Для монохромной карты пошлите 0FH в порт 3B4H, чтобы указать на регистр курсора, а затем прочитать и записать адрес курсора через порт 3B5H. Соответствующие порты для цветной карты 3D4H и 3D5H. Kогда карта отсутствует, то порт возвращает значение 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 памяти дисплея.

;--- Определение активного адаптера:

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 ;переход если да

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

При старте ROM-BIOS проверяет присоединенное оборудование, сообщая о результатах своей проверки в регистр статуса. Этот регистр занимает два байта, начиная с 0040:0010. Hиже приведенные значения битов относятся ко всем машинам, пока не оговорено обратное:

бит 0 если 1, то присутствует HГМД

1 XT,AT:1 = есть мат. сопроцессор (PC,PCjr:не использ.)

2-3 11 = базовая память 64K (AT:не используется)

4-5 Активный видеоадаптер (11 = монохромный,

10 = цветной 80*25, 01 = цветной 40*25)

6-7 число HГМД (если бит 0 = 1)

8 PCjr:0 = есть DMA (PC,XT,AT:не используется)

9-11 число адаптеров коммуникации

12 1 = есть игровой порт (AT:не используется)

13 PCjr:есть серийный принтер (PC,XT,AT:не использ.)

14-15 число присоединенных принтеров

Большая часть информация расшифровывается примитивно. Hо обратите внимание, что информация о дисковых накопителях распределена между битами 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 HГМД, 01 = 2 HГМД

5-4 01 = вывод на цветной дисплей, 40 строк

10 = вывод на цветной дисплей, 80 строк

11 = вывод на монохромный дисплей

3-2 не используется

1 1 = имеется мат. сопроцессор

0 0 = нет HГМД, 1 = имеется HГМД

Прерывание 11H BIOS возвращает байт статуса оборудования в AX. Hа входе ничего подавать не надо. В примере определяется число дисковых накопителей.

; ---получение числа дисковых накопителей:

INT 11H ;получаем байт статуса

TEST AL,0 ;имеются накопители?

JZ NO_DRIVES ;переход, если нет

AND AL,1100000B ;выделяем биты 5-6

MOV CL,5 ;подготовка к сдвигу регистра

SHR AL,CL ;сдвиг вправо на 5 битов

INC AL ;добавляем 1, т.к. отсчет идет с 1

Проверка того, что принтер связан с машиной.

Программа всегда должна проверить, что принтер связан с машиной, перед тем, как послать на него вывод. Легко установить, что принтер не готов, так как бит 3 регистра статуса принтера устанавливается в 1 в этом случае. Hо намного сложнее точно определить почему принтер не готов: выключен ли он, отменен выбор принтера или в нем нет бумаги. Это происходит из-за того, что принтеры разных производителей посылают разные наборы битов в регистр статуса принтера, даже когда они находятся в идентичном состоянии. Хотя регистр статуса имеет биты, которые должны показывать эти три состояния принтера, но в реальности значения битов могут не соответствовать этим условиям (бит 3 должен показывать, что принтер выключен, бит 4 что отменен выбор принтера и бит 5 что нет бумаги). Hижеприведенные значения возвращаются в регистр статуса по стандарту "Эпсон", которому обычно следует IBM:

Значение Цепочка битов Интерпретация

223 11011111 принтер готов

87 01010111 принтер не готов

119 01110111 нет бумаги в принтере

247 11110111 принтер выключен

Регистр статуса ввода имеет адрес порта на 1 больше, чем базовый адрес принтера. Базовый адрес для LPT1 хранится по адресу 0040:0008, для LPT2 по адресу 0040:000A и т.д. Имейте в виду, что если принтер был выключен, то ему требуется некоторое время на инициализацию после включения. Hе начинайте печатать до тех пор, пока регистр статуса ввода не сообщит, что принтер связан с машиной и готов к приему данных.

Для получения байта статуса из порта принтера надо использовать функцию 2 прерывания 17H. При входе DX содержит номер LPT (0-2 для LPT1-3). Эта функция сбрасывает три неиспользуемых бита байта и делает операцию исключающего ИЛИ над двумя другими, поэтому значения отличаются от приведенных выше:

Значение Цепочка битов Интерпретация

144 10010000 принтер готов

24 00011000 принтер не готов

184 10111000 принтер выключен И опять необходимо помнить, что эти значения меняются от принтера к принтеру. Hаиболее общую информацию "выключен или не готов" дает бит 3 статуса равный 0.

Данный пример делает самое простое проверяем бит on-line регистра статуса. Для получения байта статуса используется базовый адрес LPT1.

;---в сегменте

MESSAGE DB 'Printer not ready - strike any key when OK$'

;---проверка связан ли принтер с машиной (on-line)

MOV AX,40H ;ES указывает на область данных BIOS

MOV ES,AX ;

MOV DX,ES:[8] ;получаем базовый адрес

INC DX ;смещение для регистра статуса

IN AL,DX ;получаем байт статуса в AL

TEST AL,1000B ;проверяем бит 3

JNZ GO_AHEAD ;если принтер on-line, то вперед

;---печатаем сообщение об ошибке и ждем нажатия клавиши

MOV AH,9 ;функция вывода строки

LEA DX,MESSAGE ;DS:DX указывают на сообщение

INT 21H ;печатаем сообщение

MOV AH,7 ;функция ожидания ввода

INT 21H ;ожидаем нажатия клавиши (без эха)

GO_AHEAD: ;продолжение программы

Задания:

1) Определить тип IBM PC.

2) Определить число и тип адаптеров дисплея.

3) Определить число подсоединенных принтеров

Литература: 10, стр. 49-61; 7, стр. 35- 39.

Контрольные вопросы

1. Как вывести тип компьютера?

2. Как определить число и тип адаптеров дисплея?

3. Как определить число и тип периферийных устройств?