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          ;восстанавливаем байт
 

Вы находитесь в разделе: 
Также вам будет интересно:

Добавить коментарий