Жанр: Учеба
Программно-аппаратная организация компьютера IBM PC
...яти. Два
исправления из трех, внесенных в тестовые программы, касаются этой
процедуры. (Здесь представляется уместным показать, что программы,
подобные BIOS, работающие непосредственно с аппаратурой, отличаются от
обычных программ. Корректность функционирования программ тестирования
устройств, а также программы BIOS часто зависит от тонкостей
функционирования контролируемых устройств. Временные характеристики
управляющих сигналов, а также их взаимная согласованность могут оказывать
решающее воздействие на факт успешного завершения этих программ. В целом
ряде случаев отладка таких программ производится опытным путем - одного
логического анализа бывает недостаточно. Вот почему, говоря об изменениях,
внесенных в тестовые программы, я не смог сказать ничего определенного о
смысле этих изменений).
Одно из изменений, внесенных в программы тестирования, затрагивает
сразу три программы. Цель изменения: обеспечение безусловного обновления
операций таймера до момента обработки управляющего прерывания
видеомонитора. В первой версии этого не делалось.
Не следует огорчаться, если Вам непонятно значение введенных
изменений - они практически никак не сказываются на работоспособности
правильно функционирующей системы. Остальные изменения (описываются ниже)
представляют для Вас большой интерес.
Одно из внесенных изменений представляет интерес прежде всего для
тех, кто использует коммуникационный адаптер. На программы ПЗУ,
обслуживающие коммуникационный адаптер, среди прочих, возлагаются также
функции оповещения в случае отсутствия на линии связи сигнала отклика.
Если по истечении определенного промежутка времени такой сигнал не
появился, то коммуникационные программы ПЗУ вырабатывают признак
"тайм-аут". /Тайм-аут - интервал времени, когда одна сторона принимает
определенные меры, если в течение заданного времени она не получит ответа
от другой стороны (Прим.перев.)/. К сожалению, в результате обычной
опечатки программы ПЗУ не вырабатывают признак "тайм-аут". Ошибка возникла
из-за различий в представлении десятичных и шестнадцатеричных чисел при
записи шестнадцатеричного числа 80Н символ "Н" был потерян и число
воспринялось как десятичное (т.е. шестнадцатеричное 50). В программе это
число (константа) используется для установки в единичное состояние
конкретных битов; таким образом, вместо установки в единичное состояние
одного бита-признака состояние "тайм-аут" были установлены два других
бита-признака "готовности данных" (условие обратное "тайм-аут") и "ошибка
четности" (свидетельствует о возможной ошибке в данных).
Следствием этой ошибки является возможность неправильной работы
коммуникационной программы. Если она запрограммирована без учета ошибки
BIOS-ПЗУ, то отсутствие ответа в телефонной линии будет восприниматься как
ошибка четности данных (таким образом нарушается объективность
диагностики).
Следующая ошибка, обнаруженная во второй версии BIOS-ПЗУ, относилась
к программам управления принтером. Проблема, как и прежде, заключалась в
тестировании состояния "тайм-аут". При выполнении какой-либо работы для
компьютера принтер может находиться в состоянии "устройство занято";
возможен также такой режим работы, когда принтер сигнал ответа не
вырабатывает. Управляющая программа BIOS-ПЗУ тестирует эти режимы, ожидая
некоторое время поступления сигнала ответа. К сожалению, это время было
выбрано без учета наиболее длительной операции, выполняемой принтером -
протяжки бумаги на интервал, равный одной одной странице. В первой
редакции BIOS-ПЗУ это время было явно меньше требуемого, поэтому в новой
версии до момента появления признака "тайм-аут" проходит вдвое большее
время.
Вслед за принтером изменения затронули и программы поддержки
накопителя на магнитной ленте кассетного типа. Здесь была изменена
последовательность выполнения нескольких команд, что привело к небольшому
изменению временных характеристик процесса считывания данных. Поскольку в
составе IBM/PC накопитель кассетного типа используется весьма редко (т.е.
последствия ошибки незначительны), то это изменение относится к разряду
несущественных.
Последнее изменение представляет интерес для тех пользователей
IBM/PC, которые используют цветной графический адаптер. Не всем известно,
что при работе с цветным графическим адаптером в графическом режиме (в
отличие от работы в текстовом режиме) символы выводятся на экран в режиме
рисования, подобно тому как выводится изображение любого другого объекта
графической природы. (Эти вопросы подробно рассматриваются в главе 9,
посвященной отображению графических объектов). В ПЗУ предусмотрена
специальная таблица, содержащая графические образы символов ASCII с тем,
чтобы их можно было вывести как элементы алфавита.
При работе цветного графического монитора в текстовом режиме
отображаемые символы генерируются цветным графическим адаптером схемно; в
графическом же режиме символы рисуются на экране управляющей программой
ПЗУ, использующей табличные образы. Один из этих образов в первой версии
BIOS был закодирован с ошибкой, а именно: символ СНR$(4), обозначающий
сокровища на колодах для игральных карт, имел одну лишнюю точку снизу. Во
второй версии BIOS-ПЗУ эта ошибка устранена.
Ни одна из перечисленных выше ошибок не относится к разряду
катастрофических. Наиболее значимая из них влечет за собой неправильное
формирование признака "тайм-аут" при работе с асинхронной линией связи, то
есть ошибочное описание ситуации, а не ошибочные действия. Редкий
пользователь IBM/PC сумеет ее распознать, даже, если знает в чем дело.
Знать о всех изменениях имеет смысл постольку, поскольку нельзя быть
уверенным в том, что изменения, затрагивающие особенности работы машинных
программ (даже в незначительной степени) всегда должным образом
документируются и открыто публикуются. Здесь важен прецедент, дающий
основание беспокоиться, что более важные и существенные изменения могут
быть осуществлены без ведома пользователей.
6.6. Механизм выборки информации из ПЗУ
В данном параграфе мы обобщим все аспекты, связанные с активизацией
служебных программ BIOS-ПЗУ. Любой вид обслуживания обеспечивается через
механизм прерываний; по причинам, которые мы подробно рассматривали в
главе 3, прерывания позволяют запускать (выполнять) программы, без
предварительных сведений о их местоположении( при необходимости можно
осуществлять перемещение этих программ).
Ниже приведена таблица прерываний, используемых для активизации
программ BIOS-ПЗУ, а также программ, имеющих к ним непосредственное
отношение.
____________________________________________________________
Номер Шестнадцатиричный Назначение
код
____________________________________________________________
5 5 Операция печати содержимого
экрана
16 10 Операции ввода/вывода на
экран дисплея
17 11 Контроль оборудования;
используется для определения
подключенного оборудования
18 12 Проверка памяти; используется
для определения объема памяти
19 13 Операции ввода/вывода с
накопителей на дискете;
различные операции с
накопителем на дискете;
различные операции с дискетой
20 14 Ввод/вывод для RS-232;
операции с асинхронным
коммуникационным адаптером
21 15 Ввод/вывод для накопителя на
магнитной ленте кассетного
типа
22 16 Ввод/вывод с клавиатуры
23 17 Ввод/вывод для принтера
24 18 Загрузка кассетной версии
Бейсика
25 19 Перегрузка системы
26 1А Функции даты и времени
____________________________________________________________
Полный список программ обслуживания значительно шире. При
необходимости каждой отдельной функции обслуживания мог бы быть присвоен
свой собственный номер прерывания или наоборот - все функции могли бы быть
обозначены одним кодом прерывания, образуя своего рода управляющее
прерывание.
Более продуктивным, однако, представляется подход, когда с каждым
прерыванием связывают один функциональный разрез, обеспечивая таким
образом их логическую группировку. Такой путь ведет к управляемому числу
отдельных прерываний с обоснованным разделением функций обслуживания.
Несмотря на то, что потребности в каждой функции различны, существуют
некоторые общие положения относительно особенностей перемещения данных
между точкой вызова функции и собственно функций. Если Вы используете
интерфейсные программы, поставляемые на дискете в качестве дополнения к
данной книге, у Вас не будет возможности ознакомиться с деталями
реализации каждой функции. Знать как они работают между тем весьма
полезно.
За исключением отдельных случаев в рамках одного прерывания
реализуются несколько функций. Для передачи номера, обозначающего
субфункцию используется регистр AH. Для передачи параметров в обоих
направлениях используются регистры, причем система стремится к их
экономному использованию. Программы обслуживания обеспечивают сохранение
всех регистров, не используемых для передачи параметров; вызывающая
программа таким образом не должна заботиться о сохранении величин,
находящихся в различных регистрах. Если требуется выделить область памяти
для данных, например, для буфера данных считываемых с дискеты или кассеты,
то для представления сегментированных адресов используются регистры ES и
BX.
Регистры AH, AX используются для передачи программам обслуживания
кода возврата или результирующего сигнала. В некоторых случаях для
индикации ошибки используется флаг переноса CF, однако как правило флаги
не используются. Регистры общего назначения AX ... DX следует использовать
экономно по мере необходимости, придерживаясь алфавитного порядка.
В последующих пяти главах мы детально рассмотрим все перечисленные
выше типы прерываний и особенности работы с регистрами.
6.7. Описание специальных прерываний
Как уже упоминалось в главе 3, три строки в таблице векторов
прерываний используются не по прямому назначению для хранения адресов
программ обслуживания прерываний , а для хранения адресов базовых таблиц
системы (поскольку эти таблицы размещаются в ПЗУ). Ниже мы поясним
назначение этих таблиц.
Первая таблица (с кодом фиктивного прерывания 29) содержит адрес
таблицы инициализации видеодисплея, используемой для контроля управляющих
кодов для экранов дисплеев. Таблица размещается в ПЗУ по адресу F000: F0A4
и включает три подтаблицы с видеопараметрами. Каждая подтаблица имеет
четыре строки по одной строке на каждый из четырех режимов отображения:
монохромный, 40-столбцовый цветной, текстовой, 80-столбцовый цветной,
текстовой и оба графических режима. Одна из подтаблиц фиксирует размер в
байтах буфера дисплея, соответствующего текущему режиму. (Подробно эти
вопросы рассматриваются в главе 8 и 9).
Еще одна подтаблица фиксирует ширину граф, учитываемую при
автоматическом переходе от одной строки в другую. Практическая польза от
модификации этой таблицы близка к нулю, поэтому в дальнейшем она
рассматривается не будет.
Адрес второй таблицы (соответствует прерыванию 30) указывает на
таблицу параметров дискет. Эта таблица содержит данные, предназначенные
для контроля временных параметров различных операций, выполняемых с
дискетой. Таблица расположена в ПЗУ по адресу F000 : EFC7. Сразу же после
выпуска компьютера IBM/PC стало ясно, что некоторые временные
характеристики, внесенные в эту таблицу весьма приблизительны и являются
причиной слишком медленной работы дискового накопителя. Среди
многочисленных изменений, внесенных в DOS версии 1.10 были данные,
снижающие время обращения к дисковому накопителю. Здесь использовался
классический метод - в процессе самонастройки дисковая операционная
система создавала новую версию таблицы в обычной памяти и заменяла ее
адрес в векторе, инициализируемой по прерыванию 30. Поскольку при
выполнении любой операции с диском производится обращение к этой таблице,
то после замены адреса вектора, активной становилась новая таблица. В
главе 7 (посвященной описанию дискового накопителя) мы рассмотрим детали,
связанные с этой таблицей и укажем внесенные изменения.
Адрес третьей таблицы, получаемой по фиктивному прерыванию 31,
указывает на область генератора графических символов, используемых при
формировании на дисплее символов CH$(128), ..., CHR$(255) в любом из двух
графических режимов. Стандартной таблицы этого типа попросту не
существует. Если две предыдущие таблицы всегда находятся в ПЗУ, то данная
таблица в ПЗУ отсутствует. А коль скоро это так, то вектор прерывания
будет содержать нулевое значение (является признаком отсутствия таблицы)
до тех пор, пока программа не построит такую таблицу и не занесет
соответствующий адрес в вектор прерывания. При изучении графического
режима работы (глава 9) мы увидим, что существует много интересных вещей,
связанных с таблицей генерации символов.
Все эти общие положения, касающиеся ПЗУ, образуют ту основу, опираясь
на которую мы перейдем к рассмотрению широких возможностей отдельных узлов
IBM/PC. Этому посвящены пять следующих глав. Начнем с дисковых
накопителей, рассматривая их до того как программа построит таблицу и
поместит адрес этой таблицы в соответствующий вектор прерываний.
Приложение 6.1. Текст программы проверки метки версии ПЗУ (Паскаль).
module Listing_6_1;
type
string8 = string(8);
bios_ptr_type = ads of string8;
var
bios_date : bios_ptr_type;
procedure check_rom_bios_date;
begin
bios_date.s :=#F000;
bios_date.r :=#FFF5;
if bios_date^='04/24/81' then
begin
end
else
begin
end;
end;
end.
ГЛАВА 7. ДОСТУП К ДИСКЕТАМ
__________________________
С этой главы начинается подробное по-элементное рассмотрение
возможностей IBM/PC - начиная с дисководов для гибких магнитных дисков.
Изложение материала этой и четырех последующих глав будет следовать
организации служебных процедур системы BIOS в ПЗУ. Однако, наше изложение
не ограничивается только описанием возможностей, которые предоставляются
системой BIOS. Для каждой из возможностей будет рассматриваться вся
техническая информация, полезная или интересная любому, кто хочет понять
особенности реализации этой возможности и особенности ее использования.
Если обратиться к трем уже упоминавшимся областям интересов, то
следует отметить, что вся информация полностью относится только к IBM/PC.
Что касается совместимых с IBM/PC компьютеров, можно ожидать, что большая
часть информации применима и к ним тоже, но степень применимости будет
зависеть от того, насколько точно конкретный компьютер копирует IBM/PC;
для всех компьютеров, которые рекламируются как совместимые по системе
BIOS , данная информация полностью применима. Для семейства компьютеров,
работающих под управлением операционной системы MS-DOS, приведенная в этих
должен предоставлять любой компьютер, но нельзя рассчитывать, что все
детали полностью совпадут.
7.1. ТРИ УРОВНЯ ДОСТУПА К ДИСКЕТЕ
Имеются три способа, позволяющие осуществлять доступ к данным,
хранящимся на дискете, - из программы на языке программирования высокого
уровня (такого, как Паскаль или БЕЙСИК), посредством вызова функции ДОС и
посредством обращения к служебной процедуре системы BIOS в ПЗУ. Все эти
способы образуют трехуровневую иерархию, в которой служебные процедуры
системы BIOS образуют нижний, наиболее примитивный уровень. Уровень
функций ДОС строится на основе служебных процедур системы BIOS. Уровень
языков программирования является верхним уровнем и строится на основе
функций ДОС и служебных процедур системы BIOS.
Может существовать еще один, более высокий уровень, обеспечиваемый
системой управления базами данных того или иного типа.
Операции ввода/вывода с дискетой на уровне языков программирования
обычно удовлетворяют все потребности по манипулированию данными,
хранящимися на дискете. В тех случаях, когда этого оказывается
недостаточно, не хватает как раз не "атомарных" функций низкого уровня, а
процедур более высокого уровня, предоставляемых только системами
управления базами данных. Однако, иногда требуется доступ к дискете на
более низком уровне, например, для прямого чтения или записи секторов
дискеты. Для выполнения таких операций необходимо обращаться к двум другим
уровням ввода/вывода с дискетой - к уровням ДОС И BIOS.
В главе 4 мы уже рассмотрели доступ ко всем функциям ДОС, включая и
функции ввода/вывода с дискетой. Одно из главных достоинств функций
ввода/вывода на уровне ДОС заключается, как Вы могли уже заметить изучая
главу 4, в ширине диапазона их возможностей. Функции ДОС позволяют
выполнять как операции довольно высокого уровня (например, поиск в
справочнике файлов по родовым именам), так и операции среднего уровня
(чтение и запись логических записей) и даже операции низкого уровня
(чтение и запись секторов по абсолютному номеру).
Широкие возможности уровня функций ДОС делают их особенно
привлекательными для использования. Языки программирования, такие как
Паскаль, обычно организуют все свои средства ввода/вывода с помощью
функций ДОС. Если Вы хотите освободиться от ограничений, накладываемых
организацией системы ввода/вывода выбранного Вами языка программирования,
я советую обратиться к функциям ввода/вывода ДОС.
Если главная причина обращения к специальным операциям ввода/вывода
связана с необходимостью чтения или записи секторов дискеты, то лучше
воспользоваться функциями ДОС, чем процедурами BIOS. Это связано только с
тем, что дополнительный сервис, предоставляемый функциями ДОС, избавит Вас
от необходимости заботиться о таких деталях как повторение попытки
выполнения операции в случае ошибки или выдержки времени, необходимого для
разгона двигателя дисковода. Тем не менее, Вам может потребоваться прямой
доступ к процедурам уровня BIOS, например, если нужно обойти процедуры
обнаружения ошибок ДОС или когда нужно выполнить операцию, которая не
выполняется средствами ДОС. По этой причине ниже приводится описание
служебных процедур системы BIOS в ПЗУ, предназначенных для работы с
дискетами.
7.2. Служебные процедуры обслуживания дискет системы BIOS в ПЗУ.
Для обслуживания дисководов в системе BIOS имеется шесть процедур.
Доступ ко всем осуществляется с помощью прерывания номер 19
(шестнадцатиричное значение 13). В этом разделе мы рассмотрим каждую из
них и увидим некоторые примеры их использования. Программы 7.101 и 7.102,
включенные в дисковый пакет прилагающийся к этой книге, обеспечивают
необходимые ассемблерные подпрограммы для доступа к этим процедурам BIOS,
а также определения и вспомогательные программы на Паскале, облегчающие
использование ассемблерных подпрограмм.
Первая служебная процедура, которая имеет код 0, сбрасывает дисковую
подсистему в исходное состояние. Эта процедура может использоваться для
восстановления после различных ошибок и сбоев. Эта операция аналогична
операции сброса в ДОС (вызов функции номер 13), но она выполняется на
более низком уровне системы BIOS. Операция сброса диска посылает команду
контроллеру дисков, приводящую его в исходное состояние. Заметим, что
здесь не выполняются такие действия как установление дисковода,
выбираемого ДОС по умолчанию, - для этого должна выполняться операция
сброса на уровне ДОС.
Наиболее очевидное использование операции сброса - в процедуре
восстановления после ошибки. Часто наилучшим способом действий программы в
случае ошибки операций с дискетой является быстрое прекращение всех
действий, с предоставлением возможности разбираться в происшедшем
пользователю компьютера. В конце концов, большинство дисковых ошибок
связаны с причинами, которые невозможно устранить программно, например, с
механическими повреждениями дискеты или неправильной работой механики
дисковода. Однако, Ваша программа должна использовать все имеющиеся
возможности для восстановления после ошибки и процедура сброса может стать
важной составной частью такой программы восстановления.
Вторая служебная процедура, с кодом 1, позволяет прочитать код
состояния дисковой подсистемы. Состояние изменяется любой дисковой
операцией, так что эта процедура отражает последнюю выполненную операцию с
дискетой. Эту процедуру можно использовать для слежения за теми операциями
ввода/вывода, которыми Вы не можете управлять непосредственно. Например,
если выполняется обычная операция ввода/вывода на уровне языка высокого
уровня и получено сообщение об ошибке, вызов этой процедуры поможет лучше
понять, что произошло, в чем состоит ошибка, так чтобы программа могла
выполнить необходимые корректирующие действия. Ниже приведены коды
состояний, которые могут возвращаться, сами по себе или в некоторой
комбинации, этой процедурой.
КОД ШЕСТНАДЦАТИРИЧНОЕ СМЫСЛ
ЗНАЧЕНИЕ
___ _______________ ________________________________________
1 01 Была выдана неправильная команда
2 02 Не найден адресный маркер (используемый
для обнаружения сектора)
3 03 Была запрошена операция записи для
дискеты, защищенной от записи
4 04 Запрашиваемый сектор не найден
8 08 Неправильный адрес при операции прямого
доступа к памяти (ПДП)
9 09 При ПДП перейдена граница 64К памяти
16 10 Ошибка чтения данных, обнаруженная при
проверке циклического избыточного кода
32 20 Ошибка контроллера гибких дисков
64 40 Ошибка поиска указанной дорожки
128 80 Тайм-аут: ответ от дисковода не получен
в положенное время
Третья и четвертая процедуры, с кодами 2 и 3, считывают и записывают
один или несколько секторов (объединяемых в блок) на одной дорожке. Я
советую использовать эквивалентные функции ДОС, что избавит Вас от
необходимости проверять возникновение ошибок или повторять выполнение
операций. Заметим что эти две операции, а также соответствующие функции
ДОС позволяют считывать или записывать одновременно несколько секторов.
Если Вам необходимо выполнить очень быстрый ввод или вывод данных, эти
операции позволяют переслать вплоть до целой дорожки данных за время
одного оборота дискеты. Чтение/запись секторов по одному требуют затраты
времени одного оборота на каждый сектор.
Впрочем чтение/запись нескольких секторов имеет и свои недостатки.
Один из таких недостатков - необходимость организации большого буфера,
размером до 4К байт при чтении целой дорожки. Если можно работать с
данными в том же месте памяти, куда они считываются или откуда они
записываются, такой недостаток не будет существенным, но если требуется
выделить отдельную буферную область для работы с дискетой, тогда чтение
или запись нескольких секторов увеличат требования к памяти, занимаемой
Вашей программой. Имеются и другие недостатки, например, если происходит
ошибка, то ее обнаружение и восстановление после нее могут оказаться
значительно сложнее, поскольку трудно установить на каком из секторов
произошла ошибка. Эта сложность несколько меньше при использовании
служебных процедур BIOS, поскольку они ведут подсчет числа переданных
секторов, который может быть проанализирован программой; функции ДОС не
обеспечивают такой возможности. Проблема ошибки в процессе выполнения
многосекторной операции не слишком существенна при чтении, но при записи
она может весьма осложнить задачу восстановления, если программа не может
определить сколько секторов уже было записано.
Пятая служебная процедура, с кодом 4, используется для верификации
данных после операции чтения или записи. Она повторно считывает сектора,
используя для проверки циклические избыточные коды. Эта процедура
используется по ключу "/V" в команде ДОС COPY. Верификацией не следует
злоупотреблять и на то есть все основания. Во-первых, операции с дискетами
доста
...Поділитися у соцмережах