Главная · Поиск книг · Поступления книг · 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
фирмы  Motorola, вместе с часами реального времени.  Он вовсе  не
имеет микросхемы 8255, хотя для управления  микросхемой таймера и
приема  данных с клавиатуры используются те же самые адреса  пор-
тов.  Микросхема имеет 64 регистра, пронумерованных от 00 до 3FH.
Для  чтения  регистра  нужно сначала послать его номер в  порт  с
адресом 70H, а затем  прочитать  его  через  порт  71H. Различные
параметры  конфигурации  обсуждаются  на  последующих  страницах.
Приведем здесь только краткую сводку:

   Hомер регистра               Использование
       10H             тип накопителя HГМД
       12H             тип накопителя фиксированного диска
       14H             периферия
       15H             память на системной плате (младший байт)
       16H             память на системной плате (старший байт)
       17H             общая память (младший байт)
       18H             общая память (старший байт)
       30H             память сверх 1 мегабайта (младший байт)
       31H             память сверх 1 мегабайта (старший байт)
   Высокий уровень.

   В данной книге имеется  множество примеров доступа к этим пор-
там.  Hиже приводится программа на Бейсике, устанавливающая число
дисковых накопителей, присоединенных  к 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                  'все закончено

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

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

             Kомпьютер                Kод
                PC                     FF
                XT                     FE
                PCjr                   FD
                AT                     FC

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

   В Бейсике надо просто использовать PEEK для чтения значения:

100 DEF SEG = &HF000        'указываем на верхние 64K памяти
110 X = PEEK(&HFFFE)        'читаем второй с конца байт
120 IF X = &HFD THEN ...    '... тогда это PCjr

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

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

;--- Определение типа компьютера:
   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, то активен вто-
рой адаптер.
   Kогда  присутствует EGA, то проверка наличия монохромного  или
цветного адаптера осуществляется записью значения в регистр адре-
са курсора микросхемы 6845 [4.1.1] и последующего чтения значения
и проверки их на совпадение. Для  монохромной карты пошлите 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 памяти дисплея.

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

   Приведенные фрагменты кода определяют тип текущего монитора  и
режим его работы, а  также  определяют  какие типы видеоадаптеров
имеются в машине:

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            'восстанавливаем значение регистра

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

   Приведенные примеры соответствуют примерам на Бейсике.

;--- Определение активного адаптера:
   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        ;сравниваем значения
Предыдущая страница Следующая страница
1 2 3  4 5 6 7 8 9 10 11 12 13 14 ... 92
Ваша оценка:
Комментарий:
  Подпись:
(Чтобы комментарии всегда подписывались Вашим именем, можете зарегистрироваться в Клубе читателей)
  Сайт:
 
Комментарии (1)

Реклама