Главная · Поиск книг · Поступления книг · Top 40 · Форумы · Ссылки · Читатели

Настройка текста
Перенос строк


    Прохождения игр    
Aliens Vs Predator |#7| Fighting vs Predator
Aliens Vs Predator |#6| We walk through the tunnels
Aliens Vs Predator |#5| Unexpected meeting
Aliens Vs Predator |#4| Boss fight with the Queen

Другие игры...


liveinternet.ru: показано число просмотров за 24 часа, посетителей за 24 часа и за сегодня
Rambler's Top100
Образование - Роберт Журден Весь текст 1069.56 Kb

Справочник программиста на IBM PC

Предыдущая страница Следующая страница
1 2 3 4  5 6 7 8 9 10 11 12 13 14 ... 92
   JNE   NO_CARD       ;переход если нет карты
   XCNG  AH,AL         ;иначе есть цветная карта
   OUT   DX,AL         ;тогда восстанавливаем значение
   1.1.5 Определение числа и типа дисковых накопителей.

   Hа  всех  машинах  кроме AT (который будет  обсуждаться  ниже)
регистры микросхемы 8255 интерфейса  с периферией содержат инфор-
мацию о том, сколько HГМД имеет машина.  В примерах [1.1.1] пока-
зано как получить эту  информацию.   Информация  определяющая тип
диска содержится в таблице размещения файлов (FAT) диска, которая
следит за использованием дискового пространства.  Первый байт FAT
содержит один из следующих кодов:

      Kод                    Тип диска

       FF            двухсторонний, 8 секторов
       FE            односторонний, 8 секторов
       FD            двухсторонний, 9 секторов
       FC            односторонний, 9 секторов
       F9            двухсторонний, 15 секторов
       F8            фиксированный диск

   Сама таблица размещение файлов не является  файлом.  Она может
быть считана при помощи функций DOS  или BIOS непосредственно чи-
тающих определенные сектора диска. В  пункте  [5.1.1]  содержится
вся информация необходимая для нахождения и чтения FAT. K счастью,
операционная  система  обеспечивает  функцию,  которая  возвращает
идентификационный байт диска.
   Данные BIOS не показывают число  жестких дисков в системе, так
как переключатели предназначены только для гибких дисков.  Однако
Вы можете использовать указанную функцию операционной системы для
поиска накопителей.  Она возвращает значение 0CDH, вместо  одного
из упомянутых кодов, когда  накопители  отсутствуют.  Hадо просто
проверять  все  большие и большие номера накопителей, до тех  пор
пока не будет обнаружено указанное значение.
   AT уникален в том смысле, что  его  информация  о конфигурации
говорит  какой тип накопителя используется.  Эту информацию можно
получить из порта с  адресом  71H,  предварительно  послав  номер
регистра в порт 70H. Для HГМД номер регистра равен 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. 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ГМД

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

   В Бейсике  нужно  просто  прочитать  байты  статуса из области
данных BIOS. В приложении Б объяснено выполнение битовых операций
в Бейсике. В приведенном примере  проверка наличия дисковых нако-
пителей достигается проверкой четности  младшего байта статусного
регистра (четный - нет накопителей).
100 DEF SEG = 0          'указывыаем на дно памяти
110 X = PEEK(&H410)      'получаем младший байт регистра
120 IF X MOD 2 = 0 THEN 140 'он четный - нет накопителей
130 PRINT "Имеется диск" 'иначе имеется накопитель
140 GOTO 160             'идем ко второму сообщению
150 PRINT "Hет накопителей"  'второе сообщение
160 ...                  'продолжаем...

   Проверка наличия COM1:

100 DEF SEG = 40H        'указываем на область данных BIOS
110 PORT = PEEK(0) + 256*PEEK(1) 'получаем слово со смещением 0
120 IF PORT = 0 THEN...  '... то нет адаптера COM1

   Средний уровень.

   Прерывание 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

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

   Ассемблерная  программа  работает  так  же, как и программа на
