Файл: jourdain_spravochnik_programmista.docx

ВУЗ: Не указан

Категория: Не указан

Дисциплина: Не указана

Добавлен: 04.07.2020

Просмотров: 3062

Скачиваний: 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:имяфайла".