Жанр: Учеба
Справочник программиста на IBM PC
...дется обращаться к техническим руководствам
IBM или специальным описаниям производителей микросхем.
Но 99% программ не потребуют другой информации об оборудовании
IBM PC, кроме содержащейся в данной книге. Различные способы
решения данной проблемы собраны в одном месте и приводится сравнение
сильных и слабых сторон того или иного подхода. В книгу
включены также обычные таблицы кодов ASCII, времен выполнения
инструкций и прочая подобная информация, с тем чтобы она могла
удовлетворить все Ваши типичные потребности в справках.
Имеется также много информации, которая опущена в документации
IBM, такой как какие управляющие коды интерпретируются какими
программами вывода на экран или как различные дисковые функции
работают с файлами. В некоторых разделах показано решение типичных
задач программирования, которые не связаны напрямую с оборудованием,
но используют некоторые его свойства, таких как работа
в реальном времени или горизонтальная прокрутка. Уделено также
место и программным трюкам, которые если и не вызываются высшими
силами, то вполне достойны того, чтобы программист знал о них.
При существующем положении вещей каждый программист должен открывать
эти методы для себя (причем обычно не один раз). Как печально,
что высшие жрецы Века Информации тратят так много времени
переизобретая колесо, как в давние времена, когда папирус еще не
сделал обмен информацией достаточно легким.
Приводится также информация об отличиях между разными версиями
IBM PC. Все рассмотрения базируются на стандартном IBM PC. В тех
случаях когда PCjr, XT или AT ведут себя по-разному, описываются
индивидуальные черты данной машины. Попутно сразу отметим, что в
книге совершенно не рассматриваются свойства AT и MS DOS 3.0
направленные в стороны многопользовательских систем. Эти вопросы
заслуживают отдельной книги. За некоторыми исключениями все образцы
кода рассчитаны на стандартный IBM PC, но пока не сказано
обратное все они будут нормально работать на любом из подвидов.
Однако есть существенное ограничение. Все написанное в этой книге
предполагает использование MS DOS 2.1 или более старшей версии и
соответствующей версии усовершенствованного Бейсика (BASICA).
Пользователи, до сих пор не перешедшие на MS DOS 2.1, не могут
использовать многие преимущества машины.
Если в этой книге что-то и содержится, то это факты - мириады
их - и я искренне надеюсь, что все они верны. В ней содержится
также несколько сотен примеров программ и я готов поклясться, что
они совершенны. Но если Вы думаете, что такое огромное количество
информации можно оставить неповрежденным в длительном процессе
подготовки книги к изданию, то попробуйте. Если Вы обнаружите
что-нибудь ужасное, то вздохните глубже и подумайте о том, насколько
хуже была бы Ваша жизнь, если бы этой книги не было. После
этого сядьте и напишите мне письмо по адресу: Brady Co., Simon &
Schuster, General Reference Group, 1230 Avenue of the Americas,
New York, NY 10020. Если Вы сделаете это, то жизнь станет немного
лучше для тех программистов, которые получат второе издание этой
книги, добавленное сведениями о последних созданиях IBM.
Удачного программирования!
Robert Jourdain
Глава 1. Системные ресурсы.
Одной из первых задач после загрузки задачи является проверка
куда мы попали: на каком типе IBM PC запущена задача?... под
какой версией MS DOS?... сколько имеется памяти?... все ли необходимое
оборудование присутствует? Имеется три способа получения
этой информации. Наименее элегантный способ - спросить об этом у
пользователя (но знает ли он ответы?). Намного лучше получить всю
доступную информацию из установки переключателей на системной
плате. Но эта установка не всегда соответствует реальности. Поэтому
лучше всего использовать третью возможность - получить прямой
доступ к требуемому оборудованию или прочитать нужную информацию
из области данных BIOS. Поскольку установка переключателей
может служить отправной точкой для получения требуемой информации,
то этот раздел начинается с обсуждения микросхемы, содержащей
эту информацию - микросхемы интерфейса с периферией 8255.
Программа может получить доступ к оборудованию только двумя
способами. Она может обратиться к любому из портов ввода/вывода,
соответствующему присоединенному оборудованию (обычно бывает
занята лишь малая доля из 65535 возможных адресов портов). Или
программа может обратиться к любому из более чем миллиону адресов
оперативной памяти. Сводная таблица адресов портов приведена в
[7.3.0]. На рис. 1-1 показано как распределены в памяти операционная
система и программы.
1.1.1 Доступ к микросхеме интерфейса с периферией 8255.
Микросхема интерфейса с периферией Intel 8255 - лучшее место,
с которого надо начинать, чтобы получить информацию об имеющемся
оборудовании. Эта микросхема предназначена для многих целей. Она
сообщает об установке переключателей на системной плате. Она
принимает для компьютера ввод с клавиатуры. Она управляет рядом
периферийных устройств, включая микросхему таймера 8253. Из машин
семейства IBM PC только AT не использует микросхему 8255; он
хранит информацию об оборудовании вместе с часами реального времени
в специальной микросхеме с независимым питанием. Однако AT
использует те же адреса портов, что и 8255, для работы с клавиатурой
и управления микросхемой таймера.
Микросхема 8255 имеет три однобайтных регистра, называемых от
порта A до порта C. Адреса этих портов от 60H до 62H сответственно.
Все три порта можно читать, но писать можно только в порт B.
Для PC, установка бита 7 порта B в 1 изменяет информацию, содержащуюся
в порте A. Аналогично для PC установка бита 2 определяет
содержимое четырех младших битов порта C, а установка бита 3
делает то же самое для XT. Содержимое этих регистров следующее:
Порт A (60H)
когда в порте B бит 7=0
биты 0-7 PC,XT,PCjr,AT: 8-битные скан-коды с клавиатуры
когда в порте B бит 7=1 для PC
бит 0 PC: 0 = нет накопителей на дискетах
1 PC: не используется
2-3 PC: число банков памяти на системной плате
4-5 PC: тип дисплея (11 = монохромный,
10 = цветной 80*25, 01 = цветной 40*25)
6-7 PC: число накопителей на дискетах
Порт B (61H)
бит 0 PC,XT,PCjr: управляет каналом 2 таймера 8253
1 PC,XT,PCjr: вывод на динамик
2 PC: выбор содержимого порта C
PCjr: 1 = символьный режим, 0 = графический
3 PC,PCjr: 1 = кассетный мотор выключен
XT: выбор содержимого порта C
4 PC,XT: 0 = разрешение ОЗУ
PCjr: 1 = запрет динамика и мотора кассеты
5 PC,XT: 0 = разрешение ошибок щелей расширения
6 PC,XT: 1 = разрешение часов клавиатуры
5-6 PCjr: выбор динамика (00 = 8253, 01 = кассета,
10 = ввод/вывод, 11 = микросхема 76496)
7 PC: выбор содержимого порта A
PC,XT: подтверждение клавиатуры
Порт C (62H)
когда в порте B бит 2=1 для PC или бит 3=1 для XT
биты 0-3 PC: нижняя половина переключателя 2 конфи-
гурации (ОЗУ на плате расширения)
0 PCjr: 1 = введенный символ потерян
1 XT: 1 = есть мат. сопроцессор
PCjr: есть карта модема
2 PCjr: есть карта НГМД
2-3 XT: число банков памяти на системной плате
3 PCjr: 0 = 128K памяти
4 PC,PCjr: ввод с кассеты
XT: не используется
5 PC,XT,PCjr: выход канала 2 8253
6 PC,XT: 1 = проверка ошибок щелей расширения
PCjr: 1 = данные с клавиатуры
7 PC,XT: 1 = контроль ошибок четности
PCjr: 0 = кабель клавиатуры подсоединен
когда в порте B бит 2=0 для PC или бит 3=0 для XT
биты 0-3 PC: верхняя половина переключателя 2 конфи-
гурации (не используется)
0-1 XT: тип дисплея (11 = монохромный,
10 = цветной 80*25, 01 = цветной 40*25)
2-3 XT: число накопителей НГМД (00 = 1 и т.д.)
4-7 PC,XT: то же, что и с установленными битами
Отметим, что 0 в одном из битов регистра соответствует установке
переключателя "off".
AT хранит информацию о конфигурации в микросхеме MC146818
фирмы Motorola, вместе с часами реального времени. Он вовсе не
имеет микросхемы 8255, хотя для управления микросхемой таймера и
приема данных с клавиатуры используются те же самые адреса портов.
Микросхема имеет 64 регистра, пронумерованных от 00 до 3FH.
Для чтения регистра нужно сначала послать его номер в порт с
адресом 70H, а затем прочитать его через порт 71H. Различные
параметры конфигурации обсуждаются на последующих страницах.
Приведем здесь только краткую сводку:
Номер регистра Использование
10H тип накопителя НГМД
12H тип накопителя фиксированного диска
14H периферия
15H память на системной плате (младший байт)
16H память на системной плате (старший байт)
17H общая память (младший байт)
18H общая память (старший байт)
30H память сверх 1 мегабайта (младший байт)
31H память сверх 1 мегабайта (старший байт)
Высокий уровень.
В данной книге имеется множество примеров доступа к этим портам.
Ниже приводится программа на Бейсике, устанавливающая число
дисковых накопителей, присоединенных к IBM PC. Прежде чем прочитать
два старших бита порта A, бит 7 порта B должен быть установлен
в 1. Существенно, что Вы должны вернуть значение этого бита
назад в 0 перед дальнейшей работой, иначе клавиатура будет заперта
и для восстановления работоспособности машины Вам придется
выключить ее. Бейсик не позволяет двоичное представление чисел,
что затрудняет работу с цепочками битов. Простая подпрограмма
может заменить любое целое вплоть до 255 (максимальное значение,
которое может принимать номер порта) на восьмисимвольную двоичную
строку. После этого строковая функция MID$ позволяет вырезать
нужные биты для анализа. Основы битовых операций в Бейсике описаны
в приложении Б.
100 A = INP(&H61) 'получаем значение из порта B
110 A = A OR 128 'устанавливаем бит 7
120 OUT &H61,A 'посылаем байт назад в порт B
130 B = INP(&H60) 'получаем значение из порта A
140 A = A AND 128 'сбрасываем бит 7
150 OUT &H61,A 'восстанавливаем значение порта B
160 GOSUB 1000 'преобразуем в двоичную строку
170 NUMDISK$ = RIGHT$(B$,1) 'получаем нулевой бит
180 IF D$ = 1 THEN NUMDISK = 0: GOTO 230 'нет дисков
190 C$ = LEFT$(B$,2) 'берем два старших бита строки
200 TALLEY = 0 'переменная для числа дисков
210 IF RIGHT$(C$,1) = "1" THEN TALLEY = 2 'берем старший бит
220 IF LEFT$(C$,1) = "1" THEN TALLEY = TALLEY + 1 'и младший
230 TALLEY = TALLEY + 1 'счет начинается с 1, а не с 0
'теперь имеем число накопителей
1000 '''Подпрограмма преобразования байта в двоичную строку
1010 B$ = "" 'заводим строку
1020 FOR N = 7 TO 0 STEP -1 'проверка очередной степени 2
1030 Z = B - 2^N '
1040 IF Z "= 0 THEN B = Z: B$ = B$+"1" ELSE B$ = B$+"0"
1050 NEXT 'повторяем для каждого бита
1060 RETURN 'все закончено
Низкий уровень.
Ассемблерная программа получает число имеющихся дисковых накопителей
тем же способом, что и в вышеприведенном примере, но
более просто. Напоминаем, что нельзя забывать о восстановлении
первоначального значения в порте B.
IN AL,61H ;получаем значение из порта B
OR AL,10000000B ;устанавливаем бит 7 в 1
OUT 61H,AL ;заменяем байт
IN AL,60H ;получаем значение из порта A
MOV CL,6 ;подготовка для сдвига AL
SHR AL,CL ;сдвигаем 2 старших бита на 6 позиций
INC AL ;начинаем счет с 1, а не с 0
MOV NUM_DRIVES,AL ;получаем число накопителей
IN AL,61H ;подготовка к восстановлению порта B
AND AL,01111111B ;сбрасываем бит 7
OUT 61H,AL ;восстанавливаем байт
1.1.2 Определение типа IBM PC.
Имеются проблемы совместимости между различными типами IBM PC.
Для того чтобы программа могла работать на любом из IBM PC, используя
все его возможности, необходимо чтобы она могла определить
тип машины, в которую она загружена. Эта информация содержится
во втором с конца байте памяти по адресу FFFFE в ROM-BIOS,
с использованием следующих ключевых чисел.
Компьютер Код
PC FF
XT FE
PCjr FD
AT FC
Высокий уровень.
В Бейсике надо просто использовать PEEK для чтения значения:
100 DEF SEG = &HF000 'указываем на верхние 64K памяти
110 X = PEEK(&HFFFE) 'читаем второй с конца байт
120 IF X = &HFD THEN ... '... тогда это PCjr
Низкий уровень.
В языке ассемблера:
;--- Определение типа компьютера:
MOV AX,0F000H ;указывает ES на ПЗУ
MOV ES,AX ;
MOV AL,ES:[0FFFEH] ;получаем байт
CMP AL,0FDH ;это PCjr?
JE INITIALIZE_JR ;переходим на инициализацию
1.1.3 Определение версии MS DOS.
По мере развития MS DOS к ней добавлялись новые возможности,
многие из которых существенно облегчают написание определенных
частей программы по сравнению с предыдущими версиями. Чтобы иметь
гарантию что программа будет работать с любой версией MS DOS она
должна использовать только функции, доступные в MS DOS 1.0. В
системе предусмотрено прерывание, возвращающее номер версии MS
DOS. Это число может использоваться для проверки выполнимости
Вашей программы. Минимально, программа может при старте выдавать
сообщение об ошибке, сообщая что ей нужна другая версия MS DOS.
Средний уровень.
Функция 30H прерывания 21H возвращает номер версии MS DOS.
Старший номер версии (2 из 2.10) возвращается в AL, а младший
номер версии (10 из 2.10) возвращается в AH (обратите внимание,
что младший номер .1 возвращает значение AH, а не 1H). AL может
содержать 0, что указывает на версию MS DOS меньшую чем 2.0. Это
прерывание меняет содержимое регистров BX и CX, в которых возвращается
значение 0.
;--- Определение версии MS DOS:
MOV AH,30H ;номер функции получения версии
INT 21H ;получить номер версии
CMP AL,2 ;проверка на версию 2.х
JL WRONG_DOS ;если меньше 2, то выдать сообщение
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 ;тогда восстанавливаем значение
1.1.5 Определение числа и типа дисковых накопителей.
На всех машинах кроме AT (который будет обсуждаться ниже)
регистры микросхемы 8255 интерфейса с периферией содержат информацию
о том, сколько НГМД имеет машина. В примерах [1.1.1] показано
как получить эту информацию. Информация определяющая тип
диска содержится в таблице размещения файлов (FAT) диска, которая
следит за использованием дискового пространства. Первый байт FAT
содержит один из следующих кодов:
Код Тип диска
FF двухсторонний, 8 секторов
FE односторонний, 8 секторов
FD двухсторонний, 9 секторов
FC односторонний, 9 секторов
F9 двухсторонний, 15 секторов
F8 фиксированный диск
Сама таблица размещение файлов не является файлом. Она может
быть считана при помощи функций DOS или BIOS непосредственно читающих
определенные сектора диска. В пункте [5.1.1] содержится
вся информация необходимая для нахождения и чтения FAT. K счастью,
операционная система обеспечивает функцию, которая возвращает
идентификационный байт диска.
Данные BIOS не показывают число жестких дисков в системе, так
как переключатели предназначены только для гибких дисков. Однако
Вы можете использовать указанную функцию операционной системы для
поиска накопителей. Она возвращает значение 0CDH, вместо одного
из упомянутых кодов, когда накопители отсутствуют. Надо просто
проверять все большие и большие номера накопителей, до тех пор
пока не будет обнаружено указанное значение.
AT уникален в том смысле, что его информация о конфигурации
говорит какой тип накопителя используется. Эту информацию можно
получить из порта с адресом 71H, предварительно послав номер
регистра в порт 70H. Для НГМД номер регистра равен 10H. Информация
о первом накопителе содержится в битах 7-4, а о втором - в
битах 3-0. В обоих случаях цепочка битов 0000 говорит об отсутствии
накопителя, 0001 - о двухстороннем накопителе с плотностью 48
дорожек на дюйм, а 0010 - о накопителе большой емкости (96 дорожек
на дюйм). Информация о фиксированном диске содержится в регистре
12H. И снова биты 7-4 и 3-0 соответствуют первому и второму
накопителям. 0000 указывает на отсутствие накопителя. Другие
15 возможных значений описывают емкость и конструкцию накопителя.
Эти коды сложные; если Вам по какой-то причине потребуется эта
информация, обратитесь к техническому руководству по AT.
Средний уровень.
Функция 1CH прерывания 21H возвращает информацию об указанном
накопителе. Поместите номер накопителя в DL, причем 0 = накопитель
по умолчанию, 1 = A, и т.д. При возвращении DX содержит
число кластеров в FAT, AL - число секторов в кластере, а CX -
число байтов в секторе. DS:BX указывает на байт, содержащий код
идентификации диска из FAT, согласно приведенной таблице. В следующем
примере определяется тип накопителя A:
;---определение типа диска
MOV AH,1CH ;функция MS DOS
MOV DL,1 ;выбор накопителя A
INT 21H ;получение информации
MOV DL,[BX] ;получение типа накопителя
CMP DL,0FDH ;двухсторонний, 9 секторов?
JE DBL_9 ;и т.д.
BIOS AT имеет функцию, сообщающую общие параметры накопителей.
Это функция 8 прерывания 13H. Она возвращает число накопителей в
DL, максимальное число сторон накопителя в DH, максимальное число
секторов в CL и дорожек в CH, а код статуса ошибки накопителя в
AH (см. пункт [5.4.8]).
Другая функция BIOS AT возвращает тип накопителя. Это функция
15H прерывания 13H, которая требует номера накопителя в DL. В AH
возвращается код, причем 0 = нет накопителя, 1 = дискета без
обнаружения изменений, 2 = дискета с обнаружением изменений и 3 =
фиксированный диск. В случае фиксированного диска в CX:DX возвращается
число секторов по 512 байт.
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 микросхемы
конфигурации. Сначала запишит
...Поділитися у соцмережах