ЭЛЕКТРОННАЯ БИБЛИОТЕКА КОАПП
Сборники Художественной, Технической, Справочной, Английской, Нормативной, Исторической, и др. литературы.



 

Часть 1

                          П.НОРТОН                   
                          
               
                
                 
              ПРОГРАММНО-АППАРАТНАЯ ОРГАНИЗАЦИЯ   
                      КОМПЬЮТЕРА IBM PC    
                                              
                                              
                
                
                                              
              (INSIDE THE IBM PC.ACCESS TO ADVANCED
                   FEATURES AND PROGRAMMING)
              
              Prentice-Hall Publishing Comp.,1984
              
              
                
                
                
                
                
                
                
              
                      Перевод с английского
              
                        С.Писарева,Б.Шура
              
              
              
              
              
                
                
              
              
              
              
              
                       
                       Киев  1987
              
              
              
                                 
                              ОГЛАВЛЕНИЕ
              
              
              
              ГЛАВА 1. ВВЕДЕНИЕ В СФЕРУ ПЕРСОНАЛЬНЫХ КОМПЬЮТЕРОВ
              
              1.1. Краткий обзор содержания книги
              1.2. Вспомогательные обучающие средства
              1.3  Используемые     программные     средства,  яз
ыки
         программирования и тексты программ 
              1.4. Возможные аспекты рассмотрения проблемы
              1.5. Обзор   оригинальных   источников,  используем
ых  в
         данной работе
              1.6. Некоторые особенности изложения материала
              
              Приложение  1.1.  Текст  программы   визуализации  
 всех
         символов на экране дисплея (язык Бейсик)
              
              ГЛАВА 2. АРХИТЕКТУРА ТЕХНИЧЕСКИХ СРЕДСТВ
              
              2.1. Микропроцессор  -  центральный  узел  персонал
ьного
         компьютера 
              2.2. Краткие    сведения    об   остальных   компон
ентах
         компьютера 
              2.3. Функциональные назначения этих компонентов
              2.4. Использование разъемов расширения
              2.5. Дополнительные сведения о технических средства
              2.6. Три аспекта рассмотрения архитектурных решений
              2.7. Возможности комплектации IBM/PC
              
              ГЛАВА 3. ПРИНЦИПЫ ФУНКЦИОНИРОВАНИЯ IBM/PC
              
              3.1. Организация памяти персонального компьютера
              3.2. Принципы адресации
              3.3. Сверхоперативная память на регистрах
              3.5. Прерывания
              3.6. Стеки
              3.7. Порты
              
              Приложение 3.1. Текст программы поиска активного уч
астка
         памяти ( Бейсик)
              Приложение 3.2. Текст   программы  обработки  преры
ваний
         (Ассемблер)
              Приложение 3.3. Текст  программы  поиска активных п
ортов
         (Паскаль)
              Приложение 3.4. Текст  программы  считывания  данны
х  из
         порта (Ассемблер) 
      
           ГЛАВА 4. АРХИТЕКТУРА И ВОЗМОЖНОСТИ ОПЕРАЦИОННОЙ СИСТЕМ
              
              4.1. Для чего нужны операционные системы
              4.2. Шесть основных модулей ДОС
              4.3. Нижний  уровень  программной  поддержки  -  си
стема
         BIOS-ПЗУ
              4.4. Процедура начальной загрузки - структура проце
сса
              4.5. Операции с периферийным  устройством  -  компо
нента
         IBMBIO.COM
              4.6. Ядро операционной системы - компоненты IBMDOS.
COM
              4.7. "Внутренние"    компоненты  (команды)  операци
онной
         системы  -  компонента COMMAND.COM
              4.8. "Внешние"   команды    операционной    системы
    -
         особенности выполнения и загрузки
              4.9. Функции  обслуживания  пользователем  операцио
нной
         системы
              
              
              ГЛАВА 5. ОРГАНИЗАЦИЯ ВНЕШНЕЙ ПАМЯТИ
              
              5.1. Устройство гибкого магнитного диска (дискеты)
              5.2. Форматы хранения информации
              5.3. Типы дискет и проблемы защиты от копирования
              5.4. Стандартный   накопитель   информации   на   г
ибких
         магнитных дисках
              5.5. Принципы хранения файлов
              5.6. Организация справочников
              5.7. Структура таблицы размещения файлов
              5.8. Стратегия размещения файлов
              5.5. Файлы в текстовом формате
              5.10. Форматы записей данных
              5.11. Форматы программных (исполняемых файлов)
              
              Приложение 5.1. Текст   программы   анализа    стру
ктуры
         справочника (Паскаль)
              Приложение 5.2. Текст   программы    анализа   стру
ктуры
         таблицы размещения файлов (Паскаль)
              Приложение 5.3. Текст программы обработки справочни
ка и
         таблицы размещения файлов (Паскаль)
      
              ГЛАВА 6. РАБОТА С ПЗУ
              6.1. Организация ПЗУ и его использование
              6.2. Анализ содержимого ПЗУ средствами программы DE
BUG
              6.3. Анализ содержимого ПЗУ - метод деассемблирован
ия
              6.4. Анализ    содержимого     ПЗУ    -    реконстр
укция
         интепретатора языка Бейсик
              6.5. Существующие версии BIOSa
              6.6. Механизм выборки информации из ПЗУ
              6.7. Описание специальных прерываний
              
              Приложение 6.1. Текст   программы  проверки метки в
ерсии
         ПЗУ (Паскаль)
              
              ГЛАВА 7. ОПЕРАЦИИ С ДИСКАМИ
              
              7.1. Три уровня дисковых операций
              7.2.  Средства  поддержки   дисковых   операций   у
ровня
         BIOS-ПЗУ 
              7.3. Параметры дисков и методы защиты от копировани
              
              ГЛАВА 8. ВИДЕОДОСТУП - ТЕКСТОВЫЙ РЕЖИМ
                   
              8.1. Типы видеомониторов
              8.2. Принципы отображения информации
              8.3. Метод   хранения  копии  изображения  в операт
ивной
         памяти
              8.4. Страничный механизм цветного графического дисп
лея 
              8.5. Атрибуты изображений
              8.6. Использование цвета
              8.7. Режим прямого управления видеомонитором
              8.8. Управление перемещением курсора
              8.9. Стандартный режим управления видеомонитором
              8.10. Псевдографический режим
              8.11. Средства управления видеодоступа уровня BIOS-
ПЗУ
              
              Приложение 8.1. Текст      программы        демонст
рации
         возможностей управления цветом (Бейсик)
              Приложение 8.2. Текст   программы  генерации изобра
жений
         (Паскаль)
      
         
              ГЛАВА 9. ВИДЕОДОСТУП - ГРАФИЧЕСКИЙ РЕЖИМ
              9.1. Основы машинной графики
              9.2. Понятие элемента отображения (пиксель)
              9.3. Отображение пикселей на экране
              9.5. Генерация текстов в графическом режиме
              
              Приложение 9.1. Текст   программы  генерации графич
еских
         образов (Паскаль)
              
              ГЛАВА 10. БЛОК КЛАВИАТУРЫ
              
              10.1. Принципы построения
              10.2. Механизм смены внутренних кодов
              10.3. Клавиши управления
              10.4. Программная   поддержка  операций  с   клавиа
турой
         уровня BIOS-ПЗУ
              10.5. Работа с клавиатурой в рамках языковых процес
соров
              
              Приложение 10.1. Текст      программы       демонст
рации
         возможностей управления клавиатурой (Бейсик)
              
              ГЛАВА 11. ДОПОЛНИТЕЛЬНЫЕ ВОЗМОЖНОСТИ
              
              11.1. Асинхронный коммуникационный адаптер
              11.2. Адаптер устройства печати
              11.3. Интерфейс с накопителем  информации  на  магн
итной
         кассете
              11.4. Дополнительные    процедуры   обслуживания  у
ровня
         BIOS-ПЗУ
              11.5. Генерация звука
              
              Приложение 11.1. Текст   программы   генерации  зву
ка  с
         использованием таймера (Ассемблер)
              
              
           
                                              
                                              
              Глава 1. ВВЕДЕНИЕ В СФЕРУ ПЕРСОНАЛЬНЫХ КОМПЬЮТЕРОВ
                              
              
              
              Книга, предлагаемая читателю, рассказывает о чудеса
х - о 
         тех чудесах, которые позволяет творить Персональный Комп
ьютер 
         фирмы "IBM" (IBM/PC). 
              Появление    персонального    компьютера   фирмы   
"IBM" 
         знаменовало собой фактическое введение нового и очень вы
соко- 
         го   стандарта  качества  и  производительности  персона
льных 
         компьютеров.  Те,  кто  уже  знал   и   понимал   возмож
ности 
         персональных  компьютеров,  увидели  в IBM/PC новое сред
ство, 
         превосходящее все то что существовало до сих пор. Те же,
  кто 
         считал персональные компьютеры не более чем игрушками, н
ачали 
         осозновать  действительную  ценность   этих   компьютеро
в   в 
         качестве   полезнейшего  рабочего  инструмента  инженера
  или 
         ученого. 
              Эта  книга  отличается  от  большинства  книг,знако
мящих 
         чителей  с  компьютерами.  Она  рассчитана  на  тех  чит
атей, 
         которые  не   желают   останавливаться   на   сведениях 
  для 
         начинающих,   а   хотят   узнать  действительные  возмож
ности 
         персонального компьютера фирмы "IBM". 
              Компьютер   IBM/PC   позволяет   реализовать   множ
ество 
         интереснейших возможностей,  о  которых  будет  рассказа
но  в 
         данной  книге.  Эта книга адресована всем, кого действит
ельно 
         интересует как работает  IBM/PC  и  что  можно  делать  
с  ее 
         помощью,  независимо  от  того,  является ли читатель оп
ытным 
         профессионалом или начинающим пользователем компьютеров.
              Книга  позволяет  не  только  понять  как  функцион
ирует 
         IBM/PC,   но  и  обьясняет  как  можно  его  использоват
ь  на 
         практике. Она  предлагает  дополнительный  и  более  глу
бокий 
         материал  об IBM/PC для всех, кто в нем нуждается. Мы по
можем 
         Вам понять не только принципы функционирования машины,  
Но  и 
         ее   потенциальные   возможности.  Книга  содержит  множ
ество 
         советов    и    практических     рекомендаций,     касаю
щихся 
         программирования  для IBM/PC. Но не следует считать эту 
книгу 
         руководством по программированию для IBM/PC, в  основном
  она 
         посвящена возможностям самого компьютера. 
              
              1.1. Краткий обзор содержания книги
              
              Эта   книга   в  основном  посвящена  программам  (
  или 
         программному обеспечению),  поскольку  именно  они  реал
изуют 
         большинство   возможностей   компьютера.   Но   помимо  
этого 
         необходимо рассмотреть и  аппаратные  средства  компьюте
ра  - 
         этому посвящена глава 2. 
      
              В     главе     3    рассматривается    функциониро
вание
         ценитального узла компьютера - собственно микропроцессор
а. 
              Операционная система  РС-DOS  кратко описывается в 
главе 
         4.  В этой главе приведены пояснения принципов работы ДО
С и в 
         качестве  дополнительного   материала   описаны   програ
ммные 
         средства, обеспечивающие доступ к различным возможностям
 ДОС. 
              Далее,  в  главе  5, рассматривается организация вн
ешней 
         памяти и способы хранения данных на гибких магнитных  ди
сках. 
         Примеры  программ  показывают  способы  расшифровки служ
ебной 
         информации об организации хранения данных на дискете, ко
торая 
         обычно скрыта от пользователя. 
              Глава  6  посвящена  программному  обеспечению,  ко
торое 
         хранится в ПЗУ (постоянном запоминающем устройстве) IBM/
PC. В 
         этой главе показано как можно пользоваться этими програм
мами. 
         Этот материал подготавливает почву для изучения глав с  
7  по 
         11, в которых, шаг за шагом, описываются служебные прогр
аммы, 
         хранящиеся в ПЗУ. Каждая из этих глав сопровождается при
мером 
         программ,  позволяющих  использовать  те или иные возмож
ности 
         компьютера. 
              Глава  7  описывает  доступ  к   процедурам   работ
ы   с 
         дискетами.   Главы   8  и  9  описывают  работу  с  дисп
леем, 
         соответственно в алфавитно-цифровом и графическом режима
х. 
              Глава 10 посвящена использованию клавиатуры, а глав
а  11 
         подводит итоги рассмотрения всего предыдущего материала.
              Приложения   этой   книги   включают  краткий  глос
сарий 
         компьютерной терминологии,  введение  в  Паскаль  и  опи
сание 
         интерфейса  между  программами,  написанными на ассембле
ре, и 
         программами на Паскале или другом языке высокого уровня.
              
              1.2. Вспомогательные обучающие средства
              
              Если Вы просто хотите узнать побольше об IBM/PC, то
  Вам 
         не  потребуется  ничего,  кроме  этой  книги.  Однако,  
чтобы 
         применить  полученные  знания   на   практике   этого   
будет 
         недостаточно, потребуется, как минимум, сам компьютер. 
              Чтобы  воспользоваться  программами, приведенными в
 этой 
         книге, потребуется  IBM/PC  с  64К  байтами  памяти  и  
одним 
         дисководом.  Все  программы  могут работать как с монохр
омным 
         дисплеем, так и с цветным графическим адаптером.  Потреб
уется 
         также  операционная  система  ДОС и поставляемые вместе 
с нею 
         средства, такие как программа  DEBUG.  Можно  воспользов
аться 
         любой  версией  ДОС:  исходной  версией 1.00, неофициаль
ной и 
         временной версией 1.05, усовершенствованной версией 1.10
  или 
         ДОС 2.00. 
              Чтобы  как  можно  полнее  использовать все возможн
ости, 
         предоставляемые IBM/PC, Вам потребуется дополнительный  
пакет 
         программ  на  гибких  магнитных  дисках,  прилагаемый  к
 этой 
         книге. Средства доступа  ко  всем  возможностям  IBM/PC 
 были 
         разработаны  специально  для  этой  книги.  Содержимое п
акета 
         описывается в приложении 5. 
      
              Вам не нужно  будет  использовать  Макроассемблер  
фирмы 
         "IBM"  для  использования  представленных  в  книге  про
цедур 
         доступа, написанных на ассемблере. Все эти программы вкл
ючены 
         в  пакет  программ  в  виде готовых к использованию обье
ктных 
         модулей.  Однако,  если  Вам  захочется  внести  изменен
ия  в 
         ассемблерную программу, чтобы адаптировать ее к своим ну
ждам, 
         то потребуется и ассемблер, и необходимо  будет  освоить
         язык  ассемблера.  Один  из  разделов этой книги предста
вляет 
         собой простое введение в использование ассемблера. 
              Чтобы использовать  приведенные  в  книге  программ
ы  на 
         языке  Паскаль  либо  сами  по  себе,  либо  в  составе 
Ваших 
         собственных  программ,  Вам  потребуется   компилятор   
языка 
         Паскаль для IBM/PC. 
              И,  наконец,  Вам  может  потребоваться копия "Серв
исных 
         программ  Нортона"  (The  Norton  Utilities).  Она   вкл
ючает 
         программу   восстановления   поврежденных  дискет  (File
Fix), 
         уничтоженных  файлов  (UnErase),  модификации   секторов
   на 
         дискете  (SecMod)  и  управления скрытыми файлами (FileH
ide и 
         BatHide);  реорганизации  справочников  файлов   (DiskOp
t   и 
         FileSort)  и  управления  экранным режимом (Reverse, Scr
Atr и 
         Clear), а также несколько других полезных служебных прог
рамм. 
              
              1.3.   Используемые    программные    средства,    
языки
         программирования и тексты программ
         
              В этой книге будет приведено  множество  программ  
и  мы 
         сразу  же  приступим  к  рассмотрению  первой  из  них, 
текст 
         которой приведен в приложении 1-1. Эта программа написан
а  на 
         языке  БЭЙСИК  и  выдает  на  экран  все  256 кодов симв
олов, 
         отображаемых дисплеем IBM/PC. Многие пользователи, как э
то ни 
         удивительно, никогда не видели всего набора символов, та
к что 
         это  представляет  для  них  интерес.  Просмотр  сразу  
 всех 
         возможных  символов может оказаться полезным для выбора 
из их 
         числа  таких  символов,  которые  будут  использоваться 
  для 
         организации   специальных   эффектов.   Программа  отобр
ажает 
         символы в виде таблицы по 16 символов  в  каждом  ряду. 
 Если 
         необходимо  установить  порядковый  номер  любого символ
а, то 
         можно использовать функцию  CHR$  языка  БЕЙСИК.  Так  п
ервая 
         строка  содержит  символы  от  CHR$(0)  до CHR$(15), а в
торая 
         CHR$(16)-CHR$(81).    Шестнадцатиричные     коды     сим
волов 
         определяются по меткам строк и столбцов. 
              В   примерах   программ,   приведенных   в  этой  к
ниге, 
         используются три языка программирования:  БЕЙСИК,  Паска
ль  и 
         язык  ассемблера.  Интерпретатор языка БЕЙСИК имеется в 
любом 
         варианте IBM/PC, поэтому БЕЙСИК используется во всех слу
чаях, 
         когда  им  целесообразно  воспользоваться.  Однако  БЕЙС
ИК не 
         слишком хорошо  приспособлен  для  решения  серьезных  з
адач, 
         поэтому, в основном используется язык Паскаль. 
      
              Паскаль    приобрел    большую   популярность   в  
 мире 
         персональных  компьютеров   благодаря   своим   возможно
стям, 
         компактности  и надежности. У Паскаля имеются и очень си
льные 
         конкуренты - в первую очередь языки Си и  Форс.  Однако,
  для 
         нас  Паскаль  имеет  два  важных  преимущества. Во-первы
х, он 
         проще и его легче изучить, чем языки Си и Форс  и  во-вт
орых, 
         что  наиболее важно, фирма "IBM" поставляет Паскаль для 
своих 
         персональных компьютеров с самого начала. И  коль  скоро
  нам 
         необходим какой-то общий язык общения, большая часть про
грамм 
         в этой книге написана на Паскале. 
              Если вы не знакомы с языком  Паскаль,  не  отчаивай
тесь, 
         наиболее простой способ немного изучить этот язык заключ
ается 
         в чтении примеров, приведенных в книге. Они  были  специ
ально 
         написаны как можно доступнее и подобраны таким образом, 
чтобы 
         постепенно  обучать  читателя.  Кроме  того,   приложени
е   2 
         содержит    краткое    руководство    по    языку    Пас
каль, 
         демонстрирующее его  возможности  и  стиль  программиров
ания, 
         поясняющее наиболее важные компоненты языка. 
              Я  настоятельно рекомендую язык Паскаль всем, кто е
ще не 
         выбрал, на каком языке программировать на IBM/PC. 
              Если Вы собираетесь использовать другой язык, то пр
имеры 
         программ  на  Паскале,  приведенные  в  этой книге, все 
равно 
         будут  полезны.  Они  показывают  приемы  работы  на  IB
M/PC, 
         которые можно перенести и в другие языки программировани
я. 
              Многие  из  наиболее  мощных  и  интересных возможн
остей 
         IBM/PC  можно  задействовать  только  с   помощью   прог
рамм, 
         написанных  на  языке  ассемблера. В этой книге мы рассм
отрим 
         все  эти  возможности  и  способы  их  использования.   
Чтобы 
         обеспечить  Вам  наиболее  благоприятные  возможности  д
ля их 
         использования  в  книге  приведен  полный   набор   прог
рамм, 
         написанных на языке ассемблера, которые представят Вам д
оступ 
         ко всем возможностям IBM/PC и операционной системы ДОС. 
              В приложении 3 описываются способы подключения  мод
улей, 
         написанных   на   языке   ассемблера.   Потребности  опи
сания 
         относятся к языку Паскаль, но они практически в том  же 
 виде 
         могут быть применены к любому языку программирования, ко
торый 
         использует стандартные механизмы вызова программ. 
              Специально для этой книги было написано небольшое  
число 
         программ.Одни  -  с  чисто иллюстративным назначением - 
чтобы 
         продемонстрировать некоторые приемы работы. Другие  прог
раммы 
         предназначены  для  помощи  в  получении  информации  о 
Вашем 
         компьютере. Третью группу  составляют  программные  сред
ства, 
         обеспечивающие  Вам  доступ ко множеству важных возможно
стей, 
         предоставляемых IBM/PC. По возможности листинги этих про
грамм 
         были включены в эту книгу , и в первую очередь, это отно
сится 
         к тем программам, изучить которые читателю наиболее  пол
езно. 
         Однако,   некоторые  из  вспомогательных  программ  лучш
е  не 
         изучать,  а  непосредственно  использовать,  книга   сод
ержит 
         тексты  только  тех  программ, которые полезно изучить, 
а все 
         остальные программы включены в специальный пакет,  запис
анный 
         на дискете, прилагающейся к данной книге. 
              Этот  пакет  содержит  все  программы,  листинги ко
торых 
         приведены  в  книге,  и  многие  другие  полезные  прогр
аммы. 
         Содержимое пакета описывается в приложении 5. 
              Программы,  написанные  на языке ассемблера, записа
ны на 
         дискете как в виде исходного текста, так и в виде  готов
ых  к 
         использованию  обьектных  модулей.  Если Вы захотите вне
сти в 
         эти  программы  какие-либо  изменения,  то   Вам   приго
дится 
         исходный  текст.  Для  использования  готовых программ В
ам не 
         нужно изучать язык ассемблера и использовать  ассемблер.
         Программы  на  Паскале  также представлены и в виде исхо
дного 
         текста, и в виде готовых, скомпилированных  модулей,  ко
торые 
         готовы к использованию. 
              В   пакет   программ   включена   одна   вспомогате
льная 
         программа, DiskLook. Эта  программа  позволяет  просматр
ивать 
         всю  иформацию,  хранящуюся  на  гибких магнитных дисках
. Она 
         может вывести перечень файлов, упорядоченный по именам, 
датам 
         или  размерам  или  имена  всех файлов, которые были уда
лены. 
         Программа  DiskLook   позволяет   просмотреть   распреде
ление 
         дискового  пространства, показывает расположение любого 
файла 
         и и позволяет считывать данные с любого места на дискете
. 
             
             1.4. Три пересекающиеся области
             
              Хотя не все это замечают, но появление IBM/PC приве
ло  к 
         возникновению  трех  пересекающихся областей интересов. 
Чтобы 
         это стало очевидным,  должо  пройти  определенное  время
,  но 
         читатель должен знать о них и об их связи с данной книго
й. 
              Появление персонального компьютера фирмы "IBM" было
, как 
         ни странно это звучит,  появлением  первого  IBM/PC-подо
бного 
         компьютера;   первого,   но  не  единственного.  Кроме  
того, 
         появилась операционная система  фирмы  "Майкрософт",  MS
-DOS; 
         версия этой операционной системы для IBM/PC получила наз
вание 
         PC-DOS, хотя можно встретить и названия IBM-DOS и просто
 ДОС. 
              Отсюда и возникают три области интересов. Во-первых
, это 
         интерес  к  самому  компьютеру  IBM/PC.  Далее, это инте
рес к 
         компьютерам в большей или меньшей степени имитирующим  I
BM/PC 
         и, наконец, это интерес к семейству компьютеров, использ
ующих 
         операционную систему MS-DOS. 
              Между этими областями много общего, так что любая к
нига, 
         посвященная  одной  из областей, содержит обширный матер
иал и 
         по остальным. Эта книга посвящена первопричине появления
 всех 
         этих  областей  интереса  -  персональному  компьютеру  
фирмы 
         "IBM", но  большая  часть  того  о  чем  пойдет  речь,  
может 
         пригодиться   и   тем,   кто   интересуется  IBM/PC-подо
бными 
         компьютерами и тем, кто интересуется семейством  компьют
еров, 
         работающих под управлением операционной системы MS-DOS. 
              Время  от  времени,  при изложении материала этой к
ниги, 
         когда можно провести такое разделение, я буду указывать,
  что 
         относится, а что не относится к остальным двум областям.
             
             1.5. Источники информации
             
              В  такой  книге  нельзя  описать абсолютно все аспе
кты и 
         подробности работы  IBM/PC.  Ниже  приведен  список  наи
более 
         важных  и  полезных источников информации, которыми Вы м
ожете 
         воспользоваться, если потребуются более подробные сведен
ия. 
              Практически все  сведения,  приведеные  в  даной  к
ниге, 
         извлечены  из  этих  источников.  В  отличие от многих д
ругих 
         персональных компьютеров IBM/PC сопровождался  очень  ши
роким 
         кругом   открытых   источников   информации.   Это  прои
зошло 
         благодаря позиции фирмы "IBM", состоящей в том, чтобы  м
ашина 
         была  как  можно  более  доступна  разработчикам програм
много 
         обеспечения и аппаратных расширений. В качестве  автора 
 этой 
         книги,  я  не  имел  доступа к каким-либо особенным секр
етам, 
         какие были бы недоступны читателям. Мне потребовалось  т
олько 
         переработать   общедоступную   информацию,   извлечь  из
  нее 
         наиболее существенное и выделить  информацию,  представл
яющую 
         интерес для наиболее широкого круга читателей. 
              Если  Вам потребуется более подробная информация, ч
ем та 
         которая содержится в  этой  книге,  Вы  можете  обратить
ся  к 
         следующим  источникам: наиболее богатый источник информа
ции - 
         это  собственное  техическое  руководство  по   Персонал
ьному 
         компьютеру   фирмы   "IBM",   содержащее  помимо  технич
еских 
         подробностей, детальное описание ROM-BIOS, т.е., храняще
йся в 
         ПЗУ  базовой системы ввода-вывода. Эти программы обеспеч
ивают 
         наиболее функциональные программные средства  для  управ
ления 
         IBM/PC.  Приведен листинг BIOS на языке ассемблера, в ко
тором 
         можно разобраться только в том случае, если Вы хорошо  з
наете 
         язык  ассемблера  микропроцессора  8086 фирмы "Интел". Т
ем не 
         менее, листинг системы BIOS представляет собой настоящий
 клад 
         информации о служебных подпрограммах, доступных пользова
телю. 
         Даже  если  Вы  незнакомы  с  языком   ассемблера,   опи
сания 
         служебных  подпрограмм  и  способ  их организации помогу
т Вам 
         понять  организацию  этого  компьютера.  (Приводятся   т
олько 
         листинги   системы   BIOS,   а   листинг  записанного  в
  ПЗУ 
         интерпретатора языка Бейсик (ROМ-BASIC) не  приводятся, 
 хотя 
         его  можно  получить  с  помощью  команды  DEBUG операци
онной 
         системы, правда без комментариев.) 
              Кроме того, в руководстве приведены  две  очень  уд
обные 
         таблицы,  содеращие  все  256  кодов  символов,  использ
уемых 
         IBM/PC и функции специальных символов-атрибутов,  управл
яющих 
         цветом текста, отображаемого на экране IBM/PC. 
      
              Еще одинм полезным источником информации может посл
ужить 
         руководство, поставляемое вместе с операционной системой
 DOC. 
         В  приложениях  к  этому  руководству  можно  найти  пол
езную 
         информацию  о  форматах  дискет,  соглашениях  для  служ
ебных 
         процедур ДОС, блоках управления файлами, приставках сегм
ентов 
         программ и так  далее.  Само  руководство  по  ДОС  неск
олько 
         беднее,   чем   большинство   наших   источников  информ
ации, 
         поскольку оно не содержит подробной технической информац
ии  о 
         ДОС.  Руководство  содержит  очень  полезную  вспомогате
льную 
         информацию и некоторые рекомендации. 
              Чтобы лучше понять функционирование микрокомпьютера
,  на 
         основе  которого  функционирует  IBM/PC,  можно  обратит
ься к 
         нескольким  книгам  по   микропроцессорам   8086/8088   
фирмы 
         "Интел".   Особенно   полезными  мне  показались  две  к
ниги. 
         Наиболее   доступно    принципы    организации    и    р
аботы 
         микропроцессора  8086  представлены  в  книге  "The 8086
/8088 
         Primer", написанной Стефаном П. Морзом  (Hayden,1980).  
Более 
         глубоко  микропроцессор  описывается в книге "The 8086 B
ook", 
         Рассела Ректора (Osborne/McGrawHill,1980). 
              В качестве  справочника  по  программированию  на  
языке 
         Паскаль  можно  воспользоваться  стандартным  руководств
ом по 
         компилятору языка Паскаль для IBM/PC. Это не слишком  уд
ачное 
         введение  в Паскаль, но только в этом руководстве описыв
аются 
         особенности конкретной версии языка Паскаль для IBM/PC. 
Чтобы 
         изучить  язык  можно  выбрать  одну  из  книг  по Паскал
ю для 
         начинающих, которыми переполнены книжные магазины. Если 
же Вы 
         обладаете    хорошей    подготовкой,   достаточно   проч
итать 
         руководство   по   компилятору   языка   Паскаль   полно
стью. 
         Практически  все технические детали, касающиеся использо
вания 
         версии языка Паскаль для IBM/PC либо подробно  описаны, 
 либо 
         поясняются примерами. На мой взгляд, авторы этого руково
дства 
         проделали   большую   работу,   включив    все    необхо
димые 
         рекомендации  для  тех случаев, которые они не могли дет
ально 
         пояснить.  (Вы  многое  сможете  узнать  о   языке   Пас
каль, 
         внимательно  изучив  примеры,  приведенные  в  этой  кни
ге, и 
         прочитав руководство по языку Паскаль в приложении 2). 
              Как  и  в  случае  с  языком  Паскаль,  рекомендаци
и  по 
         программированию  на  ассемблере можно найти в руководст
ве по 
         ассемблеру для IBM/PC. Однако, в этом руководстве Вы  не
         найдете   набора  машинных  команд.  Он  описывается  в 
 двух 
         упоминавшихся   выше   книгах   по   микропроцессору    
8086. 
         Руководство   по   ассемблеру  для  IBM/PC  очень  плохо
         об'ясняет вопросы программирования и практически не  сод
ержит 
         необходимой   вспомогательной   информации,   но   без  
 него 
         невозможно пользоваться  ассемблером.  (Приложение  3  к
         настоящей   книге   описывает  методы  об'единения  прог
рамм, 
         написанных  на  языках  Паскаль  и  ассемблер,  а  также
         содержит  ряд  полезных  советов,  которые помогут Вам н
ачать 
         изучение языка ассемблера.) 
              
              1.6.Несколько замечаний о способе изложения материа
ла
              
              В этой книге я старался об'яснять все как  можно  п
роще, 
         яснее  и по возможности без противоречий. Если Вам встре
тится 
         непонятный термин, загляните в  краткий  глоссарий  терм
инов, 
         приведенный в приложении 1. 
              Ниже приведен ряд замечаний. поясняющих способ изло
жения 
         материала,   использованный   в   этой   книге.   Сначал
а   о 
         представлении чисел. 
              Числа  всегда  будут  записываться  обычными десяти
чными 
         цифрами, которые все мы изучаем еще в детстве. В тех слу
чаях, 
         когда     это    необходимо,    будут    также    привод
иться 
         шестнадцитиричные      числа,       обозначаемые       с
ловом 
         "шестнадцатиричное".     Шестнадцатиричные    числа    у
добно 
         использовать  при  работе  с   компьютером,   поскольку 
  они 
         представляют собой удобную сокращенную запись двоичных ч
исел. 
         В отличие от десятичной системы, использующей десять циф
р,  в 
         шестнадцатиричной системе цифр шестнадцать, обозначаемых
 от 0 
         до 9, далее следует А (со  значением  10),  В,  С,  D,  
E,  и 
         наконец,  F  (со  значением пятнадцать). В этой книге 11
 глав 
         (шестнадцатиричное   В);   Декларация   Независимости   
 была 
         подписана в 1776 году (шестнадцатиричное 6F0). 
              Вас  может  удивить  запись  чисел  и  в  десятично
м и в 
         шестнадцатиричном виде, хотя бы потому, что  ни  Паскаль
,  ни 
         Бейсик,     ни    ассемблер    не    требуют    использо
вания 
         шестнадцатиричных чисел при программировании. Тому  есть
  три 
         причины.  Одна  состоит в том, что некоторые числа, напр
имер, 
         адреса ячеек  памяти,  имеет  больше  смысла  представля
ть  в 
         шестнадцатиричном   виде.   Другая   связана   с   тем, 
  что 
         вспомогательная  программа  ДОС   DEBUG   использует   т
олько 
         шестнадцатиричную  форму  представления.  И,  наконец,  
часть 
         литературы по IBM/PC, в  частности  техническое  руковод
ство, 
         широко  использует  шестнадцатиричную  форму, причем даж
е без 
         специальных  оговорок.  Чтобы  облегчить  Вам   сопостав
ление 
         информации этой книги с другими источниками, числа приво
дятся 
         как в десятичном, так и в шестнадцатиричном виде. 
              Еще один  элемент  компьютерного  жаргона,  связанн
ый  с 
         записью   чисел,   -   это   использование   буквы  "К".
  "К" 
         соответствует числу 1024, так что 64К будет сооветствова
ть 64 
         раза  по  1024  или  65536.  Термин  "К" широко использу
ется, 
         поскольку он является кратким  обозначением  числа,  при
мерно 
         равного одной тысяче - так что легко понять, что 64К при
мерно 
         соответствует шестидесяти четырем тысячам. в двоичной си
стеме 
         значение К или 1024 представляется круглым числом - это 
два в 
         десятой степени. 
              Иногда возникает  необходимость  обозначать  символ
ы  их 
         кодами, значения которых находятся в диапазоне от 0 до 2
55. В 
         этих случаях используется способ  записи,  принятый  в  
языке 
         Бейсик,  например,  CHR$(65), соответствующий заглавной 
букве 
         "А". На языке Паскаль это же можно записать как chr(65).
              Рассмотрим  теперь  биты.  Очень  часто  непонимани
е   и 
         путаница   возникает   при   обращении   к  отдельным  б
итам, 
         образующим байты и слова. Различные  источники  описываю
т  их 
         по-разному,  что еще более осложняет изучение. Наиболее 
часто 
         используются три  схемы,  которые  я  сейчас  поясню.  Т
рудно 
         сказать  какая из них наилучшая - мы будем пользоваться 
самой 
         простой.  Если  Вы  собираетесь  знакомиться  с   технич
еской 
         литературой по компьютерам, Вам необходимо знать три схе
мы. 
              Если  записать  все  восемь  битов  образующих байт
 так, 
         чтобы первым был "старший  значащий",  а  последним  "мл
адший 
         значащий"  бит, то их можно будет пронумеровать от перво
го до 
         восьмого. Такую последовательность можно назвать  просто
  "по 
         порядку".  Такой  способ записи мы и будем далее использ
овать 
         как наиболее простой. Недостаток его заключается в  том,
  что 
         он  не  имеет никакого смыслового значения. Другие два м
етода 
         связаны с числовым "весом" каждого бита.  По  второму  м
етоду 
         биты  нумеруются  справа  налево,  начиная с нуля. Это с
пособ 
         записи  "по  степеням"  и  каждый  номер  бита  соответс
твует 
         степени  двойки. Такой способ записи наиболее распростра
нен в 
         технической литературе.  И  последний  метод,  который  
можно 
         назвать  "по  значению",  обозначает  каждый  бит  значе
нием, 
         равным двум в степени, соответствующей этому биту. 
              Ниже приведена таблица,  показывающая  все  три  сп
особа 
         записи: 
              
              По порядку  По степени  По значению  Бит
         ________________________________________________________
____
              
                  1-ый        7          128     10000000
                  2-ой        6          64      01000000
                  3-ий        5          32      00100000
                  4-ый        4          16      00010000
                  5-ый        3          8       00001000
                  6-ой        2          4       00000100
                  7-ой        1          2       00000010
                  8-ой        0          1       00000001
              
         ________________________________________________________
____
              
              Как  уже  упоминалось,  мы  будем просто нумеровать
 биты 
         слева направо, по порядку. Остальные  два  способа,  осо
бенно 
         нумерацию   "по   степени",   можно   встретить  в  разл
ичной 
         литературе. Нумерация "по значению"  удобна  в  тех  слу
чаях, 
         когда  необходимо  связать  числовые  значения  байта  с
  его 
         битами. Например, в программе можно  установть  1-ый  и 
 8-ой 
         биты,  присвоив байту значение 128+1. Каждый из этих спо
собов 
         нумерации битов может быть расширен от  8-битового  байт
а  до 
         16-битового   слова,   что  также  может  Вам  встретить
ся  в 
         технической литературе. 
              Приложение 1.1   Текст   программы   визуализации  
 всех 
         символов на экране дисплея (Бейсик).
         
         
         1000  REM Листинг 1.1 -- Программа для отображения всех
         1010  REM символов экрана. (С) Авторское право 1983,
         1020  REM Питер Нортон
         1030  GOSUB 2000 'ЗАГОЛОВОК
         1040  GOSUB 3000 'ОПРЕДЕЛЕНИЕ ТИПА ДИСПЛЕЯ И УСТАНОВКА А
ДРЕСА
         1050  GOSUB 2000 'СНОВА УСТАНОВИТЬ ЗАГОЛОВОК
         1060  GOSUB 4000 'ФОРМИРОВАНИЕ ОКРУЖАЮЩИХ КОММЕНТАРИЕВ
         1070  GOSUB 5000 'ФОРМИРОВАНИЕ МАССИВА ЭКРАНА
         1080  GOSUB 6000 'ЗАВЕРШЕНИЕ РАБОТЫ И ВОЗВРАТ В ДОС
              
         2000  REM Подпрограмма вывода заголовка
         2010  KEY OFF : CLS : WIDTH 80
         2020  REM
         2030  PRINT "   Программы для книги "Персональный компью
тер"
         2040  PRINT "   фирмы "IBM".(С) Авторское право 1983"
         2050  PRINT "   Питер Нортон"
         2060  PRINT 
         2070  PRINT "Программа 1-1: Демонстрация всех символов э
крана"
         2999  RETURN
         
         3000  REM Подпрограмма проверки типа дисплея
         3010  PRINT
         3020  PRINT "Прежде чем продолжить работу сообщите,"
         3025  PRINT "дисплей цветной-графический?";
         3030  GOTO 3060
         3040  PRINT
         3050  PRINT "(ответ Д или Н)";
         3060  ANSWER$ = INKEY$
         3070  IF LEN(ANSWER$) < 1 THEN 3060
         3080  IF LEN(ANSWER$) > 1 THEN 3040
         3090  SEGVAL! = 0
         3100  IF MID$(ANSWER$,1,1) = "Y" THEN SEGVAL! = &HB800 '
Цветной
         3110  IF MID$(ANSWER$,1,1) = "y" THEN SEGVAL! = &HB800 '
Цветной
         3120  IF MID$(ANSWER$,1,1) = "N" THEN SEGVAL! = &HB000 '
Монохр.
         3130  IF MID$(ANSWER$,1,1) = "n" THEN SEGVAL! = &HB000 '
Монохр.
         3140  IF SEGVAL! = 0 THEN 3040
         3150  DEF SEG = SEGVAL!
         3999  RETURN
         4000  REM  подпрограмма для формирования сопроводительны
         4005  REM  сообщений
         4010  FOR HEX.DIGIT% = 0 TO 15
         4020     LOCATE 6,HEX.DIGIT% * 3 + 1
         4030     PRINT HEX$(HEX.DIGIT%)
         4040     LOCATE HEX.DIGIT% + 8,8
         4050     PRINT HEX$(HEX.DIGIT%)
         4060  NEXT HEX.DIGIT%
         4070  LOCATE  ,,0
         4999  RETURN
         
         5000  REM  подпрограмма форомирования массива экрана
         5010  FOR ROW% = 0 TO 15
         5020   FOR COL% = 0 TO 15
         5030    POKE(ROW% + 7) * 160 + COL%*6 + 26, COL% + ROW% 
* 16
         5040   NEXT COL%
         5050  NEXT ROW%
         5999  RETURN
         
         6000  LOCATE 25,1,1
         6010  PRINT "Нажмите любую клавишу для возврата в ДОС...
         6020  IF LEN(INKEY$) = 0 THEN 6020 'ожидание нажатия кла
виши
         6030  CLS
         6999  SYSTEM
         9999  REM Конец листинга программы 1-1
         
             
                    ГЛАВА 2. АРХИТЕКТУРА ТЕХНИЧЕСКИХ СРЕДСТВ
                       
                       
              
              В настоящей главе мы рассмотрим  физическую  органи
зацию 
         персонального  компьютера фирмы IBM, его периферию и при
нципы 
         сопряжения  отдельных  компонентов.  Поскольку   предлаг
аемая 
         книга  не  является  руководством  по организации технич
еских 
         средств,  мы  не  будем  рассматривать  эти  вопросы  сл
ишком 
         детально.  Приведенных  сведений,  однако,  достаточно, 
чтобы 
         понять  принципы  работы   IBM/PC   ,состав   дополнител
ьного 
         оборудования,  подключаемого  к  компьютеру и особенност
и его 
         взаимодействия с остальной системой. 
              Компьютер  во  многом  напоминает  автомобиль.  Он 
также 
         состоит из множества отдельных частей  и  для  того,чтоб
ы  им 
         польэоваться  (  так  же  как  в  случае  с  автомобилем
)  не 
         обязательно знать назначение каждой детали. Однако,  есл
и  Вы 
         хотите  использовать  всю  систему,  необходимо иметь хо
тя бы 
         приближенное представление о том как функционируют  отде
льные 
         части. Как раз этому и посвящена настоящая глава. 
              
              
                2.1.  Микропроцессор-центральный  уэел   персонал
ьного
                                     компьютера
              
              Центром вычислительной системы  является  ее  проце
ссор. 
         Это  основное  звено, или "мозг" компьютера. Именно проц
ессор 
         обладает   способностью   выполнять   команды,   составл
яющие 
         компьютерную  программу.  Персональные компьютеры строят
ся на 
         базе микропроцессоров, выполняемых в настоящее время на 
одном 
         кристалле   или   "чипе".  Микропроцессор,  использованн
ый  в 
         IBM/PC, был разработан  и  создан  фирмой  "Интел",  нач
авшей 
         производство микропроцессоров много лет назад. 
              В IBM/PC используется микропроцессор 8088 фирмы "Ин
тел", 
         который  практически полностью идентичен микропроцессору
 8086 
         той же фирмы. Эти микропроцессоры (8086 и  8088  )  выпо
лняют 
         одни и те же команды, так что с точки зрения программиро
вания 
         они обладают функциональной эквивалентностью ( различия 
между 
         ними заметны только конструктору и мы остановимся на них
 чуть 
         позже).    Все,    что    касается    программирования  
  для 
         микропроцессора 8086 относится и к микропроцессору 8088.
              Принципиальное   отличие    IBM/PC    от    персона
льных 
         компьютеров предыдущего поколения заключается в использо
вании 
         16-разрядного микропроцессора. До появления  IBM/PC  наи
более 
         популярные   персональные   компьютеры   строились   на 
 базе 
         8-разрядных   микропроцессоров,   таких   как   6502   (
фирмы 
         "Моторолла",  который  использован  в персональном компь
ютере 
         "Эппл-2", 8080 (фирмы  "Интел")  или  Z80  (фирмы  "Зайл
ог"). 
      
         Различия  между  8-  и 16-разрядными микропроцессорами в
есьма 
         существенны,  и  их  трудно  сформулировать   одной   фр
азой. 
         Любопытно,что   наименее   существенное  различие  дало 
 этим 
         микропроцессорам их названия:  8-разрядные  процессоры  
могут 
         манипулировать  данными,  состоящими из 8 бит, а 16-разр
ядные 
         процессоры могут работать и 16-разрядными данными.  Оба 
 типа 
         процессоров  позволяют  добиться  одинаковых результатов
, так 
         что в этой части различие между ними не слишком  значите
льно. 
         Основное   преимущество  16-разрядных  процессоров  пере
д  их 
         8-разрядными  предшественниками  заключается  в  значите
льном 
         повышении  их  быстродействия,  мощности и удобства их н
абора 
         команд (причем операции с  16-разрядными  числами  соста
вляют 
         лишь  часть  этого  набора). Кроме того (и это самое гла
вное) 
         существенно   увеличивается    объем    адресуемой    па
мяти. 
         Большинство  8-разрядных  процессоров  может  использова
ть не 
         более  64К  памяти,  что  значительно  уменьшает  возмож
ности 
         эффективного    использования    персональных    компьют
еров. 
         Процессор 8088, используемый в IBM/PC,  позволяет  адрес
овать 
         1024К    или    свыше    одного    миллиона    байт   па
мяти. 
         Может,разумеется,возникнуть  потребность  в  памяти  бол
ьшего 
         объема,   но,   для  большинства  практических  нужд,  о
дного 
         миллиона байт вполне достаточно. 
              Таким  образом,  мы  установили наиболее важное раз
личие 
         между   процессором   8088   и   8-разрядными    процесс
орами 
         персональных   компьютеров   предыдущего   поколения:   
объем 
         адресуемой памяти больше не является жестким ограничение
м для 
         задач,   которые   можно   решать   с  помощью  персонал
ьного 
         компьютера. 
              В  чем же состоит различие между микропроцессором 8
088 и 
         его "старшим братом" - микропроцессором  8086?  Функцион
ально 
         они одинаковы - выполняют одинаковые команды, используют
 одни 
         и те же данные, исполняют  одинаковые  программы.  Отлич
аются 
         они  лишь способом обмена данными с внешней средой. Проц
ессор 
         8086 работает с  периферийным  оборудованием,  которое  
может 
         параллельно  обрабатывать  16-разрядные  данные,  а проц
ессор 
         8088 может обмениваться только  8-разрядными  словами.  
Таким 
         образом,  различие  между  процессорами 8088 и 8086 сост
оит в 
         ширине  внешней  шины  данных  -  процессор  8086  перес
ылает 
         16-разрядные,  а  8088  -  восьмиразрядные  данные.  Это
 дает 
         основание утверждать, что микропроцессор 8088 не  являет
ся  в 
         полном   смысле   16-разрядным.   Такое  утверждение  от
части 
         соответствует   истине,   но   только   отчасти.    Внут
реняя 
         архитектура  8088 - 16-разрядная, но он не использует вн
ешнюю 
         16-разрядную шину данных. Подробнее о шине данных будет 
 идти 
         речь в параграфе 2.3. 
              В   практичеcком   плане   указанное   различие    
между 
         микропроцессорами  8086  и 8088 имеет два аспекта. Во-пе
рвых, 
         при передаче более чем одного байта  данных,  процессор 
 8086 
         работает  в  два  раза  быстрее.  Это  не  означает,  чт
о  он 
         выполняет  всю  работу  вдвое  быстрее,  поскольку   ожи
дание 
         передачи данных занимает только часть времени работы и, 
кроме 
         того, в некоторых случаях требуется передавать только 8 
 бит. 
         Однако,  в  тех  случаях,  когда  процессор  ожидает пер
едачу 
         большого  объема  данных,  8086  тратит  на  ожидание  м
еньше 
         времени и, следовательно, выполняет работу быстрее. 
              Второй   аспект   заключается   в  проектировании  
схемы 
         соединений и выборе компонентов. Восьмиразрядные  цепи  
проще 
         проектировать и в настоящее время имеется множество недо
рогих 
         и очень надежных восьмиразрядных компонентов. Таким  обр
азом, 
         воспользовавшись  микропроцессором 8088, фирма "IBM" упр
стила 
         свой персональный компьютер и уменьшила его  стоимость  
ценой 
         незначительного уменьшения скорости вычислений. 
                
                2.2.   Краткие   сведения   об  остальных  компон
ентах
         компьютера 
                
              Для того чтобы микропроцессор мог  работать,  необх
одимы 
         некоторые вспомогательные компоненты, подобно тому как о
дного 
         двигателя недостаточно, чтобы заставить автомобиль двига
ться. 
              Многие  части  автомобиля  могут  переноситься  с  
одной 
         модели на другую - для персональных компьютеров это еще 
более 
         обычное дело. Лишь немногие компоненты IBM/PC были специ
ально 
         разработаны  для  нее,  -  фактически  большая  часть си
стемы 
         составлена   из   стандартных    компонентов,    начиная
    с 
         микропроцессора 8088 фирмы "Интел". Особенность персонал
ьного 
         компьютера  фирмы  "IBM"  состоит  в   оригинальном   сп
особе 
         организации известных  компонентов в  единую  функционир
ующую 
         систему.     Электронная     промышленность      предста
вляет 
         разработчикам    компьютеров    большой   набор   необхо
димых 
         стандартных компонентов, задача  разработчика  заключает
ся  в 
         том, чтобы объединить их нужным образом. 
              Такое  описание  процесса  разработки  компьютеров 
может 
         породить мысль, что разрабатывать компьютеры очень прост
о  и, 
         что  все  они очень похожи друг на друга. Но это настоль
ко же 
         верно, как то, что работа писателя заключается в выборе 
 слов 
         из   словаря.   Персональные   компьютеры,  подобные  IB
M/PC, 
         действительно в значительной  части  состоят  из  станда
ртных 
         компонентов, однако,   главное   заключается   в  способ
е  их 
         обьединения. 
              Составляющие IBM/PC можно рассматривать с трех разл
ичных 
         точек   зрения:   по   тому  где  они  размещаются,  как
  они 
         функционируют, и  как  они  взаимодействуют  друг  с  др
угом. 
         Рассмотрим    вопрос    пространственного   размещения  
 этих 
         составляющих. 
              Физически  составляющие  IBM/PC   можно   разделить
   на 
         компоненты  системного  блока  и компоненты блока расшир
ения. 
         Все основные платы, входящие в состав  любой  модели  IB
M/PC, 
         размещаются  в большом блоке, получившем название систем
ного. 
         (Компьютеры фирмы "Эппл" используют более цветистое  наз
вание 
         для  аналогичного  блока  - материнский блок.) Системный
 блок 
         включает все необходимые компоненты,  позволяющие  компь
ютеру 
         работать   без   каких-либо   дополнений.   Здесь   нахо
дятся 
         микропроцессор, первые 64К памяти и  "встроенные"  прогр
аммы, 
         такие   как   интерпретатор   языка   Бейсик,   записанн
ый  в 
         микросхемах  ПЗУ.  Большая  часть  компонентов,  описанн
ых  в 
         следующем  параграфе,  также  находится в системном блок
е. На 
         рис.2.1 показана упрощенная схема системного блока  (пок
азаны 
         наиболее существенные детали). 
      
              Системный блок расположен в основании IBM/PC и  зак
лючен 
         в  корпус.  Он  занимает  весь  корпус в длину и примерн
о две 
         трети в ширину. Если открыть корпус компьютера, то внутр
и, на 
         дне  корпуса  можно увидеть системный блок. Если взгляну
ть на 
         него со стороны задней стенки корпуса,можно увидеть в  ц
ентре 
         большой элемент схемы IBM/PC - микропроцессор 8088. 
              Правая   часть  системного  блока  находится  под  
левым 
         дисководом, а место слева от системного блока свободно -
  оно 
         предназначено  для размещения блоков расширений. В левом
 углу 
         системного   блока   имеется   пять    свободных    разъ
емов, 
         предназначенных для подключения дополнительного оборудов
ания, 
         которое  может  быть  введено  в  состав  компьютера.   
Блоки 
         расширения   вставляются  в  эти  разъемы,  располагаясь
  над 
         системным блоком. 
              Блоки  расширения  или  карты,  как их иногда назыв
ают - 
         могут использоваться для обслуживания устройств, подключ
аемых 
         к  IBM/PC.  Они могут использоваться для двух основных ц
елей: 
         для увеличения объема  памяти  и  подключения  дополните
льных 
         устройств. Если оборудование умещается на одной плате, т
о его 
         можно разместить  внутри  корпуса  IBM/PC.  Если  же  он
о  не 
         помещается в корпус, например, в случае с дисплеем, то в
нутри 
         размещается  только   плата   управления,   соединяющаяс
я   с 
         оборудованием  с  помощью  кабеля,  который  можно пропу
стить 
         через отверстие в  задней  стенке  корпуса.  Каждому  ра
зъему 
         расширения   соответствует  специальное  отверстие  в  з
адней 
         стенке корпуса, закрытое заглушкой, если оно не использу
ется. 
              Системный  блок  разработан  фирмой   "IBM",   а   
блоки 
         расширения  могут разрабатывать все желающие, при услови
и что 
         они будут соблюдать основные  правила,  касающиеся  разм
еров, 
         электрических  параметров  соединений, теплового режима 
и так 
         далее. 
              
                2.3. Функциональное назначение 
         
                
              Может Вам эти сведения  и  не  пригодятся,  но,  ви
димо, 
         будет  интересно  узнать как работают основные элементы 
схемы 
         IBM/PC. Если какой-либо  элемент  будет  иметь  значение
  для 
         понимания  материала  последующих  разделов книги, я буд
у это 
         специально отмечать, чтобы  Вы  не  подумали,  что  свед
ения, 
         полученные в этом разделе можно просто забыть. 
              Сигналы  синхронизации  работы  системы   обеспечив
аются 
         генератором 8284А. Эти сигналы используются всеми  элеме
нтами 
         компьютера   и   задают  длительность  операций.  С  так
товым 
         генератором  связан  таймер   8255А-5,   использующийся 
  для 
         поддержки  интерфейса накопителя на кассетной магнитной 
ленте 
         и встроенного динамика. В главе 11 будет  описано  управ
ление 
         динамиком  и  мы  увидим  как  "программировать"  таймер
  для 
         извлечения звуков. 
      
              Функционирование  компьютерной   системы   основано
   на 
         использовании  прерываний,  работа с которыми будет опис
ана в 
         следующей главе. Для организации  работы  системы  преры
ваний 
         используется  микросхема 8259А.
              Когда данные передаются внутри компьютерной системы
, они 
         проходят по  общему  каналу,  к  которому  имеют  доступ
  все 
         компоненты  системы.  Этот путь получил название шины да
нных. 
         Концепция  шины   представляет   собой   один   из   наи
более 
         совершенных  методов  унификации  при разработке компьют
еров. 
         Вместо   того   чтобы   пытаться   соединять   все   эле
менты 
         компьютерной  системы  между собой специальными соединен
иями, 
         разработчики компьютеров ограничили  пересылку  данных  
одной 
         общей  шиной.  Данные  пересылаются  по  шине в сопровож
дении 
         специальных сигналов, обозначающих их  назначение.  Эта 
 идея 
         чрезвычайно  упрстила  конструкцию  компьютеров и сущест
венно 
         увеличила ее гибкость. Чтобы  добавить  новый  компонент
,  не 
         требуется    выполнять    множество   различных   соедин
ений, 
         достаточно  присоединить  его  к  шине.   Чтобы   упоряд
очить 
         передачу  информации  по  шине  используется  контроллер
 шины 
         8288. 
              Все упоминавшиеся до  сих  пор  элементы  размещают
ся  в 
         системном блоке. Если взглянуть на основные блоки расшир
ения, 
         можно  обнаружить  еще  несколько   интересных   компоне
нтов. 
         Имеется  два  типа адаптеров дисплеев для IBM/PC. Один и
з них 
         предназначен для управления монохромным дисплеем фирмы  
"IBM" 
         -  для  управления цветным графическим дисплеем ( или пр
остым 
         монохромным дисплеем,  который  также  может  подключать
ся  к 
         цветному/графическому адаптеру). Хотя дисплеи этих двух 
типов 
         работают по-разному и  имеют  различные  характеристики,
  для 
         управления  ими  используется  одна  и  та  же  микросхе
ма  - 
         контроллер дисплея 6845 (фирмы "Моторола"). 
              Для   управления   дисководами  используется  микро
схема 
         контроллера  гибких  дисков  -  PD765  фирмы  "NEC"  или
   ее 
         эквивалент  (расположена  на  плате  адаптера гибких дис
ков). 
         Изучая листинги BIOS, приведенные в  техническом  руково
дстве 
         по IBM/PC, можно встретить таинственную ссылку на "NEC".
 Речь 
         идет как раз о контроллере гибких дисков. Хотя  мы  не  
будем 
         рассматривать   такие   подробности,   можно  упомянуть,
  что 
         возможно непосредственное управление работой  гибких  ди
сков, 
         путем  выдачи  команд  контроллера.  Эти  команды  описа
ны  в 
         техническом руководстве. 
                
                2.4. Использование разъемов расширения
                
              Любые дополнительные устройства подключаются к IBM/
PC  с 
         помощью  одного  из  разъемов  расширения,  каждый из ко
торых 
         имеет 62  соединительных  провода.  Эти  62  линии  позв
оляют 
         передавать  все  сигналы,  необходимые  для  управления 
любым 
         оборудованием, которое может быть подключено  к  IBM/PC.
  Все 
         линии   работают   параллельно,   так  что  устройства  
можно 
         подключать  к  любому  из  пяти   разъемов.   Любой   си
гнал, 
         посылаемый  одному  из  блоков расширения,  передается и
 всем 
         остальным, поскольку они подключены  к  параллельным  ли
ниям. 
      
         Здесь  имеет  место  расширение  идеи  общей шины данных
: все 
         блоки расширения  используют общее  62-проводное  соедин
ение. 
         называемое каналом ввода/вывода. 
              По  характеру использования все линии можно раздели
ть на 
         четыре категории. Во-первых, восемь  линий  используются
  для 
         подвода  питания  к блокам расширения с различными номин
алами 
         напряжений. 
              Далее, еще восемь линий используется для передачи в
осьми 
         бит  данных  на/с  шины  данных.  Все данные проходят по
 этой 
         шине, независимо от направления передачи. 
              Еще  двадцать  линий  предназначены для адресации. 
Когда 
         данные передаются  в  память  или  считываются  из  нее,
  или 
         данными   обмениваются   с  внешним  устройством,  необх
одимо 
         указать адрес, который может быть либо адресом ячейки па
мяти, 
         либо  номером  устройства.  При работе с памятью использ
уются 
         все 20 линий, это позволяет передать  адрес  одной  из  
1024К 
         ячеек  памяти. Для устройств ввода/вывода используется т
олько 
         девять  линий,  что  позволяет   адресовать   512   разл
ичных 
         устройств. 
              Остальные   линии   канала   используются  для  пер
едачи 
         различных сигналов управления. Примерами таких сигналов 
могут 
         служить команды чтения из памяти, записи в память или ко
манды 
         чтения/записи для периферийных устройств. 
              Каждое   внешнее   устройство,  подключенное  к  ра
зъему 
         расширения постоянно ожидает  сигналов  канала  ввода/вы
вода. 
         Предположим,    например,    что    выдана   команда   в
вода, 
         идентифицируемая сигналом на линии  чтения  по  вводу/вы
воду. 
         Когда  это  произойдет,  все  устройства  будут  читать 
 шину 
         адреса, который не относится к памяти  компьютера  (поск
ольку 
         не  была  выдана  команда  работы  с  памятью).Если же в
ыдана 
         команда работы с  памятью,  то  все  устройтсва  ввода/в
ывода 
         будут   игнорировать   содержимое   шины   адреса.  Поск
ольку 
         запрашивалась  операция  ввода/вывода,  каждое   перифер
ийное 
         устройство  проверит  содержимое  шины  адреса. Если адр
ес на 
         шине  совпадает  с  адресом  устройтсва,  то   оно   нач
инает 
         выполнять  операцию.  В  противном случае никаких действ
ий не 
         производится.Таков принцип работы блоков расширения. 
                
                2.5. Что еще необходимо знать об аппаратных средс
твах
                
              Есть  еще  несколько  интересных  подробностей,  ко
торые 
         полезно знать о системном блоке IBM/PC. 
              Во-первых, внутри корпуса  IBM/PC  спрятаны  два  н
абора 
         переключателей.   Их  называют  переключателями  конфигу
рации 
         системы (они выполнены в виде корпуса с двумя рядами выв
одов, 
         т.е.   корпуса   типа  DIR).  Установка  этих  переключа
телей 
         указывает какое оборудование подключено к  IBM/PC,  напр
имер, 
         количество  дисководов,  объем  доступной  памяти  и т.д
. Эти 
      
         переключатели ничем реально не управляют -  они  использ
уются 
         только для удобства. После включения IBM/PC программы за
пуска 
         считывают положение этих переключателей и затем устанавл
ивают 
         содержимоке  определенных  ячеек  памяти  в соответствии
 с их 
         положением.  Затем,  если  какой-либо  программе   необх
одимо 
         узнать   ,   какой   объем   памяти  установлен,  провер
яется 
         содержимое  этих  ячеек.  (Хранение  информации  о  поло
жении 
         переключателей  в  памяти  очень удобно, поскольку появл
яется 
         возможность, в  случае  необходимости,  ее  изменения.  
Таким 
         образом, программа может изменить положение переключател
ей и, 
         следовательно,   как   бы   изменить   список    подключ
аемых 
         устройств.) 
              Как  видите,  использование  переключателей конфигу
рации 
         системы  "логическое"  скорее  чем  "физическое".   Изме
нение 
         положений переключателей не отключает и не подключает ни
какие 
         устройства,  оно  просто  изменяет  ту  информацию,   ко
торую 
         программы могут получить о конфигурации системы. 
              Далее,  рассмотрим  сопроцессор.  Когда   разрабаты
вался 
         микропроцессор  8088, для него была предусмотрена способ
ность 
         выполнения обычных, целочисленных арифметических операци
й, но 
         он  не способен оперировать с числами с плавающей запято
й или 
         вещественными  числами  (  в  языке  Бейсик  это   назыв
ается 
         арифметикой   обычной  и  двойной  точности).  Арифметич
еские 
         операции над числами с плавающей  запятой  могут  выполн
яться 
         одним  из  двух  способов. Первый и наиболее распростран
енный 
         способ - программная реализация с помощью логических опе
раций 
         и    целочисленных    арифметических   операций   подрог
рамм, 
         выполняющих  вычисления  и  дающих  результаты  в   форм
е   с 
         плавающей  запятой.  Второй  способ  основан на использо
вании 
         специализированного сопроцессора. 
              Микропроцессор 8088 сконструирован так, что он позв
оляет 
         использовать  арифметический  сопроцессор 8087 фирмы "Ин
тел". 
         Специализация процессора 8087  состоит  в  быстрой  обра
ботке 
         чисел  с  плавающей  запятой.  Он может выполнять как об
ычные 
         операции сложения, вычитания,  умножения  и  деления,  т
ак  и 
         более     сложные     операции,    такие    как    вычис
ление 
         тригонометрических  функцмй.   Конструктивно   заложенны
е   в 
         микропроцессор  8088  сигналы позволяют ему передавать р
аботу 
         сопроцессору 8087, а затем получать результаты работы.  
Чтобы 
         использовать арифметический сопроцессор, необходимо имет
ь его 
         в составе компьютера,  а  кроме  того  необходимы  прогр
аммы, 
         которые  могут  выдавать  специальные  коды,  необходимы
е для 
         запуска сопроцессора 8087. Хотя в первой версии PC фирма
  IBM 
         не   включала   в   систему   сопроцессор,  гнездо  для 
 него 
         предусмотрено  в  системном  блоке.  На  рис.2.1.  его  
можно 
         увидеть    в   правом   верхнем   углу,   рядом   с   гн
ездом 
         микропроцессора 8088. 
      
              Конструкция микропроцессоров  8086/8088  предусматр
ивает 
         два   основных  способа  повышения  вычислительной  мощн
ости. 
         Первый заключается в  использовании  сопроцессора  8087,
  для 
         которого   в   IBM/PC   предусмотрено  специальное  гнез
до  в 
         системном блоке.  Второй  способ  заключается  в  органи
зации 
         мультипроцессорного  режима,  при  котором  несколько об
ычных 
         микропроцессоров совместно выполняют вычисления,  распре
деляя 
         нагрузку  между  собой.  Фирма  "IBM"  не предусмотрела 
такой 
         режим работы в конструкции своего  персонального  компью
тера. 
         Еще  один вспомогательный "чип" - процессор ввода/вывода
 8089 
         позволяет повысить общую производительность системы  на 
 базе 
         процессора  8086/8088,  однако  его  использование  такж
е  не 
         предусмотрено в IBM/PC. 
              Рассмотрим теперь еще одно  пустое  гнездо  в  сист
емном 
         блоке  IBM/PC.  "Встроенное"  программное  обеспечение I
BM/PC 
         записано в микросхемах постоянного  запоминающего  устро
йтсва 
         (ПЗУ), расположенных почти в центре системного блока, бл
иже к 
         левой стороне. Как видно из  рис.2.1  таких  микросхем  
пять. 
         Рядом  с  ними,  с  левой  стороны  имеется свободное гн
ездо, 
         которое оставлено специально с  целью  добавления  каких
-либо 
         программ. Назначение этого гнезда вызывает различные дом
ыслы. 
         Лично  я  вижу   три   возможных   разумных   предназнач
ения. 
         Во-первых,   оно   могло   быть   оставлено  по  соображ
ениям 
         надежности - если в какой-нибудь из записанных в ПЗУ про
цедур 
         обнаружатся ошибки, исправление которых приведет к увели
чению 
         объема процедуры, то в  это  гнездо  можно  будет  устан
овить 
         микросхему  с  записью  этих изменений. Во-вторых, если 
"IBM" 
         расширит  номенклатуру  поддерживаемых  системой   устро
йств, 
         таких  как  жесткие диски большой емкости, тогда в это г
нездо 
         можно  будет  установить   микросхему   ПЗУ   с   записа
нными 
         программами  управления.  Правда,  блок расширения для л
юбого 
         нового  устройтсва  также  может  содержать  все  необхо
димые 
         программы,    так    что   действительной   необходимост
и   в 
         дополнительном гнезде для этих целей нет. Третья, и  наи
более 
         вероятная,  возможность  связана  с  поддержкой  сопроце
ссора 
         8087.  В  это  гнездо  можно  установть  ПЗУ  с   програ
ммами 
         сопроцессора.   Такие   программы  позволили  бы  работа
ть  с 
         арифметическим     сопроцессором      8087      "встроен
ному" 
         интерпретатору  Бейсика,  а  также  программам, написанн
ым на 
         других языках, например, на Паскале, Фортране или Бейсик
е  (с 
         помощью компилятора). 
                
                2.6. Три аспекта рассмотрения архитектурных решен
ий
                
              Все  о чем мы говорили до сих пор в этой главе отно
сится 
         только к оригинальной модели IBM/PC, т.е. к первому  асп
екту. 
         На  совместимые  с  IBM/PC  компьютеры  распространяется
 лишь 
         часть информации, а вся  остальная  применяется  для  ка
ждого 
         конкретного  компьютера.  Совпадает  обычно  лишь одна д
еталь 
         всех совместимых с РС компонентов  -  это  вид  разьемов
  для 
         подключения блоков расширения. В этой части все РС - под
обные 
         компьютеры практически полностью повторяют IBM/PC. 
              В   сфере  больших  компьютеров  уже  давно  образо
вался 
         определенный круг так  называемых  элементов  совместимы
х  по 
         способу  соединения.  Такие  элементы  могут  заменить  
части 
         системы путем отключения исходного элемента  и  включени
я  на 
         его место заменителя. Такая замена может производиться к
ак со 
         стороны периферийных устройтсв компьютера, так и  со  ст
ороны 
         процессора. 
              То же самое  происходит  и  с  IBM/PC.  В  месте  л
юбого 
         соединения  можно  обнаружить  конкуренцию  между  разли
чными 
         вариантами  элементов  замены  по  обе  стороны   соедин
ения. 
         Постоянным  остается  только  формат  разъема  - его изм
енить 
         нельзя.  Таким   образом,   общим   для   всех   компьют
еров, 
         совместимых  с  IBM/PC,  будет формат разъема для подклю
чения 
         блоков расширения. 
              Материал,  рассматривавшийся  в  начале  этой  глав
ы,  к 
         третьей  области  интересов   -   компьютером,   использ
ующих 
         различные    версии    операционной    системы    MS-DOS
,   - 
         непосредственного отношения не имеет. Однако,  в  той  ч
асти, 
         где  речь  пойдет  о  значении  дополнительного оборудов
ания, 
         подключаемого к IBM/PC, все  сказанное  об  IBM/PC  в  р
авной 
         степени относится и к другим персональным компьютерам. 
               
               2.7. Возможности комплектации  IBM/PC
               
              В этом параграфе речь пойдет  о  различных  возможн
остях 
         комплектации     IBM/PC     дополнительными     перифери
йными 
         устройствами  и  о  том,  как  это  сказывается  на   ра
бочих 
         характеристиках.   Не  все  понимают  значение  перифери
йного 
         оборудования. Дескать, IBM/PC и есть  IBM/PC,  независим
о  от 
         того,  что  к  нему  подключено.  Однако,  для  практиче
ского 
         использования  решающее  значение  имеет   то   оборудов
ание, 
         которое подключено к компьютеру. 
              По моему мнению существует  три  или  четыре  доста
точно 
         сильно различающихся персональных компьютера фирмы "IBM"
. 
              Речь  идет  об  одной  модели  компьютера  с  разли
чными 
         комплектами  периферийных   устройтсв,   которые   опред
еляют 
         область применения компьютера. 
              ИГРУШКА.  Это IBM/PC без дисковой памяти, так назыв
аемая 
         "кассетная система". Такая  конфигурация,  по  моему  мн
ению, 
         никогда  и  никем  не  воспринималась всерьез и, вероятн
о, не 
         имела права на существование. Я  убежден,  что  ее  появ
ление 
      
         связано  только с желанием снизить цену базовой модели, 
чтобы 
         не отпугнуть потенциальных покупателей. Такой  комплект 
 вряд 
         ли  можно  использовать  для решения сколько-нибудь серь
езных 
         задач, так что усеченный  вариант  мощной  машины  стано
вится 
         похож   на   игровую   машину  типа  "Атари"  или  "Матт
ель". 
         Доказательством бесполезности такого варианта  может  сл
ужить 
         отсутствие  программ  на  кассетах.  Единственная возмож
ность 
         использования этой системы состоит, вероятно, в подготов
ке  и 
         обучении  пользователей  перед  переходом  к  работе  с 
более 
         серьезным оборудованием. 
              Следующие  два  варианта  комплектации  IBM/PC  явл
ялись 
         основными  вариантами   компоновки   IBM/PC   в   начале
   ее 
         применения.  На  их примере хорошо иллюстрируется положе
ние о 
         том, что в некотором  смысле  существует  не  один  комп
ьютер 
         IBM/PC  с  различным  периферийным оборудованием, а неск
олько 
         существенно отличающихся друг от друга компьютеров IBM/P
C. 
              ДЕЛОВОЙ КОМПЬЮТЕР. Это IBM/PC  с  монохромным  дисп
леем, 
         желательно  фирмы "IBM". Естественно, эта машина должна 
иметь 
         два дисковода, устройство печати и,  возможно,  еще  как
ое-то 
         оборудование.  Но  отличает  этот  компьютер,  прежде  в
сего, 
         дисплей. Графика здесь не требуется,  вся  работа  ведет
ся  в 
         алфавитно-цифровом (текстовом) режиме. Использолвание ди
сплея 
         фирмы "IBM" очень облегчает чтение текста  на  экране.  
Сфера 
         применения  этого  компьютера  - в основном учреждения. 
Экран 
         монохромного дисплея фирмы "IBM" не утомляет глаза, даже
 если 
         смотреть на него целый день. С помощью этого компьютера 
можно 
         выполнять деловые расчеты,  формировать  планы  (наприме
р,  с 
         помощью   программы  "VisiCalk")  или  готовить  докумен
ты  с 
         помощью текстовых процессоров. 
              ГРАФИЧЕСКАЯ МАШИНА.  Это  IBM/PC  оборудованный  цв
етным 
         графическим дисплеем и остальными периферийными устройст
вами, 
         включая  дискеты.  Этот  компьютер   позволяет   работат
ь   с 
         графическими    изображениями,    правда   ценой   пониж
енной 
         различимости  символов.  Использование  этой  машины  тр
уднее 
         описать  простыми  категориями, но они могут использоват
ься в 
         инженерном и архитектурном черчении, деловой графике, иг
рах и 
         мультипликации. 
              Я утверждаю,  что  "деловой  компьютер"  и  "графич
еская 
         машина"   являются  различными  компьютерами,  поскольку
  они 
         предназначены для совершенно разных целей. И, что  еще  
более 
         важно,  пограммные продукты для них тоже совершенно разл
ичны. 
         Ясно, что деловые программы, выдающие  текстовые  резуль
таты, 
         смогут  работать  и  на  компьютерах  с цветными графиче
скими 
         дисплеями, однако, это  будет  более  утомительно  для  
глаз. 
         Программы,  написанные  для графического дисплея, опреде
ленно 
         не будут работать на деловом компьютере. 
              Такое   частичное   разделение   между   предполага
емыми 
         вариантами использования  деловых  систем  IBM/PC  делае
т  их 
         практически  разными  машинами,  со  своими  рынками и с
воими 
         кругом пользователей. Но все же,  все  системы  IBM/PC  
имеют 
         очень  много  общего  в оборудовании, программных средст
вах и 
         интересах  пользователей.  Я  так  подробно  остановился
   на 
         разделении  деловых  и  графических  систем,  чтобы  Вы 
лучше 
         представляли себе сам факт существования такого различия
. 
      
              МАШИНА С ВИНЧЕСТЕРОМ. Это IBM/PC,  к  которой  подк
лючен 
         диск  большой емкости с высокой скоростью доступа. Такой
 диск 
         часто называют "жестким"  (чтобы  отличать  его  от  "ги
бких" 
         дисков) или "винчестером" (по кодовому наименованию одно
го из 
         ранних   проектов   фирмы   "IBM",    в    рамках    кот
орого 
         разрабатывалась     технология,    реализованная    в   
 этих 
         накопителях). Отличительной чертой такого компьютера явл
яется 
         наличие  внешней  памяти  большого объема, позволяющей р
ешать 
         множество задач: хранить  всю  деловую  информацию  небо
льшой 
         компании,  хранить регистрационные записи пациентов врач
а или 
         хранить  базу  данных  научного  работника.  Короче   го
воря, 
         IBM/PC,  оборудованный  винчестером,  обладает  возможно
стями 
         оперативной работы с большими массивами данных. 
              Не  требуется  большого  опыта  работы  с  IBM/PC, 
чтобы 
         установить,    что     основным     сдерживающим     фак
тором 
         быстродействия,  возможностей  и  полезности этого компь
ютера 
         является   хранение   данных   на    диске.    Быстродей
ствие 
         микропроцессора   8088,   использующегося   в   IBM/PC, 
  для 
         большинства  задач  достаточно   велико.   (Если   какие
-либо 
         программы  на Ваш взгляд работают недостаточно быстро, т
о это 
         скорее всего связано с недостаточно эффективной  реализа
цией. 
         Наиболее общий пример - это программы на Бейсике, выполн
яемые 
         в режиме интерпретации.) 
              Объем памяти IBM/PC также вполне достаточен и, во в
сяком 
         случае,  значительно  превышает  характеристики   песона
льных 
         компьютеров   предыдущего   поколения.   Большинство   п
ервых 
         персональных компьютеров имело всего 64 К памяти, в то  
время 
         как  объем  памяти IBM/PC может превышать 256К. (Часть п
амяти 
         используется   в   качестве   экранной    памяти,    хра
нения 
         интерпретатора Бейсика и управляющих программ системы BI
OS). 
              Скорость и  емкость  внешней  памяти  на  гибких  д
исках 
         ограничивают  возможности   IBM/PC.   Снять  эти  ограни
чения 
         позволяют жесткие диски винчестерского типа.  Обычно  ем
кость 
         винчестера  лежит  в  пределах от 2 до 25 миллионов байт
, что 
         эквивалентно емкости 12  -  150 односторонних  дискет.  
Кроме 
         того,  скорость  доступа  у  винчестера  намного  выше, 
чем у 
         дисководов с гибкими магнитными дисками. 
              Таким   образом,   с  подключением  винчестера  поя
вился 
         четвертый и, вероятно, наиболее интересный вариант IBM/P
C. Мы 
         имеем  все  основания  считать  оснащенный винчестером I
BM/PC 
         отдельной версией компьютера, поскольку  его  возможност
и  на 
         порядок  выше,  чем  у остальных систем. Винчестеры позв
оляют 
         хранить базу данных  значительного  объема  или  всю  де
ловую 
         документацию  компании.  Винчестеры  превращают  персона
льные 
         компьтеры либо в законченные деловые машины,  либо  в  м
ощные 
         средства   доступа   к   данным.  Таким  образом,  винче
стеры 
         существенно увеличивают возможности IBM/PC. 
      
              Когда появился первый вариант  IBM/PC,  фирма  "IBM
"  не 
         поставляла  и  не  предусматривала  подключение винчесте
ров к 
         IBM/PC, но изготовители дисков быстро разработали контро
ллеры 
         и  программы  для  подключения  винчестера  к IBM/PC. Од
нако, 
         можно ожидать, что для полной  реализации  потенциала  I
BM/PC 
         винчестеры   (или   другие  эквивалентные  устройства  п
амяти 
         большой емкости с быстрым доступом)  должны  стать  сост
авной 
         частью большинства компьютеров IBM/PC. 
              Прежде  чем завершить рассмотрение важности комплек
тации 
         IBM/PC  периферийным  оборудованием,   необходимо   упом
януть 
         адаптер   последовательной  связи.  Адаптер  связи  наст
олько 
         обычный элемент оборудования, что  о  нем  редко  вспоми
нают. 
         Однако,    наиболее    перспективный    путь    использо
вания 
         персональных   компьютеров    заключается    в    органи
зации 
         вычислительных  сетей,  которые  без  адаптера  связи со
здать 
         невозможно. Таким  образом,  адаптер  связи  может  оказ
аться 
         наиболее важным дополнительным элементом оборудования. 
                   
                          ГЛАВА 3. КАК РАБОТАЕТ IBM/PC
              
              
              В  этой  главе  мы  рассмотрим  работу  "мозга" IBM
/PC -
         микропроцессора  8088  -   как   он   выполняет   вычисл
ения,
         использует  память  и  общается с внешним миром. В этой 
главе
         поясняются такие понятия как прерывание, стек и порт.
              Практически весь материал этой главы полностью отно
сится
         к   уже  упоминавшимся  нами  трем  областям  интересов.
  Это
         объясняется  тем,  что  речь  в   основном   будет   тдт
и   о
         функционировании   микропроцессора   8086/8088,   общего
  для
         IBM/PC, компьютеров, работающих под управлением  операци
онной
         системы MS-DOS.
              
              3.1. Память,часть 1: что это такое и как осуществля
ется
         чтение из памяти
              
              
              Одним  из основных элементов компьютера, позволяющи
м ему
         нормально функционировать, является память. Внутренняя п
амять
         компьютера  -  это  место  хранения  информации, с котор
ой он
         работает. Внутренняя  память  компьютера  является  врем
енным
         рабочим пространством; в отличие от нее внешняя память, 
такая
         как  файл  на  дискете,  предназначена  для   долговреме
нного
         хранения  информации.  Информация  во  внутренней  памят
и  не
         сохраняется при выключении питания.
              По  аналогии  с   конторской   работой   можно   на
звать
         микропроцессор  конторским  служащим,  а  память компьют
ера -
         рабочим столом: пространство его используется  временно,
  для
         выполнения работы.
              Память компьютера организована в виде множества яче
ек, в
         которых могут храниться значения; каждая  ячейка  обозна
чется
         адрсом.  Размеры  этих  ячеек  и,  собственно, типы знач
ений,
         которые  могут  в  них   храниться,   отличаются   у   р
азных
         компьютеров.  Некоторые старые компьютеры имели очень бо
льшой
         размер ячейки, иногда до 64 бит в каждой ячейке. Эти  бо
льшие
         ячейки назывались "словами". Супер-копьютеры Крей и комп
ьютер
         Юнивак ориентированы на работу со словами.
              Трудность работы со словами большой длины заключает
ся  в
         том,  что  обычно программы работают не с целыми словами
, а с
         их частями. Поэтому большинство современных компьютеров,
 и  в
         том числе все персональные компьютеры, используют значит
ельно
         меньший размер ячейки памяти, состоящей всего из  8  бит
  или
         "байта": Байт - это очень удобная единица информации, от
части
         потому что он позволяет хранить код одной буквы алфавита
  или
         одного  символа.  Поскольку  символ  занимает в точности
 один
         байт, термины "байт" и "символ" часто используются в одн
ом  и
         том же смысле.
              Так как IBM/PC использует ячейки памти длиной восем
ь бит
         или один байт, в памяти  могут  храниться  значения,  ко
торые
         можно выразить восемью битами. Это значения до двух в во
сьмой
         степени или 256. Смысл величины, записанной в ячейку  па
мяти,
         зависит  от способа ее использования. Можно считать, что
 байт
      
         содержит код алфавитного символа - так называемый код  A
SCII.
         В  то  же  время его можно рассматривать и как число. Вс
е 256
         возможных   значений   могут   рассматриваться    либо  
  как
         положительные  числа от 0 до 255, либо как числа со знак
ами в
         диапазоне  от  -  128  до  +  127.  Кроме  того,  байт  
может
         использовать  как  часть  большого  объема  данных, напр
имер,
         строки символов или двухбайтного числа.
              Для   удобства   манипулирования   символьными   да
нными
         компьютеру необходимо чтобы коды символов преобразовывал
ись в
         байтовые величины. Большинство компьютеров,  включая  IB
M/PC,
         используют  код  ASCII,  американсткий  стандартный  код
  дл[
         обмена  информации.  *Юольшинство  компьютеров  фирмы   
"IBM"
         используют  другую  схему  кодирования символов, называю
щуюся
         EBCDIC; системы ASCII и EBCDIC организованы  по  разному
,  но
         перекодировка  из  одной  системы  в другую большого тру
да не
         представляет).
              В коде ASCII числовые значения присваиваются всем о
бычно 
         используемым символам, таким как буквы алфавита,  строчн
ые  и 
         заглавные,   цифры,   знаки   пунктуации.   Несколько   
кодов 
         зарезервированы для управления, например, чтобы указать 
конец 
         строки  символов. Эти специальные управляющие коды в осн
овном 
         имеют значения от CHR$(0)  до  CHR$(31).  Использование 
 этих 
         специальных  кодов  IBM/PC  имеет  ряд  особенностей, ко
торым 
         посвящено приложение 4. 
              Код ASCII - это семибитовый код, имеющий  128  возм
ожных
         значений  кодов.  Стандартный  код  ASCII  обычно  испол
ьзует
         первые 128 из 256 возможных значений, помещающихся  в  б
айте.
         Остальные  128  могут  использоваться  для  различных  ц
елей,
         образуя  "расширенный  набор"  символьных  кодов  ASCII.
   Не
         существует никаких стандартов использования расширенных 
кодов
         и различные устройства компьютеров используют их  по-раз
ному.
         Дисплей  IBM/PC использует расширенный набор языков, отл
ичных
         от английского, различных математических  символов,  а  
также
         псевдографических  элементов,  которые можно использоват
ь для
         рисования. Программа, приведенная в листинге 1.1,  показ
ывает
         все специальные символы IBM/PC, а подробнее об их органи
зации
         сказано в главе 8.
              Стандартное для IBM/PC матричное устройство печати 
MX-80 
         фирмы "Эндисон" преобразует коды символов расширенного н
абора 
         ASCII  в  печатные  формы,  отличающиеся  от  изображени
й  на 
         экране.  Если  запустить  программу 1.1, а затем использ
овать 
         операцию  PrintScreen   (печать   экрана)   для   копиро
вания 
         содержимого  экрана  на  печатающее  устройство,  Вы  см
ожете 
         сравнить экранный и  печатный  эквиваленты  одних  и  те
х  же 
         расширенных кодов ASCII. 
              Таблицы  стандартных  кодов  ASCII  и  расширенных 
кодов
         ASCII для IBM/PC можно найти во многих местах.  Одна  из
  них
         приведена в конце руководства по Бейсику. Очень удобная 
форма
         таблицы приведена в приложении C к  техническому  руково
дству
         по IBM/PC.
      
              До  сих  пор  мы  рассматривали  побайтное использо
вание
         памяти, однако, часто для более сложных значений,  чем  
может
         уместиться  в одном байте используется несколько байт вм
есте.
         Если необходимы строки символов, они сохраняются  в  сос
едних
         ячейках  памяти,  по  одному  символу  на  байт; первый 
слева
         символ записывается в первый байт, т.е.,  байт  с  наиме
ньшим
         адресом.
              Если  требуется  запомнить  целое  число  больше  о
дного
         байта,  то  оно  записывается   в   несколько   байт,   
также
         расположенных   рядом.   Наиболее   распространенный   ф
ормат
         использует  2  байта  или  16  бит,  что  очень  удобно 
  для
         16-разрядного   процессора,   такого  как  8088.  В  тер
минах
         микропроцессора 8088  двухбайтное  число  называется  сл
овом.
         Многие  команды  8088  срециально  разработаны  для рабо
ты со
         словами. Могут  использоваться  и  более  длинные  форма
ты  -
         трех-,  четырехбайтные  и  длиннее  -  но  они  не так ш
ироко
         распространены как двухбайтные и  для  работы  с  ними  
нужны
         специальные программы.
              Когда  числа,  состоящие  из  двух  или нескольких 
байт,
         хранятся в памяти микропроцессора  8088,  они  размещают
ся  в
         ячейках  последовательно,  начиная  с  младшего  байта ч
исла.
         Такой   способ   несколько   непривычен    для    больши
нства
         специалистов,  не  имевших  дела  с  микропроцессорами  
фирмы
         "Интел". Если Ваша программа работает с отдельными байта
ми  в
         памяти, необходимо учитывать такой способ хранения.
              Арифметический  сопроцессор  8087  использует  неск
олько
         специальных     форматов,     включающих      четырехбай
товый
         целочисленный  формат  и  три  формата  с  плавающей зап
ятой:
         двухбайтный,  четырехбайтный   и   десятибайтный,   а   
также
         десятичный    формат   с   двадцатью   десятичными   циф
рами.
         Микропроцессор  8088  непосредственно   не   использует 
  эти
         форматы,   но   если   к   IBM/PC   подключен  арифметич
еский
         сопроцессор 8087, эти форматы становятся как  бы  расшир
ением
         набора форматов данных.
              
              3.2. Память, часть 2: что такое адрес
              
              Каждая  ячейка  памяти имеет адрес, который использ
уется
         для ее нахождения. Адреса - это чмсла,  начиная  с  нуля
  для
         первой  ячейки  увеличивающиеся  по  направлению  к посл
едней
         ячейке памяти. Поскольку адреса - это те же числа,  комп
ьютер
         может  использовать  арифметические  операции  для вычис
ления
         адресов памяти.
      
              Архитектура каждого компьютера  накладывает  собств
енные
         ограничения  на  величину адресов. Наибольший возможный 
адрес
         определяет обьем адресного пространства  компьютера  или
  то,
         какой  обьем  памяти  он может использовать. Обычно комп
ьютер
         использует  память  меньшего  обьема,  чем  допускается 
  его
         возможностями    адресации.   Если   архитектура   компь
ютера
         предусматривает   небольшое   адресное   пространство,  
  это
         накладывает   суровые   ограничения   на  возможности  т
акого
         компьютера.
              IBM/PC использует возможности адресации  микропроце
ссора
         8088   полностью.   Адреса   в   8088  имеют  длину  20 
 бит,
         следовательно, процессор позволяет адресовать два в двад
цатой
         степени байта или 1024 К.
              Такое  большое  адресное  пространствопозволяет сво
бодно
         использовать ресурсы памяти для  специальных  целей,  чт
о  мы
         увидим в следующем разделе. Перед этим необходимо разобр
аться
         в том, как 16-разрядный компьютер  работает  с  20-разря
дными
         адресами  и какие ограничения это может наложить на прог
раммы
         пользователя.
              Большая часть  арифметических  операций,  которые  
может
         выполнять  микропроцессор 8088, ограничивается манипуляц
ией с
         16-разрядными числами, что дает диапазон  значений  от  
0  до
         65.535 или 64 К. Поскольку полный адрес должен состоять 
из 20
         разрядов, необходимо было разработать  способ  управлени
я  20
         разрядами.  Решение было найдено путем использования при
нципа
         сегментированной адресации. 
           
              Если  взять  16-ти  разрядное  число и добавить к н
ему в
         конце четыре двоичных  нуля,  то  получится  20-ти  разр
ядное
         число,  которое  может  использоваться как адрес. Добавл
ением
         четырех  нулей  или  сдвиг  числа  влево  на  четыре  ра
зряда
         фактически  означает  умножение числа на 16 и теперь диа
пазон
         значений  будет  составлять  1.024К.  К  сожалению,  чис
ло  с
         четырьмя  нулями  в  конце может адресовать только одну 
из 16
         ячеек памяти - ту, адрес которой оканчивается на четыре 
нуля.
         Все остальные ячейки, адреса которых оканчиваются на люб
ую из
         остальных  16  комбинаций  из  четырех  бит,  не  могут 
 быть
         адресованы при таком методое адресации.
              Для   окончательного   решения   проблемы   20-разр
ядной
         адресации используются два 16-разрядных числа. Считается
, что
         одно  из  них  имеет  еще  четыре  нуля в конце (выходящ
ие за
         пределы разрядной сетки). Такое  как  бы  20-разрядное  
число
         называется сегментной частью адреса. Второе шестнадцатир
ичное
         число не сдвигается на четыре разряда и используется в  
своем
         нормальном  виде.  Это  число называется относительной ч
астью
         адреса.   Сложением   этих   двух   чисел   получают   п
олный
         20-разрядный  адрес,  позволяющий адресовать любую из 1.
024 К
         ячеек памяти в адресном пространстве IBM/PC. Сегментная 
часть
         адреса  задает  ячейку  с  адресом,  кратным  16,  эта я
чейка
         называется   границей   параграфа.   Окончательное   зна
чение
         указывает   конкретную  ячейку  на  определеном  удалени
и  от
         границы параграфа.Рисунок 3.1 показыает как это делается
      
             Чтобы лучше усвоить этот момент, рассмотрим все еще 
 раз.
         Полный  20-разрядный  адрес задается двумя частями, кажд
ая из
         которых представляет  собой  16-разрядное  число.  Сегме
нтная
         часть  адреса  обрабатывается  так, как будто он имеет ч
етыре
         дополнительных нуля  в  конце.  Эта  сегментная  часть  
может
         относиться  к  любой  части всего адресного пространства
 - но
         она может указывать только на шестнадцатиричную  границу
,  то
         есть,  на адрес, оканчивающийся на четыре нуля. Относите
льная
         часть адреса прибавляется к сегментной части, образуя  п
олный
         адрес. Относительная часть адреса может задавать любую я
чейку
         памяти, отстоящую от ячейки, указываемой сегентной часть
ю, не
         более чем на 64К.
  ***            
              Рис. 3.1. Адресация памяти:
         1-обычный    16-разрядный    регистр   адреса;   2-16бит
   (4
         шестнадцатиричные цифры) 4 бита на  шестнадцатиричную  ц
ифру;
         3-сдвиговый   регистр   сегмента;   4-объединенные   рег
истры
         сегмента     адреса     и     сегмента;      5-дополните
льный
         шестнадцатиричный ноль; 6-результат - 20-разрядный адрес
     
              
              Хотя относительная часть адреса могла бы задавать т
олько
         четыре последних цифры адреса, она принимает значения от
 0 до
         без единицы 64К. Большая часть манипуляций с адресами св
язана
         с  относительной  частью  адреса.  Сегментная  часть   а
дреса
         фактически  становится  базовым  адресом  для рабочей об
ласти
         размером  ,;К,  которую  позволяет  адресовать  относите
льная
         часть адреса.
              Имеется  удобный способ записи сегментированных адр
есов,
         использование которого программой DEBUG (описанной в гла
ве 6)
         Вы  еще  увидите.  Кроме  того,  он  хорошо  прослеживае
тся в
         ассемблерных листингах, например в том,  который  привед
ен  в
         приложении  А  к  техническому  руководсву фирмы IBM. Сн
ачала
         записывается  сегментная  часть  адреса,  после  нее  сл
едует
         двоеточие, а затем относительная часть адреса. Например,
 если
         сегментная часть адреса (в шестнадцатиричной форме)  222
2,  а
         относительная  часть - 3333, то полный сегментированный 
адрес
         будет записываться как  2222:3333.  Фактический  20-разр
ядный
         адрес  будет  в  шестнадцатиричном виде иметь значение 2
5553,
         получаемое таким простым сложением:
              
                               22220
                             +
                                3333
                            ____________
              
                              25553
              (В конце этого раздела мы  приведем  несколько  при
меров
         работы с сегментированными адресами на Бэйсике и Паскале
).
              Для  работы  с сегментированными адресами микропроц
ессор
         8088 имеет специальные  регистры  сегментов,  предназнач
енные
         для  хранения  сегментной  части  адресов. Загрузив в ре
гистр
         сегмента некоторое значение, можно  адресовать  следующи
е  за
         ним  64К  ячеек  памяти  .  Без изменения значения в рег
истре
      
         сегмента компьютер может работать только  с  64К  байтам
и  из
         общего  адресного  пространства  в  1.024К.  Путем  изме
нения
         значения в регистре сегмента можно  адресовать  любую  я
чейку
         памяти.
              Чтобы иметь возможность в каждый момент времени раб
отать
         более чем с 64К памяти, в микропроцессоре 8088  предусмо
трены
         четыре  различных  регистра сегмента, каждый из которых 
имеет
         особое  назначение.  Память   компьютера   используется 
  для
         различных  целей  - часть ее занимает программа, другая 
часть
         используется для хранения данных, с которыми в данный  м
омент
         работает  программа.  Поэтому  два регистра сегмента выд
елены
         для программы и для  данных.  Для  указания  базового  а
дреса
         программного  или  кодового сегмента используется регист
р CS.
         Для указания сегмента данных  используется  регистр  DS.
  Еще
         одна  область  памяти,  используемая  для  специальных ц
елей,
         называется стеком и ее адрес указывается регистром стека
  SS.
         И,   наконец,  для  обеспечения  дополнительных  возможн
остей
         адресации  имеется  регистр  дополнительного  сегмента  
 (или
         сегмента расширения),  ES.
              Когда    программа    подготавливается   к   выполн
ению,
         операционная система, такая как DOC,  выбирает  ячейки  
каких
         разделов  будут  использоваться  для размещения кодовой 
части
         программ, данных и стека. В регистры  сегментов  CS,DS  
и  SS
         заносятся  адреса этих ячеек. При выполнении программы а
дреса
         в этих регистрах позволяют находить нужные ячейки памяти
. 
              Следует    понять,    что   эти   регистры   совсем
   не
         обязательнодолжны указывать на сегменты памяти, располож
енные
         далеко  друг  от  друга. Они могут указывать на любые яч
ейки,
         находящиеся  далеко  или  близко  друг  от   друга   и  
 даже
         располагающиеся  в  одном разделе. Если необходимо всего
 пару
         тысяч байт для размещения программы и данных, кодовый се
гмент
         и  сегмент данных могут располагаться рядом. И хотя фраг
менты
         кодового  сегмента  и  сегмента   данных   используются 
  при
         выполнении   программы   по-разному,   64К-байтные   обл
асти,
         адресуемые  соответствующими  регистрами   сегментов,   
могут
         отсекаться.  На  рис.3.2  показано  как  эти  три  сегме
нта -
         кодовый,данных и стека - могут использоваться и  как  об
ласти
         этих сегментов могут пересечься.
              
  ***            
              
              Рис.3.2. Сегменты кода, данных и стека:
         1-регистр   сегмента;   2-указывает  64К  памяти; 
         2-нам требуется; 3-16К кодовой части; 4-32К данных;
         5-8К  стека;  6-мы  выделяем  для  них  место  в   памят
и   и
         устанавливаем значения соответствующих регистров;
         7-регистры  обеспечивают доступ к большому обьему памяти
, чем
         необходимо; 8-избыток
              
              Если    программа    не   изменяет   содержимого   
своих
         регистров сегментов, то она  может  использовать  только
  64К
         данных  и  кодовую  часть обьемом 64К. С другой стороны,
 если
         программа   будет   манипулировать    содержимым    реги
стров
         сегментов,  то  она  сможет работать с данными любого об
ьема,
         вплоть  до  1024К.  Может  использоваться  любой  из  ре
жимов
         работы,  но  на практике обычно фиксируют содержимое рег
истра
         сегмента  данных  и  при  необходимости  изменяют  содер
жимое
         регистра  кодового  сегмента. Такой способ организации р
аботы
         поддерживается   набором   команд    микропроцессора    
8088,
         обеспечивающим   очень   удобный   способ  загрузки  рег
истра
         кодового сегмента CS, путем использования  команд  FARCA
LL  и
         FARRET.
              Практические  результаты  такой организации выразил
ись в
         том, что ДОС и  языковые  процессоры  используют  програ
ммные
         соглашения,  которые  позволяют  увеличивать  обьем  про
грамм
         практически неограниченно,  в  то  время  как  их  адрес
уемая
         область   данных   ограничена  64К.  Вы  легко  заметите
  это
         ограничение, работая с Паскалем или компилятором Бейсика
. Для
         "встроенного"  интерпретатора  Бейсика  для IBM/PC собст
венно
         выполняемой программой является сам интерпретатор, а  то
  что
         Вы  считаете  своей программой на Бейсике фактически явл
яется
         частью   данных   интерпретатора.    Таким    образом,  
  для
         интерпретатора Бейсика суммарный обьем кодовой части и д
анных
         Вашей программы не должен превышать  64К,  которые  позв
оляет
         адресовать регистр данных DS.
              Как  Бейсик,  так и Паскаль лишь до определенной ст
епени
         позволяют  манипулировать  сегментированными   адресами.
   Вы
         можете непосредственно изменять содержимое регистров CS,
DS,SS
         и ES -языковой процессор должен управлять  этими  регист
рами,
         иначе  все  может совершенно запутаться. Однако, определ
енный
         способ использования в программах сегментированной  адре
сации
         все же имеется.
              Ниже  приводится описание использования такого спос
оба в
         Бейсике. Раздел  сегмента  может  быть  определен  с  по
мощью
         оператора   DEFSEG.   Некоторые  языковые  средства  Бей
сика,
         например,  операторы  PEEK  и  POKE,  работают   с   адр
есами
         относительными к значению, заданному оператором DEFSEG.
              Например, если взять упоминавшийся выше адрес 2222:
3333,
         то на бейсике доступ  к  его  значению  может  осуществл
яться
         следующим образом:
              
              10  DEFSEG=$H2222  'установить  значение сегмента р
авным
                                  шестнадцатиричных 2222
              20 Х=PEEK(&H3333)' выбрать значение, смещенное  на 
 3333
                                 шестнадцатиричных
              30 REM чисто для примера проверяем  в каком регистр
е за-
                                 дан  код  буквы  и  если она в н
ижнем
                                 регистре, то  переводим  ее в ве
рхний
                                 регистр
              40IF(CHR$(X)>="a")AND(CHR$(X)<="z")THEN POKE&H3333,
(X-32) 
              
              Таким  образом,  в  программе  на Бейсике доступ к 
любой
         ячейке памяти осущес твляется с помощью комбинации опера
торов
         DEF  SEG  и  PEEK  или  POKE.  Работа  с  ними  встречае
тся в
         листингах  программ  1.1,  3.1  и  8.1,  использующих   
такую
         возможность Бейсика для различных целей. 
              Паскаль   разрешает   аналогичный   способ  програм
много
         использования  сегментированной  адресации,  правда  в  
более
         унифицированном  и  гибком  виде чем Бейсик. На Паскале 
можно
         определить переменную как сегментированный адрес,наприме
р:
              
              VAR пример_адреса : adasmem,
              
         а затем непосредственно задать его сегментную и относите
льную
         части ('.s' и '.r', соответственно):
              
              пример_адреса.s : = # 2222;
              пример_адреса.r : = # 3333;
              
              Когда все эти присваивания выполнены, можно осущест
влять
         доступ к памяти с помощью указателя сегменитрованного ад
реса:
              
              x : = пример_адреса^;
              if(chr(x)> = "a") and (chr(x)< = "z") then
              пример_адреса^ : = x - 32;
              
              
              
              3.3. Организация памяти IBM/PC
              
              
              Имея адресное пространство свыше  миллиона  байт  I
BM/PC
         позволяет более удобно и более гибко использовать память
, чем
         большинство других, меньших  персональных  компьютеров. 
 Весь
         объем памяти распределен довольно интересным образом. С 
одной
         стороны,  резервирование  определенных  ячеек  памяти   
может
         наложить  ограничение  на  возможные применения компьюте
ра. В
         IBM/PC резервируется несколько  областей  в  верхних  ад
ресах
         памяти.  Эти  область  имеют  особое назначение, а все н
ижние
         адреса оставлены для свободного использования. Таким  об
разом
         сочетаются достоинства использования зарезервированных б
локов
         памяти и сохранения как  можно  большего  объема  памяти
  для
         свободного использования.
              На   рис.  3.3.  показана  простая  схема  распреде
ления
         памяти. Верхняя четверть  общего  объема  памяти,  начин
ая  с
         ячейки  C  000  и  до  конца,  практически  всегда заним
ается
         постоянным запоминающим устройством или  ПЗУ.  (В  бальн
ейшем
         все  упомиющиеся  адреса  будут  без специального напоми
нания
         даваться в шестнадцатиричном виде.) Фактически  ПЗУ  зан
имает
         только верхние 8К, начиная с адреса FE00, в которых нахо
дится
         система BIOS (подробно описанная в главе 6). Система  BI
OS  в
         ПЗУ  включает  все основные служебные процедуры IBM/PC, 
в том
         числе тестовые программы, которые запускаются  при  вклю
чении
         компьютера.
      
              Следующие  (если  идти сверху вниз) 32К используютс
я для
         хранения  интерпретатора  Бейсика.  Бейсик-ПЗУ  начинает
ся  с
         ячейки  F600  и  заканчивается  непосредственно перед BI
OS. В
         главе 6 описывается интепретатор Бейсика в ПЗУ.  В  прин
ципе,
         любая   часть   адресного   пространства  может  быть  з
анята
         постоянной памятью, но  в  соответствии  с  общими  прав
илами
         организации  памяти  IBM/PC,  адреса  ПЗУ  должны быть б
ольше
         C000. Как упоминалось в главе 2,  в  системном  блоке  I
BM/PC
         установлено  пять  микросхем  ПЗУ и одно свободное гнезд
о для
         установки микросхемы. Эти  пять  микросхем  содержат  BI
OS  и
         Бейсик.  Каждая  микросхема  имеет  емкость  8К. Еще 8К 
можно
         добавить с помощью свободного гнезда и  начальный  адрес
  для
         них   будет   равен   F400,   так   чтобы  они  располаг
ались
         непосредственно перед Бейсиком.
              
  ***     
              Рис. 3.3. Распределение памяти:
         1-шестнадцатиричный адрес; 2-память, размещенная в  сист
емном
         блоке;  3-память,размещаемая  в  блоке  расширения;  4-п
редел
         обычной памяти в 256К; 5-свободная  часть;  6-зарезервир
ована
         для   дисплеев;   7-монохромный   дисплей;   8-свободна 
  для
         использования  дисплеями;  9-цветной   графический   дис
плей;
         10-область    дисплейной    памяти;   11-область   возмо
жного
         добавления ПЗУ; 12-Бэйсик-ПЗУ; 13-BIOS-ПЗУ; 14-нижние ад
реса;
         15-верхние адреса
              
              
              Ниже  области  ПЗУ располагается большой сегмент па
мяти,
         предназначенный для поддержки экранного режима дисплеев.
  Для
         хранения   информации,  отображаемой  на  экране,  необх
одимо
         использоватьспециальную   область   памяти,   которая   
может
         располагаться  как внутри дисплея, так и внутри компьюте
ра, с
         которым он соединен. В IBM/PC экранная память входит в  
общее
         адресное  пространство  компьютера  (хотя  конструктивно
  она
         размещается на плате расширения для дисплея). В  главе  
8  мы
         более подробно рассмотрим размещение и использование экр
анной
         памяти.
              Блок экранной памяти начинается с адреса B000 и зан
имает
         64К,  вплоть  до адреса C000. Этот блок делится на две ч
асти.
         Нижняя половина, начинающаяся  с  адреса  B000,  использ
уется
         монохромным дисплеем. Верхняя половина, начинающаяся с а
дреса
         B800, используется цветным графическим дисплеем. В глава
х 8 и
         9  более  подробно описывается структура и использование
 этой
         памяти. 
              
              Ни   один  из  дисплейных  адаптеров  не  требует  
и  не
         использует все 32К, выделенные для них.  Монохромный  ди
сплей
         использует всего 4К, а цветной графический дисплей испол
ьзует
         16К.  Оставшаяся  часть   памяти   в   настоящее   время
   не
         используется,  но  может  понадобиться  для более соверш
енных
         дисплейных адаптеров.
      
              Фактически, для  дисплейных  адаптеров  выделено  б
ольше
         памяти,   чем   эти   64Кот   B000   до  C000.  Блок  в 
 64К,
         предшествующий им, также  зарезервирован.  В  соответств
ии  с
         документацией   IBM/PC  блок,  начинающийся  с  адреса  
A000,
         резервируется двумя способами. Первые 16К, от A000 до  A
4000,
         зарезервированы совершенно таинсвенным образом, не имеет
ся ни
         малейшего указания на то, для чего это сделано. Остальны
е 48К
         этого  блока  от A400 до B000, входит в обалсть 112К, ко
торая
         считается  зарезервированной  для  экранной   памяти.   
Таким
         образом,  вся  область экранной памяти располагается с а
дреса
         A400 до C000.
              Можно предположить, что эта  большая  область,  осо
бенно
         18К  в  блоке  A000,  будут использоваться каким-нибудь 
новым
         дисплеем  с  высокой   разрешающей   способностью,   кот
орому
         потребуется  больше  памяти чем для обычного монохромног
о или
         цветного графического дисплея.  Непонятно  только  назна
чение
         первых  16К  блока  A000,  не обозначенных как часть эур
анной
         памяти.
              Объем памяти, расположенной ниже адреса A000, соста
вляет
         64К,  которык предназначены для обычного использования п
амяти
         компьютера. Первые 64К,  до  адреса  1000,  располагаютс
я  на
         основной  системной  плате IBM/PC, а все остальные микро
схемы
         памяти размещаются в блоках расширения. По  сообщениям  
фирмы
         "ИБМ",  IBM/PC поддерживает всего 256К памяти, но этот п
редел
         связан только с тестами BIOS, которые при запуске  компь
ютера
         проверяют  такой объем памяти. Всегда можно подключить б
ольше
         чем 256К памяти.
              Вся обычная оперативная память,  подключенная  к  В
ашему
         компьютеру,  располагается  в нижних адресах общего адре
сного
         пространства. Вы можете подключить такой объем  памяти  
какой
         Вам  необходим  в  пределах, накладываемых зарезервирова
нными
         адресами.  Независимо  от  того,  подключено  ли   к   В
ашему
         компьютеру  48К  или  576К,  они всегда размещаются начи
ная с
         адреса 0000.
              Таким образом, оперативная память всегда занимает н
ижние
         адреса пространства, а постоянная память - в верхних адр
есах.
         Между ними располагается экранная память. Между  всеми  
этими
         разделами   могут  быть  промежутки  -  промежуток  от  
конца
         оперативной памяти до  начала  экранной  памяти  и  от  
конца
         экранной  памяти  до  начала  ПЗУ.  Это  неиспользуемая 
часть
         памяти IBM/PC.
              Оперативная  память  временно  используется  работа
ющими
         программами  и  их  данными.  Часть этой памяти, ее нача
льные
         адреса,  используются  для  нужд  самого  микропроцессор
а,  а
         другие небольшие фрагменты используются операционной сис
темой
         и   интепретатором   Бейсика.   Оставшаяся    память    
может
         использоваться любыми программами.
              Самая  нижняя  часть  памяти,  начинающаяся  с  нул
евого
         адреса и занимающая примерно  1500  байт,  предназначена
  для
         хранения   необходимой  рабочей  информации  для  компью
тера.
         Первая  часть  этой  области  содержит  вектора   прерыв
аний,
         которые более подробно будут рассмотрены в разделе 3.5. 
После
         векторов прерываний располагается информация, необходима
я для
         управляющих   процедур   BIOS,   операционной  систмы  Д
ОС  и
         интепретатора Бейсика,  а  также  их  рабочие  ячейки.  
После
         зарезервированной  области в нижних адресах памяти начин
ается
         рабочая  область,  в  которую  загружаются  программы  и
  где
         хранятся их данные.
      
              Можно  исследовать  память  IBM/PC  и  установить, 
какие
         блоки  используются  и   где   они   размещены   в   адр
есном
         пространстве.  Программы  могут  пытаться  выполнять чте
ние и
         запись по  любым  адресам  памяти.  Можно  предположить,
  что
         обращение   к  неподключенной  памяти  приведет  к  появ
лению
         сигнала ошибки, но на практике этого не  происходит.  Пр
ичина
         этого   проста   -  работа  микропроцессора  8088  с  па
мятью
         заключается в обращении к каналу ввода/вывода, который о
писан
         в  главе  2,  и  ожиданием  результата.  Даже  если памя
ть не
         подключена, микропроцессор не замечает разницы.
              Однако, можно достаточно просто  проверить  наличие
  или
         отсутствие  памяти  по  определенному адресу. Один из ме
тодов
         заключается  в  чтении  из  различных  облас  тей  памят
и   с
         последующей    проверкой    результатов.    Непродолжите
льные
         эксперименты показывают, что при большинстве методов  чт
ения,
         как  через  DEBUG,  так  и  с  помощью средств языка Пас
каль,
         результатом  всегда  оказывается  байт  со  всеми  едини
чными
         битами;  что соответствует шестнадцатиричному значению F
F или
         CHR$(255).
              Такой  результат  никого  не  должен удивлять - вед
ь при
         чтении несущетвующей памяти наиболее вероятно  получить 
 либо
         все  нули,  либо все единицы. По какойто причине, котора
я мне
         досих пор не понятна, интепретатор Бейсика всегда  возвр
ащает
         значение  CHR$(233).  Результаты  не  совсем однозначны,
 но в
         большинстве случаев Бейсик  возвращает  именно  это  стр
анное
         значение, CHR$(233), при чтении неподключенной памяти.
              Такое  свойство  можно  использовать  для проверки 
того,
         какая  часть  адресного  простанства  активна.  Листинг 
 3.1.
         показывает простую программу на Бейсике, которая считыва
ет по
         нескольку байт из каждого килобайта памяти и сравнивает 
их со
         значением CHR$(233). Если Вы запустите эту программу на 
своем
         компьютере,  то  она  покажет  какой  объем  памяти  к  
 нему
         подключен.  Рисунок  3.4 показывает результат выполнения
 этой
         программы на IBM/PC, который я использовал при написании
 этой
         книги. Посмотрим о чем они говорят.
              Во-первых, отметим, что были обнаружены три блока п
амяти
         - то есть, именно столько, сколько должно быть  подключе
но  к
         IBM/PC.  Первый  блок начинается с адреса 0 или самого н
ачала
         памяти. Это обычная, оперативная память компьютера. В  д
анном
         конкретном компьютере первый блок имеет размер 576Кбайт.
 Сюда
         входят 64К в системном блоке и еще 512К в блоке расширен
ия.
              Второй блок активной памяти начинается  с  адреса  
B000.
         Это  память,  используемая  адаптером  монохромного  дис
плея.
         Поэтому можно сделать вывод, что данный компьютер работа
ет  с
         монохромным  дисплеем,  а не с цветным графическим адапт
ером.
         Заметим, что наша исследовательская  программа  считает,
  что
         эта  память  занимает  32К, в то время как в действитель
ности
         монохромный адаптер включает включает всего  4Кбайта.  Л
ишние
         28К обнаруженные программой, можно, вероятно, отнести на
 счет
         побочных  эффектов,  связанных  с   работой   схем,   ко
торые
         поддерживают  реальные  4К  памяти.  Выполнение  той же 
самой
         программы в системе с  цветным  графическим  монитором  
также
         обнаруживают 32К памяти, хотя реально используется всего
 16К.
      
              После памти адаптера дисплея программа обнаруживает
 ПЗУ,
         занимающее верхние адреса  памяти.  В  этом  последнем  
блоке
         программа  обнаруживает  ровно  столько  байт,  сколько 
в нем
         действительно имеется.
              
              Программа 3-1: Найти и отобразить активную память
              Потерпите - выполнение этой программы занимает 65 с
ек
              (Адреса начала сегментов приведены  в  шестнадцатир
ичном
         виде)
              Активная память начинается с  0
                              заканчивается 8FFF 576К байт
                                                (589824 байта)
              Активная память начинается с  B000 
                              заканчивается B7FF 32К байт 
                                                (32768 байта)
              Активная память начинается с  F000
                              заканчивается FFFF 64К байт
                                                (65536 байт)
              Конец работы
              
              
              Рис 3.4. Результат работы программы 3.1
              
              Хотя  программа  3.1  интересна  и  сама  по  себе,
  для
         исследования  памяти  Вашей  систем,  но  она   также   
может
         послужить   хорошим   примером   тех   возможностей,  ко
торые
         откроются перед Вами, когда Вы досконально изучите компь
ютер.
         Фирма   "IBM"   не   сообщает,   что   Бейсик   считывае
т  из
         отсутствующей памяти именно значение 233, и никто не объ
яснял
         мне,  как  проверять память. Однако, имея интерес и неко
торую
         настойчивость   в    исследованиях,  я  написал    прогр
амму,
         приведенную в конце главы, листинг 3.1. Именно к такой р
аботе
         я Вас и  призываю.  Изучайте  Вашу  систему,  исследуйте
  все
         детали - и тогда Вы приобретете глубокие познания о прин
ципах
         работы IBM/PC.
              Кстати, следует заметить, что эта программа  может 
 дать
         странные   результаты,   если   используются   платы  па
мяти,
         изготовленные  не  фирмой  "IBM".  Это   еще   один  при
знак,
         позволяющий больше узнать о Вашей системе.
              
              3.4. Сверхоперативная память - регистры
              
              Помимо    памяти,   для   временного   хранения   д
анных
         микропроцессор  8088   использует   еще   и   регистры, 
  что
         существенно  ускоряет  работу.  Сейчас  мы  кратко рассм
отрим
         использование регистров.
              Наиболее  полное  писание  регистров   можно   найт
и   в
         руководствах   по   системе   команд   и   языку   ассем
блера
         микропроцессора 8076. В данном разделе содержится  доста
точно
         сведений  для того, чтобы Вы не терялись, встретив упоми
нание
         названий регистров в любом контексте.
      
              Микропроцессор   имеет    четыре    шестнадцатиразр
ядных
         регистра  общего  назначения,  называемых  AX,  BX,  CX 
и DX.
         Каждый из них может  быть  разделен  на  два  восьмиразр
ядных
         регистра,  указанием  старшей  (H-high)  или  младшей (L
-low)
         части полного (X) регистра.  Таким  образом,  восьмиразр
ядные
         регистры  называются  AH,  AL,  BH,  BL,  CH,  CL,  DH  
и DL.
         Поскольку восьмиразрядные регистры непосредственно связа
ны  с
         16-разрядными,  операция  записи  шестнадцатиричной  вел
ичины
         ABCD в регистр AX эквивалентна записи величины AB  в  ре
гистр
         AH и величины CD регистр AL.
              Хотя  все эти регистры имеют общее назначение, кажд
ый из
         них  имеет   определенную   специализацию.   Например,  
 если
         некоторая  операция  должна  повторяться  нес  колько ра
з, то
         регистр содержит счетчик повторений.
              Мы уже упоминали четыре  регистра  для  сегментиров
анной
         адресации:CD  для  кодового сегмента, DS для сегмента да
нных,
         SS для сегмента стека  и  ES  для  досполнительного  сег
мента.
         Относительная часть сегментирванного адреса может хранит
ься в
         любом регистре и использоваться вместе с  сегментной  ча
стью,
         которая  должна  находиться  в  одном из регистров сегме
нтов.
         Текущий адрес в выполняемой программе  образуется  содер
жимым
         регистров  IP  (счетчик  команд)  и CS. Текущий адрес в 
стеке
         образуется  содержимым  регистра  указателя  стека   (SP
)   и
         регистра сегмента SS.
              Для  адресации  данных  вместе  с  регистром сегмен
та DS
         могут использоваться разные регистры.  Часто  для  этой 
 цели
         служит  регистр  DX.  Два специальных регистра, DI и SI 
также
         используются свместно с регистром DS. При работе со  стр
оками
         байт,  регистры  SI  и  DI используются для хранения инд
ексов
         исходной и приемной строк относительно регистра  DS.  Ре
гистр
         указателя  базы  (BP)  может  спользоваться в качестве а
дреса
         относительно регистра SS.
              
              3.5. На что необходимо обратить внимание - прерыван
ия
              
              омпьютер должен обладать  способностью  реагироват
ь  на
         события,  происходящие  вне  его  микропроцессора,  напр
имер,
         чтобы  воспринимать  информацию,   вводимую   с   клавиа
туры.
         Существует  два способа организации такой реакции.Один с
пособ
         состоит  в  постоянном   ожидании   события.   Такой   с
пособ
         называется  "сканированием" или "опросом" и такой опрос 
может
         занимать большую  часть  времени  компьютера.  Другой  с
пособ
         позволяет  компьютеру спокойно выполнять свою работу, по
ка не
         произойдет событие,  требующее  его  внимания.  Такой  п
одход
         называется    использованием    "прерываний".   использо
вание
         прерываний позволяет наиболее эффективно организовать  р
аботу
         компьютера,   поскольку   время  центрального  процессор
а  не
         расходится вхолостую на ожидание.
              Какие  примеры  прерываний  можно  было   бы   прив
ести?
         Например, прерывание возникает, когда Вы нажимаете клави
шу на
         клавиатуре. Другое прерывание вырабатывает таймер, встро
енный
         в   IBM/PC.  Таймер  прерывает  работу  микропроцессора 
 8088
         восемнадцать раз в секунду. Операционная система ведет о
тсчет
         времени  дня просто подсчитывая эти прерывания таймера; 
время
         дня можно вычислить по количеству  прерываний  таймера  
после
         последней   полуночи.   Еще  один  вид  прерываний  форм
ирует
         контроллер гибких дисков, сообщая процессору,  что  очер
едная
         дисковая операция наконец завершилась. Поскольку эти опе
рации
         значительно  медленнее  чем  работа  самого  микропроцес
сора,
         выгода состоит в том, что процессор может не ждать завер
шения
         дисковой операции и продолжать вычисления до  тех  пор, 
 пока
         контроллер  выработает  прерывание,  указывающее что опе
рация
         завершена. 
              Основная идея прерываний  заключается  в  том,  что
  все
         требующее  внимания  процессора, должно сообщать ему о с
ебе в
         форме  прерывания.  Использование  прерываний  дает  огр
омные
         преимущества.  Если ничто не требует внимания процессора
, - а
         так обстоит дело большую часть времени,  -  то  процессо
р  не
         тратит времени на проверку наступления событий, требующи
х его
         вмешательства.С  другой  стороны,  если  возникает   соб
ытие,
         требующее   внимания   немедленно,  оно  немедленно  и  
будет
         обслужено, поскольку прерывания обычно обслуживаются сра
зу же
         после их возникновения.
              Иногда  бывает  необходимо,  чтобы  работа процессо
ра не
         прерывалась, например, при  выполнении  какой-либо  крит
ичной
         операции.   Для   этого   у   микропроцессора   8088  им
еется
         специальная команда, которая позволяет отложить  обслужи
вание
         прерываний,    запоминая    их,    и   парная   ей   ком
анда,
         восстанавливающая нормальный режим  обслуживания  прерыв
аний.
         Когда  прерывания запрещаются запрос прерываний не теряе
тся -
         он запоминается  и  будет  обслуживаться,  как  только  
будут
         разрешены прерывания.
              Обычно  прерывания  не  запрещаются  на  сколько  н
ибуть
         продолжительное время. Прерывания допустимо запрещать ли
шь на
         очень короткие промежутки времени, необходимые для выпол
нения
         некоторых  внутренних  операций  процессора,   состоящих
   из
         небольшого  числа  команд.  Типичным примером таких опер
аций,
         которые не могут быть  прерваны  на  полпути,  может  сл
ужить
         загрузка   нового   набора  значений  в  регистры  сегме
нтов.
         Поскольку эти регистры необходимы для правильной работы 
любой
         программы,  нарушение согласованности загрузки в них зна
чений
         может  привести  к  полной  неразберихе,  поэтому  необх
одимо
         запретить прерывания на время загрузки в них новых адрес
ов.
              Чтобы  привести  небольшой  пример  того,  к  чему 
может
         привести  запрет  прерываний,   рассмотрим   две   прогр
аммы,
         названные  BEEP  и  WARBLE.  Если  у Вас есть пакет прог
рамм,
         прилагающийся  к  этой  книге,  Вы  найдете  в  нем  обе
  эти
         программы, готовые к использованию. С помощью макроассем
блера
         можно получить эти программы из ассемблерного  листинга 
 3.2,
         приведенного  в  конце  главы.  Обе программы: BEEP и WA
RSLE,
         генерируют звуки  с  помощью  динамика  IBM/PC.  (О  том
  как
         генерируются  звуки  будет  рассказано в главе 11.) Кажд
ая из
      
         программ  генерирует  чистый   непрерывный   звук   в   
одной
         тональности,  но  программа  WARBLE  не запрещает прерыв
ания.
         Поэтому она прерывается таймером восемнадцать раз в секу
нду и
         хотя  прерывания  обслуживаются очень быстро, звук получ
ается
         вибрирующим.  Программа  BEEP  запрещает  прерывания  и 
 дает
         непрерывный  звук.  Запустите обе программы и Вы почувст
вуете
         результат запрета прерываний.
              Механизм перывания работает следующим  образом:  ка
ждому
         из  основных  типов прерываний присвоен свой номер. Напр
имер,
         прерывание таймера имеет номер 8,  гибкие  диски,  испол
ьзуют
         номер  14.  В самом начале оперативной памяти IBM/PC хра
нится
         таблица с адресами программ, которые  должны  вызываться
  при
         возникновении  различных  прерываний.  Эти адреса должны
 быть
         полными сегментированными адресами, так что они  занимаю
т  по
         два  слова  или  по  четыре  байта  каждый. Эти адерса и
ногда
         называются векторами прерываний. Прерывание с номером 0 
имеет
         вектор,  хранящийся  в ячейке с нулевым адресом, прерыва
ние !
         имеет свой вектор в ячейке 4 и так  далее.  Когда  проис
ходит
         прерывание  номер  "X",  вектор,  хранящийся  по  адресу
  4X,
         загружается в регистры адреса программы, т.е., регистры 
CS  и
         IP,и  компьютер  начинает  выполнять  программу  обслужи
вания
         прерывания, которая размещается по этому адресу.    
         Когда    обработка    прерывания   заканчивается,   прог
рамма
         обработки   возвращает    управление    программе,    ко
торая
         выполнялась  в  момент  возникновения  прерывания,  с по
мощью
         специальной команды IRET или "возврат из  прерывания".  
Чтобы
         такой возврат мог быть выполнен, необходимо сохранить в 
стеке
         текущие адреса прогрвммы до  загрузки  в  регистры  CS  
и  IP
         вектора прерывания.
              Концепция  прерывания была разработана для практиче
ского
         решения проблемы взаимодействия компьютера с  внешним  м
иром.
         Однако,  тем  не  менее  вскоре  оказалось, что прерыван
ия не
         менее полезны для организации внутренней  работы  компью
тера.
         Это  привело  к  разработке  трех  типов  прерываний, ко
торые
         получили названия аппаратных, логических и программных. 
Между
         ними  нет  принципиальной  разницы,  однако  их использо
вание
         разделит их на три отдельных категории.
              Аппаратные  прерывания  мы   уже   рассмотрели   - 
  они
         вырабатываются  устройствами, требующими внимания процес
сора.
         В IBM/PC  таких  прерываний  на  удивление  мало.  Во-пе
рвых,
         имеется так называемое немаскируемое прерывание, использ
уемое
         для сообщения об отказе питания, оно имеет  номер  2.  Д
алее,
         прерывание  8  используется таймером, номер 9 - клавиату
рой и
         14 -  контролером  гибких  дисков,  всего  четыре  аппар
атных
         прерывания.  Имеется  также  семь  зарезервированных  но
меров
         прерываний, 6, 7, с  10  по  13  и  15,  которые  могут 
 быть
         испоьзованы  в  дальнейшем,  если  возникнет  необходимо
сть в
         дополнительных  аппаратных  прерываниях.  Два  из  этих 
 семи
         прерываний   уже   нашли   свое   назначение,  прерывани
е  12
         зарезервировано для адаптера связи, а  прерывание  15  -
  для
         интерфейса устройства печати.
      
              Логические   прерывания  формируются  самим  процес
сором
         8088, когда он встречает какое-либо необычное условие.  
Таких
         прерываний  предусмотрено  четыре. Прерывание 0 возникае
т при
         попытке  деления  на  ноль.  Прерывание  1  используется
  для
         управления  пошаговым  режимом  работы  микропроцессора,
  при
         котором  команды  выполняются  по   одной.   Это   преры
вание
         выставляется  отладчиками для пошагового выполнения прог
рамм.
         Прерывание 3 вырабатывается командой  установки  "контро
льных
         точек",  которая также используется при отладке. Прерыва
ние 4
         формируется при возникновении условия переполнения, напр
имер,
         если   результат  арифметической  операции  не  помещает
ся  в
         регистр.  Таким   образом,   четыре   логических   преры
вания
         распадаются  на  две  пары:  одна для арифметических опе
раций
         (деление  на  ноль  и  переполнение)  и  вторая  для  от
ладки
         программ (шаговый режим и контрольные точки). 
              Наиболее    интересны   программные   прерывания.  
 Если
         программа должна воспользоваться услугами  другой  прогр
аммы,
         она  должна  передать  управление  этой процедуре. Обычн
о это
         делается  с  помощью  команды  CALL.  Для  вызова   проц
едуры
         программа должна знать ее адрес, а вызываемая процедура 
может
         не знать  адреса  вызывающей  программы,  поскольку  мех
анизм
         вызова автоматически генерирует адрес возврата, который 
будет
         использован  вызываемой  программой   после   завершения
   ее
         выполнения.  Образно  говоря,  для  перехода к подпрогра
мме и
         возврата из нее  достаточно  купить  билет  в  один  кон
ец  -
         обратный  билет  предоставляется  бесплатно. Идея органи
зации
         программных прерываний должна позволять свободный перехо
д и в
         прямом  и  в  обратном направлении, то есть иметь возмож
ность
         вызвать подпрограмму и получить управление обратно  посл
е  ее
         завершения,  так  чтобы ни одна из сторон не могла не зн
ать о
         местонахождении (адресе) другой.
              Программные прерывания  обеспечивают  такую  возмож
ность
         путем  выработки  прерывания самой программой. Например,
 если
         программе необходимо вычислить время дня,  ей  совершенн
о  не
         требуется знать адрес программы подсчета времени - доста
точно
         знать только, что программа подсчета времени дня  запуск
ается
         программным прерыванием 26.
              Программные  прерывания  используются  для  вызова 
 всех
         служебных функций, представляемых обычным пользователям.
  Эти
         функции включают все процедуры системы BIOS и ПЗУ и служ
ебные
         процедуры ДОС.  Программные  прерывания  используются  в
место
         непосредственных  адресов  по  двум причинам. Наиболее в
ажная
         причина состоит в обеспечении возможности изменения служ
ебных
         процедур,   вызываемых   с   помощью   прерываний.  Изме
нение
         процедуры обычно приводит к изменению ее размера и разме
щения
         в  памяти. Если процедура вызывается с помощью прерывани
я, то
         использующие  ее  программы  не  требуется  изменять,   
когда
         изменилась процедура.
              Другая  причина использования программных прерывани
й для
         вызова процедур связана с возможностью их замены.  Рассм
отрим
         пример.  Как  Вы  узнаете из главы 8, служебные процедур
ы для
         обслуживания  дисплея  выдают  звуковой  сигнал   с   по
мощью
         динамика  IBM/PC,  каждый  раз  когда  выдается  код CHR
$(7).
         Предположим, что Вам  необходимо  подавить  выдачу  звук
ового
         сигнала.  Для  этого  можно написать программу, которая 
будет
         проверять какие символы выдаются на  экран  и  при  появ
лении
         кода  CHR$(7) заменяет его пробелом. После окончания про
верки
         эта программа должна передавать управление обычной  проц
едуре
         обслуживания   дисплея.Фактически,  нужно  сделать  небо
льшое
         добавление перед стандартной процедурой обслуживания дис
плея.
         Чтобы  задействовать эту программу необходимо заменить в
ектор
         прерывания дисплея (прерывание 16) адресом Вашей програм
мы.
              Прогаммные прерывания очень  важны  для  работы  IB
M/PC.
         Большая  часть этой книги будет посвящена их более подро
бному
         описанию. В главе 4 описываются  прерывания  системы  BI
OS  в
         ПЗУ.  Чтобы  Вы  могли  извлечь  максимальную  пользу из
 этих
         системных  функций,  пакет  программ,  прилагаемый  к  д
анной
         книге,  содержит  полный  набор  интерфейсных  процедур,
  как
         ассемблерных, позволяющих  осуществлять  доступ  к  служ
ебным
         процедурам  по  прерыванию  из  любых языков программиро
вания
         (включая Бейсик и Паскаль), так и вспомогательных процед
ур на
         Паскале,  существенно  облегчающих использование ассембл
ерных
         процедур.
              Прежде чем завершить рассмотрение прерываний, необх
одимо
         упомянуть  еще об одном необычном применении таблицы век
торов
         прерываний. Таблица векторов  прерываний,  располагающая
ся  в
         самом начале оперативной памяти, предназначенная для хра
нения
         полных  сегментированных  адресов  программ,  которые  д
олжны
         обслуживать  соответствующие  прерывания.  Однако,  в  I
BM/PC
         использование   таблицы   векторов   несколько   шире.  
 Хотя
         считается, что таблица должна хранить только адреса прог
рамм,
         разработчики  IBM/PC  сочли  ее  очень  удобным  местом 
  для
         хранения  адресов  трех  элементов, которые вовсе не явл
яются
         программами. Это адреса очень важных системных  данных. 
 Идея
         заключается   в  том,  чтобы  использовать  таблицу  век
торов
         прерываний  в  качестве  унифицированного  хранилища   в
ажных
         сегментированных адресов - в первую очередь, конечно, ад
ресов
         программ, но, если необходимо, то и  данных.  Таким  обр
азом,
         три  номера  прерываний,  29,  30  и  31  не  используют
ся  и
         соответствующие  им  вектора  в  таблице  обнуляются,   
чтобы
         подготовить  место  для  хранения  адресов трех важных т
аблиц
         данных. Естественно,  что  эти  номера  прерываний  не  
могут
         использоваться: если программа запросит прерывание с ном
ерами
         29, 30 или 31, то управление будет передано в одну из  т
аблиц
         данных, которая начнет выполняться как программа.
              В  главе 6 мы более подробно рассмотрим ПЗУ и устан
овим,
         что это за таблица. Затем мы рассмотрим их по одной, в г
лавах
         7, 8, 9.
           
              
              3.6. СТЕК
              
              
              Стеки  -  это  наиболее  интересные  и полезные сре
дства
         современных   компьютеров.   Вместе   с   прерываниями  
стеки
         обеспечивают  эффективность работы компьютеров.
              Что такое стек? Стек - это место,  в  котором  комп
ьютер
         хранит  рабочие  величины, так что один набор величин ни
когда
         не смешивается с другим набором.
              Стек получил свое имя благодаря метафоре, которую  
часто
         используют  для  описания его работы. Представьте себе с
топку
         тарелок, например, таких которые используются  в  кафете
риях,
         где    тарелки   находятся   на   подпружиненной   платф
орме,
         перемещающейся вверх и вниз. Если  нужно  добавить  в  с
топку
         (по-английски  stack)  чистые тарелки, которые были в ст
опке,
         опускаются вниз. Когда кто-нибудь снимает тарелку сверху
, вся
         стопка  поднимается  вверх.  Тарелки используются по при
нципу
         "последним вошел - первым вышел".
              Когда компьютер занят работой  и  поступает  прерыв
ание,
         необходимо   место  для  того,  что  бы  заполнить  сост
ояние
         компьютера до начала  обработки  прерывания.  Если  еще 
 одно
         прерывание   поступит   в   процессе  обработки  первого
,  то
         необходимо запомнить и  эту  информацию.  Когда  обслужи
вание
         второго  прерывания  завершится,  комьютер должен вернут
ься к
         выполнению своей последней перед прерыванием работы, в д
анном
         случае  к  обслуживанию  первого прерывания. Для обслужи
вания
         прерываний и  для  многих  других  операций,  которые  д
олжны
         выполняться  по  принципу  перехода к последней из отлож
енных
         операций, наиболее  естественным  средством  для  запоми
нания
         состояния компьютера будет стек.
              Организация стека в IBM/PC  основана  на  выделении
  под
         стек  определенной области оперативной памяти и использо
вании
         специального регистра сегмента стека, SS, указывающего а
дреса
         этой  области  памяти.  Вершина  стека указывается содер
жимым
         специального регистра, называемого указателем стека SP. 
 Стек
         компьютера,  в  отличие  от подпружиненной стопки тарело
к, не
         перемещается физически, а остается на месте. Зато  измен
яется
         адрес вершины стека, указываемый содержимым регистра SP.
              Данные  помещаются  в  стек  компьютера  операцией 
PUSH,
         извлекаются операцией POP.
              Когда возникает  прерывание,  адрес  текущей  прогр
аммы,
         хранящийся  в  регистрах  CS  и  IP, помещается в стек, 
затем
         адрес процедуры обслуживания  прерывания  загружается  в
  эти
         регистры и начинается выполнение данной процедуры. До яч
ейки,
         указываемой регистром SP (указателем стека), хранятся  д
анные
         всей  предыдущей  работы,  ожидающей своего возобновлени
я. За
         указателем  стека  находится  свободное  пространство  с
тека,
         которое    может   использоваться   процедурой   обслужи
вания
         прерывания, если ей требуется дополнительная рабочая обл
асть.
         Если   возникнет   еще   одно   прерывание,  новая  проц
едура
         обслуживания  найдет  для  себя  свободную  область  в  
стеке
         несколько дальше.
      
              Когда     завершается     очередная    процедура,  
  она
         освобождается.  Сначало  из  стека  извлекаются  все  ра
бочие
         значения,   а   затем  извлекается  адрес  точки  приост
анова
         предыдущей процедуры, который загружается в регистры CS 
и IP.
         В  процессе  выполнения всех этих действий механизм рабо
ты со
         стеком  автоматически  поддерживает   последовательность
   их
         выполнения.  Стеки  используются  не  только для обслужи
вания
         прерываний, но и при вызовах одних программ другими. Как
  при
         вызовах,  так  и  при  обслуживании  прерываний принцип 
один:
         выполнявшаяся работа должна быть запомнена на  время,так
  что
         бы   можно  было  начать  новую.  Когда  новая  работа  
будет
         завершена,  необходимо  вернуться  к  выполнению   старо
й   в
         порядке, обратном тому в котором работа приостановлена.
              При  вызове  подпрограмм  часто  возникает необходи
мость
         передавать им параметры, что можно сделать с помощью сте
ка. В
         третьем приложении к этой книге описывается стыковка про
грамм
         на Паскале с программами на ассемблере и там  можно  уви
деть,
         как стек используется для передачи параметров.
              Стеки  настолько существенны для работы компьютеров
, что
         можно только удивляться их относительно недавнему включе
нию в
         конструкцию   компьютеров.  Серия  компьютеров  360,  ко
торая
         являлась основной продукцией фирмы "IBM" начиная  с  196
0-тых
         годов,   не   реализовывала   концепцию   стека,  что  с
ильно
         отразилось  на  возможностях  всей  этой  серии.   Сущес
твует
         красивая   легенда   о  том,  что  руководитель,  исключ
ивший
         стековую архитектуру из конструкции компьютеров фирмы  "
IBM",
         был в последствии "сослан" во внутрифирменный аналог Сиб
ири.
              Использование   стеков  может  быть  гораздо  шире,
  чем
         описывалось выше. Микропроцессор 8088 использует стек  т
олько
         для хранения контекста приостановленных программ. Для эт
ой же
         цели стек использует большинство компьютеров. Можно,  од
нако,
         полность   переориентировать   способ   работы  компьюте
ра  с
         командами и  данными,  так  что  все  будет  основыватьс
я  на
         использовании  стека.  Такая  архитектура, ориентированн
ая на
         использование стека,  была  разработана  фирмой  "Барроу
з"  и
         все,  кто  хочет   понять   на   сколько   радикально   
может
         отличаться   компьютер   с  такой  архитектурой,  от  об
ычных
         компьютеров, подобных IBM/PC, может  обратиться  к  опис
аниям
         компьютеров фирмы "Барроуз".
              Имеется   одна   подробность   в   использовании   
стека
         микропроцессором 8088, о которой необходимо знать,  если
  Вам
         потребуется  воспользоваться  содержимым  стека или пров
ерить
         рабочий стек. Стек продвигается от верхних  адресов  пам
ти  к
         нижним.  Это  означает  ,  что  старое содержимое стека 
имеет
         большие абсолютные адреса памяти,  чем  указатель  стека
  SP.
         Так,   например,   чтобы   извлечь   параметры  подпрогр
аммы,
         помещенные в стек, используются положительные смещения (
эт  о
         описано  в 3 приложении к этой книге). Что касается своб
одной
         части стека, к которой  обычно  обращаются  только  кома
ндами
         записи  или  извлечения  из  стека,  а  не  по прямому а
дресу
         памяти, то для нее потребовалось  бы  отрицательное  сме
щение
         относительно указания стека. 
          
      
              3.7. Порт
              
              Под портом понимают совокупность средств унифицирую
щих и
         упрощающих  способ  взаимодействия  микропроцессора  808
8   с
         внешним  миром.  Порт  обеспечивает  единственную возмож
ность
         приема или передачи данных любым обьектам кроме памяти.
              Всем устройствам, с  которыми  должен  взаимодейств
овать
         процессор,  таким  как  клавиатура,  дисководы  или  дин
амик,
         выделяется  собственный   порт.   Порт   представляет   
собой
         гипотетический  путь  данных, которому присвоен номер по
рта и
         который может принимать  или  передавать  данные  по  ко
манде
         процессора.   Когда  микропроцессор  8088  должен  перед
авать
         данные в порт, используется команда OUT, которой  указыв
ается
         номер  порта и передаваемые данные,имеющие длину один ил
и два
         байта. Фактически команда OUT  приказывает  конкртному  
порту
         принять данные. Команда IN работает аналогично, только д
анные
         считываются из порта. Микропроцессор 8088 не может опред
елить
         какие  порты  задействованы, а какие нет, так что все ко
манды
         IN и OUT выполняются вслепую.
              Операторы Бейсика обеспечивают прямой доступ  к  по
ртам.
         Операторы  Бейсика INP и OUT предоставляют те же возможн
ости,
         что и машинные команды IN и OUT. Ниже,  просто  для  при
мера,
         приведен   фрагмент   программы   на  Бейсике,  работающ
ей  с
         динамиком:
              
              10  X=INP(97)  `чтение  порта  управления  динамико
м   X
              20  REM         вероятно  будет иметь значение 76 -
 про-
                              верьте какое значенте Вы получите
              30  OUT 97,X+3 `установить биты управления динамико
м -
                              прозвучит сигнал 
              40  OUT 97,X   `снять биты управления - окончание з
вука
              
              
              Порты могут использоваться в  сочетании  с  прерывн
иями.
         Например,если  нажать  клавишу  на клавиатуре IBM/PC, ни
какие
         данные в компьютер не передаются. Вместо  этого  генерир
уется
         прерывание  номер 9, указывающий, что имеются данные, ко
торые
         нужно вводить с клавиатуры. В ответ на прерывание BIOS в
  ПЗУ
         выдаст  команду  IN  для порта клавиатуры. Только после 
этого
         данные, определяющие какая клавиша  была  нажата,  попад
ут  в
         компьютер.
              В случае с памятью может существовать до 1024К разл
ичных
         ячеек,  причем  компьютер  не  знает,  какие  именно   а
дреса
         действительно  имеются.  То  же  самое  касается  и  пор
тов -
         микропроцессор  8088  может  обращаться  к  порту   с   
любым
         допустимым номером, не зная, работает ли этот порт или н
ет.
              Адреса   портов   задаются   16   разрядами,   так 
  что
         потенциально   можно   иметь   64К   различных   портов.
    В
         действительности   используется  гораздо  меньше  номеро
в  и,
         следовательно,   имеются   неограниченные   возможности 
  для
         расширения.
              Имеется   несколько   способов  использования  порт
ов  в
         IBM/PC. Первый способ - это использование  порта  просто
  как
         пути  данных.  Например,  коды  клавиш,  указывающие как
ая из
         клавиш  была  нажата,  проходят  через  один  порт;   да
нные,
         выдаваемые на устройство печати, проходят через другой п
орт.
              Еще  один  способ  использования  портов  заключает
ся  в
         передаче  через  них  управляющей  информации   для   вн
ешних
         устройств   и   получении  от  этих  устройств  информац
ии  о
         состоянии.  Например,  инициализация  адаптера   монохро
много
         дисплея  выполняется  через  порт  952.  Еще  одно назна
чение
         портов заключается в считывании  положений  переключател
ей  в
         системном блоке, указывающих конфигурацию системы.
              Ниже  перечисляются некоторые наиболее важные приме
нения
         портов. Как и некоторые  подробности  организации  аппар
атных
         средств,  описанные в главе 2, номера конкретных портов 
могут
         не представлять  интереса  для  читателя,  но  я  привож
у  их
         полностью просто для полноты изложения.
              Порт 96 (шестнадцатиричное 60) используется для пер
едачи
         данных в  формате  порядковых  номеров,  от  клавиатуры.
  При
         описании  клавиатуры в главе 10 мы рассмотрим форматы но
меров
         и их использование более подробно. 
              Порт  97 (61(16)) используется для управления встро
енным
         динамиком, а также двигателем кассетного механизма. Он  
также
         позволяет  запустить аппаратный таймер, что более подроб
но мы
         рассмотрим в главе 11.
              Порты  с  64  по  67  (40(16)-43(16))  используются
  для
         управления   программируемым   таймером,   используемым 
  как
         динамиком, так и интерфейсом кассетного  накопителя.  О 
 том,
         как используются все эти порты, будет рассказано в главе
 11.
              Монохромный       дисплей      использует      неск
олько
         последовательных портов,  начиная  с  порта  944(3В0(16)
),  а
         цветной  графический  -  последовательность,  начинающую
ся  с
         порта  976(3D0(16)).  Контролер  гибких   дисков   испол
ьзует
         последовательность  портов,  начиная с порта 1008(3F0(16
)), а
         собственно данные, записываемые на дискету или считываем
ые  с
         нее, передаются через порт 1013(3F5(16)).
              Вместе  с  программой  3.1 для исследования конфигу
рации
         памяти,   листинги   3.2   и   3.3   показывают    прогр
амму,
         объединяющую  модули,  написанные на Паскале и на ассемб
лере,
         которая считывает все порты и сообщает о том,  какие  из
  них
         наиболее  вероятно  активны.  Готовая  к  запуску версия
 этой
         программы имеется на дискете, прилагающейся к этой  книг
е.  В
         отличие  от  программы  обследования  памяти эта програм
ма не
         дает достаточно практичного  результата,  однако,  она  
может
         оказаться довольно интересной.
      
              Поскольку  Бейсик  обеспечивает  доступ  к  портам,
  эту
         программу можно было бы написать на  Бейсике,  но  тогда
  для
         читателя  не  было  бы  в  ней  ничего  нового.  Вместо 
этого
         приведенный  пример  может  послужить  хорошим  введение
м   в
         программирование    на   ассемблере,   Паскале   и   при
мером
         объединения программ, написанных на разных языках. 
         Приложение   3.1.   Текст   программы   поиска
         активного участка памяти (Бейсик).
              
              1000 REM
              1010 REM
              1020 REM
              1030 GOSUB 2000 ' TITLE
              1040 GOSUB 3000 ' SEARCH AND DISPLAY
              1050 GOSUB 4000 ' RETURN TO DOS
              
              2000 REM
              2010 KEY OFF : CLS : WIDTH 80
              2020 REM
              2030 PRINT "
              2040 PRINT "
              2050 PRINT
              2060 PRINT "
              2070 PRINT
              2080 PRINT "
              2090 PRINT "
              2100 PRINT
              2999 RETURN
              
              3000 REM
              3010 TRUE.% = -1
              3020 FALSE.% = 0
              3030 IN.MEMORY.% = FALSE.%
              3040 FOR PARAGRAPH.! = 0 TO 65535! STEP  64  '
         CHECK EACH 1K OF MEMORY
              3050 GOSUB 5000 ' CHECK FOR ACTIVE MEMORY
              3060      IF     (IN.MEMORY.%=FALSE.%)     AND
         (MEMORY.HERE.%=TRUE.%) THEN GOSUB 6000
              3070     IF      (IN.MEMORY.%=TRUE.%)      AND
         (MEMORY.HERE.%=FALSE.%) THEN GOSUB 7000
              3080 IN.MEMORY.% = FALSE.%
              3090 IF MEMORY.HERE.% THEN IN.MEMORY.HERE.% =TRUE.%
              3100 NEXT PARAGRAPH.!
              3110 IF IN.MEMORY.% THEN PARAGRAPH.! = 65536 : GOSU
B 7000
              3999 RETURN
              
              4000 REM
              4010 PRINT
              4020 PRINT "Finished."
              4999 SYSTEM
              
              5000 REM
              5010 DEF SEG = PARAGRAPH.!
              5020 BYTE0.% = PEEK (0)
              5030 BYTE1.% = PEEK (1)
              5040 BYTE2.% = PEEK (2)
              5050 BYTE3.% = PEEK (3)
              5060 CHECK.COUNT.% = 0
              5070 IF BYTE0.% = 233 THEN CHECK.COUNT.% = CHECK.CO
UNT.% + 1
              5080 IF BYTE1.% = 233 THEN CHECK.COUNT.% = CHECK.CO
UNT.% + 1
              5090 IF BYTE2.% = 233 THEN CHECK.COUNT.% = CHECK.CO
UNT.% + 1
              5100 IF BYTE3.% = 233 THEN CHECK.COUNT.% = CHECK.CO
UNT.% + 1
              5110 MEMORY.HERE.% = FALSE.%
              5120 IF CHECK.COUNT.% <= 3 THEN MEMORY.HERE.% = TRU
E.%
              5999 RETURN
              6000 REM
              6010 IN.MEMORY.% = TRUE.%
              6020 START.! = PARAGRAPH.!
              6999 RETURN
              
              7000 REM 
              7010 SIZE.! = (PARAGRAPH.!-START.!) * 16
              7020 IF SIZE.! < 8 * 1024 THEN 7999 ' 
                   SUPPRESS SMALL-BLOCK FALSE REPORTS
              7030 PRINT "Active memory begins at ",
              7040 PRINT HEX$(START.!)
              7050 PRINT "                ends at ",
              7060 PRINT HEX$(PARAGRAPH.!-1);
              7070 PRINT SIZE.! / 1024;"K-bytes"; ("SIZE.!;"bytes
 )"
              7080 IN.MEMORY.% = FALSE.%
              7090 PRINT
              7999 RETURN
              
              9999 REM
              
              Приложение 3.2. Текст программы обработки
         прерываний (Ассемблер).
         beepseg segment 'code'
              assume  cs:beepseg
     
         beep    proc   far
                 cli
        
                 mov   bx,3000
                 in    al,61h
                 push  ax
         more:   and   al,0fch
                 out   61h,al
                 mov   cx,50
         11:     loop  11
                 or    al,2
                 out   61h,al
                 mov   cx,50
         12:     loop  12
                 dec   bx
                 jnz   more
                 pop   ax
                 out   61h,al
        
                 sti
        
                 int   20h
         beep    endp
         beepseg  ends
         end
      
              Приложение 3.3. Текст программы поиска активных
         портов (Паскаль).
              
              
         program porttest (output);
         
         function inport (x : word) : byte;
           external;
           
         var   
           count : word;
           b     : byte;
           w     : word;
           c     : array [wrd(0)..255] of word;
           headc : word;
           
         procedure header1;
          var [static]
            i : integer;
          begin
            writeln;
            for i := 1 to 8 do
              write (' Port Val');
            writeln;
          end;
          
         procedure header2;
          var [static]
            i : integer;
          begin
            writeln;
            for i := 1 to 8 do
              write (' Val Count');
            writeln;
          end;  
         procedure initialise;
           begin
             count := 0;
             headc := 0;
             for b := 0 to 255 do
               c[b] := 0;
             for w := 1 to 25 do
               writeln;
             writeln('Program for INSIDE THE IBM PERSONAL COMPUTE
R');
             writeln('(C) Copyright Peter Norton, 1983');
             writeln('Listing 3.3: PORTTEST - read all ports');
             writeln;
             writeln('The following may be active ports:');
             header1;
           end;  
      
         procedure scan_all_ports;
           begin
             for w:=0 to maxword do
               begin
                 b:=inport(w);
                 c[b]:=c[b]+1;
                 if not(b in [wrd(0),78,110,188,202,203,207,254,2
55])
                 then
                   begin
                     write(w:6,b:4);
                     count:=count+1;
                     headc:=headc+1;
                     if headc>159 then
                       begin
                         headc:=0;
                         header1;
                       end;
                   end;
               end;
             header1;
           end;
           
         procedure finish_up;
           begin
             writeln;
             writeln('Here is a profile of the values returned fo
r ',
                      all of the possible ports:');
             header2;
             for b:=0 to 255 do
               write(b:4,c[b]:6);
             header2;
             writeln(count,' ports may possibly be active');
             writeln;
             writeln('Finished.')
           end;
           begin
             initialize;
             scan_all_ports;
             finish_up
           end.  
           
              Приложение 3.4. Текст программы считывания данных
         из порта (Ассемблер).
         
         
         
         inport_code segment 'code'
         
         public  inport
         
         inport  proc  far
                 push  bp
                 mov   bp,sp
                 mov   dx,[bp+6]
                 in    al,dx
                 pop   bp
                 ret   2
                 
                db    '(C) Copyright Peter Norton, 1983'
                
         inport  endp
         
         inport_code ends
         
               end
                    ГЛАВА 4. ОСНОВЫ ОРГАНИЗАЦИИ ДОС
                    _______________________________
                
              В  этой  главе  будет  кратко  рассмотрена  система
 ДОС, 
         основная операционная система IBM/PC.  Мы  не  будем  сл
ишком 
         подробно  рассматривать  ее,  частично  потому  что ДОС 
может 
         составить достаточный предмет для  нескольких  книг  сам
а  по 
         себе,  а  частично потому, что эта книга в основном посв
ящена 
         внутренней организации IBM/PC, а не организации ДОС. 
              Но все же, поскольку ДОС  очень  широко используетс
я  на 
         IBM/PC,  необходимо  иметь  определенные  представления 
об ее 
         организации. Так как основное внимание в этой книге удел
яется 
         наиболее   сложным   возможностям   IBM/PC,  мы  покажем
  как 
         осуществляется доступ к этим возможностям с  помощью  ср
едств 
         операционной системы ДОС. 
              Здесь  тесно  соприкасаются  все  три упоминавшиеся
 выше 
         области интересов. Практически  все,  о  чем  пойдет  ре
чь  в 
         данной   главе,   относится   к  IBM/PC,  совместимым  с
  ней 
         компьютерам,  а   также   к   компьютерам,   работающим 
  под 
         управлением МS-DOS. 
                    
              4.1. Для чего нужны операционные системы? 
                    
              Чтобы  полнлстью  овладеть  всеми  возможностями  с
воего 
         компьютера, необходимо  понимать  его  операционную  сис
тему. 
         Предлагаемый  в этой главе краткий обзор позволит Вам по
нять, 
         что собой представляет ДОС. Слишком подробных  знаний  В
ы  не 
         приобретете,  но  ознакомление  с  этой  главой  позволи
т Вам 
         начать с ней работать. 
              Назначение операционной системы заключается в обесп
ечении 
         удобства  управления  компьютером.  Операционная  систем
а,   в 
         полном смысле этого термина, является первой и наиболее 
важной 
         программой любого компьютера.  Как  правило,  она  являе
тся  и 
         наиболее   сложной.  Паразительно,  что  наиболее  совер
шенные 
         программы   используются   только   для    управления   
 самим 
         компьютером.  Ирония здесь заключается в том, что компью
теры и 
         программы для  них  разрабатывались  для  выполнения  по
лезной 
         работы,  а  не  как  самоцель.  Но  с другой стороны, на
иболее 
         мощный  инструмент,  созданный  человеком,  компьютер,  
 имеет 
         достаточно  возможностей, чтобы работать сам по себе и ч
еловек 
         не смог бы управлять им, если бы не операционная система
. 
              Большая часть работы операционной системы заключает
ся  в 
         том,  чтобы  скрыть  от  пользователей  некоторые  сложн
ые  и 
         ненужные им детали. В качестве иллюстрации рассмотрим  р
аботу 
         команды  COPY  в  ДОС.  Предположим, что мы используем е
е для 
         копирования с одной дискеты на другую. Вам может показат
ься, 
         что  это не очень сложная процедура. Рассмотрим, однако,
 лишь 
         некоторые действия,  которые  должна  выполнить  операци
онная 
         система: 
              -  Проверить,  имеется  ли  на  исходной  дискете ф
айл с 
         указанным именем. 
              - Проверить, должно ли копирование выполняться не в
 файл 
         на  дискете,  а  на  какое-нибудь  устройство  (например
,  на 
         устройство печати). 
              - Проверить, нет ли файла  с  таким  именем  на  це
левой 
         дискете. 
              -  Проверить, достаточно ли места на целевой дискет
е для 
         размещения файла (учитывая все свободное место на дискет
е, а, 
         если копия файла уже есть на дискете, то еще и место, ко
торое 
         она занимает). 
              - Если на целевой дискете должен создаваться новый 
файл, 
         то   необходимо  проверить,  имеется  ли  свободное  мес
то  в 
         справочнике или он уже заполнен. 
              - Установить формат исходной дискеты: односторонний
  или 
         двухсторонний? 
              -  Установить  формат целевой дискеты: односторонни
й или 
         двухсторонний? 
              - Проверить, не копируется  ли  файл  сам  в  себя 
 (что 
         запрещено). 
              - Проверить наличие в системе двух дисководов, поск
ольку 
         для систем с одним дисководом необходимо имитировать дис
к В. 
              - Проверить, необходимо ли  вычислять  размер  исхо
дного 
         файла  по его размеру, указанному в справочнике, или он 
будет 
         определяться маркером конца файла (как для текстовых фай
лов в 
         коде ASCII). 
              -  Проверить, находится ли таблица размещения файло
в для 
         исходной дискеты в оперативной памяти. 
              - Проверить, находится ли таблица размещения файлов
  для 
         целевой дискеты в оперативной памяти. 
              -  Проверить  корректность размещения исходного фай
ла на 
         дискете по соответствующей таблице размещения файлов. 
              - Проверить,  совпадает  ли  размер  файла,  указан
ый  в 
         справочнике, с действительным размером. 
              -  Установить,  какой  обьем памяти можно использов
ать в 
         качестве буфера при перезаписи файла. 
              - Проверить, больше или меньше 64К размер буфера. 
              - Нужно ли удалять из памяти интерпретатор команд, 
чтобы 
         увеличить размер буфера? 
                    
              Вы  еще  не устали от этого перечисления? А ведь эт
о еще 
         только начало! Пока что рассмотрен только логический  ур
овень 
         задачи.  Ниже  приводится  физический уровень, причем пр
и его 
         изменении опущено значительно больше подробностей: 
              - Запущен ли двигатель дисковода? 
              - Выведена ли головка чтения/записи на нужную дорож
ку?
              - Сколько секторов данных нужно считать/записать на
 этой 
         дорожке? 
              - Готов ли дисковод к выполнению команды?
              - Работает  ли  дискета?  Не  требуется  ли  переза
пуск, 
         повторная   попытка   выполнения   операции   или   повт
орное 
         позиционирование головки? 
              - Если уже выполнялась повторная попытка, достаточн
о  ли 
         было  сделано  попыток,  чтобы  выдать  запрос  о  дальн
ейших 
         действиях? 
              - Каким был ответ на запрос? Повторить, игнорироват
ь или 
         аварийно завершить работу? 
              - Ожидание готовности дисковода?
              - Операция чтения/записи/поиска завершилась успешно
? 
              - Целевая дискета защищена от записи?
              Все  описанное   выше   является   лишь   приблизит
ельным 
         перечислением  подробностей  операции копирования файла.
 А это 
         еще относительно простая  операция  ДОС.  Кстати,  приве
денное 
         разделение на логический и физический уровни  очень важн
о для 
         работы операционной системы. 
              Основная  забота  операционной  системы,  такой как
 ДОС, 
         заключается в том , чтобы скрыть от пользователя эти нен
ужные 
         ему  подробности.  Значительная  часть  функций  операци
онной 
         системы заключается в обслуживании устройств ввода/вывод
а. 
              Помимо физического уровня обслуживания ДОС  обеспеч
ивает 
         и   услуги   более   высокого   уровня,  такие  как  пои
ск  в 
         справочниках, копирование файлов и загрузку программ. 
              Один  из  путей  достижения  эффективности  операци
онных 
         систем  - это модульность их разработки. Операционная си
стема 
         упрощается  и   становится   более   эффективной,   если
   ее 
         разработчики  разделят  все  ее  функции  на отдельные ч
асти. 
         Затем  эти  части  должны  быть  организованы   в   тщат
ельно 
         спланированную   иерархическую   систему,  в  которой  к
аждый 
         уровень иерархии выполняет присущие ему  функции,  освоб
ождая 
         уровни,  находящиеся выше по иерархии, от их выполнения 
(и, в 
         свою очередь, не занимаясь деталями функций, присущих  н
ижним 
         уровням).  Теперь мы перейдем к рассмотрению отдельных ч
астей 
         ДОС. 
                    
                    
              4.2. Шесть основных модулей ДОС 
                    
              Всю систему можно разделить на  шесть  основных  ча
стей, 
         функции  каждой  мз  которых  мы  кратко  рассмотрим  в 
 этом 
         разделе. Первая часть - это система BIOS в ПЗУ.  Это  си
стема 
         поставляется  вместе  с  IBM/PC  и может использоваться 
любой 
         операционной системой.  Функция  BIOS  в  ПЗУ  заключает
ся  в 
         обслуживании  основных  и  наиболее  фундаментальных опе
раций 
         компьютера. Поскольку система BIOS в ПЗУ для IBM/PC  явл
яется 
         "встроенной"  в  комптютер,  она является не только сост
авной 
         частью ДОС, но и составной частью любой операционной  си
стемы 
         IBM/PС. 
              Еще   одна   часть   -   "загрузочная  запись"  дис
кеты. 
         Загрузочная запись - это очень короткая и простая  прогр
амма, 
         находящаяся  в  первом  секторе  каждой дискеты. Функция
 этой 
         программы   заключается   в   запуске   процесса    загр
узки 
         операционной   системы   после   включения   компьютера 
  или 
         перезапуска (нажатия клавиш CTRL-Alt-Del). Загрузочная з
апись 
         считывает  еще два модуля операционной системы в память 
и они 
         завершают процесс загрузки ДОС. 
              Следующие две  части  ДОС  представляют  собой  дис
ковые 
         файлы  IBMBIO.COM  и  IBMDOS.COM. Обе эти части загружаю
тся в 
         память загрузочной записью  и  остаются  в  памяти  во  
время 
         работы  ДОС,  так  что  провести между ними различие дов
ольно 
         трудно. Файл  IBMBIO.COM   представляет   собой    измен
яемое 
         дополнение  к  системе BIOS в ПЗУ. Начиная с версии 2.00
 файл 
         IBMBIO.COM может  дополняться  другими  частями,  называ
емыми 
         независимыми   драйверами  устройств,  которые  мы  подр
обнее 
         рассмотрим несколько позже. Система BIOS в ПЗУ, IBMBIO.C
OM  и 
         драйверы   устройств,  вместе  взятые  образуют  "физиче
ский" 
         уровень операционной системы. 
              Файл  IBMDOS.COM  реализует  основные  услуги  ДОС.
  Это 
         "логический" уровень ввода/вывода операционной системы. 
              Оба  эти файла являются "скрытыми" системными файла
ми (о 
         которых подробнее будет сказано в главе 5). Имена этих ф
айлов 
         не  включаются в оглавление диска, вызываемое по команде
 DIR. 
         Команда CHKDSK (для ДОС версии 1.10  и  последующих)  ук
ажет, 
         что  эти  файлы находятся на дискете, но не сообщит их и
мена. 
         Если Вы  воспользуетесь  процедурой  DiskLook  для  прос
мотра 
         содержимого  дискеты,  то оба имени, IBMBIO.COM и IBMDOS
.COM, 
         будут присутствовать в списке и их  можно  просматривать
  так 
         же,  как  все  остальные  файлы.  Одна  из функций IBMBI
O.COM 
         заключается в загрузке еще одного модуля операционой сис
темы. 
              Пятая часть - это дисковый файл COMMAND.COM.  Главн
ая  
         функция  COMMAND.COM заключается в обработке команд, вво
димых 
         пользователем. Команды ДОС,  считающиеся  внутренними,  
такие 
         как  TYPE,  COPY  и  DIR  фактически  реализуются програ
ммами 
         COMMAND.COM. Собственно COMMAND.COM разделяется на две ч
асти: 
         одна  становится  частью  IBMDOS.COM,  а вторая - процес
сором 
         дополнительных команд.  Более  подробно  об  этом  сказа
но  в 
         разделе 4.7. 
              Шестая  и  последняя  часть  ДОС состоит из всех вн
ешних 
         команд, таких как FORMAT  и  DISKCOPY.  Функции  этих  к
оманд 
         различны  и  реализующие  их  программы  загружаются в п
амять 
         только в случае необходимости. В отличие  от  остальных 
 пяти 
         частей  ДОС,  все  эти  дополнительнве  программы не явл
яются 
         интегральной составляющей ДОС, хотя они и поставляются в
месте 
         с  ней.  Некоторые из этих дополнительных программ, напр
имер, 
         FORMAT, настолько важны, что  обойтись  без  них  практи
чески 
         невозможно. 
              Внешние  команды  являются  нерезидентными  частями
 ДОС, 
         поскольку  они  не  находятся  в  памяти   постоянно.   
Файлы 
         IBMBIO.COM, IBMDOS.COM и драйверы устойств находятся в п
амяти 
         постоянно и образуют резидентную часть ДОС. Файл COMMAND
.COM 
         можно  выделить  в  отдельную  категорию как полу-резиде
нтную 
         составляющую ДОС, о чем речь пойдет ниже. Загрузочная  з
апись 
         используется   только   временно   и   поэтому   не  явл
яется 
         резидентной частью ДОС. В следующих шести разделах  мы  
более 
         подробно рассмотрим каждую из частей ДОС. 
                    
              4.3. Система BIOS в ПЗУ
                                               
                    
              Первая  часть в ДОС - это BIOS в ПЗУ или базовая си
стема 
         ввода/вывода, размещающаяся в постоянной памяти. Эта  си
стема 
         обеспечивает   наиболее   простые   и   универсальные  у
слуги 
         операционной    системы,    связанные    с     осуществл
ением 
         ввода/вывода. 
              Система BIOS располагается в ПЗУ начиная с адреса F
E00 и 
         до FFFF, сразу же после интепретатора БЕЙСИКа.  Распреде
ление 
         памяти,  приведенное  в  главе  3,  показывает  и  разме
щение 
         системы BIOS. 
              Поскольку BIOS в ПЗУ является частью IBM/PC,  она  
может 
         изменяться только в том случае, когда изменениям подверг
ается 
         аппаратная реализация системы.  В  качестве  составной  
части 
         IBM/PC, система BIOS в ПЗУ является не просто одной из ч
астей 
         ДОС, но частью любой операционной системы IBM/PC. 
              Система  BIOS  в  ПЗУ  состоит  из  нескольких   ча
стей, 
         большинство   из   которых   представляет   собой   прог
раммы 
         (остальные - это важные таблицы данных, которые мы рассм
отрим 
         в   последующих  главах).  Программа  системы  BIOS,  ко
торая 
         выполняется первой, представляет собой тест функциониова
ния. 
              Эта программа  поверяет  память  и  внешние  устрой
ства, 
         подключенные  к  IBM/PC,  как  только  будет включено пи
тание 
         компьютера. Работа этой  программы  определяет  ту  заде
ржку, 
         которая  имеет  место  между  включением  питания и загр
узкой 
         операционной системы. Чем больший объем  памяти  подключ
ен  к 
         Вашему  компьютеру,  тем  дольше  выполняется тест, поск
ольку 
         наиболее длительной  процедурой  является  процедура  по
верки 
         памяти. 
              Следующая часть  BIOS,  которая  должна  выполнятьс
я  как 
         программа запуска операционной системы, - это программа 
вызова 
         загрузчика  операционной  системы.  Эта  программа  пров
еряет, 
         подключен  ли дисковод с гибкими дисками и считывает с д
искеты 
         "загрузочную  запись".  После  считывания  загрузочной  
записи 
         программа  запуска  передает  ей управление, чтобы она с
читала 
         оставшиеся части операционной системы. 
              Если   в   системе  нет  дисковода  или  при  считы
вании 
         загрузочной записи произошла  ошибка,  то  программа  за
пуска 
         BIOS  передает  управление  кассетной системе БЕЙСИК. Ес
ли Вы 
         включите IBM/PC, не  установив  дискету  в  дисковод,  т
о  Вы 
         увидите,   что  начала  работу  программа  кассетной  си
стемы 
         БЕЙСИКа. 
              Помимо двух уже описанных  частей  -  автономного  
теста 
         функцонирования  и  программы  запуска,  система  BIOS  
в ПЗУ 
         содержит множество других программ и они-то представляют
  для 
         нас наибольший  интерес.  Сюда  входят программы обслужи
вания 
         всего стандартного  периферийного  оборудования  IBM/PC.
  Эти 
         программы  выполняют основные функции управления клавиат
урой, 
         дисплеем, дискетами, асинхронным адаптером связи, устрой
ством 
         печати  и  кассетным интерфейсом. Работой с этими програ
ммами 
         нам необходимо овладеть,  чтобы  полностью  использовать
  все 
         возможности IBM/PC. Подробно мы рассмотрим их в главах с
 6 по 
         11. 
                    
                    
              4.4. Начальная загрузка - загрузочная запись
                    
                    
              Загрузочная запись необходима для запуска  ДОС.  Пр
инцип 
         использования  загрузочной  записи  реализован практичес
ки на 
         всех  компьютерах.  Загрузочная   запись   содержит   ми
нимум 
         необходимых  команд  для считывания и запуска основных ч
астей 
         операционной системы. 
              При запуске IBM/PC либо включением питания, либо на
жатием 
         клавиш  Ctrl-Alt-Del,  процедура  запуска  системы  BIOS
 в ПЗУ 
         считывает первую запись дискеты, установленной в дисково
д А  и 
         помещает  ее в стандартную область памяти, по адресу 317
44 или 
         7С00 (шестнадцатиричное). После считывания загрузочной  
записи 
         BIOS передает ей управление, выполняя переход по адресу 
31744. 
         Далее   загрузочная   запись   должна   продолжить    за
грузку 
         операционной системы. 
              Основное   назначение   загрузочной   записи   для 
  ДОС 
         заключается просто в загрузке файлов IBMBIO.COM и IBMDOS
.COM. 
         Загрузочная  запись  имет  размер  стандартного  сектора
   на 
         дискете,  512  байт,  что недостаточно для сложной прогр
аммы. 
         Для упрощения работы этой программы, оба файла, IBMBIO.C
OM  и 
         IBMDOS.COM,  размещаются  в определенных постоянных мест
ах на 
         дискете. Это избавляет программу  загрузки  от  необходи
мости 
         искать их в справочнике дискеты. 
              Этим,  кстати, "системная" дискета отличается от об
ычной 
         - на ней, в  определенных  местах,  находятся  два  сист
емных 
         файла  IBMDOS.COM  и  IBMBIO.COM.  Поэтому  нельзя  прос
то 
         преобразовать  обычную   дискету   в   системную   -   м
еста, 
         зарезервированные  для  системных  файлов,  могут быть з
аняты 
         другими файлами. 
              Хотя загрузочная программа не  столь  совершенна,  
чтобы 
         осуществлять  поиск  системных  файлов,  она  все же спо
собна 
         проверить правильность их включения в  справочник.  Поск
ольку 
         оба  системных  файла  включены  в  справочник  дискеты,
  они 
         защищены как от стирания, так  и  от  любых  других  спо
собов 
         доступа  установлением атрибутов скрытого и системного ф
айла. 
         (В следующей главе мы поясним, что такое скрытые и  сист
емные 
         файлы). 
              В  связи  с  простотой  ее  задачи,  программа  заг
рузки 
         является относительно стабильной  составной  частью  ДОС
.  Ее 
         потребовалось    изменить,   когда   изменялся   размер 
  или 
         местоположение системных файлов, а это произошло с  введ
ением 
         поддержки двухсторонних дискет в версии ДОС 1.10. 
              Вы  можете обнаружить различия в загрузочных запися
х ДОС 
         различных версий. (Загрузочную  запись  легко  просмотре
ть  с 
         помощью  моей  утилиты  DiskLook: запустите DiskLook, на
жмите 
         клавишу F7 и введите адрес  загрузочной  записи  на  дис
кете: 
         сторона  0, дорожка 00 и сектор 1, после чего нажмите кл
авишу 
         F6 - на экране будет отображена загрузочная запись). 
              Загрузочная  запись   ДОС   версии   1.00   имеет  
 одно 
         незначительное  отличие  от  всех  остальных  версий, ко
торое 
         легко заметить.Вместо имени Роберта О'Рира в исходной  в
ерсии 
         ДОС,  во  всех последующих версиях указывается название 
фирмы 
         "Майкрософт". 
                    
                    
              4.5. Дополнительные операции с устройствами: IBMBIO
.COM
                    
                    
              Первый   из   двух   системных    файлов,    IBMBIO
.COM, 
         предназначен  для  дополнения функций системы BIOS в ПЗУ
. Как 
         BIOS  в  ПЗУ,  так  и  IBMBIO.COM  занимаются   обслужив
анием 
         операций  ввода/вывода или обслуживанием устройств, что 
то же 
         самое.  Такая  функция   предполагает   обработку   разл
ичных 
         подробностей,   связанных   с   функционированием   устр
ойств 
         ввода/вывода. Сюда же  включается  обнаружение  ошибок  
и  их 
         исправление, что для программ еще сложнее. 
              Программы  IBMBIO.COM  отличаются тем, что их легко
 можно 
         изменить, чего нельзя сказать о программах BIOS  в  ПЗУ.
  Файл 
         IBMBIO.COM   предназначен  для  решения  трех  задач,  к
оторые 
         невозможно решить с помощью системы BIOS в ПЗУ. Первая  
задача 
         заключается  в  настройке  на  нужды  конкретной  операц
ионной 
         системы, ДОС. Любая операционная система,  включая  СР/М
-86  и 
         р-систему  Калифорнийского  университета  в  Сан-Диего, 
 может 
         использовать универсальную систему BIOS в ПЗУ, но в той 
части, 
         в   которой  системы  различаются,  они  должны  реализо
вывать 
         собственные фрагменты системы ввода/вывода. 
              Вторая задача IBMBIO.COM заключается в исправлении 
любых 
         ошибок  в  BIOS  в  ПЗУ, если в этом возникнет необходим
ость. 
         Программы,   подобные   системе   BIOS,   проверяются   
очень 
         тщательно,   ведь   их   размещение   в   ПЗУ   не  допу
скает 
         исправлений. Если ошибки все же  будут позднее  обнаруже
ны  в 
         BIOS, их можно будет исправить путем внесения соответств
ующих 
         изменений в IBMBIO.COM. Это делается путем изменения век
торов 
         прерываний  таким  образом,  чтобы управление при обраще
нии к 
         операциям BIOS сначала попадало в IBMBIO.COM, а уже  зат
ем  в 
         BIOS. Соглашения о вызовах процедур системы BIOS в ПЗУ в
сегда 
         предполагает   использование   прерываний,   вместо    п
рямых 
         переходов  по  адресам  ПЗУ.  Основная  причина использо
вания 
         прерываний как  раз  и  состоит  в  обеспечении  возможн
остей 
         перехвата  управления  у  процедур  BIOS,  ведь,  в прот
ивном 
         случае, такой возможности просто не существовало бы. В  
главе 
         7,   когда   будет   рассматриваться   программа   управ
ления 
         дискетами, известная под названием "Disk  base",  Вы  ув
идите 
         одно из таких изменений, частично подменяющее функции си
стемы 
         BIOS в ПЗУ. 
              Третья задача, которую  не  позволяет  решить  BIOS
,  и, 
         которую  за нее решает IBMBIO.COM, заключается в обслужи
вании 
         новых периферийных устройств, таких как жесткие диски бо
льшой 
         емкости,  или  восьмидюймовые  (203мм) дискеты, или плот
теры, 
         или любые из сотен устройств, которые могут быть подключ
ены к 
         IBM/PC.  Когда  новое  устройство ввода/вывода подключае
тся к 
         IBM/PC, обслуживающая его программа должна включаться в 
 файл 
         IBMBIO.COM  или  его  расширения,  без  необходимости  з
амены 
         микросхем ПЗУ, в которых размещается система BIOS. 
              В наиболее ранних версиях ДОС  задача  включения  н
ового 
         устройства   в  систему  предполагала  внесение  изменен
ий  в 
         IBMBIO.COM и, возможно, в  другие  системные  программы 
 ДОС. 
         Хотя  это  не  слишком  сложно  для  таких фирм как "ИБМ
" или 
         "Майкрософт", такая задача может  оказаться  непосильной
  для 
         пользователя,   которому  требуется  включить  дополните
льное 
         оборудование в свою систему. 
              Поскольку   возможность  добавления  новых  устройс
тв  к 
         компьютеру составляет немаловажное условие  его  успеха 
 на 
         рынке,  процедура включения обслуживающих программ в ДОС
 была 
         упрощена, начиная с ДОС версии 2.00. Когда управление вп
ервые 
         после  запуска  системы  передается IBMBIO.COM, он прове
ряет, 
         находится ли на дискете файл конфигурации системы. Если 
 файл 
         конфигурации  найден,  считываются его команды, часть ко
торых 
         определяет ряд параметров системы. 
              Команды файла конфигурации включают имена всех  про
грамм 
         обслуживания  устройств,  которые необходимо включить в 
BIOS. 
         Каждая из этих программ загружается в память как дополне
ние к 
         IBMBIO.COM. Такая схема облегчает добавление новых устро
йств, 
         позволяет делать это модульно, не затрагивая системные  
файлы 
         ДОС. 
              Как  правило,  любая  программа,  работающая  на IB
M/PC, 
         будет использовать обычную версию BIOS  для  ДОС.  Однак
о,  в 
         некоторых   случаях   программе   необходимо   бывает  о
собое 
         обслуживание  операций  ввода/вывода.  Поскольку   IBMBI
O.COM 
         представляет  собой  дисковый  файл,  который можно изме
нить, 
         имеет смысл разработать  версию  IBMBIO.COM,  настроенну
ю  на 
         Ваши конкретные нужды. Пример такой настройки Вы можете 
найти 
         в диагностических программах. 
                    
                    
              4.6. Основа ДОС: IBMDOS.COM
                    
                    
              Разделение   операционной   системы   на   два   мо
дуля,
         IBMBIO.COM и IBMDOS.COM позволяет разделить те части, ко
торые
         специфичны для конкретного компьютера и те, которые  явл
яются
         общими для всех компьютеров, работающих под управлением 
ДОС.
              Служебные   процедуры   ДОС,   в   определенной   с
тепени 
         произвольно,  разделены  на  те,  которые вызываются с п
омощью 
         собственных  прерываний,  и  те,   которые   разделяют  
 общее 
         прерывание   (номер  33,  шестнадцатиричное  значение  2
1).  В 
         терминологии ДОС, первая группа называется прерываниями 
ДОС, а 
         вторая  -  вызовами  функций.  В  обоих  случаях для их 
вызова 
         используются программные прерывания, причем по той же пр
ичине, 
         что и для вызова программ BIOS: для обеспечения модульно
сти. 
              Диапазон  прерываний  от  32  до  63  (шестнадцатир
ичные
         значения  от 20 до 3F) зарезервированы для использования
 ДОС.
         Используется  только  часть  этих  прерываний,  а   оста
льные
         обеспечивают  возможность  дальнейшего  расширения. Прог
раммы
         обслуживания прерываний ДОС включают чтение и запись сек
торов
         дискеты,  доступ  к  контролю  за  ошибками  ДОС и опера
циями
         клавиатуры Ctrl-Break.
              Вызовы   функций   ДОС   обеспечивают,    в    осно
вном,
         промежуточный  уровень  обслуживания операций ввода/выво
да. В
         качестве примеров можно упомянуть ввод с клавиатуры,  об
ычный
         вывод на экран дисплея, ввод/вывод по асинхронной линии 
связи
         и вывод на печать. Предусмотрены  также  логические  опе
рации
         для дискет - открытие и закрытие файлов, поиск в  справо
чнике
         файлов,  удаление  и создание файлов, чтение и запись да
нных.
         Эти  процедуры  обеспечивают  практически  все   элемент
арные
         операции,  которые могут потребоваться программе для раб
оты с
         файлами и данными, хранящимися в файле, так  чтобы  прог
рамме
         не    приходилось    самостоятельно   расшифровывать   д
анные
         справочников, таблиц размещения файлов и т.п.
              Большая часть этих  служебных  процедур  ДОС  интен
сивно
         используется программами более высокого уровня ДОС. Напр
имер,
         процедура поиска в справочнике используется командами  D
IR  и
         COPY. Кроме того, она используется интерпретатором коман
д для
         поиска программных файлов. В  разделе  4.9  будет  рассм
отрен
         полный список служебных процедур ДОС.
              
              4.7. Файл COMMAND.COM и внутренние команды
              
              
              Следующая составная часть ДОС, файл COMMAND.COM, од
на из
         наиболее интересных частей, как с  точки  зрения  тех  у
слуг,
         которые  она предоставляет пользователю, так и с точки з
рения
         принципов ее функционирования.  COMMAND.COM  имеет  неск
олько
         функций.  Прежде  всего, это "процессор команд", что озн
ачает
         возложенные на него  функции  ввода  команды,  набираемо
й  на
         клавиатуре, и определения дальнейших действий.
              Когда    вводится    внутренняя   команда,   такая 
  как
         DIR, COPY, TYPE, REM или PAUSE,  то  запрашивается  случ
айная
         процедура,  "встроенная"  в  COMMAND.COM,  так  что она 
может
         выполняться немедленно.
              Чтобы  распознавать  внутренние   команды,   COMMAN
D.COM
         содержит   таблицу   имен   команд.   Если  просмотреть 
 файл
         COMMAND.COM, то можно увидеть эти имена команд. Для прос
мотра
         файла  COMMAND.COM можно воспользоваться программой DEBU
G или
         DiskLook. Там же Вы увидите сообщение, которое ДОС  выда
ет  в
         начале  работы.  При  желании  эти сообщения можно измен
ить с
         помощью команды DEBUG или  SecMod,  так  чтобы  ДОС  нач
инала
         работу  выдачей  Вашей  фамилии  или названия компании. 
Можно
         также изменить и имена внутренних команд, причем сделать
  это
         просто, если не изменяется длина имени.
              Если  команды  нет  в  таблице внутренних команд, з
начит
         имеется в виду внешняя  команда,  которую  COMMAND.COM  
будет
         искать  во  внешнем файле. В ответ на наш запрос, COMMAN
D.COM
         осуществляет поиск файла обработки команды на соответств
ующей
         дискете и запускает его выполнение.
              Существует  три  типа  файлов  обработки  команд,  
поиск
         которых  в  определенном  порядке  осуществляет  COMMAND
.COM.
         Название  команды  точно  совпадает с именем файла, в ко
тором
         хранится  програма  обработки  команды.   Три   типа   ф
айлов
         обработки  команд  различаются  расширениями имен файлов
. Три
         расширения,  в  порядке  их  приоритетности:  ".COM", ко
торое
         обозначает  программный  файл  в  одном  из  двух програ
ммных
         форматов;  ".EXE",  обозначающее  программный  файл   др
угого
         формата  и  ".BAT",  обозначающее  файл  пакетной  обраб
отки.
         (Форматы этих файлов и масса  другой  информации,  касаю
щейся
         файлов на дискетах, приведены в следующей главе.)
              Когда  COMMAND.COM  находит  программный  файл  в  
любом
         формате,  он  выполняет  загрузку  этого  файла  в  памя
ть  и
         выполняет  любое  необходимое  преобразование. После заг
рузки
         файла  и  формирования   приставки   программного   сегм
ента,
         COMMAND.COM передает управление этой программе, так чтоб
ы она
         могла выполнить свою работу.
              Если файл обработки команды относится к типу ".BAT"
,  то
         есть  является  файлом  пакетной  обработки, то он содер
жит в
         формате текстового  файла  в  коде  ASCII  последователь
ность
         команд,  которые  должны  выполняться  так,  как  будто 
  они
         вводятся  с  клавиатуры.  Одна  из  многих  задач COMMAN
D.COM
         заключается  в  отслеживании   позиции   в   файле   пак
етной
         обработки,  так  чтобы  после  выполнения одной команды 
сразу
         переходить  к  другой.  Если  в  процессе  обработки   о
дного
         пакетного файла будет вызван другой, то возврата к перво
му не
         произойдет, так как файлы пакетной обработки  не  могут 
 быть
         вложенными, зато их можно объединять в цепочку.
              В   некоторых  системах  весь  ввод  команд  может 
 быть
         переназначен на файл, причем это относится как к  програ
ммам,
         вводящим  данные с клавиатуры, так и к интерпретатору ко
манд.
         К  ДОС  это  не  относится.   Только   интерпретатор   к
оманд
         COMMAND.COM  может  автоматически  выполнять чтение из ф
айлов
         пакетной обработки.
              Кстати,  программы  могут  вносить  изменения   в  
 файл
         пакетной  обработки и таким образом определять, какая ко
манда
         будет выполнена  следующей.  Это  часто  делается  в  сл
ожных
         приложениях для замены последовательного выполнения прог
рамм.
              Файл  COMMAND.COM  имеет значительно больше функций
, чем
         было описано.  Фактически,  COMMAND.COM  разделяется  на
  три
         части.  Первая часть размещается в памяти сразу после пр
ограм
         IBMBIO.COM   и   IBMDOS.COM   и,   подобно   им,   стано
вится
         резидентной  частью  ДОС.  Фактически  эта  часть COMMAN
D.COM
         не отличается от IBMDOS.COM.
              Вторая часть COMMAND.COM используется  только  врем
енно:
         при  запуске  системы  она  осуществляет поиск файла пак
етной
         обработки AUTOEXEC.BAT и, если  он  найден,  его  выполн
ение.
         После   выполнения  этой  функции  данная  часть  COMMAN
D.COM
         уже не нужна.
              Третья,  наиболее  интересная  часть COMMAND.COM яв
ляется 
         полурезидентной  и  одной  из  наиболее  хорошо  прорабо
танных 
         частей   ДОС.   Эта  часть  включает  интерпретатор  ком
анд  и 
         программы,  реализующие  внутренние  команды  ДОС.  Необ
ходимо 
         отдавать  себе  отчет  в  том, что такая сложная програм
ма как 
         интерпретатор команд не может быть очень компактной.  С 
 одной 
         стороны,  лучше  всего  было  бы,  чтобы  интерпретатор 
команд 
         постоянно находился в памяти. С другой  стороны,  не  хо
телось 
         бы,  чтобы он занимал место в памяти все время, особенно
, если 
         места не слишком много (в системах с 64К, например). 
              Интересное  решение  этой  проблемы  заключается  в
 том,
         чтобы разместить эту  часть  COMMAND.COM  в  верхних  ад
ресах
         памяти  (обычно  используются  последние  адреса) и позв
олить
         другим программам затирать эту область памяти.
              Когда  снова   возникает   необходимость   использо
вания
         интерпретатора  команд, резидентная часть СOMMAND.COM сн
ачала
         проверяет находится ли интерпретатор команд в памяти. Ес
ли он
         запорчен    другими   программами,   то   резидентная   
часть
         перезагружает  его  с  дискеты.  (По  этой  причине,  кс
тати,
         необходимо  иметь  копии  COMMAND.COM на всех Ваших диск
етах,
         даже на тех, которые не форматировались в системном  фор
мате.
         Если   в   процессе   работы   Вы  увидите  сообщение:"I
nsert
         DOS disk..." [вставьте диск ДОС], это будет означать, чт
о  на
         используемой Вами дискете отсутствует файл СOMMAND.COM).
              Чтобы  проверить наличие в памяти интерпретатора ко
манд,
         вычисляется контрольная сумма тех ячеек памяти, в которы
х  он
         должен  находиться.  Если  сумма не совпадает с ожидаемо
й, то
         COMMAND.COM  перезагружается.  Вычисление  контрольной  
суммы
         может  производиться  при  перезагрузке  COMMAND.COM  и,
 если
         обнаружено различие, ДОС  выдает  сообщение  об  ошибке.
  Это
         происходит  даже  в  том  случае,  когда различие заключ
ается
         всего лишь в том, что Вы  изменили  начальное  сообщение
  ДОС
         ("The  IBM  Personal  Computer  DOS"..),  которое,  как 
я уже
         упоминал, можно изменить. Если  Вы  это  сделали  или  в
несли
         какие-нибудь  другие  изменения в COMMAND.COM, это необх
одимо
         сделать на всех Ваших дискетах.
              Одна из причин, по  которой  COMMAND.COM  оформляет
ся  в
         виде  отдельного  файла  и  не  объединяется  с двумя др
угими
         системными  файлами,  заключается  в  облегчении   разра
ботки
         прикладных   версий.   Это   одна  из  основных  возможн
остей
         адаптации IBM/PC  к  нуждам  пользователей.  Если  необх
одимо
         часть   пользовательских   команд   сделать  внутренними
  или
         изменить  способ  работы  интерпретатора  команд,  то   
можно
         написать специальную программу COMMAND.COM.
              Примером  прикладной  версии  COMMAND.COM  может сл
ужить
         исходная версия 1.00 текстового  процессора  Easy-Writer
.  Он
         имеет  собственный  вариант  COMMAND.COM и поэтому перех
од от
         ДОС к Easy-Writer и наоборот требует перезагрузки систем
ы.
              Как  рекомендует  руководство  фирмы "ИБМ", операци
онная
         система  может  быть  перезагружена  после   нажатия   к
лавиш
         Ctrl-Alt-Del.  Это  приводит  к  полному перезапуску сис
темы,
         начиная с чтения загрузочной записи. Имеется,  однако,  
менее
         радикальный  способ перезапуска. Если ввести команду COM
MAND,
         то перезагрузится только COMMAND.COM и система перезапус
тится
         без  перезагрузки  IBMBIO.COM  и  IBMDOS.COM.  Это  позв
оляет
         обновить  версию  интерпретатора  команд  и  выполнить  
 файл
         пакетной обработки AUTOEXEC.BAT.
              
              
              4.8. Оставшиеся части ДОС: внешние команды
              
              
              Последнюю  часть  операционной  системы  ДОС  соста
вляют
         внешние команды. Они называются внешними,  поскольку  он
и  не
         включены  в  состав  ДОС, и не являются резидентными в п
амяти
         IBM/PC. Вместо этого, внешние команды хранятся в  програ
ммных
         файлах на дискетах.
              Как  все  программные  файлы,  все внешние команды 
имеют
         расширение имени файла ".COM" или  ".EXE", что  указывае
т,  в
         каком  из  форматов они оформлены. Мы рассмотрим эти фор
маты,
         когда  будем  рассматривать  структуру  дискет  и  файло
в   в
         следующей главе.
              Примерами  внешних  команд могут служить DISKCOPY, 
COMP,
         FORMAT, а такие программы как EDLIN, BASIC или BASICA то
же  в
         определенном  смысле  являются  внешними  командами,  хо
тя их
         лучше все  же  считать  языковыми  процессорами,  такими
  как
         макроассемблер или Паскаль.
              Внешние  команды  не  отличаются  от  других програ
ммных
         файлов, которые Вы сами разрабатываете или покупаете. С 
одной
         точки  зрения  внешние  команды действительно являются ч
астью
         операционной системы, особенно те, без  которых  операци
онной
         системой  нельзя воспользоваться, такие как FORMAT. Одна
ко, с
         другой  точки  зрения,  внешние  команды  -  это  всего 
 лишь
         вспомогательные   программы,  утилиты,  которые  полезны
,  но
         которые не  являются  операционной  системой.  Разница  
между
         внешней  командой ДОС и обычной программой заключается п
росто
         в Вашем отношении  к  ней  -  как  к  части  ДОС  или  к
ак  к
         чему-нибудь малосущественному.
              
              4.9. Доступ к средствам и услугам ДОС
              
              
              В  это  разделе  мы  рассмотрим все служебные проце
дуры,
         доступные пользователям ДОС. Здесь будет приведен  первы
й  из
         нескольких  списков служебных процедур, которые встречаю
тся в
         этой  книге.  Данный  раздел  описывает   средства   ДОС
,   а
         последующие  главы  будут последовательно описывать служ
ебные
         процедуры, обеспечиваемые системой BIOS в ПЗУ. 
              Прежде  чем  перейти  к  подробному  рассмотрению  
 этих
         средств,   определим   способ  изложения,  который  мы  
будем
         использовать в дальнейшем. Мы будем последовательно опис
ывать
         эти средства, указывая их идентифицирующие номера и опис
ывая,
         что каждое из средств делает. Мы не  будем  рассматриват
ь  во
         всех   подробностях   способы   вызова   служебных  проц
едур,
         поскольку это не представляет  большого  интереса.  Еще 
 одна
         причина,  по  которой не описываются способы вызова служ
ебных
         процедур ДОС, заключается в том,  что  читателям  этой  
книги
         предлагается набор интерфейсных программ, которые избавя
т Вас
         от  утомительных  процедур  загрузки  регистров  и  уста
новки
         флагов.
              В  тех  случаях,  когда нужно будет сделать отступл
ение,
         чтобы сообщить нечто интересное о  конкретной  процедуре
,  ее
         назначении  или  связи  с  другими  частями  IBM/PC, мы 
будем
         делать паузу и  излагать  этот  материал.  Даже  если  В
ы  не
         собираетесь  писать программы, которые будут использоват
ь эти
         процедуры, Вам все равно полезно будет прочитать этот ра
здел.
         Он  поможет  Вам  больше  узнать  о том, как IBM/PС рабо
тает,
         какими возможностями обладает и как  заставить  ее  выпо
лнять
         некоторые удивительные задания.
              Если   Вы   пишите  программы  для  IBM/PC,  Вам  п
росто
         необходимо овладеть  всеми  средствами  доступа  к  служ
ебным
         процедурам.  Чтобы  как  можно больше облегчить использо
вание
         этих процедур, я написал полный набор интерфейсных  прог
рамм,
         который записан на дискетах, прилагаемых к этой книге.
              Все  служебные  процедуры ДОС и BIOS в ПЗУ приспосо
блены
         для их вызова из программ на языке ассемблера. Для каждо
й  из
         этих   процедур   я   написал   на   ассемблере   специа
льную
         интерфейсную  программу,  которая   обеспечивает   досту
п   к
         процедуре  из программ, написанных на Паскале и других я
зыках
         высокого    уровня.   Ассемблерные   интерфейсные   прог
раммы
         для процедур ДОС,  описанных  в  этом  разделе,  приведе
ны  в
         листинге 4.101.
              Во  многих  случаях  очень  полезно  иметь  более г
ибкое
         средство,  чем  просто  интерфейсная  программа.   Не   
менее
         полезной   может  оказаться  и  какая-нибудь  вспомогате
льная
         программа. Для этой цели мною включены в пакет многочисл
енные
         программы,  написанные на Паскале, которые позволяют наи
более
         полно  использовать  вызываемые  служебные   процедуры. 
  Для
         средств   ДОС,  описанных  в  этом  разделе,  вспомогате
льные
         программы на Паскале приведены в листинге 4.102. 
              Интерфейсные программы на ассемблере  и  вспомогате
льные
         программы  на  Паскале  позволят  Вашим  программам  пол
учить
         наиболее полный доступ ко всем возможностям IBM/PC.
              В ДОС используется семь процедур обслуживания преры
ваний
         и  еще одна, восьмая, предназначенная для вызова всех фу
нкций
         ДОС. Сначала рассмотрим отдельные процедуры.
              Прерывание   32    (шестнадцатиричное    значение  
  20)
         используется  для завершения работы программы. Это норма
льный
         способ  завершения  работы  программы  и  запроса  к  ДО
С  на
         выполнение необходимых восстановительных операций.
              Эти   восстановительные   операции  имеют  два  асп
екта.
         Во-первых,  имеются   три   служебных   прерывания,   ко
торые
         программе разрешается изменять для собственных целей, а 
после
         завершения программы ДОС восстанавливает те значения, ко
торые
         вектора  этих  прерываний  имеют  по  умолчанию. (См. ра
зделы
         посвященные прерываниям с номерами 34, 35 и  36.)  Во-вт
орых,
         если  программа  изменила  какие-либо  данные,  хранящие
ся на
         дискете,  может  оказаться,  что  часть  данных  осталас
ь   в
         системных  буферах  и  ДОС  записывает эти данные на дис
кету.
         Однако, ДОС не закрывает открытые файлы  и  программа  д
олжна
         сделать это сама, до обращения к прерыванию 32.
              Прерывание    33    (шестнадцатиричное    значение 
  21)
         используется для вызова функций,  которые  будут  рассмо
трены
         несколько  позже.  Следующие  три  прерывания,  34,  35 
и 36,
         используются несколько иначе, чем все остальные. В  то  
время
         как  все  прерывания  ДОС  вызываются  нашими программам
и для
         запуска  процудур  ДОС,  эти  три   прерывания   использ
уются
         противоположным  образом:  они  вызываются  ДОС  для  за
пуска
         процедур  в  наших  программах.  Каждое  из  трех  преры
ваний
         вырабатывается   ДОС   в   соответствующий   момент  вре
мени,
         определенный  для  каждого  из  прерываний.  Если  устан
овить
         вектора этих прерываний таким образом, чтобы они указыва
ли на
         процедуры обслуживания прерываний в наших программах, то
 наши
         программы  будут  получать  управление в случае возникно
вения
         прерывания. Эти три  прерывания  предназначены  для  пер
едачи
         управления  программам пользователей при возникновении о
дного
         из трех условий.
              Прерывание   34,    шестнадцатиричное    значение  
  22,
         вырабатывается   при  завершении  программы.  Это  преры
вание
         позволяет  организовать  специальные  завершающие  проце
дуры,
         которые  будут  вызываться,  когда  ДОС  завершает выпол
нение
         наших   программ.   Это   позволяет   обеспечить   выпол
нение
         восстановительных процедур независимо от того, как завер
шится
         Ваша программа.
              Прерывание   35,    шестнадцатиричное    значение  
  23,
         вырабатывается при нажатиии комбинации клавиш Ctrl-Break
. Это
         позволяет  нашей  программе  перехватывать  сигнал  окон
чания
         (Break), который служит ДОС указанием аварийно завершить
 нашу
         программу. Пример  такой  возможности  Вы  можете  увиде
ть  в
         действии  при  использовании  редактора  EDLIN, поставля
емого
         вместе с ДОС. Учтите, что ДОС не всегда реагирует на  на
жатие
         клавиши  Ctrl-Break.  Это  происходит  только  в тех слу
чаях,
         когда опрашивается клавиатура и когда пересылаются данны
е  на
         экран дисплея. Более подробно об этом будет сказано ниже
, при
         рассмотрении функций ДОС, в частности, функции 8.
              Прерывание 36, шестнадцатиричное значение 24,  возн
икает
         в  случае  ошибки  в  работе  ДОС.  В  системе  предусмо
трена
         проверка условия отклонения от  нормального  функциониро
вания
         ДОС,  так  называемая  "критическая  ошибка"  и прерыван
ие 36
         позволяет нашим программам  перехватывать  управление,  
когда
         такое происходит. В настоящее времмя рассматриваются два
 типа
         критических ошибок,  хотя  в  дальнейшем  могут  появить
ся  и
         другие.  Первая,  наиболее  частая  ошибка, - это "аппар
атная
         ошибка диска".
              Такая  ошибка  возникает,  когда   дисковод   не   
может
         правильно  работать,  даже  после  трех попыток ДОС выпо
лнить
         операцию. Вторая  критическая  ошибка  вызывается  наруш
ением
         копии  таблицы  размещения  файлов  в  памяти компьютера
 (эту
         таблицу мы рассмотрим  в  следующей  главе).  Такая  сит
уация
         может  возникнуть,  если  программа  случайно  будет изм
енять
         ячейки в нижних адресах памяти.
              Следующие за этими тремя прерывания  используются  
более
         традиционным   образом.   Прерывание   37,  шестнадцатир
ичное
         значение 25, используется для чтения секторов дискеты.  
Тогда
         как  данные  из  файлов  могут  считываться с помощью вы
зовов
         функций ДОС, это прерывание позволяет читать сектора в  
любом
         месте  на  дискете,  независимо  от того, являются они ч
астью
         файла или нет. Необходимо указать область памяти,  в  ко
торую
         должна  считываться информация, и еще три параметра: дис
ковод
         (в виде порядкового номера, где 0 - это дисковод A, а 1,
 2  и
         3,   соответственно   B, C и  D),  число  секторов,  кот
орые
         необходимо прочитать, и  номер,  указывающий  первый  се
ктор,
         который требуется прочитать.
              Для  этой  и  следующей процедур сектора идентифици
уются
         последовательными номерами. Нумерация начинается с нуля,
  что
         соответствует   первому  сектору  на  дискете,  который,
  при
         обычном способе адресации секторов, был  бы  первым  сек
тором
         дорожки  0  на  стороне  0.  (Сведения  о дорожках, адре
сах и
         сторонах дискеты приведены в главе 5.) Сектора  пронумер
ованы
         последовательно на первой (сторона 0) стороне дискеты. Н
омера
         имеют диапазон от 0 до 319 (шестнадцатиричное значение  
13F),
         а  затем,  для  двухсторонних  дискет, продолжаются с пе
рвого
         сектора второй стороны, в диапазоне от 320 (шестнадцатир
ичное
         значение 140) до 639 (шестнадцатиричное значение 27F).
              Этот  способ нумерации можно представить в виде фор
мулы.
         Если пронумеровать стороны дискеты как 0 и 1, дорожки от
 0 до
         39  и  сектора  от  1 до 8, то искомый номер сектора для
 этой
         служебной процедуры будет вычисляться по формуле:
              
              ИНДЕКС = (СЕКТОР - 1) + (ДОРОЖКА * 8) + (СТОРОНА * 
320)
              
              Эта  служебная  процедура  возвращает  однобайтный 
  код
         ошибки,  в  котором  каждый бит указывает отдельное возм
ожное
         условие ошибки. Номера битов, их числовые эквиваленты и 
смысл
         ошибки приведены в следующей таблице:
              БИТ     ЧИСЛОВОЙ              ЗНАЧЕНИЕ
                      ЭКВИВАЛЕНТ
              ___     __________      ___________________________
_____
              
              1-ый       128           Нет ответа от дисковода
              2-ой        64           Ошибка поиска (головка
                                       чтения/записи не перемещае
тся
                                       к нужной дорожке)
              3-ий        32           Ошибка управления (см. опи
сание
                                       контроллера фирмы "НЭК" в 
главе
                                       2)
              4-ый        16           Ошибка циклического избыто
чного                      
                                       проверочного кода (CRC), о
зна-   
                                       чает ошибку в данных
              5-ый         8           Ошибка ПДП (ошибка при пря
мом  
                                       доступе к памяти)
              6-ой         4           Сектор   не  найден (либо 
непра-
                                       вильный номер сектора, либ
                                       ошибка форматирования)
              7-ой         2           Дискета защищена от записи
 (при
                                       операции записи)
              8-ой         1           Не используется
              
              Эта  служебная  процедура может оказаться очень пол
езной
         для чтения секторов той области дискеты, которая отведен
а для
         системных  целей, например, для чтения загрузочной запис
и или
         справочника файлов (см. в главе 5 дополнительные  подроб
ности
         об этих частях дискеты).
              Прерывание    38,    шестнадцатиричное    значение 
  26,
         используется для записи сектора на диск, аналогично тому
  как
         прерывание  37  используется  для  чтения секторов. Оста
льные
         подробности работы этих двух процедур одинаковы.
              Функции, аналогичные двум последним, позволяет выпо
лнять
         и  система BIOS в ПЗУ. В использовании процедур ДОС, впр
очем,
         имеются  преимущества  -  ДОС   обеспечивает   автоматич
еское
         повторение операции и восстановление в случае ошибкм, а 
также
         большую гибкость при использовании различных типов диске
т.
              Две  эти процедуры ДОС позволяют за одну операцию ч
итать
         и писать несколько секторов диска. Преимущества и  недос
татки
         чтения/записи  по  одному  сектору за операцию более под
робно
         рассматриваются в главе 7.
              Прерывание 39, шестнадцатиричное значение 27,  реал
изует
         операцию,  получившую  название  "завершить,  но  остави
ть  в
         памяти".  Эта  процедура  используется  программами,  ко
торые
         должны   остаться  в  памяти  после  загрузки  и  выполн
ения.
         Основное назначение такой  процедуры  состоит  в  обеспе
чении
         возможности  загрузки  программ,  которые  смогут служит
ь для
         обслуживания прерываний и использования другими программ
ами.
              ДОС следит за тем, какой объем памяти в  нижних  ад
ресах
         используется  векторами  прерываний  и программами ДОС. 
Любые
         программы загружаются в область памяти, располагающуюся 
 выше
         зарезервированной  области.  При  вызове прерывания 39, 
адрес
         верхней границы зарезервированной области памяти изменяе
тся и
         указывает   на   ячейку,   следующую   за  последней  яч
ейкой
         программы, которая должна стать резидентной.
              Когда эта  процедура  используется  программой,  ко
торая
         должна впоследствии выплнять функции обслуживания прерыв
аний,
         происходит следующее. Программа должна  быть  выполнена 
 один
         раз,   что  указывает  ДОС  на  необходимость  загрузить
  эту
         программу и передать ей  управление.  После  этого  прог
рамма
         только  загружает  свой  собственный адрес в таблицу век
торов
         прерываний и вызывает  прерывание  39.  Позднее,  как  т
олько
         произойдет  прерывание, управление будет передано резиде
нтной
         программе.
              Помимо семи описанных процедур  обслуживания  преры
ваний
         ДОС,   имеется   41  функция  ДОС.  Каждая  из  этих  фу
нкций
         вызывается с помощью прерывания 33,шестнадцатиричное зна
чение
         21. Ниже перечислены все эти функции.
              Функция номер 0 в точности соответствует прерыванию
 32 -
         она  завершает  выполнение  программы.  Очевидно,   что 
  нет
         необходимости  обсуждать  преимущества того или иного сп
особа
         осуществления этой операции.
              Функция номер 1 используется для чтения одного  сим
вола,
         введенного  с клавиатуры, и отображения его на экране ди
сплея
         (в режиме "эхо"). Эта функция ожидает нажатия  клавиши. 
 Если
         нажата  одна  из  клавиш  специального  назначения, напр
имер,
         функциональная  клавиша,  то  ее  нажатие   преобразуетс
я   в
         последовательность двух отдельных символов, для ввода ко
торых
         необходимо выполнить функцию дважды. При этом первый из 
 двух
         символов  имеет  код  CHR$(0),  а второй - один из симво
льных
         кодов. Более подробно использование этих клавиш  и  их  
кодов
         описано  в  главе  10  при  рассмотрении  клавиатуры.  Э
та же
         функция позволяет обнаруживать специальную комбинацию кл
авиш
         Ctrl-Break,   которая   используется  для  прерывания  р
аботы
         программы.
              Функция номер 2 используется для выдачи одного симв
ола на 
         экран дисплея. Для обычных, например, алфавитных, символ
ов эта 
         операция выполняется очень просто. В некоторых, особых с
лучаях 
         выполнение   происходит   иначе.   Все   это   более  по
дробно 
         рассмотрено в главе 8 и приложении 4. 
              Функция  номер  3 используется для ввода одного бай
та от
         адаптера  асинхронной  связи.  Эта  функция   ожидает   
ввода
         символа  и  не возвращает никакой информации об ошибках.
 Это
         один из немногих  случаев,  когда  функция  ДОС  обеспеч
ивает
         меньший   сервис,   чем   процедуры   системы   BIOS  в 
 ПЗУ.
         Соответствующие процедуры системы BIOS в  ПЗУ  описывают
ся  в
         главе 11.
              Функция  номер 4 передает один байт данных через ад
аптер
         асинхронной линии связи и, таким образом, выполняет опер
ацию,
         обратную функции 3.
              Функция  номер  5 используется для передачи одного 
байта
         данных устройству печати. В отличие от поцедур системы B
IOS в
         ПЗУ  здесь  нельзя  указать на какое устройство печати д
олжен
         осуществляться  вывод  -  ДОС   работает   только   с   
одним
         устройством. Если к компьютеру подключено несколько устр
ойств
         печати, то вывод  будет  осуществляться  на  первое  из 
 них.
         Соответствующие  процедуры системы BIOS в ПЗУ описаны в 
главе
         11.
      
              Функция  номер  6  довольно  любопытна,   поскольку
   она 
         используется  как  для ввода с клавиатуры, так и для выв
ода на 
         экран дисплея. Любой символ, кроме CHR$(255) может быть 
 выдан 
         на  экран. Если эту функцию вызвать как бы для вывода на
 экран 
         символа CHR$(255), то  тем  самым  будет  инициирован  в
вод  с 
         клавиатуры.  Так  же  как  в  случае  с  функцией номер 
1, для 
         кодирования специальных клавиш используются двухбайтовые
 коды. 
         Но,  в  отличие  от  функции  номер  1, эта функция не о
жидает 
         нажатия клавиши - если  ни  одна  не  нажата,  она  возв
ращает 
         признак отсутствия ввода. Эта функция не распознает Ctrl
-Break 
         особым образом. 
              Функция   номер   7   аналогична  функции  номер  1
,  за
         исключением того, что  символы,  вводимые  с  клавиатуры
,  не
         отображаются  на  экране.  Так  же  как  функция номер 6
, эта
         функция не отслеживает нажатия клавиши Ctrl-Break.
              Функция номер 8 выполняет те же функции, что  и  фу
нкция
         номер  1,  но  без  отображения  вводимых символов на эк
ране.
         Подобно функции номер 1 и в отличие от функции номер  7,
  эта
         функция следит за нажатием клавиши Ctrl-Break.
              Вы,  вероятно,  уже  заметили,  что  функции  1,6,7
  и 8
         обеспечивают четыре процедуры ввода с клавиатуры с  одно
й  из
         восьми   возможных   комбинаций   ожидания  нажатия  кла
виши,
         отображения введенных символов на экране и  проверки  на
жатия
         клавиши Ctrl-Break. Чтобы не путаться в их назначении, у
добно
         представить все вышесказанное в виде следующей таблицы: 
              
              
              Функция      Ожидание     Эхо      Проверка Ctrl-Br
eak
              --------     --------     ----     ----------------
----
                 1             да        да              да
                 6             нет       нет             нет
                 7             да        нет             нет
                 8             да        нет             да
              
              
              Кроме того, функция 6 дублирует еще и функцию вывод
а  на
         экран.  Ясно,  что  эти процедуры реализуют базовые опер
ации,
         которые затем используются командами  ДОС,  и  они  вовс
е  не
         претендуют   на  логическую  законченность  при  обслужи
вании
         клавиатуры.
              Функция номер 9 используется для вывода на экран  д
исплея 
         строки  символов,  причем каждый из символов выводится т
ак же, 
         как это делает функция 2. Определенная странность работы
  этой 
         функции,  которая  уменьшает ее полезность, заключается 
в том, 
         что  вместо  использования  счетчика  символов  в  строк
е,   в 
         качестве  ограничителя используется знак денежной едницы
, "$". 
         Это лишний раз демонстрирует, что ДОС разрабатывалась  н
е  как 
         универсальная система, а как средство для решения опреде
ленных 
         специальных задач. 
              Функция   номер   10,   шестнадцатиричное   значени
е  А,
         обеспечивает буферированный ввод с клавиатуры. В то врем
я как
         остальные функции ввода немедленно передают введенный си
мвол,
         эта функция накапливает законченную логическую единицу в
вода,
         которая   завершается   нажатием   клавиши   "ввод"  (EN
TER).
         Остальные  функции ввода с  клавиатуры  позволяют  прогр
аммам
         немедленно реагировать на введенные символы. Однако им п
рисущ
         такой недостаток как  необходимость  программного  выпол
нения
         любых   операций   редактирования,   например,  интерпре
тации
         клавиши  возврата  на  одну  позицию,   означающей   сти
рание
         предыдущего   символа.   Функция   номер   10   передает
  все
         стандартные средства редактирования ДОС в распоряжение  
Вашей
         программы,  что  может  оказаться  очень  удобным.  Кажд
ую из
         функций нужно использовать в своем случае, что  позволит
  Вам
         наиболее      эффективно      пользоваться     возможнос
тями,
         представленными в Ваше  распоряжение  операционной  сист
емой.
         Чтобы  воспользоваться  функцией 10, в Вашей программе д
олжен
         быть  предусмотрен  буфер  ввода,   размер   которого   
может
         изменяться. Первый байт указывает ДОС размер буфера, а в
торой
         байт используется ДОС, чтобы сообщить Вам,  сколько  сим
волов
         находится в буфере.
              Функция   номер   11,   шестнадцатиричное   значени
е  В,
         используется для проверки, нажата ли какая-нибудь клавиш
а  на
         клавиатуре,  без  ее ввода. Подобно функции 6, эта функц
ия не
         ожидает пока будет нажата клавиша. Но, в отличие  от  фу
нкции
         6, если  клавиша  нажата,  ее  код не вводится и произво
дится
         проверка нажатия клавиш Ctrl-Break.   
              Функция номер 12, шестнадцатиричное значение С,  оч
ищает
         буфер  ввода  с клавиатуры от всех введенных в него симв
олов.
         Может так случиться, что пользователь начнет набирать си
мволы
         на  клавиатуре  прежде  чем  начнется  ввод.  Если прогр
амма
         обнаруживает ошибку  и  посылает  пользователю  сообщени
е  об
         ошибке,  необходимо  иметь уверенность в том, что введен
ные с
         клавиатуры символы являются ответом на сообщение об ошиб
ке, а
         не  остатком  чего-либо введенного раньше. Для этого и с
лужит
         функция 12,  очищающая  буфер  ввода.  (Пояснение  того,
  как
         работает  буфер  ввода  можно  найти в главе 10). Эта фу
нкция
         обычно предшествует выполнению функций 1,6,7,8 и 10. Буф
ер, о
         котором  идет речь, является внутренним буфером, а не бу
фером
         программы, использующимся в функции 10.
              Далее следуют функции обслуживания  дискет.  Чтобы 
 лучше 
         понять,  о  чем  здесь  пойдет  речь,  необходимо обрати
ться к 
         информации об организации  файлов  на  дискетах,  имеюще
йся  в 
         главе   5.  Для  использования  большинства  из  этих  ф
ункций 
         необходим блок управления файлом (FCB) ДОС, который  мы 
 здесь 
         описывать не будем. 
              Функция   номер   13,   шестнадцатиричное   значени
е  D,
         используется для сброса дисковой подсистемы. Если был из
менен
         номер  дисковода, выбираемого по умолчанию, им снова дел
ается
         дисковод А. См. также функцию 25.
              Функция  номер   14,   шестнадцатиричное   значение
   Е,
         используетяс  для  установления номера дисковода, выбира
емого
         по умолчанию. Дисковод  задается  номером  от  0  до  3,
  что
         соответствует идентификаторам от А до D. См. также функц
ию 25.
              Функция   номер 15,    шестнадцатиричное   значение
   F,
         используется, чтобы открыть  дисковый  файл.  Ваша  прог
рамма
         должна   сформировать  блок  управления  файлом  стандар
тного
         формата ДОС, включающий имя файла. Если  файл  не  найде
н  на
         дискете,  то  программе  возвращается  признак  ошибки. 
 Если
         необходимо в  случае  отсутствия  файла  с  указанным  и
менем
         создать  новый  файл  с  таким  именем,  следует использ
овать
         функцию  22.   Фактическое   открытие   файла   устанавл
ивает
         логическое  соединение  между  элементом справочника фай
лов и
         блоком управления файлом в программе.
              Функция   номер   16,   шестнадцатиричное   значени
е  10, 
         используется, чтобы закрыть файл, который был открыт  фу
нкцией 
         15.  Практический  смысл  функции закрытия файла заключа
ется в 
         модификации элемента справочника файла на дискете. 
              Функция   номер   17,   шестнадцатиричное  значение
  11,
         используется для запуска поиска в справочнике файлов дис
кеты.
         Эта  функция  используется  при указании неполных или ро
довых
         имен файлов, таких как "В:*.ВАК" или "???QQ.INC". Если н
айдено
         подходящее  имя, тогда  ДОС сформирует полный блок управ
ления
         файлом для этого файла, что позволит Вашей программе  от
крыть
         файл.   Использование   родовых   имен  повышает  гибкос
ть  и
         расширяет возможности работы с файлами.
              Функция  номер  18,   шестнадцатиричное   значение 
  12,
         используется для продолжения поиска файлов по родовому и
мени,
         начатого функцией 17. Функция 17 запускает поиск и возвр
ащает
         первое  из  подходящих  имен.  Функция  18 продолжает по
иск и
         возвращает имена всех последующих подходящих файлов.
              Функция  номер  19,   шестнадцатиричное   значение 
  13,
         используется для удаления файла с дискеты. Заданное имя 
файла
         может быть родовым, так что не требуется использовать фу
нкции
         17 и 18 для удаления группы файлов.
              Функция   номер   20,  шестнадцатиричное   значение
  14,
         используется для последовательного  чтения  файла.  Из  
файла
         считывается   очередная   запись.   Если  чтение  заверш
илось
         неудачей, то передается признак ошибки.
              Функция  номер  21,   шестнадцатиричное   значение 
  15,
         используется   для   последовательной  записи  в  файл. 
 Если
         операция записи прошла неудачно, то передается признак о
шибки.
              Эти функции последовательного чтения и записи,  а  
также
         функции  прямого  чтения  и  записи, 33 и 34, описанные 
ниже,
         используются только для записей фиксированной длины - ДО
С  не
         обеспечивает  средств для работы с записями переменной д
лины,
         например, строками в текстовом файле. Для работы  с  зап
исями
         переменной   длины   Ваши   программы   должны   осущест
влять
         логическую обработку записей.  Одно  из  лучших  средств
  для
         этого  заключается  в  описании  файла  в  терминах  ДОС
  как
         последовательного файла с записями длиной в один байт, к
оторые
         Вы сможите читать и писать посимвольно.
              Функция   номер   22,   шестнадцатиричное  значение
  16,
         используется для "создания" файла. Если файл с  таким  и
менем
         существует,  то  он  используется  повторно;  если  нет 
 - то
         создается новый элемент справочника файлов  с нулевой  д
линой
         данных.  Эта  функция  также открывает файл, так что ее 
можно
         использовать вместо функции 15, если файл необходимо отк
рыть,
         независимо  то  того,  сущетвует  файл  или  нет. Функци
я 23,
         шестнадцатиричное    значение    17,     используется   
  для
         переименования одного или нескольких файлов. Для этой фу
нкции
         также могут использоваться родовые имена.
              Функции с номером 24 не существует.  Функция  номер
  25,
         шестнадцатиричное  значение  19, используется для опреде
ления
         номера  дисковода,  использующегося  сейчас   по   умолч
анию.
         Числовой код дисковода от 0 до 3 соответствует именам от
 А до
         D. См. также функции 13 и 14.
      
              Функция  номер  26,   шестнадцатиричное   значение 
  1А,
         используется  для  установления адреса рабочей области д
иска,
         DTA, в которой будут выполняться операции  с  дискетой. 
 Если
         Ваши  программы  не  заменяют область DTA, устанавливаем
ую по
         умолчанию,  в  ней  будет  всего  128  байт  и  нельзя  
будет
         пересылать  записи  большей  длины. DTA - это не то же с
амое,
         что буфер чтения/записи секторов, используемый ДОС.
              Функция  номер  27,   шестнадцатиричное   значение 
  1В,
         используется  для  определения  адреса  памяти,  по  кот
орому
         находится таблица  размещения  файлов  текущего  дисково
да  и
         другой   информации   о   дискете.  Эта  функция  может 
 быть
         использована  для  просмотра   таблицы   размещения   фа
йлов,
         например,   чтобы   установить   сколько  места  осталос
ь  на
         дискете. Начиная с версии 2.00 ДОС эта  функция  обеспеч
ивает
         доступ  только  к  первой  части  ТРФ, которая определяе
т тип
         дискеты.
              Функции с номерами от 28 до 32  не  существуют.  Фу
нкция
         номер  33,  шестнадцатиричное  значение  21, используетс
я для
         чтения произвольной записи,  указываемой  логическим  но
мером
         записи.   ДОС  вычисляет  положение  произвольной  запис
и  по
         фиксированной длине записи и ее номеру.
              Функция  номер  34,   шестнадцатиричное   значение 
  22,
         используется для произвольной записи на дискету.
              Функция   номер   35,   шестнадцатиричное   значние
  23,
         используется для определения размера файла. При использо
вании
         этой  функции имеет место ряд странностей. Можно использ
овать
         родовое имя файла. Файл не должен быть открыт.  Размер  
файла
         определяется  в  терминах  длины  записи,  указанной  в 
блоке
         управления неоткрытым файлом. Чтобы получить размер  фай
ла  в
         байтах,  необходимо  установить размер  записи  равным о
дному
         байту.
              Функция  номер  36,   шестнадцатиричное   значение 
  24, 
         используется  при  переходе  от  последовательного  режи
ма  к 
         произвольному. Она устанавливает поле произвольной  запи
си  в 
         ту  же  позицию, в которой находится текущая последовате
льная 
         запись. 
               Следующие  две  функции  не  относятся  к  обслужи
ванию
         дискет.
              Функция  номер  37,   шестнадцатиричное   значение 
  25,
         используется  для  установки  вектора  прерывания.  Поск
ольку
         вектора прерыванмй устанавливаются  очень  просто,  непо
нятно
         для  чего  нужна  эта  функция  -  разве  что для обеспе
чения
         дополнительной степени защиты.
              Функция  номер   38,   шестнадцатиричное  значение 
  26,
         используется  для  создания  нового  программного  сегме
нта в
         порядке подготовки к запуску зависимой программы. 
              Теперь мы снова вернемся к функциям, обслуживающим 
 файлы 
         на  дискетах. Функция номер 39, шестнадцатиричное значен
ие 27, 
         используется  для  чтения  нескольких   записей,   начин
ая   с 
         произвольной позиции в файле. 
              Эта функция может быть  использована  вместо  неско
льких
         отдельных  вызовов  функции  33,  если объем памяти позв
оляет
         считывать целые блоки из файлов.
              Функция  номер  40,   шестнадцатиричное   значение 
  28,
         используется  при  записи  в  файл,  начиная  с  произво
льной
         позиции, нескольких записей.
              Функция   номер   41, шестнадцатиричное  значение  
  29,
         используется  для  преобразования  имени  файла в том ви
де, в
         каком оно вводится пользователем, например, "В:CHAPTER.4
",  в
         формат блока управления файлом, который используется ДОС
. Это
         несомненно очень полезная функция, которая позволяет  вв
одить
         имена файлов в обычном виде и возлагать всю работу по ра
збору
         и  преобразованию  на  ДОС.  Если  необходимо,  эта   фу
нкция
         позволит  Вам  задать  идентификатор дисковода, имя файл
а или
         расширение  имени  по  умолчанию,  когда  они  не  указа
ны  в
         анализируемой    строке.    Эта   функция   также   позв
оляет
         преобразовывать родовые имена файлов, включающие звездоч
ку  в
         формат  родового  имени, состоящего из вопросительных зн
аков,
         как того требует формат блока управления файлом.
              Функция  номер  42,   шестнадцатиричное   значение 
  2А,
         используется  для  считывания системной даты. Дата выдае
тся в
         виде трех двоичных чисел, соответствующих году, месяцу и
  дню
         месяца.   Как  мы  увидим  в  главе  11,  дата  автомати
чески
         модифицируется при первом же запросе даты или  времени  
после
         очередной полуночи. Это происходит при любом запросе вре
мени,
         включая  модификацию  времени  создания  файла   в   эле
менте
         справочника  файлов. Если время не запрашивалось в проме
жутке
         от полуночи до полуночи хотя  бы  один  раз,  то  дата  
будет
         неверной.
              Функция   номер   43,   шестнадцатиричное  значение
  2В,
         используется для установки системной даты.
              Функция  номер  44,   шестнадцатиричное   значение 
  2С,
         используется   для   считывания   системного  времени.  
Время
         выдается в часах, минутах, секундах и  сотых  долях  сек
унды.
         Счетчик   таймера,  использующийся  для  подсчета  систе
много
         времени, изменяется  примерно  18  раз  в  секунду,  так
  что
         значение   сотых   долей   секунды  довольно  приблизите
льно.
         Поскольку  таймер  должен  перезапускаться  примерно   к
аждые
         0,0546  секунды,  его нельзя использовать для измерения 
очень
         коротких промежутков времени. Вычисление сотых долей сек
унды,
         однако,  выполняется  точно  по показаниям счетчика тайм
ера и
         через определенный промежуток времени  значения  сотых  
долей
         секунды будут равномерно распределены в диапазоне от 0 д
о 99.
         Это означает, что Ваши программы могут использовать сист
емное
         время для генерации псевдо-случайных чисел.
              Функция   номер   45,   шестнадцатиричное  значение
  2D,
         используется для установки системного времени.
              Функция  номер  46,   шестнадцатиричное   значение 
  2Е,
         используется  для  управления верификацией записи на дис
кету.
         Если верификация разрешена, то каждая операция  записи  
будет
         проверяться   на   возможность   возникновения  ошибки  
путем
         повторного  считывания  данных  и  их  сравнения  с исхо
дными
         данными. Маловероятно, что Вам потребуется эта  функция,
  так
         как   дискеты  достаточно  надежны  и  довольно  значите
льные
         проверки выполняются автоматически. Но, если Вам  потреб
уется
         верификация, то используйте функцию 46.
              Мы перечислили все имеющиеся функции ДОС. Позднее, 
когда
         мы рассмотрим все возможности, предоставляемые системой 
 BIOS
         в  ПЗУ,  Вы  заметите,  что  некоторые  функции  дублиру
ются.
         Однако, в большинстве случаев ДОС и BIOS  в  ПЗУ  обслуж
ивают
         совершенно различные нужды.
              В  следующей  главе  мы  начинаем  рассмотрение  ва
жного
         предмета - дискет и форматов хранения данных на дискетах
              
                 
                    ГЛАВА 5. ОРГАНИЗАЦИЯ ВНЕШНЕЙ ПАМЯТИ
                         
                         
              Дискеты  стали  не  только  стандартным,  но   и   
самым 
         распространенным носителем программ и данных для персона
льных 
         компьютеров. В этой главе  будут  приведены  все  необхо
димые 
         сведения о дискетах, об особенностях их структуризации. 
Кроме 
         того, вы сможете кое-что узнать о защите от копирования.
              Весь  материал, приведенный в настоящей главе, отно
сится 
         к  семейству  компьютеров   IВМ/РС,   совместимыми   с  
 ними 
         компьютерами,  а  также  ко  всем компьютерам, работающи
м под 
         управлением операционной системы  МS-DOS.  Другие  компь
ютеры 
         могут использовать другие размеры дискет и форматы данны
х. 
              Как уже указывалось в предыдущей главе, начиная с в
ерсии 
         ДОС   2.00,   подключение   к   системе  дискет  новых  
типов 
         осуществляется  довольно  просто.   Схема   выполнения  
 этой 
         процедуры  предполагает,  что  новые типы дисков использ
уются 
         таким же  образом,  как  те  дискеты,  которые  были  ис
ходно 
         доступны   для   IBM/PC.   Следовательно,   вся   информ
ация, 
         изложенная в этой главе, может  применяться  и  к  тем  
новым 
         дисковым устройствам, которые будут добавлены в Вашу сис
тему, 
         за  исключением  конкретных  чисел,  задающих   специфич
еские 
         функции. 
                  
                  5.1. Устройство гибкого машнитного диска (диске
ты)
                  
              Гибкие диски, как известно, являются идеальным носи
телем 
         для внешней памяти персональных компьютеров, подобных IB
M/PC. 
         Их  размеры удобны, цена не высока и они достаточно наде
жны в 
         эксплуатации. При известной осторожности в обращении  ди
скеты 
         очень  редко портятся. Именно по этому дискеты стали наи
более 
         популярным  носителем   информации   задолго   до   появ
ления 
         компьютеров   IBM/PC.   Вполне  естественно,  что  фирма
  ИБМ 
         обратилась к дискетам, выбирая носитель информации для с
воего 
         компьютера IBM/PC. 
              Кратко рассмотрим, что собой представляет сама  дис
кета. 
         (Простая  схема  приведена  на рис.5.1.) Дискета предста
вляет 
         собой круглый  кусок  гибкого  пластика,  покрытый  магн
итным 
         окислом,  напоминающим  покрытие  других  известных магн
итных 
         носителей,  например,  магнитных   лент.   Магнитные   д
иски, 
         использующиеся  на  больших  компьютерах,  изготавливают
ся из 
         жестких металлических  пластин,  а  для  дискет  использ
уются 
         гибкие  пластиковые кружки, что и дало им популярное наз
вание 
         "гибкие" или "флоппи" - диски. То, что эти диски были сд
еланы 
         гибкими, значительно уменьшило вероятность их повреждени
я при 
         обращении с ними и это  в  значительной  мере  определил
о  их 
         успех. 
              
              Круглый  диск  с  магнитным  покрытием  всегда поме
щен в 
         квадратный предохранительный конверт. Внутренняя  поверх
ность 
         этого   конверта   покрыта   слоем   белого   фетро-подо
бного 
         материала, помогающим в защите дискеты.  Он  служит  как
  для 
         смягчения ударов, так и для улавливания пыли. 
              Квадратный   предохранительный   конверт,   который
   по 
         неизвестной причине практически  всегда  имеет  черный  
цвет, 
         имеет   четыре   отверстия,  каждое  из  которых  имеет 
 свое 
         собственное назначение. Отверстие в центре предназначено
  для 
         захвата  дискеты  приводом  дисковода.  Через  это  отве
рстие 
         механизм дисковода захватывает гибкий  диск,  чтобы  при
вести 
         его во вращение. 
              Второе   отверстие    в    предохранительном    кон
верте 
         представляет   собой  продолговатую  прорезь,  через  ко
торую 
         осуществляется доступ к дискете головок чтения/записи.  
Через 
         эту   прорезь   осуществляется   процесс   чтения   и  з
аписи 
         информации. 
              Третье отверстие представляет  собой  небольшую  ды
рочку 
         возле   центрального  отверстия.  Это  отверстие  в  кон
верте 
         позволяет следить за небольшим индексным отверстием  в  
самой 
         дискете. Индексное отверстие используется для указания н
ачала 
         и конца дорожки на дискете. Это  индексное  отверстие  с
лужит 
         для   определения   точки   отсчета  при  чтении  или  з
аписи 
         информации.Если Вы никогда не  видели  индексного  отвер
стия, 
         осторожно  поверните  дискету  внутри  конверта,  пока о
но не 
         совместится с отверстием в конверте. В дискетах такого  
типа, 
         который  используется  в IBM/PC, это единственное отверс
тие в 
         пластиковом кружке. 
              Четвертое  отверстие  -  квадратная  прорезь   на  
 краю 
         предохранительного  конверта  -  служит  в  качестве при
знака 
         защиты записи. Практически все магнитные носители  испол
ьзуют 
         те  или  иные  признаки  защиты  от  записи. Если эта пр
орезь 
         открыта,  то  запись  на  эту   дискету   может   выполн
яться 
         дисководом,  если  же  она  закрыта,  то  дискета защище
на от 
         записи.  В  конвертах  некоторых  дискет  вообще  нет   
такой 
         прорези,   что  полностью  исключает  возможность  случа
йного 
         стирания записанных на ней данных. Отсутствие прорезей з
ащиты 
         записи   характерно   для   многих   дискет   с   програ
ммным 
         обеспечением  IBM/PC,  в  частности,  с  самой   операци
онной 
         системой   ДОС.   Эти  дискеты  записываются  на  специа
льных 
         дисководах, игнорирующих признак защиты записи. 
              Не следует, однако, считать, что заклеив прорезь  з
ащиты 
         записи  Вы  полностью  защитите  свои  дискеты  от случа
йного 
         стирания.  Закрытая  прорезь  говорит  только  о   том, 
  что 
         правильно  работающий  дисковод  не  будет пытаться выпо
лнять 
         запись на такую дискету. Неисправный  дисковод  может  д
елать 
         все что угодно, независимо от наличия или отсутствия при
знака 
         защиты. Конечно, маловероятно утратить  данные  именно  
таким 
         образом, но все же это может произойти. 
                 
                 5.2. Форматы хранения информации
                 
              Данные  на  дискете  размещаютя по "дорожкам". Доро
жка - 
         это замкнутая окружность на поверхности дискеты,  размещ
енная 
         на   определенном   растоянии   от   центрального  отвер
стия. 
         Стандартный формат дискеты для IBM/PC имеет 40 дорожек. 
              Каждая    дорожка   разделена   на   части,   назыв
аемые 
         "секторами"  или  "записями".  Сектора   представляют   
собой 
         основную  единицу  хранения информации на дискете. При ч
тении 
         или записи устройство считывает или записывает  всегда  
целый 
         сектор,   независимо   от   объема  запрашиваемой  инфор
мации 
         несмотря на  отсутствие  огрничений.  Хотя  Вы,  точнее 
 Ваши 
         программы,   могут  организовывать  свои  данные  в  еди
ницах 
         произвольного размера, компьютер и дисковод всегда работ
ают с 
         секторами, что, как правило, скрыто от пользователя. 
              Термин "запись" иногда используется в том же смысле
, что 
         и  "сектор".  Лучше  будет  оставить   слово   "запись" 
  для 
         обозначения  логических  единиц  хранения  информации в 
наших 
         программах и  использовать  слово  "сектор"  для  обозна
чения 
         физической единицы хранения информации на дискете. 
      
              Данные  могут  размещаться как на одной стороне дис
кеты, 
         так и на двух сторонах. Схема размещения секторов на  ди
скете 
         показана на рис. 5.2. 
              
              Сейчас  нужно  ненадолго  прерваться  и  договорить
ся  о 
         терминологии.  Дискета  имеет одну или две стороны; на к
аждой 
         стороне по 40 дорожек; по восемь секторов на дорожке и п
о 512 
         байт  в  каждом  секторе.  Как к ним обращаться? В этой 
книге 
         будет  использоваться  способ  нумерации,  принятый  во 
 всех 
         руководствах  фирмы  "ИБМ", хотя он и несколько противор
ечив. 
         Стороны нумеруются как 0 и  1,  односторонняя  дискета  
имеет 
         только  сторону  с номером 0 . Дорожки нумеруются с 0 по
 39 ; 
         причем дорожка  0  находится  ближе  всего  к  внешнему 
 краю 
         дискеты,   а  дорожка  39  ближе  к  центру.  Начало  ди
скеты 
         находится на нулевой дорожке. Сектора,  похоже  просто  
чтобы 
         сделать их в чем-то отличающимися, нумеруются с 1 по 8. 
Таким 
         образом, первый сектор диска имеет номер 1 и располагает
ся на 
         нулевой дорожке нулевой стороны. 
              Данные   внутри   сектора   размещаются   и   адрес
уются 
         произвольно. Если пользоваться  смещениями,  то  для  пе
рвого 
         байта смещение будет равно нулю, для второго - единице, 
и так 
         далее. В дальнейшем мы  будем  обращаться  к  данным  ка
к  по 
         смещению  (начиная с 0), так и по порядковому номеру (на
чиная 
         с 1), как в конкретном случае будет удобнее. 
              Сектора на дискете имеют определенную последователь
ность 
         и,    когда   это   возможно,   они   используются   в  
 этой 
         последовательности. Последовательность  начинается  с  с
амого 
         первого  сектора  на  дискете,  за  которым следуют оста
льные 
         сектора этой же дорожки (нулевой) со второго  по  восьмо
й.  У 
         двухсторонних  дискет  за  восьмым  сектором  нулевой ст
ороны 
         следует первый сектор той же дорожки, но первой стороны.
  Как 
         при  одностороннем, так и при двухстороннем формате диск
ет за 
         последним  сектором  одной  дорожки  следует  первый   с
ектор 
         следующей дорожки. 
              Вы,   вероятно,   уже  заметили,  что  на  двухстор
онних 
         дискетах  прежде  чем   переходить   к   очередной   дор
ожке, 
         изменяется  сторона,  так  что  используется  одна дорож
ка на 
         обеих сторонах,  прежде  чем  система  перейдет  к  след
ующей 
         дорожке.   Таким  образом,  получается,  что  лучше  был
о  бы 
         использовать   при   обращении    к    конкретному    се
ктору 
         последовательность    дорожка-сторона-сектор,    а    не
    - 
         сторона-дорожка-сектор, поскольку они используются  имен
но  в 
         таком порядке. Тем не менее, во всех руководствах фирмы 
"ИБМ" 
         обычно указывают сектор, задавая сторону,  потом  дорожк
у,  а 
         потом  номер  сектора  и  мы тоже будем пользоваться так
ой же 
         последовательностью. 
                  
              5.3. Типы дискет и проблемы защиты от копирования 
                  
              Типов   дискет  насчитывается  значительно  больше,
  чем 
         используется семейством компьютеров  IBM/PC.  Рассмотрим
  эти 
         типы,  чтобы  лучше  понимать,  что  именно  используетс
я для 
         IBM/PC. 
              Обычные  гибкие  диски  имеют  один  из  двух  разм
еров. 
         Больший  формат  имеет диаметр 203 мм (8 дюймов), а мень
ший - 
         133 мм  (5,25  дюйма).  Недавно  появившиеся  так  назыв
аемые 
         "микро-флоппи",  диаметром  89  мм  (3,5  дюйма), заключ
ены в 
         твердую  упаковку  и,  строго  говоря,  не  являются  ги
бкими 
         дисками. 
              Компьютеры   IBM/PC,  подобно  большинству  персона
льных 
         компьютеров, используют мини-диски  диаметром  133  мм  
(5,25 
         дюйма),  а компьютер IBM Displaywriter (довольно близкий
 к РС 
         по своим характеристикам) использует больший формат. 
              Еще  одной  характеристикой  дискеты, является плот
ность 
         записи.  В  сфере   персональных   компьютеров   использ
уются 
         различные  плотности  записи,  а существующая терминолог
ия не 
         всегда понятна.  Стандартные  дискеты,  используемые  IB
M/PC, 
         имеют  плотность  записи,  называемую  двойной, что позв
оляет 
         записывать и  считывать  40  дорожек  данных  на  поверх
ности 
         дискеты. Другой использующийся формат называется учетвер
енной 
         плотностью, что на том же  пространстве  позволяет  имет
ь  80 
         дорожек.  Иногда  плотность  записи обозначается в колич
естве 
         дорожек на дюйм. Двойная плотность,  нормальная  для  IB
M/PC, 
         составляет  48  дорожек  на  дюйм  (48  ТРI),  а учетвер
енная 
         плотность составляет 96 дорожек на дюйм (96 ТРI). 
              Существует два способа разбивки  (разметки)  дороже
к  на 
         сектора. Один из них называется фиксированным или аппара
тным, 
         а второй - программным. Если размер сектора  задан  жест
ко  и 
         определяется  механическими  характеристиками  устройств
а, то 
         такая разметка называется  фиксированной.  При  фиксиров
анной 
         разметке   индексные   отверстия,   расположенные  по  к
ругу, 
         обозначают  начало  каждого  сектора  и,  следовательно,
  его 
         положение  на  дискете  точно  определено.  Альтернативо
й для 
         такой разметки служит программная разметка. 
              Для   стандартных   дисков   персональных   компьют
еров, 
         размером 133 мм (5,25 дюйма), расположение дорожек на ди
ске и 
         число сторон определяются  характеристиками  самих  диск
ов  и 
         дисководов  и,  по  существу,  являются  неизменными. Од
нако, 
         количество секторов  на  дорожке  и  их  размер  определ
яются 
         программно,  в процессе форматирования. Именно поэтому г
ибкие 
         диски  называют  дисками  с  программной  разметкой  сек
торов 
         (soft-sector).   Форматирование   (определение  характер
истик 
         секторов) выполняется либо программами операционной  сис
темы, 
         либо базовой системы ввода/вывода (BIOS). 
              Размер  сектора  133  мм диска, поддерживаемого сис
темой 
         BIOS, может составлять 128,  256,  512,  и  1024  байта.
  ДОС 
         (версий  1.ХХ-3.1)  ориентирована  на использование сект
оров, 
         размером 512 байт. 
              В  ранних  версиях ДОС использовалось ограниченное 
число 
         дисковых  форматов.  Начиная  с  версии  2.00   и   во  
 всех 
         последующих  используется  четыре  основных формата. Раз
личие 
         между форматами определяется числом используемых сторон 
диска 
         и  числом секторов на дорожке: одно- или двухсторонний д
иск и 
         8 или 9 секторов на дорожке. 
                  
           ------------------------------------------------------
---------
           Обозначение  Кол-во  Количество     Количество        
Объем
                        сторон  секторов         дорожек         
(Кбайт)
           ------------------------------------------------------
---------
                S-8       1         8              40            
  160
                D-9       2         8              40            
  320
                S-9       1         9              40            
  180
                D-9       2         9              40            
  360 
           ------------------------------------------------------
--------
      
              Причина существования чеиырех различных форматов пр
оста, 
         фирма   хочет   быть  уверена,  что  все  версии  ДОС  с
могут 
         поддерживать программы, разработанные для любых, самых р
анних 
         версий. 
              Первые  модели  IBM/PC оснащались односторонними ги
бкими 
         дисками.  Впоследствии  начали  выпускаться   дисководы 
  для 
         двухсторонних дисков. 
              В  ранних  версиях  ДОС  на  каждой  дорожке размещ
алось 
         восемь 512-байтных секторов, хотя на  той  же  дорожке  
можно 
         легко  разместить  и десять. Позже установили, что доста
точно 
         надежно размещать на  дорожке  девять  секторов,  после 
 чего 
         девятисекторный формат стал стандартным. 
              Увеличение  числа  форматов  тесно  связано  с разв
итием 
         операционной   системы   ДОС.   Первоначальная   версия 
  ДОС 
         поддерживала  всего один формат, который я обозначил как
 S-8. 
         В следующей версии появился формат D-8. В  версию  2.00 
 были 
         включены  девятисекторные  форматы  S-9  и D-9. В версии
 2.10 
         новых форматов не появилось,  а  в  версию  3.0  был  вк
лючен 
         формат с учетверенной плотностью записи, который будет к
ратко 
         рассмотрен несколько позже. 
              Широкое применение получили только два  формата:  S
-8  и 
         D-9.  Формат  S-8 является как бы наименьшим общим делит
елем, 
         он традиционно используется для  коммерческих  программ,
  что 
         гарантирует ее считывание в любой версии ДОС. 
                  
                Форматы с учетверенной плотностью  записи
                ------------------------------------------
                  
              Как  читатель  уже наверное обратил внимание, все ч
етыре 
         стандартных формата имеют одинаковое количество  дорожек
.  Во 
         всех  этих форматах используется по 40 дорожек. Это связ
ано с 
         тем,  что  дисководы,  наиболее  часто   использовавшиес
я   в 
         семействе  машин  IBM/PC,  разрабатывались  для чтения/з
аписи 
         сорока  дорожек.  Некоторые  дисководы  с  133-мм  диска
ми  и 
         практически  все  дисководы  для  89-мм  (3,5  дюйма)  д
исков 
         позволяют  записывать  80  дорожек.  Они  получили   наз
вание 
         устройств  с  учетверенной плотностью записи. Среди форм
атов, 
         использующихся      такими      устройствами,      наибо
льшее 
         распространение получили форматы QD-9 и QD-15. 
                  
         ________________________________________________________
_______
          Обозначение     Количество     Количество   Количество 
 Объем 
                               сторон       секторов      дорожек
   (КБайт)
         ________________________________________________________
_______
                  
               QD-9        2              9            80        
   720
               QD-15       2             15            80        
  1200
         ________________________________________________________
_______
                  
              Формат  QD-9  отличается  от D-9 только удвоенным ч
ислом 
         дорожек.  Формат  QD-9  чаще  всего   используется   не 
  для 
         стандартных  133-мм  дисков,  а  для 89-мм (3,5 дюйма) м
икро- 
         дисков. Дисководы  с  учетверенной  плотностью  записи  
могут 
         подключаться  к  обычному компьютеру IBM/PC как нестанда
ртные 
         устройства, если  включить  в  ДОС  соответствующий  дра
йвер. 
         Предполагается,  что  этот  формат будет использоваться 
очень 
         широко в самом ближайшем будущем. 
              Формат большой емкости QD-15, используемый в  компь
ютере 
         IBM/PC  модели  АТ,  имеет  в  каждой  из  80  дорожек  
по 15 
         секторов, размером 512 байт. Это  стало  возможным  благ
одаря 
         использованию  в  компьютере АТ специальных дискет, магн
итное 
         покрытие которых отличается от обычного. Только  при  ус
ловии 
         использования  этих  дисков  и  специальных  дисководов 
может 
         применяться такой формат. 
                  
                  Формат жесткого диска
                  ---------------------
                  
              Накопители на жестких магнитных дисках большой  емк
ости, 
         такие  как  10-мегабайтный  жесткий  диск  компьютера  Х
Т или 
         20-мегабайтный диск компьютера АТ, имеют собственные фор
маты, 
         на которых необходимо остановиться особо. 
              Любой   диск   имеет  физический  и  логический  фо
рмат. 
         Физический формат диска определяет размер сектора (в бай
тах), 
         число  секторов  на  дорожке  (или  в  цилиндре - для же
стких 
         дисков), число дорожек (цилиндров) и число сторон. Логич
еский 
         формат  диска  определяет  способ  организации  информац
ии на 
         диске и фиксирует размещение информации различных типов.
              В отличие от  гибких  дисков,  физический  и  логич
еский 
         формат  которых  устанавливается  в  процессе  форматиро
вания 
         дискеты, жесткие диски поступают к потребителю с определ
енным 
         физическим   форматом,  который  устанавливается  в  про
цессе 
         изготовления  диска.  Логическая  структура  жесткого   
диска 
         устанавливается пользователем, причем это должно быть сд
елано 
         прежде  чем   начнется   использование   диска   операци
онной 
         системой.Установка  логической  структуры диска выполняе
тся в 
         два этапа. Во-первых, жесткий диск можно  разбить  на  ч
асти, 
         каждая  из  которых  может  использоваться своей операци
онной 
         системой.   Далее,   каждую   из   этих   частей   необх
одимо 
         отформатировать    в    соответствии   с   требованиями 
  той 
         определенной системы, для которой она предназначена. 
                  
                Физические форматы жестких дисков:
         ________________________________________________________
______ 
               Тип         Число     Число        Число         О
бъем  
             компьютера   сторон    секторов     цилиндров       
(МБ)
         ________________________________________________________
______
                     
               ХТ            4          17          306          
 10
               АТ            4          17          615          
 20
         ________________________________________________________
______
             
              
              Вернемся теперь к  процессу  форматирования.  Данны
е  на 
         дискетах  не  могут  записываться  и считываться произво
льно. 
         Необходимо  обрамление   данных   специальными   электро
нными 
         сигналами, записанными на дискете. 
              Это  обрамление называется форматирующим. Поэтому, 
новые 
         дискеты  до  их  использования  должны  быть  отформатир
ованы 
         командой FORMAT операционной системы ДОС. 
              Основная часть процесса форматирования состоит в  з
аписи 
         адресных меток, идентифицирующих каждый сектор, и указыв
ающих 
         его размер. Изучив более подробно способы доступа  к  да
нным, 
         хранящимся  на  дискете,  Вы  увидите,  что  одна  из ош
ибок, 
         возникающих при  чтении  или  записи,  состоит  в  отсут
ствии 
         адресных меток. 
              Команда  FORMAT  не  только  размечает  сектора  ди
скет, 
         формируя  адресные метки, но также устанавливает определ
енное 
         значение в поля даных всех секторов. Это эначение (F6/16
) или 
         символьный  код CHR$(246) позволяет определять, использо
вался 
         ли когда-нибудь определенный сектор или нет. 
              Одна  из  основных  причин   использования   програ
ммной 
         разметки  заключается, вероятно, в обеспечении средств з
ащиты 
         от копирования. Операционная система ДОС позволяет  счит
ывать 
         и  записывать  только  сектора стандартного размера 512 
байт, 
         хотя сами дисководы могут работать с секторами  произвол
ьного 
         размера.  Можно  написать  такую  программу, которая не 
будет 
         использовать средства ДОС для работы с гибким диском и  
будет 
         хранить  часть  своей  информации  или  даже всю информа
цию в 
         секторах нестандартного размера, которые  не  будут  чит
аться 
         стандартными  программами  ДОС. В этом и заключается осн
овной 
         принцип защиты  от  копирования  в  IBM/PC.  Хотя  сущес
твуют 
         различные  способы  защиты  от  копирования, наиболее пр
остой 
         заключается в использовании секторов нестандартного  раз
мера. 
         Обычно,   лишь   небольшая   часть   информации  хранитс
я  на 
         защищенной от копирования дискете в нестандартных сектор
ах, а 
         основная  часть  данных может храниться в обычных 512-ба
йтных 
         секторах. 
              Понятно,  что  все эти различные типы дискет практи
чески 
         несовместимы.  Одно  из   немногих   исключений   связан
о   с 
         одновременным  использованием  одно-  и двухсторонних ди
скет. 
         Однако, для совместимости дискет  важны  даже  не  физич
еские 
         различия.  Для совместного использования дискеты должны 
иметь 
         совместимую   логическую   разметку   (например,   разме
щение 
         справочника  файлов).  Из-за  логических  различий невоз
можно 
         просто перенести данные с дискеты компьютера "Эппл" в  п
амять 
         компьютера   IBM/PC,   или  из  операционной  системы  Д
ОС  в 
         операционную  систему  СР/М-86.  Для  этого  нужно   нап
исать 
         специальную    программу   преобразования,   которая   с
может 
         выполнять эту задачу. 
                  
              5.4.   Стандартный   накопитель   информации  на  г
ибких
         магнитных дисках
         
              
              Иногда какой-либо компании удается сделать столь хо
рошую 
         продукцию,   что   она  становится  промышленным  станда
ртом, 
         захватывая  существенную  часть  рынка  за  счет  собств
енных 
         объемов  продаж  и продаж близких имитаций этой продукци
и.Это 
         произошло с серией накопителей на гибких магнитных диска
х  ТМ 
         100  фирмы  "Тэндон".  Судя по всему, фирма "ИБМ" принял
а эти 
         дисководы в качестве эталонных и, насколько можно о  чем
-либо 
         судить  в  этой  сфере  тщательно хранящихся секретов, т
олько 
         дисководы  серии   ТМ   100   фирмы   "Тэндон"   поставл
яются 
         фирмой"ИБМ" в качестве официального дисковода для IBM/PC
. 
              Существует четыре популярных варианта дисководов ТМ
 100. 
         Рассмотрим эти варианты подробнее. 
              Устройства  ТМ  100-1   предназначены   для   работ
ы   с 
         односторонними  дисками  с двойной плотностью записи (т.
е., с 
         40 дорожками). Это устройство входило в стандартный  ком
плект 
         первой  версии IBM/PC. Позднее, одновременно с внедрение
м ДОС 
         версии 1.10, фирма "ИБМ"  начала  использовать  дисковод
ы  ТМ 
         100-2,  работающие по-прежнему с двойной плотностью, но 
уже с 
         двухсторонними дисками, что позволило вдвое  увеличить  
объем 
         хранения  информации.  Ниже  мы  рассмотрим, как операци
онная 
         система ДОС использует разные типы  дискет).  Оставшиеся
  две 
         модели,  ТМ 100-3 и ТМ 100-4, устройства позволяющие раб
отать 
         с одно- и двухсторонними дисками  с  учетверенной  плотн
остью 
         записи,   т.е.  с  восьмьюдесятью  дорожками  на  поверх
ности 
         дискеты. 
              Не  совсем  понятно  решение  фирмы  "ИБМ"  использ
овать 
         односторонние дискеты наряду с двухсторонними. С точки з
рения 
         дальних  перспектив   компьютера   такое   решение   выг
лядит 
         неразумным.   Наиболее   вероятной   причиной   использо
вания 
         одностронних дискет является желание фирмы ИБМ  снизить 
 цену 
         своего  компьютера,  которая и так существенно превышает
 цену 
         обычных домашних компьютеров. 
              Имеется ряд признаков, свчидетельствующих  о  стрем
лении 
         фирмы предельно снизить цену базовой модели. По крайней 
мере, 
         это единственный аргумент которым можно  объяснить  появ
ление 
         практически  нигде  не использующейся модели с накопител
ем на 
         кассетной магнитной ленте и применения односторонних дис
кет в 
         первых   модификациях  IBM/PC.  Расчет  делался  на  то,
  что 
         серьезные  пользователи,  думающие   о   перспективе,   
будут 
         приобретать машины, оснащенные более мощными дисками, а 
чтобы 
         не отпугнуть колеблющегося новичка высокой ценой,  фирма
  ИБМ 
         выбрала  из  всех  имеющихся дисководов устройство с наи
более 
         умеренной ценой - устройство с односторонними дисками. 
                  
                  5.5. Принципы хранения файлов
                  
                  
              Можно  использовать  различные  схемы  для  организ
ации, 
         хранения и учета данных на дискете. Каждая из схем имеет
 свои 
         достоинства  и  недостатки  с  точки   зрения   эффектив
ности 
         использования  пространства памяти дискеты, скорости дос
тупа, 
         безопасности и качества хранения  данных.  (Понятие  кач
ества 
         хранения    данных   подразумевает   вероятность   каких
-либо 
         нарушений при хранении  и  трудность  восстановления  да
нных, 
         если  нарушения  произошли.) Разработка схемы хранения д
анных 
         состоит в искусстве  сочетания  всех  этих  аспектов,  и
ногда 
         противоречащих друг другу. 
              В  этом  параграфе  будет описана схема хранения да
нных, 
         используемая  в  MS-ДОС.  Прежде  чем  перейти  к  подро
бному 
         рассмотрению  схемы  хранения,  опишем  ее  в  общих  че
ртах. 
         Первое,  что  следует  подчеркнуть,  это  использование 
  для 
         хранения данных стандартных 512-байтных секторов. Второе
. Все 
         сектора извлекаются  из  общего  пула  свободных  сектор
ов  - 
         никакие  сектора  или  области  на  дискете  не резервир
уются 
         (исключение  составляет  область  для  размещения   сист
емных 
         файлов  IBMBIO.COM  и  IBMDOS.COM, о чем будет сказано н
иже). 
         Третье. Распределение секторов данных и обьединение сект
оров, 
         образующих    файл    данных,   выполняется   независимо
   от 
         обслуживания самих  секторов  данных,  с  помощью  механ
изма, 
         получившего  название  Таблицы  Распределения Файлов (ТР
Ф). И 
         последнее.  Каждая  дискета  имеет  справочник  или   та
блицу 
         гсодержимого, котороая служит для учета файлов, хранящих
ся на 
         дискете файлов. Описанная схема хранения данных  предпол
агает 
         существование  четырех  различных  типов  секторов,  оди
н  из 
         которых используется для хранения данных, а три других  
имеют 
         специальное назначение. 
              Как уже упоминалось в предыдущей главе,  любая  дис
кета, 
         которая   должна   использоваться  для  запуска  операци
онной 
         системы, должна иметь программу  загрузки,  записывающую
ся  в 
         самом  первом  секторе  дискеты.  Программа  загрузки  в
сегда 
         записывается в  первый  сектор  любой  форматируемой  ди
скеты 
         (если задан сообтветствующий режим форматирования) незав
исимо 
         от того, будет ли она когда-нибудь использоваться для за
пуска 
         системы.  Сектор  с  программой  загрузки  представляет 
собой 
         первый специальный тип сектора в ДОС. 
              Второй специальный тип сектора используется для хра
нения 
         таблицы таблиы размещения  файлов  (ТРФ).  ТРФ  занимает
  два 
         сектора, следующих за сектором с программой загрузки. Та
блица 
         размещения файлов служит  для  индикации  занятости  сек
торов 
         данных на дискете. 
              Третий  и последний специальный тип сектора использ
уется 
         для хранения справочника  дискеты.  Справочник  располаг
ается 
         следом  за  ТРФ.  Справочник  может  иметь различные раз
меры: 
         односторонние дискеты имеют  четыре  сектора  справочник
а,  а 
         двусторонние дискеты - семь. 
              Все  эти  сектора  специального назначения занимают
 семь 
         первых  секторов   односторонней   дискеты   или   десят
ь   - 
         двусторонней. Bcе остальные сектора используются для хра
нения 
         данных. На рис. 5.3 показано  размещение  всех  этих  че
тырех 
         типов секторов на дискете. 
             
              Справочник  и  таблица размещения файлов располагаю
тся в 
         начале  дискеты.  На   первый   взгляд   это   представл
яется 
         оптимальным  размещением.  Однако,  при  доступе  к файл
у ДОС 
         сначала должен найти элемент этого  файла  в  справочник
е,  а 
         потом  обратиться  собственно к данным на дискете. В сре
днем, 
         расстояние между справочником и собственно файлом на  ди
скете 
         составляет 20 дорожек, то есть, практически половину дис
кеты. 
         Перемещение головок чтения-записи в дисководе является  
самой 
         медленной  операцией. Так что расстояние между справочни
ком и 
         самим файлом может  иметь  важное  значение  с  точки  з
рения 
         временных характеристик работы. 
              Если  бы  справочник располагался в середине дискет
ы, то 
         среднее расстояние до секторов данных уменьшилось  бы  в
двое, 
         т.е., до 10 дорожек. С другой стороны, работа с простран
ством 
         данных,  состоящим  из  двух  частей,  по  обе   стороны
   от 
         справочника,  будет  значительно  сложнее.  Для  операци
онных 
         систем  персональных   компьютеров   выгода   от   разме
щения 
         справочника  посредине дискеты слишком мала, чтобы брать
ся за 
         разрешение возникающих при этом дополнительных проблем. 
Такой 
         прием обычно используется в больших компьютерных система
х. 
              Далее   мы  подробно  рассмотрим  справочник  диске
ты  и 
         таблицу размещения файлов. Разобравшись в  этом  вопросе
  нам 
         легче    будет   понять,   как   производится   распреде
ление 
         пространства на диске между файлами. 
                  
              5.6. Организация справочника 
                  
              Справочник  дискеты   содержит   список   всех   фа
йлов, 
         находящихся  на  дискете.  Элементы  справочника содержа
т всю 
         необходимую информацию о файле, за исключением  информац
ии  о 
         размещении файла (которая хранится в ТРФ). 
              Каждый   элемент   справочника  имеет  длину  32  б
айта. 
         Следовательно, в  512-байтном  секторе  помещается  ровн
о  16 
         элементов  справочника.  На  односторонней дискете выдел
ено 4 
         сектора для справочника, что позволяет  хранить  64  эле
мента 
         справочника.  Семь  секторов справочника двусторонней ди
скеты 
         позволяет разместить 112 элементов. 
           
              Большая  часть  из  32   байтов   элемента   справо
чника 
         используется  для хранения информации о файле, однако им
еется 
      
         ряд неиспользуемых полей, зарезервированных  для  дальне
йшего 
         использования.  Одно  из  различий  между версиями ДОС 1
.00 и 
         1.10 заключается в использовании некоторых из этих  поле
й,  а 
         ДОС   версии   2.00   еще   более   расширяет   использо
вание 
         справочника. 
              Теперь  подробно  рассмотрим   каждую   часть   эле
мента 
         справочника.Листинг   программы   5.1   содержит   об~яв
ления 
         форматов данных на языке  Паскаль,  а  листинг  5.3  сод
ержит 
         несколько  процедур  для  работы  со  справочником  - чт
ения, 
         интерпретации и записи обратно на дискету. 
              Программа   DiskLook,   входящая   в   пакет   прог
рамм, 
         прилагаемых  к этой книге, разработана для отображения п
олной 
         информации из справочника дискеты.  Во  время  изучения 
 этой 
         главы  можно  использовать  эту программу, чтобы лучше п
онять 
         назначение всех полей элемента справочника. Если использ
уется 
         программа  DiskLook, то для получения на экране информац
ии из 
         справочника нужно нажать функциональную клавишу F4. 
              Каждый элемент справочника состоит из восьми частей
  или 
         полей следующего назначения: 
              ИМЯ   ФАЙЛА:   Это   поле   имеет   длину  восемь  
байт, 
         расположенных в элементе справочника со смещениями от 0 
до  7 
         и   содержит  имя  файла.  Если  длина  имени  меньше  в
осьми 
         символов, то недостающие символы заменяются пробелами. 
              Правилами  оформления  имен  файлов  в  ДОС  запрещ
ается 
         включать  пробелы  в  середину  имени  файла.  Но такие 
имена 
         файлов все же могут создаваться. Это можно  делать  на  
языке 
         Бейсик,  поскольку  в нем ограничителем имени служат кав
ычки. 
         Например, следующий оператор Бейсика позволяет создать  
файл, 
         имя которого содержит пробел: 
                  
              OPEN "AA BB.FIL" 
                  
              Программа "IBM Typing  Tutor",  написанная  на  Бей
сике, 
         использует   файлы,   имена  которых  содержит  пробелы.
  При 
         использовании программы поиска имени файла в справочнике
,  не 
         следует   считать,   что  имя  файла  завершается  первы
м  же 
         встреченным пробелом - имя может продолжаться и  после  
этого 
         пробела. 
              Если первый байт  имени  файла  имеет  шестнадцатер
ичное 
         значение Е5, CHR$(229), это означает, что элемент справо
чника 
         не  используется.  Это  может  значить,  что  он  никогд
а  не 
         использовался  или  что  файл,  которому  соответствовал
 этот 
         элемент,  уже  уничтожен.  Проверка   второго   байта   
имени 
         позволяет  установить отличие неиспользовавшегося элемен
та от 
         элемента уничтоженного файла  (если  значение  второго  
байта 
         больше  символьного кода "Z", этот элемент не использова
лся). 
         В последних версиях ДОС неиспользованные элементы справо
чника 
         содержат в первом байте 0. 
              После  уничтожения  файла  с  ним  происходит следу
ющее: 
         занимаемое им место возвращается в общий пул (об  этом  
будет 
         подробнее  сказано в следующем разделе) и первый символ 
имени 
         файла заменяется шестнадцатеричным кодом Е5,  CHR$(229).
  Вся 
         информация  в  элементе  справочника,  за исключением пе
рвого 
         символа  имени,  сохраняется.  Благодаря   этому,   прог
рамма 
         DiskLook   может  отображать  имена  уничтоженных  файло
в,  а 
         программа подобная UnErase - восстанавливать файлы. 
      
              Еще  один  код, который может встретиться в первом 
байте 
         имени файла - это шестнадцатеричный код 2Е, который указ
ывает 
         на справочник нижнего уровня. 
              РАСШИРЕНИE:  Это  поле  имеет  длину  три байта, ко
торые 
         расположены со смещениями от  8  до  10  от  начала  эле
мента 
         справочника.  Оно  содержит  расширение  имени файла. Ка
к и в 
         случае  с  самим  именем,  короткое  расширение   дополн
яется 
         пробелами.  Если  файл  не  имеет  расширения,  то  это 
 поле 
         содержит три пробела. 
              АТРИБУТ:   Это   поле   состоит   из    одного    б
айта, 
         расположенного   со   смещением   11   от   начала   эле
мента 
         справочника.  Поле  атрибута  используется  для  установ
ления 
         признака "скрытого" файла, т.е. такого файла, имя которо
го не 
         обнаруживается обычными программами работы со  справочни
ками. 
         Два   бита   этого   байта  служат  для  индикации  атри
бутов 
         "скрытого" и "системного" файла. Остальные шесть бит не 
 были 
         определены  в  ранних  версиях  ДОС и только начиная с в
ерсии 
         2.00 часть из них стала использоваться. Во  всех более р
анних 
         версиях эти биты не определены и устанавливаются в нуль.
         
              Седьмой  бит  байта  атрибутов  с  числовым  значен
ием 2 
         определяет скрытый файл, а шестой, с числовым значением 
4,  - 
         системный  файл.  Таким  образом,  обычный видимый файл 
будет 
         иметь нулевой байт атрибута, для скрытого файла байт атр
ибута 
         имеет  значение  2,  для системного файла - 4, а для скр
ытого 
         системного файла - 6. 
              Хотя   обработка   системного   атрибута  осуществл
яется 
         независимо  от  скрытого,  оба   эти   атрибута   практи
чески 
         совпадают   по   своему   функциональному   назначению. 
  При 
         использовании любого из них файл становится  "невидимым"
  для 
         обычных  программ  работы со справочниками. Системный ат
рибут 
         зарезервирован  не  для  использования  в  будущем,   а 
  (по 
         сведениям фирмы "Майкрософт") для обеспечения совместимо
сти с 
         другими операционными системами. 
              В версиях ДОС, следующих за  версией  2.00  использ
уются 
         еще четыре бита. Бит 0 (с единичным значением) указывает
, что 
         файл доступен  только  для  чтения.  Такой  файл  защище
н  от 
         изменений и уничтожения средствами ДОС. 
              Бит 3 (с числовым значением 8)  указывает,  что  эл
емент 
         справочника  содержит метку тома. Сама метка хранится в 
полях 
         имени файла  и  расширения,  которые  воспринимаются  в 
 этом 
         случае как одно целое. 
              Бит   4  (с  числовым  значением  16)  используется
  для 
         указания элементов справочника, соответствующих  справоч
никам 
         нижнего уровня. Поскольку справочники нижнего уровня хра
нятся 
         на  диске  подобно  обычным  файлам  данных,   им   необ
ходим 
         собственный  элемент  в корневом справочнике. В этом эле
менте 
         используются все поля, кроме размера файла, в  данном  с
лучае 
         равного нулю. Действительный размер файла справочника ни
жнего 
         уровня легко определяется из соответствующей последовате
льно-
         сти в ТРФ. 
              Бит   5  (с  числовым  значением  32)  предусмотрен
  для 
         облегчения создания резервных копий файлов на жестких ди
сках. 
         Для   файлов   на  гибких  дисках  этот  атрибут  практи
чески 
         бесполезен. 
              ЗАРЕЗЕРВИРОВАННОЕ ПОЛЕ:  Это  поле  зарезервировано
  для 
         возможного  использования  в будущем. В первой версии ДО
С это 
         поле имело длину 12 байт, но в дальнейшем его сократили 
до 10 
         байт,  расположенных  со  смещениями от 12 до 21 относит
ельно 
         начала элемента справочника. 
      
              Любые  новые  операции  над справочником файлов, ко
торые 
         могут  использовать  это  поле.  Когда  элемент   справо
чника 
         находится  в  активном состоянии (используется), то эти 
байты 
         принимают значение 00. В исходном состоянии байты этого 
 поля 
         имеют  шестнадцатеричные  значения F6, установленные ком
андой 
         FORMAT.  Любые  другие  значения  этого  поля  указывают
   на 
         какой-либо вариант его использования. 
              ВРЕМЯ:   Это  поле  имеет  длину  два  байта  в  фо
рмате 
         16-разрядного  целого  числа  без  знака,  расположенные
   со 
         смещениями  22  и  23 относительно начала элемента. Начи
ная с 
         версии ДОС 1.10 в  этом  поле  хранится  время  создания
  или 
         модификации файла. В первой версии ДОС хранилась только 
дата, 
         а это поле было частью зарезервированного поля. 
              Большинство операций, использующих это поле,  таких
  как 
         операция распечатки содержимого справочника DIR, выдают 
время 
         с точностью до минут, хотя число хранящееся  в  поле  вр
емени 
         позволяет определить время с точностью до двух секунд. 
              Код времени, хранящийся как 16-разрядное целое числ
о без 
         знака, вычисляется по следующей формуле: 
              
                 время = часы * 2048 + минуты * 32 + секунды / 2
              
              ДАТА : Это поле состоит  из  двух  байт,  хранящихс
я  со 
         смещениями  24  и  25  от  начала элемента. Как и время,
 даты 
         хранятся в виде целого 16-разрядного числа без знака, ко
торое 
         вычисляется по формуле: 
                 
                 Дата = (год - 1980) * 512 + Месяц * 32 + День
                 
              Диапазон  изменения  лет  составляет  от  1980  до 
2099, 
         причем хранятся они в виде относительных величин от 0 до
 199. 
         Хотя формат позволяет задавать относительный номер года 
127 ( 
         что  соответствует  2107  году),  программы   ДОС   позв
оляют 
         работать  с годами только до 2099. Никто, правда, не ожи
дает, 
         что ДОС будет использоваться так долго. 
              Как  формат,  так  и  размещение  полей  даты  и вр
емени 
         подобраны таким образом, чтобы вместе они образовывали е
диное 
         четырехбайтовое  поле, которое можно использовать в опер
ациях 
         сравнения. Достаточно  просто  извлекать  компоненты  да
ты  и 
         времени  из  соответствующих  полей  и вычислять их разн
ость. 
         Например,  для  разделения  даты  на  составные  части  
можно 
         использовать следующие формулы, записанные на Паскале: 
                 год := 1980 + поле_даты div 512
                 месяц := (поле_даты mod 512) div 32
                 день := поле_даты mod 32
              
              НОМЕР  НАЧАЛЬНОГО  КЛАСТЕРА  :  Это  двухбайтовое  
поле, 
         расположенное  со  смещением  26,  27  от  начала   элем
ента, 
         содержит   16-разрядное   число,   являющееся   смещение
м  до 
         начальной точки файла  в  таблице  размещения  файлов  (
ТРФ); 
         подробнее  от  этом  сказано  в следуцющем разделе. Нача
льный 
         кластер  является  первой  частью  пространства   данных
   на 
         дискете. 
      
              РАЗМЕР  ФАЙЛА  :  Это  поле  состоит  из четырех ба
йтов, 
         размещенных со смещениями от 28 до  31  от  начала  элем
ента. 
         Размер   файла   задается  в  байтах  и  хранится  в  фо
рмате 
         четырехбайтового  целого  числа  без  знака,  которое   
может 
         рассматриваться  как пара двухбайтовых чисел. Размер фай
ла не 
         всегда указывает точное число байтов.  Для  всех  файлов
  это 
         поле  должно  соответствовать размеру файла в секторах.(
 Если 
         по какой-либо причине это не так, то  процедура  ДОС  CH
KDSK 
         сообщит об ошибке и установит правильную длину.) 
              Для  программных  файлов,  представленных в формате
 типа 
         ".COM" и для файлов, созданных из данных фиксированной д
лины, 
         только  поле  размера  файла  позволяет точно определить
, где 
         находится конец данных.  Для  этих  файлов  значение  в 
 поле 
         размера файла хранится с точностью до байта. 
              Для  файлов  некоторых других форматов такая точнос
ть не 
         обязательна и размер файла, указанный в соответствующем 
поле, 
         может  отличаться  от  действительного.  Наиболее  часто
  это 
         случается с  текстовыми  файлами,  которые  будут  описа
ны  в 
         разделе  5.9  .  Текстовые  файлы  в  коде ASCII имеют м
аркер 
         (признак) конца файла,  хранящийся  в  самом  файле,  ко
торый 
         фиксирует   точный  конец  данных.  По  этой  причине  м
ногие 
         программы,  работающие  с  текстовыми  файлами,  не   сл
ишком 
         заботятся о сохранении действительного размера файла. 
              Например,  если  программа  формирует  текстовой фа
йл не 
         побайтно, а блоками по 128  байт,  то  ДОС  определит  р
азмер 
         файла  с  точностью  до 127 байт. Для программ редактиро
вания 
         текстов значительно эффективнее читать  и  записывать  д
анные 
         большими  блоками,  чем  делать  это  побайтно.  Такой п
одход 
         является довольно  распространенным  и  не  следует  чер
есчур 
         доверять   значению  размера  файла,  по  крайней  мере,
  для 
         текстовых файлов. 
                 
              Справочники нижнего уровня
              ___________________________
                 
              Существуют два типа справочников: корневые и справо
чники 
         нижнего   уровня.   Содержимое   и   характер   использо
вания 
         справочников обоих типов по существу одинаковы - те и  д
ругие 
         хранят  имена  файлов  и  сведения о них и их расположен
ии на 
         диске. Однако, характеристики этих справочников  различа
ются. 
         Корневые   справочники   (или   просто   справочники)   
имеют 
         фиксированный размер  и  хранятся  в  определенном  мест
е  на 
         дискете.   Справочник  нижнего  уровня  является  дополн
ением 
         корневого справочника и может храниться как  обычный  фа
йл  в 
         любом  месте  на  дискете.  Справочники  нижнего уровня 
могут 
         использоваться любой версией ДОС, следующей за версией 2
.00. 
              Справочники  нижних  уровней  хранятся  в   простра
нстве 
         данных  диска  как  обычные файлы. Форматы полей и содер
жимое 
         справочников  нижнего  уровня  такие  же  как   у   корн
евого 
         справочника,  с  той  лишь  разницей,  что размер справо
чника 
         нижнего  уровня  не  ограничен.  Справочники  нижнего  у
ровня 
         всегда связаны с порождающим справочником, который может
 быть 
         как корневым справочником, так и справочником более  выс
окого 
         уровня. 
              В  порождающем  справочнике  всегда  имеется элемен
т для 
         справочника нижнего уровня,отличающийся от обычного  эле
мента 
         установленным  битом  4  байта  атрибутов и нулевым знач
ением 
         размера  файла.  Действительный  размер   справочника   
можно 
         определить,   проследив  всю  цепочку  в  таблице  разме
щения 
         файлов. 
      
              При  создании  справочников   нижнего   уровня   в 
  них 
         выделяются  два  элемента,  в  которых в качестве имени 
файла 
         указана точка и две точки ( "." и ".."). 
              Элемент с одной точкой относится к этому справочник
у,  а 
         элемент  с  двумя  точками  - к его порождающему справоч
нику. 
         Номера  начальных  кластеров  в  этих   элементах   указ
ывают 
         соответственно   местоположение   самого  справочника  и
  его 
         порождающего. 
              Если  номер   начального   кластера   для   порожда
ющего 
         справочника  равен  нулю,  то  порождающим  является кор
невой 
         справочник. 
              Когда   размер   файла   уменьшается,   ДОС   возвр
ащает 
         освободившееся  место  на  дискете  в общий пул. Однако,
 если 
         информация о файле хранится в справочнике нижнего уровня
,  то 
         освободившееся место нельзя будет использовать, пока не 
будет 
         уничтожен весь этот справочник. 
                 
              
              5.7 Структура Таблицы Размещения Файлов (ТРФ)
                 
              Процедура  распределения  пространства памяти на ди
скете 
         между файлами реализуется с помощью таблицы размещения ф
айлов 
         (ТРФ).  Использование  ТРФ  и  интерпретация  ее  содерж
имого 
         представляет   собою   непростую   задачу   -   следоват
ельно 
         необходимо  некоторое  более  подробное разъяснение. Осн
овной 
         принцип  организации  ТРФ  заключается  в  создании  таб
лицы, 
         каждый  элемент  которой  соответствует  одному  кластер
у или 
         фрагменту дискового пространства выделяемого файлу.  Эле
менты 
         таблицы  содержат  признаки  занятости  кластера  или  ч
то он 
         свободен и  может  быть  отведен  для  файла.  Доступные
  или 
         свободные элементы таблицы содержат нулевые значения. Уч
астки 
         пространства  на  дискете,  принадлежащие  файлу,  связа
ны  в 
         цепочку.  Элемент справочника файла содержит номер элеме
нта в 
         ТРФ, который соответствует первому  из  участков,  выдел
енных 
         для  файла.  Элемент  ТРФ  содержит номер элемента следу
ющего 
         файла и так далее, пока не будет достигут  последний  уч
асток 
         файла.  В  последнем элементе ТРФ для файла находится пр
изнак 
         конца файла. Схема такой организации изображена на рис. 
5.4 . 
             
              Такова  в  общих  чертах схема ТРФ. Рассмотрим тепе
рь ее 
         подробнее. 
              Во-первых,  рассмотрим кластеры выделяемого простра
нства 
         памяти. Для односторонних дмскет пространство  выделяетс
я  по 
         одному  сектору.  Для  двухсторонних дискет выделяются к
аждый 
         раз два  сектора  .  Если  в  кластер  входит  больше  о
дного 
         сектора,   то   объединяются  последовательные  сектора.
  Для 
         двухсторонних дискет кластер состоит из четного  и  нече
тного 
         секторов  одной  и  той  же  дорожки.  Таким  образом, к
аждая 
         дорожка двухсторонней дискеты состоит из четырех кластер
ов на 
         каждой  стороне  или всего восьми кластеров. В первый кл
астер 
         входят сектора 1 и 2, во второй - 3 и 4 и так далее  .  
(Если 
         будут   добавлены  диски  большей  емкости,  то  можно  
будет 
         организовать кластеры большего размера. В четвертой глав
е уже 
         упоминалось,  как можно динамически включить в BIOS прог
раммы 
         обслуживания устройств для ДОС всех версий, начиная с  в
ерсии 
         2.00.   Описанная   методика   позволяет  добавлять  дис
ковые 
         устройства, логическая организация которых будет совмест
има с 
         используемыми дискетами. Помимо других характеристик, ко
торые 
         могут задаваться для новых устройств, можно указать  и  
число 
         секторов в кластере.) 
              Выделение  места на двухсторонней дискете двухсекто
рными 
         кластерами  может  показаться  нерациональным,  ведь  в 
 ряде 
         случаев  файл  будет  использовать лишь часть первого из
 двух 
         секторов.  Однако,  пространство  на  двухсторонних  дис
кетах 
         теряется  ничуть  не  больше  чем  на одностронних. Выде
ление 
         пространства кластерами  большими  одного  сектора  позв
оляет 
         ограничить  увеличение размеров таблицы размещения файло
в при 
         использовании дискет все больших и больших размеров. 
              Раздел данных дискеты начинается сразу за справочни
ком и 
         занимает  все  место  до конца дискеты. Первый кластер д
анных 
         имеет номер 2 (почему это так, Вы сейчас  поймете).  На 
 рис. 
         5.5 изображено расположение кластеров на одно и двухстор
онних 
         дискетах. 
             
              Как на односторонних, так и  на  двухсторонних  дис
кетах 
         хранится  две  копии  ТРФ.  Они  находятся  в  секторах 
2 и 3 
         нулевой дорожки  нулевой  стороны.  Предполагается,  что
  эти 
         копии  должны  быть  идентичны. Хранение двух экземпляро
в ТРФ 
         представляет  собой  простую  предосторожность,  связанн
ую  с 
         большой   важностью   информации,   содержащейся  в  таб
лице. 
         Восстановление   запорченного   справочника   намного   
проще 
         восстановления поврежденной ТРФ. 
              Полезность  хранения  двух  копий  ТРФ зависит от м
ногих 
         факторов, таких как степень возможного  повреждения  дис
кеты, 
         степень совершенства программ или квалификация пользоват
елей, 
         выполняющих процедуры восстановления информации. Версии 
 ДОС, 
         предшествовавшие версии 2.00, не включали специальных ср
едств 
         восстановления информации на дисках. 
              Как мне кажется, для ТРФ выделено два сектора не ст
олько 
         для того чтобы хранить две  копии,  сколько  для  обеспе
чения 
         возможности  увеличения этой таблицы в будущем. Она, кон
ечно, 
         не может  увеличиваться  до  бесконечности,  но  два  се
ктора 
         позволяют увеличить ее объем вдвое. 
              Теперь можно подробно рассмотреть кодировку ТРФ. Пр
остой 
         подсчет показывает, что  на  дискете  помещается  больше
  300 
         кластеров. Элемент ТРФ должен позволять хранить номер др
угого 
         элемента ТРФ, а максимальный номер, который может хранит
ься в 
         одном  байте  - 255, следовательно, длина элемента ТРФ д
олжна 
         быть больше байта. С другой стороны,  в  512-байтном  се
кторе 
         нельзя  поместить  больше  300  элементов  ТРФ  длиной п
о два 
         байта. Для решения этой проблемы  была  разработана  дов
ольно 
         сложная   схема   оформления   элементов   ТРФ  в  виде 
 трех 
         шестнадцатиричных цифр,  т.е.  длиной  в  полтора  байта
  (12 
         разрядов). 
              Схема   хранения  чисел  в  виде  полуторабайтных  
кодов 
         выглядит  довольно  странно,  хотя  на  машинном  языке 
  это 
         реализуется очень просто. 
              Таблица  при  хранении  сворачивается следующим обр
азом: 
         последовательные   элементы   ТРФ   разбиваются   на    
пары, 
         обьединяющие  два 1,5 байтовых значения, в последователь
ность 
         из  трех  байтов  для   каждой   пары   /Здесь   использ
уется 
         архитектурная  особенность  микропроцессоров  фирмы  "Ин
тел", 
         связанная с последовательностью хранения отдельных  байт
ов  в 
         машинном   слове   (Прим.пер.)/.   Для   получения  знач
ения, 
         хранящегося в элементе  ТРФ  с  номером  Х,  нужно  выпо
лнить 
         следующие действия: сначала необходимо умножить Х на 1.5
 (для 
         этого выполняется умножение на 3 с  последующим  деление
м  на 
         2), затем полученное число используется в качестве смеще
ния в 
         ТРФ. 
      
              Двухбайтное  число,  хранящееся  по  указанному   а
дресу 
         загружается  в  регистр.  Теперь  в регистре находится ч
етыре 
         шестнадцатиричных цифры, а необходимы только три из них.
 Если 
         номер  элемента  ТРФ  нечетный,  то нужно отбросить посл
еднюю 
         цифру, а если он четный - то первую.  Если  описание  Ва
м  не 
         совсем  понятно,взгляните  на  рис.  5.6, который изобра
жает 
         процессы упаковки и распаковки пар элементов ТРФ, выполн
яемые 
         вручную. 
             
              Рис.5.7  показывает  связь между ТРФ в том виде, в 
каком 
         она хранится на диске, и ТРФ в виде таблицы. ДОС перепис
ывает 
         ТРФ  в  память, но хранит ее в исходном, упакованном фор
мате. 
         Таблица  ТРФ,  показанная  на  рис.5.7,  представляет   
собой 
         логическую структуру ТРФ. 
             
              Чтобы  увидеть  ТРФ  в  исходном  виде,   воспользу
йтесь 
         программами  DEBUG или DISKLOOK для считывания ТРФ с дис
кеты. 
         О программе DEBUG мы подробнее расскажем в главе  6,  а 
 пока 
         приведем те команды, которые нужно ввести для считывания
 ТРФ: 
                 L0011
                 DOL200
                 
              При работе с программой Disklook, нажмите функциона
льную 
         клавишу F7 для выбора сектора, введите номер дорожки 0, 
номер 
         сектора 2, после чего нажмите клавишу F6 для отображения
 всей 
         таблицы. 
              Листинг программы 5.1 показывает  определение  на  
языке 
         Паскаль  той  структуры,  в  которой  ТРФ  хранится на д
иске. 
         Листинг  5.3  включает   несколько   программ   для   чт
ения, 
         расшифровки и обслуживания ТРФ. 
              Вспомним,  что  нумерация  кластеров начинается с 2
. Это 
         означает, что первые два элемента ТРФ (с номерами 0 и  1
)  не 
         используются для хранения информации о размещении данных
. Они 
         зарезервированы  для  хранения  очень  важной  информаци
и   - 
         сведений  о  формате  дискеты.  Код формата хранится в п
ервом 
         байте ТРФ. Соответствие кодов различным форматам приведе
но  в 
         следующей таблице: 
                 
                        ФОРМАТ     КОД ФОРМАТА
                      _________________________  
                      
                         D - 8          FF     
                         S - 8          FE
                         D - 9          FD
                         S - 9          FC
                         QD - 9         F9
                         QD - 15        F9
                      _________________________
                      
              Управляющие  программы  определяют  формат дискеты 
путем 
         чтения  первого   байта   ТРФ.   Программа,   находящаяс
я   в 
         загрузочной  записи,  обращается  к ТРФ еще и для того, 
чтобы 
         определить где находятся два системных  файла,  IBMBIO.C
OM  и 
         IBMDOS.COM.  С этим связаны различия в загрузочных прогр
аммах 
         ДОС версии 1.00 и версии 1.10. 
              Простые арифметические  вычисления  показывают,  чт
о  на 
         односторонней  дискете  находится 313 односекторных клас
теров 
         (со 2 по 314), а на двухсторонней дискете - 315 двухсект
орных 
         кластеров.  Для  односторонней дискеты такое число получ
ается 
         вычитанием  из  общего  числа  в  320  секторов   1   се
ктора 
         загрузочной  записи, 2 секторов ТРФ и 4 секторов справоч
ника. 
         Для  двухсторонних  дискет,  из  общего  числа  640  сек
торов 
         вычитается  1  сектор  загрузочной  записи, 2 сектора ТР
Ф и 7 
         секторов  справочника,  что  дает  630   секторов   или 
  315 
         двухсекторных  кластеров.  В одном 512-байтовом секторе 
можно 
         разместить 340 элементов ТРФ, так что в  конце  секторов
  ТРФ 
         остается немного свободного места. 
              В  листинге  программы  5.3 приведены процедуры на 
языке 
         Паскаль,  работающие  с  ТРФ.  Эти   процедуры   могут  
 быть 
         использованы  в  больших  программах. Их изучение поможе
т вам 
         лучше разобраться в структуре ТРФ и в ее использовании. 
              Но это еще не все, что  касается  ТРФ.  В  этой  та
блице 
         используются  определенные  коды специального назначения
. Как 
         мы  уже  видели,  неиспользуемый  кластер  в  ТРФ  отмеч
ается 
         нулевым  значением  соответствующего элемента. Любое зна
чение 
         элемента таблицы в диапазоне от 2 до 314  (для  одностор
онних 
         дискет)  или  до  316 (для двухсторонних) является допус
тимым 
         указателем  на  очередной  элемент  в  цепочке,   описыв
ающей 
         размещение  файла.  Восемь наибольших значений, которые 
могут 
         храниться в элементе ТРФ, шестнадцатиричные числа от  FF
8  до 
         FFF   или  десятичные  от  4088  до  4095,  используются
  для 
         обозначения конца цепочки описания. Хотя необходим всего
 один 
         код  конца  файла, резервируется восемь кодов на случай,
 если 
         возникнет  необходимость  в  каком-либо  расширении.   В
осемь 
         шестнадцатиричных  кодов от FF0 до FF7 или десятичных от
 4080 
         до   4087   оставлены   для    обозначения    особых    
типов 
         зарезервированных кластеров, например, кластеров с дефек
тными 
         секторами. 
              На  поверхности  дискеты  могут  встречаться  участ
ки  с 
         дефектами  магнитного  покрытия,  которые  нельзя  эффек
тивно 
         использовать для хранения данных. Такие области выявляют
ся во 
         время форматирования дискеты и исключаются из числа обла
стей, 
         которые будут использоваться в дальнейшем.  В  первой  в
ерсии 
         ДОС  1.00,  эти дефектные сектора оформлялись в виде скр
ытого 
         файла  с  именем  "badtrack.".  Начиная  с  версии  ДОС 
 1.10 
         используется более изящный метод. 
              Значение элемента ТРФ 4087 (или  шестнадцатиричное 
 FF7) 
         используется  для  обозначения неиспользуемого кластера.
 Одно 
         из  достоинств  такого  метода  пометки  дефектных  клас
теров 
         заключается   в  том,  что  не  используется  лишний  эл
емент 
         справочника. Программа DiskLook может быть  использована
  для 
         определения  точного положения дефектных секторов на дис
кете, 
         чего нельзя сделать стандартными средствами ДОС. 
              Любые другие значения элементов ТРФ, от 314 (или 31
6) до 
         4080, являются недопустимыми. 
              В организации ТРФ могут возникать определеннные деф
екты. 
         Два наиболее заметных дефекта - это "беспризорные" класт
еры и 
         перекрещивающиеся  файлы. Если элемент ТРФ содержит знач
ение, 
         указывающее, что  элемент  используется  (значение  не  
равно 
         нулю)  и,  в то же время, этот элемент не входит ни в од
ну из 
         цепочек определения размещения файлов, то такой  элемент
  ТРФ 
         становится  как  бы  "беспризорным".  Во втором случае, 
может 
         случиться  так,  что  две  или  больше   различные   цеп
очки, 
         определяющие  размещение  файлов, приводят к одному и то
му же 
         кластеру.   Такие   файлы   называются    перекрещивающи
мися. 
      
         Стандартная   программа  ДОС  СНКDSK  обнаруживает  оба 
 типа 
         нарушений  в  структуре  ТРФ  и   возвращает   "беспризо
рные" 
         кластеры  в общий пул свободных и доступных для использо
вания 
         кластеров. 
              "Беспризорные"  кластеры  чаще  всего  возникают,  
когда 
         программы  начинают  создавать  файл  (так   что   для  
 него 
         выделяются кластеры), но не закрывают его, вследствие че
го не 
         завершается создание элемента справочника для данного  ф
айла. 
         Такое  часто  происходило  с первой версией компилятора 
языка 
         Паскаль в ДОС при обнаружении ошибки  в  исходной  прогр
амме. 
         Регулярное    использование    программы    СНКDSК   поз
волит 
         избавляться от "беспризорных" кластеров, независимо от п
ричин 
         их  появления.  Нужно  включать  вызов СНКDSK в файл пак
етной 
         обработки с любой программой,  в  результате  работы  ко
торой 
         могут возникать "беспризорные" кластеры. 
              Если   "беспризорные"  кластеры  встречаются  доста
точно 
         часто, то перекрещивающиеся файлы возникают очень редко.
  Мне 
         довелось  их  наблюдать  только  тогда, когда я специаль
но их 
         создавал. Если такая ситуация все же  Вам  встретится,  
нужно 
         скопировать   каждый   из   файлов   на  другую  дискету
  для 
         последующего восстановления  (если  оно  потребуется).  
После 
         этого,  копии всех файлов будут содержать информацию из 
общих 
         секторов, хотя она может принадлежать только одному из н
их. 
              Нажав клавишу F9 при работе  с  программой  Diskloo
k  Вы 
         можете просмотреть карту диска с отмеченным на ней полож
ением 
         "беспризорных" кластеров  и  общих  кластеров  пересекаю
щихся 
         файлов. 
              При  работе  ДОС в памяти хранится копия ТРФ для ка
ждого 
         используемого  дисковода.  Когда   в   таблице   произво
дится 
         какое-либо   изменение,  она  записывается  в  обе  копи
и  на 
         дискете. При новом обращении  к  дискете  ДОС  считывает
  ТРФ 
         чтобы установить формат дискеты. 
              Теперь,  познакомившись  со  структурами  справочни
ков и 
         таблиц размещения файлов, можно  рассмотреть  форматы  ф
айлов 
         данных.  Сначала  рассмотрим  два  наиболее  распростран
енных 
         формата: текстовые файлы ( в кодах ASCII) и формат  файл
ов  с 
         фиксированной  длиной записи. Затем мы рассмотрим два фо
рмата 
         хранения программ: ".COM" файлы и ".EXE" файлы. 
                 
              5.8. Размещение файлов 
                 
              Теперь можем рассмотреть метод выделения секторов д
анных 
         для файлов. Этот метод довольно прост. 
              При  записи  на  дискету  данных файла для нее по о
дному 
         выделяются  кластеры  секторов   дискеты.   Когда   необ
ходим 
         очередной кластер для данных, то выбирается доступный кл
астер 
         с наименьшим номером. Такая простая  схема  используется
  как 
         при создании файла, так и при его удлинении (путем добав
ления 
         данных в конец файла). 
              В отличие от некоторых других операционных систем (
таких 
         как  р-система Калифорнийского университета в Сан-Диего)
, ДОС 
         выделяет место на дискете по одному кластеру,  когда  в 
 этом 
         есть необходимость, не заботясь о том, чтобы все данные 
файла 
         хранились в одной непрерывной области диска.  При  разра
ботке 
         любой  схемы  распределения  дискового  пространства  в 
любой 
         операционной  системе  приходится  выбирать  между  своб
одным 
         выделением пространства по одному кластеру, в результате
 чего 
         файл  может  оказаться  "размазанным"  по  всей  дискете
,   и 
         выделением  места  большими  непрерывными  сегментами  ,
  что 
         усложняет  задачу  управления   пространством   на   дис
кете. 
         Операционная  система  ДОС  использует  более  простой п
ервый 
         метод. 
              Если дискета  пуста,  то  все  доступное  на  ней  
место 
         представляет  собой  одну большую чистую область. Когда 
файлы 
         копируются на такую дискету, они оформляются  в  виде  у
добно 
         размещенных непрерывных фрагментов дискового пространств
а. Но 
         впоследствии, если файлы будут удлиняться, то  дополните
льное 
         место  будет выделяться в первых свободных кластерах, ко
торые 
         могут находится в любом месте дискеты. 
              Когда  файлы  копируются  на новую дискету и оставл
яются 
         без изменения, их размещение на дискете остается экономи
чным. 
         Но   если  создаются  или  удаляются  какие-либо  данные
,  то 
         использование места на дискете становится весьма запутан
ным. 
              Это  наиболее  вероятно  происходит,   когда   прог
рамма 
         создает  одновременно  два  файла.  Если  файлы увеличив
аются 
         параллельно, то их расположение на дискете обязательно  
будет 
         перемежающимся. 
              Изучение  динамики распределения пространства на ди
скете 
         может оказаться довольно интересным и  поучительным.  Ес
ли  у 
         Вас есть моя утилита Disklook, то можно изучать распреде
ление 
         пространства на  Вашей  дискете,  устанавливать  располо
жение 
         пространства  всех  файлов  и  проверять,  фрагментирова
но ли 
         пространство на диске. 
              Итак, схема распределения пространства на дискете в
  ДОС 
         довольно хороша, она равномерно использует все пространс
тво и 
         не требует нашего вмешательства. Однако, все эти преимущ
ества 
         достигаются  ценою  "размазывания"  файлов  по дискете. 
Из-за 
         этого может увеличиться  время  доступа  к  файлу,  поск
ольку 
         магнитная  головка  чтения/записи должна перемещаться по
 всей 
         дискете для поиска  нужных  дорожек.  Поскольку  обращен
ия  к 
         дискете являются наиболее медленными  операциями и  осно
вными 
         ограничивающими факторами  производительности  IBM/PC,  
такое 
         размещение  файлов может породить проблемы, хотя обычно 
этого 
         не случается. 
              По   этой   причине,   необходимо    уделять    вни
мание 
         потенциальной проблеме фрагментации пространства, занима
емого 
         файлами на дискете. Обычно  эти  проблемы  Вас  волноват
ь  не 
         будут,  но иногда они могут приобрести чрезвычайное знач
ение. 
         В  тех  случаях,  когда  фрагментация  файлов  покажется
  Вам 
         нежелательной,  скопируйте  файл  на  новую  дискету.  Э
то же 
         полезно делать, если  Вам  покажется,  что  дисковод  сл
ишком 
         долго выполняет поиск дорожек при чтении файла. 
              При  копировании  файлов  на  новую дискету можно з
аодно 
         улучшить их  последовательность,  разместив  в  начале  
часто 
         использующиеся  файлы  или  переставив  их в таком поряд
ке, в 
         каком Вам хотелось бы их видеть в распечатке  справочник
а.  В 
         некоторых   случаях   упорядочение   данных  может  оказ
аться 
         особенно    полезным:    файлы    на    дискете,     хра
нящей 
         корреспонденцию,  лучше  размещать в хронологическом пор
ядке, 
         для   дискеты    с    множеством    вспомогательных    ф
айлов 
         предпочтительнее   всего   алфавитный   порядок,   ускор
яющий 
         просмотр.  Полезно  бывает,  также,  упорядочивать  файл
ы  по 
         расширениям,  которые  обычно обозначают тип файла или с
пособ 
         его использования.  Такое  упорядочивание  можно  произв
одить 
         либо  вручную, ллибо с помощью какой-либо сервисной прог
раммы 
         (такого рода  программы  имеются  в  составе  пакета  "N
orton 
         Utilities" (служебные программы Нортона)). 
      
                 5.9.Формат текстового файла
                 
              Наиболее  часто  использующийся  и  один из самых в
ажных 
         форматов для файлов данных,  размещаемых  на  дискетах,-
  это 
         текстовый  файл  в  коде  ASCII. Такие файлы содержат об
ычную 
         алфавитную  информацию,  тексты  или  отчеты,  состоящие
   из 
         алфавитных символов. 
              Текстовые    файлы    являются,   вероятно,   наибо
льшим 
         приближением к универсальному формату для  всех  персона
льных 
         компьютеров.  Такой  формат  поддерживается практически 
всеми 
         персональными  компьютерами  и  имеет   множество   разл
ичных 
         применений. 
              Большинство  текстовых  редакторов,  включая и текс
товые 
         процессоры,   используют    текстовый    формат.    Реда
ктор, 
         поставляемый  в  составе  ДОС,  ЕDLIN,  создает  и испол
ьзует 
         текстовые файлы. 
              Текстовый формат  используется  для  хранения  исхо
дного 
         текста   программ   (исходной,  нетранслировавшейся  вер
сии). 
         Практически все языковые процессоры (такие как  интерпре
татор 
         языка БЕЙСИК, компилятор языка Паскаль или Ассемблер) ож
идают 
         ввода входного файла в текстовом формате в коде ASCII. 
              Интерпретатор языка БЕЙСИК для IBM/PC работает  с  
тремя 
         форматами  файлов  программ на языыке БЕЙСИК одним из ко
торых 
         является стандартный  текстовый  формат  в  коде  ASCII.
  Для 
         записи  программы  на  языке  БЕЙСИК  в текстовый файл в
 коде 
         ASCII нужно использовать ключ "А" в операторе SAVE: 
                 
                 10     SAVE "PROGRAM.BAS",А 
                 
              Файлы  пакетной  обработки,  одно  из  самых  мощны
х   и 
         полезных   вспомогательных  средств  ДОС,  также  хранят
ся  в 
         текстовом формате. 
              Чтобы понять структуру файлов, необходимо сначала п
онять 
         саму  кодировку, принятую в Американском стандартном код
е для 
         обмена информацией (ASCII). Код ASCII в основном  состои
т  из 
         кодов  символов.  Всем  символам  присваиваются  определ
енные 
         комбинации битов, например, код для заглавной буквы "А" 
будет 
         выражаться шестнадцатиричным числом 41. 
              Существует   128   различных   кодов  в  системе  A
SCII, 
         поскольку в ней используются  семибитовые  коды.  Больши
нство 
         компьютеров,   включая   IBM/PC,   используют   восьмиби
товую 
         кодировку  символов,  так  что  коды  ASCII  составляют 
 лишь 
         половину  из  ансамбля  256  возможных кодов. Для больши
нства 
         компьютеров, и для IBM/PC, коды  ASCII  занимают  первые
  128 
         кодов, от CHR$ (0) до СHR$ (127). 
              Вообще  говоря,  имеется  три  различных категории 
кодов 
         ASCII и две из них  будут  нас  интересовать.  Прежде  в
сего, 
         имеются    коды   ASCII,   соответствующие   буквам,   з
накам 
         препинания, цифрам и т.п. Это первая из категории кодов 
ASCII 
         и,  конечно,  они будут использоваться во всех наших раб
отах, 
         выполняемых с помощью персонального компьютера. 
              Следующую    категорию    я    бы    назвал    симв
олами 
         форматирования. Использование этих символов следует уже 
из их 
         названий, например, "возврат на  шаг",  "возврат  каретк
и"  и 
         "перевод   строки".   Форматирующие  символы  разрабатыв
ались 
         специально для управления устройством печати.  Эта  кате
гория 
         нам также понадобится и мы еще к ней вернемся. 
      
              Третью  категорию символов ASCII можно назвать симв
олами 
         связи.  Они  имеют  такие  имена  как   "начало-текста" 
  или 
         "конец-передачи"  и  используются  главным образом в кач
естве 
         управляющих  сигналов  при  использовании  кода   ASCII 
  для 
         передачи  информации  по  линиям связи. Эти символы позв
оляют 
         управлять процессами установления связи  и  передачи  да
нных. 
         Полное  разъяснение  назначения этих символов тесно связ
ано с 
         изложением принципов осуществления взаимодействия  по  л
иниям 
         связи,   что  не  входит  в  сферу  изложения  данной  к
ниги. 
         Поскольку эта категория символов не используется среди д
анных 
         или в структуре файлов, она больше не будет нас интересо
вать. 
              Подведем  некоторые  итоги: одна из трех категорий 
кодов 
         ASCII используется для кодировки  данных,  таких  как  б
уквы, 
         цифры   и   знаки   пунктуации.   Вторая   используется 
  для 
         форматирования, т.е., для указания  того,  где  заканчив
ается 
         одна  строка  и  начинается другая; эти коды  используют
ся не 
         только   для   управления   форматом   печати,   но   и 
  для 
         структурирования  файлов.  И,  наконец,  третья категори
я для 
         управления передачей данных и никак  не  связаны  с  фор
матом 
         текстовых файлов. 
              Обычные  символы  текста  в коде ASCII имеют значен
ия от 
         CHR$(32)  до  CHR$(126).  Символы  ASCII   двух   специа
льных 
         категорий  -  форматирующие  и  символы связи,- имеют ко
ды от 
         CHR$(0) до CHR$(31). Все эти коды должны  использоваться
  для 
         различных  управляющих  функций  и  они  обычно  использ
уются 
         отдельно от кодов  данных.  Если  Ваша  программа  попыт
ается 
         непосредственно  использовать  эти  коды,  могут  происх
одить 
         странные вещи. Некоторые ситуации описываются в приложен
ии 4. 
              Ниже приведены три простые программы  на  языке  Бе
йсик, 
         которые   демонстрируют  ряд  экспериментов  со  специал
ьными 
         кодами ASCII от 0 до 31: 
             
                 10 REM вывод на экран дисплея
                 20 FOR I=0 TO 31
                 30 PRINT CHR$(I)
                 40 NEXT I
                 10 REM вывод на печать
                 20 FOR I=0 TO 31
                 30 LPRINT CHR$(I)
                 40 NEXT I
                 10 REM манипулирование режимом экрана
                 20 DEF SEG=&HB800   'цветная графика
                 30 DEF SEG=&HB000   'монохромный
                 40 FOR I=0 NJ 31
                 50    POKE 1*2,I
                 60 NEXT I
                 
              Теперь рассмотрим текстовые  файлы  в  коде  ASCII.
  Это 
         файлы, содержащие текст, который состоит из обычных симв
олов, 
         например,   букв   алфавита.   Символы    текстового    
файла 
         организуются  в  строки, подобно тому как они записывают
ся на 
         бумаге. 
              Границы строк отмечаются форматирующими  символами 
 кода 
         ASCII: возврат каретки, CHR$(13), и перевод строки, CHR$
(10). 
         Можно было бы использовать любой символ для обозначения 
конца 
         строки, но используются именно эти два символа, поскольк
у они 
         управляют процессом перехода к  новой  строке  на  печат
ающем 
         устройстве. 
      
              Одна  из причин использования двух символов, обзнач
ающих 
         конец строки, состоит  в  обеспечении  возможности  нало
жения 
         строк.  Наиболее  часто  такая  возможность  используетс
я для 
         выполнения подчеркивания. При этом на печать в  конце  с
троки 
         выдается  только  возврат  каретки, а  затем  накладываю
щиеся 
         символы.  Поскольку  перевод  строки  не  выполнялся,   
новые 
         символы  печатаются  поверх  уже напечатанных. Такую опе
рацию 
         можно  произвести  с  печатающим  устройством,  но  нель
зя  с 
         дисплеем. 
              Таким    образом,    физические   команды,   необхо
димые 
         печатающему устройству для  завершения  строки,  использ
уются 
         также в качестве логических меток конца строки в файле. 
Такой 
         прием позволяет копировать текстовые файлы непосредствен
но на 
         печатающее  устройство,  причем  текст  будет распечатыв
аться 
         правильно. Вы можете сами проверить это, использовав  ко
манду 
         COPY для пересылки файла непосредственно на устройство п
ечати 
         или на зкран дисплея следующими командами: 
                 
                 COPY имя файла LPT1
                 COPY имя файла CON
                 
              Длина строки тектового файла  ничем  не  ограничива
ется, 
         строка  продолжается,  пока  не  встретятся  символы воз
врата 
         каретки и  перевода  строки.  Однако,  большинство  прог
рамм, 
         работающих  с  текстовыми  файлами, ограничивают длину с
троки 
         255 символами,  что  обычно  значительно  больше,  чем  
может 
         потребоваться  (некоторые  редакторы  и  текстовые проце
ссоры 
         ограничивают длину строки данных  таким  образом,  чтобы
  они 
         укладывались в строку экрана дисплея: 80 символов). 
              Формат   текстового   файла   определяется   не   т
олько 
         разделением на строки. Все файлы  в  коде  ASCII  имеют 
 один 
         общий   элемент  -  маркер  конца  файла,  значение  кот
орого 
         CHR$(26).  Этот  маркер  однозначно  указывает  конец  ф
айла. 
         Обнаружение   положения   кода   CHR$(26)   позволяет   
точно 
         установить размер файла, отличающийся от размера,  указа
нного 
         в справочнике. 
              С  клавиатуры  этот  специальный символ с кодом CHR
$(26) 
         можно  ввести,  нажав  клавишу  "Z"  и  удерживая  в  на
жатом 
         состоянии   клавишу  "CONTROL"  (управление).  Если  в  
любом 
         тексте,   связанном   с   персональными   компьютерами, 
  Вам 
         встретится  сочетание "CONTROL-Z", то имеется в виду  фу
нкция 
         конца файла, или значение CHR$(26) . 
              Кроме  описанных  трех  универсальных  кодов,   воз
врата 
         каретки,  перевода  строки  и  конца  файла, имеются и д
ругие 
         форматирующие коды ASCII, которые  используются  с  разл
ичной 
         интенсивностью.  Символ  табуляции (CHR$(9)) используетс
я для 
         замены  нескольких  пробелов,  следующих  один  за   дру
гим. 
         Поскольку  не  существует  общепринятого  количества  по
зиций 
         табуляции, этот символ используется не так широко, как  
можно 
         было бы ожидать. 
              Символ перевода страницы (CHR$(12)) обозначает пере
ход к 
         началу   новой   страницы.   Большинство   устройств   п
ечати 
         отрабатывает  этот  код  соответствующим  образом и неко
торые 
         программы редактирования используют его для разделения т
екста 
         на  страницы.  Использование  этого  символа  также дале
ко от 
         универсальности. Его стоит применять  только  для  управ
ления 
         устройством печати. 
      
              Программы    редактирования   и,   особенно,   текс
товые 
         процессоры требуют большего числа символов  форматирован
ия  и 
         они  определяют  собственные  коды для своих целей, таки
х как 
         отметка границ параграфов, подчеркивания  и  тому  подоб
ного. 
         Поскольку   универсальных   кодов   для   таких   функци
й  не 
         существует, их включение в текстовой файл не позволит  д
ругим 
         программам его использовать. 
              Прежде  чем  завершить  рассмотрение  текстовых   ф
айлов 
         необходимо  сделать  еще  ряд  замечаний,  касающихся об
ычных 
         символов  текста.  Любая   система   кодирования   опред
еляет 
         упорядоченную  последовательность  -  своего  рода эквив
алент 
         алфавитного порядка символов. В коде ASCII все обычные  
знаки 
         пунктуации  предшествуют  буквенным  кодам.  Заглавные  
буквы 
         располагаются перед строчными. Кроме того, в отличие от 
 кода 
         EBCDIC,   используемого   универсальными  компьютерами  
фирмы 
         "ИБМ", цифры располагаются перед буквами. 
              Коды заглавных букв отличаются от кодов строчных бу
кв на 
         32 (на 32 меньше). Этот факт можно использовать в  прогр
аммах 
         преобразования текстовых данных из верхнего регистра в н
ижний 
         или наоборот.
              
              
                 5.10. Форматы записей данных
                 
              После   текстовых   файлов   в   коде   ASCII   наи
более 
         распространены  файлы с фиксированной длиной записей. В 
таком 
         файле логические единицы  информации  называются  запися
ми  и 
         размер этих записей  одинаков  во  всем  файле.  Файлы т
акого 
         формата  создаются   интерпретатором   БЕЙСИКА   в   кач
естве 
         произвольных  файлов,  такой  же  формат  имеют  прямые 
файлы 
         Паскаля и другие нетекстовые  файлы.  При  выполнении  к
аждой 
         операции  чтения  или записи (обозначаемых в языке БЕЙСИ
К как 
         INPUT# и WRITE#) пересылается одна запись. 
              Если текстовые файлы включают  метки,  отмечающие  
концы 
         строк  и  конец  файла,  то  в  файле  с  фиксированой д
линой 
         записей, записи ничем не отделяются друг от  друга.  В  
таких 
         файлах хранятся только данные без каких-либо разделителе
й. 
              Поскольку записи в таком файле имеют  одинаковую  д
лину, 
         можно  использовать  простейшие арифметические вычислени
я для 
         определения места, где заканчивается одна запись и начин
ается 
         другая.   Служебные   программы   ДОС  для  чтения  и  з
аписи 
         информации в файл, описанные  в  главе  4,  используют  
такой 
         метод  как  при  последоваательном,  так  и  при произво
льном 
         обращении к файлу. Когда Ваши программы обращаются к  фа
йлам, 
         ДОС  выполняет  все  функции  поиска  записей,  так что 
Вашим 
         программам  не  нужно  заботится  ни  о  каких  подробно
стях, 
         связанных с поиском. 
              Рассмотрим пример. Если длина записей файла 100 и у
  ДОС 
         запрашивается  чтение  записи  с номером 24, то ДОС вычи
сляет 
         смещение в байтах  от  начала  файла  умножением  24  х 
 100. 
         Разделив  полученное  значение  2400  на  размер сектора
, 512 
         байт, получим частноее 4  и  остаток  352.  Это  значит,
  что 
         запись  расположена  в  пятом  секторе  файла (пропускаю
тся 4 
         сектора) со смещением 352 байта. 
              (Такой  способ  подсчета  предполагает,  что   нуме
рация 
         записей  начинается с нуля. Если номер первой записи еди
ница, 
         то необходимо сооветствующим образом изменить  формулу, 
 хотя 
         сам метод остается неизменным). 
      
              В файлах с фиксированной длиной записи ДОС не прихо
дится 
         заниматься выравниванием записей - они располагаются одн
а  за 
         другой.   Если   длина   записи   не   укладывается  точ
но  в 
         512-байтовый  размер  сектора,  то  некоторые  записи   
могут 
         размещаться  в  нескольких  секторах,  что  несколько сн
ижает 
         эффективность операций чтения и записи. 
              В нашем примере со 100-байтными записями, очередная
,  25 
         запись, частично  размещается  в  5-ом,  а  частично - в
 6-ом 
         секторе. Чтобы записать в файл эту запись, необходимо сн
ачала 
         считать, а затем записать обратно на диск два сектора. 
              Если Вы будете выбирать длину записи так, чтобы она
 была 
         кратна 512, то скорость чтения и записи несколько  повыс
ится. 
         ДОС,  однако,  позволяет  работать с записями разной дли
ны и, 
         если  не считать  некоторого   снижения   эффективности 
  при 
         чтении/записи записей, располагающихся в нескольких сект
орах, 
         Вам не нужно заботиться о размере записи. 
              Как  Вы,  вероятно,  догадались,  существует   множ
ество 
         других  форматов  файлов,  помимо текстовых файлов и фай
лов с 
         фиксированной длиной записи. Мы так подробно остановилис
ь  на 
         этих  двух  форматах  в  связи с их широким распростране
нием. 
         Другие  форматы  хранения  данных  обычно  имеют  структ
урные 
         требования, усложняющие процесс их чтения и записи, что 
может 
         потребовать использования специальных программ для  рабо
ты  с 
         ними. Существенное достоинство зтих двух форматов заключ
ается 
         в их гибкости - в самых различных ситуациях  -  так  что
  они 
         могут  использоваться  в  очень многих приложениях. Поск
ольку 
         они поддерживаются очень многими  программами,  в  том  
числе 
         различными  языковыми процессорами и операционными систе
мами, 
         их очень удобно использовать. На практике получается,  ч
то  в 
         связи  с  удобством  работы  с текстовым  форматом и  ши
рокой 
         поддержкой  его  различными  программами   редактировани
я   и 
         языками    программирования,    можно    обнаружить    с
лучаи 
         приспосабливания  форматов  данных  программ   к   текст
овому 
         формату в коде ASCII. 
                 
                 5.11. Форматы программных файлов.
                 
              Существует два формата файлов для хранения программ
. Для 
         них зареэервированы два расширения  имен:  ".COM"  и  ".
EXE". 
         Подробности  организации программных файлов потребуют по
лного 
         изложения организации ДОС, так что  мы  не  будем  сейча
с  их 
         описывать,  отметив  только  наиболее  важные моменты. (
Файлы 
         программ  БЕЙСИКА  с  расширением  ".BAS"  строго  говор
я  не 
         являются  программными  файлами  -  это файлы данных, ко
торые 
         считываются и используются интерпретатором БЕЙСИКА.) 
              Программные файлы типа COM  с  расширением  имени  
файла 
         ".COM"  -  это  непосредственно загружаемые программы. В
 этих 
         файлах хранится точный образ задач в том виде, в котором
  они 
         находятся  в памяти. Для них не требуется практически ни
какой 
         подготовки к запуску после их загрузки  в  память  средс
твами 
         ДОС.  Если  Вы  будете просматривать файл типа COM, напр
имер, 
         программой DiskLook, Вы увидите  команды  машинного  язы
ка  и 
         данные,  образующие  программу,  и  ничего  больше. Когд
а ДОС 
         подготавливает програму из файла типа COM к  выполнению,
  она 
         формирует специальный сегмент-приставку, необходимый для
 всех 
         программ,   загружает   программу,   устанавливает   рег
истры 
         сегментов,  присваивая  им  стандартные  значения, и пер
едает 
         управление программе. 
              Программные файлы типа EXE  с  расширением  имени  
файла 
         ".EXE"   несколько  отличаются  от  файлов  типа  COM.  
Чтобы 
         загрузить   их   для   выполнения   требуется    определ
енная 
         подготовка. Наиболее важная часть такой подготовки назыв
ается 
         перемещением. 
              Программа  может  содержать  адреса,  значения   ко
торых 
         должны  меняться  в зависимости от того, в каком месте п
амяти 
         находится программа. Если программе это не требуется, то
  она 
         называется  само-перемещаемой. Программы типа COM должны
 быть 
         само-перемещаемыми, а перемещение программ  типа  EXE  д
олжно 
         выполняться специальной программой ДОС - загрузчиком. 
              Программы  типа  EXE начинаются специальной двухбай
товой 
         меткой, 4D5A, которая используется  для  различения  про
грамм 
         разных типов. За этой меткой следует определенная управл
яющая 
         информация, включающая таблицу, указывающую какое переме
щение 
         необходимо. Далее размещается собственно программа. 
              Помимо  перемещения, во время загрузки для программ
 типа 
         EXE может быть определен сегмент стека.  Программы  типа
  EXE 
         могут  определять куда они должны загружаться - в верхню
ю или 
         в нижнюю часть доступной памяти. 
              В  связи  с  простотой  формата  COM,  можно   созд
авать 
         относительно  короткие  и  простые  файлы типа COM в маш
инных 
         кодах  непосредственно,   либо   с   помощью   программ 
  для 
         модификации  содержимого  файлов на дискетах, таких как 
DEBUG 
         или  SecMod,  либо  путем  написания  короткой  программ
ы  на 
         БЕЙСИКЕ,  которая  будет  записывать  байты программы пр
ямо в 
         файл типа COM. Такого рода программ создано уже очень мн
ого. 
              Формат типа COM проще, компактнее и быстрее  загруж
ается 
         в  память. Для программ, которым не нужны специальные ус
луги, 
         обеспечиваемые   форматом    типа    EXE,    предпочтите
льнее 
         использовать формат типа COM. 
                 
              Приложение 5.1. Текст программы анализа структуры
         справочника (Паскаль).
         
         
         const
         
           directory_sectors_single_sided=4;
           directory_sectors_double_sided=7;
           
           directory_entries_single_sided=64; {4*16}
           directory_entries_double_sided=112; {7*16}
           
           hidden_attribute              =wrd(2);
           system_attribute              =wrd(4);
           
           {=====================================================
===}
           
         type  
           
           directory_entry_type=
           
             record
             
               filename                 : string(8);
               extension                : string(3);
               attribute                : byte; {hidden=2; system
=4}
               reserved                 : array[1..10] of byte;
               creation_time            : word; {hour*2048+minute
*32+
                                                 secs}
               creation_date            : word; {(year-1980)*512+
                                                 month*32+day}
               starting_cluster_number  : word; 
               file_size                : array[1..2] of word;
               
             end;
             
         {=======================================================
===}    
         complete_directory_type=array[1..112] of directory_entry
_type;
         
              Приложение 5.2. Текст программы анализа структуры
         таблицы размещения файлов (Паскаль).    
         
         const
         
           minimum_cluster                 =    2;
           maximum_cluster_single_sided    =  314;
           maximum_cluster_double_sided    =  316;
           
           usual_fat_end_of_file           = 4095;
           minimum_fat_end_of_file         = 4088;
           
           bad_cluster_fat                 = 4087;
           
           single_sided_indicator_byte     =  254;
           double_sided_indicator_byte     =  255;
           
         {=======================================================
===}
         
         
         type
         
           fat_sector_type=array[0..511] of byte;
           
           fat_sector_structured_type=
             record
               scrambled_fat_pair: array[0..158]
         of
                 record
                   scrambled_byte_1 : byte;
                   scrambled_byte_2 : byte;
                   scrambled_byte_3 : byte;
                 end;
               unused_bytes_of_sector : array[1..35] of byte;
             end;  
               
             
         
                       Глава 6. ВЫБОРКА ИЗ ПЗУ
              
              
              Программы,   размещаемые   в   пассивном    запомин
ающем 
         устройстве (ПЗУ ) компьютера IBM/PC, определяют эффектив
ность 
         работы персонального компьютера в целом. В  данной  глав
е  мы 
         излагаем  самые общие сведения, касающиеся ПЗУ. Мы рассм
отрим 
         назначение   ПЗУ,   специфику   анализа    и    декодиро
вания 
         (реконструкции) хранящейся там информации и, наконец, ср
авним 
         между собой две первые версии ПЗУ компьютера IBM/PC. Все
  эти 
         материалы являются базой для последующих пяти глав, в ко
торых 
         функциональные  возможности  IBM/PC   рассматриваются   
более 
         детально. 
              Здесь  важно  иметь в виду три аспекта. Все о чем п
ойдет 
         речь в данной главе в полной мере относится только  к  I
BM/PC 
         и,  вообще  говоря,  не  распространяется  на  все  семе
йство 
         компьютеров, работающих под управлением MS-DOS. Для оста
льных 
         компьютеров  семейства  PC эти сведения следует рассматр
ивать 
         применительно  к  конкретному  компьютеру  (поскольку  к
аждой 
         модели  присущи  свои особенности). Тем не менее, имеютс
я все 
         основания  считать,  что  прерывания   или   вызовы   фу
нкции 
         обслуживания  для большинства компьютеров совпадают. Поэ
тому, 
         несмотря   на   возможное    изменение    адресов    про
грамм 
         обслуживания,  находящихся  в  ПЗУ  компьютера  той  или
 иной 
         модели материалы настоящей и последующих пяти глав  сохр
аняют 
         свою актуальность. 
              
              
               6.1. Организация ПЗУ и его использование
              
              
              Программы,   хранящиеся   в   ПЗУ,   представляют  
собой 
         чрезвычайно  важную  компоненту  IBM/PC,  поскольку  явл
яются 
         основой  управляющей  программы,  делающей  ПЭВМ  эффект
ивным 
         инструментом обработки данных. Сам факт их размещения  в
  ПЗУ 
         превращает эти программы в стабильный и надежный инструм
ент - 
         они не могут быть стерты  или  уничтожены.  Кроме  того,
  они 
         доступны   для   любой   программы,  выполняемой  на  IB
M/PC, 
         независимо от специфики используемой операционной систем
ы. 
              Большинство программ обслуживания,  размещаемых  в 
 ПЗУ, 
         допускают  перемещение. Эти программы написаны таким обр
азом, 
         что   при   необходимости   их   можно   легко   перемес
тить, 
         соответственно   перестроив   обращение   к   ним.  Спец
ифика 
         обращения к программам ПЗУ состоит в том, что их  активи
зация 
         производится всегда через систему прерываний. Изменив та
блицу 
         векторов прерываний, можно легко изменить точку  входа  
в  ту 
         или    иную   программу   обслуживания.   Эти   вопросы 
  уже 
         рассматривались нами при изучении материала главы 3. 
              Как уже говорилось выше,  все  пространство  памяти
  ПЗУ 
         компьютера IBM/PC делится на три части, под которые отво
дятся 
         старшие адреса миллионного пространства памяти. 
      
              Самые  старшие  адреса  памяти,  соответствующие  н
ачалу 
         параграфа  сегмента  с адресом FE20/16, и охватывающие 8
Кбайт 
         до конца памяти  отводятся  под  BIOS,  или  Базовую  Си
стему 
         Ввода-Вывода.Базовая  Система  Ввода-Вывода  (BIOS) выпо
лняет 
         все операции по обслуживанию периферийных  устройств  IB
M/PC, 
         таких  как дисплеи или накопители на гибких магнитных ди
сках. 
         Все    программы    операционой    системы,    обеспечив
ающие 
         функционирование  ПЭВМ  ориентируются  на использование 
BIOS. 
         Область памяти  ПЗУ,  содержащая  BIOS,  представляет  о
собый 
         интерес  для  тех,  кто  хотел  бы в полной мере использ
овать 
         возможности  IBM/PC.  В  последующих  пяти  главах  по  
 мере 
         рассмотрения  конкретных  функций  IBM/PC  мы  будем дет
ально 
         обсуждать  служебные   обращения   к   BIOS,   обеспечив
ающие 
         реализацию этих функций. 
              Справочное   руководство  по  техническому  обслужи
ванию 
         персонального компьютера содержит полный текст первой  в
ерсии 
         BIOS;  при  этом  комментарии хорошо поясняют, что делае
тся и 
         как делается; вопрос, почему  это  делается,  раскрыт  с
лабо. 
         Если  Вы  имеете  навыки  интерпретации  листингов  на  
языке 
         ассемблера, то при изучении листинга BIOS Вы получите  о
тветы 
         на любые вопросы о принципах функционирования ПЭВМ. 
              Вторая    часть    ПЗУ,    соответствует   параграф
у   с 
         шестнадцатеричным адресом F600 и занимает  32  Кбайт  па
мяти. 
         Она  содержит (хранит) программы интерпретатора языка Бэ
йсик. 
         В ПЗУ хранится ядро интерпретатора языка Бэйсик  для  IB
M/PC. 
         Все  кассетные  версии языка Бэйсик соответствуют Бэйсик
-ПЗУ; 
         основные функциональные возможности дисковой версии  Бэй
сика, 
         а  также расширенный Бэйсик (BASICA) фактически реализов
аны в 
         ПЗУ. Практически все, что делают две  указанные  выше  в
ерсии 
         Бэйсика  -  это расширение версии Бэйсик-ПЗУ. Соответств
енно, 
         Бэйсик-ПЗУ -  это  полная  версия  языка  Бэйсик,  содер
жащая 
         основные программы, требуемые для дисковых версий. 
              С  появлением  в  справочном руководстве по техниче
скому 
         обслуживанию текста программ BIOS не  имет  смысла  прив
одить 
         текст  программ  Бэйсик-ПЗУ;  однако  в ряде случаев мы 
будем 
         использовать фрагменты этой программы для иллюстрации ме
тодов 
         исследования содержимого ПЗУ. 
              Сама   по   себе  область  ПЗУ,  содержащая  Бэйсик
,  не 
         представляет особого  интереса,  однако  коль  скоро  в 
 этой 
         области расположено множество полезных программ, то поче
му бы 
         ими не воспользоваться в своей собственной разработке?  
Поиск 
         и  декодирование  нужных  фрагментов Бэйсика с последующ
им их 
         тщательным  документированием   представляет   собой   в
есьма 
         трудоемкую задачу, нами в данной работе не решаемую. 
              Подпрограмма    или    функция    Бэйсика   может  
 быть 
         непосредственно активизирована из  программы  пользовате
ля  с 
         помощью   механизма   прерываний.  В  главе  11  эти  во
просы 
         рассматриваются с необходимой полнотой. 
      
              Третий   и   последний   участок   ПЗУ   нами  здес
ь  не 
         рассматривается. Фирма IBM оставляет за собой право расш
ирять 
         состав  программ  ПЗУ;  пользователи также могут встраив
ать в 
         ПЗУ свои программы,  расширяя  таким  образом  функциона
льные 
         возможности IBM/PC. Дополнительные программы можно включ
ать в 
         любое место миллионного адресного пространства, однако  
блок, 
         начинающийся  с  шестнадчатиричного  адреса  параграфа F
400 и 
         занимающий 8Кбайт, вплотную  прилегающий  к  участку  па
мяти, 
         отведенного под Бэйсик специально выделен для таких прог
рамм. 
         Если  требуется  свыше  8Кбайт  памяти,  то  программу  
можно 
         сместить  в  область  памяти с более низкими адресами. И
менно 
         посредством включения в ПЗУ специализированных программ 
можно 
         превратить  IBM/PC в спкциализированный компьютер. Прежд
е чем 
         приступить к более глубокому изучению BIOS мы подемонстр
ируем 
         (в   двух   последующих   параграфах)   способы  исследо
вания 
         содержимого ПЗУ. 
              
              
              6.2. Анализ содержимого ПЗУ средствами программы DE
BUG 
              
              
              В  данной  главе  мы  рассмотрим   особенности   ан
ализа 
         программ  и  данных,  размещаемых  в ПЗУ. Несмотря на то
, что 
         предлагаемая  методика  ориентируется  главным   образом
   на 
         программы,  расположенные  в  ПЗУ,  она  может использов
аться 
         также и в случае программ,  хранящихся  на  дискете.  По
этому 
         все, о чем пойдет здесь речь применимо как к компонентам
 DOS, 
         расположенным на дискете, так и  к  компонентам,  входящ
им  в 
         состав других программ. 
              Доступ  к  любому  фрагменту  ПЗУ может быть осущес
твлен 
         также  средствами  Бэйсика  или  Паскаля.  Методы   адре
сации 
         объектов  памяти,  рассмотренные в главе 3, позволяют ра
ботая 
         на Бэйсике или Паскале, обратиться  к  любой  ячейке  па
мяти. 
         Ниже  приводится  пример  программы  на Бэйсике, отображ
ающий 
         содержимое ПЗУ. 
              
         100 REM     отображение фрагмента ПЗУ в шестн. формате  
   
         110 PARAGRAPH=&HF600
         120 DEF SEG=PARAGRAPH
         130 PRINT
         140 PRINT "Отображение содержимого параграфа",HEX$(PARAG
RAPH)
         150 PRINT
         160 PRINT "Десятичное       Шестнадцатеричное"
         170 PRINT "Смещение   Смещение   Содержимое ПЗУ";
         180 OFFSET%=0
         190   FOR LINES%=1 TO 16
         200     PRINT
         210     PRINT OFFSET%, HEX$(OFFSET%)   
              
              Хотя  приведенная  программа  позволяет  нам  судит
ь   о 
         содержимом  ПЗУ,  смысл даных остается "за кадром". Мы, 
таким 
         образом, подошли к очень важному и необходимому  инструм
енту, 
         поставленному в составе DOS - программе DEBUG. 
      
              Программа DEBUG позволяет осуществлять три вида дей
ствий
         вотношении содержимого  ПЗУ:  выборку  произвольного  уч
астка
         памяти  и  отображать  ее  содержимое  в  двух  форматах
              1)шестнадцатеричный / ASCII.      
              2)формат не связанный с деассемблированием.
              Программа   DEBUG  может  быть  также  использована
  для 
         исследования программ, хранящихся  на  дискете.  В  посл
еднем 
         случае, правда, представляется более эффективным использ
овать 
         программу Disklook,  записанную  на  дискету,  прилагаем
ую  к 
         данной  книге или программу SecMod входящую в состав про
грамм 
         Norton Utility. Прежде чем двигаться  дальше,  поясним  
смысл 
         термина "деассемблирование". 
              Программы,  представленные  на  языке  машинных  ко
манд, 
         чрезвычайно  сложны  для  восприятия человеком. Даже в с
лучае 
         компьютеров, имеющих  сравнительно  простой  формат  маш
инных 
         команд, этот язык весьма сложен для понимания. Микропроц
ессор 
         8088 регламенитрует очень сложную  структуру  языка  маш
инной 
         команды.  Это  положение  справедливо в отношении больши
нства 
         микропроцессоров - их проектировщики жертвуют  простотой
  для 
         достижения  максимальной  производительности  и  компакт
ности 
         кода.  Вследствие  этого,  требуется  приложить  значите
льные 
         усилия для просмотра и понимания листинга, представленно
го на 
         языке машинных команд в шестнадцатеричном коде. 
              Процесс  деассемблирования, реализуемый программой 
DEBUG, 
         значительно облегчает поцедуру интерпретации машинного я
зыка. 
         Деассемблирование - это  процесс  трансляции или преобра
зования 
         инструкций  машинного  языка,  представленных  в   абсол
ютном 
         шестнадцатеричном   виде   в   символическую   нотацию  
языка 
         ассемблера. Так, например, на языке ассемблера можно зап
исать 
         INC   AX  (увеличить  содержимое  регистра  AX  на  един
ицу); 
         ассемблер переведет эту конструкцию  в  команду  на  маш
инном 
         языке  с  кодом  40/16.  Функция  деассемблера состоит в
 том, 
         чтобы привести команду машинного языка с кодом 40/16  об
ратно 
         к виду INC AX. 
              Шестнадцатеричный  код  40 сравнительно легко может
 быть 
         преобразован и вручную,  при  наличии  таблицы  кодов  к
оманд 
         микропроцессора  8088.  С большинством кодов остальных к
оманд 
         дело обстоит не так просто, поскольку в  ряде  случаев  
смысл 
         команды  изменяется  в  зависимости  от  значения  кокнр
етных 
         битов. В случае использования команды  DEBUG  все  запут
анные 
         случаи   декодирования   преодолеваются   в  режимах  ко
манды 
         деассемблирования. 
              Несмотря   на   то,   что  деассемблер  может  выпо
лнить 
         преобразование  команд  машинного  языка  к   более   уд
обным 
         командам  языка  ассемблера,  целый  ряд  весьма существ
енных 
         компонентов  программы,  написанной   на   языке   ассем
блера 
         реконструкции  не  поддается.  Так,  очевидно,  не могут
 быть 
         восстановлены весьма полезные комментарии программиста. 
Кроме 
         того,  не  представляется возможным восстановить оригина
льные 
         символические имена адресов памяти. 
              Таким образом, вместо оригинальной авторской констр
укции 
         типа 
              IMP FINISH; выполнено, перейти к завершающей процед
уре
         деассемблер сгенерирует строку вида
                             IMP  OE6C
      
              Пользователь видит перед собой команду перехода,  о
днако 
         ее смысл остается для него неясным. 
              Деассемблер,   безусловно,   не  в  состоянии  полн
остью 
         заменить программиста, особенно, в том, что  касается  с
мысла 
         деассемблируемой   программы.   Но  он  существенно  упр
ощает 
         задачу,  когда  предъявляет  пользователю  команду,  а  
также 
         помогает   отличить  область  памяти,  содержащую  данны
е  от 
         области памяти, содержащую команды. 
              Для иллюстрации особенностей исследования  программ
  ПЗУ 
         возьмем  программу Бэйсика и используем ее в качестве об
ъекта 
         приложения программы DEBUG. Все дополнительные сведения 
будут 
         сообщены  ниже, либо проясняться в ходе рассмотрения при
мера. 
         Для детального изучения программы DEBUG - следует внимат
ельно 
         прочесть  сответствующие  разделы руководства по операци
онной 
         системе; этот материал  не  прост  для  усвоения,  однак
о  он 
         содержит многие важные технические детали. 
              Для пользователей, не работавших с программой (кома
ндой) 
         DEBUG,  сообщим  некоторые  дополнительные  сведения. По
добно 
         остальным командам, эта команда запускается путем  набор
а  на 
         клавиатуре ее имени. В процессе ее выполнения запосам на
 ввод 
         исполнительных операторов предшествуют лишь  "тире":  об
ычный 
         запрос  операционной  системы  (символ  "А") в этом случ
ае не 
         используется. 
              Большинство  действий с программой DEBUG отображают
ся на 
         экране дисплея, однако  может  возникнуть  потребность  
в  их 
         распечатке для последующей работы. Собственно программа 
DEBUG 
         не выводит результаты своей работы на принтер. 
              В этой связи, однако, следует напомнить, что  сущес
твует 
         два способа получить твердую копию. Первый способ заключ
ается 
         в использовании для копирования текущего кадра клавиши  
PrtSc 
         (Печатать    содержимое   экрана);   второй   -   состои
т   в 
         использовании    принтера    для    эхо-отображения     
путем 
         одновременного нажатия клавиш Ctrl и PrtSc. 
              Итак,  мы  приняли  решение об исследовании участка
 ПЗУ, 
         содержащего Бэйсик; нам также известно, что адрес начала
 этой 
         программы соответствует шестнадцатеричному адресу F600. 
Можно 
         запускать программу DEBUG  и  приступать  к  непосредств
енной 
         работе с этой программой. 
              Предположим  теперь,  что  адрес  объекта  наших по
исков 
         (F600) нам неизвестен. В этом случае поиск  может  вести
сь  в 
         двух  направлениях.  Первое  -  это  методичное использо
вание 
         операции D (означающее "дамп" или "отображение") до тех 
 пор, 
         пока  не  появится  что-нибудь  интересное.  Второе  -  
более 
         эффективное направление - состоит  в  предъявлении  прог
рамме 
         DEBUG  образца  объекта,  который,  по  нашему  мнению д
олжен 
         находиться в памяти. 
              В  качестве  образца объекта поиска выберем сообщен
ие об 
         ошибке,  выдаваемое   Бэйсиком:   "Illegal   Function   
call" 
         (Неверный  вызов  функции).  На  рис  6.1  показана проц
едура 
         запуска программы DEBUG и  оператор  поиска  указанного 
 выше 
         сообщения  программы Бэйсик. Предположим, для определенн
ости, 
         что в качестве начального адреса просмотра (поиска) прог
рамме 
         DEBUG  был передан адрес параграфа F000 (лежащий немного
 ниже 
         адреса   начала   Бэйсика),   а    также    размер    (д
лина) 
         просматриваемого  учестка  (L)  равный  65535 байтам (`F
FFF'в 
         шестнадцатеричной   системе   счисления).   Программа   
DEBUG 
         сообщает,  что  интересующий нас текстовой объект найден
. Это 
         сообщение формируется в форме сегментированного адреса  
F000: 
         63F4,  означающего,  что  относительно параграфа F000 бе
рется 
         шестнадцатеричное  смещение  63F4.  Выполнив   действия 
  над 
         адресами, мы получим полный 20-байтовый адрес. 
         
                              F000
                           +
                               63F4
                           _____________
                              F63F4
              
                     A  >   DEBUG
              
                     -  S F000 : 0000  L  FFFF  "Illegal Function
 call"
              
                     F000 : 63F4
              
              Рис. 6.1. Запуск программы DEBUG и поиск сообщения
              
              
              Значение  адреса  искомого  текстового  объкта гово
рит о 
         том,  что  найденное  сообщение   расположено   недалеко
   от 
         начального    параграфа   размещения   Бэйсика   F600.  
 Если 
         представить 20-ти  битовый  адрес  F63F4  в  сегментиров
анном 
         виде, используя в качестве базы параграф F600, то будем 
иметь 
         адрес F600:03F4. Таким  образом,  относительное  смещени
е  от 
         начала Бэйсика составляет только 3F4/16 или 1012/16 байт
ов. 
              Вводя  команду D F600 : 03E0 (вывод на экран содерж
имого 
         области памяти, начиная  с  адреса  -  т.е.  области  па
мяти, 
         начинающейся   несколько   раньше   найденного   сообщен
ия  - 
         относительно базового адреса параграфа F600) можно отобр
азить 
         содержимое   близлежащего  пространства  памяти,  включа
ющего 
         область найденного сообщения.  На  рисунке  6.2.  предст
авлен 
         результат выполнения этой команды. Программа DEBUG вывод
ит на 
         устройство отображения -  в  шестнадцатеричном  и  симво
льном 
         (ASCII)  форматах - содержимое участка памяти длиной 80 
байт, 
         причем этот участок памяти содержит  искомое  сообщение.
  Нам 
         таким  образом  представлено искомое сообщение, а также 
целый 
         ряд других сообщений об ошибках Бэйсика, т.е. именно то,
  что 
         -  как  предполагалось - должно находиться где-то поблиз
ости. 
         При необходимости с помощью программы DEBUG можно  продо
лжить 
         отображение  на экране последующих участков памяти; для 
этого 
         следует ввести команду D, не указывая адреса начала ячей
ки. 
              
              Рисунок 6.2. иллюстрирует  ряд  возможных  особенно
стей, 
         которые  следует иметь в виду, используя команду "D" в р
амках 
         программы DEBUG. Одна из этих особенностей состоит в том
, что 
         в   левую  часть  поля  вывода  помещается  шестнадцатер
ичная 
         информация, а в правую -  информация  в  коде  ASCII.  В
торая 
         особенность  заключается  в  том,  что  кодовая комбинац
ия не 
         имеющая символьного представления в коде ASCII изображае
тся в 
         правой   части   поля  вывода  с  помощью  точки.  Отсюд
а,  в 
         частности,  вытекает  важное  следствие:  для   того,   
чтобы 
         использовать    эхо-печать   программа   DEBUG   контрол
ирует 
      
         поступающие  на  ее  вход  кодовые  комбинации,  не   им
еющие 
         представления   в  коде  ASCII;  эти  комбинации  могут 
 быть 
         восприняты принтером в качестве управляющего кода. Вслед
ствие 
         этого,  нельзя  расчитывать,  что  правая  часть  поля в
ывода 
         (информация в коде ASCII) будет давать  объективную  кар
тину. 
         Все,   что   может  быть  приведено  к  стандартным  печ
атным 
         символам, или является печатным символом (со старшим бит
ом  в 
         единичном  состоянии)  будет  отпечатано, все остальное 
будет 
         преобразовано в точки.(Здесь уместно заметить, что  прог
рамма 
         DiskLook,  входящая  в состав пакета программ, записанно
го на 
         дискету, прилагаемую к настоящей книге, отображает в точ
ности 
         все  шестнадцатеричные  коды  и коды ASCII, поскольку вы
водит 
         информацию только на экран и не использует эхо-печать). 
              До  сих пор мы рассматривали способы отображения да
нных, 
         или поиска априори  известных  данных,  хранящихся  в  П
ЗУ  с 
         помощью  программы  DEBUG.  Ниже  мы будем решать сущест
венно 
         более   сложную   задачу   -   задачу   деассемблировани
я   и 
         интерпретации программного кода на машинном языке. 
              
              
              6.3. Анализ содержимого ПЗУ - метод деассемблирован
ия
              
                
              Наш  следующий  шаг  в   решении   задачи   исследо
вания 
         содержимого  ПЗУ  и  использования  программы DEBUG сост
оит в 
         знакомстве  с   особенностями   процесса   деассемблиров
ания. 
         Команда  "U" программы DEBUG - означает "деассемблирован
ие" - 
         осущеcтвляет  преобразование  произвольных  кодов  памят
и   в 
         мнемонические  коды  языка ассемблера. Деассемблер реали
зует: 
         перевод абсолютных шестнадцатеричных кодов программ,  в 
 коды 
         команд на языке ассемблера (например: AX или DS). Деассе
мблер 
         не делает две вещи. 
              Первое. Деассемблер не интерпретирует смысл програм
мы  и 
         не  обучает пользователя. Для понимания листинга, выдава
емого 
         деассемблером, необходимо либо знать  язык  ассемблера, 
 либо 
         иметь   желание   покопаться   в  справочном  руководств
е  и, 
         установив смысл мнемонических обозначений, постараться п
онять 
         суть  дела.  (Для этой цели могут быть использованы след
ующие 
         источники:  "Руководство  по  языку  ассемблера  фирмы  
IBM", 
         справочники  по  системе  команд  микропроцессора  8086/
8088, 
         такие как "Учебное пособие по микропроцессору  8086"  С.
Морса 
         или "Описание микропроцессора 8086" Ректора и Алекси). 
              Для   понимания   программы  на  языке  ассемблера 
 (или 
         программы, приведенной к  языку  ассемблера),  знания  о
дного 
         языка   Ассемблер   недостаточно,   необходимо   также  
иметь 
         некоторое   представление   о    функциональной    ориен
тации 
         программы. 
              Постижение  пограммы  представляет  собой  занимате
льное 
         умственое упражнение, своего рода  головоломку.  Со  вре
менем 
         эта  процедура  становится все проще и проще, отчасти по
тому, 
         что времени на поиск смыслового описания команды  уходит
  все 
         меньше  и  меньше,  а  отчасти потому, что усваиваются п
риемы 
         программирования на ассемблере и  способы  достижения  ц
елей. 
         Далее мы остановимся на этих вопросах более подробно. 
              Второе, что не под силу  программе  деассемблера  -
  это 
         установка  так называемой абсолютной синхронизации. Изве
стно, 
         что  команды  машинного  языка  для   микропроцессора   
INTEL 
         8086/8088 имеют переменную длину - от одного до шести ба
йтов. 
         После  того  как  деассемблеру  сообщена  конкретная  по
зиция 
         памяти  он  приступает  к процедуре прямого декодировани
я, не 
         отличая кодов команд от данных. Достаточно ошибиться в в
ыборе 
         исходной  позиции  памяти  (например,  попасть  не на гр
аницу 
         между командами или в область данных)  и  результат  ока
жется 
         неверным. 
              Если  начальная точка набора команд известна, то ни
каких 
         проблем  не  возникает.   Если   какие-либо   предварите
льные 
         сведения   отсутствуют,   то   следует  провести  необхо
димое 
         исследование. Первое, что необходимо сделать  -  это  вы
брать 
         исходную   точку   в   наборе  команд  и  запустить  опе
рацию 
         деассемблирования. После этого  следует  предпринять  по
пытку 
         интерпретировать    результат   работы   деассемблера.  
 Если 
         осмысленные программные участки отсутствуют (ниже мы при
водим 
         некоторые  соображения  по их выявлению),то следует повт
орить 
         процедуру, сместив начальную точку на один, два или три 
байта 
         по  отношению к предыдущей попытке. Мы таким образом пыт
аемся 
         отыскать точку синхронизации,  расположенную  на  стыке 
 двух 
         команд, после чего может быть восстановлен оригинальный 
набор 
         команд.  Если  очередная  попытка  закончилась  неудачно
,  то 
         следует попробовать еще раз. 
              Поскольку большинство команд имеют длину  один  или
  два
         байта,  то точку синхронизации отыскать как правило несл
ожно.
         Кроме    того,    необходимо    учитывать,    что    про
цессу
         деассемблирования присущ элемент самосинхронизации. Даже
 если
         в качестве  начальной  точки  для  деассемблирования  вы
брана
         точка,  расположенная внутри команды, то часто случается
, что
         процесс деассемблирования при обработке  последуюющих  к
оманд
         самопроизвольно попадает в нужную точку. После этого все
 идет
         гладко, по крайней мере  в  сторону  увеличения  адресов
.  (В
         обратную сторону это приходится делать вручную).
              Выполняя    деассемблирование    программы    необх
одимо 
         внимательно следить за  данными  (это  нечто  противопол
ожное 
         командам),   которые  деассемблер  превращает  в  причуд
ливые 
         ассемблерные конструкции. Основной и наиболее быстрый  с
пособ 
         обнаружения  данных  состоит в использовании команды "D"
, для 
         представления информации  в  шестнадцатеричном  коде  и 
 коде 
         ASCII.  Здесь  в  первую очередь следует обращать вниман
ие на 
         самые   очевидные   вещи    -    содержательно    осмысл
енную 
         последовательность  символов  ASCII (фразы), такую, напр
имер, 
         как "неверный вызов функции". После этого можно приступа
ть  к 
         выявлению более тонких признаков данных. 
              В обычных программах (т.е. в программах, размещаемы
х вне 
         ПЗУ) наличие  полей,  заполненных  шестнадцатеричными  н
улями 
         является  признаком  рабочей  области  данных,  то есть 
такой 
         области,  которая  будет  использоваться  в  ходе  выпол
нения 
         программы;  в  процессе деассемблирования данные этой об
ласти 
         неактуальны. ПЗУ не может использоваться для хранения ра
бочих 
         данных,  поскольку  запись  в  эту  память  невозможна. 
Таким 
         образом, наличие полей, состоящих из шестнадцатеричных  
нулей 
         нетипично для ПЗУ-программ. 
      
              Признаком  возможного  наличия данных являются байт
ы или 
         двухбайтовые слова,  для  которых  второй  или  старший 
 байт 
         содержит 0 или F. Дело в том, что значительное число кон
стант 
         программ  являются  малыми  числами,   положительными   
(т.е. 
         начинающихся  с  0), либо отрицательными (т.е. начинающи
хся с 
         F).  Если   будет   обнаружена   последовательность   ба
йтов, 
         удовлетворяющая  этим  требованиям,  то  весьма вероятно
, что 
         найдена область памяти, используемая для хранения одного
  или 
         двухбайтовых  чисел.  Эта  часть программы не может соде
ржать 
         команды. 
              Пытаясь  осмыслить   структуру   листинга,   выдава
емого 
         деассемблером,  необходимо  иметь в виду следующие полож
ения. 
         Обычные  программы,  прошедшие  этап  редактирования  св
язей, 
         будут хранить команды в одном месте, а данные в другом. 
Такой 
         подход является элементом  хорошего  стиля  программиров
ания; 
         именно  так  работает  редактор  связей дисковой операци
онной 
         системы.  Описанный  принцип  характерен  для  программ 
 всех 
         типов,  однако  для программ типа EXE он справедлив в бо
льшей 
         степени  чем  для  программ  типа  COM.  С  другой   сто
роны, 
         ПЗУ-программы,  подобные  тем,  которые  рассматривались
 нами 
         выше,  часто   разрабатываются   вне   концепций   техно
логии 
         программирования.  Данные  в  этих программах могут след
овать 
         вперемешку с командами. 
              Если  предположительно  обнаружен  участок  програм
мы, в
         котором  вслед  за  командами  следуют  некоторые  данны
е, то
         существует по крайней мере один достоверный  способ  отл
ичить
         конец  последовательности  команд  от  расположенных всл
ед за
         ними  данными,  и  таким   образом   избежать   необходи
мости
         рассматривать   недостоверный   протокол   деассемблиров
ания.
         Последняя  команда  фактического  участка  программы   д
олжна
         представлять собой ту или иную разновидность команды пер
ехода
         или  ветвления.  Команды  ветвления  включают  любые  ко
манды
         переходов,   кроме  команд  условных  переходов.  В  кач
естве
         общеупотребительной  команды  завершения  программы   пр
инято
         использовать  команду  возврата  (RET)  (возврат из вызв
анной
         ранее подпрограммы).
              Могут использоваться также и команды CALL (Вызов) и
  INT
         (Прерывание);   хотя  их  использование  в  качестве  ко
манды
         завершения последовательности команд  встречается  доста
точно
         редко.
              Существует ряд особенностей, на которые следует обр
ащать
         внимание  при  решении  вопроса  подлинности   предъявле
нного
         участка  программы  после  его  деассемблирования.  В  п
ервую
         очередь следует обратить внимание на  используемые  реги
стры.
         Если  операции  реализуются  на  регистрах,  используемы
х как
         правило для выполнения арифметических операций  (AX  или
  AL,
         AH;BX  или  BL, BH; CX или CL, CH; DX или DL, DH), но ни
какие
         действия в отношении результата не  предпринимаются,  то
  это
         вызывает  подозрение.  Здесь следует быть более внимател
ьным.
         Один  из  результатов  выполнения   арифметических   опе
раций
         состоит  в  установке  флагов  -  следовательно,  естест
венно
         ожидать наличие команд условных переходов по состоянию ф
лага,
         таких   как  JNC  (команда  перехода  по  условию  отсут
ствия
         установленных битов флага).
              Рассмотрим аспект некорректности использования реги
стров
         в   реконструируемой   программе.   Программы  не  испол
ьзуют
         регистры   некоторым   хаотичным   образом   -   им   пр
исуща
         определенная  дисциплина.  Поэтому весьма непривычно, ск
ажем,
         видеть загрузку или  непосредственную  ссылку  на  сегме
нтные
         регистры  -  особенно  сегментный  регистр  программы  (
CS) и
         сегментный  регистр  стека  памяти  (SS).  Загрузка  сег
мента
         регистра  данных  (DS)  более  вероятна, но также встреч
ается
         редко. С другой стороны,  дополнительный  сегментный  ре
гистр
         (ES)  практически постоянно используется программами, по
этому
         его загрузка - дело обычное. Если загрузка регистра CS и
ли SS
         все-таки обнаружена, то это должно быть сделано в програ
ммной
         секции,  формирующей   операционную   структуру   выполн
яемой
         программы;  в  этом случае вероятнее всего, что в одном 
месте
         будет произведена загрузка нескольких сегментных регистр
ов, в
         частности, CS, SS и DS.
              Попытка    реконструировать   программу   по   лист
ингу,
         выданному деассемблером или даже просто попытка  убедить
ся  в
         подлинности  предъявленного набора команд, представляет 
собой
         захватывающее умственное  упражнение.  Для  этого,кстати
,  не
         требуется  специальная  подготовка.  Как  правило, доста
точно
         бывает просто здравого смысла. Усвоив все наши рекоменда
ции и
         приобретя    некоторые    практические    навыки,   Вы, 
  при
         необходимости,  сможете  все  это  проделать.   В   след
ующем
         параграфе мы выполним декодирование (реконструкцию) прог
раммы
         Бэйсик-ПЗУ; читатель, таким образом, получит представлен
ие  о
         том,  как  это  делается  и  убедится в том, что это не 
очень
         сложно.
              
              
              6.4.    Анализ    содержимого   ПЗУ   -   реконстру
кция
         интерпретатора
                
              
              В качестве примера попробуем  деассемблировать  фра
гмент 
         Бэйсик-ПЗУ.  Начнем  с  исходного параграфа, т.е. парагр
афа с 
         адресом  F600(16).  На  рисунке  6.3  представлен   резу
льтат 
         деассемблирования  первых 32 байтов. Шестнадцатеричные н
ули в 
         конце  фрагмента  программы  (преобразованы  деассемблер
ом  в 
         команды   ADD   (Сложить))  представляют  собой  данные.
  Они 
         "хорошо" иллюстрируют высказанное ранее положение о том,
  что 
         нулевые   данные   нетипичны  для  ПЗУ-программ.  Команд
а  DB 
         (определить байт), предшествующая полю нулей,  появилась
  как 
         реакция  деассемблера на кодовую комбинацию, которая не 
может 
         быть преобразована  в  команду  ассемблера  (такая  ситу
ация, 
         благодаря   широкому   набору  команд,  встречается  дов
ольно 
         редко). Итак, являются ли все  данные,  которым  предшес
твует 
         команда   безусловного   перехода   собственно   осмысле
нными 
         командами? Предварительный ответ на этот  вопрос  может 
 быть 
         положительным,    поскольку    для    завершения   выпол
нения 
         подпрограммы используется команда возврата  (RET).  Пока
  все 
         идет хорошо. 
      
              Можно ли приписать какие-то осмысленные действия  п
ервым
         пяти   командам  деассемблированной  программы?  Эти  ко
манды
         выглядят несколько странно, поскольку  начинаются  с  ко
манды
         безусловного  перехода  (JMP).  Большинство программ, од
нако,
         первым  делом  выполняют  ряд  действий  настроечного  п
лана,
         обращаясь для этого посредством команд вызова подпрограм
м или
         переходов, к нужным процедурам.  Таким  образом,  безусл
овный
         переход  в  начале  программы  -  каким  бы причудливым 
он не
         казался - не такая уж бессмыслица. Следующие четыре кома
нды -
         две  пары  обращения к подпрограммам с последующими кома
ндами
         возврата в процедуру не  особенно  понятны,  но,  по  кр
айней
         мере,  не противоречат друг другу и могут в какой-то  ст
епени
         служить признаком наличия последовательности  команд.  М
ожно,
         следовательно, сделать предположение о том, что мы имеем
 дело
         с реальной последовательностью команд.
              Из  того,  чем  мы  располагаем  -  даже при том, ч
то на 
         рисунке 6.3 представлена реальная последовательность ком
анд - 
         вряд  ли  можно  извлечь  какую-то пользу. Только пять к
оманд 
         почти ничего не совершающих. 
              И   все-таки  есть  ряд  интересных  моментов.  Есл
и  это
         действительно реальная последовательность, то нам назван
ы три
         адреса,  где могут оказаться вещи более интересные. Речь
 идет
         об адресе в  команде  перехода  и  адресах  двух  послед
ующих
         каманд  обращения к процедуре. Следует ли нам пойти по а
дресу
         перехода?  Деассемблер  дает  нам  этот  адрес  (относит
ельно
         начала нашей программы, т.е. адреса F600/16) - FE92/16.
              Выполним  деассемблирование  небольшого  участка па
мяти,
         начинающегося с этого адреса (результат приведен на рис 
6.4.)
              
              
              
              -U F600:0000
              F600:0000 E98F7E          JMP          7E92
              F600:0003 E8A76B          CALL         6BAD
              F600:0006 CB              RET          L
              F600:0007 E80265          CALL         650C
              F600:000A CB              RET          L
              F600:000B C1              DB           C1
              F600:000C 0000            ADD          [BX+SI],AL
              F600:000E 0000            ADD          [BX+SI],AL
              F600:0010 0000            ADD          [BX+SI],AL
              F600:0012 0000            ADD          [BX+SI],AL
              F600:0014 0000            ADD          [BX+SI],AL
              F600:0016 0000            ADD          [BX+SI],AL
              F600:0018 0000            ADD          [BX+SI],AL
              F600:001A 0000            ADD          [BX+SI],AL
              F600:001C 0000            ADD          [BX+SI],AL
              F600:001E 0000            ADD          [BX+SI],AL
              
              
              Рис. 6.3. Деассемблирование начального участка Бэйс
ика
      
              Похоже,  мы  попали  в  точку.  Во-первых,  перед  
 нами
         совокупность    осмысленных    команд,   не   содержащая
   ни
         последовательностей  операторов  DB,  ни  последовательн
остей
         операторов   ADD.Во-вторых,  эти  команды  весьма  напом
инают
         команды  настройки.Об этом говорит прежде всего команда 
 CLI,
         (CLI (Clear interrupt flag) - очистка флага прерывания).
              Прерывание    в    микропроцессоре    INTEL    8086
/8088
         воспринимается по завершении  выполнения  некоторой  ком
анды.
         Немаскируемое   прерывание   в   общем  случае  обслужив
ается
         непосредственно после выполнения текущей команды.  Преры
вание
         по вектору воспринимается только тогда, когда разряд IF 
(флаг
         прерывания) в регистре FLAGS имеет значение,  равное  1.
  Для
         того,   чтобы   микропроцессор   8086  воспринял  прерыв
ание,
         необходимо выполнение следующих трех условий:
              1) разряд  IF  регистра  FLAGS  должен  иметь  знач
ение,
         равное 1 (для прерываний по вектору);
              2)  разряд разрешения прерываний в интерфейсе устро
йства
         должен находиться в состоянии "Прерывание разрешено";
              3) интерфейс  должен  зафиксировать  некоторое  соб
ытие,
         вызывающее   прерывание   (например,  поступление  симво
ла  с
         клавиатуры,  готовность  к   выводу   символа   на   дис
плей,
         завершение   передачи   блока   данных   с   диска   и  
т.п.)
         (Прим.перев.)).
   ?     которая,  как  мы  видели в главе 3 используется как сре
дство
         блокировки прерываний; таким образом  вся  последователь
ность
         выполнения расположенных ниже команды прервана быть не м
ожет.
         Именно  такая  последовательномть   команд   характерна 
  для
         начальных   аргументов   ответственных   программ,  поск
ольку
         значения  сегментных  регистров  целесообразно  устанавл
ивать
         одновременно с обработкой прерываний.
              Ниже  производятся  как  раз  те  действия, о котор
ых мы
         говорили выше, а именно:  загрузка  сегментных  регистро
в.  С
         помощью   четырех   команд  MOV  (команды  пересылки  да
нных)
         осуществляется загрузка трех сегментных регистров из чет
ырех:
         DS,  ES  и  SS. Загрузка этих регистров осуществляется в
есьма
         редко, поэтому естественно это  сделать  один  раз  в  н
ачале
         программы.  (Сегментный  регистр программы CS к этому мо
менту
         уже загружен ( F600 : 0000, рис. 6.3.).
              Вслед за  группой,  состоящей  из  четырех  команд 
 MOV, 
         осуществляющих  загрузку  сегментных  регистров,  следуе
т две 
         команды, выполняющие одну логическую операцию. Первая ко
манда 
         -  это  команда "исключающего ИЛИ" XOR - заносит в регис
тр AL 
         значение   "нуль"   (поскольку   в   результате    приме
нения 
         "исключающего  ИЛИ"  к  эквивалентным данным образуется 
новая 
         величина),  а  вторая  команда  заносит   эту   величину
   по 
         конкретному адресу. 
              Программа  не  содержит  никаких  сведений  относит
ельно 
         содержательной интепретации  этих  операций,  но  это  в
полне
         осмысленное сочетание команд, выполняющих конкретную фун
кцию.    
              Если  бы  мы  располагали  более  полной  информаци
ей об 
         особенностях  работы  Бэйсика,  то  нам,  вероятно,  был
о  бы 
         известно,  что  нулевая  величина,  пересылаемая  в  пам
ять с 
         помощью двух двух последовательных команд представляет  
собой 
         переключатель   предохраняющий   защищенные   программы.
  При 
         загрузке защищенных программ,  написанных  на  языке  Бэ
йсик, 
         этот  переключатель  устанавливается  с  целью предотвра
щения 
         выдачи их  на  печать.  Это,  однако,  никак  не  следуе
т  из 
         представленного листинга. 
              Первые  семь  команд рассматриваемого участка прогр
аммы,
         таким образом,  выглядят  вполне  осмысленно.  Они  реал
изуют
         рациональные   и   согласованные   между   собой  действ
ия  и
         естественным образом распадаются на два  класса:  команд
ы  со
         2-й по 5-ю реализуют одну логическую операцию, а с 6-й п
о 7-ю
         -  другую.  Пред'явленные  команды  отвечают  всем  крит
ериям
         реального участка программы.
              
              
              -U F600:7E92
              F600:7E93 8A6000             CLI
              F600:7E93 8A6000             MOV       DX,0060
              F600:7E96 8EDA               MOV       DS,DX
              F600:7E98 8EC2               MOV       ES,DX 
              F600:7E9A 8ED2               MOV       SS,DX
              F600:7E9C 32CO               XOR       AL,AL
              F600:7E9E A26404             MOV       [0464],AL
              F600:7EA1 B591               MOV       CH,91
              F600:7EA3 BB0000             MOV       BX,0000
              F600:7EA6 BA9A06             MOV       DX,069A
              F600:7EA9 BBF2               MOV       SI,DX
              F600:7EAB 2E                 SEG       CG
              F600:7EAC AC                 LODSB
              F600:7EAD 8807               MOV       [BX],AL
              F600:7EAF 43                 INC       BX
              F600:7EBO 42                 INC       DX
              F600:7EB1 FECD               DEC       CH
         
              
         
              Рис. 6.4. Второй фрагмент реконструированного Бэйси
ка
              
              Мы в какой-то мере достигли относительной цели: пои
ск  и
         выявление некоторого программного кода, а также некоторо
е его
         осмысление. Это нам вполне удалось. Можно было  бы  выпо
лнить
         декодирование  всего  Бэйсика, либо наиболее существенны
х его
         участков. Однако мы уже получили представление о том, ка
к это
         удается и убедились, что это вполне возможно.
              
              
              6.5. Две версии BIOS'а
              
              
              То, что для IBM/PC  используется  по  крайней  мере
  две
         различные  версии BIOS не является широко известным факт
ом. В
         настоящем параграфе мы кратко рассмотрим имеющиеся между
 нами
         различия и оценим их применительно к своим нуждам.
              В  состав  пакета  программ,  записанного  на  диск
ету и
         прилагаемого  к  настоящей  книге,   входят   две   прог
раммы
         копирующие и анализирующие программы BIOS.
              Именно  с  помощью этих программ впервые было обнар
ужено
         наличие модифицированных версий ПЗУ компьютеров, факт,ко
торый
         открыто  не  признавался  фирмой IBM. С помощью этих про
грамм
         можно проверить свою систему  и  сопоставить  свою  верс
ию  с
         другими.
              Из  всех  программ,  используемых  для Вашего компь
ютера
         IBM/PC, наиболее совершенными (не содержащими ошибок)  д
олжны
         быть  программы,  предназначенные для размещения в ПЗУ. 
Если,
         например, будет выявлена ошибка в какой-либо версии  DOS
  или
         VisiCalc,  то  ее  можно  устранить  путем простой перез
аписи
         дискеты. С  программами,  записанными  в  ПЗУ,  дело  об
стоит
         гораздо  сложнее.  Их  можно  записывать  только путем з
амены
         корпусов микросхем памяти,  расположенных  на  главной  
плате
         компьютера  IBM/PC;  эта  операция  не может быть произв
едена
         силами обычного пользователя. Наличие ошибок в программа
х ПЗУ
         представляет собой серьезную проблему для фирмы IBM.
              Сама мысль о том, что  можно  сделать  что-либо сто
ящее, 
         не  совершив  при  этом  ни  единой  ошибки,   представл
яется
         фантастической и программы ПЗУ в этом смысле не исключен
ие. С
         момента  появления  компьютеров  IBM/PC,  фирма   IBM   
сочла
         необходимым внести ряд изменений в программы ПЗУ (речь и
дет о
         серьезных ошибках), что обусловило появление двух версий
 ПЗУ.
         У пользователя может возникнуть вопрос, какой версией ос
нащен
         его компьютер и чем эта версия отличается от другой верс
ии.
              В  самом  конце  программы  BIOS  фирма  IBM   поме
стила
         временную  отметку, так называемый маркер версии. Этот м
аркер
         практически  соответствует   дате   официального   завер
шения
         разработки  программ ПЗУ. Для его отображения на экране 
можно
         воспользоваться программой DEBUG.  После  загрузки  прог
раммы
         DEBUG введите команду D F000:FFF5  L 8.
              На    экране    вашего   компьютера   будет   отобр
ажена
         последовательность  символов,  обозначающая  маркер   ве
рсии:
         04/24/81. Маркер второй версии имеет вид 10/19/81. Если 
будет
         обнаружен маркер версии,  отличной  от этих  двух, это  
будет
         означать,  что  Вы располагаете версией BIOS-ПЗУ, отличн
ой от
         указанных выше.
              В приложении 6.1 приведен текст  программы,  провер
яющей
         маркер  версии  BIOS-ПЗУ,  и, в  зависимости  от его зна
чения,
         выполняющей те или иные  действия.  Аналогичные  действи
я  на
         БэйсикЕ можно представить следующим образом:
              
              10 REM    вывод на дисплей маркера версии ПЗУ
              20 REM    программа отображает маркер, не анализиру
я его
              30 REM    и не настраивается на версию ПЗУ
              40 PRINT
              50 DEF SEG=&HFFFF
              60 PRINT "Маркер версии ПЗУ;
              70 FOR OFFSET=5 то 12
              80 PRINT CHR$(PEEK(OFFSET));
              90 NEXT OFFSET
              
              Если Ваш компьютер приобретен позже октября 1981, т
о это
         еще не означает, что он снабжен последней  версией  BIOS
-ПЗУ.
         Проверка  компьютеров,  выпущенных  через  год после вып
уска
         второй  версии  BIOS,  показывает,  что  новый,  только 
  что
         собранный компьютер, может иметь первую версию BIOS-ПЗУ.
              Вы,  вероятно,  помните,  что  ПЗУ  IBM/PC  содержи
т две
         составляющие:   Бэйсик-ПЗУ и BIOS-ПЗУ.   Первое,   что  
 было
         обнаружено   с   помощью   разработанной  автором  прогр
аммы,
         анализа содержимого  ПЗУ,   это   отсутствие  различий  
между
         первой и второй версиями Бэйсик-ПЗУ.
              Все  ошибки,  обнаруженные  в  БейсикЕ,  были  устр
анены 
         только  за  счет  дисковых  версий  БейсикА.   Важно,   
чтобы 
         Бэйсик-ПЗУ   оставался   неизменным,   поскольку   это  
может 
         отразиться на особенностях выполнения широко распростран
енных 
         программ,  написанных  на БэйсикЕ, и никем не поддержива
емых. 
         Возможна ситуация, когда одни и те же Бейсик-программы  
будут 
         по   разному  работать  на  различных  машинах  только  
из-за 
         различия в версиях ПЗУ. 
              Придерживаясь   мнения   на   корректировку  исправ
ления
         Бэйсик-программ  дискетной  версии,  фирма   IBM   обесп
ечила
         пользователю  возможность отслеживать все изменения, вно
симые
         в язык. Если каккая-нибуть программа написана  в  расчет
е  на
         оригинальный  Бэйсик,  то  следует  лишь установить диск
ету с
         этой версией БэйсикА.  Для  новых  версий  БэйсикА  прог
рамма
         может  имитировать  модификацию  содержимого  ПЗУ  с  по
мощью
         методики, описанной в главе 3 при осуждении прерываний.
              Все  изменения,  внесенные в ПЗУ, касались BIOS; ни
же мы 
         перечислим их и Вы сможете оценить степень их важности. 
 Если 
         вы располагаете первой редакцией "Руководства по техниче
скому 
         обслуживанию IBM/PC", то можете убедиться в  том,  что  
текст 
         BIOS-ПЗУ,  приведенный  в  приложении А, соответствует п
ервой 
              версии ПЗУ, о чем свидетельствует также маркер верс
ии на 
         последней  странице:  04/24/81.  Вслед  за  текстом  BIO
S-ПЗУ 
         приведены   некоторые   замечания.  Первое,  третье  и  
пятое 
         замечания касаются  некоторых  ошибок,  найденных  в  BI
OS  и 
         исправленных во второй его версии. 
              Первые три изменения,  внесенные  в  BIOS-ПЗУ,  кас
аются
         программ  самотестирования, автоматически запускающихся 
после
         включения  питания  на  IBM/PC.   Эти   программы   выпо
лняют
         четырнадцать  различных тестовых проверок правильности р
аботы
         оборудования, прежде  чем  пользователь  натворит  "дел"
   на
         неисправном компьютере.
              Тест  номер  три  (  входящий  в  состав  этих прог
рамм) 
         осуществляет проверку  правильности  работы  функции  та
ймера 
         котроллера  памяти.  Два  исправления  из  трех,  внесен
ных в 
         тестовые   программы,   касаются   этой   процедуры.   (
Здесь 
         представляется  уместным  показать,  что  программы, под
обные 
         BIOS, работающие непосредственно с аппаратурой, отличают
ся от 
         обычных   программ.  Корректность  функционирования  про
грамм 
         тестирования устройств, а также программы BIOS часто  за
висит 
         оттонкостей    функцмонирования   контролируемых   устро
йств. 
         Временные характеристики управляющих  сигналов,  а  такж
е  их 
         взаимная согласованность могут оказывать решающее воздей
ствие 
         на факт успешного завершения  этих  программ.  В  целом 
 ряде 
      
         случаев  отладка  таких программ производится опытным пу
тем - 
         одного логического анализа бывает недостаточно.  Вот  по
чему, 
         говоря  об  изменениях,  внесенных в тестовые программы,
 я не 
         смог сказать ничего определенного о смысле этих изменени
й). 
              Одно  из  изменений, внесенных в программы тестиров
ания,
         затрагивает сразу три программы. Цель изменения:  обеспе
чение
         безусловного обновления операций таймера до момента обра
ботки
         управляющего прерывания видеомонитора. В первой версии  
этого
         не делалось.
              Не  следует  огорчаться,  если  Вам  непонятно знач
ение
         введенных изменений - они практически никак не сказывают
ся на
         работоспособности    правильно    функционирующей    сис
темы.
         Остальные изменения (описываются ниже) представляют  для
  Вас
         большой интерес.
              Одно  из внесенных изменений представляет интерес п
режде
         всего для тех, кто использует  коммуникационный  адаптер
.  На
         программы  ПЗУ, обслуживающие коммуникационный адаптер, 
среди
         прочих,  возлагаются  также  функции  оповещения   в   с
лучае
         отсутствия  на линии связи сигнала отклика. Если по исте
чении
         определенного промежутка времени такой сигнал не появилс
я, то
         коммуникационные    программы    ПЗУ   вырабатывают   пр
изнак
         "тайм-аут". /Тайм-аут - интервал времени, когда одна  ст
орона
         принимает определенные меры, если в течение заданного вр
емени
         она не получит ответа от  другой  стороны  (Прим.перев.)
/.  К
         сожалению,  в  результате  обычной  опечатки программы П
ЗУ не
         вырабатывают  признак  "тайм-аут".  Ошибка   возникла   
из-за
         различий в представлении десятичных и шестнадцатеричных 
чисел
         при  записи  шестнадцатеричного  числа  80Н  символ  "Н"
  был
         потерян   и   число   воспринялось   как   десятичное   
(т.е.
         шестнадцатеричное 50).  В  программе  это  число  (конст
анта)
         используется  для  установки в единичное состояние конкр
етных
         битов; таким образом, вместо установки в единичное  сост
ояние
         одного  бита-признака  состояние  "тайм-аут" были устано
влены
         два  других  бита-признака   "готовности   данных"   (ус
ловие
         обратное  "тайм-аут")  и "ошибка четности" (свидетельств
ует о
         возможной ошибке в данных).
              Следствием этой ошибки является возможность неправи
льной
         работы коммуникационной программы. Если она запрограммир
ована
         без учета ошибки BIOS-ПЗУ, то отсутствие ответа в  телеф
онной
         линии  будет восприниматься как ошибка четности данных (
таким
         образом нарушается объективность диагностики).
              Следующая  ошибка,   обнаруженная   во   второй   в
ерсии
         BIOS-ПЗУ,   относилась  к  программам  управления  принт
ером.
         Проблема, как и прежде, заключалачь в тестированипи сост
ояния
         "тайм-аут".  При  выполнении какой-либо работы для компь
ютера
         принтер может находиться  в  состоянии  "устройство  зан
ято";
         возможен  также  такой  режим  работы,  когда  принтер с
игнал
         ответа  не  вырабатывает.  Управляющая   программа   BIO
S-ПЗУ
         тестирует  эти  режимы,  ожидая  некоторое  время поступ
ления
         сигнала ответа. К сожалению, это время было выбрано без 
учета
         наиболее   длительной   операции,   выполняемой  принтер
ом  -
         протяжки бумаги на интервал, равный одной одной  страниц
е.  В
         первой   редакции   BIOS-ПЗУ   это  время  было  явно  м
еньше
         требуемого, поэтому  в  новой  версии  до  момента  появ
ления
         признака "тайм-аут" проходит вдвое большее время.
              Вслед  за  принтером  изменения  затронули  и  прог
раммы 
         поддержки  накопителя  на  магнитной  ленте  кассетного 
типа. 
         Здесь была изменена последовательность выполнения  неско
льких 
         команд,   что   привело   к  небольшому  изменению  врем
енных 
         характеристик процесса считывания данных. Поскольку в со
ставе 
         IBM/PC  накопитель  кассетного типа используется весьма 
редко 
         (т.е. последствия ошибки  незначительны),  то  это  изме
нение 
         относится к разряду несущественных. 
              Последнее  изменение  представляет   интерес   для 
  тех
         пользователей  IBM/PC, которые используют цветной графич
еский
         адаптер.  Не  всем  известно,  что  при  работе   с   цв
етным
         графическим  адаптером  в  графическом  режиме  (в отлич
ие от
         работы в текстовом  режиме)  символы  выводятся  на  экр
ан  в
         режиме  рисования,  подобно  тому  как  выводится изобра
жение
         любого другого  объекта  графической  природы.  (Эти  во
просы
         подробно  рассматриваются  в главе 9, посвященной отобра
жению
         графических  объектов).  В  ПЗУ   предусмотрена   специа
льная
         таблица,  содержащая графические образы символов ASCII с
 тем,
         чтобы их можно было вывести как элементы алфавита.
              При работе цветного графического  монитора  в  текс
товом
         режиме  отображаемые символы генерируются цветным графич
еским
         адаптером схемно; в графическом же режиме символы рисуют
ся на
         экране  управляющей  программой  ПЗУ,  использующей табл
ичные
         образы. Один  из  этих  образов  в  первой  версии  BIOS
  был
         закодирован с ошибкой, а именно: символ СНR$(4), обознач
ающий
         сокровища на колодах для игральных  карт,  имел  одну  л
ишнюю
         точку снизу. Во второй версии BIOS-ПЗУ эта ошибка устран
ена.
              Ни  одна  из  перечисленных  выше  ошибок не относи
тся к
         разряду катастрофических. Наиболее значимая из них влече
т  за
         собой   неправильное  формирование  признака  "тайм-аут"
  при
         работе  с  асинхронной  линией  связи  ,  то  есть  ошиб
очное
         описание   ситуации,   а   не   ошибочные   действия.  Р
едкий
         пользователь IBM/PC cумеет ее распознать, даже, если зна
ет  в
         чем дело. 
              Знать о всех изменениях имеет смысл постольку, поск
ольку
         нельзя быть уверенныт в  том,  что  изменения,  затрагив
ающие
         особенности  работы  машинных программ (даже в незначите
льной
         степени) всегда должным  образом  документируются  и  от
крыто
         публикуются.   Здесь   важен   прецедент,   дающий  осно
вание
         беспокоиться, что более важные и существенные изменения 
могут
         быть осуществлены без ведома пользователей.
              
              
              6.6. Механизм выборки информации из ПЗУ
              
              
              В данном параграфе мы обобщим все аспекты,  связанн
ые  с 
         активизацией   служебных   программ   BIOS-ПЗУ.   Любой 
  вид 
         обслуживания обеспечивается  через  механизм  прерываний
;  по 
         причинам,  котрорые  мы  подробно  рассматривали  в  гла
ве 3, 
         прерывания позволяют  запускать  (выполнять)  программы,
  без 
         предварительных    сведений    о   их   местоположении( 
  при 
         необходимости можно осуществлять перемещение этих програ
мм). 
              Ниже  приведена  таблица  прерываний,  используемых
  для
         активизации программ BIOS-ПЗУ, а также  программ,  имеющ
их  к
         ним непосредственное отношение.
         ________________________________________________________
____
                
              Номер        Шестнадцатиричный        Назначение
         ________________________________________________________
____ 
              
                5                  5               Операция     п
ечати
                                                   содержимого  э
крана 
               16                 10               Операции  ввод
а/вы-
                                                   вода на экран 
дисп-
                                                   лея
               17                 11               Контроль обору
дова-
                                                   ния;   использ
уется 
                                                   для     опреде
ления
                                                   подключенного 
 обо-
                                                   оборудования
               18                 12               Проверка памят
и;ис-
                                                   пользуется  дл
я оп-
                                                   ределения    о
бъема  
                                                   памяти
               19                 13               Операции  ввод
а/вы-
                                                   вода с  накопи
телей
                                                   на дискете; ра
злич-
                                                   ные  операции 
с на- 
                                                   копителем на д
иске-
                                                   те;  различные
 опе-
                                                   рации    с дис
кетой
           
         ________________________________________________________
____
                
              Номер        Шестнадцатиричный        Назначение
         ________________________________________________________
____ 
              20                  14               Ввод/вывод    
  для
                                                   RS-232;  опера
ции с
                                                   асинхронным  к
омму-
                                                   никационным ад
апте-
                                                   ром
              21                  15               Ввод/вывод  дл
я на-
                                                   копителя   на 
 маг-
                                                   нитной  ленте 
 кас-
                                                   сетного типа
              22                  16               Ввод/вывод  с 
 кла-
                                                   виатуры
              23                  17               Ввод/вывод    
  для
                                                   принтера      
  
              24                  18               Загрузка  касс
етной
                                                   версии Бэйсика
              25                  19               Перегрузка  си
стемы
              26                  1А               Функции даты и
 вре-
                                                   мени
         ________________________________________________________
____
              Полный список программ обслуживания значитель шире.
  При
         необходимости  каждой  отдельной  функции обслуживания м
ог бы
         быть присвоен свой собственный номер прерывания или  нао
борот
         -   все   функции   могли  бы  быть  обозначены  одним  
кодом
         прерывания, образуя своего рода управляющиее прерывание.
              Более продуктивным, однако, представляется подход, 
когда
         с  каждым  прерыванием  связывают один функциональный ра
зрез,
         обеспечивая таким образом их  логическую  группировку.  
Такой
         путь  ведет  к  управляемому  числу  отдельных  прерыван
ий  с
         обоснованным разделением функций обслуживания.
              Несмотря  на  то,  что  потребности  в  каждой   фу
нкции
         различны,  существуют  некоторые общие положения относит
ельно
         особенностей перемещения данных между точкой вызова функ
ции и
         собственно   функций.   Если   Вы   используете  интерфе
йсные
         программы, поставляемые на дискете в  качестве  дополнен
ия  к
         данной  книге,  у  Вас  не  будет  возможности ознакомит
ься с
         деталями реализации каждой функции. Знать  как  они  раб
отают
         между тем весьма полезно. 
              За   исключением   отдельных  случаев  в  рамках  о
дного
         прерывания  реализуются  несколько  функций.   Для   пер
едачи
         номера, обозначающего субфункцию используется регистр AH
. Для
         передачи  параметров  в   обоих   направлениях   использ
уются
         регистры,   причем   система   стремится   к   их  эконо
мному
         использованию. Программы обслуживания обеспечивают сохра
нение
         всех  регистров,  не  используемых  для  передачи параме
тров;
         вызывающая программа таким образом  не  должна  заботить
ся  о
         сохранении  величин,  находящихся в различных регистрах.
 Если
         требуется выделить область памяти для данных,  например,
  для
         буфера  данных  считываемых  с  дискеты  или  кассеты, т
о для
         представления сегментированных адресов используются  рег
истры
         ES и BX.
              Регистры  AH,  AX  мспользуются  для передачи прогр
аммам
         обслуживания кода возврата  или  результирующего  сигнал
а.  В
         некоторых  случаях  для  индикации  ошибки  используется
 флаг
         переноса  CF,  однако  как  правило  флаги  не  использу
ются.
         Регистры  общего  назначения  AX  ... DX следует использ
овать
         экономно по  мере  необходимости,  придерживаясь  алфави
тного
         порядка. 
         
              В  последующих  пяти  главах  мы детально рассмотри
м все
         перечисленные выше типы прерываний  и  особенности  рабо
ты  с
         регистрами.
              
              
              6.7. Описание специальных прерываний
              
              
              Как  уже  упоминалось  в  главе  3, три строки в та
блице 
         векторов прерываний используются не по прямому назначени
ю для 
         хранения  адресов  программ  обслуживания  прерываний , 
а для 
         хранения  адресов  базовых  таблиц  системы  (поскольку 
  эти 
         таблицы  размещаются  в ПЗУ). Ниже мы поясним назначение
 этих 
         таблиц. 
      
              Первая  таблица  (с  кодом  фиктивного  прерывания 
  29)
         содержит    адрес    таблицы    инициализации   видеодис
плея,
         используемой  для  контроля  управляющих  кодов  для  эк
ранов
         дисплеев.  Таблица  размещается  в ПЗУ по адресу F000: F
0A4 и
         включает три подтаблицы с видеопараметрами. Каждая подта
блица
         имеет  четыре  строки  по  одной  строке на каждый из че
тырех
         режимов  отображения:  монохромный,  40-столбцовый   цве
тной,
         текстовой, 80-столбцовый цветной, текстовой и оба графич
еских
         режима. Одна из подтаблиц фиксирует размер  в  байтах  б
уфера
         дисплея,  соответствующего  текущему  режиму.  (Подробно
  эти
         вопросы рассматриваются в главе 8 и 9).
              Еще одна подтаблица фиксирует ширину  граф,  учитыв
аемую
         при   автоматическом  переходе  от  одной  строки  в  др
угую.
         Практическая польза от  модификации  этой  таблицы  близ
ка  к
         нулю, поэтому в дальнейшем она рассматривается не будет.
              Адрес   второй  таблицы  (соответствует  прерыванию
  30)
         указывает на таблицу параметров дискет. Эта таблица  сод
ержит
         данные,  предназначенные  для  контроля  временных парам
етров
         различных   операций,   выполняемых   с   дискетой.   Та
блица
         расположена  в  ПЗУ  по  аресу  F000  :  EFC7. Сразу же 
после
         выпуска компьютера IBM/PC стало ясно, что некоторые врем
енные
         характеристики, внесенные в эту таблицу весьма приблизит
ельны
         и  являются  причиной  слишком  медленной  работы   диск
ового
         накопителя.  Среди  многочисленных изменений, внесенных 
в DOS
         версии  1.10  были  данные,  снижающие  время   обращени
я   к
         дисковому  накопителю. Здесь использовался классический 
метод
         - в  процессе  самонастройки  дисковая  операционная  си
стема
         создавала новую версию таблицы в обычной памяти и заменя
ла ее
         адрес в векторе,инициализируцемой по прерыванию 30. Поск
ольку
         при выполнении любой операции с диском производится обра
щение
         к этой таблице, то  после  замены  адреса  вектора,  акт
ивной
         становилась  новая   таблица. В главе 7 (посвященной опи
санию
         дискового накопителя) мы рассмотрим детали, связанные с 
 этой
         таблицей и укажем внесенные изменения.
              Адрес   третьей   таблицы,   получаемой   по  фикти
вному
         прерыванию 31, указывает на  область  генератора  графич
еских
         символов,  используемых  при формировании на дисплее сим
волов
         CH$(128),  ...,  CHR$(255)  в  любом  из   двух   графич
еских
         режимов.   Стандартной   таблицы   этого   типа  попрост
у  не
         существует. Если две предыдущие таблицы  всегда  находят
ся  в
         ПЗУ,  то  данная  таблица в ПЗУ отсутствует. А коль скор
о это
         так, то вектор прерывания будет  содержать  нулевое  зна
чение
         (является  признаком  отсутствия  таблицы)  до  тех пор,
 пока
         программа  не   построит   такую   таблицу   и   не   за
несет
         соответствующий  адрес  в  вектор  прерывания.  При  изу
чении
         графического  режима  работы  (глава  9)   мы   увидим, 
  что
         существует  много  интересных  вещей,  связанных  с  таб
лицей
         генерации символов.
              Все эти общие положения,  касающиеся  ПЗУ,  образую
т  ту
         основу,  опираясь  на  которую  мы  перейдем  к  рассмот
рению
         широких возможностей отдельных узлов IBM/PC. Этому  посв
ящены
         пять   следующих   глав.   Начнем   с  дисковых  накопит
елей,
         рассматривая их до того  как  программа  построит  табли
цу  и
         поместит   адрес   этой   таблицы  в  соответствующий  в
ектор
         прерываний.
         
    
              Приложение 6.1. Текст программы проверки метки
         версии ПЗУ (Паскаль).
         
         
         module Listing_6_1;
         
         
         type
         
           string8       = string(8);
           bios_ptr_type = ads of string8;
           
           
         var
         
         bios_date    : bios_ptr_type;
         
         
         procedure check_rom_bios_date;
         
           begin
           
             bios_date.s :=#F000;
             bios_date.r :=#FFF5;
             
             if bios_date^='04/24/81' then
               begin
               
               end
             else
               begin
               
               end;
               
           end;  
         end.
               ГЛАВА 7. ДОСТУП К ДИСКЕТАМ
               __________________________
     С   этой   главы   начинается   подробное  по-элементное
рассмотрение возможностей IBM/PC - начиная с  дисководов  для
гибких  магнитных  дисков. Изложение материала этой и четырех
последующих  глав  будет  следовать   организации   служебных
процедур  системы  BIOS  в  ПЗУ.  Однако,  наше  изложение не
ограничивается   только   описанием   возможностей,   которые
предоставляются  системой  BIOS.  Для  каждой из возможностей
будет рассматриваться вся  техническая  информация,  полезная
или   интересная   любому,   кто   хочет  понять  особенности
реализации этой возможности и особенности ее использования.
     Если  обратиться  к  трем  уже  упоминавшимся   областям
интересов,  то следует отметить, что вся информация полностью
относится только к IBM/PC. Что касается совместимых с  IBM/PC
компьютеров,  можно  ожидать,  что  большая  часть информации
применима  и  к  ним  тоже,  но  степень  применимости  будет
зависеть   от  того,  насколько  точно  конкретный  компьютер
копирует IBM/PC; для всех компьютеров, которые  рекламируются
как совместимые по системе BIOS , данная информация полностью
применима. Для  семейства   компьютеров,    работающих    под
управлением  операционной  системы MS-DOS, приведенная в этих
главах информация будет типичной с точки зрения возможностей,
которые  должен  предоставлять  любой  компьютер,  но  нельзя
рассчитывать, что все детали полностью совпадут.
     7.1. ТРИ УРОВНЯ ДОСТУПА К ДИСКЕТЕ
     Имеются три способа, позволяющие осуществлять  доступ  к
данным,  хранящимся  на  дискете,  -  из  программы  на языке
программирования высокого уровня  (такого,  как  Паскаль  или
БЕЙСИК),   посредством   вызова  функции  ДОС  и  посредством
обращения к служебной процедуре системы BIOS в ПЗУ.  Все  эти
способы  образуют трехуровневую иерархию, в которой служебные
процедуры системы BIOS образуют нижний, наиболее  примитивный
уровень.  Уровень  функций  ДОС  строится на основе служебных
процедур  системы  BIOS.  Уровень   языков   программирования
является  верхним  уровнем и строится на основе функций ДОС и
служебных процедур системы BIOS.
     Может существовать  еще  один,  более  высокий  уровень,
обеспечиваемый  системой  управления  базами  данных того или
иного типа.
     Операции  ввода/вывода  с  дискетой  на  уровне   языков
программирования  обычно  удовлетворяют  все  потребности  по
манипулированию  данными,  хранящимися  на  дискете.  В   тех
случаях, когда этого оказывается недостаточно, не хватает как
раз не "атомарных" функций низкого уровня, а  процедур  более
высокого уровня, прредоставляемых только системами управления
базами данных. Однако, иногда требуется доступ к  дискете  на
более  низком уровне, например, для прямого чтения или записи
секторов дискеты. Для выполнения  таких  операций  необходимо
обращаться  к двум другим уровням ввода/вывода с дискетой - к
уровням ДОС И BIOS.
     В главе 4 мы уже рассмотрели  доступ  ко  всем  функциям
ДОС,  включая  и  функции  ввода/вывода  с  дискетой. Одно из
главных  достоинств  функций  ввода/вывода  на   уровне   ДОС
заключается,  как  Вы  могли  уже  заметить изучая главу 4, в
ширине  диапазона  их  возможностей.  Функции  ДОС  позволяют
выполнять  как  операции  довольно высокого уровня (например,
поиск в справочнике файлов по родовым именам), так и операции
среднего  уровня  (чтение и запись логических записей) и даже
операции  низкого  уровня  (чтение  и  запись   секторов   по
абсолютному номеру).
     Широкие   возможности   уровня  функций  ДОС  делают  их
особенно   привлекательными    для    использования.    Языки
программирования,  такие  как  Паскаль, обычно организуют все
свои средства ввода/вывода с помощью  функций  ДОС.  Если  Вы
хотите    освободиться    от    ограничений,    накладываемых
организацией  системы  ввода/вывода  выбранного  Вами   языка
программирования,    я    советую   обратиться   к   функциям
ввода/вывода ДОС.
     Если главная причина обращения к  специальным  операциям
ввода/вывода  связана  с  необходимостью  чтения  или  записи
секторов дискеты, то лучше воспользоваться функциями ДОС, чем
процедурами   BIOS.   Это   связано   только   с   тем,   что
дополнительный сервис, предоставляемый функциями ДОС, избавит
Вас   от   необходимости   заботиться  о  таких  деталях  как
повторение попытки выполнения операции в  случае  ошибки  или
выдержки   времени,   необходимого   для   разгона  двигателя
дисковода. Тем  не  менее,  Вам  может  потребоваться  прямой
доступ  к процедурам уровня BIOS, например, если нужно обойти
процедуры  обнаружения  ошибок  ДОС или когда нужно выполнить
операцию, которая не  выполняется  средствами  ДОС.  По  этой
причине  ниже  приводится описание служебных процедур системы
BIOS в ПЗУ, предназначеннных для работы с дискетами.
     7.2.  Служебные  процедуры  обслуживания  дискет системы
           BIOS в ПЗУ.
     Для обслуживания дисководов в системе BIOS имеется шесть
процедур.  Доступ ко всем осуществляется с помощью прерывания
номер 19 (шестнадцатиричное значение 13). В этом  разделе  мы
рассмотрим  каждую  из  них  и  увидим  некоторые  примеры их
использования. Программы 7.101 и 7.102, включенные в дисковый
пакет  прилагающийся  к  этой книге, обеспечивают необходимые
ассемблерные подпрограммы для доступа к этим процедурам BIOS,
а  также  определения и вспомогательные программы на Паскале,
облегчающие использование ассемблерных подпрограмм.
     Первая   служебная   процедура,  которая  имеет  код  0,
сбрасывает дисковую  подсистему  в  исходное  состояние.  Эта
процедура   может  использоваться  для  восстановления  после
различных ошибок и сбоев. Эта  операция  аналогична  операции
сброса  в ДОС (вызов функции номер 13), но она выполняется на
более ниэком  уровне  системы  BIOS.  Операция  сброса  диска
посылает   команду   контроллеру  дисков,  приводящую  его  в
исходное состояние. Заметим, что здесь не  выполняются  такие
действия  как  установление  дисковода,  выбираемого  ДОС  по
умолчанию, - для этого должна выполняться операция сброса  на
уровне ДОС.
     Наиболее  очевидное  использование  операции  сброса - в
процедуре  восстановления  после  ошибки.   Часто   наилучшим
способом  действий  программы  в  случае  ошибки  операций  с
дискетой  является  быстрое  прекращение  всех  действий,   с
предоставлением   возможности   разбираться   в   происшедшем
пользователю компьютера. В конце концов, большинство дисковых
ошибок  связаны  с  причинами,  которые  невозможно устранить
программно, например, с механическими  повреждениями  дискеты
или  неправильной  работой  механики  дисковода. Однако, Ваша
программа должна использовать все имеющиеся  возможности  для
восстановления  после  ошибки  и процедура сброса может стать
важной составной частью такой программы восстановления.
       Вторая  служебная  процедура,  с  кодом  1, позволяет
  прочитать код  состояния  дисковой  подсистемы.  Состояние
  изменяется любой дисковой операцией, так что эта процедура
  отражает последнюю выполненную операцию  с  дискетой.  Эту
  процедуру   можно   использовать   для  слежения  за  теми
  операциями ввода/вывода, которыми Вы не  можете  управлять
  непосредственно.   Например,   если   выполняется  обычная
  операция ввода/вывода на уровне языка  высокого  уровня  и
  получено сообщение об ошибке, вызов этой процедуры поможет
  лучше понять, что произошло, в  чем  состоит  ошибка,  так
  чтобы программа могла выполнить необходимые корректирующие
  действия. Ниже приведены  коды  состояний,  которые  могут
  возвращаться,  сами  по  себе  или в некоторой комбинации,
  этой процедурой.
КОД   ШЕСТНАДЦАТИ-           СМЫСЛ
      РИЧНОЕ ЗНА-
      ЧЕНИЕ
___   _____________       ___________________________________
 1      01                  Была выдана неправильная команда
 2      02                  Не найден адресный маркер (исполь-
                            зуемый для обнаружения сектора)
 3      03                  Была запрошена операция записи
                            для дискеты, защищенной от записи
 4      04                  Запрашиваемый сектор не найден
 8      08                  Неправильный адрес при операции
                            прямого доступа к памяти (ПДП)
 9      09                  При ПДП перейдена граница 64К па-
                            мяти
16      10                  Ошибка чтения данных, обнаружен-
                            ная при проверке циклического из-
                            быточного кода
32      20                  Ошибка контроллера гибких дисков
64      40                  Ошибка поиска указанной дорожки
128     80                  Тайм-аут: ответ от дисковода не
                            получен в положенное время
     Третья и четвертая процедуры, с кодами 2 и 3,  считывают
и  записывают  один  или  несколько  секторов (объединяемых в
блок) на одной дорожке. Я советую использовать  эквивалентные
функции  ДОС,  что избавит  Вас  от  необходимости  проверять
возникновение  ошибок  или  повторять  выполнение   операций.
Заметим что эти две операции, а также соответствующие функции
ДОС позволяют считывать или записывать одновременно несколько
секторов.  Если  Вам  необходимо выполнить очень быстрый ввод
или вывод данных, эти операции  позволяют переслать вплоть до
целой   дорожки  данных  за  время  одного  оборота  дискеты.
Чтение/запись секторов  по  одному  требуют  затраты  времени
одного оборота на каждый сектор.
     Впрочем чтение/запись нескольких секторов имеет и свои
недостатки.  Один  из  таких  недостатков   -   необходимость
организации  большого  буфера, размером до 4К байт при чтении
целой дорожки. Если можно работать с данными в том  же  месте
памяти,  куда  они  считываются  или откуда они записываются,
такой недостаток не будет  существенным,  но  если  требуется
выделить  отдельную  буферную  область для работы с дискетой,
тогда  чтение  или  запись   нескольких   секторов   увеличат
требования  к  памяти, занимаемой Вашей программой. Имеются и
другие недостатки, например, если происходит  ошибка,  то  ее
обнаружение   и  восстановление  после  нее  могут  оказаться
значительно сложнее, поскольку трудно установить на каком  из
секторов произошла ошибка. Эта сложность несколько меньше при
использовании служебных процедур BIOS,  поскольку  они  ведут
подсчет   числа   переданных  секторов,  который  может  быть
проанализирован программой; функции ДОС не обеспечивают такой
возможности.    Проблема   ошибки   в   процессе   выполнения
многосекторной операции не слишком существенна при чтении, но
при  записи она может весьма осложнить задачу восстановления,
если программа не может определить сколько секторов уже  было
записано.
     Пятая  служебная  процедура, с кодом 4, используется для
верификации данных после  операции  чтения  или  записи.  Она
повторно    считывает   сектора,   используя   для   проверки
циклические избыточные коды. Эта  процедура  используется  по
ключу  "/V" в  команде  ДОС  COPY.  Верификацией  не  следует
злоупотреблять  и  на  то  есть  все  основания.   Во-первых,
операции   с   дискетами   достаточно   надежны.   Во-вторых,
практически все ошибки при пересылке данных обнаруживаются  и
сообщения  о  них передаются программам; очень редко операция
чтения или записи завершается  успешно,  а  данные  при  этом
как-то  искажаются.  Однако,  когда  гарантия  безошибочности
действительно важна, необходимо выполнять  верификацию  после
пересылки   данных.   Эта  операция,  помимо  всего  прочего,
значительно  увеличивает  время  выполнения   операции.   Для
верификации  чтения  или записи сектора эту процедуру следует
вызывать сразу же после завершения операции пересылки.
     Шестая,  и  последняя,  операция, с  кодом  6,  особенно
интересна.   Эта   процедура   форматирует  дорожку  дискеты,
записывая адресные маркеры секторов и заполняя сегмент данных
каждого  сектора  стандартным  шестнадцатиричным значением F6
или  CHR$(246).  Должны  указываться  отдельно  для   каждого
сектора  такие  спецификации  как  дорожка,  сторона  и номер
сектора, а  также  код,  задающий  длину  сектора.  Поскольку
размер   каждого  сектора  может  быть  задан  независимо  от
остальных,  можно  сформатировать   дорожку   с   одним   или
несколькими  секторами  нестандартного размера - что является
обычным  средством  для  защиты  от   копирования.   Обычными
средствами  ДОС  нельзя  прочитать  сектор,  размер  которого
отличается от стандартного 512-байтного, поэтому многие схемы
защиты  от  копирования  пользуются именно такими средствами.
Более  подробно  мы  рассмотрим  это  в  следующем   разделе,
посвященном параметрам, управляющим операциями с дискетой.
     Форматировать нужно  целую  дорожку  сразу  -  поскольку
промежутки между секторами и адресные маркеры взаимозависимы.
Однако, если необходимо переформатировать всего один  сектор,
способ  для  этого все же есть. Например, если нужно изменить
формат последнего  сектора  на  дорожке,  сохранив  данные  в
первых  семи  секторах, поступите так: напишите программу для
чтения  первых  семи  секторов,  затем  переформатируйте  всю
дорожку  и  перезапишите  данные.  Такая  процедура  позволит
защитить от копирования уже существующие данные, хотя  внешне
вроде бы ничего не изменяется.
     Для  форматирования всех секторов на дорожке должны быть
заданы следующие параметры, каждый в виде однобайтного числа:
     1 - номер дорожки (от 0 до 39)
     2 - сторона (0 или 1; для односторонних дискет всегда 0)
     3 - номер сектора (начиная с 1; сектор 0 означает
         управляющую информацию)
     4 - код длины (0=128 байт, 1=256 байт, 2=512 байт
         [стандартное], 3=1024)
     Поскольку каждый сектор  имеет  собственный  код  длины,
включить сектор нестандартной длины в дорожку не представляет
особого  труда  (либо  создать  целую  дорожку  из   секторов
нестандартной длины для ДОС).
     Если  для  форматирования дорожки используется процедура
уровня BIOS, следите за правильным указанием всех параметров.
     7.3. Параметры дискеты и защита от копирования
     Работа дисковода для гибких дисков частично  управляется
таблицей,  известной  как  база дисков или таблица параметров
дискеты (терминология фирмы "ИБМ" пока не устоялась)
     База дисков -  это  таблица,  состоящая  из  одиннадцати
байт, которая содержит ряд параметров, необходимых для работы
дисководов,  включая  и  определенную  информацию  о  формате
дискет. В листинге 7.1 можно найти определение  этой таблицы,
комментарии к которому описывают назначение каждого байта.
     Как  упоминалось  в  главе  6,  один вектор прерывания,-
номер 29, хранящийся в ячейке с  адресом  120,-  используется
для  указания  местонахождения  этой таблицы. Исходная версия
этой таблицы, использовавшаяся версией ДОС 1.00, находилась в
ПЗУ  вместе  с  системой  BIOS,  и  поэтому ее можно видеть в
листинге BIOS, приведенном в "Техническом руководстве".
     Начиная с версии ДОС  1.10  вместо  этой  таблицы  стала
использоваться  таблица,  размещаемая  в  оперативной памяти.
Такое изменение, кстати,  дает  нам  одно  преимущество.  Это
позволяет  экспериментировать  со  значениями  в  таблице, не
прибегая к различным ухищрениям для подмены  таблицы  в  ПЗУ.
Любая  программа  может установить собственную базу диска, но
вот создать ее таким образом, чтобы  эта  таблица  продолжала
использоваться  после  окончания  программы, довольно сложно.
Для достижения это цели необходимо зарезервировать  небольшую
область  памяти  так, чтобы ДОС не использовала ее. Однако, с
тех  пор  как  ДОС  стала  размещать  таблицу  базы  диска  в
оперативной памяти, во всех этих приемах нет необходимости.
     По  сравнению  с  версией ДОС 1.00 в версии 1.10 сделано
всего два изменения в таблице базы диска,  но  они  позволили
значительно    увеличить   скорость   использования   дискет.
Во-первых, они на 25% уменьшили время,  выделенное  дисководу
для  перемещения  головки  с  дорожки  на  дорожку. Это время
получило  название  "время шага" (SRT). В   версии   таблицы,
размещаемой  в ПЗУ, которая использовалась в ДОС версии 1.00,
время  шага  равнялось  8  миллисекундам.   Новое   значение,
использующееся начиная с ДОС 1.10, равняется 6 миллисекундам.
     Этот  параметр  в  таблице занимает первый полубайт. Его
исходное значение было 12 (шестнадцатиричное значение  C),  а
новое  значение  13 (шестнадцатиричное значение D). Я сначала
предположил, что такое изменение значения означает увеличение
времени   шага,   однако   Роберт  Бэттен  сообщил  мне,  что
используется инверсное  значение  этого  параметра,  так  что
большее   значение   означает   меньшее   время  шага.  Время
шага управляется приращениями  по  2  миллисекунды,  так  что
изменение  времени  шага  с  12 на 13 в таблице соответствует
уменьшению действительного времени с 8 до 6 миллисекунд.
     Второе изменение  резко  увеличило  скорость  доступа  к
дискете.   "Время  установления  головки",  то  есть,  пауза,
необходимая  для  стабилизации  головок  чтения/записи,  была
уменьшена с 25 миллисекунд до нуля. Первоначально фирма "ИБМ"
чересчур   предубежденно    относилась    к    быстродействию
дисководов,  так  что за счет ликвидации времени установления
удалось добиться сразу  большого  увеличения  быстродействия.
Большую   часть  параметров  этой  таблицы  изменять  нельзя,
однако, некоторые из них  предоставляют  широкие  возможности
для  экспериментаторов.  В  девятом  байте хранится значение,
которое    используется    операцией    форматирования    для
инициализации  секторов  дискеты. Стандартное значение F6, но
Вы можете его изменить. Некоторые программы проверяют наличие
кода  F6, чтобы найти неиспользовавшиеся сектора, так что это
значение вряд ли разумно изменять, если для этого нет  веских
оснований. Такое изменение целесообразно применять для защиты
от копирования.
     Еще  один интересный параметр - это байт размера сектора.
Он определяет размер сектора, который должен  считываться  или
записываться.  Это  позволяет  работать  с  секторами,  размер
которых отличается от стандартного 512-байтного формата ДОС. В
других   операционных  системах  могут  использоваться  другие
размеры секторов за  счет  изменения  этого  байта.  Изменение
этого  значения является наиболее простым способом организации
защиты записи. Для формирования сектора с  размером,  отличным
от  512  байт,  необходимо  использовать  служебную  процедуру
форматирования, описанную в  предыдущем  разделе.  В  процессе
форматирования  размер  каждого сектора определяется отдельно.
Однако, чтобы в дальнейшем Ваши  программы  могли  читать  или
записывать    нестандартные   сектора,   необходимо   изменять
указатель размера сектора в таблице базы диска.
     Этот параметр может принимать одно из следующих значений:
     Значение         Размер сектора в байтах
     ________         _______________________
         0                 128
         1                 256
         2                 512 (стандартный для ДОС)
         3                1024
     Листинг  программы  7.1  демонстрирует (на Паскале), как
осуществляется доступ к таблице базы диска и  как  изменяются
ее  параметры.  То  же  самое  можно сделать на БЕЙСИКе, хотя
здесь требуется побайтное извлечение адресных значений.  Ниже
приведена   программа   на   БЕЙСИКе,   которая   находит   и
распечатывает таблицу базы диска.
     100  REM  Программа на БЕЙСИКе для поиска и распечатки
               таблицы базы диска
     110  REM
     120  REM  Сначала необходимо установить указатель вектора
               прерываний
     130  REM
     140  DEF  SEG=0    'начало памяти
     150  OFFSET1=30*4  'смещение до вектора прерывания
     160  REM
     170  REM  Далее нужно определить смещение адреса вектора
     180  REM
     190  OFFSET2=PEEK(OFFSET1)+256*PEEK(OFFSET1+1)
     200  REM
     210  REM  Теперь нужно определить сегментную часть
               адреса вектора
     220  REM
     230  DEFSEG=PEEK(OFFSET1+2)+256*PEEK(OFFSET1+3)
     240  REM
     250  REM  Теперь можно начинать просмотр таблицы
     260  REM
     270  PRINT "Ниже следуют данные талицы базы диска в
                 шестнадцатиричном виде"
     280  FOR I=0 TO 10
     290    PRINT " ";
     300    IF PEEK(OFFSET2+1)=16 THEN PRINT"0"; 'добавмть
                            ноль для четности
     310    PRINT HEX$(PEEK(OFFSET2+1));
     320  NEXT I
     330  PRINT:PRINT
     Если  Вам  нужны средства для защиты от копирования, мы
предоставляем их Вам в двух формах.
     Программы  7.103  и   7.104,   имеющиеся   на   дискете,
прилагаемой   к   этой   книге,  предоставляют  процедуры  на
ассемблере и на Паскале, которые позволят организовать защиту
записи  и приспособить ее к Вашей схеме защиты. Кроме того, в
пакет входит готовая программа защиты, которую можно вызывать
как на БЕЙСИКе, так и на Паскале.
{  Листинг  7.1  -- процедуры на Паскале для доступа к пара-}
{  метрам "базы диска"                                      }
{ Этот фрагмент программы демонстрирует возможность доступа }
{ к "базе диска" или таблице управления дискетами. Этот     }
{ листинг разрабатывался для обеспечения наиболее легкой    }
{ настройки на конкретные нужды пользователей перед его ис- }
{ пользованием.                                             }
module Листинг 7.1;
type
disk_base_type = array [1..11] of byte;
{ Ниже кратко описаны все 11 байт таблицы : }
{ 1 : время шага; время вывода головки }
{ 2 : время ввода головки; режим ПДП }
{ 3 : время ожидания отключения двигателя }
{ 4 : длина сектора в байтах: 0=128,1=256,2=512,3=1024 }
{ 5 : конец дорожки (номер последнего сектора) }
{ 6 : длина межсекторного промежутка }
{ 7 : длина сегмента данных (когда не задана длина сектора) }
{ 8 : длина промежутка для форматирования  }
{ 9 : байт заполнитель для форматирования  }
{ 10: время установления головки           }
{ 11: время запуска двигателя              }
var
 disk_base          : disk_base_type;
 disk_base_pointer  : ads of disk_base_type; {сегментированный
                                             адрес}
 vector_pointrer    : ads of adsmem; {сегментированный адрес}
procedure disk_base_access;
  begin
{сначала указатель устанавливается на вектор прерывания базы}
{ диска}
    vector_pointer.s := 0; {раздел сегмента 0, начало памяти}
    vector_pointer.r := 30 * 4; {смещение для вектора 30}
{далее считывается вектор, чтобы установить местоположение}
{ таблицы}
    disk_base_pointer := vector_pointer ^;
{указатель базы диска ("disk_base_pointer") теперь содержит }
{сегментированный адрес, на который указывал указатель век- }
{тора ("vector_pointer") -- это означает, что указатель базы}
{диска теперь укаазывает на адрес фактического местонахожде-}
{ния таблицы                                                }
{Теперь будет выполняться проверка того. находится ли таблица}
{в оперативной памяти. Это можно установить попытавшись из-  }
{менить значение в таблице и затем проверив, изменилось ли   }
{оно на самом деле. Вместо этого мы просто проверим, в каких }
{адресах памяти располагается таблица.                       }
    if disk_base_pointer.s >= #F000 then
      begin
{адрес слишком велик - таблица в ПЗУ и изменить ее не удастся}
      end
    else
      begin
{все в порядке - таблица наверняка в ОЗУ}
      end;
{Теперь скопируем таблицу в свой буфер }
  disk_base := disk_base_pointer ^;
{База диска теперь содержит копию данных таблицы, на которую}
{указывал сегментированный адрес в указателе базы диска }
{Далее, изменим размер на 1024 байта и байт-заполнитель для}
{форматирования на АА. Эти изменения мы выполняем в своей  }
{копии, которую затем переносим в реальную таблицу. Впрочем,}
{то же самое изменение можно было бы выполнить и непосред-  }
{ственно в самой таблице.}
  disk_base [4] := 3; {установить размер сектора 1024 }
  disk_base [9] := #AA {шестнадцатиричное значение AA }
                     {или десятичное 170 выбрано произвольно}
  disk_base_pointer ^ := disk_base; {возвратить таблицу на }
                                    {место}
  end;
end.  {конец модуля listing_7_1 }
                                                                 
     
              
              
              ГЛАВА 8. ВИДЕОДОСТУП, ЧАСТЬ 1 - ТЕКСТОВЫЙ РЕЖИМ
              
              
              Практически любая программа, выполняемая на персона
льном 
         компьютере   фирмы   IBM   выводит   информацию   на    
экран 
         видеодисплея.  Существует  два  принципиально  различных
 вида 
         информации,представляемой на  экране  дисплея  IBM/PC:  
текст 
         (т.е.   литеры  алфавита  и  другие  символы)  и  график
а.  В 
         настоящей и в следующей главах  мы  рассмотрим  все  наи
более 
         существенные  аспекты,  связанные  с  доступом  к содерж
имому 
         экрана, расмотрение начнем с символьных текстов. 
              В отличие от остальных  глав  данной  книги,  эти  
главы 
         практически  не  содержат сведений, общих для всего семе
йства 
         компьютеров, использующих операционную систему MS-DOS.  
В  то 
         же  время  рассматриваемые  материалы  помогут нам устан
овить 
         степень совместимости всего класса персональных компьюте
ров с 
         персональным   компьютером   IBM/PC,   поскольку  больши
нство 
         распространенных программ для  IBM/PC  зависят  от  спец
ифики 
         представления информации на экране. 
              
              
              8.1. Типы экранов видеодисплеев
              
              Существует  множество  различных  типов   видеодисп
леев,
         подключаемых   к  компьютеру  IBM/PC,  обладающих  разли
чными
         характеристиками и особенностями программирования. Для  
того,
         чтобы   разобраться   в  этом  вопросе,  мы  опишем  наи
более
         существенные различия и покажем, как они соотносятся  с 
 теми
         сведениями,  которые  мы  приводим  в  настоящей  и след
ующей
         главах.
              Прежде всего,  следует  отметить,  что  к  персонал
ьному
         компьютеру   в   качестве   дополнительных  плат  могут 
 быть
         подключены   два   дисплейных    адаптера    -    одноцв
етный
         (монохромный)  и  цветной  графический.    Дисплейный ад
аптер
         связывает компьютер с монитором дисплея с помощью микрос
хемы,
         называемой  контроллером  электронно-лучевой трубки (экр
ана).
         Адаптер имеет также ряд программируемых портов  ввода-вы
вода,
         генератор символов в ПЗУ и оперативную память, которая х
ранит
         информацию, выводимой на экран информации.
              Изображение  на  экране,  как  уже   указывалось   
выше,
         генерируется   в   двух   основных   режимах  -  текстов
ом  и
         графическом. В текстовом режиме  на  экран  выводятся  т
олько
         символы,  хотя многие из этих символов можно использоват
ь для
         построения простых линейных  конструкций.  Графический  
режим
         используется   главным   образом  для  представления  сл
ожных
         изображений (схем, графиков, диаграмм, рисунков и т.п.),
 хотя
         и  допускает  возможность  представления  символов разли
чного
         размера и формы (формата).
              Одноцветный   адаптер   предназначен  для  использо
вания
         только с монохромным экраном дисплея фирмы  IBM.  Монохр
омный
         дисплей   не   может   воспроизводить   цвет  и  графику
.  Он
         предназначен только для работы в текстовом режиме, т.е. 
может
         представлять    только   текстовые   символы   и   прост
ейшие
         конструкции   (диаграммы),   синтезируемые    из    симв
олов,
         записанных   в   ПЗУ   в   коде  ASCII.  Многие  пользов
атели
         предпочитают  цветному   графическому   дисплею   монохр
омный
         (одноцветный),  поскольку с него легче производить считы
вание
         информации. Но, выбирая  монохромнвй  дисплей,  они  жер
твуют
         графическими  возможностями  и  цветом  - двумя очень це
нными
         качествами дисплея.
              Цветной  графический адаптер может работать с разли
чными 
         типами дисплеев. Он имеет  выходные  гнезда  для  двух  
видов 
         подключений  и  поэтому  допускает  подключение разнообр
азных 
         видеотерминалов.  На  одном  из  выходов  формируется  е
диный 
         составной  сигнал цветного изображения. На другом - отде
льные 
         сигналы для трех  основных  цветов  -  красного,  зелено
го  и 
         синего;   эти   сигналы   получили   обобщенное   назван
ие  - 
         RGB-сигнала. Этот адаптер может работать как в текстовом
, так 
         и  в  графическом  режимах,  формируя на экране изображе
ния и 
         символы нескольких форматов и различных цветов. Он разра
ботан 
         для работы с любыми видами дисплеев от обычного телевизо
ра до 
         цветного монитора с высокой разрешающей способностью. 
              К RGB-выходу подключаются специальные дисплеи, изве
стные 
         под  названием  RGB-мониторов.  К  выходу  составного си
гнала 
         могут быть подключены цветные дисплеи соответствующего  
типа. 
         К  этому же выходу подключаются и обычные цветные телеви
зоры, 
         снабженные  частотным  преобразователем.  Все   перечисл
енные 
         здесь типы дисплеев способны воспроизводить цвет. 
              К  выходу  составного  сигнала  можно  также  подкл
ючать 
         черно-белый компьютерный  дисплей.  В  этом  случае  на 
 вход 
         дисплея поступает сигнал цветности, который, однако, не 
может 
         быть в полной  мере  воспроизведен  средствами  дисплея.
  При 
         использовании    такого    дисплея    теряется    возмож
ность 
         воспроизведения цвета, а также высокое  качество  и  чет
кость 
         монохромного  дисплея  фирмы  IBM.  Это  самый дешевый с
пособ 
         отображения информации на экране. 
              Для  преодоления  ограничений,   присущих   одноцве
тному
         адаптеру,  некоторые  фирмы-изготовители  перешли  к  вы
пуску
         разновидностей одноцветного адаптера,  таких,  например,
  как
         популярный  дисплейный  адаптер  Геркулес,  который  соч
етает
         графические (но не цвет)  возможности  цветного  графиче
ского
         адаптера   с   высоким   качеством   воспроизведения  те
кста,
         характерным для одноцветного адаптера. В результате  кач
ество
         графики   оказывается   выше   качества,   даваемого  цв
етным
         графическим адаптером. Усиленный  графический  адаптер  
может
         создавать подобную графику на одноцветном экране.
              Приблизительно  две  трети всех персональных компью
теров 
         оборудованы стандартными одноцветными адаптерами и поэто
му не 
         обладают  графическими и цветовыми возможностями.Не смот
ря на 
         определенные  реальные  преимущества  использования  цве
та  и 
         графики,   большинство   персональных  компьютеров  прек
расно 
         обходятся  без  них.  Планируя  использование   персонал
ьного 
         компьютера   следует  помнить,  что  большинство  диспле
ев  - 
         текстовые. 
              Различные  аспекты  излагаемой  проблемы  в  настоя
щей и
         следующих  главах   в   той   или   иной   степени   кас
аются
         использования  различных  типов  дисплеев.  Для  того,  
чтобы
         избежать   возможных   недоразумений,   кратко   опишем 
   их
         возможности.
              Любые  сведения,  относящиеся  к  одноцветному адап
теру, 
         касаются только этого адаптера. Они  не  распространяютс
я  на 
         различные     аспекты    воспроизведения    цвета,    вк
лючая 
         использование черно-белого  монитора  с  цветным  графич
еским 
         адаптером. Черно-белый монитор можно рассматривать в кач
естве 
         монохромного;  он  однако  не  используется   с   одноцв
етным 
         адаптером.  Термин  "монохромный"  (одноцветный) использ
уется 
         только для монохромного экрана фирмы IBM. 
              Специфика  работы  цветного  графического  адаптера
   не
         применима   к   монохромному  дисплею.  Все  цветные  ди
сплеи
         разрабатываются с учетом этой специфики. Большинство сиг
налов
         цветного  графического  адаптера  воспринимается  черно-
белым
         монитором; исключение составляют сигналы цветности.
              Большинство черно-белых мониторов  обрабатывают  си
гналы 
         цветности    неудовлетворительно.    Черно-белые    мони
торы, 
         формирующие осмысленное  изображение  при  получении  цв
етных 
         сигналов  большая  редкость. Поэтому любая программа, ко
торая 
         может быть использована на компьютере с черно-белым мони
тором 
         не  должна  использовать  цвет; в противном случае она д
олжна 
         обладать способностью преобразовать любой цвет в  черно-
белую 
         палитру. 
              Цветные телевизоры,  как  правило,  имеют  более  н
изкую 
         разрешаемую  способность  по  сравнению  с  обычными цве
тными 
         мониторами  компьютеров.  Поэтому  цветные  телевизоры  
могут 
         работать   только   в   режиме   самой   низкой   разреш
ающей 
         способности, предусмотренной в IBM/PC, а именно в  режим
е  40 
         позиционных строк. В большинстве случаев цветной телевиз
ор не 
         позволяет использовать  всех  возможностей  IBM/PC;  наи
более 
         важные   программы   не   могут  выполняться  на  компью
тере, 
         оборудованном  цветным  телевизором.  Как   правило   цв
етной 
         телевизор  используется  программами  реализации компьют
ерных 
         игр,   ориентированных   на   использование   интерфейса
    с 
         накопителем на магнитной кассете. 
              
              
              8.2. Принципы формирования изображения
              
              Прежде чем перейти к дальнейшему рассмотрению текст
ового
         режима  работы  дисплея,  мы  для  уяснения  сути дела к
ратко
         рассмотрим некоторые принципы  представления  изображени
й  на
         экранах видеодисплеев. Существует два основных способа в
ывода
         информации   из    персонального    компьютера    на    
экран
         видеотерминала. В первом случае компьютер рассматривает 
экран
         дисплея в  качестве  обычного  устройства  ввода/вывода.
  При
         таком  подходе компьютер выдает контроллеру дисплея разл
ичные
         команды, включая команды вывода  текстовой  информации. 
 Ниже
         приводится некоторая упрощенная форма этих команд:
              
              ОЧИСТИТЬ ЭКРАН
              ВЫСВЕТИТЬ С 15 ПОЗИЦИИ 10 СТРОКИ СЛЕДУЮЩИЙ ТЕКСТ :
              "В случае готовности нажмите клавишу "ввод"" ...
              ПЕРЕМЕСТИТЕ КУРСОР В 43 ПОЗИЦИю 10-й СТРОКИ
              
              Наиболее существенный аспект взаимодействия такого 
 рода 
         состоит  в  том,  что  в  этом случае дисплей рассматрив
ается 
         просто  как   и   любое   другое   периферийное   устрой
ство. 
         Разумеется,  дисплей  может  выполнять  и  ряд  специфич
еских 
         команд, таких, которые не может выполнять принтер - напр
имер, 
         команду  "ОЧИСТИТЬ  КАДР" - и все же принцип взаимодейст
вия с 
         компьютером остается неизменным. 
              Преимущество  описанного  подхода  состоит  в  том,
  что 
         использование  команд позволяет рассматривать экраны дис
плеев 
         в одном ряду с другими устройствами ввода/вывода.  Вслед
ствие 
         этого   программное   обеспечение   поддержки   видеодис
плеев 
         становится  проще  и  более  унифицированным;  это  позв
оляет 
         универсальным   образом   использовать   множество  разл
ичных 
         компьютерных терминалов. Недостаток такого подхода в том
, что 
         компьютер  теряет  непосредственную связь с экраном дисп
лея и 
         оказывается не в состоянии "творить чудеса" на экране.  
Фирма 
         IBM пошла по пути "сотворения чудес" и поэтому выбрала д
ругой 
         подход подключения дисплея к IBM/PC. 
              Этот   подход   известен   как   подход,   связанны
й   с 
         регенерацией  изображения на основе образа экрана хранящ
егося 
         в  памяти.  В  этом  случае  компьютер  и  дисплей  совм
естно 
         используют  некоторое  пространство общей памяти. Электр
онные 
         схемы дисплея постоянно производят опрос (считывание)  п
амяти 
         и сразу же отображают результаты на экране. При таком по
дходе 
         компьютерная программа может осуществлять вывод информац
ии на 
         экран    путем   простого   изменения   содержимого   па
мяти. 
         Аналогично, считывание  информации  с  экрана  дисплея  
может 
         осуществляться  путем  обычного  считывания содержимого 
общей 
         памяти.   Таким   образом,   экран   дисплея   представл
яется 
         фактически  областью  памяти  и  выборка/занесение инфор
мации 
         из(в) память означает считывание или запись информации  
с(на) 
         экран дисплея. 
              В   персональном   компьютере   фирмы   IBM   факти
чески 
         используется  смешанный  подход.  Для  отображения  данн
ых на 
         экране используется хранимый в памяти образ экрана (карт
а)  , 
         а    для    управления   различными   аспектами   отобра
жения 
         используется система команд. В дисплейных системах с  же
сткой 
         реализацией  механизма  отображения  содержимого  памяти
 даже 
         управление   курсором    осуществляется    путем    изме
нения 
         содержимого     общей    памяти.    В    компьютере    I
BM/PC 
         позиционирование курсора  осуществляется  с  помощью  ко
манд, 
         даваемых схемой управления контроллером. Команды использ
уются 
         в следующих случаях: установки  размера  мерцающего  кур
сора, 
         очистки  и  обновления  экрана,  а также для изменения р
ежима 
         работы дисплея (текстовый-графический, 40  позиционный  
-  80 
         позиционный). 
              Работа в режиме хранимого в памяти образа экрана (к
арты) 
         связана с двумя потенциальными неудобствами (однако фирм
е IBM 
         удалось  найти  способ их преодоления). Первое состоит в
 том, 
         что этот образ требует для размещения  значительных  рес
урсов 
         оперативной  памяти;  для восьмиразрядных компьютеров ст
арого 
         исполнения  с  малой  оперативной  памятью  это  предста
вляло 
         серьезную проблему. В компьютере IBM/PC эта проблема реш
ается 
         в два приема. Во-первых, расширением пространства  адрес
уемой 
         памяти  до миллиона байт. Во-вторых, выделением дисплею 
своей 
         собственной встроенной памяти, с тем  чтобы  не  использ
овать 
         обычную  память,  предназначенную  для  хранения  програ
мм  и 
         данных. 
              Существуют  и  более  веские  основания  для обеспе
чения 
         дисплейного   адаптера   своей    собственной    памятью
    и 
         следовательно  разрешение  проблемы  конфликтов при дост
упе к 
         памяти. Дело в том, что дисплей с хранимой копией изобра
жения 
         (образа   экрана)  в  памяти  должен  постоянно  осущест
влять 
         операции чтения из памяти и, следовательно, конкурироват
ь  за 
         эту  память  с  микропроцессором.  В  этом  случае образ
уется 
         очередь за обладание схемными ресурсами доступа к памяти
. 
              Фирма IBM решила эту проблему  путем  выделения  ди
сплею
         своей  собственной  памяти и организовав доступ к этой п
амяти
         через  два  порта  ввода-вывода.  Такой  подход  обеспеч
ивает
         возможность  быстрого  доступа  к  общему  полю  памяти 
 и со
         стороны   процессора   и   со   стороны   дисплея.
              Если   внимательно   присмотреться  к  экрану  в  м
омент 
         генерации кадра изображения, то можно  заметить  что  бо
льшую 
         часть  времени  экран  дисплея  остается совершенно чист
ым, и 
         только в  некоторых  случаях  возникает  нечто  вроде  б
ыстро 
         исчезающей  помехи,  как  если  бы  курсор  попытались б
ыстро 
         переместить через весь экран дисплея. Такой эффект  возн
икает 
         как  результат  попыток  одновременного  доступа  к памя
ти со 
         стороны компьютера и со  стороны  дисплея.  Опасного  в 
 этом 
         ничего  нет,  любопытен  лишь  сам эффект и не более. Вз
яв за 
         основу дисплей, хранящий копию изображения в памяти, зак
репив 
         за  дисплеем  свою  собственную  область  памяти  и обес
печив 
         двусторонний  вход  в  память  фирма,   IBM   решила   з
адачу 
         визуализации  информации  наилучшим  образом.  Можно был
о бы, 
         правда, обеспечить и более  высокую  разрешающую  способ
ность 
         дисплея    в    текстовом   режиме,   а   также   реализ
овать 
         пиктографический режим, хотя бы в том  объеме  как  это 
 было 
         впервые  сделано  для  рабочей  станции  "Стар"  (STAR) 
фирмы 
         "Ксерокс" или для компьютера "Лиза" ( Lisa) фирмы "Apple
". 
              В базовом варианте распределения памяти для  IBM/PC
  под
         память  дисплея отводилось 128Кбайт. Это верный признак 
того,
         что фирма IBM намеривалась реализовать все эти возможнос
ти.
              Это   все,   что  следует  знать  читателю,  прежде
  чем 
         приступать к более глубокому  изучению  вопросов  отобра
жения 
         информации  на  экране  дисплея.  В  следующем  параграф
е  мы 
         изложим  наши  взгляды  на  принципы  построения  графич
еских 
         систем, а затем рассмотрим детали построения хранимого о
браза 
         экрана и обсудим такие понятия как "страницы" и "атрибут
ы". 
              Память дисплея физически размещается  вместе  с  др
угими 
         схемами  дисплея  на  плате  адаптера.  Однако логически
 (для 
         центрального  процессора)  она  является   частью   осно
вного 
         адресного  пространства  компьютера.  Для  дисплея  отво
дится 
         128Кбайт памяти в  блоках  А  и  В  с  адресами  А0000(1
6)  - 
         BFFFF(16),  однако  оба  стандартно  поставляемых  диспл
ейных 
         адаптера используют лишь два небольших фрагмента этой об
ласти 
         памяти.  Одноцветный адаптер использует 4К дисплейной па
мяти, 
         начиная  с  адреса  B800.  Оставшаяся  память,  в  частн
ости, 
         64-килобайтный  блок  от  A000 до B000 отводится для раз
вития 
         возможностей дисплея, например, для использования диспле
йного 
         графического адаптера. 
              Одноцветный и цветной  графические  адаптеры  испол
ьзуют 
         для вывода информации на экран дисплея так называемый би
товый 
         образ  изображения  (экрана)  хранящегося  в  описанной 
 выше 
         памяти.    Каждая   ячейка   области   памяти   соответс
твует 
         определенной позиции экрана, между ними  установлено  вз
аимно 
         однозначное соответствие. 
              Схемы  дисплея  периодически  считывают  информацию
   из 
         памяти и выводят ее на экран. Программа может непосредст
венно 
         изменять содержимое  памяти,  тем  самым  изменяя  содер
жимое 
         экрана.  Контроллер  экрана служит для связи памяти дисп
лея с 
         монитором, преобразуя поток  получаемых  из  памяти  бит
ов  в 
         электронные  пучки, направляемые в определенные точки эк
рана. 
         Точки  экрана  называть  пикселями,  пэлами  или   элеме
нтами 
         изображения.   Они   образуются   при   столкновении   п
отока 
         электронов  с  люминофором   поверхности   электронно-лу
чевой 
         трубки.  Поток  электронов  испускается  электронной пуш
кой и 
         построчно перемещается сверху  вниз.  По  мере  его  дви
жения 
         контроллер    электронно-лучевой    трубки   модулирует 
  его 
         интенсивность в зависимости от комбинации  битов,  получ
енных 
         из памяти дисплея. 
              Видеосхема  обновляет  экран  60  раз  в  секунду, 
делая
         меняющееся изображение отчетливым и ясным.  В  конце  ка
ждого
         цикла    обновления    экрана    электронный   пучек   д
олжен
         переместиться из нижнего правого угла экрана  в  его  ве
рхний
         левый  угол.  Это  перемещение называют вертикальным обр
атным
         ходом. Во время обратного хода луча его подача на поверх
ность
         экрана блокируется.
              Время  обратного  вертикального  хода  луча   соста
вляет
         1,25мсек и может учитываться программистом.
              
              
              8.3. Структура копии изображения экрана
              
              
              Выше уже говорилось о том, что дисплеи компьютера I
BM/PC
         относятся  к классу дисплеев, хранящих битовый образ экр
ана в
         памяти (карту) памяти. В связи с этим  обстоятельством  
имеет
         смысл  рассмотреть  принципы  построения  этого  образа.
  
              Описываемый здесь образ экрана в памяти применим  к
ак  к 
         монохромному,  так  и  к  цветному  графическрому  адапт
ерам, 
         работающим  в  тесктовом  режиме.  Графические  режимы  
будут 
         рассмотрены  в следующей главе с учетом особенностей хра
нения 
         изображений в памяти (Более подробные  сведения  о  разл
ичных 
         режимах  работы  цветного  графического  адаптера и неко
торые 
         интересные возможности описаны в разделе 8.11.). 
              Поскольку  дисплейные  адаптеры  используют  специа
льную 
         двухвходовую  память,  не  следует  удивляться  тому, чт
о она 
         размещается  особым   образом.   Физически   память   ди
сплея 
         размещается  на  схемной  плате  и плате расширения адап
тера. 
         Схемная плата содержит также микросхему контроллера дисп
лея и 
         все  вспомогательные  элетронные  схемы.  Эта  плата, по
добно 
         другим   платам   для   IBM/PC,   вставляется   в   один
   из 
         дополнительных   разъемов,   предназначенных  для  поклю
чения 
         вспомогательного оборудования. 
              Несмотря на то, что память дисплея физически размещ
ается 
         на  плате  контроллера  дисплея,  логически  она   ничем
   не 
         отличается  от  обычной  памяти  в  том смысле, что допу
скает 
         считывание и запись информации  путем  обращения  по  ад
ресу. 
         Дисплеям  двух  различных  типов  отводятся различные уч
астки 
         памяти  (об  этом  уже  говорилось   при   обсуждении   
основ 
         использования  памяти  персонального  компьютера  в глав
е 3), 
         поэтому они  могут  быть  одновременно  подключены  к  о
дному 
         компьютеру.  Монохромному  дисплею  отводится область па
мяти, 
         начиная  с  шестнадцатеричного  адреса   B000,   а   цве
тному 
         графическому - с адреса B800. 
              Читателю,  знакомому  с Бейсиком, напомним, что дос
туп к
         памяти осуществляется с помощью операторов PEEK и POKE  
после
         того, как установлен нужный указатель сегмента
           
              10 DEF SEG = &HB000 (память монохромного дисплея)
              20   DEF  SEG  =  &HB800  (память  цветного  графич
еского
         дисплея) 
         
              После приведенных кратких сведений  о  принципах  р
аботы
         дисплея  с  хранимым  образом экрана в памяти имеет смыс
л еще
         раз обратиться к диаграмме на рис. 8.1.
              
              Процесс  отображения   содержимого   экрана   в   п
амять 
         начинается  с  определения позиций отдельных символов эк
рана. 
         Каждой  позиции  экрана  соответствует  два   байта   па
мяти. 
         Совместно эти  два байта задают собственно объект подлеж
ащий, 
         отображению на экране и то, как его следует отобразить. 
              Первый   из   двух   байтов   (имеющий   четный   а
дрес) 
         специфицирует  собственно  объект (т.е. "что" отображает
ся на 
         экране). Это шестнадцатеричный код символа ASCII. Второй
 байт 
         (имеющий  нечетный  адрес)  специфицирует  режим  отобра
жения 
         первого байта (т.е. "как" символ отображается на экране)
. Это 
         так называемый байт-атрибутов. В случае цветного графиче
ского 
         адаптера   байт-атрибутов   управляет   цветом.   В    с
лучае 
         монохромного  адаптера  байт-атрибутов  управляет  яркос
тью и 
         подчеркиванием   символа;   это   своего   рода   монохр
омные 
         эквиваленты  цвета.  Кроме  того байт-атрибутов устанавл
ивает 
         режим мерцания символа (для адаптеров обоих типов). Дета
льное 
         описание байта-атрибутов приводится в разделах 8.5 и 8.6
. 
              Первой  позиции экрана (верхний левый угол соответс
твует 
         таким образом два байта в  памяти  дисплея  со  смещение
м  0. 
         Следующей  позиции  (смещенной  на  одно  знакоместо  вп
раво) 
         соответствуют  два  байта  памяти   со   смещением   2, 
  Так 
         продолжается  до  конца  первой  строки  экрана  дисплея
. Для 
         монохромного  дисплея,  а  также  для  цветного  графиче
ского 
         дисплея,  работающего  в  80-ти позиционном режиме после
днему 
         символу строки  соответствует пара байтов  со  смещением
  158 
         (т.е. 79х2). Для цветного графического дисплея, работающ
его в 
         40- позиционном  режиме,  последней  позиции  первой   с
троки 
         соответствует пара байтов памяти со смещением 78 (т.е. 3
9х2). 
              При  переходе  к  новой строке позиции экрана продо
лжают 
         отображаться парой смежных байтов таким образом,  что  п
ервой 
         позиции   следующей   строки   соответствует   пара   ба
йтов, 
         расположенных  непосредственно  вслед  за  байтами  посл
едней 
         позиции  предыдущей  строки.  Область памяти используетс
я без 
         промежутков, т.е. какие-либо  пробеловы  между  концом  
одной 
         строки  и  началом  другой  строки - отсутствуют. Разуме
ется, 
         речь идет о физических промежутках,  поскольку  в  логич
еском 
         плане вполне естественно говорить о вычислении местополо
жения 
         границы между строками. 
              Все  сказанное  выше  распространяется  как   на   
80-ти 
         позиционный,  так  и  на  40-позиционнный режимы. Поэтом
у при 
         переходе  из  одного  режима  в  другой   должна   измен
иться 
         структура расположения в памяти позиций и строк. 
              Монохромный  и  цветной  графический  дисплеи  в   
80-ти
         позиционном  режиме требуют 4000 байтов: 80 позиций х 2 
байта
         х 25 строк. Цветной  графический  адаптер  в  40- позици
онном
         режиме требует вдвое меньшей памяти, т.е. порядка 2000 б
айт.
              Следствием  такой  схемы хранения образа экрана в п
амяти 
         является то, что отображаемые символы могут  располагать
ся  в 
         любом  другом  месте  памяти.  А это, в свою очередь, со
здает 
         неудобства  при  перемещении  сообщений  в  память   дис
плея. 
           
         Сообщения  или  любые  другие  строки  отображаемых данн
ых не 
         могут быть перемещены по месту назначения за один  шаг, 
 если 
         форма  их  хранения  в  программах  не  предполагает  на
личия 
         байтов-атрибутов.  Сообщение,  таким  образом,  должно  
 быть 
         представлено    в    виде   чередующейся   последователь
ности 
         содержательных и атрибутивных байтов. Поскольку большая 
часть 
         данных  выводятся  на  экран в виде строк символов с одн
ими и 
         теми же атрибутами, то возникает  потребность  в  специа
льных 
         программах   перемещения  данных  в  нужную  область  па
мяти, 
         которые бы попутно дополняли их нужными  атрибутами.  Ли
стинг 
         8.2  содержит тексты некоторых служебных программ на Пас
кале, 
         реализующих  эти  функции;  в  параграфе  8.7.  этот   в
опрос 
         рассмотрен более детально. 
              Поскольку  в  памяти,  отведенной  дисплею,  отсутс
твуют 
         физические   границы   между   строками,   то   могут   
 быть 
         автоматически  перенесены  в следующие строки, путем про
стого 
         использования очередных  адресов.  Это  довольно  эффект
ивный 
         способ  решения  проблемы  переноса  сообщений с минимал
ьными 
         затратами.  В  тех  случаях,  когда  важно  фиксировать 
 факт 
         достижения сообщением конца строки, следует предусматрив
ать в 
         программах  проверку   и   обработку   этого   условия. 
  Для 
         использования   монохромного  адаптера  требуется  4000 
 байт 
         памяти. Это приблизительно соответствует 4К (4096). Лишн
ие 96 
         байтов   не   используются  и  остаются  свободными.  Цв
етной 
         графический  адаптер  требует  значительно  большего   о
бъема 
         памяти, а именно, 16К. Это объясняется большими потребно
стями 
         памяти. 
              Объем    памяти,    используемой   цветным   графич
еским
         адаптером, составляет  16К  байт.  Такой  значительный  
объем
         памяти   определяется   потребностями   графических  реж
имов,
         детально  описываемых   в   следующей   главе.   Персона
льный
         компьютер использует излишки памяти (когда эта память ре
ально
         не используется в графических режимах) путем  организаци
и  (в
         текстовом  режиме)  набора  копий  кадров  экрана.  Эти 
копии
         принято  называть  страницами.  В  следующем   параграфе
   мы
         рассмотрим    принципы    организации    и   функциониро
вания
         страничного механизма.
              
              
              8.4. Страничный механизм цветного графическоно дисп
лея
              
              Материалы  настоящего   параграфа   в   первую   оч
ередь 
         относятся    к   компьютерам   IBM/PC,   снабженным   цв
етным 
         графическим адаптером. Однако, по мере изложения станет 
ясно, 
         что  эта  концепция  может быть распространена и на сист
ему с 
         монохромным  адаптером.  Поэтому,  если  читателя  интер
есуют 
         только  системы  второго  класса (либо универсальные сис
темы) 
         данный параграф, несомненно, представляет интерес. 
              В   отличие   от  монохромного  адаптера,  объем  п
амяти 
         которого в точности соответствует размеру заполненного  
кадра 
         дисплея,  цветной  графический  адаптер  располагает  па
мятью 
         гораздо большего объема,  чем  это  требуется  для  рабо
ты  в 
         текстовом  режиме.  Это  объясняется  тем,  что  для раб
оты в 
         графическом режиме  требуются  значительные  ресурсы  па
мяти. 
         Фирма  IBM  пошла  по  пути  реализации страничного меха
низма 
         работы с кадрами изображения. 
              Страница представляет собой  образ  (копию)  содерж
имого 
         экрана  дисплея  в  памяти  компьютера.  В  80-ти позици
онном 
         текстовом режиме цветной графический адаптер требует пам
яти в 
         4  раза  (а  в  40  -  позиционном текстовом режиме в 8 
раз ) 
         меньше фактически имеющейся. Поэтому  память  этого  ада
птера 
         может хранить либо 4, либо 8 страниц. 
              Любая  страница  изображения  представляет  собой п
олную 
         копию содержимого экрана дисплея,  включающую  байты  да
нных, 
         байты-атрибутов  и  построчно-логическое  разбиение симв
олов. 
         Работая  в  80-ти  позиционном  режиме,  цветной  графич
еский 
         адаптер может хранить четыре полных копии одного кадра э
крана 
         монохромного адаптера. При работе в 40 -  позиционном  р
ежиме 
         число  таких  кадров увеличивается до 8; при этом каждый
 кадр 
         обладает вдвое меньшей информационной емкостью. 
              Информация,  хранящаяся  в каждой  из четырех или в
осьми
         страниц, может в любой  момент  времени  быть  отображен
а  на
         экране.  Остальные  страницы  в  это  время, подобно акт
ерам,
         ожидающим  выхода  на  сцену,  ждут  своей  очереди.  По
лучив
         команду, дисплейный адаптер переключается с одной страни
цы на
         другую, таким образом мгновенно обновляя содержимое экра
на.
              Прользовательская программа  может  формировать  да
нные,
         подлежащие  отображению  на  дисплее, путем обычной запи
си по
         соответствующему адресу,  либо  путем  использования  фу
нкций
         обслуживания   BIOS,   позволяющих   оперировать   с   н
ужной
         страницей.    После    того,    как    актуализация    д
анных
         закончена, сформированный в памяти образ  экрана  может 
 быть
         мгновенно  отображен  на дисплее путем переключения адап
тером
         активной  страницы.  Такой  подход  делает  программу   
более
         оперативной,  поскольку  пользователь  не ощущает трудое
мкого
         процесса формирования образа экрана - он видит  лишь  бы
строе
         появление результата.
              Возможности программ в  части  использования  стран
ичной 
         техники   представляют   довольно  интересное  явление. 
 Если 
         программа  использует  несколько  стандартных  форматов 
  для 
         представления  информации,  то  она может сформировать к
аждый 
         формат только один раз и сохранить его  в  страничной  п
амяти 
         дисплея.  В  случае  возникновения  потребности  переход
а  от 
         одного формата к другому программа  может,  сохранив  те
кущую 
         страницу  на  экране,  форматировать данные другой стран
ицы и 
         завершив этот процесс, переключить адаптер дисплея  на  
новую 
         страницу.  Такого  рода  техника  работы  с  памятью  ди
сплея 
         создает впечатление, что  программа  обладает  более  вы
сокой 
         производительностью,    поскольку    изображение   появл
яется 
         мгновенно. В выигрыше оказывается и  пользователь  прогр
аммы, 
         получая  более  стабильное  изображение  на  экране  дис
плея. 
         Поскольку  мелкие   изменения  не  допускаются, то надеж
ность 
         человеко-машинного  интерфейса повышается - в этом случа
е нет 
         необходимости каждый раз отыскивать на экране места возм
ожных 
         изменений и проверять все ли на месте. 
              Еще  одна  потенциальная  сфера использования стран
ичной
         техники при работе с дисплеем  состоит  в  более  соверш
енной
         передаче   динамических   изображений.   Если   же  изме
нения
         производятся "за кадром" и представляются пользователю в
 виде
         цельного  изображения  путем  замены  активной  страницы
,  то
         динамический характер изображения передается более плавн
о.
              Дисплейные страницы пронумерованы от 0 до 3, либо  
от  0 
         до  7  в  случае более мелких 40 позиционных страниц. Ну
левая 
         страница, как это можно предположить, располагается в  н
ачале 
         области  памяти дисплея; вслед за ней располагаются оста
льные 
         страницы. Началу каждой страницы соответствует адрес  кр
атный 
         1К.  Поясним  это  на  примере.  Дисплей,  работающий в 
80-ти 
         позиционном режиме, требует для  каждой  страницы  4000 
 байт 
         памяти  (25  строк х 80 позиций х 2 байта на позицию). П
ервая 
         страница, то есть страница,  имеющая 0 номер, располагае
тся в 
         памяти  цветного  графического  адаптера  с 0 смещением 
( это 
         соответствует параграфу с адресом B800). Вторая страница
,  то 
         есть  страница, имеющая номер 1-й, размещается не вплотн
ую за 
         первой  страницей  (с  относительного  адреса  4000),   
а   с 
         ближайшего  адреса  кратного одному килобайту ( относите
льный 
         адрес 4К или 4096 байт). В 80-ти  позиционном  режиме  р
аботы 
         дисплея  страницы  размещаются  с интервалом в 4К байтов
, а в 
         40-позиционном - с интервалом в 2К  байта.  На  рисунке 
 8.2. 
         показано размещение страниц в памяти дисплея. 
              Управление    страничным    механизмом   дисплея   
можно
         осуществлять в рамках Бэйсика.  Пользователь,  работающи
й  на
         Паскале  такой возможности лишен, если он не выходит за 
рамки
         этого  языкового  процессора;  если  же  связь   с   BIO
S-ПЗУ
         осуществляется  через программу, написанную на ассемблер
е, то
         эта задача вполне разрешима. В параграфе 8.11 мы покажем
  как
         это   делается    (готовая   программа  записана  на  ди
скету,
         прилагаемую к настоящей книге).
              Монохромный    дисплей    не     обладает     описа
нными
         функциональными  возможностями,  однако  эта  концепция 
может
         быть   реализована   (имитирована)    в    обычной    па
мяти.
         Пользовательские  программы могут использовать эту памят
ь для
         хранения  полного  образа  экрана,  своего  рода  эквива
лента
         дисплейных  страниц.  Эти  пассивные  экранные  образы  
можно
         переместить в память  дисплея  используя  средства  стро
ковой
         пересылки микропроцессора 8086/8088.
              Пользователям,  работающим  на  Паскале, предоставл
яется 
         встроенная процедура MOVESL. Я использовал  эту  процеду
ру  в 
         ряде  своих программ и могу засвидетельствовать, что заг
рузка 
         экрана  происходит  совершенно  незаметно  для  человече
ского 
         глаза  -  смена  изображения  производится мгновенно, ка
к и в 
         случае  смены  страницы  в  цветном   графическом   адап
тере. 
         Описанный  метод  весьма эффективен - настоятельно реком
ендую 
         его применять во всех  программах,  не  предъявляющих  о
собых 
         требований к объему используемой памяти. 
              Причина,  по  которой лишь немногие программы испол
ьзуют
         страничный механизм цветного графического адаптера  очев
идна:
         большинство  программ  для  IBM/PC  должны работать один
аково
         хорошо как в случае цветного, так  и  в  случае  монохро
много
         монитора.
              Эффективное  использование  страничного  механизма 
может
         быть  достигнуто  только  в  том   случае,   если   прог
рамма
         специально   написана   для   применения  в  составе  си
стемы
         обработки  графических   образов,    либо   когда   прог
рамма
         настолько  важна, что можно ожидать подстройку аппаратур
ы под
         нужды этой программы. К числу  известных  примеров  отно
сится
         программа Context  MBA.  Следует  также  иметь  в  виду,
  что
         имитация  описанного  выше  страничного дисплейного меха
низма
         всегда осуществима для  любого  компьютера  IBM/PC,  име
ющего
         достаточный объем памяти.
              
              
              8.5. Атрибуты изображений
              
              Следом   за  байтом  символа,  расположенного  в  п
амяти 
         дисплея  по  четному  адресу   расположен   байт   атриб
утов, 
         описывающий  особенности  отображения на экране дисплея 
этого 
         символа. В данном параграфе  мы  рассмотрим  структуру  
байта 
         атрибутов и назначение всех его компонентов. 
              Программа,  написанная   на   Бэйсике,   приведенна
я   в
         приложении   (листинг   8.1)   демонстрирует   все  возм
ожные
         комбинации битов байта атрибутов как для монохромных,  т
ак  и
         для  цветных графических дисплеев. В процессе выполнения
 этой
         программы  у   пользователя   формируется   представлени
е   о
         функциональных   возможностях   и   особенностях   работ
ы   с
         атрибутами изображения.
              Байт атрибутов управляет мерцанием символа и его  ц
ветом
         (или монохромным аналогом цвета). Этот байт состоит из в
осьми
         разрядов,  причем  каждому  разряду  отводится  своя  ро
ль  в
         процессе  построения  изображения.  На  рисунке 8.3 прив
едена
         схема, иллюстрирующая назначение каждого разряда.  Сущес
твует
         множество различных способов идентификации отдельных раз
рядов
         байта. Здесь мы будем  придерживаться  схемы  нумерации 
 этих
         разрядов слева-направо (см.рис. 8.3).
              Все  восемь  разрядов  байта  разбиты на четыре кла
сса и 
         рассматриваются  в  контексте  этого  разбиения.   Все, 
  что 
         выводится  на  экран  - в конкретную его позицию - состо
ит из 
         двух  компонентов:  собственно  символа  (очертания)  и 
  его 
         окружения  или  фона.  Поскольку  цветной  дисплей  имее
т три 
         основных цвета (красный, зеленый и  синий),  то  очертан
ию  и 
         фону    соответствуют   по   три   разряда   байта-атриб
утов, 
         описывающие их цвета (или монохромные аналоги  цвета).  
Таким 
         образом:  разряды  с  6-го по 8-й управляют цветом симво
ла, а 
         разряды с 2-го по 4-й управляют цветом фона. Они  и  обр
азуют 
         два класса признаков (из четырех) байта атрибутов. 
              Оставшиеся  два класса признаков фиксируют интенсив
ность
         и мерцание изображения. Под эти признаки отводится по  о
дному
         разряду.  Первый  разряд  каждого  байта  атрибутов опис
ывает
         мерцание  фоновой  составляющей  позиции  экрана ( если 
  бит
         установлен  в  1, то имеет место мерцание ). Заметим зде
сь, что
         мерцание распространяется только на фоновую составляющую
 и не
         затрагивает собственно очертания символа.
              Последний  класс  признаков (5-й разряд) байта атри
бутов
         предназначен для управления  интенсивностью  фона.  Если
  5-й
         разряд  установлен  в  1,  то  в  случае монохромного ди
сплея
         яркость символа будет повышена;  в  случае  цветного  ди
сплея
         будет  иметь  место  более  яркий  и  светлый  тон. Неко
торые
         цветные мониторы не используют бит интенсивности  цвета;
  для
         этих мониторов яркие фоновые цвета совпадают с обычными.
              Для   получения   разнообразных   цветов  соотвеств
тенно 
         устанавливаются или сбрасываются разряды тех или иных цв
етов. 
         Так,  для  получения красного фона следует устанавливать
 в"1" 
         разряд красного цвета (6-й разряд), а два  остальных  ра
зряда 
         обнулить.  Комбинация  двух основных цветов дисплея позв
оляет 
         синтезировать дополнительные цвета. Смесь зеленого  и  с
инего 
         цветов  дает сине-зеленый цвет, так называемый циан. Есл
и все 
         три разряда находятся в нулевом состоянии,  то  в  резул
ьтате 
         будет  получен  черный  цвет. Смесь всех трех основных ц
ветов 
         дает на выходе  белый  цвет.  При  внимательном  рассмот
рении 
         символов  белого  цвета на цветном экране можно различит
ь все 
         три основных цвета. 
         ________________________________________________________
____
              Порядковый      Значение *        Функция
              номер раз-
              ряда
         ________________________________________________________
____
              1-й               128         Мерцание
              2-й               64          Красная      !   Фоно
вый
                                            составляющая !    цве
              3-й               32          Зеленая      !
                                            составляющая !
              4-й               16          Синяя        !
                                            составляющая !
                
              5-й                8          Интенсивность!   Фоно
вый 
                                                               цв
ет
              
              6-й                4          Красный      ! Цвет
              7-й                2          Зеленый      ! очерта
ния
              8-й                1          Синий        ! (симво
ла)
         ________________________________________________________
____
          *) Численное  значение  позиции  разряда.  Используется
   в
         случае  задания  атрибута  в  виде  числа. Например: Мер
цание
         (128) зеленого  символа (2) на красном (64) фоне - 128 +
 2  +
         64 = 194
              
              Рис.8.3. Управляющие атрибуты дисплея
              
              Полный  перечень всех возможных цветовых сочетаний 
будет
         приведен   в  следующем  параграфе  .  По  мере  рассмот
рения
         различных  аспектов,  связанных  с  использованием  атри
бутов
         изображения мы узнаем много нового, в частности, специфи
ку их
         работы как в случае цветного графического,  так  и  в  с
лучае
         монохромного адаптера.
              Операционная  система  DOS обеспечивает нормальный 
режим
         работы с белыми символами на черном  фоне  даже  при  на
личии
         цветного    экрана   видеомонитора.   Большинство   прог
рамм,
         работающих под управлением DOS, генерируют выходные данн
ые  в
         черно-белом варианте. Однако при наличии программы управ
ления
         атрибутами  изображения   (например,   программ   Revers
e   и
         Screen-Atribute   из   библиотеки   "Нортон  Ютилити")  
можно
         привести  их  к  цветному  варианту.  При  работе  с  цв
етным
         монитором  я  нахожу,  что  ярко-желтые символы на синем
 фоне
         гораэдо меньше утомляют глаза,  чем  любое  другое  соче
тание
         цветов.  Поэтому  для  себя устанавливаю следующую комби
нацию
         атрибутов:  00011110  (или  1Е  в  шестнадцатеричной  си
стеме
         счисления).  Воспользовавшись программой, написанной на 
языке
         Бэйсик (см. листинг 8.1), Вы имеете  возможность  сопост
авить
         между  собой все допустимые сочетания цвета очертания си
мвола
         и его фона и после этого остановить свой выбор  на  одно
м  из
         них.
              Фирма  IBM  выработала  оригинальный  подход  к  ре
шению 
         проблемы  совместимости  монохромного  и  цветного  дисп
леев. 
         Первое,  что  было  сделано  -  осуществлен  выбор   осн
овных 
         технических  решений,  касающихся  цветного  дисплея (на
личие 
         трех базовых составляющих цвета для очертания символа  и
  его 
         фона,  а также мерцание и высокая интенсивность); после 
этого 
         средствами  монохромного  дисплея  удалось  добиться   в
есьма 
         эффективной интепретации цветовых составляющих. 
              Атрибуты монохромного дисплея  имеют  ряд  положите
льных 
         качеств,   им   присущи  однако  и  недостатки,  связанн
ые  с 
         обеспечением целостности и совместимости. Проиллюстрируе
м это 
         положение  сначала более простыми примерами, а затем пер
ейдем 
         к более сложным случаям. 
              Разряд  мерцания  (разряд  1),  как  и  разряд  ярк
ости,
         называемый также разрядом повышенной  интенсивности  све
чения
         (разряд  5),  используется  одинаково  как монохромным, 
так и
         цветным графическим дисплеем. Если разряд мерцания устан
овлен
         в единичное состояние, то отображаемый символ мерцает, е
сли в
         единичном состоянии находится разряд яркости, то отображ
аемый
         символ выделяется повышенной яркостью.
              Оставшиеся разряды байта атрибутов  специфицируют  
цвета 
         для   очертания  и  фона  символа.  Заметим  здесь,  что
  для 
         монохромного дисплея  понятие  цвета  отсутствует.  Посл
еднее 
         утверждение  не следует понимать буквально, поскольку, с
трого 
         говоря,    монохромный    дисплей    имеет     два     ц
вета: 
         зеленовато-фосфорный  и  черный. Зеленовато-фосфорный (б
елый) 
         цвет  соответствует  свечению  люминофора,  а   черный  
 цвет 
         свидетельствует   об  отсутствии  свечения.  Любая  возм
ожная 
         комбинация цветов очертания  и  фона  в  случае  монохро
много 
         дисплея  изображена  на экране в виде зеленоватого симво
ла на 
         черном фоне. 
              Стандартный  набор  признаков  в   случае   монохро
много
         дисплея  обеспечивает  режим  отображения  такой  же  ка
к и в
         случае цветного графического дисплея, а именно: белые си
мволы
         (кодовая  комбинация  разрядов  цветности 111) на черном
 фоне
         (кодовая  комбинация  разрядов  цветности  000);   исклю
чение
         составляют  три  особых  случая.  Любой  код  цветности 
 ( за
         исключением  трех  случаев  рассматриваемых  ниже)   выз
ывает
         последствия,  аналогичные стандартному набору признаков,
 т.е.
         свечение зеленоватых символов на черном фоне.
              Два из трех особых  случаев,  представляются  более
  или 
         менее   очевидными.   Если   кодовая   комбинация   приз
наков 
         соответствует режиму отображения "черное-на черном" (т.е
. все 
         разряды  цветности  находятся  в нулевом состоянии), то 
любой 
         отображаемый символ становится  невидимым.  Если  же  ко
довая 
         комбинация   признаков   соответствует   режиму   отобра
жения 
         "черное-на-белом"  (разряды  очертания  хранят  код  000
,   а 
         фоновые  разряды  -  код  111), то имеет место так назыв
аемое 
         обратное  или  реверсное  изображение  (черные   символы
   на 
         зеленовато-фосфорном  фоне).  Здесь имеется полная анало
гия с 
         цветным  дисплеем,  когда  черный  символ  на   черном  
 фоне 
         неразличим,  а  изображение  черного  символа  на  белом
 фоне 
         называется  обратным.   Вполне   естественно   ожидать, 
  что 
         четвертая  комбинация признаков, соответствующая режиму 
белый 
         символ на белом фоне, порождает  невидимые  символы.  Од
нако, 
         фирма  IBM  пошла другим путем. В случае монохромного ди
сплея 
         комбинация признаков байта атрибутов, соответствующая  р
ежиму 
         белый   символ   на   белом   фоне,   фактически  сводит
ся  к 
         использованию стандартного  формата  изображения  зелено
ватых 
         символов на черном фоне (аналогично тому, как то происхо
дит в 
         случае всех остальных комбинаций цветовых признаков). 
              И  последний  аспект  представления информации на э
кране
         монохромного дисплея  связан  с  возможностью  подчеркив
ания.
         Фирма  IBM предлагает своим пользователм монохромный дис
плей,
         обладающий возможностью подчеркивания  символов.  В  тер
минах
         признаков   цветности  подчеркивание  представляется  в 
 виде
         синего очертания (код цветности  001)  и  черного  фона 
 (код
         цветности  000).  Собственно  цветной  графический адапт
ер не
         предусматривает реализации функции подчеркивания, однако
  сам
         факт  использования  синих  символов  на  черном фоне со
здает
         впечатление некоторого акцентирования.
              Поскольку  монохромный  дисплей  допускает представ
ление 
         обратных   изображений  и  реализует  функцию  подчеркив
ания, 
         можно  ожидать,  что  допустимо  их сочетание в рамках о
дного 
         кадра. Однако это не так. Цветовые комбинации, которые  
можно 
         было  бы  здесь  использовать (синий символ на белом фон
е или 
         черный символ на синем фоне), интерпретируется  системой
  как 
         стандартные,   ничем   не  отличающиеся  от  других  цве
товых 
         комбинаций. 
              
              8.6. Особенности воспроизведения цвета
              
              В  данном  параграфе мы рассмотрим различные особен
ности
         воспроизведения цвета на  цветном  видеомониторе,  снабж
енном
         цветным  графическим  адаптером.  Следует  иметь  в виду
, что
         черно-белый  монитор с цветным графическим адаптером цве
т  не
         воспроизводит.  Здесь  следует  также  отметить,  что  м
ногие
         широко распространенные  черно-белые  мониторы  не  корр
ектно
         воспринимают    сигналы    цветного    изображения,   по
этому
         информация, содержащая цветовые  компоненты  и  выводима
я  на
         черно-белый монитор, может оказаться искаженной или неви
димой.
              Теоретически    цветной    дисплей   компьютера   I
BM/PC
         воспроизводит  шестнадцать  различных   цветов.   Это   
число
         получается   следующим  образом.  Во-первых,  имеется  в
осемь
         различных  цветовых  сочетаний,  образуемых  тремя  осно
вными
         цветами  -  красным,  зеленым  и синим. Во-вторых, любой
 цвет
         очертания символа может быть воспроизведен в двух режима
х;  в
         режиме нормальной и в режиме повышенной яркости (цвет вы
сокой
         интенсивности). Управление этими  режимами  осуществляет
ся  с
         помощью   бита   интенсивности.  Таким  образом,  допуск
ается
         воспроизведение шестнадцати цветов при отображении  очер
тания
         символа и восьми цветов при отображении фона. 
              (Графический режим, который будет рассмотрен в след
ующей
         главе  также  допускает  использование  шестнадцати   цв
етов,
         однако  особенности  их использования для очертания симв
ола и
         его фона существенно отличаются).
              Все  шестнадцать   цветов   на   практике   никогда
   не
         используются.  Один  из  восьми  основных  цветов - черн
ый; в
         связи  с  этим  неясно,  что  такое  черный  цвет  повыш
енной
         яркости. Фирма IBM называет этот цвет темно серым. В при
нципе
         этот цвет можно воспроизвести  на  экране  цветного  дис
плея,
         однако  делается  это весьма редко. Таким образом, колич
ество
         цветов уменьшается до пятнадцати. Если же  учитывать, чт
о  не
         все  цветные  мониторы  используют бит яркости, то колич
ество
         воспроизводимых  цветов  ограничивается   только   основ
ными.
         Фактически  это  число  еще  меньше - только семь - поск
ольку
         черный цвет используется редко.
              Ниже  приводятся  все  шестнадцать  комбинаций   цв
етов,
         обеспечиваемых 4-мя разрядами, включающими разряд яркост
и или
         повышенной интенсивности свечения.
         ________________________________________________________
____
          Яркость  Красный  Зеленый  Синий  Номер  Цвет    Примеч
ание
         ________________________________________________________
____
           
              0       0        0       0     0     Черный !Изобра
же-
                                                          !ние от
су-
                                                          !тствуе
              0       0        0       1     1     Синий  !
              0       0        1       0     2     Зеленый!
              0       0        1       1     3     Циан   !Сине-з
еле-
                                                          !ный
              0       1        0       0     4     Красный!
              0       1        0       1     5     Пурпур-!Светло
                                                   ный    !пурпур
ный,
                                                          !состоя
щий
                                                          !из кра
сно-
                                                          !го и с
ине-
                                                          !го
              0       1        1       0     6     Корич- !Темно-
жел-
                                                   невый  !тый; д
ля 
                                                          !больши
нст-
                                                          !ва дис
пле-
                                                          !ев - ж
ел-
                                                          !тый
              0      1         1       1     7     Светло-!Обычны
                                                   серый  !белый
              1      0         0       0     8     Темно- !Черный
                                                   серый  !повыше
нной
                                                          !яркост
                                                          ! (!?)
              1     0          0       1     9     Светло-!
                                                   синий  !
              1     0          1       0    10     Светло-!
                                                   зеленый!
              1     0          1       1    11     Циан   !Сине-з
еле-
                                                   светлый!ный, с
вет-
                                                          !лый
              1     1          0       0    12     Светло-!
                                                   красный!
              1     1          0       1    13     Светло !
                                                   пурпур-!
                                                   ный    !
              1     1          1       0    14     Желтый !Светло
-  
                                                          !желтый
              1     1          1       1    15     Белый  !Белый,
                                                          !повыше
нной
                                                          !яркост
         ________________________________________________________
_____
              
              В  столбце  "номер"  указывается  числовое   обозна
чение 
         цвета,  используемое в языке Бейсик. Числа от 16 до 31 с
лужат 
         для обозначения тех же цветов, что и числа от 0 до 15,  
число 
         16 добавляется для установки атрибута мерцания. 
              Для   формирования   у   пользователя   более   стр
огого
         представления об использовании цвета  в  программах, при
ведем
         здесь краткие сведения о цветовых возможностях видеомини
тора.
              Каждый   пользователь  должен  отдавать  себе  отче
т  в
         особенностях воспроизведения цвета повышенной  интенсивн
ости.
         Такие   цвета   как   циан   и   пурпурный   зрительно  
могут
         восприниматься как более интенсивные, но поскольку они  
вдвое
         ярче  основных  цветов  (красного, зеленого и синего), т
о они
         воспринимаются сравнительно  блеклыми.  Напомним  здесь,
  что
         яркость - это количество испускаемого света. Количество 
света
         еще не говорит о насыщенности цвета - чаще всего это  го
ворит
         о  размытости  цвета. В то же время в отношении желтого 
цвета
         справедливо следующее утверждение - чем ярче цвет,  тем 
 выше
         его   насыщенность   (интенсивность).  Желтый  цвет,  по
добно
         красному, зеленому и синему представляет особый цвет.
              Комфортность восприятия цвета меняется в зависимост
и  от
         качества   экрана  дисплея  и  от  специфики  реакции  г
лаза.
         Большинство пользователей, как нам  представляется,  счи
тают,
         что  синий,  красный,  желтый и, возможно, черный относя
тся к
         ортогональным цветам, обеспечивающим наибольшую  комфорт
ность
         восприятия.  Следующими  (на  шкале комфортности  воспри
ятия)
         цветами являются зеленый и пурпурный. И последними  в  с
писке
         наиболее комфортных цветов являются циан и белый.
              Каждый,   кто  имеет  серьезные  намерения  в  отно
шении
         цветовых  возможностей  IBM/PC  должен  довольно  внимат
ельно
         отнестись  к  выбору  цвета и (по возможности) проверить
 свои
         решения на нескольких экранах различных типов. Неверный 
выбор
         может осложнить восприятие информации с экрана дисплея.
              
              
              8.7. Режим прямого управления видеомонитором
              
              Существует  два основных способа  отображения инфор
мации
         на экране компьютера IBM/PC.
              Первый   способ,  который  я  буду  называть  косве
нным, 
         состоит  в  использовании  копии  изображения,  хранящей
ся  в 
         памяти  дисплея.  Фирма IBM, однако относится к этому сп
особу 
         неодобрительно.   В   первой    редакции    руководства 
   по 
         программированию  этот  способ  рассматривается  как  об
разец 
         "дурного  тона"  в  программировании,   поскольку   прог
раммы 
         становятся  зависимыми  от  аппаратных особенностей IBM/
PC. В 
         случае замены типа дисплея (что является вполне реальным
,(см. 
         параграф  8.2)  или  какой-либо  иной  аппаратной модифи
кации 
         пользовательские программы подлежат модификации. 
              Наиболее эффективный  способ  генерации  изображени
я  на 
         экране  дисплея  состоит в использовании функций обслужи
вания 
         BIOS; в этом случае при любых модификациях  компьютера  
(либо 
         для    последующих    моделей    IBM/PC)   фирмы-изготов
ители 
         позаботятся о внесении соответствующих  изменений  в  BI
OS  с 
         тем,  чтобы  пользовательские программы остались неизмен
ными. 
         Следует однако отметить, что функции  обслуживания  BIOS
-ПЗУ, 
         ориентированные на работу с дисплеями, не вполне коррект
ны; я 
         даже считаю их малопригодными. Во многом это объясняется
 тем, 
         что  любая  мало-мальски  серьезная  программа  обходит 
 их и 
         работает  непосредственно   с   памятью   дисплея,   хра
нящей 
         изображение.  В  отличие от точки зрения фирмы IBM на "д
урной 
         тон" в программировании, я считаю  что  использование  п
амяти 
         дисплея,  хранящей  кодированную  копию  изображения,  в
полне 
         обоснованным решением в случае потребности получения  бы
стрых 
         и   сложных  изображений.  Генерация  изображения  на  э
кране 
         дисплея  с  помощью  адекватного   образа   памяти   обл
адает 
         огромными  преимуществами.  Изображение  формируется  бы
стро, 
         непосредственно  и  весьма  эффективно.   Процесс   гене
рации
         протекает   достаточно   просто.   Программа,  приведенн
ая  в
         приложении 8.1,  иллюстрирует  особенности  реализации  
этого
         процесса  на  языке  Бейсик, а текст программы приложени
я 8.2
         содержит  ряд  процедур  обслуживания,  предназначенных 
  для
         прямого  обмена  с  памятью  дисплея  программ, написанн
ых на
         языке Паскаль. Эти процедуры могут использоваться в  кач
естве
         базиса  для  любых  программ обмена с дисплеем, написанн
ых на
         Паскале, или большинстве других языков.
              Принцип работы таких программ весьма прост -  во-пе
рвых,
         программе  необходимо  сообщить тип дисплея - монохромны
й или
         цветной. Это можно сделать двумя способами: либо путем о
проса
         пользователя  (программа  в  процессе  своей настройки з
адает
         пользователю прямой вопрос), либо путем  опроса  операци
онной
         системы (программа в этом случае получает доступ к внутр
енним
         таблицам операционной системы, содержащим  сведения  о  
типах
         устройств).
              Используя функцию обслуживания BIOS-ПЗУ (рассматрив
ается 
         в  разделе  8.11),   можно   получить   информацию   о  
 типе 
         используемого   дисплея.   Это  наиболее  эффективный  с
пособ 
         настройки программ. 
              После определения типа дисплея  необходимо  сформир
овать 
         ссылку  (указатель)  на  соответствующий  участок  памят
и;  в 
         случае монохромного  адаптера  это  адрес  шестнадцатери
чного 
         параграфа  B000,  а  случае  цветного графического адапт
ера - 
         B800. В рамках языка Бейсика это можно осуществить с  по
мощью 
         оператора   DEF   SEG.В   Паскале   это  делается  с  по
мощью 
         сегментированных   типов.   Любой   из   названных   спо
собов 
         осуществим весьма просто. 
              Поскольку  пользователь  имеет  возможность обращат
ься к
         памяти дисплея, то тем самым у него появляется возможнос
ть  с
         одной стороны отображать на экране нужную ему информацию
, а с
         другой стороны он  имеет  возможность  считать  то,  что
  уже
         отображено.
              Единственное   возникающее   при   этом   осложнени
е   - 
         относительная  адресация.   Пользователь   обязан   учит
ывать 
         наличие  байтов-атрибутов  (размещаются по нечетным адре
сам); 
         если необходимо принимать в расчет разбивку экрана на ст
роки, 
         то  программы  должны  выполнить  соответствующие вычисл
ения. 
         Если используется страничный механизм дисплея, то следуе
т так 
         же   учитывать  особенности  размещения  страниц  его  а
дреса 
         кратным 2К и 4К. 
              В приложении  8.2  приведены  наиболее  распростран
енные 
         модули,  требуемые  для  программирования  на  Паскале. 
 Если 
         возникает потребность в дополнительных модулях, то они  
могут 
         быть  легко  добавлены  к существующим по уже известной 
схеме 
         (см. приложение 8.2). 
              
              8.8. Управление  курсором
              
              Курсор    представляет    собой    важнейший   комп
онент
         видеодисплея. Обычно он используется  в  качестве  индик
атора
         местоположения  символа, вводимого  с  клавиатуры, однак
о  он
         используется  также  и  в  качестве  указателя  на   объ
екты,
         расположенные  на  экране.  В  данном параграфе мы рассм
отрим
         принцип управления курсором. Первое, о чем  мне  хотелос
ь  бы
         здесь  сказать, связано  с  тем,  что мерцающий курсор I
BM/PC
         может оказаться неприемлемым для многих пользователей.
              Рассмотрим некоторые альтернативные варианты.
              В связи с использованием  мерцающего  курсора  возн
икает 
         ряд  проблем  чисто  зрительного восприятия. Компьютер I
BM/PC 
         имеет курсор стандартной формы, появляющиеся  на  экране
  при 
         включении  компьютера  в  электрическую  сеть;  это небо
льшое 
         мерцающее  пятно,   расположенное   ниже   позиции   сим
вола. 
         Некоторые  считают,  что  такой  курсор  трудно  отыскат
ь  на 
         экране, заполненном информацией . 
              Существует возможность увеличить размер  курсора, д
оведя
         его   до   размера  символа.  В  качестве  образца  проц
едуры
         увеличения  размера  курсора  до  половины  размера   си
мвола
         следует  запустить  интерпретатор  с  языка  Бейсик  и н
ажать
         клавишу Insert (Вставка). С помощью  оператора  LOCATE  
можно
         установить любой размер курсора. Но при этом оказывается
, что
         большой  мерцающий  курсор  действует  на   глаз   утомл
яюще,
         особенно при длительной работе. 
              Мерцающий  курсор  можно  использовать  двумя спосо
бами.
         Первый  способ связан  с  использованием  атрибута  обра
тного
         изображения   (шестнадцатеричный  код  70)  в  отношении
  той
         позиции экрана, в которой находится  курсор.  В  этом  с
лучае
         генерируется  большое  световое пятно, на фоне которого 
виден
         символ; таким образом,  возникает  сплошной  (имеющий  р
азмер
         символа)   немерцающий  курсор.  Курсор  такого  типа  х
орошо
         воспринимается в зрительном плане и не действует утомляю
ще на
         глаз.   В  тех  случаях,  когда  Бейсик  работает  с  цв
етным
         графическим монитором в графическом режиме, оказывается,
  что
         курсор генерируется сходным образом. Объясняется это тем
, что
         графический режим не  предусматривает  аппаратной  реали
зации
         мерцающего   курсора,  поэтому  Бейсик  вынужден  имитир
овать
         курсор. Но даже в тех случаях, когда  предусмотрен  мерц
ающий
         курсор,    реверсивное    изображение   считается   наил
учшим
         способом представления курсора  (здесь  уместно заметить
, что
         текстовый  редактор,  использованный  при подготовке рук
описи
         этой книги (Vedit), имеет именно такой курсор).
              Второй способ использования  курсора  особенно  уме
стен,
         когда  программа выводит на экран перечни (списки) каких
-либо
         информационных объектов. Назначение курсора состоит не т
олько
         в  фиксации  на  экране позиции табуляции (позиции разме
щения
         символа), но также и в реализации процедуры выбора. Посл
еднее
         характерно  для  программ  обработки  меню,  списков фай
лов и
         вообще наборов альтернативных вариантов. Для таких случа
ев  я
         бы  предложил  использовать  два  символа  "стрелки",  и
менно
         CHR$(16) для стрелки, направленной  вправо,  и  CHR$(17)
  для
      
         стрелки,   направленной  влево.  (Входящая  в  состав  п
акета
         программ, прилагаемого к данной книге, программа DiskLoo
k,  а
         также  многие  другие  программы  из  числа  "Нортон Юти
лити"
         используют правую стрелку).
              Если задача генерации искусственного курсора  не  с
тоит,
         то  задача  управления курсором практически возникает вс
егда.
         Впрочем,  в  случае  искусственного  создания  курсора  
может
         возникнуть  потребность  вообще  убрать  его с экрана. К
урсор
         обладает  двумя  характеристиками,  подлежащими   управл
ению:
         размером и позицией.
              В     случае    аппаратно-генерируемого    курсора 
   он
         представляется в виде совокупности мерцающих строк  из  
числа
         строк  развертки, генерирующих отображаемый символ. Поск
ольку
         строки,  из  которых  он  состоит,   не   могут   управл
яться
         независимо,  то  у пользователя имеется возможность упра
влять
         лишь группой мерцающих строк. Монохромный  дисплей  имее
т  13
         строк   развертки,   а   цветной  графический  -  7.  Пр
инято
         нумеровать строки сверху, начиная с 0 и  вплоть  до  13 
 (для
         монохромного  дисплея)  или  до  7  (для  цветного  дисп
лея).
         Стандартное положение курсора (в момент запуска IBM/PC) 
-  12
         и  13-я  строки  для  монохромного  дисплея  и 7-я строк
а для
         цветного графического дисплея.
              Пользователь имеет возможность задать положение  ку
рсора
         путем  выделения  произвольного количества этих строк, у
казав
         начальный и конечный номер  строк  развертки.  Курсор,  
таким
         образом,  может  быть  полноразмерным  или  занимать вер
хнюю,
         среднюю и нижнюю часть позиции символа.
              Если  номер  начальной  строки  больше  номера  кон
ечной 
         строки (например: начальная строка имеет номер 12, а кон
ечная 
         строка номер 2), то курсор будет образован следующим обр
азом: 
         используются   строки  развертки,  начинающиеся  с  нача
льной 
         строки вплоть до  конечной  строки,  а  затем  берутся  
самые 
         верхние  строки,  вплоть  до  конечной строки. Таким обр
азом, 
         генерируется курсор весьма причудливой  формы,  состоящи
й  из 
         двух   частей  -  верхней  и  нижней.  Это  весьма  необ
ычная 
         конструкция, и у Вас может возникнуть желание  посмотрет
ь  на 
         нее;  я  бы, однако, рекомендовал хорошо подумать, прежд
е чем 
         предлагать такое решение пользователям Ваших программ. 
              При необходимости генерации составного  курсора  сл
едует
         запустить интерпретатор языка Бейсик и ввести команду
              
              LOCATE ,,, 6,2
      
              В результате на экране появится составной курсор и 
могут
         быть выполнены действия по модификации его  размеров.  В
торым
         управляемым  параметром  курсора является его местополож
ение.
         Курсор может быть  расположен  в  любой  строке  или  ст
олбце
         экрана  дисплея,  кроме  того,  его  можно  скрыть,  пом
естив
         в несуществующую строку 26. С помощью оператора LOCATE  
(язык
         Бейсик)  можно  управлять  обоими  параметрами. Для оста
льных
         языков это не так. Многие пользователи языка Паскаль счи
тают,
         что отсутствие средств управления курсором является серь
езным
         недостатком данной версии языка.
              На  дискете,  прилагаемой  к  данной  книге,  содер
жатся
         процедуры,  написанные  на  языке  ассемблера; с помощью
 этих
         процедур  может  быть  осуществлен  доступ  к   курсору 
  или
         реализовано  управление  им в рамках языка Паскаль или л
юбого
         другого языка. Особенности реализации этих процедур опис
аны в
         параграфе   8.11;   там   же  приведены  и  другие  свед
ения,
         касающиеся обращения к BIOS-ПЗУ для видеодоступа. 
         
              
              8.9.  Стандартный режим управления видеомонитором
         
              
              Стандартный (или штатный)  режим  доступа  к  инфор
мации
         предполагает,  что  генерация  изображений осуществляетс
я без
         модификации    содержимого    участка    памяти,    хран
ящего
         закодированный   образ   экрана.   В   параграфе  8.11  
будет
         рассмотрена возможность  такого   доступа, используя  фу
нкции
         обслуживания  BIOS-ПЗУ.  В  связи с этим мне все-таки не
ясно,
         почему все стремятся использовать именно функции обслужи
вания
         (исключение    составляют    пользователи,    работающие
   на
         ассемблере), несмотря  на  то,  что  средства  вывода  я
зыков
         высокого   уровня   (Паскаль   и   другие)  обладают   я
вными
         преимуществами.
              В случае использования средств  вывода  языков  выс
окого
         уровня  (Паскаль  и другие) возникает одна особенность. 
Вывод
         информации всегда осуществляется с учетом положения  кур
сора.
         Поэтому, если производится манипулирование курсором с по
мощью
         функций обслуживания BIOS-ПЗУ, описываемых в параграфе  
8.11,
         то это вполне согласится  со спецификой работы средств в
ывода
         языков высокого уровня.
              Таким образом, всегда следует  придерживаться  разу
много
         сочетания    двух    основополагающих    принципов    ра
боты:
         использование средств вывода базового языка  программиро
вания
         и   достижения   на  этой  основе  высокого  уровня  кон
троля
         отображаемых   данных   и    отказ    от    непосредстве
нного
         использования  кодированного  образа экрана в памяти дис
плея.
              Придерживаясь  этих  концепций,  можно  достичь выс
окого
         уровня контроля за отображаемой информацией (в первую оч
ередь
         это  относится  к  атрибутам  отображения); это может сл
ужить
         хорошей  основой  для   построения   высокомобильных   с
истем
         программного обеспечения для персональных компьютеров.
              
              8.10. Псевдографический режим
              
              
              Символьная графика, или псевдографика представляет 
собой
         интересную   и   эффективную    альтернативу    использо
ванию
         полномаштабных графических возможностей цветного графиче
ского
         дисплея.Программы,  написанные  в  расчете  на  использо
вание
         псевдографических возможностей имеют важное преимущество
, они
         не зависят от типа  используемого  дисплея  (черно-белый
  или
         цветной графический).
              Под  псевдографическими  изображениями  понимаются 
такие
         изображения,   которые   создаются   на   базе   расшире
нного
         символьного   набора   кода  ASCII.  Следом  за  стандар
тными
         символами ASCII (первые 128  символов)  расположены  еще
  128
         символов, имеющих особую конфигурацию. Примерно половина
 этих
         символов предназначена для представления чертежей и рису
нков.
              Прежде всего речь идет о прямых.  В  ASCII  предусм
отрен
         полный   набор   символов,  позволяющих  вычерчивать  ко
нтуры
         прямоугольников,  диаграмм  и  схем  одиночными  и   дво
йными
         линиями.     Многие    программы    для    IBM/PC,    вк
лючая
         демонстрационные   программы,   написанные   на   Бейсик
е   и
         поставляемые   в   составе  DOS,  используют  символы  п
рямых,
         поэтому многим они знакомы.
              
              
              8.11 Средства управления видеотерминалом уровня BIO
S-ПЗУ
         
              
              Ниже  описываются  функции  обслуживания  видеомони
тора,
         реализуемые средствами BIOS-ПЗУ. Ряд этих функций относи
тся к
         графическим  режимам,  которые  будут  детально рассмотр
ены в
         следующей главе; здесь мы опишем их лишь вкратце.
              Существует категория читателей, которые  непосредст
венно
         не будет использовать функции обслуживания, им важно пон
имать
         принципы и возможности системы.
              BIOS-ПЗУ предлагает пользователю  шестнадцать  разл
ичных
         функций   обслуживания  для  видеомониторов.  Доступ  к 
 этим
         функциям осуществляется через прерывание с номером 16(10
/16).
         В  данном  параграфе  мы  рассмотрим  все  эти  прерыван
ия  и
         осмыслим   их   назначение.   Программы   8.101   и    8
.102,
         расположенные   на   дискете,  прилагаемой  к  данной  к
ниге,
         представляют собой процедуры, написанные на языке  ассем
блера
         (процедуры   первого   уровня),  для  обращения  к   фун
кциям
         обслуживания видеодисплея, реализуемым  с  помощью  BIOS
-ПЗУ;
         кроме  того, они  содержат  определения  Паскаля  и проц
едуры
         второго уровня, предназначенные для облегчения  использо
вания
         первых.
      
              Первая  процедура  обслуживания  видеомонитора имее
т код
         обслуживания 0, она используется для фиксации  режима  р
аботы
         видеомонитора.   Возможны  восемь  различных  режимов  р
аботы
         видеомонитора, причем семь режимов ориентированы  на  цв
етной
         графический  дисплей,  а один на монохромный. Ниже приво
дится
         список  режимов  работы  (в  дальнейшем  мы   прокоммент
ируем
         позиции этого списка).
              
         ________________________________________________________
____
              Код                          Режим 
         ________________________________________________________
____
              
              0       Текстовый,  40-позиционный,   черно-белый  
(цвет  
                      подавлен) режим  для цветного графического 
дисп-
                      лея
              1       Текстовый,  40-позиционный,   цветной  режи
м для
                      цветного графического дисплея
              2       Текстовый,  80-позиционный,   черно-белый  
(цвет 
                      подавлен) режим для цветного графического  
дисп-
                      лея
              3       Текстовый,  80-позиционный,   цветной  режи
м для 
                      цветного графического дисплея
              4       Графический, 320 х 200 пикселей,  цветной  
режим
                      для цветного графического дисплея
              6       Графический, 640 х 200 пикселей, черно-белы
й ре-
                      жим для цветного графического дисплея
              7       Режим монохромного дисплея
              
         ________________________________________________________
____
              
              При  наличии  цветного  графического  адаптера с по
мощью
         указанных функций обслуживания довольно просто обеспечив
ается
         переключение  режима.  Можно  было  бы  предположить, чт
о при
         наличии  двух  адаптеров  эта  сервисная  функция   обес
печит
         переключение  одного  активного  дисплея  на  другой,  н
о,  к
         сожалению, это не так. В  BIOS-ПЗУ  предусмотрен  специа
льный
         признак, который отмечает факт наличия монохромного адап
тера;
         если монохромный адаптер подключен, то BIOS  блокирует  
любой
         запрос,   связанный   с   переключением   в   режим  цве
тного
         графического дисплея. Система, включающая в свой  состав
  два
         видеомонитора  может переключаться с одного дисплея на в
торой
         лишь с помощью специальных кодовых комбинаций  (эти  све
дения
         только  недавно  опубликованы  фирмой  IBM).  Что же кас
ается
         одновременной активизации обоих дисплеев, то  это,  наск
олько
         мне известно, попросту невозможно.
              Черно-белые  текстовые  режимы  (коды  0  и  2) раб
отают
         аналогично соответствующим цветным режимам, но с  блокир
овкой
         цветности.  Смысл,  вкладываемый  в термин "пиксель", а 
также
         сведения о разрешающей способности графических режимов  
будут
         приведены в следующей главе.
              Вторая функция обслуживания  (код  1)  используется
  для 
         установки  размера  курсора.  Как  уже  указывалось  ран
ее  - 
         конфигурация и размер корсора фиксируются  путем  опреде
ления 
         начальной и конечной строк развертки позиции курсора. Ве
рхняя 
         строка развертки имеет номер 0, а нижняя строка  разверт
ки  - 
         номер  7 (для цветного графического режима) или номер 13
 (для 
         монохромного режима).  Если  номер  начальной  строки  б
ольше 
         номера   конечной  строки,  то  генерируется  (двух)сост
авной 
         курсор. Особенности управления курсором описаны  в  пара
графе 
         8.8. 
              Третья  функция  обслуживания  (код  2) используетс
я для 
         перемещения  курсора.  Положение  курсора  описывается  
тремя 
         параметрами  -  строка,  позиция (столбец) и страница. О
тсчет 
         строк и позиций  начинается  с  первого  знакоместа  (ве
рхний 
         левый   угол   экрана),  имеющего  номер  0.  Если  возн
икает 
         необходимость использовать  нумерацию  от  1  до  25  (в
место 
         нумерации  от  0 до 24), то пользовательская программа д
олжна 
         выполнить  пересчет  номеров;   программы   обслуживания
   на 
         Паскале, приведенные в приложении 8.102, реализуют именн
о эту 
         функцию. Номер страницы (памяти дисплея) используется  т
олько 
         в  случае  текстового  режима  работы  цветного  графиче
ского 
         адаптера; при  работе  с  монохромным  дисплеем,  а  так
же  в 
         графических  режимах  номер страницы должен быть установ
лен в 
         0. Курсор можно вывести вообще за  пределы  экрана  и,  
таким 
         образом,  сделать  его невидимым. Для этого я бы рекомен
довал 
         использовать первую  позицию  строки,  выходящую  за  пр
еделы 
         максимально  возможной  (если,  например,  нумерация  ст
рок и 
         позиций ведется с 1, то следует указать первую  позицию 
 26-й 
         строки). 
              Положение  курсора  фиксируется  путем  занесения н
омера
         строки в регистр DH, а номера позиции (столбца) в регист
р DL.
         Нумерация  строк позиций начинается с нулевых координат 
(0,0)
         верхнего левого угла экрана. В графических режимах  поло
жение
         курсора    также    описывается    в    терминах    коор
динат
         "строка-позиция"; координаты  пикселя  не  используются.
  Для
         нумерации  страниц  используются числа 0 - 7  (40-позици
онный
         режим) или 0 - 3  (80  позиционный  режим).  Для  графич
еских
         режимов номер страницы должен быть равным 0.
              Ниже   приведены   обобщенные   сведения   о  содер
жимом
         регистров при обращении к функции обслуживания 2.
              
         ________________________________________________________
____
              Номер функции                  Параметры
               обслуживания                  (регистры)
               (регистры)
         ________________________________________________________
____
                 
                   AH= 2          DH = номер строки
                                  DL = номер позиции
                                  BH = номер страницы
                                  (для графических режимов равен 
0)
         ________________________________________________________
____
              
              Здесь уместно сделать одно важное замечание,  касаю
щееся
         работы в цветном  графическом  многостраничном  режиме. 
 Если
         возникает  потребность  в  перемещении  курсора,  то  сл
едует
         специфицировать   страницу   -   таким   образом  исключ
ается
         возможность поместить  курсор  в  текущую  активную  стр
аницу
         дисплея;   любая  другая  страница  в  этом  смысле  явл
яется
         доступной.  Каждая  страница  имеет  собственное   логич
еское
         местоположение  курсора.  Некоторые  функции обслуживани
я (из
         числа  перечисляемых  ниже),  применимые   к  любой  стр
анице
         изображения   ,  действуют  относительно  положения  кур
сора.
         Положение курсора фиксируется для каждой страницы изобра
жения.
              Четвертая   функция   обслуживания   (имеющая   код
   3) 
         предназначена для считывания положения курсора и его раз
мера. 
         В   каком-то   смысле   она   реализует  процедуру,  обр
атную 
         процедуре,   реализуемой   совместным   использованием  
 двух 
         предшествующих  функций  обслуживания.  Здесь  также  сл
едует 
         специфицировать  страницу   изображения;   для   монохро
много 
         дисплея,  а  также  для  графических  режимов ее номер д
олжен 
         равняться 0. В  результате  выполнения  функции  пользов
атель 
         получает  номера  строки  и  позиции  курсора, а также н
омера 
         начальной и конечной строки  развертки,  формирующие  ку
рсор. 
         Ниже приводятся сведения о составе и содержимом регистро
в. 
              1 Номер начальной строки должен быть загружен в  ре
гистр
         CH,  а номер конечной строки - в регистр CL. По умолчани
ю для
         монохромного адаптера устанавливаются следующие значения
 CH =
         12, CL = 13.
              Здесь  уместно  заметить, что для номеров строк отв
едено
         только три байта (0 - 2) в указанных  регистрах.  Если  
пятый
         бит  регистра  CH  установлен в состояние "1" (т.е. в ре
гистр
         загружено значение 32), то курсор исчезает.  При  перехо
де  в
         графический  режим  этот  бит  автоматически  устанавлив
ается
         равным 1, с тем чтобы курсор не  мешал  графическому  вы
воду.
         Этот   прием  также  можно  использовать  для  искусстве
нного
         удаления курсора. Поскольку в графических режимах операц
ии  с
         курсором  аппаратно  не  поддерживаются, то речь может и
дти о
         его  имитации  с  помощью  символа   CH$(223)   и   изме
нения
         атрибутов фона.
         ________________________________________________________
____
              Номер функции                  Параметры
               обслуживания
         ________________________________________________________
____
              
                   AH= 1         CH = начальная строка курсора
                                 CL =  конечная строка курсора
                   AH= 3         BH = номер страницы (для графиче
ских
                                      режимов устанавливается рав
ным
                                      0)
                                 DH = номер строки
                                 DL = номер позиции (столбца)
                                 CH = ночальная строка развертки 
кур-
                                      сора
                                 CL = конечная строка развертки к
ур-
                                      сора
              
         ________________________________________________________
____     
              
              Пятая   функция   обслуживания   (функция   с  кодо
м  4)
         предназначена  для  считывания   местоположения,   указа
нного
         световым  пером  (  для  систем,  имеющих  световое  пер
о). В
         результате выполнения фиксируется факт подключения  свет
ового
         пера;  если  световое  перо  подключено, то фиксируется 
также
         положение указанной точки. Положение задается как в  тер
минах
         символов,  так  и  в терминах  пикселей (этот вопрос под
робно
         обсуждается в следующей главе, посвященной графике).
              Регистр  AH  предназначен  для   индикации   подклю
чения
         светового  пера:  если  AH=1,  то  световое перо поключе
но, в
         противном  случае  (AH=0),  световое  перо  не  использу
ется.
         Положение  объекта,  вычлененного  с  помощью  светового
 пера
         формируется  либо  в  виде  содержимого  регистров   CH,
   BX
         (положение   пикселя).  Поскольку  величина,  соответств
ующая
         (горизонтальной) позиции пикселя может превышать 255, то
  для
         нее отводится полное слово (регистр BX).
              Ниже   приводятся   сведения   о  составе  и  содер
жимом
         регистров.
              
         ________________________________________________________
____
              Номер функции               Параметры
               обслуживания
         ________________________________________________________
____
              
                  AH = 4         DH = номер строки символов
                                 DL = номер позиции (столбца)симв
ола
                                 CH = номер строки пикселей
                                           (0 - 199)
                                 BX = номер позиции (столбца) пик
селя
         ________________________________________________________
____
              
              Световое   перо   не   относится   к   числу    наи
более
         распространенных  аппаратных  средств  для IBM/PC. Это с
воего
         рода  сдерживающий  фактор,  поскольку  может  использов
аться
         только   с   дисплеями,   обладающими  очень  малым  вре
менем
         послесвечения люминофора,  т.е.  такими  дисплея,  у  ко
торых
         светимость   точки   быстро  падает  после  перемещения 
 луча
         развертки в следующую  точку  экрана.  Такие  дисплеи  б
ыстро
         утомляют оператора.  Поэтому  хорошие  дисплеи  не  нужд
аются
         в   световом   пере.   Для  монохромного  дисплея  фирмы
  IBM
         применяется фосфорный дисплей  с  длительным  послесвече
нием,
         облегчающий   восприятие   изображений.  Можно  считать,
  что
         световое  перо   получит  ограниченное   распространение
   (в
         основном  для  специальных  приложений)  в сфере персона
льных
         компьютеров.
              Шестая  функция  обслуживания  (функция   с   кодом
   5) 
         используется  для установки (подключения) активной стран
ицы в 
         многостраничном  текстовом   режиме   цветного   графиче
ского 
         дисплея.   Номер   страницы   задается  в  регистре  AL.
  Для 
         40-позиционных режимов номера страницы лежат в диапазоне
 0  - 
         7,  а  для  80  позиционных  режимов  - в диапазоне 0 - 
4. По 
         умолчанию номер страницы принимается равным 0.  Эта  стр
аница 
         помещается   в   самом   начале   памяти  дисплея,  а  к
аждая 
         последующая страница с интервалом в 2К  (для  40  позици
онных 
         режимов)  или через 4К (для 80 позиционных режимов). Бол
ьшему 
         номеру  страницы  соответствуют  ячейки  памяти  с   бол
ьшими 
         адресами. 
              
         ________________________________________________________
____
              Номер функции                    Параметры
               обслуживания
         ________________________________________________________
____
              
                 AH = 5           AL = номер новой страницы диспл
ея 
                                       (0 - 3 для режимов 2 и 3, 
0 -
                                       7 для режимов 0 и 1)
         ________________________________________________________
____
              
              Две следующих функции обслуживания /функции с кодам
и 6 и 
         7/   используются   для   реализации    режима    "прокр
утки" 
         (скроллинга)  информации  на  экране  дисплея.  Использо
вание 
         компьютера IBM/PC в  режиме  "прокрутки"  представляет  
собой 
         одну  из  интереснейших  возможностей отображения информ
ации, 
         однако лишь немногие программы, используюь эту возможнос
ть. В 
         режиме  "прокрутки"  можно перемесить содержимое экрана 
вверх 
         или сниз на любое число строк. При этом отображаемые  си
мволы 
         смещаются  за пределы экрана вверх или вниз, а освободив
шаяся 
         часть экрана заполняется пустыми строками. Особенность  
этого 
         режима  отображения  состоит  в  том, что в роли экрана 
может 
         выступать произвольная прямоугольная область  экрана  (о
кно), 
         на  которую  распространяется  "прокрутка"; остальные уч
астки 
         экрана остаются неизменными. Выделив  несколько  окон,  
можно 
         организовать  в  каждом из них режим "прокрутки". Возмож
ности 
         обработки    данных    здесь    огромные,    остается   
 лишь 
         недоумевать, почему большинство программ их редко исполь
зуют. 
      
              Функция с кодом 6 предназначена для "прокрутки" вве
рх, а
         функция  с  кодом  7  предназначена для "прокрутки" вниз
. И в
         том,  и  в  другом  случае   следует   специфицировать  
  два
         противоположных  угла  окна  - верхний левый и нижний пр
авый.
         Спецификация задается в терминавх строк и  столбцов.  Сл
едует
         также  задать  число  перемещаемых  строк;  это  число  
может
         совпадать с размером окна. И последний об'ект спецификац
ии  -
         атрибут   отображения   строк  заполнителей.  Таким  обр
азом,
         имеется возможность управлять цветом окна.  Если  планир
уется
         использование   техники  работы  с  окнами,  то  имеет  
смысл
         выделить окно путем приписывания  ему  атрибута  отображ
ения,
         отличного  от атрибута отображения всего остального экра
на. С
         помощью механизма прокрутки текст  сообщения  не  может 
 быть
         помещен  в  новые  строки  окна  -  для этого следует пр
инять
         специальные меры.
              Число перемещаемых строк указывается в регистре AL.
 Если
         AL=0,  то  все окно заполняется пустыми строками (то же 
самое
         происходит, если число перемещаемых строк  превышает  ра
змеры
         окна).  Положение  и размер окна указываются в регистрах
 CX и
         DX: в CH указывается верхняя строка, а в DH -  нижняя;  
в  CL
         указывается левая позиция (столбец, а в DL - правый. Атр
ибуты
         изображения пустых строк  указываются  в  регистре  BH. 
 Ниже
         приводятся общие сведения о составе и содержимом регистр
ов.
              
         ________________________________________________________
____
              Номер функции                      Параметры
              обслуживания
         ________________________________________________________
____
              
                 AH = 6         AL = количество сдвигаемых строк
                                CH = номер строки верхнего левого
                                     угла окна
                                CL = номер позиции (столбца) верх
него
                                     левого угла окна
                                DH = номер строки нижнего правого
 угла
                                     окна
                                DL = номер позиции (столбца) нижн
его
                                     правого угла окна
                                BH = атрибуты изображения пустых 
                                     строк
         ________________________________________________________
____
              
                "Прокрутка"  содержимого окна как правило выполня
ется 
           в два этапа. Как только новая строка подготовлена к за
писи 
           в  окно, осуществляется вызов функции обслуживания с к
одом 
           6 (или 7) для перемещения текущего содержимого окна. П
осле 
           этого  в  новую  строку  заносится  нужная информация.
 Для 
           этого   используются   функции   обслуживания   "устан
овка 
           курсора"  и  "запись  символа".  Ниже  приводится  при
мер, 
           иллюстрирующий излагаемые положения. 
      
              DEBUG; вызов программы-отладчика DEBUG
                A
              INT 10; вызов  Ассемблеоа
              [Return]; выход из Ассемблера
              R  AX; извлечение содержимого регистра AX  для  про
смот-
                     ра и изменения
              06 03; установка функции обслуживания с  кодом 6,  
коли-
                     чество сдвигаемых строк 3
              R  CX; извлечение  содержимого регистра CX для  про
смот-
                      ра  и изменения
              050A;  установка верхнего левого угла: строка 5, ст
олбец
                     10
              R  DX; извлечение содержимого регистра DX для  прос
мотра 
                     и изменения
              1020;  установка  правого нижнего угла: строка 16, 
стол-
                     бец 32
              D  0  L 180; заполнение экрана
              G  100 102; выполнение прерывания 10, стоп.
              
              Следующие три  функции  обслуживания  предназначены
  для 
         манипулирования    символами.    С   помощью   этих   фу
нкций 
         осуществляются операции  ввода-вывода  без  непосредстве
нного 
         обращения  из  пользовательских  программ  к области пам
яти,в 
         которой хранится закодированный образ экрана дисплея. В 
связи 
         с  уже  упоминавшимся  ранее  аспектами  вывода информац
ии на 
         экран дисплея путем прямой  модификации  содержимого  па
мяти, 
         хранящей  копию  изображения,  здесь  следует  заметить,
  что 
         испоьзование этих функций делает программы пользователя 
более 
         мобильными   и   менее   зависимыми  от  особенностей  В
ашего 
         компьютера. Рассмотрим эти функции более подробно. 
              Девятая  функция  обслуживания  (функция  обслужива
ния с
         кодом  8)  осуществляет  считывание   символа   и   атри
бута,
         соответствующих  текущей  позиции  курсора.  Как  и  в с
лучае
         некоторых других функций обслуживания, здесь следует  ук
азать
         номер  используемой   страницы  (несмотря на то, что стр
аница
         применяется только к  текстовому режиму цветного графиче
ского
         дисплея). Функция  обслуживания 8 работает как в графиче
ском,
         так и в текущем режимах; более детальные сведения, касаю
щиеся
         отображения   символов   в  графическом  режиме  приведе
ны  в
         следующей главе. Заметим лишь, что  поскольку  в  графич
еском
         режиме атрибут изображения отсутствует (это понятие прим
енимо
         лишь к текстовому режиму, либо к  монохромному  дисплею)
,  то
         его считывание не осуществляется.
              Особенность этого режима состоит в том, что одни и 
те же
         таблицы изображения символов,  используемые  для  их  за
писи,
         используются   также   и  в  случае  их  распознавания  
путем
         сличения. Распознование осуществимо даже  в  случае  соз
дания
         своего собственного набора графических символов.
              Код символа ASCII заносится в регистр AL. Если симв
ол не
         соответствует кодам ASCII, то в графическом режиме в  ре
гистр
         заносится  00.  Атрибуты  изображения заносятся в регист
р AH.
         Страница изображения указывается в регистре BH. Для рабю
оты в
         графическом режиме установку страницы осуществлять не сл
едует.
         ________________________________________________________
____
              Номер функции                  Параметры
               обслуживания
         ________________________________________________________
____
              
                  AH = 8        BH = активная страница изображени
                                     (для графического режима не 
требу-
                                     ется)
                                AL = счимвол ASCII, считанный из 
по-
                                     зиции, указанной курсором
                                AH = атрибут текстового символа
         ________________________________________________________
____
              
                
              Функция обслуживания с кодом 9 предназначена для  з
аписи
         символа   (или  нескольких  его  копий)  и  атрибута.  С
имвол
         задается в регистре AL, а атрибут текстового режима или 
 цвет
         графического  режима  заносится в регист BL. Количество 
копий
         символов помещается в регистр CX.
              Для текстовых режимов в регистре BH должна быть  ук
азана
         страница изображения; графические режимы этого не требую
т.
              Символ  и  его  атрибуты цвета записываются столько
 раз,
         сколько требуется (начиная с текущей позиции курсора). К
урсор
         при  этом не перемещается, запись производлится в послед
ующие
         позиции экрана. В текстовом режиме при дублировании  сим
волов
         может   быть  организован  переход  на  следующую  строк
у.  В
         графическом режиме такая возможность отсутствует.
              Описываемая функция обслуживания весьма  полезна  к
ак  в
         одиночном  так  и  групповом  режимах.  Групповой режим 
часто
         используется для  оперативного  вывода  пробелов  или  д
ругих
         повторящихся  символов (например, горизонтальных линий).
 Если
         требуется сформировать символ в единственном  экземпляре
,  то
         следует  установить  счетчик в CX равным 1. Если его зна
чение
         равно 0, то число повторений есть величина переменная.
              Отличия  функции  обслуживания с кодом  9   от   фу
нкции
         обслуживания   с   кодом  14  состоит  в  следующем:  им
еется
         возможность   управлять   атрибутами    цвета,    отсутс
твует
         автоматическое отображение курсора при записи символа.
              В  графическом  режиме  цвет  указанный  в  регистр
е BL,
         является  цветом  собственно  пикселя,  входящего  в   с
остав
         рисунка  символа.  Если  седьмой  бит равен 1,  то биты 
в BL,
         определяющие  цвет,  объединяются  с  битами  цвета  тек
ущего
         пикселя  при  помощи операции "исключающего или" (XOR). 
Такой
         подход гарантирует отличие  полученного  цвета  от  преж
него,
         обеспечивая  четкость изображения. Если 7-й бит в регист
ре BL
         равен 0, то цвет в BL заменяет существующие  цвета  пикс
елей.
         Сказанное  справедливо также в отношении функций обслужи
вания
         с кодами 10 и 12.
         ________________________________________________________
____
              Номер функции                     Параметры
               обслуживания
         ________________________________________________________
____
           
                  
                 AH = 9          AL = символ  ASCII,  предназначе
нный 
                                      для вывода на экран
                                 BL = атрибуты символа, выводимог
о  на
                                      экран
                                 BH = активная страница изображен
ия (в
                                      графических режимах отсутст
вует)
                                 CX = число  записываемых  символ
ов  и 
                                      атрибутов     
                                      
         ________________________________________________________
____
              
              Функция  обслуживания  с  кодом  10  ("запись  симв
ола") 
         отличается от предыдущей  только  тем,  что  не  позволя
ет  в 
         текстовом режиме изменять существующие атрибуты цвета. О
днако 
         для графического режима регистр BL должен содержать  атр
ибуты 
         цвета.   Таким   образом  название  этой  функции  не  с
овсем 
         корректно.  На  функции  обслуживания  с  кодами   9   и
   12 
         распространяются  одни  и  те  же  правила  работы с цве
том в 
         графических  режимах:  любой  цвет  можно  использовать 
 либо 
         непосредственно,  либо  в  комбинации  с  существующим ц
ветом 
         (операция XOR). 
              
         ________________________________________________________
____
              Номер функции                    Параметры
               обслуживания
         ________________________________________________________
____
              
                   AH = 10           AL = символ ASCII, выводимый
 на
                                          экран
                                     BL = атрибуты цвета для граф
ичес-
                                          ких режимов
                                     BH = активная страница
                                     CX = число записываемы симво
лов
         ________________________________________________________
____     
              
              Функция  обслуживания  с  кодом 11 ("установка пали
тры")
         предназначена для выбора одной  из  двух  графических  п
алитр
         среднего  разрешения.  Прежде  чем  передать  управление
 этой
         функции  обслуживания  следует   загрузить   в   регистр
   BH
         идентификатор палитры, а в регистр BL - значение цвета.
              Напомним здесь, что в графических режимах (режимы 4
 - 6)
         каждый   пиксель   на   экране   имеет   свой   цвет.   
 Цвет
         устанавливается  в основном тем же способом, что и атриб
уты в
         текстовых  режимах,   однако   имеются   некоторые   отл
ичия.
         Во-первых, пиксели не  могут  мерцать.  Во-вторых,  поск
ольку
         каждый пиксель является  дискретной  цветной  точкой,  т
о  не
         существует  ни очертания, ни фона; посто каждый пиксель 
имеет
         тот или иной цвет. Когда, в  графическом  режиме  формир
уется
      
         текст,  то  один  цвет  используется для пикселей, из ко
торых
         составляется  фон,  а  другой  для   пикселей,   из   ко
торых
         состовляются символы.
              Примечание:  Специфика использования графического р
ежима
         в языке Бейсик дает основание  считать,  что  здесь  воз
можен
         фоновый цвет. На самом деле это не так.
              Для   каждого  графического  режима  существуют  за
ранее 
         определенные   наборы   цветов,   известные   как    пал
итры. 
         Стандартные палитры можно изменять в компьютере IBM PC/j
r или 
         в  установленом   графическом   адаптере;   обычный   цв
етной 
         графический  адаптер  такой  возможности не имеет. Если 
цвета 
         палитры для любого графического адаптера определены, то 
 цвет 
         каждого   пикселя   выбирается   из  имеющихся  цветов  
путем 
         установки значений битов, определяющих цвет  пикселя.  В
  2-х 
         цветном  режиме  имеется  один бит для каждого пикселя и
 цвет 
         пикселя задается в  виде  О  или  1.  В  4-х  цветном  р
ежиме 
         предусмотрены  два  бита,  принимающие  значения от О до
 3. В 
         16-ти  цветном  режиме  цвет  задается  с  помощью  4  б
итов, 
         хранящих значение от 0 до 15. 
              Одна  из  модификаций  функции  обслуживания  с код
ом 11
         применима к  текстовым режимам,  все  остальные  -  толь
ко  к
         графическим.   Для  текстовых режимов  справедливо  след
ующее
         правило: если BH=0, то BL указывает цвет  окружения текс
товой
         области,  выбранной  из  полной  16-ти  цветной  палитры
. Для
         любого графического режима, если BH=0, то BL  указывает 
 цвет
         фона  и  цвет  окружения. Окружение эквивалентно произво
льной
         области экрана, если речь идет  о  цвете  фона.  Значени
е  BL
         может быть выбрано из полной 16-ти цветной палитры.
              Если  BH=1,  то  BL  определяет  палитру.  Для  цве
тного 
         графического  адаптера  это  применимо  только  к  режим
у   4 
         (среднее   разрешение   4-х   цветная   графика).  Для  
более 
         совершенных графических адаптеров, в том числе  и  для  
PCjr, 
         это  положение  расространяется  и  на  все остальные ре
жимы. 
         Здесь  мы  рассматриваем  только  стандартные   4-х   цв
етные 
         палитры, которые характерны для режима 4 (палитры 0 и 1)
. 
              
              Палитра 0:
                     
                    0 - текущий цвет фона
                    1 - зеленый (2)
                    2 - красный (4)
                    3 - коричневый (6)
              
              Палитра 1:
              
                    0 - текущий цвет фона
                    1 - циан (3)
                    2 - пурпупный (5)
                    3 - белый (7)
      
         ________________________________________________________
____
              Номер функции             Параметры
               обслуживания
         ________________________________________________________
____
              
                 AH = 11        BH = указатель палитры (0 или 1 д
ля
                                     среднего разрешения
                                BL = цвет или палитра использован
ия
                                     с указателем цвета
         ________________________________________________________
____     
              
              Функция обслуживания с кодом 12 (C/16) предназначен
а для
         записи пикселя.  Поскольку  положение  курсора,  использ
уемое
         функциями  обслуживания  с  кодами 9,10,14, рассматривае
тся в
         контексте символов,  то  здесь  необходимо  указывать  с
троку
         развертки  и  позицию  (столбец)  пикселя. Координаты пи
кселя
         отсчитываются от верхнего левого  угла  экрана  (0,0).  
Номер
         строки развертки, для которого треуется один байт указыв
ается
         в регистре DL, для номера столбца одного байта недостаоч
но  -
         ему отведен регистр CX. 
              Цвет  задается  в  регистре  AL и может быть исполь
зован
         либо непосредственно, либо  в  сочетании  с  другими  цв
етами
         (операция XOR).
              
         ________________________________________________________
____
              Номер функции                   Параметры
               обслуживания
         ________________________________________________________
____
              
                    AH = 12       AL = код цвета пикселя (0 - 15)
                                  DL = номер строки пикселя
                                  CX = номер столбца пикселя
         ________________________________________________________
____
              
              
              Функция обслуживания с  кодом  13  (D/16)  предназн
ачена
         для  чтения  пикселя,  точнее  для получения информации 
о его
         цвете. (Для сравнения напомним, что процедура обслуживан
ия  с
         кодом  8 формирует на выходе как код цвета, так и код си
мвола
         ASCII). Код цвета пикселя формируется в регистре AL;  ст
аршие
         биты   при  этом  устанавливаются  в  0.  Регистры  DL  
и  CX
         предназначены  для  передачи  процедуре  обслуживания  н
омера
         строки и номера столбца пикселя.
              
         ________________________________________________________
____
              
               Номер функции                   Параметры
                обслуживания
         ________________________________________________________
____     
              
                   AH = 13        AL =  код цвета пикселя (0 - 15
)      
                                  DL = номер строки пикселя
                                  CX =  номер столбца пикселя
         ________________________________________________________
____
              
              Функция обслуживания с кодом 14(E/16) предназначена
  для 
         записи  символа  в  режиме  телетайпа. При этом экран ди
сплея 
         оказывается  в  роли  принтера  или  пишущей  машинки.  
Такие 
         команды  операционной  системы  как  TYPE  или  COPY  (е
сли в 
         качестве  результирующего  файла   указана   консоль   "
CON") 
         используют  эту  функцию  обслуживания для имимтации при
нтера 
         или пишущей  машинки.  В  сущности,  в  рамках  этой  фу
нкции 
         обслуживания  возможности аппаратуры в части генерации ц
вета, 
         мерцания или управления курсором не используются. 
              При  обращении  к  процедуре  обслуживания  с  кодо
м  14 
         производится запись символа в  текущую  позицию  (указыв
аемую 
         курсором)   и   осуществляется   перемещение   курсора. 
  При 
         необходимости выполняется переход к новой  строке  или  
сдвиг 
         содержимого   экрана.   Записываемый   символ  указывает
ся  в 
         регистре AL. Для текстового режима  текущие  атрибуты  э
крана 
         сохраняются.  Для графического режима цвет фона указывае
тся в 
         регистре BL. 
              Из  всего  набора  символов  следующие  четыре   си
мвола
         непосредственно   не   отображаются,   а   выступают  в 
 роли
         упрвляющих (интепретируются  аппаратурой):  CHR$(7)  -  
звук,
         CHRS(8) - возврат на одну позицию, CHR$(10) - перевод ст
роки,
         CHR$(13) - возврат каретки.
              
         ________________________________________________________
____
              Номер функции                 Параметры
               обслуживания
         ________________________________________________________
____
              
                  AH = 14         AL = записываемый символ ASCII
                                  BL = цвет символа (только для
                                       графических режимов)
                                  BH = страница (для графических
                                       режимов не указывается)
         ________________________________________________________
____
              
              Приложение 8.1. Текст программы демонстрации 
         возможностей управления цветом (Бейсик).     
         1000 REM Listing 8.1
         1010 REM
         1020 REM
         1030 GOSUB 2000 ' TITLE
         1040 GOSUB 3000 ' GET WHICH DISPLAY TYPE, AND SET ADDRES
         1050 GOSUB 2000 ' SET THE TITLE AGAIN
         1060 GOSUB 4000 ' BUILD THE SURROUNDING COMMENTS
         1070 GOSUB 5000 ' BUILD THE DISPLAY ARRAY
         1080 GOSUB 6000 ' FINISH UP AND RETURN TO DOS
         
         2000 REM Title subroutine
         2010 KEY OFF : CLS : WIDTH 80
         2020 REM
         2030 PRINT "    Programs for INSIDE THE IBM PERSONAL COM
PUTER"
         2040 PRINT "           (C) Copyright 1983 Peter Norton"
         2050 PRINT
         2060 PRINT     Program 8-1: Demonstrate all screen attri
butes"
         2999 RETURN
         
         3000 REM Subroutine to inquire about display type
         3010 PRINT
         3020 PRINT "Before we go any further, is this a color-gr
aphics display? ";
         3030 GOTO 3060
         3040 PRINT
         3050 PRINT " (answer Y or N) ";
         3060 ANSWER$=INKEY$
         3070 IF LEN(ANSWER$)<1 THEN 3060
         3080 IF LEN(ANSWER$)>1 THEN 3040
         3090 SEGVAL!=0
         3100 IF MID$(ANSWER$,1,1)="Y" THEN SEGVAL!=&HB800 ' Colo
r segment
         3110 IF MID$(ANSWER$,1,1)="y" THEN SEGVAL!=&HB800 ' Colo
r segment
         3120 IF MID$(ANSWER$,1,1)="N" THEN SEGVAL!=&HB000 ' Mono
chrome segment
         3130 IF MID$(ANSWER$,1,1)="n" THEN SEGVAL!=&HB000 ' Mono
chrome segment
         3140 IF SEGVAL!=0 THEN 3040
         3150 DEF SEG=SEGVAL!
         3999 RETURN
         
         4000 REM  subroutine to build the surrounding messages
         4010 LOCATE 11,1  : PRINT "Normal"
         4020 LOCATE 12,1  : PRINT "normal"
         4030 LOCATE 19,1  : PRINT "Normal"
         4040 LOCATE 20,1  : PRINT "blinking"
         4050 LOCATE 11,69 : PRINT "Bright"
         4060 LOCATE 12,69 : PRINT "normal"
         4070 LOCATE 19,69 : PRINT "Bright"
         4080 LOCATE 20,69 : PRINT "blinking"
         4090 FOR HEX.DIGIT%=0 TO 15
         4100   LOCATE 6,HEX.DIGIT%*3+17
         4110   PRINT HEX$(HEX.DIGIT%)
         4120   LOCATE HEX.DIGIT%+8,11
         4130   PRINT HEX$(HEX.DIGIT%)
         4140 NEXT HEX.DIGIT%
         4150 LOCATE ,,0
         4999 RETURN
         5000 REM subroutine to set the display array
         5010 FOR ROW%=0 TO 15
         5020   FOR COL%=0 TO 15
         5030     POKE(ROW%+7)*160+COL%*6+31,ROW%*16+COL%
         5040     POKE(ROW%+7)*160+COL%*6+33,ROW%*16+COL%
         5050     POKE(ROW%+7)*160+COL%*6+35,ROW%*16+COL%
         5060     POKE(ROW%+7)*160+COL%*6+32,ROW%*16+COL%
         5070   NEXT COL%
         5080 NEXT ROW%
         5999 RETURN
         
         6000 LOCATE 25,1,1
         6010 PRINT "Press any key to return to DOS... ";
         6020 IF LEN(INKEY$)=0 THEN 6020 ' wait to keystroke
         6030 CLS
         6999 SYSTEM
         
         9999 REM End of program Liisting 8-1
         
         
         
         
         
              Приложение 8.2. Текст программы генерации изображен
ий
                              (Паскаль).
                              
         module Listing_8_2;
         
         {=======================================================
===}
         
         type
         
           screen_position_pair_type=(character_byte,attribute_by
te);
           normal_screen_type=array[1..25,1..80,
                  character_byte..attribute_byte] of char;
                  
           narrow_screen_type=array[1..25,1..40,
                  character_byte..attribute_byte] of char;
                  
         {=======================================================
===}
         
         var [static]
         
           screen_pointer     : ads of normal_screen_type;
           
           current_attribute  : char;
           row,column         : integer;
           output_string      : lstring(255);
           
           page               : word;
           eighty_col_mode    : boolean;
           
         {=======================================================
===}
         
         const
           normal_attrib = chr   (7);
           reverse_video = chr (112);
           bright        = chr  (15);
           blinking      = chr (135);
           alert         = chr (140);
           
         {=======================================================
===}  
         
         procedure clear_reset;
           external;
         function video_mode : byte;
           external;
           
         {=======================================================
===}  
         
         procedure set_video_address;
           begin
             if video_mode=7 then
               begin
                 screen_pointer.s:=#B000;
                 screen_pointer.r:=0;
               end
             else
               begin
                 screen_pointer.s:=#B800;
                 screen_pointer.r:=0;
               end;
           end;
           
         {=======================================================
===}  
         
         procedure clear_screen;
           begin
           {if you have the assembly language routines, just to t
his: }
             clear_reset;
             return;
           {otherwise, we'll clear the screen the hard way: }
             for row:=1 to 25 do
               for column:=1 to 80 vdo
                 begin
                   screen_pointer^[row,column,character_byte]:=' 
';
                   screen_pointer^[row,column,attribute_byte]:=no
rmal_attrib;
                 end;
           end;
           
         {=======================================================
===}  
         
         {                      НЕРАЗБОРЧИВО                     
   }
         
         {=======================================================
===}
         
         procedure set_pointer_for_page;
           begin
             if eight_col_mode then
               screen_pointer.s:=#B800+page*4096
             else
               screen_pointer.s:=#B800+page*2048
             end;
             
         end.
           
       ГЛАВА 9. ВИДЕОДОСТУП 2 - ГРАФИЧЕСКИЙ РЕЖИМ
     После  завершения  обсуждения  основ  видеопредставления
информации и собственно текстового  режима  в  предшествующей
главе,   перейдем   к   рассмотрению  особенностей  работы  в
графическом режиме.
     Не  следует  удивляться  сложности  предмета   "машинная
графика". Сама по себе графика - вещь непростая; здесь же она
осложняется чисто техническими аспектами, такими как цветовые
палитры,  многочисленные режимы м хранимые образы содержимого
экрана. Это сложный, многоаспектный вопрос. В  рамках  данной
главы мы не будем углубляться в детали. Если в Ваши намерения
входит использование графического режима  IBM/PC  или  просто
изучение  основ  предмета,  то  следует  продолжать чтение. В
противном случае, материал настоящей главы может быть опущен.
     Все сказанное ниже распространяется на компьютер IBM/PC,
а  также  на  все  совместимые  с  ним  компьютеры (последние
предполагают возможность выполнения произвольной программы, в
том  числе  и  графической, написанной для IBM/PC). Если речь
идет о компьютерах, использующих операционную систему MS-DOS,
то большинство положений нуждается в уточнениях.
     9.1. Основы машинной графики
     Существует два основных способа формирования графических
изображений на видеомониторе.  Причудливый  мир  компьютерных
(экранных)    игр   позволяет   получить   о   них   какое-то
представление, оценить их место, роль и возможности. (Ниже об
этом   еще  пойдет  речь,  однако  следует  все  это  увидеть
собственными глазами.)
     Эти  способы  основываются  либо  на  векторном, либо на
растровом  (точечном,  пиксельном)   принципах   формирования
изображений,  далее именуемых просто векторной или пиксельной
графикой. Графика IBM/PC -  это  пиксельная  графика;  именно
этому виду графики мы уделим основное внимание.
     (Термин  "вектор",  кстати,  уже  использовался нами при
рассмотрении прерываний. Там он обозначал два машинных слова,
содержащих адрес программы, выполняющей обработку прерываний;
здесь под "вектором" понимается отрезок прямой. И  первая,  и
вторая   интерпретация  термина  имеют  чисто  математические
параллели, с которыми мы не будем далее соприкасаться.  Здесь
нам важно эти термины не смешивать).
     При построении изображений на экране дисплея  средствами
векторной  графики  используются только прямые. В этом случае
машинная программа специфицирует две крайние точки прямой,  а
собственно дисплей "проводит" между ними прямую.
     Если взять обычный экран дисплея - будь то телевизионный
приемник  или  компьютерный терминал - то в случае растрового
сканирования  электронный   луч,   генерирующий   изображение
перемещается  по  стандартному  шаблону, образуемому строками
развертки,  заполняющими  весь  экран.  В   случае   дисплея,
работающего   на  принципах  векторной  графики,  перемещение
электронного  луча  осуществляется   по   команде,   рисующей
заданную  прямую  между  заданными  точками. В рамках системы
векторного   сканирования,  перемещение   электронного   луча
осуществляется  по заданной в каждом случае  траектории, а не
по раз и навсегда установленному шаблону.
     Векторная    графика    обладает    рядом   существенных
преимуществ - ей присущи  высокая  четкость,  и  точность,  а
также  сравнительно высокое быстродействие. Все это делает ее
эффективной  в  сфере  инженерной  графики,   а   также   при
построении  особенно сложных или точных графических дисплеев.
Однако векторно-графические  системы  используются  лишь  для
вычерчивания  прямых  (или  изображений,  которые  могут быть
представлены в виде совокупности коротких отрезков).В  рамках
этой  системы  оказывается  невозможным заполнять изображения
цветом сложной формы. Это сильно сужает область их  возможных
применений.
     В  основе  растровой или пиксельной графики лежит другой
принцип. Экран дисплея  здесь  разделяется  на  прямоугольную
сетку,    состоящую   из   множества   мельчайших   элементов
изображения, называемых также пикселями  или  пэлами.  Каждый
пиксель   обладает   свойством   светимости.   Таким  образом
изображение синтезируется из множества отдельных точек.
     Размеры  пикселей  и  расстояния  между  ними  тщательно
рассчитываются таким образом,  чтобы  промежутки  между  ними
отсутствовали.  Если  группа  смежных  пикселей  находится  в
возбужденном состоянии (т.е. светится), то они воспринимаются
глазом  не  как  совокупность отдельных точек, а как сплошной
участок. Если бы точки были  достаточно  малы,  то  этот  тип
дисплея  мог бы конкурировать с векторным по части четкости и
точности,  однако,  у  большинства  растровых  дисплеев  этот
показатель оставляет желать лучшего.
     В  принципе,  любая  система  машинной   графики   может
обеспечить  воспроизведение  цвета,  однако, чаще всего, цвет
ассоциируется с растровой графикой. Цвет - это веский (но  не
единственный)   аргумент   в   пользу   превосходства  систем
растровой графики над системами векторной графики в игровой и
деловой  сферах.  Способность воспроизводить сплошные, прямо-
криволинейные поверхности в цвете  делает  растровую  графику
намного  предпочтительней  векторной  (исключение  составляют
специальные приложения, например, технические чертежи).
     И   последний  аспект.  В  отличие  от  систем векторной
графики, в  которых  изображение   генерируется   с   помощью
последовательности   команд   (каждая   команда  рисует  одну
небольшую  прямую), системы   растровой   графики   допускают
использование  хранимого  в памяти образа экрана (эти вопросы
мы уже рассматривали применительно к  текстовым  образам).  В
компьютере  IBM/PC  мы имеем дело именно с сиcтемой растровой
(пиксельной)   графики;   управление   процессом   построения
изображения   на  экране  дисплея  осуществляется  с  помощью
хранимого  образа  экрана.  Все   преимущества   дисплеев   с
хранимыми   образами  экрана  распространяются  на  растровый
дисплей компьютера IBM/PC - и в первую очередь способность  к
считыванию  и  записи  отображаемых данных непосредственно из
памяти дисплея.
     9.2. Понятие элемента отображения (пикселя)
     По  мере  движения  сканирующего  луча по экрану дисплея
высвечиваются те  или  иные  пиксели.  (По  крайней  мере  те
пиксели,  которые  находятся  в  видимой части экрана; дело в
том, что сканирующий луч выходит  за  пределы  видимой  части
экрана, в так называемую "закадровую" область. Эта область не
содержит пиксели, однако, для нее может быть установлен цвет.
В  языке  Бейсик  для  этого служит параметр границ оператора
COLOR  (ЦВЕТ);  кроме  того,  одна  из  функций  обслуживания
BIOS-ПЗУ  может  быть  использована для установки закадрового
цвета).
     Напомним, что в  текстовом  режиме  экран  персонального
компьютера  IBM/PC  состоит  из  25  горизонтальных текстовых
строк;  из  материалов  предшествующей  главы,  связанных   с
описанием  курсора,  известно  также,  что  на  каждый символ
цветного    графического    дисплея     приходится     восемь
горизонтальных   строк   развертки.   Отсюда   следует,   что
вертикальный размер общего пиксельного поля IBM/PC равен  200
строкам (8Х25).
     Горизонтальный    размер    пиксельного    поля    может
варьироваться.  Этот  размер  зависит   от   объема   памяти,
требуемой  для  управления  пикселями,  а  также  от величины
пикселя (точки), высвечиваемой на том  или  ином  графическом
мониторе.
     Компьютер  IBM/PC  имеет  два  различных  горизонтальных
формата  (размера)  пиксельного   поля,   устанавливаемых   в
зависимости   от  требуемого  размера  (а,  следовательно,  и
количества)  пикселя(ей). В режиме среднего разрешения ширина
экрана составляет 320 точек, а в режиме  высокого  разрешения
- 640  точек. (Компьютер  IBM/PC  допускает также возможность
работы  в  режиме  низкого  разрешения,  однако,  этот  режим
практически  не  используется.  В  режиме  низкого разрешения
поверхность экрана  представляется  в  виде  матрицы  160Х100
пикселей.    Аппаратура    цветного   графического   адаптера
поддерживает режим низкого  разрешения,  однако,  программная
поддержка на уровне BIOS-ПЗУ отсутствует).
     Таким  образом,  графический  режим  среднего разрешения
предусматривает наличие 320 точек по горизонтали экрана и 200
точек по вертикали, в то время как графический режим высокого
разрешения  -  640  точек  по  горизонтали  и  200  точек  по
вертикали.  Понятно, что изображение, представленное в режиме
высокого разрешения,  способно  воспроизводить  более  мелкие
детали  только  на  горизонтали.  Для  большинства приложений
качество изображения практически осталось бы неизменным, если
бы режим высокого разрешения выражался параметрами 320Х400.
     Каждый пиксель на экране дисплея может находиться либо в
активном (светимость), либо в пассивном состоянии;  в  режиме
среднего разрешения может быть воспроизведен и цвет. В режиме
высокого разрешения цвет не  воспроизводится,  отчасти  из-за
особенностей  генерации изображения, отчасти из-за отсутствия
дополнительной памяти, необходимой для воспроизведения цвета.
     Рассмотрим    требования    к    памяти,   предъявляемые
графическим  режимом  высокого  разрешения.  Если   к   числу
сведений,  сообщаемых  о  пикселе,  относится  только признак
активного или пассивного состояния  (наличие  или  отсутствие
светимости  пикселя)  -  а  именно это и сообщается о пикселе
-, то  для  управления  пикселем  достаточно   одного   бита,
принимающего  значение  0 или 1. В режиме высокого разрешения
имеется 640Х200 (или 128000)  пикселей.  Для  управления  ими
требуется  128000  бит,  а с учетом того, что байт состоит из
восьми  битов,  -  16000  байт.  Именно такая память выделена
цветному графическому адаптеру (округлена до 16К).
     Режим среднего разрешения требует вдвое  меньшего  числа
пикселей.  Имея  те же 16К байт памяти мы  можем выделить для
каждого пикселя два бита. С помощью  двух  битов  могут  быть
представлены  четыре  различные величины (0, 1, 2, 3); но это
позволит лишь частично решить проблему воспроизведения  цвета.
     Прежде, чем познакомиться  с  окончательным  разрешением
проблемы  воспроизведения цвета в графическом режиме, обратим
внимание на одно отличие  в  специфике  использования  памяти
дисплея  в  графическом  и  текстовом  режимах. Из предыдущей
главы нам известно о наличии двух текстовых режимов  -  80-ти
позиционного  и  40-позиционного.  Графика представлена также
двумя  режимами:  режимом  среднего  разрешения   и   режимом
высокого  разрешения.  В  обоих  случаях  число  отображаемых
элементов одного режима вдвое  превышает  число  отображаемых
элементов   другого   режима.   Соответственно  изменяются  и
требования, предъявляемые к памяти. На  этом  сходство  между
ними  заканчивается.  Если  в текстовом режиме дополнительная
память  используется  для  увеличения  числа  страниц,  то  в
графическом  режиме  дополнительная  память  используется для
удвоения объема памяти, отводимой под один пиксель.
     В связи со спецификой  управления  цветом  в  компьютере
IBM/PC    возникает    вопрос   о   количестве   одновременно
используемых цветов.  Цветной  графический  адаптер  и  экран
видеомонитора  способны  воспроизвести  любой  из шестнадцати
возможных цветов  для  каждого  пикселя.  Здесь  нет  никаких
проблем. Проблемы возникают при спецификации цвета.
     Фирма   IBM   могла  пойти  по  пути  создания  цветного
графического  адаптера,  имеющего   достаточно   памяти   для
представления  всех  возможных цветов каждого пикселя, однако
она этого не сделала.  Как  уже  говорилось  выше,  в  режиме
высокого  разрешения  каждому  пикселю  отводится только один
бит,  поэтому   в   принципе   в   этом   режиме   невозможно
воспроизвести  более двух цветов - белого и черного. В режиме
среднего  разрешения  каждому  пикселю  отводится  два  бита,
поэтому возможно воспроизведение четырех цветов.
     Проблема выбора того или  иного  набора,  состоящего  из
четырех  цветов,  решена необычно и остроумно. В любой момент
времени  активны  только  четыре   цвета,   но   пользователю
предоставляется   возможность  установить  любой  из  четырех
цветов по своему усмотрению. Остальные три устанавливаются  в
рамках  так  называемой палитры. В качестве компенсации фирма
IBM предоставляет на выбор две  возможные  палитры  -  первая
состоит  из  зеленого, красного и коричневого (на большинстве
дисплеев воспроизводится как желтый), а вторая  -  из  циана,
малинового и белого.
     Если все это звучит  недостаточно  убедительно,  давайте
рассмотрим  этот  вопрос  с другой стороны. При задании цвета
любого пикселя в режиме  среднего  разрешения  мы  используем
один из четырех кодов 0, 1, 2, 3. Что стоит за этими числами?
Ничего  жестко  фиксированного.  Их  смысл   определяется   в
процессе спецификации используемого цвета. Мы можем закрепить
за кодом 0 один  из  16  цветов.  Для  кодов  1-3  фирма  IBM
предлагает  две  стандартные  возможности  (две  палитры),  и
пользователь  должен  выбрать,   какую   палитру   он   будет
использовать. Заметим здесь, что пользователь не может влиять
на составление палитры.
     Давайте  еще  раз  осмыслим  происходящее. Если бы объем
памяти был достаточно велик,  то  мы  могли  бы  для  каждого
пикселя    использовать   полную   гамму   цветов   (16).   В
действительности объем памяти таков, что  в  режиме  высокого
разрешения  цветовая  гамма каждого пикселя состоит только из
двух цветов, а в  режиме  среднего  разрешения  -  только  из
четырех.  Пользователю  могли  бы  быть  предоставлены  более
широкие возможности в части выбора  цвета,  однако  по  этому
пути разработчики персонального компьютера не пошли.
     В  режиме   высокого   разрешения   пользователь   лишен
возможности  выбирать  конкретные цвета (два цвета) по своему
усмотрению; этими цветами могут быть только черный и белый. В
режиме   среднего  разрешения  пользователь  имеет  некоторую
свободу выбора цветовой гаммы. Из четырех  цветов  один  цвет
устанавливается   пользователем  произвольно.  Остальные  три
цвета  устанавливаются  в  рамках  одной   из   двух   строго
фиксированных палитр.
     Таким  образом,  любой  цветной  дисплей  в  графическом
режиме позволяет использовать четыре цвета, причем три  цвета
выбираются  из палитры 1 (зеленый, красный, коричневый), либо
из палитры 2 (циан, малиновый, белый).
     Если  цветной дисплей находится в графическом режиме, то
цвет любого пикселя (из  состава  имеющихся  четырех  цветов)
можно  применить  путем  изменения  содержимого  двух  битов,
описывающих этот пиксель. Существует и  возможность  изменить
сразу  цвета  всего  изображения;  для  этого  следует:  либо
изменить палитру, либо изменить цвет 0, либо изменить и то  и
другое.  В этих случаях собственно  изображение (картинка) не
меняется,  изменяется  лишь  ее  цвет(а).  (Для  графического
режима  низкого  разрешения  предусмотрено  достаточно битов,
чтобы каждый пиксель мог воспроизвести любой из 16  возможных
цветов. Режим низкого разрешения может быть вполне реализован
на  Вашем  компьютере;  аппаратная  поддержка  этого   режима
реализована полностью. Однако программная поддержка на уровне
BIOS-ПЗУ полностью отсутствует. Если  функции  программ  BIOS
возьмет  на себя программа пользователя, то графический режим
низкого разрешения будет функционировать).
     9.3. Отображение пикселей на экране
     Графический  режим  работы компьютера представляет собой
наиболее сложный режим. Если использовать процедуры BIOS-ПЗУ,
ориентированные  на обслуживание графического режима (описаны
в параграфе 8.9), то декодирование образа экрана  выполняется
автоматически. Это одна из причин их широкого использования.
В  тех  случаях,  когда необходимо использовать режим прямого
управления,  следует  детально  ознакомиться   с   материалом
настоящего параграфа.
     Подобно  обычному  телевизору,  видеомонитор  генерирует
изображение за два прохода. На первом проходе электронный луч
перемещается  только по четным строкам развертки; после этого
(на обратном ходе луча) сканируются все нечетные строки.
     При  работе  в  текстовом  режиме  это  обстоятельство в
расчет   не   принимается,   поскольку   функции   управления
формированием   изображения  полностью  выполняет  контроллер
видеомонитора.   В   графическом   режиме   эти   особенности
необходимо учитывать.
     Электронные схемы генерации  изображения  в  графическом
режиме  должны воспринимать поток битов, определяющих пиксели,
причем воспринимать их в том порядке, в  котором  сканирующий
луч  перемещается  по  экрану - сначала по четным, а затем по
нечетным строкам. По этой причине образ экрана хранится не  в
том виде, который удобен  человеку-оператору  или  программе;
структура  хранимого образа отвечает потребностям электронных
схем генерации. На рис.9.1 воспроизводится эта структура.
     Для  того,  чтобы  структура  хранимого  образа   экрана
соответствовала механизму сканирования экрана, память дисплея
организована в виде двух блоков, смещенными друг относительно
друга  на  4К.  Первый  блок  содержит  информацию о пикселях
четных строк,а второй  блок  -  о  пикселях  нечетных  строк.
Рассмотрим  эти  вопросы более подробно (используя в качестве
примера графику с высоким разрешением).
     В начале  области  (блока)  памяти  располагаются  биты,
управляющие  процессом  отображения  на экране дисплея первой
строки, т.е. строки с номером 0. Строка содержит 640 пикселей
(графический  режим  с высоким разрешением), а каждый пиксель
требует для индикации своего состояния 1 бит. Таким  образом,
для  управления  первой  строкой  требуется  640 битов или 80
байтов. Для управления следующей четной  строкой  (строкой  с
номером  2)  также  требуется  640 битов или 80 байтов и т.д.
Самый первый бит управляет точкой экрана дисплея, находящейся
на  пересечении  нулевой  строки  и  нулевого  столбца (0,0),
следующий бит управляет точкой (0,1) и т.д. Последней  точкой
первой  строки  является  точка  (0,639);  следом за ней идет
точка (2,0) и т.д.  В  конце  концов  блок  памяти,  хранящий
четные  строки,  оказывается  исчерпанным, и с нового адреса,
кратного  1К,  начинается  блок  памяти,  хранящий   нечетные
строки.
     Для графического режима со  средним  разрешением  память
организована   точно   также,   с   той  лишь  разницей,  что
горизонтальная координата экрана  состоит  из  320  пикселей,
причем  каждый пиксель представлен двумя битами, позволяющими
представить  цветовые  комбинации. Для  представления  строки
по-прежнему    требуется   80   байтов;   для   представления
используются два блока памяти: один - для четных, а другой  -
для нечетных строк.
     Заметим  здесь,  что конечный адрес памяти будет одним и
тем же как для режима среднего, так  и  для  режима  высокого
разрешения.  Но  в  одном  случае число пикселей вдвое меньше
(при  вдвое  большем   количестве   битов,   отведенных   для
представления  каждого  пикселя),  а  в другом  случае  вдвое
больше  (соответственно,  количество  битов,  отведенных  для
представления  пикселя  в  два  раза  меньше).  Такой  подход
позволяет сохранить постоянную длину строки для обоих режимов
-   640   битов  или  80  байтов.  Программы,  приведенные  в
приложении (листинг  9.1),  дают  возможность  пользователям,
программирующим   на   Паскале,  эффективно  управлять  любым
пикселем.    Эти    программы    осуществляют     необходимые
арифметические преобразования, связанные с пересчетом позиции
пикселя  на  экране  дисплея   в   адрес   памяти,   хранящей
кодированный  образ экрана, избавляя пользователя от рутинной
работы по вычислению смещений битов и байтов.
     Эффективность    этих   процедур   становится   особенно
очевидной,  когда   требуется   создавать   быстродействующие
программы генерации изображений. Любая программа, относящаяся
к указанному классу, должна тем или иным способом  переводить
пиксели  из  активного  состояния  (состояние  светимости)  в
пассивное  и  наоборот.  Сделать  это  можно  либо  используя
функции  обслуживания  BIOS-ПЗУ, описанные в  предыдущей  и в
последней главах, либо упомянутые Паскаль-процедуры  (листинг
9.1).  Высокое  быстродействие программ генерации изображений
предполагает, что тот или  иной  фрагмент  будет  загружен  в
память  графического  адаптера  сразу  целиком,  а  не  будет
формироваться побитно.  А  для  этого  необходимо  произвести
декомпозицию  изображения  на четные и нечетные строки, после
чего  обеспечить  их  размещение  в  соответствующих   блоках
памяти.  Указанное  обстоятельство  сильно  усложняет процесс
быстрой генерации изображений.
     Решение задачи быстрой генерации изображений зависит  от
потребностей  и  от  принятых компромиссов. Один из возможных
подходов  состоит  в  разбиении   изображения   на   участки,
помещаемые  в  один  байт (четыре пикселя для режима среднего
разрешения и восемь пикселей для режима высокого разрешения).
Приняв  такую схему, можно осуществлять загрузку фрагментов в
память графического адаптера побайтно. Такой  метод позволяет
резко  снизить  вычислительные  затраты,  в противном случае,
программы должны  выполнять  массу  операций  манипулирования
битами,   таких,   например,   как  сдвиги,  логические  "И",
логические "ИЛИ" и т.п. Работа с  байтами  повышает  скорость
генерации  образа приблизительно в три раза, при условии, что
собственно образ уже построен.
     Существует  и  другой,  более  грубый  способ  повышения
скорости   генерации   изображения.   Его   суть   состоит  в
использовании текстовой графики (псевдографики),  описываемой
в следующем параграфе.
     9.4.   Представление  текста  (символов)  в  графическом
режиме.
     Отображение  символов  на экране дисплея не представляет
особого труда, даже если  компьютер  работает  в  графическом
режиме.   Символы   в   этом  случае  представляются  в  виде
совокупности пикселей,  как  если  бы  это  были  графические
объекты, подлежащие рисованию (вычерчиванию).
     Для фиксации схемы вычерчивания символов  в  графическом
режиме  приняты  специальные  соглашения. Площадь, занимаемая
символом,  представляется  в  виде   матрицы   размером   8Х8
пикселей.  Принятый  принцип кодирования в принципе очевиден.
Для воспроизведения  очертания  (рисунка)  символа  отводится
восемь   байтов.  Восемь   битов   каждого   байта  управляют
состоянием  восьми  пикселей  одной  строки  рисунка  символа
(нумерация  пикселей  ведется  слева направо). Очередной байт
описывает очередную строку  (нумерация  строк  осуществляется
сверху вниз).
     На рис.9.2 представлена диаграмма  отображения  символов
(букв), содержащая  сведения об особенностях взаимодействия с
таблицей рисования символов. В качестве примера выбрана буква
"А".
     Даже  при  беглом знакомстве с этой диаграммой возникает
ряд интересных вопросов. Нижняяя  строка  диаграммы  отведена
под   нижний   выносной   элемент  символа  (литеры),  такой,
например, как "хвост" прописной буквы "у". Две верхние строки
отведены  под  заголовок  литеры.  В  качестве литер, имеющих
заголовок, можно привести строчную букву "ь" (имеется в  виду
ее  вертикальный  отрезок, используюший область заголовка), а
также все прописные буквы алфавита (буквы верхнего регистра).
Вопреки  "здравому  смыслу"  буквы  размещаются  не по центру
матрицы, а смещаются (выравниваются ) по  ее  левой  границе,
так  что  два  столбца справа служат для  отделения  символов
друг от друга.
     При формировании символов в графическом режиме  BIOS-ПЗУ
осуществляет  поиск  рисунка  (образа)  символа во внутренней
таблице отображения, а  затем  найденное  табличное  описание
использует для команд активизации пикселей. На заключительной
стадии устанавливаются соответствующие биты в памяти  дисплея
путем  пересылки  четных  и  нечетных строк в соответствующие
блоки памяти.
     Поскольку в графическом режиме высокого  разрешения цвет
не  воспроизводится  (воспроизводятся  только  черный и белый
цвета), то рисунок (образ) символа непосредственно  управляет
активизацией  пикселя.  В  цветном режиме среднего разрешения
воспроизводятся цвет  очертания  (рисунок)  и  фоновый  цвет.
Фоновый  цвет  -  это  цвет, обозначенный кодом 0; этим кодом
может быть обозначен любой из 16-ти  имеющихся  цветов.  Цвет
очертания  устанавливается с помощью  кода 3 текущей цветовой
палитры; для палитры 1 это белый цвет,  а  для  палитры  0  -
коричневый/желтый.
     Процедуры  манипулирования  символами   BIOS-ПЗУ   могут
осуществлять  как  считывание, так и запись символов. Функция
обслуживания с кодом 8 является именно  такой  процедурой.  В
текстовом  режиме  никаких  проблем  при чтении не возникает,
поскольку в  памяти  дисплея  хранится  байт  с  кодом  ASCII
требуемого  символа.  В графическом режиме все обстоит не так
просто, поскольку байт с кодом ASCII  в  памяти  отсутствует.
Вместо  этого  память  содержит группу байтов, представляющих
точечный  (пиксельный)  рисунок  символа.  Поэтому  процедура
BIOS-ПЗУ  чтения символа осуществляет нетривиальные операции.
Она читает пиксели и  сопоставляет  их  с содержимым  таблицы
рисунков    (образов)    символов,   выполняя   своего   рода
распознавание образа.
     Таблица  рисунков  (образов)  символов  состоит  из двух
частей и представляет для пользователя значительный  интерес.
Первая  часть  этой  таблицы хранится в ПЗУ и содержит первые
128 символов кода ASCII,  то  есть  все  стандартные  символы
алфавита. Вторая часть таблицы содержит рисунки остальных 128
символов  (т.е.  символов   CHR$(120)-CHR$(255)).   Поскольку
первая  часть  находится  в  ПЗУ  (указатель  на  нее  строго
фиксирован), то она  не  может  быть  ни  модифицирована,  ни
заменена  на  другую таблицу. Вторая часть таблицы, в отличие
от  первой,  ориентирована  на  пользователя;  она  создается
пользователем под его потребность.
     Один  из  векторов  прерывания  (прерывание  с  кодом 31
(1F(16)),  размещенный   в   таблице   векторов   по   адресу
124(7С(16))  используется  для  указания  на  эту  таблицу. В
исходном состоянии таблица отсутствует и вектор  равен  нулю.
После  создания  нужной таблицы и загрузки ее адреса в вектор
прерывания любое обращение к BIOS-ПЗУ для  записи  символа  с
кодом   CHR$(128)-CHR$(255)  приведет  к  воспроизведению  на
экране этого символа.
     Такой   подход,   основанный  на  свободном  определении
таблицы рисунков 128 символов  является  важной  предпосылкой
для быстрого построения наиболее типичных графических образов
(несложные  графики,  схемы,   рисунки,   таблицы,   чертежи,
диаграммы  и др.). Если требования к изображаемым объектам не
слишком  высоки,  то  всегда   можно   определить   ансамбль,
состоящий  из  128  шаблонов  (каждый шаблон имеет размер 8Х8
пикселей) и генерировать на их основе эти объекты.  Очевидно,
что  наиболее  сложные  и  детальные  образы  не  могут  быть
построены таким способом. И все-таки ансамбль,  состоящий  из
128  предварительно  определенных шаблонов, достаточно велик,
чтобы    пользовательские    программы    обладали    высоким
быстродействием,   были   просты  и  компактны.  В  сущности,
процедуры обслуживания рисунков символов BIOS-ПЗУ  (используя
таблицу,  созданную  пользователем)  берут  на  себя основную
работу по генерации образов; пользовательские программы  лишь
помещают нужные символы в нужные позиции экрана.
     Описанные  возможности  генерации  графических  символов
отнюдь не исключают возможность непосредственного  доступа  к
памяти дисплея и управления отдельным пикселем. В графическом
режиме пользователь может сочетать обе возможности. Когда это
удобно  -  использовать  таблицу  графических  символов,  при
необходимости - манипулировать пикселями.  Вполне  допустимо,
например,   изменять   любой  пиксель  внутри  любого  образа
символа, уже выведенного на экран.
     Таблица  рисунков символов требует для своего размещения
1024 байтов памяти: 128 символов Х 8  байтов  (требуемых  для
каждого символа). В графическом режиме со средним разрешением
один байт программы  пользователя  может  использоваться  для
управления   образом,   состоящим   из   64   пикселей,   что
эквивалентно  восьми  байтам  отображаемой  информации.   При
соблюдении  определенных  требований такой подход позволяет в
восемь раз сжать графический образ по отношению к исходному.
     Прежде чем использовать эти возможности, следует оценить
последствия  ограничений, распространяемых не только на число
возможных шаблонов, но и на число  воспроизводимых  цветов  в
режиме  среднего  разрешения.  Число  таких  цветов  не может
превышать  двух.  Обычный  режим  цветной  графики  позволяет
использовать  полную  4-х цветную палитру, в то время как при
использовании возможностей построения изображений  на  основе
синтеза  символов  количество цветов в палитре уменьшается до
двух.
     В  тех  случаях,  когда   таблица   рисунков   символов,
формируемая  пользователем,  не  применяется  для  построения
изображений  в   графическом   режиме,   можно   использовать
специальные  символы  из расширенного набора. Это может найти
применение  при  имитации  символов  текстового  режима,  при
построении  специальных  шаблонов  или  алфавитов.  Так,  это
наиболее  простой  и  эффективный  способ  генерации   других
национальных алфавитов - греческого, славянского (кириллица),
японского (кана). Символика арабского языка  и  иврита  также
вполне  представима, однако, здесь возникают другие сложности
-    сложности,    связанные    с    особенностями     письма
(справа-налево).
     Приложение 9.1. Текст программы генерации изображений
              (Паскаль).
module listing_9_1;
type
 word_bits_type       =  set of 0..15;
high_res_pixel_type   = (off,on);
medium_res_pixel_type =(color_0,color_1,color_2,color_3;
 graphics_screen_type=
   record
     even_pixel : array [0..99,0..39] of word_bits_type;
     filler     : array [1..192] of byte;
     odd_pixel  : array [0..99,0..39] of word_bits_type;
   end;
var [static]
 graphics_screen_pointer  :  ads of graphics_screen_type;
 general_screen_pointer   :  adsmem;
 row,column               :  integer;
value
 graphics_screen_pointer.s := #B800;
 graphics_screen_pointer.r := 0;
 general_screen_pointer.s  :=#B800;
 general_screen_pointer.r  :=0;
{================================================================
===}
procedure set_medium_res_pixel (color : medium_res_pixel_type);
  var [static]
    work_byte : word_bits_type;
    work_set0 : set of 0..15;
    work_set1 : set of 0..15;
begin
 if odd (row) then
   work_byte :=
  graphics_screen_pointer ^ .odd_pixel [(row-1) div 2, column div
 8];
 else
   work_byte :=
  graphics_screen_pointer ^ .even_pixel [row div 2, column div 8]
 work_set0 := [(column mod 8) * 2];
 work_set1 := [(column mod 8) * 2 + 1];
 if color in [color_2,color_3] then
   work_byte := work_byte + work_set0
 else
   work_byte := work_byte - work_set0;
 if color in [color_1,color_3] then
   work_byte := work_byte + work_set1
 else
   work_byte := work_byte - work_set1;
 if odd (row) then
   graphics_screen_pointer ^ .odd_pixel [(row-1) div 2, column di
v 8]
    :=work_byte
 else
   graphics_screen_pointer ^ .even_pixel [row div 2, column div 8
    := work_byte;
end;
{===========================================================}
procedure clear_screen_graphics;
  var [static]
    i : word;
  begin
    for i := 0 to 16383 do
      general_screen_pointer ^ [i] := 0;
  end;
{===========================================================}
end.
                      ГЛАВА 10. КЛАВИАТУРА
                      ____________________
              Клавиатура - это одно из основных звеньев взаимодей
ствия
         человека и компьютера. В этой главе  мы  подробно  рассм
отрим
         работу  клавиатуры  Персонального  компьютера  фирмы  "И
БМ" и
         методы управления этой работой. Клавиатура IBM/PC  имеет
  ряд
         интересных особенностей, которые мы сейчас изучим.
              10.1. Основные принципы функционирования клавиатуры
              На  мой  взгляд,  один из наиболее впечатляющих мом
ентов
         конструкции  IBM/PC  -  это  способ  работы  с   клавиат
урой.
         Выбранный   подход   в   равной  мере  прост  и  элегант
ен  и
         программистам необходимо знать две вещи, связанные  с  в
водом
         информации  от клавиатуры, следующие из этого конструкти
вного
         подхода.
              На электронном  уровне  клавиатура  IBM/PC  предста
вляет
         собой   небольшой  самостоятельный  компьютер.  Внутри  
блока
         клавиатуры размещается  микропроцессор  8048  фирмы  "Ин
тел",
         который  выполняет  задачу  слежения  за  нажатиями  кла
виш и
         передачи  их   состояния.   Микропроцессор   8048   выпо
лняет
         различные  функции,  включая самодиагностику (после вклю
чения
         питания    компьютера),    проверку    нажатия    клавиш
    и
         противодребезговую защиту (что не позволяет воспринимать
 одну
         нажатую клавишу  как две).
              Микропроцессор 8048 позволяет также буферизовать  д
о  20
         нажатий  клавиш,  если  центральный  процессор  не  може
т  их
         принять сразу. Обычно этот буфер совершенно  пуст,  поск
ольку
         ситуации,    когда    центральный   процессор   не   усп
евает
         отреагировать на запрос клавиатуры.
              Вы, вероятно, слышали предупреждающий  звуковой  си
гнал,
         когда  нажатие Вами клавиш опережало возможности програм
мы по
         их вводу. Это не связано  с  заполнением  буфера  клавиа
туры.
         Процедура  ввода  с  клавиатуры  системы  BIOS  в  ПЗУ  
имеет
         собственный  буфер  и  звуковой  сигнал  раздается  в  с
лучае
         заполнения  этого буфера. Буфер клавиатуры может содержа
ть 20
         символов, а буфер системы BIOS - только 15. По мере  изу
чения
         клавиатуры  мы  рассмотрим  как  код нажатой клавиши поп
адает
         сначала в буфер клавиатуры, затем в буфер BIOS и, наконе
ц,  в
         программу.
              Блок   клавиатуры   не  связывает  с  клавишами  ни
каких
         конкретных   значений.   Вместо   этого,   блок    клави
атуры
         идентифицирует  по  ее  номеру  или  коду  сканирования.
  Все
         клавиши имеют коды сканирования от 1 до  83.  На  рис.  
10.1.
         показаны коды, соответствующие всем клавишам.
              При  нажатии  клавиши  блок  клавиатуры  передает е
е код
         сканирования   центральному   процессору.    Когда    кл
авиша
         отпускается, клавиатура снова передает ее код, но увелич
енный
         на 128 (или шестнадцатиричное значение  80).  Таким  обр
азом,
         имеются различные коды для нажатия и освобождения клавиш
              Для   работы   с   клавиатурой   используются   пор
ты  и
         прерывания. Когда выполняется какое-либо действие с  кла
вишей
         (нажатие или освобождение), процессор клавиатуры обнаруж
ивает
         его и запоминает в своем буфере. Затем, процессор  клави
атуры
         формирует  прерывание  с  номером  9.  В  ответ на преры
вание
         служебная  процедура  системы  BIOS  в  ПЗУ   считывает 
  код
         сканирования  клавиши  из  порта клавиатуры (порт номер 
96) и
         затем пересылает в порт  клавиатуры  команду  очистить  
буфер
         процессора  клавиатуры.  Если  системный блок не реагиру
ет на
         прерывания клавиатуры, то коды сканирования  накапливают
ся  в
         буфере  процессора  клавиатуры,  хотя  при  нормальной р
аботе
         этого не должно  происходить.  Специальный  код  сканиро
вания
         255,   шестнадцатиричное  значение  FF,  используется  б
локом
         клавиатуры, для сообщения, что его буфер заполнен.
              Поскольку  информация  о  нажатии  клавиши  поступа
ет  в
         системный блок от клавиатуры  через  порт,  любая  прогр
амма,
         имеющая  доступ  к  порту,  может  непосредственно общат
ься с
         клавиатурой. На практике, однако, это  неприменимо,  так
  как
         блок   клавиатуры  вырабатывает  еще  и  прерывания,  ко
торые
         обрабатываются  системой  BIOS  в  ПЗУ.  Однако,  просто
   из
         любопытства,  можно  написать небольшую программу на Бей
сике,
         читающую порт клавиатуры и сообщающую, что она  там  нах
одит.
         Ниже приведен фрагмент этой программы.
              Поскольку  эта  программа состязается с системой BI
OS за
         получение  информации  от  клавиатуры,  ее  работа  неск
олько
         хаотична.  Но  если  запустить  эту  программу  и нажима
ть на
         клавиши,  она   все   же   зарегистрирует   несколько   
кодов
         сканирования.
              100  REM  Программа на Бейсике, пытающаяся считыват
                        коды сканирования клавиатуры
              110  X=INP(96)  'чтение порта клавиатуры
              120  THROW.AWA4$ = INKEY$ 'отбросить любые коды,счи
тан-
                                         системой BIOS
              130  IF X=0 THEN GOTO110 'если данных нет - продолж
ать
                                        ожидание
              140  PRINT
              150  PRINT "Код сканирования клавиатуры"; XMOD128;'
сооб-
                                                        щить код
              160  IF X > 128 THEN PRINT "клавиша осбождена";
              170  IF X > 129 THEN PRINT "клавиша нажата";
              180  GO TO 110
              Клавиатура  IBM/PC  выполняет  еще  и функцию повто
рения
         клавиши. Блок  клавиатуры  следит  за  тем,  сколько  вр
емени
         клавиша  остается  нажатой  и  формиирует  сигнал повтор
ения.
         Функция повторения  распространяется  на  все  клавиши  
блока
         клавиатуры.
              Процедуры  системы BIOS в ПЗУ могут распознавать от
личие
         повторных нажатий клавиши от повторения сигнала  удержив
аемой
         в нажатом состоянии клавиши, путем анализа кодов сканиро
вания
         освобожденной клавиши.  Если  для  одной  и  той  же  кл
авиши
         получены  два  кода нажатой клавиши и между ними не было
 кода
         освобожденной   клавиши,    значит    клавиша    удержив
ается
         процедурами  системы  BIOS  для подавления функции повто
рения
         тех клавиш,  которым  она  не  нужна,  таких  как,  напр
имер,
         клавиша смещения (shift).
              Теперь  Вам  должны быть понятны основы того, как I
BM/PC
         работает  с  клавиатурой.  Блок  клавиатуры   сообщает, 
  что
         происходит  с  клавиатурой:  какие  клавиши нажимаются, 
какие
         освобождаются и, через определенный промежуток времени, 
какие
         удерживаются   в   нажатом  состоянии.  Система  BIOS  в
  ПЗУ
         интерпретирует получаемую  от  блока  клавиатуры  информ
ацию,
         придавая  ей  определенный  смысл. Таким образом, имеет 
место
         очень  ясное  и  четкое  разделение  труда.  Блок  клави
атуры
         занимается  физической  стороной, механизмом функциониро
вания
         клавиатуры,  а  программы  системы  BIOS  в  системном  
блоке
         выполняют  все  логические операции по интерпретации дей
ствий
         клавиатуры.
              Большинство пользователей даже не знает, что  клави
атура
         IBM/PC  передает  сигналы  не  только  о  нажатии,  но  
и  об
         освобождении  клавиши,  поскольку  такая  информация   о
бычно
         скрыта  от  пользователя.  Ее  можно  увидеть,  запустив
 тест
         клавиатуры из набора диагностических  программ  IBM/PC. 
 Если
         присмотреться,  можно  заметить,  что  изображение  на э
кране
         меняется при каждом нажатии, освобождении клавиши  или  
когда
         клавиша удерживается в нажатом состоянии достаточно долг
о для
         того, чтобы начала действовать функция повторения.
              10.2. Определение смысла нажатых клавиш
              Служебная процедура системы BIOS для  прерывания  9
  или
         прерывания  клавиатуры  определяет  смысл  каждого дейст
вия с
         клавиатурой. Это включает  слежение  за  состоянием  сме
щения
         кодов и преобразование нажатий клавиши в их значения, бу
дь то
         буквы алфавита или сигналы  функциональных  клавиш.  Ниж
е  мы
         будем рассматривать эту функцию подробнее.
              Часть  щадачи обслуживания клавиатуры со стороны си
стемы
         BIOS заключается в слежении за всеми  возможными  состоя
ниями
         смещений.   Состояния   смещений   довольно   часто  выз
ывают
         путаницу, поскольку клавиатура  обычной  пишущей  машинк
и,  с
         котокой   большинство  из  нас  начинало  свое  знакомст
во  с
         клавишами, имеет  всего  одну  клавишу  смещения,  Клави
атуры
         многих  кимпьтеров,  в  том  числе  и  IBM/PC, имеют три
 типа
         смещений.
              Во-первых, имеются обвчные функции клавиш,  без  вс
якого
         смещения  (например,  для  получения букв в нижнем регис
тре).
         Затем имеется  обычное  смещение,  такое  же  как  у  пи
шущих
         машинок,  которое служит для получения букв верхнего рег
иства
         и, как правило, всех  знаков,  нанесенных  на  верхнюю  
часть
         клавиши.  Кроме  того,  имеются  еще   два   вида   смещ
ения,
         изменяющее  смещение ("ALT") и управляющее смещение ("CT
RL").
         Эти два специальных  вида  смещения  используются  анало
гично
         обычному  смещению  в том смысле, что просто "а" не совс
ем то
         же самое, что "А" в верхнем регистре, и Ctrl-A и Alt-A  
также
         имеют собственные значения. (Некоторые читатели могут сч
итать
         клавишу "ESC" еще одной клавишей смещения. Это связано с
 тем,
         что  в  некоторых  старых  терминалах  компьютеров,  осо
бенно
         таких,  которые  использовались  подобно  клавишам  смещ
ения.
         Однако, при использовании клавиши "ESC" она не удерживал
ась в
         нажатом  состоянии,  подобно  клавишам  смещения,  -  сн
ачала
         нажималась  клавиша  "ESC",  а  после  нее  какая-либо д
ругая
         клавиша. Оба этих  нажатия  рассматривались  как  специа
льная
         последовательность.  Такое  действие нельзя рассматриват
ь как
         операцию смещения. Обычно, клавиша "ESC" подобным  образ
ом  в
         IBM/PC не используется.)
              Допустимыми  считаются не все сочетания обычных кла
виш и
         клавиш смещения. Если ввести одну из недопустимых комбин
аций,
         то  система BIOS ее просто проигнорирует, как будто ниче
го не
         произошло.  Несколько  позже  мы  перечислим  все  допус
тимые
         комбинации  смещений  клавиш,  чтобы Вы могли воспользов
аться
         ими в своих программах.
              На  клавиатуре   IBM/PC   имеется   четыре   специа
льных
         "переключательных"  клавиши,  которые  действуют  в  кач
естве
         тумблера "включения-отключения" для определенных функций
. Эти
         клавиши  Insert  (вставка),  Caps-Lock (закрапление загл
авных
         букв), Num-Lock (закрепление цифровой клавиатуры) и  кла
виша,
         которой  практически  не пользуются, Scroll-Lock (закреп
ление
         "роллинга").  Две  из  этих  клавиш,  Caps-Lock  и  Num-
Lock,
         являются   частью   механизма   смещения,  а  оставшиеся
  две
         управляют определенными специальными режимами работы.
              Информация о  состоянии  этих  четырех  переключате
льных
         клавиш  и  том,  удерживается  ли  в  данный момент в на
жатом
         состоянии одна из  клавиш  смещения,  хранится  в  специ
ально
         выделенной   для   этих   целей   области  в  нижних  ад
ресах
         оперативной памяти. Вся эта информация хранится в двух б
айтах
         с  адресами 1047 и 1048 (или 417 и 418 шестнадцатиричных
). Во
         время работы IBM/PC,  в  этих  двух  байтах  сохраняются
  все
         состояния  смещения  и состояния переключателей. Емтеств
енно,
         что после выключения  компьютера  эти  байты  сбрасывают
ся  в
         нормальное состояние.
              Программа  на  Бэйсике,  листинг которой 10.1 приве
ден в
         конце этой главы, отображает эти два  байта  и  демонстр
ирует
         воздействие  на них нажатий клавиш смещения и переключат
елей.
         Описание смысла отдельных битов приведено ниже.
              Поскольку клавиши смещения действуют  только  в  на
жатом
         состоянии,   система   BIOS   следит   за   их   нажатия
ми  и
         освобождениями и вносит необходимые изменения в интерпре
тацию
         обычных  клавиш.  Система  BIOS следит за кодами сканиро
вания
         при освобождении только для клавиши  смещения,  так  как
  для
         всех остальных клавиш эта функция не имеет смысла.
              Когда  система  BIOS  получает  код сканирования об
ычной
         клавиши, она проверяет все варианты  смещения  и  преобр
азует
         этот  код  в соответствующее значение, которое может быт
ь как
         символьным кодом ASCII, так и кодом специального назначе
ния.
              Процедура обслуживания клавиатуры системы BIOS след
ит не
         только за состояниями смещения. Состояние клавиатуры хра
нится
         в первых тринадцати битах указанных выше двух байт по  а
дресу
         1047.  Ниже  приведена таблица значений этих битов, изме
нения
         которых можно проследить с помощью программы 10.1:
         ________________________________________________________
_____
            Байт  Бит    Смысл             Значение, когда бит ра
вен 1
         ________________________________________________________
_____
              1    1     Insert              состояние активное
              1    2     Caps-Lock           состояние активное
              1    3     Num-Lock            состояние активное
              1    4     Scroll-Lock         состояние активное
              1    5     Alt                 клавиша нажата
              1    6     Ctrl                клавиша нажата
              1    7     смещение слева      клавиша нажата
              1    8     смещение справа     клавиша нажата
              2    1     Insert              клавиша нажата
              2    2     Caps-Lock           клавиша нажата
              2    3     Num-Lock            клавиша нажата
              2    4     Scroll-Lock         клавиша нажата
              2    5     Состояние захвата   активное состояние
              2    6     (не используется)   (после Ctrl-Num-Lock
              2    7     (не используется)
              2    8     (не используется)
         ________________________________________________________
____
              В этой таблице нашел отражение ряд интересных  моме
нтов.
         Во-первых, можно отметить параллельность использования п
ервых
         четырех  битов  обоих  байтов  для  клавиш-переключателе
й.  В
         первом байте  отражается  текущее  состояние  клавиши,  
а  во
         втором  байте  указывается  нажатие  соответствуюших  кл
авиш*
         Во-вторых. обратив внимание на биты, соответствующие  на
жатию
         обычных  клавиш  смещения,  расположенные  в правой и в 
левой
         частях клавиатуры, распознаются по  отдельности.  Для  т
акого
         разделения  трудно  придумать  разумное применение, но т
ем не
         менее оно имеет место.
              Кроме того, система BIOS следит за  состоянием  вст
авки,
         управляемым  переключателем.  Эта функция обычно игнорир
уется
         программами, которые  используют  клавишу  Iusert,  напр
имер,
         текстовыми прогцессорами. Обычно. все программы, использ
ующие
         эту клавишу, сами следят за  режимом  вставки.  Практиче
ского
         значени[  это не имеет, но нам показалось любопытным отм
етить
         и такой факт.
              И, наконец, обратите внимание на бит состояния  зах
вата,
         который   устанавливается,   когда   процедура   обслужи
вания
         клавиатуры  системы  BIOS  обнаруживает  комбинацию   кл
авиши
         Ctrl-NumLock.  Эта  комбинация используется системой BIO
S для
         управления состоянием захвата, которое программам  обнар
ужить
         трудно,  поскольку в этом состоянии программы не выполня
ются.
         В состоянии захвата система  BIOS  выполняет  короткий  
цикл,
         ожидая  нажатия  клавиши,  которое  выводит  систему из 
этого
         состояния. В этом состоянии распознаются и обслуживаются
  все
         прерывания.  Если  прерывание  поступит  от  клавиатуры 
 (при
         нажатии обычной клавиши), то состояние  захвата  заверша
ется,
         код  нажатой  клавиши отбрасывается и управление возвращ
ается
         той программе, которая выполнялась до установления  сост
ояния
         захвата.   Если   прерывание  имело  другую  природу  (н
омер,
         прерывание от дисков), то  оно  обслуживается,  но  сост
ояние
         захвата сохраняется пока не будет нажата клавиша.
              Комбинация клавиш Ctrl-NumLock -  это  один  из  че
тырех
         особых  случаев, отслеживаемых процедурой системы BIOS. 
Когда
         процедура   обслуживания   клавиатуры   обрабатывает    
коды,
         принимаемые  от клавиатуры, она постоянно проверяет появ
ление
         одной из четырех  особых  комбинаций,  которые  обслужив
аются
         специальным образом.
              Фактически,  эти  четыре  комбинации рассматриваютс
я как
         команды, по которым должно начинаться выполнение определ
енных
         служебных  процедур.  Эти  четыре  комбинации:  Ctrl-Num
Lock,
         PrtSc, Ctrl-Alt-Del и Ctrl-Break.
              Как мы уже видели, комбинация Ctrl-NumLock  использ
уется
         для  приостановки  работы  компьютера. Процедура обслужи
вания
         клавиатуры  не  позволяет  компьютеру  продолжать  выпол
нение
         любой программы, пока приостановка не будет отменена наж
атием
         клавиши.
              Команда распечатки экрана или  PrtSc  предназначена
  для
         вывода содержимого экрана на устройство печати. Поскольк
у эта
         операция выполняется на  самом  примитивном  уровне,  он
а  не
         может  использовать  возможности  ДОС,  такие  как  пере
сылка
         сообщения в линию связи вместо устройства  печати.  Проц
едура
         распечатки  экрана  доступна  и  Вашим  программам  на у
ровне
         прерываний, что будет показано в главе 11.
              Комбинация   клавиш   Ctrl-Alt-Del   используется  
  для
         перезапуска  или  для перезагрузки системы. Когда встреч
ается
         такая комбинация, процедура обслуживания клавиатуры  пер
едает
         управление   программе  проверки  системы  и  запуска  р
аботы
         операционной системы.
              Эту комбинацию клавиш можно использовать в любой  м
омент
         времени  для  перезапуска  системы, если произошло какое
-либо
         отклонение от нормального функционирования. Однако, как 
можно
         заметить,  эта  комбинация  действует  не всегда. В неко
торых
         случаях IBM/PC необходимо бывает  выключить,  а  затем  
снова
         включить  и  уже  после  этого пытаться ее перезапустить
. Для
         чего   это   бывает   необходимо?   Комбинация   Ctrl-Al
t-Del
         срабатывает  всегда,  когда  работает  процедура обслужи
вания
         клавиатуры. Это условие может оказаться невыполненным в 
 двух
         случаях. Первый и наиболее распространенный связан с зап
ретом
         прерываний.  Из  главы  3  Вам  должно  быть  известно, 
  что
         прерывания   запрещаются   машинной   командой   CLI   и
   не
         обслуживаются  пока  не  будет  выдана  команда  STI.  О
бычно
         команда  STI  следует  за  командой  CLI через очень кор
откий
         промежуток  времени.  Однако,  если  программа   по   ош
ибке,
         оставила   прерывания   запрещенными,   то   нажатие   к
лавиш
         Ctrl-Alt-Del не  приведет  ни  к  какому  результату.  Д
ругая
         причина  нарушения  работы  процедуры обслуживания клави
атуры
         может быть связана с изменением значения  вектора  преры
вания
         от  клавиатуры.  Если  изменить  ячейки  памяти с 36 по 
39, в
         которых находится  вектор  прерывания  от  клавиатуры,  
тогда
         клавиатура   не   будет  работать,  в  том  числе  и  кл
авиши
         Ctrl-Alt-Del.  Естественно,  что  прогармма   запуска   
после
         включения питания восстанавливает все вектора прерываний
              Комбинация   Ctrl-Break   предназначена  для  преры
вания
         текущей операции. В отличие  от  остальных  трех  специа
льных
         комбинаций  она  может  отрабатываться программно. Преры
вание
         номер 27, шестнадцатиричное значение 1В, зарезервировано
  для
         процедуры,  которая  должна  вызываться  при  нажатии  к
лавиш
         Ctrl-Break. Если программа хочет использовать  это  сред
ство,
         она  должна занести адрес процедуры обслуживания прерыва
ния в
         ячейки  вектора  прерывания  27  -  ячейку  с  адресом  
 108,
         шестнадцатиричное   значение   6С.   Эту   возможность  
можно
         исследовать,  нажимая  клавиши  Ctrl-Break   при   работ
е   с
         интерпретатором  БЕЙСИКА или редактором Edlin, поставляе
мым в
         составе ДОС. Если программа не устанавливает адрес  проц
едуры
         обслуживания   прерывания  в  ячейку  108,  то  система 
 BIOS
         совместно с ДОС прерывают выполнение  текущей  программы
  или
         файла пакетной обработки. Управление возвращается ДОС.
              Поскольку   блок   клавиатуры  сообщает  обо  всем,
  что
         происходит  с  клавишами  и  процедуры  системы  BIOS  в
  ПЗУ
         интерпретируют  любые  действия,  выполняемые  с клавиат
урой,
         Ваша   программа   может   следить   за   всеми   действ
иями,
         производимыми   с  клавиатурой.  Программам  редко  треб
уются
         какие-либо   сведения   помимо   тех,   которые    сообщ
аются
         процедурами  обслуживания  клавиатуры  системы  BIOS  в 
 ПЗУ,
         поэтому не обеспечена  специальная  возможность,  позвол
яющая
         программе  определить какие в точности действия выполнял
ись с
         клавиатурой.
              Если Вам все-таки  необходимо  более  точно  знать,
  что
         происходит  с  клавиатурой,  Ваши  программы  могут подм
енить
         вектор  прерываний  для  клавиатуры,  который  расположе
н  по
         адресу   36,   шестнадцатиричное   значение   24.   Если
   Вы
         разрабатываете собственную процедуру обслуживания  преры
ваний
         от  клавиатуры,  то  она  может  либо выполнять абсолютн
о все
         функции  обслуживания,  либо  служить  пред-процессором 
  для
         стандартной   процедуры  системы  BIOS.  Предпроцессор  
может
         извлекать  любую  информацию,  которая  Вам   необходима
,   и
         передавать  управление  стандартной  процедуре для выпол
нения
         обычных действий.
                10.3.Символьные клавиши
              Коды сканирования клавиши преобраззуются системой B
IOS в
         расширенные  коды  ASCII,  состоящие  из  всез  256 возм
ожных
         байтовых комбинаций, кроме одной (байт с нулевым  значен
ием).
         В  этот  набор  кодов  входят  обычные символы, набор ко
торых
         описывается в различных  руководствах  по  IBM/PC.  Эти 
 коды
         можно  формировать  либо  с  помощью  нажатия  обычных к
лавиш
         (например,  клавиши  А  для  "А"  и  таек  далее)  или  
путем
         использования клавиатуры и клавиши Alt.
              Для  формирования  кодов  ASCII по второму методу н
ужно,
         удерживая клавишу "Alt" в нажатом состоянии, вводить чис
ловое
         значение  кода  ASCII. Значение должно вводиться в десят
ичном
         виде (от 1 до  255)  и  можно  использовать  только  чис
ловые
         клавиши в правой части клавиатуры (но не числа в верхнем
 ряду
         средней части клавиатуры). При  использовании  клавиши  
"Alt"
         процедуры  системы  BIOS  работают  особым образом, поск
ольку
         несколько нажатий клавиш должны интерпретироваться  как 
 один
         символ.  Пока  нажата  клавиша  "Alt"  можно  нажиматьск
олько
         угодно цифровых клавиш. Когда  клавиша  "Alt"  будет  на
конец
         освобождена,    будет    сформирован   код   символа   A
SCII,
         соответствующий введенному числовому  значению.  Если  в
вести
         слишком  большое  число,  используется его значение по м
одулю
         256. Например, если ввести Alt-1000,  то  будет  сгенери
рован
         символ  CHR$(232).  Деление  1000  на  256  дает остаток
 232,
         поэтому и генерируется символ с кодом CHR$(232).
              Единственное значение в коде ASCII,  которое  невоз
можно
         ввести  с  клавиатуры  - это нулевое значение или CHR$(0
). На
         это имеется несколько причин (код 0 определен в системе 
кодов
         ASCII  как  пустой  символ,  который  должен игнорироват
ься),
         однако, главная  причина  заключается  в  использовании 
 нуля
         системой   BIOS   для  указания  на  наличие  второго  н
абора
         символов, специальных символов. Хотя некоторые руководст
ва по
         IBM/PC  указывают,  что  нулевой  код  генерируется  наж
атием
         клавиши Ctrl-2 или с помощью клавиши "Alt", это неверно.
 Если
         удерживать  клавишу  "Ctrl"  в  нажатом  состоянии  и  н
ажать
         цифровую клавишу "2" будет сформирован  один  из  специа
льных
         символов  и этот символ должен интерпретироваться как CH
R$(0)
         из набора кодов  ASCII.  Это  не  совсем  то  же  самое,
  что
         формирование     действительного    кода    ASCII    CHR
$(0).
         Использование  клавиши   "Alt"   тоже   не   даст   жела
емого
         результата,  будете ли Вы нажимать клавиши Alt-0 или пыт
аться
         "обмануть"  систему,  вводя  эквиваленты   по   модулю  
 256,
         например, Alt-256 или Alt-512.
              Специальные   символы   используются   для   обозна
чения
         специальных  клавиш,  таких  как  "Home",  "End"   и   д
есять
         функциональных  клавиш  (фактически,  как  Вы  скоро уви
дите,
         имеется сорок функциональных клавиш).
              Специальные символы позволяют  использовать  специа
льные
         клавиши,  такие  как  функциональные клавиши, не использ
уя ни
         один из 256 символов расширенного кода ASCII.
              Механизм  кодирования,  который  система  BIOS   в 
  ПЗУ
         использует для указания, какой символ был введен с клави
атуры
         ( и определение того, обычный это  символ  или  специаль
ный),
         работает  с  двумя  байтами.  Если  первый  из двух байт
ов не
         нулевой, то введен символ  расширенного  кода  ASCII  и 
 этот
         символ хранится в первом байте. Есоли же первый байт нул
евой,
         то с клавиатуры введен специальный символ и его код  хра
нится
         во  втором  байте. Здравый смысл подсказывает, что можно
 было
         бы  использовать  один  бит  второго  байта  для  обычны
х   и
         специальных  символов.  Это  было  бы  проще  и  позволи
ло бы
         вводить нулевой код ASCII.
              В то время как в расширенном наборе ASCII 256 кодов
 (255
         из них можно ввести с клавиатуры), специальных кодов сто
лько,
         сколько  требуется  для   выполнения   всех   предусмотр
енных
         клавиатурой  IBM/PC  функций.  Например, сорок кодов выд
елено
         для функциональных клавиш (десять обычных и еще тридцать
  для
         трех возможных смещений - обычного и с помощью клавиш "A
lt" и
         "Ctrl").  Ниже  приведена   таблица   специальных   кодо
в   и
         комбинаций  клавиш,  которыми  они вырабатываются. Вы ко
нечно
         заметите  определенную  хаотичность  этих  кодов.   Неко
торые
         комбинации  с  клавишей "Alt" разрешены, а другие нет, п
ричем
         без какой-либо видимой причины.  То  же  можно  сказать 
 и  о
         комбинациях с клавишей "Ctrl".
           Значение            Клавиши, с помощью
           специального        которых он формируется
           кода
           ____________        __________________________________
              3                Ctrl-2 (что должно соответствовать
 коду
                               CHR$(0) или ASCII NULL)
              15               обратная табуляция (shift-tab)
             16-25             от Alt-a до Alt-p (верхний ряд бук
в)
             30-38             от Alt-A до Alt-L (средний ряд бук
в)
             44-50             от Alt-Z до Alt-M (нижний ряд букв
             59-68             от F1 до F10 (функциональные клави
ши)
              71               клавиша "Home" (курсор в верхний л
евый
                               угол экрана)
              72               клавиша "Курсор вверх"
              73               клавиша "PgUp" (страница вверх)
              75               клавиша "Курсор влево"
              77               клавиша "Курсор вправо"
              79               клавиша "End" (конец)
              80               клавиша "Курсор вниз"
              81               клавиша "PgDn" (страница вниз)
              82               клавиша "Ins" (вставка)
              83               клавиша "Del" (удалить)
             84-93             от смещение-F1  до смещение-F10 (ф
унк-
                               циональные клавиши с обычным смеще
нием)
            94-103             от Ctrl-F1 до Ctrl-F10
            104-113            от Alt-F1 до Alt-F10
              114              Ctrl-PrtSc
              115              Ctrl-Курсор влево
              116              Ctrl-Курсор вправо
              117              Ctrl-End
              118              Ctrl-PgDn
              119              Ctrl-Home
            120-131            от Alt-1 до Alt-= (верхний ряд кла
виш)
              132              Ctrl-PgUp
              Как Вы могли заметить, эта таблица не слишком регул
ярна.
         Вы,  наверное,  заметили,  что  имеется  сорок  комбинац
ий  с
         функциональными  клавишами  -  каждая  из  клавиш  в одн
ом из
         четырех смещенных состояний (обычном, смещенном,  с  кла
вишей
         "Ctrl" и с клавишей "Alt").
              Имея  в своем распоряжении все эти коды, любая прог
рамма
         не будет испытывать недостатка кодов специального назнач
ения.
         Обычно,  для  любой программы хватает функциональных кла
виш и
         нескольких клавиш специального назначения, таких как "Ho
me" и
         клавиши   управления   курсором.   Однако,  если  потреб
уются
         дополнительные клавиши, Вы сможете их найти в этой табли
це.
              Доступ  к  этим  специальным  кодам   символов   тр
ебует
         изменения  определенных  особых  методов.  В  следующих 
 двух
         разделах мы рассмотрим как это делается.
              10.4. Процедура обслуживания клавиатуры в системе B
IOS
              Рассмотрим  теперь  служебные  процедуры  системы  
BIOS,
         позволяющие осуществлять доступ к клавиатуре.
              Процедуры   обслуживания   клавиатуры   в  системе 
 BIOS
         вызываются с помощью прерывания номер  22,  шестнадцатир
ичное
         значение  16.  Таких процедур всего три, поскольку не сл
ишком
         много функций можно запросить для клавиатуры.
              Первая процедура, имеющая код  0,  возвращает  очер
едной
         принятый от блока клавиатуры символ. Эта процедура возвр
ащает
         управление вызввающей программе  только  тогда,  когда  
будет
         введен символ, так что программе не приходится проверять
, был
         ли  действительно  введен  символ.   Код   обычного   си
мвола
         возвращается  в  регистре  AL,  но  если содержимоое AL 
равно
         нулю, то в регистре АН находится  код  специального  сим
вола.
         Эти   регистры   соответствуют   первому  и  второму  ба
йтам,
         упоминавшимся  выше,  при  рассмотрении   кодов   специа
льных
         символов.   Ниже   описана   логика   процесса  распозна
вания
         получаемых символов:
              если AL=0 то
               начало
                 спец_символ:= истина;
                 введенный_символ:= АН
               конец
              иначе
               начало
                 спец_символ:= AL
               конец;
              Можно  сделать  ряд  интересных  замечаний,   касаю
щихся
         значений,  возвращаемых  этой процедурой. Если введен об
ычный
         код АSCII (то есть, AL не равняется нулю), то в  регистр
е  АН
         содержится  код  сканирования  для  нажатой клавиши. Но,
 если
         код ASCII был введен с помощью клавиши "Alt", то  в  рег
истре
         АН  будет  ноль. Этту информацию программа может использ
овать
         для определения способа вода символа. Некоторые символы 
 кода
         ASCII встречаются на клавиатуре IBM/PC дважды.
              Приложение 10.1. Текст программы демонстрации
         возможностей управления клавиатурой (Бейсик).
         1000 REM Листинг 10.1 - программа отображения битов
         1010 REM состояния клавиатуры
         1030 GOSUB 2000  'вывод заголовка
         1040 GOSUB 3000  'дополнительная информация
         1050 GOSUB 4000  'отображение битов клавиатуры
         1060 GOSUB 5000  'проверка завершения ввода с клавиатуры
         1070 GOTO 1050
         2000 REM Подпрограмма вывода заголовка
         2010 KEY OFF : CLS : WIDTHS 80 : LOCATE  ,,0
         2020 REM
         2030 LOCATE 5,1
         2040 PRINT " Программы для книги 'Персональный компьютер
         2050 PRINT " фирмы ИБМ', автор Питер Нортон, 1983"
         2060 PRINT
         2070 PRINT "Программа 10-1: Отображение битов состояния"
         2080 PRINT "клавиатуры"
         2999 RETURN
         3000 REM Подпрограмма отображения вспомогательной информ
ации
         3010 LOCATE 11,28
         3020 PRINT "Байт 1   Байт 2";
         3030 LOCATE 12,28
         3040 PRINT "12345678 12345678";
         3050 LOCATE 17,10
         3060 PRINT "Чтобы увидеть изменение битов состояния нажм
ите";
         3065 PRINT "и удерживайте любую из";
         3070 LOCATE 18,15
         3080 PRINT "-- Левую или правую клавишу смещения";
         3090 LOCATE 19,15
         3100 PRINT "--Ctrl,Alt,Num-Lock,Scroll-Lock,Caps-Lock,In
s";
         3110 LOCATE 21,10
         3120 PRINT "(обратите внимание на влияние смещения и"
         3125 PRINT "Num-Lock yf клавишу Ins) ";
         3130 LOCATE 24,10
         3140 PRINT "Для выхода в ДОС нажмите любую клавишу ввода
";
         3999 RETURN
         4000 REM Подпрограмма отображения битов состояния клавиа
туры
         4010 DEF SEG = &H40
         4020 CONTROL% = PEEK(&H17)
         4030 CHECK% = 128
         4040 FOR I% = 1 TO 8
         4050   LOCATE 14,27 + I%
         4060   IF CONTROL% >= CHECK% THEN COLOR 30,0 ELSE COLOR 
7,0
         4070   IF CONTROL% >= CHECK% THEN PRINT "1"; ELSE PRINT 
"0";
         4080   IF CONTROL% >= CHECK% THEN CONTROL% = CONTROL%-CH
ECK%
         4090   CHECK% = CHECK / 2
         4100 NEXT I%
         4110 CONTROL% = PEEK(&H18)
         4120 CHECK% = 128
         4130 FOR I% = 1 TO 8
         4140   LOCATE 14,36 + I%
         4150   IF CONTROL% >= CHECK% THEN COLOR 30,0 ELSE COLOR 
7,0
         4160   IF CONTROL% >= CHECK% THEN PRINT "1" ELSE PRINT "
0"
         4170   IF CONTROL% >= CHECK% THEN CONTROL% = CONTROL%-CH
ECK%
         4180   CHECK% = CHECK% / 2
         4190 NEXT I%
         4999 RETURN
         5000 REM Подпрограмма ожидания завершения работы
         5010 K$ = INKEY$
         5020 IF LEN(K$) = 0 THEN RETURN 'ожидание ввода с клавиа
туры
         5030 IF (LEN(K$) = 2) AND (CHR$(82) = MID(K$,2,1)) THEN
         5035 RETURN  'Нажата клавиша Ins
         5040 CLS : LOCATE ,,1
         5999 SYSTEM
         9999 REM Конец программы 10-1
              ГЛАВА  11.  ДОПОЛНИТЕЛЬНЫЕ  СРЕДСТВА  -  АДАПТЕР  С
ВЯЗИ,
                                 ДИНАМИК И ПРОЧЕЕ 
              
              
              В  этой  главе  мы  рассмотрим  доплнительные  сред
ства,
         представляемые  IBM/PC, некоторые их низ более сложны, д
ругие
         менее сложны, но все сложности не  таковы  не  таковы,  
чтобы
         посвящать  каждому  из  этих  средств  самостоятельную г
лаву.
         Здесь мы рассмотрим устройство  печати,  асинхронный  ад
аптер
         связи,  интерфейс  накопителя  на  кассетной магнитной л
енте,
         динамик и ряд полезных сведений о системе BIOS в ПЗУ.
              
              11.1. Асинхронный адаптер связи
              
              Асинхронный адаптер связи позволяет  IBM/PC  общать
ся  с
         внешним  миром  с помощью стандартного метода, известног
о под
         названием RS-232. В персональных компьютерах  адаптер  R
S-232
         обычно используется для двух целей.
              Первая  цель  использования RS-232 собственно для с
вязи,
         по телефонным линиям. При этом адаптер RS-232 подключает
ся  к
         модему   (или   модулятору-демодулятору),  который  выпо
лняет
         преобразование  сигналов  компьютера  в  телефонные  сиг
налы.
         Модем,  в  свою  очередь, подключается к телефонной лини
и. На
         другом конце линии должен находиться  другой  модем,  ко
торый
         может  быть  подключен  к чему-нибудь. Это может быть вс
е что
         угодно, от универсального компьютера до другого персонал
ьного
         компьютера  или  какого-либо  простого  устройства, напр
имер,
         устройства печати. Это, нужно сказать, и является  норма
льным
         использованием адаптера связи.
              Другой  способ  использования  RS-232 значительно п
роще.
         Некоторые устройства  вывода  разработаны  в  соответств
ии  с
         протоколом   взаимодействия   RS-232.   Наиболее   часто
  это
         относится  к  устройствам   печати,   особенно   посимво
льным
         устройствам.   Таким  образом,  адаптер  связи  IBM/PC  
может
         использоваться просто  в  качестве  дополнительного  сре
дства
         взаимодействия   с   периферийным  оборудованием,  таким
  как
         устройство печати.
              Сделаем небольшое отступление и рассмотрим два  осн
овных
         способа  взаимодействия персональных компьютеров, в том 
числе
         IBM/PC, с периферийным оборудованием. Эти два способа  к
ратко
         называют  последовательным  и  параллельным.  Протокол R
S-232
         является "последовательным", поскольку данные  передаютс
я  по
         одной  линии  и  биты  данных  посылаются последовательн
о, по
         одному.   Параллельная   связь   реализует    другую    
схему
         взаимодействия,  которая  по  названию  популярных  устр
ойств
         печати фирмы "центроникс",  получила  название  параллел
ьного
         интерфейса  типа  "Центроникс"  или,  для  краткости,  п
росто
         параллельного  интерфейса.  При  параллельном  взаимодей
ствии
         данные  передаются побайтно и этот интерфейс включает ст
олько
         линий связи, сколько необходимо чтобы передавать все эти
 биты
         одновременно.
              Параллельный интерфейс приспособлен для непосредств
енной
         связи компьютера с внешними устройствами,  в  частности,
  что
         данные  могут  передаваться  быстрее,  поскольку за один
 цикл
         передачи  пересылается   сразу   целый   байт.   Паралле
льный
         интерфейс   типа   "центроникс"   используется   в   кач
естве
         стандартного адаптера связи с устройством  печати  в  IB
M/PC.
         Последовательный  интерфейс  работает  медленнее,  однак
о, он
         имеет   ряд   специальных   возможностей   для    органи
зации
         взаимодействия с удаленными объектами. Все эти возможнос
ти не
         нужны   при   локальном    использовании    последовател
ьного
         интерфейса,  для взаимодействия с устройством печати. Од
нако,
         это может оказаться удобным способом организации связи  
между
         компьютером  и  устройством печати, в частности, еще и п
отому
         что многие персональные компьютеры предыдущего  поколени
я  не
         имели параллельного интерфейса.
              Осуществление   связи   с   удаленным   абонентом  
может
         оказаться очень сложной задачей, поскольку  может  возни
кнуть
         множество    различных    неполадок,    требуется    кон
троль
         многочисленных ошибок и необходимо работать  с  разнообр
азным
         оборудованием,   подключенным   к  линии.  Однако,  служ
ебные
         процедуры, входящие в систему BIOS  IBM/PC  для  обслужи
вания
         адаптера RS-232 достаточно просты и удобны в использован
ии.
              Имеется всего четыре служебных процедуры для связи 
и все
         они вызываются с  помощью  прерывания  20,  шестнадцатир
ичное
         значение  14:  регистр  DX  используется  для  указания 
того,
         какой адаптер связи должен быть использован, если  их  б
ольше
         одного;  нулевое  значение  соответствует первому (и, об
ычно,
         единственному) адаптеру. Программы 11-101 и 11-102,  вхо
дящие
         в  дисковый  пакет,  прилагающийся  к  этой  книге,  сод
ержит
         ассемблерные  интерфейсы   подпрограммы   и   вспомогате
льные
         программы    на    Паскале,    позволяющие   наиболее   
полно
         воспользоваться всеми процедурами связи системы BIOS в П
ЗУ.
              Первая  процедура,  с  кодом  0,  устанавливает   ч
етыре
         стандартных   параметра   связи:  скорость  передачи,  с
пособ
         контроля по  паритету,  количество  стоповых  битов  и  
длину
         слова.  Эти  параметры  задают различные вариации органи
зации
         связи. IBM/PC может использовать самые различные их соче
тания
         и  обычно конкретные значения определяются тем оборудова
нием,
         которое находится на другом  конце  линии  связи.  Коды 
 этих
         переменных выбираются из регистра AL следующим образом:
              Первые  три  бита  задают  скорость  передачи  в би
тах в
         секунду. Восемь  возможных  значений  соответствуют  дов
ольно
         большим  скоростям  передачи,  хотя  персональные  компь
ютеры
         наиболее часто используют две скорости - 300  и  1200  б
ит  в
         секунду. Ниже приведены коды и соответствующие им значен
ия:
              
              Код            Скорость передачи (бит в секунду)
             -----------------------------------------------
              000                 110  
              001                 150
              010                 300 (примерно 30 символов в сек
унду)
              011                 600
              100                1200 (примерно 120 символов в се
кунду)
              101                2400
              110                4800
              111                9600
              (Издержки  организации  связи  -  необходимость  пе
редачи
         битов  паритета  и  стоповых  битов - увеличивают число 
битов,
         необходимых для передачи символа.  Поэтому  скорость  пе
редачи
         300  бит в секунду позволяет передавать примерно 30 симв
олов в
         секунду, хотя в коде символа в ASCII всего 7 или 8 бит).
              Следующие два бита определяют способ контроля по па
ритету:
               
              ___            ________________
              Код            Способ контроля
              ___            ________________
              00                 отсутствует
              01                 контроль по нечетности
              10                 отсутствует
              11                 контроль по четности
              
              Следующий  бит  указывает  чмсло  используемых   ст
оповых
         битов, являющихся обязательной частью протокола RS-232:
              
              Код            Число стоповых битов
              ___            ____________________
              
               0                       1
               1                       2
              
              Последние    два    бита   параметра   определяют  
 длину
         используемого слова:
              
              Код            Длина слова
              ___            ___________
              
              10             7 бит (стандартный код ASCII)
              11             8 бит (обычная длина слова для компь
ютеров)
               
              Как  правило,  выбор всех этих параметров не произв
олен и
         определяется  характеристиками  системы  или  оборудован
ия,  с
         которыми Вы связываетесь.
              Вторая  процедура  для связи, с кодом 1, использует
ся для
         пересылки одного байта данных. Этот байт загружается в р
егистр
         AL и сигнал завершения возвращается в регистр AH. Если п
ердача
         завершилась неудачно,  то  первый  бит  в  регистре  AH 
 будет
         установлен  в  единицу,  а значение остальных семи бит б
удет в
         этом случае таким же, какое описано ниже для процедуры с
 кодом
         3.  Таким  образом, сравнение содержимого регистра AH с 
числом
         128 позволит определить успешно ли закончилась  передача
.  Как
         обычно,  интерфейсная  процедура,  входящая  в прилагающ
ийся к
         этой книге  пакет,  возьмет  на  себя  заботу  обо  всех
  этих
         подробностях.
              Третья  процедура  для связи, с кодом 2, использует
ся для
         приема байта из линии связи. Эта процедура ожидает  заве
ршения
         операции  (которое  может заключаться в обнаружении ошиб
ки или
         условия тайм-аута).
              Эта процедура  содержит  одну  из  наиболее  сушест
венных
         ошибок  в  исходной  версии системы BIOS-ПЗУ; если верси
я BIOS
         датирована 24.04.1981, то в ней сообщение о тайм-ауте ош
ибочно
         передается  как  сообщение  об  ошибке  по паритету с да
нными,
         готовыми для приема. Определить свою версию BIOS Вы  мож
ете  с
         помощью  отладчика  ДОС-DEBUG.  Если  вызвать  DEBUG  и 
ввести
         команду:
              
              D F000:FFF5 L8 
              
         то будет отображена дата создания версии BIOS. Более  по
дробно
         ошибки первой версии ситемы BIOS рассмотрены в главе 6.
              Если  операция  приема  закончилась  успешно,  реги
стр AH
         будет обнулен. В противном случае, единицы будут в перво
м бите
         регистра   AH  и  в  некоторых  битах  с  4-го  по  7-ой
,  как
         описывается ниже.
              Последняя  процедура,  с  кодом   3,   используется
   для
         определения полного текущего состояния порта связи (в ре
гистре
         AH) и его  модема  (в  регистре  AL).  Часть  этой  инфо
рмации
         сообщается  и при выполнении процедур с кодами 1 и 2. Ре
гистры
         AH и AL устанавливаются следующим образом:
              
              Регистр     Бит           Значение
              _______     ___           ________
              
              AH         1-ый      тайм-аут (кроме BIOS версии 24
.4.81)
              AH         2-ой      сдвиговый регистр передачи пус
              AH         3-ий      буферный регистр передачи пуст
              AH         4-ый      обнаружен разрыв связи
              AH         5-ый      ошибка в битах обрамления
              AH         6-ой      ошибка по паритету (BIOS верси
и 
                                   24.4.81 устанавливается в случ
ае 
                                   тайм-аута)
              AH         7-ой      коллизия
              AH         8-ой      данные готовы (BIOS версии 24.
4.81
                                   устанавливается в случае тайм-
аута)
              AL         1-ый      есть сигнал в линии
              AL         2-ой      есть вызов
              AL         3-ий      модем готов
              AL         4-ый      сигнал отбоя посылки
              AL         5-ый      есть дельта - огибающая сигнал
а при
                                   приеме
              AL         6-ой      есть задний фронт сигнала вызо
ва
              AL         7-ой      есть дельта - огибающая модем
              AL         8-ой      сигнал отбоя по дельта-огибающ
ей
              
              Вся приведенная выше информация предназначена  для 
 того,
         чтобы   позволить   специалисту   по  телекоммуникации  
начать
         программировать для IBM/PC.
               
              11.2. Адаптер устройства печати
              
              Система  BIOS-ПЗУ  включает   процедуры   поддержки
   для
         параллельного    адаптера    устройства    печати.   (Ра
зличия
         параллельных  и  последовательных  адаптеров   рассмотре
ны   в
         предыдущем   разделе).  Эти  процедуры  проще,  чем  про
цедуры
         обслуживания связи, поскольку проще  само  устройство  п
ечати.
         Имеется  всего  три  процедуры и используется только шес
ть бит
         состояния.
              Для  доступа  к   этим   трем   процедурам   исполь
зуется
         прерывание  23,  шестнадцатиричное  значение  17.  Регис
тр  DX
         указывается  для   указания   того,   какой   адаптер   
должен
         использоваться,  когда  их  больше  чем  один; ноль обоз
начает
         первый (и обычно единственный)  адаптер.  Программы  11-
101  и
         11-102 в дисковом пакете, прилагающемся к этой книге, вк
лючают
         интерфейсные  подпрограммы  на  Ассемблере  и  вспомогат
ельные
         процедуры   на   Паскале,   необходимые   для   более  п
олного
         использования этих служебных процедур системы BIOS. 
              Одна из незначительных ошибок в исходной  версии  с
истемы
         BIOS-ПЗУ  касается  как  раз  обслуживания  устройства п
ечати.
         Когда  команда  перевода  страницы   посылается   станда
ртному
         устройству  печати  фирмы  "Эпсон",  система  BIOS  отво
дит на
         выполнение  этой  операции  несколько  меньше   времени,
   чем
         фактически  может  потребоваться  устройству. Это происх
одит в
         тех случаях, когда команда перевода страницы  выдается  
вблизи
         верхнего  края  старой  страницы.  Во  всех версиях BIOS
 после
         24.4.1981 это время увеличено.
              Первая процедура с кодом 0,  используется  для  пер
есылки
         одного байта устройству печати. Эта процедура очень прос
та и о
         ней больше нечего сообщить.
              Вторая процедура  с  кодом  1,  используется  для  
сброса
         устройства  печати  и определения его состояния. Эта про
цедура
         может  использоваться  для  перевода   устройства   печа
ти   в
         нормальное   состояние   после   того  как  ему  были  п
осланы
         какие-нибудь  специальные  коды   управления.   Информац
ия   о
         состоянии   возвращается   в  регистре  AH,причем  биты 
 имеют
         следующие значения:
              
              Бит             Значение
              ___             ________
              
              1-ый         устройство печати занято
              2-ой         сигнал подтверждения
              3-ий         сигнал отсутствия бумаги
              4-ый         сигнал выборки
              5-ый         сигнал ошибки вывода
              6-ой,7-ой    не используются
              8-ой         сигнал тайм-аута (для BIOS версии 24.4
.1981
                           это может оказаться ложная тревога)
              Третья и последняя процедура с кодом 2  используетс
я  для
         чтения битов состояния, описанных выше, без выполнения с
броса.
         Эта  процедура  особенно  полезна  для   программ   упра
вления
         устройством печати.  
              Вот  и  все, что нужно былосказать об устройстве пе
чати.
         Это не слишком сложное устройство и,  соответственно,  п
росты
         процедуры его обслуживания. 
         
              11.3. Интерфейс кассетного накопителя
              
              Очередная  часть ссистемы BIOS-ПЗУ относится к инте
рфесу
         кассетного накопителя. Он практически никем не используе
тся и
         многие,  включая и меня, не видят других причин включени
я его
         в состав IBM/PC,  кроме  чисто  коньюктурных  проблем  с
быта.
         (Более подробно этот вопрос рассматрьивается в главе 2).
              Имеется  всего  четыре  простых  служебных процедур
ы для
         обслуживания кассетного накопителя  :  дл[  чтени[  и  з
аписи
         блоков   данных  и  для  включения  и  выключения  двига
теля.
         Отсутствуют команды перемотки кассеты:  эта  операция  д
олжна
         выполняться вручную с пульта управления кассетным накопи
телем.
              Заметим,   что   имеющиеся  команды  носят  "физиче
ский"
         характер, и совсем нет "логических команд, таких как  ко
манда
         поиска  файла.  Команды такого рода относятся скорее к у
ровню
         операционной системы, чем к уровню системы  BIOS  -  в  
конце
         концов,    система    BIOS   должна   обеспечивать   наи
более
         примитивный,  элементарный  уровень  обслуживания,  на  
 базе
         которого  могут строиться логические процедуры более выс
окого
         уровня. К сожалению, ДОС совершенно не поддерживает инте
рфейс
         кассетного накопителя, так что с ним можно работать толь
ко из
         Бейсика  или  на  примитивном  уровне   системы   BIOS. 
  Это
         существенно   ограничивает  возможности  тех,  кто  хоте
л  бы
         серьезно использовать кассетный  накопитель.
              Для доступа к четырем процедурам обслуживания кассе
тного
         накопителя   используется  прерывание  21,  шестнадцатир
ичное
         значение 15. Программы 11-101 и  11-102  в  дисковом  па
кете,
         прилагающемся    к    этой   книге,   включают   интерфе
йсные
         подпрограммы на ассемблере  и  вспомогательные  процедур
ы  на
         Паскале,  необходимые  для  более  полного использования
 этих
         служебных процедур системы BIOS.
              Первая  процедура,  с  кодом   0,   включает   двиг
атель
         кассетного  накопителя.  Эта процедура возвращает уцправ
ление
         немедленно,  не  ожидая  пока  двигатель  раскрутится  -
  это
         необходимо учитывать.
              Вторая процедура, скажем 1, выключает двигатель.
              Третья  процедура,  с  кодом  2, используется для ч
тения
         блоков данных с кассеты. Данные  передаются  блоками  по
  256
         байт  и  за один раз можно считывать несколько блоков. Е
сли в
         процессе передачи данных будект обнаружена ошибка,  сооб
щение
         об этом будет передано в регистре AH.
              
              Код ошибки              Значение
              __________              ________
              
                  1       обнаружена ошибка  циклического  избыто
чного
                          кода (CRC)
                  2       утрачены   некоторые    реквизиты     д
анных
                          (использующиеся  для  записи  размещени
я   и
                          информации о битах) 
                  4       данные не найдены
              
              
              Четвертая процедура, с кодом 3, использщуется для з
аписи
         блоков данных на кассету.
              На  этом  мы  завершаем  изучсение  служебных   про
цедур
         системы  BIOS-ПЗУ, предназначенных для поддержки перифер
ийных
         устройств, подключаемых к IBM/PC, но этим не исчетпывает
ся ни
         система  BIOS, ни оборудование IBM/PC. В следующем разде
ле мы
         рассмотрим все остальное. Но  прежде  чем  двигаться  да
льше,
         нужно  сообщить  еще  одну подробность, касающуюся интер
фейса
         кассетного накопителя.
              Интерфейс кассетного  накопителя  IBM/PC  разрабаты
вался
         только  для  подключения  кассетного накопителя к IBM/PC
 и он
         практически не используется ни в одном компьютере.  неко
торые
         умные  люди  приспосабливают  этот  интерфейс  для соеди
нени[
         IBM/PC   с   другими   устройствами.   Одно   из    возм
ожных
         использований  -  подключение специализированных контрол
леров
         буферированного приема/передачи.
              
              11.4. Дополнительные процедуры системы BIOS
              
              Помимо тех процедур, которые мы уже рассмотрели, си
стема
         BIOS   включает  еще  ряд  интересных  и  полезных  служ
ебных
         процедур. Программы 11-101  и  11-102,  входящие  в  дис
ковый
         пакет,   прилагаемый  к  этой  книге,  включают  интерфе
йсные
         подпрограммы на ассемблере  и  вспомогательные  процедур
ы  на
         Паскале,   позволяющие   наиболее   полно   использовать
  эти
         служебные процедуры системы BIOS.
              Первая из  этих  процедур  -  это  процедура  распе
чатки
         содержимого  экрана.   Она   обычно   вызывается   проце
дурой
         обслуживания   клавиатуры   системы   BIOS-ПЗУ,   когда 
   та
         обнаруживает   нажатие  клавиши  "PrtSc".  Распечатка  э
крана
         выполняется программой обслуживания прерывания номер 5 и
  это
         позволяет  программно  вызывать  ту  же  операцию, запра
шивая
         прерывание  номер  5.  Процедура   обслуживания   клавиа
туры,
         обнаружив нажатие клавиши "PrtSc", просто вызывает преры
вание
         5.
              Пользующиеся интерпретатором Бейсика замечали,  что
  при
         работе  с  Бейсиком  клавиша  "PrtSc"  не  действует. Од
нако,
         имеется простой способ вызова программы распечатки экран
а  из
         программ   на   Бзйсике.  Сам  интепретатор  изменяет  с
пособ
         обслуживания клавиатуры и здесь ничего  изменить  нельзя
,  но
         можно  просто запросить из программы на Бейсике прерыван
ие 5,
         описанное выше.
              Для  программ   на   Бейсике   необходима   интерфе
йсная
         процедура   на   машинном  языке,  позволяющая  обратить
ся  к
         операции распечатки  экрана,  Это  очень  простая  проце
дура,
         состоящая  всегно  имз  двух команд, занимающих три байт
а. На
         я[зыке ассемблера эти команды записываются так:
              INT; вызов прерывания номер 5 (распечатка экрана)
                 ; (2-х байтная команда)
              RET;  взврат в программу на Бейсике (1 байт)
              Такую  простую  подпрограмму  можно  просто  записа
ть  в
         память  командами POKE и, поскольку длина ее всего три б
айта,
         можно использовать числа обычной точности, Следующая кор
откая
         программа показывает, как это делается:
              100  REM  Простая  программа,  позволяющая организо
вать
              110  REM  вызов операции распечатки экрана из Бейси
ка
              120  REM  Трехбайтная программа на машинном языке
              125  REM  формируется внутри переменной.
              
              130  HOLD.THE.CODE = 0 'выделяется 4-байтная переме
нная
              140  REM                обычной точности
              150  PRINT.SCREEN = VARPTR(HOLD.THE.CODE)'  установ
ка
                                                          указате
ля
              160  REM                на область памяти
              170  POKE PRINT.SCREEN + 0,205 '1-й байт подпрограм
мы -
              175  REM                команда прерывания (INT)
              180  POKE PRINT.SCREEN + 1,5  '2-й байт - номер пре
ры-
                                      вания 5
              190  POKE PRINT.SCREEN + 2,203 '3-й байт -команда в
озв-
                                      рата
              200  REM
              210  REM Теперь подпрограмма в машинных кодах
              220  REM храниться в переменной "hold.the.code"
              230  REM и ее адрес храниться в "print.screen"
              240  REM
              250  CALL PRINT.SCREEN
              
              В  этой  простой  программе  строки  120-170  запис
ывают
         подпрограмму  в  машинных  кодах.  Эту  процедуру  доста
точно
         выполнить   один  раз.  Оператор  CALL  в  строке  250  
может
         выполняться тогда, когда  необходимо  распечатать  содер
жимое
         экрана.  (Интерфейсные подпрограммы для всех процедур си
стемы
         BIOS и ДОС включены в  дисковый  пакет,  прилагаемый  к 
 этой
         книге,  но  такой  простой интерфейс, как тот, который о
писан
         выше, можно оформить непосредственно на  Бейсике.  Для  
более
         сложных  процедур  обычно  требуются законченные интерфе
йсные
         подпрограммы на  ассемблере,  которые  могут  загружатьс
я  из
         Бейсика процедурой BLOAD).
              Следующая  из  дополнительных  процедур  системы  B
IOS -
         процедура вывода списка оборудования,  которая  вызывает
ся  с
         помощью  прерывания  номер 17, шестнадцатеричное значени
е 11.
         При первом включении IBM/PC процедуры запуска и  самопро
верки
         проверяют,   какое   оборудование   подключено  к  IBM/P
C  (в
         основном,   проверка   сводится    к    считыванию    по
зиций
         переключателей,  установленных на системной плате IBM/PC
; эти
         переключатели  должны  выставляться  определенным  образ
ом  в
         зависимости  от  состава  подключенного  оборудования.  
Такой
         метод не слишком точен, поскольку  переключатели  могут 
 быть
         выставлены неправильно).
              Ваши  программы  могут  выяснить  конфигурацию  сис
темы,
         запрашивая   прерывание   17.   При   выполнении    проц
едуры
         обслуживания   этого  прерывания  не  производится  ни  
новая
         проверка  состава  оборудования,  ни   повторное   считы
вание
         положений  переключателей.  Происходит  всего  лишь пере
сылка
         двух байтов, содержащих код конфигурации системы,  вызыв
ающей
         программы в регистрах AH и AL.
              Ниже приведена таблица кодов оборудования:
              
              Регистр       Бит        Значение
              _______       ___        ________
              
                AH          1-2      число адаптеров устройства п
ечати
                                     (от 0 до 3)
                AH           3       не используется
                AH           4       игровой адаптер подключен ил
и нет
                AH         5-7       число адаптеров связи (от 0 
до 7)
                AH           8       не используется
                AL         1-2       число   дисководо  в без  ед
иницы
                                     (если установлен 8-ой бит)
                AL         3-4       начальный  видеорежим (см.та
блицу
                                     ниже)
                AL         5-6       объем  памяти  на системной 
плате
                                     (см.таблицу ниже)
                AL           7       не используется
                AL           8       дисководы подключены (если д
а, см.
                                     1 и 2 биты)
              
              
              Заметим, что число дисководов, задаваемое первыми  
двумя
         битами    AL,    копируется   числом,   на   единицу   м
еньше
         действительного числа,  так  что  значение  00  соответс
твует
         одному  дисководу,  01  -  двум  и так далее. С помощью 
такой
         схемы кодирования  указывается  наличие  до  4-х  дисков
одов.
         Восьмой бит указывает, имеются ли вообще дисководы в сис
теме.
         Если этот бит установлен, то используются бва бита  счет
чика.
         Проще  было  бы  использовать  три бита для кодирования 
числа
         дисководов, что позволило бы задавать числа от 0 до 7.
              Следующая таблица поясняет значения битов для начал
ьного
         видеорежима:
              
              Биты                       Значение
              ____      _________________________________________
____
              
               00       (не используется)
               01       графический режим, 40   столбцов,  черно-
белое
                        изображение 
               10       графический режим, 80   столбцов,   черно
-белое
                        изображение 
               11       монохромный режим
              
              
              Следующая  таблица  поясняет  установку  битов  для
 кода
         объема памяти на системной плате:
              
                          Бит                   Значение
                          ___             ______________________ 
            
              
                          00                     16К
                          01                     32К
                          10                     48К
                          11                     64К
      
              Ваши программы могут  использовать  эту  информацию
  для
         настройки своей работы на конфигурацию системы.
              Следующая   процедура   сообщает,   какой  объем  п
амяти
         подключен к компьютеру. Имеется ввиду объем  рабочей  па
мяти,
         включающий   объем  памяти  на  системной  плате  (сообщ
аемый
         предыдущей процедурой) и  дополнительные  платы  памяти.
  Для
         ызова  этой процедуры служит прерывание 18, шестнадцатир
ичное
         значение  12,  а  значение,  возвращаемое  в   регистре 
  AX,
         равняется  числу  блоков  памяти  размером  1К.  Такой с
пособ
         позволяет определить полный объем памяти в один мегабайт
              Значение  объема  памяти   не   устанавливается   п
рямой
         проверкой,  а  берется  из  стандартной  ячейки  памяти.
  Это
         позволяет программно изменять объем используемой памяти.
              Одно  из  самых  полезных  средств для работы с IBM
/PC с
         большим объемом памяти (например,  512К)  включает  сист
емную
         программу,  которая  использует  часть памяти как некий 
очень
         быстрый накопитель  на  гибком  диске,  т.е.  так  назыв
аемый
         элекронный  диск  .  Такой тип модификации системы может
 быть
         очень полезен и начинает использоваться все  шире.  Для 
 того
         чтобы  иметь  возможность  выделения  физической  памяти
  для
         какого-нибуть  специфического  использования,  IBM/PC  х
ранит
         рабочее значение объема доступной памяти в ячейке операт
ивной
         памяти,  содержимое  которой  можно  изменить.  И  при  
любом
         использовании  памяти, например, при ее выделении програ
ммам,
         объем памяти всегда сравнивается с этим значением.
              Еще  одна  интересная  особенность  ПЗУ  не  связан
а   с
         системой BIOS, а относится к способу вызова кассетной си
стемы
         Бейсика, которая также хранится  в  ПЗУ.  Если  значение
  18,
         тогда   уравление   компьютером   передается   иетерпрет
атору
         Бейсика. Следует иметь в виду,  что  такая  операция  уж
е  не
         позволит  снова  получить  управление  Вашей программе и
 даже
         операционной системе ДОС.
              Еще одна процедура, которая удаляет Вашу программу 
и ДОС
         из  системы, - это процедура начальной загрузки, вызываю
щаяся
         прерыванием 25, шестнадцатиричное значение 19. Эта  проц
едура
         перезагружает  операционную  систему  с диска, так же ка
к это
         происходит после нажатия клавиши  Ctrl-Alt-Del.  Единств
енное
         отличие   заключается   в   том,   что  при  нажатии  кл
авиши
         Ctrl-Alt-Del выполняется диагностика системы,  такая  же
  как
         при  включении  питания,  а  при  запросе прерывания 25 
сразу
         производится загрузка системы. Это один из самых  радика
льных
         способов завершения программы, гарантирующий наличие в п
амяти
         новой копии операционной системы. 
              Следующая  процедура  -   это   процедура   обслужи
вания
         таймера.   Она   используется   для  считывания  и  изме
нения
         внутреннего счетчика таймера. Хотя эту процедуру  и  наз
ывают
         процедурой текущих даты/времени, на самом деле это всего
 лишь
         счетчик прерываний таймера. Счетчик увеличивается на  ед
иницу
         при  каждом прерывании, которое происходит примерно 18-2
1 раз
         в секунду. Вычисление и обновление времени дня и даты  -
  это
         операция ДОС, которая использует результаты счетчика.
              имеется две процедуры обслуживания таймера, вызываю
щиеся
         по прерыванию 26, шестнадцатиричное значние 1А, одна, с 
кодом
         0, для считывания показаний таймера, а вторая, с кодом 1
, для
         их установки. Значение счетчика таймера хранится в виде 
 пары
      
         двухбайтовых  чисел,  использующихся,  фактически,  как 
 одно
         четырехбайтовое. Эта процедура вносит лишь одно добавлен
ие  в
         примитивную  процедуру подсчета частов. Когда это происх
одит,
         счетчик  сбрасывается  и  факт  запоминается.  При  очер
едном
         запросе  на считывание значения счетчика передается сооб
щение
         о том, что таймер сбрасывался. 
              Это позволяет ДОС следить за временем дня и  сменой
  дат 
         не  вычисляя  их  постоянно.  Когда ДОС необходимо устан
овить 
         время дня, используется  описанная  процедура  для  полу
чения 
         значения  счетчика  и  по  нему вычисляется время; если 
будет 
         получено сообщение о сбросе таймера, то ДОС изменит  так
же  и 
         дату.  Таким образом, ДОС выполняет все эти вычисления т
олько 
         тогда,когда требуется указать  время,  что  упрощает  фу
нкции 
         процедуры  обслуживания прерываний от таймера, которая д
олжна 
         выполняться 18 раз в секунду. Если к ДОС будет хотя  бы 
 один 
         запрос  времени  за  день,  то  проверить  это,  оставив
  Ваш 
         компьютер включенным на 24 часа. К концу Вашей проверки 
время 
         дня будет по прежнему правильным, а дата ошибочной). 
              Если   Вы   будете   сами  считывать  или  устанавл
ивать
         показания таймера с помощью этих процедур системы  BIOS,
  это
         может  помешать правильному отсчету времени и даты в ДОС
. ДОС
         устанавливает значение счетчика таймера  таким  образом,
  как
         будто  он  был  запущен  в  полночь, после чего ДОС полн
остью
         полагаетс[  на  значение  признака  сброса   таймера.   
Любая
         установка или считывание показаний таймера Вашими програ
ммами
         естественно окажет влияние на отсчет времени в ДОС. Если
 Ваши
         программы будут только считывать показания таймера, это 
может
         привести к перехвату сообщения о сбросе таймера, что  на
рушит
         порядок отсчета даты в ДОС.
              Теперь мы рассмотрели все процедуры системы BIOS-ПЗ
У.
              Вы  могли  обратить  внимание  на два упущения в со
ставе
         этих процедур. В то время как  все  устройства,  подключ
аемые
         стандартным   образом,   имеют  поддерживающие  их  служ
ебные
         процедуры,совершенно не поддерживается игровой  адаптер.
  Это
         происходит  потому,  что  такая  поддержка просто не нуж
на. Я
         могу  только  предполагать  почему  это  произошло;  одн
а  из
         возможных  причин может заключаться в том, что форма "ИБ
М" не
         сочла  этот  адаптер  дочтаточно  важной   составной   ч
астью
         системы,  которой  требуется  какая-либо  поддержка на у
ровне
         системы  BIOS.  Возможно,  также  что  игровой  адаптер 
  был
         доставлен   к   системе   на  достаточно  поздней  стади
и  ее
         разработки и его поддержка не могла быть включена  в  си
стему
         BIOS, размещенную в ПЗУ.
              Еще  одна  недостающая  часть  системы  BIOS - это 
набор
         процедур для обслуживанния встроенного динамика.  Почему
  они
         не  были  включены  в  систему  -  это  для  меня  загад
ка. В
         следующем разделе мы рассмотрим работу  динамика  и  то,
  как
         извлекать из него звуки под управлением программы.
              
              11.5. Рецензия звука с помощью динамика
              
              К  сожалению,  в системе BIOS нет универсальных про
цедур
         обслуживания встроенного в IBM/PC динамика.  Хотя  в  си
стеме
         имеются  две  подпрограммы,  позволяющие  извлекать  зву
ки из
         динамика, но они могут  использоваться  только  внутри  
самой
         системы BIOS - это не служебные процедуры общего пользов
ания.
              В  данном  разделе  мы поясним работу динамика и по
ясним
         основы его использования.Дисковый пакет, прилагающийся к
 этой
         книге,  содержит служебные подпрограммы на Ассемблере,ко
торые
         обеспечат Вам доступ ко всем возможностям динамика.
              Любой    громкоговоритель    -     будь     то     
часть
         высоко-качественной системы воспроизведения звука, телеф
онный
         динамик или динамик  IBM/PC  -  работает  за  счет  полу
чения
         последовательности  электрических импульсов, которые выз
ывают
         отклонение диафрагмы динамика, вызывающее колебания  воз
духа,
         образующие  звук.  В  обычном  динамике, поступающие имп
ульсы
         имеют различную мощность (громкость) и длительность  (ча
стоту
         или   высоту  тона).  Простой  динамик  IBM/PC  не  позв
оляет
         регулировать   громкость    и    звук    образуется    п
росто
         последовательностью  электрических  импульсов. Ток к дин
амику
         подается  и   отключается   в   режиме   простого   двои
чного
         управления.   Частота   импульсов  тока  определяет  зву
ковую
         частоту,  вырабатываемую  динамиком.   Например,   если 
  ток
         включается  и  выключается  300  раз  в  секунду,  то ди
намик
         генерирует звук частотой 300 герц.
              Схемы управления динамиком очень интересно  организ
ованы
         и  обеспечивают  два  способа  формирования  звука. Импу
льсы,
         посылаемые  динамику,  управляются  комбинацией  програм
много
         сигнала  и программируемого таймера. Два способа формиро
вания
         звука определяются тем, используется таймер или нет.
              Сначала   рассмотрим   как    формируется    звук  
  без
         использования   таймера.   Чтобы  заставить  динамик  зв
учать
         программа должна задавать импульсы нужной частоты  в  те
чение
         нужного   времени.   Хотя   это  делается  на  ассемблер
е,  я
         использовал   Паскале-подобные   конструкции    просто  
  для
         иллюстрации логики этой операции. Предположим, что необх
одимо
         воспроизвести  звук  с  частотой  300  герц,  который  д
олжен
         звучать половину секунды. Вот что необходимо сделать:
              повторить  150  раз  { то есть, 1/2 секунды, при ча
стоте
         300 Гц }
              начало
              импульс отключения динамика
              задержка на 1/600 секунды {половина цикла}
              {задержка  времени  выполняется  с   помощью   холо
стого
         цикла, повторяющегося нужное число раз}
              импульс включения динамика
              задержка еще на 1/600 секунды {вторая половина цикл
а}
              конец;
              Если  Вы  внимательно  изучите  программу  на ассем
блере
         BEEP/WARBLE, приведенную в виде листинга 3.2. в главе  3
,  Вы
         заметите, что она работает именно таким образом.
              Это очень хороший способ воспроизведения звука, но 
он не
         позволяет программе ничего  делать,  кроме  генерации  з
вука.
         Фактически,  эта  маленькая  программа использует весь р
есурс
         микропроцессора 8088, не делая ничего кроме подсчета  вр
емени
         и  формирования  импульсов для динамика. Для этого есть 
более
         совершенный способ, использующий таймер.
              Одна  из  скрытых  возможностей  IBM/PC  -  это  на
личие
         программируемого  таймера. Он не измеряет никаких промеж
утков
         времени, а только подсчитывает импульсы  основного  такт
ового
         генератора   системы.   Для  этого  таймера  задается  ч
исло,
      
         называемое коэффициентом деления (или просто делителем),
 и он
         подсчитывает   число   импульсов   тактового   генератор
а   и
         сравнивает это число с делителем. Когда эти числа сравня
ются,
         таймер выдает сигнал и снова начинает подсчет с нуля.
              Системный   тактовый   генератор   работает  на  чи
стоте
         1,19мГц.  Так  что  если  таймер  запрограммирован  на  
10000
         импульсов,  он  будет  выдавать  сигналы  примерно  100 
раз в
         секунду. Можно добиться любой  частоты  импульсов  на  в
ыходе
         таймера,  подбирая  соответствующий  делитель. После заг
рузки
         делителя  схемы   динамика   запускаются   для   работы 
  под
         управлением  таймера,  после  чего  выходные  сигналы та
ймера
         будут управлять  частотой  формируемого  звука,  а  комп
ьютер
         может выполнять любую другую работу.
              Такой    способ    управления    динамиком     позв
оляет
         программам  работать,  пока динамик воспроизводит звук. 
Таким
         образом  организована  работа  одной  из  процедур   Бей
сика,
         фоновая   музыка   или   MB.   Небходимо  заметить,  что
  при
         формировании звука с помощью таймера, он  продолжает  зв
учать
         до  тех  пор,  пока  он не будет отключен той же програм
мой ,
         которая его запустила.
              Листинг 3.2. может  использоваться  в  качестве  пр
имера
         формирования  звуков  без использования таймера. Програм
ма на
         ассемблере, представленная листингом  11.1.,  показывает
  как
         запустить звучание динамика с помощью таймера. 
         
         
              Приложение 11.1. Текст программы генерации звука с 
         использованием таймера (Ассемблер).
         
         
         a440seg segment 'code'
         
               assume cs:a440seg
               
         a440  proc   far
         
               mov    al,0b6h
               out    67,al
               
               mov    ax,2711
               out    66,al
               mov    al,ah
               out    66,al
               
               in     al,97
               or     al,03
               out    97,al
               
               int    20h
               
         a440  endp
         
         a440seg  ends
               end
         
              
              
           
                
              


Яндекс цитирования