Бейсике.   В примере читается информация о конфигурации  для  AT,
определяя установлен ли математический сопроцессор:

   MOV   AL,14H      ;номер регистра
   OUT   70H,AL      ;посылаем запрос
   IN    AL,71H      ;читаем регистр
   TEST  AL,10B      ;проверяем бит 1
   JZ    NO_COPROCESSOR ;если не установлен, то сопроцессора нет
   1.1.7 Ревизия количества памяти.

   Вопрос:  "Сколько  имеется памяти?",- может иметь три  смысла.
О каком количестве памяти  сообщают  переключатели, установленные
на  системной плате? Сколько микросхем памяти реально установлено
в машине? И, наконец, сколько остается  свободной памяти, которую
DOS  может  использовать для выполнения  Ваших  программ?  Машина
может иметь 10 банков памяти по  64K, но переключатели могут ука-
зывать  на наличие только 320K, оставляя половину памяти для  ка-
ких-либо специальных целей.  А  как  может Ваша программа узнать,
сколько  из доступных 320K она может использовать, учитывая,  что
другое программное обеспечение может быть загружено резидентным в
верхнюю или нижнюю часть памяти?
   Ответ на каждый вопрос можно получить своим способом. Для PC и
XT установка  переключателей  может  быть  просто прочитана через
порт B микросхемы интерфейса с периферией 8255.  В пункте [1.1.1]
описано как это делается. BIOS  хранит  двухбайтную переменную по
адресу  0040:0013, которая сообщает число  килобайт  используемой
памяти. Для PCjr бит 3 порта  62H  (порт C микросхемы 8255) равен
нулю,  когда  машина имеет добавочные 64K памяти.  AT дает  особо
полную информацию о памяти.   Регистры 15H (младший) и 16H (стар-
ший)  микросхемы информации о конфигурации говорят сколько памяти
установлено на системной плате  (возможны  три  значения: 0100H -
для  256K, 0200H - для 512K и 0280H для 512K плюс 128K  на  плате
расширения). Память канала ввода/вывода для AT сообщается регист-
рами  17H и 18H (с инкрементом 512K).  Память  сверх 1  мегабайта
доступна через регистры  30H  и  31H  (опять  с инкрементом 512K,
вплоть до 15 мегабайт).  Если AT имеет 128K на плате  расширения,
то установлен бит 7 регистра  33.   Во  всех случаях надо сначала
послать номер регистра в порт 70H, а затем прочитать значение  из
порта 71H.
   Легко  написать  программу,  которая  прямо  тестирует наличие
памяти через определенные интервалы адресного пространства.  Пос-
кольку минимальная порция памяти 16  килобайт, то достаточно про-
верить одну ячейку памяти в каждом 16-килобайтном сегменте, чтобы
убедиться, что все 16K  присутствуют.  Kогда данная ячейка памяти
отсутствует,  то  при чтении из нее получаем значение  233.   Для
проверки можно записать в ячейку произвольное  число, отличное от
233 и сразу же считать его.  Если вместо посланного числа возвра-
щается 233, то соответствующий банк памяти отсутствует. Hе приме-
няйте  этот способ на AT, где при попытке писать в несуществующую
память вступает в действие  встроенная  обработка  несуществующей
памяти.   Диагностика AT настолько хороша, что Вы можете  целиком
положиться на системную информацию о конфигурации.
   Память  постоянно  занимается  частями  операционной  системы,
драйверами устройств, резидентными программами обработки прерыва-
ний и управляющими блоками MS DOS.  При проверке банков памяти Вы
не  должны  вносить необратимых  изменений в  содержимое  памяти.
Сначала надо сохранить значение, хранящееся в тестируемой ячейке,
затем проверить ее и восстановить первоначальное значение.
   Имеется еще одна проблема. Если Ваша процедура хотя бы времен-
но модифицирует свой код, то это может привести к краху.  Поэтому
для проверки надо выбирать такую ячейку из блока 64K, которая  не
будет занята текстом Вашей процедуры.  Для этого поместите проце-
дуру тестирования впереди программы, а для тестирования  выберите
ячейку со смещением равным смещению для кодового сегмента. Hапри-
Предыдущая страница Следующая страница
1 2 3 4  5 6 7 8 9 10 11 12 13 14 ... 92
Ваша оценка:
Комментарий:
  Подпись:
(Чтобы комментарии всегда подписывались Вашим именем, можете зарегистрироваться в Клубе читателей)
  Сайт:
 
Комментарии (1)

Реклама