ВУЗ: Не указан
Категория: Не указан
Дисциплина: Не указана
Добавлен: 04.07.2020
Просмотров: 3143
Скачиваний: 1
Отметим, что в Бейсике 3.0 добавлены операторы IOCTL и IOCTL$.
Они позволяют бейсиковской программе, соответственно, посылать и
принимать управляющие строки от драйвера устройства, которое было
предварительно открыто оператором OPEN. Выходная строка должна
быть заключена в кавычки, как в IOCTL #3,"...". Подобным образом,
A$ = IOCTL$(3) принимает информацию о статусе через IOCTL.
7.2.5 Обнаружение и анализ ошибок устройства.
Устройства могут ошибаться по одной из трех причин. Устройство
может быть физически повреждено или находиться не в том состоя-
нии. Может быть плохим программное обеспечение, управляющее уст-
ройством. И, наконец, программа может послать устройству недопус-
тимый запрос (например, попытка писать на накопитель, где нахо-
дится дискета защищенная от записи). MS DOS обнаруживает и анали-
зирует большинство таких ошибок и обеспечивает возможности для
восстановления.
Высокий уровень.
Интерпретатор Бейсика обнаруживает многие ошибки, включая
ошибки драйверов устройств. При обнаружении ошибки возвращается
код ошибки и если не предусмотрена программа восстановления при
ошибках, то программа останавливается. Однако можно установить
обработку ошибок, с тем чтобы когда происходит критическая ошибка
Бейсик автоматически переходил на процедуру восстановления при
сбоях, которую Вы создали. Процедура может проанализировать код и
определить в какой строке программы произошла ошибка. После того
как это сделано, программа может принять меры по устранению ошиб-
ки, либо с помощью пользователя, либо выполняя другую часть прог-
раммы. После того, как эта процедура завершена, программа может
продолжить выполнение с любого места, с которого Вы захотите (с
некоторыми ограничениями). Код для тщательного анализа ошибочных
ситуаций может существенно увеличить размер программы. Отметим,
что компилятора Бейсика даже минимальные проверки на ошибки пот-
ребуют дополнительно по не менее чем 4 байта на каждую строку
программы.
Чтобы разрешить обработку ошибок в Бейсике поместите в начале
программы строку ON ERROR GOSUB n, где n это номер строки прог-
раммы, в которой начинается процедура обработки ошибок. При воз-
никновении критической ошибки управление будет передано на эту
строку. В начале процедуры поместите ряд строк вида IF ERR = n
THEN номерстроки, где n - номер ошибки, взятый из приложения к
руководству по Бейсику, содержащему сообщения об ошибках. Номера
строк в этих операторах соответствуют началу кода, обрабатывающе-
го данную конкретную ошибку. Эти части могут быть в свою очередь
разбиты на куски рядом операторов IF ERL = n THEN номерстроки.
ERL возвращает номер строки, в которой произошла ошибка, позволяя
процедуре восстановления точно определить ошибочное место.
После того как процедура восстановления завершила свою работу
надо использовать оператор RESUME для возврата управления в ту
строку, где произошла ошибка. За этим оператором может следовать
номер, в этом случае управление будет передано на строку с ука-
занным номером. Однако, имейте ввиду, что нельзя использовать
RESUME для перехода в точку программы, которая находится за пре-
делами процедуры, в которой произошла ошибка. Если восстановление
после ошибки невозможно, но необходимо, чтобы программа продолжи-
ла свою работу, то напишите RESUME NEXT и управление будет пере-
дано на строку, следующую за той, в которой произошла ошибка. Вот
общая структура процедуры восстановления в Бейсике:
100 ON ERROR GOSUB 5000 'разрешаем обработку ошибок
.
.
5000 IF ERR = 61 THEN 5100 'диск полон
5010 IF ERR = 71 THEN 5200 'диск не готов
.
.
5100 IF ERL = 2080 THEN 5120 'где произошла ошибка?
5110 BEEP: PRINT "Disk in drive B: is full": RESUME
5120 BEEP: PRINT "Disk in drive A: is full": RESUME
.
5200 BEEP: PRINT "A disk drive is not ready"
5210 PRINT "Strike any key when corrected"
5220 IF INKEY$ = "" THEN 5220 'ожидаем нажатия клавиши
5230 RESUME ERL - 10 'пытаемся повторить операцию
В Бейсике 3.0 введены инструкции ERDEV и ERDEV$. Обе они поз-
воляют получить переменные только для чтения от прерывания 24H,
обрабатывающего критичекие ошибки. Z% = ERDEV возвращает в Z%
слово статуса, в котором старший байт содержит 13-15 биты атрибу-
та заголовка устройства, а младший байт - код ошибки прерывания
24H. Z$ = ERDEV$ помещает в Z$ 8-байтное имя устройства для сим-
вольных устройств и 2-байтный указатель накопителя для блочных
устройств.
Низкий уровень.
Иногда драйверы устройств содержат такие серьезные ошибки, что
программа просто не может продолжаться, пока они не будут исправ-
лены. Когда такие ошибки происходят, то система вызывает обработ-
чик критических ошибок. Он может вступать в действие как для
стандартных устройств, так и для установленных драйверов. Пользо-
ватель наиболее часто сталкивается с ним, когда пытается произ-
вести дисковую операцию с дисководом, у которого открыта дверца.
В этом случае появляется сообщение: "Not ready error reading
drive A - Abort, Retry, Ignore?"
Обработчик критических ошибок может быть переписан, чтобы он
лучше обрабатывал устройства, для которых Вы создали устанавли-
ваемые драйверы. Вектор прерывания 24H указывает на стандартную
процедуру MS DOS, но Вы можете перенаправить вектор на свою про-
цедуру. При вызове этой процедуры старший бит AH содержит 0 если
ошибка произошла на блочном устройстве и 1, если на символьном.
BP:SI указывают на заголовок драйвера виновного устройства, кото-
рый может дать дополнительную информацию. Восемь байтов, начиная
со смещения AH в заголовке содержат имя устройства, а обработчик
критичеких ошибок помещает код ошибки длиной в слово в DI. Вот
кодовые номера (они не представляют битовых позиций):
Код Проблема
0 попытка писать на диск, защищенный от записи
1 неизвестное устройство
2 накопитель не готов
3 неизвестная команда
4 ошибка обмена данными
5 неверная длина запроса
6 ошибка поиска
7 неизвестный тип носителя
8 сектор не найден
9 нет бумаги в принтере
A ошибка при записи
B ошибка при чтении
C общая ошибка
В случае дисковой ошибки AL содержит номер накопителя, на котором
произошла ошибка (0 = A, 1 = B и т.д.), а биты 2-0 AH индицируют
тип ошибки. Бит 0 устанавливается, если ошибка произошла во время
операции записи, и сбрасывается - если при чтении. Биты 2-1 со-
держат информацию о том, в каком месте диска произошла ошибка,
давая 00 - для начальных секторов DOS, 01 - для FAT, 10 - для
каталога и 11 - для всего остального диска.
Имеется три способа, которыми программа может восстановиться
после критической ошибки:
1. Можно попросить пользователя устранить причину ошибки (напри-
мер, закрыть дверцу накопителя), после чего система предоставит
устройству возможность повторить операцию.
2. Управление может быть возвращено инструкции, следующей за INT
21H, которая сделала попытку обратиться к драйверу.
3. Программа может завершиться и вернуть управление системе.
Ваша процедура обработки ошибок может восстановить ситуацию,
выдав инструкцию IRET, после того, как она поместила 0 в AL,
чтобы игнорировать ошибку, 1 - чтобы повторить операцию и 2 -
чтобы завершить программу. Если Вы хотите, чтобы Ваша процедура
провела восстановление сама, то она должна восстановить регистры
выполняемой программы из стека, а затем удалить со стека все,
кроме последних трех слов. После этого инструкция IRET возвратит
управление программе, хотя сама система останется в нестабильном
состоянии до тех пор, пока она не сделает вызов функции с номером
большим, чем 12. Вот конфигурация стека (начиная сверху до низа)
когда вызывается обработчик критических ошибок:
Адрес возврата обработчика ошибок: IP, CS, флаги
Пользовательские регистры задачи, AX, BX, CX, DX, SI, DI, BP,
из которой был вызван драйвер: DS, ES, IP, CS, флаги
MS DOS обрабатывает также многие некритические ошибки. Сюда
включаются коды ошибок, которые могут возвращаться в регистрах,
когда вызывалась функция DOS. Эти коды обсуждаются в данной книге
в тех местах, в которых описываются соответствующие функции.
Однако имейте ввиду, что начиная с версии 3.0 MS DOS возвращает
расширенные коды ошибок для функций, использующих FCB или деск-
рипторы файлов. Когда при выполнении одной из этих функций уста-
навливается флаг переноса, то в AX возвращается обычный код ошиб-
ки. Дополнительный расширенный код доступен через прерывание 59H,
если в BX поместить 0. Эта функция сообщает также о критических
ошибках и она может быть использована из обработчика критических
ошибок, вызываемого через прерывание 24H.
Функция помещает в AX код ошибки, взятый из обычного списка
знакомых кодов ошибок (например, "недостаточно памяти") или один
из новых кодов (например, "ограничение доступа" для многопользо-
вательской системы). BH возвращает код класса ошибки, указывая
какого типа ошибка произошла. Например, код 1 указывает, что
исчерпаны ресурсы, т.е. что память, файловые буфера или что-то
еще израсходовано. Другие классы могут указывать на программные
ошибки, проблемы с носителями, форматированием и т.д. BL содержит
код, предполагающий действие для восстановления, такое как "пов-
торить", "прекратить" или "запросить у пользователя". Наконец, CH
возвращает число, определяющее место где возникли проблемы: на
блочном устройстве, на символьном, в памяти?
Данные для этих кодов ошибок весьма обширны. Полную информацию
о них см. в Техническом руководстве по MS DOS 3.0. Поскольку
предполагается, что MS DOS 3.0 не будет использоваться на маши-
нах, более ранних, чем AT, то использование этих кодов ограничи-
вает совместимость Ваших программ. Тем не менее, набор процедур,
предназначенный только для MS DOS 3.0 может дополняться поверх
обычных процедур обработки ошибок. В [1.1.3] показано как прог-
рамма может определить версию MS DOS, в которой она работает.
Наконец, имейте ввиду, что процесс может передавать код завер-
шения вызвавшему его процессу. Термин процесс относится к взаимо-
действующим программам. Например, когда одна программа загружает
и запускает другую с помощью функции EXEC, то запускаемая прог-
рамма называется потомком, а запускающая программа - родителем.
Родителю может потребоваться информация о том, как завершился
потомок. Чтобы использовать эту возможность, поместите желаемый
код завершения в AL и выполните функцию 4CH прерывания 21H для
завершения программы. Когда управление будет возвращено родителю,
то он выполнит функцию 4DH прерывания 21H (без входных регистров)
и в AL будет получен код завершения, который может затем быть
проанализирован. Кроме того, AH будет содержать информацию о том,
как завершился потомок: 0 - для нормального завершения, 1 - по
Ctrl-Break, 2 - по критической ошибке устройства и 3 - с помощью
функции 31H, оставляющей задачу резидентной.
Если программа завершилась с помощью этой функции (а не 20H -
см. обсуждение в [1.3.4]), то MS DOS получает код выхода и он
может быть включен в обработку командным файлом с помощью подко-
манды IF. Эта подкоманда позволяет условное исключение других
команд из командного файла. Код выхода рассматривается как номер
ERRORLEVEL и условные операции выполняются в зависимости от того,
больше он или нет определенного числа. С помощью этой возможности
командные файлы могут прекращать обработку и выводить сообющение
о возникновении ошибки в одной из запущенных программ. Более
подробная информация приведена в разделе "Команды пакетной обра-
ботки" руководства по операционной системе.
Раздел 3. Использование специальных устройств ввода/вывода.
Имеется огромное количество устройств ввода/вывода, которые
могут быть присоединены к IBM PC, включая мышь, джойстик, графо-
построители и т.д. В данном разделе обсуждаются только те уст-
ройства, которые специально поддерживаются оборудованием IBM PC.
Сюда относятся кассетные магнитофоны, световое перо и другие
устройства, которые могут быть присоединены через игровой порт.
Адреса портов, относящиеся к другим устройствам, обсуждаются в
других разделах этой книги, относящихся именно к данным устройст-
вам. Распределение адресов портов в основном одно и то же для
всех типов IBM PC:
Адрес порта Функция
00-0F микросхема DMA 8237 (не для PCjr)
20-2F микросхема прерываний 8259 (AT контроллер #1: 20-3F)
40-4F микросхема таймера 8253/8254
60-6F микросхема PPI 8255 (AT использует только адреса
клавиатуры
70-7F часы реального времени (только AT)
80-83 регистры страниц DMA (не для PCjr)
A0-BF микросхема прерываний #2 (только AT)
C0-C7 микросхема звука SN76496 (только PCjr)
F0-FF PCjr - контроллер НГМД, AT - управление математиче-
ским сопроцессором
1F0-1F8 фиксированный диск AT
200-20F игровой адаптер
278-27F AT коммуникационный порт #2
2F8-2FF коммуникационный порт COM2 (COM1 для PCjr)
320-32F фиксированный диск XT
378-37F адаптер параллельного принтера для PC, XT, AT
3B0-3BF монохромный/параллельный адаптеры (не для PCjr)
3D0-3DF цветной графический адаптер
3F0-3F7 контроллер НГМД
3F8-3FF коммуникационный адаптер COM1 (модем PCjr)
7.3.1 Чтение/запись с кассетного магнитофона.
Только очень немногие IBM PC и PCjr используют кассетный маг-
нитофон, а XT и AT не поддерживают его вообще. Помимо того, что
он очень ненадежен, обмен с кассетным магнитофоном возможен толь-
ко последовательный, но не с прямым доступом. Тем не менее, могут
быть причины для программирования кассетного магнитофона на PCjr.
Имейте ввиду, что кассетные операции используют канал 2 микросхе-
мы таймера 8253 [2.1.1], поэтому не пытайтесь одновременно ис-
пользовать этот канал для других целей. Отметим также, что при
операции чтения с кассеты, запрещено прерывание времени суток,
поэтому счетчик времени суток BIOS будет давать неверное значе-
ние.
Высокий уровень.
Хотя кассетные файлы обрабатываются совершенно по-другому чем
дисковые файлы, однако команды доступа к ним совершенно аналогич-
ны. На кассету могут записываться только программные файлы и пос-
ледовательные файлы данных. Последние могут включать файлы изоб-
ражения памяти. Отметим, что данные не могут добавляться к после-
довательным файлам. При создании, именам файлов даются следующие
однобайтные расширения:
.B программа на Бейсике
.P защищенная программа на Бейсике
.A программа на Бейсике в формате ASCII
.M файл изображения памяти
.D последовательный файл данных
Для сохранения файла на кассете напишите SAVE "CAS1:имяфайла".