/
Автор: Поворознюк А.И.
Теги: компьютерные технологии программирование электротехника учебное пособие цифровая электроника компьютерная техника
ISBN: 966-635-541-8
Год: 2004
Текст
И. НОВОГО ЯНОК
АРХИТЕКТУРА КОМПЬЮТЕРОВ
Урхитекчура внешней памяти,
видеосистемы и внешних интерфейсов
Чат» 2
У небное пособие
МИНИСТЕРСТВО ОБРАЗОВАНИЯ И НАУКИ УКРАИНЫ
НАЦИОНАЛЬНЫЙ ТЕХНИЧЕСКИЙ УНИВЕРСИТЕТ
"ХАРЬКОВСКИЙ ПОЛИТЕХНИЧЕСКИЙ ИНСТИТУТ"
А. И. ПОВОРОЗНЮК
АРХИТЕКТУРА КОМПЬЮТЕРОВ
Часть 2
Архитектура внешней памяти, видеосистемы и внешних интерфейсов
Учебное пособие
Утверждено редакционно - издательским
Советом университета
Протокол № 3 от 08.10.04
Харьков
“Торнадо”
2004
ББК 32.973-02
П42
УДК 681.322
Рецензенты:
В,П.Авраменко, д-р техн, наук, проф. ХНУРЕ;
В.П.Полтавцев, канд. техн, наук, доц. нач. службы
информационных технологий и связи КП
“Харьковские тепловые сети”
Поворознюк А.И.
П 42 Архитектура компьютеров. Архитектура внешней памяти, видеосистемы
и внешних интерфейсов: Учебное пособие. 4.2. - Харьков: Торнадо, 2004.-
296с., На русс. яз.
ISBN 966-635-541-8
Пособие дает целостное, системное представление о архитектуре, взаимосвязи i
функциональном назначении основных модулей, а также возможности управление
модулями на уровне управляющих портов ввода/вывода. Во второй части рассмотрен!
архитектура дисковой подсистемы внешней памяти, видеосистемы, интерфейсов ПК -
интерфейсов внешней памяти АТА (ATAPI) и внешних интерфейсов (СОМ и LP1
порты, шины SCSI и USB).
Предназначено для студентов всех специальностей бакалаврата 6.091:
“Компьютерная инженерия”, а также может быть полезна как для начинающих, так i
для опытных программистов при создании эффективного программного обеспечения.
Поббник дает цшюне, системне уявлення про архитектуру, взаемозв'язок
функц1ональне призначення основних модул!в, а також можливосп управлшни
модулями на piBHi управляю чих портгв введення/виведення. В друпй частин
розглянута архггектура дисково! шдсистемы зовшшньо! пам'ят!, вщеосистеми
штерфейшв ПК - 1нтерфейс1в зовшшньо! пам'яп АТА (ATAPI) та зовшшнЬ
штерфейбв (СОМ та LPT порти, шини SCSI та USB).
Призначено для студентов Bcix спещальностей бакалаврату 6.0915 “Комп'ютерн;
1нженер1я”, а також може буги корисна як для початювщв, так i для досвщченю
програмюпв при створенш ефективного програмного забезпечення.
Ил. 42. Табл. 63. Библиогр. 14 назв.
ББК 32.973-0
ISBN 966-635-541-8
© А. I. Поворознюк, 200-
Оглавление
Оглавление
стр.
Введение..........................................................6
1. Дисковые устройства внешней памяти................................
1 1 физическая организация накопителей на магнитных дисках......8
111 физическая организация жестких дисков.........................
1 1.2. Физическая организация гибких дисков......................
113. Съемные носители памяти на магнитных дисках.................
1.1.4. Контрольные вопросы.......................................
1.2. Логическая структура магнитных дисков.................,...25
1.2.1 Логическая структура жестких магнитных дисков......... 7Я
1.2.2. Логическая структура разделов (гибких магнитных дисков).'
1.2.3. Преодоление барьера 528 Мбайт (ECHS и LBA) ....\
1.2.4. Некоторые полезные сведения, необходимые при
.......................................................40
работе с дисками..........................................
1.2.5. Пример программирования..............................
12 6. Контрольные вопросы...................................
1 т Архитектура оптических дисков.............................
................s
1 3.2. Логическая организация оптических диско.............50
1.3.3. Файловые системы.—.............
134 Контрольные вопросы.....................................
1 4 Управление накопителями гибких дисков ...................58
1 14 1 Архитектура контроллера гибких дисков.................58
1.4.2. команды управления накопителями......................61
1.4.3. Работа BIOS с адаптером .........................67
1.4.4. Примеры программирования НГМД........................70
1 4 5 Контрольные вопросы................*................
!. 5 накопителями ......................“
1 5 1 Электрический интерфейс ГОЕ/АТ А......................81
1.5.2. Регистры устройств и режимы передачи данных..........84
1 5.3. Система команд.......................................
1 5 3.1. Команды обмена данными............................
1 5 .з'2. Команды инициализации, идентификации и
конфигурирования....................................90
1.5.З.З. Команды специального назначения..................92
1.5.4. Пакетный интерфейс АТ АР! ——........................95
1.5.5. Примеры программирования НЖМД........................
1.5.6. Контрольные вопросы................................
2. Управление видеосистемой...................................
2.1. Принципы построения видеотерминалов
формирование изображений....................................
Оглавление
2.2. Видеоадаптеры............................................ 106
2.3. Работа в текстовых режимах..............................112
2.3.1. Содержание видеопамяти в текстовом режиме..........112
2.3.2. Видеоатрибуты символов........................... 112
2.3.3. Управление цветом бордюра, курсором................115
2.3.4. Управление шрифтами................................118
2.3.5. Профессиональное программирование видеоадаптера
в текстовом режиме........................................123
2.3.5.1. Страничная организация видеопамяти и аппаратные сдвиги 123
2.3.5.2. Создание разделенного экрана.................. 125
2.3.5.3. Создание всплывающих окон и меню................127
2.3.6. Примеры программирования в текстовом режиме........129
2.3.6,1. Примеры программирования атрибутов символов.....129
2.3.6.2. Примеры программирования цвета бордюра, курсора.130
2.3.6.3. Примеры программирования описаний символов......131
2.3.6.4. Примеры профессионального программирования
в текстовом режиме.................................... 133
2.3.7. Контрольные вопросы................................142
2.4. Работа в графических режимах............................144
2.4.1. Отображение пикселей на экран......................144
2.4.2. Преобразование экранных координат..................148
2.4.3. Масштабирование экранных координат.................149
2.4.4. Мерцание...........................................150
2.4,5. Вывод текста в графическом режиме..................151
2.4.6. Запись и чтение данных видеобуфера............... 152
2.4.7. Примеры программирования графических режимов.......158
2.4.8. Контрольные вопросы................................162
2.5. Поддержка видеосистемы со стороны BIOS..................163
2.5.1. Обращения к процедурам BIOS...................... 164
2.5.2. Области данных видеоВЮЗ............................165
2.5.2.1. Область данных дисплея..........................165
2.5.2.2. Область сохранения..............................166
2.5.3. Контрольные вопросы................................170
2.6. Профессиональное программирование видеосистем
в графическом режиме.........................................171
2.6.1. Создание недокументированных режимов...............171
2.6.2. Изображение линии..................................175
2.6.3. Перемещения и вращения 2-х и 3-х мерных объектов...178
2.6.3.1. Вращение точки в плоскости экрана...............178
2.6.3.2. Вращение плоской фигуры в плоскости экрана......179
2.6.3.3. Вращение трехмерных объектов....................180
2.6.4. Основы видеоигр. Понятие "спрайта".................182
4
Оглавление
2.6.5. Примеры программирования...........................185
2.6.6. Контрольные вопросы................................196
3. Внешние интерфейсы...................................... 197
3.1. Последовательный интерфейс. СОМ-порт...................197
3.1.1. Программная модель СОМ-порта.......................199
3.1.2. Программирование последовательной связи............204
3.1.2.1. Инициализация последовательного порта...........206
3.1.2.2. Передача и прием данных.........................207
3.1.3. СОМ-порт и РпР.....................................208
3.1.4. Пример программирования последовательного порта....210
3.1.5. Контрольные вопросы................................215
3.2. Параллельный интерфейс. LPT- порт......................216
3.2.1. Стандартный режим SPP..............................216
3.2.2. Режим ЕРР..........................................219
3.2.3. Режим ЕСР..........................................222
3.2.4. Согласование режимов...............................229
3.2.5. Пример программирования............................230
3.2.6. Контрольные вопросы................................235
3.3. Универсальная последовательная шина USB................236
3.3.1. Архитектура и взаимодействие элементов системы USB.236
3.3.2. Типы передач и форматы передаваемой информации.....241
3.3.3. Контрольные вопросы................................246
3.4. Шина SCSI............................................ 247
3.4.1. Физический интерфейс SCSI..........................248
3.4.2. Адресация устройств и передача данных..............250
3.4.3. Система команд.....................................255
3.4.4. Конфигурирование устройств SCSI....................259
3.4.5. Контрольные вопросы................................261
3.5. Игровой адаптер GAME-порт..............................262
Литература...................................................264
Приложение А. Команды устройств ATA/ATAPI (жесткого диска)..265
Приложение Б. Идентификационная информация устройств АТА....267
Приложение В. Назначение регистров EGA/VGA..................272
В. 1. Внешние регистры....................................272
В.2. Регистры блока синхронизации.........................273
В.З. Регистры блока управления ЭЛТ (CRTC).................276
В.4. Регистры графического контроллера....................284
В.5. Регистры контроллера атрибутов.......................287
В.6. Регистры цифро-аналогового преобразователя...........290
Приложение Г. Документированные видеорежимы.................291
Приложение Д. Команды шины SCSI.............................293
Введение
Введение
Учебное пособие “Архитектура компьютеров” является второй
заключительной частью и соответствует программе второго семестра
дисциплины “Архитектура компьютеров”, которая читается всем
специальностям бакалаврата 6.0915 “Компьютерная инженерия”.
Пособие содержит 3 раздела, в которых в систематизированном виде
излагаются принципы построения и архитектура устройств внешней памяти,
видеосистемы и внешних интерфейсов.
В первом разделе ’’Дисковые устройства внешней памяти” излагается
логическая и физическая организация магнитных и оптических дисковых
накопителей внешней памяти, режимы работы и возможности управления в
следующем виде:
В п. 1.1 рассматривается физическая организация жестких и гибких
магнитных дисков, а также других съемных носителей внешней памяти.
В п. 1.2 рассматривается логическая структура дисковых накопителей.
Отмечены особенности работы с дисками больших объемов, которые стали
актуальными в последние годы.
В п. 1.3 рассматривается организация оптических дисков.
В п. 1.4 рассматривается архитектура контроллеров и возможности
управления накопителями гибких дисков.
В п. 1.5 рассматривается организация интерфейса IDE/АТА и
возможности управления накопителями жестких.
Во втором разделе ’’Управление видеосистемой” изложены принципы
формирования изображений и рассмотрены особенности структурной
архитектуры видеоадаптеров. Рассматривается работа видеосистемы и
возможности управления в текстовом и графическом режимах. Показана
возможность учета архитектурных особенностей видеосистемы в
компьютерной графике.
В третьем разделе ’’Внешние интерфейсы” описывается архитектура
внешних интерфейсов современных ПК. Для традиционных интерфейсов
(СОМ и LPT - порты) рассмотрены новые режимы работы, изложены
принципы построения и управления новых интерфейсов - USB и SCSI шины.
Раздел ’’Приложения" содержит справочную информацию о командах
интерфейсов IDE/АТА и SCSI, а также о управляющих регистрах
видеосистемы.
Возможности управления иллюстрируются примерами
програм мирования.
1.1 Физическая организация накопителей на магнитных дисках
1. Дисковые устройства внешней памяти
Устройства внешней памяти предназначены для длительного хранения
информации (в том числе при выключенном компьютере или отдельно от
компьютера для съемных устройств). Положительными качествами
указанных устройств является низкая стоимость хранения единицы
информации при максимальной емкости.
Устройства внешней памяти классифицируются:
1) По физическим принципам хранения информации:
магнитный способ хранения информации, который широко
используется в накопителях на магнитных дисках и лентах. В качестве
носителя информации используется тонкая ферромагнитная пленка,
нанесенная на металлическое или синтетическое основание. Запись
информации основан на смене направления остаточной индукции магнитных
доменов на поверхности пленки с помощью магнитного поля головки записи,
а чтение - на регистрации полярности ЕДС, которая наводится в обмотке
головки чтения при перемещении под нею магнитной поверхности носителя
(существует и более сложный, но менее распространенный способ магнито-
оптической записи/чтения, который применяется в магнито-оптических
накопителях и рассматривается ниже).
- оптический способ хранения информации, в котором в качестве
носителя информации используется металлизированная светоотражающая
поверхность прозрачной подложки, изготовленной, як правило, в виде диска.
Инструментом записи/чтения является луч лазера и фоточувствительный
элемент;
- электронный способ хранения информации, в котором информация
хранится в неразрушающейся Flash-памяти и применяется в
соответствующих устройствах внешней памяти.
2) По способу обращения различают память с произвольным
обращением (разрешено чтение/запись), и постоянную или одностороннюю
память (разрешено только чтение). В качестве односторонней внешней
памяти используются одноразово-записываемые оптические диски CD-R.
3) По способу организации доступа к памяти различают устройства с
непосредственным (произвольным), прямым (циклическим) и
последовательным доступом. В памяти с непосредственным доступом (как
правило, это электронная память), время обращения к памяти не зависит от
места расположения участка памяти, к которому выполняется обращение.
Обращение выполняется путем дешифрации адреса.
В устройствах с прямым доступом (дисковые устройства), благодаря
непрерывному вращению носителя информации, среднее время доступа к
любому участку носителя складывается из времени перехода на нужную
дорожку и времени полуоборота диска.
1 Дисковые устройства внешней памяти
В устройствах с последовательным доступом (магнитные ленты), поиск
информации выполняется последовательным просмотром носителя
(перемотка ленты).
4) По способу подключения к ПК различают несъемные и съемные
накопители.
5) По используемому интерфейсу различают IDE, АТА, SCSI, USB, и
LPT-устройства.
В данной главе рассматриваются дисковые устройства внешней памяти,
как наиболее распространенные в ПК.
1.1. Физическая организация накопителей на магнитных дисках
Все магнитные диски организованы одинаковым образом. Данные
всегда записываются на магнитной поверхности диска в виде
концентрических окружностей, называемых дорожками, а дорожки в свою
очередь делятся радиально на сектора (см. рис. 1.1).
N - я дорожка (трек)
0-я дорожка (трек)
1-й сектор
Рисунок 1.1- Физическая организация магнитных дисков
Гибкие диски (дискеты) имеют две поверхности. Жесткие диски могут
иметь более двух поверхностей (на одном шпинделе жестко закреплено
несколько пластин). Одноименные дорожки на разных поверхностях диска
образуют цилиндр. С каждой поверхностью диска связана своя головка
чтения/записи.
Количество информации (плотность) на одной поверхности диска
зависит от числа дорожек и числа секторов на одной дорожке. Плотность
может существенно меняться от диска к диску. Например, гибкие диски 3,5”
имеют 80 дорожек, а число секторов может быть от 8 до 26. Для всех типов
дисков стандартный размер сектора равен 512 байт данных (поддерживается
большинством ОС), хотя могут быть и другие размеры. Число дорожек,
число сторон, число и размер секторов задаются программно при
первоначальной разметке (низкоуровневом форматировании).
Таким образом, минимально-адресуемой на физическом уровне (уровень
команд контроллера) единицей информации дисковых накопителей является
сектор. Следует различать физический адрес секторов CHS (используются в
процедурах BIOS и командах контроллеров) и логический LBA
1.1 Физическая организация накопителей на магнитных дисках
(относительный) адрес сектора (используется в ОС и при описании
логической структуры дисков). Физический или трехмерный адрес состоит из
С - номера цилиндра (цилиндры нумеруются с нуля, начиная от внешнего
цилиндра к центру диска), Н - номера поверхности /головки/ (поверхности
нумеруются с нуля) и S - номера сектора заданной дорожки (секторы
нумеруются с первого от начала дорожки).
Логический или относительный номер сектора LBA образуется при
последовательной нумерации всех секторов диска. При этом логический
номер 0 соответствует сектору номер 1 на нулевой поверхности нулевого
цилиндра. В дальнейшем логический номер увеличивается сначала по
каждому сектору на поверхности, затем по каждой поверхности в пределах
цилиндра и наконец, по каждому цилиндру.
1.1.1. Физическая организация жестких дисков
Современный жесткий диск (винчестер) является сложным
интеллектуальным устройством со встроенным микроконтроллером, ОЗУ,
ПЗУ и пакетом дисков, заключенным в гермоблок. Гермоблок обеспечивает
минимальный зазор между головками и магнитной поверхностью
(уменьшается ширина дорожки и увеличивается максимально - возможное
число цилиндров) при повышенных скоростях вращения дисков.
Микроконтроллер обрабатывает команды хост-компьютера, поступающие по
внешнему интерфейсу.
В гибких дисках и первых винчестерах применялась жесткая система
позиционирования головок (разомкнутая система с использованием шагового
двигателя), современные винчестеры имеют плавающую систему
позиционирования с помощью замкнутой следящей системы и сервометок.
Формат дорожки. Данные на жесткий диск записываются в секторах.
Сектора располагаются на дорожках, содержат данные, служебную
информацию и разделены друг от друга межсекторными интервалами. При
перезаписи данных в отдельных секторах физическая длина и положение
сектора при перезаписи не всегда совпадает с раннее записанным сектором (в
моменты начала и конца записи имеются сбои в намагниченности диска).
Межсекторные интервалы необходимы для обеспечения запаса по длине
дорожки для перезаписи и для синхронизации после сбоев в точках разрыва.
Начало дорожки определяется сигналом "индекс", который генерируется
накопителем при каждом обороте диска. В младших моделях жестких
дисков, при недостаточном объеме внутреннего буфера (меньше объема
дорожки), номерация секторов на дорожке выполнялась с учетом фактора
чередования. При этом второй сектор будет отстоять от первого на число
секторов, равное значению фактора чередования (обычно 3) минус 1, третий
еще на столько же и т. д. При таком расположении секторов на дорожке
9
1 Дисковые устройства внешней памяти
обеспечивается подготовка внутреннего буфера к приходу следующего
номера сектора (в противном случае следующий сектор читается/пишется на
следующем обороте диска. Формат сектора с учетом межсекторного
интервала приведен в таблице 1.1.
Таблица 1.1- Физический формат сектора жесткого диска
Обозначение Назначение Длина (байт)
AM Адресный маркер 4
ИНТ1 Интервал 9-12
Поле идентификации:
СИНХ1 Снпхробайт 1
ИНТЗ Интервал 2
СРВ Байт для сравнения 1
ЦСБ Старший байт номера цилиндра 1
ЦМБ Младший байт номера цилиндра 1
ГЛВ Номер головки 1
СЕКТ Номер сектора 1
ФЛАГ Флаговый байт 1
НУЛЬ Нулевой байт 1
КС1 Контрольная сумма поля идентификации 4
ИНТЗ Интервал 16
Область данных:
СИНХ2 Сннхробайт 1
ИНТ4 Интервал 2
ДАННЫЕ Поле данных 512
КС2 Контрольная сумма поля данных 4
ИНТ5 Межсекторный интервал 43
Начало сектора обозначается при помощи уникальной двоичной
комбинации, называемой адресным маркером. Пять интервалов, обоз-
наченных в таблице ИНТ1 - ИНТ5, заполняются нулями, причем длина ИНТ2
и ИНТ4 постоянна и равна 2 байтам, в то время как ИНТ1, ИНТЗ и ИНТ5
могут иметь разную длину, немного отличающуюся от значений,
приведенных в таблице. Эти три интервала предназначены для подготовки
накопителя к считыванию/записи следующей за ним области, а различие в
длине объясняется тем, что адресный маркер, поле идентификации и данные
могут записываться в разное время поверх ранее имевшейся информации, что
не обеспечивает точного совпадения физической длины записанной области
и ранее имевшейся на этом месте области.
Отличия в длине могут составлять несколько бит, чем объясняется
наличие после интервалов ИНТ1 и ИНТЗ синхробайта, позволяющего
определить истинную начальную границу области и правильно
сгруппировать все последующие биты по байтам. Байт СРВ имеет
постоянное значение для всех секторов и используется для проверки
правильности считывания поля идентификации. Флаговый байт содержит
служебную информацию, в частности отмечает дефектность сектора, если он
10
1.1 Физическая организация накопителей на магнитных дисках
не пригоден для записи. Контрольные суммы служат для проверки
правильности считывания информации из поля идентификации и области
данных и вычисляются специальным генератором кодов коррекции ошибок
(Error Correction Code, ЕСС) с образующим полиномом 32-й степени.
Следует отметить, что часть цилиндров (цилиндры со старшими
номерами, которые ’’невидимы” и недоступны ОС), используется
контроллером жесткого диска в служебных целях (в качестве резервных и
для хранения служебной информации).
Параметры накопителя жестких дисков. Ниже приводятся параметры
накопителей жестких дисков и диапазон их значений (на момент написания):
- форматированная емкость, Гбайт (Мбайт), представляет собой объем
хранимой полезной информации - то есть сумму полей данные всех
доступных секторов;
- скорость вращения шпинделя, которая была стандартной несколько лет
назад 3600 об/мин, сейчас обычной считается 4500, 5400, 7200, а для
высокоскоростных дисков - 10 000 и 15000 об/мин;
- интерфейс определяет способ подключения накопителя. Для
накопителей со встроенным контроллером используются интерфейсы АТА,
IDE и SCSI, для устройств внешнего исполнения - шины USB, FireWire и
Fibre Channel, а также подключение к LPT-порту;
- объем буферной памяти, возможности кэширования (чтение, запись,
многосегментность, адаптивность);
количество физических дисков или рабочих поверхностей
используемых для хранения данных. Современные накопители с небольшой
высотой имеют малое (1-2) количество дисков для облегчения блока головок
Большее число дисков (до 4) имеют старые накопители и современные
накопители большой емкости;
- количество физических головок чтения-записи, которое совпадает с
числом рабочих поверхностей. Число головок может быть меньше
удвоенного числа дисков (поверхность может использоваться для
сервометок);
- физическое количество цилиндров от нескольких сотен, характерных
для первых жестких дисков, возросло до десятков тысяч;
- расположение сервометок или сервоголовок может быть на
выделенной поверхности, на рабочих поверхностях или гибридным;
- метод кодирования-декодирования данных может быть MFM, RLL
(ARLL), PRML. Последний является наиболее прогрессивным.
- время перехода на соседний трек характеризует быстродействие
системы позиционирования. Для современных жестких дисков характерно
время перехода 0,5-2 мс, причем для записи оно несколько больше, чем для
считывания (записывать лучше при более точном позиционировании);
11
1 Дисковые устройства внешней памяти
- среднее время поиска определяется экспериментально при обращении
к случайным цилиндрам. Для большинства современных дисков оно
составляет около 8-10 мс, в самых быстрых его удается снизить до 4-5 мс;
- максимальное или полное время поиска относится к самым дальним
переходам между крайними цилиндрами. Оно примерно в два раза
превышает среднее время поиска;
- среднее ожидание сектора при одиночном обращении обычно
составляет половину времени полного оборота (для 3600 об/мин - 8 мс, 7200-
4 мс, 15000-2мс).
- внутренняя скорость передачи данных между носителем и буферной
памятью контроллера задает физический предел производительности
накопителя.
- потребляемая мощность определяется номинальными и пиковыми
токами, потребляемыми по цепям +5 В и +12 В. Пик потребления по цепи
+12 В возникает при раскрутке шпиндельного двигателя. Для
высокоскоростных винчестеров приходится учитывать тепловыделение - для
них может потребоваться специальный вентилятор.
Зонная организация. Для гибких дисков и жестких дисков младших
моделей, количество секторов на всех треках принимается постоянным.
Поскольку приходится ограничивать число секторов по допустимой
плотности изменения магнитного потока на самых коротких внутренних
треках, внешние треки оказываются ’’недогруженными". Применение зонной
записи позволяет существенно увеличить объем хранимых данных по
сравнению с фиксированным числом секторов при тех же характеристиках
носителя. Суть метода в том, что с учетом различия в длине треков,
цилиндры разбиваются на зоны, для которых принимается одинаковое число
секторов на трек. Для внешних цилиндров число секторов на треке
выбирается большим, чем на внутренних (примерно в 2 раза). Число зон
достигает десяти. При зонной записи скорость передачи информации на
внешних треках выше, чем на внутренних. При этом и частота
синхронизации схем записи и считывания для разных зон будет различной.
Внешние контроллеры не позволяли работать с переменным числом секторов
на треке, BIOS тоже не рассчитан выполнять все пересчеты, специфичные
для каждой модели накопителя. Контроллер, встроенный в накопитель,
скрывает от системы переменное физическое число секторов на треке, а для
общения с накопителем используется фиктивная внешняя геометрия диска.
Эта геометрия может быть либо трехмерной CHS (с фиктивным числом
цилиндров, головок и секторов на треке), либо линейной LBA, где номер
сектора задается одним числом.
Заметим также, что для накопителей с зонной записью вычислить
скорость передачи по числу секторов на треке и скорости вращения
шпинделя затруднительно, поскольку указываемое в паспорте число секторов
12
1Л Физическая организация накопителей на магнитных дисках
обычно относится лишь к внешней геометрии, а к физической отношения не
имеет.
Производительность жесткого диска определяется не только
возможностями гермоблока, но и свойствами его контроллера. Интерфейс
накопителя определяет возможную скорость обмена между буферной
памятью винчестера и хостом. Основные интерфейсы винчестеров
обеспечивают скорость передачи более высокую, чем внутренняя скорость
обмена с пластинами, благодаря чему не тормозят обмен с дисками. Для
интерфейса АТА эта скорость лежит в диапазоне от 3,3 Мбайт/с (РЮ Mode 0)
до 66 или даже 100 Мбайт/с (Ultra DMA). Для SCSI - от 5 Мбайт/с (обычный
"узкий’1) до 160 Мбайт/с (UItra3 Wide). Оптический интерфейс Fibre Channel
обеспечивает скорость 100 или 200 Мбайт/с.
Производительность жесткого диска сильно зависит от объема его
буферной памяти, который у современных накопителей составляет 0,25-8
Мбайт. Часть этой памяти (до сотни Кбайт) может использоваться для
встроенного ПО. Возможности использования буферной памяти зависят от
сложности контроллера. У старых дисков буфер вмещал всего один сектор и
был однопортовым - не допускал одновременного обмена данных с диском и
внешним интерфейсом. Более сложные и эффективные контроллеры имеют
двухпортовый буфер на множество секторов, допускающий одновременность
этих операций. В современных дисках контроллер способен использовать
буфер и для кэширования Общепринятой технологией кэширования диска
является упреждающее считывание. Суть его в том, что при запросе на
чтение сектора, автоматически считываются в буфер и секторы, следующие
за запрошенным. Весьма вероятный запрос к следующему сектору будет
обслужен из буфера без задержки. Некоторые контроллеры считывают в
буфер весь трек, как только выполнится команда позиционирования, а когда
придет следующая за ней команда чтения, данные уже будут в буфере.
Кэширование применяют и для записи, но более сдержанно - здесь есть риск
потери данных (например, при внезапном отключении питания).
Эффективность встроенного' кэша накопителя зависит от алгоритма
выделения памяти и замещения старых записей. Применяются алгоритмы
адаптивного кэширования, у которых размеры выделяемых для
упреждающего чтения областей определяются на основании подсчета
текущей статистики обращений (если последние запросы чтения являются
одиночными - выделяются небольшие области под упреждающее чтение,
если характер запросов изменится - принимается соответствующее решение).
Кроме того, алгоритмы кэширования учитывают многозадачный характер
современных ОС и их дисковых запросов.
Функционирование жесткого диска. При подаче питания и по сигналу
аппаратного сброса микроконтроллер диска выполняет самотестирование,
сначала проверяя ОЗУ, ПЗУ, регистры, а затем и остальные блоки. Далее
13
1 Дисковые устройства внешней памяти
выполняется запуск шпиндельного двигателя, и когда он наберет
достаточные обороты, головки выводятся из зоны парковки и ими начинает
управлять сервосистема. Теперь микроконтроллер может загрузить со
служебных треков диска необходимую ему информацию. На диске может
храниться таблица трансляции секторов, списки дефектных блоков, паспорт
диска и даже часть программ микроконтроллера. Для повышения надежности
служебная информация обычно записывается с несколькими копиями,
поскольку невозможность ее считывания приведет к потере
работоспособности устройства. Служебная информация может храниться и
не на магнитном носителе, а в энергонезависимой электронной памяти
винчестера (EEPROM или флэш). На основании служебной информации
контроллер конфигурируется под конкретный гермоблок, с которым он
работает, - определяет списки рабочих головок, число цилиндров, число
секторов в треках каждой зоны и т. п. После успешного конфигурирования
винчестер становится готовым к исполнению команд, поступающих от хост-
компьютера по внешнему интерфейсу. Первой командой обычно является
чтение паспорта диска - 512-байтного набор данных, описывающих все
внешне доступные свойства устройства.
При функционировании накопителя в нормальном режиме,
выполняются операции чтения, записи, верификации секторов, поиска и
некоторые вспомогательные. Все эти команды работают с областями данных
секторов, что подразумевает отформатированность диска на нижнем уровне.
При получении команды микроконтроллер выполняет трансляцию внешнего
адреса запроса, поступившего по интерфейсу, в адреса реальных секторов
реальных поверхностей носителя. Трансляция выполняется по таблицам,
загруженным в ОЗУ микроконтроллера, учитывающим текущую внешнюю
геометрию диска, размеры зон, а также переназначение физических секторов
для обхода дефектных участков поверхностей.
Низкоуровневое форматирование (формирование структуры заголовков
и блоков данных секторов) в нормальном режиме доступно лишь в системе
команд SCSI. Команда форматирования интерфейса АТА доступна лишь для
старых дисков, не использующих зонной записи, и при совпадении внешней
геометрии с реальной. Современные диски АТА низкоуровневое
форматирование выполняют лишь в специальном технологическом режиме,
который зависит от разработчика дисков. Для этого, например, могут
использоваться нестандартные команды, причем для разрешения их
использования могут присутствовать специальные джамперы на устройстве.
Общение с винчестером в технологическом режиме может производиться и
через специальный последовательный интерфейс, в качестве которого иногда
используется стандартный RS-232C, что позволяет вести диалог с
винчестером, например, через COM-порт и эмулятор терминала на ПК. Если
технологические команды доступны по обычному интерфейсу (АТА или
14
1.1 Физическая организация накопителей на магнитных дисках
SCSI), то производитель может предлагать собственные утилиты
низкоуровневого обслуживания дисков. Низкоуровневое форматирование не
затрагивает сервоинформацию, которая записывается на поверхности лишь в
заводских условиях. Диск с поврежденными серводорожками теряет
работоспособность.
Кроме выполнения команд от хост-компьютера, микроконтроллер
постоянно выполняет ряд задач по «жизнеобеспечению» винчестера.
Хранение данных на магнитном носителе всегда сопровождается появлением
ошибок, причин у которых может быть множество: дефект поверхности
носителя, случайное перемагничивание участка носителя, попадание
посторонней частицы под головку, неточность позиционирования головки
над треком, колебание головки по высоте, вызванное внешней вибрацией
(ударом) корпуса накопителя, уходом различных параметров (из-за старения,
изменения температуры, давления и т. п.). Независимо от причин, ошибки
должны быть выявлены и по возможности исправлены.
Для контроля достоверности хранения применяется CRC-код для поля
данных, который позволяет фиксировать ошибки некоторой кратности, а
ЕСС-код при большей избыточности позволяет исправлять ошибки. Если
сектор считывается с ошибкой, контроллер автоматически выполнит
повторное считывание, и при случайности ошибки велик шанс правильного
считывания сектора. Однако если ошибка вызвана, например, неточностью
позиционирования головки на середину трека, связанной с уходом
параметров, повторное считывание может и не дать положительного
эффекта. Если данные так и не удается считать верно, контроллер обязан
сигнализировать об этом установкой бита ошибки контрольного кода в байте
состояния, на что программа может отреагировать сообщением вида "CRC
Data Error”.
Если контроллеру никак не удается достоверно прочитать записанные в
сектор данные, такой сектор должен быть исключен из дальнейшего
использования. На уровне накопителя отметка о дефектности блока делается
в заголовке сектора, запись в который, как известно, производится только во
время низкоуровневого форматирования. Встроенные контроллеры
современных дисков сами обрабатывают обнаружение дефектных секторов и
вместо них подставляют резервные, так что для пользователя дефектные
секторы у дисков АТА и SCSI не видны. Для скрытия дефектных секторов
применяют различные стратегии использования резервных областей.
Резервные секторы могут располагаться в конце каждого физического
трека, но пока основные секторы исправны, резервные не используются.
Если какой-либо сектор перестает читаться, то микроконтроллер пытается
перенести его данные в резервный и корректирует заголовки секторов,
помечая дефектный и подставляя в резервный номер замещенного сектора. В
результате сектор с данным номером снова станет нормальным, однако при
15
1 Дисковые устройства внешней памяти
линейном обращении к цепочке секторов в общем случае диску может
потребоваться дополнительный оборот из-за нарушения порядка следования
секторов на треке. Более совершенный способ скрытия дефектов заключается
в переномерации всех секторов трека (естественно, с перемещением данных)
после замены дефектного сектора резервным, с восстановлением
оптимальной для данного устройства последовательности номеров).
Если на треке оказывается слишком много дефектных секторов
(местного резерва уже не хватает), то выполняется переназначение всего
трека на резервную область. Резервная область, как правило, выделяется на
внутренних цилиндрах (в паспорте диска указывается объем без учета
резервных треков). Это переназначение делается уже с помощью таблиц
переназначения треков.
Списки дефектных блоков (треков) хранятся, как правило, в двух
таблицах. Одна из них (P-list) считается постоянной и формируется при
выпуске винчестера. Другая, растущая (G-list), формируется во время
эксплуатации автоматически. У нового винчестера она пустая. Пользователю
эти таблицы могут быть доступны лишь при использовании специальных
низкоуровневых утилит обслуживания дисков.
Надежность считывания в большой степени зависит от точности
позиционирования головок относительно продольной оси трека.
Позиционирование, обеспечиваемое сервоприводом с выделенной
сервоповерхностью, может и не быть оптимальным для каждой головки и
требовать коррекции. Главным образом, эта коррекция необходима из-за
изменения рабочей температуры. Интеллектуальный контроллер хранит
карту отклонений для цилиндров и головок, которую он создает и
периодически корректирует в процессе работы (автоматическая
термокалибровка накопителя).
Кроме термокалибровки есть еще один процесс, асинхронно
запускаемый контроллером диска, - так называемое свипирование (sweeping):
если к диску долгое время отсутствуют обращения, он перемещает головки в
новое, случайным образом определенное положение. Этот процесс
напоминает «хранитель экрана» монитора (screen saver) и предназначен для
выравнивания степени износа поверхности диска.
В современных дисках начинают применять слежение за «высотой
полета» головок во время записи, поскольку ее отклонение от номинала
может привести к потере записываемых данных (впоследствии их не удастся
достоверно считать). При обнаружении превышения допустимой высоты
микроконтроллер повторяет операцию записи, что позволяет значительно
повысить надежность хранения данных.
Дисковые накопители являются той частью компьютера, отказ которой
приводит к самыми крупными убыткам (если потерянные данные не имеют
16
1.1 Физическая организация накопителей на магнитных дисках
дублей), поэтому к ним предъявляются повышенные требования надежности.
Отказы разделяются на предсказуемые и непредсказуемые.
Предсказуемые отказы появляются в результате постепенного ухода
каких-либо параметров от номинальных значений, когда этот уход перейдет
некоторый порог. Если наблюдать за такими параметрами накопителей, как
время разгона до заданной скорости, время позиционирования процент
ошибок позиционирования, «высота полета» головок, производительность
(зависящая и от числа вынужденных повторов для успешного выполнения
операций), количество использованных резервных секторов и других
параметров, то становится возможным предсказание отказов. Сообщение об
их приближении операционной системе позволяет предпринять необходимые
меры и предотвратить крупный ущерб. Целям предупреждения отказов
служит технология S.MA.R.T. (Self-Monitoring, Analysis and Reporting
Technology - технология самонаблюдения, анализа и сообщения),
применяемая в современных накопителях.
Задачи слежения за параметрами накопителя возлагаются на
контроллер, а системное ПО периодически опрашивает состояние
накопителя. Спецификации S.M.A.R.T. существуют в двух версиях - для
интерфейсов АТА и SCSI, которые различаются как по системам команд, так
и по способам сообщений состояния.
Конечно, остаются и непредсказуемые отказы, которые случаются
внезапно. Чаще всего они вызываются разрушениями электронных схем под
действием импульсных помех, механические части страдают от ударов.
Снижать вероятность непредсказуемых отказов позволяет
совершенствование технологий производства компонентов.
Технология S.M.A.R.T. позволяет следить за параметрами устройства,
фиксировать критические события во внутренних журналах, расположенных
в секторах служебных областей диска, считывать эти журналы, а также
запускать тесты поверхности по команде от хост-компьютера.
Фирма Western Digital в своей технологии Data Lifeguard вводит в новые
диски мониторинг температуры. Термодатчики, расположенные в
устройстве, следят за температурой. О превышении первого порога
устройство сообщает кодами ошибки 01/ОВ/01. Температура первого порога
(по умолчанию 60°С) может программироваться. Если слежение за
температурой в S.M.A.R.T. разрешено, то каждые 25 Минут значение
температуры записывается в журнале S.M.AJR.T. По превышению порога
частота обновления повышается (раз в 15 минут). По достижении второго
порога (65 °C) появляется предупреждение о необходимости отключения
кодами 01/0В/80. Если разрешено автоматическое отключение, то шпиндель
будет остановлен, и для его последующего запуска потребуется команда Start
Unit.
17
1 Дисковые устройства внешней памяти
1Л.2. Физическая организация гибких дисков
Традиционными накопителями ПК являются накопители на гибких
магнитных дисках (НГМД) размером 5,25" и 3,5” форматируемой емкостью
до 1,2 и 1,44 Мбайт соответственно. В зависимости от типа дисковода число
дорожек на одной стороне гибкого диска (дискеты) может быть равно 40 или
80, число секторов на дорожке колеблется от 8 до 26. Запись на дискету
выполняется методами частотной модуляции (FM) и модифицированной
частотной модуляции (MFM), позиционирование головок жесткое, по
разомкнутой схеме с помощью шагового двигателя. Обмен с диском может
осуществляться как с использованием DMA, так и без него.
Физический формат дорожки. Индикатором начала дорожки служит
специальная метка (индексное отверстие у дискет 5,25”, или магнитная метка
у дискет 3,5". Запись на дорожку осуществляется в несколько приемов. При
форматировании дорожка перезаписывается полностью. При операциях
записи перезаписываются отдельные сектора, что влечет за собой сбой
намагниченности диска в месте обрыва записи, причем физическая длина
сектора при его перезаписи не всегда точно совпадает с длиной ранее
имевшегося на этом месте сектора, разница в длине может составлять до 4 - 5
бит даже при перезаписи на одном дисководе в одно время. Для
синхронизации после сбоев на дорожке имеются зазоры и синхрозоны. В
общем виде формат дорожки приведен в табл. 1.2
Таблица 1.2 - Физический формат дорожки гибкого магнитного диска
Назначение длина (байт)
Индекс начала дорожки Определяется меткой
Зазор индекса 32 байта 4Eh
Заголовок дорожкн 12 байтов 00b, 3 байта C2h, 1 байт FCh, 50 байтов 4Eh
1-й сектор 574 байта
Межсекторный промежуток 80 байт 4Eh
8-26 секторов на дорожке
Последний сектор 574 байта
Межсекторный промежуток 80байт4ЕЪ
Зазор дорожкн байты 4ЕЬ до индекса начала дорожкн
Физический формат сектора приведен в табл. 1.3. Как видно из таблицы,
сектор гибкого диска содержит два поля (идентификатор сектора и поле
данных), каждое из которых содержит контрольную сумму. Межсекторные
интервалы и интервалы синхронизации значительно больше аналогичных
интервалов жесткого диска (см. табл. 1.1), что объясняется большим
разбросом параметров накопителей гибкого диска при отсутствии
гермоблока и механическим позиционировании головок. На уровне команд
контроллера (в поле маркера данных) данные можно помечать как
18
1.1 Физическая организация накопителей на магнитных дисках
действительные и удаленные (данная возможность используется не всеми
операционными системами).
Таблица 1.3 - Физический формат сектора гибкого магнитного диска
Назначение | Длина (байт)
Идентификатор сектора (22 байта)
Маркер идентификатора 12 байтов 00,3 байта Alh 1 байт FEh
Номер цилиндра 1
Номер головки 1
Номер сектора 1
код длины сектора 1
контрольная сумма ноля идентификации 2
Зазор идентификатора 22 байта 4Eh
Блок данных (530 байт)
Маркер данных 12 байтов 00,3 байта OAlh, 1 байт FXh (Х=8 - удаленные данные, X-Bh - действительные данные)
Поле данных 512
Контрольная сумма поля данных 2
1.1.3. Съемные носители памяти на магнитных дисках
Кроме рассмотренных а предыдущем разделе НГМД, применяются для
архивирования информации, обеспечения конфиденциальности и переноса
информации между компьютерами и другие съемные носители памяти на
магнитных дисках, краткая характеристика которых приводится в данном
разделе.
Съемные винчестеры - устройства с свойствами обычных жестких
дисков, но предназначенные для переноса или обеспечения
конфиденциального хранения данных. Выпускаются недорогие переходники
Mobile Rack, позволяющие использовать в качестве съемного обычный АТА-
диск. При этом 3,5” накопитель устанавливается во внешний 5” отсек.
Однако следую помнить, что обычные накопители не рассчитаны на
вибрацию и удары, опасность которых при частой переноске устройств
повышается.
Диски Бернулли (Bernoulli removable media drive). Привод размером с 5"
дисковод использует 3,5” гибкие диски в жесткой кассете. Объем 35-150
Мбайт. При вращении диска со скоростью 3600 об/мин возникает эффект
Бернулли, поддерживающий головки. По скоростным параметрам близки к
винчестеру. Кассета устойчива к внешним воздействиям. Интерфейс:
внутренние - IDE, SCSI; внешние-SCSI, LPT-порт. Встречаются редко.
Устройства с кассетными жесткими дисками (removable media drives),
выпускаемые фирмой SyQuest, используют картриджи, в которых размещены
и диски (1-2 пластины), и головки. Они имеют все атрибуты современных
19
1 Дисковые устройства внешней памяти
винчестеров - встроенную сервоинформацию, зонную запись, стандартный
размер сектора 512 байт, небольшое время поиска.
Устройство SparQ использует специальный картридж 1 Гбайт с одной
пластиной 3,5”. В устройстве SyJet используется картридж емкостью 1,5
Гбайт с двумя пластинами 3,5". Выпускаются во внутреннем и внешнем
исполнении. Устройства SparQ и SyJet не совместимы.
Гибкие магнитооптические диски (floptical drives). В данных
накопителях для повышения точности позиционирования (и соответственно
емкости) применяется технология совмещения магнитной запись/считывания
с оптическим позиционированием.
Современные устройства LS-I20 (Laser Servo 120 Мб) имеют емкость
дискеты 120 Мб - по 1736 информационных треков на каждой стороне с
зонным форматом записи. Физически па каждом треке размещается 51-92
сектора размером 512 байт. Лазерное позиционирование использует 900
сервотреков. Устройство позволяет отказаться от использования
стандартного дисковода (совместимо с дискетами 1,44 Мбайт по чтению и
записи). Как и обычные дискеты, носители для LS-120 чувствительны к
сильным магнитным полям.
Популярные накопители Zip фирмы Iomega имеют емкость носителя 100
и 250 Мбайт, причем устройства на 250 Мбайт совместимы с носителями на
100 Мбайт. Носитель - гибкий диск, помещенный в пластмассовый картридж
размером 3,5". Накопитель несколько дороже LS-120, зато носители дешевле;
правда, совместимости с обычными дискетами нет. Накопители
выдерживают 10000 установок носителей, картридж - до 2000. В исходном
положении головки выведены из картриджа, слегка разведены и лежат на
очищающей площадке. В рабочем состоянии головки вводятся в картридж с
торца и зависают над поверхностью вращающегося диска, не касаясь ее.
Носители чувствительны к термодеформации - диск, записанный в горячем
состоянии, будет плохо читаться в холодном, Сами устройства Zip особенно
не греются, но при внутреннем исполнении могут нагреваться от других
устройств компьютера (например, от винчестера).
Накопители Jaz той же фирмы Iomega являются развитием Zip, но уже
на твердом носителе: емкость 1 Гбайт у первых моделей в дальнейшем
увеличена до 2 Гбайт.
Магнитооптические диски МОД (Magneto-Optical Drives). В данных
устройствах для записи и чтения информации на магнитный носитель
используется лазер. МОД сочетают практически неограниченное число
перезаписей, свойственное магнитным носителям, с чрезвычайно надежным
хранением записанной информации. Накопители используют традиционную
схему привода - вращающийся диск, и головка, перемещаемая над
поверхностью диска системой позиционирования. Расстояние от головки до
поверхности диска около 1 мм, что исключает риск касания поверхности
20
1.1 Физическая организация накопителей на магнитных дисках
диска (отсюда очень высокая надежность). Головка содержит магнитную
головку, а также лазер и оптическую систему, фокусирующую луч на
магнитном слое носителя. На диске поверх магнитного слоя имеется
прозрачный слой субстрата (толщина около 1,2 мм), защищающего
магнитный от механических воздействий. Луч на поверхности диска
(субстрата) дает пятно размером около 1 мм, так что пылинки и
микроцарапины не оказывают существенного влияния на происходящие
процессы. На магнитном слое, находящемся под слоем субстрата, за счет
фокусировки пятно уменьшается уже до микронных размеров, что и
определяет достижимые (в плане уменьшения) размеры хранящих ’’ячеек”.
Расстояние между треками у дисков 128 Мбайт - 1,6 мкм, у 540/650 Мбайт -
1,1 мкм. Один бит на треке у дисков 128 Мбайт занимает 0,52 мкм, у 540/650
Мбайт -0,31 мкм.
Запись осуществляется термомагнитным способом: магнитное ноле
головки способно перемагнитить только микроскопическую зону носителя,
разогреваемую лазерным лучом до температуры выше точки Кюри (порядка
200°С). Зона, вышедшая из-под луча, ’’сохраняет” полученное состояние
намагниченности. Традиционно в магнитооптике используют
двухпроходную запись. После позиционирования головки, за первый оборот
сектор стирается. Для этого головка создает постоянное магнитное поле, а
лазер включается на полную мощность, когда под ним проходит требуемый
сектор (секторы). В результате все ’’засвеченные” области данных
переводятся в состояние с одним и тем же направлением намагниченности.
На следующем обороте выполняется запись- направление магнитного поля
головки меняется на противоположное и формируются мощные импульсы
лазера над теми точками, состояние которых нужно изменить, чтобы
закодировать требуемую информацию. В результате именно эти ячейки
будут перемагничены. Для большей достоверности на третьем обороте
выполняется верификация - считывание записанной информации.
Считывание информации с магнитного слоя носителя выполняется тоже
с помощью лазера (при малой мощности излучения) и основано на эффекте
Керра - изменения поляризации света под действием магнитного поля.
Отраженный луч проходит через поляризационную оптику, в результате на
фотоприемник приходит луч, интенсивность которого модулирована (по
амплитуде) в соответствии с записью на магнитном слое.
Магнитооптические диски организованы так же, как и магнитные - у
них имеются дорожки, разбитые на секторы, только нумерация дорожек
начинается от центра диска. Размер сектора может быть стандартным (512
байт данных) или увеличенным (2048 байт данных). Больший размер сектора
снижает долю накладные расходов на служебную информацию. Количество
секторов на треке переменно -здесь тоже применяется зонная запись. Кроме
пользовательской области, на диск в каждой зоне имеются служебные и
21
1 Дисковые устройства внешней памяти
резервные области, позволяющие переназначать дефектные секторы
прозрачно для пользователя. Встроенный контроллер накопителя МОД
выполняет трансляцию физической геометрии (с зонным форматом) в
логическую и имеет внутренние средства для переназначения дефектных
блоков.
Магнитооптические диски бывают двух размеров - 5,25” (двусторонние)
емкостью 650 Мбайт, 1,3, 2,6, 4,6 Гбайт и 3,5” (односторонние) емкостью 128,
230, 540, 640 Мбайт и 1,3 Гбайт. Приводы МОД выпускаются во внешнем и
внутреннем исполнениях. Поскольку при записи происходит значительное
тепловыделение, в ряде случаев предпочтительно внешнее исполнение
устройств. Устройства имеют интерфейсы SCSI, IDE или Fibre Channel.
Для магнитооптики с традиционной технологией характерно
значительное различие скоростей записи и считывания - запись происходит
существенно медленнее из-за необходимости двух-трех проходов над одним
и тем же треком.
Более прогрессивная технология записи LIMDOW (Light Intensity
Modulation Direct OverWrite - непосредственная перезапись с модуляцией
интенсивности луча) позволяет исключить проход стирания, чем повышается
скорость записи в 2 раза (в 1,5 раза, если выполняется и верификация). Диски
для такой технологии записи имеют более сложную структуру - они имеют
несколько магнитных слоев с различающимися свойствами (с разной
температурой Кюри), и в них используется магнитное взаимодействие
элементов соседних слоев. Верхний слой (на который падает луч) является
информационным, состояние намагниченности нижнего слоя задается при
инициализации диска (на этапе изготовления) и остается, неизменным.
Головка при записи также создает постоянное магнитное поле, но мощность
лазера модулируется. Поле от головки старается намагнитить
информационный слой в одном направлении (”0”), а поле нижнего слоя - в
противоположном. Для записи ”0” вырабатывается сильный импульс лазера,
для ”1” - более слабый. В процессе остывания результатом взаимодействия
слоев будет запомненное направление намагниченности информационного
слоя, отвечающее мощности импульса.
Форматирование магнитооптических дисков на верхнем уровне может
выполняться в стиле дискет (super floppy) или в стиле винчестера (PC/AT
HDD). В первом случае диск представляется в виде очень большой дискеты,
в его нулевом логическом блоке содержится загрузчик и дескриптор
носителя. Дискета подразумевает сменяемость, и в этом режиме МОД может
быть использован только с помощью драйвера, загружаемого операционной
системой (формат поддерживается и Windows, и OS/2). При форматировании
в стиле винчестера диск начинается с таблицы разделов, и для системы
выглядит как жесткий диск, но в нем имеется возможность смены носителя.
22
1.1 Физическая организация накопителей на магнитных дисках
Магнитооптические диски устойчивы к сильным внешним магнитным
полям, поскольку при нормальной температуре коэрцитивная сила носителя
велика; они не боятся перепадов температуры, солнечного света, вибрации.
Гарантированное время жизни диска около 40 лет.
В магнитооптических дисков, в принципе, есть еще возможности
повышения плотности хранения информации. Технология магнитного
суперразрешения MSR (Magnet Super Resolution) позволяет увеличить
плотность хранения данных, по сравнению с чисто оптическими при том же
размере пятна луча. При записи температура нагрева распределена по пятну
неравномерно - в центре она значительно выше.
Поэтому пороговая температура достигается не на всей площади пятна,
а только в меньшей центральной области, и только в этой области
происходит перемагничивание. Поскольку поверхность носителя движется
относительно головки, нагретая область представляет собой эллипс,
вытянутый вдоль дорожки. Процесс считывания отличается от классического
- его технология напоминает LIMDOW. Диск MSR имеет несколько
магнитных слоев (в упрощенной схеме можно рассматривать три). Для
оптического считывания виден только верхний слой, а информация записана
на нижний. Между ними расположен промежуточный уровень, который при
определенной температуре способен транслировать состояние нижнего слоя
в верхний. Считывание производится довольно мощным лучом,
воздействующим на магнитные свойства верхних слоев, но не изменяя
нижнего хранящего, в присутствии постоянного магнитного поля.
Сверхразрешение достигается благодаря эффекту двойного
маскирования: в центре пятна луча, где температура высокая,
промежуточный слой теряет магнитные свойства и не передаст состояние
слоя хранения на выходной слой, который намагничивается внешним полем.
На краю пятна работает низкотемпературная маска - здесь промежуточный
слои намагничивается внешним полем перпендикулярно слою хранения, и
слой считывания опять-таки оказывается намагниченным внешним полем
головки. И только в узкой области умеренной температуры состояние слоя
хранения транслируется на видимый слой, благодаря чему сигнал
принимается от области, гораздо меньшей, чем пятно луча лазера, с хорошим
отношением сигнал/шум.
Дальнейшим развитием технологии MSR являются MAMMOS (Magnetic
AMplified Magneto Optical System) и DWDD (Domain Wall Displacement
Detection), находящиеся в стадии лабораторных исследований..
23
1 Дисковые устройства внешней памяти
1,1.4. Контрольные вопросы
1. Классификация устройств внешней памяти.
2. Физическая организация накопителей на магнитных дисках (понятие
дорожки, цилиндра, головки/стороны, сектора).
3. Что является минимально-адресуемой единицей информации
дисковых накопителей на физическом уровне, и как определяется ее адрес.
4. В чем различие между системой адресации CHS и LBA.
5. Физическая организация жестких дисков, назначение основных
модулей.
6. Физический формат сектора жесткого диска.
7. Параметры накопителя жестких дисков.
8. Зонная организация, жестких дисков внутренняя и внешняя геометрия
диска.
9. Чем определяется производительность жесткого диска.
10. Начальное включение и функционирование жесткого диска.
11. Средства контроля и коррекции ошибок на жестком диске.
12. Назначение термокалибровки и свипйрования накопителя.
13. Предупреждение отказов с помощью технологии S.M.A.R.T.
14. Физическая организация гибких дисков.
15. Физический формат дорожки гибких дисков. Назначение
межсекторных интервалов.
16. Какие Вам известны съемные носители памяти на магнитных дисках.
17. Организация и принцип работы съемных винчестеров.
18. Организация и принцип работы дисков Бернулли.
19. Организация и принцип работы устройств с кассетными жесткими
дисками.
20. Организация и принцип работы гибких магнитооптических дисков.
21. Организация и принцип работы магнитооптических дисков МОД.
22. Как выполняется запись информации на МОД.
23. Как выполняется считывание информации с МОД.
24. Суть технологии записи LIMDOW.
25. Суть технологии магнитного суперразрешения MSR.
24
1,2 Логическая структура магнитных дисков
1.2. Логическая структура магнитных дисков
Рассмотренные в п. 1.1 магнитные диски имеют аналогичную структуру.
Наиболее сложной является структура жесткого диска, которая позволяет на
одном физическом диске организовать несколько логических дисков
(разделов). Причем каждый раздел может иметь формат разных
операционных систем. Кроме обеспечения множества операционных систем
на одном ПК, разбиение диска на разделы позволяет уменьшить размеры
логических дисков, что бывает выгодно из-за ограничений файловых систем.
Разбиение жесткого диска на логические диски используют и для
упорядочивания использования дискового пространства. Структура гибкого
диска соответствует структуре одного раздела жесткого диска (для малого
объема нет смысла разбивать диск на разделы). Другие сменные диски
форматируются в стиле жесткого диска или в стиле гибкого диска (см. п.
1.1.3).
1.2.1. Логическая структура жестких магнитных дисков
Информация о структуре диска - таблица разделов (partition table) -
хранится в главной загрузочной записи MBR (Master Boot Record),
находящейся в первом секторе диска (цилиндр 0, головка 0, сектор 1). В
начале этого сектора расположена программа (master boot), а за ней имеется
таблица разделов, содержащая четыре 16-байтных описателя разделов.
Каждый описатель задает границы разделов, причем в двух системах: CHS
(координаты начала и конца) и LBA (начала и длина). А также атрибуты
раздела ~ системный код и флаг активности. Флаг активности указывает
главному загрузчику, какой раздел ему следует загружать Флаг активности
может быть установлен только для одного раздела диска (или ни у одного).
Системный код определяет тип раздела; операционная система для своей
файловой системы может использовать разделы только известных ей типов.
Разделы, как правило, начинаются точно по границе цилиндра
(координаты N, 0, 1), кроме первого, начинающегося обычно с первой
головки нулевого цилиндра (0, 1, 1), поскольку под нулевой головкой
расположен сектор с MBR. Заканчиваться разделы должны на границе
цилиндра, что позволяет через номера конечной головки и конечного сектора
определить число головок и секторов на треке.
Таблица разделов (как и весь сектор MBR) создается обычно утилитой
FDISK при конфигурировании жесткого диска. Каждый раздел на жестком
диске имеет логическое имя, например, 1-й раздел-”С:", 2-й раздел-"D:" и т.д.
Во время загрузки ROM-BIOS загружает главную корневую запись в
память и передает ей управление. Эта программа считывает таблицу
разделов, чтобы определить раздел, помеченный как активный. Затем в
25
1 Дисковые устройства внешней памяти
память считывается загрузочная запись (BOOT) активного раздела и
выполняется. Главный загрузчик инвариантен по отношению к загружаемым
операционным системам и дискам. Однако традиционный загрузчик в
принципе не способен загрузить раздел, находящийся дальше, чем через
8,4 Гбайт от начала диска, поскольку пользуется исключительно CHS-
описанием границ разделов. Для больших дисков главный загрузчик должен
использовать линейные описания разделов. В таблице 1,4 приведена
структура главной корневой записи, а в таблице 1.5 структура описателя
раздела.
Таблица 1 «4 ~ Структура главной корневой записи.
Смет. Длина Содержимое
Vo IBDh программа загрузки и выполнения загрузочного сектора
активного раздела
+lBEh lOh описатель раздела 1 (см. табл. 1.5)
+lCEh lOh описатель раздела 2
+lDEh lOh описатель раздела 3
+lEEh lOh описатель раздела 4
+lFEh 2 55 ДА - подпись (сигнатура) таблицы разделов (AA^Sh)
Таблица 1.5 - Структура описателя раздела
Смет. Длина Содержимое
+0 1 Boot Flag- флаг загрузки : 0=не активен, 80h « активеV
+1 1 Begin Hd - начало раздела: номер головки (стороны).
+2 2 Begin Sec/Cyl - начало раздела: сектор/цнлиндр.
+4 1 System Code - код системы (см. табл. 1.6).
+5 1 Ending Hd - конец раздела : номер головки.
4-6 2 Ending Sec/Cyl - конец раздела : сектор/цилиндр последнего сектора.
+8 4 Starting Sector - логический номер начального сектора раздела (адрес в системе LBA).
4-OCh 4 Num Sectors - размер раздела (число секторов)
Значения номера цилиндра и сектора задаются в формате загрузки
регистра СХ в BIOS INT 13h и занимают 10 и 6 бит соответственно. Формат
слова, задающего значения номера цилиндра и сектора приведен на рис. 1.2
(ц - разряды значения цилиндра, Ц - старший разряд; с - разряды значения
сектора, С - старший разряд).
15 14 13 12 11 10 9 8 7 6 5 4 3 j 1 0
| Ц I Ц I И I ц I И I д t ц I Ч i ц I И I с i t I t I П-i-LlJ
Рисунок 1.2- Формат слова Sec/Cyl
Структура раздела зависит от его типа. Некоторые системные коды
(типы разделов) приведены в табл. 1.6. Далее приводится описание наиболее
распространенных типов разделов и логических дисков для DOS/Windows.
26
1.2 Логическая структура магнитных дисков
Таблица 1.6 - Коды и типы разделов жесткого диска
Код Тип раздели (файловая система, максимальный объем)
00h Неизвестный (неформатированный) раздел
Olh DOS FAT12; до 15 Мбайт
02 h XENIX root
03h XENIX usr
04h DOS FAT16; ДО 32 Мбайт
05h (DOS) Extended; до 2 Гбайт
06b DOS FAT16 (Big DOS); до 2 Гбайт
07h OS/2 HPFS или Windows NT NTFS
08h A1X
09h AIX bootable
OAh OS/2 Boot Manage
OBh Win95 FAT32; 512 Мбайт-2 Тбайт
ОСЬ Win95 FAT32 (LBA); 512 Мбайт-2 Тбайт
OEb Win95 FAT16 (LBA); 32 Мбайт-2 Гбайт
OFh (Win95) Extended (LBA)
40h Venix 80286
51b Novell
52h Microport
63h GNUHURD
64b Novell Netware 2
65h Novell Netware 3
80h Old MINIX
81b Linux/MINIX
82 h LinuxSwap
83h Linux
85h Linux extended
93h Amoeba
94h Amoeba BBT
A5b 1 BSD/386
B7h BSD1 fs
B8h BSDI swap
C7h Syrinx
DBb CP/M
Elh DOS access
E3h DOS R/0
F2h DOS secondary
FFh BBT
27
1 Дисковые устройства внешней памяти
Разделы с кодами (Olh, 04h, 06h, OBh, OCh, OEh) являются первичными
разделами (primary partition) DOS/Windows. Утилита FDISK из MS DOS и
Windows позволяет создавать не более одного первичного раздела, хотя в
принципе их может быть и больше. Первичный раздел содержит один
логический диск. Среди разделов DOS/Windows активным может быть
только первичный раздел (только его загрузчик может быть исполнен).
Расширенный раздел (extended partition, код 05h или OFh) служит для
организации произвольного количества логических дисков. Первый сектор
расширенного раздела аналогичен MBR (отсутствует загрузчик) и содержит
расширенную таблицу разделов EPR (Extended Partition Record), той же
структуры, но с некоторыми оговорками. Первый описатель задает
вторичный (secondary) раздел, отведенный под очередной логический диск; в
нем указывается код раздела с файловой системой (для DOS/Windows это
FAT с кодами 04h, 06h, OBh, OCh или OEh, для других ОС - свои). В этом
описателе, как обычно, задаются координаты начала и конца раздела с
логическим диском (трехмерные и линейные). Если этот логический диск
занимает не весь объем расширенного раздела, то второй описатель тоже
имеет код 05h или OFh и указывает на положение сектора со следующей
расширенной таблицей разделов. Остальные, описатели не используются (их
коды нулевые). Если свободного места в разделе уже нет, то и второй
описатель не используется. В следующей расширенной таблице разделов
действуют те же правила. Эта цепочка заканчивается на расширенной
таблице, у которой во втором описателе стоит нулевой код раздела. Заметим,
что второй описатель в расширенных таблицах может только указывать на
положение следующей расширенной таблицы. Часть пространства
расширенного раздела может оставаться не распределенной, в дальнейшем
она может быть использована под логические диски. Цепочка расширенных
таблиц разделов должна быть непрерывной, неветвящейся (используются
только два описателя, и только второй может указывать на следующую
таблицу) и незацикленной (второй описатель не должен ссылаться на ту же
таблицу или предыдущую в цепочке). Код (05h или OFh) расширенного
раздела не несет никакой информации о файловой системе (используется не
только DOS/Windows, но и другими ОС. Координаты расширенных таблиц
разделов обычно имеют вид N, 0, 1. По расположению на физическом диске,
расширенные разделы являются вложенными друг в друга; все они
располагаются в области, описанной в главной таблице разделов как
расширенный раздел. В главной таблице может быть описан лишь один
расширенный раздел.
Каждый логический диск из расширенного раздела имеет ту же
структуру, что и первичный раздел. Операционная система назначает
логическим дискам расширенных разделов имена, остающиеся после дисков
первичных разделов.
28
1.2 Логическая структура магнитных дисков
1.2*2. Логическая структура разделов (гибких магнитных дисков)
Описанная ниже структура раздела (логического диска), в которой
размещение файлов выполняется с помощью FAT довольно универсальна, и
ее использует большинство ОС. Процесс форматирования диска делит общее
количество секторов на четыре части, образующие непрерывные сегменты.
Эти сегменты (в порядке расположения на диске) называются: загрузочная
запись (Boot Record), таблица размещения файлов (FAT - File Allocation
Table), корневой каталог (Root) и пространство данных (Data Area) (см. рис.
1.3).
секторы
Ч " -- ' " 'F
ВООТ| *RES | FAT1 FAT21 ROOT DATA AREA
кл. 2 । кл. 3 1 ... 1 кл. п -
кластеры
Рисунок 1.3 “ Логическая структура раздела
После BOOT может быть несколько резервных секторов (*RES). Число
копий таблиц FAT обычно 2. Следует отметить, что в области пространства
данных (Data Area) вводится минимально-адресуемая на уровне файловой
системы логическая единица информации - кластер. Именно такими
’’порциями” ОС выполняет операции чтения/записи. Размер кластера всегда
кратен размеру сектора (кластер содержит целое число секторов), и в
предельном случае (например для гибких дисков) равен одному сектору.
Верхняя граница размера кластера в принципе ничем не ограничена, но при
больших размерах кластеров возрастают потери дискового пространства на
недоиспользованные секторы последних кластеров каждого файла. Можно
считать, что в среднем файл кончается в середине последнего кластера.
Таким образом, на диске пропадаёт пространство, примерно равное половине
произведения размера кластера на число файлов.
Загрузочная запись (BOOT). На логическом диске первый сектор
содержит запись начальной загрузки, которая содержит параметры диска
(таблица ВРВ - BIOS Parameter Block) и программу загрузки, позволяющую
компьютеру (BIOS) считывать с дискового накопителя данные о структуре
диска, а для загружаемых разделов и остальные части ОС.
Формат загрузочной записи представлен в табл. 1.7. Размеры смещения
и длины фрагментов таблицы даны в байтах. Следует отметить, что значение
ResSect (число резервных секторов +1) указывает на смещение первой копии
FAT от начала раздела и равно 1 при отсутствии резервных секторов.
Значение Siz (размер корневого каталога) задается не в количестве секторов
29
1 Дисковые устройства внешней памяти
(хотя Root занимает кратное число секторов), а в количестве 32-байтных
записей (в одном секторе размещается 16 записей).
Таблица 1.7 - Формат загрузочной записи (BOOT)
Смет. Длина Обознач. Содержимое
+0 3 JMPxxNEAR переход ня код загрузки
+3 8 яма компании и версия системы
+0Bh 2 SectSize число байтов на сектор ^== начало ВРВ нм
+0Dh 1 ClustSize число секторов на кластер
+0Eh 2 ResSect число резервных секторов +1 (число секторов перед первой FAT)
+10h 1 FatCnt число копий FAT
+11Ь 2 RootSiz максимальное число 32-байтовых элементов корневого каталога
+13h 2 TotSecst общее число секторов в разделе DOS
+15h 1 Media дескриптор раздела (то же, что 1-й байт FAT)
+16h 2 FatSize размер таблицы FAT (число секторов)
+18h 2 TrkSec число секторов на дорожке (цилиндре)
+lAh 2 HeadCnt число головок чтения/записн (сторон)
+lBh 2 HidnSec число спрятанных секторов конец ВРВ мн
+lEh начало программы загрузки.
Таблица размещения файлов (FAT). Операционная система использует
таблицу размещения файлов (FAT) для отведения дискового пространства
файлам и хранения информации о свободных секторах. Из соображений
безопасности на всех логических дисках хранятся по две копии FAT. Они
хранятся последовательно начиная с первого сектора FAT. Для гибкого диска
первым сектором FAT будет сектор, следующий за BOOT сектором (обычно
RES = 1), т.е. сектор с координатами: дорожка 0, сторона 0, сектор 2. Для
жесткого диска первый сектор FAT определяется с помощью таблицы
разделов и таблицы BOOT. Число секторов, занимаемых FAT, определяется
типом и форматом диска и указывается в таблице BOOT (FatSize).
Таблица размещения файлов хранит информацию о каждом кластере
файла на диске. Кластер - это группа смежных секторов. Величина кластера,
(задается количеством секторов в кластере), которая для разных типов дисков
и форматов может быть разной, указывается в таблице BOOT (ClustSize).
Варьируется размер элемента FAT (12, 16 и 32) который определяет
максимальное количество кластеров на логическом диске. Так, в MS DOS
ранних версий использовались 12-битные элементы для разделов жестких
дисков (сейчас они используются в гибких дисках), позволявшие адресовать
чуть меньше 4096 кластеров (часть кодов из возможных 212 используется для
служебных целей). 12-битные элементы неудобны тем, что занимают полтора
байта, и для того чтобы получить номер следующего элемента в цепочке
требуется выполнить ряд манипуляций с двумя байтами (сдвиги и
маскирование). Кроме того, эти элементы могут пересекать границу сектора,
что вызывает дополнительные неудобства при буферировании. Но на эти
30
1.2 Логическая структура магнитных дисков
издержки шли, экономя пространство, расходуемое на FAT тогда еще
маленьких дисков. Начиная с DOS 3.3 была принята 16-битная система FAT
(около 65500 кластеров), а в Windows 95 появилась и FAT-32 (около 4*109
кластеров). Файловая система FAT32 отличается от FAT 16 не только
размером элементов таблицы и допустимым размером логического диска.
Загрузочная запись значительно расширена по сравнению с представленной в
табл. 1.7, в ней имеются указатели на резервные копии критических
элементов диска. Здесь корневой каталог представляется, как и обычный, -
цепочкой кластеров произвольной длины, так что число вхождений в него
явно не ограничено. Корневой каталог может быть перемещен, возможно
также переключение между используемыми копиями таблицами.
Размер кластера выбирается разумным компромиссом, исходя из объема
диска и количества элементов FAT. Принимаемые по умолчанию размеры
кластеров утилитами форматирования логического диска представлены в
табл. 1.8.
Таблица 1.8 - Размеры кластеров для FAT12, FAT16 и FAT32
Размер раздела, Мбайт FAT16 Размер кластера, Кбайт (число секторов) Размер FAT, Кбайт FAT32 Размер кластера по умолчанию, Кбайт (число секторов) Размер FAT, Кбайт
0-15 4(8), FAT12 ОД-6 - -
16-127 2(4) 16-128 - -
128-255 4(8) 64-128 - -
256-511 8(16) 64-128 - -
512-1023 16(32) 64-128 4(8) 512-1023
1024-2145 32(64) 64-128 4(8) 1024-2145
2146-8191 - - 4(8) 2146-8191
8192-16383 - - 8(16) 4096-8191
16384-32767 - - 16(32) 4096-8191
32768 н более - - 32(64) 4096 и более
Каждая позиция (элемент) в таблице размещения файлов соответствует
определенному номеру кластера на диске, т.е. n-й элемент таблицы FAT
соответствует n-му кластеру области данных (см. рис. 1.3). Так как первые
два элемента таблицы FAT (0, 1) хранят служебную информацию, то область
данных начинается со 2-го кластера.
Обычно файл занимает несколько кластеров и запись в каталоге файлов
содержит номер стартового кластера, в котором находится начало файла.
Посмотрев позицию FAT, соответствующую стартовому кластеру, ОС
находит номер кластера, в котором хранится следующая порция файла.
31
1 Дисковые устройства внешней памяти
Этому кластеру соответствует своя запись в FAT, которая, в свою очередь,
содержит номер следующего кластера в цепочке. Для последнего кластера,
занятого файлом, FAT содержит значения от F...F8h до F...FFh (здесь и далее
многоточие указывает на разное количество символов F в FAT12, FAT16, и
FAT32). Неиспользуемым (или освобожденным) кластерам соответствует
значение 0, а дефектным секторам - F...F7h. Наконец, значения от F...F0h до
F.,.F7h приписываются резервным кластерам.
На рис. 1.4 приведены элемент корневого каталога, описывающего файл
с именем MYFILE.TXT, и фрагмент таблицы размещения файлов,
определяющей размещение этого файла на диске.
Элемент корневого каталога (подкаталога)
Ю 11 12 13 14 415 16 17 18 19 1А IB 1С ID IE 1F
оооооашшЕзшшшдоаоЕд
L. t
Рисунок 1,4 - Основные концепции FAT
Из рисунка видно, что:
- Файл MYFILE.TXT занимает 10 кластеров. Первый кластер - это
кластер 08h (указан в поле "номер начального кластера" элемента корневого
каталога), последний кластер - IBh. Цепочка кластеров - 8h, 9h, OAh, OBh,
15h, 16h, 17h, 19h, lAh, IBh. Каждый элемент указывает на следующий
элемент цепочки, а последний элемент содержит специальный код.
- Кластер 18h помечен как плохой и не входит в цепочку распределения.
• Кластеры 6h, 7h, 0Ch-14h и ICh-lFh пусты и доступны для
распределения.
- Еще одна цепочка кластеров начинается с кластера 2 и кончается
кластером 5. Чтобы узнать имя файла, нужно отыскать элемент оглавления с
начальным номером кластера 02h.
Корневой каталог (ROOT). Каждый логический диск имеет один
корневой каталог. Расположение корневого каталога на диске фиксировано и
определяется типом и форматом диска. Адрес каталога и его размер можно
определить, используя таблицу разделов (для жестких дисков) и таблицу
BOOT.
32
1.2 Логическая структура магнитных дисков
Корневой каталог используется для хранения информации о своих
элементах (файлах, подкаталогах и метке тома) включая имя, его размер,
начальный элемент таблицы размещения, относящийся к данному элементу,
дату и время его создания или модификации и атрибуты (см. табл. 1.9).
Корневой каталог представляет собой таблицу, в которой каждому
элементу на диске соответствует одна запись. Эта запись имеет размер 32
байта, следовательно на одном секторе размером 512 байтов помещается 16
записей (элементов) каталога.
Таблица 1.9 - Поля записи корневого каталога (ROOT)
Поле Смещ. Описание Размер Формат
1 0 Имя файла 8 Символы ASCII
2 8 Имя расширения файла 3 Символы ASCH
3 11 Атрибуты 1 Биты байта
4 12 Служебное поле 10 Не используется
5 22 Время создания 2 Слово
6 24 Дата создания 2 Слово
7 26 Начальный кластер 2 Слово
8 28 Размер файла 4 Длинное целое
Такую же структуру 32-байтных записей имеют и все подкаталоги
различных уровней вложения. Отличие подкаталогов от корневого каталога в
том, что подкаталоги размещаются на диске как обычные файлы, поэтому не
имеют фиксированного начального адреса и фиксированной длины. При
описании подкаталога в родительском каталоге в поле атрибутов имеется
специальный бит подкаталога, поле длины нулевое, а конец подкаталога
определяется по концу цепочки кластеров. Первые две записи подкаталога
имеют специальное значение (см. ниже).
а) Имя файла. Первые восемь байтов записи каталога содержат имя
файла в формате ASCII. Если имя файла короче восьми символов, то оно
дополняется справа пробелами (ASCII код - 20h). Буквы в имени не
обязательно должны быть заглавными.
Существует три особых ' ситуации, отмечаемых специальными
значениями первого байта в имени файла.
Неиспользуемые элементы каталога имеют первый байт равный 00h.
Операционная система прекращает просмотр каталога, как только встретит
такой элемент. Этот же признак может использовать программист при работе
с каталогом как признак окончания элементов каталога.
Если первый байт имени файла равен E5h, то это означает, что данный
файл уничтожен.
Уничтожение файла на диске, собственно, означает две вещи:
-первый байт имени устанавливается равным E5h;
-все кластеры, относящиеся к данному файлу, помечаются в таблице
размещения файлов как свободные.
33
1 Дисковые устройства внешней памяти
Вся прочая информация об этом файле, включая остаток имени, размер
файла, его начальный кластер, остается в каталоге. При обычном поиске в
каталоге такой элемент игнорируется, но остается возможность
восстановления файла, если после удаления данные кластеры не были
использованы при записи других файлов. Полное восстановление возможно,
лишь если файл не был фрагментирован: элемент каталога указывает на
начальный элемент цепочки, и цепочка собирается вновь из расположенных
подряд вслед за ним свободных кластеров. Количество собираемых кластеров
определяется по длине файла, и если цепочка требуемой длины не
натыкается на используемый кластер, восстановление будет успешным.
Третий особый случай - когда в качестве первого байта имени
используется символ "." (ASCII код - 2Eh). В корневом каталоге вы не
встретите имени файлов, начинающихся с Любая попытка создать такой
файл или подкаталог обречена на неудачу (попытайтесь на своем
компьютере), однако в подкаталоге любого уровня первые две записи имеют
стандартные имена: первая запись - имя и эта запись хранит начальный
кластер данного подкаталога. Вторая запись имеет имя (две точки), и
указывает на начальный кластер своего родителя (нулевой начальный
кластер соответствует корневому каталогу).
В ОС Windows 95, использующую файловую систему MS DOS, ввели
поддержку "длинных” имен файлов и каталогов. Эти имена, в дополнение к
большей длине (до 255 символов), допускают наличие символов разных
регистров, наличие точек внутри имени, пробелов и некоторых других
специальных символов. Длинные имена файлов (и каталогов) записываются в
классическую структуру следующим образом: в каталоге для каждого файла
(ссылки на каталог) отводится не один, а несколько смежных 32-байтных
записей. В первых нескольких записях (табл. 1.10) размещается "длинное"
имя, число записей зависит от длины имени (в одной записи размещается 13
двухбайтных символов Unicode).
Таблица 1.10 - Структура элемента каталога с длинным именем
Смещение, байт Длина,байт Назначение
0 1 Порядковый номер
£ 5x2=10 Имя (двухбайтные символы Unicode)
OBh 1 Атрибут (OFh)
ось 1 Тип (00h)
ООЬ 1 Контрольный код (вычисляется из короткого имени)
OEh 6x2=12 Имя (продолжение)
1А 2 0
iCh 2x2=4 Имя (продолжение)
34
1.2 Логическая структура магнитных дисков
Эти записи имеют специфическое значение байта атрибутов OFh (метка
тома, системный, скрытый и только чтение), благодаря которому старые ОС
их не отображают и не воспринимают при поиске. За ними идет элемент с
обычной структурой, в котором записано короткое имя ("имя MS DOS" в
формате 8 символов, записанное буквами верхнего регистра). Эта запись и
несет информацию о номере начального кластера, дате и времени создания и
атрибуты файла (каталога). Длинное имя не может существовать без
короткого. Записи с частями длинного имени нумеруются по порядку
следования символов. Запись с номером Olh расположен непосредственно
перед записью с коротким именем; если ее недостаточно, то перед ней будет
запись с номером 02h и т. д. У последней записи номер записывается
увеличенным на 40h (если длинное имя размещается всего в одной записи, то
его номер будет 41 h).
Длинные имена создаются только приложениями и утилитами Windows,
при этом генерируется и короткое имя. От длинного имени берутся первые 6
символов, после которых добавляется окончание ”~1". Если полученное
короткое имя уже есть в каталоге, то берется другое окончание - "-2", и так
далее по порядку. Если короткое имя изменяется приложением (функцией)
MS DOS, то контрольная сумма в длинном имени перестанет ему
соответствовать и ОС Windows разрушит связь данного короткого имени с
длинным, а записи длинного имени объявит свободными.
б) Расширение имени файла. Непосредственно за именем файла следует
расширение имени файла, записанное в формате ASCII. Длина его составляет
три байта и подобно имени файла, если расширение имени состоит меньше
чем из трех символов, оно дополняется пробелами. Однако если имя файла
должно состоять хотя бы из одного символа, расширение может иметь одни
пробелы.
в) Атрибуты файла. Формат байта атрибутов файла представлен в
табл. 1.11. Если разрешено только чтение файла (бит 0), то в этом случае
файл защищен от любого изменения с помощью любых операций.
Таблица 1.11 - Формат байта атрибутов файла
Биты Значение, когда бнт=1
0 Разрешено только чтение
1 Скрытый
2 Системный
3 Метка тома
4 Подкаталог
5 Архив
6 Не используется
7 Не используется
Биты 1 и 2 маркируют файл как скрытый или системный. Файлы
помеченные как скрытые или системные, или и те и другие, нельзя увидеть с
помощью простой опции DOS вроде DIR (чтобы увидеть такой файл
35
1 Дисковые устройства внешней памяти
необходимо изменить его атрибут). Атрибут ’’системный” не имеет какого-то
особого значения, он остался по наследству от операционной системы СР/М.
Бит 3 маркирует элемент каталога как метку, что означает, что этот
элемент содержит идентифицирующую метку тома диска. Метка
записывается в полях имени и расширении имени файла, которые в данном
случае рассматриваются как объединенное поле. Поля размера и начального
кластера не используются, хотя поля даты и времени используются.
Бит 4 маркирует элемент каталога как подкаталог. Подкаталоги
записываются на диске подобно обычным файлам. Для элемента каталога
такого типа используются все поля, за исключением поля размера файла,
которое равно нулю. Действительный размер подкаталога определяется
просмотром его FAT.
Бит 5, атрибут архива был создан для того, чтобы помочь копированию
большого количества файлов, хранящихся на жестком диске. Этот разряд
сброшен для всех файлов, которые изменились после последнего
копирования. Для дискет атрибут архива практически бесполезен.
г) Служебное поле. Это поле оставлено для возможного использования в
будущем. Все 10 байтов поля обычно равны 0.
д) Время создания файла или его последней модификации. Поле 5
содержит 2-байтовое значение, указывающее время создания или последнего
изменения файла. Вместе с полем даты эти два поля могут рассматриваться
как одно 4-байтовое беззнаковое число. Это число может сравниваться с
такими же числами в других элементах каталога на больше, меньше или
равно. Формат поля времени и выражения для выделения часов, минут и 2-
секундных единиц (для хранения полных секунд не хватило одного бита)
представлены на рис. 1.5.
15 14 13 12 11 10 09 08 07 06 05 04 03 02 01 00
I часы I минуты | сек/2 I
V...../у------------- ' ---Ух"............
У Y Y 2-секундные единицы (0 - 30)
W (tandOOlFh)
► минуты (0 - 59) (t and 07E0h shr 5)
11 ... ' ► часы(0-23)(t and F800hshr 11)
Рисунок 1.5- Формат поля времени
е) Дата создания файла или его последней модификации. Поле 6
содержит 2-байтовое значение, указывающее на дату создания или изменения
файла. Формат поля даты и выражения для выделения дня, месяца и года
представлены на рис. 1.6. Для получения истинного значения года надо к
значению года, выделенного из даты прибавить 1980.
ж) Номер начального кластера. Кластер - это группа смежных
секторов. Величина кластера, которая для разных типов дисков и форматов
36
1.2 Логическая структура магнитных дисков
может быть разной, указывается в таблице BOOT. Поле 7 - это 2-байтовое
значение, которое дает номер начального кластера для области данных
файла. Оно действует как точка входа в цепочку занятого пространства
файла, находящуюся в FAT. Для файлов, не занимающих области данных, а
также для меток томов номер начального кластера равен нулю.
15 14 13 12 11 10 09 08 07 06 05 04 03 02 01 00
| месяц*
ГОД
день
------------------день (1 - 31) (d and OOlFfr)
месяц (1 - 12) (d and OlEOh shr 5)
год (0 - 127) (d and FEOOh shr 9)
Рисунок! .6 - Формат поля даты
з) Размер файла. Последнее поле элемента файла дает размер файла в
байтах. Отметим, что когда ОС читает файл, она фиксирует конец файла в
случае, когда истинный размер превысит размер файла или когда достигнет
конца цепочки занятого пространства в FAT в зависимости от того, что
первым будет обнаружено.
4) Пространство данных (DATA AREA). Пространство данных
используется для хранения собственно данных и занимает большую часть
диска (более 99% и с ростом емкости дисков этот процент увеличивается).
1.2.3. Преодоление барьера 528 Мбайт (ECHS и LBA)
При обращении к дискам функциями BIOS (Intl3h) формально
ограничения на размер диска задается форматом вызываемых параметров
CHS (номер цилиндра С - 10 бит, номер головки Н - 8 бит и номер сектора
S - 6 бит) В этом случае объем накопителя ограничен
(21О=1024)*(2* S * * 8 * 10=256)*((26-1)=63) = 16515072 секторов, что при стандартном
размере сектора 512 байт составляет около 8,4 Гбайт (здесь и ниже
используется 10-ричное значение приставки "гига”).
Контроллер жесткого диска и интерфейс АТА для передачи параметров
команды (см. далее) в трехмерной геометрии использует управляющие
регистры (номер цилиндра С - 16 бит, номер головки Н - 4 бита и номер
сектора S - 8 бит), которые позволяют реализовать объем диска: (21б=65536
цилиндров)*(24=16 головок)*(28-1=255 секторов)*512 байт= 136,9 Гбайт.
Непосредственно без искажений (традиционный сервис BIOS) через эти
два фильтра (формат вызова и формат регистров контроллера) может пройти
только вызов с самыми жесткими ограничениями по каждой координате (С ~
10 бит, Н - 4 бита и S - 6 бит). Тогда ограничение, полученное
37
1 Дисковые устройства внешней памяти
перемножением диапазонов координат (21О=Ю24 цилиндра)*(24=16
головок)*((26-1)=63 сектора)*512байт = 528 Мбайт.
(210=Т024 )х(24а=16 )x(26-lsc63 )х512 байт 0 528 482304 байт.
Для преодоления 528-мегабайтного барьера у дисков АТА, не трогая
программного интерфейса, в BIOS ввели расширение традиционного
дискового сервиса, для чего стали применять трансляцию параметров вызова
функций INT 13h (логические параметры), в физические параметры,
передаваемые контроллерам АТА-дисков. Применяются два пути
трансляции: оставаясь в пределах трехмерной геометрии CHS и с переходом
на логическую адресацию блоков LBA если ее поддерживает накопитель.
При использовании режима ECHS (Extended CHS), общение с
накопителем производится в трехмерной системе, но с преобразованными
номерами цилиндров и головок. Главная задача преобразования - уменьшить
число логических цилиндров, которое физически у больших дисков
превышает предельные 1024, и увеличить логическое число головок при
ограничении в 16 физических.
Способов трансляции применяется несколько. Наиболее распространенный
основан на операции деления, при котором физическое количество
цилиндров диска делится на К (К-2, 4, 8, 16..., при этом параметр
преобразования К определяется так, чтобы результат не превышал 1024), а
физическое число головок умножается на К (это произведение не должно
превышать 255). Умножение и деление на степень числа 2 легко выполняется
с помощью сдвигов, программный код трансляции получается компактным и
работает быстро. Количество секторов на треке при трансляции не
изменяется. Логические и физические параметры дисков для данной схемы
при разных диапазонах изменения С и Н приведены в табл. 1.12.
Таблица 1.12 - Трансляция геометрии с помрШЫО сдвигов битов
Параметры устройства АТА Параметры, сообщаемые INT 13h Теоретический предел
Число цилиндров С Число головок Н Число цилиндров Число головок
1-1,024 1-16 С н~ 528,4Мбайт
1,024-2048 1-16 С/2 Нх2 1,057Гбайт
2048-4096 1-16 С/4 Нх4 2,П4Гбайт
4096-8192 1-16 С/8 0x8 4,228Гбайт
8192-16384 1-16 С/16 0x16 8,456Гбайт
16384-32768 1-8 С/32 0x32 8,456Гбант
32768-65536 1-4 С/64 Нхб4 В,456ГбаЙт
В режиме LBA параметры стандартных вызовов транслируются в
линейный адрес. Трехмерную геометрию в ответ на вызов INT13h сообщает
следующим образом (см. табл. 1.13):
- количество секторов на треке - всегда 63;
- количество головок - 16, 32, 64, 128 или 255, выбирается так, чтобы
полученное число цилиндров не превышало 1024;
38
1.2 Логическая структура магнитных дисков
- количество цилиндров определяется делением общего числа секторов
на произведение SPT*HDS.
Недостатком данного метода являются более сложные вычисления при
преобразованиях (здесь при умножении и делении уже не обойтись просто
сдвигами).
Таблица 1.13 - Трансляция геометрии с использованием LBA
Число секторов в устройстве АТА, N Параметры, сообщаемые 1NT 13h (в регистрах) Теоретический предел
Число секторов на трек Число головок Число цилиндров
14032192 63 16 N/(63xl6) 528,4Мбайт
1032192-2064384 63 32 №(63x32) 1,057Гбайт
2064384-4128768 63 64 N/(63x64) 2,114Гбайт
4128768-8257536 63 128 №(63x128) 4,228 Гбайт
8257536-16450560 63 255 N/(63x255) 8,422 Гбайт
Когда в CMOS Setup выбирается режим LBA, это означает
использование схемы трансляции LBA, отвечающей табл. 1.13.
Современные версии BIOS имеют встроенный механизм трансляции,
который включается для дисков объемом более 528 Мб.
Ограничения интерфейса BIOS (8,4 Гбайт) имеют чисто программный
характер и решаются на уровне BIOS новых версий, при этом может быть
достигнут второй порог - ограничение интерфейса. Спецификация АТА-2 в
режиме LBA предусматривает 28-битный адрес сектора размером 512 байт
(максимальный объем диска ограничивается значением 0,5 Тбайт).
SCSI диски используют LBA как естественную систему адресации,
причем 32-битный адрес логического блока (сектора в 512 байт) допускает
емкость диска до 2 Тбайт.
Объемы дисков неуклонно приближаются к отмеченным предельным
значениям в режиме LBA. В качестве перспективного направления в
настоящее время разработчиками BIOS и устройств массовой памяти
предлагается расширенный дисковый сервис BIOS Enhanced Disk Drive
Services (EDD) продвигаемый фирмой Phoenix Technologies LTD. Он
позволяет работать с устройствами, имеющими объем до 2й4 секторов,
эффективно используя архитектуру процессоров IA-32 и IA-64. Сервис
оперирует линейным 64-разрядным логическим адресом сектора (LBA). По
прогнозам, емкости данного интерфейса должно хватить на 15-20 лет.
Основные параметры вызова - начальный адрес блока, число секторов
для передачи и адрес буфера - передаются через адресный пакет (device
address packet), а не через регистры (см. табл. 1.14).
39
1 Дисковые устройства внешней памяти
Таблица 1.14 - Формат адресного пакета
Смещение Длина Назначение
0 1 Длина пакета в байтах (не менее 16).
1 1 Резерв (0)
2 1 Число секторов, подлежащих передаче, в пределах 0-7Fh. При значении поля FFh число секторов берется из поля со смещением 18 b, а адрес буфера берется из поля со смещением 10h
3 1 Резерв (б)
4 4 Адрес буфера передачи в форме SegrOfiset FFFFzFFFFh указывает на использование поля со смещением 10h для заданна адреса.
8 8 Логический адрес начального сектора (LBA), 64 бит.
10h 8 64-битный линейный адрес буфера передачи; используется, если поле со смещением 2=FFh или поле со смещением 4=FFFF:FFFFh
18h 4 Число секторов, подлежащих передаче; используется, если поле со Смещением 2=FFh
ICh 4 Резерв (8)
1.2.4. Некоторые полезные сведения, необходимые при работе с
дисками
Вычисление логических (LBA) номеров секторов различных областей
диска.
- Логический номер сектора загрузочной записи
BEGBOOTLOG = BEGJLOG; (1.1)
Здесь и далее значение BEGJLOG (логический номер начального
сектора) берется для жестких дисков из таблицы разделов Starting Sector
(таблица 1.5), а для гибких дисков равно нулю.
- Логический номер начального сектора FAT
BEG FAT LOG = BEGBOOTLOG + ResSect (1.2)
где ResSect - число резервных секторов (обычно равно 1) берется из
таблицы 1.7.
- Размер таблицы FAT - FatSize берется из таблицы 1.7.
- Логический номер начального сектора корневого каталога (ROOT)
BEG_ROOT_LOG=BEGBOOT_LOG+ResSect+FatCnt*FatSize (1.3)
где число копий Fat (FatCnt) и размер одной таблицы FAT (FatSize)
берется из таблицы 1.7.
- Размер корневого каталога (в секторах)
Root Size - RootSiz/16 (1.4)
где RootSiz (максимальное число 32-байтных элементов ROOT) берется
из таблицы 1.7, а так как в 512-байтном секторе помещается 16 элементов
ROOT (каждый по 32 байта), то для определения числа секторов число
элементов делится на 16.
- Логический номер начального сектора области данных
40
1.2 Логическая структура магнитных дисков
BEGDATALOG = BEGBOOTLOG + ResSect + FatCnt * FatSize
+ RootSize (1.5)
где Root Size вычисляется по (1.4).
- Логический номер начального сектора любого кластера с номером
NChest
B EG_Chest_NLOG=BEGDATALOG+(NChest - 2)*
♦ ChestSize (1.6)
где BEG DATA LOG вычисляется по (1.5), a ChestSize берется из
таблицы 1.7.
Очевидным является то, что для чтения/записи фрагмента файла,
принадлежащего кластеру NChest необходимо прочитать/записать ChestSize
секторов, начиная с BEGChestNLOG.
Перевод логического номера сектора N Sec Log в трехмерный
(физический) номер: номер цилиндра (NTrc), номер (стороны) головки -
(N Head), номер сектора на дорожке (NSec). В приведенных ниже
выражениях использованы операции языка Pascal - D1V - деление нацело (с
отбрасыванием остатка), MOD - остаток от деления нацело.
Номер цилиндра
N_Trc = (NSecLOG) DIV (TrcSect * HeadCnt); (1.7)
где TrcSect - число секторов на дорожке (из табл. 1.7),
HeadCnt - число головок (сторон) (из табл. 1.7).
Логический номер в пределах цилиндра (промежуточный результат):
LOG_Trc = (N Sec LOG) MOD (TrcSect * HeadCnt). (1.8)
Номер головки (стороны)
N-Head = (LOGTrc) DIV (TrcSect). (1.9)
Номер сектора на дорожке
N_Sec = (LOG_Trc) MOD (TrcSect) + 1. (1.10)
Особенности работы с 12-битной FAT.
В 12-ти битной FAT номер кластера содержит 3 шестнадцатиричные
цифры, для хранения которых требуется 1,5 байта. Для уменьшения размеров
FAT числа для двух соседних кластеров хранятся в трех последовательных
байтах таблицы. MS-DOS автоматически производит все необходимые
вычисления.
Первые три байта FAT не используются для номеров кластеров. Первый
байт содержит код, определяющий тип диска, а следующие два байта равны
FFh. Поскольку эти позиции таблицы заняты, то кластеры нумеруются,
начиная с 2, причем кластеры 2 и 3 занимают вторую тройку байтов таблицы.
Для нахождения адреса элемента таблицы FAT, соответствующего
кластеру N необходимо произвести следующие действия:
- Умножить номер кластера N на 3. (N1=N*3)
- Разделить результат на 2 с отбрасыванием дробной части
(N2 = N1 DIV 2).
41
1 Дисковые устройства внешней памяти
При этом полученное число N2 является смещением элемента FAT
относительно начала.
Прочитать 2 байта из FAT с полученным смещением N2 как
двухбайтное целое число;
- Если исходный номер кластера четный, то взять младшие 12 бит (т.е.
наложить маску OFFFh);
- Если исходный номер кластера нечетный, то взять старшие 12 бит (т.е.
сдвинуть прочитанное по адресу N2 двухбайтное слово на четыре разряда
вправо).
1.2.5. Пример программирования
В данном примере анализируется логическая структура гибкого дискам
Для работы программы в дисковод А необходимо поместить дискету с
информацией.
Program Logdisk;
Uses Dos, Crt;
Var
n_sek n_dor,n_gol beg fat, begroot ressek sekfat sekki sek_dor kolgol koi_el kolsek bufseg buf_sm code buf r { Procedure in_sek; Begin r.ah := 2; r.al kol_sek; r.di := 0; r.dh := n_gol; r.ch := ndor; r.cl n_sek; r.es :== SEG( buf); r.bx := OFS( buf); Intr($13,r); code := r.flags AND fcarry : WORD; {Номер сектора } : WORD; {Номера дорожки, головки } : WORD; {Начало FAT и Root } : WORD; {Количество резервных секторов } WORD; {Количество секторов } : WORD; {Секторов на кластер } : WORD; {Секторов на дорожке } WORD; {Количество головок } ; WORD; {Кол-во эл-тов корневого каталога } : WORD; {Количество секторов } : WORD; {Регистр сегмента буфер» } : LONGINT; {Регистр смещения } : WORD; : arrayfO..16383] of BYTE; : REGISTERS; n/п чтение заданного сектора диска } { 13 прерывание BIOS }
42
1.2 Логическая структура магнитных дисков
End;
{ Подпрограмма анализа полей Boot сектора
Procedure boot;
Begin
n_sek := 1;
ngol :=0;
ndor :=0;
kolsek := 1;
insek;
beg_fat
begjroot
sekdor
kolgol
kol_el
sekfat
sekjkl
ressek
buffSOEJ;
buf[$10] * buf[$16J + begjat;
buf[$18];
buf[$lA];
bufI$16J*(bufl$eBJ+word(bun$0Cl) SHL 8) DIV 32;
buf[S16|;
buffSODJ;
buffSOE]
End;
{ Процедура преобразования логического номера сектора в физический
Procedure iog2pbys( l_sek: WORD );
Var
v_cyl: WORD;
ostl : WORD;
Begin
v_cyl := sekdor * kolgol;
n_dor l_sek DIV vcyl;
ostl := l_sek MOD v_cyl;
n_gol := ostl DIVsek_dor;
n_sek := ostl MOD sek__dor + 1
End;
{ Процедура анализа содержимого корневого каталога
Procedure p_kat;
Const
b : array[0..3J of BYTE = ( 0,0,0,0 );
bb: array fO..l] of BYTE = (0,0);
Var
i, j : WORD;
ii . WORD;
iia : LONGINT;
ttt : BYTE;
Begin
nsek := begroot;
nd or := 0;
n_gol := 0;
log2phys( begjroot);
kol_sek := sek_fat;
in sek; { Вызов п\п чтение секторов в ОЗУ
WriteLnf Имя Рас нач кластер размер');
}
43
1 Дисковые устройства внешней памяти
For i := 0 То koi el do
begin
If buf]32 * i] о 0 Then
begin
Writef ’);
For j := 0 To 7 Do { цикл чтение имен файлов
Write( Chr( buf[32 * i + j] ) );
Write(7);
For j := 8 To 10 do { расширение файла
Write( Chr( buf]32 * i + j] ) );
For j := 26 To 27 do { нач кластер
bb[j - 26] := Ord( buf[32 * i + j] );
ii:-WORD( bb );
Writef ’,ii,’ », buf[32 * i + 24 * j], buf]32 * i + 25 * j] );
For j := 28 To 31 do { размер файла
b[j - 28] := Ord( buf]32 * i + j] );
iia :« LONGINT( b);
GoToXY( 38, wherey );
WriteLn( iia);
If wherey = 25 Then
Repeat Until ReadKey > #0
end
}
}
}
}
end;
Repeat Until ReadKey > #0
end;
{ Подпрограмма анализа таблица FAT
Procedure p_fat;
type wordp - AWORD;
Label
da, net;
Const
b: array|0..1] of BYTE = ( 0,0 );
Var
}
i,j,k : WORD;
rn, beg bb nom kl, prev_kl tot fn, nf chain koichain Begin FillCharf chain, 1000,0); log2phys( beg_fat ); kolsek := 1; insek; : BYTE; ; WORDP; : WORD; : BOOLEAN; : STRING[14J; : array(0..1000] of BYTE; : WORD; { сектор начала таблицы FAT { чтение 1-го сектора FAT { вызов п\п чтение секторов в ОЗУ
{ определение типа диска по 1 -му байту FAT CaseOrd( buf]0]) Of
}
}
}
}
44
1.2 Логическая структура магнитных дисков
SFF: WriteLn(*
SFE: WriteLn( ’
SFD: WriteLn( ’
SFC: WriteLn( ’
$F9: WriteLn(1
end;
дискета двухсторонняя,'+’8 секторов на дорожке');
дискета односторонняя,'+*8 секторов на дорожке* );
дискета двухсторонняя,'+*9 секторов на дорожке* );
дискета односторонняя,'+*9 секторов ня дорожке*);
дискета двухсторонняя,*+*15 секторов на дорожке *)
{ определение цепочки номеров кластеров заданного файла
WritefFile name:');
ReadLn( th);
tot := FALSE; nf:= ";
For i := 1 To 8 do
begin
If Then tot := TRUE;
If tot Then
nf := nf + ' '
Else nf := nf + UpCase( fn}i))
end;
j :» Pos( *.', fn );
For i := 1 To 3 do
If( j о 0 ) AND ( Length( fn ) >= j + i) Then nf := nf + UpCase( fn(j + i]);
For i := 0 To sek_fat do
begin
log2phys(beg_root + i);
kolsek := 1;
insek;
For j := 0 To 15 do
begin
tot(nf}l} = Chr( buflj * 16}));
If Not tot Then GoTo net;
For k := 1 To 10 do
begin
tot( nf[k +1) = Chr( buf[j * 16 + kJ)) OR (Chr( buf}j * 16 + k] ) =’');
If Not tot Then GoTo net
end;
If tot Then GoTo da;
net:;
end
end;
If tot Then
begin
da: nomkl := (buf[j * 16 + 26} + WORD( bufjj * 16 + 27)) SHL 8);
log2phys( begfat);
kolsek := sekfat;
insek;
koi chain := 0;
Repeat { цикл чтение кластеров из FAT
prev_kl:= nom_kl;
Writef кластера *, nom_ki,' *);
45
1 Дисковые устройства внешней памяти
Inc( koi chain );
chain[kol_chainl := nomkl;
rn := nomkl;
rn := rn SHR 1; { сдвиг вправо или /2 }
beg :== nom kl + rn; { умножение на 1.5(1+0.5) }
rn := rn SHL 1; { сдвиг влево или * 2 )
b[0] buf|beg|; { чтение 1-го бант FAT }
Inc( beg );
b[lj := buffbeg]; { чтение 2-го байт FAT }
If nom kl — rn { номер кластеров четное }
Then begin
Ь[11 := b[lj AND SOF; {выделение младших 12 бит }
bb := WORDP(@b );
nomkl := bbA;
end
Else begin
b|0]b(0] AND $F0; {выделение старших 12 бит }
bb :=WORDP(@b);
nomkl := bbA;
nomjkl := nom kl SHR 4;
end;
Until prevkl >= SFF7;
For i := 0 To koi chain Do { Чтение файла в буфер }
begin
j := chain[i| * sekkl 4* res^sek;
log2phys(j);
kolsek := sek_kl;
insek;
end;
end
Else
WriteLn(fn,' not found');
Repeat Until ReadKey>#0
End;
BEGIN
ClrScr;
boot;
p_kat;
p_fat;
END.
1.2.6. Контрольные вопросы
1. Логическая структура жестких магнитных дисков. Типы и назначения
разделов.
2. Назначение главной корневой записи жесткого диска. Структура
таблицы разделов. Типы разделов.
46
1.2 Логическая структура магнитных дисков
3. Организация расширенных разделов.
4. На какие части разделено адресное пространство раздела (гибкого
диска) и назначение отдельных частей.
5. Что хранит загрузочная запись Boot Record и где она находится.
6. Что хранится в таблице FAT и как найти ее размер (число секторов)
начальный адрес.
7. Чем отличаются и где применяются файловые системы FAT 12, FAT16
и FAT32.
8. Что такое кластеры, для какой области дискеты справедливо понятие
кластеров, и почему кластеры номеруются начиная со второго.
9. Как определить последовательность кластеров, в которых
размещается заданный файл.
10. Что хранит корневой каталог (ROOT), как определить его начальный
адрес и размер.
11. Могут ли отличаться размеры корневого каталога и подкаталогов,
насколько и почему.
12. Как определить начальный адрес области данных.
13. При заданном номере кластера N определите логические и
физические адреса секторов входящих в данный кластер.
14. Опишите структуру 32-байтной записи корневого каталога и
назначение отдельных полей.
15. Какие особые ситуации возможны при задании имени файла.
16. Как в каталоге/подкаталоге хранятся описания файлов с ’’длинными”
именами.
17. Можно ли сделать часть записей каталога/подкаталога невидимой
для ОС (атрибуты не меняются, информация сохраняется) и как это сделать.
18. Структура байта атрибутов, назначение байтов.
19. Особенности обработки полей даты и времени. Выделение года,
месяца, дня, часов, минут, секунд.
20. Представьте запись фрагмента 12-битной FAT для файла, который
начинается с кластера N и занимает на диске М кластеров.
21. Представьте алгоритм определения адреса элемента FAT,
соответствующего кластеру N.
22. Какие ограничения накладываются на максимальный размер диска и
почему.
23. Методы преодоления 528-мегабайтного барьера.
24. Трансляция геометрии с помощью сдвигов битов.
25. Трансляция геометрии с использованием LBA.
26. Формат адресного пакета в режиме EDD.
47
1 Дисковые устройства внешней памяти
1.3. Архитектура оптических дисков
В оптических дисках для хранения информации используется изменение
степени отражения поверхности носителя. В процессе считывания при
освещении трека лазерным лучом возникает модуляция интенсивности
отраженного луча, воспринимаемого фотоприемником. Диски имеют одну
спиральную дорожку, но начинающуюся с внутренней стороны диска.
Дорожка представляет собой цепочку «ямок» (pits) в прозрачной основе
диска, за которой расположен светоотражающий слой. Края ямок
соответствуют двоичным «1» канальной информации, кодирующей полезную
информацию, записанную на диске. Участок без изменения глубины (как
ямка, так и «равнина») соответствует двоичным «О», число нулевых битов
определяется длиной этого участка). Глубина ямок выбрана равной 1/4 длины
волны луча лазера в прозрачном материале основы диска. Благодаря этому
луч, отраженный от дна ямки, возвращается в приемник в противофазе с
лучом, отраженным от поверхности и они взаимно уничтожаются, что
повышает контрастность восприятия ямок. Для выравнивания продольной
плотности записи диск вращается с переменной угловой скоростью, а привод
обеспечивает постоянство линейной скорости носителя, проходящего под
головкой.
Различают оптические диски CD, CD-R, CD-RW и DVD. Оптические
диски CD, CD-R и CD-RW имеют прозрачную пластиковую основу, над
которой расположен слой, хранящий информацию, защищенный сверху
лаком. На поверхность диска (с нижней стороны) падает луч с еще довольно
большим диаметром пятна (порядка 1 мм), и фокусируется в точку
микронных размеров уже на самом хранящем слое, так что мелкие дефекты
на внешней поверхности не оказывают существенного влияния на
оптические процессы.
Устройство хранящего слоя может быть различно:
- штампованные (печатные) диски CD имеют рельефную верхнюю
сторону прозрачной основы, покрытую светоотражающим напылением.
Ямки (pits) и ровные участки трека (lands) дают разную интенсивность
отраженного луча, которая регистрируется фотоприемником. Штампованные
диски изготовляются на специальном заводском оборудовании;
- однократно записываемые диски CD-R имеют слой органического
красителя, нанесенный на основу, сверху которого нанесено
светоотражающее напыление. При записи выжигаются фрагменты красителя,
в результате отраженный луч будет промодулирован по интенсивности;
- перезаписываемые диски CD-RW, под отражающим слоем имеют
регистрирующий слой, который может менять свое состояние между
поликристаллическим и аморфным. Прозрачность слоя зависит от его
состояния. При перезаписи состояние отдельных участков изменяется в
48
1.3 Архитектура оптических дисков
зависимости от степени нагрева участка лучом записывающего лазера. При
остывании фиксируется то или иное его состояние. Перезаписываемые диски
CD-RW по сравнению с CD и CD-R при считывании дают меньшую
амплитуду сигнала.
Универсальные цифровые диски DVD (Digital Versatile Disk)
представляют собой развитие принципов CD, направленное на повышение
плотности хранения и скорости передачи информации. Эти диски имеют те
же внешние размеры, что и CD (диаметр 120 мм и толщину 1,2 мм), однако
представляют собой систему из двух пластин. Для повышения емкости
ширина трека и продольный размер битовой ячейки уменьшены примерно
вдвое, снижены издержки избыточности кодов коррекции ошибок. Кроме
того, могут использоваться две стороны диска, а на каждой стороне
информация может храниться в двух слоях, таким образом, один диск может
иметь уже четыре рабочих плоскости. Изменена система канального
кодирования (применяются 16-битные коды) и система избыточного
кодирования (см. ниже).
Каждая пластина DVD может быть как однослойной (по конструкции
аналогична диску CD), так и двухслойной. В двухслойной пластине "ямки"
расположены в двух плоскостях, нижний слой сверху покрыт
полупрозрачной /полуотражающей пленкой, а верхний - отражающей (см.
рис. 1.7). Какой из слоев считывается, определяется фокусировкой луча
(сигналы другого слоя из-за расфокусировки размываются и на их фоне
требуемый слой различим).
- Этикетка
Основание
Отражающий слой
Пограничный слой
Полуотражающий слой
*——- Прозрачный слой
Рисунок 1.7- Устройство двухслойного диска DVD
(а - луч, сфокусированный на верхнем слое; б - на нижнем)
1.3.1. Физическая организация оптических дисков
Как уже говорилось, вместо концентрических треков обычных дисков
оптический диск имеет одну спиральную дорожку, начинающуюся с
внутренней части рабочей поверхности диска. Специфика записи -
требование к непрерывности записанной области в сочетании с
невозможностью перезаписи (кроме дисков CD-RW) - не позволяет
49
1 Дисковые устройства внешней памяти
рассматривать оптический диск как носитель с прямым (произвольным)
доступом к данным, что обычно ассоциируется с понятием ’’диск”.
Минимальной адресуемой единицей хранимой информации является
блок ’’полезной информации” длиной 2352 байт, который также называют
сектором. Система адресации данных произошла от аудиодисков и
координаты каждого блока описываются в форме абсолютного времени (А-
Time) Min:Sec:Frac - минуты (0-73), секунды (0-59), номер блока (фракция) в
секунде (0-74). Отсчет абсолютного времени начинается с начала
программной области (сразу после вводной области). Блок аудиодиска
целиком используется для данных. Блок диска CD-ROM может содержать
2048 байт данных, защищенных от ошибок ЕСС- и EDC - кодом, или 2324
(или 2336) байт информации с меньшей защищенностью, остальные байты
используются для служебной информации. Последовательность блоков
одного назначения (формата) объединяется в трек (в аудиодисках треку
соответствует одна музыкальная запись). Минимальный размер трека - 300
секторов (4 секунды), максимальный - весь диск. На диске может быть до 99
треков с номерами 01-99. В начале диска расположена вводная зона (lead-in),
занимающая до 4500 секторов (1 минута, около 9 Мбайт), в конце - выводная
зона (lead-out) 6750 секторов (1,5 минуты, 13,5 Мбайт). У многосеансовых
дисков (см. ниже) после выводной зоны одной сессии следует вводная зона
следующей сессии.
Во вводной зоне располагается таблица содержания диска TOC (Table
Of Content), к которой описаны координаты (абсолютное время) начала
каждого трека, а также начала выводной зоны.
13.2. Логическая организация оптических дисков
Поскольку оптическое считывание по своей природе имеет высокий
уровень ошибок распознавания, в оптических дисках принята довольно
сложная система кодирования потока цифровых выборок. Данные на треке
записаны в виде последовательности канальных кадров (frame). Каждый байт
информации кадра (кроме поля синхронизации) кодируется 14-битным
канальным символом, кодирование называется EFM (Eight to Fourteen
Modulation - кодирование "8-14”), что позволяет улучшить вероятность
распознавания символов. Канальные символы отделяются друг от друга
трехбитными зазорами, формируемыми по определенным правилам.
Состав кадра (в канальных символах и без указания зазоров)
следующий:
- синхронизация (последовательность 24 канальных битов);
- символ субкода;
- 12 символов данных;
- 4 символа контрольного кода;
50
1 .3 Архитектура оптических дисков
- 12 символов данных;
- 4 символа контрольного кода.
Таким образом, в кадре, состоящем из 588 канальных битов, имеются
лишь 192 информационных бита (24 байта), 64 бита контрольного кода (8
байт) и 1 байт субкода. Последовательность из 98 кадров и образует блок
(24*982352 байт данных), адресуемый вышеописанным способом.
Символом субкода в каждом кадре кодируется байт - текущие биты 8
субканалов Р, Q, R, S, Т, U, V, W. При считывании блока собираются 98-
битные слова каждого субканала (секция), которые используются для
несения служебной информации. Реально из восьми субканалов
используются лишь Р и Q, остальные были заложены на развитие стандарта.
Субканал Р используется для маркировки начала/конца трека.
Последняя секция с единицами в Р - субканале является первой секцией,
несущей пользовательские данные. Во вводной зоне Р-субканал несет нули.
Субканал Q хранит информацию о положении блоков и дополнительную
информацию о содержимом треков. Его структура следующая:
- 2 бита синхронизации.
- 4 бита управления (комбинация 0100 запрещает цифровое копирование
данных, ОНО - разрешает; остальные комбинации используются только в
аудиодисках).
- 4 бита - режим использования подканала (определены значения: 0001 -
q-Mode 1. 0010 - q-Mode2 и для аудиодисков 0011 - q-Mode 3.)
- 72 бита - данные подканала (9 байт), см. ниже.
- 16 бит - CRC - код подканала.
Данные субканала в основном трактуются как байты с двумя
упакованными BCD-цифрами (00-99), за исключением специальных
признаков, в которых используются шестнадцатиричные числа (например,
АО).
Во вводной зоне диска (lead-in) Q-субканал в режиме q-Mode 1 содержит
таблицу содержимого диска ТОС, в которой указываются координаты начала
каждого трека и начала выводной зоны (lead-out). В каждом блоке
содержится одна запись таблицы, причем каждая запись трижды повторяется
в трех смежных блоках. Запись содержит указатель номера трека и позицию
(P-M1N, Р-SEC и Р-FRAC). После троекратных повторений записей с
указателями на все треки пользовательской области в таблице также
троекратно повторяются записи со специальными значениями указателя: АО,
А1 и А2. Вся таблица повторяется многократно по всей вводной зоне и может
закончиться на любой записи.
В зоне треков 01-99 и выводной зоне Q-субканал в режиме q-Mode 1
указывает текущее положение (TNO - номер текущего трека (01-99) или
признак выводной зоны (АА), индекс (01-99) внутри трека или пауза между
1 Дисковые устройства внешней памяти
треками (00); относительное время внутри трека или время до конца паузы
(MIN, SEC и FRAC); абсолютное время на диске (A-min:A-sec:A-trac)).
Кроме служебной информации (субканалов) остальные символы
канального кадра образуют основной информационный канал. Для хранения
цифровых данных недопустима даже одна битовая ошибка на файл поэтому
для CD-ROM формат сектора предусматривает многоуровневую систему
контроля и исправления ошибок. Для преемственности технологии и
совместимости дисков формат канального кадра (588 канальных битов)
соответствует формату аудиодиска. Сектор, содержащий 2352 байта,
начинается с заголовка:
- байты 0-11 - поле синхронизации (1 байт 00h, 10 байт FFh, 1 байт 00h):
- байты 12,13 и 14 - адрес сектора (Min, Sec, Frac);
- байт 15 - номер режима сектора (Sector Mode).
Способ задания адреса сектора зависит от его положения, адрес
повторяет информацию Q-субканала, полученную с декодера EFC (”14-8”) на
момент поступления поля синхронизации на дескремблирование (см. ниже).
Минуты (поле Min) в заголовке соответствуют минутам Q-субканала,
сложенным с числом AOh. Во вводной зоне адрес задает положение сектора
относительно ее начала, в зоне данных и выводной зоне он соответствует
абсолютному времени (A-Time) с точностью ±1 с.
Использование оставшейся части сектора зависит от режима, заданного
в заголовке (байт 15):
CD-ROM Mode 00: байты 16-2351 нулевые (нет данных).
CD-ROM Mode 01 (максимально защищенные данные):
- байты 16-2063 - данные (user data, 2048 байт);
- байты 2064-2067 - контрольный код EDC (4 байта), 32-битный код
СВСдля байт0-2063;
- байты 2068-2075 - нули (8 байт);
- байты 2076-2351 - контрольный код ЕСС, (276 байт):
- байты 2076-2247 - Р-паритет (172 байта), подсчитанный для байтов 12-
2075;
- байты 2248-2351 - Q-паритет (104 байта), подсчитанный для байтов 12-
2247.
CD-ROM Mode 02 (минимально защищенные данные):
- байты 16-2351 - данные (user data, 2336 байт).
Во всех режимах (даже Mode 0, где нет данных) блок защищен
кодированием CIRC (на уровне кадров, как и в аудиодисках). В режиме
Mode 1 защита тройная: CIRC, EDC (Error Detection Code - код для
обнаружения ошибок, 4 байта) и ЕСС (Error Correction Code - код для
исправления ошибок, байты Р- и Q-паритета, которые иногда путают с
битами одноименных субканалов). В режиме Mode 2 забота о
52
1.3 Архитектура оптических дисков
дополнительном повышении достоверности возлагается на внешнее
программное обеспечение (по отношению к устройству CD-ROM).
При записи последовательность байтов 12-2351 проходит через
скремблирование (перемешивание битов но определенному алгоритму,
обратный процесс называется дескремблированием), байты синхронизации
скремблером не затрагиваются. 2352 байта, выходящие со скремблера,
отображаются и последовательность 24-байтных кадров (F] -Frames), в
которых соседние байты (четные и нечетные) попарно меняются местами.
Эти кадры проходят через CIRC-кодирование и превращаются в 32-байтные
кадры (F2 -Frames), в которых появляются по 8 дополнительных байтов
паритета. К каждому из этих кадров добавляется контрольный байт, и
получаются 33-байтпые кадры (F3 -Frames). Байты этих кадров
преобразуются в 14-битные канальные символы, из которых формируется
канальный кадр. Наконец, эта последовательность кодируется «ямками» - на
месте каждой битовой «1» делается переход от равнины к ямке или обратно.
При считывании диска все эти преобразования выполняются в обратном
порядке.
Структура записываемого (CD-R) и перезаписываемого (CD-RW) диска
несколько отличается от CD-ROM. До штатного начала вводной зоны
имеются зоны РСА и РМА, известные только рекордерам (и их
программному обеспечению). Диск начинается с зоны калибровки мощности
лазера РСА (Power Calibration Area), используемой для предварительной
настройки рекордера перед записью. Далее следует область для временного
хранения информации о текущем состоянии записи РМА (Program Memory
Area). В эту область заносятся координаты начала и конца каждого уже
записанного трека. Информация в РМА записывается перед тем, как диск
извлекают из рекордера,
Вводная зона резервируется для хранения ТОС, запись в нее
производится только после записи всех треков в программную область. При
закрытии диска (disk finalizing) сразу за программной областью записывается
выводная зона, а затем вводная зона с таблицей ТОС. Если диск записывается
не за один прием, то ТОС формируется по информации из РМА.
Специальным вариантом записываемого диска является многосеансовый
диск, в котором видимое при обычном считывании содержимое
записываемого диска может меняться пользователем несколько раз.
Структуру мпогосеансового диска иллюстрирует рис. 1.8, на котором серым
цветом отмечены записанные области (две закрытые сессии и третья -
незакрытая).
В структуре диска отмечены следующие области:
- РСА - область калибровки;
- РМА - область сохранения координат;
- LIA - вводная зона;
53
1 Дисковые устройства внешней памяти
- РА - область данных сессии;
- LOA - выводная зона.
Рисунок 1.8 - Структура многосеансового диска
Сессией (session) называют набор треков (от I до 99), которому
предшествует вводная зона, содержащая ТОС с указателями начала каждого
из этих треков. За последним треком имеется и выводная зона (lead out),
начало которой также задано в ТОС. Сразу за выводной зоной может быть
записана вводная зона следующей сессии. Размер выводной зоны для второй
и последующих сессий уменьшен до 2250 секторов (0,5 минуты, около 4
Мбайт).
Каждая сессия (структура, записанная за один сеанс) выглядит как
обычный CD-ROM, но есть нюансы в записях вводной зоны. Сессия
называется закрытой, когда ее программная область обрамлена вводной и
выводной зонами. Однако в ее ТОС указатель на выводную зону (А2) может
указывать либо на начало выводной зоны, либо на ее конец, то есть на начало
вводной зоны следующей сессии. Когда указатель описывает начало
выводной зоны, диск становится закрытым следующую сессию к нему уже
не добавить. Когда он указывает на конец вводной зоны, на диск возможна
запись последующей сессии (если хватает места на диске, места в РМА и
номеров треков).
Первый трек первой сессии должен иметь номер 01, следующие треки -
последовательно нарастающие номера. Номер первого трека очередной
сессии должен быть следующим за номером последнего трека предыдущей
сессии. Максимальный номер трека - 99.
Многосеансовые, или мультисессионные диски содержат более одной
сессии, и все сессии физически доступны для чтения.
1.3.3. Файловые системы
Для хранения данных на оптическом диске требуется организация
файловой системы, которая не может просто повторять дисковую файловую
систему. В настоящее время для CD, используемых в PC, распространены
почти эквивалентные файловые системы HSF (High Sierra Format) и ISO
9660- первый стандарт (1988 г.) для хранения данных на CD-ROM.
Данные тома CD-ROM начинаются с логического сектора 16 первого
трека сессии, в котором находится набор дескрипторов тома. Набор должен
начинаться с первичного дескриптора тома PVD (Primary Volume Descriptor).
54
1.3 Архитектура оптических дисков
За ним может следовать произвольное число дополнительных дескрипторов
SVD (Supplementary Volume Descriptor), и завершается эта
последовательность дескрипторов терминатором.
Область логических секторов 0-15 объявлена системной (ее
использование стандартом не предусматривается). В секторе 17 размещается
загрузочная запись. Структуры записей включают две формы представления
многобайтных чисел - одну для платформ Intel (порядок байтов младший-
старший), другую для платформ Motorola (порядок - старший-младший).
Структуру тома описывает таблица содержимого (ТОС или VTOC - не
путать с таблицей ТОС компакт-диска физического уровня в Q-субканале во
вводной зоне), которая хранится в его логических секторах (на треке тома). В
ТОС описаны все файлы, присутствующие на диске, - имя, дата создания,
атрибуты, положение всех экстентов файла (экстент - фрагмент файла,
записанный в непрерывной цепочке блоков).
Файлы на диске располагаются в каталогах, образующих древовидную
структуру, и каждый каталог содержит список входящих в него файлов, их
атрибуты и указатели на секторы, в которых располагается начало файлов
или их экстентов. Для ускорения поиска файлов на диске кроме каталогов
имеется дополнительная таблица путей (path table), содержащая список
путей (в символьном формате) ко всем подкаталогам диска и адреса их
начальных секторов.
Стандарт имеет три вложенных уровня совместимости. Самые жесткие
ограничения имеет первый уровень (Level 1): файловая система в стиле MS
DOS, имена файлов по схеме "8.3”, глубина вложенности каталогов до 8.
Второй уровень (Level 2) позволяет использовать длинные имена
файлов с более богатым набором допустимых символов, допустима глубина
вложения каталогов до 32. Этот формат воспринимается не всеми
операционными системами (и частности, его не поддерживает MS DOS).
Третий уровень (Level 3) допускает даже фрагментацию и чередование
файлов. Это означает, что файл может размещаться во множестве экстентов и
экстенты разных файлов могут чередоваться.
Rock Ridge - расширение стандарта ISO 9660 для ОС UNIX,
обеспечивающее работу с длинными именами файлов и символьными
связями.
Joliet - расширение файловой системы ISO 9660 от Microsoft для
Windows, снимающее ограничения на имена файлов. Позволяет использовать
любые символы в именах, преодолеть ограничение на длину имени "8.3",
увеличить возможную глубину вложенности каталогов и снять ограничения
на имена каталогов. Допускает длину имен файлов и каталогов до 64
символов (длинные имена Windows могут иметь длину до 255 символов)-
Символы имен кодируются двумя байтами (Unicode), что обеспечивает
возможность использования различных языков. Расширение строится на
55
1 Дисковые устройства внешней памяти
возможности организации множества дескрипторов одного и того же тома,
заложенной в ISO 9660. Файлы на диске размещаются так же, как и в ISO
9660, и первичный дескриптор тома так же указывает на структуры формата
ISO, с таблицей путей, доступной MS DOS. Но добавляется еще и
дополнительный дескриптор тома (SVD), который указывает на
альтернативную таблицу путей, содержащую расширенные имена Windows.
Обе таблицы путей описывают один и тот же набор файлов.
Romeo - расширение файловой системы для поддержки длинных имен
(до 128 символов) Windows 95 и NT. Если имена не длиннее 31 символа, диск
может читаться и на Мас. К Joliet отношения не имеет.
Файловая система VDF (Universal Data Format) с пакетами переменной
длины ориентирована на возможность модификации уже записанных данных
(для дисков CD-RW). Здесь файлы хранятся рядом со своими описаниями,
допустимая длина имен до 127 символов. Каждый пакет представляет
отдельный файл (или его экстент), в начале пакета имеется описание файла
(имя, дата, атрибуты, длина файла и данного экстента).
Никаких общих таблиц размещения файлов и экстетов для UDF не
требуется - последовательное чтение пакетов позволяет собрать все файлы
диска. Конечно, для быстрого поиска нужного файла в памяти компьютера
строится виртуальная таблица размещения файлов. Диск (сессия) с пакетами
переменной длины может быть закрытым и с дескрипторами тома файловой
системы ISO 9660 (Level 3, поскольку требуется поддержка фрагментации),
тогда он будет читаться традиционными средствами. Иначе для его чтения
требуется специальный драйвер UDF. Организация диска в виде пакетов
переменной длины очень эффективно использует дисковое пространство.
Международные стандарты ISO/IEC 13346, ISO/IEC 13490 и
европейские ЕСМА (European Computer Manufacturers Association) -ECMA-
167 и ECMA-168 (1994 г.) призваны заменить ISO-9660. Здесь снимаются
некоторые ограничения, свойственные прежним стандартам.
ЕСМА-168 описывает структуру файлов и томов на дисках CD-ROM и
CD-RW. Спецификация предусматривает любой метод записи - сплошной
(сессия или диск за один заход), потрековый и пакетный. Диск ЕСМА-168
более удобен для хранения данных, чем ISO 9660. Стандарт вобрал
возможности Rock Ridqe: длинные имена, глубокую вложенность каталогов,
а также расширенный набор символов в именах.
13.4. Контрольные вопросы
1. Принцип хранения информации в оптических дисках.
2. Типы оптических дисков и их организация.
3. Устройство двухслойного диска DVD.
4. Формат дорожки оптических дисков.
56
1.3 Архитектура оптических дисков
5. Система адресации блоков данных оптических дисков.
6. Назначение и формат вводной, выводной зон.
7. Что такое канальный кадр и его формат.
8. Назначение символа субкода в канальном кадре и как формируются
субканалы.
9. Назначение субканала Р.
10. Назначение и структура субканала Q.
11. Где находится таблица содержимого диска ТОС и что в ней
записано.
12. Система контроля и исправления ошибок на уровне канального
кадра.
13. Формат сектора (блока данных).
14. Чем отличаются режимы CD-ROM Mode 00, CD-ROM Mode 01 и
CD-ROM Mode 02.
15. Система контроля и исправления ошибок на уровне сектора (блока
данных).
16. Последовательность преобразования информации при записи/чтении
на/из оптический диск.
17. Особенности структур записываемых (CD-R) и перезаписываемых
(CD-RW) дисков. Назначение зон РСА и РМА.
18. Структура мпогосеансового диска. Типы и формат сессий.
19. Какие файловые системы применяются для хранения данных на
оптических дисках.
20. Характеристика и организация файловых систем HSF и ISO 9660.
21. Назначение таблицы содержимого тома ТОС.
22. Назначение таблицы путей.
23. Уровни совместимости ISO 9660.
24. Особенности файловой системы Rock Ridge, Romeo.
25. Особенности файловой системы Joliet.
26. Характеристика и организация файловой системы UDF.
27. Характеристики и назначение ЕСМА-168.
57
1 Дисковые устройства внешней памяти
1.4. Управление накопителями гибких дисков
1.4.1. Архитектура контроллера гибких дисков
Управление накопителями гибкими дисками (НГМД) в РС-подобных
ПК осуществляется контроллером гибкого диска (Floppy Disk Controller, FDC
- микросхема 18272А), который в современных ПК реализуется чипсетом.
Контроллер управляет дисководами для дискет диаметром 5,25 и 3,5 дюйма,
поддерживает запись на дискету методами частотной модуляции (FM) и
модифицированной частотной модуляции (MFM), программируемую длину
секторов (128, 256, 512 или 1024 байта), мультисекторные и
мультидорожечные операции обмена с дисками, операции поиска.
Одновременно к одному контроллеру может быть подключено до четырех
дисководов любого из поддерживаемых типов. Обмен с диском может
осуществляться как с использованием DMA, так и без него. В последнем
случае используются 2 метода: опрос состояния контроллера через регистры
или использование аппаратных прерывания контроллера. FDC генерирует
аппаратные прерывания уровня 6 (IRQ6), связанные с вектором прерываний
OEh. Управление контроллером и накопителями осуществляется через 4
порта ввода-вывода (3F2h, 3F4h, 3F5h, 3F7h). Архитектура контроллера
накопителя гибких магнитных дисков представлена на рис. 1.9.
Рисунок 1.9 - Архитектура контроллера НГМД
58
1.4 Управление накопителями гибких дисков
Контроллер НГМД непосредственно работает с физическим форматом
дорожки и управляет накопителем на уровне собственных команд
управления.
Порты контроллера накопителей на гибких висках. Внутренние
регистры контроллера гибких дисков отображаются на адресное
пространство портов ввода/вывода, которые приведены в табл. 1.15.
Таблица 1.15 — Назначение портов контроллера
Порт Режим Назначение
3F2h запись Регистр управления режимом работы.
3F4h чтение Чтение регистра основного состояния контроллера
3F5h запись Передача команд по управлению накопителями, запись данных на диск.
3FSh чтение Чтение данных с диска, чтение результатов выполнения команды (байтов состояния).
3F7h запись У правление скоростью обмена.
3F7h чтение Чтение бита смены дискеты (7-й бит).
а) Порт 3F2h. Через этот порт выполняется управление режимом работы
контроллера и накопителей. Назначение разрядов:
0-1: выбор накопителя (00-первый, 01-второй, 10-третий, 11-
четвертый);
2: 0=сброс контроллера, ^разблокировать контроллер;
3: 1=разрешить работу с DMA и прерывания контроллера;
4-7: включить мотор (0001 - первый накопитель, 0010 - второй, 0100 -
третий, 1000 - четвертый).
В современных ПК допускается не 4, а только 2 накопителя, вследствие
чего комбинации, использующие третий и четвертый накопители,
игнорируются. Бит 2, равный 0, прекращает выполнение текущей команды в
момент вывода в порт. Если команда не завершилась, ее выполнение
прерывается. Если не были считаны результаты выполнения команды, они
пропадают. Если не закончился ввод команды, он пропадает и должен быть
начат заново. В любом случае продолжение работы возможно только после
установки этого бита обратно в 1.
б) Порт 3F4h. Через этот порт осуществляется чтение регистра
основного состояния FDC. Назначение разрядов:
0-3: накопитель занят в режиме поиска (0001-первый, 0010- второй,
0100-третий, 1000-четвертый);
4: 0 - контроллер свободен, 1 - контроллер занят выполнением команды
чтения или записи;
5: режим работы контроллера (0-с использованием DMA, 1-без DMA);
6: направление обмена (0 - от процессора к контроллеру, 1 - от
контроллера к процессору);
7: готовность к обмену (0 - не готов, 1 - готов).
59
1 Дисковые устройства внешней памяти
Бит 7, равный 1, говорит о том, что контроллер при вводе команды готов
к приему очередного байта команды, при обмене данными в режиме без
DMA готов к приему/передаче очередного байта данных, при приеме
результата выполнения команды готов к передаче очередного байта
результата.
в) Порт 3F5h. Через этот порт проходит основной поток информации
между контроллером и системным интерфейсом (поток данных при
операциях чтения/записи, команды контроллеру -до 9 байт, и байты
состояния после выполнения каждой команды - до 4 байт)
г) Порт 3F7h. При записи в этот порт происходит занесение информации
в регистр управления скоростью передачи данных, назначение разрядов
которого приведено ниже:
0-1: скорость обмена (00 - 500 Кбит/сек, 01 - 300 Кбит/сек, 10 - 250
Кбит/сек, 11 - резерв);
2-7: не используются.
При чтении порта 3F7 производится опрос состояния линии 34 (Disk
Change) интерфейса НГМД. При этом бит 7=1 означает факт смены дискеты.
Этот бит сбрасывается после выполнения накопителем операции поиска.
Биты 0-6 при чтении не используются.
BIOS использует порт 3F7 для настройки подсистемы НГМД на работу
накопителем с конкретным форматом дискет. При этом используются
встроенные в BIOS таблицы параметров НГМД и значения типов НГМД,
установленные в CMOS. Принцип настройки заключается в попытках чтения
информации с дискеты с перебором таблиц параметров до успешного
окончания чтения.
Первоначально BIOS допускает, что используемая дискета имеет
учетверенную плотность (QD) и устанавливает максимальную скорость
передачи данных 500 Кбит/сек. Для определения типа дискеты сначала
читается сектор 1 дорожки 0 головки 0, затем - сектор 15 дорожки 0 головки
0. Успешное выполнение этих операций указывает на то, что носителем
является дискета учетверенной плотности. В противном случае носителем
является дискета двойной плотности (DD). Если дискета имеет двойную
плотность, BIOS программирует адаптер на скорость передачи данных 300
Кбит/сек.
При сопряжении со старыми (360/720 Кбайт) НГМД выбирается
скорость передачи данных, равная 250 Кбит/сек. Определенная во время
настройки таблица параметров используется при работе с НГМД до смены
дискеты, после чего настройка производится вновь, начиная со стандартной
(для установленного в CMOS типа НГМД) таблицы.
60
1.4 Управление накопителями гибких дисков
1.4.2. Команды управления накопителями
Выполнение каждой команды имеет 3 фазы:
- фаза ввода команды;
- фаза выполнения;
- фаза результата.
В фазе ввода команды контроллер побайтно (до 9 байт в зависимости от
типа команды) принимает и накапливает команду. Фаза команды
заканчивается запуском мотора на соответствующем накопителе (это не
относится к командам задания режимов и чтения состояния).
В фазе выполнения осуществляется обмен данными между ОЗУ и
накопителем (если команда предполагает такой обмен). В режиме с
использованием DMA перед приемом/передачей байта данных генерируется
сигнал "запрос на DMA". Контроллер DMA отвечает на него сигналом
подтверждения и командой приема/передачи. В режиме работы без DMA при
готовности к приему/передаче каждого байта генерируется прерывание. Если
прерывания запрещены, программа может в цикле проверять регистр
состояния (порт 3F4h) до получения подтверждения готовности контроллера
к обмену данными.
По окончании выполнения команды генерируется прерывание,
означающее начало фазы результата. В фазе результата контроллер передает
результаты выполнения команды (байты состояния). Все байты состояния
должны быть считаны, либо необходимо выполнить сброс контроллера,
иначе следующая команда не будет принята. Не все команды имеют фазу
результата, ряд команд выполняется в 2 фазы.
В табл. 1.16 приводится подробное описание команд FDC. Первым
байтом фазы ввода является байт кода команды (КОП), у которого
непосредственно код команды записан в младшей тетраде, а старшая тетрада
может содержать признаки выполнения команды (мультидорожечная, тип
кодирования). Вторым байтом является адресный байт (АДР), который в трех
младших разрядах задает адрес накопителя (биты 0-1) и номер головки(бит
0). Смысл остальных байт фазы ввода см. ниже.
Фаза выполнения помечена знаками "***". Смысл символических
обозначений элементов команд приведен после описания команд. В битовых
масках биты нумеруются справа налево. В фазе результата все байты
результата приведены в той последовательности, в которой они
возвращаются контроллером.
61
1 Дисковые устройства внешней памяти
Таблица 1.16- Форматы команд контроллера НГМД
Команда Фаза ввода Фаш выпол- нения Фаза результата (возвращаемые банты)
КОП MP Банты параметров
1. Чтение данных X*6h Ox’h С, H, R, X, EOT, GPL. DTL *** STO, ST 1, ST2, С, H, R, X
2. Чтение удален- ных данных X*Ch Ox’h С, H, R, X, EOT, GPL, DTL *** STO, STLST2, С, H, R, N
3. Запись данных X25h Ox’h С, H, R, X, EOT, GPL, DTL *** STO, ST1,ST2,C, H. R, N
4. Запись удален- ных данных X29h Ox’h C, H, R, N, EOT, GPL, DTL AAA STO, STI, ST2, С, H, R, X
5. Чтение дорожки X'2h Ox’h С, H, R, N, EOT, GPL, DTL *** STO, STLST2, C , H, R, X
6. Чтение иденти- фикатора сектора X3Ah OX’h *** STO, ST1,ST2,C, H, R, N
7. Форматирова- ние дорожки X5Dh 0X7h X, SC, GPL, D *** STO, STI, ST2, C, H, R, X
^Сканирование до ’’равно” X4lh OX’h С, H, R, X, EOT, GPL, STP *** STO, ST1,ST2,C, H, R,X
9.Сканирование до ’’меньше или равно” X49h OX’h С, H, R, N, EOT, GPL, STP AAA STO, ST I, ST2, < , H, R, X
Ю.Сканированне до ’’больше или равно” XJDh OX’h C, 11, R, N, EOT, GPL, STP AAA STO, ST1,ST2, C, H, R, X
11. Рекалибровать 07h 0XSh AAA
12. Определение 03h (STR HI T}, (HLT ND| AAA
13.Понск OFh Ox’h NCN AAA
14.Чтение состояния прерывания 08h STO, PCX
15.Чтеиие состояния НГМД 04 h OX’h AAA ST3
16. Изменить параметры конфигурации 13h |HDSA MOFF MOX|, |0 EIS EF POLL FIFOTHRj PRETRK AAA
17. Включение/ выключение мотора X*Bh AAA
18. Относ нтель- ный поиск X6Fh Ox’h RCX AAA
19. Вернуть состо- яние регистров OEh AAA PCXO, PCM, PCX2, PCM, |STR HIT), |HLT XD|, SC/EOT, |HDSA MOFF MOX|, |0 EIS EF POLL FIFOTHRj
62
1.4 Управление накопителями гибких дисков
Примечания: Значения старшей тетрады первого байта фазы ввода
(КОП) - Х’=(МТ MF SK 0); Х2=(МТ MF 0 0); Х3=(0 MF 0 0); Х4-(МТ MF SK
1); X-(ON/OFF US1 US0 0); X6=(l DIR 0 0). Значение младшей тетрады
второго байта фазы ввода (АДР) - Х7=(0 HD US1 US0); Х8=(0 0 US1 US0).
Смысловое значение остальных элементов команд:
Биты:
МТ=1 - многодорожечная (двусторонняя операция);
MF=1 - MFM-кодирование (двойная плотность) - пропуск
синхроимпульсов у единичных битов и пропуск синхроимпульсов у нулевых
битов, стоящих после единичных;
SK=1 - пропуск адресного маркера удаленных данных;
HD - номер головки (0 или 1);
US1, US0 - номер накопителя (0 • 3);
ND - режим работы (0 - с использованием DMA, 1 - без использования
DMA;
HDSA = 1 - позволяет изменять временные задержки в зависимости от
скорости вращения дисковода;
EIS = 1 - разрешить автоматический поиск перед чтением/записью
данных, по умолчанию = 0;
EF = 1 - переводит контроллер в режим имитации 8272А;
POLL - 1 - запрещает обращение к устройствам;
ON/OFF - включение/выключение мотора (0/1);
DIR - направление изменения (0-увеличение, 1 -уменьшение).
Поля (в скобках указана длина поля в битах) :
SRT(4) - время скорости шага (переход на соседнюю дорожку) в
миллисекундах (обычно Dh);
HUT(4) - время разгрузки головки (подъем над поверхностью) в
единицах времени по 16 миллисекунд (обычно = Fh);
HLT(7) - время загрузки головки (опускание на поверхность) в единицах
времени по 2 миллисекунды (обычно - 1).
MOFF(3) - задержка перед выключением мотора;
MON(4) - задержка перед включением мотора.
Байты:
С - номер цилиндра;
Н - номер головки;
R - номер сектора;
N - код длины сектора (0 -128, 1 - 256,2 - 512, 3 - 1024 байтов);
EOT - номер последнего сектора на цилиндре;
GPL - длина межзонного промежутка в байтах (обычно 2Ah при обмене
и 50h при форматировании);
DTL - число считываемых/записываемых байт (действительно при N =
0);
63
1 Дисковые устройства внешней памяти
ST0 - ST3 - байты состояния ST0-ST3;
STP - межсекторное смещение в командах сканирования;
NCN - номер цилиндра после поиска;
PCNi - номер текущего цилиндра i-го устройства;
SC - количество секторов на цилиндре;
D - символ-заполнитель для разметки (обычно F6h);
PRETRK - номер дорожки для предкомпенсации (обычно = 0).
RCN - относительный номер цилиндра;
SC/EOT - число секторов на дорожке/номер последнего сектора на
дорожке.
Структура байтов состояния:
1) Байт состояния ST0. Биты:
0-1: номер накопителя (0 - 3);
2: номер головки (после выполнения команды поиска всегда равен 0,
независимо от того, на какой головке осуществлялся поиск);
3:1- НГМД не готов при обмене;
4: 1- Сигнал ’’ошибка” НГМД или дорожка 0 не найдена после 79 шагов
рекалибровки;
5:1- команда поиска завершена;
6-7: код прерывания (00-нормальное завершение команды; 01-
ненормальное завершение; 10-недействительная команда; П-в фазе
выполнения изменилась готовность дисковода).
2) Байт состояния ST1. Биты:
0: 1 - не найден маркер идентификатора сектора;
1:1- дискета защищена от записи;
2: 1 - искомый сектор не найден;
4: 1 - таймаут запросов на передачу данных меньше фактического
времени обмена;
5: 1 - ошибка кода циклического контроля в поле идентификации или в
поле данных;
7: 1 - конец цилиндра (попытка обращения к сектору после обращения к
последнему сектору цилиндра).
3) Байт состояния ST2. Биты:
0:1 - не найден маркер данных или удаленных данных;
1:1- сбойный цилиндр;
2:1- при сканировании не выполнено условие "равно" (бит SN);
3:1- при сканировании выполнено условие "равно” (бит SH );
4:1- неверный номер цилиндра в идентификаторе сектора;
5:1- ошибка кода циклического контроля в поле данных;
6: 1 - в идентификаторе сектора обнаружен адресный маркер удаленных
данных;
7: не используется.
64
1.4 Управление накопителями гибких дисков
4) Байт состояния ST3. Биты:
0-1: номер накопителя;
2: номер головки;
3:1 - сигнал ’’двусторонний” от НГМД;
4:1- сигнал ’’Дорожка 0” от НГМД;
5:1- сигнал ’’Готовность” от НГМД;
6:1- сигнал ’’Защита от записи” от НГМД;
7:1 - сигнал ’’Ошибка” от НГМД.
Особенности выполнения команд контроллера.
Бит МТ (многодорожечная операция) в командах обмена данных и
командах сканирования позволяют выполнять одну команду с обеими
сторонами дискеты. Так значения МТ=1 в команде ’’чтение дорожки” чтение
секторов будет выполнятся от индексного отверстия стороны 0 до последнего
сектора EOT стороны 1. Аналогичным образом (сначала на стороне 0, а
потом на стороне 1) выполняется просмотр информации в командах
сканирования.
При выполнении команд ’’чтение данных” и ’’запись данных” контроллер
загружает головку записи/считывания, головка приближается к поверхности
дискеты, и начинает считывать данные с дорожки. После обнаружения
идентификатора сектора, считывается идентификатор адреса сектора,
(цилиндр, головка, сектор ), и если адрес совпал с адресом, записанным в
команде, происходит чтение/запись данных из/в поле данных данного
сектора. Если передаваемый объем данных (записанный в DMA) больше
одного сектора, номер сектора увеличивается на единицу и операция
продолжается. При чтении сектора, помеченного как удаленный, он
пропускается при бите SK=1 в первом байте команды. Если в команде SK=0
и встретился сектор, помеченный как удаленный, то выполнение команды
прекращается, а в регистре ST2 устанавливается в 1 бит 6.
При N=00h (код длины сектора) байт DTL задает объем данных,
который контроллер обрабатывает как сектор. При N Ф 00h в DTL
записывают обычно FFh.
При обмене данными контроллер НГМД должен обслуживаться
контроллером DMA или центральным процессором (режим работы без DMA)
не реже, чем через 27 мкс (одинарная плотность) или 13 мкс (двойная
плотность) - при чтении, или 31 мкс (одинарная плотность) или 15 мкс
(двойная плотность) - при записи. Если указанные временные интервалы не
выполнены, в байте ST1 устанавливается в единицу флаг переполнения
(четвертый бит) и выполнение команды прекращается.
Команда ’’запись удаленных данных” аналогична команде ’’запись
данных”, но в маркере данных сектора помечаются как удаленные.
65
1 Дисковые устройства внешней памяти
Команда "чтение удаленных данных” аналогична команде ’’чтения”, с
тем отличием, что команда нормально работает (считывает удаленные
данные) при значении SK-0 в первом байте команды.
Команда ’’чтение данных дорожки” аналогична команде ’’чтение
данных", за исключением того, что все сектора считываются непрерывно до
конца дорожки (при МТ=0) или до конца цилиндра (при МТ=1).
В командах "сканирования” с разными условиями сравниваются данные,
прочитанные с дискеты с данными из DMA или центрального процессора
(работа без DMA). Если условие сканирования не выполнилось при чтении
первого сектора, указанного в команде, то номер сектора увеличивается по
выражению
R := R + STP, где STP - межсекторное смещение (9-й байт команд
сканирования).
При задании в команде номера начального сектора R и смещения STP
необходимо следить за тем, чтобы последний сектор EOT был прочитан,
иначе контроллер получит сигнал начала дорожки раньше, чем маркер EOT,
что приведет к ненормальному завершению команды.
Результаты выполнения команд сканирования определяются битами SH
(третий бит) и SN (второй бит) байта состояния ST2 (см. табл. 1.17).
Таблица 1.17 - Состояние битов SH и SN байта ST2
после выполнения команд сканирования
Условие сканирования состояние битов ST2 Результат сканирования
SH(3) SN(2)
равно 1 0 данные равны
0 1 равенство не найдено
меньше или равно 1 0 данные равны
0 0 данные НГМД меньше
0 1 условие < не найдено
больше иля равно 1 0 данные равны
0 0 данные НГМД больше
0 1 условие > не найдено
По команде "поиск” считывается адрес текущего цилиндра (PC) с
дискеты и сравнивается с заданным адресом в команде (С). При не-
совпадении вырабатывается шаговый импульс STEP IN (при РС<С) или STEP
OUT (при РС>С), который вместе с шагом направления
[ 1 при PC < С;
DIR = < Е
[0 при РС>С;
перемещает головку в нужную сторону, после чего сравнение
повторяется.
Выполнение остальных команд не требует дополнительных
комментариев.
66
1.4 Управление накопителями гибких дисков
1.4.3. Работа BIOS с адаптером НГМД
Программное управление системой НГМД осуществляется с помощью
драйвера BIOS, обращение к которому осуществляется через внутренние
прерывания INT 13h. При вызове конкретных функций входные параметры
задаются в регистрах:
АН - номер функции;
DL - номер дисковода;
DH = номер головки;
СН = номер дорожки;
CL = номер сектора;
AL = число передаваемых секторов;
ES:BX - адрес буфера,
после чего и выполняется команда INT 13h.
Всего драйвер поддерживает шесть функций НГМД (с номерами 0-5):
1) Сброс системы НГМД - 0;
2) Прочитать состояние -1;
3) Прочитать сектор - 2;
4) Записать сектор - 3;
5) Проверить сектор - 4;
6) Разметка дорожки - 5.
Все функции выполняются под контролем 11-байтной таблицы
параметров, называемой базовой дисковой таблицей (БДТ). В спецификации
SurePath BIOS предложена 14 байтная структура (см. табл. 1.18).
Эта таблица стандартна, и адрес-указатель на нее хранится в векторе
прерываний lEh. Доступ к БДТ через адресную ссылку дает возможность
оперативно создавать пользовательскую БДТ с необходимыми параметрами в
оперативной памяти путем подмены адреса в векторе прерываний lEh.
Рассмотрим назначение и работу каждой функции:
а) функция 0 - предназначена для приведения в исходное состояние
контроллера НГМД и дисководов. Особенностью функции является то, что
она не оказывает никакого влияния на дискеты, установленные в дисководах.
Обычное ее использование - сброс дисковой системы и рекалибровка головки
после сбоя привода. Кроме того, функция 0 является одним из шагов
процедуры горячего и холодного старта всего ПК.
Функция имеет два входных параметра - номер, задаваемый, как
обычно, в регистре АН, и номер устройства в DL.
Выходные параметры - значения флага CF и регистра АН -
устанавливаются попарно. При CF"0 содержимое регистра АН тоже равно 0,
это признак успешного завершения операции. При CF=1 содержимое АН
всегда не нулевое, здесь сам флаг - признак ошибки, а в регистре АН
содержится код ее расшифровки.
67
1 Дисковые устройства внешней памяти
Таблица 1.18- Базовая дисковая таблица
Смещение Назначение
Oh Биты 0-3 - время разгрузки головок HUT для приводов 1,44 Мбайт по умолчанию F. Биты 4-7 - время перемещепня головок на один шаг SRT, для приводов 1,44 Мбайт но умолчанию D.
1b Бит 0; 1 =DMA не используется (всегда 0) Биты 1 -7 - время успокоения после загрузки головок HLT, для приводов 1,44 Мбайт по умолчанию 0000001.
2h Время выключения мотора после последней операции (в интервалах но 55мс), по умолчанию 25h (2,03 с).
3h Размер сектора: 0=128 байт или в соответствии с байтом 6,1=256 бант, 2=512 байт (стандартный размер), 3=1024банта.
4h Номер последнего сектора на треке БОТ.
5h Межсекторный интервал для операций чтення/записи (GPLl,2Ah для 5м, IBh для 3,5”).
6h Длнна сектора в байтах, если байт 3=0.
7h Межсекторный интервал для операции форматирования трека (GPL2,SOh для 5”, 54h дляЗ,5”).
8h Символ-заполнитель для форматирования (обычно F6h)
9h Время позиционирования головок в мс, по умолчанию OFh (15 мс)
Ah Время разгона двигателя (в интервалах но 125 мс), по умолчанию 8 (1 с)
Bh Максимальный номер трека
Ch Скорость передачи данных
Dh Тип дисковода в CMOS
б) функция 1 - предназначена для подробной расшифровки ошибочных
состояний схем контроллера или конкретного НГМД после сбоя, возникшего
при выполнении операции разметки, записи, чтения или проверки. Входным
параметром для вызова функции является ее номер (1), загружаемый в
регистр АН, и номер устройства в DL. Результат выполнения функции
является возвращаемый байт состояния (см. табл. 1,19).
Таблица 1.19 - Значение байта состояния после выполнения команд
Код ошибки Описание ошибки
80h Ошибка но таймауту
40h Сбой позиционирования
20h Сбой контроллера
10b Сбой данных по чтению (ошибка CRC)
09h Переход границы сегмента контроллером DMA
08h Перенолненне в контроллере DMA
06 h Обращение к дисководу без дискеты
04b Сектор не найден
03h Попытка записи на защищенную дискету
02 h Не найден адресный маркер сектора
Olh Неверная команда контроллеру
Байт состояния возвращается в регистр AL, а не в регистр АН, как в
операциях разметки, чтения, записи и проверки, хотя одинаковые биты
68
1.4 Управление накопителями гибких дисков
байтов состояния имеют один и тот же смысл и для регистра AL, и для
регистра АН.
В рабочей области BIOS отражается оперативная работа системы
НГМД. Она расположена в сороковом параграфе оперативной памяти ПК и
занимает одиннадцать байтов в адресах 0040:003Eh-0040:0048h. Эта область
содержит пять полей - четыре однобайтных и одно семибайтное. Назначение
и описание каждого поля этой области приведены в табл. 1.20.
Таблица 1.20 - Текущее состояние системы НГМД
Адрес Длина Назначение Описание
43ЕЬ 1 Индикатор необходи- мости рекалибровки неред операцией перемещения головки. Биты 0-3 байта соответствуют накопителям 0- 3. Если соответствующий бит равен нулю, рекалибровка необходима.
43Fh 1 Состояние привода Биты 0-3 байта соответствуют накопителям 0-3. Если соответствующий бит равен единице, двигатель занят, т.е. отрабатывает ранее закушенную операцию
440h 1 Счетчик времени работы двигателя Уменьшающийся счетчнк. Перед началом любой операции НГМД устанавливается значение 37h (в тиках таймера), что приблизительно равно 3 с. При каждом прерывании от таймера вычитается 1. Операция прекращается при нулевом состоянпн счетчика
441 h 1 Байт состояния Структура байта соответствует описанию в табл. 1.19
442h 7 Банты уточненного состояния Диагностическая информация
в) функция 2 - предназначена для считывания информации из поля
данных одного или нескольких секторов в оперативную память. С ее
помощью считывается, как правило, несколько секторов. Однако в утилитах
копирования дискет или больших файлов на последовательно
расположенных дорожках считывание производится по целой дорожке.
Функция чтения секторов полностью симметрична функции записи и все, что
сказано о входных и выходных параметрах функции 3, относится к тем же
параметрам функции 2.
г) функция 3 - предназначена для записи информации из оперативной
памяти в поле данных одного или нескольких секторов. Дискета должна быть
предварительно размечена. Функция использует все параметры вызова -
регистры АН, DL, DH, CH, CL, AL, ES:BX (см. выше).
В списке параметров номер дисковода указывается в цифровой форме и
последовательность номеров дисководов 0, 1 соответствует логическим
устройствам А, В. Для жестких дисков номера дисководов указываются как
80h и 81h. Номер головки связывается с номером поверхности дискеты и
69
1 Дисковые устройства внешней памяти
может принимать значения 0 и 1. Номер дорожки в зависимости от модели
дисковода может принадлежать диапазону 0-79. Номер сектора - это номер
первого из секторов, в поле данных которых записываются данные из
оперативной памяти. Параметр количества записываемых секторов ясен по
определению и в объяснении не нуждается.
Адрес буфера памяти, где расположены данные, записываемые на
дискету, формируется суммой содержимого пары регистров ES:BX и должен
быть расположен на границе, кратной параграфу. Если одной операцией
записывается несколько секторов, то в оперативной памяти вся информация
должна располагаться в виде одной непрерывной цепочки символов.
Результат выполнения функции отражается следующими выходными
параметрами:
CF - 0 или 1;
АН = состояние дисковода;
AL = количество записанных секторов;
Если состояние флага переноса (CF) равно нулю, то это значит, что
операция завершена успешно и содержимое регистра АН тоже равно нулю.
Если же флаг переноса равен единице, это свидетельствует о завершении
записи со сбоем, и регистр АН в этом случае содержит байт состояния
дисковода после сбоя. Это состояние совпадает с состоянием, полученным в
результате функции 1. Следует добавить, что содержимое регистра AL при
ненулевых состояниях CF и АН также недостоверно.
д) функция 4 - предназначена для:
- проверки возможности поиска нужного сектора на дорожке;
- считывания информации из поля данных сектора с целью накопления
контрольной суммы и последующего сравнения ее с записанной.
Эта функция во многом совпадает с функцией чтения сектора, но при ее
выполнении никакой информации в память не передается и не записывается.
Поэтому параметр, описывающий адрес буфера памяти парой регистров
ES:BX, не нужен. Основное использование функции - проверка правильности
записи секторов, выполненной ранее с помощью функции 3.
1.4.4. Примеры программирования НГМД
Для работы этих программ на АТ необходимо: ограничить работу
гибкими дисками 360/720 или предусмотреть в тексте установку скорости
вращения и времени предкомпенсации в регистре 3F7h.
Пример 1. Программа выполняет позиционирование "поиск" (переход на
дорожку), введенную пользователем на запрос "Cylinder ?" (процедура seek) и
форматирование данной дорожки (процедура formating).
program disk_formatiiig;
uses dos,crt;
var i:word;
70
1.4 Управление накопителями гибких дисков
oldint:pointer;
flag: boolean;
a:array [1..6] of byte;
data:array [ 1..512} of char;
c:char;
{ Процедура обработки прерывания от гибкого диска }
procedure int_disk;interrupt;
begin
flag:=true;
end;
{ Процедура позиционирования }
procedure seek;
begin
a[l]:«=$f; { Код операции }
a[21:=0; { flag:^false; Выбор дисковода, выбор головки }
port[$3f2]:=$lc; { Включение двигателя дисковода А }
delay(SOO); { Ожидание набора скорости вращения }
{ Пересылка трех бант команды в регистр команд 3F4H }
for i:-l to 3 do
begin { Ожидание готовности НГМД }
repeat until (port[$3f4J and $c0>=$80;
port[$3f5J:=a[i]; { Пересылка в порт байта команды }
end;
repeat until flag; { ожидание прерывания от НГМД }
port[$3f2]:=$4; { Выключение двигателя дисковода А }
end;
{ Процедура форматирования 1
procedure formating; begin
a[l]:=$4d; { Код операции }
a[2]:=t>; { Выбор дисковода, выбор головки 1
M3]:=2; { Код размера сектора - 512 байт }
a[4]:=$f; { Количество секторов на цилиндре 1
a[5]:=$54; { Размер межсекторного промежутка 1
a|6|:=$F6; { flag:=false; Данные для заполиеиня сектора }
port[$3f2]:=$lc; { Включение двигателя дисковода А }
delay(500); { Необходимая задержка }
for i:=l to 6 do { Ввод в цикле 6-ти байтов команды }
begin
repeat until (port[$3f4] and $c0)=$80;
port[$3f5]:-afi];
end;
for i:=l to 7 do { Чтение байтов результата }
begin
repeat until (port[$3f4]and ScO)=$cO; { ожидание готовности }
writeln(’of ,port[$3f5J); { чтение STO,ST1,ST2,C,H,R,N }
71
1 Дисковые устройства внешней памяти
end;
port|$3f2|:-$4; { выключение двигателя дисковода А }
end; { Начало основной программы }
BEGIN i:=0; GetlntVec ($e, oldint); { сохранение вектора Eh }
setintvec ($e,@int_disk); { перенаправление вектора }
{ ввод данных для форматирования (номер цилиндра) }
writeInCcylinder?1); readln(a[3]); { NCN команды "поиск" }
writefinput new disk and press <ENTER>*);
readln;
seek;
formating;
setintvec($e,oldint); { восстановление вектора }
END.
Пример 2. Программа выполняет позиционирование на заданную
дорожку и выполняет команду "чтение удаленных данных" из заданного
сектора с использованием DMA (процедура DMA). Результаты работы
выводятся на экран,
program disk_rd_dec_sek;
uses dos,crt;
var i:word;
oldint: pointer;
flag: boolean;
a:array [1—9J of byte;
data:array [ 1..512J of byte;
{ Здесь размещаются тексты процедур intdisk, seek примера 1 }
{ Процедура программирования контроллера DMA }
procedure dma;
begin
asm
mov dx^eg data[l] ; сегмент массива данных
mov bx,offset datafl] ; смещение массива данных
mov ax,dx ; формирование 1 ^разрядного адреса
mov cl,4 ; микросхемы DMA и 4-разряд иого ад-
shr ah,ci ; реса номера страницы
mov cl,4
shl dx,cl
clc
add dx,bx
jnc @go
inc ah
@go:
mov a!,46h ; константа режима
lock out Obh,al ; режим работы канала 2
72
1.4 Управление накопителями гибких дисков
mov al,ah lock outSlb^l ; задание номера страницы
mov al,l lock outOch,al ; сброс триггера-защелки
mov al,dl lock out 4b,al ; младшая часть 16-разрядного адр.
mov al,dh lock out 4h,al ; старшая часть 16-разрядного адр.
mov al,l lock out Och,al ; сброс триггера-защелки
mov al,Offh lock out 5h,al mov al,l ; младшая часть счетчика циклов
lock out 5b,al mov яЦ ; старшая часть счетчика циклов
lock out Oah,al end; end; ; разрешение работы канала 2
{ Чтение удаленных данных }
procedure rd_del_sek;
begin
{ задание 7 бант команды. а|3| и a|5J вводятся в основной программе )
а[1]:=$4с; { байт 1 }
а(2]:=0; { байт 2 }
а[4]:=0; { н }
а[6]:=2; { N }
а[7):=9; { EOF }
а[8]:=$1Ь; { GPL }
aI9]:-$ff; { DTL }
port[$3f2]:=$lc; { включение двигатели дисковода А }
delay(SOO); { необходимая задержка )
{ ввод 9-ти байт команды }
for i:=l to 9 do
begin
repeat until (port[$3f4]and Sc0)=$80; { ожидание готовности }
port[$3f5):=a(i];
end;
{ чтение фазы результата STO, STI, ST2, С, H, R, N }
for i:=t to 7 do
begin
repeat until (port[$3f4Jand ScO>=$cO; { ожидание готовности }
writelnfo: ’,port[$315|);
end;
port[S3f2];=$4; { выключение двигателя дисковода A }
end;
{ Начало основной программы }
BEGIN
GetlntVec ($e,oldint); { сохранение вектора }
73
1 Дисковые устройства внешней памяти
setintvec ($e,@int_disk); { перенаправление вектора }
for i:®l to 512 do data(i]:=O;
{ ввод исходных данных (цилиндр н сектор) }
writelnfcylinder?*); readln(a[3]); writelnfsektor?’); readln(a[5]); seek; { позиционированне(поиск) }
dm a; { программирование DMA }
rddelsek; { чтение удаленных данных }
{ вывод прочитанных значений сектора из массива data }
for i:=l to 512 do write(chr(data[i]));
setintvec($e,oldint);
END.
Пример 3. Программа выполняет команду чтения первого встреченного
идентификатора сектора и при успешном завершении команды, результат
выводится в байтах фазы результата.
{ Процедура чтения идентификатора сектора }
procedure rd_id;
var i:word;
jibyte;
begin
i:==0;
port[$3f2]:=$lc; { включение двигателя дисковода A }
de!ay(500); { while (port[$3f4]and Sc0)o$80 do { begin inc(i); delayfl); { end; port[$3f5]:=$4a; { while (port[$3f4]and $c0)<>$80 do { begin inc(i); delay (1); { end; portf$3f5}:=0; { необходимая задержка } ожидание готовности } необходимая задержка } ввод нервого байта команды } ожидание готовности } необходимая задержка } ввод второго байта команды }
{ чтение фазы результата }
for j:=l to 7 do
begin
while (port[$3f4]and $сО)о$св do
begin
inc(i);
delayfl);
end;
writeln(j,*:\i,7,port[$3f5]);
end; portfSJCJ^c; { выключение двигателя дисковода А }
74
1.4 Управление накопителями гибких дисков
end;
Пример 4. Программа выполняет позиционирование на заданную
дорожку и выполняет команду "чтение сектора" с использованием DMA.
program diskrdsec;
uses dos,crt;
var i:word;
oldi nt: pointer;
flag: boolean;
a:array [1..9J of byte;
data:array [L.512J of byte;
{ Здесь помещаются тексты процедур int_disk, seek и DMA }
{ Чтение данных из поля данных сектора }
procedure rdsek;
begin
{ задание 7 байт команды }
a[l|:=$46; { бант 1 }
a[2]t=0; { байт 2 }
a[4]:~0; { H }
a[6]:=2; { N }
a(7]:=9; { EOT }
a[8j:=Slb; { GPL }
a|9|:=$fT; { DTL }
port[$3f2]:=$lc;
delay(SOO);
for i:=l to 9 do
begin
repeat until (port[$3f4)and Sc0)=$80;
port[$3f5J:“a[i]; { ввод 9-ти байт команды }
end;
{ вывод фазы результата }
for i:=l to 7 do
begin
repeat until (port|$3f4]and ScO)==$cO;
writelufo: *,port[$3C5|);
end;
port[$3f2]:=is$4;
end;
{ Основная программа }
BEGIN
GetlntVec ($e,o!dint);
setintvec ($e,@int_disk);
{ обнуление массива data }
for i:=l to 512 do data[i]:=0;
{ ввод значения цилиндра и сектора }
writeinfcylinder?’);
readln(a[3]);
writelnfsektor?*);
readln(a(5});
75
1 Дисковые устройства внешней
seek;
dma;
rd sek; M _
f ~ „считанного командой результата из Data }
{ ВЫВОД II
for i:»l to 512 do write(chr(data(i]));
writein;
setintvec($e,oldint);
END,
Пример 5. Программа ВЬ|полняет позиционирование на заданную
включает чтение i’cex сектоР°в дорожки (команда чтения
на
дорожку и -------------- -------- -
дорожки) с использованием пр°цедУРы DMA’ запрограммированной
передачу 9*512 байт.
program disk_rd_tr;
uses dos,crt;
var iiword;
old hit: pointer;
flag: boolean;
a:array Ц..9] of byte;
data:array [1..4608] of byte;
{ Здесь размещаются тексты setk
{ Данная процедур. DMA1 передачу данных
{ ------------------------------------—
procedure dmal;
begin
asm
mov ।
mov i
mov
mov <
shr
mov cl,4
shl dx,cl
clc
add dx,bx
jnc @go
inc ah
@go:
mov al,46h
lock out Obh,al
mov al,ah
lock out 81 h,al
mov al,l
lock out Ocb,al
mov al,dl
lock out 4h,al
mov al,dh
lock out 4h,al
mov al,l
в^й дорожки 9 * 512 байт
}
}
}
dx,seg dataf 11
bx,offset datafl]
ax,dx
cl,4
ah,cl
сегмент массива данных
»
. смещение массива данных
формирование 16-разрядного адреса
. микросхемы DMA и 4-раз ряд и о го ад-
реса номера страницы
, ^оистанта режима
, режим работы канала 2
. «ядание номера страницы
. ;брос триггера-защелки
. младшая часть 16-разрядного адр.
. тартая часть 16-разрядного адр.
76
1.4 Управление накопителями гибких дисков
lock out 0ch,al ; сброс триггера-защелки
mov al^Offh lock out 5h,al mov al^ll lock out 5h,al mov а!Д lock out 0ab,al end; end; ; младшая часть счетчика циклов ; старшая часть счетчика циклов ; разрешение работы канала 2
{ procedure rd tr; begin Процедура чтения дорожки }
{ a|lj:=$42; a[2}:=0; a[4]:=0; a(6]:=2; a[7J:=9; a[8|:=Slb; a[9|:=$ff; задание 7 байт команды }
port($3f2j:==$lc; delay(500); for i:=l to 9 do { включение двигателя }
begin
repeat until (portf$3f4jand Sc0)=$80;
port{$3f5]:=a[ij;
end;
for i:=l to 7 do
begin
repeat until (port[$3f4}and $cO)=$cO;
writeln('o:’,port[$3f5]);
end;
port($3f2J:=$4;
end;
{ Начало основной программы }
BEGIN
GetlntVec ($e,oldint);
setintvec ($e,@int_disk);
for i:=l to 4608 do data[i):=0; { обнуление массива Data }
{ ввод данных номер цилиндра н номер сектора }
writelnfcylinder?’);
readki(a[3]);
writelnfsektor?*);
reading [5]);
seek;
dmal;
rdtr;
{ вывод результата работы команды из массива Data }
77
1 Дисковые устройства внешней памяти
for i:=l to 4608 do
begin
if frac(i/512)==0 then writeln(’New sektor');
if (data[i|ol0)or(data[ijol3) then write(chr(data[ij));
end;
setintvec($e,oldint);
END.
Пример 6. Программа выполняет позиционирование на заданную
дорожку и запись данных в указанный сектор из массива Data с
использованием DMA.
program disk;
uses dos,crt;
var i:word;
oldint: pointer;
flag: boolean;
a:array [1..9] of byte;
datazarray (1.-512] of char;
e:char;
{ Здесь размещаются тексты процедур int_disk, seek и DMA }
{ Процедура записи сектора }
procedure wr_sek;
begin
a(l(:==$45;
a(2]:=0;
a[4}:=0;
a[6]:=2;
a[7}:=9;
a[8]:~$lb;
a[9|:=$ff;
port[$3f2]z~$lc;
delay(500);
for i:=l to 9 do
begin
repeat until (port[$3f4]and Sc0)=$80;
port[$3f5]:=a[i];
end;
for i:-l to 7 do
begin
repeat until (port[$3f4]and ScO)=$cO;
writeln(’o:’,port[$3f51);
end;
port($3f2]:=$4;
end;
{ Начало основной программы }
BEGIN
i:=0;
GetlntVec ($e,oldint);
setintvec ($e,@int_disk);
{ ввод данных в массив data для записи в указанный сектор }
writelnflnput data for writeing sektor’);
78
1.4 Управление накопителями гибких дисков
repeat
с thread key;
if cochr(O) then
begin
write(c);
inc(i);
data[i]:=c;
end;
until (c=chr(0))or(i=512);
writelnfcylinder?*);
readln(a[3|);
writclnfsektor?*);
readln(a[5]);
writefinput new disk and press <ENTER>’);
readin;
seek;
dma;
wrsek;
setintvec($e,oldint);
END.
1.4.5. Контрольные вопросы
1. Какие функции выполняет контроллер НГМД.
2. Структура контроллера НГМД. Назначение основных модулей.
3. Через какие порты ввода/вывода происходит управление
контроллером НГМД. Назначение битов.
4. Какова структура команд управления НГМД. Что делает процессор
(ДМА) и контроллер в фазах ввода, выполнения и результата.
5. Объясните особенности выполнения команды обмена данными
контроллера НГМД.
6. Какова структура байтов состояния.
7. Особенности выполнения многодорожечных операций.
8. Как выполняются команды сканирования, каким условиям должен
удовлетворять атрибут STP- межсекторное смещение.
9. Какие дополнительные возможности обеспечивает управление
контроллером через порт 3F7.
10. Назначение базовой дисковой таблицы, где она находится и ее
структура.
11. Какие функции BIOS обеспечивают управление НГМД.
12. Как задаются входные параметры функций INT 13h и их структура.
13. Напишите фрагмент программы вызывающей функции прерывания
INT 13h.
14. Для заданной функции INT 13h объясните ожидаемые результаты,
где они располагаются и их структура.
79
1 Дисковые устройства внешней памяти
1.5. Управление накопителями жестких дисков
Управление накопителями жестких дисков НЖМД выполняется
контроллером жестких дисков, который, как отмечалось в п.1.1 Л, является
интеллектуальным устройством. Современные контроллеры должны
работать с внутренней геометрией диска (при зонной организации диска), их
архитектура и возможности управления на стыке контроллер-накопитель
определяется фирмам и-про из во дител ям и устройств внешней памяти и не
стандартизированы. Поэтому контроллеры физически размещаются на
накопителе (контроллеры жестких дисков младших моделей ПК размещались
на материнской плате), и возможность управления контроллером со стороны
процессора (работа с внешней геометрией) определяется интерфейсом
НЖМД. Для жестких дисков внутреннего исполнения стандартным является
интерфейс ATA/ATAPI, к которому подключаются не только жесткие диски,
но и другие устройства внешней памяти, в том числе и со сменными
носителями (оптические диски CD, ZIP-дискеты и др.). Интерфейс АТА
является развитием интерфейса ГОЕ (интерфейс жестких дисков младших
моделей ПК). Современные ПК имеют 2 канала АТА, каждый из которых
может обслуживать до двух устройств (0-ведущее, 1-ведомое).
Если к шине АТА подключено одно устройство, оно должно быть
ведущим. Если подключены два устройства, одно должно быть ведущим,
другое - ведомый. Тип устройства (ведущее или ведомое) задается на
устройстве с помощью конфигурационных джамперов, или применяется
’’кабельная выборка” (тип устройства определяется его положением на
ленточном кабеле).
Оба устройства воспринимают команды от процессора (хост-адаптера)
одновременно. Однако выполнять команду будет лишь выбранное
устройство. Выводит выходные сигналы на шину АТА только выбранное
устройство. Такая система подразумевает, что начав операцию обмена с
одним из устройств, хост-адаптер не может переключиться на обслуживание
другого до завершения начатой операции.
Непременным компонентом устройства является буферная память. Ее
наличие позволяет выполнять обмен данными в темпе, предлагаемом хост-
адаптером (в пределах возможности устройства), без учета внутренней
скорости передачи данных между носителем и буферной памятью.
Для устройств ГОЕ существует несколько разновидностей интерфейса:
- АТА - 16-битный интерфейс подключения к шине компьютера АТ (40-
проводный сигнальный и 4-проводный питающий интерфейс);
- PC Card АТА - 16-битный интерфейс блокнотных PC;
- MCA ГОЕ (16 бит) - 72-проводный интерфейс PS/2;
80
1.5 Управление накопителями жестких дисков
- АТА-2 - расширенная спецификация АТА. Включает 2 канала, 4
устройства, РЮ Mode3, Multiword DMA Mode 1, Block mode, объем диска до
8 Гбайт, поддержка LBA и CHS;
- Fast АТА-2 разрешает использовать Multiword DMA Mode 2 (13,3
Мбайт/с), РЮ Mode 4;
- АТА-3 - расширение АТА-2. Включает средства парольной защиты,
улучшенного управления питанием, самотестирования с предупреждением
приближения отказа - SMART;
- ATA/ATAPI-4 - расширение АТА-3, включающее режим Ultra DMA со
скоростью обмена до 33 Мбайт/с и пакетный интерфейс ATAPI. Появляется
поддержка очередей и возможность перекрытия команд;
- ATA/ATAPI-5 - ревизия ATA/ATAPI-4: удаляются устаревшие
команды и биты, добавляются новые возможности. Включает режим Ultra
DMA со скоростью обмена до 66 Мбайт/с.;
- ATA/ATAPI-6 - дополнения к ATA/ATAPI-5: потоковое расширение
для чтения/записи аудио- и видеоданных, управление акустическим шумом,
режим Ultra DMA со скоростью обмена до 100 Мбайт/с.
- E-IDE (Enhanced IDE) - расширенный интерфейс, введенный фирмой
Western Digital. Реализуется в адаптерах для шин PCI и VLB. Позволяет
подключать до 4 устройств (к двум каналам), включая CD-ROM и стриммеры
(ATAPI). Поддерживает РЮ Mode 3, Multiword DMA Mode 1, объем диска до
8 Гбайт LBA и CHS. С аппаратной точки зрения практически полностью
соответствует спецификации АТА-2;
- Serial АТА - последовательный интерфейс АТА, логически совместим
с параллельными АТА, но с другим электрическим интерфейсом. Цель
перехода на последовательный интерфейс - улучшение и удешевление
кабелей и коннекторов, улучшение условий охлаждения, облегчение
конфигурирования устройств.
Устройства АТА IDE, E-IDE, АТА-2, Fast АТА-2, АТА-3, ATA/ATAPI-4,
ATA/ATAPI-5 и ATA/ATAPI-6 электрически совместимы. Степень
логической совместимости достаточно высока (все базовые возможности
АТА доступны).
1.5.1. Электрический интерфейс IDE/ATA
Электрический интерфейс IDE/АТА представляет собой ленточный
кабель. Все сигналы являются логическими со стандартными ТТЛ-уровнями.
Информационные сигналы передаются через 40-контактный разъем. Состав
информационных сигналов интерфейса АТА приведен в табл. 1.21.
Начиная с ATA/ATAPI-4 в шлейфах узаконили кабельную выборку и
для подключения устройства-1 определили средний коннектор. В нем
контакт 28 либо не соединен с проводом, либо просто отсутствует.
81
1 Дисковые устройства внешней памяти
Для устойчивой работы в режиме Ultra DMA применяются 80-
проводные кабели, обеспечивающих чередование сигнальных цепей и
проводов схемной земли.
Таблица 1.21 -"Интерфейс АТА (IDE)
Сигнал T«h* Контакт Контакт Тип’ Сигнал
RESET# - 1 2 GND
DD7 I/OTS 3 4 I/OTS DD8
DD6 I/OTS 5 6 I/OTS DD9
DD5 I/OTS 7 8 I/OTS DD10
DD4 170 TS 9 10 I/OTS DD11
DD3 I/OTS 11 12 I/OTS DD12
DD2 I/OTS 13 14 I/OTS DD13
DD1 I/OTS 15 16 I/OTS DD14
DD0 I/OTS 17 18 VOTS DD15
GND 19 20 Ключ
DMARQ OTS1 21 22 GND
DlOWtf/STOP3 I 23 24 GND
DIOR#/HDMARDY# «STROBE3 I 25 26 GND
IORDY/DDMARDY# ©STROBE3 OTS1 27 28 I/O SPSYNC/CSEL7
DMACK# I 29 30 GND
INTRQ OTS1 31 32 О OK IOCS16#’
DAI I 33 34 I,04 PDIAG#/CBI.1DJ
DAO I 35 36 I DA2
CSO# I 37 38 I CS1#
DASP# VOOKS 39 40 - GND
+-§ В (Logic) - 41* 42‘ 4-5 B(Motor)
GND - 43* 44* Зарезервирован
Примечания. 1 - тип сигнала для устройства: I - вход, О - выход, I/O -
двунаправленный, TS - тристабильный, ОК - открытый коллектор. Для хост-
адаптера значения I и О имеют противоположный смысл.
2 - у старых устройств сигнал может иметь тип ОК (при разнотипных
сигналах на одной шине возможен конфликт).
3 - сигналы, приведенные после символа /, используются только в
режиме Ultra DMA (АТА-4).
4 - у ведущего устройства - вход, у ведомого - выход.
5 - У ведомого устройства - только выход.
6 - Контакты 41-44 используются только для миниатюрных дисков,
7 - Начиная с АТА-3 - только CSEL.
8 - Начиная с АТА-3 зарезервирован.
Сигналы имеют следующее назначение:
82
1.5 Управление накопителями жестких дисков
RESET# (Device Reset) - сброс устройства (инвертированный сигнал
сброса системной шины).
DA(2:0) (Device Address) - три младших бита системной шины адреса,
используемые для выбора регистров устройств.
DD(15:0) (Device Data) - двунаправленная 16-битная шина данных
между адаптером и устройствами. При 8-битных обменах используются
младшие биты D(7:0).
DIOR# (Device I/O Read) - строб чтения портов ввода/вывода. Данные
фиксируются по положительному перепаду сигнала.
DIOW# (Device I/O Write) - строб записи портов ввода/вывода. Данные
фиксируются по положительному перепаду сигнала.
IORDY (I/O channel Ready) - готовность устройства завершить цикл
обмена. Сигнал требуется при обмене в РЮ Mode 3 и выше.
IOCS-16# - разрешение 16-битных операций.
DMARQ (DMA Request) - запрос обмена по каналу DMA.
DMACK# (DMA Acknowledge) - подтверждение DMA,
INTRQ (Interrupt Request) - запрос прерывания. Запрос сбрасывается по
сигналу RESET#, установке бита SRST в регистре Device Control, записи в
регистр команд или чтении регистра состояния.
CSO# (Chip Select 0) - сигнал выбора блока командных регистров. Для
первого канала он вырабатывается при наличии на системной шине адреса
порта ввода/вывода в диапазоне IFOh - lF7h.
CS1 # (Chip Select 1) - выбор блока управляющих регистров. Для
первого канала он вырабатывается при наличии на системной шине адреса
порта ввода/вывода в диапазоне 3F0h - 3F7h.
PDIAG# (Passed Diagnostics) - сигнал о прохождении диагностики.
Сигнал служит только для связи двух устройств и хост-адаптером не
используется.
CBLID# (Cable assembly type identifier) - идентификация типа кабеля. В
80-проводной сборке контакт 34,на разъеме хост-адаптера соединяется с
шиной GND, а контакты 34 разъемов устройств соединяются между собой,
но связи с разъемом хост-адаптера не имеют. На устройстве эта линия через
резистор 10 кОм должна подключаться к шине питания. После прохождения
сброса (когда сигнал PDIAG# снимается) хост может определить наличие 80-
проводного кабеля по низкому уровню сигнала.
DASP# (Device Active, Slave Present) - сигнал двойного назначения:
индикатор активности устройства и присутствия ведомого устройства. После
сброса по сигналу RESET# или при инициализации по включении питания
оба устройства в течение 1 мс должны деактивировать этот сигнал, после
чего не позже, чем через 400 мс, его вводит ведомое устройство для
сообщения о своем присутствии. Ведущее устройство не активирует этот
сигнал в течение 450 мс.
83
1 Дисковые устройства внешней памяти
SPSYNC/CSEL (Spindle Synchronization/Cable Select) - синхронизация
шпинделя/выборка кабелем. Сигнал двойного назначения, которое должно
быть единым для обоих устройств. Сигнал SPSYNC позволяет
синхронизировать шпиндели устройств (актуально для RAID-массивов);
используется по усмотрению производителя накопителя, начиная с
ATA/ATAPI-3 из спецификации изъят. Сигнал CSEL позволяет устройствам
определять свой адрес по положению на специальном кабеле с разрывом
провода 28 между разъемами двух устройств (малораспространенная
«кабельная выборка»). Эта линия на хост-адаптере заземлена, и ведущее
устройство получает заземленную линию, а ведомое - неподключенную. На
устройстве линия подтягивается к высокому уровню резистором 10 кОм.
Состояние сигнала (если он управляется хост-адаптером) должно
удерживаться по крайней мере 31 с после сигнала RESET#.
При использовании режима Ultra DMA четыре линии получают новое
назначение сигналов:
- STOP (Stop Ultra DMA burst) - останов передачи пакета Ultra DMA.
- DDMARDY# (Device Ultra DMA ready) - готовность устройства при
приеме пакета Ultra DMA (управление потоком).
- DSTROBE (Host Ultra DMA data strobe) - строб данных устройства при
передаче пакета хосту. Данные передаются по обоим перепадам DSTROBE.
- HDMARDY# (Host Ultra DMA ready) - готовность хоста при приеме им
пакета Ultra DMA (управление потоком).
- HSTROBE (Host Ultra DMA data strobe) ~ строб данных хоста при
передаче пакета устройству. Данные передаются по обоим перепадам
HSTROBE.
1.5.2. Регистры устройств и режимы передачи данных
Адаптер АТА на материнской плате содержит только буферы сигналов
шины и дешифратор зоны адресов. Все регистры контроллера и схемы
кодирования размещены в самом устройстве. Шина АТА требует выделения
системных ресурсов ~ адресного пространства портов ввода/вывода, линии
прерывания и канала DMA. Первым двум каналам выделили ресурсы IDE
контроллеров жестких дисков. Позже определили ресурсы еще для двух
каналов (табл. 1.22).
Из табл. 1.22 видно, что для каждого канала определены два диапазона
адресного пространства ввода/вывода, которые задаются сигналами CS0# и
CS1# из которых активным (низкий уровень, «0») может быть только один.
Адресация регистров внутри диапазонов выполняется тремя младшими
разрядами шины адреса (сигналы DA2 - DA0). Направление передачи
задается сигналами DIOR# и DIOW#.
84
1.5 Управление накопителями жестких дисков
Традиционному контроллеру жестких дисков выделялся канал DMA3,
но он является 8-битным, в то время как шина АТА требует 16-битного
канала DMA. Производительности стандартных каналов DMA для шины
АТА явно недостаточно.
Таблица 1.22 - Системные ресурсы каналов АТА
Кивал CS0# CSl# IRQ
1 IFOh-lF7h 3F6h-3F7h 14
2 170h - 177h 376h-377h 15 или 10
3 lE8h-lEFh ЗЕЕЬ-3£Fb 12 или 11
4 168h - 16Fh 36Eh-36Fh 10 или 9
Современные системные платы оснащаются высокопроизводительными
контроллерами шины АТА, обеспечивающими прямое управление шиной
PCI при обмене с устройствами в режимах DMA и Ultra DMA. Прямое
управление шиной повышает суммарную производительность компьютера в
многозадачных и многопоточных операционных системах. Сами по себе
режимы DMA не дают выигрыша в скорости обмена по шине АТА - только
режимы Ultra DMA Mode 1 и старше превосходят по скорости PIO Mode 4
(см. ниже), однако обмен в режиме DMA значительно меньше загружает
центральный процессор, и параллельно с дисковым обменом процессор
может заниматься обработкой других задач.
Поскольку контроллеры АТА подключаются к 32-разрядной шине PCI, в
них ввели возможность обращения к регистру данных АТА двойными
словами. При этом за одну 32-битную операцию процессора и шины PCI по
шине АТА последовательно передаются два 16-битных слова.
Каждое устройство АТА имеет стандартный набор регистров, (см.
табл. 1.23) который состоит из двух блоков, выбираемых сигналами CS0# и
CS1#.
Альтернативный регистр состояния AS (3F6h) имеет те же биты, что и
основной (см. ниже lF7h), но его чтение не приводит ни к каким изменениям
состояния устройства.
Регистр управления устройством DC (3F6h). Назначение бит:
3-7: зарезервированы;
2 (SRST): 1 ~ программный сброс (воспринимают оба устройства);
1 (nlEN): 0 - разрешено прерывания;
0: равен 0.
Регистр адреса устройства DA (3F7h) использовался только в первой
версии АТА для совместимости со старыми контроллерами. Регистр
совпадает с диагностическим регистром состояния контроллера НГМД (см.
табл. 1.15), у которого бит 7 является признаком смены дискеты. Назначение
бит.
85
1 Дисковые устройства внешней памяти
7 (HiZ): высокоимпедансный, при считывании не выдается на шину;
6 (nWTG): 0 - признак записи;
5-2 (nHS[3 - 0]): - номер головки (инверсные биты);
1-0 (nDS[ 1 - 0]): - выбор устройства (10-0, 01- устройство 1).
Таблица 1.23 - Регистры контроллеров устройств АТА
Адрес для канала №1 Назначение (R - чтение, W - запись)
3FXh Control Block Registers - регистров (CSO# ~1, CSl#*#)
3F6h R: Alternate Status (AS) - альтернативный регистр состояния
3F6h W: Device Control (DC) - регистр управления устройством
3F7h R: Drive Address (DA) - регистр адреса (не используется)
IFXh Command Block Registers - блок командных регистров (CSO# CS1#~1)
IFOh R/W: Data (DR) - регистр данных
IFlh R: Error (ER) - регистр ошнбок
IFlh W: Features (FR) - регистр свойств
lF2h R/W: Sector Count (SC) - регистр счетчика секторов
lF3b R/W: Sector Number (SN) - регистр номера сектора /LBA (7 - 6)
lF4h R/W; Cylinder Low (CL) - регистр младшего байта номера цилиндра/ LBA (15-8) . . ....
IFSh R/W: Cylinder High (CH)- регистр старшего байта номера цилиндра/ LBA (23-16)
lF6h R/W: Device/Head (D/H) - регистр номера устройства и головки/ЬВА(27 - 24)
lF7h R: Status (SR) - регистр состояния
lF7b W: Command (CR) - регистр команд
Регистр данных. DR (IFOh) может использоваться как 8-битный или 16-
битный в зависимости от типа данных, передаваемых в текущей команде.
Обращение к этому регистру происходит в режиме обмена РЮ. В режиме
DMA обмен данными происходит через порт данных, при этом активны
DMARQ и DMACK#, a CSO# и CS1# неактивны.
Регистр ошибок ER (IFlh) хранит состояние выполнения последней
операции. Назначение бит:
7: зарезервирован;
6 (UNC): 1 - неисправимая ошибка данных;
5 (МС): 1 - смена носителя. После смены носителя первая команда
обращения отвергается и устанавливается данный бит. После сброса бита
следующие команды будут выполняться нормальным образом;
4 (IDNF): 1 - не найден идентификатор сектора;
3 (ABRT): 1 - команда отвергнута как недействительная;
2 (MCR): 1- индикатор запроса смены носителя;
1 (TK0NF): 1 - по команде Recalibrate не удалось найти нулевой трек;
0 (AMNF): 1 - не найден адресный маркер данных в заголовке сектора.
86
1.5 Управление накопителями жестких дисков
Регистр свойств FR (IFlh) используется в зависимости от команды. В
команде Set Features через него задается код подкоманды. До принятия АТА-
2 в этот регистр помещали значение номера цилиндра для предкомпенсации
записи.
Регистр счетчика секторов SC (lF2h) содержит число секторов,
участвующих в обмене. При успешном завершении операции регистр должен
обнулиться. При ошибке регистр содержит число не переданных секторов.
Регистры номера сектора SN (lF3h), номера цилиндра - младшего CL
(lF4h) и старшего байта CH(lF5h) - имеют двоякое назначение в зависимости
от выбранной системы адресации (CHS или LBA).
Регистр номера устройства и головки D/H (lF6h) кроме хранения части
адресной информации служит для выбора ведущего или ведомого устройства
и метода адресации. Назначение бит:
7 и 5: вплоть до АТА-3 должны были быть единичными, в АТА/АТAPI-
их объявили устаревшими;
6 (L): 1 - режим адресации LBA, 0 - режим CHS;
4 (DEV): выбор устройства (0 - ведущее, 1 - ведомое);
3-0: В режиме CHS - номер головки, в режиме LBA - старшие биты
логического адреса.
Регистры SN, CH, CL, D/Н инициализируются хост адаптером, а в
случае возникновения ошибки при операции устройство поместит в них
адрес, по которому встретилась ошибка.
Регистр состояния SR (lF7h) отражает текущее состояние устройства в
процессе выполнения команд. Назначение бит:
7 (BSY): 1 - устройство занято выполнением команды;
6 (DRDY): 1- готовность устройства к восприятию любых кодов команд;
5 (DF): 1 - индикатор отказа устройства;
4 (DSC): 1 - индикатор завершения поиска трека;
3 (DRQ): 1 - индикатор готовности к обмену словом или байтом данных;
2 (CORR): 1 - индикатор исправленной ошибки данных;
1 (ШХ): 1 - сигнал индекс;
0 (ERR): 1 - индикатор ошибки выполнения предыдущей операции.
Дополнительная информация содержится в регистре ошибок.
Регистра команд CR (lF7h) служит для записи команд (предварительно
должны быть заданы все параметры команды в регистрах IFlh - lF6h).
Устройство начинает исполнять команду сразу, как только ее код записан в
данный регистр.
Режимы передачи данных. Программа общается с устройствами АТА
через регистры, используя инструкции ввода/вывода IN и OUT. Для передачи
данных с максимальной скоростью применяют программный доступ к
регистру данных или DMA. Программный доступ РЮ (Programmed
Input/Output) выполняется в виде следующих друг за другом операций чтения
87
1 Дисковые устройства внешней памяти
или записи в пространстве ввода/вывода по адресу регистра данных(1Р0Ь для
первого канала).
Готовность устройства проверяется перед началом передачи блока,
после чего хост производит серию операций в определенном темпе. Темп
определяется выбранным режимом РЮ Mode 0-4, для каждого режима
определены допустимые параметры временной диаграммы цикла обмена (см.
табл. 1.24).
Обмен РЮ программно реализуется с помощью процессорных
инструкций ввода/вывода строк REP INS или REP OUTS.
Устройство может затормозить обмен, используя сигнал готовности
IORDY. Программный обмен на все время передачи блока занимает и
процессор, и системную шину.
Таблица 1.24 - Параметры режимов передачи
Режим передачи Минимальное время цикла, нс Скорость передачи, Мбайт/с Интерфейс
РЮ mode 0 600 33 АТА
РЮ mode 1 383 53 АТА
РЮ mode 2 240 83 АТА
РЮ mode 3 180 11,1 E-IDE, АТА-2
РЮ mode 4 120 16,6 E-IDE, FastATA-2
Singleword DMA Mode 0 960 2,08 АТА
Singleword DMA Mode 1 480 4,16 АТА
Singleword DMA Mode 2 240 833 АТА
Multiword DMA Mode 0 480 4,12 АТА
Multiword DMA Model 150 133 АТА-2
Multiword DMA Mode 2 120 16,6 FastATA-2
Ultra DMA Mode 0 120 16,6 ATA/ATAPI-4
Ultra DMA Model 80 25 ATA/ATAPI-4
UitraDMAMode2 60 33 ATA/ATAPi-4
Ultra DMA Mode3 45 44,4 ATA/ATAPI-5
Ultra DMA Mode 4 30 66,6 ATA/ATAPI-5
Ultra DMA Mode 5 20 100 ATA/ATAPI-6
В пакете данных режима Ultra DMA за каждый такт передаются два
слова данных, один по фронту синхронизирующего сигнала, другой по спаду.
Период следования синхросигналов равен удвоенному времени цикла.
Обмен по каналу DMA занимает исключительно шины ввода/вывода и
память. Процессору требуется выполнить только процедуру инициализации
канала, после чего он свободен до прерывания от устройства в конце
передачи блока. Стандартные каналы DMA шины ISA для интерфейса АТА
практически не используются из-за низкой пропускной способности.
Высокопроизводительные адаптеры АТА могут иметь собственные более
88
1.5 Управление накопителями жестких дисков
эффективные контроллеры. Режимы обмена по каналу DMA бывают
одиночными и множественными. При одиночном режиме - Singleword DMA
- устройство для передачи каждого слова вырабатывает сигнал запроса
DMARQ и сбрасывает его по сигналу DMACK#, подтверждающему цикл
обмена. При множественном режиме - Multiword DMA - на сигнал DMARQ
хост отвечает потоком циклов, сопровождаемых сигналами DMACK#.
1.5.3. Система команд
Стандарт АТА задает систему команд, ориентированную на накопители
на магнитных дисках (см. Приложение А).
Коды команд 9Ah,C0h-C3h, 8xh, FOh, F7h и FAh-FFh выделяются
производителям оборудования для реализации специфических команд.
Команды с кодами 10h, 21h-23h, 31h-33h, 3Ch, 41h, 50h, C9h, CBh и EEh в
спецификации ATA/ATAPI-5 объявлены устаревшими (эти команды не
рекомендуется использовать). В этой же спецификации коды llh - IFh. 71h -
7Fh, 94h - 99h, DBh - DDh, E9h удалены из списков «живых», использование
этих команд запрещается (в дальнейшем они могут быть определены для
иных команд).
1.5.3.1. Команды обмена данными
Основными командами являются команды доступа к данным. Для
устройств, существенно отличающихся от НЖМД, имеется альтернативный
способ доставки команд и параметров ~ команда Packet. По этой команде,
используя вывод в режиме РЮ, хост-адаптер передает пакет с блоком
дескриптора команды. Минимальной адресуемой единицей команд чтения и
записи является 512-байтный сектор.
Команды чтения/записи секторов в режимах обмена РЮ и DMA - Read
Sectors), Write Sectors), Read DMA, Write DMA- позволяют читать/писать
последовательно расположенные секторы, количество которых задано в
регистре SC, а адрес начального сектора - в регистрах CH, CL, D/Н и SN,
Команды чтения/записи бывают с повторами или без них. В первом случае
если при чтении/записи сектора обнаружена неисправимая ошибка,
устройство автоматически делает несколько повторных попыток. После
исполнение, команды в случае неисправимой ошибки блок командных
регистров содержит адрес сектора с ошибкой. Если устройство использует
ЕСС-код, то некоторые ошибки чтения оно исправляет без повторов, но
указывает на этот факт в регистре ошибок.
Команды чтения/записи в блочном режиме передачи Read Multiple Write
Multiple отличаются тем, что запросы прерывания вырабатываются не на
89
1 Дисковые устройства внешней памяти
каждый сектор, а на блок секторов, размер которого задан командой Set
Multiple Mode.
Команды "длинного" чтения/записи Read Long и Write Long
читают/пишут сектор данных вместе с контрольными байтами. При ее вызове
регистр SC должен указывать на запрос только одного сектора.
Команда верификации Read Verify Sectors) в отличие от обычного
чтения не передает данные от устройства. В случае ошибки на адрес
сбойного сектора указывает блок командных регистров
Команда записи с верификацией Write Verify аналогична команде Write
Sector(s), но для каждого сектора после записи выполняется контрольное
считывание. Для логической инициализации (очистки области) дисков
имеется команда записи Write Same, которая позволяет содержимое 512 байт,
принятых от хоста, записать в группу секторов. Если в регистр свойств
занесен код 22h, область записываемых секторов определяется регистрам
командного блока. Если в регистр свойств занесен код DDh, запись
производится во все доступные секторы устройства.
Команды чтения и записи буфера Read Buffer и Write Buffer служат для
обмена в режиме РЮ с 512-байтной буферной памятью устройства (но не
сектором носителя).
Команда форматирования трека Format Track по входным параметрам
специфична для каждого устройства, и ее использование не рекомендуется.
Для низкоуровневого форматирования используются команды, специфичные
для конкретных устройств, причем они могут быть недопустимыми в
нормальном (не технологическом) режиме работы устройства.
Команды поиска имеют вспомогательное назначение. По команде
поиска Seek устройство устанавливает головки на заданный цилиндр/трек и
считывает идентификатор сектора.
Команда рекалибровки Recalibrate заставляет устройство найти нулевой
цилиндр. Если устройству это не удается, устанавливается бит ошибки Track
О Not Found. Эту команду обычно применяют при обработке ошибок - часто
после команды рекалибровки ошибка не повторяется.
Смысл остальных команд понятен из их названия.
1.5.3.2. Команды инициализации, идентификации и
конфигурирования
После сброса или выполнения команды диагностики устройство в блоке
командных регистров содержит сигнатуру, определяющую его тип:
- SC=01h, SN-01h, CL=00h, CH-00h, DH-OOh - устройства ATA;
- SC=01h, SN-Olh, CL=14h, CH-EBh, DH-OOh или lOh - устройства
ATAPI (значение DH=10h будет после выполнения команды Device Reset
устройством 1).
90
1,5 Управление накопителями жестких дисков
В системе команд имеются средства идентификации и управления
свойствами устройств, включая возможность обновления встроенного ПО.
Команда идентификации Identify Device (код ECh) позволяет считать из
контроллера блок из 256 слов (512 байт) - паспорт диска. Состав полей блока
для не пакетных устройств приведен в Приложении Б (табл. ПЗ). Для
устройств с пакетным интерфейсом имеется аналогичная команда Identify
Packet Device (код Alh).
Числовые данные в блоке параметров передаются в порядке младший-
старший, для 32-разрядных чисел в первом слове идут младшие 16 бит, во
втором - старшие. Строковые значения (только печатные символы ASCII)
передаются слева направо: первая буква - в старшем байте первого слова,
вторая - в младшем, третья - в старшем байте второго слова и т. д. Если
строка короче отведенного поля, она справа расширяется пробелами (код
20h).
Команда установки свойств Set Features (специфичная для устройства)
подразумевает помещение кода подкоманды (Приложение Б, табл. П4) в
регистр свойств (lFlh для канала 1).
После включения питания или, аппаратного сброса установленные
свойства заменяются на принятые но умолчанию. Результат подкоманд
можно и закрепить, подав подкоманду 66h (отмена - подкоманда с кодом
CCh).
Команда задания параметров блочного режима передачи Set Multiple
Mode через регистр SC указывает число секторов, передаваемых с одним
запросом прерывания.
Команда диагностики Execute Device Diagnostic, адресуясь всегда к
ведущему устройству, выполняется одновременно обоими устройствами. О
ее результате ведомое устройство сообщает ведущему (сигналом PDIAG#).
Состояние обоих устройств определяется по диагностическому коду (табл.
1.25), который считывается из битов 6-0 регистра ошибок ведущего
устройства.
Таблица 1.25 - Диагностические коды
Код Ведущее устройство Ведомое
01b Нормально Нормально или отсутствует
OOh,O2h-7Fh Неисправно Нормально илп отсутствует
Sih Нормально Неисправно
80b, 82h-FFh Неисправно Неисправно
Фиктивная команда Nop, не изменяя содержимого регистров, позволяет
считать информацию о состоянии устройства, выполнив всего одну 16-
битную запись по адресу в регистре D/Н. Команда всегда возвращает бит
ошибки "команда отвергнута". В АТА-4 команда объявлена обязательной для
устройств ATAPI и всех, поддерживающих перекрывающиеся команды. Она
91
1 Дисковые устройства внешней памяти
имеет подкоманды, указываемые в регистре свойств. Подкоманда с кодом
00h сбрасывает всю оставшуюся очередь, а с кодом Olh (NOP Auto Poll) на
очередь не влияет.
Команда загрузки микрокода Download Microcode позволяет
модифицировать firmware - встроенное ПО устройства. В зависимости от
кода в регистре свойств загруженный микрокод будет действовать до
выключения питания (FR = Olh) или постоянно (FR = 07h). Количество
загруженных блоков задается регистром SN (старший байт) и SC (младший
байт).
Устройства могут поддерживать и нестандартные команды, назначение
которых определяется разработчиком устройств. Нестандартные команды
позволяют оперировать служебной информацией дисков и управлять
конфигурацией и свойствами устройств.
L5.3.3. Команды специального назначения
Работа со сменными носителями. Для накопителей со сменными
носителями требуются специальные меры, предотвращающие:
- потерю данных при смене носителя (попытка записи по каталогу
прежнего носителя);
- потерю данных при изъятии носителя, когда кэш записи еще не
выгружен;
- несанкционированную смену носителя.
Механизм уведомления является защитой от несанкционированной
смены носителя, он дает хосту возможность полного управления носителем.
Нажатие кнопки на накопителе не вызывает смены носителя, этот факт и
состояние носителя может определяться по команде Get Media Status. Хост
должен периодически выдавать эту команду и читать регистр ER.
Смену носителя для устройств АТА вызывает только команда Media
Eject (для устройств ATAPI предназначена пакетная команда Start/Stop Unit).
Включается механизм уведомления по команде Set Features
подкомандой 95h, после выполнения которой в регистре CL оказывается
номер версии механизма уведомления (пока только 00), а в регистр СН -
дополнительная информация.
Механизм выключается по любому сбросу и команде диагностики
устройства, а также по команде Set Features подкомандой 31h. При этом
носитель остается незаблокированным, а биты состояния носителя и запроса
его смены сбрасываются, Возможность и включение механизма уведомления
определяется битом 4 слов 83 и 86 идентификатора устройства.
Альтернативный механизм смены носителя (Removable Media Feature
Set) позволяет устройству непосредственно отрабатывать нажатие кнопки
92
1.5 Управление накопителями жестких дисков
смены носителя (если носитель не заблокирован), менять носитель и
определять его состояние.
Команды для флдщ-памяти. запоминающих устройств на флэш-
памяти в АТА-4 ввели\<оманды, начинающиеся с аббревиатуры CFA
(Compact Flash Association - ассоциация производителей компактных флэш-
карт). Специфика этих устройств заключается в записи: запись
обеспечивается лишь в предварительно стертые ячейки (сектор).
Поэтому ввели команды записи в предварительно стертые секторы -
CFA Write Without Erase н CFA Write Multiple Without Erase, применение
которых позволяет повысить производительность обмена с устройствами,
Для стирания блоков предназначена команда CFA Erase Sectors, в которой
указывается начальный адрес и количество стираемых секторов.
Управление энергопотреблением и шумом. Различают следующие
состояния, перечисленные в порядке возрастания энергопотребления:
Sleep - «заснувшее» устройство потребляет минимум энергии, команды
не воспринимаются, «разбудить» его может только сброс.
Standby Mode (дежурный режим) - устройство способно принимать
команду по интерфейсу, но для доступа к носителю может потребоваться
большое время. В это состояние устройство может перейти как по команде,
так и по таймеру (Standby Timer), отсчитывающему время от последнего
запроса, полученного в состоянии ожидания или активном состоянии.
Idle Mode (состояние ожидания) - устройство способно сразу начать
обслуживание обращения к носителю, но не слишком быстро, так как
некоторые узлы отключены.
Active Mode (активный режим) - устройство обслуживает все запросы за
кратчайшее время.
Команда проверки режима энергопотребления Check Power Mode через
регистр SC возвращает состояние: SC = 00h - устройство находится в
состоянии Standby или переходит в него, SC = 80h - устройство в состоянии
ожидания (Idle), SC = FFh - устройство активно.
Команда Idle переводит устройство в режим ожидания из активного или
дежурного режима, а также через регистр SC программирует таймер
дежурного режима.
Команда Idle Immediate - непосредственный перевод в режим ожидания
- таймер не программирует.
Команда Sleep переводит устройство в спящий режим.
Команда Standby переводит устройство в дежурный режим потребления
и через параметр в регистре SC программирует таймер.
Защита данных. С точки зрения защиты, устройство может находиться
в одном из трех состояний:
- открыто - устройство выполняет все свойственные ему команды.
Устройство с установленной защитой можно открыть только командой
93
1 Дисковые устройства внешней памяти
Security Unlock, в которой передается блок данных, содержащий правильный
пароль (имеется внутренний счетчик неудачных попыток открывания;
- закрыто - устройство отвергает все команды, связанные с передачей
данных и сменой носителя. Допустимы лишь команды общего управления,
мониторинга состояния и управления энергопотреблением. Из команд
защиты допустимы лишь команды стирания (Security Erase) и открывания
(Security Unlock), В это состояние устройство с установленной защитой
входит каждый раз по включению питания;
- заморожено - устройство отвергает все команды управления защитой,
но выполняет все остальные. В это состояние устройство переводится
командой Security Freeze Lock или автоматически по срабатыванию счетчика
попыток открывания с неправильным паролем. Из этого состояния
устройство может выйти только по аппаратному сбросу пли при следующем
включении питания.
Устройство выпускается производителем с неустановленной защитой,
то есть по включению оно будет открыто. Для установки защиты и пароля
используется команда Security Set Password, которую выполняет только
открытое устройство. Снять защиту можно командой Security Disable
Password,
Команды защиты дополнены ограничением максимального адреса,
доступного пользователю (устанавливается командой Set Max Address).
Реальный максимальный адрес возвращает команда Read Native Address.
Команды мониторинга состояния - SMART. Для предупреждения о
возможном отказе устройства служит технология SMART (Self-Monitoring,
Analysis and Reporting Technology - технология самонаблюдения, анализа и
сообщений).
Для не пакетных устройств имеется команда SMART (пакетные
используют для этих целей собственный протокол), подкоманды которой
задаются через регистр свойств FR Перед подачей команд в регистры CL и
СН заносятся константы: CL = 4Fh, CH = C2h. Подкоманды SMART:
- SMART Read Data (FR=D0h) - чтение пакета мониторинга (512 байт).
- SMART Enable/Disable Attribute Autosave (FR = D2h) - управление
автосохранением атрибутов: SC = OOh - запрет, SC-Flh - разрешение
автосохранения.
- SMART Save Attribute Values (FR = D3h) - сохранение значений
атрибутов в энергонезависимой памяти устройства.
- SMART Execute Off-Line Immediate (FR = D4h) - немедленное
выполнение мониторинга.
- SMART Read Log (FR = D5h) - чтение журнала ошибок. В регистре SC
указывается число передаваемых секторов, в регистре SN - адрес журнала.
- SMART Write Log (FR = D6h> - запись в журнал ошибок.
94
1.5 Управление накопителями жестких дисков
1.5.4. Пакетный интерфейс ATAPI
Для подключения к интерфейсу АТА накопителей CD-ROM,
стриммеров и других устройств разработан аппаратно-программный
интерфейс ATAPI (АТА Package Interface - пакетный интерфейс АТА).
Устройство ATAPI поддерживает минимальный набор команд АТА, который
неограниченно расширяется 16-байтным командным пакетом, посылаемым
хост-контроллером в регистр данных устройства по команде Packet.
Структура командного пакета пришла от SCSI, что обеспечивает схожесть
драйверов для устройств со SCSI и AT API. Интерфейс ATAPI может
использоваться с неинтеллектуальными адаптерами АТА, поскольку для
хост-адаптера поддержка ATAPI может выполняться программно.
Устройства ATAPI имеют следующие особенности:
- Команду Identify Device они должны отвергать, устанавливая в блоке
командных регистров сигнатуру ATAPI. Для идентификации устройств
ATAPI предназначена специальная команда Identify Packet Device, а блок
параметров, сообщаемых устройством, трактуется иначе.
- Для программного сброса устройства ATAPI предназначена команда
Device Reset, которую устройства АТА отвергают. Программный сброс через
регистр управления не прекращает выполнение команды Packet
- Специфические команды вместе с необходимыми параметрами
передаются по команде Packet, код которой является недействительным для
устройств АТА.
Для устройств ATAPI допустимы далеко не все команды. Обязательная
команда Read Sector(s) устройствами ATAPI выполняется своеобразно: она
отвергается, но в блоке командных регистров оставляет сигнатуру пакетного
устройства.
Получив команду Packet, устройство устанавливает бит занятости BSY и
готовится принять пакет. По готовности к приему оно устанавливает бит
DRQ и сбрасывает BSY, что является сигналом хосту для передачи пакета в
режиме РЮ. Во время передачи последнего слова устройство сбрасывает
DRQ, устанавливает BSY и начинает отработку пакетной команды.
При подаче команды Packet регистр свойств FR содержит признаки
команды:
- Бит О -DMA -является указанием на использование DMA или Ultra
DMA для обмена данными.
- Бит 1 - OVL - является признаком возможности перекрывающегося
выполнения команд.
Регистры СН и CL содержат лимит счетчика байтов данных,
передаваемых по каждому введению DRQ в режиме РЮ. Если команда не
предусматривает обмена данными, поле игнорируется.
Регистр D/Н используется только для выбора устройства. Для устройств,
поддерживающих очереди команд, биты 7-3 регистра SC содержат тег.
95
1 Дисковые устройства внешней памяти
После подачи команды Packet хост определяет состояние устройства,
прочитав его регистры. Возможны следующие варианты:
- Ожидание команды Packet: в регистре SC биты С/D = 1, I/O = О, REL =
О, поле Tag содержит ранее установленное значение. В регистре состояния
BSY =0, DMRDY =0, СНКО, DRQ = 1, бит SERVможет указывать на наличие
команды, ожидающей обслуживания.
- Передача данных: в регистре SC биты С/D = 0, REL^O, I/O указывает
на направление передачи. Регистры CH, CL при использовании РЮ содержат
счетчик байтов данных. В регистре состояния BSY = 0, DRQ = 1, СНК = 0,
DMRDY указывает на использование DMA, бит SERV может указывать на
наличии команды, ожидающей обслуживания.
- Освобождение шины: в регистре SC биты C/D=0, I/O =0, REL = 1, поле
Tag содержит тег. В регистре состояния BSY = 0, DMRDY = 0. СНК = 0, DRQ
= 0, бит SERV может указывать на наличие команды, ожидающей
обслуживания.
- Запрос обслуживания: в регистре SC биты С/D = 0. I/O = 0, REL = 1,
ноле Tag содержит тег. В регистре состояния BSY = 0, DMRDY = 0. СНК 0,
DRQ^fL бит SERV - 1.
- Успешное завершение: в регистре SC биты С/D = 1. I/O == 1, REL = 0,
поле Tag содержит тег. В регистре состояния BSY0, DMRDY = 1, СНК = 0,
DRQ = 0, бит SERV может указывать на наличие команды, ожидающей
обслуживания.
- Завершение с ошибкой (только после передачи последнего байта
пакета): и регистре SC биты С/D = 1. I/O = 1, REL = 0, поле Tag содержит тег.
В регистре состояния BSY4), DMRDY = 1, DRQ = 0, DF 1 при отказе
устройства, СНК = 1, если регистр ошибок содержит код ошибки, бит SERV
может указывать на наличие команды, ожидающей обслуживания.
Систему команд и структуру пакетов стандарт ATA/ATAPI-4 не
описывает, но для каждого класса устройств существует стандартизованный
набор команд с определенной структурой пакетов. При любой длине блока
дескрипторов, которая определяется кодом команды (нулевой байт пакета),
передаваемый пакет имеет длину 16 байт, но используется только указанное
количество байтов.
1.5.5. Примеры программирования НЖМД
Программы, представленные в данном разделе, показывают
программирование неинтеллектуального IDE устройства (не жалко потерять
диск при некорректной работе программы). По этой причине студентам
запрещено отлаживать подобные программы в компьютерных залах (можно
на домашнем компьютере с предельной осторожностью).
Пример I. Данный пример демонстрирует выполнение команд
контроллера HD, не требующих обмена данных (установка параметров,
диагностика накопителя, проверка секторов, рекалибровка).
96
1.5 Управление накопителями жестких дисков
program hdd_l;
uses crt,dos;
var i,b,bl:byte;
flag :boolean;
{ процедура обработки прерывания HD }
procedure inthddat; interrupt;
begin
writeln(’reg.st(lf7h):', port[$lf7]); { состояние накопителя }
flag:=true;
end;
{ установка параметров накопителя }
procedure init;
begin
flag:~false;
writefmax #head:');
readln(b);
port[$lffi]:~b; { максимальное число головок }
port[$lf7]:=$91; { код команды "установка параметров" }
repeat until flag; { ожидание прерывании }
writeln(’reg.err(lflh):,,port[$lfl]); { код ошибки }
end; ( диагностика }
procedure diagnost; begin flag:-false; port|$lf7]:=$90; { код команды "диагностика" }
repeat until flag; writeln('reg.err(lflh):',port($lfl]); { код ошибки }
end;
{ рекалибровать, т.е. перевод головки на нулевой цилиндр }
procedure calibr;
begin
writeln('Calibr.');
flag:=false;
port[$lf7]:=S10; { код команды "рекалибровать” }
repeat until flag;
{ вывод результатов выполнения команды }
writeln(’reg.err(iflh):’,port[$lfl]); код ошибки
writelnfreg. #ciL:\port($lf5] shl 8 + port[$lf4]);
writeln(’reg. #sek.:',port]$lf3]);
end;
{ перевод головок на заданный цилиндр (поиск) }
procedure seek;
begin
flag:~false;
port($lf7]:=$70; { код команды "поиск" }
repeat until flag;
{ вывод результатов выполнения команды }
writeln('reg.err(l fl h):’,port[$l fl ]);
writelnfreg. #ciL:',port[$115] shl 8 + port[$lf4]);
writeln(’reg.err(l fl h): ’,port[$l fl ]);
end;
{ проверка секторов }
97
1 Дисковые устройства внешней памяти
procedure ver if;
var a:array [1..4| of byte; w:word; begin flag:-false; { задание параметров команды }
writefhdd (1/0):’); readln(a[lj); { номер устройства }
writef# head:(<16):’); readln(b); { номер головки }
a[l]:-(a[l] sh!4)+b; writef# oil.: ’); readln(w); { номер цилиндра }
writef# sek.:'); readln(a[2}); { помер сектора }
writefkol. sek.:'); readln(a[3]); { количество секторов }
write(’repeat ? (1/0):*); readln(b); { необходимость повторных обращений }
b:=b or $40; { добавление кода команды }
{ ввод параметров н кода команды }
port[$lf6]:-a|l J; portj$lf5|:s=w shr 8; portj$lf4j:=w and Sff; port[$lf3J:=a[2|; рог1[$Ш|:=а[3]; port[$lf7]:=b; { код команды "проверить сектор" }
repeat until flag; writeln('reg.err(l П h): ',portf $ 1 fl ]); end; { основная программа }
BEGIN GetlntVec ($76,oldint); { сохранение вектора }
SetlntVec ($76,@int_hdd_at); { перенаправление вектора }
writelnfif init then "Г"); { если необходима установка пара- }
readln(b); { метров, то вводится 1 }
if b=l then init; diagnost; calibr; seek; verif; setintvec($76,oldint); END.
Пример 2. Данный пример выполняет команду чтения заданного числа
секторов из поля данных вместе с контрольными суммами.
program hdd2;
$g+
uses crt, dos;
var b, bl, sek, ksek, com:byte;
w:word;
flag: boolean;
oldint: pointer;
data:array [1..6656] of word;
98
1.5 Управление накопителями жестких дисков
res:array (1.Л024] of byte;
{ здесь помещается текст процедуры inthdd примера 1. }
{ основная программа }
BEGIN
GetlntVec ($76, oldint);
SetlntVec ($76, @int__hdd);
flag:-false;
clrscr;
writelnf Begin reading data');
{ обнуление массива данных }
for w:=l to 65536 do
ar[b]:=O;
{ задание параметров команды }
write('kot sek.:’);
readln(ksek);
write(’#sek.:’);
readln(sek);
write(’#trac.:’);
readln(w);
write(*#hdd (0/1)’);
readln(b);
b:=b sh!4;
write(’#head (<16)’);
readln(bl);
b:=b or bl;
com:=$22; { задание кода команды чтения секторов }
writeinflong read’);
writelnf repeat? (0/1)*);
readln(rep);
com:=com or rep;
{ ввод параметров и кода команды }
port[$3f6]:==$00;
port j$l f2] :=ksek;
port]$lf3]:=sek;
portj$lf4i:-w and $ff;
portjsifSI^w and $fOO)shr 8;
port[$lf6]:=b;
port($lf7]:=coin; { 1 ввод кода команды }
repeat until flag; { ожидание прерывания }
flag:=faise;
{ чтение данных и контрольных сумм из секторов }
asm
mov di,seg ksek
mov ds4>
mov ax,[di]
mov di,seg datafl]
mov es,di
mov di,offset data(l)
mov bx,l
mov dx,lfbh
@rep:
mov cx,256
cld
99
1 Дисковые устройства внешней памяти
@go:insw
loop @go
in dx,res[bx]
inc bx
in dx,res[bx]
inc bx
in dx,re$[bx]
inc bx
in dx,res[bx]
inc bx
dec ax
jnz @rep
end;
repeat until flag;
writelnf reg.err:’ ,port[$l fl j);
{ вывод результатов работы команды чтения секторов из массивов }
writelnf read data*);
for w:~l to 65536 do write(data(i]);
writein;
writeln('read data correct');
for w:=l to 1024 do write(resfwj);
writein;
setintvec($76, oldint);
END,
Пример 3, Данный пример выполняет команду чтения данных из
заданного сектора.
program hdd_3;
$g+
uses credos;
var b, bl, sek, ksek, com:byte;
w:word;
flag: boolean;
oldint:pointer;
data:array (1 ..256] of word;
{ здесь помещается текст процедуры inthdd примера 1) }
{ основная программа }
BEGIN
GetlntVec ($76,oldint);
SetlntVec ($76,@int_hdd);
flag: “false;
clrscr;
writelnfBegin reading data');
writefwrite koi. byte:');
{ обнуление массива данных }
for w:=l to 256 do data[w]:=0;
{ задание параметров команды }
write(*koL sek.:');
readln(ksek);
write('#sek:');
readln(sek);
write('#trac.:’);
readln(w);
write(’#hdd(0/l)');
100
1.5 Управление накопителями жестких дисков
readln(b);
b:=b shl 4;
write(*#head (<16)’);
readln(bl);
b:=b or bl;
comi^iO; { задание кода команды "чтение секторов" }
writeln(* short read’);
writelnfrepeat? (0/1)*);
readln(rep); { ввод необходимости повтора }
com:=com or rep;
{ ввод параметров и кода команды }
port($112]:=ksek;
portj$lf3]:=sek;
port[$lf4]:=w and Sff;
port($lf5]:=(w and SfflO)shr 8;
port[$lf6]:-b;
port[$lf7]:=com;
{ ожидание прерывания }
repeat until flag;
flag:Malse;
{ чтение данных из заданного сектора }
asm
mov di,seg ksek
mov ds,di
mov ex,(di]
mov dx,256
mul dx,cx
mov cx,dx
mov di,seg datafl]
mov es,di
mov di,offset data(l]
mov dx,lfOh
cld
@go:insw
loop @go
end;
repeat until flag;
writeln(’reg.err(lflh):’,port($lfl]);
{ вывод на экран результата команды чтения из массива data }
writelnfread data:*);
for i:~l to 256 do write(data[i]);
writein;
setintvec($76, oldint);
END.
1.5.6. Контрольные вопросы
1. Какие функции выполняет контроллер ЖД.
2. Интерфейс АТА и его разновидности.
3. Особенности электрического интерфейса АТА. Назначение сигналов.
101
1 Дисковые устройства внешней памяти
4. Через какие порты ввода/вывода выполняется управление
контроллером ЖД и структура записываемых/читаемых данных.
5. Назначение блока управляющих регистров контроллеров устройств
АТА.
6. Назначение блока командных регистров контроллеров устройств
АТА.
7. Как реализуются режимы адресации LBA и CHS.
8. Структура байта состояния контроллера ЖД.
9. Режимы передачи данных. Особенности реализации программного
доступа РЮ.
10. Как реализуется режим DMA для интерфейса АТА.
11. Реализация режима Ultra DMA.
12. Система команд контроллера ЖД. Классификация команд.
13. В какой последовательности и куда посылается команда управления
ЖД и ее параметры.
14. Как определить результат выполнения предыдущей команды и
состояние накопителя IBM PC/AT.
15. Особенности реализации команд обмена данными.
16. Как записать/прочитать заданный объем информации при
непосредственном управлении контроллером ЖД.
17. Что содержит внутреннее ОЗУ контроллера ЖД, и какие возможны
операции с внутренним ОЗУ.
18. Назначение контрольных сумм и каким образом можно прочитать
контрольную сумму из ЖД.
19. Каким образом можно определить причину ошибки при работе
контроллера ЖД.
2О. Каким образом при непосредственном управлении контроллером ЖД
IBM PC/XT отформатировать конкретную дорожку, часть диска весь диск.
21. Особенности реализации команд инициализации, идентификации и
конфигурирования.
22. Как прочитать паспорт диска и какая его структура.
23. Каким образом можно установить/изменить свойства устройства.
24. Как выполнить диагностику устройств АТА.
25. Особенности выполнения команд со сменными носителями.
26. Особенности выполнения команд для флэш-памяти.
27. Команды управление энергопотреблением и шумом.
28. Организация защиты данных на ЖД. Команды.
29. Особенности выполнения команд мониторинга состояния SMART.
30. Организация пакетного интерфейса AT API.
102
2.1 Принципы построения видеотерминалов и формирование изображений
2. Управление видеосистемой
2.1. Принципы построения видеотерминалов и формирование
изображений
Видеотерминалы персональных компьютеров - основное средство
отображения информации, обладают широкими возможностями
программирования и наиболее привлекательные для программистов.
Управление видеотерминалом (формирование текстовых и графических
изображений) возможно путем использования широкого спектра
графических пакетов и текстовых редакторов, встроенных графических
библиотек, которые имеются практически во всех языках программирования,
с использованием функций прерываний BIOS (10h прерывание) и путем
непосредственного программирования видеоадаптеров на уровне портов и
непосредственного обращения к видеобуферу. При всех достоинствах
перечисленных методов (удобство, простота, стандартизация и т.д.) только
непосредственное программирование позволяет в полной мере использовать
все возможности видеотерминалов и строить эффективные программы.
В IBM PC подобных компьютерах видеотерминал (более точно следует
назвать видеосистемой) состоит из следующих основных модулей:
- видеомонитор (дисплей), который формирует изображение, является
внешним периферийным устройством (программно недоступен) и
подключается к системному блоку (видеоадаптеру) с помощью 9-жильного
кабеля;
- видеоадаптер - печатная плата, которая находится в системном блоке и
вставляется в один из разъемов (слот) системной шины (S-шина)
материнской платы. Программирование всей видеосистемы заключается в
программировании видеоадаптера;
- видеопамять (видеобуфер) - оперативная память, физически
расположена на плате видеоадаптера и предназначена для хранения
выводимой информации текста или графического изображения на экран
видеомонитора. Видеопамять представляет собой двухвходовую
(двухпортовую) ОЗУ, т.е. с одной стороны она находится в адресном
пространстве процессора и допускает чтение/запись данных от процессора, а
с другой стороны схемы видеоадаптера считывают из нее информацию в
процессе формирования изображения;
- внутреннее ПЗУ (ROM BIOS) видеоадаптера, которое физически
расположено на плате адаптера (в адресном пространстве процессора) и
содержит программы поддержки расширенных функций 10h прерывания
BIOS системной платы.
Растровый принцип формирования изображения. Во всех
видеомониторах персональных компьютеров используется растровый
103
2 Управление видеосистемой
принцип формирования изображения, при которых текст или графическое
изображение формируются на экране электронным лучом, который
периодически сканирует экран монитора слева направо и сверху вниз с
образованием на нем линий развертки, которые последовательно (сверху
вниз) заполняют весь экран (см. рис, 2.1).
Г оризонтальный
прямой ход
Вертикальный
обратный ход
При движении луча слева направо (прямой ход) модулируется
интенсивность луча в зависимости от содержания видеобуфера, что приводит
к изменению яркости (а в цветных мониторах и цвета) тех точек экрана
(пикселей), которые проходит луч. Перевод луча справа налево со
смещением на одну строку вниз называется обратным горизонтальным
ходом. После заполнения всего экрана (формирования кадра) луч
переводится в верхний левый угол (вертикальный обратный ход). Во время
обратных ходов луч гасится. Для получения немерцающих изображений
сканирование экрана (частота кадров) выполняется с частотой 50-70 Гц. При
программировании различают частоту строк - частота кадров * количество
строк, частоту пикселей (полоса пропускания) = частота строк * число
пикселей в строке. Последняя характеристика является предельной
характеристикой конкретного монитора и при ее превышении (в случае
неправильного программирования) происходит срыв развертки и потеря
изображения.
В цветных видеомониторах луч состоит из трех лучей, которые с
помощью специальных масок формируют три основных цвета: синий (Blue),
зеленый (Green) и красный (Red). Изменяя интенсивность каждой
составляющей, получают все разнообразие цветовой гаммы.
Сигналы управления растром. При формировании растра выводимое из
видеобуфера изображение занимает не весь растр, а его центральную часть,
окруженную горизонтальным (а) и вертикальным (б) окаймлением
(бордюром), как это показано на рис. 10.2.
Для формирования указанного изображения применяются сигналы:
104
2.1 Принципы построения видеотерминалов и формирование изображений
- горизонтальное гашение (HBI) - активен между точками 3, 4 и 1, 2,
которые на временной последовательности образуют один непрерывный
интервал (3,4,1, 2), хотя и относятся к разным строкам развертки.
- горизонтальная синхронизация (HSYNC) - во время действия этого
сигнала выполняется обратный горизонтальный ход, т.е. перемещение луча
справа налево.
- вертикальное гашение (VBI) - активен между точками 5, 6 и 7, 8,
которые на временной последовательности образуют один непрерывный
интервал (7, 8, 5,6), хотя и относятся к разным кадрам.
- вертикальная синхронизация (VSYNC) - во время действия этого
сигнала выполняется обратный вертикальный ход, т.е. перемещение луча
снизу вверх.
♦6
Выводимая
область нз
видеобуфера
12 3 4
5
6
7
8
Рисунок 2.2 - Формат экрана
Временные диаграммы указанных сигналов показаны на рис. 2.3.
* 2 Вывод строки 3 4 Обратный ход* 2
i-я строка i+1-я строка
н------------------------------------------------------------
HBI _______I I______________________________I
HSYNC_______________________________ I I__________
а) сигналы управления строкой вывода
5 6 Вывод строки
8 Обратный ход
б) сигналы управления кадром
Рисунок 2.3 - Временные диаграммы управляющих сигналов
Следует отметить, что между точками 5, 6 и 7, 8 помещается несколько
строк развертки, которые образуют верхнюю и нижнюю части бордюра. При
105
2 Управление видеосистемой
программировании параметров развертки временные интервалы
рассчитываются, начиная от точки 2 в строке (а не от точки 1 - начало
строки) и от точки 6 в кадре (а не от точки 5 - начало кадра).
Типы мониторов. Применяемые мониторы различаются по следующим
показателям:
- по типам (цветные или монохромные);
- по разрешающей способности (максимальному числу выводимых
пикселей);
- по способу кодирования интенсивности (яркости) цвета - цифровые и
аналоговые;
- по способу управления монитором - прямого управления, когда
интенсивность каждого цвета передается отдельно и композитные, когда
видеоадаптер непосредственно формирует составной (композитный)
видеосигнал (сам видеосигнал объединен с сигналом управления),
передаваемый в монитор по коаксиальному кабелю.
Естественным является то, что характеристики видеомонитора должны
соответствовать характеристикам видеоадаптера.
2.2. Видеоадаптеры
При развитии видеосистем ПК использовались следующие виды
видеоадаптеров.
Монохромный MDA. Адаптер монитора разработан на базе контроллера
дисплея Motorola 6845. Обеспечивал работу монохромного дисплея в
текстовом режиме, использовал видеобуфер объемом 4К статической ОЗУ и
встроенный генератор символов. Параметры развертки задаются через 18
программно доступных в пространстве ввода/вывода регистров (индекс- порт
3B4h, запись/чтение данных - порт 3B5h).
Цветной графический адаптер CGA. В CGA адаптере контроллер также
реализован на микросхеме 6845, поэтому способы программирования
регистров МДА и CGA одинаковы, однако при установке видеорежима
меняются адреса портов (для монохромного 3B4h/3B5h для цветного
3D4h/3D5h).
Расширенный графический адаптер EGA. В адаптере EGA
сформировалась архитектура (набор блоков и их отображение на адресное
пространство ввода/вывода) которая с небольшими дополнениями (см. ниже)
является стандартной для современных видеоадаптеров. Адаптер EGA
фирмы IBM обеспечивает возможность работы в различных видеорежимах
совместно с цветными или монохромными мониторами с цифровыми
входами. В архитектуре EGA выделились следующие блоки:
1) Блок управления электронно-лучевой трубкой (CRTC - CRT
Controller) управляет сигналами горизонтальной и вертикальной
106
2.2 Видеоадаптеры
синхронизации, начальным адресом вывода в видеобуфере, положением и
формой курсора и др. Так как адаптер EGA может формировать растр,
содержащий более 256 строк развертки, некоторые регистры CRT должны
иметь 9 бит. Однако все регистры блока 8-битные, а старшие девятые биты
собраны в регистр переполнения.
2) Блок синхронизации (SEQ - Sequencer) генерирует тактовые сигналы
и сигналы для синхронизации доступа к видеопамяти. Блок обеспечивает
доступ к видеопамяти со стороны процессора в специально выделенные
промежутки времени, свободные от процесса регенерации изображения на
экране дисплея. В этом же блоке содержатся регистры управления записью
данных в битовые плоскости.
3) Графический контроллер (CRAPH - Graphics Controller) в
графических режимах направляет данные из памяти в контроллер атрибутов
и в процессор. Для быстрого изменения изображения на экране дисплея
аппаратурой обеспечивается возможность записи 32 бит данных за один цикл
памяти (8 бит для каждой плоскости), а дополнительная логика позволяет
процессору записывать данные в видеопамять не придерживаясь границ
байтов.
4) Контроллер атрибутов (ATTRIB - Attribute controller) устанавливает
цветовую палитру из 16 цветов, каждый из которых может быть определен
независимо от остальных цветов. На вход монитора подается 6-ти битовый
код цвета. Этой же микросхемой выполняются действия по управлению
мерцанием и подчеркиванием. Контроллер получает данные из видеобуфера
и преобразует их в управляющие сигналы, подаваемые на вход монитора.
Назначение регистров перечисленных модулей адаптера вместе с их
отображениями на адресные порты и порты данных приведены в
Приложении В.
Начиная с адаптера EGA, для доступа к видеопамяти со стороны
процессора выделено два сегмента адресного пространства (BOOOOh -
AFFFFh). С целью совместимости с более ранними моделями
видеоадаптеров, адреса видеобуфера могут изменяться в зависимости от
установленного водеорежима (начальный адрес BOOOOh - монохромный
текстовый режим, начальный адрес B8000h - цветной текстовый режим и
начальный адрес AOOOOh - графический режим).
Адаптер VGA. В адаптере VGA имеются все перечисленные выше блоки
адаптера EGA, программирование которых аналогично EGA. Для растров 400
строк и выше в регистры добавлено несколько полей хранения десятых
разрядов (см. П.2). Однако в адаптере VGA увеличено цветовое разрешение
(до 256 цветов в графическом режиме и до 218 цветов при индексации цветов
с помощью регистров PEL). Увеличение цветового разрешения привело к
переходу на аналоговое управлении видеотерминалом (сигнал по каждой
цветовой составляющей R, G и В передается по одной линии, а информацию
107
2 Управление видеосистемой
о интенсивности составляющей несет амплитуда сигнала). Для реализации
аналогового управления (предыдущие адаптеры MDA, CGA и EGA
формируют для управления монитором только цифровые ТТЛ-сигналы) в
адаптер VGA добавлен выходной блок цифро-аналогового преобразователя
(Digital Analog Converter - DAC), co своими 256 восемнадцатьюразрядными
регистрами PEL. Адреса портов и особенности программирования регистров
PEL изложены в Приложении В.
Адаптер SVGA. К данному классу относятся адаптеры современных ПК.
Адаптер SVGA имеет весь набор стандартных регистров VGA, но обладает
улучшенными характеристиками (разрешение экрана и цветовое разрешение,
объем видеопамяти, поддержка VESA - режимов и др.). Для управления
дополнительными возможностями адаптеры SVGA имеют набор
дополнительных программно-доступных регистров. К сожалению набор
дополнительных регистров не стандартизирован и отличается у каждой
фирмы-производителя. Для своей работы адаптер SVGA требует ’’свой”
драйвер, иначе его возможности ограничиваются стандартным 256-цветным
режимом VGA.
Адаптеры имеют объем видеопамяти, превышающий выделенное
адресное пространство, поэтому они содержат специальные регистры
переключения банков (что осложняет программное формирование
изображения). Современные адаптеры SVGA имеют возможность
переадресации видеопамяти в область старших адресов (выше границы 16
Мбайт), что позволяет в защищенном режиме работать с цельными образами
экранов. Кроме аппаратно-выделенной видеопамяти, устанавливаемой на
графических адаптерах, существует и архитектура унифицированной памяти
UMA (Unified Memory Architecture). При таком подходе под видеобуфер
выделяется область системного ОЗУ> что позволяет несколько удешевить
компьютер.
Формирование изображения в видеопамяти графического адаптера
производится под управлением программы, исполняемой центральным
процессором. Сама по себе задача формирования процессору вполне по
силам, но при ее решении требуется пересылка большого объема
информации в видеопамять, а для многих построений еще и чтение
видеопамяти со стороны процессора. Видеопамять большую часть времени
занята выдачей информации схемам регенерации изображения в довольно
напряженном темпе. От этого процесса она свободна только во время
обратного хода луча по строке и кадру, но это меньшая часть времени.
Если обращение к активной странице видеопамяти со стороны
процессора происходит во время прямого хода и быстродействия схем
адаптера недостаточно для того, чтобы это обращение вписалось между
соседними выборками процесса регенерации, на экране появится штрих от не
108
2.2 Видеоадаптеры
считанной информации пикселов. Если такое обращение происходит часто,
на экране появляется "снег”.
Выходов из этого затруднения имеется несколько. Во-первых,
повышают быстродействие видеопамяти. Во-вторых, расширяют разрядность
шин графического адаптера, причем как внутренней (шины видеопамяти),
так и интерфейсной, и применяют высокопроизводительные шины
(локальную VLB, PCI или AGP). Расширение разрядности позволяет за один
цикл обращения передать большее количество бит данных - повысить
производительность. В-третьих, повысить скорость видеопостроений можно
применением кэширования видеопамяти или создание теневой видеопамяти.
В этом случае при записи в область видеопамяти данные будут записаны как
в видеопамять, так и в ОЗУ (или даже в кэш), а при считывании из этой
области обращение будет только к быстродействующему ОЗУ. И в-
четвертых, можно принципиально сократить объем информации,
передаваемой графическому адаптеру, но для этого графический адаптер
должен содержать графический сопроцессор. В современных видеосистемах
используются все эти решения.
Графические сопроцессоры. Интеллектуальный графический адаптер
содержит на своей плате собственный процессор, способный формировать
растровое изображение в видеопамяти по командам, полученным от
центрального процессора. Команды ориентируются на наиболее часто
используемые методы описания изображений, которые строятся из
отдельных графических элементов более высокого уровня, чем пикселы.
Команды рисования обеспечивают построение графических примитивов
(точки, отрезка прямой, прямоугольника, дуги, эллипса). Примитивы такого
типа в командах описываются в векторном виде, что гораздо компактнее, чем
их растровый образ. Таким образом, удается значительно сократить объем
передаваемой графической информации за счет применения более
эффективного способа описания изображений. К командам рисования
относится и заливка замкнутого, контура, заданного в растровом виде,
некоторым цветом или узором. Она ускоряется особенно эффективно: при
программной реализации процессор должен просмотреть содержимое
видеопамяти вокруг заданной точки, двигаясь по всем направлениям до
обнаружения границы контура и изменяя цвет пикселов на своем пути. При
этом требуется чтение большого объема данных видеопамяти, их анализ и
запись модифицированных данных обратно в видеопамять. Процессор
интеллектуального адаптера способен выполнить эту операцию быстро и не
выходя с этим потоком данных на внешнюю магистраль.
Копирование блока с одного места экрана на другое применяется для
"прокрутки" изображения экрана в разных направлениях. Эта операция
интеллектуальным адаптером может быть сильно ускорена.
109
2 Управление видеосистемой
Для формирования курсора на графическом экране применяют команды
работы со спрайтами. Спрайт (Sprite) - небольшой прямоугольный фрагмент
изображения, который может перемещаться по экрану как единое целое.
Аппаратная поддержка окон (Hardware Windowing) упрощает и ускоряет
работу с экраном в многозадачных (многооконных) системах. На
традиционном графическом адаптере при наличии нескольких, возможно
перекрывающих друг друга окон программе приходится отслеживать
координаты обрабатываемых точек с тем, чтобы не выйти за пределы своего
окна. Аппаратная поддержка окон упрощает вывод изображений: каждой
задаче выделяется свое окно - область видеопамяти требуемого размера, в
котором она работает монопольно. Взаимное расположение окон сообщается
интеллектуальному адаптеру, и он для регенерации изображения синхронно с
движением луча по растру сканирует видеопамять не линейно, а
перескакивая с области памяти одного окна на другое.
Если объем видеопамяти превышает необходимый для данного формата
экрана и глубины цветов, то в ней можно строить изображение,
превышающее по размеру отображаемую часть. Интеллектуальному
адаптеру можно поручить панорамирование - отображение заданной
области. При этом горизонтальная и вертикальная прокрутка изображения не
потребует операций блочных пересылок - достаточно лишь изменить
указатель начального адреса отображаемой области.
Вышеописанные функции интеллектуального адаптера относятся к
двумерной графике (2D). Современные графические адаптеры берут на себя
и многие функции построения трехмерных изображений. В компьютерной
графике трехмерное изображение состоит из ряда поверхностей различной
формы. Эти поверхности "собираются" из отдельных полигонов
(треугольников), каждый из которых имеет трехмерные координаты вершин
и описание поверхности (цвет, узор). Перемещение объектов (или
наблюдателя) приводит к необходимости пересчета всех координат и
определения видимости полигонов отдельных перекрывающихся
поверхностей. Кроме того учитывается перспектива, освещенность
поверхностей и отражение света от них, прозрачность и многие факторы.
Ускорение построений в интеллектуальном адаптере обеспечивается
несколькими факторами. Во-первых, это сокращение объема передачи по
магистрали. Во-вторых, во время работы процессора адаптера центральный
процессор свободен, что ускоряет работу программ даже в однозадачном
режиме. В-третьих, процессор адаптера, в отличие от центрального
процессора ориентирован на выполнение меньшего количества инструкций, а
потому способен выполнять их гораздо быстрее центрального. И в-
четвертых, скорость обмена данных внутри адаптера может повышаться за
счет лучшего согласования обращений к видеопамяти с процессом
регенерации изображения, а также за счет расширения разрядности
110
2.2 Видеоадаптеры
внутренней шины данных адаптера. В современных графических адаптерах
широко применяется двухпортовая видеопамять VRAM и WRAM, а
разрядность внутренней шины 64 бит (при 32-битной внешней шины)
считается нормой. На подходе и адаптеры со 128-разрядной внутренней
шиной. Архитектура современных видеоадаптеров представлена на рис. 2.4.
Рисунок 2.4 - Архитектура видеоадаптера
По отношению к центральному процессору и оперативной памяти
компьютера различают графические сопроцессоры и акселераторы.
Графический сопроцессор представляет собой специализированный
процессор с соответствующим' аппаратным окружением» который
подключается к шине компьютера и имеет доступ к его оперативной памяти.
В процессе своей работы сопроцессор пользуется оперативной памятью,
конкурируя с центральным по доступу и к памяти и к шине.
Графический акселератор работает автономно и при решении своей
задачи со своим большим объемом данных может и не выходить на
системную шину. Акселераторы являются уже традиционной составляющей
частью практически всех современных графических адаптеров. Специально
для мощных графических адаптеров в 1996 году появился новый канал связи
с оперативной памятью компьютера- AGP. Графический акселератор
является мастером шины AGP и может пользоваться основной памятью
компьютера для своих нужд при трехмерных построениях.
111
2 Управление видеосистемой
2.3. Работа в текстовых режимах
2.3.1. Содержание видеопамяти в текстовом режиме
В текстовых режимах устанавливается следующее соответствие между
видеопамятью и изображением на экране: в начале памяти записываются
данные о символе, находящемся на первой строке в левом углу, затем данные
об остальных символах первой строки, затем данные о символах второй
строки начиная слева и т. д.
При выводе текста различные видеосистемы работают одинаково. Для
экрана отводится 4000 байт, так что на каждую из 2000 позиций экрана (25
строк * 80 символов) приходится 2 байта. Первый байт содержит код ASCII
символа. Аппаратура дисплея преобразует номер кода ASCII в связанный с
ним символ и посылает его изображение на экран. Второй байт (байт
атрибутов) содержит информацию о том, как должен быть выведен данный
символ. Для монохромного дисплея он устанавливает, будет ли данный
символ подчеркнут, выделен яркостью или негативом, либо применяется
комбинация этих атрибутов. В цветных системах байт атрибутов
устанавливает основной и фоновый цвета символа, а также признак его
мигания.
При записи данных прямо в видеопамять (начальный адрес видеопамяти
для цветных текстовых режимов равен B8000h) значительно повышается
скорость вывода на экран.
2.3.2. Видеоатрибуты символов
Адаптеры MDA и CGA. Цветной адаптер может выводить в цвете как
символ, так и всю область, отведенную данному символу (фоновый цвет).
Монохромный адаптер ограничен только черным и белым цветом, но он
может генерировать подчеркнутые символы, чего не может делать цветной
адаптер.
На рис. 2.5 приведен формат байта видеоатрибута, который в адаптере
CGA непосредственно задает цвета символа и фона.
7 6 5 4 3 2 1 0
м R | G |В I | R 1 G | В
* Цвет фона Цвет символа
Рисунок 2.5 - Байт видеоатрибута
Как цвет символа, так и цвет фона определяются как сумма трех
основных цветов - красного, зеленого и синего. Биты, отмеченные символами
R, G и В показывают вхождение (0-не входит, 1-входит) соответствующей
112
2.3 Работа в текстовых режимах
цветовой составляющей (R - красный, G - зеленый и В - синий) в цвет
символа и цвет фона. I - бит интенсивности (0-символ неяркий, 1-символ
яркий). М - бит мерцания (0-символ не мерцает, 1-символ мерцает). * -
возможен режим, когда бит М будет определять не мерцание символа, а
интенсивность цвета фона. Все возможные цвета приведены в таблице 2.1.
Таблица 2.1 - Цвета символов и фона
IRGB Цвет
0000 черный "'S
0001 синий
0010 зеленый S
001 1 голубой(циан)
0100 красный
я 0101 розовый (мажента) ST
i 01 10 коричневый
я j 0111 серый У
«и 1000 темно-серый
>5 1001 ярко-синий
я 1010 светло-зелен ый
1011 светло-голубой
1100 светло-красный
1101 светло-розовый
1110 желтый
1 1111 белый
Адаптер EGA. В 16-цветных текстовых режимах в адаптере EGA
действует такой же формат атрибутного байта, как в адаптере CGA. Однако в
адаптере EGA введены дополнительные преобразования 4-битных значений
цветов переднего плана и фона. Во-первых, каждое 4-битное значение
маскируется младшими битами регистра разрешения цветовой плоскости
(индекс 12h) в атрибутном контроллере и, во-вторых, полученное после этого
4-битное значение выбирает один из 16 регистров палитры (эта операция
называется также индексированием цвета и представлена на рис. 2.6).
Считываемое из выбранного регистра палитры 6-битное значение
rgbRGB (где г, g, b - слабые интенсивности - 1/3 от max, RGB - нормальные
интенсивности - 2/3 от max) определяет окончательный цвет символа/фона.
Следует отметить, что схема индексации цвета отдельных пикселей с
помощью регистров палитры работает и в графических режимах (см. ниже),
если цвет пикселя задается 4-битным значением. Таким образом, палитра в
адаптере EGA состоит из 64 цветов, но одновременно на экране можно
наблюдать только 16 из них. Когда же адаптер работает с мониторами,
рассчитанными на 200 строк развертки (эмуляция адаптера CGA, в каждом
регистре палитры биты 2, 1 и 0 управляют сигналами цветов, а бит 4
определяет интенсивность, как в адаптере CGA.
113
2 Управление видеОсистем°й
Примечание. На рис. 2.6 и далее через символ / указаны порты
адрес/данные и иНДекс- Запись (3C0h/3C0h, инд. - 12h) означает, что для
программирования регистра разрешения цветовой плоскости необходимо в
адресный порт (ЗСОЬ) занести индекс (12h), после чего в порт данных (3C0h)
занести необходимей К°Д (в данном регистре действительны только младшие
4 разряда).
Рисунок 2.6 *“ Формирование цвета символа/фона в адаптере EGA
Адаптеры VG^ и SVGA. В адаптере VGA эмулируется дешифрация
атрибутов адаптера EGA (первая ступень индексации), но наряду с 16
регистрами палитры имеется ЦАП со своими 256 регистрами цвета PEL.
Поэтому содержимое выбранного регистра палитры подается как индекс в
ЦАП и выбираемой регистр цвета определяет окончательный цвет
символа/фона.
В зависимости от состояния бита 7 в регистре управления режимом
атрибутного контродлеРа (индекс 10h) реализуются два способа выбора
регистра ЦАП. Когда этот бит находится в состоянии 0, атрибутный
контроллер объедиВ#ет 6-битное значение из регистра палитры с битами 3 и
2 своего регистра выбора цвета (индекс 14h). Полученное 8-битное значение
подается в ЦАП И выбирает один из его регистров цвета, как показано на
рис. 2.7.
Таким образом» в этом случае 6-битный код из регистра палитры
используется для выбора регистра в одной из четырех групп по 64 регистра
цвета ЦАП в кажД0Й, а биты 3 и 2 регистра выбора цвета определяют
конкретную группу. На рис. 2.7 предполагается, что биты 3 и 2 содержат
комбинацию 01b И определяют первую группу регистров цвета ЦАП.
Изменяя содержим^ бит 3 и 2 регистра выбора цвета, можно практически
мгновенно изменить нвета всех символов на экране.
Когда же бит 1 регистра управления режимом находится в состоянии 1,
в формировании цвета пикселя участвуют только четыре младших бита
114
2.3 Работа в текстовых режимах
номера регистра цвета ЦАП. Старшие четыре бита этого номера берутся из
бит 3-0 регистра выбора цвета. В этом случае регистр палитры используется
для выбора конкретного регистра в одной из 16 групп по 16 регистров цвета
ЦАП в каждой, а биты 3-0 регистра выбора цвета определяют конкретную
группу.
Регистр выбора
Аналоговые сигналы
в монитор
Рисунок 2.7 - Формирование цвета символа/фона в адаптере VGA
(бит 7 регистра управления режимом содержит 0)
2.3.3. Управление цветом бордюра, курсором
Управление цветом границы экрана (бордюра). Граница символьного
экрана (за пределами адресной области) может иметь цвет, отличный от
фонового цвета центральной части экрана. Может быть использован любой
из 64 цветов для EGA. Цвет бордюра задается регистром I lh блока атрибутов
адаптера.
При подключении улучшенного графического дисплея возможно
задание любого из 64 цветов. Для задания цвета бордюра в EGA необходимо
выполнить следующие действия:
115
2 Управление видеосистемой
- прочитать порт 3DAh для инициализации адресного регистра;
- задать номер регистра 1 lh путем его записи в порт 3C0h;
- задать цвет бордюра путем засылки байта данных в порт 3C0h;
- разрешить вывод на экран путем установки 5 бита адресного регистра
блока в 1 ( засылка кода 20h в порт 3C0h).
Изменение цвета бордюра используется в драйверах клавиатуры для
индикации переключения между русским и латинским алфавитом.
Управление курсором. Курсор служит двум целям. Во-первых, он
служит указателем места на экране, в которое операторы программы
посылают свой вывод. Во-вторых, он обеспечивает видимую точку отсчета
на экране для пользователя программы. Только для второго применения
курсор должен быть видимым. Когда курсор невидим (выключен), он все
равно указывает на позицию экрана. Это важно, поскольку любой вывод на
экран, поддерживаемый операционной системой, начинается с текущей
позиции курсора.
Курсор генерируется блоком управления ЭЛТ видеоадаптера. Блок
имеет регистры, устанавливающие размер и положение курсора. При этом
обеспечивается только мерцающий курсор, хотя имеются программные
способы создания немерцающего курсора. Частота мерцания курсора не
может быть изменена. В графических режимах курсор не выводится, хотя
символы позиционируются на экране теми же процедурами установки
курсора, что и в текстовых режимах.
Когда видеосистема работает в режиме, допускающем несколько
дисплейных страниц, каждая страница имеет свой собственный курсор и при
переключении между страницами восстанавливается позиция курсора,
которую он занимал, когда было последнее обращение к восстанавливаемой
странице. Текстовые режимы позволяют иметь до 8 страниц и
соответствующие им позиции курсора хранятся в наборе восьми 2-байтовых
переменных в области данных BIOS (см. ниже).
1) Управление координатами курсора (позиционирование). Для курсора
могут быть установлены абсолютные координаты или координаты
относительно его текущей позиции. Абсолютные координаты могут меняться
в пределах 25 строк и 80 (иногда 40) столбцов.
Регистры OEh и OFh блока CRTC хранят положение курсора. Адресный
регистр имеет порт 3D4h (в 3D5h заносятся данные). Старший байт хранится
в регистре OEh, младший - в регистре OFh.
Можно изменить их значение и курсор передвинется в
соответствующую позицию экрана, но прерывания вывода на экран BIOS
будут игнорировать эту установку и вернут курсор в старое положение. Это
происходит потому, что каждый раз при вызове этих прерываний они
восстанавливают регистры курсора, используя 2-байтовое значение,
хранящееся в области данных BIOS.
116
2.3 Работа в текстовых режимах
В этой области, начиная с адреса 0040:0050h, могут находиться до
восьми таких значений, дающих текущее положение курсора для каждой из
страниц дисплея. Первая позиция соответствует странице 0, вторая странице
1 и т.д. Младший байт каждой переменной содержит номер столбца, а
старший - номер строки. Как столбцы, так и строки нумеруются с нуля.
Процедура низкого уровня должна модифицировать и эти значения, чтобы
изменить состояние курсора полностью.
Позиция курсора хранится в регистрах OEh и OFh как число от 0 до
1999, что соответствует 2000 (25x80) позициям экрана. Не спутайте эту
систему нумерации с позициями видеобуфера от 0 до 3999, где каждый
символ сопровождается еще байтом атрибутов (для получения
эквивалентного указателя на позицию курсора надо сдвинуть указатель
видеобуфера на 1 бит вправо). Следует обратить внимание на то, что не надо
менять местами старший и младший байты: в регистре OEh - старший, a OFh -
младший. Курсор функционирует независимо от видеопамяти. Это значит,
что при прямой адресации в память дисплея программное обеспечение
должно координировать перемещения курсора с вставкой нового символа в
буфер.
2) Управление формой курсора. Курсор может меняться по толщине от
тонкой линии до максимального размера, отводимого под символ. Он
строится из коротких горизонтальных отрезков, верхний из которых
называется начальной строкой курсора, а нижний - конечной строкой.
BIOS хранит 2-байтовую переменную по адресу 0040:0060h, которая
содержит текущие значения начальной и конечной строк. Первый байт
содержит значение конечной строки, а второй - начальной.
Во всех видеосистемах регистры OAh и OBh определяют тип или форму
курсора. Биты 0-4 обоих регистров предназначены для задания начальной и
конечной строк развертки курсора в символьной позиции (OAh верхняя
строка a OBh нижняя строка символьного знакоместа).
Комбинации в битах 5 и 6 в регистре OAh служат для управления
курсором и имеют следующий смысл:
- 00 - формируется немерцающий курсор;
- 01 - вывод курсора запрещен;
- IX - частота мерцания курсора.
Отметим, что в персональных компьютерах фирмы IBM биты 5 и 6
регистра OAh не используются. На экране в текстовом режиме всегда
формируется текстовый курсор, причем частотой мерцания курсора
управляют другие схемы адаптера,
В адаптерах EGA и VGA биты 6-5 регистра конца курсора (OBh)
управляют сдвигом (skew) курсора вправо. Если в них не содержится
комбинация 00b, то курсор появляется на одну (01b), две (10b) или три (11b)
117
2 Управление видеосистемой
символьные позиции правее той позиции, которая определяется регистрами
позиции курсора.
Создание альтернативных типов курсора. Все прерывания
операционной системы, связанные с выводом на экран, используют курсор.
Можно изменить форму курсора или сделать курсор невидимым путем
задания адреса больше 2000 или задания номера начальной строки больше
номера конечной строки. Возможны альтернативные типы курсора, когда
вывод на экран осуществляется с помощью методов прямого отображения в
память. При этом "истинный" курсор выключается, поскольку он не будет
адресовать символы в определенную позицию видеобуфера. Вместо этого
создается "фальшивый" курсор с помощью байта атрибутов.
Наиболее эффективным методом является установка атрибута вывода в
негативе для символа, на который указывает курсор. Для черно белого экрана
в качестве этого атрибута следует применять код ASCII 112. Другой способ -
заставить символ, на который указывает курсор, мигать. В этом случае надо
просто добавить 128 к текущему значению атрибута, чтобы символ начал
мигать, и вычесть 128, чтобы прекратить мигание. Третий способ -
установить для символа режим подчеркивания (код ASCII 1). И наконец, в
программах, использующих командную . строку, можно рассмотреть
применение специального графического символа, который следует за
последним символом командной строки, такого, как стрелки, выводимые
кодами ASCII 17 или 27. Отметим, что когда программа получает ввод в
нескольких режимах, вы можете помочь идентифицировать текущий режим
за счет особого типа курсора.
2.3.4. Управление шрифтами
Аппаратный текстовой знакогенератор (alphanumeric character generator
- входит в состав контроллера атрибутов) во всех видеосистемах опирается
на использование находящихся в памяти таблиц шрифтов. При этом таблица
должна быть размещена в конкретной области памяти, чтобы к ней мог
обращаться текстовый знакогенератор.
Таблица шрифтов в ПЗУ. В видео-BIOS имеются встроенные таблицы
шрифтов, которые применяются для инициализации ОЗУ знакогенератора
(область видеопамяти) при задании текстового режима. Таблица определений
символов находится в ПЗУ вне адресного пространства процессора. Так как
современные видеоадаптеры поддерживают текстовые режимы с различной
разрешающей способностью по вертикали, размер принимаемых по
умолчанию таблиц шрифтов оказывается переменным (от 8*8 для режимов
CGA до 9*16 для режимов VGA). Так как разрешающая способность по
горизонтали в текстовых режимах обычно составляет 720 пикселей при 80
символах, каждый символ фактически выводится на матрице шириной девять
118
2.3 Работа в текстовых режимах
пикселей. Аппаратный знакогенератор добавляет для каждого символа
лишний пиксель справа в каждом ряду из восьми пикселей. В символах
блоковой графики (коды COh - DFh) в этом лишнем пикселе повторяется
значение правого пикселя, а для всех остальных символов лишний пиксель
выводится с атрибутом фона.
Так как девятый пиксель в символах блоковой графики дублирует
восьмой пиксель, такие символы ’’слипаются", что позволяет формировать
отрезки горизонтальных прямых без разрывов. Для всех остальных символов
девятый символ просто дополнительно разделяет символы и текст с экрана
воспринимается лучше. Отметим, что в адаптерах, начиная с EGA, можно
управлять значением девятого пикселя в символах блоковой графики. Если
бит 2 регистра управления режимом атрибутного контроллера (3C0h/3C0h,
индекс 10h) содержит 1, то девятый пиксель повторяет восьмой, а если бит 2
находится в состоянии 0, девятый пиксель выводится как фоновый.
Таблица шрифтов в видеопамяти. В адаптеры EGA и выше встроены
текстовые знакогенераторы, в которых используются таблицы шрифтов,
размещенные в конкретных областях видеопамяти (в адресном пространстве
процессора). Зная размещение этой области и его формат, можно разработать
программы, которые модифицируют таблицы шрифтов, т.е. изменяют
выводимый в текстовых режимах символьный набор.
В текстовых режимах адаптеров EGA и выше видеобуфер организован
так же, как в графических режимах, т.е. в виде четырех параллельных
битовых плоскостей (см. п. 2.4). Начальный адрес видеобуфера отображается
на адрес B800:0000h или B000:0000h. Однако выводимые на экран данные
содержатся только в битовых плоскостях 0 и 1 (установлен режим чет/нечет,
а плоскости 2 и 3 замаскированы регистрами блока синхронизации). Это
приводит к тому, что байты с четными адресами (содержащие коды
символов) находятся в плоскости 0, а байты с нечетными адресами
(содержащие атрибуты) размещаются в плоскости 1 (рис. 2.8).
Определения символов (шрифты)
Байты атрибутов
Плоскость 3
ASCII коды символов
—- Плоскость!
Плоскость 1
Плоскость О
Рисунок 2.8 - Видеобуфер адаптеров EGA и выше в текстовых режимах
Такая организация "невидима" для процессора, так как обращениями к
плоскостям 0 и 1 управляет видеоадаптер. Текстовый знакогенератор
119
2 Управление видеосистемой
использует таблицы шрифтов из 256 символов (символьные банки), которые
находятся в плоскости 2. Адаптер EGA допускает четыре таблицы, а адаптер
VGA поддерживает восемь таблиц (см. рис. 2.9).
Каждая таблица содержит 256 32-байтных двоичных наборов, поэтому
максимальная высота символьной матрицы составляет 32 строки развертки.
Смещение
OOOOh
4000h
800011
COOOh
Определения 256 символов (байк 0) 8 Кбайт
Не используется 8 Кбайт
Определения 256 символов (банк 1) 8 Кбайт
Не используется 8 Кбайт
Определения 256 символов (банк 2) 8 Кбайт
Не используется 8 Кбайт
Определения 256 символов (банк 3) 8 Кбайт
Не используется • 8 Кбайт
а) адаптер EGA
Смещение
иииип 2000h Определения 256 символов (банк 0)
4000h Определения 256 символов (банк 1)
Определения 256 символов (банк 2)
VWvil 8000h Определения 256 символов (банк 3)
Определения 256 символов (банк 4)
AvWII COOOh Определения 256 символов (банк 5)
Определения 256 символов (байк 6)
EOOOn Он редел ей ия 256 символов (банк 7)
8 Кбайт
8 Кбайт
8 Кбайт
8 Кбайт
8 Кбайт
8 Кбайт
8 Кбайт
8 Кбайт
б) адаптер VGA
Рисунок 2.9 - Расположение описаний символов
во второй битовой плоскости видеопамяти
Когда реально используемая символьная матрица содержит менее 32
строк, знакогенератор просто игнорирует лишние байты в определении
каждого символа.
В адаптере EGA под каждую таблицу шрифта отведено 16 Кбайт.
Поскольку реальный размер таблицы составляет 8 Кбайт (32 байта * 256
символов), в каждой таблице оставлены незадействованными 8 Кбайт. В
адаптере VGA восемь таблиц занимают всю 2 битовую плоскость без '’про-
межутков”.
Работа с символьными наборами и создание специальных символов.
Только монохромный адаптер не может выводить символы вида, заданного
самим программистом. Адаптер CGA поддерживает 128 символов,
120
2.3 Работа в текстовых режимах
определяемых пользователем, EGA и VGA- несколько таблиц описаний (4 и
8 соответственно, при одновременно доступных двух символьных наборах).
1) Замена описаний символов в видеопамяти. Для того чтобы работать
на компьютере с новыми шрифтами текстового режима, необходимо
разработать новую таблицу шрифта, а затем сделать ее доступной
аппаратному знакогенератору, поместив таблицу в соответствующую область
видеобуфера.
Копирование таблицы шрифта в 2 плоскость видеобуфера требует для
прямой адресации этой плоскости соответствующего программирования
регистров режима памяти и регистра маски битовой плоскости в секвенсере,
а также регистра режима и вспомогательного регистра графического
контроллера. После этого можно скопировать определения символов в
любую из таблиц. Разумеется, после загрузки таблицы шрифта необходимо
восстановить содержимое регистров секвенсера и графического контроллера
в соответствии с текущим текстовым режимом (см. примеры).
После подготовки регистров секвенсера и графического контроллера для
прямой адресации плоскости 2 видеобуфера к ней можно обращаться
обычным образом, как к стандартной области памяти в адресном
пространстве процессора с начальным адресом AOOOOh.
Восстановление содержимого регистров секвенсера и графического
контроллера производится так же, как их программирование, но, разумеется,
с другими значениями параметров.
2) Использование символьных наборов из видеопамяти. При
использовании определений символов из таблиц в видеопамяти приходится
решать, как текстовый знакогенератор должен дешифрировать коды
символов и атрибуты, которые хранятся в выводимой на экран части
видеобуфера. Проще всего воспользоваться стандартным 256-символьным
набором ASCII с 8-битными кодами символов и 8-битными атрибутами.
Однако для вывода одновременно более 256 различных символов или для
быстрого переключения между символьными наборами необходимо
пользоваться ’’расширенными” кодами символов и различными наборами
атрибутов.
При задании в адаптерах текстового режима с помощью BIOS,
знакогенератор программируется на вывод символов, определенных в первой
(нулевой) таблице видеопамяти. Для вывода другого набора символов
необходимо заменить эту таблицу. Удобным средством для замены символов
является функция llh прерывания INT 10h. Эта же функция позволяет
выводить 256 символов, определенных в любой другой таблице.
а) Расширенные символьные наборы. Как было указано ранее, в
видеопамяти может храниться определения более 256 символов. Благодаря
этому появляется возможность применять расширенные символьные коды,
содержащие более обычных 8 бит.
121
2 Управление видеосистемой
В адаптерах EGA и VGA число символов удваивается, когда бит 3
атрибутного байта задает одну из двух таблиц шрифтов в 2 битовой
плоскости. При этом в текстовом режиме на экран можно выводить
одновременно 512 различных изображений символов (рис. 2.10).
Байт атрибутов
4 3 0
Регистр выбора
символьного байка
(3C4h/3C5h, инд.-03h)
Рисунок2.10 - Выбор таблиц шрифтов в адаптере VGA
Обычно состояние этого бита не влияет на выводимый символьный
набор, что объясняется следующими причинами. Бит 3 атрибутного байта
определяет одно из двух полей в регистре выбора символьного банка
секвенсера (3C4h/3C5h индекс 03h). Каждое из них имеет 2 бита в адаптере
EGA и 3 бита в адаптере VGA. Если бит 3 атрибутного байта содержит 0, он
задает поле из бит I и 0 в адаптер EGA и поле из бит 1, 0 и 4 в адаптере VGA.
Если же бит 3 атрибутного байта находится в состоянии 1, выбирается поле
из бит 3 и 2 в адаптере EGA или из бит 3, 2 и 5 в адаптере VGA. В свою
очередь, каждое поле определяет одну из имеющихся в ОЗУ таблиц шрифтов,
т.е. каждое поле содержит номер таблицы.
При задании режима с помощью BIOS принимаемая по умолчанию
таблица шрифта загружается в первую (нулевую) таблицу 2 битовой
плоскости видеобуфера, а оба двоичных поля в регистре выбора символьного
банка сбрасываются в 0. В результате принимаемый по умолчанию шрифт
определяется двоичным набором в первой (нулевой) таблице независимо от
состояния бита 3 атрибутного байта выводимых символов. Такая же ситуация
возникает, когда в обоих полях находятся другие, но одинаковые значения;
конечно, при этом привлекается другая таблица шрифта.
122
2.3 Работа в текстовых режимах
Для одновременного вывода на экран двух символьных наборов в два
поля регистра выбора символьного банка следует загрузить различные
значения (см. пример для адаптера VGA на рис.2.10).
Однако бит 3 атрибутного байта сохраняет и свой обычный смысл
атрибута переднего плана. Когда он находится в состоянии 0, цвет переднего
плана берется из первых восьми регистров палитры (регистры 0000b - 0111b),
а когда бит 3 содержит 1, привлекаются вторые восемь регистров палитры
(регистры 1000b - 1111b). Следовательно, два выбираемых битом 3
символьных набора выводятся с двумя наборами цветов, определяемых
соответствующими регистрами палитры. С каждым символьным набором
можно ассоциировать различные палитры из восьми цветов, а при
одинаковом содержимом двух групп регистров палитры состояние бита 3
атрибутного байта не влияет на цвет выводимых символов. Конечно, во
втором случае число одновременно наблюдаемых на экране цветов
уменьшается до восьми.
б) Изменение размеров символьной матрицы. При хранении таблицы
шрифта в видеопамяти можно управлять высотой символьной матрицы, т.е.
числом строк развертки, приходящихся на символ. В адаптерах EGA и выше
допускается изменение высоты текстовых символов с помощью
программирования контроллера CRTC на вывод символов того размера,
который задан в ОЗУ знакогенератора.
2.3,5. Профессиональное программирование видеоадаптера в
текстовом режиме
23.5.1. Страничная организация видеопамяти и аппаратные сдвиги
Поскольку все видеосистемы, кроме монохромного дисплея, имеют
достаточно памяти для нескольких видеобуферов, одновременно могут быть
сконструированы несколько экранов, каждый из которых может быть
выведен в нужный момент. Вместо того чтобы передвигать данные в
видеопамяти, монитор посылает данные из другой области видеопамяти.
Число доступных страниц может меняться в зависимости от видеосистемы и
режима дисплея.
В режимах 0-3 и 7 поддерживается 8 страниц. BIOS хранит в своей
области данных однобайтовую переменную ACT PAGE, указывающую,
какая из страниц выводится в данный момент. Диапазон значений этой
переменной от 0 до 7. Она расположена по адресу 0040:006211.
Дисплейные страницы выбираются за счет изменения точки
видеопамяти, начиная с которой монитор принимает данные. Эта точка
памяти устанавливается регистрами OCh (старший байт) и ODh (младший
байт) контроллера CRTC, которые называются регистрами стартового адреса.
123
2 Управление видеосистемой
Для программирования регистров стартового адреса необходимо записать
номер регистра в адресный регистр блока (записать номер в порт 3D4h, после
чего записать данные в порт 3D5h). Значения стартовых адресов страниц для
текстовых режимов 40*25 и 80*25 приведены в табл. 2.2.
Таблица 2.2 - Начальные адреса страниц
текстовых режимов 40*25 и 80*25
№ страницы Начальный адрес страницы в видеопамяти
Для страниц 40*25 Для страниц 80*25
0 0000b OOOOh
1 0400b 0800b
2 0800h lOOOh
3 0C00h 1800h
4 lOOOh 2000h
5 1400h 2800h
6 1800h 3000h
7 ICOOh 3800h
Поскольку страницы текста прилегают друг к другу в видеобуфере,
небольшой текстовый массив может целиком помещаться в этой памяти. В
этом случае текст можно листать или сдвигаться вверх/вниз, вправо/влево по
экрану, не передвигаясь реально в буфере. Вместо этого экран начинает
показывать содержимое буфера, начиная с различных точек, и тем самым
создается иллюзия сдвига. Этот метод называется аппаратным сдвигом.
Аппаратный сдвиг достигается за счет изменения стартового адреса
вывода. Это число, указывающее на символ в видеобуфере, который будет
выводиться в левом верхнем углу экрана. Добавление 80 к этому числу
"сдвигает” весь экран на одну строку вверх, а вычитание 80 - на одну строку
вниз. В режиме с 40 символами в строке надо вместо 80 прибавлять или
вычитать 40. Добавление/вычитание единицы к стартовому адресу "сдвигает”
весь экран влево/вправо на одну символьную позицию. Однако в данном
случае выполняется "циклической" сдвиг (при сдвиге вправо крайние правые
символы перемещаются в первую позицию следующей строки). Для
получения "линейного” сдвига вправо необходимо очистить (или сделать
невидимым) первый столбец текстового экрана (см. примеры).
Кроме рассмотренных выше аппаратных сдвигов текстового экрана на
целое число символов или текстовых строк путем изменения стартового
адреса, имеется возможность пиксельных сдвигов текстовых экранов. Для
пиксельных сдвигов вверх в пределах одной текстовой строки используется
регистр установки строки растра контроллера ЭЛТ (3B4h/3B5h, индекс 8h). В
обычном режиме в регистре записан 0. При этом символы первой текстовой
строки выводятся на экран, начиная с нулевого байта описания (первая
строка выводится на экран полностью).
124
2.3 Работа в текстовых режимах
Если в этот регистр записать ненулевое число к (к должно быть меньше
высоты символьной матрицы), то первая текстовая строка начнет выводится
с k-го байта описания (символы первой строки будут ’’урезаны" сверху на к
строк развертки) и весь экран сдвинется вверх на к пикселей (при этом самая
нижняя строка развертки экрана выведет первые к байт описания "лишней”
26 текстовой строки). Комбинируя операции изменения стартового адреса и
регистра установки строки растра, можно получать плавные пиксельные
сдвиги текстового экрана вверх/вниз.
Аналогичным образом для пиксельных сдвигов вправо/влево
используется регистр горизонтального сдвига пикселей контроллера
атрибутов (3C0h/3C0h, индекс 13h).
С помощью аппаратных сдвигов легко реализуются бегущие строки.
Для этого каждый новый символ строки вводится в одну и ту же позицию
экрана (крайняя строка или столбец), но после ввода каждого символа
выполняется аппаратный сдвиг экрана в противоположную от вводимой
позиции. В бегущих строках слева-направо и справа-налево надо еще
позаботится о том, чтобы удалять "бегущие" символы, которые достигли
противоположной стороны экрана (иначе будет эффект "циклического"
сдвига).
Отметим, что регистр стартового адреса не считает байты атрибутов
(адресация выполняется параллельно по 0 и 1 битовых плоскостях). Следует
помнить, что, несмотря на наличие разрывов памяти между границами
страниц (96 байт между 80-символьными страницами и 48 байт между 40-
символьными страницами), контроллер ЭЛТ пропускает эти области и сдвиг
непрерывно происходит с одной страницы на следующую. Аппаратный сдвиг
происходит настолько быстро, что может оказаться необходимым вставить
процедуру задержки, чтобы пользователь имел возможность увидеть,
насколько сдвинулся экран.
BIOS хранит текущее значение регистра стартового адреса в переменной
CRTJSTART в своей области данных. Эта двухбайтовая переменная
расположена по адресу 0040:0004ЁН.
При прямом отображении в видеопамять (чтение/запись) следует
учитывать то, что видеопамять в текстовых режимах начинается с
сегментного адреса B800h, а начальные адреса страниц необходимо
умножать на 2 (процессор адресует коды символов и атрибуты).
23.5.2. Создание разделенного экрана
Адаптеры EGA и выше позволяют на аппаратном уровне создавать так
называемый разделенный по горизонтали экран как в текстовом, так и в
графическом режимах. Верхнюю часть экрана будем называть экраном А, а
нижнюю - экраном В, как это показано на рис. 2.11 а.
125
2 Управление видеосистемой
На рис. 2.11 б показано отображение экранов на видеопамять.
Информация в экране А находится по адресу, определенному значениями
регистров старшей и младшей составляющих начального адреса (ОСЬ и ODh)
блока управления ЭЛТ. Данные экрана В всегда расположены в видеобуфере
по адресу OOOOh.
Экран А OOOOh OFFFh Область данных экрана В Область данных экрана А ▲ Стартовый Г адрес
Экран В
а) структура разделенного экрана б) отображение экранов на видеопамять
Рисунок 2.11 - Организация разделенного экрана
Для организации работы с разделенным экраном используется
10-разрядный регистр сравнения строк (младшие биты 0-7 которого
отображаются на порт 18h, бит 8 отображается на 4 бит порта 7h - регистр
переполнения, а бит 9 отображается на 6 бит порта 9h - свободный бит
регистра вертикального размера символа) блока управления ЭЛТ
(3D4h/3D5h). Необходимо сначала задать номер строки развертки (а не
текстовой строки), которая является границей двух экранов, после чего
выделить биты и запрограммировать три порта (18h, 7h и 9h), причем в
портах 7h и 9h другие биты, не связанные с регистром сравнения строк,
должны остаться без изменения.
В блоке управления ЭЛТ содержится внутренний счетчик выведенных в
текущем кадре строк растра, значение которого постоянно сравнивается со
значением регистра сравнения строк. Как только их значения становятся
равными, генератор адреса памяти сбрасывается в 0. После этого
генератором адреса формируются последовательные адреса, начиная с
нулевого адреса до завершения вывода кадра. При инициализации
видеосистемы регистр сравнения строк содержит максимальный код,
сравнение никогда не выполняется и нет разделенного экрана.
Граница экранов А и В может плавно перемещаться вверх/вниз по
экрану монитора для чего необходимо во время обратного вертикального
хода луча производить соответствующие изменения значения в регистре
сравнения строк. На экране А можно производить аппаратный скроллинг,
меняя значения стартового адреса.
126
2.3 Работа в текстовых режимах
23.5.3. Создание всплывающих окон и меню
При разработке прикладных программ часто возникает необходимость
выдачи сообщений пользователю по ходу решения задачи (подсказки,
предупреждения, сообщения об ошибках ), которые покрывают содержимое
экрана (буквально "всплывают” на экране) и после реакции пользователя
(нажатия клавиши) окно исчезает и экран восстанавливается. Такая
организация получила название всплывающего окна. Подобный механизм но
более сложная организация, используется при разработке всплывающих
меню. Современные объектно-ориентированные системы программирования
имеют стандартные средства реализации всплывающих окон и меню, однако
профессиональному программисту полезно изучить реализацию указанных
действий с учетом особенностей видеосистемы.
Когда используется всплывающее или иерархическое меню, то оно
покрывает прямо содержимое экрана. После выбора режима, экран
возвращается в предыдущее состояние. Вы выбираете нужный режим из
меню, используя клавиши управления курсором для передвижения
подсвеченного поля и клавишу Ввод. Обычно текущее поле показывается в
инверсном виде. Основная разница между стандартными меню и
всплывающими и иерархическими меню в том, что стандартное меню
прерывает программу. Всплывающее и иерархические меню только
приостанавливают текущие действия программы.
Разница между всплывающими и иерархическими меню проста. Только
одно всплывающее меню может быть на экране в данный момент времени.
Оно используется, когда меню имеет только один уровень в глубину. Это
бывает, когда выбор из меню не имеет подвыборов. С другой стороны
несколько иерархических меню могут быть активны одновременно. Они
используются когда выбор из одного меню может потребовать использования
другого меню для определения некоторых альтернатив.
Имеется три способа доступа к видеоадаптеру. Первый - через
прерывание ОС, которое достаточно медленно для всплывающего меню.
Второй - через процедуры BIOS, которые быстрее. Третий способ - чтение и
запись прямо в видеопамять, что происходит очень быстро, но требует
большей работы от программиста. Здесь рассматривается прямой доступ к
видеопамяти (см. примеры).
Создание всплывающих меню. Функции, создающей исчезающее меню,
должна быть передана некоторая информация. Во-первых, это список
предоставляемых меню режимов. Поскольку в меню передаются
высвечиваемые строки, то простейший путь передачи списка строк в
функцию - помещение их в двумерный массив и передача указателя на
массив. Как отмечалось ранее, значение меню может быть выбрано
передвижением освещенной области на нужное поле и нажатием Enter.
127
2 Управление видеосистемой
Функция должна также знать количество режимов в меню,
расположение меню (координаты X и Y). Наконец, в некоторых ситуациях
может быть желательным помещать меню в рамку, а в других - нет. Поэтому
должно быть передано значение рамка включена/выключена (в примере не
показано).
Функция menu делает следующее:
- сохраняет область экрана под меню;
- высвечивает меню;
- получает ответ пользователя;
- восстанавливает экран в исходное состояние;
Высвечивание меню. Для того, чтобы высветить меню, необходимо,
чтобы menu получала указатель на массив указателей на строки. Для
высвечивания отдельных строк просто индексируется указатель, как массив.
Каждый элемент в массиве является указателем на соответствующий элемент
меню.
Ввод выбора пользователя. Как отмечалось, пользователь с помощью
клавиш СТРЕЛКА ВНИЗ и СТРЕЛКА ВВЕРХ может переместить освещение
на выбранную строку и нажать Enter для ее выбора (обычно освещение
строки выполняется в инверсном режиме.) Функция get_resp(), показанная в
примере достигает этих целей. Когда menu начинает выполняться,
освещается первое значение меню.
Клавиша ESC используется для окончания работы с меню. После этого
программа входит в цикл, ожидающий действий пользователя. Она
использует функцию определения факта нажатия и анализ кода нажатия
клавиши, а затем считывания этой клавиши. Необходимо учесть, что если
нажата символьная клавиша, то символ помещается в младшие 8 бит буфера
клавиатуры. Однако, если нажата специальная клавиша, такая, как стрелка,
младший байт равен 0, а старший содержит ASCII код позиции клавиши.
Каждый раз при нажатии стрелки освещенная опция переходит в
нормальное изображение, а следующая - освещается, при этом
модифицируется переменная n_pos, которая хранит текущий номер позиции
меню.
Нажатие стрелки вниз в момент освещения крайней нижней позиции,
означает возвращение к первому значению. То же самое, но наоборот,
происходит когда нажимается стрелка вверх при освещенной первой строке.
Прямой доступ к видеопамяти. Для создания меню, которые
действительно всплывают, необходимо миновать вызовы функций BIOS и
прямо обращаться к видеопамяти. Это позволяет высвечивать символы с
молниеносной быстротой. При прямой записи и чтении из видеопамяти
можно использовать всплывающие меню в реальном времени.
В монохромных режимах использует для видеопамяти адрес
B000:0000h, а в цветных - B800:0000h. Для того, чтобы программы с меню
128
2.3 Работа в текстовых режимах
работали правильно во всех текстовых режимах, они должны знать, какой
режим имеет система. Для этого используется прерывание BIOS 16, функция
15, которое возвращает текущий видеорежим.
Как только переменной uk присвоен соответствующий адрес, появляется
простой способ использовать ее для чтения и записи символов в видеопамять.
Так как видеопамять требует два байта для каждого символа (один для
символа, а другой для атрибута), то каждой строке экрана требуется 160 байт.
Для определения адреса отдельного символа можно использовать выражение:
Адрес символа - начальныйадресводео + Y * 160 + X *2.
Для эффективного использования видеопамяти при выборе пользователя
достаточно в текущей позиции (которая в данный момент времени выводится
с негативными атрибутами ) изменить атрибуты, не переписывая по новому
коды символов, а в следующей выбранной позиции установить негативные
атрибуты.
23.6. Примеры программирования в текстовом режиме
23.2.1. Примеры программирования атрибутов символов
Пример 1. Данный пример устанавливает текстовый режим (режим 3) и
заполняет экран текстовой строкой ’’Пример Г’ с различными атрибутами.
Program attribute
uses dos,crt;
procedure attrib;
const
kod:string=’ripHMep Г;
atr:byte==$OO;
var
r: registers;
ij:word;
uk:Abyte;
begin
r,ah:~$0; { ' N функции установки режима }
r.al:=3;
intr(SlO^);
мтИе1в('установлен режим’,r.al);
repeat until readkey>#0;
uk:~ptr($b800,$0000);
for i:=4 to 200 do
begin
for j:=l to 10 do
begin
ukA:=ord(kod[j+l|);
inc(uk);
ukA:=atr;
inc(uk);
end;
inc(atr)
129
2 Управление видеосистемой
end;
repeat until readkey>#0
end;
BEGIN
attrib;
END.
Пример 2. Процедура программирует заданный регистр палитры.
Номер регистра палитры передается параметром nmpaliet, а значение цвета
параметром soderg.
procedure writepall (nmpaUet, soderg: byte);
var b:byte;
begin
b;=port [$3<la];
port [$3c0|:^nmpailct;
port ($3c0]:*=soderg;
b:=port [$3<№
port [$3cOJ:^32;
end;
Пример 3. Процедура читает цвета из выбранного регистра ЦДЛ. При
этом в порт 3C7h заносится значение переменной num (выбор регистра PEL
данных для чтения). После чего из порта 3C9h (регистр PEL данных)
считываются три 6-битовые значения. Первое значение определяет яркость
красного цвета (переменная red), второе - зеленого (переменная green),
третье - синего (переменная blue).
procedure readme (num: byte; var red* green, blue: byte);
begin
port [$3c7]:-nun*;
red:=port
green :=port ($3c9];
blue:*port [$3c9J;
end;
2.3.6.2. Примеры программирования курсора, цвета бордюра
Пример L Процедура устанавливает цвет бордюра. Для перевода
контроллера атрибута в режим адреса вначале читается порт 3DAh, после
чего в порт JCOh заносится номер регистра цвета бордюра (llh). Затем в
выбранный регистр записывается номер палитры (clr).
procedure Bordur (clr: byte);
var a: byte;
begin
a:-port [$3da|?
port [$3c0]:=$ll;
port j$3c0j:=dr;
port {$3c0]:=$20;
end;
130
2.3 Работа в текстовых режимах
Пример 2. Данная процедура перемещает курсор в заданную позицию
строки (nstr) и столбца (n st). Для функций ОС изменяется содержание
области сохранения BIOS (0040h:0050h).
procedure movk (w_str,n_s tbyte);
var
b, uk:Abyte;
begin
nom:=80 *n_str+n_st;
uk:=ptr($0040, $0050);
ukA:=n_st;
inc(uk);
ukA:=n_str;
b:-@nom;
port[$3d4J:—$0E;
port[$3d5]:“bA;
inc(b);
port[$3d4}:=$0F;
port[$3d5}:=bA;
repeat until readkey>#0;
end;
Пример 3. Данная процедура изменяет форму курсора с одновременным
изменением содержимого ячейки 0040h:0060h.
procedure form_k (n str, kjstr:byte);
var uk:Abyte; begin uk:=ptr($0040^0060); ukA:=k_str; inc(uk); ukA:=n_str; port[$3d4]:^a;
port ($3d5 j :=n_str; { начало курсора 1
port[$3d4j:=$b; port[$3d5] :=k_str; writeln(*5-str 20-st WHITE*); repeat until readkey>0; end; { конец курсора 1
2.3.6.3. Примеры программирования описаний символов
При вызове приведенных ниже процедур в основной программе
необходимо объявить тип type ch=array [0..31] of byte;
Пример 1. Данный пример демонстрирует замену определения символа
с номером num из банка bank на символ, образ которого записан в массиве
сгг.
procedure outchrb (bank, num:byte;crr:cb);
var a: byte;
begin
port [$3ceJ:==6; { адрес многоцелевого регистра }
port ($3ct]:=l; { граф, режим }
131
2 Управление видеосистемой
port [$3с4|:-2; {
port ($3c5J:=4; {
port [$3с4|:=4; {
port [$3c5j:==6; {
for a:==0 to 31 do
адрес регистра маски битовой плоскости }
бит. плоек. 2 }
адрес per. режима использования памяти }
отмена режима чет/нечет }
mem [SaOOO: bank*$2000+num*32+a]с г г | а];
port [$3с4}:~4;
port f$3c5}:—2;
port j$3c4]:=2;
port j$3c5]:=3;
port [$3ce]:=6;
port {$3cfl:=$e;
end;
Пример 2. Приведенный ниже процедура демонстрирует получение
растра, определяющего символ с номером num из банка bank.
procedure inpehrb (bank,num:byte;var crr:ch);
var a: byte;
begin
port [$3ceJ:=6; { адрес многоцелевого регистра
port |$3cf]:~l; { граф, режим
port j$3c4]:=2; { адрес регистра маски битовой плоскости
port [$3c5]:=4; { бит. плоек. 2
port [$3c4]:=4; { адрес per. режима использования памяти
port [$3c5] :=6; { отмена режима чет/иечет
port [$3cej:=5; { регистр режима программируется на
port [$3cfj:=0; { 0 режим чтения
port [$3ce]:=4; { в регистр выбора схемы чтения запи-
port f$3cfl:=2; { сывается номер необходимой плоскости
for a:=0 to 31 do
crr(a] :=mem [Sa000:bank*s2000+num*32+a];
port [$3ce|:=4;
port [$3cf]:=0;
port [$3ceJ:«5;
port [$3cf|:=$10;
port |$3c4]:=!4;
port [$3c5J:-2;
port [$3c4]:=2;
port [$3c5|:=3;
port [$3ce]:=6;
port [$3cf]:=$e;
end;
Пример 3. Процедура stl преобразует шрифт банка bank в ’’наклонный”
путем сдвига верхних линий развертки вправо, а нижних - влево.
procedure stl (bank:byte);
vai'azch;
Ucbyte;
begin
for k:=0 to 255 do
begin
inpehrb (bank,k,a);
for 1:=4> to 15 do
begin
132
2.3 Работа в текстовых режимах
if 1<5 then а[1|:=а[1] shr 1;
if 1>8 then shl 1;
end;
outchrb (bank,k,a);
end;
end;
2.3.6.4. Примеры профессионального программирования в
текстовом режиме
Пример 1. Процедура крайний правый столбец, procedure scrltrtst (koi: byte); var addrlirecord Io: byte; hi: byte; end; addr2:word absolute addrl; pt:Л word; kbyte; begin port[$3d4]:=$c; { addrl.hi:-port($3d5]; { port[$3d4]:=$d; { addrl.Io:=port[$3d5]; { addr2:~addr2+kol; { port[$3d4]:=$c; { port[$3d5]:=addrl.hi; { port[$3d4J:=$d; { port[$3d5]:==addrl.lo; { mlmem:~addr2; сдвигает экран влево на koi символов очищая выбор per. начальи. старшего адреса } чтение из него } выбор per. начальи. младшего адреса } чтение из него } модификация начального адреса } выбор и запись в регистр начального } старшего адреса } выбор и запись в регистр начального } младшего адреса }
pt:=ptr (stmem,mlmem); { for i:=l to 25 do begin inc (pt,80); ptA:==O; end; очистка крайнего правого столбца }
end;
Пример 2. Процедура сдвигает экран на koi пикселей по горизонтали
(kol<=7).
procedure scrltrtpiks (koi:byte); var a:byte; begin
a:=port [$3da]; { инициализация адресного регистра }
port |$3cOJ:=$13; { регистр горизонтального сдвига пикселей }
port [$3c0j:=kol; port [$3c0j:;=$20; { разрешение выводя }
end;
Пример 3. Процедура сдвигает экран вверх на koi строк,
procedure scrupdnstr (koi: byte);
var addrl: record
133
2 Управление видеосистемой
Io: byte;
hi: byte;
end;
addr2:word absolute addrl;
pt:A word;
i:word;
begin
port[$3d4]::=$c; { выбор per. начальн. старшего адреса }
addr 1. hi: =por t|$3d5]; { чтение из него }
port($3d4j:=$d; { выбор per. начальн. младшего адреса J
addrl .Io:=port[$3d5]; { чтение из него }
addr2:=addr2+kol*80; { модификация начального адреса }
port[$3d4]:=$c; { выбор н запись в регистр начального }
port[$3d5}: -addrl .hi; { старшего адреса }
portj$3d4]:=$d; { выбор н запись в регистр начального }
port($3d5 j: =addr1Jo; rtilmem:=addr2; { младшего адреса }
pt:=ptr (stmem,mlmem); inc (pt,(25-kol)*80); for i:=l to kol*80 do { очистка koi нижних строк }
begin
ptA:=O;
inc (pt);
end;
end;
Пример 4. Процедура сдвигает экран вверх на koi пикселей (kol<^7).
procedure scrupdnpiks (koi: byte);
begin
port [$3d4]:=*8; { выбор и запись в регистр номера начальной }
port |$3d5]:=kol; { строки растра символа }
end;
Пример 5. Процедура сдвигает экран вверх на koi пикселей (koi<=1024).
procedure scrupdnps (koi: byte); var koi l,ko!2: byte; begin
koll:~kol div 8; { вычисление количества полных строк }
kol2:-koi mod 8; { вычисление количества пикселей }
scrupdnstr (koll); { сдвиг на koll строк }
scrupdnpiks (ko!2); { сдвиг на ко!2 пикселей }
end;
Пример 6. Процедура выводит бегущую строку str, начиная с координат
х,у шириной 1 символ.
procedure runstr (x,y,l:byte;str:string);
var ptl:Achar;
i,k:byte;
pt2:Abyte;
begin
port[$3d4]:=$c; { выбор н запись в регистр начального }
portj$3d5J:=0; { старшего адреса }
port[$3d4j:s=$d; { выбор н запись в регистр начального }
port[$3d5j:=0; { младшего адреса }
ptl:=ptr (stmem,0);
134
2.3 Работа в текстовых режимах
pt2:==ptr (stmem,0);
inc (ptl,y*160+x*2+I*2);
inc (pt2,y*16O+x*2);
for i:~l to (ord(str[0])+l) do
begin
if i<==ord ( str[OJ) then ptl A:=str [i]
else ptlA:=chr (0);
pt2A:=0;
scrltrtst (1);
for k:=0 to 7 do
begin
scrltrtpiks (k);
delay (10);
end;
inc (ptl,2);
inc (pt2,2);
end;
end;
scrltrtpiks (0);
port[$3d4]:=$c; { выбор и запись в регистр начального }
port[$3d5]:=0; { старшего адреса }
port[S3d4]:=Sd; { выбор и запись в регистр начального }
port[$3d5]:=0; { младшего адреса }
Пример 7. Функция переписывает окно с координатами левого верхнего
угла - xl, yl, правого нижнего - xh, yh, из видеопамяти в ОЗУ и возвращает
указатель на сохраненное в динамической памяти окно.
function Wcrtram (xl,yl,xh,yh: byte): pointer;
var a: pointer;
b,c:Aword;
k, I: byte;
begin
getmem(a,(xh-xl)*(yh-yl)*2); b:=a; { выделение памяти под копню окна }
c:=PTR ($b800,160*yl+xl*2); { с указывает на первый байт окна }
for k:=yltoyhdo begin { цикл переноса окна }
for l:==x! to xh do begin bA:=cA; inc (b); inc (c); end; inc (c,79-xh+xl); end; Wcrtram:=a; { цикл переноса строки }
end;
Пример 8. Функция возвращает окно в видеопамять сохраненное
функцией Wcrtram.
function Wramcrt (xl,yi,xh,у h: byte; a: pointer): pointer;
var g: pointer;
b,c:Aword;
kJ: byte;
135
2 Управление видеосистемой
begin
b:~a;
c:=PTR (Sb800,yl*160+xl*2);
for k:=yi to yh do
begin
for i:=xl to xb do
begin
сЛ:=ЬЛ;
inc (c);
inc (b);
end;
inc (c,79*xh+xl);
end;
freemem (a,(xb-xl)*(yb-yl)*2);
Wramcrt:=nil;
end;
Пример 9. Процедура выводит одиночную рамку с зад
координатами.
procedure Ramka (xl,yl,xh,yh,clr:byte);
var a,c:Abyte;
b:byte;
begin
a:=ptr (Sb800,yl*160+xl*2);
c:=ptr ($b800,yh*160+xl*2);
for b:=0 to xh-xl-l do
begin
ал:=196;сл:=496;
inc (a);inc (c);
ал;=с1г;сл:-с1г;
inc (a);inc (c);
end;
a:==ptr ($b800,(yl+l)*160+xl*2);
ci=a;
inc (c,(xh-xl)*2);
for b:=0 to yb-yl-2 do
begin
ал:=179;сл:=179;
inc (a);inc (c);
aA:=clr;cA:==clr;
inc (a,159);inc (c,159);
end;
ал:=192;сл:=217;
inc (a);inc (c);
aA:=clr;cA:=clr;
dec (a,(yh-yi)*160+l);dec (c, (yh-yl)* 160+1 );
ал:=218;сл:-191;
inc (a); inc (c);
aA:=cJr; cA:=clr;
end;
Пример 10. Процедура очищает окно с заданными координатами,
procedure clrwin (xl,yl,xh,yh,clr:byte);
var a:Abyte;
136
2.3 Работа в текстовых режимах
b,с: byte;
begin
a:=PTR ($B800,yl*160+xl*2);
for b:=yltoyhdo
begin
for c:=xl to xh do
begin
ал:=176;
inc (a);
aA;s4,|r.
inc (a);
end;
inc (a,(79-xh+xl)*2);
end;
end;
Пример 11. Пример демонстрирует разделение по горизонтали экрана
адаптеров EGA/VGA, перемещение границы разделения нажатии клавиш
PgDn и PgUp, и скроллинг верхней части экрана при нажатии клавиш
"стрелка вверх” и “стрелка вниз". Четыре страницы видеобуфера
заполняются из текстового файла FILE.TXT.
program devidescr;
uses CRT,DOS;
var
frtext;
ij.iongint;
btzbyte;
c:char;
gr,adr:word;
begin
{ Открытие файла FILE.TXT }
assign(f,FILE.TXT ’);
reset(f);
clrscr;
for i:H) to 8000 do
begin
j:=2*i;
read(f,c); mem ($b800: j] :sord(c); end; close (I); gr:=100; adr:=0; Portf$3D4):==$7; bt:= Port[$3D51; Port($3D5j:=bt and SEF; Port[$3D4|:=$9; bt:= Port[$3D5J; Port($3D5]:=bt and SBF; Port|$3D4]:^$18; Port[$3D5J:=LO(gr); while true do begin { чтение символов из файла } { запись в видеопамять } { начальная граница экрана } { пач. адрес видеопамяти } { обнуление 8-го бита per. сравнения строк } { обнуление 9-го бита per. сравнения строк }
137
2 Управление видеосистемой
c:=readkey; { чтение первого байта клавиши 1
if с=#0 then c:~readkey; { case c of если расшир., чтение 2-го байта }
#81: { begin inc(gr); PortJ$3D4]:=S18; Port[$3D5|:=LO(gr); if ( gr and $100 ) о 0 then begin клавиша PgDn }
Portf$3D41:==$7; { bt:=Portf$3D5I; Port[$3D5]:=bt or $10; end; if ( gr and $200 ) о 0 then begin запись 8-го бита per. сравнения }
Port|$3D4]:=$9; { bt:= Port($3D5]; Port[$3D5]:=bt or $40; end; end; запись 9-го бита per. сравпеиня }
#73: { begin dec(gr); PortI$3D41:=$18; Port[$3D5]:=LO(gr); if ( gr and $100 >=0 then begin клавиша PgUp }
Port[$3D4]:s=$7; { bt:=Port[$3D5); Port[$3D5J:=bt and $EF; end; if ( gr and $200 )=0 then begin очистка 8-го бита per. сравнения }
Port[$3D4]:=$9; { bt:=Port[$3D5J; Port[$3D5]:=btand $BF; end; end; очистка 9-го бита per. сравнения }
#80: { begin стрелка вниз }
{ скроллинг вниз dec(adr,160); Port[$3D4}:=$0D; Port[$3D5]:=LO(adr); Port[$3D4|:*=$0C; Port[$3D5]:=HI(adr); end; }
#72: { стрелка вверх }
{ скроллинг вверх begin inc(adr,160); Port($3D4J:=$0D; I
138
2.3 Работа в текстовых режимах
Port[$3D5]:=LO(adr);
Port[$3D4]:=$0C;
Port|$3D5}:=HI(adr);
end;
#27: exit;
end;
end;
end.
клавиша ESC
Пример 12. Пример демонстрирует создание всплывающего меню при
непосредственной работе с видеопамятью.
(Sr-)
Program menu;
uses crt;
type tp=array[0..3] of string{91;
charp=Achar;
const
len:byte=9;
n_str:byte=4;
text p:tp=(’no3HiiHa Г,'позиция 2','позиция 3','позиция 4');
var
x,y,atr,neg_atr:byte; { для строки }
nn:byte;
uk,p:charp;
{ запись строки символов }
procedure write_string(x,y,len,atr: byte;p:charp);
var
kbyte;
v:cfaarp;
begin
v:=uk; { установка на начало видеопамяти
inc(v,(160*y)+2*x); { установка на начало меню
for i:=0 to len-1 do begin vA:=pA; inc(v); inc(p); { запись символа
vA:=char(atr); inc(v); { запись атрибута
end endi { процедура высвечивание меню
procedure display__menu(text_p: tp;x,y ,nstr,!en,atn byte);
var
i:byte;
begin
for i:=0 to n_str-l do
begin
{ вывод строки текста в заданных позициях
writestring (x,y,len,atr,@text_p[i] [1]);
inc(y)
end
end;
{ процедура сохранение экрана
}
I
}
}
}
}
}
139
2 Управление видеосистемой
procedure save_video(stx,endx,sty ,endy:byte; bufccharp);
var
begin
i,j:bytc;
v,t:charp;
v:=uk;
for j:=sty to endy-1 do
begin
начальный адрес меню в видеопамяти
inc(v,(j* 160)+stx*2);
t:^;
dcc(v,(j* 160)+stx*2);
for i:=stx to endx-1 do
begin
bufA:=tA;
inc(buf);
inc(t); { чтение символа
bufA:=tA;
inc(buf); { чтение атрибута
tA:=*
inc(t) { очистка-заполнение пробелом
end { i
end { j
( процедура восстановление части экрана под меню
procedure res_video(stx,endx,sty,endy: byte; buf: charp);
}
}
}
}
}
}
var
ij:byte;
v,t: charp;
begin
v:=uk;
for j:=sty to endy-1 do
begin
{ начальный адрес меню в видеопамяти
inc(v,(j* 160)+stx*2);
t;-v;
dec(v,(j*160)+stx*2);
for i:=stx to endx-1 do
begin
tA:=bufA;
inc(t);
inc(buf);
tA:=bufA;
inc(t);
inc(buf)
end
end
end;
{ процедура подсветки строки в цвете атрибута
procedure invjstring(x,y,len,n_j)os,atr: byte);
var v: charp;
i:byte;
begin
140
2.3 Работа в текстовых режимах
v:=uk;
inc(v,((y+npos)* 160)+(х*2)+1); {
for i:==0 to len-1 do
begin
vA:=char(atr); {
inc(v,2); {
end;
координата 1 атрибута
запись атрибута
переход на следующий атрибут
end;
{ процедура выбора позиции пользователем
function mov_mar(x,y,n_str,len,atr ,neg_atr: byte): integer;
const n_pos:byte=0;
}
}
}
}
var
c:char;
begin
{ подсветка первой строки меню
invstring(x,y,len,n_pos,neg_atr);
while true do
begin
c:=readkey; { чтение 1 байта клавиши
if c=#0 then c:=readkey; { если расшир., чтение 2>го байта
case с of
)
#13: begin mov mar^n po^exit end; { выход при ENTER
#27: begin mov_mar:=-l;exitend; { выход no ESC
#80: begin inv_string(x,y,len,n_pos,atr); inc(n_pos); { стрелка ввпз
{ если последняя строка, переход па первую
if n_pos=n_str then n_pos:=0;
inv_string(x,y4en,n_pos,neg_atr); подсветка строки end;
#72: { стрелка вверх
begin
invstring (x,y,len,n_pos,atr); { восстановление цвета
dec(n_pos);
{ если первая строка, переход на последнюю
if n_pos=$FF then n_pos:=n_str-l;
inv string(x,y,len,n_pos,neg_atr); { подсветка строки
end
end
end;
end;
{ основная программа
BEGIN
x:=57; y:=05; atr:=$25; neg_atr:=$52;
uk:=ptr($B800,$0000); { начало видеопамяти
if maxavaiK2*n_str*(len+l) then
begin
writelnfHeT памяти под меню');
halt(l)
end;
getmem(p,2*n_str*(Ien+l));
clrscr;
save_video(x,x+Ien,y,y+N_str, p); { сохранение видео экрана
}
}
}
}
}
}
}
}
}
}
}
}
141
2 Управление видеосистемой
{ высвечивание меню ва своем месте }
display_menu(text_p,x,y,N_str,len,atr);
{ выбор позиции пользователя }
nn:=mov_mar(x,y^N_str,len^tr,neg_atr);
writeln(’HOM_nO3=’,nn+l);
{ восстановление части экрана }
res_video(x,x+len,y,y+N_str,p);
{ очистка ОЗУ }
freemem(p,2*n_str*(len+l>);
END.
23.7. Контрольные вопросы
1. Какие модули ПК участвуют в формировании изображения.
2. Особенности растрового принципа формирования изображения и
назначение управляющих сигналов.
3. Представьте временную диаграмму сигналов горизонтального
гашения (HBI) и горизонтальной синхронизации (HSVNC) и отметьте, какие
на ней должны выполняться соотношения.
4. Проведите сравнительную характеристику применяемых
видеоадаптеров МДА, CGA, EGA, VGA, SVGA.
5. Архитектура видеоадаптера EGA. Назначение основных модулей.
6. Архитектура видеоадаптера VGA. Назначение блока DAC и регистров
PEL.
7. Архитектура видеоадаптера SVGA. Дополнительные возможности и
их реализация.
8. Графические сопроцессоры. Классификация и назначение.
9. Особенности адресации к видеопамяти со стороны процессора и со
стороны адаптера в текстовом режиме.
10. Структура видеопамяти в текстовом режиме. Байты символов и
байты атрибутов.
11. Чем определяются цвета символа/фона в адаптерах MDA и CGA.
12. Дополнительное преобразование данных байта атрибутов в адаптере
EGA.
13. Что определяют регистры палитры в адаптере EGA, структура
данных и особенности программирования.
14. Назначение регистров ЦАП адаптера VGA, структура данных,
возможности программирования.
15. Формирование цвета в адаптере VGA.
16. Объясните различные алгоритмы формирования цвета адаптера VGA
в зависимости от состояния 7 бита регистра управления режима.
17. Каким образом можно менять цвет бордюра в адаптерах EGA/VGA и
где это можно использовать.
18. Объясните особенности программирования регистров атрибутного
контроллера адаптеров EGA/VGA.
142
2.3 Работа в текстовых режимах
19. Какие возможности управления формой курсора предоставляют
различные видеоадаптеры.
20. Как кодируется позиция курсора в регистрах блока CRTC, в области
сохранения BIOS и почему эти системы кодирования отличаются от
кодирования позиции символа в видеоадаптере.
21. Каким образом можно создавать собственные (альтернативные)
формы курсоров.
22. Где находятся описания шрифтов в различных видеоадаптерах и
возможности их перепрограммирования.
23. Какие размеры символьных матриц используются в различных
режимах и почему.
24. Особенности формирования девятого пикселя в режимах с
разрешающей способностью 720 пикселей по горизонтали и возможности
управления вывода девятого пикселя в символах блоковой графики.
25. Можно ли получить число текстовых строк, не равных 25 и как это
сделать.
26. Сколько шрифтов хранится в видеопамяти адаптеров EGA/VGA и
как определить начальный адрес i-ro символа j-ro шрифта.
27. Какие действия необходимо выполнить чтобы прочитать/изменить
описание заданного символа.
28. Как обеспечить одновременный вывод на экран набор из 512
символов.
29. Особенности программирования регистров палитры при работе с
расширенными символьными наборами адаптеров EGA/VGA.
30. Что такое видеостраница и как выполнить переключение
видеостраниц.
31. Как организовать аппаратные сдвиги экрана вверх/вниз и
вправо/влево.
32. Как организовать "бегущие строки".
33. Каким образом можно организовать разделенный экран, как
управлять границей разделения экранов и скроллингом экрана А.
34. Можно ли организовать плавные (пиксельные) сдвиги текстового
экрана вверх/вниз и вправо/влево и как это сделать.
35. Особенности организации "всплывающих” окон и меню при
непосредственном обращении к видеопамяти.
143
2 Управление видеосистемой
2.4. Работа в графических режимах
2.4.1. Отображение пикселей на экран
В этом режиме цветовое значение каждого пикселя хранится как один
или несколько бит в видеобуфере и считывается (переносится) на экран,
возможно, с дополнительным табличным преобразованием (индексирование
цвета). Так как каждый пиксель на экране можно адресовать через
видеобуфер, графический режим часто называется режимом с адресацией
всех точек (All Points Addresseable - АРА).
Если в видеобуфере пиксель кодируется п битами, одновременно на
экране можно наблюдать 2П цветов. С помощью специальных схем
индексирования цвета n-битный код может расширяться до m бит, причем
ш>п. В этом случае получается палитра из 2т цветов, но одновременно на
экране по-прежнему наблюдается 2П цветов. Выбор индицируемых цветов из
общей палитры осуществляется программными средствами.
В различных видеорежимах используется представление 1, 2, 4, 8, 16 и
24 бит на пиксель. В режиме True Color (32 бит на пиксель), на самом деле
для хранения цвета пикселя используется 24 бита, а остальные 8 бит несет
управляющую информацию для графических сопроцессоров. Кроме того,
32-х битный формат эффективен для передачи видеоданных по внутренней
шине данных (32-х или 64-х битной).
Кроме рассмотренного выше двоичного представления пикселей
(глубина цвета), следует различать отображение матрицы пикселей экрана на
биты видеопамяти. Видеопамять может иметь линейную организацию, или в
виде параллельно-адресуемых битовых плоскостей (многослойная). В
различных видеорежимах используются разные виды организации
видеопамяти. Характеристики документированных видеорежимов (текстовых
и графических) приведены в Приложении Г.
Режим 1 бит на пиксель. Монохромный графический режим 06h
(поддерживается адаптерами, начиная с CGA). Два цвета (черный и белый)
требуют только один бит памяти для каждой точки на экране. Используется
линейная организация видеопамяти (в те времена другой организации
видеопамяти не существовало), причем первый байт видеопамяти хранит
информацию о первых 8-ми пикселях первой строки развертки (7-й бит - 1-й
пиксель, 6-й бит - 2-й пиксель, и т.д.), второй байт - о следующих 8-ми
пикселях, и тд. до конца строки (при горизонтальном разрешении 640 точек
требуется 80 байт на строку). Следующие байты видеопамяти (в данном
случае начиная с 81-го) хранят информацию о второй и последующих
строках экрана. Отображение видеопамяти на экран представлено на рис.
2.12.
144
2.4 Работа в графических режимах
В отличие от текстовых данных в режимах 4-6 графические данные
разбиты на видеостранице на две части, при этом первая половина буфера с
начальным адресом B800:0000h содержит данные для четных строк экрана, а
вторая - для нечетных (строки нумеруются от нуля начиная с верха экрана).
видеопамять
Рисунок 2.12 — Отображение видеопамяти на экран в монохромном
режиме 1 бит на пиксель
Режим 2 бита на пиксель. Организация режима аналогична
предыдущему (но цвет одного пикселя задается двумя битами). В 4-цветных
режимах первый байт буфера содержит информацию о 4-х самых левых
точках строки 0, причем старшие два бита относится к самой левой точке.
Второй байт содержит информацию о следующем сегменте строки и т.д. (см.
рис. 2.13).
1-я строка
0.
B800:0000h
г... .0 [7...........о|
1-й байт 2-й байт
видеопамять
экран
Рисунок 2.13 - Отображение видеопамяти на экран в режиме 2 бита на пиксель
Четыре возможные комбинации этих битов представляют один фоновый
(код 00) и три основных цвета. Фоновый цвет может быть любым из 16
(данный режим появился в адаптере CGA, который обеспечивал 16 цветов в
текстовом режиме). Однако три основных цвета могут выбираться из одной
из двух палитр, каждая из которых содержит только три предопределенных
цвета (см. табл.2.3).
Если выполнить переключение между палитрами, то все выведенные на
экран цвета будут соответственно изменены. BIOS хранит в своей области
данных однобайтовую переменную, которая содержит текущий номер
палитры. Ее адрес - 0040:0066h. Изменение этой переменной не меняет
текущую установку палитры; наоборот, если изменить цвет палитры другими
средствами, помимо функций операционной системы, то значение этой
переменной будет модифицировано. В этом режиме возможен доступ к
145
2 Управление видеосистемой
"регистру выбора цвета” через порт 3D9h. Биты 0-3 содержат информацию о
фоновом цвете в обычном формате (соответственно синий, зеленый и
красный компоненты и интенсивность). Бит 5 выбирает палитру.
Таблица 2.3 - Цвета пикселей в 4-х цветном режиме
Код пикселя Палитра 0 Палитра 1
00 цвет фона цвет фона
01 зеленый циан
10 красный мажента
11 желтый/корнчневый белый
Режим 4 бита на пиксель. В экзотической видеосистеме PCjr
существовали 16-цветные режимы низкого разрешения (08h и 09h) с
линейной организацией видеопамяти, которые организованы подобно
рассмотренным выше 2- и 4-х цветных. Однако адаптер EGA внес в
видеосистему многослойную организацию памяти (в виде 4-х параллельно
адресуемых битовых плоскостей), а адресация видеопамяти в графических
режимах со стороны процессора начинается с адреса A000:0000h. Поэтому
здесь рассматривается 16-цветный режим с 4-мя битовыми плоскостями
видеопамяти (режимы ODh, OEh, 10h и 12h).
В указанных режимах нет черезстрочной организации видеобуфера, т.е.
видеобуфер с начальным адресом линейно отображается на экран, при этом
каждый байт видеобуфера с учетом того, что в четырех битовых плоскостях
имеется четыре байта с одинаковым адресом, содержит цвета восьми
пикселей. При этом одноименные биты одинаково адресуемых байт четырех
битовых плоскостей задают цвет одного пикселя (седьмые биты задают цвет
первого пикселя первой строки, шестые биты определяет цвет второго
пикселя первой строки и т.д.), как это показано на рис. 2.14.
Рисунок 2.14 - Отображение видеопамяти на экран в режиме 4 бига на пиксель при
многослойной организации видеопамяти (4 битовые плоскости)
В данном режиме код цвета имеет ту же разрядность (4 бита), что и в
текстовых режимах, поэтому код цвета видеопамяти содержит индекс
146
2.4 Работа в графических режимах
регистра палитры контроллера атрибутов, который хранит истинный 6-ти
битный цвет пикселя (выполняется первая ступень индексации цвета).
Режим 8 бит на пиксель. Впервые режим 8 бит на пиксель (256 цветов)
появился в адаптере MCGA с линейной организацией видеопамяти, цифро -
аналоговым преобразователем и аппаратной поддержкой индексации цвета
(256 регистров PEL) - режим 13h. Для адаптера VGA, который принял от
своих предшественников лучшие по тем временам архитектурные решения
(от адаптера EGA 4 - слойную организацию видеопамяти, а от адаптера
MCGA блок цифро-аналогового преобразователя), режим 13h стал
стандартным, но в нем используется только нулевая битовая плоскость. При
этом каждый байт соответствует одному пикселю (см. рис .2.15).
Рисунок 2.15- Отображение видеобуфера на экран в режиме 8 бит на пиксель
(режим 13h для адаптера VGA)
Код цвета видеопамяти содержит индекс регистра PEL блока цифро-
аналогового преобразователя, который хранит истинный 18-ти битный цвет
пикселя (выполняется индексация цвета).
Неэффективность использования видеопамяти адаптера VGA в режиме
13h и низкое разрешение по горизонтали побудило программистов к
созданию недокументированного, режима X, в котором, при разрешении 8
бит на пиксель, используются все битовые плоскости (см. п. 2.6.1).
Режимы 16 и 24 бит на пиксель. Данные режимы высокого цветового
разрешения (да и экранного тоже) появились в современных адаптерах
SVGA. При этом используется линейная организация видеопамяти,
индексация цвета не применяется (код цвета в видеопамяти имеет больше
разрядов, чем количество регистров PEL). Код цвета из видеопамяти (1 байт
на цветовую составляющую при 24-х битном представлении пикселя)
подается непосредственно на цифро-аналогоЬый преобразователь.
Так как современные видеоадаптеры поддерживают все рассмотренные
выше видеорежимы, то они позволяют конфигурировать для каждого
видеорежима разные модели видеопамяти (линейная и 4-х слойная).
147
2 Управление видеосистемой
Регистры блоков синхронизации и графического контроллера
обеспечивают аппаратную поддержку 4-х слойной организации видеопамяти,
но доя графических режимов стандартной BIOS (04h - 13h) с линейной
организацией видеопамяти используется только нулевая битовая плоскость
(остальные замаскированы для доступа со стороны процессора и для
отображения на экран), а для графических режимов VESA BIOS с линейной
организацией видеопамяти (100h - HEh) используются все 4 битовых
плоскость, но для доступа со стороны процессора и для отображения на
экран для видеопамяти установлен режим цепочка 4, при котором
последовательно-адресуемые байты располагаются в разных битовых
плоскостях (номер битовой плоскости равен остатку от деления на 4 адреса
байта), чем и достигается эмуляция линейной организации при эффективном
использовании видеопамяти (см. ниже режимы записи/чтения).
2.4.2. Преобразование экранных координат
Позиция пикселя на экране характеризуется экранными координатами
(х,у), причем х - номер пикселя в строке (нумерация слева направо), а у -
номер строки (нумерация сверху вниз). Начало системы координат (0,0)
соответствует верхнему левому углу экрана.
При программировании видеосистем возникает необходимость
преобразования координат экрана (X, Y) в соответствующий ему адрес
видеобуфера (байт и биты). В приведенных ниже выражениях используются
арифметические и логические операторы языка Паскаль и следующие
обозначения:
- и -цветовое разрешение видеорежима (количество бит на пиксель);
- Nrop - горизонтальное разрешение экрана (в пикселях);
- Адрбайта - адрес байта (смещение относительно начала видеобуфера
в графических режимах);
- N6llTa - номер бита (младший разряд описания), с которого начинается
описание кода цвета.
Линейная организация видеопамяти.
Режим 1 бит на пиксель (n = 1). Здесь и далее приходится учитывать то,
что нумерация бит в байте и нумерация значений пикселей в байте
проводятся в противоположных направлениях.
Адр байта = (Y * Nrop) div 8 +Х div 8;
N6MTa = 7-Xmod 8.
Режим 2 бита на пиксель (п = 2). В этом режиме дополнительно
необходимо учитывать разделение видеобуфера на две части (для четных
строк и для нечетных строк). Младший бит координаты Y определяет, в
какой половине видеобуфера - верхней (0) или нижней (1) - находится
148
2.4 Работа в графических режимах
заданная строка развертки. Поэтому при единичном значении этого бита к
формируемому адресу необходимо прибавить 2000h.
Адр байта = ((Y div 2) * Nrop) div 4 +Х div 4 + (Y mod 2) *2000h;
N6HTa = (3 - X mod 4) *2.
Режим 4 бита на пиксель (n = 4). В этом режиме также используется
черезстрочная адресация видеобуфера, потому математические выражения
аналогичны предыдущему режиму.
Адрбайта = ((Y div 2) * Nrop ) div 2 +Х div 2 + (Y mod 2) *2000h;
N6HTa ~ (1 - X mod 2) *4.
Значение N6HTa во всех приведенных выше выражениях удобно
реализовать числом логических сдвигов влево одно» двух» или
четырехбитной маски, необходимых для того, чтобы выделить значение кода
пикселя в байте.
Режим 8 бит (байт) на пиксель (п = 8). В данном и последующих
режимах (п > 8) нет необходимости в вычислении N6lITa (код пикселя задается
целым числом байт), кроме того, здесь не используется черезстрочная
адресация видеобуфера.
Адрбайта = Y * Nrop +Х.
Режим 16 бит (2 байта) на пиксель (п ~ 16).
Адрбайта == 2*(Y * Nrop +Х).
Режим 24 бита (3 байта) на пиксель (п = 24).
Адрбайта = 3*(Y * Nrop +Х).
4-х слойная организация видеопамяти.
Режим 4 бита на пиксель (п = 4). Так как байты в четырех битовых
плоскостях имеют параллельную адресацию, то формат каждой битовой
плоскости соответствует формату режима 1 бит на пиксель, т.е. байт с
конкретным адресом содержит значения восьми пикселей, а код цвета
пикселя состоит из одноименных бит разных битовых плоскостей.
Адрбайта = (Y * Nrop) div 8 +Х div 8;
N6wTa = 7 - X mod 8.
Особенностью прямого доступа к многослойной видеопамяти является
реализация операций чтения и записи данных в параллельно адресуемые
плоскости (см. ниже режимы записи и чтения).
2.4.3. Масштабирование экранных координат
Для большинства графических режимов приходится учитывать еще и то
обстоятельство, что линейная плотность на физическом экране по
горизонтали и вертикали различна (пиксели не квадратные, а
прямоугольные). На мониторах соотношение ширины экрана к высоте равно
примерно 1.33 для цветных мониторов и 1.45 для монохроматических, а
соотношение разрешающих способностей по горизонтали и вертикали может
149
2 Управление видеосистемой
быть иным, поэтому для получения неискаженных изображений на экране
они должны масштабироваться с учетом графического режима.
Масштабировать координаты (X, Y) приходится для всех пикселей всех
геометрических изображений в тех режимах, когда масштабный
коэффициент не равен 1.00 В противном случае квадраты будут выглядеть
прямоугольниками, а окружности эллипсами. Более того, необходимо
корректировать масштабный коэффициент с учетом характеристик каждого
графического режима. В табл. 2.4 приведены значения масштабных
коэффициентов для графических режимов стандартной BIOS. Отметим, что
для режима 640x480 масштабный коэффициент точно равен 1.00, что
упрощает графическое программирование.
Таблица 2.4 - Значения масштабных коэффициентов
номер режима описание режима масштабный коэффициент
4,5 4 цвета, 320x200 1.20
6 2 цвета, 640x200 2.40
ODh 16 цветов, 320x200 1.20
OEh 16 цветов,640x200 2.40
OFh моно, 640x350 1.26 (моно)
10b 16 цветов, 640x350 1.37
11b 2 цвета, 640x480 1.00
12h 16 цветов, 640x480 1.00
13h 256 цветов, 320x200 2.40
2.4.4. Мерцание
В графических режимах пиксели могут иметь атрибуты мерцания. Как и
в текстовых режимах, он реализуется при установке в 1 бита 3 разрешения
мерцания регистром управления режимом атрибутного контроллера
(3C0h/3C0h индекс 10h). В 16-цветных режимах такое состояние бита 3
заставляет адаптер интерпретировать старший бит 4-битного описания
пикселя как атрибут мерцания (аналогичная ситуация характерна и для
текстовых режимов).
Таким образом, при единичном состоянии бита разрешения мерцания
пиксели со значениями 08h - OFh будут мерцать, а пиксели со значениями 00h
- 07h не мерцают. Отметим, что в монохроматическом графическом режиме
мерцают все пиксели независимо от их значений. Способ реализации
мерцания пикселей в графических режимах отличается от способа вывода
мерцающих символов в текстовых режимах.
В графических режимах мерцание пикселей вызывает попеременный
выбор двух регистров палитры для каждого значения пикселя. Выбор
осуществляется посредством установки в 1 и сброса в 0 бита 3 описания
пикселя с частотой мерцания (около двух раз в секунду).
150
2.4 Работа в графических режимах
2.4.5. Вывод текста в графическом режиме
Каждый выводимый на экран символ образован совокупностью
пикселей, обеспечивающей его визуальное восприятие. Естественно,
пиксельное представление символа не зависит от того, в какой области
видеобуфера оно находится. Очевидно, в видеосистеме необходимо где-то
хранить пиксельные представления символов. Наиболее удобно хранить
совокупность пиксельных представлений символьного набора (characte set) в
виде регулярной таблицы определений символов (character definition table),
называемой таблицей шрифтов (font table), просто шрифтом (font) или даже
фонтом.
В персональных компьютерах семейств PC и PS/2 для графических
режимов в BIOS предусмотрена встроенная таблица шрифтов (следует
отметить, что графический интерфейс Windows пользуется собственным
векторным описанием шрифтов). Размер пиксельных представлений
символов в таблице зависит от разрешающей способности по вертикали
конкретного графического режима (8*8,8*14, 8*16 - см. Приложение Г).
Размер дается как ширина * высота в пикселях.
В ПЗУ на материнской плате по адресу F000:FA6Eh находится
принимаемая по умолчанию таблица шрифтов. Она содержит 8-байтные
пиксельные представления первых 128 символов кода ASCH. Определения
символов второй половины кода ASCII (коды 80h - FFh) находятся во второй
таблице шрифтов, начальный адрес которой задает вектор прерывания IFh
(сам вектор находится по адресу 0000:007Ch). Этот вектор инициализируется
на 0 при включении компьютера, а операционная система загружает таблицу
шрифта в ОЗУ и помещает ее начальный адрес в вектор прерывания IFh.
Для графических режимов, которые требуют описания символов 8*14 и
8*16 BIOS содержит определения 256 символов кода ASCII. При задании
графического режима процедура BIOS загружает адрес соответствующей
таблицы определений символов в вектор прерывания 43h (адрес самого
вектора 0000:01ОСЬ).
Альтернативная таблица шрифтов. Международная организация по
стандартам (ISO) разработала несколько стандартных символьных наборов. В
документации фирмы IBM они называются кодовыми страницами (code
page). Например, стандартный символьный набор кода ASCII обозначается
кодовой страницей 437. Кодовая страница 850 соответствует
"многоязычному” символьному набору для языков, в которых основой
служит латинский алфавит. Операционные системы допускают программное
переключение кодовых страниц. Когда программа выводит символы с
помощью вызовов функций операционной системы, применяется текущая
активная кодовая страница. При желании пользователь может определить
151
2 Управление видеосистемой
собственный символьный набор, Проще всего построить таблицу
определений символов, задавая каждый ее байт в исходной программе.
Программный знакогенератор. Процедура, которая использует
пиксельные представления символов из таблицы шрифта для образования
двоичных наборов символов в видеобуфере, обычно называется
программным знакогенератором. Она выполняет такие функции, как поиск
двоичного описания по заданному коду символа, преобразование двоичного
описания в соответствующие значения пикселей и запись пикселей в нужные
ячейки видеобуфера.
В BIOS предусмотрен программный знакогенератор, который
применяется при вызове функций Oh, 09h, 0Ah и 13h прерывания INT 10h в
графическом режиме. Программный знакогенератор, который использует
представления 8x8, обращается к таблице по адресу 0000:FA6Eh (первые 128
символов кода ASCII) и таблице, адресуемой вектором IFh (вторые 128
символов кода ASCII). Если применяется таблица, адресуемая вектором 43h,
то высота символов определяется переменной POINTS, которая находится в
области данных дисплея по адресу 0040:0085h. Конечно, можно
воспользоваться программным знакогенератором BIOS для вывода символов
из любой таблицы определений символов, поместив ее адрес в
соответствующий вектор прерываний. Пользоваться знакогенератором BIOS
довольно удобно, но возможности его ограничены. В частности, он может
сохранить в видеобуфере только символы, выровненные по байтным
границам, т.е. в фиксированных позициях экрана. При желании или
необходимости можно разработать более гибкий знакогенератор. В нем
можно предусмотреть такие возможности, как вывод символов в позиции с
любыми графическими координатами (X, Y), формирование символов
различной высоты и с различной ориентацией и т.п.
2*4.5. Запись и чтение данных видеобуфера
В графических режимах с линейной организацией видеопамяти
возможно прямое обращение к видеопамяти (запись и чтение), так как по
любому адресу видеопамяти хранится один байт. Вывод одной точки
подразумевает изменение отдельных битов памяти. Режимы двух, четырех и
шестнадцати цветов требуют, чтобы для установки характеристик одной
точки были изменены один, два и четыре бита соответственно. Для этих
операций необходимы большие затраты процессорного времени, поэтому
графическое программное обеспечение, как правило, работает очень
медленно. Тщательное обдумывание часто позволяет сразу установить все
биты одного байта, а не обращаться к одному и тому же байту 4 или 8 раз.
Однако в режимах с многослойной организацией, таких как ODh, OEh и
10h память разбита на 4 битовые плоскости. Каждая плоскость организована
таким же образом, как для черно-белого режима высокого разрешения
цветного адаптера, когда байт данных посылается в определенный адрес
152
2,4 Работа в графических режимах
видеобуфера, каждый бит соответствует горизонтальному сегменту линии,
причем бит 7 - самой левой точке.
Выводятся четыре такие битовые плоскости, относящиеся к одним и тем
же адресам в видеобуфере. Это приводит к тому, что каждая точка
описывается четырьмя битами (давая 16 цветов), причем каждый бит
находится в отдельном байте отдельной битовой плоскости.
Но как можно записать 4 различных байта данных, расположенных по
одному и тому же адресу? Ответ на этот вопрос состоит в том, что не надо
посылать последовательно четыре байта по этому адресу. Вместо этого один
из четырех режимов записи позволяет изменить все 4 байта на основании
одного байта данных, полученного от процессора. Влияние данных,
посланных процессором, зависит от установки нескольких регистров,
включающих два регистра маски, которые определяют, на какие биты и в
каких битовых плоскостях будут изменяться биты.
Для понимания этих регистров мы должны сначала разобраться с
четырьмя регистрами защелки (latch register). Они содержат данные для
четырех битовых плоскостей в той позиции, к которой было последнее
обращение. (Заметим, что термин ’’битовая плоскость” используется как для
целой области видеобуфера, так и для и однобайтового буфера, временно
хранящегося в регистре защелки ).
Когда процессор посылает данные по определенному адресу, эти данные
могут изменить или полностью сменить данные регистра защелки, а
впоследствии именно данные из регистра защелки записываются в
видеобуфер. Каким образом данные процессора влияют на регистр защелки ,
зависит от режима записи, а также установки некоторых других регистров.
При чтении адреса из видеобуфера регистры защелки заполняются четырьмя
байтами из четырех битовых плоскостей по данному адресу. Регистрами
защелки легко манипулировать, производя с их содержимым различные
логические операции, что позволяет устраивать различные графические
трюки.
Регистр маски битов (смотри блок графического контроллера регистр
08h) и регистр маски битовой плоскости (смотри блок синхронизации
регистр 02h) действуют на регистры защелки, защищая определенные биты
или битовые плоскости от изменения под действием данных, поступающих
от процессора.
Установка бита регистра маски битов в 0 маскирует этот бит во всех
четырех битовых плоскостях, делая соответствующую точку недоступной
для изменения. Однако поскольку оборудование работает в байтовых
терминах, реально "неизменяемые” биты перезаписываются в четыре
битовые плоскости. Данные для этих маскируемых битов хранятся в
регистрах защелки, поэтому программа должна быть уверена, что текущее
содержимое регистров защелки относится к правильному адресу. Поэтому
перед записью в видеобуфер надо сначала считывать из него. Биты 0-3
регистра маски битовой плоскости соответствуют битовым плоскостям 0-3.
153
2 Управление видеосистемой
Старшие 4 бита регистра не используются. Когда биты 0-3 равны 0,
соответствующие битовые плоскости не меняются при операциях записи.
Посылаемые в видеобуфер данные могут быть модифицированы и
логически обработаны вместе с данными, хранящимися в регистрах защелках
с помощью регистра вращения данных (регистр 03h блока графического
контроллера ) Биты 0- 2 регистра вращения определяют число разрядов, на
которое производится циклический сдвиг данных процессора влево при
записи данных в видеобуфер. Для записи данных без сдвига эти биты
должны быть установлены в 0. Биты 4, 3 регистра вращения задают при
записи логическую функцию данных процессора с данными регистров
защелок. Значение битов (00-замена значений регистров защелок данными
процессора, 01-логическое "И", 10-логическое ’’ИЛИ" И-исключающее
’’ИЛИ”). Операция сдвига выполняется раньше логической операции.
Это свойство. используется по разному в различных режимах записи.
Четыре режима записи и два режима чтения устанавливаются регистром
установки режима (смотри блок графического контроллера регистр 05h).
Режим записи устанавливается в битах 0 и 1, как число от 0 до 3. Бит 2
должен быть равным 0, также как и биты 4-7. Бит 3 устанавливает один из
двух режимов чтения из видеобуфера. Этот бит может быть 0 или 1. При
инициализации графических режимов BIOS, устанавливает режим записи в
00, режим чтения в 0.
Режим записи 0. В этом наиболее сложном режиме взаимодействуют
все перечисленные выше регистры, как это показано ниже на рис. 2.16.
В простейшем случае режим записи 0 копирует данные процессора в
каждую из четырех битовых плоскостей. Пусть, например, по определенному
адресу видеобуфера послано НПППЬи разрешены все биты и все битовые
плоскости (т.е. ничто не маскировано описанными выше регистрами масок).
Тогда каждый бит во всех четырех плоскостях будет установлен в 1, так что
цепочка битов для каждой из соответствующих точек будет 1111b. Это
означает, что восемь точек будут выведены в цвете 15, который изначально
соответствует белому цвету, хотя регистры палитры позволяют, чтобы на
самом деле был любой из допустимых цветов.
Теперь рассмотрим ту же ситуацию, когда посылается значение
00001000В. Цепочка битов для точки 4 будет 111 1, а для остальных 0000, что
соответствует черному (изначально). Поэтому в данном случае только точка
4 появится на экране, остальные 7 точек будут выключены.
Если занести код палитры желаемого цвета в регистр маски битовой
плоскости, то регистр будет маскировать определенные битовые плоскости
таким образом, что будет воспроизведен требуемый цвет.
Приведенное выше обсуждение касалось одновременного вывода
восьми точек. Для вывода меньшего количества точек необходимо сохранить
существующие данные для некоторых точек, а чтобы это было возможно,
текущее содержимое данного адреса сохраняется в регистрах защелки. Затем
154
2.4 Работа в графических режимах
используется регистр маски битов для маскирования тех точек, которые не
должны изменяться. Если бит этого регистра сброшен в 0, то данные,
получаемые от процессора для этого бита, игнорируются и вместо них
используются данные, хранящиеся в регистрах защелки.
Per. битовой
маски
(JCEh/3CFh
инд. 08)
Per. маски бит.
плоскости
(3C4h/3C5h
инд. 02)
Per. разреше-
ния цвета
(3CEh/3CFh
инд. 01)
Per. цвета
(3CEhZ3CFh
инд. 00)
Рисунок 2. 16 - Взаимодействие регистров в режиме записи 0
Здесь и далее: * - условное обозначение операции, задаваемой битами 4-
3 регистра вращения.
Кроме рассмотренного выше этапа взаимодействия байта от процессора
с регистрами защелок, в данном режиме имеется второй этап взаимодействия
регистров защелок с регистром цвета. Заполнение регистров-защелок
меняется при ненулевом значении регистра разрешения цвета (регистр Olh
блока графического адаптера), разряды 0-3 которого разрешают заполнение
байта выбранных регистров защелок значениями из соответствующих
разрядов регистра цвета (регистр 00h блока графического адаптера ). На
данном этапе взаимодействия учитывается битовая маска, а значения данных
процессора и маски битовой плоскости игнорируются.
Режим записи L Режим записи 1 предназначен для специальных
приложений. В этом режиме текущее содержимое регистра защелки
записывается по указанному адресу (см. рис. 2.17).
Напоминаем, что регистры защелки заполняются операцией чтения.
Этот режим очень полезен для быстрого переноса данных при операциях
сдвига экрана. Регистр маски битов и регистр маски битовой плоскости не
155
2 Управление видеосистемой
влияют на эту операцию. Не имеет значения также, какие данные посылает
процессор - содержимое регистров защелки записывается в память без
изменений.
Рисунок 2.17- Реализация режима записи 1
Режим записи 2. Режим записи 2 представляет альтернативный способ
установки отдельных точек (см. рис. 2.18). Процессор посылает данные, у
которых имеют значение только 4 младших бита, рассматриваемые как цвет
(индекс регистра палитры).
(3CEh/3CFh инд. 08) рег МЙСкн бит. пл. Байт данных от
(3C4h/3C5h ннд. 02) процессора
Рисунок 2.18- Реализация режима записи 2
156
2.4 Работа в графических режимах
В данном режиме байт данных интерпретируется так, как регистр цвета
в режиме 0, но разрешение модификации по прежнему задает регистр маски
битовой плоскости. Цепочка дублируется на все восемь точек, относящихся к
данному адресу, до тех пор, пока регистр маски битов не запретит
определенные точки от изменения. Регистр маски битовой плоскости
активен, как и в режиме записи 0. Конечно, процессор должен послать
полный байт, но только младшие 4 бита существенны.
Режим записи 3. В данном режиме (появился адаптере VGA) значения
пикселей модифицируются с помощью объединения значений пикселей из
регистров-защелок со значением в регистре цвета при ненулевом бите
регистра разрешения цвета так, как это происходит на втором этапе
преобразования в режиме записи 0. На рис. 2.19 приведена схема реализации
режима записи 3, в которой влияние регистров цвета и разрешения цвета
показано схематично.
Регистры цвета и
разрешения цвета
данные от процессора
Per. битовой маски
(3CEh/3CFh вид. 08)
7....S 4....3 2....0
Регистр вращения
(3CEh/3CFh ипд. 03)
Рисунок 2.19 - Реализация режима записи 3
По-прежнему, биты 3-4 регистра вращения определяет логическую
операцию, которая используется для объединения значений пикселей.
Бит данных от процессора циклически сдвигается вправо на число бит,
определяемое битами 0-2 регистра вращения, и объединяется по ”И" с
содержимым регистра двоичной маски. Получающаяся в результате двоичная
157
2 Управление видеосистемой
маска играет такую же роль, как отдельный регистр двоичной маски в
режимах записи 0 и 2.
Режим чтения 0. Процессор осуществляет чтение данных (8 точек) из
регистра защелки той плоскости, которая разрешена регистром выбора
плоскости для чтения (разряды 0-1 регистра 04h блока графического
контроллера). Для чтения цветов (кодов регистра палитры) всех 4 битовых
плоскостей необходимо последовательно разрешить чтение и прочитать все
плоскости по одному адресу.
Режим чтения 1. В результате выполнения операции чтения в режиме 1,
процессор читает байт, в котором будут установлены в 1 только те биты в
байте, для которых цвет совпадает с цветом, заданным в битах 0-3 регистра
сравнения цвета (регистр 02h блока графического адаптера).
В процессе сравнения участвует также регистр безразличия цвета (07h
блока графического адаптера), биты которого 0-3 определяют необходимость
сравнения цвета регистров-защелок с соответствующими битами
отмеченного ранее регистра сравнения цвета. При коде XOh в регистре 07h,
регистр 02h не влияет на результат сравнения. При коде XFh (все цвета
безразличны) в регистре 07h процессор получит байт FFh, независимо от
содержимого регистров защелок.
При других значениях младшей тетрады регистра 07h, отмеченные
единицей старшие разряды 07h исключают из процесса сравнения
соответствующие регистры защелки, т.е. включается ’’неполное сравнение”.
Режим чтения 1 применяется для быстрого нахождения пикселей заданного
цвета (например, в видеоиграх определение защищенных зон).
2.4.7. Примеры программирования графических режимов
Пример 1. Устанавливает видеорежим с использованием прерывания
1 Oh. Для работы с 4-мя битовыми плоскостями (режим 1 Oh) md^lOh.
Procedure Setmode(md:byte);
begin
r.ah:=0; { функция }
r.al:=md;
intr($10,r); { 10 прерывание BIOS }
ulc-ptr($0040,$0049);
ukA:=md;
end;
Пример 2. Функция возвращает текущий видеорежим из области
сохранения BIOS,
function Getmode:byte;
begin
Getmode:=mem [$40:$49];
end;
158
2.4 Работа в графических режимах
Пример 3. Функция возвращает из заданной битовой плоскости (pl) в О
режиме чтения байт, содержащий пиксель с заданными координатами (X, Y).
function getSpiksO (x,y:word;pl: byte): byte;
var sm:word;
begin
port [$3cel:==5; { регистр режима программируется }
port [$3cf];=0; { на 0 режим чтения }
port f$3cel:=4; { в регистр выбора плоскости для чтения }
port [$3cfl:=pl mod 4; { записывается необходимый номер }
sm:s=sy*80+(x div 8); { get8piks0:=mem [SaOOOzsm]; вычисление адреса байта }
end;
Пример 4. Демонстрирует работу регистра сравнения цвета в 1 режиме
чтения. В getpiksl возвращается байт, в котором установлены биты для
пикселей, цвет которых совпадает с clr.
function getpiksl (x,y:word;clr:byte):byte;
var sm:word;
begin
port [$3се] :=5; { регистр режима программируется на }
port [ХЗсфНИ { 1 режим чтения I
port j$3cel:=2; { в регистр сравнения цветов пншется }
port [$3cfl:~cir { номер необходимого цвета }
sm:=y*80+(x div 8); getpiksl:=mem [$a000:sm]; end; { вычисление адреса байта }
Пример 5. Демонстрирует вывод пикселя в заданную точку заданным
цветом в режиме записи 0.
procedure SetpiksO (x,y:word;cir:byte); var xint^m, mask: byte; addrl: word; begin port [$3ce]:=5; { инициализация регистра режима )
port [$3cfl:=0; xint:=x div 8; { вычисление адреса пикселя и его }
sm:=x mod 8; { смещения в байте I
addrl :=sy*80+xint; mask:-$80; { определение маски }
maskz-mask shr sm; port [$3ce]:»8; port [$3cf|:smask; port[$3c4]:=2; port[$3c5]:=clr; sm:~mem[$a000:addrl|; mem($a000:addrl|:==$ff; end; Пример 6. Демонстрирует копирование байта из одного места в
видеопамяти в другое в 1 режиме записи. Процедура переносит байт,
содержащий пиксель с координатами (XI, Y1), в байт, содержащий пиксель с
координатами (X2,Y2).
procedure set8piksl (xl,yl,x2,y2:word);
159
2 Управление видеосистемой
var prom: word;
begin
port ($3ce}:-5; { регистр режима программируется на }
port [$3cf]:=l; { prom:~mem ($a000:(yl*80+(xl div 8))]; mem [$a000:(y2*80+(x2 div 8))):=prom; 1 режим записи }
port [ХЗсерй; { port [$3cf]:=0; end; восстановление регистра режима }
Пример 7. Демонстрирует вывод пикселя в заданную точку (X, Y)
заданным цветом (с!г) в режиме записи 2.
procedure Setpiks2 (х,у: word ;clr: byte); var xint,sm,mask:byte;
addrl:word; begin
port |$3ce]:=5; { port [$3cf]:=2; инициализация регистра режима }
xint=x div 8; { вычисление адреса пикселя я его }
sm:=x mod 8; { addr 1 :=7*80+xint; смещения в байте }
mask:=$80; { mask:-mask shr sm; определение маски }
port [$3cel:=8; { port [$3cfl:=mask; sm:=mem[$a0OO:addr 1 ]; загрузка регистра битовой маски }
memf$aO<iO:addrl]:=clr; port [$3ce|:=5; { port ($3cf|:=0; восстановление регистра режима }
end;
Пример 8. Аналогичен предыдущему примеру. Отличие заключается в
том, что записываются сразу 8 пикселей.
procedure set8piks2 (x,y:word;clr:byte);
var xint,sm,mask: byte; addrhword; begin port ($3ce]:=5; { инициализация регистра режима }
port [$3cf|:=2; xint:=x div 8; { вычисление адреса 8 пикселей }
addrl :=y *80+xint; port ($3ce]:=8; { загрузка регистра битовой маски }
port [$3cf]:=$ff; sm:=memf$aOOO:addrl]; mem($a000:addrl]:=clr; port [$3ce]:==5; { восстановление регистра режима }
port j$3cf]:=0;
end;
Пример 9. Вывод пикселя в режиме записи 3.
program pntpix3;
uses crt,graph;
procedure setxpiks3 (x,y: word; pl: byte);
var addr:word;
xi nt: word;
160
2.4 Работа в графических режимах
a^m:byte;
mask: byte;
begin
xint:~xdiv 8;
snr.-x mod 8;
addr:=y*80+xint;
mask:=$80;
mask:=mask shr sm;
port |$3ce|:=8;
port [$3cf]:=mask;
addr:=sy*80+(x div 8);
port l$3ce]:=5;
port [$3cf]:-3;
port j$3ce}:=0;
port [$3cf]:=pl;
port [$3ce]:=8;
port j$3cf|:-mask;
a:=mem {$aOOO:addr);
mem ($a000:addr]:=$77;
end;
var i,k:word;
BEGIN
clrscr;
setmode ($12);
for iiM) to 639 do
{ вычисление адреса пикселя и его
{ смещения в байте
{ определение маски
}
}
}
for k:=0 to 479 do setxpiks3 (i,k,(i div 16) mod 16);
delay (3000);
END.
Пример 10. Заполняет экран наклонными линиями. В каждой строке
выводятся байты, у которых только один бит установлен в 1 (высвечивается
один пиксель). При выводе очередной строки модифицируется содержимое
регистра вращения, при этом происходит сдвиг выводимых пикселей влево,
program RotatejSbtrih;
Uses Dos, Crt;
Var b: BYTE; uk: ЛВ¥ТЕ;
r : REGISTERS;
{ Процедура установок регистров графического контроллера }
Procedure SetUp;
Begin
Port($3CE] := $05;
Port[$3CF] •— $00; { режим записи 0 1
Port[$3CEJ $08;
Port[$3CF] •S3 $FF; { маска битов 1
Port[$3C4] := $02;
Port[$3C5] $01; { маска битовой плоскости 1
End;
{ Процедура занесения данных в видеопамять }
Procedure WriteVidO;
Const
b_wr: BYTE = 0;
Var
i, j : word;
161
2 Управление видеосистемой
Begin
uk := Ptr($AOOO,SOOOO);
For j 0 To 349 Do
begin
For i := 0 To 79 Do
begin
ukA := $0F;
Inc( uk);
end;
Port[$3CE] := $03;
Portf$3CF] := b_wr AND $07; {
Dec(b~wr, 5 );
end
End;
BEGIN
Setmode($10); {
SetUp;
WtiteVidO;
Repeat Until ReadKey > #0;
END.
2.4.8. Контрольные вопросы
}
вращение
из примера 1
1. Сколько цветов можно запрограммировать и сколько одновременно
можно увидеть на экране при кодировании пикселя п разрядами и
расширением палитры до m разрядов.
2. Как интерпретируется байт в линейной видеопамяти в двухцветных и
четырехцветных графических режимах.
3. Особенности черезстрочной адресации видеопамяти.
4. Сравните возможности программирования цветов в четырехцветном
графическом режиме и в текстовом режиме.
5. Объясните структуру видеопамяти в 16-цветном графическом режиме.
6. Объясните структуру видеопамяти в 256-цветном графическом
режиме (8 бит на пиксель).
7. Объясните структуру видеопамяти в графических режимах (16 и 24
бит на пиксель).
8. Для заданных координат пикселя х и у определите, какие разряды
каких байт в каких битовых плоскостях определяют цвет заданного пикселя в
режимах 1, 2 и 4 бит на пиксель.
9. Для заданных координат пикселя х и у определите, какие байты
определяют цвет заданного пикселя в режимах 8,16 и 24 бит на пиксель.
10. Какими средствами и в каких графических режимах выполняется
индексация цвета пикселей. Возможности программирования.
11. Можно ли поменять цвет фрагмента изображения (например сделать
этот фрагмент невидимым) не меняя содержания видеопамяти и как это
сделать.
162
2.5 Поддержка видеосистемы со стороны BIOS
12. Зачем нужно выполнять масштабирование изображения.
13. Можно ли заставить фрагмент изображения мерцать, и как это
сделать.
14. Особенности вывода текста в графическом режиме для различных
видеосистем.
15. Где находятся описания шрифтов для графических режимов и
возможности их модификации в различных видеосистемах.
16. Каким образом байт, посылаемый процессором, может поменять
содержание всех битовых плоскостей.
17. Какие регистры участвуют в формировании данных видеопамяти
адаптеров EGA/VGA/SVGA.
18. Назначение регистров защелок видеоадаптеров EGA/VGA/SVGA.
19. Как влияют регистры маски битов и маски битовой плоскости на
содержимое видеопамяти при записи данных.
20. Назначение регистра вращения данных и какие эффекты можно
получить при его программировании.
21. Где задаются режимы записи и чтения.
22. Объясните взаимодействие регистров в режиме записи 0.
23. Какие дополнительные возможности формирования цвета
представляет программирование регистров разрешения цвета и регистра
цвета.
24. Особенности режима записи 1 и где он наиболее эффективно может
использоваться.
25. Взаимодействие регистров в режиме записи 2.
26. Взаимодействие регистров в режиме записи 3.
27. Особенности режимов чтения 0 и I и в каких случаях наиболее
эффективное применение каждого режима.
28. Как влияет на результат чтения регистр безразличия цвета и где это
можно использовать.
2.5. Поддержка видеосистемы со стороны BIOS
ROM BIOS, сформированный на материнской (системной) плате
компьютеров семейства PC, рассчитан на поддержку адаптеров MDA и CGA
(и соответствующих видеорежимов - текстовых, 1- и 2-х цветных
графических). Процедуры "планарного" видеоВЮЗ по адресу F000:F065h.
Начиная с адаптера EGA введен определенный набор процедур
управления видеосистемой, который физически располагается на видеокарте
и отражается на адресное пространство памяти, начиная с адреса C000:0000h.
При запуске компьютера вектор 10h инициализируется на
соответствующий адрес. Кроме того, вектор 42h адресует процедуры
управления дисплеем планарного BIOS. Так как процедуры прерывания 10h
163
2 Управление видеосистемой
при необходимости обращаются к планарному BIOS через вектор
прерывания 42h, явно использовать команду INT 42h приходится редко.
2.5.1. Обращения к процедурам BIOS
Обращения ко всем обслуживаниям (видеосервису) или функциям BIOS
управления видеосистемой обслуживаются командой INT 10h; вектор этого
прерывания находится по адресу 0000:0040h.
Конкретная функция задается номером, который перед вызовом INT 10h
загружается в регистр АН. Если номер вызываемой функции находится вне
допустимого диапазона, никаких действий не предпринимается и
осуществляется возврат из прерывания. Многие функции требуют передачи
параметров в регистрах AL, ВХ, СХ и DX.
Возвращаемые процедурой BIOS значения передаются программе также
в регистрах. Для большинства функций BIOS приняты следующие
соглашения:
- возможная подфункция определяется содержимым регистра AL (или
BL для новых функций адаптеров EGA, VGA и SVGA),
- координата X (номер столбца) передается в регистре СХ (графический
режим) или в регистре DL (текстовый режим),
- координата Y (номер строки) передается в регистре DX (графический
режим) или в регистре DH (текстовый режим),
- номер требуемой страницы видеобуфера передается в регистре ВН,
причем нумерация страниц начинается с 0.
Процедуры видеоВЮЗ сохраняют содержимое регистров DS, ES, ВХ,
CX,DX,SI,DI,hBP.
Как правило, процедуры BIOS не контролируют правильность
параметров и не возвращают коды состояния или флаги ошибки.
Следовательно, контроль правильности условий вызова процедур BIOS воз-
лагается на программиста. Функции 00h - OFh реализованы для всех
адаптеров (за естественным отсутствием графических функций в адаптере
MDA). Остальные функции имеются только в BIOS для EGA, VGA и SVGA.
Видеосервис позволяет установить видеорежим (BIOS Video Mode),
определяющий формат экрана (См. Приложение Г) и выполнять необходимые
действия (запись, чтение и др.). Первоначально для задания номера режима
отводился один байт (табл. 7.2), и режим устанавливался параметром
функции 00h INT 10h (AH=0, AL=Mode). Режимы 0-13h являются
стандартными для адаптеров MDA, CGA, EGA, VGA. Режимы 14h-7Fh
используются с нестандартными VGA- или SVGA-расширениями BIOS, они
специфичны для конкретных моделей графических адаптеров.
Позже появилось стандартизованное расширение функций видеосервиса
VBE (VESA BIOS Extensions) для адаптеров VGA и SVGA и были
164
2.5 Поддержка видеосистемы со стороны BIOS
определены новые видеорежимы с двухбайтными номерами старше 100h.
Эти режимы устанавливаются параметром функции 4F02h INT 10h
(AX=4F02h, BX-VMode).
Процедура обработки прерывания 10h вначале сохраняет регистры
процессора, а затем инициализирует регистр DS на адрес 0040h области
данных дисплея и регистр ES на сегментный адрес видеобуфера. После этого
анализируется конкретная функция в регистре АН и производится косвенная
передача управления нужной процедуре через таблицу внутрисегментных
(NEAR) указателей.
2.5.2. Области данных видеоВЮБ
2.5.2.1. Область данных дисплея
BIOS поддерживает несколько динамических переменных в области
памяти, называемой областью данных дисплея (Video Display Data Area).
Ниже приведена сводка адресов, имен, типов и описаний этих переменных:
- 0040:0049h, CRTJMODE, байт - номер текущего режима дисплея;
- 0040:004Ah, CRT COLS, слово - число текстовых столбцов;
- 0040:004Ch, CRTLEN, слово - размер текущей страницы в байтах;
- 0040:004Eh, CRTSTART, слово - смещение текущей страницы;
- 0040:0050h, CURPOSN, восемь слов - массив из восьми слов,
содержащих текстовые позиции курсоров для восьми страниц (строка в
старшем байте и столбец в младшем байте);
- 0040:0060h, CUR MODE, слово - тип или форма курсора (начальная
строка развертки в старшем байте и конечная строка развертки в младшем
байте);
- 0040:0062h, ACT PAGE, байт - номер текущей активной страницы;
- 0040:0063h, ADDR 6845, слово - порт регистра адреса CRTC (порт
3B4h или 3D4h);
- 0040:0065К CRT MODE SET, байт - текущее содержимое регистра
управления режимом (порт 3B8h или 3D8h);
- 0040:0066h, CRT PAL, байт - текущее содержимое регистра выбора
цвета (порт 3B9h или 3D9h);
- 0040:0084h, ROWS, байт - уменьшенное на единицу число текстовых
строк;
- 0040:0085h, POINTS, слово - высота (количество строк развертки)
символьной матрицы;
- 0040:0087h, INFO, байт - содержит управляющие биты:
- бит 0: эмуляция курсора разрешена (1) или запрещена(0);
- бит 1: подключен цветной (0) или монохроматический монитор (1);
- бит 3: видеосистема активна (0) или неактивна (1);
165
2 Управление видеосистемой
- биты 2, 4: зарезервированы;
- биты 5-6: размер видеобуфера (00 - 64К, 01 - 128К, 10 - 192К, 11 -
256К);
- бит 7: очистка видеобуфера;
- 0040:0088h: INFO3, байт - область переключателей EGA/VGA:
- биты 0-3: это состояния переключателей конфигурации 4-1(1-
включен, 0 - выключен);
- биты 4-7: это биты 3-0 разъема возможностей EGA.
- 0040:0089h, FLAGS, байт - вспомогательные флаги:
- бит 0: система VGA активна (1)/неактивна (0);
- бит 1: усреднение уровней серого разрешено (1) /запрещено (0);
- бит 2: используется цветной (0) или монохроматический (I)
монитор;
- бит 3: загрузка палитры по умолчанию разрешена (1)/запрещена (0);
- биты 4 и 7: число строк развертки текстового режима (00 - 350, 01 -
400,10 - 200);
- бит 5: зарезервирован;
- бит 6: переключение дисплеев разрешено (1)/запрещено (0);
- 0040:008Ah, DCC, байт - индекс таблицы кодов комбинаций дисплеев;
- 0040:00A8h, SAVEPTR, двойное слово - указатель области
сохранения BIOS.
Процедуры BIOS модифицируют значения переменных в области
данных дисплея, отражая состояние видеосистемы. Если в программе
производится изменение среды без вызова прерывания INT 10h, необходимо
соответствующим образом корректировать переменные в области данных
дисплея. В противном случае другие процедуры BIOS будут действовать
неправильно.
2.S.2.2. Область сохранения
Для процедур BIOS адаптеров EGA и выше предусмотрено несколько
областей сохранения, представляющих собой динамические таблицы
информации об аппаратных средствах видеосистемы и самого BIOS.
По существу эти таблицы служат расширением стандартной области
данных BIOS, которая рассмотрена выше. Они применяются для хранения
заменяющих символьных наборов, программирования палитры и других
функций конфигурирования.
Области сохранения связываются с помощью полных указателей типа
FAR, представленных двойными словами в формате сегмент:смещение
(рис. 2.20). Расположение областей сохранения определяет указатель
SAVE PTR из области данных дисплея по адресу 0040:00A8h, который
содержит адрес основной таблицы (primary table) указателей.
166
2.5 Поддержка видеосистемы со стороны BIOS
0040:00A8h
31 О
Рисунок 2.20 - Указатели областей сохранения
В этой таблице находятся полные адреса семи структур данных, которые
имеют различные форматы и содержат наборы данных, относящиеся к работе
адаптера и процедур BIOS (табл.2.5).
Таблица 2.5- Формат основной таблицы указателей
Смещение Тип Описание
00 b Двойное слово Адрес таблицы параметров
04h Адрес области сохранения параметров
08b - н - Адрес заменяющего текстового символьного набора
OCh Адрес заменяющего графического символьного набора
10h Адрес дополнительной таблицы
14b _ it _ Зарезервирован
18h _ и _ Зарезервирован
Последние два адреса в основной таблице указателей зарезервированы, а
пятый адрес указывает на дополнительную таблицу (secondary table),
указатели в которой предназначены для VGA и выше. Дополнительная
таблица также содержит адреса нескольких структур данных, относящихся к
функционированию адаптера и BIOS (см. ее формат в табл.2.6).
Таблица 2.6 - Формат дополнительной таблицы указателей
Смещение Тин Описание
00b Слово Длина таблицы в байтах
02h Двойное слово Адрес таблицы кодов комбинаций дисплеев
06b _ г» _ Адрес второго заменяющего текстового символьного
набора
OAh Адрес таблицы пользовательской палитры
OEh -" - Зарезервировано
12b _ •» _ Зарезервировано
16h Зарезервировано
Помимо основной и дополнительной таблиц указателей единственными
структурами данных, обеспечиваемых в ROM BIOS, являются таблица
параметров и таблица кодов комбинаций дисплеев (начиная с VGA).
Следовательно, в основной таблице указателей необходимо
инициализировать только адреса таблицы параметров и дополнительной
таблицы указателей. Все остальные адреса инициализируются на 0,
167
2 Управление видеосистемой
Таблица параметров. В этой структуре данных находятся параметры
конфигурации, используемые процедурой установки видеорежима (функция
00h). Таблица содержит элементы для каждого поддерживаемого режима,
включая модификации режимов для разных типов мониторов. Так как при
установке каждого режима необходима инициализация всех регистров
видеоадаптера, то каждый элемент таблицы содержит необходимую
информацию для инициализации всех регистров, а число элементов равно
числу поддерживаемых режимов. Как отмечалось раннее, современные
видеоадаптеры SVGA, кроме стандартного набора регистров адаптера VGA,
содержат набор специфичных для каждой модели регистров. Поэтому
структура элементов таблицы для различных моделей адаптеров SVGA
различаются. В табл.2.7 показан формат типичного элемента таблицы
параметров для VGA (стандартная часть любого SVGA), таблица параметров
для VGA состоит из 29 таких элементов (для SVGA, с учетом поддержки
расширенного сервиса VESA BIOS, число элементов значительно больше).
Таблица 2.7 - Формат элемента таблицы параметров для VGA
Смещепие Тиа Описание
OOh Байт Значение для переменной CRTCOL
Olh - " - Значение для переменной ROWS
02 h Значение для переменной POINTS
03h Слово Значение для переменной CRT LEN
05h 4 байта Значения дли регистров Olh - 04h блока синхронизации
09h Байт Зпаченне для вспомогательного выходного регистра
OAh 25 байт Значения для регистров 00h - 18h контроллера CRTC
23 h 20 байт Значения для регистров 00h - 13h атрибутного контроллера
37h 9 байт Значения регистров OOh - 08h графического контроллера
Область сохранения параметров. Эта необязательная таблица содержит
значения регистров палитры 00h - OFh атрибутного контроллера, а также
регистра бордюра (адрес llh). Ее формат приведен в табл. 2.8. BIOS
модифицирует область сохранения параметров при изменении содержимого
соответствующих регистров атрибутного контроллера.
Таблица 2.8 - Формат области сохранения параметров
Смещение Тип Описание
OOh 10h llh-OFFh 16 байт Байт Текущее содержимое регистров палитры Текущее содержимое регистра бордюра Зарезервированы
Заменяющий текстовый символьный набор. Эта необязательная
структура данных определяет текстовой символьный набор, который
используется вместо символьного набора, принимаемого по умолчанию.
Данный символьный набор загружается, когда BIOS вызывается для задания
режима (см. формат таблицы заменяющего набора в табл. 2.9).
168
2.5 Поддержка видеосистемы со стороны BIOS
Таблица 2.9 - Формат таблицы заменяющего
текстового символьного набора
Смещение Тип Описание
00h Байт Число байт в определении каждого символа
01b Блок или банк ЗУПВ знакогенератора
02h Слово Число определений символов
04h Код первого символа в таблице
06h Двойное слово Адрес таблицы шрифта
OAh Байт Число выводимых текстовых строк
OBh Байты Допустимые режимы дисплея
Байт FFh - конец списка режимов
Заменяющий графический символьный набор. Эта структура данных,
формат которой представлен в табл. 2.10, заменяет принимаемый по
умолчанию символьный набор, когда BIOS устанавливает один из
графических режимов.
Таблица 2.10 — Формат таблицы заменяющего
графического символьного набора
Смещение Тип Описание
00h Байт Число выводимых текстовых строк
Olh Слово Число байт в определении каждого символа
03h Двойное слово Адрес таблицы шрифта
07h Банты Допустимые режимы дисплея
Бейт FFh - конец списка режимов
Таблица кодов комбинаций дисплеев. В табл. 2.11 приведен формат
таблицы комбинации видеосистем.
Таблица 2.11 - Формат таблицы кодов комбинации дисплеев
Смещение Тип Описание
00h Байт Число элементов таблицы (число слов, начиная со смещения 04h)
Olh Номер версия таблицы
02h _ ft _ Максимальный код тина диснлея (00 - нет дисплея, 01 - MDA, 02 - CGA, 03 - MCGA, 04 - EGA, 05 - MEGA, Об - PGC, 07 - MVGA, 08 -VGA и тл.)
03b ~ rt _ Зарезервирован
04h Слово Каждая пара байт в массиве слов описывает допустимую комбинацию дисплеев (нри использовании двух дисплеев, один из них должен быть монохроматический)
Примечание: MCGA, MEGA, MVGA- адаптеры CGA, EGA, VGA с
монохроматическим монитором, PGC - профессиональный графический
контроллер.
Таблица пользовательской палитры. Эта структура данных содержит
определяемые пользователем, т.е. используемые вместо принимаемых по
умолчанию, значения 16 регистров палитры и регистра бордюра атрибутного
контроллера, 256 регистров цвета ЦАП и регистра подчеркивания CRTC.
169
2 Управление видеосистемой
Такая структура данных, формат которой приведен в табл.2.12,
поддерживается только для системы VGA и выше.
Таблица 2.12 - Формат таблицы пользовательской палитры
Смещение Тин Описание
00h Байт Разрешение подчеркивания (Olh - разрешено во всех текстовых режимах, 00h - разрешено в монохроматических текстовых режимах, FFh - запрещено во всех текстовых режимах
Olh Байт Зарезервирован
02h Слово Зарезервировано
04h _ <» _ Число регистров атрибутного контроллера в таблице
06h Номер первого регистра атрибутного контроллера
08h Двойное слово Адрес таблицы регистров атрибутного контроллера (указатель внутренней палитры)
OCh Слово Число регистров цвета ЦАП в таблице
OEh _ в _ Номер первого регистра цвета ЦАП
lOh Двойное слово Адрес таблицы регистров цвета ЦАП (указатель внешней палитры)
14h Байты Байт Допустимые режимы FFh - конец списка режимов
Вектор прерывания IDh. Этот вектор по адресу 0000:0074h содержит
адрес таблицы значений инициализации (содержание всех регистров и размер
видеопамяти), необходимых для задания текстовых и графических режимов
адаптеров MDA и CGA. Для современных видеосистем таблица устарела, но
ради совместимости она сохранена во всех компьютерах PC и PS/2.
2.53. Контрольные вопросы
1. Где физически размещаются процедуры обработки прерывания INT
1 Oh (управление видеоадаптером) для различных видеосистем.
2. Представьте общую процедуру обращения к функциям INT 1 Oh.
3. Где размещается область данных дисплея и что там хранится.
4. Что надо модифицировать в области данных дисплея при
непосредственном программировании видеоадаптеров и почему.
5. Что такое область сохранения и как определить ее начальный адрес.
6. Структура основной и дополнительной таблиц указателей.
7. Для чего используется таблица параметров, сколько в ней элементов и
формат элемента таблицы параметров.
8. Что хранит область сохранения параметров и ее структура.
9. Какая структура таблиц заменяющего текстового символьного набора
и заменяющего графического символьного набора и когда эти таблицы
используются.
10. Как определить начальный адрес таблицы кодов комбинаций
дисплеев и какова структура этой таблицы.
170
2.6 Профессиональное программирование в графическом режиме
11. Назначение и формат таблицы пользовательской палитры.
12. Что содержит таблица инициализации, в каких видеосистемах она
используется и как определить ее начальный адрес.
2.6. Профессиональное программирование видеосистем в
графическом режиме
2.6.1. Создание недокументированных режимов
Видеорежимы характеризуются следующими параметрами:
- вертикальным разрешением (количеством строк растра на экране);
- горизонтальным разрешением (количеством символов или пикселов в
строке);
- представлением данных в буфере;
- атрибутами вывода (цвет, мерцание и т. п.).
Для задания указанных параметров загружаются регистры блоков
CRTC, синхронизации, атрибутов и графического контроллера из области
сохранения параметров (см. п. 2.5).
Документированные видеорежимы представлены в Приложении Г.
Необходимость в создании дополнительных видеорежимов связана с
желанием иметь возможность получения на экране изображения с более
высоким разрешением в графическом режиме или возможностью вывода на
экран больших порций данных в текстовом режиме по сравнению со
стандартными видеорежимами, поддерживаемыми BIOS. Такая
необходимость возникает у разработчиков видеоигр.
Наиболее простым путем перехода к нестандартному видеорежиму
является использование программ BIOS для установки некоторого
стандартного видеорежима с последующим изменением значений нескольких
регистров видеоадаптера.
Управлять параметрами сигналов развертки можно путем изменения
значений соответствующих регистров блока CRTC. Значения, помещаемые в
регистры управления строкой, задают длительность отрезков времени,
измеренную в так называемых символьных единицах времени. Символьная
единица это отрезок времени необходимый для вывода на экран 8 пикселей в
графических режимах и 8 или 9 пикселей (одно знакоместо) в алфавитно-
цифровых режимах. Значения регистров управления кадром задаются в
количестве строк.
Для правильного задания временных характеристик сигналов
управления генерацией изображения на экране монитора необходимо при
расчете значений, помещаемых в регистры, учитывать базовые частотные
характеристики видеомонитора и адаптера, такие как частота вывода
пикселей, которая называется полосой пропускания видеомонитора (dot rate),
171
2 Управление видеосистемой
частота строк (scan rate) и частота кадров (vertical scan rate). Центральным
моментом при программировании нестандартных видеорежимом является
выбор таких значений временных параметров управления экраном, чтобы не
выйти за допустимые пределы частотных характеристик используемого
монитора.
Из перечисленных частотных характеристик только полоса пропускания
(Fpic) непосредственно программируется, остальные характеристики
определяются косвенным образом. Полоса пропускания задается битами 2 и
3 многоцелевого регистра вывода (порт 3C2h), которые выбирают один из
двух встроенных тактовых генераторов (см. Приложение В).
Частота строк Fstr определяется по выражению:
Fstr = Fpic/(Lstr * Lse), (2.1)
где: Fpic - полоса пропускания;
Lstr - общая длительность строки (задается в регистре Oh блока CRTC);
Lse - размер символьной единицы (задается нулевым битом первого
регистра блока синхронизации, бит 0 равен единице-8 пикселей, бит 0 равен
нулю-9 пикселей).
Необходимо помнить, что при изменении регистра Oh блока CRTC
необходимо соответствующим образом менять и зависимые от него значения
регистров Olh, 02h, 03h, 04h, 05h, 07h и OBh (см. Приложение В), оставив
неизменными длительности обратного хода горизонтальной развертки и
длительность горизонтального гашения исходного документированного
режима. Аналогичные изменения необходимо вносить при изменении Lse в
текстовых режимах.
Частота кадров определяется по выражению:
Fversk ~ Fstr /Lver, (2.2)
где: Fstr - частота строк, определенная по выражению 2.1;
Lver - общее количество строк в кадре (биты 0-7 хранятся в регистре
06h, бит 8 в нулевом бите, а бит 9 в 5-м бите регистра 07h блока CRTC).
Как в случае изменения параметров строчной развертки, при изменении
кадровой развертки (значения Lver), необходимо соответствующее
изменение зависимых регистров 09h, 10h, llh, 12h, I5h, 16h блока CRTC при
неизменном значении длительности обратной кадровой развертки и сигнала
вертикального гашения. Но в данном случае при изменении числа строк
растра в одном символе (регистр 09h) в текстовых режимах необходимо
позаботится и о загрузке новых описаний символов или модификации
имеющихся шрифтов (см. п. 2.3).
Повышение разрешающей способности экрана при неизменном
значении Fpic приводит в конечном итоге к снижению частоты кадровой
172
2.6 Профессиональное программирование в графическом режиме
развертки, что может привести к мерцанию изображения на экране. Следует
также отметить, что недокументированные режимы не поддерживаются
стандартными графическими библиотеками, поэтому программисту
необходимо иметь собственную библиотеку графических примитивов, хотя
приводимые примеры данной главы помогут легко справится с этой задачей.
В качестве примера создания недокументированного режима более
подробно рассмотрим режим адаптера VGA 320x240 (256 цветов), так
называемый Х-режим, который в полной мере использует возможности
адаптера VGA и его можно назвать естественным режимом данного адаптера.
Единственный документированный 256-цветный режим 13h разрабатывался
для адаптера MCGA (с линейной организацией видеопамяти) и не использует
возможности организации видеопамяти в виде битовых плоскостей.
Отличительными чертами режима X являются:
- соотношение горизонтального и вертикального размеров 1:1;
- режим X позволяет странично-ориентированному аппаратному
обеспечению адаптера VGA обрабатывать пиксели в параллельном режиме,
что увеличивает скорость обновления изображения в четыре раза (по
сравнению с режимом 1 Зй).
- подобно режиму 13h (но в отличие от всех остальных режимов с
многослойной организацией видеопамяти) режим X является режимом ”байт-
на-пиксель". Распределение видеопамяти и ее отображение на экран в
режиме X показано на рис. 2.21.
Рисунок 2.21 - Распределение видеопамяти в режиме X
В этом режиме 1-й байт 0-й битовой плоскости задает цвет (индекс
регистра ЦАП) нулевого пикселя нулевой строки, 1-й байт 1-й битовой
плоскости задает цвет первого пикселя в строке и т.д. Таким образом 4 байта
в видеобуфере с одинаковым адресом, формируют цвета 4-х пикселей в
строке. При такой организации используются рассмотренные в 2.4 режимы
записи/чтения данных в видеобуфер.
173
2 Управление видеосистемой
После установки режима 13h необходимо изменить значения счетчика
числа вертикальных линий и некоторые временные параметры для установки
числа видимых строк развертки равным 480 (нет нужды изменять значения,
относящиеся к разрешающей способности по горизонтали, так как и в
режиме 13h, и в режиме X она составляет 320 пикселей). Однако регистр,
задающий максимальное число строк развертки, запрограммирован в 13h
таким образом, что каждая строка повторяется дважды, и в результате
эффективная разрешающая способность по вертикали составляет 240 строк.
Одновременно программируется видеопамять адаптера VGA в плоскостно-
ориентированном виде, похожем на тот, который используется в
большинстве 16-цветных режимов, и кардинально отличающемся от
линейной схемы 13h. Смещение на экране М пикселя с адресом в
видеобуфере N составляет N/4 (остаток отбрасывается), а номер плоскости Р
пикселя N определяется как P^N mod 4. Для операций записи в видеопамять
плоскость определяется установкой бита Р регистра маски битовой
плоскости (3C4h/3C5h, индекс 2) в 1, а всех остальных бит - в 0. Для
операций чтения плоскость определяется установкой регистра выбора
плоскости для чтения (3Ceh/3CFh, индекс 4) Р.
Выполнение операции отдельно по каждой плоскости делает работу
почти каждой графической операции в режиме X столь же быстрой (как
минимум), как и в режиме 13h. По этой причине полезно организовать
структуры данных так, чтобы они учитывали особенности режима X.
Все аппаратные средства поддержки адаптера VGA доступны в режиме
X. Действительно, важной, с точки зрения обеспечения высокой
производительности работы графических программ в режиме X, является
возможность параллельной обработки данных, соответствующих всем
четырем плоскостям; это относится как к "защелкам", так и к возможности
выдачи данных в любую плоскость или во все плоскости одновременно.
Единственная особенность заключается в том, что левая или правая
сторона прямоугольника, не кратная четвертому столбцу пикселей (т.е.
такому, на котором заканчивается один набор из четырех пикселей и
начинается другой), должны рисоваться согласно регистру маски битовой
плоскости, поскольку не все пиксели по адресу, соответствующему этой
стороне, подлежат модификации (но за одну операцию записи).
В режиме X быстрое заполнение шаблоном шириной четыре пикселя
может выполняться путем однократного отображения шаблона по любому
адресу в видеопамяти. Для этого выполняется считывание этого адреса для
загрузки шаблона в защелке, установка регистра маски битовой плоскости
(Bit Mask) в 0 для указания того, что все отображаемые в видеопамяти биты
должны браться из защелок, и затем заполнение шаблоном с учетом того, что
каждая линия шаблона должна быть загружена в защелки до заполнения
соответствующей строки развертки на экране. Широко используемые
174
2.6 Профессиональное программирование в графическом режиме
шаблоны шириной 8 пикселей могут быть нарисованы в два прохода, по
одному для каждой половины шаблона. Шаблоны удобно хранить в
внеэкранной памяти (в конце видеопамяти, за пределами активной
видеостраницы).
2.6.2. Изображение линии
Функции вычерчивания линий являются основными подпрограммами
графики и используются для отображения линий в заданном цвете путем
задания ее начальных и конечных координат. В то время, как изображение
вертикальных и горизонтальных линий не представляет особого труда, более
трудной задачей является создание функций, которые рисуют линии вдоль
диагоналей. Например, какие точки составляют линию, вычерчиваемую от
точки с координатами 0,0 до точки с координатами 80,120?
Один из подходов к разработке функций вычерчивания линий
использует отношение между смещением по координатам X и Y. Чтобы
показать этот подход в действии, проведем линию между точками с
координатами 0,0 и 5, 10. Смещение по X равно 5, а по Y - 10. Отношение
равно 1/2. Оно будет использоваться при определении коэффициента
зависимости, по которому должны меняться координаты X и Y при
изображении линий. В данном случае это означает, что приращение
координаты X составляет половину величины изменения координаты Y.
Такой подход математически верен и прост для понимания, но для его
необходимо использовать математические операции с числами с плавающей
точкой, а конечный результат округлять (координаты X и Y представляются
целыми числами).
Наиболее общий метод изображения линий включает использование
алгоритма Брезенхейма. Хотя основой в нем служит также отношение между
расстояниями по координатам X и Y, в данном случае не требуется
выполнять деление или вычисление чисел с плавающей точкой. Вместо
этого, отношение между значениями координат X и Y представляется
косвенным образом через серии сложений и вычитаний. Основной идеей
алгоритма Брезенхейма является регистрация средних значений
погрешностей между идеальным положением каждой точки и той позицией
на экране дисплея, в которой она действительно отображается. Погрешность
между идеальным и действительным положением точки возникает ввиду
ограниченных возможностей технических средств. Фактически не
существует дисплеев с бесконечно большой разрешающей способностью, и,
следовательно, действительное положение каждой точки на линии требует
наилучшей аппроксимации. В каждой итерации цикла вычерчивания линии
вызываются две переменные хегг и уегг, которые увеличиваются в
зависимости от изменения величин координат X и Y соответственно. Когда
175
2 Управление видеосистемой
значение погрешности достигает определенного значения, погрешность
вновь устанавливается в исходное положение, а соответствующий счетчик
координат увеличивается. Этот процесс продолжается до тех пор, пока линия
не будет полностью вычерчена.
Функция linem(), приведенная на рис. 2.22, реализует этот метод.
Рисунок 2.22 - Алгоритм изображения линий (Брезенхейма)
В данном алгоритме приняты следующие обозначения:
176
2.6 Профессиональное программирование в графическом режиме
ВХ, BY - координаты начальной точки;
EX, EY - координаты конечной точки;
D_X, D Y - максимальное расстояние по соответствующей координате;
color - цвет выводимой точки;
inc x, inc_y - направление движения по соответствующей координате.
Как видно из алгоритма, при движении по большей координате (dist)
приращение по этой координате и изображение точки выполняется всегда, в
то время как по другой координате только при выполнении условия
xerr>dist.
Если у вас есть функции вычерчивания линий, то не составит особого
труда создать функции вычерчивания прямоугольников. Пример,
приведенный здесь, вычерчивает прямоугольники в заданном цвете по
известным координатам двух противоположных углов.
Для того, чтобы закрасить прямоугольник, требуется выполнить запись
цвета в каждую точку растра внутри прямоугольника. При этом необходимо
в цикле рисовать заданным цветом ряд горизонтальных линий, смещенных на
единицу по координате у.
Тщательное продумывание алгоритма позволяет исключить излишнюю
медлительность, свойственную многим программам заполнения областей для
графического экрана. Когда заполнение основано на простых вычислениях,
которые действуют по очереди для каждой точки, требуется выполнять
продолжительные битовые операции. Более экономичный алгоритм может
определять, все ли битовые позиции определенного байта видеобуфера
должны иметь один и тот же цвет, и когда это условие выполняется, этому
байту присваивается заранее заготовленное значение, которое устанавливает
все точки в правильный цвет.
При заполнении прямоугольника линиями только первый и последний
байт каждой строки может быть неполным (если ВХ или ЕХ не кратен 8).
При затушевывании горизонтальными линиями нет смысла использовать
процедуру line m(), реализующую алгоритм Брезенхейма, необходимо
просто определять адрес байта в видеопамяти, который соответствует в
данный момент 8 выводимым точкам с начальными координатами х и у,
причем х кратен 8.
adr = A000:0000h +Xdiv 8 + Y*80, (10.3)
При работе алгоритма Брезенхейма в случае DX > DY в каждой
строке выводится несколько точек. Если перед выводом пикселя в алгоритме
анализировать значение ВХ при неизменном BY и дописывать 1 в битовую
маску, то при использовании разработанной процедуры вывода байта с
заданной маской обращение к ней выполняется только в случае кратности 8
значения ВХ (переход на следующий адрес видеопамяти ) или изменения BY
177
2 Управление видеосистемой
(переход на следующую строку). В случае если DY > D X и толщина линии
составляет 2, 3, и т.д. пикселя за одно обращение к put_pix() можно выводить
соответствующее число точек (если они относятся к одному адресу
видеопамяти ).
2.6.3. Перемещения и вращения 2-х и 3-х мерных объектов
2.6.3.1. Вращение точки в плоскости экрана
Вращение точки в плоскости экрана (двумерном пространстве)
представляет собой довольно простую задачу в декартовой системе
координат. Из курса аналитической геометрии известно, что вращение точки
вокруг центра, который находится в начале координат на угол theta,
описывается формулой:
new_ У = У * cos(theta) + X * sin(theta)
newX = X * cos(theta) - Y *sin(theta) (10.4)
Единственной сложностью при употреблении этих формул для
графических дисплеев будет тот факт, что экран дисплея не является
декартовым пространством. Декартовые оси определяют 4 квадранта. Однако
экран терминала представляет собой один из квадрантов, оси X и Y в
котором перевернуты. Ось X направлена слева направо от верхнего угла, а
ось Y-сверху вниз.
Для решения этой проблемы необходимо определить новый центр и
привести в соответствие координаты X и Y экрана в координаты осей D _Х и
D Y декартова пространства по выражениям:
D_X=X-X0;
DY-Y0-Y. (10.5)
Любая точка на экране может быть использована в качестве центра, но
обычно центр определяется как можно ближе к центру объекта, который мы
собираемся вращать. Угол вращения следует задавать в радианах. Для
вращения точки необходимо выполнить следующее:
- ’’потушить” точку, записав в нее цвет фона;
- привести в соответствие координаты дисплея к декартовым;
- повернуть точку в декартовых координатах на угол theta;
- восстановить новые координаты дисплея по выражениям:
X~D_X+X0;
Y-Y0-DY. (10.6)
- вывести точку на экран с заданным цветом.
178
2.6 Профессиональное программирование в графическом режиме
2.63.2. Вращение плоской фигуры в плоскости экрана
Под объектом здесь и далее будем понимать набор сегментов прямых
отрезков. Координаты крайних точек каждого отрезка содержатся в
двумерном массиве чисел с плавающей точкой. Каждая строка массива
содержит начальные и конечные координаты данного отрезка. Это означает,
что первая размерность массива представляет собой количество отрезков,
входящих в состав объекта, а вторая размерность будет равна 4 (число
координат крайних точек отрезка). Например, массив, приведенный ниже
object: array [1.3,1..4 ] of double;
определяет объект, состоящий из 3 отрезков (см. табл. 2.13).
Определить объект - это значит разместить в массиве координаты
начальных и конечных точек отрезков, составляющих объект. Например, для
прямоугольника с координатами 0x0 10x10 (определяется 4-мя отрезками), в
массив, определяющий данный прямоугольник, заносятся следующие числа:
object[0,0] = 0; object[0,1 ] = 0; object[0,2] = 0; object[0,3] « 10;
objectfl,0] = 0; objectfl,1] = 10; objectfl,2] = 10; objectfl,3] - 10;
object[2,0] = 10; object[2,l] = 10; object[2,2] = 10; object[2,3] = 0;
object[4,0] =10; object[4,l] = 0; object[0,2] = 0; object[0,3] = 0;
Таблица 2.13 - Определение объекта
Первый индекс Второй индекс
1 2 3 4
1 Start XI Start Y1 End XI End Y1
2 Start Х2 Start Y2 EndX2 End Y2
3 Start ХЗ Start Y3 EndX3 End Y3
После того, как объект определен, можно вращать его по часовой
стрелке или против, используя функцию rotate_object() и задавая
соответствующий знак угла theta. При вращении объекта необходимо
выполнить следующие действия:
- вывод изображения объекта путем организации цикла по первому
индексу массива object, считывая координаты двух точек из
соответствующей строки массива и с помощью функции line m () строя
изображения отрезка прямой;
- организация цикла ожидания нажатия клавиши (выход из цикла при
нажатии клавиши ESC) внутри которого выполняются действия;
- ’’гашение’’ на экране объекта, которое состоит в изображении объекта
фоновым цветом. Если “гасить” объект цветом отличным от фона, то
вращающаяся фигура будет оставлять за собой след;
- поворот каждой точки объекта с помощью рассмотренной ранее
процедуры вращения точки. При этом надо учесть, что каждая строка
179
2 Управление видеосистемой
описания объекта содержит координаты двух точек, поэтому для каждой
строки необходимо дважды вызывать функцию rotate_point с параметрами:
object[i,0], object[i,l], theta, ХО, YO - для 1 точки,
object[i,2], object[i,3], theta, ХО, YO-для 2 точки;
- вывод изображения объекта с новыми координатами.
2.63.3. Вращение трехмерных объектов
Прежде чем вращать трехмерные объекты необходимо рассмотреть
отображение трехмерных объектов, заданных отрезками прямых в
декартовых координатах экрана X, Y. Как и при вращении плоских фигур
считаем, что начало системы декартовых координат совпадает с центром
вращения. Без нарушения общности рассмотрим преобразование координат
одной точки.
Как известно из курса инженерной графики, для отображения
трехмерных координат в двумерные, используются различные виды
проекций. Наиболее распространенной является изометрическая проекция, у
которой ось D Z направлена вертикально вверх, а ось D X и D Y повернуты
на угол +120 градусов и -120 градусов соответственно. Коэффициент сжатия
по всем трем осям равен 0.97 (для простоты можно взять 1). Другой
проекцией является диметрическая кабинетная, у которой ось DZ
направлена вертикально вверх, ось D Y направлена горизонтально влево, а
ось D X повернута на +135 градусов относительно оси D Z (или на -135
градусов относительно оси D Y). Коэффициент сжатия по осям D Z и DY
равен 1, а по оси D X равен 0.5. Таким образом, учитывая особенности
координатной системы экрана (ось X направлена влево, а ось Y вниз),
преобразование координат точки выполняется:
-для изометрической проекции
X-X0 +cos(3.1418/6) *(D_Y-D_X);
Y~ Y0-DZ + sin(3.1418/6) * (D_X + DY). (2.7)
-для кабинетной проекции
X=X0 + D_Y-0.5 * sin(3.1418/4) *D X;
Y=Y0- DZ + 0.5* sin(3J418/4) * D_X; (2.8)
где: X0, YO - координаты центра вращения и начала декартовых трехмерных
координат в плоскости экрана;
D X, D Y, D Z - декартовы координаты точки;
X, Y - координаты точки на экране.
Сделав преобразование координат 2-х точек отрезка можно построить
проекцию каждого отрезка прямой, которые создают проекцию трехмерного
объекта на экране.
180
2.6 Профессиональное программирование в графическом режиме
Ось вращения трехмерного объекта расположена в пространстве
произвольным образом и рассматриваются ее составляющие-проекции осей
вращения на координатные оси DZ, D_Y, D_X. Поэтому рассмотрим
преобразование координат точки при вращении вокруг соответствующей оси
(координата оси вращения не меняется).
Вращение вокруг оси Z:
DJY-DJY * cos(theta) + D_X * sinftheta);
DX = DX * cos(theta) -DY*sin(theta), (2.9)
Вращение вокруг оси Y:
DX=D_X * cos(theta) + DZ * sin(theta);
D_Z = D~Z *cos(theta) -*sinftheta). (2.10)
Вращение вокруг оси X:
D_Z = * cos(theta) + D_ Y * sin(theta);
DY = DY * cos(theta) - iTz * sin(theta). (2.11)
Трехмерный объект удобно вначале описывать в декартовой трехмерной
системе координат в виде двух массивов:
1) двумерный массив описаний вершин (точек), в котором первая
размерность соответствует числу точек, а вторая размерность равна 3 и
соответствует трем координатам каждой точки DX, DY, DZ
соответственно. Например, при описании пирамиды с треугольным
основанием (имеется 4 вершины), массив описания точек имеет вид:
poin: array [1..4Д..З] of double ((60,00,40), {координаты 1 точки)
(40,-60,-40),
(-40, 60,-40,),
(00, 00,60 ));
2) двумерный массив описания ребер (линий), в котором первый индекс
соответствует числу линий, а второй индекс (размерность равна 2) содержит
индексы начальной и конечной точки линии (индекс точки соответствует
номеру строки в предыдущем массиве poin).
Для рассмотренного выше примера треугольной пирамиды массив
описания ребер имеет вид:
K_poin: array [1..6, 1 ..2]=((0,1),(1,2),(2,0),(0,3),(1,3),(2,3));
Используя рассмотренные массивы и выполнив . преобразование
декартовых трехмерных координат, программа формирует описание объекта
в координатах экрана аналогично массиву object в двумерном случае.
Таким образом, при вращении трехмерного объекта программа
выполняет следующие действия:
181
2 Управление видеосистемой
- по заданным массивам poin и K_poin формирует описание проекции
объекта на экране - object;
- выводит изображение объекта как в двумерном случае, используя
описание object и функцию linem;
- организует цикл ожидания нажатия клавиши (выход из цикла по ESC),
внутри которого выполняются следующие действия :
- ’’гашение" объекта, т.е. зарисовка его цветом фона;
- поворот точек массива poin вокруг заданной оси. При повороте точек
преобразования поворота выполняются для каждой строки массива poin;
• формирование нового значения массива object и вывод изображения на
экран.
2.6.4. Основы видеоигр. Понятие ’’спрайта”
Многие видеоигры, в которых игрок управляет объектами, атакующими
другие объекты, управляемые программой или защищающимися от них,
включают два класса активных объектов: среду (представляющую для нас
мало меняющееся поле игры) и спрайты. Спрайт - это небольшой подвижный
объект, который движется по полю видеоигры по определенным правилам с
заданной целью.
В данном случае под спрайтом будем понимать фигуру, определенную
некоторыми замкнутыми отрезками. Хотя, в общем случае спрайт может
изображаться любым образом, например, в виде окружности. Спрайт
определяется в виде двумерного массива целых чисел. Например, спрайт,
состоящий из 4 отрезков может быть описан следующим массивом
sprite: array [ 1..4, 1..4 ] of word;
Первая размерность массива определяет количество отрезков спрайта, а
вторая - координаты конечных точек отрезков. Начальные и конечные
координаты отрезков задаются в следующей последовательности:
start_x,start_y,end_x,end_y
Отрезок, входящий в спрайт, с координатами конечных точек 0,0 и 0,10
может быть описан следующим массивом:
sprite[O,O]:= 0; start x
sprite[0,1 ] := 0; start_y
sprite[0,2]:= 0; end_x
sprite[0,3]:~ 10; end y
Поле игры (одно или несколько) изображается отдельными
программами, которые хранятся в файлах и загружаются по мере
необходимости.
182
2.6 Профессиональное программирование в графическом режиме
Ключевым и наиболее впечатляющим моментом видеоигры является
мультипликация. Мультипликация - основной отличительный признак
видеоигр. Основной метод мультипликации прост: уничтожить изображение
предмета и создать его вновь, но с некоторым небольшим смещением,
(имитация движения).
Скорость этого процесса должна быть очень высокой. Это может быть
обеспеченно путем непосредственного доступа к видеопамяти дисплея. Для
повышения качества изображения, быстродействия операций уничтожения и
повторного изображения объекта используется операция "Исключающего
или" для двоичного кода каждой точки объекта на экране. Если применяемый
язык программирования не содержит операции "Исключающего или", то ее
можно получить как
XI XOR Х2="НЕ" XI "И" Х2 "ИЛИ" XI "И" "НЕ" Х2.
Этот способ обеспечивает возможность быстрого перемещения спрайта
по экрану, не меняя цвет и размеры неподвижного изображения (фона), и
фактически не уничтожая в памяти терминала данные о его изображении.
Это возможно потому, что для операции "Исключающего или" (сумма
по модулю 2) справедливо соотношение
(fon XOR color) XOR color^fon. (2.12)
где: XOR - операция "Исключающее или", т.е. повторное изображение
спрайта в тех же позициях тем же "собственным" цветом color
восстанавливает исходный цвет неподвижного рисунка fon и нет
необходимости сохранять в ОЗУ или файле часть экрана где будет
изображаться спрайт. Следует отметить, что при первом изображении
спрайта по выражению
colorl=fbn XOR color (2.13)
"видимый" цвет спрайта colorl отличается от его "собственного" цвета color,
причем если точки фона, поверх которых изображается спрайт, имеют разные
цвета, то при одном и том же "собственном" цвете "видимый" цвет в этих
точках отличается друг от друга. Спрайт словно хамелеон меняет свой цвет
при движении по разноцветному экрану, всегда оставаясь видимым
независимо от собственного цвета и цвета фона.
Истинный собственный цвет спрайта можно узнать, поместив его на
черный фон. Любителям экспериментировать с регистрами палитры следует
учесть, что операция "Исключающего или" выполняется не над цветом, а над
кодами номеров регистров палитры и, например, изменение регистра
палитры собственного цвета спрайта color в случае, если в рисунке фона не
используется регистр палитры, не вызовет никакого эффекта.
183
2 Управление видеосистемой
Рассмотрим кратко, как работает программа управления спрайтом.
Клавиши управления курсором определяют положение спрайта. При нажатии
клавиши спрайт смещается на одну точку растра в указанном направлении.
Если возможен выход спрайта за пределы границ экрана, то такое
перемещение запрещается.
Обычно необходимо выбирать малый размер объекта, который
"оживляется" для того, чтобы его можно было перерисовывать с высокой
скоростью. Это обеспечивает плавность движения при мультипликации. Если
объект достаточно большой, то его движение будет дискретно. При
разработке видеоигр необходимо так подбирать размеры спрайта, чтобы
возможности компьютера и адаптера реализовывались оптимальным
образом.
Передвижение спрайта по экрану составляет только половину
возможностей его "оживления". В основном спрайт будет использоваться на
экране для того, чтобы создавать иллюзию движения. Например, спрайт,
который выглядит подобно человеку, может передвигать ногами, как будто
он идет. Этот тип "оживления" является наиболее впечатляющим (и наиболее
легким). Для обеспечения такой возможности разрабатывают два или более
вариантов спрайта, отличие между которыми заключается в том, что
некоторые из частей спрайта отличаются от первоначального его варианта.
Программа последовательно меняет варианты спрайта в процессе его
движения по экрану.
Если спрайт изображается в виде правильного многоугольника с числом
сторон п, то второй спрайт отображает ту же функцию, повернутую под
углом 3.1418/п. Если составить программу движения спрайта с поочередной
сменой типа, то будет создаваться впечатление, что фигура катится в
процессе передвижения по экрану.
Подобно остальным программам, программы видеоигр включают как
операторы, так и данные. Кроме счета игры и статуса различных,
расходуемых в процессе игры ресурсов (например, количество запущенных
фотонных торпед), большинство данных, используемых в видеоиграх,
представляют собой позиции экрана для различных объектов. Координаты
позиций экрана для движущихся объектов должны хранится в установленных
переменных. Информацию о фиксированных объектов игрового поля
целесообразно читать непосредственно с видеопамяти терминала.
В большинстве видеоигр существуют спрайты, которые находятся под
управлением пользователя. Обычно игроку не разрешается перемещать
спрайт через некоторые объекты игрового поля или через другой спрайт.
Есть два способа ограничения местонахождения спрайта. В первом способе в
установленных переменных хранятся граничные точки области, где
разрешено движение спрайта. При передвижении спрайта по экрану
184
2.6 Профессиональное программирование в графическом режиме
осуществляется контроль на выход за пределы этих допустимых
значений.(Так контролируется выход спрайта за пределы экрана).
Однако этот метод обладает довольно малой реактивностью и для игр с
большим количеством объектов неэффективен. Более удобным способом
является простая проверка области экрана на предмет нахождения в ней
какого-либо объекта путем контроля соответствующей области видеопамяти.
Это обеспечивается тем, что информация об игровом поле уже находится в
видеопамяти и бессмысленно ее где-либо дублировать.
В процессе игры удобно оперировать объектами разного цвета.
Например, красный цвет может отображать границы не пересекаемых
областей, зеленый цвет используется для вашего спрайта, а желтый - для
спрайта противника. Хотя это можно сделать с использованием переменных,
описывающих эти объекты, часто бывает удобнее заранее определять для
объектов его цвет. Это не только упростит процесс программирования
видеоигры, но и сделает ее более быстродействующей. Например, если в
красный цвет окрашена мина, то считается, что вы на ней подорвались лишь
в том случае, если одна из точек вашего спрайта окрашивается в красный
цвет.
Например, вы можете сделать спрайт игрока зеленым, спрайт
компьютера - желтым, а границы поля игры - красным. В соответствии с этим
подходом, подпрограмма перемещения спрайта игрока перед перемещением
на новую позицию контролирует для крайних точек спрайта наличие
красного цвета и в случае его обнаружения запрещает передвижение в
данном направлении. А подпрограмма перемещения спрайта компьютера (
догоняющий спрайт) аналогично контролирует зеленый цвет и фиксирует
момент ’’касания1'. В данном случае для определения цвета точки эффективно
используется режим чтения 1, описанный в п.2.4.5. В данном случае так же
значительно упрощается процесс ограничения области движения спрайтов
красной линией.
Все видеоигры имеют одну главную общую деталь - программу,
управляющую игрой. Алгоритм таких программ довольно сходен для
различных видеоигр. Главная программа генерирует движение объектов по
экрану, контролирует нажатие клавиш пользователем и реагирует на них,
проверяет допустимость заданных перемещений, подсчитывает набранные
очки и отображает счет, последовательно вызывает функции отображения
объектов на экране.
2.6.5. Примеры программирования
Пример /. Устанавливает режим 13h, а затем программирует его в
режим X (320x240) 256 цветов. Используется процедура установки режима
setmode,
procedure xmod;
185
2 Управление видеосистемой
{ константы для программирования контроллера CRTC - }
{ регистры 06h, 07h, 09h, 10h, 1 Ih, 12h, 14h, 15h, 16h, 17h }
const arriarray [0..9] of word = ($d06,$3e07,$4109,$ea 10,$acl 1, Sdfl2,$14,$e715,$616,$e317);
var a: byte;
b,c:word;
begin
setmode ($13); { установка режима 13h }
port [$3c4J:=4; { регистр использования памяти }
port |$3c5):=$C; { цепочка 4 }
port I$3c4]:=0; { регистр инициализации }
port |$3с5|:=1; { асинхронная }
port j$3c2]:=$e3; { код в многоцелевой регистр вывода }
port [$Зс4}:==0; { регистр инициализации }
port [$3c5]:=3; { нормальное функционирование }
port l$3d4]:«$ll; { регистр окончания обратного }
{ хода луча кадровой развертки }
a:=port [$3d5]; { чтение }
a:=a and $7f; { сброс старшего бита (снятие }
{ защиты от записи per. 0-7) }
port [$3d4]:=$ll; { завись регистра окончания }
port j$3dsj:=a; { обратного хода луча I
{ цикл записи 9-тн констант в регистре контроллера CRTC
for а:=0 to 9 do
portw ($3d4]:=arr [a]; port [$3c41:==2; { маска битовой плоскости }
port [$3с5):=15; for b:=0 to Sffff do { разрешить все битовые плоскости }
mem |$a000:b]:=0; { очистка видеопамяти }
Пример 2. Выводит линию по алгоритму Брезенхейма, xl, у!
координаты первой точки; xh, yh - координаты второй точки; clr - цвет,
procedure line_m (xl, yl, xh, уh:word; clr:byte);
var xerr, yer r: word;
dx, dy, distzword;
tzword;
xint,sm,mask: byte;
addrlzword;
sgnzboolean;
begin
sgn:=true;
if xi>=xh then
begin
xerr:=xh;
xh:-xl;
xl:=xerr;
xerr:=yh;
yh:=yl;
yl:=xerr;
end;
port ($3ce|:=5; { инициализация регистра режима }
port [$3cfl:==0;
port[$3c4]:=2; { маска битовой плоскости }
port[$3c5J:=clr;
186
2.6 Профессиональное программирование в графическом режиме
dx:=xh-xl;
dy:=yh-yl;
if yl>yh then
begin
dy:eyl-yh;
sgn:~false;
end;
if dx>dy then dist:=dx
else dist:=dy;
xerr:=dx;
yerr:=dy;
for t:=0 to dist do
begin xint:-xl div 8; { вычисление адреса пикселя и его }
sm:~xl mod 8; addrl :=yl*80+xint; { смещения в байте }
mask'.—SSO; mask:=mask sbr sm; port |S3ce|:=8; port j$3cf]:=mask; sm:=mem[$aOOO:addrl J; mem [$a000: addr 1 ] xerr:=xerr+dx; yerr:=yerr+dy; if xerr>dist then определение битовой маски }
begin
xerr:=xerr-dist;
inc (xl);
end;
if yerr>dist then
begin
yerr:=yerr-dist;
if sgn then inc (yl)
else dec (yi);
end;
end;
end;
Пример 3. Демонстрирует быстрый вывод горизонтальной линии в
режиме записи 2. Сначала инициализируется Регистр Режима, после чего
определяются маски для начала и конца линии (maskl, mask2). Если начало и
конец линии находятся в одном байте (xintl=xint2), то маски объединяются,
procedure putgorline (xl^h,y:word;clr,fil:byte);
var maskl, mask2:byte;
xintl, xint2:byte;
k,sm:byte;
addrl.-word;
begin
port [S3ce]:=5; { инициализация регистра режима }
port j$3cfl:-2;
xintl :=xl div 8; { иомер байта точки 1 }
sm:=xi mod 8;
maskl :=1;
187
2 Управление видеосистемой
к:=0;
while k<(7-sm) do {
begin
maskl:=maskl shl 1;
maskl:-maskl or 1;
inc (k);
end;
xint2:==xh div 8; {
sm:~xh mod 8;
mask2:=$80;
k:==0;
while k<sm do {
begin
mask2:~mask2 shr 1;
mask2:~mask2 or 128;
inc (k);
end;
addrl :=y*80+xintl;
if xintl=xint2 then
maskl:~maskl and mask2;
port [$3cej:=8; {
port [$3cf]«'=maskl and ffl;
sm:=mem|$a000:addrl];
mem [SaOOO: addrl ] :=clr;
if xintl<>xint2 then
begin
inc (addrl);
port ($3ce]:=8; {
port [$3cfl:=fil;
sm:~mem[$aOOO:addrl];
for k:=xintl to (xint2-2) do
begin
mem [$a000: addrl ] :=clr;
inc (addrl);
end;
port [$3cej:=8; {
port [$3cf]:~mask2 and fil;
sm:-mem[$aOOO:addrl];
mem($aOOO:addrl]:=clr;
end;
end;
Пример 4 Демонстрирует быструю
procedure putbar (xl,yi,xh,yh:word;cir,fil:byte);
var maskl, mask!: byte;
xintl, xint2:byte;
sm:byte;
addrl: word;
addr2:word;
l:word;
begin
port |S3ce|:=5; {
port [$3cf]:=2;
xintl :~xl div 8;
определение маски для начала }
номер байта точки 2 }
определение маски для конца }
загрузка регистра битовой маски }
загрузка регистра битовой маски }
загрузка регистра битовой маски }
закраску прямоугольника.
инициализация регистра режима }
188
2.6 Профессиональное программирование в графическом режиме
sm:=xl mod 8;
maskl :=1;
k:=*0;
while k<(7-sm) do
begin
maskl :=maskl shl 1;
maskl :=maskl or 1;
inc (k);
end;
xint2:=xh div 8;
sm:=xh mod 8;
mask2:~128;
k:=0;
while k<sm do
begin
mask2:-mask2 shr 1;
mask2:=mask2 or 128;
inc (k);
end;
addrl :^=yl*80+xintl;
if xintl =xint2 then
maskl :=maskl and mask2;
port [$3ce|:=8; { загрузка регистра битовой маски }
port f$3cf):=maskl and ffl;
addr2:~addrl;
for l:=yl to yh do
begin
sm:-mem[$a000:addr2];
mem [$a000: addr2]: =clr;
addr2:=addr2+80;
end;
if xintloxint2 then
begin
port [$3ce]:=8; { загрузка регистра битовой маски }
port [$3cf]:=mask2 and fll;
addr2:~addr l+xint2-xintl;
for i:=yl to yh do
begin
sm:=mem[$a000:addr2];
mem [$ a000: addr2] :=clr;
addr2:~addr2+80;
end;
end;
if (xintl oxint2) and (xintl<>xint2-l) then
begin
inc (addrl);
port [S3ceJ:=8;
port ($3ef]:—fil;
for k:=xintl to (xint2-2) do
begin
addr2:-addrl;
for l:=yl to yh do
begin
189
2 Управление видеосистемой
sm:=mem{$a000:addr21;
mem[$a000:addr2]:=clr;
inc (addr2,80);
end;
inc (addrl);
end;
end;
end;
Пример 5. Демонстрирует вращение плоской фигуры (треугольника) на
угол theta при каждом нажатии любой клавиши (выход по ESC) и вращение
трехмерного объекта (пирамиды) вокруг осей X, Y, Z при нажатии на
соответствующую клавишу.
$е+,п+
uses graph, crt;
const obj:array[0..2,0..3] of double2 ((260,80,400,80),
(400,80,300,200),
(300,200,200,80));
var palette: palettetype;
GraphDriver, GraphMode:integer;
{ вращение точки с координатами х,у па угол theta вокруг центра x_org, y org }
procedure rotate_point(theta:double;var х,у:double; x_org, y__org:word);
var
tx,ty:double;
begin
{ нормализация X и Y к начальному адресу }
txz^x-X-Org;
ty:=y_org-y;
{ вращение }
x:2tx *cos(theta)-ty*sin(theta);
y:=tx *sin(theta)+ty*cos(theta);
{ возвращение значении координат )
x:==x+x_org;
y:=y_org-y;
end;
{ вращение плоской фигуры в плоскости экрана }
procedure rotate_xy;
const
tbetazdoubleHU;
x_org:word2300;
n:word-3;
y_org:word~130;
vari:word; { startx, starty, endx, endy }
begin
setffllstyle(EMPTYFILL,9);
bar(0,0,639,349);
setcolor(Se);
for i:=0 to n-1 do
line(round(obj[i,0]), round(obj[i,l]), round(obj[i,2J), round(obj(i,3]));
repeat until readkey>#0;
while true do
begin
for i:=0 to n-1 do
190
2.6 Профессиональное программирование в графическом режиме
begin
setcolor($2);
li»e(round(obj|i,0]), round(obj[i,l]), round(obj(iT2|),round(obj(i3]));
rotatejpoint(theta, obj[i,0], obj[i,l |, x_org, y_org);
rotate_point(theta, obj [1,2], obj[i3], x_org, y_org);
setcolor($e);
line(round(obj[i,0]), round(obj[i,l[), round(obj[i,2]), round(obj[i3]));
end;
if readkey=#13 then exit;
end
end;
{ Вращение трехмерного объекта вокруг заданной осн х, у нлн z на угол theta }
procedure rotate_xyz;
const
x0:word=320;
y0:word=150;
n_p:word=4;
n_line:word=6;
poin:array (0..3,0..2] of double=((60,00,-40),
(-40,-60,-40),
(-40,60,-40),
(00,00,60));
k_poin:array[0..5,0..1] of word=((0,l),(l,2),(2,0),(0,3),(13),(23));
alfa:array(0..2] of donbie=(0.4,0.2,0.2);
var
i:word;
c:char;
yt, xt, kl, k2:doubie ;
po_ot:array[0.3,0..1] of word;
begin
kl:=cos(pi/6);
k2:=sin(pi/6);
for ir=0 to n_p-l do
begin
po_ot[i,0]:-round(x0+kl*(poin[i,l]-poin[i,0]));
po_ot[i,l j :=round(y0-poin [i,2|+k2 *(poin[i,0]+poin (i,l ]))
end;
setcolor($e);
for i:=0 to njine-l do
line(po_ot[k_poin[i,0],0], po_ot[k_poin[i,0],l], po__ot[k_poin[i,l],0|, po_ot[k_poin[i,!],!]);
c:=upcase(readkey);
while co#27 do
begin
setcoior($l);
for i:=0 to njine-l do
line(po_ot[k_poin[i,0|,0J, po_ot[k_poin|i,0],l),
po_ot[kpoin[i,lj,0], poot[k_poin[i,l],lj);
for i:=4) to np-1 do
begin
case c of
’Z’: begin
yt:~poin[i,l]*cos(alfa[0])+poin[i,0]*sin(alfa[0});
xt:=poin[i,0] *cos(alfa [0 j)-poin [i,l ] *sin(aifa [0]);
191
2 Управление видеосистемой
poin[i,lj:=*yt;
poin[i,0|:=:xt
end;
*Y*:begin
yt:=poin{i,0}*cos(alfa[l])+poiii[i^|*sin(alfa[l]);
xt:-poin[i^]*cos(alfa[lj)>poin[i,0}*sin(alfa{l]);
poin[i,0|:=yt;
poin|i^j:=xt
end;
’X*:begin
yt:-poin[i,2]*cos(alfa[2])+poin(i,l]*sin(alfa(2]);
xt.=poin|i,l]*cos(aIfa(2D-pom[U}*sin(aIfa[2]);
poin(U]:=yt;
poin[i,lj:=xt
end
end;
poot[i,0]:=round(x0+kl*(poiH|i,lj-poin[i,0J));
po_ot[i,l j :=round(y0-poin|i,2J+k2* (poin [i,0|+poin[i,l J))
end; {for}
setcolor($e);
for i:=0 to n_line-l do
line(po_ot[k_poin(i,0],0], pp_ot[k_po!n(i,0],l],
po_pt[k_poin[i,l ],0], po_ot[k_poin[i,l ],!]>;
c:~upcase(readkey)
end
end;
BEGIN
GraphDriver:=detect;
initgraph(GraphDriver,GraphModfe,”);
getpalette(palette);
rotate_xy;
rotatexyz;
closegraph;
END.
Пример 6. Демонстрирует простейшую видеоигру - перемещение
спрайта в виде двух пересекающихся линий под управлением клавиш по
разноцветному контуру с запретом выхода за пределы экрана и запретом
перехода на красный цвет.
Sc-
uses graph, crt;
const
sprite:array|0..1,0..3J of word=((208,200,208,216),(200,208,216,208));
spritel:array[O..l, 0..3] of word=((202,202,214,214),(202,214,214,202));
N:word=2;
var
GraphDriver,GraphMode: integer;
palette: palettetype;
tip: boolean;
color, bre_col:byte;
{ Вычерчивание линии заданного цвета с использованием }
{ алгоритма Брезенхама и операции "исключающее ИЛИ” }
192
2.6 Профессиональное программирование в графическом режиме
procedure linem(startx, starty, endx, endy:word; color:byte);
const
xerr:word=0;
yerr:word=0;
fon:byte=2;
var
t,distance:integer;
deltax, delta_y: integer;
incx, incy:integer;
begin
{ вычисление расстояния в обоих направлениях }
deltax: -endx-startx;
de!ta_y:=endy-starty;
{ определение направления шага, шаг вычисляется либо по }
{ вертикальной, либо горизонтальной координате )
if delta_x>0 then incx:=l
else if delta_x=O then incx:=O
else inex:=-l;
if delta_y>0 then incy:=l
else if delta_y=O then incy:=O
else incy:= -1;
{ определение какое расстояние больше }
deltax: =abs(delta_x);
delta_y:=abs(delta_y);
if delta_x>delta_y then distance; ==delta_x
else distance:=delta_y;
{ вычерчивание линий }
for tr=O to distance do
begin
fon;~byte(getpixel(startx, starty)); { Чтение цвета фона }
fon:- fon xor color;
putpixei(startx,starty,fon); { изображение точки }
inc(xerr, delta_x);
inc(yerr, delta_y);
if xerr>=distance then
begin
dec(xerr, distance);
inc(startx, incx)
end;
if yerr>=distance then
begin
dec(yerr,distance);
inc(starty,incy)
end
end
end;
{ Процедура заполнения экрана 16-ю квадратами с различными }
{ значениями цветов (Oh - Fh) }
procedure fon__put;
193
2 Управление видеосистемой
var
xn,yn,xk,yk3j:word;
begin
уп:=*0;
for кМ) to 1 do
begin
yk:==yn+174;xn:=0;
for j:=0 to 7 do
begin
xkz==xn+79;
setfillstyle(SOLIDFILL,color);
bar(xn, yn, xk, yk);
inc(color);
inc(xn,80)
end;
inc(yn,175);
inc(color);
end
setcolor(4);
line(0,1,600» 350) { красная линия, запрещающая движение }
end;
{ Подпрограмма изображения спрайта }
procedure get_obj;
var
i:word;
begin
if not tip
then
for i:=0 to N-1 do
Iine_m(sprite[i,Oj, spritefi, 1 J, sprite[i,2], sprite(i4}, color)
else
for i:==0 to N-1 do
linem(spritel[i,O], sprite 1 [i,l spritel[i,2],spritel[i3],color)
end;
{ Процедура управления движением спрайта }
procedure movement;
const
dx:integer=0;
dy:integer=0;
var
i:word;
c:char;
begin
tip:=false;
c:=readkey;
while c<>#27 do { Выход по клавише ESC }
begin
if c=#0 then c;=readkey;
dx:^=0;
194
2.6 Профессиональное программирование в графическом режиме
dy:=0;
case с of
#75: dx:=-3; { стрелка влево
# 77: dx:«3; { стрелка вправо
# 80: dy:-3; { стрелка вниз
# 72: dy:=-3; { стрелка вверх
end;
{ Стирание текущей позиции спрайта путем повторной записи
getobj;
{ Проверка выхода за границу и перемещение спрайта
for i:=0 to N-l do
}
}
}
}
}
}
begin
if ((sprite[i,0]+dx)<0) or ((spritc[i,2]+dx)>639) then dx:=0;
if ((sprite[i,l|+dy)<0) or ((sprite(i,3J+dy)>349) then dy:=O;
{ Проверка столкновений c bre_col
if (word(getpixel(sprite[i,0]+dx, sprite (i,l ]))=bre_co|)
or (word(getpixel(sprite[it2J+dx, sprite (i,3j))=bre_col) then dx:=0;
if (word(getpixel(sprite[i,0], sprite [i, 1 |+dy)>=brecol)
or (word(getpixel(sprite[i,2], spritefi,3]+dy))==bre_col) then dy:=0
end;
for i:=0 to N-l do
begin
inc(sprite[i,O],dx);
inc(sprite(i,2|,dx);
inc(spritel {i,0],d*);
inc(spritel [i>2},dx);
inc(sprite|i,l],dy);
inc(sprite[i,3|,dy);
inc(spritel [i,l],dy);
inc(spritel [i3],dy)
end;
tip:-not tip; { Смена типа спрайта
get__obj; { Перезапись спрайта в новую позицию
c:=readkey;
end {While}
end; {Подпрограммы}
BEGIN
GraphDriver:eDETECT;
initgraph(GraphDriver,GraphMode,’’); getpalettef palette); color:=1;
fonput; repeat until readkey>#0; brecok^M; { Зарисовка экрана
color:=7; tip:=false;
getobj; { Изображение спрайта
movement; { Движение спрайта
closegraph; END. { Выход из графического режима
}
}
}
195
2 Управление видеосистемой
2.6.6. Контрольные вопросы
1. Какими параметрами характеризуются видеорежимы и каким образом
эти параметры задаются.
2. Что такое полоса пропускания видеомонитора и какие ограничения
она накладывает при программировании видеоадаптеров.
3. По каким выражениям рассчитываются временные характеристики
сигналов управления генерацией изображения.
4. Какие регистры необходимо перепрограммировать при изменении
параметров строчной и кадровой развертки.
5. В каких единицах измеряются параметры строчной и кадровой
развертки.
6. Как использует видеопамять документированный режим 13h и какая
структура видеопамяти в режиме X.
7. Какие возможности предоставляет недокументированный
видеорежим X.
8. Что такое внеэкранная видеопамять и как ее можно использовать.
9. В чем основная идея алгоритма Брезенхейма.
10. Каким образом можно модифицировать алгоритм Брезенхейма для
повышения быстродействия с учетом особенностей организации
видеопамяти.
11. Как использовать структуру видеопамяти при рисовании
горизонтальных линий, прямоугольников и при заливке изображений.
12. По каким выражениям описывается поворот точки с координатами
X, Y вокруг центра Хо, Yo и особенность реализации этих выражений в
экранных координатах.
13. Как выполняется перемещение и вращение плоских фигур
(последовательность действий).
14. Особенности преобразования 3-х мерных координат в экранные
координаты.
15. Представьте выражения, описывающие поворот точки вокруг
заданной оси.
16. Каковы особенности описания 3-х мерных объектов и какова
последовательность действий при повороте этих объектов.
17. Что такое ’’спрайт” и в каких задачах его эффективно применять.
18. Какие возможность "оживления” спрайта.
19. Как запретить спрайту передвигаться в определенных областях
экрана.
196
3.1 Последовательный интерфейс. СОМ-порт
3. Внешние интерфейсы
3.1. Последовательный интерфейс. СОМ-порт
При последовательной связи (Serial Interface и Serial Port) ПК посылает
или принимает байты информации побитно, поэтому для передачи данных в
одну сторону используется одна сигнальная линия. Последовательная
передача данных может осуществляться как в асинхронном, так и в
синхронном режимах.
При асинхронной передаче биты передаются синхронно, а байты
асинхронно (старт - стопная передача). Сигнал на линии может быть
высокого или низкого уровня, что соответствует логическому нулю или
единице, и говорят, что линия отмечена (marking), когда уровень высокий, и
пустая (spacing), когда уровень низкий.
Линия поддерживается в отмеченном состоянии, когда по ней нет
передачи данных. При начале передачи байта данных сигнал падает в О,
отмечая стартовый бит. Затем следуют восемь битов данных (иногда меньше)
в виде набора высоких и низких уровней. Последний бит данных может
сопровождаться битом четности, используемым для обнаружения ошибок, а
затем в последовательность включаются 1 или более стоп-бигов, которым
соответствует высокий уровень. Эти стоп-биты начинают отмеченное
состояние, которое будет сохраняться до тех пор, пока не начнется передача
следующего байта данных; число используемых стоп-битов существенно,
поскольку они устанавливают минимальное время, которое должно пройти
перед следующим стартовым битом. На рис. 3.1 показана эта
последовательность.
Рисунок 3.1 - Структура данных при последовательной
асинхронной передаче
Конечно, передающая и приемная станции должны использовать один и
тот же протокол для этих цепочек битов и они должны работать с одной и
той же скоростью обмена (измеряемой в битах в секунду). Для асинхронного
режима принят ряд стандартных скоростей обмена: 50, 75, ПО, 150, 300, 600,
197
3 Внешние интерфейсы
1200, 2400, 4800, 9600, 19200, 38400, 57600 и 115200 бит/с. Внутренний
генератор синхронизации приемника использует счетчик-делитель опорной
частоты, обнуляемый в момент приема начала старт-бита. Этот счетчик
генерирует внутренние стробы, по которым приемник фиксирует
последующие принимаемые биты. В идеале эти стробы располагаются в
середине битовых интервалов, что обеспечивает возможность приема данных
и при некотором рассогласовании скоростей приемника и передатчика.
Нетрудно заметить, что при передаче 8 бит данных, одного контрольного и
одного стоп-бита предельно допустимое рассогласование скоростей, при
котором данные будут распознаны верно, не может превышать 5%. С учетом
фазовых искажений (затянутых фронтов сигнала) и дискретности работы
внутреннего счетчика синхронизации реально допустимо меньшее
отклонение частот. При обмене могут легко возникать ошибки, поэтому
коммуникационное оборудование предоставляет разнообразную
информацию о статусе как самого порта, так и присоединенного к нему
модема. Задачей модема является преобразование сигнала, генерируемого
портом коммуникации, в акустический сигнал, который может затем быть
передан по телефонному каналу. Большинство модемов предоставляют также
дополнительные коммуникационные возможности, такие как автоматический
вызов и ответ, которые не поддерживаются самим портом коммуникации.
Асинхронный обмен в PC реализуется с помощью COM-порта с
использованием протокола RS-232C.
Синхронный режим передачи предполагает постоянную активность
канала связи. Посылка начинается с синхробайта, за которым вплотную
следует поток информационных бит. Если у передатчика нет данных для
передачи, он заполняет паузу непрерывной посылкой байтов синхронизации.
Очевидно, что при передаче больших массивов данных накладные расходы
на синхронизацию в данном режиме обмена будут ниже, чем в асинхронном.
Однако в синхронном режиме необходима внешняя синхронизация
приемника с передатчиком, поскольку даже малое отклонение частот
приведет к быстро накапливающейся ошибке и искажению принимаемых
данных. Внешняя синхронизация возможна либо с помощью отдельной
линии для передачи сигнала синхронизации, либо с использованием
самосинхронизирующего кодирования данных (например, манчестерский код
или NRZ), при котором на приемной стороне из принятого сигнала могут
быть выделены и импульсы синхронизации. В любом случае синхронный
режим требует либо дорогах линий связи, либо дорогого оборудования (а
может, и того и другого). Для ПК IBM PC существуют специальные платы -
адаптеры SDLC (довольно дорогие), поддерживающие синхронный режим
обмена. Они используются в основном для связи с большими машинами
(mainframes) IBM и в настоящее время мало распространены.
198
3.1 Последовательный интерфейс. СОМ-порт
3.1.1. Программная модель СОМ-порта
Последовательная связь настолько сложна, что были разработаны
специальные микросхемы, выполняющие работу по преобразованию
параллельного кода в последовательный для передачи и обратному
преобразование при приеме данных. Эти же микросхемы формируют и
обрабатывают синхроимпульсы и управляющие сигналы интерфейса
(управление и состояние модема). Такие микросхемы называют
универсальным асинхронным приемником-передатчиком (universal
asynchronous receiver transmitter или UART). IBM PC использует UART
семейства 8250 фирмы Intel (8250/16450/16550A). Это семейство
представляет собой усовершенствования начальной модели, направленные на
повышение быстродействия, снижение потребляемой мощности и загрузки
процессора при интенсивном обмене.
В современных ПК и периферийном оборудовании, при интенсивных
обменах на скоростях 9600 бит/с и выше без потери данных, применяют
UART типа 16550А, которая имеет 16-байтные FIFO-буферы приема и
передачи и возможность использования DMA (указанных возможностей нет
в базовой модели 8250). Совместимость с этой микросхемой обеспечивает
большинство универсальных микросхем контроллеров портов ввода/вывода,
входящих в чипсеты современных системных плат.
В состав IBM PC могут входить до четырех последовательных
интерфейсов, работающих в стандарте RS-232 (отечественный аналог - стык
С2) и именуемых СОМ1 - COM4, (интерфейсы COM3 и COM4
поддерживаются только в моделях PS/2). Им выделены следующие адреса в
области портов ввода-вывода:
COMI: 3F8h-3FFh COM3: 338h-33Fh
COM2: 2F8h-2FFh COM4: 238h-23Fh
Операционная система поддерживает 2 порта коммуникации, поэтому в
ПК имеются 2 микросхемы. Их базовые адреса хранятся в ячейке 0040:0000
для СОМ1 и 0040:0002 для COM2 (2-х байтовый адрес порта, который
является младшим из группы адресов портов, дающих доступ к UART).
Каждый интерфейс связан с определенным уровнем контроллера
прерываний:
СОМ1 вызывает прерывание IRQ4 (Int OCh);
COM2 вызывает прерывание IRQ3 (Int OBh);
COM3 и COM4 не имеют стандартных векторов прерываний.
Каждое из устройств СОМ-порта представляет собой контроллер,
оснащенный 25- или 9- штырьковым разъемом на задней стенке корпуса ПК.
Этот разъем может использоваться для подключения периферийных
устройств (мыши, графопостроителя и др.) или организации связи между ПК.
Контакты стыка RS-232 имеют следующие наименования (см. табл. 3.1).
199
3 Внешние интерфейсы
Таблица 3.1 Назначение сигналов и контакты разъемов RS-232
Название сигнала Имя цепи Номер контакта Назначение Направ- ление
ELA ССГГТ 9 шт. 25 шт.
DCD CF 109 1 8 Связь модемов установлена в ПК
RD BB 104 2 3 Принимаемые данные вПК
TD BA 103 3 2 Передаваемые данные из ПК
DTR CD 108/2 4 20 Готовность ПК к работе из ПК
SG AB 102 5 7 Сигнальная земля -
DSR CC 107 6 6 Готовность модема к работе в ПК
RTS CA 105 7 4 Запрос на передачу из ПК
CTS CB 106 8 5 Готовность модема к передаче в ПК
RI CE 125 9 22 Индикатор вызова в ПК
PG AA 101 — 1 Защитная земля -
Контроллер COM-порта является полностью программируемым
устройством. Можно программно задать следующие параметры обмена:
количество битов данных и стоп-битов, вид четности и скорость обмена.
Микросхема UART 16550А имеет 12 программируемых однобайтных
регистров, с помощью которых управляется и контролируется порт
коммуникации. Большинство из них занимаются инициализацией порта.
Доступ к этим 12 регистрам осуществляется через восемь адресов портов с
номерами 3F8h - 3FFh (или 2F8h - 2FFh).
В пяти случаях регистр, к которому организуется доступ через данный
порт, зависит от того, как установлен бит 7 в регистре управления линии
(т. н. бит DLAB), который является единственным регистром с адресом порта
3FBh. Назначение регистров 16550А и их отображение на адресное
пространство портов (смещение относительно базового адреса) представлено
в табл. 3.2.
Таблица 3.2 - Регистры UART 16550А
Доступ Регистр RAV
Смещ. DLAB Имя Название
Oh 0 THR Регистр хранения нередатчнка - Transmit Holding Register W
0b 0 RBR Регистр данных нрнемннка - Receiver Buffer Register R
Oh 1 DLL Делитель скорости обмена (младший) - Divisor Latch LSB R/W
№ 1 DLM Делитель скорости обмена (старший) - Divisor Latch MSB R/W
Ih 0 IER Регистр разрешения прерыв. - Interrupt Enable Register R/W
2h X HR Регистр идентификации прерывания - Interrupt Identification Register R
2b X FCR Регистр управления FIFO (FIFO Control Register) W
3h X LCR Регистр управления лпинн - Line Control Register RAV
4h X MCR Регистр управления модемом - Modem Control Register RAV
5h X LSR Регистр статуса линии - Line Status Register RAV
6h X MSR Регистр статуса модема - Modem Status Register RAV
7h X SCR Рабочий регистр - Scratch Pad Register RAV
200
3.1 Последовательный интерфейс. СОМ-порт
Ниже описано назначение регистров.
THR (регистр передатчика) - сюда засылается байт для передачи.
Данные, записанные в этот регистр, будут пересланы в выходной
сдвигающий регистр (когда он будет свободен), из которого поступят на
выход при наличии разрешающего сигнала CTS. Бит 0 передается (и
принимается) первым. При длине посылки менее 8 бит старшие биты
игнорируются.
RBR (регистр приемника) - отсюда считывается принятый байт. Данные,
принятые входным сдвигающим регистром, помещаются в регистр RBR.
Если к моменту окончания приема очередного символа предыдущий не был
считан из регистра RBR, фиксируется ошибка переполнения. При длине
посылки менее 8 бит старшие (лишние) биты в регистре имеют нулевое
значение.
DLL (регистр младшего байта делителя частоты). Сюда засылается
младший байт делителя (см. DLM).
DLM (регистр старшего байта делителя частоты). Делитель
определяется по формуле D= 115200/V, где V - скорость передачи. Входная
частота синхронизации 1,8432 МГц делится на заданный коэффициент, после
чего получается 16-кратная частота передачи данных. Например, для
скорости 9600 бод делитель равен 115200/9600=12=0Ch, поэтому нужно
вывести ОСЬ в порт 3F8h и 0 в порт 3F9h.
IER (регистр управления прерываниями). Единичное значение бита
разрешает прерывание. Назначение бит:
0: прерывание по приему символа (в режиме FIFO - прерывание по
тайм-ауту);
1: прерывание по завершению передачи символа;
2: прерывание по обрыву линии или ошибке в линии;
3: прерывание по изменению состояния модема (любой из линий CTS,
DSR, RI и DCD);
4-7:должны быть 0.
IIR (регистр идентификации прерываний и признака режима FIFO).
Когда происходит прерывание, здесь содержится причина, вызвавшая его.
Для упрощения программного анализа UART выстраивает внутренние
запросы прерывания по 4-уровневой приоритетной системе. Порядок
приоритетов (по убыванию) следующий: состояние линии, прием символа,
освобождение регистра передатчика и состояние модема. При возникновении
условии прерывания UART указывает па источник с высшим приоритетом до
тех пор, пока он не будет сброшен соответствующей операцией. Только
после этого будет выставлен запрос с указанием следующего источника.
Назначение бит:
0:1- есть не обслуженные прерывания, 0 - нет;
1-2: причина прерывания:
201
3 Внешние интерфейсы
00 - изменение состояния модема (линий CTS, DSR, RI или DCD);
сбрасывается чтением регистра состояния модема;
01 - передан символ; сбрасывается записью символа в регистр
передатчика;
10 - принят символ; сбрасывается чтением приемника;
11 - ошибка или обрыв линии; сбрасывается чтением регистра
состояния линии;
3: прерывание по тайм-ауту (не в режиме FIFO);
4-5: не используются (должны быть 0);
6-7: признак режима FIFO (11 - режим FIFO 16550А, 10 - режим FIFO
16550,00 - обычный).
FCR (региструправления FIFO). Назначение бит:
0: разрешение (единицей) режима FIFO для передатчика и приемника;
1: сброс счетчика FIFO-приемника (запись единицы);
2: сброс счетчика FIFO-передатчика (запись единицы);
3: разрешение операций DMA (1- разрешить);
4-5: зарезервированы;
6-7: уровень заполнения FIFO-буфера, при котором вырабатывается
прерывание (00 -1 байт, 01-4 байта, 10-8 байт, 11-14 байт).
LCR (регистр управления линией). Назначение бит:
0-1: число битов данных (00 - 5, 01 - 6, 10 - 6,11 - 8);
2: число стоп-битов (0 - 1, 1 - 1,5 при 5 битах данных и 2 в противном
случае);
3-4: тип четности: Х0 - нет, 01 - нечетная, 11 - четная;
5: постоянная четность 0 - отмена постоянной четности, 1 - постоянный
бит четности, зависит от битов 3-4: биты 3-4 - 01 - бит четности всегда 1;
биты 3-4 - 11 - бит четности всегда 0; биты 3-4 - Х0 - без бита четности;
6: 1 - имитировать обрыв линии (посылка нулей);
7: бит DLAB управление доступом к делителю частоты (см. табл. 3.2).
MCR (Регистр управления модемом). Назначение бит:
0: 1 - установить выход DTR;
1:1- установить выход RTS;
2: 1 - установить OUT1 (не используется);
3:1- установить OUT2 (разрешить прерывания от RS-232);
4: 1 - диагностический режим, в котором внутри UART организуется
внутренняя ’’заглушка". Выход передатчика переводится в состояние лог. 1,
вход приемника отключается, выход сдвигающего регистра передатчика
логически соединяется со входом приемника, входы DSR, CTS, RI и DCD
отключаются от входных линий, на них внутренне подаются сигналы DTRC,
RTSC, OUT1C, IE, выходы управления модемом переводятся в пассивное
состояние (лог. 0). При этом переданные данные в последовательном виде
немедленно принимаются, что позволяет проверять внутренний канал
202
3.1 Последовательный интерфейс. СОМ-порт
данных порта (включая сдвигающие регистры) и отработку прерываний, а
также определить скорость работы UART;
5-7: должны быть 0.
LSR Регистр состояния линии. Биты 1-4 вызывают прерывания по
ошибке, если оно разрешено.
Назначение бит:
0: 1 - байт данных получен;
1: 1 - полученные данные были перезаписаны (предыдущий символ не
был вовремя считан);
2:1 - ошибка четности (вероятно, из-за шума в линии);
3:1- неверный стоп-бит (передача не синхронизована);
4: 1 - обнаружен обрыв линии (вход приемника находится в состоянии
лог. 0 не менее, чем время посылки символа.);
5: 1 - регистр хранения передатчика пуст (в режиме. FIFO указывает на
отсутствие символов в FIFO-буфере);
6: 1 - регистр передатчика пуст (нет данных для передачи ни в
сдвиговом регистре, ни в буферных, THR или FIFO);
7: 1 - ошибка принятых данных в режиме FIFO (буфер содержит хоть
один символ, принятый с ошибкой формата, паритета или обрывом). В не-
FIFO режиме всегда 0.
В режиме FIFO признаки ошибок хранятся в FIFO-буфере вместе с
каждым символом. В регистре, они устанавливаются (и вызывают
прерывание) в тот момент, когда символ, принятый с ошибкой, находится на
вершине FIFO (первый в очереди на считывание). В случае обрыва линии в
FIFO заносится только один ’’обрывной” символ, и UART ждет
восстановления и последующего старт-бита.
Обычно регистр постоянно просматривается в процессе
коммуникационного обмена. При передаче данных регистр сообщает, что
предыдущий символ уже послан, позволяя программе записать новый символ
поверх его. При приеме данных регистр информирует программу о
поступлении следующего символа с тем, чтобы программа могла прочитать
его прежде чем он будет уничтожен следующим прибывшим.
MSR (регистр состояния модема). Биты 0-3 вызывают прерывание по
изменению состояния модема, если оно разрешено. Назначение бит:
0:1- изменилось состояние линии CTS;
1:1- изменилось состояние линии DSR;
2: 1 - изменилось состояние линии RI;
3: 1- изменилось состояние линии DCD;
4: - текущее состояние линии CTS;
5: - текущее состояние линии DSR;
6: - текущее состояние линии RI;
7: - текущее состояние линии DCD.
203
3 Внешние интерфейсы
Примечание: ’’Изменилось состояние линии...” означает, что данная
линия RS-232 изменила свое состояние по сравнению с последним чтением
этого регистра.
SCR (рабочий регистр), на работу UART не влияет, предназначен для
временного хранения данных (в 8250 отсутствует).
3.1.2. Программирование последовательной связи
Из двенадцати регистров только шесть необходимы для простой
последовательной связи. Регистр хранения передатчика содержит байт
данных, которые будут посланы, а регистр данных приемника - последний
полученный байт данных. Регистры управления и статуса линии
инициализируют и управляют линией связи, используя скорость обмена,
содержащуюся в двух регистрах делителя скорости обмена. Из оставшихся
регистров регистры управления и статуса модема используются только для
связи через модем, регистр управления FIFO-буфером при его
использовании, а два регистра, связанных с прерываниями используются
только в процедурах, управляемых прерываниями .
Прерывания используются при связи в целях эффективности. Обычная
коммуникационная процедура непрерывно проверяет регистр статуса линии,
ожидая вводимого символа или указания, что все готово для передачи
следующего байта данных. Поскольку процессор работает намного быстрее,
чем обычные скорости с которыми передаются последовательные данные, то
этот метод напрасно расходует процессорное время, которое может
использоваться для обработки поступающих или передаваемых данных. По
этой причине микросхема UART может быть установлена в режим,
вызывающий прерывание при появлении символа, возникновении ошибки и
т.п. Это прерывание моментально вызовет процедуру Вашей программы,
которая, скажем, будет передавать следующий символ из
коммуникационного буфера.
При программировании последовательной связи необходимо выполнить
следующие этапы:
- инициализация последовательного порта;
- передача данных по линии с использованием модема или без модема
согласно принятому протоколу передачи.
- разъединение линии.
Ключевым моментом программирования является выбор протокола
связи (набора правил о формате данных и организации обмена). При
удаленной связи с использованием модемов, с целью открытости
проектируемой системы и возможности ее расширения, необходимо
придерживаться одного из стандартных протоколов связи. В простой
последовательной связи можно использовать собственные протоколы,
204
3.1 Последовательный интерфейс. СОМ-порт
которые как правило более простые и требуют меньшие затраты на
разработку и обеспечивают большее быстродействие для конкретной задачи.
Так как связь выполняется как минимум между двумя точками (компьютер -
компьютер или компьютер - устройство), то выбранный протокол должен
обеспечиваться на обеих сторонах линии.
Для управления потоком данных могут использоваться два варианта
протокола - аппаратный и программный. Существует тонкое различие между
управлением потоком и квитированием. Квитирование подразумевает
посылку уведомления о получении (квитанции) элемента, в то время как
управление потоком предполагает посылку уведомления о невозможности
последующего приема данных.
Аппаратный протокол управления потоком RTS/CTS использует сигнал
CTS, который позволяет остановить передачу данных, если приемник не
готов к их приему. Передатчик передает очередной байт только при
включенном состоянии линии CTS. Байт, который уже начал передаваться,
задержать сигналом CTS невозможно (это гарантирует целостность
посылки). Аппаратный протокол обеспечивает самую быструю реакцию
передатчика на состояние приемника. Обычно микросхемы асинхронных
приемопередатчиков имеют не менее двух регистров в приемной части -
сдвигающий для приема очередной посылки и хранящий, из которого
принятый байт считывается. Это позволяет реализовать обмен с аппаратным
протоколом без потери данных, не прибегая к программной буферизации.
Аппаратный протокол удобно использовать при подключении
принтеров и плоттеров, если они поддерживают этот режим. При
непосредственном (без модемов) соединении двух компьютеров аппаратный
протокол требует перекрестного соединения линий RTS - CTS.
Программный протокол управления потоком XON/XOFF предполагает
наличие двунаправленного канала передачи данных. Работает он следующим
образом: если устройство, принимающее данные, обнаруживает причины, по
которым оно не может их дальше принимать, оно по обратному
последовательному каналу посылает байт-символ XOFF (13h).
Противоположное устройство, приняв этот символ, приостанавливает
передачу. Далее, когда принимающее устройство снова становится готовым к
приему данных, оно посылает символ XON (llh), приняв который
противоположное устройство возобновляет передачу. Время реакции
передатчика на изменение состояния приемника по сравнению с аппаратным
протоколом увеличивается по крайней мере на время передачи символа
(XON или XOFF) плюс время реакции программы передатчика на прием
символа. Из этого следует, что данные без потерь могут приниматься только
приемником, имеющим дополнительный буфер принимаемых данных и
сигнализирующим о неготовности заблаговременно (имея в буфере
свободное место).
205
3 Внешние интерфейсы
Преимущество программного протокола при непосредственном
соединении устройств заключается в отсутствии необходимости передачи
управляющих сигналов интерфейса - минимальный кабель для
двустороннего обмена может иметь только 3 провода Недостатком, кроме
требования наличия буфера и большего времени реакции, является
сложность реализации полнодуплексного режима обмена. В этом случае из
потока принимаемых данных должны выделяться (и обрабатываться)
символы управления потоком, что ограничивает набор передаваемых
символов.
Кроме этих двух распространенных стандартных протоколов,
поддерживаемых и устройствами, и операционными системами, существуют
и некоторые другие. Например, некоторые плоттеры с последовательным
интерфейсом используют программное управление, но посылают не
стандартные символы XON/XOFF, а слова (ASCII-строки). Такой обмен на
уровне системной поддержки протокола практически не поддерживается (эти
плоттеры рассчитаны на прямой диалог с прикладной программой).
В приведенном в конце главы примере описана связь между двумя
компьютерами. Связь является двусторонней и программное обеспечение
устанавливается на обеих компьютерах. В этом случае этап инициализации
выполняется на обеих компьютерах, после чего один из компьютеров
переводится в режим передатчика, а другой - в режим приемника. После чего
выполняется этап передачи данных. Этап разъединения линии - просто выход
из программы на обеих компьютерах.
ЗЛ.2'1. Инициализация последовательного порта
При инициализации порта коммуникации (’’открытии”) устанавливаются
все его параметры. Это параметры длины слова, числа стоп-битов, установки
четности и скорости обмена. Длина слова это число битов, которое образует
основную единицу данных. Если мы работаем с привычными порциями по 8
битов, то 7 битов достаточны для стандартных файлов ASCII (в которых все
символы латинского алфавита имеют коды, не превышающие ASCII 128), в
то время как для передачи численных данных достаточно порций по 4 бита.
Независимо от того, занимаемся ли мы вводом или выводом, как
минимум 4 регистра должны быть инициализированы для операций обмена.
Это регистры делителя скорости обмена, регистр контроля линии и регистр
разрешения прерывания.
Инициализация скорости обмена. Делитель скорости обмена это число,
на которое надо разделить число115200, чтобы получить желаемую скорость
обмена. Чем больше делитель, тем меньше скорость обмена. Скорости
обмена 300 и меньше требуют двухбайтного числа для делителя. Старший
байт посылается в 3F9h (или 2F9h), а младший в 3F8h (2F8h). В обоих
206
3 Л Последовательный интерфейс. СОМ-порт
случаях бит 7 регистра управления линии должен быть установлен в 1 перед
засылкой значений; в противном случае по этим двум адресам значения
будут адресованы в другие регистры.
Регистры скорости обмена следует устанавливать первыми, так как они
единственные, которые требуют, чтобы был установлен бит 7 в регистре
контроля линии. После этого надо изменить содержимое регистра контроля
линии, сбрасывая 7-й бит, чтобы все остальные доступы к регистрам были
правильными. Поскольку регистр контроля линии является регистром только
для записи, то нет способа вернуть бит 7 обратно в 1 без одновременной
установки всех остальных битов этого регистра.
Инициализация регистра контроля линии. Значение битов регистра
контроля линии, адрес порта которого равен 3FBh (или 2FBh ) приведено
ранее в п. 3.1.1. При инициализации регистра контроля линии биты 5-7
обычно устанавливаются в 0. Остальные описывают значения, определяемые
протоколом обмена.
Инициализация регистра разрешения прерывания. Даже если Вы не
используете прерывания, все равно необходимо произвести запись в регистр
разрешения прерывания, чтобы быть уверенным, что прерывания запрещены.
Просто поместите в этот регистр 0. Регистр идентификации прерывания в
этом случае можно игнорировать.
Инициализация регистров управления модемом. Инициализация
остальных регистров связана с модемами. Ясно, что модемы нужны только
для связи с удаленными устройствами, а не для управления близлежащими
устройствами, например, такими как последовательный принтер. В п.3.1.1
рассмотрено назначение битов регистра управления модема.
3.1. 2.2. Передача и прием данных
Передача данных проще чем прием, поскольку программа имеет полный
контроль над составом данных и скоростью, с которой они должны
посылаться. Тем не менее процедуры передачи могут быть достаточно
сложными, если они обрабатывают данные по мере того, как они
посылаются. Могут быть также проблемы с синхронизацией при
использовании протокола XON/XOFF. Чтобы принять эти сигналы,
программа должна непрерывно анализировать принимаемые символы при
передаче (в дуплексном режиме, в котором обычно работают модемы,
сигналы одновременно идут в обе стороны по телефонному каналу).
Чтобы обнаружить, что удаленная станция посылает строку нулей в
качестве сигнала перерыва, необходимо непрерывно анализировать статус
бита перерыва (номер 4) регистра статуса линии.
Поэтому независимые процедуры передачи данных в какой-то мере
являются искусственными. Но их обычно разрабатывают совместно с
207
3 Внешние интерфейсы
процедурами приема данных для создания общего обмена данными. Ясно,
что для создания работоспособной процедуры необходимо затратить
большие усилия, особенно в части обнаружения и исправления ошибок при
передаче данных.
Когда байт данных помещается в регистр хранения передатчика, он
автоматически выводится в последовательный канал через регистр сдвига
передатчика. Нет необходимости в импульсе бита строба, как это делается в
случае параллельного адаптера. Бит 5 регистра статуса линии показывает
свободен ли регистр хранения передатчика для приема данных. Регистр
постоянно проверяется до тех пор, пока бит 5 не станет равным 1. После
этого в регистр хранения передатчика посылается очередной байт. В
процессе передачи бит 5 равен 0 и только когда он опять станет равным 1, то
в регистр хранения передатчика может быть послан следующий символ. Этот
процесс повторяется до тех пор, пока выполняется передача данных.
Прием данных. Коммуникационная программа готова принимать данные
как только инициализирован коммуникационный порт и установлена связь с
удаленной станцией. Прием данных никогда полностью не отделен от
передачи данных, поскольку программе может потребоваться послать сигнал
XOFF (ASCII 19), чтобы остановить поток данных, если они поступают
слишком быстро и она не успевает их обрабатывать. Код XON (ASCII 17)
сообщает удаленной станции, что можно продолжить передачу.
В зависимости от сложности используемого протокола обмена
принимаемые данные могут требовать простой или сложной обработки.
Может быть получен один из набора управляющих кодов. Те из них, которые
являются ограничителями данных чаще обнаруживаются при синхронном
обмене. При выводе получаемых символов на экран следует учитывать
влияние символов перевода строки (ASCII 10), поскольку некоторые языки
автоматически вставляют перевод строки после возврата каретки, в этом
случае необходимо исключить символы перевода строки из принимаемых
данных, чтобы избежать пустых строк при выводе.
3.13. СОМ-порт и РпР
Современные периферийные устройства, подключаемые к СОМ-порту -
мышь, модемы и другие, - могут поддерживать спецификацию РпР.
Основная задача операционной системы РпР заключается в идентификации
подключенного устройства, для чего разработан несложный протокол,
реализуемый на любых COM-портах чисто программным способом. Он
состоит из следующей последовательности шагов, показанных на рис. 3.2.
1. Порт инициализируется с состоянием линий DTR=ON, RTS=OFF,
TXD=Mark - состояние покоя (Idle).
208
3.1 Последовательный интерфейс. СОМ-порт
2. Некоторое время (0,2 с) ожидается появление сигнала DSR, которое
указало бы на наличие устройства, подключенного к порту. В простейшем
случае устройство имеет на своем разъеме перемычку DTR-DSR, которая и
обеспечивает указанный ответ. Если устройство обнаружено, выполняются
манипуляции управляющими сигналами DTR и RTS с целью получения
информации от устройства. Если ответ от устройства не получен,
операционная система, поддерживающая динамическое реконфигурирование,
должна периодически опрашивать состояние порта для обнаружения новых
устройств.
12 3 4 5 6 7
Рисунок 3.2 - Запрос идентификатора устройства РпР
3. Порт программируется на режим 1200 бит/с, 7 бит данных, без
паритета, 1 стоп-бит, и на 0,2 с снимается сигнал DTR. После этого
устанавливается DTR=1, а еще через 0,2 с устанавливается и RTS-1.
4. В течение 0,2 с ожидается приход первого символа от устройства. По
приходу этого символа начинается прием идентификатора (см. ниже). Если за
это время символ не пришел (этот случай и показан на рис. 3.2), выполняется
вторая попытка опроса (см. шаг 5), несколько отличающаяся от первой.
5. На 0,2 с снимаются оба сигнала (DTR=0 и RTS=0), после чего они оба
устанавливаются (DTR=1 и RTS=1).
6. В течение 0,2 с ожидается приход первого символа от устройства, по
приходу этого символа начинается прием идентификатора (см. ниже). Если за
это время символ не пришел, то в зависимости от состояния сигнала DSR
переходят к проверке отключения Verify Disconnect (при DSR=0) или в
дежурное состояние Connect Idle (при DSR=1), как показано на рис. 3.2.
7. В дежурном состоянии Connect Idle устанавливается DTR=4, RTS=0,
порт программируется на режим 300 бит/с, 7 бит данных, без паритета, 1
стоп-бит. Если в этом состоянии обнаружится DSR-0, операционную
систему следует уведомить об отключении устройства.
Посимвольный прием идентификатора устройства имеет ограничения по
тайм-ауту в 0,2 с на прием каждого символа, а также общее ограничение в
2,2 с, позволяющее принять строку длиной до 256 символов. Строка
идентификатора РпР должна иметь маркеры начала (28h или 08h) и конца
(29h или 09h), между которыми располагается тело идентификатора в
209
3 Внешние интерфейсы
стандартизованном формате. Перед маркером начала может находиться до 16
символов, не относящихся к идентификатору РпР. Если за первые 0,2 с
ожидания символа (на шаге 4 или 6) маркер начала не пришел, или же
сработал тайм-аут, а маркер конца не получен, или же какой-либо символ
принят с ошибкой, то происходит переход в состояние Connect Idle. Если
получена корректная строка идентификатора, то она передается
операционной системе для анализа и предпринятая дальнейших действий по
программе РпР.
Для проверки отключения (Verify Disconnect) устанавливается DTR-1,
RTS=0 и через 5 с проверяется состояние сигнала DSR. При DSR-1
происходит переход в состояние Connect Idle (см. шаг 7), при DSR==0
происходит переход в состояние Disconnect Idle, в котором система может
периодически опрашивать сигнал DSR для обнаружения подключения
устройства.
3. 1.4, Пример программирования последовательного порта (связь
двух ПК через RS-232)
Program ComConnection;
Uses Crt, Dos;
{ Массив скоростей передачи }
Const
ArrV : array [1..9] of WORD «* ($0417, $0180, $00C0, $0060, $0040,
$0030, $0020, $001B, S000C);
{ Шаблон для шестнадцатиричного числа }
Type
HexSize = array[1..4] of CHAR;
Описание переменных
RecCnt INTEGER; { Счетчик принятых символов
WorkMode INTEGER; { Рабочий режим
QuitCond INTEGER; { Условие выхода из программы
Word Leng th, StopBits INTEGER; { Длина слова н кол-во стон-бнтов
Parity, SendVel INTEGER { Контроль и скорость передачи
VelBodes LONGINT; { Скорость в бодах
LCR, Comint BYTE; { Рег-р упр-ния линией н прерыв.
nCom INTEGER; { Номер СОМ-порта
SegAddr, OfsAddr INTEGER; { Сегмент н смещение адреса порта
pb, i, 1 WORD; { Значение базового порта и индексы
LineErr, SendByte BYTE; {С ост. линии н передаваемый байт
regs REGISTERS; {Запись, описывающая регистры
RecArray array[1..1024] of BYTE; { Данные (нрнем)
SendFile, RecFile file of BYTE; {Файлы (прнем/передача)
SendName, RecName string[25J; { Имена файлов (прнем/перед.)
CurrCom HexSize; { Текущий порт
OldlntOC POINTER; { Старый обработчик
{ Преобразование десятичного числа в шестнадцатиричный вид }
210
3.1 Последовательный интерфейс. СОМ-порт
Procedure Dec2Hex( х : INTEGER; Var CurrCom : HexSize );
Const
HexDig : array[0..15] of CHAR = ’0123456789ABCDEF';
Var
i,j : INTEGER;
Begin
For i := 4 DownTo 1 Do
begin
j := x MOD 16;
CurrComfi] := HexDig [fl;
x:=xSHR4;
end;
End;
{ Разрешить прерывание от СОМ-порта j
Procedure EnableComlnt;
Begin
Comint := Port[$21]; { Разрешить прерывание от RS-232 }
Port($21] := Comint AND $EF;
LCR := Port[pb+4j; { Разрешить прерывание по приему }
Port[pb+4] := LCR OR $08;
Portlpb+lJ :=$01;
End;
{ Вывод содержимого регистра статуса линии j
Procedure OutComError;
Begin
Щ LineErr AND $02) о 0 Then
WriteLn( ’Line error : потеря предыдущего символа');
H( LineErr AND $04) о 0 Then
WriteLn( 'Line error: ошибка четности’ );
Щ LineErr AND $08 ) о 0 Then
WriteLn( 'Line error: неверный стоп-бит' );
1Ц LineErr AND $10 ) о 0 Then
WriteLn( 'Line error: обрыв линии');
If( LineErr AND $20 )o 0 Then
WriteLn( 'Line error: регистр приемника пуст' );
End;
{ Установка адреса и номера СОМ-порта }
Procedure SetComAddress;
Begin
¥Угйе(ЛС'Введнте адрес $0040 $0000 для СОМ1');
Write( 'или $0002 для COM2 * );
ReadLn( SegAddr, OfsAddr);
pb := MemW[ SegAddr:OfsAddr); {базовый адрес порта }
Dec2Hex( pb, CurrCom); {Преобразовать в 16-ричный вид }
WriteLn( 'Адрес текущего СОМ-порта ', CurrCom);
Case pb Of { Установка номера СОМ-порта по базовому адресу }
$3F8 : nCom :=0;
S2F8 :nCom:=l;
Else
begin
WriteLn(’OmB6Ka в номере СОМ-порта');
211
3 Внешние интерфейсы
Exit
end;
end;
End;
{ Установка скорости в бодах
Procedure SetVelBode;
Begin
LCR := Port[pb+3]; { Прочитать регистр управления линией
Port(pb+3] :s LCR OR $80; Установка 7-го бита в 1
WriteLn( ’Введите номер режима скорости');
WriteLn('l - НО ');
WriteLn(’2 -300 ');
WriteLn(’3 - 600 ');
WriteLnf '4 -1200*);
WriteLn( '5 - 1800 ');
WriteLn( '6 - 2400 *);
WriteLn('7 -3600');
WriteLn('8 -4800*);
WriteLn( *9 -9600');
Write Ln( '10 - переменная ');
Repeat
ReadLn( SendVel);
Until SendVel in |L.10);
{ Если режим в диапазоне 1..9, то выбрать значения делителей из массива,
{ иначе ввести скорость передачи с клавиатуры
Case SendVel Of
U9 : PortWfpb] := ArrV] SendVel J;
10 : begin
WriteLn( 'Введите скорость в бодах 2..114400' );
ReadLn( VelBodes );
PortWfpb] :=* 115200 DIV VelBodes;
Delay( 1000)
end;
end;
Port[pb+3] := LCR AND $7F; { Сброс 7-го бита в 0
End;
{ Установка контроля по четности
Procedure SetParity;
Begin
WriteLn( ЛС Введите значение контроля ');
WriteLn(' 1 - нет ' );
WriteLn(' 2 - четность ’ );
WriteLn( * 3 - нечетность * );
LCR := Portfpb+3];
Repeat
}
}
ReadLn( Parity ); Until Parity in [1..3]; Case Parity Of { Установка режима контроля
1 : Port(pb+3] LCR AND SE7;
2 : Port(pb+3] := LCR OR $18;
3 : Portfpb+3] := (LCR AND $E7 ) OR $08;
212
3.1 Последовательный интерфейс. СОМ-порт
end;
End;
{ Установка количества стоп-бнтов }
Procedure SetStopBits;
Begin
WriteLn( AG’ Введите количество стоп-битов: 1 или 2 ’);
LCR:=Port|pb+31;
Repeat
ReadLn( StopBits );
Until StopBits in (1..2];
Case StopBits Of { Установка количества стоп-битов }
1: Port{pb+3] ;= LCR AND $FB;
2 : Port[pb+3] := LCR OR $04;
end;
End;
{ Установка длины слова : $-6-7-8 бит }
Procedure SetWordLength;
Begin
WriteLn( AG’ Введите длину слова : 5,6,7 или 8 ’);
LCR :=Port|pb+3J;
Repeat
ReadLn( Word Length);
Until WordLength in [S..8];
Case WordLength Of { Установка длины слова }
5 : Port[pb+3J := LCR AND SFC;
6 : Portfpb+3| ( LCR AND $FD ) OR $01;
7 : Port[pb+3J := (I CR AND $FE) OR $02;
8 : Portfpb+3] := LCR OR $03;
end;
End;
{ Обработчик прерывания INT OCh - только ПРИЕМ }
Procedure NewIntOC; Interrupt;
Begin
RecCnt := RecCnt +1; { Увеличение счетчика принятых байт }
RecArrayf RecCnt ] :=Port|pb]; { Чтение байта в массив }
Port[$20] := $20; { Команда завершения прерывания }
End;
{ Передача массива }
Procedure Send;
Begin
{ Пока не достигнут конец передаваемого файла }
While Not EOF( SendFile) Do
begin
Read( SendFile, SendByte); { Читать байт нз файла }
{ Передать его используя прерывание 14h, подфункция 1 }
regs.AH := 1;
regs. AL := SendByte;
regs.DX := nCom;
Intr( $14, regs);
If( regsAH AND $80 ) о 0 Then { Проверка передачи байта }
begin
213
3 Внешние интерфейсы
WriteLn( 'Ошибка передачи’ );
OutComError;
Exit
end;
end;
WriteLn( лСВывод окончен’)
End;
{ Основная программа }
BEGIN
ClrScr;
GetIntVec( SOC, OldlntOC ); Сохранение вектора прерывания
WriteLn( 'Введите имя передаваемого файла >');
ReadLn( SendName);
WriteLn( 'Введите имя принимаемого файла >’ );
ReadLn( RecName);
Assign( SendFile, SendName);
Reset( SendFile);
Assign( RecFile, RecName);
ReWrite( RecFile );
QuitCond := 1;
RecCnt := 0; 10; { обнуление счетчиков }
While QuitCond о 777 Do
begin
Repeat
WriteLn( ЛСВведите режим );
WriteLn( * 1 - установка номера СОМ-иорта ');
WriteLn(' 2 - установка скорости передачи ' );
WriteLn(' 3 - установка контроля ’ );
WriteLn( ’ 4 - установка количества стоп-битов ' );
WriteLn( * 5 - установка длины слова ’ );
WriteLn(' 6 - разрешение нрерываиия ');
WriteLn(' 7 - запуск подпрограммы приема ');
WriteLn( ’ 8 - завись массива в файл ');
WriteLn(' 9 - восстановление после нриема ');
WriteLn( '10 - заиуск подпрограммы передачи ’ );
WriteLn( *11- определение статуса линии ');
WriteLn( '12 - выход ');
ReadLn( WorkMode );
Until WorkMode in [1..12J;
Case WorkMode Of { Работа по введенному режиму }
1 : SetComAddress;
2 : SetVelBode;
3 : SetParity;
4 : SetStopBits;
5 : SetWordLength;
6 : EnableComlHt;
7 : SetIntVec( $0C, @NewIntOC );
8 : For 1 := 0 To RecCnt Do
Write( RecFile, RecArrayfl]);
9 : begin
Port[pb+4J := $00;
214
3.1 Последовательный интерфейс. СОМ-порт
Port($211 := Port[$21] OR $10;
SetIntVec( $0C, OldlntOC);
end;
10 : Send;
11 : OutComError;
12 : QuitCond .= 777;
end;
end;
Close( SendFile );
Closef RecFile );
SetIntVec( SOC, OldlntOC ); { Восстановление вектора OCh }
END.
3.1.5. Контрольные вопросы
1. Организация последовательной связи. Режимы.
2. Что такое асинхронная связь и какая структура передаваемой
последовательности.
3. Организация синхронной связи.
4. Назначение и типы микросхем UART.
5. Приведите перечень сигналов разъемов RS-232 и их назначение.
6. Назначение регистров СОМ-порта и их отображение на адресное
пространство ввода/вывода.
7. Как задается скорость обмена при программировании СОМ-порта.
8. Как выполняется управление прерываниями.
9. Назначение буфера FIFO и возможности программирования.
10. Как задать параметры передаваемого кадра (число бит данных, число
стоп-бит, тип четности).
11. Как выполняется управление модемом.
12. Какие этапы программирования последовательной связи и их
характеристики.
13. Как реализуется аппаратный протокол управления потоком
RTS/CTS.
14. Организация программного протокола управления потоком
XON/XOFF.
15. Какие характеристики последовательностей связи можно
запрограммировать при ее инициализации и как.
16. Как при последовательной связи используется регистр статуса
линии.
17. Какие действия выполняет контроллер СОМ - порта при
передаче/приеме байта данных.
18. Идентификация подключенных к СОМ - порту устройств.
215
3 Внешние интерфейсы
3.2. Параллельный интерфейс. LPT - порт
ПК может работать с тремя параллельными портами (LPT1 - LPT3), к
которым подключаются принтеры, плоттеры, сканеры и т.д. Для
подключения используется стандартный разъем Centronix, имеющий 36
контактных выходов (отечественный аналог ИРПР-М).
Каждый параллельный порт имеет свой адаптер. Адаптер управляется
регистрами ввода/вывода которые отображаются на различные области
пространства ввода/вывода каждого адаптера. Область данных BIOS
содержит базовые адреса для каждого адаптера. Базовый адрес соответствует
младшему адресу группы регистров. Базовый адрес для LPT1 хранится в
двухбайтной переменной по адресу 0040:0008h (378h) для LPT2 - по адресу
0040:000Ah (278h), для LPT3 - по адресу 0040:00001 (стандартом не
определен и практически не используется).
Для LPT1 используется сигнал прерывания IRQ7 (вектор прерывания
OFh), для LPT2 - IRQ5 (вектор ODh).
Первоначально LPT-порт разрабатывался для параллельных матричных
принтеров (других принтеров еще не было), работающих в основном в
текстовом режиме под управлением MS-DOS. Это обусловило его
однонаправленный режим работы и специфику управляющих сигналов.
Сейчас этот режим носит название стандартного режима или SPP (Serial
Parallel Port) и поддерживается всеми адаптерами. В дальнейшем были
разработаны усовершенствованные протоколы обмена и соответствующие им
режимы (ЕРР и ЕСР).
3.2.1. Стандартный режим SPP
Передача однонаправленная (от компьютера к устройству), программно-
управляемый обмен, при котором передача каждого байта сопровождается
циклом квитирования (запрос на передачу, подтверждение готовности
устройства к приему, передача байта, подтверждение правильности приема).
В стандартном режиме используется три регистра, имеющие смещение
относительно базового адреса 0,1 и 2 соответственно.
Назначение указанных регистров следующее:
- регистр выходных данных (смещение О, W) - это тот адрес порта, через
который проходит каждый байт данных, посылаемый в устройство, при
чтении позволяет считать последний байт, переданный устройству;
- регистр статуса (смещение 1, R)- позволяет прочитать значение
сигналов интерфейса (текущая информация о устройстве). Процессор может
постоянно опрашивать его, чтобы распознать момент, когда принят
очередной байт и можно посылать следующий байт данных. Регистр статуса
сообщает также об ошибках. Назначение его бит:
216
3.2 Параллельный интерфейс. LPT- порт
0-2: не используются;
3:0 - при печати возникла ошибка (сигнал ERROR#);
4:0- устройство в автономном режиме (сигнал SELECT#);
5:1- сигнал "конец бумаги" (сигнал РЕ);
6:0- устройство готово к приему следующего символа (сигнал АСК#);
7: 0 - устройство занято, в автономном режиме или произошла ошибка
(сигнал BUSY).
- регистр управления (смещение 2, W) - инициализирует адаптер и
управляет выводом данных. Он может также подготавливать параллельный
порт для операций прерывания, с тем чтобы устройство посылало
прерывание к процессору, когда он готов к приему очередного символа,
оставляя процессор свободным для других дел. Назначение его бит и
соответствующих сигналов интерфейса:
0: бит запуска печати. Для запуска печати символа нужно на короткое
время установить бит 0 регистра управления в 1, а затем сбросить его (сигнал
STROBE#);
1: 1 - после возврата каретки выводить перевод строки (в MS-DOS
должен быть сброшен в 0) (сигнал AUTOLINEFEED#);
2: 1 - инициализировать адаптер устройства (сигнал INIT#);
3: 1 - разрешить вывод (должен быть всегда установлен в 1) (сигнал
SELECTIN#);
4: 1 - разрешить прерывания от устройства. Прерывание происходит по
окончании приема символа.
5- 7: не используются.
Хорошо написанная программа должна начинаться с проверки связи
устройства с машиной (on line). Если присоединено не одно устройство, то
программа должна позволять пользователю выбрать с каким из них он будет
работать. Кроме того, эта программа должна восстанавливать ситуацию при
любых ошибках устройства. При этом желательно предусмотреть такую
организацию данных, чтобы не было необходимости снова печатать весь
документ (т.е. продолжение печати с заданной страницы).
Инициализация порта. Программы должны инициализировать порт
каждого устройства (LPT1 - LPT3) перед первым использованием. Порты
должны также повторно инициализироваться после устранения причин
ошибки. Следует различать инициализацию порта устройства и
инициализацию самого устройства. Инициализация устройства это
внутреннее дело устройства. Она происходит автоматически при его
включении и в большинстве случаев устройство не может быть повторно
инициализировано без его выключения и повторного включения. Но
программа может повторно инициализировать устройство в том смысле, что
могут быть восстановлены начальные параметры, которые устройство
использует для печати, отменяя все специальные шрифты, остановы,
217
3 Внешние интерфейсы
табуляции и т.д. Целесообразно производить сброс устройства, когда
программа завершает работу с ним. Языки высокого уровня инициализируют
LPT-порт автоматически, но собственные программы вывода требуют для
этой цели разработки специальных процедур инициализации. С другой
стороны, восстановление начальных параметров печати требуется во всех
Следует иметь ввиду, что на многих принтерах символы не печатаются
до тех пор, пока не получен код возврата каретки, завершающий строку (или
до тех пор пока не введена целая строка данных). Символы могут спокойно
ожидать в буфере принтера, даже после того, как породившая их программа
завершилась. Когда начинается новая передача данных на принтер, то эти
символы будут напечатаны. Чтобы избежать этой проблемы, не забывайте
почистить буфер перед началом печати при завершении программы. Это
делается посылкой на принтер кода ASCII 18h (при этом параметры печати
не меняются).
Регистр управления выводом каждого адаптера принтера имеет бит (2-й
бит регистра управления), который вызывает инициализацию адаптера.
Бит 2 - бит инициализации адаптера и обычно он устанавливается в 0.
Для инициализации адаптера надо установить этот бит в 1 на 1/20 секунды. В
этот момент нужно, чтобы был установлен только бит 3 (разрешен вывод на
печать). Поэтому пошлите в порт значение OCh, сделайте задержку, а затем
пошлите в порт обычное (без прерываний) неинициализированное значение,
которое равно 08h.
Функция 1 прерывания 17h BIOS инициализирует порт принтера и
возвращает байт, дающий статус порта. Для этого следует поместить в DX
номер порта (число от 0 до 2 для LPT1 - LPT3), после чего вызвать
прерывание. Байт статуса принтера возвращается в АН.
Вывод данных, Программа всегда должна проверить, связь устройства с
ПК перед тем, как послать на него вывод. Легко установить, что устройство
не готово, так как бит 3 регистра статуса устанавливается в 1 в этом случае.
Сложнее определить причину неготовности принтера: выключен ли он,
отменен выбор принтера или в нем нет бумаги. Это происходит из-за того,
что принтеры разных производителей посылают разные наборы битов в
регистр статуса принтера, даже когда они находятся в идентичном состоянии.
Хотя регистр статуса имеет биты, которые должны показывать эти три
состояния принтера, но в действительности значения битов могут не
соответствовать этим условиям (бит 3 должен показывать, что принтер вык-
лючен, бит 4 - что отменен выбор принтера и бит 5 - что нет бумаги).
Типичная последовательность действий для вывода на печать одного символа
такова:
- вывести передаваемый байт в регистр данных;
- в цикле проверять состояние принтера до установки бита 7 регистра
состояния (здесь возможно использование таймаута);
218
3.2 Параллельный интерфейс. LPT- порт
- проверить биты 3-5 регистра состояния на наличие ошибки;
- установить и сразу же сбросить нулевой бит регистра управления.
- далее можно прочитать регистр состояния и перейти к печати
следующего символа.
Несмотря на простоту управления, принтер представляет из себя
достаточно сложное устройство, имеющее свой микропроцессор, ПЗУ и ОЗУ.
Микропроцессор используется для обработки управляющих
последовательностей и управления печатью. ПЗУ содержит описание
рисунков символов в зависимости от их кода и выбранной таблицы и
программы на языке используемого микропроцессора. ОЗУ используется для
временного хранения введенных данных и спроектированных пользователем
символов. Принтер обрабатывает ряд спецсимволов (таких, как звонок, забой,
горизонтальная и вертикальная табуляция), а также имеет достаточно
сложную систему команд (ESC-последовательности) для изменения режимов
работы и управления печатью.
Обычно команды начинаются с символа ESC (шестнадцатиричный код
IBh) и имеют длину от двух байт и более (существуют командные
последовательности, включающие по несколько килобайт информации,
например команды загрузки спроектированных пользователем шрифтов). Все
эти спецсимволы и команды передаются единым потоком (вместе с данными)
через регистр выходных данных. Подобный способ управления удобен для
программного изменения режимов работы устройства. Учитывая, что
выпуском принтеров для ПК занимается достаточно большое число
компаний и возможности принтеров постоянно совершенствуются, нет
смысла приводить полностью какую-либо систему команд, так как она в
разных марках и моделях принтеров различна.
Драйверы современных принтеров учитывают особенности системы
команд конкретной модели и позволяют выполнять настройку параметров
печати в диалоговом режиме.
3.2.2. Режим ЕРР
Протокол EPP (Enhanced Parallel Port - улучшенный параллельный порт)
соответствует спецификации IEEE 1284, предназначен для повышения
производительности обмена по параллельному порту и обеспечивает
двунаправленный обмен данными с несколькими устройствами.
Протокол ЕРР обеспечивает четыре типа циклов обмена (запись/чтение
данных и запись/чтение адреса).
Назначение циклов записи и чтения данных ясно из их названия.
Адресные циклы могут быть использованы для передачи адресной,
канальной и управляющей информации. Циклы обмена данными явно
отличаются от адресных циклов применяемыми стробирующими сигналами.
219
3 Внешние интерфейсы
Назначение сигналов порта ЕРР и их связь с сигналами SPP приведены в
табл. 3.3.
Таблица 3.3 - Сигналы LPT-порта в режиме ввода/вывода ЕРР
Кои такт Сигнал SPP Имя в EPP VO Описание
1 STROBE# WRITES О Низкий уровень - признак цикла записи, высокий - чтения
14 AUTOFEED DATASTB# О Строб данных. Низкий уровень устанавливается в циклах передачи данных
17 SELECTIN# ADDRSTB# О Строб адреса. Низкий уровень устанавливается в адресных циклах
16 INIT# RESET# О Сброс ПУ (низким уровнем)
10 ACK# INTR# I Прерывание от ПУ
И BUSY WAIT# I Сигнал квитирования. Низкий уровень разрешает начало цикла (установку строба в низкий уровень), переход в высокий - разрешает завершение цикла (снятие строба)
2-9 Щ7-0) AD(7-0) I/O Двунаправленная шпна адреса/даиных
12 PE AckDataReq* I Используется по усмотрению разработчика периферии
13 SELECT Xflag* I Используемся по усмотрению разработчика периферии
15 ERROR# DataAvail#* I Используется по усмотрению разработчика периферия
* Сигналы действуют в последовательности согласования (см. ниже).
ЕРР-порт имеет расширенный набор регистров (табл. 3.4), который
занимает в пространстве ввода/вывода 5-8 смежных байт.
Таблица 3.4 - Регистры ЕРР-порта
Имя регистра Смете нне Режим R/W Описание
SPP Data Port +0 SPP/EPP W Регистр данных стандартного порта
SPP Status Port +1 SPP/EPP R Регистр состояния стандартного порта
SPP Control Port +2 SPP/EPP W Регистр управления стандартного порта
EPP Address Port +3 EPP R/W Регистр адреса ЕРР. Чтеиие/запись генерирует связанный цикл чтения/запнсн адреса ЕРР
EPP Data Port +4 EPP R/W Регистр данных ЕРР. Чтенне/зяпнсь генерирует связанный цикл чтения/запнсн данных ЕРР
Not Defined +S...+7 EPP N/A В некоторых контроллерах могут использоваться для 16-32-битных операций ввода/вывода
В отличие от программно-управляемого режима SPP, внешние сигналы
ЕРР-порта (как информационные, так и сигналы квитирования) для каждого
220
3.2 Параллельный интерфейс. LPT- порт
цикла обмена формируются аппаратно по одной операции записи или чтения
в регистр порта. На рис. 3.3 приведена диаграмма цикла записи данных,
иллюстрирующая внешний цикл обмена, вложенный в цикл записи
системной шины процессора (эти циклы называют связанными/ Адресный
цикл записи отличается от цикла данных только используемым стробом
внешнего интерфейса. Циклы чтения отличаются состоянием сигнала
WRITE# во время передачи данных.
IOW# \ ! ! 1 ! / 1
i i i i i i I
WRITE# i i \ i i i i i i i i i у 1 1 1
i 1 i i i 1
Data Strobe# i i 1 1 } z 1 , n, 1 t J" 1 )
WAIT# i i 1 1 f 1 t 1 1 \
1 i i i i 1 1
Data (0-7) - 1 -— < Действительные данные ' > 1
1 2 3 4 5 6 7
Рисунок 3.3 - Цикл записи данных ЕРР
Цикл записи данных состоит из следующих фаз:
1. Программа выполняет цикл записи (IOWR#) в порт 4 (EPP Data Port).
2. Адаптер устанавливает сигнал Write# (низкий уровень), и данные
помещаются на выходную шину LPT-порта.
3. При низком уровне WAIT# устанавливается строб данных.
4. Порт ждет подтверждения от ПУ (перевода WAIT# в высокий
уровень).
5. Снимается строб данных - внешний ЕРР-цикл завершается.
6. Завершается процессорный цикл ввода/вывода.
7. ПУ устанавливает низкий уровень WAIT#, указывая на возможность
начала следующего цикла.
Главной отличительной чертой ЕРР является выполнение внешней
передачи во время одного процессорного цикла ввода/вывода. Это позволяет
достигать высоких скоростей обмена (0,5-2 Мбайт/с). Периферийное
устройство, подключенное к параллельному порту ЕРР, может работать на
уровне производительности устройства, подключаемого через слот ISA.
Прозрачный протокол блокированного квитирования позволяет
автоматически настраиваться на скорость обмена, доступную и хосту, и
периферийному устройству. Периферийное устройство может регулировать
длительность всех фаз обмена с помощью всего лишь одного сигнала WAIT#.
При этом периферийное устройство не должно вызывать ’’зависание”
процессора на шинном цикле обмена. Этому препятствует механизм тайм-
аутов PC, который принудительно завершает любой цикл обмена, длящийся
221
3 Внешние интерфейсы
более 15 мкс. В ряде реализации ЕРР за тайм-аутом интерфейса следит и сам
адаптер - если ПУ не отвечает в течение определенного времени (5 мкс), цикл
прекращается и в дополнительном регистре состояния адаптера фиксируется
ошибка (состав и назначение дополнительных регистров не
стандартизованы).
В программной модели ЕРР-порта кроме трех регистров стандартного
порта, имеющим смещение 0, 1 и 2 относительно базового адреса, добавлены
два регистра (ЕРР Address Port и ЕРР Data Port), чтение и запись в которые
вызывает генерацию связанных внешних циклов.
Назначение регистров стандартного порта сохранено, что обеспечивает
совместимость ЕРР-порта с периферийными устройствами и программным
обеспечением, рассчитанными на применение программно-управляемого
обмена. Поскольку сигналы квитирования адаптером вырабатываются
аппаратно, при записи в регистр управления CR биты 0, 1 и 3,
соответствующие сигналам STROBES, AUTOFEED# и SELECTING, должны
иметь нулевые значения. В противном случае программное вмешательство
может нарушить последовательность квитирования.
Некоторые адаптеры допускают и 16/32-битное обращение к регистру
данных ЕРР, используя дополнительные регистры данных со смещением в
диапазоне 5-7 (см. табл. 3.3). Тогда 16- или 32-битное обращение по адресу
регистра данных ЕРР (смещение 4) приведет к автоматической генерации
двух или четырех шинных циклов по нарастающим адресам. Эти циклы
будут выполняться быстрее, чем то же количество одиночных циклов. Таким
образом при обмене данными и обеспечивается производительность,
достигающая 2 Мбайт/с, вполне достаточная и для адаптеров локальных
сетей, внешних дисков, стриммеров и CD-ROM. Адресные циклы ЕРР всегда
выполняются только в однобайтном режиме обращения.
3.2.3. Режим ЕСР
Протокол ЕСР (Extended Capability Port - порт с расширенными
возможностями) был предложен фирмами Hewlett Packard и Microsoft как
прогрессивный режим связи с периферией типа принтеров и сканеров. Как и
ЕРР, данный протокол обеспечивает высокопроизводительный
двунаправленный обмен данными хоста с периферийными устройствами.
Протокол ЕСР в обоих направлениях обеспечивает два типа циклов:
- циклы записи и чтения данных,
- командные циклы записи и чтения.
Командные циклы подразделяются на два типа: передача канальных
адресов и счетчика RLC (Run-Length Count).
Протоколом ЕСР соответствует стандарту IEEE 1284, но имеет
специфические особенности реализации:
222
3.2 Параллельный интерфейс. LPT- порт
- компрессия данных хост-адаптером по методу RLE;
- буферизация FIFO для прямого и обратного каналов;
- применение DMA и программного ввода/вывода.
Компрессия в реальном времени по методу RLE (Run-Length Encoding)
позволяет достичь коэффициента сжатия до 64:1 при передаче растровых
изображений, которые обычно имеют длинные строки повторяющихся байт.
Канальная адресация ЕСР применяется для адресации множества
логических устройств, входящих в одно физическое (например,
комбинированное устройство факс/принтер/модем).
Протокол ЕСР также переопределяет сигналы SPP (табл. 3.5).
Таблица 3.5 - Сигналы LPT-порта в режиме ЕСР
Кон такт Сигнал SPP Имя в ЕСР I/O Описание
1 STROBE# HostClk О Используется в паре с PeriphAck для передачи в прямом направлении (вывод)
14 AUTOFEED# HostAck О Индицирует тип команда/данные ври передаче в прямом направлении. Используется в паре с PeriphClk для передачи в обратном направлении
17 SELECTIN# 1284Active О Высокий уровень указывает на обмен в режиме IEEE 1284. (В режиме SPP уровень низкий)
16 INIT# ReverseRequest# О Низкий уровень переключает канал на передачу в обратном направлении
10 ACK# PeriphClk I Используется в иаре с HostAck для передачи в обратном направлении
11 BUSY PeriphAck I Используется в каре с HostClk для передачи в обратном направлении. Индицирует тип команда/ данные при передаче в обратном направлении
12 PE AckReverse# I Переводится в низкий уровень как подтверждение сигналу ReverseRequest#
13 SELECT Xflag* I Флаг расширяемости Extensibility flag
15 ERROR# PeriphRequest#* I Устанавливается ПУ для указания на доступность (наличие) обратного канала передачи*
2-9 Data(0:7) Data(0:7) VO Двунаправленный канал данных
* Сигналы действуют в последовательности согласования (см. ниже).
Адаптер ЕСР тоже генерирует внешние протокольные сигналы
квитирования аппаратно, но его работа существенно отличается от режима
ЕРР.
На рис. 3.4,а приведена диаграмма двух циклов прямой передачи: за
циклом данных следует командный цикл. Тип цикла задается уровнем на
линии HostAck (в цикле данных - высокий, в командном цикле - низкий). В
командном цикле байт может содержать канальный адрес или счетчик RLE.
223
3 Внешние интерфейсы
Отличительным признаком является бит 8 (старший): если он нулевой, то
биты 1-7 содержат счетчик RLE (0-127), если единичный - то канальный
адрес. На рис. 3.4, б приведены два цикла обратной передачи.
HostClk
PeriphAsk
HostAsk
Data (0-7)
а) прямая передача
Reverse
Request#
AckReverse
PeriphClk
HostAsk
PeriphAsk
Data (0-7)
б) обратная передача
Рисунок 3,4 Передача в режиме ЕСР
В отличие от режима ЕРР, циклы обмена ЕСР не связаны с циклами
системной шины процессора. В данном режиме обмен программы с
периферийным устройством разбивается на два относительно независимых
процесса, которые связаны через FIFO-буфер. Обмен программного драйвера
с FIFO-буфером может осуществляться как с использованием DMA, так и
программным вводом-выводом. Обмен ПУ с буфером аппаратно выполняет
адаптер ЕСР. Драйвер в режиме ЕСР не имеет информации о точном
состоянии процесса обмена, но в случае обмена с принтером обычно важна
только информация о том, завершен он или нет.
Прямая передача данных на внешнем интерфейсе состоит из следующих
шагов:
224
3.2 Параллельный интерфейс. LPT- порт
1. Хост помещает данные на шину канала и устанавливает признак
цикла данных (высокий уровень) или команды (низкий уровень) на линии
HostAck.
2. Хост устанавливает низкий уровень на линии HostClk, указывая на
действительность данных.
3. ПУ отвечает установкой высокого уровня на линии PeriphAck.
4. Хост устанавливает высокий уровень линии HostClk (данные
считается переданными). В этот момент модифицируются счетчики
переданных и принятых байт. В протоколе ЕСР есть условия, вызывающие
прекращение обмена между шагами 3 и 4, и тогда эти данные не должны
рассматриваться как переданные.
5. ПУ устанавливает низкий уровень на линии PeriphAck для указания
на готовность к приему следующего байта.
Протокол ЕРР позволяет драйверу чередовать циклы прямой и обратной
передачи, не запрашивая подтверждения на смену направления. В ЕСР смена
направления должна быть согласована: хост запрашивает реверс установкой
ReverseRequest#, после чего он должен дождаться его подтверждения
сигналом AckReverse#. Только после этого возможна передача данных в
другом направлении. Поскольку предыдущий цикл мог выполняться по
прямому доступу, драйвер должен дождаться завершения прямого доступа
или прервать его, выгрузить обратно буфер FIFO, определив точное значение
счетчика переданных байт, и только после этого запрашивать реверс.
Обратная передача данных состоит из следующих шагов:
1. Хост запрашивает изменение направления канала, устанавливая
низкий уровень на линии ReverseRequest#.
2. ПУ разрешает смену направления установкой низкого уровня на
линии AckReverse#.
3. ПУ помещает данные на шину канала и устанавливает признак цикла
данных (высокий уровень) или команды (низкий уровень) на линии
PeriphAck.
4. ПУ устанавливает низкий уровень на линии PeriphClk, указывая на
действительность данных.
5. Хост отвечает установкой высокого уровня на линии HostAck.
6. ПУ устанавливает высокий уровень линии PeriphClk, и этот перепад
может использоваться для фиксации данных хостом.
7. Хост устанавливает низкий уровень на линии HostAck для указания на
готовность к приему следующего байта.
Программная модель и регистры ЕСР определяются спецификацией
IEEE 1284. Адаптер LPT-порта может функционировать в различных
режимах (см. табл. 3.6), которые задаются полем Mode регистра ECR (биты
7-5).
225
3 Внешние интерфейсы
Таблица 3.6 - Режимы ЕСР-порта
Режим Название Описание
ООО SPPmode Стандартный (традиционный) режим
001 Bi-directional mode (Byte mode) Двунаправленный порт (типа 1 для PS/2)
010 Fast Centronics Однонаправленный с использованием FIFO и DMA
ОН ECP Parallel Port mode ЕСР
100 EPP Parallel Port mode Перевод в режим ЕРР
101 (reserved) -
110 Test mode Тестирование работы FIFO и прерываний
111 Configuration mode Доступ к конфигурационным регистрам
В режиме ООО (SPP) порт работает как стандартный однонаправленный
программно-управляемый SPP.
В режиме 001 (Bi-Di PS/2) порт работает как двунаправленный порт
PS/2 типа 1. От режима ООО отличается возможностью реверса канала данных
по 5-му биту регистра управления.
Режим 010 (Fast Centronics) предназначен для однонаправленного
вывода через FIFO-буфер с возможностью использования DMA. Сигналы
квитирования по протоколу Centronics вырабатываются аппаратно. Сигнал
запроса прерывания вырабатывается по состоянию FIFO-буфера.
Режим ОН и является собственно режимом ЕСР, описанным выше. В
этом режиме поток данных и команд, передаваемых в периферийное
устройство, помещается в FIFO-буфер через регистры ECPDFIFO и
ECPAFIFO соответственно. Из FIFO они выводятся с соответствующим
признаком цикла (состояние линии HostAck). Принимаемый поток данных от
ПУ извлекается из FIFO-буфера через регистр ECPDFIFO. При этом
получение адреса в командном цикле от ПУ не предусматривается. Обмен с
регистром ECPDFIFO может производиться и по каналу DMA.
Компрессия по методу RLE при передаче выполняется программно. Для
передачи подряд более двух одинаковых байт данных в регистр ECPAFIFO
записывается байт, у которого младшие 7 бит содержат счетчик RLC
(значение RLC=127 соответствует 128 повторам), а старший бит нулевой.
После этого в ECPDFIFO записывается сам байт. Принимая эту пару байт
(командный байт и байт данных), ПУ осуществляет декомпрессию. При
приеме потока от ПУ адаптер ЕСР декомпрессию осуществляет аппаратно и
в FIFO-буфер помещает уже декомпрессированные данные. Из этого
описания работы компрессии следует, что вывод данных с одновременным
использованием компрессии и DMA невозможен.
Режим 100 (ЕРР) описан выше.
Режим ПО (Test Mode) предназначен для тестирования взаимодействия
механизмов FIFO и прерываний. В этом режиме данные могут передаваться
в/из регистра TFIFO с помощью DMA или программным способом. При этом
на внешний интерфейс этот обмен не воздействует. Адаптер отрабатывает
226
3.2 Параллельный интерфейс. LPT- порт
операции на максимальной скорости интерфейса и по мере необходимости
вырабатывает сигналы запроса прерывания. Таким образом программа может
определить максимальную пропускную способность канала.
Режим 111 (Configuration mode) предназначен для доступа к
конфигурационным регистрам. Его выделение защищает адаптер и протокол
от некорректных изменений конфигурации в процессе обмена.
Регистры адаптера ЕСР (табл. 3.7) включают три регистра стандартного
режима SPP и дополнительные регистры со смещением 400h - 402h. Такое
решение объясняется следующим. Традиционные адаптеры ISA для
дешифрации адреса портов ввода/вывода использовали только 10 младших
линий шины адреса, поэтому обращения по адресам, например, Port,
Port+400h, Port+800h... будут восприниматься как обращения к адресу Port,
лежащему в диапазоне 0-3FFh. Современные PC и адаптеры декодируют 12
адресных бит, и могут обращаться к дополнительным регистрам (этим
обеспечивается совместимость со старыми адаптерами в режимах 000-001 и
возможность определения присутствия ЕСР-адаптера попыткой обращения к
его расширенным регистрам).
Таблица 3.7 - Регистры ЕСР
Смещение Имя R/W Режимы ЕСР Назначение
000 DR R/W 000-001 Data Register
000 ECPAFIFO R/W 011 ЕСР Address FIFO
001 SR R/W Все Status Register
002 CR R/W Все Control Register
400 SDFIFO R/W 010 Parallel Port Data FIFO
400 ECPDFIFO RAV ОН ECP Data FIFO
400 TFIFO R/W ПО Test FIFO
400 CNFGA R 111 Configuration Register A
401 CNFGB R/W 111 Configuration Register В
402 ECR R/W Все Extended Control Register
Для каждого режима ЕСР доступны свои функциональные регистры.
Переключение режимов осуществляется записью в регистр ECR. По
умолчанию включается режимы 000 или 001. Из этих режимов всегда можно
переключиться в любой другой, но из старших режимов (010-111)
переключение возможно только в 000 или 001. Для корректной работы
интерфейса перед выходом из старших режимов необходимо дождаться
завершения обмена по прямому доступу и опустошения FIFO-буфера.
Ниже приводится описание регистров.
Регистр данных DR используется для передачи данных только в
программно-управляемых режимах (000 и 001).
Регистр состояния SR передает значение сигналов на соответствующих
линиях (как в SPP).
227
3 Внешние интерфейсы
Регистр управления CR имеет назначение бит, совпадающее с SPP. В
режимах 010,011 запись в биты 0,1 игнорируется.
Регистр ECPAFIFO служит для помещения информации командных
циклов (канального адреса или счетчика RLE, в зависимости от бита 7) в
FIFO-буфер. Из буфера эта информация будет выдана в командном цикле
вывода.
Регистр SDFIFO используется для передачи данных в режиме 010.
Данные, записанные в этот регистр (или посланные по каналу DMA),
передаются через буфер FIFO по аппаратно - реализованному протоколу
Centronics. При этом должно быть задано прямое направление передачи (бит
5 регистра управления равен нулю).
Регистр DFIFO используется для обмена данными в режиме 011 (ЕСР).
Данные, записанные в этот регистр или считанные из него (или переданные
по каналу DMA), передаются через буфер FIFO по протоколу ЕСР.
Регистр TFIFO обеспечивает механизм тестирования FIFO-буфера в
режиме 110.
Регистр ECPCFGA позволяет считывать информацию об адаптере
(идентификационный код в битах 7 - 4).
Регистр ECPCFGB предназначен для хранения информации,
необходимой драйверу. Запись в этот регистр не влияет на работу порта.
Регистр ECR является главным управляющим регистром ЕСР. Его биты
имеют следующее назначение:
- 7-5: ЕСР MODE - задают режим ЕСР (см. табл. 3.6);
- 4: ERRINTREN# - (Error Interrupt Disable) запрещает прерывания
сигналу ERRORS (при нулевом значении бита по отрицательному перепаду
на этой линии вырабатывается запрос прерывания);
- 3: DMAEN - (DMA Enable) разрешает обмен по каналу DMA;
- 2: SERVICEINTR - (Service Interrupt) запрещает сервисные
прерывания, которые вырабатываются по окончании цикла DMA (если он
разрешен), по порогу заполнения/опустошения FIFO-буфера (если не
используется DMA) и по ошибке переполнения или опустошения буфера;
- 1: FIFOFS - (FIFO Full Status) сигнализирует о заполнении буфера (при
FIFOFS=1 в буфере свободного места);
- 0: FIFOES - (FIFO Empty Status) указывает на полное опустошение
буфера. Комбинация FIFOFS=FIFOES=1 означает ошибку работы с FIFO.
По интерфейсу с программой ЕСР-порт напоминает ЕРР: после
установки режима (записью кода в регистр ECR) обмен данными с
устройством сводится к операциям чтения или записи в соответствующие
регистры. За состоянием (заполнением) FIFO-буфера наблюдают либо по
опросу (чтением регистра ECR), либо по обслуживанию сервисных
прерываний от порта. Весь протокол квитирования генерируется адаптером
аппаратно.
228
3.2 Параллельный интерфейс. LPT- порт
3.2.4 Согласование режимов
Периферийные устройства в стандарте IEEE 1284 обычно не требуют от
контроллера реализации всех режимов, предусмотренных стандартом. Для
определения режимов и методов управления конкретным устройством
стандарт предусматривает последовательность согласования для установки
требуемого режима интерфейса. При этом старые устройства на нее не
ответят, и контроллер останется в стандартном режиме, а новые сообщат о
своих возможностях, и контроллер установит требуемый режим.
Во время фазы согласования контроллер выставляет на линии данных
байт расширяемости (Extensibility byte), запрашивая подтверждение на
перевод интерфейса в требуемый режим или прием идентификатора
периферийного устройства (табл. 3.8).
Таблица. 3.8 - Значение бит байта расширяемости
Бит Описание Допустимые ком- бинации бит 7-0
0 Запрос Byte Mode 00000001
1 Резерв 0000 0010
2 Запрос идентификатора устройства с ответом в режиме:
Nibble Mode (полубайтный) 0000 0100
Byte Mode (байтный) 0000 0101
ЕСР без RLE 00010100
ЕСР с RLE 00110100
3 Резерв 0000 1000
4 Запрос режима ЕСР Mode без RLE 00010000
5 Запрос режима ЕСР с RLE 00110000
6 Запрос режима ЕРР 0100 0000
7 Request Extensibility Link - запрос для будущих расширений 1000 0000
попе Запрос Nibble Mode 0000 0000
Идентификатор передается контроллеру в запрошенном режиме (любой
режим обратного канала, кроме ЕРР). ПУ использует сигнал Xflag (SELECT в
терминах SPP) для подтверждения запрошенного режима обратного канала,
кроме полубайтного. Полубайтный режим поддерживается всеми
устройствами IEEE 1284 безусловно. Бит Extensibility Link request заложен
для механизма определения дополнительных режимов в будущих
расширениях стандарта.
Последовательность согласования состоит из следующих шагов:
1. Хост выводит байт расширяемости на линии данных.
2. Хост устанавливает высокий уровень сигнала SELECTIN# и низкий -
AUTOFEED#, что означает начало последовательности согласования.
3. ПУ 1284 ответит установкой низкого уровня сигнала ACK# и
высокого - ERROR#, РЕ и SELECT. Устройство, «не понимающее» стандарта
229
3 Внешние интерфейсы
1284, ответа не даст, и дальнейшие шаги данной последовательности для
него не выполняются.
4. При положительном ответе ПУ в п.З формируется байт
расширяемости более сложного запрашиваемого режима и процедура
согласования повторяется с п.1 до тех пор, пока не будет получена
информация о всех поддерживаемых ПУ режимах (запрашиваемые режимы
должны поддерживаться адаптером).
5. Записью байта в регистр ECR задается необходимый режим ПУ
Описанный механизм разрабатывался фирмой Microsoft с учетом
необходимости обеспечения совместимости с не РпР устройствами,
подразумевая невозможность их вывода из строя и устойчивость системы к
сообщениям, не являющимся РпР идентификаторами.
3.2.5. Пример программирования
Программа предназначена для печати графического экрана на принтер в
EGA режимах: ODh, OEh, OFh, 10h, llh, 12h и вызывается при нажатии
клавиши PrintScreen
program prn_scr;
uses dos,crt;
const
loadx =32;
buf_y =100;
buf_x =200;
fon =0;
INT =20;
STROBE_ON =$01;
type
s_type=Abyte;
uns=byte;
unt=word;
var
put_mode runt; { текущий режим чтения }
printmode runt;
bytesperHne runt; { количество бант в строке }
maxx, max_y runt;
graphmode runt; { текущий видеорежим }
zap runs;
error runs;
a:array(0..7,0..639J of uns; { Буфер принтера }
b rbyte;
contents runs;
c, cl runt;
runt;
const
flag: boolean-FALSE;
pr_len:unt=640;
230
3.2 Параллельный интерфейс. LPT- порт
pr_col:unt^350;
{ Функция modeXXO ставит в соответствие внешним переменным }
{ параметры для текущего видеорежнма }
procedure modeOD;
begin
putmode:=0;
bytes_per_tine:=320 div 8;
max_x:-320;
maxy:=200;
end;
procedure ntodeOE;
begin
putjmode:=0;
bytes_per_line:=640 div 8;
max_x:=640;
max_y:=200;
end;
procedure modeOF;
begin
put_mode:==0;
bytes_per_linc:=640 div 8;
maxx:=640;
max_y:=350;
end;
procedure modelO;
begin
put_jnode:=0;
bytes_per_line:=640 div 8;
max_x:=640;
max_y:=350;
end;
procedure modell;
begin
put_mode:==0;
bytesjperJine:=320 div 8;
max_x:=320;
max__y:=480;
end;
procedure model2;
begin
put_mode:=0;
bytes_per_line:=640 div 8;
max_x:=640;
max_y:=480;
end;
function point (x, y:unt):uns; { функция чтения цвета точки экрана }
var
offset:s_type;
mask, i:byte;
_dx :word;
const
231
3 Внешние интерфейсы
color: by te=O;
ret :byte=O;
{ Переменная offset получает необходимое смещение для байта с }
{ заданными координатами }
begin
offset:===s_type($A000:0+y*bytes_perJinc+(x shr 3));
{ Переменная mask получает значение, необходимое для выделения }
{ бита, соответствующего точке на экране с координатами у,х }
mask:=$80 shr (х and $07);
_dx:=$3CE;
{ Устанавливается режим чтения 0 }
port[_dx]:~5;
inc(_dx);
port|_dx}::=0;
dec(_dx);
for i:=0 to 3 do
{ Выбирается необходимая битовая плоскость, начиняя с 0-й }
begin
{ Устанавливается регистр маски чтения }
portLDX]:=4;
inc(_DX);
portLPX]:=i;
dec(_DX);
{ Получение байта из регистра защелки }
ret:=offsetA;
{ Если необходимый бит установлен, то устанавливается }
{ соответствующий бнт в переменной color }
if ret and maskoO then
color:=color or ($01 shl i);
end;
point-color { Функция возвращает цвет пикселя }
end;
{ Процедура чтения текущего вндеорежнма }
procedure ioadmode;
var г: registers;
begin
r.AH:=30F;
intr($10yr);
graph_mode:=r.AL; { Рег-p AL получает текущий вндеорежим }
case graph_mode of
{ Устанавливаются необходимые параметры для текущего режима }
$0d:mode0D;
$0e:mode0E;
$0f:mode0F;
$10:model0;
$ll:modell;
$12:model2
end
end;
{ Функция вывода символа на принтер }
procedure OutputChar(c:byte);
232
3.2 Параллельный интерфейс. LPT- порт
var
hunt;
address:unt absolute $0040:$0008;
begin
Переменная address получает адрес устройства LPT1
for i:=0 to 1999 do; { Цикл задержки
portfaddress] :~c; { В порт address посылается байт с
zap:=port(address + 2]; { чтение регистра управления принтера
port[ address + 2 ]:= zap or STROBEON ;
{ На короткое время устанавливается бит 1 регистра управления
port] address + 2 ]:=zap
end;
{ Функция для вывода графического экрана на устройство LPT1
}
}
}
}
}
I
procedure prtxt;
const
x:unt=0;
y:unt=O;
var
k,xl,yl:unt;
i, size:unt;
c, p:byte;
esc:array[0..4] of byte;
begin
if flag then
begin
flag:=FALSE;
exit
end;
{ Инициализация принтера
OutputChar (27);
OutputChar (64);
OutputChar (27);
OutputChar (51);
OutputChar (24);
OutputChar (13);
OutputChar (10);
pr_coi:=max_y;
y:=0;
while y<pr_col do
begin
for k:=0 to 7 do
begin
{ Заполнение буфера принтера размером 8x640
for х:=0 to pr_len-l do
a(k, x]:=point (xTy+k)
end;
sizc:=pr_len;
{ Создание ESC-носледовательностн для установки принтера
{ в графический режим
esc (0]:=27;
}
}
233
3 Внешние интерфейсы
esc f 1 }:=42;
esc [2]:=print_mode;
esc [3]:-size mod 256;
esc (4J:=size div 256;
{ Вывод ESC-последовательности на принтер }
for i:=0 to 4 do OutputChar(esc[i]);
for xl:=O to size*l do
begin
c:=0;
p:=0;
for yl:=O to 7 do
begin
if a[yl, xljofon then p:=l
else p:=0;
{ Если байт в массиве с координатами у 1, х! не равен цвету фона, }
{ то неременная р получает значение, равное 1 }
if (р<>0) then с:=с or ($80 shr yl);
{ Если р<>0, то устанавливается соответствующий бит в переменной с, }
{ которая после выхода из цикла хранят биты, равные 1, }
{ если цвет не соответствует цвету фона и 0, если соответствует. }
end;
OutputChar (с);
{ Получившаяся цепочка битов выводится на принтер в графическом режиме }
end;
OutputChar (13);
OutputChar (10);
{ На принтер посылаются байты, соответствующие кодам перевода и }
{ возврата печатающей головки }
inc(y,8);
end;
end;
{ Резидентная функция, вызываемая по нажатию PrintScreen }
procedure s_potnt; interrupt;
begin
ioad mode; if graph_mode<07 then exit; put_mode:=0; print_mode:-4; prtxt; end; { type bytep=Abyte; addres=record pibytep end; addresp-Aaddres; const { Чтение текущего видеорежвма } { Возврат, если режим текстовый } { Установка режима чтения 0 } { Установка режима принтера } { Печать графического экрана } Основная программа }
234
3.2 Параллельный интерфейс. LPT- порт
addr: addresp=(addresp(INT));
BEGIN
{ Переопределение вектора INT5 на собственное прерывание }
addrA.p:=bytep(@s_point);
keep (0); { Программа в памяти остается резидентной }
END.
3.2.6. Контрольные вопросы
1. Как найти базовые адреса параллельных устройств LPT1-LPT3.
2. В каких режимах может работать параллельный адаптер.
3. Программная модель адаптера LPT в стандартном режим SPP,
назначение регистров данных, состояния и управления.
4. Перечислите последовательность действий, необходимых для
инициализации порта устройства.
5. Перечислите последовательность действий, необходимых для
передачи одного байта на в программно-управляемом режиме.
6. Как выполняется управление принтером с помощью управляющих
кодов и ESC-последовательностей.
7. Режим ЕРР, типы циклов обмена и их особенности.
8. Назначение сигналов LPT-порта в режиме ЕРР.
9. Программная модель адаптера LPT в режиме ЕРР. Назначение
дополнительных регистров.
10. Что такое связанные циклы, и как они выполняются в режиме ЕРР.
11. Как выполняется 16/32-битное обращение к регистру данных ЕРР, и
какие ресурсы при этом используются.
12. Режим ЕСР, типы циклов обмена и их особенности.
13. Особенности обмена данных в режиме ЕСР.
14. Назначение сигналов LPT-порта в режиме ЕСР.
15. Представьте диаграмму любого цикла передачи в режиме ЕСР.
16. Отличие циклов прямой и обратной передачи в режиме ЕСР.
17. Как задаются режимы работы LPT-порта и особенности реализации
каждого режима.
18. Программная модель адаптера LPT-порта в режиме ЕРР. Назначение
дополнительных регистров.
19. Как выполняется согласование режимов адаптеров LPT-порта и
периферийного устройства.
20. Назначение и структура байта расширяемости.
235
3 Внешние интерфейсы
3.3. Универсальная последовательная шина USB
USB (Universal Serial Bus - универсальная последовательная шина)
является промышленным стандартом расширения архитектуры PC,
ориентированным на интеграцию с телефонией и устройствами бытовой
электроники (спецификация версии 1.0 опубликована в январе 1996 года).
USB - кабельная шина, которая поддерживает обмен данных между хост
компьютером и одновременно подключенными периферийными
устройствами. Присоединенные периферийные устройства совместно
используют пропускную способность USB через маркерный метод доступа.
Шина позволяет присоединять, конфигурировать, использовать, и
отсоединять периферийные устройства, в то время как хост и другие
периферийные устройства находится в работе. Архитектура USB
определялась следующими критериями:
- легко реализуемое расширение периферии PC;
- дешевое решение, поддерживающее скорость передачи до 12 Мбит/с;
- полная поддержка в реальном времени передачи аудио- и сжатых
видеоданных;
- гибкость протокола для смешанной .передачи изохронных данных и
асинхронных сообщений;
- интеграция в технологию выпускаемых устройств;
- доступность в ПК всех конфигураций и размеров;
- обеспечение стандартного интерфейса для новых типов периферийных
устройств;
- простота кабельной системы и подключений;
- самоидентифицирующаяся периферия, автоматическая связь устройств
с драйверами и конфигурирование;
- возможность динамического подключения и реконфигурирования
периферии.
С середины 1996 года многие фирмы выпускают PC со встроенным
контроллером USB, реализуемым чипсетом системной платы.
33.1. Архитектура и взаимодействие элементов системы USB
Архитектура USB описывается следующими определениями:
- соединения USB;
- устройства USB;
- хост USB.
Соединения USB - это способ, согласно которому устройства USB
соединяются и связываются с хостом. Сюда входят:
- топология шины;
- взаимодействие между уровнями;
236
3.3 Универсальная последовательная шина USB
- потоковые модели (способ перемещения данных в системе);
- планирование USB, которое обеспечивает общедоступную систему
связей.
На физическом уровне топология USB представляется в виде
многоуровневой звезды (см. рис. 3.5). В центре каждой звезды находится
концентратор (hub), конечная точка луча - устройство (функция). Каждый
сегмент провода - двухточечное соединение между соответствующими
элементами (хост - концентратор или функция, или концентратор - другой
концентратор или функция).
Рисунок 3.5 - Топология USB шины
У каждого хаба имеется один восходящий порт, предназначенный для
подключения к хосту или хабу верхнего уровня. Остальные порты являются
нисходящими и предназначены для подключения функций или хабов
нижнего уровня. Хаб может распознать подключение или отключение
устройств к этим портам и управлять подачей питания на их сегменты.
Каждый из этих портов индивидуально может быть разрешен или запрещен и
сконфигурирован на полную или ограниченную скорость обмена. Хаб
обеспечивает изоляцию сегментов с низкой скоростью от высокоскоростных.
Хост-контроллер управляет работой всей системы USB и интегрируется
с корневым концентратором, обеспечивающим одну или несколько точек
подключения - портов. Контроллер USB, входящий в состав чипсетов многих
современных системных плат, обычно имеет встроенный двухпортовый хаб.
Устройства USB должно иметь интерфейс USB, обеспечивающий
полную поддержку протокола USB, выполнение стандартных операций
(конфигурирование и сброс) и стандартное представление информации,
описывающей устройство. Многие устройства, подключаемые к USB, имеют
в своем составе и хаб и ’’функции’1. Логически устройство, подключенное к
237
3 Внешние интерфейсы
любому хабу и сконфигурированное, может рассматриваться как
непосредственно подключенное к хост-контроллеру.
"Функции" представляют собой устройства USB, способные передавать
или принимать данные или управляющую информацию по шине. Типично
"функции” представляют собой отдельные периферийные устройства.
Примерами "функций0 являются:
- указатели - мышь, планшет, световое перо;
- устройства ввода - клавиатура или сканер;
- устройство вывода - принтер, цифровые звуковые колонки;.
- телефонный адаптер ISDN.
Однако физически в одном корпусе может быть и несколько "функций"
со встроенным хабом, обеспечивающим их подключение к одному порту.
Эти комбинированные устройства для хоста являются хабами с постоянно
подключенными устройствами-"функциями".
Каждая "функция” предоставляет конфигурационную информацию,
описывающую его возможности и требования к ресурсам. Перед
использованием "функция” должна быть сконфигурирована хостом - ей
должна быть выделена полоса в канале и выбраны специфические опции
конфигурации.
Уровни взаимодействия. Система USB разделяется на три уровня с
определенными правилами взаимодействия (аналогично семиуровневой
модели OSI). Устройство USB делится на интерфейс, логическое устройство
и функциональную часть. Хост тоже делится на интерфейсную, системную и
ПО устройства. Каждая часть отвечает только за определенный круг задач,
логическое и физическое взаимодействие между ними показано на рис. 3.6.
В рассматриваемую структуру входят следующие элементы:
- Физическое устройство USB - периферийное устройство на шине,
выполняющее функции, интересующие конечного пользователя.
- Клиентское ПО - программное обеспечение, соответствующее
конкретному устройству, исполняемое на хост-компьютере. Оно может
являться составной частью ОС (например, поддержка принтера) или
специальным драйвером.
- Системное ПО - системная поддержка USB операционной системой,
независимая от конкретных устройств и клиентского ПО.
- Хост контроллер USB - аппаратные и программные средства,
обеспечивающие подключение устройств USB к хост-компьютеру.
Физический интерфейс. Информационные сигналы и питающее
напряжения 5 В передаются по четырех-проводному кабелю, максимальная
длина сегмента кабеля 5м. Для сигнала используются дифференциальный
способ передачи по двум проводам D+ и D-. Кроме дифференциального
приемника, каждое устройство имеет и линейные приемники сигналов D+ и
D-, а передатчики этих линий управляются индивидуально. Это позволяет
238
3.3 Универсальная последовательная шина USB
различать множество состояний линии, используемых для организации
аппаратного интерфейса. Состояния DiffO и Diffl определяются по разности
потенциалов на линиях D+ и D- более 200 мВ при условии, что на одной из
них потенциал выше порога срабатывания VSE-. Состояние, при котором на
обоих входах D+ и D- присутствует низкий уровень, называется линейным
нулем. Интерфейс определяет следующие состояния:
- Data State - состояния передаваемого бита;
- Idle State - пауза на шине;
- Resume State - сигнал "пробуждения** для вывода устройства из
"спящего" режима.
Уровни сигналов передатчиков в статическом режиме должны быть
ниже 0,3 В (низкий уровень) или выше 2,8 В (высокий уровень). Передатчики
должны иметь возможность перехода в высокоимпедансное состояние для
обеспечения двунаправленной полудуплексной передачи данных по одной
паре проводов.
Хост
Устройство
----Логическая связь <
Физическая связь
Рисунок 3.6 - Трехуровневая модель взаимодействия компонент USB
USB поддерживает присоединение и отсоединение устройств в любой
момент времени. При запуске ПК, после сброса, а также при изменениях в
физической топологии шины хост выполняет переномерация USB
(идентификация и адресация устройств, присоединенных к шине).
Концентраторы по уровням электрических сигналов D+ и D-
определяют состояния своих нисходящих портов (присоединено или удалено
устройство) и при изменении состояния уведомляет хост. Хост делает запрос
к концентратору, чтобы определить причину уведомления. Концентратор
отвечает, определяя используемый порт, к которому присоединено
устройство USB. Хост подключает порт и адресует устройство USB с
239
3 Внешние интерфейсы
каналом управления, используя заданный по умолчанию адрес USB. Когда
устройство отключается от одного из портов, концентратор автоматически
отключает порт и сообщает об удалении устройства на хост. Затем хост
удаляет знание относительно устройства USB из всех своих структур данных.
Если удаленное устройство USB - концентратор, процесс удаления
должен выполниться для всех устройств USB, которые были предварительно
присоединены к концентратору. Если удаленное устройство USB - функция,
уведомления об удалении посылаются заинтересованному программному
обеспечению хоста.
Для передачи данных между источником или адресатом на хосте и
устройством формируется логический канал передачи данных. Имеются два
типа каналов: поток и сообщение. Поток данных не имеют никакой
структуры определенной USB, а сообщения имеют. Каналы появляются при
конфигурировании устройств. Один канал сообщения (канал управления 0),
всегда существует для каждого включенного устройства, чтобы обеспечить
доступ к конфигурации устройства, его состоянию, и управляющей
информации.
Вся пропускная способность USB шины распределяется среди
множества различных потоков данных (каналов) путем составления
расписания транзакций на хосте.
Конечная точка - уникально идентифицируемая часть устройства USB,
которая является конечным пунктом назначения потока связи между хостом
и устройством. Каждое логическое устройство USB состоит из набора
независимых конечных точек. Программное обеспечение может связываться
с устройством USB только через одну или более конечных точек. Каждое
логическое устройство имеет уникальный адрес, назначенный системой во
время присоединения устройства. Каждая конечная точка на устройстве
имеет номер конечной точки (разные режимы работы устройства задаются
разными номерами конечной точки).
Поэтому USB канал является соединением между конечной точкой на
устройстве и программным обеспечением на хосте.
Логическая связь между хостом и устройством на верхнем уровне
(уровень функций) задается пучком каналов с распределением пропускной
способности и расписанием транзакций.
Логическая связь на среднем уровне (уровень устройства) задается
каналом между ПО хоста и конечной точкой устройства.
Для обеспечения логических связей, возможностей повторных передач,
согласования быстродействия и др., на обеих сторонах каналов организуются
буферы данных.
Физический канал нижнего уровня (уровень интерфейса) обеспечивает
передачу пакетов с помощью синхронной последовательной связи.
240
3.3 Универсальная последовательная шина USB
При преобразовании байта данных (а также адресной и служебной
информации) в последовательный код (на сдвиговом регистре), биты
посылаются в шину младшими разрядами вперед (Ь0...Ь7). При передаче по
шине применяется NRZI кодирование с вставкой бит-стаффинга.
При кодировании NRZI, единичные биты не меняют значения
дифференциального сигнала, а каждый нулевой бит приводит к изменению
сигнала на противоположный (различают J состояние - высокий уровень и К
состояние - низкий уровень). Строка нулей заставляет NRZI данные
переключать во время передачи каждого бита. Строка единиц вызывает
длительные периоды без переходов в данных.
Чтобы гарантировать самосинхронизацию данных, вставка бит
использована передающим устройством при посылки пакета в USB. Ноль
вставляется после каждых шести последовательно идущих единиц в потоке
данных прежде, чем данные закодированы NRZI, чтобы вынудить переход в
потоке данных NRZI не реже, чем время передачи семи бит.
Приемник выполняет обратную процедуру удаления бит-стаффинга.
Все пакеты имеют разделители начала (SOP) и конца (ЕОР) пакета.
Началом пакета является байт синхронизации (поле SYNC), а концом пакета
- состояние шины Idle (пауза на шине) больше определенного порога.
Поле SYNC появляется в шине после состояния Idle и представляет
собой двоичную строку "KJKJKJKK" в NRZI кодировке (80h в обычной
кодировке). Оно используется входной схемой для настройки синхронизации.
Последние два бита в поле SYNC - это маркер, который используется, для
идентификации начала пакета. Все последующие биты в пакете должны
отсчитываться от этой точки.
33.2. Типы передач и форматы передаваемой информации
Архитектура USB включает в себя четыре базисных типа передач
данных:
- передачи управляющей информации, которая используется для
конфигурации устройства во время присоединения и может использоваться
другим устройством для специфических целей;
- передачи данных типа Bulk, генерируются или используются при
относительно больших объемах информации. Выполняется контроль
правильности приема с возможностью повторных передач;
- передачи типа прерывания (короткие сообщения в несколько байт -
введенный символ или координаты указателей) с подтверждением приема за
лимитированное время;
- изохронные или потоковые передачи данных в реальном времени,
которые занимают заранее оговоренную пропускную способность USB
шины. В данном типе передачи не поддерживается механизм подтверждения
241
3 Внешние интерфейсы
правильности приема и повторных передач. Данные передаются с
допустимым уровнем ошибок. Типичными данными изохронных передач
является передача оцифрованных звуковых сигналов.
Клиентское программного обеспечения обычно запрашивает передачу
данных в канале с помощью пакетов запроса ввода/вывода (IRPs) и затем или
ждет или сообщает что они завершены.
Потоки в каналах поставляют данные как часть пакета данных
транзакций шины не приводя содержание данных к структуре требуемой
USB. Данные поступившие в один конец потока в канале, выходят с другой
стороны в том же самом порядке (FIFO). Потоки в каналах - всегда
направлены в одну сторону. Потоки в канале поддерживают следующие типы
передачи bulk, изохронный, и прерывания.
Каналы сообщений взаимодействуют с конечной точкой не так, как
потоки в каналах. Сначала, хост посылает запрос устройству USB. Этот
запрос сопровождается передачей(ами) данных в соответствующем
направлении. После этого считывается состояние, являющееся ответом от
конечной точки.
Чтобы разместить образец запроса/данных/состояния, каналы
сообщений делают поток связи структурированным, что позволяет командам
быть достоверно переданными и идентифицированными.
Каналы сообщений позволяют потоку связи иметь два направления.
Создаваемый по умолчанию канала с конечной точки 0, является всегда
каналом сообщений.
Обмен информацией во всех отмеченных выше типах передач
выполняется пакетами. Возможные типы пакетов приведены в табл. 3.9.
Таблица 3.9 - Типы пакетов (РЮ)
Тип PID Имя PID PHX3-0) Описание
Маркер OUT 0001b Адрес + номер конечной точки иа хосте (транзакция функции)
IN 1001b Адрес + номер конечной точки иа функции (транзакция хоста)
SOF 0101b Маркер начало кадра и номер кадра
SETUP 1101b Адрес + номер конечной точки на хосте (транзакция функции для установки в конечную точку управления)
Данные DATAO 0011b Четный пакет данных
DATA1 1011b Нечетный пакет данных
Квитиро- ванне ACK 0010b Подтверждение правильного приема пакета данных
NAK 1010b Rx устройство не может принимать данные, или Тх устройство не может посылать данные
STALL 1110b Конечная точка остановлена
Специ- альный PRE 1100b Преамбула хоста. Разблокировка трафика вниз по иерархии шнны к низко - скоростным устройствам
242
3.3 Универсальная последовательная шина USB
Тип пакета определяется первым байтом пакета (идентификатором
пакета - PID), который следует непосредственно за полем синхронизации (см.
выше) каждого пакета USB. Для надежного декодирования PID, тип пакета
задается разрядами 3 - 0, а разряды 7 - 4 (поле проверки) содержат их
инверсию. Следует отметить, что при преобразовании в последовательный
код на сдвиговом регистре все байты пакета (включая PED) посылаются в
линию младшими разрядами вперед (первым передается нулевой бит,
последним - седьмой). Любой PID, полученный с ошибочным полем
проверки или который декодируется к неопределенному значению, считается
поврежденным и игнорируется весь пакет.
Пакеты разделены на четыре кодовые группы: маркер, данные,
квитирование, и специальные, каждая группа определяется двумя младшими
разрядами (передаются в линию первыми). Структура пакетов приведена на
рис. 3.7.
8 бнт 7 бит 4 бита 5 бит
I РЮ I ADDR | ENDP | CRC
а) маркерные пакеты (IN, OUT и SETUP)
8 бит
| PID
11 бит 5 бнт
Frame Numer I CRC
б) маркерный пакет SOF
8 бнт 0 - 1623 бита 16 бит
PID | РАТА | CRC
в) пакет данных
8 бит
PID
г) пакеты квитирования и специальные
Рисунок 3.7 - Структура пакетов USB
Назначение полей следующее:
- PID - идентификатор пакета (см. выше);
- ADDR - адрес функции,, которая является или источником или
приемником пакета данных, в зависимости от значения маркера PID. После
сброса и включения питания, адреса функции устанавливается по умолчанию
в 0 и должны программироваться хостом в течение процесса переномерации;
- ENDP - номер конечной точки, который обеспечивает более гибкую
адресацию функций, в которых требуется более одного подканала. Номера
конечных точек зависят от функции. Все функции должны поддерживать
одну управляющую нулевую конечную точку. Низко-скоростные устройства
поддерживают два номера конечной точки для каждой функции. Полно -
скоростные функции могут поддерживать до 16 конечных точек;
- CRC - циклические контроли по избыточности (CRC) используются
для защиты всех полей кроме PID в маркерах и пакетах данных. В данном
243
3 Внешние интерфейсы
контексте, эти поля рассматривается как защищенные поля. PID не входит в
проверку CRC пакета. Все CRC сгенерированы для соответственно своих
полей в передатчике прежде, чем выполняется вставка бит. Точно так же
CRC декодируются в приемнике после того, как были удалены вставленные
биты. CRC маркера и пакета данных обеспечивают исправление всех
одиночных и выявление двойных ошибок в защищенных полях пакета.
Схемы контроля CRC на основе сдвиговых регистров и сумматоров по
модулю 2 излагаются в соответствующем курсе и здесь не рассматриваются.
Для маркеров предусмотрено пяти-битное поле CRC с образующим
полиномом:
G(X) = Xs + X2 + 1.
Пакеты данных используют 16-битный полином (и соответствующее
поле CRC):
G(X) = X16 + X15 + Х2+ 1;
- Frame Numer - поле номера кадра представляет собой 11 - битное поле,
которое инкрементируется хостом в каждом кадре. Поле номера кадра
отсчитывается заново с нуля после достижения максимального значения
7FFh, и посылается только для SOF маркеров в начале каждого кадра;
- DATA - поле данных может быть длиной от 0 до 1023 байт и должно
содержать целое число байт. Размер поля данных изменяется в соответствии
с типом передачи.
Рассмотрим назначение пакетов и особенности их передачи.
Маркерные пакеты (IN, OUT или SETUP) служат для организации
каналов и задают тип транзакций. Маркер состоит из PID, и полей ENDP и
ADDR. Для транзакций OUT и SETUP, поле адреса и конечной точки
однозначно определяет конечную точку, которая получит последующий
пакет данных. Для входной (IN) транзакции, эти поля однозначно
определяют конечную точку, которая должна передать пакет данных. Только
хост может выдавать маркерные пакеты.
Пакеты начала кадра (SOF) выдаются хостом с номинальной скоростью
каждую микросекунду. Пакеты SOF состоят из РЮ определяющего тип
пакета, за которым следует 11 - битное поле номера кадра.
Пакеты SOF генерируются в точно определенных интервалах, и
сообщают всем функциям две части временной информации (начало кадра и
номер кадра). Все полно-скоростные функции, включая концентраторы,
должны получить и декодировать пакет SOF.
244
3.3 Универсальная последовательная шина USB
Пакеты данных состоят из PID, поля данных, и CRC (см. рис. 3.7). Есть
два типа пакетов данных, определяемых разными РГОами (DATA0 и
DATA1). Два типа пакетов данных необходимы для поддержки
синхронизации переключателя данных. При передаче данных по каналу
сообщений гарантируется достоверная передача пакетов данных, для чего
передача каждого пакета подтверждается ответным пакетом квитирования
(правильный или неправильный прием) и в случае неправильного приема
выполняется повторная передача. Первым передается пакет типа DATA0, и
при повторных передачах передается тот же тип пакета. После успешного
приема переключается тип пакета (DATA1), с которым выполняются
аналогичные действия (передача и подтверждение приема). Следующий
пакет имеет тип DATA0 и т.д. Чередование типов для четных и нечетных
пакетов при возможных повторных передачах позволяет приемнику
однозначно идентифицировать принимаемые пакеты. При потоковых
изохронных передачах, в которых нет подтверждения приема и повторных
передач, все пакеты данных имеют тип DAT АО.
Пакеты квитирования и специальные являются однобайтными и состоят
только из РШ. Пакеты квитирования используются, для сообщения
состояния транзакции данных, и могут возвращать значения, означающие
успешный прием данных, управление потоком данных, и условие останова.
Возвращать квитирование может только такой тип транзакций, который
поддерживает управление потоком данных. Квитирования всегда
возвращаются в фазе транзакции квитирования и могут быть возвращены,
вместо данных, в фазе данных.
Все рассмотренные выше пакеты должны разграничиваться ЕОР. Если
пакет декодирует как допустимый, но не завершается ЕОР после известной
для каждого типа пакетов длины (три байта для маркеров, один байт для
квитирования), он рассматривается как недопустимый и игнорируется
приемником.
Все передачи транзакций шины включают до трех пакетов. Каждая
транзакция начинается, когда хост контроллер, по расписанию, посылает
USB пакет, описывающий тип и направление транзакции, адрес устройства
USB, и номер конечной точки (маркерный пакет). Устройство USB, к
которому адресовано сообщение самостоятельно идентифицируется,
декодируя соответствующие поля адреса. В данной транзакции, данные
переданы или с хоста на устройство или с устройства на хост. Направление
передачи данных определено в маркерном пакете. Источник транзакции
затем посылает пакет данных или сообщает, что больше нет никаких данных
245
3 Внешние интерфейсы
для передачи. Адресат в общем случае посылает пакет квитирования,
который показывает, была ли передача успешной.
Расписание посылок транзакций позволяет управлять потоком данных
для некоторых режимов потоков в канале. На аппаратном уровне, это
предотвращает такие ситуации буфера как обнуление или переполнение,
используя NACK квитирование, чтобы уменьшить скорость передачи
данных. Механизм управления потоком данных разрешает создание гибких
расписаний, которые согласовывают параллельное обслуживание
гетерогенной смеси режимов потоков в канале. Таким образом, множество
режимов потока в канале могут обслуживаться в различные интервалах и
содержать пакеты_различных размеров.
3.33. Контрольные вопросы
1. Особенности архитектуры и характеристики USB.
2. Топология шины USB и назначение элементов.
3. Назначение и характеристики хост-контроллера.
4. Назначение и характеристики концентратора.
5. Назначение и характеристики ’’функций" и устройств.
6. Уровни взаимодействия системы USB.
7. Организация физического интерфейса.
8. Организация логических каналов передачи данных.
9. Что такое конечная точка, и сколько конечных точек может содержать
устройство.
10. Организация связи на верхнем (функциональном) уровне.
11. Организация синхронной последовательной связи в физическом
канале (NRZI кодирование с вставкой бит-стаффинга).
12. Общая структура пакетов. Признаки начала и конца пакетов.
13. Типы передач данных и их организация.
14. Типы передаваемых пакетов и их назначение.
15. Структура маркерных пакетов. Назначение полей.
16. Структура пакетов начала кадра. Назначение полей.
17. Структура пакетов данных. Назначение полей.
18. Зачем определены два типа пакетов данных и как они используются.
19. Структура и назначение пакетов квитирования.
20. Какие виды контроля передачи используются в USB.
21. Организация транзакций шины и управление потоком данных.
246
Шина SCSI
3.4. Шина SCSI
Системный интерфейс малых компьютерных систем SCSI (Small
Computer System Interface) был стандартизован ANSI в 1986 году. В
современных ПК интерфейс предназначен для внешнего подключения
устройств различных классов (жестких магнитных дисков, сменных
носителей, стриммеров, оптических дисков, принтеров, сканеров,
коммуникационных устройств). Устройства подключаются в цепочку друг за
другом. Первое устройство подключается к интерфейсу SCSI на главном
компьютере, второе - к первому и т. д. Первое и последнее устройства в
цепочке должны были быть терминированы. Устройства идентифицируются
с помощью перемычек или переключателей, при этом адаптеру шины на
хосте присваивается максимальный номер, дающий наивысший приоритет
при доступе к шине.
Хост-адаптер связывает шину SCSI внутренней системной шиной
компьютера. С точки зрения шины все устройства могут быть
равноправными и являться как инициаторами обмена (ИУ), так и целевыми
устройствами (ЦУ), однако чаще всего в роли ИУ выступает хост-адаптер.
Каждое ЦУ может содержать до 8 независимо адресуемых логических
устройств (ЛУ) со своими номерами LUN (Logical Unit dumber),
представляющих ПУ или их части.
Первая спецификация SCSI-1 является 8-битной параллельной шиной с
тактовой частотой 5 МГц. Шина допускает подключение до 8 устройств,
скорость передачи данных - 5 Мбайт/с.
Спецификация SCSI-2, расширяет возможности шины. Тактовая частота
шины Fast SCSI-2 достигает 10 МГц, a Ultra SCSI-2 - 20 МГц. Разрядность
данных может быть увеличена до 16 бит - эта версия называется Wide SCSI-2
(широкий). 16-битная шина допускает 16 устройств. Введена поддержка
цепочек команд (до 256 команд). К асинхронному режиму добавлена
возможность передачи данных в синхронном режиме.
SCSI-3 - дальнейшее развитие стандарта, направленное на увеличение
скорости передачи, количества подключаемых устройств, расширение
системы команд и поддержку РпР. Кроме увеличения частоты передачи
применяется двойная синхронизация (по переднему и заднему фронту
синхросигнала). Наряду с параллельным интерфейсом SPI (SCSI-3 Parallel
Interface), возможно применение последовательного интерфейса, в том числе
волоконно-оптического со скоростью 100 Мбайт/с.
Первичный набор общих команд SCP - SCSI-3 Primary Commands для
устройств различных классов дополняется набором команд
соответствующего класса устройств (SBC - SCSI-3 Block Commands - для
устройств прямого доступа, SSC - SCSI-3 Stream Commands - для устройств
последовательного доступа, SGC - SCSI-3 Graphic Commands - для принтеров
247
3 Внешние интерфейсы
и сканеров, SMC - SCSI-3 Medium Changer Commands - для устройств на
сменных носителях, SCC - SCSI-3 Controller Commands - для хост-
контроллеров.
На транспортном уровне используются различные протоколы с
соответствующей поддержкой физических соединений (SPI - SCSI Parallel
Interface - параллельный интерфейс, SIP - SCSI-3 Interlocked Protocol -
протокол обмена интерфейса SPI, FCP - Fibre Channel Protocol - протокол
оптоволоконного канала, SBP - Serial Bus Protocol - протокол
последовательной шины, GPP - Generic Packetized Protocol - обобщенный
пакетный протокол, реализуемый любым пакетным интерфейсом, SSP - Serial
Storage Protocol - последовательный протокол памяти, реализованный на
архитектуре последовательной памяти SSA - Serial Storage Architecture).
Для параллельных шин скорость передачи данных определяется
частотой передач и разрядностью. Комбинации частоты и разрядности
обеспечивают широкий диапазон пропускной способности, достигающей на
момент написания пособия 320 Мбайт/с. при 16 - разрядной шине
(спецификация Ultra320SCSI). При этом длина шины достигает 12м.
Последовательный интерфейс Fibre Channel, занимает промежуточное
положение между интерфейсами периферийных устройств (SCSI-3) и
технологиями локальных сетей. Этот интерфейс может иметь как
электрическую (коаксиальный кабель), так и оптоволоконную реализацию. В
обоих случаях частота 1 Ггц обеспечивает скорость передачи данных
100 Мбайт/с. Медный кабель допускает длину шины до 30 м, оптический - до
10 км. Здесь используется иной протокольный и физический уровни
интерфейса и имеется возможность подключения к шине до 126 устройств (а
не 8 или 16, как для параллельного интерфейса).
В настоящее время наибольшее распространение имеют устройства
SCSI-2 и SCSI-3 с параллельным интерфейсом, которые сохраняют
совместимость с исходной версией SCSI-1.
3.4.1. Физический интерфейс SCSI
Физически параллельный SCSI представляет собой шину, состоящую из
сигнальных и питающих цепей. Для защиты от помех каждая сигнальная
цепь имеет свой отдельный обратный провод. На применяемых двухрядных
разъемах контакты сигнальных и обратных цепей располагаются друг против
друга. Это позволяет применять в качестве кабелей как витые пары проводов,
так и плоские ленточные кабели, где сигнальные и обратные провода
чередуются.
По типу сигналов различают линейные и дифференциальные версии
SCSI. Их кабели и разъемы идентичны, но электрической совместимости
устройств нет. Символические обозначения для разных версий приведены на
248
Шина SCSI
рис. 3.8.
В линейной версии SE (Single Ended) каждый сигнал передается
потенциалом с ТТЛ-уровнями относительно общего провода. Здесь общий
(обратный) провод для каждого сигнала тоже должен быть отдельным, что
снижает перекрестные помехи.
Дифференциальная версия для каждой цепи задействует пару
проводников, по которым передается парафазный сигнал.
Дифференциальный интерфейс (реализация LVD - низковольтный
дифференциальный интерфейс) применяется в дисковых системах серверов, а
в обычных PC не распространен.
SCSI
а) линейная
б) дифференциальная
Рисунок 3.8 - Символические обозначения версий SCSI
В качестве шины используется плоский или круглый гибкий кабель.
Плоский кабель используется для соединения устройств, расположенных в
одном корпусе. На кабеле может быть несколько разъемов. При
необходимости кабели могут сращиваться через специальные переходные
разъемы.
Круглый кабель, состоящий из витых пар, используется для соединения
вне корпусов. ПУ внешнего исполнения обычно имеют два разъема, что
позволяет соединить их в цепочку.
Применяются следующие типы разъемов:
- ЮС-50 - разъемы для соединения внутренних устройств (аналогичные
разъемам АТА);
- СХ-50 - разъемы типа Centronics, аналогичные применяемым в
принтерах (но 50-контактные). Применяются для соединения внешних
устройств;
- DB-25 - разъемы с круглыми штырьковыми контактами в
металлическом кожухе D-образной формы. Применяются на некоторых
внешних устройствах (например, Zip).
- HD-50 - разъемы со штырьковыми контактами в металлическом
кожухе D-образной формы, с высокой плотностью контактов.
- HD-68 - аналогичные HD-50, но с 68 контактами (разъемы SCSI-3).
- VHDCI-68 - внешние разъемы с особо высокой плотностью.
249
3 Внешние интерфейсы
- МСХ (Micro-centronics) - разъемы в стиле Centronics, но в
миниатюрном варианте.
- SCA (Single Connector Attachment) - разъем для подключения
устройства одним разъемом. Предназначен для подключения дисков,
устанавливаемых в шасси с возможностью "горячей” замены.
Кроме интерфейсных сигналов, на разъем выводятся шины питания, а
также сигналы конфигурирования устройства. На боковых направляющих
имеются дополнительные контакты заземления. Конфигурационные
джамперы устанавливаются не на устройстве, а на шасси (или плате
адаптера).
На концах кабелей обязательно устанавливаются терминаторы,
согласованные по импедансу с кабелем (для предотвращения отражения
сигналов от концов кабеля). По исполнению терминаторы могут быть
внутренние (размещенные на печатной плате устройства) и внешние
(устанавливаемые на разъемы кабеля или устройства).
3.4.2. Адресация устройств и передача данных
Каждое устройство SCSI, подключенное к шине, должно иметь свой
уникальный адрес, назначаемый при конфигурировании. Для 8-битной шины
диапазон значений адреса 0-7, для 16-битной - 0-15. Адрес задается
предварительной установкой переключателей или джамперов. Для хост-
адаптера возможно программное конфигурирование. Адрес определяет номер
той линии шины данных, которая осуществляет выборку данного устройства.
Для ИУ значение идентификатора определяет приоритет устройства при
использовании шины, наибольший приоритет имеет устройство с большим
значением адреса.
Типы периферийных устройств. Каждое логическое устройство (ЛУ),
являющееся абонентом шины SCSI, относится к одному из
стандартизованных типов ПУ (см. табл. 3.10). Сложное ПУ может
представляться несколькими ЛУ SCSI. По характеру обмена данных
устойства разделяются на 2 класса - блочные с типами 0, 4, 5, 7 и не блочные
с типами 1,2,3, 9.
Устройства прямого доступа (0) сохраняют блоки данных. Каждый
блок хранится по уникальному логическому адресу LBA. Типичный пример
устройств прямого доступа - накопитель на магнитных дисках (винчестер).
Винчестер с интерфейсом SCSI не имеет собственной трехмерной
логической геометрии. В соответствии с системой команд SCSI доступ к его
секторам выполняется только по линейному логическому адресу LB А.
Устройства прямого доступа могут не иметь подвижных носителей, а
основываться на памяти разной природы: SRAM, DRAM, FRAM, EEPROM,
флэш-память.
250
Шина SCSI
Устройства последовательного доступа (1) имеют ряд особенностей,
связанных с их принципом действия. Носитель представляет собой
магнитную ленту с многодорожечным, серпантинным или наклонно-
строчным типом записи. Носитель всегда сменяемый, с некоторым
конструктивным обрамлением (катушка, картридж), также называется томом.
Том имеет начало носителя BOM (beginning-of-medium) и конец носителя
ЕОМ (end-of-medium). При записи НУ должен заранее знать о приближении
конца носителя, для чего определяется позиция раннего предупреждения EW
(Early Warning) с соответствующим маркером. Это позволяет после записи
блока данных из буфера поместить на носитель соответствующий концевой
маркер.
Таблица 3.10 - Стандартные типы периферийных устройств
OOh Direct-access device - устройства прямого доступа (накопители на магнитных дисках)
Olh Sequential-access device - устройства последовательного доступа (накопители на магнитных лентах)
02h Printer device - принтеры
03h Processor device - процессоры (устройства обработки данных)
04b Write-once device - устройства однократной записи (некоторые оптические диски)
05h CD-ROM device - накопители CD-ROM
06h Scanner device - сканеры
07h Optical memory device - устройства онтической памяти
08h Medium Changer device - устройства смены носителей (jukebox)
09h Communications device - коммуникационные устройства
OAh-OBh Graphic Arts Pre-Press Devices - высококачественные устройства печати
OCh Array controller device - контроллеры массивов накопителей
ODh Enclosure services device - сервисные устройства шкафов
OEh Reduced block command devices - блочные устройства с сокращенным набором команд
OFh Optical card reader/writer device - устройства считывания и записи оптических карт (штрих-коды)
1 Oh-1 Eh Зарезервировано
IFh Неизвестный тип или устройство отсутствует
Принтеры (2), подключаемые через интерфейс SCSI, не требуют особых
команд для управления, поскольку функции реализуются через поток
передаваемых данных.
Процессорными устройствами (3) в терминологии SCSI являются
источники и потребители пакетов информации. Примерами процессорных
устройств являются компьютеры, обменивающиеся сообщениями
односторонним или двусторонним образом.
Устройства оптической памяти (7) близки к устройствам прямого
доступа со сменными носителями, но имеют ряд характерных особенностей.
251
3 Внешние интерфейсы
Большая емкость носителя вызывает необходимость применения команд с
12-байтным дескриптором.
Устройства однократной записи (4), обычно оптические, отличаются
невозможностью перезаписи ранее записанного блока.
Накопители CD-ROM (5) предназначаются для работы с CD.
Сканеры (6) передают ИУ данные, описывающие растровое
изображение сканируемого объекта. Команды позволяют задавать окна
сканирования, определяя в них режим и разрешение.
Устройства смены носителей (8) предназначены для автоматического
манипулирования сменными носителями - дисками и картриджами с
магнитными лентами.
Коммуникационные устройства (9) предназначены для обмена
информацией с устройствами через внешнюю, по отношению к шине SCSI,
среду передачи данных.
Передача данных. В любой момент обмен информацией по шине может
происходить только между парой устройств. Операцию начинает инициатор
обмена ИУ, а целевое устройство ЦУ ее исполняет. ИУ выбирает ЦУ по его
идентификатору. Чаще всего роли устройств фиксированы: хост-адаптер
является инициатором (ИУ), а периферийное.устройство - целевым (ЦУ).
Информация по шине данных передается побайтно (пословно)
асинхронно, используя механизм запросов (REQ) и подтверждений (АСК).
Каждый байт контролируется на нечетность (кроме фазы арбитража), но
контроль может быть выключен. Интерфейс имеет возможность синхронной
передачи данных.
Шина может находиться в одной из следующих фаз:
- покой (Bus Free) - шина находится в состоянии покоя;
- арбитраж (Arbitration) - устройство может получить право на
управление шиной. Дождавшись покоя шины (Bus Free), устройство вводит
сигнал запроса и свои идентификатор. Если идентификаторы выставили
несколько устройств одновременно, то право на управление шиной получает
устройство с наибольшим адресом, а остальные устройства отключаются до
следующего освобождения шины. Устройство, выигравшее арбитраж,
переходит в фазу Selection или Reselection;
- выбор ИУ (Selection) - ИУ, выигравшее арбитраж, вводит на шину
данных результат логической функции ИЛИ от пары идентификаторов -
своего и ЦУ, сопровождая его битом паритета. Адресованное ЦУ отвечает,
если запрос корректный. Если за заданное время ЦУ не ответило,
срабатывает тайм-аут, ИУ освобождает шину;
- повторный выбор (Reselection) - аналогичная предыдущей, но ее
вводит ЦУ в том случае, когда ЦУ на время исполнения команды
отключалось от шины. По завершении внутренней операции это устройство,
выиграв арбитраж, будет вызывать программу, с которой ранее начата
252
Шина SCSI
операция. Условия ответа и тайм-аут аналогичны предыдущей фазе;
- в фазах передачи данных (Data OUT, Data IN), команд (Command),
состояния (Status) и сообщений (Message OUT, Message IN) по шине данных
передается информация, фазы идентифицируются соответствующими
сигналами, которыми управляет ИУ.
В асинхронном обмене передача каждого байта сопровождается
взаимосвязанной парой сигналов REQ#/ACK#. При передаче от ИУ к ЦУ
(Data OUT), ИУ сопровождает каждый байт данных стробом REQ#, а ЦУ
фиксирует принимаемые данные по отрицательному перепаду сигнала REQ#
и подтверждает правильность приема сигналом АСК#. ИУ считает
переданные данные действительными по отрицательному перепаду
принятого сигнала АСК#, и начинает новый цикл обмена. При передаче от
ЦУ к ИУ (Data IN), назначение сигналов меняется (ACK# - строб, REQ# -
подтверждение). Асинхронный обмен поддерживается всеми устройствами
для всех фаз передачи информации.
1/0#
DB# ------( DO У
Рисунок 3.9 - Временные диаграммы асинхронного обмена
(DO - данные от ИУ, DI - данные от ЦУ)
Фазы передачи данных Data OUT и Data IN могут выполняться и в
синхронном режиме обмена. При согласовании синхронного режима
определяются минимальные длительности и периоды управляющих
импульсов ACK# и REQ#, а также допустимое отставание подтверждений от
запросов. ИУ передает серию данных, сопровождаемых стробами REQ#, в
темпе, ограниченном установленными временными параметрами. ЦУ
фиксирует принимаемые данные по отрицательному перепаду сигнала REQ#,
но отвечать на них сигналом ACK# может с некоторым опозданием. Как
только отставание числа принятых сигналов ACK# от числа посланных REQ#
достигнет оговоренного предельного значения, ИУ приостановит обмен до
прихода очередного подтверждения АСК#. Операция будет считаться
завершенной, когда число принятых подтверждений совпадет с числом
посланных запросов.
Каждый процесс ввода/вывода состоит из следующей
253
3 Внешние интерфейсы__________________________________________________
последовательности фаз шины: из состояния Bus Free через фазу Arbitration
переход к фазе Selection или Reselection. Далее следуют фазы передачи
информации (Command, Data, Status, Message). Завершающей фазой является
Message In, в которой передается сообщение Disconnect или Command
Complete (см. ниже) после чего шина переходит в состояние покоя Bus Free.
Для каждого процесса ввода/вывода ИУ формирует текущий набор из
трех указателей, которые указывают на очередной байт передаваемой между
ИУ и ЦУ информации (для команды, данных и состояния). По сообщению от
ЦУ Save Data Pointer текущие указатели сохраняются в ИУ.
Система сообщений (Message System) служит для управления
интерфейсом. Обмен сообщениями между ИУ и ЦУ происходит в фазах
Message IN/OUT, в одной фазе может передаваться несколько сообщений.
Форматы сообщений стандартизованы; каждое сообщение начинается с кода.
Существуют однобайтные (коды 00h, 02h - IFh, 30h - FFh), двухбайтные
(коды 20h - 2Fh) и расширенные сообщения (код Olh). В двухбайтном
сообщении второй байт является аргументом сообщения. В расширенных
сообщениях второй байт задает длину, а последующие байты несут код и
аргументы сообщения. Коды сообщений приведены в табл. 3.11.
Таблица 3.11 - Сообщения шины SCSI
Код" Гн'апр, | _____ Сообщение
(^побайтные сообщения
00h In Command Complete - процесс ввода/вывода завершен, информация о
_ 02h In Save Data Pointer - сохранение указателя[ данных
_ 03h In Raton Pointers - восстановление уюззателей
04b In Disconnect-разрывается текущее соединение
04h Out Disconnect-ииструкния ЦУ «разрыв соединения^ __
05h Out МНмог Detected Error-ИУ обнаружило ошибку на шине _
06h Out Abort- сброс всех процессов и освобождение шины
07h In/Out сообщение недействительно для получателя
__ 08h Out Ao Operation - ИУ нечего ответить на запрос сообщения
09h Out Message Parity Error - последний байт сообщения принят с неверным паритетом - - —
OAh In Linked Command - цепочка команд завершена.
OBh In Linked Command - то же, но ИУ между цепочками команд вызывает прерывание в хост-системе —
OCh Out Reset- аппаратный сброс ЦУ н освобождение шины
ODh Out Ahm-t ТяйТгброс текущего процесса, н освобождение шины
OEh Out Clear Queue- сброс всех процессов н освобождение шины
OFh In/Out Initiate Recovery - сообщение для уведомления об асинхронных событиях (ЦУ временно становится ИУ)
lOh Out Release Recnverv - завершение обработки асинхронных событий ИУ
llh Out Terminate I/O Process - принудительное завершение текущего процесса без логического повреждения носителя у ЦУ
254
Шина SCSI
Окончание таблицы 3.11
Код Напр. Сообщение
12h-lFh 30h-7Fh Зарезервированы для 1-байтных сообщений
80h-FFh Out Identify - установление связи
80h-FFh In Identify - восстановление связи при повторном соединении. Вызывает восстановление сохраненных указателей
2-байтные сообщения, второй байт - аргумент (00h*FFh)
20h In Simple Queue Tag - нроцесс помещен в очередь
20h Out Simple Queue Tag - обращение к конкретному процессу маркированной очереди
21h Out Head Of Queue Tag - помещение процесса в начало маркированной очереди для данного LUN
22 h Out Ordered Queue Tag помещение нроцесса в конец маркированной очереди для данного LUN
23h In Ignore Wide Residue - последние биты переданного слова недействительны.
24h-2Fh Зарезервированы для 2-байтных сообщений
Расширенные сообщения. Первый байт - Olh, второй - длина, третий • расширенный код.
OOh In Modify Data Pointer - запрос модификация указателя данных - суммирование текущего указателя с 4-байтным аргументом сообщения
02h In/Out Synchronous Data Transfer Request - параметры синхронного режима обмена. 1-Й байт аргумента определяет период посылки, 2-й - допустимое смещение REQ/ACK
03 h In/Out Wide Data Transfer Request - разрядность передач в фазах данных. Аргумент задает число байтов: 0-1 бант, 1-2 байта, 2-4 байта
Для установления связи с конкретным логическим устройством или с
конкретной целевой программой, а также для предоставления права разрыва
соединения служат сообщения Identify. В байте их кодов биты 2-0, в
зависимости от бита 5 (LUNTAR), задают номер логического устройства
(LUNTAR4)) или программы (LUNTAR=1). Единичным значением бита 6
(DiscPriv) при передаче сообщения ИУ наделяет ЦУ правом разрыва
соединения. Разрыв соединения выполняется сообщением Disconnect.
С помощью сообщений согласуются параметры синхронного режима
(сообщение Synchronous Data Transfer Request с указанием допустимого
периода цикла и отставания REQ/АСК) и разрядность данных (сообщение
Wide Data Transfer Request). Согласованные режимы будут действовать до
сброса устройств по сообщению Bus Device Reset или "жесткого” сброса.
3.43. Система команд
Система команд SCSI включает общие команды, применимые для
устройств всех классов и специфические для каждого класса. Как общие, так
и специфические наборы команд содержат обязательные, дополнительные и
255
3 Внешние интерфейсы
фирменные команды. Любое SCSI-устройство должно поддерживать
обязательные команды общего набора и своего класса, чем обеспечивается
высокий уровень совместимости. Команда передается ИУ в ЦУ через блок
дескриптора команды, который посылается в фазе Command. Некоторые
команды сопровождаются блоком параметров, следующим за блоком
дескриптора в фазе Data. Форматы блоков стандартизованы, длина блока (6,
10 или 12 байт) определяется кодом операции (первый байт блока).
Структура блоков дескрипторов команд приведена на рис. 3.10.
76543210 76543210 76543210
0 Op Code 0 Op Code 0 Op Code
1 LUN| LBA2 1 LUN | резерв 1 LUN| резерв
2 LBA1 2 LBA3 2 LBA3
3 LBA0 3 LBA2 3 LBA2
4 Length 4 LBA1 4 LBA1
5 Control 5 LBA0 5 LBA0
6 резерв 6 Lengths
«) 7 Length! 7 Length!
8 LengthO 8 Length 1
9 Control 9 LengthO
6) 10 резерв
11 Control
в)
Рисунок 3.10- Форматы блоков дескрипторов команд
(а ~ 6 байт, б - 10 байт, в - 12 байт)
Блок содержит следующие поля:
- OpCode - код операции. Биты 7-5 определяют группу, а биты 4-0 код
команды. В группе 0 блок дескриптора имеет длину 6 байт, в группах 1 и 2 -
10 байт, в группе 5-12 байт. Группы 3 и 4 зарезервированы, группы 6 и 7
отданы на усмотрение разработчиков.
- LUN - номер ЛУ (биты 7-5 байта 1). Если для идентификации
используются сообщения Identify, то это поле игнорируется (устанавливается
LUN=0).
- LBA - адрес логического блока, 21 бит для 6-байтных блоков и 32 бита
для 10-и 12-байтных блоков. В ряде команд поле не используется.
Length - длина (количество блоков или байтов) передаваемых данных
или блока параметров. В ряде команд поле не используется.
Control - байт управления. Биты 7-6 используются по усмотрению
разработчика, биты 5-2 зарезервированы, бит 1 - Flag (при Flag=l сообщение
256
Шина SCSI
Linked Command Complete (With Flag) будет вызывать прерывания между
командами цепочки), бит 0 - Link (единичное значение служит признаком
цепочки команд).
В полях LBA и Length первыми передаются старшие байты, потом
младшие. Зарезервированные поля для совместимости с будущими
стандартами должны иметь нулевые значения.
Исполнение команды завершается в фазе Status передачей байта
состояния Status Byte. В байте состояния используются только биты 5*1,
возможные состояния приведены в табл. 3.12 (биты 7,6, 0 зарезервированы).
Таблица 3.12 - Байты состояния
Биты 76 543210 Состояние Значение
RROOOOOR Good Успешное завершение команды
RR00001R Check Condition Указание на асинхронное событие
RR00010R Condition Met Запрошенная операция выполнена
RR00100R Busy Занято (невозможен прием команды)
RR01000R Intermediate Успешное выполнение команды в цепочке
RR01010R Intermediate Condition Met Удовлетворение запрошенной операция в цепочке команд
RR01100R Reservation Conflict Попытка обратиться к ЛУ, зарезервированному другим ИУ
RR10001R Command Terminated Завершение текущего процесса но сообщению Terminate I/O Process или но асинхронному событию
RR10100R Queue Full Очередь заполнена, процесс в очередь не поставлен
Набор команд для устройств классов 0-9 приведен в Приложении Д.
Любое ЦУ SCSI-2 обязано поддерживать четыре команды: Inquiry, Request
Sense, Send Diagnostic, Test Jnit Ready. Они используются для
конфигурирования системы, тестирования устройств, а также сообщений об
ошибках и исключительных ситуациях. Команда Inquiry позволяет получить
информацию о ЛУ через стандартизованный блок данных длиной 96 байт
(тип подключенного ПУ, возможность смены носителя, поддержка 32- или
16-битного расширения, синхронного обмена, относительной адресации,
цепочек команд, очередей и уведомления об асинхронных событиях).
Выполнение команд. При выполнении одиночной команды (например
команда чтения Read), ИУ имеет активный набор указателей и несколько
сохраненных наборов, по одному на каждый из процессов. ИУ
восстанавливает указатели процесса в активный набор и, выиграв арбитраж,
выбирает ЦУ. Как только ЦУ выбрано, оно берет на себя управление
процессом. В фазе Selection ИУ вводит сигнал ATN#, сообщая о намерении
послать сообщение Identify с указанием адресуемого ЛУ. Таким образом
устанавливается связь ИУ с данным процессом и его набором указателей. ЦУ
переходит в фазу Command и принимает блок дескриптора команды.
257
3 Внешние интерфейсы
Интерпретировав команду, ЦУ переходит в фазу Data IN, передает данные,
затем переводится в фазу Status и посылает состояние Good Затем в фазе
Message IN устройство посылает сообщение Command Complete, после чего
освобождает шину (фаза Bus Free).
Если устройство, получив команду, определит, что для получения
затребованных данных необходимо много времени, оно освободит шину,
послав сообщение Disconnect. Как только требуемые данные готовы в ЦУ,
оно, выиграв арбитраж, выберет ИУ (в фазе Reselect) и в фазе Message IN
пошлет ему сообщение Identify. ИУ восстановит соответствующий набор
указателей в активный и продолжит выполнение процесса, как описано
выше. Если ЦУ хочет отсоединиться, когда часть данных уже передана
(например, головка дошла до конца цилиндра и требуется время на
позиционирование), оно посылает сообщение Save Data Pointer а затем
Disconnect. После повторного соединения передача данных возобновится с
точки, определенной последним сохраненным значением указателя. Если
произошла ошибка или исключение, ЦУ может повторить обмен данными,
послав сообщение Restore Pointers или отсоединившись без сообщения Save
Data Pointers
В случае использования цепочки команд, после успешного завершения
каждой команды, ЦУ автоматически переходит к исполнению следующей.
Все команды цепочки адресуются к одной и той же связи и являются частью
одного процесса. Команды не являются полностью независимыми - при
использовании бита относительной адресации последний блок, адресованный
предыдущей командой, доступен для следующей (например команда Search
Data находит на диске требуемый блок, а связанная с ней команда чтения
Read читает этот блок или блоки с указанным смещением относительно
найденного. По выполнении связанных команд ЦУ посылает сообщения
Linked Command Complete (возможно, с флагом), а ИУ обновляет набор
сохраненных указателей (указывают на очередную команду цепочки).
Команды могут исполняться с использованием очередей. ЦУ могут
поддерживать немаркированные и маркированные очереди. Поддержка
немаркированных очередей, определенная еще в SCSI-1, позволяет любому
ЛУ (LUN) или целевой программе (TRN), занятым процессом от одного ИУ,
принимать команды (начинать процесс) с другими ИУ. Маркированные
очереди определены в SCSI-2 для ЛУ (LUN, но не TRN). Для каждой связи
существует своя очередь размером до 256 процессов.
Постановка в очередь выполняется через механизм сообщений. Процесс,
поставленный в очередь с сообщением Head Of Queue Tag, будет
выполняться сразу после завершения текущего активного процесса (вне
очереди). Процессы, поставленные в очередь с сообщением Simple Queue
Tag, исполняются ЦУ в порядке, который оно сочтет оптимальным, а
процесс, поставленный в очередь с сообщением Ordered Queue Tag,
258
Шина SCSI
исполняется последним. ИУ может удалить процесс из очереди. Изменение
порядка команд в очереди не касается порядка в цепочке команд, поскольку
цепочка принадлежит одному процессу.
3.4.4. Конфигурирование устройств SCSI
При конфигурировании устройств (программно или джамперами)
необходимо установить следующие параметры:
- Идентификатор устройства (SCSI ID) - уникальный для каждого
устройства адрес на шине из диапазона 0-7 (для Wide SCSI 0-15).
Позиционный код, используемый для адресации, обеспечивает
совместимость адресации 8- и 16-битных устройств на одной шине. Ряд
версий BIOS считает загрузочным только устройство с SCSI ID=0.
- Контроль паритета. Если хотя бы одно устройство не поддерживает
контроль паритета, он должен быть отключен для всех устройств на шине.
- Включение терминаторов. В современных устройствах применяются
активные терминаторы, которые могут включаться одним джампером или
программно-управляемым сигналом. Терминаторы должны включаться
только на крайних устройствах в цепочке. Современные хост-адаптеры
позволяют автоматически включать свой терминатор, если они являются
крайними, и отключать, если используются внутренний и внешний разъем
канала. Это позволяет подключать и отключать внешние устройства, не
заботясь о переключении терминаторов.
- Питание терминаторов. Когда используются активные терминаторы,
необходимо включить питание терминаторов хотя бы на одном устройстве.
- Согласование скорости синхронного обмена. Режим синхронного
обмена включается по взаимному согласию устройств. Если хотя бы одно
устройство на шине его не поддерживает, рекомендуют запретить
согласование на хост-адаптере. Если обмен будет инициирован целевым
устройством, поддерживающим синхронный режим, хост-адаптер поддержит
этот режим. Целевому устройству можно запретить запрос синхронного
режима специальным джампером.
- Разрешение отключения позволяет устройствам отключаться от шины
при неготовности данных во время длительных операций с носителем, что
весьма эффективно в многозадачном режиме при нескольких ПУ на шине.
- Согласование ширины шины данных выполняется по протоколу шины,
исходя из возможностей обоих участников обмена. Целевому устройству
можно запретить запрос 16-битного режима специальным джампером.
- Запрет 16-разрядного режима позволяет подключить 16-битное
устройство к 8-битной шине.
- Принудительное переключение в линейный режим позволяет перевести
устройство LVD в режим SE.
259
3 Внешние интерфейсы
- Запрет синхронизации по обоим фронтам позволяет принудительно
перевести устройство Ultra3 в режим Ultra2.
- Старт по команде или запрет автоматического запуска шпиндельного
двигателя устройства. При включении этой опции запуск двигателя
устройства выполняется только по команде от хост-адаптера, что позволяет
снизить пик нагрузки блока питания в момент включения. Хост будет
запускать устройства последовательно.
- Задержанный старт в сочетании с джамперами выбора задержек
позволяет автоматически запускать двигатель через указанный интервал
после подачи питания (разным устройствам задают различные значения
задержек).
Конфигурирование хост-адаптеров с точки зрения шины SCSI не
отличается от конфигурирования других устройств. Для современных
адаптеров вместо джамперов используется программное конфигурирование.
Как и всякая карта расширения, хост-адаптер должен быть
сконфигурирован и со стороны системной шины расширения, к которой он
подключается. Системные ресурсы для SCSI-адаптера включают:
- область памяти для расширения ROM BIOS, необходимого для
поддержки конфигурирования устройств и дисковых функций;
- область разделяемой буферной памяти;
- область портов ввода-вывода;
- линия запроса прерывания (IRQ);
- канал DMA.
Всем устройствам SCSI требуются специальные драйверы. Базовый
драйве дисковых устройств входит в BIOS хост-адаптера.
К одной шине SCSI можно подключать разнотипные устройства разных
поколений, 8- и 16-битные. При подключении к одной шине устройств LVD и
SE, все устройства перейдут в режим SE и шина не сможет работать в
режиме Ultra2, свойственном устройствам LVD. Если на шине присутствуют
устройства Ultral60 и UItra2 (или еще ниже), то шина будет работать в самом
низком из этих режимов.
В шине SCSI всегда требуется установка терминаторов, которые
должны быть согласованы по импедансу с кабелем и устанавливаются на
концах физических линий. В SCSI-1 применяются пассивные терминаторы с
импедансом 132 Ом. Каждая сигнальная линия соединяется резистором
330 Ом с шиной GND и 220 Ом с шиной +5 В. На частоте 20 МГц в SCSI-2
используются активные терминаторы с импедансом ПО Ом. Они имеют
источник опорного напряжения (стабилизатор), и каждая сигнальная линия
соединяется резистором 110 Ом с выходом этого источника.
В высокоскоростных версиях интерфейса используются FPT (Forced
Perfect Terminator) терминаторы - улучшенный вариант активных
терминаторов с ограничителями выбросов. Для питая активных
260
Шина SCSI
терминаторов в шине предусмотрены специальные линии TermPWR.
По исполнению терминаторы могут быть как внутренние (размещенные
на печатной плате устройства), так и внешние (устанавливаемые на разъемы
кабеля или устройства).
3.4.5. Контрольные вопросы
1, Архитектура и компоненты шины SCSI.
2. Спецификации SCSI. Сравнительная характеристика.
3. Организация физического интерфейса.
4. Особенности организации линейной и дифференциальной SCSI.
5. Характеристики применяемых разъемов.
6. Адресация устройств.
7. Типы периферийных устройств, блочные и не блочные устройства.
8. Организация передачи данных. Последовательность действий.
9. Какие возможны состояния (фазы) шины, назначение фаз.
10. Какая типовая последовательность фазы шины при организации
обмена данными.
11. Реализация асинхронного обмена. Временная диаграмма.
12. Реализация синхронного обмена.
13. Назначение указателей. В какие моменты времени сохраняются и
восстанавливаются указатели
14. Назначение системы сообщений.
15. Типы сообщений и их характеристики.
16. Система команд. Классификация команд.
17. Структура блоков дескрипторов команд.
18. Назначение полей блоков дескрипторов команд и особенности их
организации.
19. Назначение и структура байтов состояния.
20. Последовательность действий при выполнении команд.
21. В каких случаях и почему происходит отключение устройства при
выполнении команд.
22. Последовательность действий при выполнении команд с
отключением устройства.
23. Организация цепочек команд.
24. Организация и типы очередей.
25. Какие параметры задаются при конфигурировании устройств и как.
26. Особенности конфигурирования хост-адаптера.
27. Назначение и типы терминаторов.
261
3 Внешние интерфейсы
3.5. Игровой адаптер GAME-порт
Интерфейс игрового адаптера занимает позволяет вводить значения
дискретных (4 бита) и аналоговых сигналов (величины сопротивления 4
резисторов). Изначально порт был предназначен для подключения
джойстиков и других игровых устройств ввода, но он может применяться и
для подключения других датчиков. Метод измерения сопротивления основан
на программном определении длительности импульса, пропорциональной
величине сопротивления. Преобразование начинается по выводу любого
байта в регистр адаптера (20 lh), при этом биты 0-3 устанавливаются в
единичные значения. Время измеряется до возврата в нулевое состояние бит
0-3, соответствующих четырем аналоговым каналам. Если аналоговый вход
закорочен на шину GND или цепь измеряемого сопротивления разорвана,
соответствующий бит не обнулится никогда (до аппаратного сброса
компьютера). Поэтому во избежание зависания в программе преобразования
должен быть предусмотрен механизм тайм-аута. Для измеряемых
сопротивлений в диапазоне 0-100 кОм время определяется по формуле
Т(мкс)=24,2Н1 *R(kOm).
Конечно, точность и линейность преобразования невысока,
преобразование выполняется не быстро (до 1,12 мс) и сильно загружает
процессор. Однако, в отличие от «настоящих» аналого-цифровых
преобразователей, этот преобразователь достается даром - игровой адаптер
входит в состав практически всех комбинированных плат последовательных
и параллельных портов (мультикарт) и звуковых карт.
Порт имеет разъем-розетку DB-15S, назначение выводов и соответствие
сигналов битам регистра приведено в табл. 3.13.
Таблица 3.13- Интерфейс игрового адаптера и MIDI
Бит Назначение Контакт
7 Джойстик В кнопка #2 14
6 Джойстик В кнопка #1 10
5 Джойстик А кнопка #2 7
4 Джойстик А кнопка #1 2
3 Джойстик В Y-коордннята 13
2 Джойстик В Х-коордяната 11
1 Джойстик A Y-координата 6
0 Джойстик А Х-координата 3
- GND 4,5, (12)
- +5 В 1, в, 9,(15)
- MIDI In — вход (на звуковой карте) 12
- MIDI Out — выход (на звуковой карте) 15
262
3.5 Игровой адаптер GAME-порт
Резисторы подключаются к шине питания +5 В, кнопки - к шине GND
(рис. 3.11).
Рис. 3.11 - Подключение датчиков к игровому адаптеру
Замыканию кнопок соответствуют нули в битах 5-7. При необходимости
аналоговые каналы можно использовать и для дискретного ввода, если их
входы подключить к кнопкам, замыкающим их на шину GND, и к
резисторам, «подтягивающим» их к уровню + 5 В. Два джойстика (А и В)
подключаются через Y-образный переходник-разветвитель. На звуковых
картах через разъем «Game» вместе с джойстиками могут подключаться и
внешние MIDI-устройства через специальный кабель-адаптер,
обеспечивающий гальваническую развязку входного сигнала и ограничение
выходного тока (см. рис. 3.11). Для интерфейса MIDI используются контакты
12 и 15, ранее предназначавшиеся для шин GND и +5V. Такое назначение
делает безопасным подключение адаптера MIDI к "чистому” игровому порту
и обычного джойстика к игровому порту с сигналами MIDI.
263
Литература
Литература
1. Л.В.Букчин, Ю.Л.Безрукий. Дисковая подсистема IBM -совместимых
персональных компьютеров. - Мн.: МП "Бином", 1993. - 284с.
2. В.Л. Григорьев, Видеосистемы ПК фирмы IBM. - М.: Радио и связь,
1993. - 190 с.
3. Гук М. Аппаратные средства IBM PC. Энциклопедия — СПб: Питер
Ком, 1999. —816 с.
4. Гук М. Дисковая подсистема ПК.—СПб.: Питер, 2001.—336 с.
5. Ф.А. Домнин, А.И. Поворознюк, С.А. Соколов Персональные
компьютеры IBM. Архитектура и управление. 4.1. ~ Харьков: ХВУ, 1996, -
350 с.
6. Ф.А. Домнин, А.И. Поворознюк, С.А. Соколов Персональные
компьютеры IBM. Архитектура и управление. 4.2. - Харьков: ХВУ, 1997, -
328 с.
7. А.И. Поворознюк, И.С. Зыков, С.Ю. Леонов. Методические указания
к лабораторным работам N 1-9 по курсу "Архитектура вычислительных
систем". Харьков: ХПИ, 1993.-80с.
8. А.И.Поворознюк, И.С.Зыков. Методические указания к лабораторным
работам N 10-18 по курсу "Архитектура вычислительных систем". Харьков:
ХПИ, 1993.-88с.
9. Руководство по архитектуре IBM PC АТ/ Ж.К.Голенкова, А.В.
Заболцкий, М.Л.Мархасин и др. Под общей ред. М.Л.Мархасина - Мн.: ООО
" Консул", 1992-949С.
10. О.С.Степаненко. Техническое обслуживание и ремонт IBM PC. - К.:
фирма "Диалектика". 1994,-190с.
11. Р. Уилтон, Видеосистемы персональных компьютеров JBM PC и
PS/2. Руководство по программириванию. - М.: Радио и связь, 1994. - 384с.
12. А.В. Фролов, Г.В. Фролов. Аппаратное обеспечение IBM PC. ч.1. -
М.: "Диалог МИФИ", 1992. - 289с.
13. А.В. Фролов, Г.В. Фролов. Аппаратное обеспечение IBM PC. ч.2. -
М.: "Диалог МИФИ", 1992. - 200с.
14. Фролов А.В., Фролов Г.В. Программирование видеоадаптеров. - М.:
"Диалог-МИФИ", 1995-272с.
264
Приложение А, Команды устройств ATA/ATAPI (жесткого диска)
ПРИЛОЖЕНИЯ
Приложение А.
Команды устройств ATA/ATAPI (жесткого диска)
Таблица А.1 - Обязательные команды жесткого диска
Код Команда
08 h Device Reset - сброс устройства AT API
20h Read Sector(s)( w/retry)- чтение секторов с повторами
21h Read Sector(s) (w/o retry) - чтение секторов без повторов
зоь Write Sector(S) (with retry) - запись секторов с повторами
31h Write Sector(S) (without retry)- запись секторов без повторов
40h Read Verify Sector(s) (w/retry) -верификационное чтение секторов с повторами
4111 Read Verify Sectors) (w/o retry) -верификационное чтение секторов без повторов
50h Format Track - форматирование трека
70h Seek-поиск
90k Execute Device Diagnostic - диагностика
91h Initialize Device Parameters инициализация параметров устройства
AOb Packet - посылка командного пакета
Alh Identify Packet Device - идентификации устройства (пакетного)
C4h Read Multiple - множественное чтение
CSh Write Multiple - множественная запись
C6h Set Multiple Mode - установка множественного режима
C8h Read DMA (w/retry) - чтение ио DMA с повторами
C9h Read DMA (w/o retry) - чтение ио DMA без повторов
CAh Write DMA (w/retry) - запись no DMA с повторами
CBh Write DMA (w/o ге1гу)-заиись no DMA без повторов
EOh Standby Immediate - немедленный перевод в дежурный режим
E6h Sleep-перевод в «спящий режим»
E7h J Flush Cache - выгрузка кэша записи на носитель
ECh Identify Device - идентификация устройства (не пакетного)
EFh Set Features - установка свойств
Elh Idle Immediate - немедленный переход в состояние ожидания
E5h Check Power Mode - проверка режима энергопотребления
E3h Idle - переход в состояние ожидания
265
Приложения
Таблица А.2 - Дополнительные команды жесткого диска
Код Команда
00h Nop - холостая команда
0311 CFA RequestExtended Error Code- чтение расширенного кода ошибки
10h Recalibrate - рекалибровка (поиск нулевого трека)
22h Read Long (w/retry) - "длинное” чтение с повторами
23h Read Long (w/o retry) - ’’длинное” чтение без повторов
32h Write Long (w/retry) - ’’длинная” запись с повторами
33h . Write Long (w/retry) - ’’длинная” запись без повторов
3«h CFA Write Sectors Without Erase - запись в предварительно стертые секторы
3Ch Write Verify - запись с верификацией
87h CFA Translate Sector - получение информации о состоянии сектора
m Download Microcode - загрузка микрокода внутреннего ПО
A2h Service - передача данных н/нли состояния команды, освободившей шину
BOh SMART- группа команд мониторинга
COh CFA Erase Sectors - стирание секторов
C7h Read DMA Queued - чтение no DMA с возможностью постановки команды в очередь
CCh Write DMA Queued - запись но DMA с возможностью постановки команды в очередь
CDb CFA Write Multiple Without Erase - множественная запись в предварительно стертые секторы
DAh Get Media Status - Получение информации о состоянии носителя
DBb Acknowledge Media Change - подтверждение смены носителя
DEh Door Lock - запретить смену носителя
OFh Door Un lock - разрешить смену носителя
E2h Standby- перевод в дежурный режим
E4h Read Buffer - чтение буфера
E8h Write Buffer - запись в буфер
E9h Write Same- завись с размножением
EDh Media Eject- извлечь носитель
EEh Identify Device DMA - идентификация устройства с ответом в режиме DMA
Flh Security Set Password - установка пароля защиты
F2h Security Unlock- снятие защиты
F3h Security Erase Prepare - подготовка с защитному стиранию
F4h Security Erase Unit - защитное стирание (с посылкой пароля)
F5h Security Freeze Lock - блокировка команд защиты
F6h Security Disable Password - отмена защиты (с посылкой пароля)
F8h Read Native Max Address - чтение максимального адреса сектора
F9h Set Мах- ограничение доступного размера с пародированием этой возможности
266
Приложение Б. Идентификационная информация устройств АТА
Приложение Б.
Идентификационная информация устройств АТА
Таблица Б. 1 - Идентификационная информация
устройства АТА (паспорт диска)
Слово Назначение ,
0 Общая конфигурационная информация. Бит 15: 0 - для всех устройств АТА (1 - ^ля ATAPI). Бит 7: 1 -устройство со сменным носителем. Бит 6: 1 -устройство с иесменным носителем. Бит 2 - сообщение параметров не завершено, см. слово 2. Кит 0 - зарезервироваи(*0). Остальные биты свободны, в АТА-1 определили свойства накопителя. .. _
1 Число цилиндров в конфигурации по умолчанию.
1 Специфическая конфигурация: 37C8h - устройство требует для раскрутки мотора подкоманду SET FEATURES, сообщенный блок параметров неполный. 738Ch - устройство требует SET FEATURES, сообщенный блок параметров полный. 8C73h - устройство ие требует SET FEATURES, сообщенный блок параметров неполный. C837h - устройство ие требует SET FEATURES, сообщенный блок параметров полный. . . ... ......
3 Число головок в конфигураций по умолчанию
4,5 Специфично
6 Число секторов па треке н конфигурации по умолчанию
7-9 Специфично
10-19 Серийный номер (20 символов ASCII).
20,21 Специфично. В АТА-1 описывался тин буфера.
22 Число дополнительных байтов в командах "длинного" чтения и заннсн.
23-26 Версия встроенного ПО (8 символов ASCII)
27-46 Номер модели (40 символов ASCII)
47 Биты 15-8 специфичны (80h). Биты 7-0 - максимальное количество секторов, передаваемых за сеанс, в множественных операций (Rear/Write Multiple).
48 Зарезервировано
49 Возможности. Биты 15-14, 12 - зарезервированы для команды Identify Packet Device. Бит 13 - значения таймера режима Standby: 1 - задается в соответствии со стандартом, 0 - управляются устройством. Бит 11:1- IORDY поддерживается, 0 - не поддерживается. Бит 10: 1 -сигнал IORDY может быть запрещен командой Set Features. Бнт 9 =1 (в АТА-4 используется для Identify Packet Device, в АТА-2 - поддержка LBA и действительность слов 60-61). Бит 8 =1 (в АТА-4 используется цля Identity Packet Device, в АТА-2 - как указание на поддержку DMA). Биты 7-0 специфичны.
50 Возможности (АТА-4). Бит 15*0. Бит 14*1. Биты 13-1 -зарезервированы. Бит 0*1 указывает иа специфичное значение минимума для Standby Timer
51 Биты 15-8: длительность цикла обмена в режиме РЮ. Биты 7-0 специфичны.
52 В АТА-2 биты 15-3: временной режим цикла одиночного обмена DMA. Если поддерживаются слова 62 или 63, значение поля игнорируется. Биты 7-0 специфичны.
53 Биты 15-3 зарезервированы. Бит 2: 1 - поля в слове 88 действительны, 0 - нет. Бит 1: 1- поля в словах 64-70 действительны, 0 - нет. Бит 0: 1 - поля в словах 54- 58 действительны, 0 - иет.
54 Текущее число цилиндров.
267
Приложения
Продолжение таблицы Б Л
Слово Назначение
55 Текущее число головок.
56 Текущее число секторов на трек.
57-58 Текущая емкость в секторах для режима CHS (произведение слов 54*55*56)
59 Биты 15-9: зарезервированы. Бит 8:1 - многосекторная нередача действительна. Биты 7-0: максимальное числа секторов для многосекторных команд.
60-61 Общее число секторов, адресуемых пользователем в режиме LBA
62 В АТА-2 - режим одиночного обмена DMA. Биты 15-8: - активный режим; бит 8=1 -ModeO, бит 9=1 - Mode 1 и г. д. Единичное значение может иметь только одни бит. Биты 7-0: - поддерживаемые режимы; бит 0- 1 - Mode 0, бит 1 -1 ~ Mode 1 н т. д.
63 Режим множественного обмена Multiword DMA. Биты 15-8: - активный режим; бит 8=1 -Mode 0, бит 9=1 -Mode 1 п бит 10=1 - Mode 2. Единичное значение может иметь только один бит, но только если в слове 86 биты 15-8 нулевые. Биты 7-0: - поддерживаемые режимы; бит 0=1 - Mode 0, бит 1=1 - Mode 1 и 0, бит 2=1-Mode 2,1 иО.
64 Биты 15-2: зарезервированы. Биты 1-0: - поддерживаемые режимы; бит 0=1 - PIO Mode 3, бит 1=1 -PIOMode4.
65 Минимальная длительность цикла передачи множественного DMA (в наносекундах)
66 Длительность цикла передачи множественного DMA (в наносекундах).
67 Минимальная длительность цикла передачи РЮ без использования сигнала готовности (в наносекундах)
68 Минимальная длительность цикла передачи РЮ с использованием сигнала готовности IORDY (в наносекундах)
69-70 Зарезервировано для поддержки перекрытия команд и очередей
71-74 Зарезервировано для команды Identify Packet Device
75 Биты 15-5-зарезервнрованы. Биты 4-0 - максимальная глубина очереди команд.
76-79 Зарезервировано
80 Главный номер версия интерфейса (если не 0000h или FFFFh), единичное значение каждого бита означает поддержку соответствующей версия; Бит 0 - резерв, Бит 1 - АТА-1, Бит 2 - АТА-2, Бит 3 - АТА-3, Бит 4 - ATA/ATAPI-4 и т. д.
81 Дополнительный номер версия интерфейса. 0004h - АТА 2, OOOAh - АТА-3,0012b -ATA/ATAPI-4. 0015h -ATA/ATAPI-5 rev. 1, 0017h -ATA/ATAPI-4 rev, 17, 0018h - ATA/ATAPI-6 rev. 0.
82 Поддержка команд и свойств. Бит 15 - не используется. Бнт 14 - команды Nop. Бит 13 - команды Read Buffer. Бит 12 - команды Write Buffer. Бит 11 - не используется. Бит 10-ограннченне доступного пространства. Бнт 9 - команда Device Reset Бнт 8 - прерывания во время выполнения команды Service. Бит 7 - прерывание по освобождению шины. Бит 6 - кэширование с упреждающим чтением. Бит 5-кэширование записи. Бит 4 - команда Packet Бит 3 - управление энергопотреблением. Бит 2 - смена носителя. Бит 1 - команды Security. Бнт 0 - SMART
83 Поддержка команд и свойств. Бнт 15 = 0. Бит 14= 1. Биты 13-9 зарезервированы. Бит 8 - расширение SET МАХ для защиты. Бит 7 - резерв. Бнт 6 - специальная команда запуска двигателя после включения. Бит 5 - Power Up In Standby. Бнт4 - уведомление о смене носителя. Бит 3 - расширенное управление энергопотреблением (АРМ). Бнт 2 - команды CFA. Бит 1 - команды Read/Write DMA Queued. Бит 0 - команда Download Microcode
268
Приложение Б. Идентификационная информация устройств АТА
Окончание таблицы Б.1
Слово Назначение
84 Поддержка команд н свойств. Бит 15=0 Бит14= 1 Биты 13-0 зарезервированы
85-87 Разрешенные команды н свойства; поля н правила аналогичны словам 82-84.
88 Режим Ultra DMA. Биты 15-13, 7-5 зарезервированы. Биты 8-12: активный режим Ultra DMA: бит 8 =1 -Mode 0, бит 9=1 - Mode 1 н т. д. Единичное значение может иметь только один бит, но только если в слове 63 биты 15-8 нулевые. Биты 4-0: поддерживаемые режимы Ultra DMA: бит 0=1 - Mode 0, бит 1 =1 - Mode 1 и 0, и т. д.
89 Время защитного стнрання. 0-не указано. Значение 1 -254, умноженное на 2, дает время в минутах, 255 - более 508 мин.
90 Время расширенного защитного стирания (аналогично слову 89).
91 Текущий уровень Advanced Power Management.
92 Код номера главного пароля (Master Password Revision Code, 5+)
93 Результат аппаратного сброса. Бит 15 = 0. Бит 14=1. Бит 13 - обнаруженный уровень CBLID#: 0 - ниже ViL, 1 - выше Уш. Биты 12-8 - результаты сброса устройства 1 (в устройстве 0 обнулены). Бит 12 -резерв. Бит 11=1- устройство 1 ввело сигнал PDIAG#, 0 - нет. Биты 10-9-способ, которым устройство 1 узнало свой номер: 00 -резерв, 01 - по джамперу, 10-по CSEL, 11 - иным или неизвестным способом. Бит 8 = 1. Биты 7-0 - результаты сброса устройства 0 (в устройстве 1 обнулены). Бит 7 - резерв. Бит 6=1- устройство 0 ответило при выборе устройства 1,0- нет. Бнт 5=1- устройство 0 обнаружило сигнал DASP#, 0 - нет. Бнт 4=1- устройство 0 обнаружило сигнал PDIAG#, 0 - нет. БитЗ= 1 - устройство 0 успешно прошло диагностику, 0-нет. Биты 2-1 -способ, которым устройство 0 узнало свой номер: 00-резерв, 01 -по джамперу, 10 - но CSEL, 11 - иным или неизвестным способом. Бнт 0 = 1
94 Биты 15-8- рекомендуемый уровень управления акустическим шумом. Биты 7-0 - текущее значение уровня управления акустическим шумом.
95-97 Параметры качества сервиса для AV-команд.
98-126 Зарезервировано.
127 Биты 15-2 - зарезервированы. Биты 1 -0 - уведомление о смепе носителя: 00-нс поддерживается, 01 -поддерживается, ^-зарезервированы.
128 Состояние защиты. Биты 15-9 зарезервированы. Бнт 8 - уровень защиты*. 0 - высокий, 1 - максимальный. Биты 7-6 - зарезервированы. Бнт 5; 1 -поддержка расширенного защитного стирания. Бит 4:1 - счетчик попыток иссяк. Бнт 3: 1 - устройство заморожено. Бнт 2: 1 - устройство закрыто. Бнт 1: 1- защита установлена. Бнт 0:1 - защита поддерживается.
129-159 Специфично.
160 Для устройств CFA, поддерживающих power mode 1. Бит 15: 1 - слово 160 поддерживается. Бит 14-резерв. Бнт 13: 1 - для выполнения одной нлн более команд устройства CFA требуется power mode 1. Бит 12: 1 - CFA power mode 1 закрещен. Биты 11 -0: - максимальный ток, мА
161-175 Зарезервировано для CFA
176-254 Зарезервировано
255 Контроль целостности. Биты 15 - 8 - контрольная сумма (сумма всех 512 байт по модулю 256 должна быть нулевой). Биты 7-0 - сигнатура A5h (признак использования контрольной суммы)
269
Приложения
Таблица Б.2 - Подкоманды задания свойств устройства
в команде Set Features
Код Назначение
Olh Разрешение 8-битного обмена
02b Разрешение кэширования записи
03h Установка режима передачи по значению регистра SC (см. табл. П5)
04h Разрешение автоматического переназначения дефектных блоков
05h Разрешение расширенного управления энергопотреблением АРМ (уровень в регистре SC)
06h Разрешение включения в режиме Standby (действует и после любых сбросов)
07h Запуск двигателя при включения в режиме Standby
09h Резерв для смещения загрузочной области
OAh Разрешение CFA Power Mode 1 (устройство может потреблять до 500 мА от источника 33 или 5 В)
31h Запрет уведомления о смене носителя
33h Заирет повторов
40h Разрешение AV-команд
42h Разрешение управления акустическим шумом, в SC - уровень шума.
44h Установка количества дополнительных байтов в командах Read Long/Write Long
54h Установка количества сегментов кэша по значению регистра SC
55b Заирет упреждающего чтения
5Dh Разрешение прерывания ио освобождению шины
5Eh Разрешение прерывания при выполнении команды Service
66h Запрет возврата к параметрам по умолчанию ври включении питания
77h Заирет ЕСС
81h Заирет 8-бнтного обмена
82h Запрет кэширования записи
84h Заирет автоматического переназначения дефектных блоков
85h Запрет расширенного управления энергопотреблением
86h Запрет включения в режиме Standby
88h Разрешение ЕСС
89h Резерв дЛя смещения загрузочной области
8Ah Запрет CFA Power Mode 1 (переход в Power Mode 0, при котором устройство может потреблять до 75 мА от источника 33 В или до 100 мА от 5 В. В этом режиме команды чтения, завися и стирания могут и не выполняться}
95h Разрешение уведомления о смене носителя
99h Раэрешепне повторов
9Ah Ограничение тока нотребления значеннем в регистре SC, умноженным на 4 (мА)
AAh Разрешение упреждающего чтения
ABh Установка максимального количества кэшируемых блоков по регистру SC
BBh Установка 4-байтиой длины дополнит, поля для команд Read Long/Write Long
COh Запрет AV-команд
C2h Запрет управления акустическим шумом
CCh Разрешение возврата к параметрам по умолчанию нри включении питания
DDh Запрет прерывания по освобождению шииы
DEh Запрет прерывания при выполнении команды Service
F0- FFh Резерв для CFA
270
Приложение Б, Идентификационная информация устройств АТА
Таблица БЗ - Управление режимом обмена
* оегистра SC в подкоманде 03h команды Set Features)
Биты 7-0 Режим обмена _
00000000 Режим РЮ, принятый для устройства по умолчанию
00000001 Режим РЮ» принятый для устройства по умолчанию; запрет IORDY
00001пип Режим PIO Mode х1 с сигналом IORDY
ОООЮппп Режим одиночного DMA Mode х*
ООЮОивн Режим множественного DMA Mode х1
ОЮООппв Режим Ultra DMA Mode х1 . ..
IQOOOnnn Зарезервированы .....
1 х определяется значением поля ппп.
271
Приложения
Приложение В.
Назначение регистров EGA/VGA
В.1. Внешние регистры.
Многоцелевой регистр вывода (порт 3C2h, режим W - “только запись").
При переустановке аппаратуры адаптера все биты в данном регистре
сбрасываются в 0.
Бит 0: адрес ввода-вывода. Этот бит переопределяет адрес ввода-вывода
блока управления ЭЛТ применительно к режиму (монохромный или
цветной). Логический 0 устанавливает адреса регистров блока управления
ЭЛТ в 3BXh и адрес входного регистра состояния 1 равным 3BAh для
монохромных режимов. Логическая 1 - 3DXh и 3DAh соответственно для
цветных режимов.
Бит 1: разрешение доступа к видеопамяти (0 - блокирует доступ со
стороны процессора; 1 - разрешает).
Биты 2-3: выбор тактовой частоты:
- 00 - 14МГц из канала вводы/вывода процессора для ЕСА, 25 МГц для
VGA;
- 01 - 16МГц встроенного генератора для EGA, 28 МГц для VGA;
- 10 - внешний источник тактовых сигналов, поступающих через
специальный вход (Feature Connector);
- 11 - не используется.
Бит 4: блокировка внутренних видеодрайверов (0 - активизирует
внутренние видеодрайверы, 1 - блокирует). Когда внутренние
видеодрайверы заблокированы, сигналы на вход монитора подаются со
стороны специального входа (Feature Connector). В VGA не используется.
Бит 5: бит страницы для режима записи чет/нечет, используется для
выбора между двумя страницами памяти в режимах, использующих чет/нечет
адресацию (0,1,2,3,7) (0 - выбор младшей страницы, 1 - старшей).
Бит 6: полярность горизонтального обратного хода луча (0 -
положительная полярности (в MDA, EGA, VGA), 1 - отрицательная).
Бит 7: полярность вертикального обратного хода луча (0 -
положительная полярность, 1 - отрицательная).
Регистр управления специальным входом (порт ЗВ Ah или 3DAh, W).
Биты 0-1: используются для передачи информации на специальный
вход. Значения этих битов поступают на контакты FEAT1 и FEAT2 разъема
адаптера.
Биты 2-7 - резерв.
Входной регистр состояния 0 (порт 3Ch, R - “только чтение”).
Бит 4: чувствительность к переключателям, при установке бита в 1
можно считывать положение 4-х установленных на плате видеоадаптера
272
Приложение В. Назначение регистров EGA/VGA
переключателей. Значение битов 0 - 3 определяет положение какого
переключателя считывается (1 - 4). Логический 0 - переключатель разомкнут.
Положение переключателей считывается по адресу 0040:0088h в оперативной
памяти.
Биты 5-6: код со специального входа, значения этих бит соответствуют
значениям поступающих с контактов FEAT 0 и FEAT 1 специального входа.
Бит 7: содержит логическую 1 если в данный момент изображение
выводится на экран, 0 - является индикатором обратного хода кадровой
развертки.
Входной регистр состояния 1. (порт 3BAh или 3DAh, режим R).
Бит 0: логический 0 означает, что в данный момент времени происходит
вертикальный или горизонтальный обратный ход луча.
Бит 1: строб светового пера (0 - триггер светового пера выключен,
1 - включен).
Бит 2: переключатель светового пера (0 - переключатель разомкнут, I -
замкнут).
Бит 3: вертикальный обратный ход луча (0 - информация
воспроизводится на экране ЭЛТ, 1 - признак обратного хода кадровой
развертки).
Биты 4-5: диагностические биты. Они могут быть связаны по выбору с
двумя из 6 выходных сигналов управления цветом пикселя контроллера
атрибутов. Возможные варианты подсоединения приведены в таблице ПЗ.
Управление подсоединением осуществляется значением в регистре
разрешения отображения битовой плоскости контроллера атрибутов.
Таблица В.1 - Назначение диагностических битов регистра состояния 1
Регистр разрешения отображения битовой плоскости (3C0h/3C0h, ннд.12Ь) Входной регистр состояния 1
Бнт 5 Бит 4 Бнт 5 Бит 4
0 0 красный R синий В
0 1 вторичный зеленый g зеленый G
1 0 вторичный красный г втор, зеленый g
1 1 не используется не используется
Регистр разрешения видеосистемы /начиная с VGA/ (порт ЗСЗЬ, режим
W).
Бит 0: разрешение дисплея (1 - разрешить, 0 - запретить).
Биты 1-7: резерв.
В.2. Регистры блока синхронизации
Для программирования блока необходимо занести индекс регистра
данных в порт 3C4h, после чего занести данные в порт 3C5h. Регистры блока
синхронизации приведены в таблице В.2.
273
Приложения
Таблица В.2 - Регистры блока синхронизации
№ Наименование Порт Индекс Режим
1 Адресный (Address) 3C4h - W
2 Инициализации (Reset) 3C5h OOh w
3 Тактового режима (Clocking mode) 3C5h Olh W
4 Маски бит. плоскости(Мяр mask) 3C5h 02h W
5 Выбора символьного блока (Character map select) 3C5h 03h W
6 Режима использования памяти (Memory mode) 3C5h 04h W
Адресный регистр блока синхронизации (порт 3C4h).
Биты 0-3: номер регистра, в который будет производится запись.
Биты 4-7: должны быть равны 0.
Регистр инициализации (порт 3C5h, индекс 0).
Бит 0: асинхронная инициализация, логический 0 дает команду блоку
синхронизации перейти в начальное состояние и остановиться. Если бит
установлен в 0, все выходы переводятся в режим высокого сопротивления.
Если данный бит установлен в 1, блок синхронизации продолжает
функционирование до тех пор, пока бит 1 содержит логическую 1.
Асинхронная инициализация блока управления может привести к потере
данных в видеопамяти.
Бит 1: синхронная инициализация, логический 0 является командой для
блока синхронизации перейти в начальное состояние и прекратить
функционирование. Для нормального функционирования блока
синхронизации биты 1 и 0 должны быть оба установлены в 1. Для сохранения
содержимого памяти перед изменением значения регистра тактового режима
инициализацию необходимо производить с помощью данного бита.
Биты 2-7: резерв.
Регистр тактового режима (порт 3C5h, индекс 1).
Бит 0: 8/9 - точечный размер символьной единицы времени. Символьная
единица времени определяет необходимое количество точек в одной строке
растра символа (0-9 точек, 1-8 точек).
Бит 1: интервал времени для доступа к видеопамяти (0 - доступ к
видеопамяти со стороны контроллера ЭЛТ в течение 4 из 5 возможных
циклов памяти, 1 - в течение 2 из 5 циклов памяти). Используется только в
EGA, в VGA и выше доступ ЦП к видеопамяти выполняется во время
обратного хода.
Бит 2: загрузка регистров сдвига. Сдвиговые регистры преобразуют
данные из битовых матриц в последовательный формат для использования в
контроллере атрибутов (0 - регистры сдвига перегружаются каждый такт,
длительностью в символьную единицу времени, 1 - перегрузка производится
каждый второй такт. Этот режим полезен в тех случаях, когда за один цикл
274
Приложение В. Назначение регистров EGA/VGA
считывается 16 бит с двух битовых плоскостей с дальнейшим объединением
в регистрах сдвига),
Бит 3: частота генерации точек (0 - соответствует частоте сигналов
генерации точек на входе главного таймера блока синхронизации, 1 - частота
уменьшается вдвое). Уменьшенная в 2 раза частота применяется в режимах с
разрешением 320*200 и в 40- столбцовых символьных режимах.
Бит 4: аналогичен биту 2 данного регистра. Отличие в том, что при
установке в 1 выбирается 4-х словный адрес и связывается 32 бита в один
поток.
Бит 5: установка в 1 запрещает использование дисплея, но все
встроенные функции адаптера выполняются. Можно использовать для
выделения всего времени доступа ЦП к видеопамяти с целью повышения
быстродействия.
Биты 6-7: резерв.
Регистр маски битовой плоскости (порт 3C5h, индекс 2).
В режимах чет/нечет биты из каждой пары бит 0, 1 и 2, 3 должны
содержать одинаковые значения. Работа регистра подробно рассмотрена в
11.4.
Регистр выбора символьного банка (порт 3C5h, индекс 3).
Позволяет выбирать описания символов из различных банков 2 битовой
плоскости в зависимости от бита 3 байта атрибутов. Работа регистра
подробно рассмотрена в 11.3.6.3.
Регистр режима использования памяти (порт 3C5h, индекс 4).
Бит 0: алфавитно-цифровой режим (0 - адаптер функционирует в
графическом режиме, 1 - в алфавитно-цифровом).
Бит 1: наличие платы расширения видеопамяти (0 - отсутствует, 1 -
имеется дополнительная память, для доступа к которой используются
адресные биты 14 и 15 при адресации к видеопамяти).
Бит 2: чет/нечет. Если установлен логический 0, данные, направляемые
по четным адресам попадают в битрвые плоскости 0 и 2, а по нечетным - в
плоскости 1 и 3. Устанавливает режим чет/нечет только для блока
синхронизации. Такой же режим необходимо установить для графического
контроллера (бит 4 регистра режима порт 3CFh, индекс 5). Если установлена
логическая 1, производится последовательный доступ к байтам битовой
плоскости. Доступ к плоскостям выполняется в соответствии со значениями в
регистре маскирования битовых плоскостей (порт 3C5h, индекс 2).
Бит 3: установка в 1 определяет режим цепочка 4. Режим напоминает
чет/нечет, но используется остаток от деления адреса на 4. Если остаток
равен 0, данные отображаются в 0 матрицу, остаток равен 1- в первую и т. д.
Биты 4-7: резерв.
275
Приложения
В.З. Регистры блока управления ЭЛТ (CRTC)
Регистры блока CRTC адаптера EGA работают в режимах, показанных в
таблице В.З, а в адаптере VGA/SVGA все регистры работают в режимах W/R.
Таблица В.З - Регистры блока CRTC
№ Наименование Порт Ин- декс Режим в EGA
1 Адресный (Address) 3?4h - W
2 Общей длительность строки (horizontal total) 3?5h OOh W
3 Длит, участка отобр. в строке (Horizontal display enable end) 3?5h Olh W
4 Начала горизонтального гашения (Start horizontal blank) 3?5h Olh W
5 Окончания горизонт, гашения луча (End horizontal blank) 3?5h 03h w
6 Начала горизонт, обратного хода луча (Start horizontal retrace) 3?5h 04h W
7 Оконч. горизонт, обратного хода луча (End horizontal retrace) 3?5h 05h W
8 Общего количество строк растра в кадре (vertical total) 3?5h 06h W
9 Переполнения (Overflow) 3?5h 07h W
10 Установки строки растра (Preset row scan) 3?5h 08h W
11 Вертикального размера символа (Max scan line) 3?5h 09h W
12 Начала курсора (Cursor start) 3?5h OAh W
13 Окончания курсора (Cursor end) 3?5h OBh w
14 Старшей составляющей начального адреса (Start address high) 3?5h OCh R/W
15 Младшей составляющей начального адреса (Start address low) 3?5h ODh R/W
16 Старшей составляющей позиции курсора (Cursor location high) 3?5h OEh R/W
17 Младшей составляющей позиции курсора (Cursor location low) 3?5h OFh R/W
18 Начала верт. обратного хода луча (Vertical retrace start) 3?5h 10h W
19 Старшей составляющей адреса светового пера (Light реп high) 3?5h lOh R
20 Окончания обратного хода луча (Vertical retrace end) 3?5h llh W
21 Младшей составляющей адреса светового пера (Light pen low) 3?5h llh R
22 Длительности участка отображения в кадре (Vertical display end) 3?5h llh
23 Смещения (Offset) 3?5h 13h w
24 Положения символа иодчеркивания (Underline location) 3?5h 14h w
25 Начала вертикального гашения луча (Start vertical blank) 3?5h 15h w
26 Окончания вертикального гашения луча (End vertical blank) 3?5h 16h w
27 Управления режимом (Mode control) 3?5h 17h w
28 Сравнения строк (Line compare) 3?5h 18h w
? = В в монохромных режимах и D в цветных
Для доступа к регистрам блока заносится индекс регистра в порт 3D4h
(или в порт 3B4h в монохромных режимах), после чего данные передаются
через порт 3D5h (или через порт 3B5h в монохромных режимах).
Адресный регистр блока управления ЭЛТ (порт 3?4h).
Биты 0-4: индекс регистра блока управления ЭЛТ, в который будет
производиться запись.
Регистр общей длительности строки (порт 3?5h, индекс Oh).
Содержание этого регистра задает общее количество символов в строке,
276
Приложение В. Назначение регистров EGA/VGA
включая и временной интервал, необходимый для горизонтального обратного
хода луча. Это значение непосредственно определяет длительность сигнала
горизонтальной развертки и обратного хода луча. Внутренний счетчик
символов подсчитывает количество сигналов вывода символов (длительность
сигнала задана в символьных единицах времени), поступающих на вход
блока управления ЭЛТ. Все сигналы управления горизонтальной и
вертикальной разверткой базируются на значении данного регистра. Для
управления горизонтальной разверткой в компараторах производится
сравнение значения этого регистра с номером текущего символа в строке.
Счетчик сбрасывается при равенстве этих значений и новый интервал
начинается через одно значение после окончания старого.
Биты 0-7: общая длительность строки в символьных единицах времени
минус 2 для EGA или минус 5 для VGA.
Регистр длительности участка отображения (порт 3?5h, индекс lh).
Содержание этого регистра задает длительность сигнала, в течение
которого производится вывод информации на экран в строке растра.
Биты 0-7: длительность участка отображения, т.е. количество
отображаемых в строке символов минус 1.
Регистр начала горизонтального гашения луча (порт 3?5h, индекс 2h).
Значение в этом регистре определяет момент активизации сигнала
горизонтального гашения луча.
Биты 0-7: номер символьной единицы времени активизации сигнала
горизонтального гашения луча.
Регистр окончания горизонтального гашения луча (порт 3?5h, индекс
3h).
Значение в этом регистре определяет момент времени в который сигнал
горизонтального гашения луча перестает быть активным.
Биты 0-4: окончание сигнала горизонтального гашения луча. В данное
поле помещается младшие 5 битов значения счетчика символов,
соответствующего моменту времени прекращения сигнала горизонтального
гашения. Чтобы обеспечить формирование сигнала гашения длительностью L
для расчета помещаемого в данное поле значения используется следующее
выражение: значение начала горизонтального гашения луча + длительность
сигнала гашения в символьных единицах времени = пять младших битов
регистра.
VGA использует еще 6-й бит в регистре окончания горизонтального
обратного хода луча (End horizontal retrace) индекс 5, бит 7.
Биты 5-6: управление задержкой отображения данных. Такая задержка
необходима для того, чтобы обеспечить достаточный промежуток времени
для того, чтобы блок управления ЭЛТ успел обратиться к видеопамяти и
считать код символа и его атрибут, обратиться к шрифту, передать
полученные данные через регистр сдвига контроллера атрибутов. Для
277
Приложения
синхронизации с сигналами горизонтального и вертикального обратного хода
луча при каждом доступе необходимо задержать сигнал отображения на одну
символьную единицу времени. Значения в рассматриваемой паре бит и
соответствующие им задержки следующие:
- 00 - отсутствие задержки;
- 01 - задержка на одну символьную единицу времени;
- 10 - задержка на две символьные единицы времени;
- 11 - задержка на три символьные единицы времени.
Бит 7: должен быть равен 0.
Регистр начала горизонтального обратного хода луча (порт 3?5h,
индекс 4h).
Регистр используется для горизонтального центрирования экрана и для
задания момента времени начала сигнала горизонтального обратного хода
луча.
Биты 0-7: начало горизонтального обратного хода луча. Значение в этом
регистре, выраженное в символьных единицах времени, определяет момент
активизации сигнала горизонтального обратного хода луча.
Регистр окончания горизонтального обратного хода луча (порт 3?5h,
индекс 5h).
Биты 0-4: окончание горизонтального обратного хода луча. Для
получения сигнала горизонтального обратного хода луча длительностью L в
регистр заносятся 5 младших битов значения, подсчитываемого следующим
образом: значение в регистре начала горизонтального обратного хода луча +
L.
Биты 5-6: задержка сигнала горизонтального обратного хода луча.
Двоичный 0 означает отсутствие такой задержки. Для некоторых режимов
необходимо обеспечивать такую длительность сигнала обратного хода луча,
при которой занимает весь период времени сигнала горизонтального
гашения. Некоторые внутренние временные сигналы генерируются с
приходом заднего фронта сигнала горизонтального обратного хода. Для того,
чтобы гарантировать правильность фиксации таких сигналов, сигнал
горизонтального обратного хода луча начинается до окончания периода
отображения данных на экране, а затем задерживается на несколько
символьных единиц времени.
Бит 7: нечетный/четный начальный адрес видеопамяти. Данный бит
определяет будет ли первый адрес на выходе блока управления ЭЛТ после
начала сигнала горизонтального обратного хода четным или нет. Если
установлен логический 0 - четный адрес. 1 - нечетный адрес. Этот бит может
быть использован для горизонтального сдвига пикселей. Как правило,
данный бит устанавливается в 0.
Регистр общего количества строк растра в кадре (порт 3?5h, индекс
6h).
278
Приложение В. Назначение регистров EGA/VGA
Биты 0-7: 8 младших битов общего количества строк растра в кадре
включая и вертикальный обратный ход луча.
Значение в этом регистре определяет длительность цикла вертикального
хода луча. Девятый бит (бит номер 8) данного регистра содержится в бите 0
регистра переполнения блока управления ЭЛТ (индекс 7). В VGA
используется и 10-й бит (бит номер 9) 5-й бит регистра переполнения блока
управления ЭЛТ (индекс 7).
Регистр переполнения (порт 3?5h, индекс 7h).
Бит 0: бит 8 регистра общего количества строк в кадре (индекс 06h).
Бит 1: бит 8 регистра длительности участка отображения в кадре (индекс
12h).
Бит 2: бит 8 регистра начала вертикального обратного хода луча (индекс
10h).
Бит 3: бит 8 регистра начала вертикального гашения луча (индекс 15h).
Бит 9 для VGA определен в регистре индекс 9 бит 5
Бит 4: бит 8 регистра сравнения строк (индекс 18h). Бит 9 для VGA
определен в регистре индекс 9 бит 6.
Бит 5: Бит 9 регистра количества строк в растре (индекс 06h) для VGA.
Бит 6: Бит 9 регистра длительности вертикального отображения (индекс
12h)^aVGA.
Бит 7: Бит 9 для регистра начала обратного хода по вертикали (индекс
10h)AnaVGA.
Регистр установки номера начальной строки растра (порт 3?5h, индекс
8h).
Биты 0-4: определяют начальное значение счетчика строк растра после
вертикального обратного хода луча. Значение счетчика увеличивается на 1 с
выводом каждой строки растра на экране до тех пор, пока оно не достигнет
значения, равного значению в регистре вертикального размера символа,
после чего счетчик обнуляется,
Биты 5-6: управление побайтовым панорамированием (VGA). Это два
дополнительных бита для регистра 13h порт 3C0h при соединении двух и
четырехбитовых матриц в однобитовую.
Бит 7 -не используется.
Регистр вертикального размера символа (порт 3?5h, индекс 9h).
Биты 0-4: определяют количество строк растра в знакоместе символа,
которое и должно быть равно количеству строк растра в знакоместе минус 1.
Бит 5: бит 9 регистра индекс 15h, бит 8 в регистре индекс 7h. (VGA)
Бит 6: бит 9 регистра индекс 18h, бит 8 в регистре индекс 7h. (VGA)
Бит 7: преобразование режима 200 строк в режим 400 строк (VGA). При
установке этого бита в 1 (”200 строк") каждая строка развертки выводится
дважды, при установке в 0 удваивание отменяется.
Регистр начала курсора (порт 3?5h, индекс OAh).
279
Приложения
Биты 0-4: определяют номер строки растра начала отображения курсора
в знакоместе. В данный регистр помещается значение на 1 меньше номера
строки растра начала курсора.
Бит 5: отключение курсора (VGA). При установке бита в 1 курсор
выключается.
Биты 6-7: не используются.
Регистр окончания курсора (порт 3?5Ь, индекс ОВЬ).
Биты 0-4: значение данного поля определяет номер строки растра
окончания отображения курсора в знакоместе.
Биты 5-6: данное поле используется для управления задержкой сигнала
курсора. Их содержание означает:
- 00 - отсутствие задержки;
- 01 - задержка на одну символьную единицу времени;
- 10 - задержка на две символьные единицы времени;
- 11 - задержка на три символьные единицы времени.
Бит 7: не используется.
Регистр старшей составляющей начального адреса (порт 3?5Ь, индекс
ОСЬ).
Биты 0-7: содержат старший байт, смещения начального адреса
видеопамяти, с которого начинается сканирование в начале кадра (начало
видеостраницы). Смещение (регистры с индексами ОСЬ и ODb) задается
относительно сегментного адреса ВОООЬ, или В800Б, или А000Ь в
зависимости от видеорежима (см. бит 0 регистра 04Ь блока синхронизации).
При начальной установке смещение равно 0. Изменяя смещение начального
адреса можно выполнять переключение видеостраниц или аппаратные
сдвиги.
Регистр младшей составляющей начального адреса (порт 3?5Ь, индекс
ODh).
Биты 0-7: содержат младший байт смещения начального адреса
видеопамяти.
Регистр старшей составляющей позиция курсора (порт 3?5Ь, индекс
ОЕЬ).
Биты 0-7: содержат значение старшей составляющей позиции курсора.
Регистр младшей составляющей позиции курсора (порт 3?5Ь, индекс
OFh).
Биты 0-7: содержат младшие 8 бит позиции курсора.
Регистр начала вертикального обратного хода луча (порт 3?5Ь, индекс
10Ь).
Биты 0-7: содержат младшие 8 бит номера строки растра начала
вертикального обратного хода луча. Биты 8 и 9 этого регистра расположены в
регистре переполнения (07Ь).
280
Приложение В. Назначение регистров EGA/VGA
Регистр старшей составляющей адреса светового пера, /только EGA/
(порт 3?5h, индекс 10h).
Биты 0-7: содержат старшие 8 бит счетчика адреса памяти в момент
нажатия кнопки светового пера.
Регистр окончания вертикального обратного хода луча (порт 3?5h,
индекс 1 lh).
Биты 0-3: четыре младших бита счетчика регистра концы обратного
хода луча по кадру.
Бит 4: сброс кадрового прерывания. При установке в этом бите 0
сбрасывается последнее кадровое прерывание (IRQ2).
Бит 5: разрешение кадрового прерывания. Установка 0 в этом бите
означает разрешение кадрового прерывания (IRQ2) в начале каждого
обратного хода луча по кадру.
Бит 6: выбор пяти циклов восстановления (VGA). Значение бита должно
быть равно 1 для поддержки мониторов с частотой 15,75 кГц, требующих
пяти циклов восстановления за цикл сканирования. Установка, равная 0,
соответствует трем восстановлениям за цикл сканирования.
Бит 7: защита регистров 0-7 (VGA). Регистры могут быть защищены от
записи путем установки в этом бите 1.
Регистр младшей составляющей адреса светового пера /только EGA/
(порт 3?5h, индекс 1 lh).
Биты 0-7: содержат младшие 8 бит счетчика адреса памяти в момент
нажатия кнопки светового пера.
Регистр длительности участка отображения в кадре (порт 3?5h,
индекс 12h).
Биты 0-7: содержат младшие 8 бит значения, определяющего
длительность участка отображения в кадре - номер последней отображаемой
на экране строки растра в кадре. Биты 8 и 9 расположены в регистре
переполнения (07h).
Регистр смещения (порт 3?5h, индекс 13h).
Биты 0-7: определяют длину логической строки экрана. Именно на эту
величину увеличивается начальный адрес строки экрана в видеобуфере при
переходе от вывода одной строки к выводу следующей строки. Длительность
строки измеряется в словах или в двойных словах или в цепочках(деленное
на 2,4,8) в зависимости от выбранного метода задания временных сигналов в
блоке управления ЭЛТ (см. регистры 14h и 17h).
Регистр положения символа подчеркивания (порт 3?5h, индекс 14h).
Биты 0-4: определяют положение символа подчеркивания в знакоместе.
Сюда заносится значение на 1 меньшее номера строки растра знакоместа в
которой должен появиться символ подчеркивания.
Бит 5: счет по 4 (VGA). При установке бита в 1 обеспечивается деление
одного символьного такта (который изменяет значение счетчика адресов
281
Приложения
памяти) генератора символов на 4, т.е. адрес памяти изменяется один раз
через каждые четыре такта.
Бит 6: режим двойное слово (VGA). При установке в бите 1 для
адресации памяти используется двойное слово. Для того чтобы использовать
этот бит, необходимо в бите 6 регистра управление режимом (индекс 17h)
установить 0.
Бит 7: не используется.
Регистр начала вертикального гашения луча (порт 375h, индекс 15h).
Биты 0-7: определяют значение счетчика строк растра, при котором
активизируется сигнал вертикального гашения луча. Сюда заносятся
младшие 8 бит значения счетчика. Бит 8 помещается в регистр переполнения
(07h), а бит 9 в регистр вертикального размера символа (09h).
Регистр окончания вертикального гашения луча (порт 3?5h, индекс 16h).
Биты 0-4: определяют значение счетчика строк растра, при котором
сигнал вертикального гашения перестает быть активным. Для получения
сигнала вертикального гашения длительностью L в рассматриваемые биты
регистра заносятся младшие 5 бит значения, полученного в результате
прибавления L, измеренного в строках растра, к значению в регистре начала
вертикального гашения луча.
Регистр управления режимом (порт 3?5h, индекс 17h).
Бит 0: управление совместимостью с CGA. Если рассматриваемый бит
содержит логический 0, то в момент вывода данных на экран бит 0 счетчика
адреса в строке заменяется при формировании адреса памяти 13-м битом
счетчика адреса. В случае логической 1 тринадцатый бит счетчика адреса
появляется в качестве 13-го бита выходного сигнала адреса памяти блока
управления ЭЛТ. В адаптере CGA в качестве контроллера ЭЛТ используется
микросхема 6845 позволяющая адресовать только 128 строк растра. Для
получения возможности функционирования CGA в графическом режиме
640*200, его контроллер ЭЛТ программируется таким образом, что
используется 100 строк растра с двумя адресами строк растра на одну строку.
Бит 0 адреса строки растра становится старшим битом адреса памяти
дисплейного буфера. Таким образом, последовательные строки растра
отстоят друг от друга в видеопамяти на 8 Кб. Использование данного бита
регистра управления режимом адаптер EGA/VGA позволяет добиться
совместимости с микросхемой 6845 при работе в соответствующих
графических режимах.
Бит 1: логический 0 вызывает появление бита 1 счетчика адреса в строке
в качестве 14-го бита адреса памяти. В случае задания логической 1 14-й бит
адреса памяти соответствует 14-му биту счетчика адреса в строке.
Бит 2: выбор сигнала горизонтального обратного хода для управления
счетчиком строк растра. Логический 0 обеспечивает изменение значения
счетчика строк растра по получению каждого сигнала горизонтального
282
Приложение В. Назначение регистров EGA/VGA
обратного хода луча, логическая 1 - по получению каждого второго сигнала.
Этот бит может быть использован для удвоения вертикального разрешения,
обеспечиваемого контроллером ЭЛТ. Ввиду того, что длина регистра общего
количества строк растра в кадре составляет 9 бит, счетчик строк растра
обеспечивает максимальное разрешение в 512 растровых строк. Если
приращение значения счетчика строк растра производится с частотой
появления сигнала горизонтального обратного хода деленной на два, то
вертикальное разрешение может быть удвоено и достигать 1024 строк.
Бит 3: если этот бит установлен в 0, счетчик адреса памяти изменяется в
соответствии с тактовой частотой (в символьных единицах времени). Если
бит установлен в 1 - тактовая частота делится на 2. Данный бит используется
для формирования адреса при доступе к байту или слову в видеопамяти в
процессе регенерации изображения на экране.
Бит 4: логический 0 - использование выходных драйверов разрешено,
логическая 1 - все выходы переводятся в режим высокого сопротивления.
Бит 5: с помощью данного бита осуществляется управление появлением
бита 13 или бита 14 счетчика адреса памяти на месте бита 0 адреса памяти в
режиме адресации слов. Если режим адресации слов не используется, 0-й бит
счетчика адреса памяти появляется в качестве бита 0 адреса памяти.
Логическая 1 в данном бите регистра управления режимом служит для
выбора бита 15 счетчика адреса памяти. Если в адаптере установлена память
размеров 64 Кб, при использовании режима чет/нечет следует выбирать бит
13. Если объем памяти превышает 64 Кб, следует выбирать бит 15. Данная
функция необходима для обеспечения совместимости с адаптером CGA.
Бит 6: режим адресации слов или режим адресации байтов. Логический
0 - все адреса памяти в режиме адресации слов сдвигаются на 1 бит влево, а
старший бит счетчика становится младшим битом адреса памяти (см.
таблицу В.4). Логическая 1 - режим адресации байтов.
Таблица В.4 - Значение адресов памяти в режиме адресации
слов и адресации байт
Сигналы внутреннего счетчика адреса намята подаваемые на выходной мультиплексор
Вых. котроллера ЭЛТ Режим адресации байтов Режим адресации слов
MA0/RFA0 МАО МА 15 или МА 13
MA1/RFA1 МА 1 МАО
... ...
MA14/RS3 МА 14 МА 13
MA15/RS 4 МА 15 МА 14
Бит 7: аппаратный перезапуск; установка логического 0 вызывает
очистку горизонтального и вертикального счетчиков. Логическая 1 переводит
адаптер в режим нормального функционирования счетчиков.
283
Приложения
Регистр сравнения строк (порт 3?5h, индекс 18h).
Биты 0-7: содержат 8 младших битов номера строки для сравнения.
Когда значение счетчика строк становится равным указанному в данном
регистре, значение счетчика очищается. Это позволяет защитить часть экрана
от изменения при выполнении операции прокрутки (скроллинга). Бит 8
рассматриваемого регистра содержится в регистре переполнения (07h), а бит
9 в регистре вертикального размера символа (09h).
В.4 Регистры графического контроллера
Все регистры графического контроллера работают в режиме W. Кроме
регистров позиции графики 1 и 2 (которые в режимах EGA/VGA не
программируются) все регистры индексируются адресным регистром (порт
3CEh), а запись данных проводится через порт 3CFh. Назначение регистров
приведено в таблице В.5.
Таблица В.5 - Регистры графического контроллера
N Наименование Порт Индекс
1 Регистр позиции графики 1 (Graphics 1 Position ) ЗСС -
2 Регистр позиции графики 2 (Graphics 2 Position ) ЗСА -
3 Адресный регистр графического контроллера (Graphics 1 & 2 Address) ЗСЕ -
4 Цвета (Sct/Reset) 3CF 00
5 Разрешения цвета (Enable Set/Reset) ЗСЕ 01
6 Сравнения цветя (Color Compare) 3CF 02
7 Вращения данных (Data rotate) 3CF 03
8 Выбора плоскости для чтения (Read Map Select) 3CF 04
9 Выбора режима (Mode) 3CF 05
10 Многоцелевой (Miscellaneous) 3CF 06
11 Регистр независимости от значения плоскости при чтении (Color Don't Care) 3CF 07
12 Битовой маски (Bit Mask) ЗСЕ 08
Регистр позиции графики 1 (порт 3CCh).
Биты 0-1: биты иерархии графических микросхем. Регистр позиции
определяет, за обработку каких двух битов процессорных данных отвечает
каждая графическая микросхема. Для адаптеров EGA/VGA в этот регистр
всегда заносится значение 0.
Биты 2-7: не используются.
Регистр позиции графики 2 (порт 3CAh).
Биты 0-1: биты иерархии графических микросхем. Регистр позиции
определяет, за обработку каких двух битов процессорных данных отвечает
каждая графическая микросхема. Для адаптеров EGA/VGA в этот регистр
всегда заносится значение 1.
Биты 2-7: не используются.
284
Приложение В. Назначение регистров EGA/VGA
Адресный регистр графического контроллера (порт ЗСЕЬ).
Биты 0-3: биты адреса регистра графического контроллера, в который
будет производиться запись.
Биты 4-7: не используются.
Регистр цвета (порт 3CFh, индекс Oh).
Биты 0-3: содержат значения, помещаемые в соответствующие битовые
плоскости при записи данных в режиме записи 0 при условии, что в регистре
разрешения цвета соответствующая плоскость разрешена.
Биты 4-7: не используются.
Регистр разрешения цвета (порт 3CFh, индекс lh).
Биты 0-3: используются для разрешения заполнения каждого бита в
байте битовой плоскости значением бита из регистра цвета для
соответствующей плоскости при использовании режима записи 0. Если
установлен режим записи 0 и плоскость не разрешена для записи значением
из регистра цвета, то в данную плоскость при выполнении процессором
операции записи в память видеоадаптера заносится байт данных,
поступающий от процессора.
Биты 4-7: не используются.
Регистр сравнения цвета (порт 3CFh, индекс 2h).
Биты 0-3: используются для задания 4-х битового кода цвета для
сравнения. Если установлен режим чтения 1 и выполняется операция чтения
видеопамяти, то в прочитанном байте каждый бит, для которого значения
всех четырех плоскостей совпадают с соответствующими бигами из
рассматриваемого регистра, будет установлен в 1 и в 0 в противном случае.
Биты 4-7: не используются.
Регистр вращения данных (порт 3CFh, индекс 3h).
Биты 0-2: определяют количество бит, на которое производится
циклический сдвиг данных процессора влево при записи данных в
видеобуфер в режиме записи 0.
Биты 3-4: при выполнении операции записи данные процессора могут
быть логически обработаны вместе с данными хранящимися в регистре-
защелке следующим образом (00 - замена данных регистра-защелки данными
процессора, 01 - AND, 10 - OR, 11 - XOR).
Если должен быть выполнен циклический сдвиг, то операция сдвига
выполняется до выполнения логической операции.
Биты 5-7: не используются.
Регистр выбора плоскости для чтения (порт 3CFh, индекс 4h).
Биты 0-2: двоичный код определяет номер плоскости, из которой будут
читаться данные при выполнении операции чтения в режиме 0. Значение в
данном регистре не оказывает влияния на результат выполнения операции в
режиме чтения 1.
Биты 2-7: не используются.
285
Приложения
Регистр выбора режима (порт 3CFh, индекс 5h).
Биты 0-1: режим записи. Подробно рассмотрены в п. 11.4.
Бит 2: при установке в 1 все выходы графического контроллера
переводятся в режим высокого сопротивления для тестирования.
Бит 3: режим чтения. Подробно рассмотрены в п. 11.4.
Бит 4: логическая 1 используется для выбора режима адресации
чет/нечет, который является полезным при работе в режимах совместимости
с адаптерами типа CGA. Обычно значение данного бита совпадает со
значением бита 3 регистра режима использования памяти блока
синхронизации.
Бит 5: логическая 1 - в регистрах сдвига каждой графической
микросхемы последовательный поток данных формируется таким образом,
что биты с четными номерами помещаются в битовые плоскости с четными
номерами, а с нечетными номерами - в нечетные битовые плоскости.
Бит 6: режим 256 цветов (VGA). Функционирование аналогично
регистру сдвига. После преобразования данных в последовательную форму
каждый байт преобразуется в массив 2*4 бита для атрибутного контроллера.
Так как каждый пиксель представляется двумя последовательными битами
четырех параллельных потоков некоторые из функций атрибутного
контроллера не реализуется в режиме 256 цветов.
Бит 7: не используется.
Многоцелевой регистр (порт 3CFh, индекс 6h).
Бит 0: используется для управления адресацией в алфавитно-цифровых
режимах. Логическая 1 переводит адаптер в графический режим. В
графическом режиме фиксация адресов генератора символов не
производится.
Бит 1: логическая 1 - бит 0 генерируемого процессором адреса заменяет
старший бит адреса и, таким образом четная/нечетная плоскость выбирается
в зависимости от того, четный или нечетный адрес формирует процессор при
обращении к видеопамяти.
Биты 2-3: данные биты используются для отображения пространства
адресов процессора на видеопамять (00 - AOOOh длиной 128 Кб и более, 01 -
AOOOh длиной 64 Кб, 10 - B000h длиной 32 Кб, 11 - B800h длиной 32 Кб).
Если пространство адресов начинается с AOOOh и имеет длину 128 Кб, в
системе не может быть дополнительно установлен никакой другой
дисплейный адаптер.
Биты 4-7: не используются.
Регистр независимости от цвета (порт 3CFh, индекс 7h).
Бит 0-3: логическая 1 в каждом бите - при чтении с использованием
регистра сравнения цвета значение в соответствующей битовой плоскости
0 - 3 не оказывает влияния на результат.
Биты 4-7: не используются.
286
Приложение В. Назначение регистров EGA/VGA
Регистр битовой маски (порт 3CFh, индекс 8h),
Биты 0-7: если n-й бит регистра маски установлен в 0, n-й бит в каждой
из 4-х плоскостей при выполнении операции записи не будет изменен (при
условии, что последняя операция чтения производилась процессором по тому
же адресу, что и запись). Если бит установлен в 1, то соответствующий бит
может быть изменен в соответствии с правилами, определяемыми
значениями других регистров графического контроллера. Битовая маска
используется при всех вариантах выполнения операции записи (при
циклическом сдвиге, выполнении логических операций OR, XOR, AND, при
записи плоскостей данными из регистра цвета и т.д.). Для того чтобы с
помощью регистра маски защитить определенные биты в байте от изменения,
находящиеся по рассматриваемому адресу видеопамяти данные должны быть
помещены во внутренний регистр-защелку адаптера. При выполнении
процессором операции чтения байта видеопамяти данные всех четырех
плоскостей автоматически помещаются в регистр-фиксатор. Битовая маска
одновременно применяется ко всем четырем плоскостям.
В.5. Регистры контроллера атрибутов
Адресный регистр и регистр данных контроллера атрибутов
отображаются на порт 3C0h. Записанное в этот порт значение передается в
порт адреса или порт данных, в зависимости от состояния внутреннего
триггера атрибутного контроллера (см. таблицу В.6).
Таблица В.6 - Регистры контроллера атрибутов
№ Наименование Порт Индекс
1 Адресный регистр (Address Register) ЗСОЬ
2 Регистры палитры (Palette Registers) 3C0h 00-OFh
3 Регистр управления режимом (Mode Control Register) 3C0h lOh
4 Регистр управления цветом бордюра (Overscan Color Register) 3C0h llh
5 Регистр разрешения отображения битовой плоскости (Color Plane Enable Register) 3C0h 12b
6 Горизонтального сдвига пикселей (Horisontal Pel Panning Register) 3C0h 13h
1 Регистр выбора цвета (только VGA) 3C0h 14h
Внутри контроллера адресация организована таким образом, что
каждый раз после записи в порт 3C0h производится переключение: адресный
регистр - регистр данных, соответствующий значению адресного регистра и
наоборот. Для инициализации процесса переключения адресный регистр -
регистр данных (вначале доступ к адресному регистру, а потом к регистру
данных и т.д.) необходимо выполнить операцию чтения из регистра
состояния (порта с адресом 3BAh или 3DAh). После выполнения операции
чтения первый доступ к порту 3C0h будет обращением к адресному регистру
287
Приложения
контроллера атрибутов. После загрузки адресного регистра следующая
команда вывода в порт 3C0h приведет к записи требуемого значения в
соответствующий регистр данных контроллера атрибутов. Выполнение этой
команды снова делает адресный регистр доступным для записи и процесс
может быть продолжен.
В адаптере EGA все регистры работают в режиме записи, в VGA
внутренние регистры допускают чтение через порт 3Clh (т.е. запись индекса
в порт 3C0h и чтение содержимого из порта 3Clh).
Адресный регистр контроллера атрибутов (порт 3C0h).
Биты 0-4: адресный регистр является регистром-указателем и доступен
для записи через порт с адресом 3C0h. В этот регистр загружается двоичный
код регистра контроллера атрибутов, к которому будет производиться
обращение.
Бит 5: при загрузке регистров палитры данный бит должен быть
установлен в 0. Для обеспечения доступа к регистрам палитры в процессе
регенерации изображения на экране значение этого бита должно быть
равным 1. Поэтому после программирования регистров контроллера
атрибутов необходимо послать в адресный регистр (порт 3C0h) код 20h,
иначе единственным результатом вашего программирования будет черный
экран монитора.
Биты 6-7: не используются.
Регистры палитры (индексы от Oh до Fh).
Биты 0-5: 6-ти битовые регистры палитры (rgbRGB) предназначены для
динамического отображения атрибутов символов или цветов пикселей в
графических режимах в конкретные цвета их образов на экране дисплея.
Логическая 1 используется для выбора соответствующей составляющей в
сигнале цветности на входе монитора. Для того, чтобы избежать появления
на экране различного рода срывов изображения, регистры цветовой палитры
следует модифицировать только в интервалы времени обратного хода луча.
Биты 6-7: не используются.
Регистр управления режимом (индекс 1 Oh),
Бит 0: логическая 1 - графический режим, логический 0 - алфавитно-
цифровой режим.
Бит 1: монохромный дисплей/цветной дисплей. Логический 0 -
интерпретация атрибутов символов применительно к цветному дисплею.
Логическая 1 - интерпретация атрибутов символов для монохромного
дисплея.
Бит 2: если данный бит установлен в 0, 9-й столбец в растре всех
символов будет заполнен цветом фона. Логическая 1 - применительно к
символам псевдографики с кодами от COh до DFh включительно, 9-й столбец
растра символа будет совпадать с 8-м столбцом. Если загружена кодовая
таблица в которой символы из указанного интервала заменены другими
288
Приложение В. Назначение регистров EGA/VGA
символами, данный бит следует установить в 0. В противном случае,
начертания на экране указанных символов будут искажены.
Бит 3: логический 0 - седьмой бит байта атрибутов символа
интерпретируется как бит управления интенсивностью фона. Логическая 1 -
использование седьмого бита байта атрибута для мигания символа на экране
в алфавитно-цифровых режимах. В графических режимах, в которых
допускается мигание, данный бит регистра управления режимом должен
также быть установлен в 1.
Бит 4: не используется.
Бит 5: совместимость горизонтального сдвига (VGA). При установке в
бите 1 в регистре горизонтального сдвига (см. индекс 13h) после сравнения
строк и до обратного хода луча по кадру устанавливается 0 (при окончании
обратного хода луча по кадру в регистр горизонтального сдвига вновь
загружается программное значение). При установке 0 регистром
горизонтального сдвига игнорируется сравнение строк.
Бит 6: при установке бита в 1 каждый пиксель соответствует 8 битам
(применяется в режиме 13h) для получения до 256 цветов. Во всех других
режимах бит должен быть установлен в 0.
Бит 7: выбор Р5, Р4 (VGA). При установке в 1 биты 4 и 5 регистров
палитры (индексы O-Fh) замещаются битами 0 и 1 регистра выбора цвета
(индекс 14h). При установке в 0 значения из регистров палитры в ЦАП
передаются без изменений.
Регистр управления цветом бордюра (индекс 1 lh).
Биты 0-5: определяет цвет рамки (бордюра) на экране монитора.
Применительно к монохромным дисплеям значение данного регистра
следует установить равным 0.
Биты 6-7: не используются.
Регистр разрешения отображения битовой плоскости (индекс 12h).
Биты 0-3: логическая 1 в одном или нескольких из указанных битов
определяет использование соответствующей битовой плоскости (плоскостей)
при формировании изображения на экране дисплея. Логический 0 запрещает
использование плоскости (плоскостей) при выводе изображения на экран.
Биты 4-5: выбор доступности для чтения через входной регистр
состояния 1 двух из шести составляющих цвета (см. табл. В.1).
Биты 6-7: не используются.
Регистр горизонтального сдвига пикселей (индекс 13h).
Биты 0-3: значение в рассматриваемых 4-х битах определяет количество
пикселей, на которое необходимо произвести горизонтальный сдвиг
видеоданных влево. Такой сдвиг возможен как в алфавитно-цифровых, так и
в графических режимах. Далее приводятся последовательности значений,
используемые для сдвига изображения на 0,1,2 и т.д. пикселей
(9 точек/символ - 8, 0,1, 2, 3,4, 5,6, 7, и 8 точек/символ - 0, 1,2, 3, 4, 5, 6, 7).
289
Приложения
Биты 4-7: не используются.
Регистр выбора цвета (индекс 14h).
Биты 0-1: S ueer 4-5. При установке в бите 7 регистра управление
режимом атрибута (индекс 10h) значения 1 описываемые биты замещают
биты 4 и 5 регистров палитры (см. п. 11.3.2).
Биты 2-3: Б_цвет 6-7. Эти биты используются в качестве старших битов
регистров палитры (см.п.10.3.2).
Биты 4-7: не используются.
В.6. Регистры цифро-аналогового преобразователя
Регистр состояния ЦАП (порт 3C7h, режим R).
Биты 0-1: если ЦАП находится в режиме записи, код равен 11b. Если
значение битов равно 00b, то ЦАП находится в режиме чтения.
Биты 2-7: зарезервированы.
Регистр адреса чтения PEL (порт 3C7h, режим W).
Биты 0-7: номер регистра PEL данных (от 0 до 255), который должен
быть прочитан. Данные выбранного регистра считываются из порта 3C9h.
Считывается последовательно три байта. В каждом байте младшие шесть бит
определяют яркость цвета: первый - красного, второй - зеленого, третий -
синего. После считывания трех байт адрес автоматически увеличивается.
Регистр адреса записи PEL (порт 3C8h, режим W).
Биты 0-7: номер регистра PEL Данных (от 0 до 255), куда должны быть
записаны данные. Данные записываются в порт 3C9h (три байта, в которых .
младшие шесть бит определяют яркость цветов: красный, зеленый, синий).
После занесения трех байт адрес автоматически увеличивается.
Регистр данных PEL (порт 3C9h, режим W/R).
Биты 0-5: значение цвета для чтения или записи.
Биты 6-7: зарезервированы.
Чтение или запись последующего регистра PEL должны быть разнесены
как минимум на 240 нс. Не следует читать или писать в регистр PEL во
время активного вывода на экран (выполняется в период обратного хода луча
или при затемненном экране (бит 5 регистра режима синхронизации,
индекс 1, порт 3C5h).
Регистр маскирования PEL (порт 3C6h, режим W).
Биты 0-7: маска регистров PEL. BIOS инициализирует значение FFh.
290
Приложение Г. Документированные видеорежимы
Приложение Г.
Документированные видеорежимы
Таблица Г. 1 - Видеорежимы стандартной BIOS
Режим Тип Формат Размер символов Кол-во цветов Тин видеопамяти
0 TXT 40x25 8x8* 16/8 (Shades) 4-х слойная
1 TXT 40x25 8x8* 16/8 4-х слойная
2 TXT 80x25 8x8* 16/8 (Shades) 4-х слойная
3 TXT 80x25 8x8* 16/8 4-х слойиая
4 Gr 320x200 8x8 4 Линейная
5 Gr 320x200 8x8 4 (Shades) Линейная
6 Gr 640x200 8x8 2 Линейная
7 TXT 80x25 9x14* 3 (B/W/Bold) Линейная
08h-0Ch резерв
ODh Gr 320x200 8x8 16 4-х слойиая
OEh Gr 640x200 8x8 16 4-х слойная
OFh Gr 640x350 8x14 3 (B/W/Bold) Линейная
lOh Gr 640x350 8x14 4 или 16 4-х слойиая
Uh Gr 640x480 8x16 2 Линейная
12h Gr 640x480 8x16 16 4-х слойная
13h Gr 320x200 8x8 256 Линейная
14h-7Fh Режимы нестандартных расширений BIOS для VGA и SVGA
Shades - градации серого.
B/W/Bold - черный/белый/яркий.
* Формат знакоместа определяется аппаратно: видеорежимы 0-3: CGA
— 8x8, EGA — 8x14, VGA — 9x16; видеорежим 7: MDA и EGA - 9x14, VGA
-9x16, LCD -8x8.
291
Приложения
Таблица Г.2 - Видеорежимы VESA BIOS
Видеорежим Формат Кол-во цветов Тип видеопамяти
100h Gr 640x400 256 Линейная
10Ih* Gr «40x480 256 Линейная
102h** Gr 800x600 16 4-х слойиая
103h Gr 800x600 256 Линейная
104b Gr 1024x768 16 4-х слойиая
105h Gr 1024x768 256 Линейная
108h TXT 80x60 16 4-х слойиая
109h TXT 132x25 16 4-х слойиая
10 Ah TXT 132x43 16 4-х слойиая
lOBh TXT 132x50 16 4-х слойиая
lOCh TXT 132x60 16 4-х слойиая
lODh Gr 320x200 32768 Линейная
lOEh Gr 320x200 65536 Линейная
lOFh Gr 320x200 16,7M Линейная
110b Gr 640x480 32768 Линейная
111b Gr 640x480 65536 Линейная
H2h Gr 640x480 16,7М Линейная
113h Gr 800x600 32768 Линейная
114h Gr 800x600 65536 Линейная
116h Gr 1024x768 32768 Линейная
117h Gr 1024x768 65536 Лниейная
118b Gr 1024x768 16,7М Линейная
119h Gr 1280x1024 32768 Лниейная
11 Ah Gr 1280x1024 65536 Линейная
HBb Gr 1280x1024 16/7М Линейная
HCh Gr 1600x1200 32768 Линейная
HDh Gr 1600x1200 65536 Лниейная
HEh Gr 1600x1200 16.7М Линейная
* Режим 640x480x256 совпадает со стандартным режимом 13h.
** Режим 800x600x16 можно задавать и как 6Ah через функцию 0 INT
10h.
292
Приложение Д. Команды шины SCSI
Приложение Д.
Команды SCSI
Таблица Д. 1 - Команды SCSI
Код Имя команды я назначение
40h Change Definition - модификация определении операций для ЛУ
39h Compare - побайтное сравнение данных двух ЛУ
18h Сору - копирование данных с одного Л У на другое
3Ah Copy And Verify - копирование данных с одного ЛУ на другое с верификацией
lOh Erase - стирание (участка или до конца носителя)
30h Erase (10) - то же с 10-байтным блоком дескриптора
BOh Erase(12) - то же с 12-байтиым блоком дескриптора
A6h Exchange Medium - обмен носителями между двумя элементами устройства
04h Format- выбор шрифтов и форм
04h Format Unit-форматирование устройства
34h Get Data Buffer Status - опрос состояния буфера данных
08h Get Message- прием пакета из коммуникационного устройства
28h Get Message (10) - то же с 10-байтным блоком дескриптора
A8h Get Message (12) - то же с 12-байтным блоком дескриптора
25h Get Window ~ получение информации о предварительно определенном окне
07h Initialize Element Status - инициализация состояния элемента
12h Inquiry - опрос тина устройства, уровня стандарта, идентификатора производителя, модели н т. п.
IBh Load/Unload - загрузка/разгрузка носителя
2Bh Locate - позиционирование на заданный логический блок
36h Lock-Unlock Cache - фиксация заданных логических блоков в кэше устройства и ее отмена
4Ch Log Select- запись статистической информации, обработка которой поддерживается устройством, в ЦУ или ЛУ
4Dh Log Sense - считывание статистической информации с ЦУ или ЛУ
38h Media Scan сканирование (иоиск непрерывной области чистых или записанных блоков)
I5h Mode Select (6) - запись параметров носителя, ЦУ или ЛУ (с 6-байтным блоком дескриптора)
55h Mode Select (10) - то же с 10-байтиым блоком дескриптора
lAb Mode Sense (6) - считывание параметров носителя, ЦУ или ЛУ (с 6-байтным блоком дескрннторя)
5Ah Mode Sense (10) - то же с 10-байтным блоком дескрннторя
A5h Move Medium - передача носителя
31h Object Position - позиционирование (загрузка/выгрузка) сканируемого объекта
4Bh Pause/Resume - пауза/продолжение воспроизведения аудио
45h Play Audio (10) - аудиовоспроизведение указанных логических блоков
ASh Play Audio (12) - то же с 12-байтным блоком дескриптора
47h Play Audio MSF- аудиовоснронзведенне с адресацией MSF
48h Play Audio Track/Index - аудиовоснронзведенне с указанием треков и индексов
49h Play Track Relative (10) - аудновоснроизведеине с адресацией относительно трека
293
Приложения
Продолжение таблицы Д.1
Код Имя команды назначение
A9h Play Track Relative (12) - то же с 12-байтным блоком дескриптора
2Bh Position To Element - позиционирование к указанному элементу
34h Pre-Fetch - считывание блоков данных в кэш (без нередачи ИУ)
JEk PrevenVAllow Medium Removal - запрет/разрешеняе смены носителя в ЛУ
OAk Print- печать блока данных
08k Read (6) чтение данных (с 6-байтным блоком дескриптора)
28k Read (10) - то же с 10-байтным блоком дескриптора
A8k Read (12) - то же с 12-байтным блоком дескриптора
05h Read Block Limits - запрос ограничений на длину блока (минимальная н максимальная длины)
3Ck Read Buffer - чтение буфера
25k Read Capacity - определение емкости ЛУ
25h Read Cd-Rom Capacity - определение емкости CD-ROM
37k Read Defect Data - чтение списков дефектных блоков (P-list - исходный список от изготовителя, G-list - список, заполняемый при эксплуатации) .
B7h Read Defect Data (12) - то же с 12-байтным блоком дескриптора
B8k Read Element Status - чтение состояния элементов
29k Read Generation - чтение максимально возможного поколения для указанного логического блока
44k Read Header - чтение заголовка логического блока CD-ROM
3Ek Read Long - “длинное” чтение (данные блока н ноля ЕСС)
34k Read Position - запрос позиции данных, находящихся в буфере (адрес начала и конца, количество блоков и бантов)
OFk Read Reverse - чтение блоков с текущей рознцнн в обратном направлении
42k Read Sub-Channel - чтение данных субканала CD-ROM
43h Read ТОС - чтение таблицы содержимого CD-ROM
2Dh Read Updated Block - чтение определенного поколения обновленного логического блока
07k Reassign Blocks - переназначение дефектных блоков
08k Receive - прием накета
ICh Receive Diagnostic Results - получение результатов диагностики
14h Recover Buffered Data - восстановление данных, посланных в буфер, но не записанных (не напечатанных) из-за ошибки
17k Release - освобождение зарезервированного ЛУ, экстента или элемента
03k Request Sense - опрос уточненного состояния
B5k Request Volume Element Address - передача результатов команды Send Volume Tag
16h Reserve - предотвращение использования ЛУ (его экстента или элемента) другим ИУ
Oik Rewind - ирнведение ЛУ в начальное состояние
IBk Scan - сканирование данных в определенном окне
31k Search Data Equal - поиск данных, совпадающих с эталоном
Blk Search Data Equal (12) - то же с 12-байтным блоком дескриптора
30h Search Data High - поиск данных, больше эталона
BOh Search Data High (12) - то же с 12-байтным блоком дескриптора
32k Search Data Low - поиск данных, меньших эталона
B2h Search Data Low (12) - то же с 12-бантным блоком дескриптора
294
Приложение Д. Команды шины SCSI
Окончание таблицы Д. 1
Код Имя команды и назначение
OBh Seek(6) - позиционирование (с 6-байтным блоком дескриптора)
2Bh Seek(lO) - позиционирование (с 10-байтным блоком дескриптора)
OAh Send - посылка пакета
2Ah Send (10) - посылка данных в устройство
IDh Send Diagnostic - запуск теста ЦУ. Ответом будет состояние good если тест прошел успешно, или check condition в случае ошибки
OAh Send Message - посылка пакета в коммуникационное устройство
2Ah Send Message (10) - то же с 10-байтиым блоком дескриптора
A Ah Send Message (12) - то же с 12-байтиым блоком дескриптора
B6h Send Volume Tag - посылка тега тома (шаблона) для поиска его в элементах илн для создания нового тега
33h Set Limits - определение области логических адресов, над которыми могут выполняться операции цепочки команд
B3h Set Limits (12) - то же с 12-байтиым блоком дескриптора
24h Set Window - определение окна сканирования
OBh Slew And Print - прогон бумаги и печать
llh Space - относительное позиционирование (вперед и назад) на заданное число блоков, файлов, маркеров и т. п.
IBh Start/Stop Unit - разрешение/запрет операций с носителем, извлечение носителя
IBh Stop Print - останов печати с очисткой буфера или без нее
lOh Synchronize Buffer - синхронизация буфера (печать всего содержимого), при невозможности — сообщение об ошибке
35h Synchronize Cache - синхронизация кэша (запись иесохраненных данных заданного диапазона адресов на носитель)
OOh Test Unit Ready - опрос готовности ЛУ
3Dh Update Block - обновление логического блока
13h Verify - верификация (проверка возможности безошибочного считывания блоков данных с носителя)
2Fh Verify (10) - то же или проверка занятости блоков (с 10-байтным блоком дескриптора)
AFh Verify (12) - то же с 12-байтным блоком дескриптора
OAh Write (б) - запись блоков данных, переданных ИУ (с 6-байтным блоком дескриптора)
2Ah Write (10) - то же с 10-байтным блоком дескриптора
A Ah Write (12) - то же с 12-байтным блоком дескриптора
2Eh Write And Verify - запись блоков данных, переданных ИУ, с верификацией записи
A Eh Write And Verify(12) - то же с 12-байтиым блоком дескриптора
3Bh Write Buffer - запись в буфер (но не на носитель) илн загрузка микрокода
lOh Write Pilemarks - запись маркера файлов
3Fh Write Long - "длинная" запись (запись блока данных и поля ЕСС)
41h Write Same - запись блока данных, переданных иу, в группу смежных блоков или до конца носителя
295
Навчалъне видання
ПОВОРОЗНЮК Анатолш Тванович
АРХ1ТЕКТУРА КОМП’ЮТЕРГВ
Частина 2
Архитектура зовшшньо! пам’яп, вщеосистеми та зовшшн!х штерфейав
(В авторсыай редакцп)
Навчальний посхбник
Роботу до видання рекомендував В.Д. Дмитр1енко
Подписано до друку 10.11.2004. Формат 60x84 1/16. Пашр друк. №2
Друк - р!зограф1я. Гарнпура Times New Roman. Ум. друк. арк. 16,4
Обл.-вид. Арк. 20,4. Тираж 500 прим. Зам №143/42. Цша догов1рна.
Шдготовлено видавничим центром НТУ "ХПГ’(План 2004 р., поз. 106/190-04)
61002, Харюв, вул. Фрунзе, 21.
Свтоцтво про державку реестращю ДК № 116 вщ 10.07.2000 р.
Друкарня ООО ’’Торнадо” 61000, Харгав, вул. Отакара Яроша, 18а.
Поворозшок Анатолий Иванович,
канд. техн, наук, доп., проф.
каф. “Вычислительная техника и
программирование ПТУ “ХПИ