












  Утвержден


  2б.00152-01 33 03-ЛУ







                  Операционная система МОС ВП



                 Подсистема системного сервиса


		   УПРАВЛЕНИЕ ВВОДОМ-ВЫВОДОМ


                    Руководство программиста
            






                     2б.00152-01 33 03

                        Листов 470/2К




1K
469K








                             1987

 Перв.примен.

  2б.00152-01                                        Литера
























               Операционная система МОС ВП
  

               Подсистема системного сервиса 


		 УПРАВЛЕНИЕ ВВОДОМ-ВЫВОДОМ



                  Руководство программиста 



                        00152-01 33 03

                          Листов 468












                             1987




                            - 2 -

                       00152-01 33 03-1






                           АННОТАЦИЯ




       Настоящий  документ  предназначен  для  программистов,

  разрабатывающих программы с использованием ввода-вывода для

  эвм СМ 1700 в операционной системе МОС ВП.

       В документе даются сведения  о  программах  системного

  обслуживания  необходимых  для  понимания  работы  программ

  управления вводом-выводом. Дано подробное описание  драйве-

  ров, входящих в состав операционной системы МОС ВП.

       Документ содержит 9 разделов и 2 приложения.

       В разделе 1 описаны назначение, условия  применения  и

  обращение к программам управления вводом-выводом.

       В разделе 2 описаны характеристики, сообщения, входные

  и выходные данные программ управления вводом-выводом.

       В разделе 3 описаны вспомогательные  управляющие  про-

  цессы.

       В разделе 4 описан драйвер терминала.

       В разделе 5 описаны драйверы накопителей на  магнитных

  дисках.

       В разделе 6 описаны драйверы накопителей на  магнитных

  лентах.

       В разделе 7 описаны драйверы построчно-печатающих уст-

  ройств.

       В разделе 8 описан драйвер почтового ящика.
                                          




                            - 3 -

                       00152-01 33 03-1


       В разделе 9 описан драйвер многофункционального  конт-

  роллера связи.

       В приложении 1 описаны коды завершения драйверов внеш-

  них устройств.

       В приложении 2 описана кодовая таблица КОИ-8.






































                            - 4 -

                       00152-01 33 03-1






                          СОДЕРЖАНИЕ





  1.  Назначение и условия применения программ.  Обращение

      к программам                                         14


  1.1.    Краткие сведения об операциях установки

          очереди ввода-вывода                             16

  1.2.    Физический,  логический  и  виртуальный

          ввод-вывод                                       17

  1.2.1.    Операции физического ввода-вывода              17

  1.2.2.    Операции логического ввода-вывода              18

  1.2.3.    Операции виртуального ввода-вывода             18

  1.3.    Кодирование функций ввода-вывода                 19

  1.3.1.    Коды функций                                   20

  1.3.2.    Модификаторы функций                           21

  1.4.    Выдача запросов ввода-вывода                     22

  1.4.1.    Назначение каналов                             22

  1.4.2.    Закрепление устройств                          24

  1.4.3.    Обращение   к   программам   управления

            вводом-выводом                                 24

  1.4.4.    Описание формата макрокоманды $QIO             27

  1.4.5.    Описание формата макрокоманды $QIOW            27

  1.4.6.    Описание аргументов макрокоманд $QIO  и

            $QIOW                                          28

  1.4.6.1.  Описание аргумента EFN                         30



                            - 5 -

                       00152-01 33 03-1


  1.4.6.2.  Описание аргумента CHAN                        31

  1.4.6.3.  Описание аргумента FUNC                        32

  1.4.6.4.  Описание аргумента IOSB                        32

  1.4.6.5.  Описание аргумента ASTADR                      32

  1.4.6.6.  Описание аргумента ASTPRM                      33

  1.4.6.7.  Описание   аргументов,   зависящих   от

            устройства и функции                           33

  1.4.7.    Описание    аргументов    и    форматов

            макрокоманд $INPUT и $OUTPUT                   34

  1.4.8.    Описание   кодов   состояния   программ

            системного обслуживания                        35

  1.5.    Завершение операции ввода-вывода                 39

  1.5.1.    Флаги событий                                  40

  1.5.2.    Блок состояния ввода-вывода                    40

  1.5.3.    Асинхронные системные прерывания (AST)         42


  2.  Характеристики, сообщения, входные и выходные данные

      программ. Описание подключения программ пользователя 44


  3.  Вспомогательные управляющие процессы (ACP) и запросы

      очереди ввода-вывода ($QIO)                          46


  3.1.    Функции ACP и их кодирование                     48

  3.2.    Блок описания файла                              50

  3.3.    Подфункции ACP                                   62

  3.3.1.    Поиск по каталогу                              63

  3.3.1.1.  Входные параметры                              63

  3.3.1.2.  Выполнение операции                            66

  3.3.2.    Доступ                                         68



                            - 6 -

                       00152-01 33 03-1


  3.3.2.1.  Входные параметры                              68

  3.3.2.2.  Выполнение операции                            74

  3.3.3.    Расширение                                     74

  3.3.3.1.  Входные параметры                              74

  3.3.3.2.  Выполнение операции                            81

  3.3.4.    Отсечение                                      82

  3.3.4.1.  Входные параметры                              82

  3.3.4.2.  Выполнение операции                            84

  3.3.5.    Чтение/запись атрибутов                        85

  3.3.5.1.  Входные параметры                              85

  3.4.    Область атрибутов записи                         97

  3.5.    Блок    статистики    атрибутов     ACP

          макрокоманды $QIO                               103

  3.6.    Основные функции ACP                            107

  3.6.1.    Создание файла                                107

  3.6.1.1.  Входные параметры                             108

  3.6.1.2.  Действие ACP для магнитных дисков             115

  3.6.1.3.  Действие ACP для магнитных лент               118

  3.6.2.    Доступ к файлу                                119

  3.6.2.1.  Входные параметры                             119

  3.6.2.2.  Выполнение операции                           124

  3.6.3.    Отмена доступа к файлу                        125

  3.6.3.1.  Входные параметры                             125

  3.6.3.2.  Выполнение операции                           126

  3.6.4.    Изменение атрибутов файла                     127

  3.6.4.1.  Входные параметры                             127

  3.6.4.2.  Выполнение операции                           129




                            - 7 -

                       00152-01 33 03-1


  3.6.5.    Удаление файла                                130

  3.6.5.1.  Выполнение операции                           131

  3.6.6.    Монтирование                                  132

  3.6.7.    Управление ACP                                132

  3.6.7.1.  Входные параметры                             132

  3.6.7.2.  Управляющие функции для магнитной ленты       135

  3.6.7.3.  Разные  функции  управления  магнитными

            дисками                                       138

  3.6.7.4.  Квоты доступа к магнитному диску              139

  3.7.    Блок состояния ввода-вывода                     146


  4.  Драйвер терминала                                   148


  4.1.    Характерные  свойства   и   возможности

          драйвера терминала. Средства контроля           148

  4.1.1.    Обработка ввода                               149

  4.1.1.1.  Редактирование   командной   строки   и

            повторный вызов команды                       149

  4.1.1.2.  Управляющие   символы   и   специальные

            клавиши                                       150

  4.1.1.3.  Контроль чтения                               160

  4.1.1.4.  Последовательности  AP2  и  управляющие

            последовательности                            160

  4.1.1.5.  Ввод с опережением                            163

  4.1.1.6.  Ограничители строки                           165

  4.1.1.7.  Специальные режимы функционирования           166

  4.1.2.    Обработка вывода                              166

  4.1.2.1.  Дуплексные режимы                             167




                            - 8 -

                       00152-01 33 03-1


  4.1.2.2.  Форматирование вывода                         168

  4.1.3.    Поддержка коммутирования                      169

  4.1.3.1.  Сигналы управления модемом                    169

  4.1.3.2.  Зависание по концу сеанса                     175

  4.1.3.3.  Сохранение процесса при зависании             175

  4.1.4.    Взаимодействие  терминала  и  почтового

            ящика                                         176

  4.1.5.    Автоматическое  регулирование  скорости

            передачи                                      180

  4.1.6.    Нестандартные управляющие символы             180

  4.2.    Информация об устройстве                        181

  4.3.    Коды функций терминала                          196

  4.3.1.    Чтение                                        196

  4.3.1.1.  Коды модификаторов функции для  функций

            чтения макрокоманды $QIO                      198

  4.3.1.2.  Ограничители функции чтения                   201

  4.3.1.3.  Чтение со списком элементов                   203

  4.3.1.4.  Чтение с проверкой                            214

  4.3.2.    Запись                                        216

  4.3.2.1.  Коды модификаторов функций для  функции

            записи макрокоманды $QIO                      218

  4.3.2.2.  Управление кареткой для функций записи        219

  4.3.3.    Установка режима                              224

  4.3.3.1.  Модификатор функции зависания                 228

  4.3.3.2.  Модификаторы  функций  разрешения   AST

            прерывания по УС/Y и УС/C                     229

  4.3.3.3.  Модификатор функции установки модема          231




                            - 9 -

                       00152-01 33 03-1


  4.3.3.4.  Модификатор петлевой функции                  232

  4.3.3.5.  Модификатор  функции   разрешения   AST

            прерывания по нестандартному символу          234

  4.3.3.6.  Модификатор функции передачи сообщения        235

  4.3.4.    Считывание режима                             236

  4.3.4.1.  Модификатор подсчета символов                 237

  4.3.4.2.  Модификатор функции чтения модема             238

  4.3.4.3.  Модификатор передачи                          240

  4.4.    Блок состояния ввода-вывода                     240

  4.5.    Примеры программирования                        244


  5.  Драйверы накопителей на магнитных дисках            271


  5.1.    Характерные  свойства   и   возможности

          драйверов. Средства контроля                    271

  5.1.1.    Контроль данных                               272

  5.1.2.    Совмещаемое позиционирование                  273

  5.1.3.    Исправление ошибок                            274

  5.1.3.1.  Пропуск сектора                               276

  5.2.    Информация об устройствах                       277

  5.3.    Коды функций  накопителя  на  магнитном

          диске                                           279

  5.3.1.    Чтение                                        288

  5.3.2.    Запись                                        290

  5.3.3.    Считывание режима                             291

  5.3.4.    Поиск                                         292

  5.3.5.    Подтверждение пакета                          293

  5.3.6.    Разгрузка                                     293




                           - 10 -

                       00152-01 33 03-1


  5.3.7.    Доступность                                   294

  5.3.8.    Установка                                     294

  5.3.9.    Проверка записи                               295

  5.4.    Блок состояния ввода-выводA                     296

  5.5.    Пример программирования                         297


  6.  Драйверы накопителей на магнитных лентах            317


  6.1.    Характерные  свойства   и   возможности

          драйверов. Средства контроля                    317

  6.1.1.    Контроль данных                               318

  6.1.2.    Восстановление ошибок                         319

  6.2.    Информация об устройствах                       320

  6.3.    Коды функций  накопителя  на  магнитной

          ленте                                           325

  6.3.1.    Чтение                                        332

  6.3.2.    Запись                                        335

  6.3.3.    Перемотка                                     337

  6.3.4.    Пропуск файла                                 337

  6.3.5.    Пропуск записи                                338

  6.3.5.1.  Обнаружение логического конца тома            339

  6.3.6.    Запись конца файла                            341

  6.3.7.    Перемотка в автономном режиме                 341

  6.3.8.    Разгрузка                                     342

  6.3.9.    Считывание   режима    накопителя    на

            магнитной ленте                               342

  6.3.10.   Установка режима                              342

  6.3.10.1. Установка режима                              343




                           - 11 -

                       00152-01 33 03-1


  6.3.10.2. Установка характеристик                       346

  6.3.11.   Подтверждение пакета                          347

  6.3.12.   Доступность                                   347

  6.4.    Блок состояния ввода-вывода                     347

  6.5.    Пример программирования                         348


  7.  Драйверы построчно-печатающих устройств             361


  7.1.    Характерные  свойства   и   возможности

          драйвера. Средства контроля                     361

  7.1.1.    Форматирование выводимых символов             361

  7.1.2.    Обработка ошибок                              362

  7.2.    Информация об устройстве                        363

  7.3.    Коды   функций    построчно-печатающего

          устройства                                      368

  7.3.1.    Запись                                        368

  7.3.1.1.  Управление кареткой для функций записи        370

  7.3.2.    Считывание режима                             376

  7.3.3.    Установка режима                              376

  7.4.    Блок состояния ввода-вывода                     377

  7.5.    Пример программирования                         378


  8.  Драйвер почтового ящика                             383


  8.1.    Операции почтового ящика                        383

  8.1.1.    Создание почтовых ящиков                      384

  8.1.2.    Удаление почтовых ящиков                      386

  8.1.3.    Защита почтового ящика                        386

  8.2.    Информация о почтовом ящике                     388




                           - 12 -

                       00152-01 33 03-1


  8.3.    Коды функций почтового ящика                    390

  8.3.1.    Чтение                                        391

  8.3.2.    Запись                                        393

  8.3.3.    Запись сообщения "конец файла"                394

  8.3.4.    Установка AST прерывания                      395

  8.3.5.    Установка защиты                              397

  8.4.    Блок состояния ввода-вывода                     398

  8.5.    Пример программирования                         400


  9.  Драйвер многофункционального  контроллера  связи  см

      1700.4304                                           408


  9.1.    Характерные  свойства   и   возможности

          драйвера                                        409

  9.1.1.    Знаково-ориентированные   протоколы   и

            режим   битстаффинга   высокоуровневого

            протокола связи данных                        410

  9.1.2.    Интерфейс программы формирования кадров

            для знаково-ориентированных протоколов        410

  9.1.3.    Изменения  в   интерфейсе   передатчика

            драйвера            ксм             для

            знаково-ориентированного режима               412

  9.1.4.    Функция IO$_CLEAN                             413

  9.1.5.    Квоты                                         413

  9.1.6.    Сбой напряжения питания                       414

  9.2.    Информация об устройствах                       414

  9.3.    Коды функций КСМ                                420

  9.3.1.    Чтение                                        423




                           - 13 -

                       00152-01 33 03-1


  9.3.2.    Запись                                        424

  9.3.3.    Установка режима                              425

  9.3.3.1.  Установка режима контроллера                  426

  9.3.3.2.  Установка режима подчиненной станции          430

  9.3.3.3.  Отключение контроллера                        433

  9.3.3.4.  Отключение подчиненной станции                434

  9.3.3.5.  Разрешение AST прерывания                     434

  9.3.4.    Считывание режима                             436

  9.3.5.    Поддержка диагностики                         437

  9.4.    Блок состояния ввода-вывода                     437

  9.5.    Пример программирования                         438


  Приложение 1. Коды завершения ввода-вывода              447


  Приложение 2. Набор символов кода КОИ-8                 458






























                           - 14 -

                       00152-01 33 03-1


      1. Назначение и условия применения программ.  Обращение

         к программам



       Средства управления вводом-выводом операционной систе-

  мы  МОС  ВП   предназначены   для   управления   операциями

  ввода-вывода при работе:  с  терминалами,  накопителями  на

  магнитных  дисках,  накопителями   на   магнитных   лентах,

  алфавитно-цифровыми  печатающими  устройствами  и   другими

  внешними устройствами.

       Устройства  разного  типа  имеют  свои  индивидуальные

  отличия. Поэтому для каждого типа устройства в операционной

  системе  существует  набор  программ,  выполняющих  функции

  управления вводом-выводом. Такие наборы программ называются

  драйверами устройств.

       Кроме драйверов устройств для  удобства  пользователей

  операционная система предоставляет дополнительные  средства

  для работы с внешними  устройствами.  Процесс  пользователя

  может выдавать запросы на ввод-вывод непосредственно в сис-

  тему ввода-вывода операционной системы МОС ВП, или он может

  вызвать процедуры системы управления данными СУД-32  опера-

  ционной системы МОС ВП. Система  ввода-вывода  операционной

  системы МОС ВП предлагает пользователю для непосредственно-

  го использования ресурсов ввода-вывода следующие  программы

  системного обслуживания:

       - назначить канал ввода-вывода ($ASSIGN);

       - отменить назначение канала ввода-вывода ($DASSIGN);

       - поставить запрос ввода-вывода в очередь ($QIO);




                           - 15 -

                       00152-01 33 03-1


       - поставить запрос ввода-вывода в очередь и ждать фла-

         га события ($QIOW);

       - закрепить устройство ($ALLOC);

       - отменить закрепление устройства ($DALLOC);

       - получить информацию о канале ($GETCHN);

       - получить информацию об устройстве ($GETDEV);

       - получить информацию об устройстве (томе) ($GETDVI);

       - отменить запрос ввода-вывода ($CANCEL);

       - создать почтовый ящик и назначить канал ($CREMBX);

       - удалить почтовый ящик ($DELMBX);

       - ждать установки одного флага события ($WAITFR);

       - ждать диз'юнкцию флагов ($WFLOR);

       - ждать кон'юнкцию флагов ($WFAND);

       - установить разрешение/запрещение  асинхронного  сис-

         темного прерывания AST ($SETAST);

       - установить режим ожидания ресурса ($SETRWM).

       Эти программы системного обслуживания позволяют эффек-

  тивно управлять вводом-выводом в операционной  системе  МОС

  ВП.

       Операционная система МОС ВП обеспечивает средства  для

  работы со следующими устройствами ввода-вывода:

       - алфавитно-цифровым дисплеем СМ 7224 (BTA 2000-17);

       - алфавитно-цифровым дисплеем с  графическими  возмож-

         ностями СМ 7225 (BTA 2000-18);

       - видеотерминалом  растровым   графическим   СМ   7317

         (эпг-3);

       - консольным устройством печати с клавиатурой СМ 6380;




                           - 16 -

                       00152-01 33 03-1


       - устройством алфавитно-цифровым параллельной печати с

         расширенным набором символов;

       - накопителем на сменных магнитных дисках емкостью  14

         мегабайт СМ 5408;

       - внешним запоминающим устройством емкостью  20  мега-

         байт на базе накопителя  на  магнитных  дисках  типа

         "винчестер" СМ 5514;

       - устройством внешней памяти  на  базе  накопителя  на

         магнитных  дисках  типа  "винчестер"  (емкостью  150

         мегабайт) СМ 5504;

       - устройством  внешней  памяти  на  магнитных   лентах

         емкостью 40 мегабайт СМ 5309;

       - устройством  внешней  памяти  на  магнитных   лентах

         емкостью 40 мегабайт СМ 5316;

       - консольным  устройством  ввода-вывода  на  кассетной

         магнитной ленте СМ 5218.



       1.1. Краткие сведения об операциях установки

            очереди ввода-вывода


       Операционная  система  МОС  ВП  обеспечивает  операции

  установки очереди ввода-вывода $QIO, которые выполняют  три

  основные функции ввода-вывода: чтение, запись  и  установку

  режима. Функция чтения обеспечивает передачу данных из уст-

  ройства в буфер, указанный  пользователем.  Функция  записи

  обеспечивает передачу данных в обратном  направлении  -  из

  буфера, указанного пользователем, на заданное устройство.





                           - 17 -

                       00152-01 33 03-1


       Функция установки режима используется  для  управления

  или описания характеристик и операций  устройства.  Функция

  установки режимов различны для различных типов устройств.



       1.2. Физический,  логический  и  виртуальный

            ввод-вывод


       Ввод и вывод данных может выполняться в одном из  трех

  режимов адресации  устройств:  физическом,  логическом  или

  виртуальном. Любой процесс, которому разрешен доступ к уст-

  ройству маской защиты тома, может выполнять операции  логи-

  ческого ввода-вывода для устройства,  которое  смонтировано

  как том с файловой структурой, отличной от файловой  струк-

  туры МОС ВП. Для выполнения физического ввода-вывода  нужны

  соответствующие  привилегии.  Для  выполнения  виртуального

  ввода-вывода привилегии не требуются.



       1.2.1. Операции физического ввода-вывода


       Операции физического ввода-вывода выполняются с  физи-

  чески адресуемыми элементами аппаратного обеспечения  (нап-

  ример, с секторами на диске). Этот режим  дает  возможность

  прямого доступа ко всем операциям  ввода-вывода  на  уровне

  устройства.

       Для выполнения операций физического ввода-вывода  про-

  цесс должен либо иметь привилегию физического  ввода-вывода

  (PHY_IO),   либо   привилегию   логического    ввода-вывода

  (LOG_IO). В последнем случае устройство должно быть смонти-




                           - 18 -

                       00152-01 33 03-1


  ровано как чужой том и маска защиты тома  должна  позволять

  доступ к устройству.



       1.2.2. Операции логического ввода-вывода


       Операции логического ввода-вывода выполняются с  логи-

  чески адресуемыми элементами устройств. Логические операции

  могут выполняться как на блочно-адресуемых устройствах, так

  и   на   устройствах,   ориентированных   на   записи.   На

  блочно-адресуемых устройствах адресуемым элементом является

  блок, состоящий из 512 байт. Блоки нумеруются от  0  до  N,

  где N - последний блок на данном устройстве. Для устройств,

  ориентированных на записи,  и  для  устройств,  на  которых

  блочная структура отсутствует, понятие логически адресуемо-

  го блока не приемлемо. Для выполнения операций  логического

  ввода-вывода процесс должен иметь либо привилегию  физичес-

  кого ввода-вывода  (PHY_IO),  либо  привилегию  логического

  ввода-вывода (LOG_IO), либо том должен быть смонтирован как

  чужой том и маска защиты тома  должна  позволять  доступ  к

  устройству.



       1.2.3. Операции виртуального ввода-вывода


       Операции виртуального ввода-вывода  могут  выполняться

  как на устройствах, ориентированных на записи,  (нефайловой

  структуры), так и на блочно-адресуемых (с файловой структу-

  рой) устройствах. Для устройств, ориентированных на записи,

  виртуальные функции идентичны логическим функциям.  Понятие




                           - 19 -

                       00152-01 33 03-1


  виртуально-адресуемого блока для этих устройств не приемле-

  мо.

       При работе с блочно-адресуемыми  устройствами,  данные

  считываются и записываются в открытые файлы.  Размер  адре-

  суемого блока файла - 512 байтов. Блоки нумеруются, начиная

  от 1, причем нумерация осуществляется по файлам,  а  не  по

  устройствам. Блочно-адресуемые устройства  должны  монтиро-

  ваться и содержать предварительно открытый файл.

       Для выполнения операций ввода-вывода необходима  соот-

  ветствующая маска защиты тома, разрешающая доступ к  задан-

  ному устройству. Если процесс имеет привилегию  физического

  или логического ввода-вывода, то он может игнорировать мас-

  ку защиты тома.



       1.3. Кодирование функций ввода-вывода


       Функции ввода-вывода можно разделить на три категории,

  соответствующие трем режимам адресации устройств  (физичес-

  кому, логическому  и  виртуальному).  Функции  ввода-вывода

  задаются 16-битовыми значениями, которые могут быть  заданы

  символически. 16-битовое значение функции задает конкретную

  операцию ввода-вывода и несколько необязательных  модифика-

  торов функции. Его формат показан на рис. 1.













                           - 20 -

                       00152-01 33 03-1



             Формат функции ввода-вывода

    15                            6 5                0
    --------------------------------------------------
    !       Модификаторы           !        Код      !
    !          функции             !      функции    !
    --------------------------------------------------

                            Рис. 1



       1.3.1. Коды функций


       Младшие шесть  битов  значения  функций  содержат  код

  конкретной операции, которая должна быть выполнена.  Симво-

  лические значения кодов функций записи и  чтения  для  всех

  трех режимов приведены в табл. 1.

                                                   Таблица 1

                    Функции чтения и записи

  ----------------------------------------------------------

   Функция ! Физический    ! Логический    ! Виртуальный

           ! ввод-вывод    ! ввод-вывод    ! ввод-вывод

  ----------------------------------------------------------

   Чтение  ! IO$_READPBLK  ! IO$_READLBLK  ! IO$_READVBLK

   Запись  ! IO$_WRITEPBLK ! IO$_WRITELBLK ! IO$_WRITEVBLK


       Функция установки режимов ввода-вывода имеет  символи-

  ческое значение IO$_SETMODE.

       Коды функций заданы для всех устройств, поддерживаемых

  операционной системой. Большинство функций являются завися-

  щими от устройств, то есть выполняют действия,  специфичные

  для конкретных типов устройств.





                           - 21 -

                       00152-01 33 03-1


       1.3.2. Модификаторы функций


       Старшие десять битов значения  функции  содержат  коды

  модификаторов  функций.  Биты  модификаторов,   каждый   по

  отдельности, определяют некоторые характеристики  выполняе-

  мой операции.  Например,  модификатор  функции  IO$M_NOECHO

  может быть задан с  функцией  IO$_READLBLK  для  терминала.

  Если два значения задаются вместе, они записываются следую-

  щим образом: IO$_READLBLK!IO$M_NOECHO.  Это  означает,  что

  данные, вводимые с клавиатуры терминала в буфер пользовате-

  ля не должны отображаться на экране терминала. Формат моди-

  фикаторов функций показан на рис. 2.


              Формат модификаторов функций


   15               13 12                6 5               0
    +------------------------------------------------------+
    !  Модификаторы,  !  Модификаторы,    !                !
    ! не зависимые от ! зависимые от уст- !      Код       !
    ! устройства/функ-! ройства/функции   !    функции     !
    ! ции             !                   !                !
    +------------------------------------------------------+

                            Рис. 2


       Модификаторы,  зависимые  от  устройства  и   функции,

  имеют, насколько это возможно, идентичные значения для уст-

  ройств различных классов. Например, модификатор IO$M_ACCESS

  используется как для магнитных дисков, так и для  магнитных

  лент и обеспечивает доступ к файлу при выполнении  операции

  создания файла. Модификаторы,  зависящие  от  устройства  и

  функции, всегда имеют  одинаковое  функциональное  значение

  для одного класса устройств.




                           - 22 -

                       00152-01 33 03-1


       Используются два независимых от устройства  и  функции

  модификатора:

       1) IO$M_INHRETRY - запрещает процедуру  восстановления

  всех ошибок;

       2) IO$M_DATACHECK - обеспечивает  сравнение  данных  в

  памяти с данными на магнитном диске или магнитной ленте.

       Третий бит поля независимых от  устройства  и  функции

  модификаторов   зарезервирован.   Если   бит   модификатора

  IO$M_INHRETRY установлен, то при возникновении любой ошибки

  выполнение операции немедленно прекращается и в  блок  сос-

  тояния ввода-вывода  заносится  код  ошибочного  завершения

  операции ввода-вывода.



       1.4. Выдача запросов ввода-вывода


       В данном подразделе описан процесс выдачи и  обработки

  запросов ввода-вывода, включая назначение каналов,  закреп-

  ление устройств, описание макрокоманд $QIO, $QIOW,  $INPUT,

  $OUTPUT и коды состояния.



       1.4.1. Назначение каналов


       Перед тем, как выдать  запрос  ввода-вывода  для  уст-

  ройства,  пользователь  должен  назначить  канал,  то  есть

  задать связь между процессом пользователя и  заданным  уст-

  ройством. Процесс использует канал для передачи  информации

  на устройство и для приема информации от устройства.

       Назначение канала устройству осуществляется с  помощью




                           - 23 -

                       00152-01 33 03-1


  программы системного обслуживания $ASSIGN. При  использова-

  нии этой программы пользователь должен задать имя устройст-

  ва (физическое или логическое) и  адрес  слова,  в  которое

  программа системного обслуживания $ASSIGN пересылает  номер

  назначенного канала. После выполнения этой программы  поль-

  зователь  может  выдать  запрос  на   выполнение   операции

  ввода-вывода,  вызвав  программу  системного   обслуживания

  установки запроса ввода-вывода в очередь $QIO, при  этом  в

  качестве одного из аргументов задается номер канала,  пере-

  данный программой системного обслуживания $ASSIGN.

       В примере канал ввода-вывода назначается для устройст-

  ва TTB4. Номер канала передается в слово TTCHAN.

       Пример.

   TTNAME:    .ASCID   /_TTB4/  ; дескриптор имени

                                ; терминала

   TTCHAN:    .BLKW    1        ; номер канала

                 .              ; терминала

                 .

                 .

              $ASSIGN_S DEVNAM=TTNAME, CHAN=TTCHAN

       Если первым символом имени устройства (DEVNAM) являет-

  ся  символ  подчеркивания  (_),  заданное  имя   устройства

  интерпретируется, как физическое имя устройства. В  против-

  ном случае выполняется преобразование логического  имени  и

  используется эквивалентное имя.

       Если в качестве устройства используется почтовый ящик,

  канал можно назначить для него с помощью программы  систем-




                           - 24 -

                       00152-01 33 03-1


  ного обслуживания $CREMBX, которая создает почтовый ящик  и

  назначает для него канал.

       Программа  системного  обслуживания  $QIO  выполняется

  только для уже назначенного канала ввода-вывода.



       1.4.2. Закрепление устройств


       Устройство может быть закреплено за процессом (или  за

  подпроцессом) с помощью программы  системного  обслуживания

  $ALLOC. Закрепленные устройства резервируются за вызывающим

  эту программу процессом, созданными данным процессом  подп-

  роцессами и подпроцессами, созданными указанными подпроцес-

  сами. Другие процессы не могут закрепить  за  собой  данное

  устройство до тех пор, пока процесс, закрепивший  за  собой

  это устройство, в явном виде не освободит его.

       Каналы можно назначать как для закрепленных, так и для

  незакрепленных устройств. Однако, процесс не  может  назна-

  чить канал для устройства,  которое  закреплено  за  другим

  процессом. Если канал назначен для незакрепленного,  нераз-

  деляемого устройства, операционная система МОС  ВП  закреп-

  ляет данное устройство.



       1.4.3. Обращение   к   программам   управления

              вводом-выводом

   
       После назначения канала процесс  может  выдать  запрос

  функции ввода-вывода с помощью программы системного  обслу-

  живания $QIO. Программа $QIO производит обращение  к  прог-




                           - 25 -

                       00152-01 33 03-1


  раммам управления вводом-выводом. Она  инициирует  операцию

  ввода-вывода, устанавливая запрос в очередь  для  заданного

  устройства по назначенному каналу.

       Для установки запроса в очередь, должны быть  удовлет-

  ворены некоторые требования. Например, в выдаваемом запросе

  должен быть задан действительный номер  канала,  запрос  не

  должен превышать соответствующих  квот,  в  системе  должен

  быть достаточный об'ем требуемой  для  выполнения  операции

  динамической памяти. Если одно из этих условий не  удовлет-

  воряется, выдается код  завершения  операции  ввода-вывода,

  указывающий на ошибку.

       Для каждого запроса ввода-вывода создается пакет  зап-

  роса ввода-вывода, который размещается в системной  динами-

  ческой памяти. Дополнительно память распределяется при сле-

  дующих обстоятельствах:

       1)  функция  запроса  ввода-вывода  является  функцией

  вспомогательного управляющего процесса (ACP);

       2) заданное устройство является устройством  буферизо-

  ванного ввода-вывода;

       3) заданное устройство  является  сетевым  устройством

  ввода-вывода.

       После того, как запрос ввода-вывода поставлен  в  оче-

  редь, процесс, выдавший запрос, может не  ждать  завершения

  операции ввода-вывода. Если процесс, который  вызвал  прог-

  рамму $QIO, не может продолжать  выполнение  до  завершения

  операции ввода-вывода, то для синхронизации можно использо-

  вать флаги событий (подпункт 1.4.6.1,  п.  1.5.1).  В  этом




                           - 26 -

                       00152-01 33 03-1


  случае процесс может вызвать программу системного  обслужи-

  вания $WAITFR в точке, где важно знать о завершении  опера-

  ции ввода-вывода. Номер флага события, указанный при вызове

  программы  $WAITFR,  должен  совпадать  с  номером   флага,

  используемого в запросе программы  системного  обслуживания

  $QIO.  Тогда  процесс  будет  ждать   завершения   операции

  ввода-вывода. Когда она завершится, флаг будет установлен и

  процесс может продолжить выполнение программы.

       Другими  способами  синхронизации  являются  программа

  системного обслуживания $QIOW (п. 1.4.5) и асинхронное сис-

  темное прерывание (п. 1.5.3). Кроме того, если пользователь

  хочет определить завершилась  ли  операция  ввода-вывода  с

  ошибками или без ошибок, независимо от того ожидает ли про-

  цесс завершения операции ввода-вывода, можно в вызове прог-

  раммы $QIO задать блок состояния ввода-вывода и затем  про-

  верить код завершения операции ввода-вывода, который сохра-

  няется в этом блоке после завершения операции  ввода-вывода

  (п. 1.5.2).

       При вызове  программы  системного  обслуживания  можно

  задать до шести  аргументов,  независящих  от  устройств  и

  функций (п. 1.4.6), и до  шести  аргументов,  зависящих  от

  устройств и функций (подпункт 1.4.6.7). Аргументы,  завися-

  щие от устройств и функций (р1-р6) различны  для  различных

  устройств и функций. Однако, одинаковые функции,  выполняе-

  мые всеми устройствами, имеют идентичные  аргументы.  Более

  того, все функции выполняемые конкретным классом устройств,

  идентичны.




                           - 27 -

                       00152-01 33 03-1


       1.4.4. Описание формата макрокоманды $QIO


       Макрокоманда $QIO имеет следующий формат:

   $QIO_S [EFN], CHAN, FUNC, [IOSB], [ASTADR], [ASTPRM],-

          [P1], [P2], [P3], [P4], [R5], [P6]

       Первые шесть аргументов являются независящими от функ-

  ций и устройств. Если используются ключевые слова, их можно

  записывать в любом порядке. Аргументы P1-P6 являются  зави-

  сящими от устройств и функций. Аргументы CHAN и FUNC должны

  быть обязательно заданы. Аргументы, заключенные в  квадрат-

  ные скобки, необязательны.

       В примере показано, как использовать ключевые слова  в

  макрокоманде $QIO.

       Пример.

   $QIO_S     EFN=#1,-                 ; флаг события

              CHAN=TTCHAN1,-           ; канал

              FUNC=#IO$_WRITEVBLK,-    ; виртуальная запись

              P1=BUFADD,-              ; адрес буфера

              P2=#BUFSIZE              ; размер буфера



       1.4.5. Описание формата макрокоманды $QIOW


       Программа  системного  обслуживания  $QIOW   выполняет

  функции программ системного обслуживания  $QIO  и  $WAITFR.

  При использовании этой программы не требуется в явном  виде

  синхронизировать завершение операции ввода-вывода, так  как

  она автоматически ожидает завершения операции и затем пере-

  дает управление вызывающему процессу. Таким  образом  прог-




                           - 28 -

                       00152-01 33 03-1


  рамма системного обслуживания $QIOW  обеспечивает  наиболее

  простой способ синхронизации передачи управления вызывающе-

  му процессу.

       Макрокоманда $QIOW имеет те же зависящие и независящие

  от устройств и функций аргументы, что и макрокоманда $QIO.

       Формат макрокоманды $QIOW:

   $QIOW_S  [EFN], CHAN, FUNC, [IOSB], [ASTADR], [ASTPRM],-

            [P1], [P2], [P3], [P4], [P5], [P6]



       1.4.6. Описание аргументов макрокоманд $QIO  и

              $QIOW


       В табл. 2 перечислены  аргументы  макрокоманд  $QIO  и

  $QIOW, независящие от устройств и функций.

                                                    Таблица 2

  -----------------------------------------------------------

      Аргумент     !               Назначение

  -----------------------------------------------------------

  EFN (номер флага ! Данный аргумент задает номер флага собы-

  события)         ! тия, который должен быть сброшен, когда

                   ! операция ввода-вывода устанавливается в

                   ! очередь, и установлен при завершении

                   ! операции. Этот аргумент является необя-

                   ! зательным. Если он не задан, по умолча-

                   ! нию он принимается равным нулю

  CHAN (номер кана-! Данный аргумент задает номер канала вво-

  ла)              ! да-вывода, для которого выдается запрос.




                           - 29 -

                       00152-01 33 03-1


                                          Продолжение табл. 2

  -----------------------------------------------------------

      Аргумент     !               Назначение

  -----------------------------------------------------------

                   ! Заданный номер канала должен соответст-

                   ! вовать номеру канала, полученному от

                   ! программы системного обслуживания

                   ! $ASSIGN или от программы системного

                   ! обслуживания $CREMBX. Этот аргумент

                   ! является обязательным

  FUNC (значение   ! Данный аргумент задает 16-битовый  код

  функции)         ! функции и значения модификаторов для

                   ! задаваемой операции ввода-вывода. Этот

                   ! аргумент является обязательным

  IOSB (блок состо-! Данный аргумент задает адрес блока сос-

  яния ввода-выво- ! тояния ввода-вывода, в который заносится

  да)              ! код завершения операции ввода-вывода.

                   ! этот аргумент является необязательным

  ASTADR (адрес    ! Данный аргумент задает адрес точки входа

  программы асинх- ! в программу асинхронного системного пре-

  ронного системно-! рывания (AST), которая должна выполнять-

  го прерывания    ! ся  при завершении операции ввода-выво-

  (AST))           ! да. Этот аргумент является необязатель-

                   ! ным

  ASTPRM (параметр ! Данный аргумент задает 32-битовое зна-

  асинхронного сис-! чение, которое передается в качестве ар-

  темного прерыва- ! гумента в программу асинхронного систем-




                           - 30 -

                       00152-01 33 03-1


                                          Продолжение табл. 2

  -----------------------------------------------------------

      Аргумент     !               Назначение

  -----------------------------------------------------------

  ния (AST))       ! ного прерывания (AST) при завершении

                   ! операции ввода-вывода. Этот аргумент ис-

                   ! пользуется для идентификации асинхронно-

                   ! го системного прерывания. Он является

                   ! необязательным



       1.4.6.1. Описание аргумента EFN


       Аргумент EFN представляет собой номер  флага  события,

  связанного с заданной операцией ввода-вывода. В макрокоман-

  дах $QIO и $QIOW  этот  аргумент  является  необязательным.

  Заданный флаг события сбрасывается, когда запрос устанавли-

  вается в очередь, и устанавливается, когда заданная  опера-

  ция ввода-вывода завершается.  Кроме  того,  заданный  флаг

  события устанавливается, если программа системного обслужи-

  вания завершается не установив запрос ввода-вывода  в  оче-

  редь.

       Если процесс вызвал программу системного  обслуживания

  $QIOW, его выполнение автоматически  приостанавливается  до

  завершения операции ввода-вывода. Если процесс вызвал прог-

  рамму системного обслуживания $QIO (и впоследствии не  были

  вызваны программы системного обслуживания  $WAITFR,  $WFLOR

  или $WFLAND), выполнение процесса продолжается  параллельно

  с выполнением операции ввода-вывода. В этом случае  процесс



                           - 31 -

                       00152-01 33 03-1


  при выполнении может периодически проверять  установлен  ли

  флаг события в любой момент  времени,  используя  программу

  системного обслуживания $READEF, которая  позволяет  читать

  значения флагов событий.

       Номера задаваемых флагов событий должны быть в  диапа-

  зоне от 0 до 127 (однако флаги 24-31 резервируются для сис-

  темы). Если флаг не используется, аргумент EFN  может  быть

  опущен в формате макрокоманды. В этом случае  по  умолчанию

  аргумент EFN принимается равным нулю.

       Нужно соблюдать осторожность при  использовании  прог-

  рамм системного обслуживания $QIO и $QIOW.  Например,  если

  используются и программа $QIO, и программа $QIOW, и  в  них

  не задан номер флага события, то  при  завершении  операции

  ввода-вывода, которая была задана при вызове программы $QIO

  установится флаг 0, что приведет к преждевременной передаче

  управления процессу, который вызвал программу $QIOW.



       1.4.6.2. Описание аргумента CHAN


       Аргумент CHAN задает номер канала для физического уст-

  ройства, к которому  выдается  запрос  ввода-вывода.  Номер

  канала обязательно должен  задаваться  в  запросах  $QIO  и

  $QIOW. Связь между заданным физическим устройством и  физи-

  ческим каналом организуется только для процесса,  выдавшего

  запрос  на  операцию  ввода-вывода.  Соответствующий  номер

  канала  передается  программами   системного   обслуживания

  $ASSIGN или $CREMBX (п.1.4.1).





                           - 32 -

                       00152-01 33 03-1


       1.4.6.3. Описание аргумента FUNC


       Аргумент FUNC определяет логическую,  виртуальную  или

  физическую функцию ввода-вывода, которую  нужно  выполнить.

  Этот аргумент должен быть обязательно задан во всех  макро-

  командах $QIO и $QIOW. Этот  аргумент  содержит  16-битовый

  код функции и модификаторы функции. Можно  использовать  до

  64 кодов функций. Большинство кодов функций зависят от уст-

  ройств (разделы 4...9).



       1.4.6.4. Описание аргумента IOSB


       Аргумент   IOSB   задает   адрес    блока    состояния

  ввода-вывода для данного запроса ввода-вывода.  Этот  аргу-

  мент в макрокомандах $QIO и $QIOW является  необязательным.

  Если данный аргумент опущен, он  принимается  равным  нулю,

  что указывает, что адрес блока  состояния  ввода-вывода  не

  указан. Блок состояния ввода-вывода является  квадрословом,

  в которое по окончании операции  ввода-вывода  возвращается

  код завершения операции ввода-вывода (см. п. 1.5.2).



       1.4.6.5. Описание аргумента ASTADR


       Аргумент ASTADR задает адрес точки входа  в  программу

  асинхронного системного прерывания  (AST),  которая  должна

  выполняться при завершении операции ввода-вывода. Если этот

  аргумент опущен, он принимается равным нулю, что  указывает

  на отсутствие адреса программы.  Данный  аргумент  является

  необязательным. Если он задан, то при  завершении  операции



                           - 33 -

                       00152-01 33 03-1


  ввода-вывода программа обслуживания асинхронного системного

  прерывания вызывается с адреса, заданного этим  аргументом.

  Программа обслуживания асинхронного  системного  прерывания

  выполняется в режиме  доступа,  из  которого  была  вызвана

  программа системного обслуживания $QIO.



       1.4.6.6. Описание аргумента ASTPRM


       Аргумент ASTPRM является необязательным. Этот аргумент

  представляет собой 32-битовое значение, которое  передается

  программе обслуживания асинхронного  системного  прерывания

  после завершения  операции  ввода-вывода.  Данный  аргумент

  позволяет программе идентифицировать конкретное асинхронное

  системное прерывание. Обычно этот аргумент используется для

  передачи адреса блока управления устройством.  Если  данный

  аргумент опущен, его значение принимается равным нулю.



       1.4.6.7. Описание   аргументов,   зависящих   от

                устройства и функции


       Каждая макрокоманда может содержать до шести,  завися-

  щих от устройства и функции аргументов (P1-P6). Аргумент P1

  всегда интерпретируется как адрес. Поэтому в формате макро-

  команды в форме _S, аргумент P1 всегда обеспечивает генера-

  цию инструкции PUSHAL. Аргументы P2-P6  всегда  интерпрети-

  руются как значения. В формате макрокоманды в форме _S  эти

  аргументы всегда обеспечивают генерацию инструкций PUSHL.

       Наличие аргументов, зависящих от устройства и функции,




                           - 34 -

                       00152-01 33 03-1


  в макрокоманде $QIO зависит от конкретного физического уст-

  ройства и конкретной функции. Пользователь,  который  хочет

  задать только канал, код функции ввода-вывода и адрес прог-

  раммы асинхронного системного прерывания (AST) может выдать

  запрос в следующем виде:


   $QIO_S      CHAN=XYCHAN, FUNC=#IO$_READVBLK,-

               ASTADR=XYAST, P1=BUFADR, P2=#BUFLEN


       В этом примере XYCHAN представляет собой адрес  слова,

  содержащего номер канала, в  который  направляется  запрос;

  IO$_READVBLK - код функции; XYAST - адрес точки входа прог-

  раммы асинхронного системного прерывания. Аргументы  BUFADR

  и BUFLEN, зависящие от  устройства  и  функции,  определяют

  характеристики входного буфера.



       1.4.7. Описание    аргументов    и    форматов

              макрокоманд $INPUT и $OUTPUT


       Макрокоманды $INPUT и $OUTPUT используются вместо мак-

  рокоманды $QIOW. Эти макрокоманды вызывают выполнение  вир-

  туальных   операций   с   использованием   кодов    функций

  IO$_READVBLK и  IO$_WRITEVBLK  (код  функции  автоматически

  задается  в  запросе)   и   ожидают   завершения   операции

  ввода-вывода. Макрокоманды $INPUT и $OUTPUT имеют следующие

  форматы:

     $INPUT     CHAN, LENGTH, BUFFER, [IOSB], [EFN]

     $OUTPUT    CHAN, LENGTH, BUFFER, [IOSB], [EFN]





                           - 35 -

                       00152-01 33 03-1


       Аргументы  макрокоманд  $INPUT  и  $OUTPUT  описаны  в

  табл. 3.

                                                    Таблица 3

  -----------------------------------------------------------

     Аргумент   !          Назначение

  -----------------------------------------------------------

  CHAN          ! Данный аргумент задает номер канала, по ко-

                ! торому должна выполняться операция ввода-

                ! вывода

  LENGTH        ! Данный аргумент задает длину входного или

                ! выходного буфера

  BUFFER        ! Данный аргумент задает адрес входного или

                ! выходного буфера

  IOSB          ! Данный аргумент задает адрес квадрослова,

                ! в которое возвращается код завершения за-

                ! данной операции ввода-вывода. Аргумент яв-

                ! ляется необязательным

  EFN           ! Данный аргумент задает номер флага события.

                ! аргумент является необязательным. Если он

                ! не задан, то по умолчанию его значение при-

                ! нимается равным нулю



       1.4.8. Описание   кодов   состояния   программ

              системного обслуживания


       После  завершения  программа  системного  обслуживания

  передает код состояния в виде длинного слова в регистр  R0,

  изображенный на рис. 3. Программы  системного  обслуживания



                           - 36 -

                       00152-01 33 03-1


  сохраняют содержимое всех регистров, за исключением регист-

  ров R0 и R1.


                   Содержимое регистра R0

          31                  16 15                  0
          +------------------------------------------+
     R0:  !        0           !   Код состояния     !
          +------------------------------------------+

                            Рис. 3


       Код состояния помещается в  битах  0-15  регистра  R0.

  Младшие три бита содержат код  уровня  серьезности  ошибки.

  При успешном завершении программы  системного  обслуживания

  код уровня серьезности ошибки всегда нечетный. Коды  уровня

  серьезности ошибки:

        1) 0 - предупреждение;

        2) 1 - успешное выполнение;

        3) 2 - ошибка;

        4) 3 - информационный код;

        5) 4 - неисправимая ошибка;

        6) 5-7 - зарезервированы.

       Каждый цифровой код состояния имеет символическое  имя

  в формате  SS$_КОД.  Например,  код  состояния  может  быть

  представлен в виде SS$_NORMAL, что  указывает  на  успешное

  завершение программы системного  обслуживания.  В  табл.  4

  перечислены коды состояния программ системного обслуживания

  $QIO, $QIOW, $INPUT, $OUTPUT.

       Коды состояния программ системного обслуживания  иден-

  тичны кодам завершения операций ввода-вывода. Код состояния

  программы системного обслуживания не отображает  того,  как



                           - 37 -

                       00152-01 33 03-1


  завершилась заданная операция ввода-вывода.  Например,  код

  состояния программы системного обслуживания $QIO может ука-

  зывать на успешное завершение программы системного обслужи-

  вания, но при чтении данных с устройства может быть  зафик-

  сирована   ошибка   четности   (код   завершения   операции

  ввода-вывода - SS$_PARITY). Код неуспешного состояния прог-

  раммы системного обслуживания указывает только на  то,  что

  при выполнении программы системного обслуживания  произошла

  ошибка.

       Хотя   некоторые   символические   имена    (например,

  SS$_NORMAL и SS$_ACCVIO) используются для обозначения кодов

  состояния программ системного обслуживания и кодов заверше-

  ния операций ввода-вывода, они в этих случаях имеют различ-

  ные значения.

                                                    Таблица 4

        Коды состояния программ системного обслуживания

                 $QIO, $QIOW, $INPUT, $OUTPUT

  -----------------------------------------------------------

  Код состояния   !             Значение

  -----------------------------------------------------------

  SS$_NORMAL      ! Запрос операции ввода-вывода обработан

                  ! успешно, то есть помещен в соответствую-

                  ! щую очередь к устройству

  SS$_ACCVIO      ! Вызывающий процесс не может получить дос-

                  ! туп к блоку состояния ввода-вывода IOSB,

                  ! заданному буферу или списку аргументов

  SS$_EXQUOTA     ! Превышена квота буфера, либо квота буфе-




                           - 38 -

                       00152-01 33 03-1


                                          Продолжение табл. 4

  -----------------------------------------------------------

  Код состояния   !             Значение

  -----------------------------------------------------------

                  ! ризованного ввода-вывода, либо квота пря-

                  ! мого ввода-вывода, при этом для процесса

                  ! запрещен режим ожидания ресурсов (с по-

                  ! мощью программы системного обслуживания

                  ! $SETRWM). Код состояния SS$_EXQUOTA может

                  ! быть передан также в том случае, если

                  ! превышена квота асинхронного системного

                  ! прерывания

  SS$_ILLEFC      ! Задан неправильный номер флага события

  SS$_INSFMEM     ! Для завершения заданной программы систем-

                  ! ного обслуживания недостаточно динамичес-

                  ! кой памяти, при этом для заданного про-

                  ! цесса с помощью программы системного об-

                  ! служивания $SETRWM запрещен режим ожида-

                  ! ния ресурсов

  SS$_IVCHAN      ! Задан неправильный номер канала, то есть

                  ! номер канала превышает число доступных

                  ! каналов

  SS$_NOPRIV      ! Либо заданный канал назначен из более

                  ! привилегированного режима доступа, либо

                  ! заданный канал не назначен, либо пользо-

                  ! ватель не имеет необходимых привилегий

                  ! для доступа к заданному устройству




                           - 39 -

                       00152-01 33 03-1


                                          Продолжение табл. 4

  -----------------------------------------------------------

  Код состояния   !             Значение

  -----------------------------------------------------------

  SS$_UNASEFC     ! Задан флаг события, принадлежащий клас-

                  ! теру флагов событий, с которым нет связи

  SS$_ABORT       ! Разорван логический канал в цепи связи

  SS$_INSFARG     ! При обращении к заданной программе сис-

                  ! темного обслуживания было задано недоста-

                  ! точно аргументов

  SS$_ILLSER      ! Вызвана недействительная программа сис-

                  ! темного обслуживания



       1.5. Завершение операции ввода-вывода


       Об успешном или неуспешном завершении обработки запро-

  са ввода-вывода можно узнать одним или несколькими из  сле-

  дующих способов, в зависимости от аргументов, включенных  в

  макровызов $QIO:

       1) флаг события - устанавливается при завершении  опе-

  рации ввода-вывода;

       2) блок состояния ввода-вывода -  если  в  макровызове

  $QIO задан аргумент IOSB, код завершения передается в  биты

  0-15 квадрослова блока состояния ввода-вывода после  завер-

  шения операции ввода-вывода; адрес блока указывается  аргу-

  ментом IOSB;

       3) асинхронные системные прерывания  (AST)  -  если  в

  запросе ввода-вывода задан аргумент ASTADR, то после завер-



                           - 40 -

                       00152-01 33 03-1


  шения операции ввода-вывода вызывается программа  асинхрон-

  ного системного прерывания,  если  в  запросе  задан  также

  аргумент IOSB, он  заполняется  до  обращения  к  программе

  асинхронного системного прерывания.



       1.5.1. Флаги событий


       Флаги событий представляют собой биты, которые исполь-

  зуются программами  системного  обслуживания  $QIO,  $QIOW,

  $INPUT и $OUTPUT для индикации завершения или возникновения

  событий. Эти программы системного  обслуживания  сбрасывают

  флаг события, когда запрос на операцию  ввода-вывода  уста-

  навливается в очередь, и устанавливают флаг события,  когда

  операция  ввода-вывода  завершается.  Программы  системного

  обслуживания для работы с флагами события позволяют пользо-

  вателю устанавливать и сбрасывать определенные флаги  собы-

  тий, проверять текущие состояния флагов  событий,  а  также

  переводить программы в состояние ожидания установки  одного

  или группы флагов событий.



       1.5.2. Блок состояния ввода-вывода


       Код завершения операции ввода-вывода передается в пер-

  вое слово  блока  состояния  ввода-вывода  (IOSB),  который

  изображен  на  рис.  4.  Кроме  кода  завершения   операции

  ввода-вывода, по которому можно узнать успешно ли  заверши-

  лась операция, блок состояния ввода-вывода содержит  инфор-

  мацию об об'еме переданных данных, а  также  дополнительную




                           - 41 -

                       00152-01 33 03-1


  информацию, зависящую от устройства, например, число распе-

  чатанных строк. Код завершения операции ввода-вывода  имеет

  тот же формат, что и  код  состояния  программы  системного

  обслуживания, и также как и для  кода  состояния  программы

  системного обслуживания нечетные  коды  состояния  операции

  ввода-вывода указывают на успешное завершение  операции,  а

  четные коды указывают на ошибку.

       Старшая половина первого длинного слова блока  состоя-

  ния ввода-вывода содержит счетчик  передаваемых  байтов  на

  момент  завершения  операции  ввода-вывода.  Этот   счетчик

  используется при передаче данных в буфер пользователя и  из

  буфера пользователя. Второе длинное слово  блока  состояния

  ввода-вывода может содержать информацию, зависящую от  уст-

  ройства.


               Формат блока состояния ввода-вывода

     31                         16 15                       0
     +------------------------------------------------------+
     !          Счетчик           !    Код завершения       !
     !   передаваемых байтов      !                         !
     +------------------------------------------------------+
     !          Данные, зависящие от устройства             !
     +------------------------------------------------------+

                            Рис. 4


       Коды завершения могут быть проверены по  символическим

  именам. Например,  код  завершения  SS$_NORMAL  передается,

  если операция  была  завершена  успешно.  Следующий  пример

  иллюстрирует  проверку  первого   слова   блока   состояния

  ввода-вывода для того, чтобы определить, была ли зафиксиро-

  вана ошибка при выполнении передачи данных.




                           - 42 -

                       00152-01 33 03-1


        Пример.

   $QIO_S  CHAN=XYCHAN, FUNC=#IO$_WRITEVBLK,- ;

           IOSB=XYIOSB, P1=BUFADR, P2=#BUFLEN ;

                                              ;

   BLBC    R0, REQERR                         ; проверка

                                              ; кода состоя-

             .                                ; ния программы

             .                                ; системного

             .                                ; обслуживания

                                              ;

  CMPW      #SS$_NORMAL, XYIOSB               ; проверка

                                              ; кода заверше-

                                              ; ния операции

                                              ; ввода-вывода

  BNEQ    ERROR

       При обращении к программе системного обслуживания $QIO

  блок состояния ввода-вывода может быть опущен, если пользо-

  ватель предполагает успешное завершение операции и не хочет

  знать сколько байтов передано. Если при обращении  к  прог-

  рамме   системного   обслуживания   $QIO   блок   состояния

  ввода-вывода был задан, он очищается при выдаче запроса,  а

  при завершении операции ввода-вывода заполняется.



       1.5.3. Асинхронные системные прерывания (AST)


       Если пользователь хочет, чтобы  нормальное  выполнение

  процесса было прервано для выполнения специальной программы

  после завершения программы системного обслуживания $QIO,  в



                           - 43 -

                       00152-01 33 03-1


  запросе $QIO может быть задано асинхронное системное преры-

  вание. В этом случае, даже если процесс не содержит обраще-

  ний к программам системного обслуживания $WAITFR или $QIOW,

  он будет прерван. После завершения операции ввода-вывода по

  команде CALL управление будет передано программе  обработки

  асинхронного системного прерывания  с  точки  входа,  адрес

  которой задан аргументом ASTADR программы системного обслу-

  живания $QIO. Этот адрес задает маску входа. Программа обс-

  луживания асинхронного системного прерывания выполняется  в

  режиме доступа, из которого был выдан запрос $QIO. На  рис.

  5 показан список аргументов команды CALL.


          Список аргументов команды CALL

   +---------------------------------------------+
   !                             ! 5 (число ар-  !
   !                             !    гументов)  !
   +---------------------------------------------+
   !                 ASTPRM                      !
   +---------------------------------------------+
   !                   R0                        !
   +---------------------------------------------+
   !                   R1                        !
   +---------------------------------------------+
   !         Счетчик инструкций (PC)             !
   +---------------------------------------------+
   ! Длинное слово состояния процессора (PSL)    !
   +---------------------------------------------+

                            Рис. 5


       Асинхронные системные  прерывания  (AST)  используются

  для сообщений о завершении операций ввода-вывода, что  поз-

  воляет процессу при выполнении операции ввода-вывода выпол-

  нять другие функции. В этом случае процесс не  должен  ожи-

  дать какого-либо события для того, чтобы перейти  к  другой

  операции.



                           - 44 -

                       00152-01 33 03-1


      2. Характеристики, сообщения, входные и выходные данные

         программ. Описание подключения программ пользователя



       Операционная система МОС ВП поддерживает  многоуровне-

  вую организацию ввода-вывода, состоящую из системы управле-

  ния данными СУД-32, вспомогательных управляющих процессов и

  драйверов внешних  устройств.  Запросы  ввода-вывода  могут

  выполняться на уровне файла, записи  и  непосредственно  на

  уровне внешнего  устройства.  В  данном  документе  описана

  работа вспомогательных управляющих  процессов  и  драйверов

  различных внешних  устройств.  Вспомогательные  управляющие

  процессы (ACP)  выполняют  обработку  файло-ориентированных

  запросов ввода-вывода,  а  драйверы  управляют  выполнением

  операций ввода-вывода непосредственно на внешнем  устройст-

  ве.    Операционная    система    МОС    ВП     преобразует

  файло-ориентированный запрос ввода-вывода в  серию  простых

  запросов на чтение или запись, а  затем  формирует  из  них

  пакеты запросов ввода-вывода.  Пакет  запроса  ввода-вывода

  поступает для обработки  на  вход  драйвера  внешнего  уст-

  ройтства.  После   окончания   обработки   пакета   запроса

  ввода-вывода драйвер помещает выходную  информацию  в  блок

  состояния ввода-вывода процесса, выдавшего запрос. В первое

  слово блока состояния ввода-вывода возвращается сообщение о

  выполнении запроса ввода-вывода. Эти  сообщения  называются

  кодами завершения и описаны  в  приложении  1.  Во  второе,

  третье и четвертое слова блока состояния ввода-вывода возв-

  ращается дополнительная информация  о  выполнении  запроса.




                           - 45 -

                       00152-01 33 03-1


  Дополнительная информация о выполнении запроса  зависит  от

  конкретного типа устройства и описывается для каждого драй-

  вера отдельно.

       Для обращения к программам  управления  вводом-выводом

  из программ пользователя требуется выдать макрокоманду $QIO

  для установки  запроса  ввода-вывода  в  очередь  запросов.

  Программы управления вводом-выводом входят  в  состав  ядра

  операционной системы МОС ВП и всегда находится в  оператив-

  ной памяти. Поэтому дополнительных действий для подключения

  к ним программ пользователя не требуется.






































                           - 46 -

                       00152-01 33 03-1


      3. Вспомогательные управляющие процессы (ACP) и запросы

         очереди ввода-вывода ($QIO)



       Вспомогательный управляющий процесс (далее по тексту -

  ACP) - это процесс, который является связующим звеном между

  процессом пользователя и драйвером,  и  выполняет  функции,

  которые дополняют функции драйверов. В операциях  виртуаль-

  ного ввода-вывода, для устройств  с  файловой  организацией

  (накопители на магнитных дисках и магнитных лентах),  часто

  требуется использование ACP. В большинстве случаев ACP зап-

  рашивается служебными средствами системы управления данными

  СУД-32 в операционной системе МОС ВП и  пользователь  может

  ничего не знать о его использовании. Однако, процессы поль-

  зователя могут запросить функции ACP непосредственно, выда-

  вая запрос очереди  ввода-вывода  ($QIO)  и,  указывая  код

  функции ACP, как показано на рис. 6. В этом случае  исполь-

  зование физических и логических  операций  ввода-вывода  на

  устройстве, управляемом файловым ACP, может привести к неп-

  редсказуемым последствиям, а в некоторых случаях к  систем-

  ному сбою.

       Данный  раздел   описывает   связь   между   запросами

  ввода-вывода ($QIO) и ACP для накопителей на магнитных дис-

  ках и магнитных лентах (ACP для файловой системы), а  также

  входные параметры для функций и подфункций  ACP.  Выходными

  параметрами ACP являются коды завершения, которые описаны в

  приложении 1.






                           - 47 -

                       00152-01 33 03-1



        Связь между запросами ввода-вывода ($QIO) и

       вспомогательными управляющими процессами (ACP)

   +------------+                          +-------------+
   !            !                          !             !
   !            !<------------------------>!             !
   !  Процесс   !                          !             !
   !            !                          !   Драйвер   !
   !пользователя!      +-----------+       !             !
   !            !<---->!    ACP    !<----->!             !
   !            !      +-----------+       !             !
   +------------+                          +-------------+

                            Рис. 6


       Данный раздел описывает  также  ряд  структур  и  имен

  полей вида  ХХX$NAME.  Программа  на  языке  макроассемблер

  может определить символы в данной форме, используя макроко-

  манды $ХХХDEF.

       В библиотеке SYS$LIBRARY:STARLET.MLB: имеются  следую-

  щие макрокоманды:


     $IODEF;

     $FIBDEF;

     $ATRDEF;

     $SBKDEF.


       В библиотеке  SYS$LIBRARY:LIB.MLB:  имеются  следующие

  макрокоманды:


     $FATDEF;

     $DQFDEF;

     $FCHDEF.


       Программы,  написанные   на   языке   программирования




                           - 48 -

                       00152-01 33 03-1


  блисс-32, могут использовать эти символы,  просто  ссылаясь

  на них и включая в операцию компоновки  нужную  библиотеку,

  то  есть  SYS$LIBRARY:STARLET.L32  и   SYS$LIBRARY:LIB.L32,

  соответственно.



       3.1. Функции ACP и их кодирование


       Все функции ACP операционной системы МОС ВП могут быть

  выражены с помощью семи кодов функций и четырех модификато-

  ров функций.

       Коды функций:

       1) IO$_CREATE - создает запись в каталоге или файл;

       2) IO$_ACCESS - осуществляет поиск указанного файла  в

  каталоге и обращается к файлу, если находит его;

       3) IO$_DEACCESS - прекращает доступ к  файлу  и,  если

  указано, записывает конечные атрибуты в заголовок файла;

       4) IO$_MODIFY - модифицирует атрибуты файла и/или раз-

  мещение файла;

       5) IO$_DELETE - удаляет запись в каталоге и/или  заго-

  ловок файла;

       6) IO$_MOUNT - сообщает ACP,  когда  монтируется  том;

  требует привилегии MOUNT;

       7) IO$_ACPCONTROL -  выполняет  разнообразные  функции

  управления.

       Модификаторы функций:

       1) IO$M_ACCESS - открывает файл для канала пользовате-

  лей;





                           - 49 -

                       00152-01 33 03-1


       2) IO$M_CREATE - создает файл;

       3) IO$M_DELETE - удаляет файл (или  помечает  его  для

  удаления);

       4) IO$M_DMOUNT - демонтирует том.

       Кроме кодов функций  и  модификаторов  ACP  используют

  пять аргументов, зависящих от устройства и  функции,  пока-

  занных на рис. 7.


       Аргументы ACP, зависящие от устройства и функции

      31                                                   0
      +----------------------------------------------------+
   P1:!  Адрес дескриптора блока описания файла (FIB)      !
      +----------------------------------------------------+
   P2:!    Адрес дескриптора строки имени файла            !
      !             (необязательный)                       !
      +----------------------------------------------------+
   P3:!    Адрес слова, в которое записывается длина       !
      !     результирующей строки имени файла              !
      !             (необязятельный)                       !
      +----------------------------------------------------+
   P4:!     Адрес дескриптора имени файла результирующей   !
      !          строки  (необязательный)                  !
      +----------------------------------------------------+
   P5:!      Адрес блока управления атрибутами             !
      !                (необязательный)                    !
      +----------------------------------------------------+

                            Рис. 7


       Первый аргумент, P1 - адрес дескриптора блока описания

  файла (FIB).

       Второй аргумент, P2 - необязательный аргумент, исполь-

  зуемый в операциях с каталогом. Он указывает адрес дескрип-

  тора для строки имени файла, которая должна быть введена  в

  каталог.

       Аргумент P3 - это адрес слова, в которое  записывается

  длина результирующей  строки  имени  файла.  Результирующая




                           - 50 -

                       00152-01 33 03-1


  строка не дополняется нулями. Фактическая длина возвращает-

  ся в P3. P4 - это адрес дескриптора буфера, в который запи-

  сывается результирующая строка имени файла. Оба  эти  аргу-

  мента являются необязательными.

       Пятый аргумент, P5, является  необязательным  аргумен-

  том. Он содержит  адрес  блока  управления  атрибутами  (п.

  3.3.5).

       На рис. 8 дан формат дескрипторов.


        Формат дескриптора аргументов ACP, зависящих от

                   устройства и функций

      31                        16 15                     0
      +----------------------------------------------------+
      !     Не используется       !         Счетчик        !
      +----------------------------------------------------+
      !                         Адрес                      !
      +----------------------------------------------------+

                            Рис. 8



       3.2. Блок описания файла


       Блок описания файла  (далее  по  тексту  -  блок  FIB)

  содержит большую  часть  информации,  которой  обмениваются

  процесс пользователя и ACP. На рис. 9 дан формат блока FIB.

  Он должен быть перезаписываемым. Так как блок FIB передает-

  ся с помощью дескриптора, его длина может изменяться. Таким

  образом, короткий блок FIB может быть использован в вызовах

  ACP, которым не требуются вся  информация,  содержащаяся  в

  блоке FIB. ACP рассматривает опущенную часть блока FIB  как

  нулевую. На рис. 10 приведен пример формата короткого блока

  FIB, который может быть использован для открытия существую-



                           - 51 -

                       00152-01 33 03-1


  щего файла. В табл. 5 дается краткое  описание  каждого  из

  полей блока FIB. Содержание полей блока FIB для  конкретных

  функций приведено в подразделах 3.3 и 3.6.



                        Формат блока FIB

    31          24  23        16  15       8  7             0
    ---------------------------------------------------------
    ! FIB$B_WSIZE  !                      FIB$L_ACCTL       !
    ---------------------------------------------------------
    !                                                       !
    -------------------------------             FIB$W_FID   !
    !                             !                         !
    !         FIB$W_DID           ---------------------------
    !                                                       !
    ---------------------------------------------------------
    !                          FIB$L_WCC                    !
    ---------------------------------------------------------
    ! FIB$W_CNTRLFUNC/FIB$W_EXCTL  !           FIB$W_NMCTL  !
    ---------------------------------------------------------
    !               FIB$L_CNTRLVAL/FIB$L_EXSZ               !
    ---------------------------------------------------------
    !                        FIB$L_EXVBN                    !
    ---------------------------------------------------------
    !                         ! FIB$B_ALALIGN ! FIB$B_ALOPTS!
    !                         -------------------------------
    !                                                       !
    --------             FIB$W_ALLOC           --------------
    !                                                       !
    ---------------------------------------------------------
    !Не используется!FIB$B_AGENT_MODE! FIB$W_VERLIMIT       !
    ---------------------------------------------------------
    !                     FIB$L_ACLCTX                      !
    ---------------------------------------------------------
    !                     FIB$L_ACL_STATUS                  !
    ---------------------------------------------------------
    !                     FIB$L_STATUS                      !
    ---------------------------------------------------------
    !                     FIB$L_ALT_ACCESS                  !
    ---------------------------------------------------------

                            Рис. 9











                           - 52 -

                       00152-01 33 03-1



                 Типичный короткий блок FIB


    31         24 23         16 15          8 7             0
    ---------------------------------------------------------
    ! FIB$B_WSIZE !                FIB$L_ACCTL              !
    ---------------------------------------------------------
    !                                                       !
    --------------------------------                        !
    !                              !          FIB$W_FID     !
    !         FIB$W_DID            !                        !
    !                              --------------------------
    !                                                       !
    ---------------------------------------------------------
    !                          FIB$L_WCC                    !
    ---------------------------------------------------------
                            <---0  !        FIB$W_NMCTL     !
                                   --------------------------
                                                        <---0

                            Рис. 10

                                                    Таблица 5

                     Содержание блока FIB

  -----------------------------------------------------------

       Поле       !   Подполе        !      Содержание

  -----------------------------------------------------------

  FIB$L_ACCTL     !                  ! Данное поле содержит

                  !                  ! биты флагов, которые

                  !                  ! управляют доступом к

                  !                  ! файлу. (подпункты

                  !                  ! 3.3.1.1, 3.6.1.1,

                  !                  ! 3.6.4.1 и п. 3.6.5)

  FIB$B_WSIZE     !                  ! Управляет размером ок-

                  !                  ! на файла, используемо-

                  !                  ! го для отображения

                  !                  ! файла на диске если




                           - 53 -

                       00152-01 33 03-1


                                          Продолжение табл. 5

  -----------------------------------------------------------

       Поле       !   Подполе        !      Содержание

  -----------------------------------------------------------

                  !                  ! указан размер окна,

                  !                  ! равный 255, то файл

                  !                  ! отображается пол-

                  !                  ! ностью, путем исполь-

                  !                  ! зования сегментирован-

                  !                  ! ных окон

  FIB$W_FID       !                  ! Указывает идентифика-

                  !                  ! цию файла.

                  !                  ! пользователь   дает

                  !                  ! идентификатор файла,

                  !                  ! когда он известен; ACP

                  !                  ! возвращает идентифика-

                  !                  ! тор файла, когда он

                  !                  ! становится известен,

                  !                  ! например, в результате

                  !                  ! создания или поиска в

                  !                  ! каталоге.   Нулевой

                  !                  ! идентификатор файла

                  !                  ! может быть указан,

                  !                  ! когда операция выпол-

                  !                  ! няется на файле, кото-

                  !                  ! рый  уже  открыт  для

                  !                  ! конкретного канала.




                           - 54 -

                       00152-01 33 03-1


                                          Продолжение табл. 5

  -----------------------------------------------------------

       Поле       !   Подполе        !      Содержание

  -----------------------------------------------------------

                  !                  ! ACP возвращает иденти-

                  !                  ! фикатор для открытого

                  !                  ! файла

                  ! FIB$W_FID_NUM    ! Номер файла

                  ! FIB$W_FID_SEQ    ! Порядковый номер файла

                  ! FIB$W_FID_RVN    ! Относительный  номер

                  !                  ! тома (только для нако-

                  !                  ! пителей на магнитных

                  !                  ! лентах)

                  ! FIB$B_FID_RVN    ! Относительный ном!!

                  !                  ! Тома (только для нако-

                  !                  ! пителей на магнитных

                  !                  ! дисках)

                  ! FIB$B_FID_NMX    ! Расширение номера фай-

                  !                  ! ла (только для накопи-

                  !                  ! телей на магнитных

                  !                  ! дисках)

  FIB$W_DID       !                  ! Содержит идентификатор

                  !                  ! файла каталога

                  ! FIB$W_DID_NUM    ! Номер файла

                  ! FIB$W_DID_SEQ    ! Порядковый номер файла

                  ! FIB$W_DID_RVN    ! Относительный  номер

                  !                  ! тома (только для нако-




                           - 55 -

                       00152-01 33 03-1


                                          Продолжение табл. 5

  -----------------------------------------------------------

       Поле       !   Подполе        !      Содержание

  -----------------------------------------------------------

                  !                  ! пителей на магнитных

                  !                  ! лентах)

                  ! FIB$B_DID_RVN    ! ОтносительнHHомер

                  !                  ! тома (только для  на-

                  !                  ! копителей на магнитных

                  !                  ! дисках)

                  ! FIB$B_DID_NMX    ! Расширение номера фай-

                  !                  ! ла (только для накопи-

                  !                  ! лей на магнитных

                  !                  ! дисках)

  FIB$L_WCC       !                  ! Сохраняет позиционный

                  !                  ! контекст при обработке

                  !                  ! операций  с каталогом

                  !                  ! сложной конструкции

  FIB$W_NMCTL     !                  ! Данное поле содержит

                  !                  ! биты флагов, которые

                  !                  ! управляют обработкой

                  !                  ! строки имени в опера-

                  !                  ! ции с каталогом (см.

                  !                  ! подпункты 3.3.1.1,

                  !                  ! 3.6.1.1)

  FIB$W_EXCTL     !                  ! Данное поле содержит

                  !                  ! биты флагов, которые




                           - 56 -

                       00152-01 33 03-1


                                          Продолжение табл. 5

  -----------------------------------------------------------

       Поле       !   Подполе        !      Содержание

  -----------------------------------------------------------

                  !                  ! указывают управление

                  !                  ! расширением для нако-

                  !                  ! пителей на магнитных

                  !                  ! дисках. (подпункты

                  !                  ! 3.3.3.1 и 3.3.4.1)

  FIB$W_CNTRLFUNC !                  ! В      функции

                  !                  ! IO$_ACPCONTROL данное

                  !                  ! поле содержит код, ко-

                  !                  ! торый указывает, какая

                  !                  ! функция управления ACP

                  !                  ! должна быть выполнена

                  !                  ! (п. 3.6.7). Данное

                  !                  ! поле перекрывает поле

                  !                  ! FIB$W_EXCTL

                  ! FIB$C_USEREOT    ! Режим EOT  для пользо-

                  !                  ! вателя. В функциях

                  !                  ! IO$_CREATE   или

                  !                  ! IO$_ACCESS пользова-

                  !                  ! тель может установить

                  !                  ! этот режим для каж-

                  !                  ! дого  файла.  (пп.

                  !                  ! 3.6.1, 3.6.2)

  FIB$L_EXSZ      !                  ! Данное поле указывает




                           - 57 -

                       00152-01 33 03-1


                                          Продолжение табл. 5

  -----------------------------------------------------------

       Поле       !   Подполе        !      Содержание

  -----------------------------------------------------------

                  !                  ! количество блоков, ко-

                  !                  ! торые должны быть раз-

                  !                  ! мещены в операции рас-

                  !                  ! ширения для файла  на

                  !                  ! магнитном диске

  FIB$L_CNTRLVAL  !                  ! Это поле содержит зна-

                  !                  ! чение управляющей фун-

                  !                  ! кции, используемое в

                  !                  ! IO$ACPCONTROL   (см.

                  !                  ! п. 3.6.7). Интерпрета-

                  !                  ! ция значения зависит

                  !                  ! от управляющей функ-

                  !                  ! ции, указанной в поле

                  !                  ! FIB$W_CNTRLFUNC.

                  !                  ! Данное поле перекрыва-

                  !                  ! ет поле FIB$L_EXSZ

  FIB$L_EXVBN     !                  ! указывает номер вирту-

                  !                  ! ального блока файла на

                  !                  ! диске, начиная с кото-

                  !                  ! рого файл должен быть

                  !                  ! отсечен

  FIB$B_ALOPTS    !                  ! Содержит вспомогатель-

                  !                  ! ные биты, которые уп-




                           - 58 -

                       00152-01 33 03-1


                                          Продолжение табл. 5

  -----------------------------------------------------------

       Поле       !   Подполе        !      Содержание

  -----------------------------------------------------------

                  !                  ! равляют размещением

                  !                  ! распределенных блоков

                  !                  ! (см. Подпункт 3.3.3.1)

  FIB$B_ALALIGN   !                  ! Содержит режим интер-

                  !                  ! претации поля разме-

                  !                  ! щения (FIB$W_ALLOC)

  FIB$W_ALLOC     !                  ! Содержит требуемое фи-

                  !                  ! зическое положение

                  !                  ! размещаемых блоков.

                  !                  ! интерпретация поля уп-

                  !                  ! равляется полем

                  !                  ! FIB$B_ALALIGN

                  ! FIB$W_LOC_FID    ! 3-словная идентифика-

                  !                  ! ция файла с относи-

                  !                  ! тельной организацией

                  !                  ! для определения поло-

                  !                  ! жения

                  ! FIB$W_LOC_NUM    ! Номер файла с относи-

                  !                  ! тельной организацией

                  ! FIB$W_LOC_SEQ    ! Номер последователь-

                  !                  ! ности файла с относи-

                  !                  ! тельной организацией

                  ! FIB$B_LOC_RVN    ! Относительный номер




                           - 59 -

                       00152-01 33 03-1


                                          Продолжение табл. 5

  -----------------------------------------------------------

       Поле       !   Подполе        !      Содержание

  -----------------------------------------------------------

                  !                  ! тома (RVN) файла, с

                  !                  ! относительной органи-

                  !                  ! зацией или относитель-

                  !                  ! ный номер тома (RVN)

                  !                  ! для определения поло-

                  !                  ! жения

                  ! FIB$B_LOC_NMX    ! Расширение    номера

                  !                  ! файла с относительной

                  !                  ! организацией

                  ! FIB$L_LOC_ADDR   ! Номер логического бло-

                  !                  ! ка (LBN), цилиндр, или

                  !                  ! номер   виртуального

                  !                  ! блока (VBN) для опре-

                  !                  ! ления положения

  FIB$W_VERLIMIT  !                  ! Содержит лимит версий

                  !                  ! записей каталога

  FIB$B_AGENT_MODе!                  ! Режим доступа, для ко-

                  !                  ! торого нужно проверить

                  !                  ! защиту режима доступа

                  !                  ! для файла

  FIB$L_ACLCTX    !                  ! Поддерживает контекст

                  !                  ! положения при обработ-

                  !                  ! ке атрибутов списка




                           - 60 -

                       00152-01 33 03-1


                                          Продолжение табл. 5

  -----------------------------------------------------------

       Поле       !   Подполе        !      Содержание

  -----------------------------------------------------------

                  !                  ! управления доступом

                  !                  ! (ACL) из списка атри-

                  !                  ! бутов (P5)

  FIB$L_ACL_STATUS!                  ! Состояние запрашивае-

                  !                  ! мой операции с атрибу-

                  !                  ! тами списка управления

                  !                  ! доступом (ACL), если

                  !                  ! она запрошена. Атрибу-

                  !                  ! ты списка управления

                  !                  ! доступом (ACL) (под-

                  !                  ! пункт 3.3.5.1). Если

                  !                  ! не задан ни один атри-

                  !                  ! бут списка управления

                  !                  ! доступом (ACL), то в

                  !                  ! этом поле возвращается

                  !                  ! код SS$_NORMAL

  FIB$L_STATUS    !                  ! Состояние доступа. Ис-

                  !                  ! пользуется во всех ос-

                  !                  ! новных функциях. Это

                  !                  ! поле содержит биты,

                  !                  ! которые указывают сос-

                  !                  ! тояние доступа

                  ! FIB$V_ALT_REQ    ! Устанавливается  для




                           - 61 -

                       00152-01 33 03-1


                                          Продолжение табл. 5

  -----------------------------------------------------------

       Поле       !   Подполе        !      Содержание

  -----------------------------------------------------------

                  !                  ! указания необходимости

                  !                  ! альтернативного досту-

                  !                  ! па для текущей опера-

                  !                  ! ции. Если этот бит не

                  !                  ! установлен, альтерна-

                  !                  ! тивный доступ необяза-

                  !                  ! телен

                  ! FIB$V_ALT_GRANТЕD! Если FIB$V_ALT_REQ=0,

                  !                  ! то бит блока FIB, воз-

                  !                  ! вращенный из файловой

                  !                  ! системы устанавливает-

                  !                  ! ся при условии, что

                  !                  ! проверка альтернатив-

                  !                  ! ного доступа закон-

                  !                  ! чилась успешно

  FIB$L_ALT_ACCESS!                  ! 32-битовая маска, пре-

                  !                  ! доставляющая   маску

                  !                  ! доступа для проверки

                  !                  ! нужной защиты файла,

                  !                  ! например, открыть

                  !                  ! файл для чтения и про-

                  !                  ! верить, можно  ли  его

                  !                  ! удалить.  Эта  маска




                           - 62 -

                       00152-01 33 03-1


                                          Продолжение табл. 5

  -----------------------------------------------------------

       Поле       !   Подполе        !      Содержание

  -----------------------------------------------------------

                  !                  ! имеет ту же форму, что

                  !                  ! и обычная маска защиты



       3.3. Подфункции ACP


       Операции, которые выполняет ACP могут  быть  разделены

  на 2 категории: основные функции ACP и  подфункции.  Каждая

  операция ACP выполняет одну основную функцию.  Эта  функция

  определяется   кодом   функции   ввода-вывода,    например,

  IO$_ACCESS, IO$_CREATE, или IO$_MODIFY. В  ходе  выполнения

  основной функции могут быть выполнены одна или  более  под-

  функций. Подфункция - это операция, такая как поиск,  полу-

  чение доступа, или расширение  файла.  Большинство  функций

  может быть выполнено не одной, а  несколькими  из  основных

  функций. Каждая основная  функция,  имеет  подфункции  (см.

  подраздел 3.6). В пп. 3.3.1...3.3.5 описаны  подробно  сле-

  дующие подфункции:

       - поиск по каталогу;

       - доступ;

       - расширение;

       - усечение;

       - чтение атрибутов;

       - запись атрибутов.





                           - 63 -

                       00152-01 33 03-1


       3.3.1. Поиск по каталогу


       Подфункция поиска по каталогу используется для  поиска

  файла на диске или на магнитной  ленте.  Данная  подфункция

  может  быть   вызвана   основными   функциями   IO$_ACCESS,

  IO$_MODIFY,   IO$_DELETE,   и   некоторыми   функциями   из

  IO$_ACPCONTROL. Поиск по каталогу имеет место в том случае,

  если  поле  идентификации  файла  каталога  в   блоке   FIB

  (FIB$W_DID) является ненулевым.



       3.3.1.1. Входные параметры


       В табл. 6 перечислены поля блока FIB,  которые  управ-

  ляют обработкой подфункции поиска.

                                                    Таблица 6

              Поля блока FIB (управление поиском)

  -----------------------------------------------------------

      Поле    !      Бит      !           Содержание

  -----------------------------------------------------------

  FIB$W_NMCTL !               ! Управление строкой имени. В

              !               ! операции поиска применяются

              !               ! биты управления именем это-

              !               ! го поля

              ! FIB$M_WILD    ! Устанавливается, если строка

              !               ! имени содержит символы обоб-

              !               ! щения. Установка этого бита

              !               ! приводит к тому, что контекст

              !               ! символа обобщения возвращает-




                           - 64 -

                       00152-01 33 03-1


                                          Продолжение табл. 6

  -----------------------------------------------------------

      Поле    !      Бит      !           Содержание

  -----------------------------------------------------------

              !               ! ся в поле FIB$L_WCC

              ! FIB$M_ALLNAM  ! Устанавливается для того,

              !               ! чтобы удовлетворять всем

              !               ! значениям поля имени

              ! FIB$M_ALLTYP  ! Устанавливается для того,

              !               ! чтобы удовлетворять всем

              !               ! значениям типов поля

              ! FIB$M_ALLVER  ! Устанавливается для того,

              !               ! чтобы удовлетворять всем

              !               ! значениям поля версии

              ! FIB$M_FINDFID ! Устанавливается для того,

              !               ! чтобы разыскать в каталоге

              !               ! идентификатор файла, содер-

              !               ! жащийся в FIB$W_FID

  FIB$W_FID   !               ! Идентификация файла. В  дан-

              !               ! ное поле возвращается иден-

              !               ! тификатор (ID) найденного

              !               ! файла

  FIB$W_DID   !               ! Содержит идентификатор файла

              !               ! каталога. Это поле должно

              !               ! быть ненулевым

  FIB$L_WCC   !               ! Сохраняет информацию о пози-

              !               ! ции при обработке операций




                           - 65 -

                       00152-01 33 03-1


                                          Продолжение табл. 6

  -----------------------------------------------------------

      Поле    !      Бит      !           Содержание

  -----------------------------------------------------------

              !               ! с каталогом, использующих

              !               ! символ обобщения

  FIB$L_ACCTL !               ! В подфункции поиска

              !               ! применяется флаг управления

              !               ! доступом, содержащийся в

              !               ! этом поле

              ! FIB$M_REWIND  ! Это флаг, который устанавли-

              !               ! вается для того, чтобы пере-

              !               ! мотать магнитную ленту перед

              !               ! поиском. Если бит не установ-

              !               ! лен, поиск на ленте будет

              !               ! осуществляться, начиная   с

              !               ! текущей позиции


       Параметр P2 макрокоманды $QIO указывает адрес дескрип-

  тора для строки имени файла, которая будет разыскиваться  в

  каталоге.

       Строка имени файла должна иметь один из двух следующих

  форматов:

       1) имя.тип;версия;

       2) имя.тип.версия.

       Имя и тип могут быть  представлены  любой  комбинацией

  буквенно-цифровых символов и символов денежной единицы ($),

  звездочки (*) и процента (%).  Версия  должна  состоять  из



                           - 66 -

                       00152-01 33 03-1


  числовых символов, которым может предшествовать знак  минус

  (только для накопителей на магнитных дисках) или одна звез-

  дочка. Общее число буквенно-цифровых  символов  и  символов

  процента в полях имени и типа не должно превышать 39. Может

  присутствовать любое число дополнительных звездочек.

       Если  любой  из  битов  FIB$M_ALLNAM,  FIB$M_ALLTYP  и

  FIB$M_ALLVER  установлен,  то  содержимое  соответствующего

  поля в строке имени игнорируется и предполагается состоящим

  из одной звездочки.

       Строка имени файла не может содержать строку каталога.

  Каталог указывается полем FIB$W_DID (см. табл.  6).  Только

  система управления данными СУД-32 может обрабатывать строки

  каталога.

       Аргумент P3 - это адрес слова, которое принимает длину

  найденной строки имени файла. P4 -  это  адрес  дескриптора

  буфера, который принимает  найденную  строку  имени  файла.

  Строка не дополняется нулями. Аргументы P3  и  P4  являются

  необязательными.



       3.3.1.2. Выполнение операции


       В каталоге, определяемом полем FIB$W_DID, или на  маг-

  нитной ленте разыскивается имя файла, указанное в параметре

  имени файла P2. Найденное фактическое имя файла и его длина

  возвращаются в буфер длины P3 и буфер строки P4.  Идентифи-

  катор (ID) обнаруженного файла возвращается в FIB$W_FID,  и

  может быть использован в последующих операциях, когда обра-

  батывается основная функция.



                           - 67 -

                       00152-01 33 03-1


       Нуль и отрицательные номера версии  имеют  специальное

  значение в операциях поиска на диске. Указание версии  нуль

  приводит к нахождению самой последней версии файла.  Указа-

  ние номера версии (-N) приводит к нахождению версии с номе-

  ром, равным номеру последней - N; например, (-1) определяет

  поиск предпоследней версии, (-2) определяет  поиск  версии,

  предшествующей этой, и  так  далее.  Указание  версии  (-0)

  определяет поиск самой низшей пронумерованной версии файла.

  Для поисков на магнитной ленте номер версии,  равный  нулю,

  определяет поиск первого  встреченного  файла  с  указанным

  именем; отрицательные номера версий не разрешаются.

       Поиски с использованием символа обобщения  выполняются

  путем указания соответствующих символов обобщения в  строке

  имени и  установкой  FIB$M_WILD.  (Биты  управления  именем

  FIB$M_ALLNAM, FIB$M_ALLTYP и FIB$M_ALLVER также могут  быть

  использованы в поиске записей с символами обобщения, но они

  предназначаются, главным образом, для использования в режи-

  ме совместимости). После первого поиска,  FIB$L_WCC  должен

  содержать нуль. После каждого поиска ACP  будет  возвращать

  ненулевое значение в FIB$L_WCC, которое должно быть переда-

  но обратно при следующем вызове поиска. Кроме того  пользо-

  ватель должен передать строку имени, возвращаемую  предыду-

  щим поиском, используя буфер строки P4, и ее длину в  слове

  длины P3. Данная строка используется  вместе  с  FIB$L_WCC,

  для того чтобы продолжить  поиск  с  правильной  позиции  в

  каталоге.

       Поиск по  идентификатору  файла  может  быть  выполнен




                           - 68 -

                       00152-01 33 03-1


  путем установки бита управления именем FIB$W_FINDFID. Когда

  этот  бит  установлен,  в  каталоге  разыскивается  запись,

  содержащая идентификатор файла, указанный  в  FIB$W_FID,  и

  имя обнаруженной записи возвращается в результирующие пара-

  метры P3 и P4. Если каталог содержит многократные записи  с

  тем же самым идентификатором (ID) файла, то  этим  способом

  может быть определено местоположение только первой записи.

       Поиск по идентификатору файла должен выполняться толь-

  ко в том случае, когда неизвестно  имя  файла,  потому  что

  поиск этим способом обычно выполняется значительно  медлен-

  нее, чем поиск по имени файла.



       3.3.2. Доступ


       Подфункция доступа используется  для  открытия  файла,

  таким образом, чтобы могли  быть  выполнены  операции  вир-

  туального чтения или записи. Данная подфункция  может  быть

  вызвана основными функциями IO$_CREATE  и  IO$_ACCESS  (см.

  пп.  3.6.1,  3.6.2,  соответственно).  Подфункция   доступа

  выполняется в том случае, если в коде функции  ввода-вывода

  указывается модификатор IO$M_ACCESS.



       3.3.2.1. Входные параметры


       Поля блока FIB, которые управляют обработкой  подфунк-

  ции доступа перечислены в табл. 7.








                           - 69 -

                       00152-01 33 03-1


                                                    Таблица 7

             Поля блока FIB (управление доступом)

  -----------------------------------------------------------

      Поле     !        Бит       !      Содержание

  -----------------------------------------------------------

  FIB$L_ACCTL  !                  ! Указывает значения поля,

               !                  ! которые управляют досту-

               !                  ! пом к файлу. В подфункции

               !                  ! доступа применяются биты

               !                  ! управления доступом

               ! FIB$M_WRITE      ! Устанавливается для дос-

               !                  ! тупа на запись; очищает-

               !                  ! ся для доступа только на

               !                  ! чтение

               ! FIB$M_NOREAD     ! Устанавливается, чтобы

               !                  ! запретить доступ на чте-

               !                  ! ние для других пользова-

               !                  ! телей. (чтобы использо-

               !                  ! вать данный режим, поль-

               !                  ! зователь должен иметь

               !                  ! привилегию записи в файл)

               ! FIB$M_NOWRITE    ! Устанавливается для того,

               !                  ! чтобы запретить доступ на

               !                  ! запись другим пользовате-

               !                  ! лям

               ! FIB$M_NOTRUNC    ! Устанавливается для того,

               !                  ! чтобы предотвратить усе-




                           - 70 -

                       00152-01 33 03-1


                                          Продолжение табл. 7

  -----------------------------------------------------------

      Поле     !        Бит       !      Содержание

  -----------------------------------------------------------

               !                  ! чение файла; очищается

               !                  ! для того, чтобы разрешить

               !                  ! усечение файла

               ! FIB$M_DLOCK      ! Устанавливается для того,

               !                  ! чтобы разрешить блокиров-

               !                  ! ку отмены доступа (про-

               !                  ! верка закрытия). Исполь-

               !                  ! зуется только для магнит-

               !                  ! ных дисков. Используется

               !                  ! для того, чтобы пометить

               !                  ! флагом файл, как несов-

               !                  ! местимый, если программа,

               !                  ! в данное время модифици-

               !                  ! рующая файл, завершается

               !                  ! ненормально. Если прог-

               !                  ! рамма затем закрывает

               !                  ! доступ к файлу, не выпол-

               !                  ! няя операции записи атри-

               !                  ! бутов, файл помечается

               !                  ! как заблокированный, и

               !                  ! доступ к нему не может

               !                  ! быть получен до тех пор,

               !                  ! пока его не разблокируют




                           - 71 -

                       00152-01 33 03-1


                                          Продолжение табл. 7

  -----------------------------------------------------------

      Поле     !        Бит       !      Содержание

  -----------------------------------------------------------

               ! FIB$M_UPDATE     ! устанавливается для пози-

               !                  ! ционирования на начало

               !                  ! файла на магнитной ленте

               !                  ! при открытии файла для

               !                  ! записи; очищается для по-

               !                  ! зиционирования на конец

               !                  ! файла

               ! FIB$M_READCK     ! Устанавливается, чтобы

               !                  ! разрешить проверку чтения

               !                  ! файла. Виртуальные считы-

               !                  ! вания для файла будут вы-

               !                  ! полняться с использова-

               !                  ! нием операции проверки

               !                  ! данных

               ! FIB$M_WRITECK    ! Устанавливается, чтобы

               !                  ! разрешить проверку записи

               !                  ! файла. Виртуальные записи

               !                  ! в файл будут выполняться

               !                  ! с использованием операции

               !                  ! проверки данных

               ! FIB$M_EXECUTE    ! Устанавливается, чтобы

               !                  ! получить доступ к файлу в

               !                  ! режиме управления.  Про-




                           - 72 -

                       00152-01 33 03-1


                                          Продолжение табл. 7

  -----------------------------------------------------------

      Поле     !        Бит       !      Содержание

  -----------------------------------------------------------

               !                  ! верка защиты делается

               !                  ! по биту EXECUTE вместо

               !                  ! бита READ. Действителен

               !                  ! только для запросов, вы-

               !                  ! даваемых в режимах супер-

               !                  ! визора, управления или

               !                  ! ядра

               ! FIB$M_NOLOCK     ! Устанавливается для того,

               !                  ! чтобы получить доступ к

               !                  ! файлу, даже если другой

               !                  ! пользователь открыл файл,

               !                  ! с указанием FIB$M_NOREAD.

               !                  ! чтобы    использовать

               !                  ! данную возможность, тре-

               !                  ! буется привилегия SYSPRV

               !                  ! или право на этот том.

               !                  ! Чтобы использовать эту

               !                  ! возможность правильно,

               !                  ! поля  FIB$M_NOREAD  и

               !                  ! FIB$M_NOWRITE должны быть

               !                  ! очищены

               ! FIB$M_NORECORD   ! Устанавливается для того,

               !                  ! чтобы запретить запись




                           - 73 -

                       00152-01 33 03-1


                                          Продолжение табл. 7

  -----------------------------------------------------------

      Поле     !        Бит       !      Содержание

  -----------------------------------------------------------

               !                  ! срока хранения файла в

               !                  ! результате данного дос-

               !                  ! тупа. В противном случае

               !                  ! срок хранения файла может

               !                  ! быть модифицирован, в за-

               !                  ! висимости от параметров

               !                  ! сохранения файла этого

               !                  ! тома

  FIB$B_WSIZE  !                  ! Управляет   размером

               !                  ! окна, используемого для

               !                  ! отображения дискового

               !                  ! файла. Если FIB$B_WSIZE

               !                  ! равен 0, то по умолчанию

               !                  ! ACP будет использовать

               !                  ! том. Значение от 1 до 127

               !                  ! указывает число указате-

               !                  ! лей поиска, которые долж-

               !                  ! ны быть размещены для ок-

               !                  ! на. Значение -1 указыва-

               !                  ! ет, что окно должно быть

               !                  ! так велико, как это необ-

               !                  ! ходимо для отображения

               !                  ! целого файла




                           - 74 -

                       00152-01 33 03-1


                                          Продолжение табл. 7

  -----------------------------------------------------------

      Поле     !        Бит       !      Содержание

  -----------------------------------------------------------

  FIB$W_FID    !                  ! Указывает идентификацию

               !                  ! файла, к которому должен

               !                  ! быть получен доступ



       3.3.2.2. Выполнение операции


       Файл открывается в соответствии с  указанным  управле-

  нием доступа.



       3.3.3. Расширение


       Подфункция расширения  используется  для  того,  чтобы

  распределить пространство для файла на диске.  Данная  под-

  функция может быть вызвана основными функциями ввода-вывода

  IO$_CREATE и IO$_MODIFY (см. пп. 3.6.1, 3.6.4).  Подфункция

  расширения выполняется, если в слове управления расширением

  FIB$W_EXCTL устанавливается бит FIB$M_EXTEND.



       3.3.3.1. Входные параметры


       Поля блока FIB, которые управляют обработкой  подфунк-

  ции расширения перечислены в табл. 8.









                           - 75 -

                       00152-01 33 03-1


                                                   Таблица 8

            Поля блока FIB (управление расширением)

  ----------------------------------------------------------

     Поле      !    Подполе     !       Содержание

  ----------------------------------------------------------

  FIB$W_EXCTL  !                ! Флаги управления расшире-

               !                ! нием. Для подфункции рас-

               !                ! ширения применяются флаги

               ! FIB$M_EXTEND   ! Устанавливается, чтобы

               !                ! разрешить расширение

               ! FIB$M_NOHDREXT ! Устанавливается, чтобы за-

               !                ! претить генерацию заголов-

               !                ! ков файла расширения

               ! FIB$M_ALCON    ! Распределяет непрерывное

               !                ! пространство. Расширение

               !                ! не удается, если отсутст-

               !                ! вует необходимое непрерыв-

               !                ! ное пространство

               ! FIB$M_ALCONB   ! Распределяет непрерывное

               !                ! пространство наилучшим

               !                ! образом. Пространство бу-

               !                ! дет распределено непрерыв-

               !                ! но, насколько это возмож-

               !                ! но. Если устанавливаются и

               !                ! FIB$M_ALCON и FIB$_ALCONB,

               !                ! то будет распределена еди-

               !                ! ная непрерывная область,




                           - 76 -

                       00152-01 33 03-1


                                         Продолжение табл. 8

  ----------------------------------------------------------

     Поле      !    Подполе     !       Содержание

  ----------------------------------------------------------

               !                ! размер которой является

               !                ! самым большим из имеющих-

               !                ! ся размеров, но не боль-

               !                ! ше, чем запрашиваемый

               ! FIB$M_FILCON   ! Помечает непрерывный файл.

               !                ! данный бит может быть ус-

               !                ! тановлен, только если файл

               !                ! уже не имеет распределен-

               !                ! ного для него пространства

               ! FIB$M_ALDEF    ! Распределяет размер расши-

               !                ! рения (FIB$L_EXSZ) или

               !                ! системный размер по умол-

               !                ! чанию в зависимости от то-

               !                ! го, какой размер больше

  FIB$L_EXSZ   !                ! Указывает количество бло-

               !                ! ков, которое распределяет-

               !                ! ся для файла. Количество

               !                ! блоков, фактически распре-

               !                ! деленных для данной опера-

               !                ! ции, возвращается в это

               !                ! длинное слово. Может быть

               !                ! распределено больше бло-

               !                ! ков, чем затребовано, что-




                           - 77 -

                       00152-01 33 03-1


                                         Продолжение табл. 8

  ----------------------------------------------------------

     Поле      !    Подполе     !       Содержание

  ----------------------------------------------------------

               !                ! бы достигнуть границ клас-

               !                ! тера

  FIB$L_EXVBN  !                ! В данное поле возвращается

               !                ! начальный номер виртуаль-

               !                ! ного блока из распределен-

               !                ! ных блоков. Поле

               !                ! FIB$L_EXVBN первоначально

               !                ! должно содержать нуль

  FIB$B_ALOPTS !                ! Содержит биты возможнос-

               !                ! тей, которые управляют

               !                ! размещением блоков

               ! FIB$M_EXACT    ! Устанавливается для того,

               !                ! чтобы затребовать точное

               !                ! размещение. Если данный

               !                ! бит установлен и указанные

               !                ! блоки не достигнуты, опе-

               !                ! рация расширения не удает-

               !                ! ся

               ! FIB$M_ONCYL    ! Устанавливается для того,

               !                ! чтобы определить положение

               !                ! распределенной области в

               !                ! пределах цилиндра. Данная

               !                ! возможность действует пра-




                           - 78 -

                       00152-01 33 03-1


                                         Продолжение табл. 8

  ----------------------------------------------------------

     Поле      !    Подполе     !       Содержание

  ----------------------------------------------------------

               !                ! вильно только когда уста-

               !                ! новлены биты FIB$M_ALCON

               !                ! или FIB$M_ALCONB

  FIB$B_ALALIGN!                ! Содержит режим интерпрета-

               !                ! ции поля распределения

               !                ! (FIB$W_ALLOC). Может при-

               !                ! нимать одно из набора

               !                ! значений

               !   (Нуль)       ! Никаких данных о размеще-

               !                ! нии. Остаток поля распре-

               !                ! деления игнорируется

               ! FIB$C_CYL      ! Расположение указывается в

               !                ! виде относительного номера

               !                ! тома (RVN) длиной в один

               !                ! байт в подполе

               !                ! FIB$B_LOC_RVN и номера

               !                ! цилиндра  в  подполе

               !                ! FIB$L_LOC_ADDR

               ! FIB$C_LBN      ! Расположение указывается

               !                ! в виде относительного но-

               !                ! мера тома (RVN) длиной  в

               !                ! байт   в   подполе

               !                ! FIB$B_LOC_RVN, за которым




                           - 79 -

                       00152-01 33 03-1


                                         Продолжение табл. 8

  ----------------------------------------------------------

     Поле      !    Подполе     !       Содержание

  ----------------------------------------------------------

               !                ! следует длинное слово с

               !                ! номером логического  блока

               !                ! (LBN)   в  подполе

               !                ! FIB$L_LOC_ADDR

               ! FIB$C_VBN      ! Расположение указывается в

               !                ! виде длинного слова с но-

               !                ! мером виртуального блока

               !                ! (VBN) расширяемого файла в

               !                ! подполе FIB$L_LOC_ADDR.

               !                ! нулевой номер виртуального

               !                ! блока (VBN) или номер вир-

               !                ! туального блока, который

               !                ! не удается отобразить,

               !                ! указывает конец файла

               ! FIB$C_RFI      ! Расположение указывается в

               !                ! виде трехсловного иденти-

               !                ! фикатора  файла  в  подпо-

               !                ! ле FIB$W_LOC_FID, за кото-

               !                ! рым следует длинное слово

               !                ! с номером виртуального

               !                ! блока (VBN) данного файла

               !                ! в подполе FIB$L_LOC_ADDR.

               !                ! нулевой идентификатор фай-




                           - 80 -

                       00152-01 33 03-1


                                         Продолжение табл. 8

  ----------------------------------------------------------

     Поле      !    Подполе     !       Содержание

  ----------------------------------------------------------

               !                ! ла указывает расширяющийся

               !                ! файл. Нулевой номер вирту-

               !                ! ального блока (VBN) и но-

               !                ! мер виртуального  блока,

               !                ! который не удается отобра-

               !                ! зить, указывает конец дан-

               !                ! ного файла

  FIB$W_ALLOC  !                ! Содержит требуемое физи-

               !                ! ческое расположение разме-

               !                ! щаемых блоков. Итерпрета-

               !                ! ция поля управляется полем

               !                ! FIB$B_ALALIGN. Физическое

               !                ! расположение определяется

               !                ! подполями

               ! FIB$W_LOC_FID  ! 3-словный идентификатор

               !                ! файла с относительной ор-

               !                ! ганизацией для определения

               !                ! положения

               ! FIB$W_LOC_NUM  ! Номер файла с относитель-

               !                ! ной организацией

               ! FIB$W_LOC_SEQ  ! Номер последовательности

               !                ! файла с относительной ор-

               !                ! ганизацией




                           - 81 -

                       00152-01 33 03-1


                                         Продолжение табл. 8

  ----------------------------------------------------------

     Поле      !    Подполе     !       Содержание

  ----------------------------------------------------------

               ! FIB$B_LOC_RVN  ! Относительный номер тома

               !                ! (RVN) файла с относитель-

               !                ! ной организацией или отно-

               !                ! сительный номер тома для

               !                ! определения положения

               ! FIB$B_LOC_NMX  ! Расширение номера файла с

               !                ! относительной организацией

               ! FIB$L_LOC_ADDR ! Номер логического блока

               !                ! (LBN), цилиндр или номер

               !                ! виртуального блока (VBN)

               !                ! для определения положения



       3.3.3.2. Выполнение операции


       Указанное количество блоков размещается и  добавляется

  к файлу. Номер виртуального блока, назначенный первому раз-

  мещаемому блоку, возвращается в поле FIB$L_EXVBN. Фактичес-

  кое  число   размещенных   блоков   возвращается   в   поле

  FIB$L_EXSZ.

       Фактическое число размещенных блоков возвращается так-

  же во второе длинное  слово  блока  состояния  ввода-вывода

  пользователя. Если непрерывное распределение  (FIB$M_ALCON)

  не удается, размер наибольшей непрерывной области, имеющей-

  ся на диске, возвращается во  второе  длинное  слово  блока



                           - 82 -

                       00152-01 33 03-1


  состояния ввода-вывода пользователя.



       3.3.4. Отсечение


       Подфункция отсечения используется для удаления области

  из файла на диске. Данная  подфункция  может  быть  вызвана

  основными функциями ввода-вывода IO$_DEACCESS и  IO$_MODIFY

  (см. пп. 3.6.3, 3.6.4). Подфункция отсечения выполняется  в

  том случае, если в слове управления расширением FIB$W_EXCTL

  устанавливается бит FIB$M_TRUNC.



       3.3.4.1. Входные параметры


       Поля блока FIB, которые управляют обработкой  подфунк-

  ции отсечения перечислены в табл. 9.

                                                    Таблица 9

            Поля блока FIB (управление отсечением)

  -----------------------------------------------------------

      Поле    !      Бит      !       Содержание

  -----------------------------------------------------------

  FIB$W_EXCTL !               ! Флаги управления расширением

              !               ! для подфункции отсечения

              ! FIB$M_TRUNC   ! Этот флаг должен быть уста-

              !               ! новлен, чтобы разрешить отсе-

              !               ! чение

              ! FIB$M_MARKBAD ! Этот флаг устанавливается для

              !               ! того, чтобы добавлять отсе-

              !               ! ченные блоки к файлу плохих




                           - 83 -

                       00152-01 33 03-1


                                          Продолжение табл. 9

  -----------------------------------------------------------

      Поле    !      Бит      !       Содержание

  -----------------------------------------------------------

              !               ! блоков, вместо возвращения их

              !               ! в пул свободных блоков. Это

              !               ! наиболее легко выполняется

              !               ! путем указания последнего но-

              !               ! мера виртуального блока (VBN)

              !               ! файла в поле FIB$L_EXVBN. Для

              !               ! того, чтобы открепленные бло-

              !               ! ки добавить к файлу плохих

              !               ! блоков, требуется привилегия

              !               ! SYSPRV или право владения на

              !               ! том

  FIB$L_EXSZ  !               ! В данное поле возвращается

              !               ! фактическое количество откре-

              !               ! пленных   блоков.   Поле

              !               ! FIB$L_EXSZ первоначально

              !               ! должно содержать нуль

  FIB$L_EXVBN !               ! Указывает номер первого

              !               ! виртуального блока, который

              !               ! должен быть удален из файла.

              !               ! в данное поле возвращается

              !               ! фактический номер начального

              !               ! виртуального блока операции

              !               ! отсечения




                           - 84 -

                       00152-01 33 03-1


       3.3.4.2. Выполнение операции


       Блоки открепляются от файла,  начиная  с  виртуального

  блока, указанного в поле FIB$L_EXVBN, до конца файла.  Фак-

  тическое количество открепленных блоков возвращается в поле

  FIB$L_EXSZ. Номер виртуального блока для первого фактически

  открепленного блока возвращается в поле FIB$L_EXVBN. Данное

  значение может быть больше, чем указанное значение, за счет

  округления  до  границы  кластера.   Если   устанавливается

  FIB$M_MARKBAD, то номер виртуального блока отсечения  (VBN)

  округляется в меньшую сторону, а не в большую, и  значение,

  возвращаемое в поле FIB$L_EXVBN, может быть не меньше,  чем

  то, которое было указано.

       Количество блоков, на которое было увеличено  значение

  поля FIB$L_EXVBN возвращается во второе длинное слово блока

  состояния ввода-вывода.

       Подфункция отсечения требует  монопольного  доступа  к

  файлу во время своего выполнения. Это  означает,  например,

  что файл не может быть отсечен пока несколько пользователей

  работают с ним в режиме записи.

       Исключение составляет случай, когда подфункция отсече-

  ния затребована в режиме записи, что позволяет другим поль-

  зователям работать с ним в режиме чтения.  Хотя  подфункция

  отсечения возвращает в этом случае код  успешного  заверше-

  ния, фактическое отсечение файла, т.е. возвращение отсечен-

  ных блоков в свободную память, будет отложено до  тех  пор,

  пока последний из пользователей не завершит  операцию  чте-

  ния. Если же новый пользователь обратится к файлу в  режиме



                           - 85 -

                       00152-01 33 03-1


  записи после того, как затребована подфункция отсечения, но

  до окончания операции чтения последним из пользователей, то

  отложенное отсечение будет проигнорировано.



       3.3.5. Чтение/запись атрибутов


       Подфункции чтения  и  записи  атрибутов  используются,

  например, для чтения и записи атрибутов защиты файла, и дат

  создания и обновления. Операция чтения или записи атрибутов

  вызывается путем указания списка атрибутов,  параметром  р5

  макрокоманды $QIO. Операция  чтения  атрибутов  может  быть

  вызвана основной функцией ввода-вывода IO$_ACCESS  (см.  п.

  3.6.2); операция записи атрибутов может быть вызвана основ-

  ными  функциями  ввода-вывода  IO$_CREATE,  IO$_DEACCESS  и

  IO$_MODIFY (см. пп. 3.6.1, 3.6.3, 3.6.4).



       3.3.5.1. Входные параметры


       Подфункция чтения  или  записи  атрибутов  управляется

  списком атрибутов, указываемым параметром P5.  Список  сос-

  тоит из переменного количества блоков управления,  размером

  в два длинных слова каждый, которые  заканчиваются  нулевым

  длинным словом, как показано на рис. 11. Максимальное число

  блоков управления атрибутами в одном  списке  равно  30.  В

  табл. 10 описаны поля блока управления атрибутами.










                           - 86 -

                       00152-01 33 03-1


            Формат блока управления атрибутами

   31                        16  15                        0
  +---------------------------------------------------------+
  !      ATR$W_TYPE            !       ATR$W_SIZE           !
  +---------------------------------------------------------+
  !                        ATR$L_ADDR                       !
  +---------------------------------------------------------+
  !                                                         !
  +------                                           --------+
  !          (Дополнительные блоки управления)              !
  !                                                         !
  !                                                         !
  +------                                           --------+
  !                                                         !
  +---------------------------------------------------------+
  !                            0                            !
  +---------------------------------------------------------+

                            Рис. 11
                                                   Таблица 10

               Поля блока управления атрибутами

  -----------------------------------------------------------

      Поле   !               Содержание

  -----------------------------------------------------------

  ATR$W_SIZE ! Указывает количество байтов атрибута, который

             ! должен быть передан. Правильными являются зна-

             ! чения от 0 до максимального размера конкретно-

             ! го атрибута

  ATR$W_TYPE ! Указывает инивидуальный атрибут, который дол-

             ! жен быть прочитан или записан

  ATR$L_ADDR ! Содержит адрес буфера области памяти пользова-

             ! теля куда или откуда должен быть передан атри-

             ! бут. Буфер атрибута должен быть перезаписыва-

             ! емым


       В табл. 11 перечислены действительные атрибуты функций

  ACP макрокоманнды  $QIO.  Максимальный  размер  (в  байтах)



                           - 87 -

                       00152-01 33 03-1


  определяется требуемым  набором  атрибутов.  Например,  имя

  файла в коде RADIX-50 (ATR$C_FILNAM)  использует  только  6

  байтов, но оно всегда сопровождается типом файла и  версией

  файла, поэтому в целом требуется 10 байтов. Каждый атрибут,

  если не указано иначе, имеет два имени: одно для кода (нап-

  ример,  ATR$C_UCHAR)  и   одно   для   размера   (например,

  ATR$S_UCHAR).

                                                   Таблица 11

             Атрибуты функций ACP макрокоманды QIO

  -----------------------------------------------------------

          1)         ! Макс.     !

  Атрибут            ! размер (в !         Назначение

                     ! байтах)   !

  -----------------------------------------------------------

              2), 4) !           !

  ATR$C_UCHAR        !   4       ! Характеристики файла

                  3) !           !

  ATR$C_RECATTR      !   32      ! Область атрибута записи

                     !           ! (подраздел 3.4)

  ATR$C_FILNAM       !   10      ! 6-байтовое имя файла в ко-

                     !           ! де RADIX-50 плюс поля

                     !           ! ATR$C_FILTYP    и

                     !           ! ATR$C_FILVER

  ATR$C_FILTYP       !   4       ! 2-байтовый тип файла в

                     !           ! коде RADIX-50  плюс  поле

                     !           ! ATR$C_FILVER

  ATR$C_FILVER       !   2       ! Двоичный номер версии




                           - 88 -

                       00152-01 33 03-1


                                         Продолжение табл. 11

  -----------------------------------------------------------

          1)         ! Макс.     !

  Атрибут            ! размер (в !         Назначение

                     ! байтах)   !

  -----------------------------------------------------------

                  2) !           !

  ATR$C_EXPDAT       !   7       ! Срок хранения   в  коде

                     !           ! КОИ-8 формат=DDMMMYY

                  5) !           !

  ATR$C_STATBLK      !   32      ! Блок статистики  (подраз-

                     !           ! дел 3.5)

                  5) !           !

  ATR$C_HEADER       !   512     ! Полный заголовок файла

  ATR$C_BLOKSIZE     !   2       ! Размер блока на магнитной

                     !           ! ленте

  ATR$C_USERLABEL    !   80      ! Метка файла пользователя

              2), 4) !           !

  ATR$C_ASCDATES     !   35      ! Счетчик обновлений (2 дво-

                     !           ! ичных байта), дата обнов-

                     !           ! ления, дата создания, срок

                     !           ! хранения в коде КОИ-8.

                     !           ! формат: DDMMMYY (дата об-

                     !           ! новления), HHMMSS (время),

                     !           ! DDMMMYY (дата создания),

                     !           ! HHMMSS (время), DDMMMYY

                     !           ! (срок хранения). (формат




                           - 89 -

                       00152-01 33 03-1


                                         Продолжение табл. 11

  -----------------------------------------------------------

          1)         ! Макс.     !

  Атрибут            ! размер (в !         Назначение

                     ! байтах)   !

  -----------------------------------------------------------

                     !           ! не содержит пробелов и за-

                     !           ! пятых)

  ATR$C_ALCONTROL    !    14     ! Данные о назначении  в ре-

                     !           ! жиме совместимости

  ATR$C_ENDLBLAST    !    4      ! Обработка метки конца маг-

                     !           ! нитной ленты и управляющий

                     !           ! блок поддержки асинхронно-

                     !           ! го системного прерывания

  ATR$C_ASCNAME      !    20     ! Для магнитных дисков:

                     !           ! имя файла, его тип и номер

                     !           ! версии в коде КОИ-8, вклю-

                     !           ! чая знаки пунктуации, в

                     !           ! формате: имя.тип;версия.

                     !           !

                     !           ! Для магнитных лент:

                     !           ! содержит идентификатор

                     !           ! файла из 17 символов; но-

                     !           ! мер версии отсутствует. В

                     !           ! том случае, если атрибут

                     !           ! указан при операции ввода,

                     !           ! его значение отменяет лю-




                           - 90 -

                       00152-01 33 03-1


                                         Продолжение табл. 11

  -----------------------------------------------------------

          1)         ! Макс.     !

  Атрибут            ! размер (в !         Назначение

                     ! байтах)   !

  -----------------------------------------------------------

                     !           ! бые другие спецификации

                     !           ! файла и указания типа. Ес-

                     !           ! ли атрибут задан при опе-

                     !           ! рации доступа только для

                     !           ! того, чтобы получить его

                     !           ! значение было возвращено,

                     !           ! то в атрибуте ATR$W_SIZE

                     !           ! необходимо указывать раз-

                     !           ! мер буфера более 17 байтов

                  2) !           !

  ATR$C_CREDATE      !    8      ! Дата и время создания

              2), 3) !           !

  ATR$C_REVDATE      !    8      ! Дата и время обновления

                  2) !           !

  ATR$C_EXPDATE      !    8      ! Срок хранения: дата и

                     !           ! время

              3), 9) !           !

  ATR$C_BAKDATE      !    8      ! Дата и время копирования

                  2) !           !

  ATR$C_UIC          !    4      ! Код идентификации пользо-

                     !           ! вателя (UIC)




                           - 91 -

                       00152-01 33 03-1


                                         Продолжение табл. 11

  -----------------------------------------------------------

          1)         ! Макс.     !

  Атрибут            ! размер (в !         Назначение

                     ! байтах)   !

  -----------------------------------------------------------

              2), 3) !           !

  ATR$C_FPRO         !    2      ! Защита файла

                  9) !           !

  ATR$C_RPRO         !    2      ! Защита записи в файле

          2), 3), 9) !           !

  ATR$C_ACLEVEL      !    1      ! Уровень доступа к файлу

                  9) !           !

  ATR$C_SEMASK       !    8      ! Маска защиты файла

                  5) !           !

  ATR$C_UIC_RO       !    4      ! Код идентификации пользо-

                     !           ! вателя (UIC)

                  9) !           !

  ATR$C_DIRSEQ       !    2      ! Счетчик корректировок

                     !           ! каталога

                  9) !           !

  ATR$C_BACKLINK     !    6      ! Указатель обратной связи

                     !           ! фAйла

                  9) !           !

  АТR$C_JOURNAL      !    2      ! Флаги управления журналом

  ATR$C_HDR1_ACC     !    1      ! Символ доступности метки

                     !           ! заголовка магнитной ленты




                           - 92 -

                       00152-01 33 03-1


                                         Продолжение табл. 11

  -----------------------------------------------------------

          1)         ! Макс.     !

  Атрибут            ! размер (в !         Назначение

                     ! байтах)   !

  -----------------------------------------------------------

         6), 9), 10) !           !

  ATR$C_ADDACLENT    !   255     ! Добавление одного или бо-

                     !           ! льшего количества элемен-

                     !           ! тов списка управления дос-

                     !           ! тупом

         6), 9), 10) !           !

  ATR$C_DELACLENT    !   255     ! Удаление элемента списка

                     !           ! управления доступом

         6), 9), 10) !           !

  ATR$C_MODACLENT    !   255     ! Изменение элемента таблицы

                     !           ! управления доступом

             9), 10) !           !

  ATR$C_FNDACLENT    !   255     ! Определение положения эле-

                     !           ! мента списка управления

                     !           ! доступом

             9), 10) !           !

  ATR$C_FNDACETYP    !   255     ! Поиск элемента списка уп-

                     !           ! равления доступом опреде-

                     !           ! ленного типа

         6), 9), 10) !           !

  ATR$C_DELETEACL    !   255     ! Удалить весь список управ-




                           - 93 -

                       00152-01 33 03-1


                                         Продолжение табл. 11

  -----------------------------------------------------------

          1)         ! Макс.     !

  Атрибут            ! размер (в !         Назначение

                     ! байтах)   !

  -----------------------------------------------------------

                     !           ! ления доступом

             9), 10) !           !

  ATR$C_READACL      !   512     ! Прочесть весь список  уп-

                     !           ! равления доступом или по

                     !           ! крайней мере столько эле-

                     !           ! ментов списка, сколько

                     !           ! сможет поместиться в выде-

                     !           ! ленный для этого буфер.

                     !           ! при этом элементы списка

                     !           ! управления доступом будут

                     !           ! переданы только целиком,

                     !           ! так что буфер может ока-

                     !           ! заться заполненным не до

                     !           ! конца

             9), 10) !           !

  ATR$C_ACLLENGTH    !    4      ! Вернуть длину списка уп-

                     !           ! равления доступом

             9), 10) !           !

  ATR$C_READACE      !   255     ! Прочесть один элемент

                     !           ! списка управления

                     !           ! доступом




                           - 94 -

                       00152-01 33 03-1


                                         Продолжение табл. 11

  -----------------------------------------------------------

          1)         ! Макс.     !

  Атрибут            ! размер (в !         Назначение

                     ! байтах)   !

  -----------------------------------------------------------

              8), 9) !           !

  ATR$C_RESERVED     !   380     ! Изменить область резерви-

                     !           ! рования

                  9) !           !

  ATR$C_HIGHWATER    !    4      ! Отметка заполнения (дос-

                     !           ! тупна пользователю только

                     !           ! для чтения)

              7), 9) !           !

  ATR$C_PRIVS_USED   !    4      ! Привилегии, используемые

                     !           ! при получении прав доступа

                     !           ! к файлу

              7), 9) !           !

  ATR$C_MATCHING_ACE !   255     ! Элемент списка управления

                     !           ! доступом, используемый при

                     !           ! получении доступа

                     !           !

  ATR$C_ACCESS_MODE  !    1      ! Режим доступа к следующим

                     !           ! дескрипторам атрибутов

                     !           !

  ATR$C_FILE_SPEC    !   512     ! Преобразовать идентифика-

                     !           ! тор файлов 09 в специфи-     
                                   кацию



                           - 95 -

                       00152-01 33 03-1


                                         Продолжение табл. 11

  -----------------------------------------------------------

          1)         ! Макс.     !

  Атрибут            ! размер (в !         Назначение

                     ! байтах)   !

  -----------------------------------------------------------

                     !           ! файла

                  4) !           !

  ATR$C_BUFFER_OFFSET!   2       ! Длина смещения буфера мет-

                     !           ! ки заголовка магнитной

                     !           ! ленты

  -------C---------------

       1) атрибуты с префиксом АTR$C_ имеют две формы: с пре-

  фиксом АTR$C_ для кода и с префиксом АTR$S_ для длины.

       2) атрибут защищен (может быть перезаписан только вла-

  дельцем или системой).

       3) атрибут заблокирован (то есть в  том  случае,  если

  файл заблокирован для записи, атрибут не может быть переза-

  писан).

       4) не поддерживается вспомогательным управляющим  про-

  цессом магнитной ленты при операциях записи; при  операциях

  чтения возвращаются значения, принятые по умолчанию.

       5) атрибут доступен только для чтения. 

       6) допускается только  монопольное  обращение.  В  том

  случае, если параллельно  производится  несколько  операций

  чтения или записи  данного  атрибута,  операция  закончится

  неуспешно.




                           - 96 -

                       00152-01 33 03-1


       7) значение данного атрибута может быть получено толь-

  ко при начальной операции доступа или создания.

       8) реально доступная длина может оказаться меньше ука-

  занной в том случае, если способ, которым файл расширен  не

  является непрерывным или у  файла  есть  список  управления

  доступом.

       9) для файловой структуры уровня 1 и магнитных лент не

  поддерживается.

       10) код завершения операции,  соответствующей  данному

  атрибуту, возвращается в поле FIB$L_ACL_STATUS.

       Длинное слово  характеристик  файла  (прочитанное  при

  помощи атрибута ATR$C_UCHAR) содержит следующие биты харак-

  теристик:

  FCH$M_NOBACKUP - файл не должен дублироваться;

  FCH$M_READCHECK - все операции чтения должны выполняться с

       проверкой;

  FCH$M_WRN!ECHECK - все операции записи должны выполняться с

       проверкой;

  FCH$M_CONTIGB - сохранять непрерывность файла насколько это

       возможно;

  FCH$M_LOCKED - файл заблокирован для отмены доступа;

  FCH$M_CONTIG - файл является непрерывным;

  FCH$M_BADA5  - список управления доступом файла испорчен;

  FCH$M_SPOOL - файл является промежуточным при выполнении

       спулинга;

  FCH$M_DIRECTORY - файл является каталогом;

  FCH$M_BADBLOCK - файл содержит плохие блоки;




                           - 97 -

                       00152-01 33 03-1


  FCH$M_MARKDEL - файл отмечен для удаления;

  FCH$M_ERASE - перед удалением файла следует стереть его

       содержимое.



       3.4. Область атрибутов записи


       Формат области атрибутов записи показан на рис. 12.













































                           - 98 -

                       00152-01 33 03-1



                  Область атрибутов записи

  31          2VT23         16 15           8 7             0
  +-------------+-------------+--------------+--------------+
  !                           !              !              !
  !        FAT$W_RSIZE        ! FAT$B_RATTRIB!  FAT$V_RTYPE/!
  !                           !              ! FAT$V_FILEORG!
  +-------------+-------------+--------------+--------------+
  !                                                         !
  !                      FAT$L_HIBLK                        !
  !                                                         !
  +-------------+-------------+--------------+--------------+
  !                                                         !
  !                      FAT$L_EFBLK                        !
  !                                                         !
  +-------------+-------------+--------------+--------------+
  !             !             !                             !
  !FAT$B_VFCSIZE!FAT$B_BKTSIZE!        FAT$W_FFBYTE         !
  !             !             !                             !
  +-------------+-------------+--------------+--------------+
  !                           !                             !
  !        FAT$W_DEFEXT       !        FAT$W_MAXREC         !
  !                           !                             !
  +-------------+-------------+--------------+--------------+
  !                           !                             !
  !                           !        FAT$W_GBC            !
  !                           !                             !
  !                           +--------------+--------------+
  !                                                         !
  !       (шесть байтов зарезервировано для последующего    !
  !                  использования)                         !
  +-------------+-------------+--------------+--------------+
  !                           !                             !
  !       FAT$W_VERSIONS      !       Не используется       !
  !                           !                             !
  +-------------+-------------+---------------+-------------+

                            Рис. 12


       Значения атрибутов записи и их смысл  перечисляются  в

  табл. 12.













                           - 99 -

                       00152-01 33 03-1


                                                   Таблица 12

                 Значения атрибутов записи ACP

  -----------------------------------------------------------

     Поле        !     Подполе     !     Назначение

  -----------------------------------------------------------

  FAT$V_RTYPE    !                 ! Тип записи, который оп-

                 !                 ! ределяется битами этого

                 !                 ! поля

                 ! FAT$C_FIXED     ! Запись фиксированной

                 !                 ! длины

                 ! FAT$C_VARIABLE  ! Запись переменной длины
                                           
                 ! FAT$C_VFC       ! Переменная запись с фик-

                 !                 ! сированным управлением

                 ! FAT$C_UNDEFINED ! Неопределенный формат

                 !                 ! записи (поток двоичных

                 !                 ! данных)

                 ! FAT$C_STREAM    ! Поток данных в формате

                 !                 ! системы управления дан-

                 !                 ! ными СУД-32

                 ! FAT$C_STREAMLF  ! Поток данных с символом

                 !                 ! перевода строки в качес-

                 !                 ! тве ограничителя

                 ! FAT$C_STREAMCR  ! Поток данных с символом

                 !                 ! возврата каретки в ка-

                 !                 ! честве ограничителя

  FAT$V_FILEORG  !                 ! Организация файла, кото-

                 !                 ! рая определяется битами




                           - 100 -

                       00152-01 33 03-1


                                         Продолжение табл. 12

  -----------------------------------------------------------

     Поле        !     Подполе     !     Назначение

  -----------------------------------------------------------

                 !                 ! этого поля

                 !                 !                      1)

                 ! FAT$C_DIRECT    ! Прямая организация файла

                 ! FAT$C_INDEXED   ! Индексная организация

                 !                 ! файла

                 ! FAT$C_RELATIVE  ! Относительная организа-

                 !                 ! ция файла

                 ! FAT$C_SEQUENTIAL! Последовательная органи-

                 !                 ! зация файла

  FAT$B_RATTRIB  !                 ! Атрибуты записи. В под-

                 !                 ! поле определены биты

                 !                 ! FAT$M_FORTRANCC,

                 !                 ! FAT$M_IMPLIEDCC,

                 !                 ! FAT$M_PRINTCC,

                 !                 ! FAT$M_NOSPAN

                 ! FAT$M_FORTRANCC ! Управление кареткой для

                 !                 ! языка программирования

                 !                 ! фортран

                 ! FAT$M_IMPLIEDCC ! Управление кареткой по

                 !                 ! умолчанию

                 ! FAT$M_PRINTCC   ! Управление кареткой для

                 !                 ! вывода файла на печать

                 ! FAT$M_NOSPAN    ! Отсутствуют сцепленные




                           - 101 -

                       00152-01 33 03-1


                                         Продолжение табл. 12

  -----------------------------------------------------------

     Поле        !     Подполе     !     Назначение

  -----------------------------------------------------------

                 !                 ! записи

  FAT$W_RSIZE    !                 ! Размер записи в байтах

              2) !                 !

  FAT$L_HIBLK    !                 ! Номер наиболее старшего

                 !                 ! выделенного виртуального

                 !                 ! блока. ACP поддерживает

                 !                 ! данное поле при расшире-

                 !                 ! нии или усечении файла.

                 !                 ! попытки изменить данное

                 !                 ! поле при операции записи

                 !                 ! атрибутов игнорируются

                 ! FAT$W_HIBLKH    ! Старшие 16 бит поля

                 ! FAT$W_HIBLKL    ! Младшие 16 бит поля

          2), 3) !                 !

  FAT$L_EFBLK    !                 ! Номер виртуального блока

                 !                 ! конца файла

                 ! FAT$W_EFBLKH    ! Старшие 16 бит поля

                 ! FAT$W_EFBLKL    ! Младшие 16 бит поля

              3) !                 !

  FAT$W_FFBYTE   !                 ! Первый свободный байт в

                 !                 ! поле FAT$L_EFBLK

  FAT$B_BKTSIZE  !                 ! Размер бакета в блоках

  FAT$B_VFCSIZE  !                 ! Размер в байтах постоян-




                           - 102 -

                       00152-01 33 03-1


                                         Продолжение табл. 12

  -----------------------------------------------------------

     Поле        !     Подполе     !     Назначение

  -----------------------------------------------------------

                 !                 ! ной управляющей части

                 !                 ! для записей переменной

                 !                 ! длины с постоянной уп-

                 !                 ! равляющей частью

  FAT$W_MAXREC   !                 ! Максимальный размер за-

                 !                 ! писи в байтах

  FAT$W_DEFEXT   !                 ! Величина расширения по

                 !                 ! умолчанию

  FAT$W_GBC      !                 ! Счетчик глобальных буфе-

                 !                 ! ров

  FAT$W_VERSIONS !                 ! Лимит версий по умолча-

                 !                 ! нию; действительно толь-

                 !                 ! ко в том случае, когда

                 !                 ! файл является каталогом

  -------------------

       1) определено, но не выполняется.

       2) поле в инвертированном формате. Старшие  и  младшие

  16 бит переставлены для совместимости с программным обеспе-

  чением эвм типа СМ 4, работающим под управлением операцион-

  ной системы МОС ВП.

       3) если положение конца  файла  совпадает  с  границей

  блока, по договоренности поле  FAT$L_EFBLK  содержит  номер

  виртуального блока конца файла, плюс 1, а поле FAT$W_FFBYTE




                           - 103 -

                       00152-01 33 03-1


  содержит нуль.



       3.5. Блок    статистики    атрибутов     ACP

            макрокоманды $QIO


       На рис. 13 показан формат блока статистики  атрибутов.

  В табл. 13 описаны поля, содержащиеся в блоке.


       Блок статистики атрибутов ACP макрокоманды $QIO

        31                  16 15        8 7         0
        +----------+----------+-----------+----------+
        !                                            !
        !                SBK$L_STLBN                 !
        !                                            !
        +----------+----------+-----------+----------+
        !                                            !
        !                SBK$L_FILESIZE              !
        !                                            !
        +----------+----------+-----------+----------+
        !                     !           !          !
        !    SBK$L_FCB        ! SBK$B_LCNT!SBK$B_ACNT!
        !                     !           !          !
        +----------+----------+-----------+----------+
        !                     !                      !
        !   Не используется   !    SBK$L_FCB         !
        !                     !  (продолжение)       !
        +----------+----------+------------+---------+
        !                     !                      !
        !   SBK$W_LCNT        !      SBK$B_ACNT      !
        !                     !                      !
        +----------+----------+------------+---------+
        !                     !                      !
        !   SBK$W_TCNT        !       SBK$W_WCNT     !
        !                     !                      !
        +----------+----------+------------+---------+
        !                                            !
        !                  SBK$L_READS               !
        !                                            !
        +--------------------------------------------!
        !                                            !
        !                  SBK$L_WRITES              !
        !                                            !
        +--------------------------------------------+

                            Рис. 13





                           - 104 -

                       00152-01 33 03-1


                                                   Таблица 13

                  Содержимое блока статистики

  -----------------------------------------------------------

     Поле        !   Подполе     !    Назначение

  -----------------------------------------------------------

  SBK$L_STLBN    !               ! в том случае, если файл

                 !               ! непрерывный, поле содержит

                 !               ! номер начального логичес-

                 !               ! кого блока файла. Для не

                 !               ! непрерывного файла поле

                 !               ! содержит  нуль. Номер ло-

                 !               ! гического блока хранится

                 !               ! в формате инвертированного

                 !               ! длинного слова, то есть

                 !               ! старшие 16 бит и младшие

                 !               ! 16 бит в нем переставлены.

                 !               ! это сделано для совмести-

                 !               ! мости с программным обес-

                 !               ! печением эвм типа СМ 4,

                 !               ! работающим под управлени-

                 !               ! ем операционной системы

                 !               ! МОС ВП. В поле определены

                 !               ! подполя

                 ! SBK$W_STLBNH  ! Старшие 16 бит поля

                 ! SBK$W_STLBNL  ! Младшие 16 бит поля

  SBK$L_FILESIZE !               ! Содержит размер файла в

                 !               ! блоках. Это поле хранится




                           - 105 -

                       00152-01 33 03-1


                                         Продолжение табл. 13

  -----------------------------------------------------------

     Поле        !   Подполе     !    Назначение

  -----------------------------------------------------------

                 !               ! в формате инвертированного

                 !               ! длинного слова, то есть

                 !               ! старшие 16 бит и младшие

                 !               ! 16 бит в нем переставлены.

                 !               ! это сделано для  совмести-

                 !               ! мости с программным обес-

                 !               ! печением эвм типа СМ 4,

                 !               ! работающим под управлени-

                 !               ! ем операционной системы

                 !               ! МОС ВП. В поле определены

                 !               ! подполя

                 ! SBK$W_FILESIZH! Старшие 16 бит поля

                 ! SBK$W_FILESIZL! Младшие 16 бит поля

              1) !               !

  SBK$B_ACNT     !               ! Счетчик обращений (младший

                 !               ! байт). Поле введено для

                 !               ! совместимости с програм-

                 !               ! мным обеспечением СМ 4

              1) !               !

  SBK$B_LCNT     !               ! Счетчик блокировок (млад-

                 !               ! ший байт). Поле введено

                 !               ! для совместимости с прог-

                 !               ! раммным обеспечением СМ 4




                           - 106 -

                       00152-01 33 03-1


                                         Продолжение табл. 13

  -----------------------------------------------------------

     Поле        !   Подполе     !    Назначение

  -----------------------------------------------------------

  SBK$L_FCB      !               ! Адрес блока управления

                 !               ! файлом в системном пуле

              1) !               !

  SBK$W_ACNT     !               ! Счетчик доступа, то есть

                 !               ! количество каналов, по ко-

                 !               ! торым в данный момент отк-

                 !               ! рыт данный файл

              1) !               !

  SBK$W_LCNT     !               ! Счетчик блокировок, то

                 !               ! есть количество операций

                 !               ! доступа, блокирующих за-

                 !               ! пись в файл

              1) !               !

  SBK$W_WCNT     !               ! Счетчик каналов записи, то

                 !               ! есть количество каналов,

                 !               ! по которым данный файл  в

                 !               ! данный момент открыт для

                 !               ! записи

              1) !               !

  SBK$W_TCNT     !               ! Счетчик блокировок усече-

                 !               ! ния, то есть количество

                 !               ! операций доступа, блокиру-

                 !               ! ющих усечение файла




                           - 107 -

                       00152-01 33 03-1


                                         Продолжение табл. 13

  -----------------------------------------------------------

     Поле        !   Подполе     !    Назначение

  -----------------------------------------------------------

  SBK$L_READS    !               ! Количество операций чте-

                 !               ! ния, выполненных для файла

                 !               ! по данному каналу

  SBK$L_WRITES   !               ! Количество операций

                 !               ! записи, выполненных  для

                 !               ! файла   по    данному

                 !               ! каналу

  ----------------------

       1)  учитываются  операции  доступа  от  процессов   на

  локальном узле только в одном кластере.



       3.6. Основные функции ACP


       Описание каждой функции ACP включает в себя обязатель-

  ные и необязательные аргументы определенной функции, а так-

  же последовательность действий по выполнению функции. В том

  случае, если основная функция вызывает подфункцию,  входные

  параметры, используемые  подфункцией,  опускаются  в  целях

  ясности изложения.



       3.6.1. Создание файла


       Функция создания файла создает элемент каталога  и/или

  файл на магнитном диске или создает файл на магнитной  лен-




                           - 108 -

                       00152-01 33 03-1


  те.

       Код функции:

          IO$_CREATE.

       Модификаторы функции:

       1) IO$M_CREATE - создать файл;

       2) IO$M_ACCESS - открыть файл по каналу пользователя;

       3) IO$M_DELETE - отметить файл  для  удаления  (приме-

  няется только для магнитных дисков).



       3.6.1.1. Входные параметры


       Аргументы функции IO$_CREATE, относящиеся к  категории

  зависящих от функции или устройства:

       1) P1 - адрес дескриптора блока FIB;

       2) P2 - адрес дескриптора строки имени файла;

       3) P3 - адрес слова, в которое  будет  записана  длина

  полученной строки имени файла (аргумент необязательный);

       4) P4 - адрес  дескриптора  буфера,  в  который  будет

  записана полученная строка имени файла  (аргумент  необяза-

  тельный);

       5) P5 - адрес списка дескрипторов атрибутов  (аргумент

  необязательный).

       При выполнении операции IO$_CREATE  используются  поля

  блока FIB, перечисленные в табл. 14.











                           - 109 -

                       00152-01 33 03-1


                                                   Таблица 14

  -----------------------------------------------------------

       Поле       !    Бит         !    Назначение

  -----------------------------------------------------------

  FIB$L_ACCTL     !                ! Содержит значения,  уп-

                  !                ! равляющие  доступом   к

                  !                ! файлу. Биты поля

                  !                ! FIB$L_ACCTL используются

                  !                ! при выполнении  функции

                  !                ! IO$_CREATE

                  ! FIB$M_REWIND   ! Если установлен, то пе-

                  !                ! ред выполнением операции

                  !                ! создания файла магнитная

                  !                ! лента перематывается на

                  !                ! начало. При этом любые

                  !                ! данные, ранее записанные

                  !                ! на эту ленту, затираются

                  ! FIB$M_CURPOS   !  Если установлен, то

                  !                ! файл на магнитной ленте

                  !                ! создается начиная с те-

                  !                ! кущей позиции. Если ни

                  !                ! бит FIB$M_REWIND, ни бит

                  !                ! FIB$M_CURPOS не установ-

                  !                ! лены, то файл на магнит-

                  !                ! ной ленте создается пос-

                  !                ! ле конца тома. В том слу

                  !                ! чае, если магнитная лен-




                           - 110 -

                       00152-01 33 03-1


                                         Продолжение табл. 14

  -----------------------------------------------------------

       Поле       !    Бит         !    Назначение

  -----------------------------------------------------------

                  !                ! та не позиционирована

                  !                ! на конец файла, бит

                  !                ! FIB$M_CURPOS указывает

                  !                ! на необходимость созда-

                  !                ! ния файла после конца

                  !                ! текущего файла. Любые

                  !                ! данные, записанные ранее

                  !                ! на эту магнитную ленту

                  !                ! после текущего конца

                  !                ! файла, будут уничтожены

                  ! FIB$M_WRITETHRU! Указывает, что заголовок

                  !                ! файла должен быть пере-

                  !                ! писан обратно на магнит-

                  !                ! ный диск. Если бит не

                  !                ! установлен, а файл отк-

                  !                ! рыт, то перепись заго-

                  !                ! ловка файла на магнитный

                  !                ! диск может быть на ка-

                  !                ! кое-то время задержана

  FIB$W_CNTRLFUNC !                ! Указывает значение, пре-

                  !                ! доставляющее пользовате-

                  !                ! лю возможность управлять

                  !                ! действиями, выполняющи-




                           - 111 -

                       00152-01 33 03-1


                                         Продолжение табл. 14

  -----------------------------------------------------------

       Поле       !    Бит         !    Назначение

  -----------------------------------------------------------

                  !                ! мися после того, как бу-

                  !                ! дет обнаружен признак

                  !                ! конца ленты при работе с

                  !                ! файлом  на   магнитной

                  !                ! ленте

                  ! FIB$C_USEREOT  ! Если этот бит установлен

                  !                ! и во время  доступа  к

                  !                ! файлу на магнитной ленте

                  !                ! драйвер накопителя на

                  !                ! магнитной ленте обнару-

                  !                ! жит признак конца ленты,

                  !                ! то подобное событие бу-

                  !                ! дет рассматриваться как

                  !                ! "серьезная исключитель-

                  !                ! ная ситуация" и пользо-

                  !                ! вателю будет возвращен

                  !                ! код     завершения

                  !                ! SS$_ENDOFTAPE   или

                  !                ! SS$_ENDOFVOLUME. Любые

                  !                ! последующие   операции

                  !                ! ввода-вывода будут за-

                  !                ! вершаться с кодом неус-

                  !                ! пешного    завершения




                           - 112 -

                       00152-01 33 03-1


                                         Продолжение табл. 14

  -----------------------------------------------------------

       Поле       !    Бит         !    Назначение

  -----------------------------------------------------------

                  !                ! SS$_SERIOUSEXP.

                  !                ! драйвер не будет выпол-

                  !                ! нять никаких запросов на

                  !                ! ввод-вывод до тех пор,

                  !                ! пока состояние серьезной

                  !                ! исключительной ситуации

                  !                ! не будет в явном виде

                  !                ! сброшено при помощи вы-

                  !                ! дачи запроса на выпол-

                  !                ! нение        функции

                  !                ! IO$_ACPCONTROL (см.

                  !                ! п. 3.6.7). Если файл

                  !                ! закрывается или доступ

                  !                ! к нему прекращается, то

                  !                ! при дальнейшей работе с

                  !                ! магнитной лентой бит

                  !                ! очищается

  FIB$W_FID       !                ! Содержит идентификатор

                  !                ! файла, который открыва-

                  !                ! ется или создается

  FIB$W_DID       !                ! Содержит идентификатор

                  !                ! файла каталога

  FIB$W_NMCTL     !                ! Управляет обработкой




                           - 113 -

                       00152-01 33 03-1


                                         Продолжение табл. 14

  -----------------------------------------------------------

       Поле       !    Бит         !    Назначение

  -----------------------------------------------------------

                  !                ! имени файла при операци-

                  !                ! ях с каталогом. Биты по-

                  !                ! ля FIB$W_NMCTL использу-

                  !                ! ются при выполнении

                  !                ! функции IO$_CREATE

                  ! FIB$M_NEWVER   ! В том случае, если уста-

                  !                ! новлен, должен быть соз-

                  !                ! дан файл с указанным

                  !                ! именем и следующим номе-

                  !                ! ром версии. Используется

                  !                ! только для накопителей

                  !                ! на магнитных дисках

                  ! FIB$M_SUPERSEDE! В том случае, если бит

                  !                ! установлен, создаваемый

                  !                ! файл должен заменить су-

                  !                ! ществующий файл с тем же

                  !                ! именем, типом и номером

                  !                ! версии. Используется

                  !                ! только для накопителей

                  !                ! на магнитных дисках

                  ! FIB$M_LOWVER   ! Устанавливается при воз-

                  !                ! врате, если существует

                  !                ! версия файла с меньшим




                           - 114 -

                       00152-01 33 03-1


                                         Продолжение табл. 14

  -----------------------------------------------------------

       Поле       !    Бит         !    Назначение

  -----------------------------------------------------------

                  !                ! номером. Используется

                  !                ! только для накопителей

                  !                ! на магнитных дисках

                  ! FIB$M_HIGHVER  ! Устанавливается при воз-

                  !                ! врате, если существует

                  !                ! версия файла с большим

                  !                ! номером. Используется

                  !                ! только для накопителей

                  !                ! на магнитных дисках

  FIB$W_VERLIMIT  !                ! Указывает лимит версий

                  !                ! для создаваемого элемен-

                  !                ! та каталога. Использует-

                  !                ! ся только для накопите-

                  !                ! лей на магнитных дисках

                  !                ! и  только  в  том

                  !                ! случае, когда создается

                  !                ! первая версия нового

                  !                ! файла. Если поле содер-

                  !                ! жит нуль, то будет ис-

                  !                ! пользовано значение,

                  !                ! принятое для данного ка-

                  !                ! талога по умолчанию. Ес-

                  !                ! ли была выполнена опера-




                           - 115 -

                       00152-01 33 03-1


                                         Продолжение табл. 14

  -----------------------------------------------------------

       Поле       !    Бит         !    Назначение

  -----------------------------------------------------------

                  !                ! ция с каталогом, поле

                  !                ! всегда содержит действи-

                  !                ! тельное значение лимита

                  !                ! версий для данного файла

  FIB$L_ACL_STATUS!                ! Состояние запрошенной

                  !                ! операции с атрибутами,

                  !                ! работающими со списком

                  !                ! управления доступом, ес-

                  !                ! ли такая была. Атрибуты,

                  !                ! работающие со списком

                  !                ! управления доступом,

                  !                ! (см. табл. 10)

                  !                ! если не было указано ни

                  !                ! одного такого атрибута,

                  !                ! то  в поле будет возвра-

                  !                ! щен код SS$_NORMAL



       3.6.1.2. Действие ACP для магнитных дисков


       Если  указан  модификатор  IO$M_CREATE,  то  создается

  файл. Идентификатор созданного файла  возвращается  в  поле

  FIB$W_FID. Если указан  модификатор  IO$M_DELETE,  то  файл

  отмечается для удаления.





                           - 116 -

                       00152-01 33 03-1


       Если в поле FIB$W_DID указан  ненулевой  идентификатор

  каталога, то создается элемент каталога. Имя файла, указан-

  ное в параметре P2, включается в каталог вместе с идентифи-

  катором файла из поля FIB$W_FID (формат строки имени  файла

  описан в подпункте 3.3.1.1). Символы обобщения не  разреше-

  ны. Отрицательные номера  версий  считаются  эквивалентными

  нулевому номеру версии. Если в аргументах Р3 и  Р4  указаны

  адреса дескриптора буфера и дсны результирующей строки,  то

  действительное имя введенного файла и его длина возвращают-

  ся.

       Номер версии файла обрабатывается следующим образом:

       - если номер версии  в  указанной  спецификации  файла

         равен нулю или отрицателен, то в создаваемый элемент

         каталога вносится номер версии на  единицу  больший,

         чем максимальный номер версии существующего файла  с

         этим же именем, или равный единице, если такого фай-

         ла не существовало;

       - если номер версии  в  указанной  спецификации  файла

         ненулевой и установлен бит FIB$M_NEWVER, то в созда-

        ваемый элемент каталога вносится либо номер версии на

         единицу больший, чем максимальный номер существующе-

         го файла с этим же именем, либо указанный номер вер-

         сии, в зависимости от того, какой  из  этих  номеров

         больше;

       - если номер версии  в  указанной  спецификации  файла

         ненулевой, а каталог уже содержит файл  с  таким  же

         именем, типом и номером версии, то выполнение опера-




                           - 117 -

                       00152-01 33 03-1


         ции создания файла зависит от бита  FIB$M_SUPERSEDE.

         Если этот бит установлен, то ранее существующий файл

         отмечается как  удаляемый.Если  бит  не  установлен,

         операция  создания  файла  завершается  неуспешно  с

         кодом завершения SS$_DUPFILNAM;

       - если после создания нового элемента  каталога  будет

         обнаружено, что количество версий данного файла пре-

         высило лимит версий, то версия этого  файла  с  наи-

         меньшим номером будет отмечена для удаления;

       - если файл не существовал ранее, новый элемент  ката-

         лога получает лимит версий, следующим образом: в том

         случае, если  поле  FIB$W_VERLIMIT  имеет  ненулевое

         значение, лимит версий устанавливается равным  этому

         значению; в противном случае  принимается  значение,

         установленное по  умолчанию  для  данного  каталога;

         если же и это значение равно нулю, то  лимит  версий

         устанавливается равным 32767 (то  есть  наибольшему

         возможному номеру версии).

       Строка имени файла, включенного в каталог возвращается

  пользователю через аргументы P3 и P4, если они не были опу-

  щены. Кроме того, строка имени файла записывается также и в

  заголовок. Если не было запрещено никаких операций с  ката-

  логом, то есть поле FIB$W_DID - нулевое, то строка  введен-

  ного имени файла, указанная в аргументе P2  (если  аргумент

  не опущен), записывается в заголовок файла.

       Если в аргументе P5 указан список атрибутов, то  будет

  выполнена подфункция записи атрибутов (см. п. 3.3.5).




                           - 118 -

                       00152-01 33 03-1


       Если был указан модификатор  IO$M_ACCESS,  файл  будет

  открыт (см. п. 3.3.2).

       Если в  блоке  FIB  установлен  бит  FIB$M_EXTEND,  то

  выполняется подфункция расширения файла (см. п. 3.3.3).

       Наконец, если ранее описанной операцией над  каталогом

  файл был отмечен для удаления, то файл удаляется.  Если  он

  удаляется  по  той  причине,   что   был   установлен   бит

  FIB$M_SUPERSEDE, то в  блок  состояния  ввода-вывода  будет

  возвращен код завершения SS$_SUPERSEDE. В том случае,  если

  файл удаляется из-за превышения лимита версий, будет  возв-

  ращен код завершения SS$_FILEPURGED.

       Если во  время  выполнения  функции  IO$_CREаTE  будет

  обнаружена ошибка, все дальнейшие действия с файлом прекра-

  щаются (то есть файл не создается и не меняется), A пользо-

  вателю возвращается код неуспешного завершения  операции  в

  блок состояния ввода-вывода.



       3.6.1.3. Действие ACP для магнитных лент


       В том случае, если модификатор IO$M_CREATE не  указан,

  никаких действий не производится. Магнитная лента  позицио-

  нируется  в  соответствии  с  тем,   как   указано   битами

  FIB$M_REWIND или FIB$M_CURPOS, а затем создается файл. Имя,

  указанное в аргументе P2, записывается  в  метку  заголовка

  файла.

       В том случае, если в аргументе P5 указан список  атри-

  бутов, будет выполнена подфункция записи атрибутов (см.  п.

  3.3.5).



                           - 119 -

                       00152-01 33 03-1


       В том случае,  если  указан  модификатор  IO$M_ACCESS,

  файл открывается (см. п. 3.3.2).



       3.6.2. Доступ к файлу


       Функция доступа к файлу просматривает каталог  магнит-

  ного диска или магнитной ленты в поисках указанного файла и

  получает доступ к нему в том случае, если файл найден.

       Код функции:

          IO$_ACCESS.

       Модификаторы функции:

       1) IO$M_CREATE - создать файл;

       2) IO$M_ACCESS - открыть файл по каналу пользователя.



       3.6.2.1. Входные параметры


       Аргументы    функции    IO$_ACCESS,    зависящие    от

  устройства/функции:

       1) P1 - адрес дескриптора блока FIB;

       2) P2 - адрес дескриптора строки имени файла (аргумент

  необязательный);

       3) P3 - адрес слова, в которое  будет  записана  длина

  полученной строки имени файла (аргумент необязательный);

       4) P4 - адрес  дескриптора  буфера,  в  который  будет

  записана полученная строка имени файла  (аргумент  необяза-

  тельный);

       5) P5 - адрес списка дескрипторов атрибутов  (аргумент

  необязательный).




                           - 120 -

                       00152-01 33 03-1


       Поля блока FIB, используемые при  выполнении  операции

  IO$_ACCESS, приведены в табл. 15

                                                   Таблица 15

  -----------------------------------------------------------

      Поле        !      Бит        !      Назначение

  -----------------------------------------------------------

  FIB$W_CNTRLFUNC !                 ! Указывает значение,

                  !                 ! предоставляющее пользо-

                  !                 ! вателю возможность уп-

                  !                 ! равлять действиями, вы-

                  !                 ! полняющимися после то-

                  !                 ! го, как будет обнаружен

                  !                 ! признак конца ленты при

                  !                 ! работе с файлом на маг-

                  !                 ! нитной ленте

                  ! FIB$C_USEREOT   ! Если этот бит установ-

                  !                 ! лен и во время доступа

                  !                 ! к файлу на магнитной

                  !                 ! ленте драйвер накопите-

                  !                 ! ля на магнитной ленте

                  !                 ! обнаружит признак конца

                  !                 ! ленты, то подобное со-

                  !                 ! бытие будет рассматри-

                  !                 ! ваться как "серьезная

                  !                 ! исключительная ситуа-

                  !                 ! ция" и пользователю бу-

                  !                 ! дет возвращен код за-




                           - 121 -

                       00152-01 33 03-1


                                         Продолжение табл. 15

  -----------------------------------------------------------

      Поле        !      Бит        !      Назначение

  -----------------------------------------------------------

                  !                 ! вершения SS$_ENDOFTAPE

                  !                 ! или SS$_ENDOFVOLUME.

                  !                 ! любые последующие опе-

                  !                 ! рации ввода-вывода бу-

                  !                 ! дут завершаться с кодом

                  !                 ! неуспешного завершения

                  !                 ! SS$_SERIOUSEXP. Драйвер

                  !                 ! не будет выполнять ни-

                  !                 ! каких запросов на ввод-

                  !                 ! вывод до тех пор, пока

                  !                 ! состояние серьезной

                  !                 ! исключительной ситуации

                  !                 ! не будет в явном виде

                  !                 ! сброшено при помощи вы-

                  !                 ! дачи запроса на выпол-

                  !                 ! нение      функции

                  !                 ! IO$_ACPCONTROL (см. п.

                  !                 ! 3.6.7). Если файл зак-

                  !                 ! рывается или доступ к

                  !                 ! нему прекращается, бит

                  !                 ! очищается и не влияет

                  !                 ! на дальнейшую работу с

                  !                 ! магнитной лентой




                           - 122 -

                       00152-01 33 03-1


                                         Продолжение табл. 15

  -----------------------------------------------------------

      Поле        !      Бит        !      Назначение

  -----------------------------------------------------------

  FIB$W_VERLIMIT  !                 ! Указывает лимит версий

                  !                 ! для файла. Используется

                  !                 ! только в том случае,

                  !                 ! если атрибут FIB$_DID

                  !                 ! имеет ненулевое значе-

                  !                 ! ние, то есть выполняет-

                  !                 ! ся поиск по каталогу.

                  !                 ! используется только для

                  !                 ! накопителей на магнит-

                  !                 ! ных дисках

  FIB$L_ACL_STATUS!                 ! Состояние запрошенной

                  !                 ! операции с атрибутами,

                  !                 ! работающими со списком

                  !                 ! управления доступом,

                  !                 ! если такая была. Атри-

                  !                 ! буты, работающие со

                  !                 ! списком управления дос-

                  !                 ! тупом приводятся в

                  !                 ! табл. 10. Если не было

                  !                 ! указано ни одного тако-

                  !                 ! го атрибута, то в поле

                  !                 ! будет возвращен код

                  !                 ! SS$_NORMAL




                           - 123 -

                       00152-01 33 03-1


                                         Продолжение табл. 15

  -----------------------------------------------------------

      Поле        !      Бит        !      Назначение

  -----------------------------------------------------------

  FIB$L_STATUS    !                 ! Состояние альтернатив-

                  !                 ! ного доступа

                  ! FIB$V_ALT_REQ   ! Устанавливается для

                  !                 ! указания того, что те-

                  !                 ! кущая операция требует

                  !                 ! бита альтернативного

                  !                 ! доступа. Если бит

                  !                 ! FIB$V_ALT_REQ не уста-

                  !                 ! новлен, то бит альтер-

                  !                 ! нативного доступа явля-

                  !                 ! ется не обязательным

                  !FIB$V_ALT_GRANTED! В том случае, если

                  !                 ! FIB$V_ALT_REQ = 0, этот

                  !                 ! бит в блоке FIB возвра-

                  !                 ! щается установленным,

                  !                 ! если проверка альтерна-

                  !                 ! тивного доступа завер-

                  !                 ! шилась успешно

  FIB$L_ALT_ACCESS!                 ! Маска доступа размером

                  !                 ! 32 бита, используемая

                  !                 ! для  проверки  защиты

                  !                 ! файла,    например,

                  !                 ! открыть файл для чтения




                           - 124 -

                       00152-01 33 03-1


                                         Продолжение табл. 15

  -----------------------------------------------------------

      Поле        !      Бит        !      Назначение

  -----------------------------------------------------------

                  !                 ! и проверить, разрешено

                  !                 ! ли его удалять. Маска

                  !                 ! имеет такую же структу-

                  !                 ! ру, как и стандартная

                  !                 ! маска защиты



       3.6.2.2. Выполнение операции


       В том случае, когда в поле FIB$W_DID указан  ненулевой

  идентификатор файла каталога,  будет  выполнена  подфункция
                         
  поиска (см. п. 3.3.1). В поле FIB$W_VERLIMIT будет  возвра-

  щен лимит версий найденного файла.

       В том случае, если при  поиске  по  каталогу  файл  не

  будет найден  и  указан  модификатор  IO$M_CREATE,  функция

  будет заново повторена как CREATE. В этом случае  аргументы

  будут интерпретироваться так, как их интерпретирует функция

  CREATE, а не так, как их интерпретирует функция ACCESS.

       В том случае, если был указан модификатор IO$M_ACCESS,

  будет выполнена подфункция доступа к файлу,  чтобы  открыть

  файл (см. п. 3.3.2)

       В том случае, если в параметре P5  был  указан  список

  атрибутов, будет выполнена подфункция чтения атрибутов (см.

  п. 3.3.5).





                           - 125 -

                       00152-01 33 03-1


       3.6.3. Отмена доступа к файлу


       Функция отмены доступа к файлу отменяет доступ к  фай-

  лу, а в том случае, если это  указано,  записывает  оконча-

  тельные значения атрибутов в заголовок файла.

       Код функции:

          IO$_DEACCESS.

       Данная функция не использует модификаторов.



       3.6.3.1. Входные параметры


       Аргументы   функции   IO$_DEACCESS,    зависящие    от

  функции/устройства:

       1) P1 - адрес дескриптора блока FIB;

       2) P5 - адрес списка дескрипторов атрибутов  (аргумент

  необязательный).

       Поля блока FIB,  используемые  при  выполнении  данной

  функции даны в табл. 16.

                                                   Таблица 16

  -----------------------------------------------------------

         Поле      !         Назначение

  -----------------------------------------------------------

  FIB$W_FID        ! Идентификатор файла, доступ к которому

                   ! должен быть отменен. Это поле может быть

                   ! нулевым. Если же оно ненулевое, то оно

                   ! должно совпадать с идентификатором фай-

                   ! ла, доступ к которому отменяется

  FIB$L_ACL_STATUS ! Состояние запрошенной операции с атрибу-




                           - 126 -

                       00152-01 33 03-1


                                         Продолжение табл. 16

  -----------------------------------------------------------

         Поле      !         Назначение

  -----------------------------------------------------------

                   ! тами, работающими со списком управления

                   ! доступом, если  такая была. Атрибуты,

                   ! работающие со списком управления досту-

                   ! пом приводятся в табл. 10. Если не было

                   ! указано ни одного такого атрибута, то в

                   ! поле будет возвращен код завершения

                   ! SS$_NORMAL

                   !



       3.6.3.2. Выполнение операции


       В том случае, если для  файла  на  магнитном  диске  в

  параметре P5 был указан  список  управления  атрибутами,  и

  файл был открыт  для  записи,  будет  выполнена  подфункция

  записи атрибутов (см. п. 3.3.5). Если файл был  открыт  для

  записи, а список атрибутов указан не был и во время доступа

  к файлу был  установлен  бит  FIB$M_DLOCK,  бит  блокировки

  отмены доступа будет установлен в заголовке файла, что при-

  ведет к запрещению последующего доступа к этому файлу.

       В том случае, если для файла на диске в блоке FIB  был

  установлен  бит  разрешения  усечения  FIB$M_TRUNC,   будет

  выполнена подфункция усечения файла (см. п. 3.3.4).

       После выполнения всех необходимых действий файл закры-

  вается. Для файлов на магнитной ленте, открытых для записи,



                           - 127 -

                       00152-01 33 03-1


  выполняется запись концевых меток.



       3.6.4. Изменение атрибутов файла


       Функция изменения атрибутов  файла  изменяет  атрибуты

  файла и/или его распределение на диске. К файлам на магнит-

  ной ленте данная функция неприменима.

       Код функции:

          IO$_MODIFY.

       Данная функция не использует модификаторов.



       3.6.4.1. Входные параметры


       Функция IO$_MODIFY имеет следующие аргументы,  завися-

  щие от функции/устройства:

       1) P1 - адрес дескриптора блока FIB;

       2) P2 - адрес дескриптора строки имени файла (аргумент

  необязательный. В том случае, если он указан, будет  выпол-

  нен поиск имени в каталоге);

       3) P3 - адрес слова, в которое  будет  записана  длина

  полученной строки имени файла (аргумент необязательный);

       4) P4 - адрес  дескриптора  буфера,  в  который  будет

  записана полученная строка имени файла  (аргумент  необяза-

  тельный);

       5) P5 - адрес списка дескрипторов атрибутов  (аргумент

  необязательный).

       Поля блока FIB, используемые при  выполнении  операции

  IO$_MODIFY приведены в табл. 17.




                           - 128 -

                       00152-01 33 03-1


                                                   Таблица 17

  -----------------------------------------------------------

        Поле      !       Бит       !      Назначение

  -----------------------------------------------------------

  FIB$L_ACCTL     !                 ! Содержит значения, уп-

                  !                 ! равляющие доступом к

                  !                 ! файлу

                  ! FIB$M_WRITETHRU ! Указывает, что заголо-

                  !                 ! вок файла должен быть

                  !                 ! переписан обратно на

                  !                 ! магнитный диск. Если

                  !                 ! бит не установлен, и

                  !                 ! файл открыт, то пере-

                  !                 ! пись заголовка файла

                  !                 ! на  магнитный диск мо-

                  !                 ! жет быть на какое-то

                  !                 ! время задержана

  FIB$W_VERLIMIT  !                 ! В том случае, если зна-

                  !                 ! чение поля не равно ну-

                  !                 ! лю, в нем содержится

                  !                 ! значение лимита версий

                  !                 ! для данного файла

  FIB$L_ACL_STATUS!                 ! Состояние запрошенной

                  !                 ! операции с атрибутами,

                  !                 ! работающими со списком

                  !                 ! управления доступом,

                  !                 ! если такая была. Атри-




                           - 129 -

                       00152-01 33 03-1


                                         Продолжение табл. 17

  -----------------------------------------------------------

        Поле      !       Бит       !      Назначение

  -----------------------------------------------------------

                  !                 ! буты, работающие со

                  !                 ! списком управления дос-

                  !                 ! тупом, приводятся в

                  !                 ! табл. 10. Если не было

                  !                 ! указано ни одного тако-

                  !                 ! го атрибута, то в поле

                  !                 ! будет возвращен код за-

                  !                 ! вершения SS$_NORMAL



       3.6.4.2. Выполнение операции


       В том случае, если в поле FIB$W_DID  указан  ненулевой

  идентификатор каталога, будет выполнена  подфункция  поиска

  (см. п. 3.3.1). В том случае, если  в  поле  FIB$W_VERLIMIT

  указан ненулевой лимит версий, а обнаруженный элемент ката-

  лога является самой последней версией файла,  лимит  версий

  будет установлен равным указанной величине.

       В том случае, если в параметре P5  был  указан  список

  атрибутов, будет выполнена подфункция записи атрибутов (см.

  п. 3.3.5).

       Файл может быть либо расширен, либо усечен. В том слу-

  чае, если в блоке FIB установлен бит  FIB$M_EXTEND,  выпол-

  няется подфункция расширения файла (см. п.  3.3.3).  В  том

  случае, если в блоке FIB установлен бит FIB$M_TRUNC, выпол-



                           - 130 -

                       00152-01 33 03-1


  няется подфункция усечения файла (см.  п.  3.3.4).  Следует

  иметь в виду, что  операции  расширения  и  усечения  файла

  взаимно исключают друг друга.



       3.6.5. Удаление файла


       Функция удаления файла удаляет элемент каталога  и/или

  заголовок файла из тома на магнитном диске.

       Код функции:

            IO$_DELETE.

       Модификатор функции:

            IO$M_DELETE - удалить файл (или отметить его для

                          удаления).

       Аргументы    функции    IO$_DELETE,    зависящие    от

  функции/устройства:

       1) P1 - адрес дескриптора блока FIB;

       2) P2 - адрес дескриптора строки имени файла (аргумент

  необязательный);

       3) P3 - адрес слова, в которое  будет  записана  длина

  полученной строки имени файла (аргумент необязательный);

       4) P4 - адрес  дескриптора  буфера,  в  который  будет

  записана полученная строка имени файла  (аргумент  необяза-

  тельный).

       Поля блока FIB, используемые при  выполнении  операции

  IO$_DELETE приведены в табл. 18.









                           - 131 -

                       00152-01 33 03-1


                                                   Таблица 18

  -----------------------------------------------------------

       Поле  !      Бит        !    Назначение

  -----------------------------------------------------------

  FIB$L_ACCTL!                 ! Содержит значения, управля-

             !                 ! ющие доступом к файлу

             ! FIB$M_WRITETHRU ! Указывает, что заголовок

             !                 ! файла должен быть переписан

             !                 ! обратно на магнитный диск.

             !                 ! если бит не установлен, и

             !                 ! файл открыт, то перепись

             !                 ! заголовка файла на магнитный

             !                 ! диск может быть на какое-то

             !                 ! время задержана

  FIB$W_FID  !                 ! Содержит идентификатор фай-

             !                 ! ла, который должен быть уда-

             !                 ! лен



       3.6.5.1. Выполнение операции


       В том случае, если в поле FIB$W_DID  указан  ненулевой

  идентификатор каталога, выполняется подфункция поиска  (см.

  п. 3.3.1). Найденное имя файла удаляется из каталога.

       В том случае,  если  был  указан  модификатор  функции

  IO$M_DELETE, файл отмечается для удаления.  В  том  случае,

  если в текущий момент файл не открыт,  он  будет  уничтожен

  немедленно. В том случае, если файл открыт, он будет удален

  после того, как его закроют все процессы,  имеющие  к  нему



                           - 132 -

                       00152-01 33 03-1


  доступ.



       3.6.6. Монтирование


       Функция монтирования информирует ACP о  том,  что  был

  монтирован том на магнитном диске или на  магнитной  ленте.

  Для выполнения данной операции необходимо иметь  привилегию

  MOUNT. Функция не использует модификаторов  или  каких-либо

  аргументов. Следует иметь в  виду,  что  выполнение  данной

  функции является только частью операции монтирования  тома.

  Большая часть обработки  выполняется  командой  MOUNT  либо

  программой системного обслуживания $MOUNT.



       3.6.7. Управление ACP


       Функция управления ACP выполняет разнообразные  управ-

  ляющие функции в зависимости от указанных аргументов.

       Код функции:

             IO$_ACPCONTROL.

       Модификатор функции:

             IO$M_DMOUNT - размонтировать том.



       3.6.7.1. Входные параметры


       Аргументы   функции   IO$_ACPCONTROL,   зависящие   от

  функции/устройства:

       1) P1 - адрес дескриптора блока FIB;

       2) P2 - адрес дескриптора строки имени файла (аргумент

  необязательный);



                           - 133 -

                       00152-01 33 03-1


       3) P3 - адрес слова, в которое  будет  записана  длина

  полученной строки имени файла (аргумент необязательный);

       4) P4 - адрес  дескриптора  буфера,  в  который  будет

  записана полученная строка имени файла  (аргумент  необяза-

  тельный).

       Поля блока FIB, используемые при  выполнении  операции

  IO$_ACPCONTROL, приведены в табл. 19.

                                                   Таблица 19

  -----------------------------------------------------------

       Поле       !      Бит         !    Назначение

  -----------------------------------------------------------

  FIB$W_CNTRLFUNC !                  ! Указывает управляющую

                  !                  ! функцию, которую необ-

                  !                  ! ходимо выполнить. Дан-

                  !                  ! ное поле перекрывает

                  !                  ! поле FIB$W_EXCTL

  FIB$L_CNTRLVAL  !                  ! Содержит дополнитель-

                  !                  ! ные данные, зависящие

                  !                  ! от функции. Данное по-

                  !                  ! ле перекрывает поле

                  !                  ! FIB$L_EXSZ

  FIB$L_ACL_STATUS!                  ! Состояние запрошенной

                  !                  ! операции с атрибутами,

                  !                  ! работающими со списком

                  !                  ! управления доступом,

                  !                  ! если такая была. Атри-

                  !                  ! буты, работающие со




                           - 134 -

                       00152-01 33 03-1


                                         Продолжение табл. 19

  -----------------------------------------------------------

       Поле       !      Бит         !    Назначение

  -----------------------------------------------------------

                  !                  ! списком управления

                  !                  ! доступом ппиводятся в

                  !                  ! табл. 10. Если не было

                  !                  ! указано ни одного та-

                  !                  ! кого атрибута то в по-

                  !                  ! ле будет возвращен код

                  !                  ! SS$_NORMAL

  FIB$L_STATUS    !                  ! Состояние альтернатив-

                  !                  ! ного доступа

                  ! FIB$V_ALT_REQ    ! Устанавливается для

                  !                  ! указания того, что те-

                  !                  ! кущая операция требует

                  !                  ! бита альтернативного

                  !                  ! доступа.  Если   бит

                  !                  ! FIB$V_ALT_REQ не уста-

                  !                  ! новлен, то бит альтер-

                  !                  ! нативного доступа яв-

                  !                  ! ляется не обязательным

                  ! FIB$V_ALT_GRANTED! В том случае, если

                  !                  ! FIB$V_ALT_REQ = 0,

                  !                  ! этот бит в блоке FIB

                  !                  ! возвращается установ-

                  !                  ! ленным, если проверка




                           - 135 -

                       00152-01 33 03-1


                                         Продолжение табл. 19

  -----------------------------------------------------------

       Поле       !      Бит         !    Назначение

  -----------------------------------------------------------

                  !                  ! альтернативного досту-

                  !                  ! па завершилась успешно

  FIB$L_ALT_ACCESS!                  ! Маска доступа размером

                  !                  ! 32 бита, используемая

                  !                  ! для проверки  защиты

                  !                  ! файла.    Например,
                             
                  !                  ! открыть файл для чте-

                  !                  ! ния, проверить, разре-

                  !                  ! шено ли его удалять.

                  !                  ! маска  имеет такую

                  !                  ! же структуру, как и

                  !                  ! стандартная маска

                  !                  ! защиты



       3.6.7.2. Управляющие функции для магнитной ленты


       Поля блока FIB, используемые при выполнении  управляю-

  щих функций на магнитной ленте, приведены в табл. 20.















                           - 136 -     

                       00152-01 33 03-1


                                                   Таблица 20

  -----------------------------------------------------------

      Поле       !       Бит      !     Назначение

  -----------------------------------------------------------

  FIB$W_CNTRLFUNC!                ! Некоторые из управляющих

                 !                ! функций ACP используются

                 !                ! для позиционирования маг-

                 !                ! нитной ленты.Эти функции

                 !                ! указываются при помощи

                 !                ! блока FIB. Адрес дескрип-

                 !                ! тора блока FIB передается

                 !                ! в параметре P1. Использо-

                 !                ! вать модификаторы и  па-

                 !                ! раметры P2, P3 и P4 не

                 !                ! допускается. Эти функции

                 !                ! сбрасывают состояние се-

                 !                ! рьезной исключительной

                 !                ! ситуации в драйверах маг-

                 !                ! нитной ленты

                 ! FIB$C_REWINDFIL! Перемотать магнитную лен-

                 !                ! ту на начало файла

                 ! FIB$C_REWINDVOL! Перемотать магнитную лен-

                 !                ! ту на начало набора томов

                 ! FIB$C_POSEND   ! Позиционировать магнитную

                 !                ! ленту на конец набора то-

                 !                ! мов

                 ! FIB$C_NEXTVOL  ! Потребовать переход к




                           - 137 -

                       00152-01 33 03-1


                                         Продолжение табл. 20

  -----------------------------------------------------------

      Поле       !       Бит      !     Назначение

  -----------------------------------------------------------

                 !                ! следующему тому

                 ! FIB$C_SPACE    ! Пропустить N блоков впе-

                 !                ! ред или назад в  поле

                 !                ! FIB$L_CNTRLVAL при этом

                 !                ! указывается количество

                 !                ! блоков на магнитной лен-

                 !                ! те, которое должно быть

                 !                ! пропущено: положительное

                 !                ! для продвижения вперед и

                 !                ! отрицательное для продви-

                 !                ! жения назад

                 ! FIB$C_CLSEREXCP! В том случае, если бит

                 !                ! установлен, будет сброше-

                 !                ! но состояние серьезной

                 !                ! исключительной ситуации в

                 !                ! драйвере магнитной ленты

                 !                ! (см. описание бита

                 !                ! FIB$C_USE!OT в ПП.

                 !                ! 3.6.1, 3.6.2). Это позво-

                 !                ! ляет пользователю писать

                 !                ! блоки данных после марке-

                 !                ! ра конца ленты






                           - 138 -

                       00152-01 33 03-1


       3.6.7.3. Разные  функции  управления  магнитными

                дисками


       Для  управления  томами  на  магнитных  дисках   можно

  использовать несколько управляющих функций  ACP.  Параметры

  P2, P3 и P4 эти функции не используют.

       В поле FIB$W_CNTRLFUNC блока FIB  могут  быть  указаны

  следующие управляющие функции (без применения  модификатора

  для кода функции IO$_ACPCONTROL):

       - изменить отображение файла (FIB$C_REMAP). Окно  отк-

         рытого файла меняется таким образом, чтобы окно фай-

         ла отображало весь файл;

       - блокировка распределения тома (HB$C_LOCK_VOL).  Опе-

         рации, меняющие файловую структуру, такие, как  соз-

         дание файлов, удаление файлов, расширение  файлов  и

         отмена доступа к файлам, запрещены.  В  том  случае,

         если подобные запросы будут поставлены в очередь  на

         том, заблокированный для распределения. Он не  будет

         обработан до тех  пор,  пока  не  будет  произведена

         разблокировка  тома  функцией  FIB$C_UNLK_VOL.   Для

         того,  чтобы  использовать  функцию  FIB$C_LOCK_VOL,

         пользователь должен либо иметь системный код иденти-

         фикации, либо обладать прив5 егией SYSPRV, либо быть

         владельцем тома;

       - разблокировать том (FIB$C_UNLK_VOL). Отменяет дейст-

         вие FIB$C_LOCK_VOL. Для того, чтобы использовать эту

         функцию, пользователь должен  либо  иметь  системный

         код идентификации, либо обладать привилегией SYSPRV,



                           - 139 -

                       00152-01 33 03-1


         либо быть владельцем тома;

       - указание  модификатора  размонтирования  IO$M_DMOUNT

         при функции IO$_ACPCONTRL приводит к выполнению мак-

         рокоманды $QIO на размонтирование тома. Параметры из

         блока FIB  не  используются.  Блок  FIB  может  быть

         опущен.VTанная функция в действительности не  произ-

         водит размонтирования, а  служит  для  синхронизации

         ACP с командой DISMOUNT и программой системного обс-

         луживания $DISMOUNT.



       3.6.7.4. Квоты доступа к магнитному диску


       На каждом магнитном диске есть файл квот тома, а  если

  файл расположен на нескольких томах, то файл квот  располо-

  жен на первом из набора томов. В  главном  каталоге  файлов

  файл квот тома имеет имя QUOTA.SYS;1.  В  данном  подпункте

  описываются управляющие функции. Для работы с  файлом  квот

  тома можно использовать функции управления, которые  приве-

  дены в табл. 21 и табл. 22.

       Функции разрешения и запрещения квот  доступа  к  тому

  приведены в табл. 21.

















                           - 140 -

                       00152-01 33 03-1


                                                   Таблица 21

                  Функции управления квотами

  -----------------------------------------------------------

  Код функции     !         Назначение функции

  -----------------------------------------------------------

  FIB$C_ENA_QUOTA ! Разрешает файл квот на диске. В том слу-

                  ! чае, если был указан ненулевой идентифи-

                  ! катор файла каталога, будет выполнена

                  ! подфункция поиска для определения положе-

                  ! ния файла квот (см. п. 3.3.1). Для того,

                  ! чтобы использовать данную функцию, поль-

                  ! зователь должен либо иметь системный код

                  ! идентификации, либо обладать привилегией

                  ! SYSPRV, либо быть владельцем тома.

                  ! в том случае, если в поле FIB$W_FID ука-

                  ! зан файл квот, ACP получает доступ к это-

                  ! му файлу и вводит квоты для доступа к то-

                  ! му. По соглашению имя файла квот -

                  ! [0,0]QUOTA.SYS;1 поэтому поле FIB$W_DID

                  ! должно содержать величину 4,4,0, а указы-

                  ! ваемая в параметре P2 строка имени должна

                  ! содержать имя файла "QUOTA.SYS;1"

  FIB$C_DSA_QUOTA ! Запрещает файл квот на диске. Доступ к

                  ! файлу квот и квоты отменяются. Для того,

                  ! чтобы использовать данную функцию, поль-

                  ! зователь должен либо иметь системный код

                  ! идентификации, либо обладать привилегией




                           - 141 -

                       00152-01 33 03-1


                    

П                                        Продолжение табл. 21

  -----------------------------------------------------------

  Код функции     !         Назначение функции

  -----------------------------------------------------------

                  ! SYSPRV, либо быть владельцем тома


       Функции управления квотами,  работающие  с  отдельными

  элементами файла квот перечислены в  табл.  22.  Каждая  из

  этих операций передает данные либо из  файла  квот  в  ACP,

  либо из ACP в файл квот, используя блок данных  квот.  Этот

  блок имеет тот же формат, что и запись  в  файле  квот.  На

  рис. 14 показан формат этого блока.

       Функции IO$_ACPCONTROL, передающие данные  файла  квот

  между вызывающей программой  и  ACP,  используют  следующие

  аргументы, зависящие от устройства/функции:

       1) P2 - адрес дескриптора блока данных  квот,  который

  нужно переслать в ACP;

       2) P3 - адрес слова, в котором возвращается длина дан-

  ных;

       3) Р4 - адрес дескриптора буфера для приема блока дан-

  ных квот, возвращаемого из ACP.

















                           - 142 -

                       00152-01 33 03-1


                     Блок данных квот

       31                                             0
       +----------------------------------------------+
       !                                              !
       !      Длинное слово флагов (DQF$L_FLAGS)      !
       !                                              !
       +----------------------------------------------+
       !                                              !
       !  Код идентификации пользователя (DQF$L_UIC)  !
       !                                              !
       +----------------------------------------------+
       !                                              !
       !     Текущее   использование    (DQF$L_USAGE) !
       !                                              !
       +----------------------------------------------+
       !                                              !
       !      Постоянная квота (DQF$L_PERMQUOTA)      !
       !                                              !
       +----------------------------------------------+
       !                                              !
       !      Лимит превышения (DQF$L_OVERDRAFT)      !
       !                                              !
       +----------------------------------------------+
       !                                              !
       !                                              !
       !                                              !
       +-----                                    -----+
       !                                              !
       !     (Зарезервировано для последующего        !
       !            использования)                    !
       !                                              !
       +-----                                    -----+
       !                                              !
       !                                              !
       !                                              !
       +----------------------------------------------+

                            Рис. 14


















                           - 143 -

                       00152-01 33 03-1


                                                   Таблица 22

                 Функции работы с файлом квот

                (обработка отдельных элементов)

  -----------------------------------------------------------

  Код функции     !    Назначение функции

  -----------------------------------------------------------

  FIB$C_ADD_QUOTA ! Добавить один элемент в файл квот на дис-

                  ! ке, используя  код идентификации пользо-

                  ! вателя и квоту из блока, указанного в ар-

                  ! гументе P2.  Для выполнения этой функции

                  ! требуется доступ на запись к файлу квот

  FIB$C_EXA_QUOTA ! Поиск элемента файла квот на диске. Код

                  ! идентификации пользователя для элемента

                  ! содержится в блоке, указанном в аргумен-

                  ! те P2. Элемент, имеющий такой код иден-

                  ! тификации пользователя возвращается в

                  ! блоке, указанном в аргументе P4, а

                  ! длина его возвращается в слово, указанное

                  ! в аргументе P3. С помощью двух флагов в

                  ! поле FIB$L_CNTRVAL можно управлять поис-

                  ! ком в файле квот с использованием симво-

                  ! лов обобщения. Это следующие флаги:

                  ! 1) FIB$M_ALL_MEM - поиск для всех членов

                  !                    группы;

                  ! 2) FIB$M_ALL_GRP - поиск для всех групп.

                  ! ACP сохраняет сведения о том, какой из

                  ! элементов файла просматривался, в поле




                           - 144 -

                       00152-01 33 03-1


                                         Продолжение табл. 22

  -----------------------------------------------------------

  Код функции     !    Назначение функции

  -----------------------------------------------------------

                  ! FIB$L_WCC. При первом вызове функции про-

                  ! верки в поле FIB$L_WCC следует указать

                  ! нуль. ACP возвращает ненулевое значение

                  ! так, что каждая успешная проверка возвра-

                  ! щает следующий подходящий элемент

                  ! для просмотра всех элементов файла квот,

                  ! не принадлежащих данному пользователю,

                  ! необходимо иметь доступ на чтение файла

                  ! квот

  FIB$C_MOD_QUOTA ! Изменить элемент файла квот на диске. Код

                  ! идентификации пользователя для элемента

                  ! файла квот содержится в блоке, указанном

                  ! в аргументе Р2. Элемент, имеющий такой

                  ! код идентификации пользователя, изменяет-

                  ! ся согласно значениям, указанным в блоке.

                  ! изменения. Управляется тремя флагами,

                  ! входящими в поле FIB$L_CNTRLVAL:

                  ! 1) FIB$M_MOD_PERM - изменить постоянную

                  !                     квоту;

                  ! 2) FIB$M_MOD_OVER - изменить квоту превы-

                  !                     шения;

                  ! 3) FIB$M_MOD_USE - изменить данные об ис-

                  !                    пользовании.




                           - 145 -

                       00152-01 33 03-1


                                         Продолжение табл. 22

  -----------------------------------------------------------

  Код функции     !    Назначение функции

  -----------------------------------------------------------

                  ! данные об использовании могут быть изме-

                  ! нены только в том случае, если том забло-

                  ! кирован при помощи FIB$C_LOCк_VOL (см.

                  ! подпункт 3.6.7.3).

                  ! функция FIB$C_MOD_QUOTA требует доступа

                  ! на запись в файл квот.

                  ! Измененный элемент файла квот возвращает-

                  ! ся пользователю через аргументы Р3 и Р4.

                  ! при помощи флагов FIB$м_ALL_MEM  и

                  ! FIB$М_ALL_GRP можно просматривать файл

                  ! квот с использованием символов обобщения

                  ! таким же способом, как и при выполнении

                  ! функции FIB$С_EXA_QUOTA

  FIB$C_REM_QUOTA ! Удалить элемент файла квот на диске. Код

                  ! идентификации пользователя для элемента

                  ! файла квот содержится в блоке, указанном

                  ! в аргументе Р2. Выполнение этой функции

                  ! требует доступа на запись в файл квот.

                  ! удаленный элемент файла квот возвращает-

                  ! ся пользователю через аргументы Р3 и Р4.

                  ! при помощи флагов FIB$м_ALL_MEM   и

                  ! FIB$м_ALL_GRP можно просматривать файл

                  ! квот с использованием символов обобщения




                           - 146 -

                       00152-01 33 03-1


                                         Продолжение табл. 22

  -----------------------------------------------------------

  Код функции     !    Назначение функции

  -----------------------------------------------------------

                  ! таким же способом, как и при выполнении

                  ! функции FIB$с_EXA_QUOTA



       3.7. Блок состояния ввода-вывода


       Формат блока состояния ввода-вывода (IOSB) для функций

  ACP макрокоманды $QIO показан на рис. 15.  В  приложении  1

  перечисляются коды завершения для этих функций.

       Файловый ACP записывает код завершения в первое  длин-

  ное слово блока состояния ввода-вывода. В том случае, когда

  выполняется операция расширения файла,  во  втором  длинном

  слове блока состояния ввода-вывода возвращается  количество

  блоков, выделенное файлу. В том случае, если операция  неп-

  рерывного расширения файла (FIB$M_ALCON) будет завершена не

  успешно, во втором длинном слове возвращается размер  файла

  после усечения.

       Значения кодов завершения, содержащиеся в  блоке  сос-

  тояния ввода-вывода, наиболее полезны при выполнении  прог-

  рамм в режиме совместимости.  При  выполнении  программы  в

  основном режиме следует использовать значения, содержащиеся

  в полях блока FIB.









                           - 147 -

                       00152-01 33 03-1


      Содержимое блока состояния  ввода-вывода

                      IOSB+2                     IOSB
  +------------------------+------------------------+
  !                        !                        !
  !   (Не  используется)   !      Код завершения    !
  !                        !                        !
  +------------------------+------------------------+
  !                                                 !
  !                                                 !
  !                                                 !
  +------------------------+------------------------+
                                               IOSB+4

                            Рис. 15

       В том случае,  если  выполняется  операция  расширения

  (включая CREATE),  второе  длинное  слово  блока  состояния

  ввода-вывода содержит количество выделенных блоков, а в том

  случае, если выполнялась операция  непрерывного  расширения

  файла и она завершилась неуспешно, оно будет содержать раз-

  мер максимального доступного непрерывного  участка.  В  том

  случае, когда выполнялась операция усечения, второе длинное

  слово блока состояния ввода-вывода  будет  содержать  коли-

  чество блоков, добавленных к размеру файла для того,  чтобы

  он достиг границы очередного кластера.






















                           - 148 -

                       00152-01 33 03-1


                     4. Драйвер терминала



       Драйвер терминала обслуживает  асинхронные  последова-

  тельные линейные мультиплексоры, а также консольный  терми-

  нал.



       4.1. Характерные  свойства   и   возможности

            драйвера терминала. Средства контроля


       Драйвер терминала операционной системы МОС ВП  предос-

  тавляет следующие возможности:

       1) по вводу:

       - повторный вызов команды;

       - редактирование командной строки;

       - распознование управляющих символов и  последователь-

         ностей AP2;

       - ввод с опережением;

       - распознование указываемых или принимаемых по умолча-

         нию ограничителей ввода;

       - поддержка специальных режимов;

       2) по выводу:

       - автоматический выбор наиболее эффективного режима;

       - ограниченные дуплексные операции;

       - форматированный и неформатированный вывод.

       3) поддержка коммутации по телефонному номеру:

       - управление модемом;

       - зависание по концу сеанса;

       - сохранение процессов при зависании;



                           - 149 -

                       00152-01 33 03-1


       4) дополнительные:

       - взаимодействие терминала и почтового ящика;

       - автоматическая установка скорости;

       - обработка нестандартного управляющего символа.



       4.1.1. Обработка ввода


       Большое разнообразие характеристик терминала и модифи-

  каторов чтения обеспечивают широкий  диапазон  возможностей

  для прикладных программ.  Эти  возможности  позволяют  осу-

  ществлять многоуровневое управление процессом  ввода  через

  драйвер терминала.



       4.1.1.1. Редактирование   командной   строки   и

                повторный вызов команды


       Терминальный драйвер обеспечивает  определенный  набор

  функций редактирования строки в процессе ввода. Эти функции

  задаются управляющими символами и  некоторыми  специальными

  клавишами на основной клавиатуре. Движение курсора происхо-

  дит в виде однопозиционных перемещений (стрелка  влево  или

  УС/D, стрелка вправо или УС/F), движений  в  начало  (УС/H)

  или конец строки  (УС/E).  Драйвер  терминала  поддерживает

  режимы вставки  и  замены  символов.  Режим  вставки/замены

  устанавливается в характеристиках терминала по умолчанию  в

  начале операции ввода и может быть  динамически  изменен  с

  помощью клавиши вставки/замены (УС/A). Кроме того,  драйвер

  обеспечивает удаление слова (УС/J или ПС) и удаление строки




                           - 150 -

                       00152-01 33 03-1


  (УС/U).

       Примечание. УС/X обозначает одновременное нажатие кла-

  виши УС и клавиши Х, где Х - клавиша  латинского  регистра.

  Например: УС/D, УС/F, УС/H и т.д.

       При использовании функций редактирования  надо  учиты-

  вать некоторые ограничения:

       - движение курсора в предыдущей строке не допускается;

       - вставка символов, если она приводит к переносу стро-

         ки не допускается;

       - удаление символов в предыдущей строке не  допускает-

         ся;

       - функции редактирования строк не могут быть назначены

         другим клавишам.

       Повторный вызов команды (УС/B или стрелка вверх) возв-

  ращает последнюю строку, введеную в буфер командной строки.

  После этого строка может быть  отредактирована  или  просто

  введена снова нажатием клавиши <ВК>.  Диалоговый  командный

  язык расширяет возможность повторного вызова команд  до  20

  последних команд. Для выключения механизма повторного вызо-

  ва команд используется модификатор TRM$M_TM_NORECALL.



       4.1.1.2. Управляющие   символы   и   специальные

                клавиши


       Управляющими  символами  являются   символы,   которые

  управляют функционированием терминала, при этом данные про-

  цессу не передаются. В приложении  2  приведены  коды  всех

  управляющих символов. Некоторые управляющие символы вводят-



                           - 151 -

                       00152-01 33 03-1


  ся с терминала одновременным нажатием клавиши <УС>  и  сим-

  вольной клавиши, например, УС/X. Другие управляющие  симво-

  лы, например, возврат каретки, перевод строки и авторегистр

  2, вводятся нажатием одной клавиши, такой как <ВК>, <ПС>  и

  <АР2>. В табл. 23 перечислены управляющие символы  термина-

  ла. Отображение управляющих символов (УС/C,  УС/Y,  УС/O  и

  УС/Z) на экране терминала может быть изменено на  системном

  уровне. Некоторые из управляющих символов не действуют если

  не была издана команда  диалогового  командного  языка  SET

  TERMINAL/LINE_EDIT.

                                                   Таблица 23

                 Управляющие символы терминала

  -----------------------------------------------------------

  Управляющий           !             Значение

  символ                !

  -----------------------------------------------------------

  Отмена                ! Передает управление асинхронному

  (УС/C)                ! системному прерыванию (далее  по

                        ! тексту - AST прерывание),

                        ! если программа пользователя разре-

                        ! шила AST прерывание по УС/C. Если

                        ! AST прерывание по УС/C не разреше-

                        ! но, УС/C преобразуется в  УС/Y

                        ! (подпункт 4.3.3.2). Терминал отра-

                        ! батывает новую строку (возврат ка-

                        ! ретки, за которым следует перевод

                        ! строки), печатает "CANCEL" и отра-




                           - 152 -

                       00152-01 33 03-1


                                         Продолжение табл. 23

  -----------------------------------------------------------

  Управляющий           !             Значение

  символ                !

  -----------------------------------------------------------

                        ! батывает еще одну строку. Если тер-

                        ! минал имеет характеристику REGIS

                        ! или если нажато УС/Y, то посылается

                        ! последовательность AP2 REGIS.

                        ! Дополнительными результатами дейст-

                        ! вия УС/C являются:

                        !   - очищение буфера ввода с опере-

                        !     жением;

                        !   - сброс УС/S и УС/O;

                        !   - все установленные в очередь,

                        !     выполняемые операции записи и

                        !     выполняемые операции чтения ус-

                        !     пешно завершаются.

                        !     возвращаемым кодом состояния

                        !     является SS$_CONTROLC или

                        !     SS$_CONTROLY, если УС/C

                        !     преобразовано в УС/Y

  Удаление символа      ! Удаляет последний введенный символ

  (ЗБ)                  ! из входного потока. <ЗБ> игнориру-

                        ! ется, если в текущий момент нет

                        ! входных символов. Терминалы с твер-

                        ! дой копией отображают удаляемый




                           - 153 -

                       00152-01 33 03-1


                                         Продолжение табл. 23

  -----------------------------------------------------------

  Управляющий           !             Значение

  символ                !

  -----------------------------------------------------------

                        ! символ, заключенный в обратные ко-

                        ! сые черточки. Например, если  уда-

                        ! ляется символ Z, то отображается

                        ! \Z\ (вторая косая черта отображает-

                        ! ся после ввода следующего символа,

                        ! не являющегося ЗБ). Терминалы, име-

                        ! ющие характеристику TT$M_SCOPE,

                        ! отображают зб удалением символа

  Удаление строки       ! Очищает текущие  входные  данные.

  (УС/U)                ! когда УС/U вводится до конца опера-

                        ! ции чтения, текущая входная строка

                        ! удаляется.  Если  редактирование

                        ! строки  разрешено   командой

                        ! SET TERMINAL/LINE_EDIT, данные от

                        ! начала строки до текущей позиции

                        ! курсора удаляются

  Удаление слова        ! Слово перед курсором удаляется. Ог-

  (УС/J)                ! раничителями слова являются управ-

  (ПС)                  ! ляющие символы, пробел, запятая,

                        ! точка     и      символы

                        ! !"#$%+&'()@<?/\>:;=  (см. приложе-

                        ! ние 2)




                           - 154 -

                       00152-01 33 03-1


                                         Продолжение табл. 23

  -----------------------------------------------------------

  Управляющий           !             Значение

  символ                !

  -----------------------------------------------------------

  Подавить вывод        ! Подавляет вывод. Действие является

  (УС/O)                ! немедленным. Весь вывод подавляется

                        ! либо до следующей операции чтения,

                        ! либо следующей операции записи с

                        ! модификатором IO$M_CONTROLO, либо

                        ! до приема следующего УС/O. На тер-

                        ! минал   выдается    сообщение

                        ! "OUTPUT OFF".  Текущая  операция

                        ! записи (если таковая  имеется) и

                        ! операции записи, которые выполня-

                        ! ются пока действует  УС/O завер-

                        ! шаются   с   состоянием

                        ! SS$_CONTROLO. Второе УС/O снова

                        ! разрешает вывод. Выдается сообщение

                        ! "OUTPUT ON". УС/C, УС/Y и УС/T от-

                        ! меняют УС/O

  Конец строки          ! Передвигает курсор в конец строки

  (УС/E)                !

  Выход                 ! Отображает на экране "EXIT", когда

  (УС/Z)                ! УС/Z вводится как ограничитель чте-

                        ! ния (ввода). УС/Z, по соглашению

                        ! обозначает конец файла




                           - 155 -

                       00152-01 33 03-1


                                         Продолжение табл. 23

  -----------------------------------------------------------

  Управляющий           !             Значение

  символ                !

  -----------------------------------------------------------

  Прерывание            ! УС/Y - это символ специального пре-

  (УС/Y)                ! рывания, который используется  для

                        ! привлечения внимания интерпретатора

                        ! команд к процессу.  Управляющий

                        ! символ УС/Y может быть  разрешен

                        ! модификатором IO$M_CTRLYAST  для

                        ! функций   IO$_SETCHAR   или

                        ! IO$_SETMODE макрокоманды $QIO.

                        ! Ввод УС/Y приводит к разрешенному

                        ! AST прерыванию процесса. Терминал

                        ! отрабатывает новую строку, печатает

                        ! "INTERRUPT", и отрабатывает еще од-

                        ! ну строку, если разрешено эхо.

                        ! УС/Y игнорируется, если для процес-

                        ! са не разрешены AST прерывания.

                        ! Дополнительные последствия ввода

                        ! управляющего символа УС/Y - сле-

                        ! дующие:

                        !   - буфер ввода с опережением

                        !     очищается;

                        !   - УС/S и УС/O сбрасываются;

                        !   - все установленные в очередь и




                           - 156 -

                       00152-01 33 03-1


                                         Продолжение табл. 23

  -----------------------------------------------------------

  Управляющий           !             Значение

  символ                !

  -----------------------------------------------------------

                        !     выполняемые в настоящее

                        !     время операции чтения и все вы-

                        !     полняемые операции записи ус-

                        !     пешно завершаются с количеством

                        !     передач, равным нулю. Возвраща-

                        !     емым кодом состояния  является

                        !     SS$_CONTROLY;

                        !   - посылается отмена  последова-

                        !     тельности AP2 REGIS

  Сдвинуть курсор влево ! Курсор сдвигается влево на одну

  (УС/D  <-- )          ! позицию

  Сдвинуть курсор вправо! Курсор сдвигается вправо на одну

  (УС/F  --> )          ! позицию

  Сдвинуть курсор       ! Курсор сдвигается в начало строки

  в начало строки       !

  (УС/H)                !

  Очистка буфера ввода  ! Очищает буфер ввода с опережением,

  с опережением         ! и выполняет операцию УС/U. Дей-

  (УС/X)                ! ствие является немедленным. Если

                        ! в это время выполняется операция

                        ! чтения, то действие эквивалентно

                        ! УС/U




                           - 157 -

                       00152-01 33 03-1


                                         Продолжение табл. 23

  -----------------------------------------------------------

  Управляющий           !             Значение

  символ                !

  -----------------------------------------------------------

  Повторный вызов       ! Вызывается последняя введенная

  (УС/B или             ! команда. Диалоговый командный язык

  стрелка вверх)        ! расширяет повторный вызов до нес-

                        ! кольких команд

  Воспроизведение ввода ! На экране воспроизводится текущий

  (УС/R)                ! ввод. Если  УС/R  вводится  во

                        ! время   операции   чтения,

                        ! отрабатывается новая строка, и на

                        ! экране воспроизводится текущее сос-

                        ! тояние буфера ввода. Если текущая

                        ! операция является операцией чтения

                        ! с подсказкой (IO$_READPROMPT), те-

                        ! кущая строка подсказки также  вос-

                        ! производится.

                        ! УС/R не действует, если установлена

                        ! характеристика  TT$M_NOECHO

  Возобновить вывод     ! Управляет потоком данных. Исполь-

  (УС/Q)                ! зуется и терминалами и драйвером.

                        ! снова запускает поток данных на

                        ! терминал или с терминала, который

                        ! был остановлен с помощью УС/S.

                        ! Действие выполняется немедленно,




                           - 158 -

                       00152-01 33 03-1


                                         Продолжение табл. 23

  -----------------------------------------------------------

  Управляющий           !             Значение

  символ                !

  -----------------------------------------------------------

                        ! без отображения на экране. УС/Q

                        ! также используется для запроса опе-

                        ! раций чтения.

                        ! УС/Q не имеет смысла, если терминал

                        ! не    обладает   характеристикой

                        ! TT$M_TTSYNC,   характеристикой

                        ! TT$M_READSYNC или в текущий момент

                        ! не остановлен с помощью УС/S

  Возврат каретки       ! При использовании во время операции

  (ВК)                  ! чтения (ввода), ВК отображается в

                        ! виде отработки новой строки. Все

                        ! заполнения на терминалах после ВК

                        ! указывает   характеристика

                        ! TT$M_CRFILL

  Остановить вывод      ! Управляет потоком данных. Использу-

  (УС/S)                ! ется как терминалами, так и драйве-

                        ! ром. УС/S останавливает все потоки

                        ! данных; действие выполняется немед-

                        ! ленно, без отображения на экране.

                        ! УС/S также используется для оста-

                        ! новки операции чтения.

                        ! УС/S имеет смысл только при наличии




                           - 159 -

                       00152-01 33 03-1


                                         Продолжение табл. 23

  -----------------------------------------------------------

  Управляющий           !             Значение

  символ                !

  -----------------------------------------------------------

                        ! у    терминала    характеристики

                        ! TT$M_TTSYNC  или   характеристики

                        ! TT$M_READSYNC

  Горизонтальная        ! Горизонтальная табуляция. Продвига-

  табуляция             ! ет курсор до следующей позиции та-

  (УС/I или ГТ)         ! буляции на терминалах с характерис-

                        ! тикой TT$M_MECHTAB.  Драйвер

                        ! предполагает позиции табуляции на

                        ! позициях курсора кратных 8.

                        ! На терминалах без этой характерис-

                        ! тики вместо ГТ выводится достаточ-

                        ! ное количество пробелов, чтобы пе-

                        ! редвинуть курсор в следующую пози-

                        ! цию, кратную 8

  Состояние             ! Отображение текущего времени. УС/T

  (УС/T)                ! также отображает текущий узел и имя

                        ! пользователя, имя выполняющегося

                        ! образа и информацию о ресурсах сис-

                        ! темы, которые использовались во

                        ! время текущего терминального сеанса

  Изменение режима      ! Меняет режим редактирования

  редактирования:       ! со вставки на замену и наоборот.




                           - 160 -

                       00152-01 33 03-1


                                         Продолжение табл. 23

  -----------------------------------------------------------

  Управляющий           !             Значение

  символ                !

  -----------------------------------------------------------

  Вставка/замена        ! Режим, установленный по умолчанию

  (УС/A)                ! (устанавливаемый   командой

                        ! SET TERMINAL/LINE_EDIT) восстанав-

                        ! ливается в начале каждой строки



       4.1.1.3. Контроль чтения


       Программные  средства  контроля  чтения   обеспечивают

  драйвер терминала возможностью проверки данных по мере вво-

  да каждого символа (подпункт 4.3.1.4). Неверный  символ  не

  отображается и завершает  операцию.  Драйвер  терминала  не

  поддерживает полного набора функций  обработки  полей.  Для

  ввода  больших  массивов  прикладных  данных  рекомендуется

  использовать программные средства системы управления форма-

  тами (СУФ), которые полностью поддерживают среду ввода дан-

  ных.



       4.1.1.4. Последовательности  AP2  и  управляющие

                последовательности


       Последовательности AP2 -  это  управляющие  последова-

  тельности, которые используются  для  обеспечения  дополни-

  тельного управления, не обеспеченного управляющими символа-




                           - 161 -

                       00152-01 33 03-1


  ми из набора символов (подпункт 4.1.1.2). Последовательнос-

  ти AP2 являются строками из двух и более символов, начинаю-

  щихся с символа AP2 (десятичное значение 27 или  шестнадца-

  теричное 1в), который обозначает, что дальше следует управ-

  ляющая информация. Большинство терминалов посылает и  отзы-

  вается на последовательности AP2.

       Характеристика TT$M_ESCAPE установки режима (см. табл.

  26) используется для указания того, что терминальная  линия

  может  генерировать  последовательности  AP2.   Модификатор

  функции чтения IO$M_ESCAPE позволяет завершать любое чтение

  по последовательности AP2, независимо от  того,  установлен

  или нет режим TT$M_ESCAPE. Последовательность  всегда  счи-

  тается ограничителем операции чтения и возвращается в буфер

  чтения; буфер чтения может содержать другие символы,  кото-

  рые не являются частью последовательности  AP2,  но  полная

  последовательность AP2 всегда является  ограничителем  чте-

  ния. Информация, возвращаемая в буфере  чтения  и  в  блоке

  ввода-вывода, содержит позицию и размер  последовательности

  AP2 в записи данных (подраздел 4.4).

       Любая последовательность AP2, принимаемая с  терминала

  проверяется на правильность синтаксиса. Если  синтаксис  не

  верен, то возвращается код  состояния  SS$_BADESCAPE.  Если

  последовательность AP2 не умещается в  буфер  пользователя,

  возвращается код состояния SS$_PARTESCAPE.  Если  возвращен

  код состояния SS$_PARTESCAPE, прикладная  программа  должна

  выдать достаточное количество односимвольных операций  чте-

  ния без тайм-аута, чтобы прочитать оставшиеся символы  пос-




                           - 162 -

                       00152-01 33 03-1


  ледовательности AP2 и разобрать ее  синтаксис.  Сохранность

  синтаксиса во время операции чтения не гарантируется.  Пос-

  ледовательность AP2 имеет следующий формат (в  шестнадцате-

  ричном виде):


        AP2 <INT>...<INT><FIN>

           где AP2 - символ, который открывает последователь-

                   ность  AP2  выполняется  нажатием  клавиши

                   AP2;

           <INT>   - промежуточный символ в диапазоне  от  20

                   до 2F. Этот диапазон включает символ "про-

                   бел" и 15  знаков  пунктуации.  Последова-

                   тельность AP2 может содержать любое  коли-

                   чество промежуточных символов или ни одно-

                   го;

           <FIN>   - завершающий символ в диапазоне от 30  до

                   7е. Этот  диапазон  включает  прописные  и

                   строчные буквы, цифры и 13 знаков пунктуа-

                   ции.

       Существуют три дополнительных  формата  последователь-

  ности AP2:

        1) AP2 <;><20-2F>...<30-7E>;

        2) AP2 <?><20-2F>...<30-7E>;

        3) AP2 <0><20-2F>...<30-7E>.

       Управляющие последовательности являются последователь-

  ностями AP2, которые содержат управляющие параметры. Управ-

  ляющие последовательности имеют следующий формат:





                           - 163 -

                       00152-01 33 03-1


        AP2 [ <PAR>...<PAR><INT>...<INT><FIN>

           где AP2 - выполняется нажатием клавиши AP2;

           [       - обозначает  управляющую   последователь-

                   ность;

           <PAR>   - является спецификатором параметра в диа-

                   пазоне от 30 до 3F;

           <INT>   - "промежуточный  символ",  определен  как

                   для последовательности AP2;

           <FIN>   - является "завершающим символом" в диапа-

                   зоне от 40 до 7Е.

       Например, управляющей последовательностью позициониро-

  вания курсора является AP2 [ PL ; PC H. PL - это  требуемая

  позиция строки, а PC - это требуемая позиция колонки.  Каж-

  дый тип терминала имеет свойственный ему набор  управляющих

  последовательностей.

       Управляющие символы в последовательностях  AP2  выпол-

  няют различные функции (подпункт 4.1.1.2).



       4.1.1.5. Ввод с опережением


       Ввод с терминала  всегда  независим  от  параллельного

  вывода на терминал. Такая способность называется  вводом  с

  опережением. Ввод с опережением разрешается на всех  терми-

  налах, если только он не запрещен явно с  помощью  характе-

  ристики установки режима, запрещающей  ввод  с  опережением

  TT$M_NOTYPEAHD (подраздел 4.2 и п. 4.4.3).

       Данные, вводимые с  терминала,  сохраняются  в  буфере

  ввода с опережением до тех пор, пока программа пользователя



                           - 164 -

                       00152-01 33 03-1


  не выдаст запрос на ввод/вывод для операции чтения.  В  это

  время данные передаются в буфер программы и отображаются на

  экране терминала, с которого они были введены.

       Отображения задерживается до тех пор, пока  не  завер-

  шится операция чтения. Это дает возможность процессу  поль-

  зователя указать модификаторы кода функции, которые модифи-

  цируют операцию чтения. Эти  модификаторы  могут  включать,

  например, отсутствие  эха  (IO$M_NOECHO)  и  преобразование

  строчных символов в прописные (IO$M_CVTLOW)  (см.  подпункт

  4.3.1.1).

       Если операция чтения уже осуществляется, когда  данные

  вводятся с терминала, они передаются и отображаются  немед-

  ленно.

       Действие драйвера, когда  буфер  ввода  с  опережением

  заполнен,  зависит  от  характеристики   установки   режима

  TT$M_HOSTSYNC (см. подраздел 4.2,  п.  4.3.3).  Если  режим

  TT$M_HOSTSYNC не установлен, то возвращается УС/G (звонок),

  чтобы сообщить пользователю о  заполнении  буфера  ввода  с

  опережением. Если символы вводятся, когда буфер уже  запол-

  нен, следующая операция чтения завершится с кодом  заверше-

  ния SS$_DATAOVERUN. Если установлена характеристика  режима

  TT$M_HOSTSYNC, то драйвер останавливает ввод, посылая ус/S,

  и терминал отвечает тем, что не посылает больше  ни  одного

  символа. Эти предупреждающие операции начинаются за  восемь

  символов до заполнения буфера ввода  с  опережением,  кроме

  случая, когда установлена  характеристика  TT2$M_ALTYPEAHD,

  разрешающая использование  большого  буфера,  определенного




                           - 165 -

                       00152-01 33 03-1


  параметрами генерации системы TTY_ALTYPAHD и  TTY_ALTALARM.

  (TTY_ALTYPHD определяет полный размер альтернативного буфе-

  ра ввода, TTY_ALTALARM определяет порог при  котором  посы-

  лается УС/S).

       Драйвер посылает УС/Q для возобновления передачи, ког-

  да буфер ввода с опережением полностью очистится.

       Буфер ввода с опережением имеет переменную длину. Диа-

  пазон возможных значений длины буфера - от 0 до 32767. Дли-

  на может быть  установлена  на  уровне  системы,  используя

  параметр генерации системы TTY_TYPANDSZ.

       При интенсивном вводе,  например,  в  блочном  режиме,

  если  терминал  обладает  характеристикой  ТТ2$M_PASTHRU  и

  определен модификатор функции  чтения  IO$M_NOECHO,  данные

  помещаются непосредственно  в  буфер  чтения,  переполнение

  буфера ввода с опережением исключается.



       4.1.1.6. Ограничители строки


       Ограничителями строки являются управляющие  последова-

  тельности, которые пользователь вводит с терминала для ука-

  зания конца входной строки. По желанию  прикладной  процесс

  может определить конкретный ограничитель строки  или  класс

  ограничителей для операций чтения.

       Ограничители  указываются  определенным  аргументом  в

  запросе ввода-вывода на операцию чтения. По умолчанию,  это

  может быть любой управляющий символ кроме пф, вт,  пс,  гт,

  вш (см. приложение 2). Если разрешено редактирование  стро-

  ки, ограничителями являются только вк, УС/Z или  последова-



                           - 166 -

                       00152-01 33 03-1


  тельности AP2. Если в запрос включен  аргумент  Р4,  то  он

  определяет группу ограничителей,  выбираемых  пользователем

  (подпункт 4.3.1.2).

       Характеристика  TT$M_EIGHTBIT  определяет,  использует

  терминал 7-битный или 8-битный набор символов. Все  входные

  символы, за исключением некоторых специальных  клавиш  (см.

  подпункт 4.1.1.2), проверяются по  отношению  к  выбранному

  ограничителю. Ввод заканчивается, когда происходит совпаде-

  ние, или когда заполняется входной буфер пользователя.



       4.1.1.7. Специальные режимы функционирования


       Драйвер терминала операционной системы МОС ВП  поддер-

  живает много специальных режимов функционирования для  тер-

  минальных линий. В подразделе 4.2 перечислены  эти  режимы.

  Все специальные режимы разрешаются и запрещаются с  помощью

  макрокоманд $QIO установки режима или установки характерис-

  тик (см. п. 4.3.3).



       4.1.2. Обработка вывода


       Для обработки вывода, например,  для  мультиплексоров,

  которые поддерживают различные  методы  доступа  к  памяти,

  драйвер динамически оценивает размер записи и выбирает наи-

  более эффективный режим. Размер блока,  определенный  пара-

  метром генерации системы TTY_DMASIZE, является  минимальным

  размером блока, который может быть использован  в  операции

  прямого доступа к памяти.




                           - 167 -

                       00152-01 33 03-1


       4.1.2.1. Дуплексные режимы


       Драйвер терминала операционной системы  МОС  ВП  может

  работать как в полудуплексном, так и в  дуплексном  режиме.

  Эти термины относятся не к линии связи,  а  к  программному

  обеспечению драйвера терминала, в частности,  к  алгоритмам

  упорядочения, используемым для того, чтобы обслуживать зап-

  росы на чтение и запись.

       В полудуплексном режиме все запросы на чтение и запись

  ставятся в одну очередь. Драйвер терминала выбирает запросы

  из начала очереди и выполняет их поочередно. Таким образом,

  все запросы выполняются последовательно в порядке  их  пос-

  тупления.

       В дуплексном режиме запросы на чтение (и все остальные

  запросы, кроме запросов на запись) устанавливаются  в  одну

  очередь, а запросы на запись - в другую. Существование двух

  очередей позволяет драйверу распознавать наличие двух типов

  запросов, например, на чтение и запись одновременно.  Одна-

  ко, драйвер не может выполнять запрос на чтение и запрос на

  запись одновременно. Когда он готов к обслуживанию запроса,

  он динамически решает какой запрос - на чтение или запись -

  обслуживать следующим.

       В драйвере терминала операционной системы МОС ВП  зап-

  росы на запись обычно имеют более высокий приоритет. Запрос

  на запись может прервать текущий, но не активный, запрос на

  чтение. Запрос на чтение является  текущим,  когда  драйвер

  терминала выбирает его из очереди на  обслуживание.  Запрос

  на чтение становится активным, когда принимается и  отобра-



                           - 168 -

                       00152-01 33 03-1


  жается первый входной символ. Когда операция чтения  стано-

  вится активной, все запросы на запись будут ожидать  завер-

  шения операции чтения. Для терминалов, которые имеют харак-

  теристику TT$M_NOECHO или функцию  чтения  с  модификатором

  IO$M_NOECHO, разрешены операции записи в дуплексном режиме.

       Если выполняется операция записи, для которой  опреде-

  лен модификатор IO$M_BREAKTHRU, запись не будет блокирована

  даже активной операцией чтения. IO$M_BREAKTHRU не  изменяет

  порядок очередности операций записи.

       Если все запросы на ввод-вывод выдаются с  использова-

  нием макрокоманды $QIOW, может  быть  только  один  текущий

  запрос на ввод-вывод в каждый момент времени. В этом случае

  запросы обслуживаются одинаково как в полудуплексном, так и

  в дуплексном режиме.

       Буфер ввода с опережением всегда  накапливает  входные

  данные, для которых не существует текущего запроса на  чте-

  ние, как в полудуплексном, так и в дуплеKсном режиме.



       4.1.2.2. Форматирование вывода


       По умолчанию выходные данные являются об'ектом  форма-

  тирования для драйвера терминала.  Форматирование  включает

  такие действия как управление курсором, расширение  табуля-

  ций, преобразование строчных символов в прописные. Приклад-

  ные программы, в которых не требуется  форматирование  дан-

  ных, могут производить запись с модификатором IO$M_NOFORMAT

  и, таким образом, повысить эффективность записи.  Установка

  режима  полного  пропускания  (TT2$M_PASTHRU)  эквивалентна



                           - 169 -

                       00152-01 33 03-1


  записи без форматирования.



       4.1.3. Поддержка коммутирования


       Операционная система МОС  ВП  обеспечивает  управление

  модемом (например, КН 1200, КН 2400 или эквивалентными  им)

  для всех обслуживаемых мультиплексоров в дуплексном  режиме

  с автоматическим ответом. Не поддерживаются  также  модемы,

  которые используют схему 108/1 (соединение набора данных  с

  линией) вместо  готовности  данных  терминала.  Большинство

  американских и европейских модемов используют сигнал готов-

  ности данных терминала, который поддерживается операционной

  системой МОС ВП.



       4.1.3.1. Сигналы управления модемом


       Коммутируемые  линии  с   характеристикой   TT$M_MODEM

  периодически контролируются с целью обнаружения изменения в

  несущих  сигналах  модема.   Параметр   генерации   системы

  TTY_SCANDELTA устанавливает период контроля коммутации  для

  мультиплексоров, которые не поддерживают передачу  сигналов

  прерывания модема.

       Если несущий сигнал в линии теряется, драйвер  ждет  в

  течении двух секунд возврата сигнала. Если бит 0  параметра

  генерации системы TTY_DIALTYPE установлен (=1), то  драйвер

  не ждет. По умолчанию бит 0 равен нулю. Если несущий сигнал

  не обнаружен в течение этого времени, это значит, что линия

  "зависла". Сообщение о зависании линии владелец линии может




                           - 170 -

                       00152-01 33 03-1


  получить через почтовый ящик. О присоединении линии никако-

  го сообщения  не  посылается;  достаточно  незапрашиваемого

  символьного сообщения о  приеме  первых  имеющихся  данных.

  Линия недоступна по крайней мере в течение  двух  секунд  с

  момента начала сообщения о рассоединении. Процесс зависания

  необратим. Если линия зависает, то вводятся все разрешенные

  аSт прерывания по УС/Y. Аргумент Р2 AST прерывания по  УС/Y

  переписывается с кодом  состояния  SS$_HANGUP.  Выполняемая

  операция ввода-вывода отменяется, и в блок состояния  возв-

  ращается код  завершения  SS$_ABORT.  Диалоговый  командный

  язык отвечает за удаление процесса после ввода  УС/Y.  Если

  процесс завис, диалоговый командный язык не может его  уда-

  лить, пока процесс не возобновится.

       Для терминалов с характеристикой TT$M_MODEM,  характе-

  ристика TT$M_REMOTE Oтражает  состояние  несущего  сигнала.

  TT$M_REMOTE устанавливается, когда несущий сигнал изменяет-

  ся от "выключено" к "включено", и очищается, когда  несущий

  сигнал пропадает.

       Драйвер терминала операционной системы МОС ВП по умол-

  чанию удовлетворяет требованиям протокола, принятого в  сша

  и европейских странах. Этот протокол  способен  работать  в

  режиме автоматического ответа и выполнять ручную коммутацию

  исходящего вызова. Протокол обеспечивает  требования  боль-

  шинства  известных  международных  телефонных  сетей.   Его

  использование увеличивает возможности модема, обслуживающе-

  го эти мультиплексоры. Процессорная регистрация не является

  необходимой. Протокол также  функционирует  в  подмножестве




                           - 171 -

                       00152-01 33 03-1


  режимов для мультиплексоров, которые не обеспечивают полно-

  го набора сигналов модема.

       В табл. 24 приведены сигналы  управления  и  данные  в

  режиме управления модема полной конфигурации, т.е. в однов-

  ременном двухканальном симметричном режиме передачи.

       Модификаторы функций  установки  режимов  обеспечивают

  возможность процессу устанавливать или сбрасывать управляю-

  щие сигналы модема (подпункт 4.3.3.3).

       Бит 1 параметра генерации системы TTY_DIALTYPE  разре-

  шает альтернативный протокол модема  на  основе  системы  с

  расширенными возможностями. Если бит 1 равен нулю (по умол-

  чанию), сигнал индикатор  вызова  (RING)  не  используется.

  Если бит 1 установлен, протокол модема задерживает установ-

  ку готовности данных  терминала  (DTR),  пока  распознается

  сигнал индикатор вызова (RING).

       Линия, для которой не установлен TT$M_MODEM, не  отве-

  чает на сигналы модема или  установку  готовности.  Сигналы

  модема могут быть установлены и восприняты путем  использо-

  вания  модификатора  функции   IO$M_MAINT   (см.   подпункт

  4.3.3.3).


















                           - 172 -

                       00152-01 33 03-1


                                                   Таблица 24

                  Сигналы управления и данные

              (Режим полной конфигурации модема)

  -----------------------------------------------------------

  Сигнал      ! Источник !        Значение

  -----------------------------------------------------------

  Передача    !   ЭВМ    ! Данные порождаются  эвм  и пере-

  данных      !          ! даются через модем на один или

  (TXD)       !          ! больше удаленных терминалов

  Прием       !  МОДЕМ   ! Данные генерируются модемом в от-

  данных      !          ! вет на сигнал, принятый по теле-

  (RXD)       !          ! фонной линии от удаленного терми-

              !          ! нала, и передаются в ЭВМ

  Запрос на   !   ЭВМ    ! Если   присутствует  состояние

  передачу    !          ! "включено", сигнал RTS переключает

  (RTS)       !          ! МОДЕМ в режим передачи. Иначе (со-

              !          ! стояние "выключено"), сигнал RTS

              !          ! переключает МОДЕМ в непередающий

              !          ! режим после того, как все данные

              !          ! будут переданы

  Готовность  !  МОДЕМ   ! Индицирует, готов модем (состо-

  к посылке   !          ! яние "включено"), или не готов

  (CTS)       !          ! (состояние  "выключено")  к

              !          ! передаче данных по телефонной

              !          ! линии

  Набор       !  МОДЕМ   ! Если присутствует   (состояние

  данных      !          ! "включено"), сигнал DSR индициру-




                           - 173 -

                       00152-01 33 03-1


                                         Продолжение табл. 24

  -----------------------------------------------------------

  Сигнал      ! Источник !        Значение

  -----------------------------------------------------------

  готов       !          ! ет, что МОДЕМ готов к передаче и

  (DSR)       !          ! приему, т.е., что МОДЕМ соединен

              !          ! с линией и готов к дальнейшему об-

              !          ! мену управляющими сигналами с эвм

              !          ! для инициирования обмена данными.

              !          ! Если сигнал DSR отсутствует (сос-

              !          ! тояние "выключено"), то это зна-

              !          ! чит, что МОДЕМ не готов к приему и

              !          ! передаче. Если сигнал DSR обнару-

              !          ! жен, операционная система МОС ВП

              !          ! инициирует 30-секундный таймер.

              !          ! Это предохранит отсоединение от

              !          ! телефонной линии, если сигнал

              !          ! CARRIER не определяется

  Индикатор   !   МОДЕМ  ! Если присутствует (состояние

  линейного   !          ! "включено"). Сигнал CARRIER озна-

  сигнала     !          ! чает, что полученный линейный сиг-

  канала      !          ! нал канала данных находится в

  данных      !          ! пределах, установленных МОДЕМОМ.

  (CARRIER)   !          ! в противном случае (состояние

              !          ! "выключено"), полученный сигнал

              !          ! вышел за установленные границы

  Данные      !    ЭВМ   ! если присутствует (состояние




                           - 174 -

                       00152-01 33 03-1


                                         Продолжение табл. 24

  -----------------------------------------------------------

  Сигнал      ! Источник !        Значение

  -----------------------------------------------------------

  терминала   !          ! "включено"), сигнализирует, что

  готовы      !          ! ЭВМ готова к операции, МОДЕМ гото-

  (DTR)       !          ! вится подсоединиться  к линии и

              !          ! поддерживать соединение, после то-

              !          ! го как оно будет сделано, для дру-

              !          ! гих целей.  Сигнал DTR не может

              !          ! присутствовать ни в коем случае,

              !          ! если ЭВМ готова к передаче данных.

              !          ! если сигнал DTR отсутствует, МОДЕМ

              !          ! отсоединяется от линии

  Индикатор   !   МОДЕМ  ! Сигнализирует, принимается ли  вы-

  вызова      !          ! зывающий сигнал модемом. Бит 1 па-

  (RING)      !          ! раметра   генерации   системы

              !          ! TTY_DIALTYPE должен быть установ-

              !          ! лен (=1). Если сигнал RING обна-

              !          ! ружен, операционная система МОС ВП

              !          ! инициирует 30-секундный таймер.

              !          ! Это предохраняет от рассоединения

              !          ! с телефонной линией, если сигнал

              !          ! CARRIER не обнаружен










                           - 175 -

                       00152-01 33 03-1


       4.1.3.2. Зависание по концу сеанса


       По умолчанию завершение сеанса на линии с  МОДЕМОМ  не

  вызовет  потери  связи.  Если  установлена   характеристика

  TT2$M_MODHANGUP, связь с модемом разрывается, когда процесс

  завершает сеанс. Если характеристика TT2$M_MODHANGUP  уста-

  новлена, то не требуется никаких привилегий  для  изменения

  характеристики  TT2$M_HANGUP.   Установкой   характеристики

  TT2$M_HANGUP администратор системы может защитить  коммути-

  руемую линию от занятия непривилегированными  пользователя-

  ми, не зарегистрированными в системе.



       4.1.3.3. Сохранение процесса при зависании


       Для отсоединяемого терминала допускается разрыв соеди-

  нения по физической линии  терминала  без  потери  задания.

  Следующая команда утилиты SYSGEN позволяет сделать терминал

  отсоединяемым:


         SYSGEN> CONNECT VTA0/NOADAPTER/DRIVER=TTDRIVER


  после  ввода  этой  команды,  терминал  с   характеристикой

  TT2$M_DISCONNECT будет зарегистрирован как VTAN:, в отличие

  от физического терминала. Когда терминал  установлен  таким

  образом, никакие операции физического  ввода  и  вывода  не

  допускаются.

       Существует четыре способа, с помощью которых  терминал

  может стать отсоединенным:

       1) потеряны сигналы  между  терминалом  и  центральным




                           - 176 -

                       00152-01 33 03-1


  узлом;

       2) пользователь нажимает клавишу бл (блокировка  пере-

  дачи) на терминале, имеющем характеристику TT2$M_SECURE;

       3) путем использования команды диалогового  командного

  языка DISCONNECT;

       4) путем использования команды диалогового  командного

  языка CONNECT/CONTINUE.

       Для пользователя существуют два способа присоединиться

  к отсоединенному процессу:

       1)  позволить  зарегистрированному  процессу  провести

  соединение;

       2) путем использования команды диалогового  командного

  языка CONNECT.



       4.1.4. Взаимодействие  терминала  и  почтового

              ящика


       Почтовый   ящик   является   виртуальным   устройством

  ввода-вывода, используемым для передачи данных  между  про-

  цессами (раздел 8). Драйвер терминала также может использо-

  вать почтовый ящик  для  связи  с  процессом  пользователя.

  Программа пользователя может использовать программу систем-

  ного обслуживания $ASSIGN для связи почтового ящика с одним

  или более терминалом. Драйвер терминала посылает  сообщения

  в этот почтовый ящик, когда происходят  события,  требующие

  внимания со стороны процесса  пользователя.  Почтовый  ящик

  используемый таким образом, содержит сообщение о  состоянии

  терминала, а не данные. Например, когда данные поступают  с



                           - 177 -

                       00152-01 33 03-1


  терминала, для  которых  не  был  выдан  запрос  на  чтение

  (незапрашиваемые данные), в соответствующий  почтовый  ящик

  посылается сообщение для указания доступности  данных.  При

  получении этого  сообщения  программа  пользователя  должна

  получить номер канала, назначенного терминалу, для  получе-

  ния данных. Сообщения посылаются в почтовый ящик при соблю-

  дении следующих условий:

       - незапланированные данные находятся в буфере ввода  с

         опережением. Использование соответствующего почтово-

         го ящика может быть разрешено или запрещено как под-

         функция  запросов  на  запись/чтение   (пп.   4.3.1,

         4.3.2). Первоначально, сообщения  в  почтовые  ящики

         разрешены на всех терминалах. Это состояние по умол-

         чанию. Процесс пользователя может  начать  диалог  с

         терминалом  после  получения  сообщения  о  прибытии

         незапрошенных данных. Затем, после завершения диало-

         га процесс пользователя может снова разрешить  функ-

         цию сообщения о  незапрошенных  данных  в  последней

         операции ввода-вывода. В промежутке между операциями

         чтения посылается только одно сообщение;

       - зависание терминала. Зависание возникает, когда уда-

         ленная линия теряет несущий  сигнал;  сообщение  при

         этом посылается в  почтовый  ящик.  Когда  зависание

         происходит на линии с  характеристикой  TT$M_REMOTE,

         линия возвращается в локальный режим;

       - сообщения для передачи. Если установлена характерис-

         тика TT2$M_BRDSTMBX, данные передаваемые  на  терми-




                           - 178 -

                       00152-01 33 03-1


         нал, помещаются в почтовый ящик, независимо от  сос-

         тояния TT$M_NOBRDCST.

       Сообщения, помещаемые в почтовый ящик, имеют следующее

  содержание:

       - тип сообщения. Коды  MSG$_TRMUNSOLIC  (незапрошенные

         данные), MSG$_TRMHANGUP (зависание) и MSG$_TRMBRDCST

         (передача на  терминал)  определяют  тип  сообщения.

         Типы сообщений описываются макрокомандой $мSGDEF;

       - номер устройства для идентификации  терминала,  пос-

         лавшего сообщение;

       - строка со счетчиком, указывающая имя устройства;

       - имя контроллера (без двоеточия (:));

       - сообщение (для передачи).

       Формат сообщений, помещаемых в почтовый ящик изображен

  на рис. 16.




























                           - 179 -

                       00152-01 33 03-1



          Формат сообщения, помещаемого в почтовый
                  ящик для терминала

     31                      16 15         8 7          0
     +--------------------------------------------------+
     ! Номер устройства        !   Тип сообщения        ! 0
     +--------------------------------------------------+
     !                Имя                   ! Строка со ! 4
     !             контроллера              ! счетчиком !
     +--------------------------------------------------+
     !                                                  ! 8
     +--------------------------------------------------+
     !                                                  ! 12
     +--------------------------------------------------+
     !                                                  ! 16
     +--------------------------------------------------+
     !                         !   Длина   сообщения    ! 20
     +--------------------------------------------------+
     !                                                  !
     .                   Сообщение                      .
     .                     для                          .
     .                  передачи                        .
     !                                                  !
     +--------------------------------------------------+

                            Рис. 16


       Взаимодействие терминала со связанным с  ним  почтовым

  ящиком возможно через стандартные функции макрокоманды $QIO

  и AST прерывания. Следовательно, процесс не должен выдавать

  запросы на чтение для интерактивного терминала, чтобы отве-

  чать на  получение  незапрошенных  данных.  Процесс  должен

  отвечать только тогда, когда почтовый ящик просигнализирует

  о наличии незапрошенных данных.

       Соотношение терминалов и почтовых ящиков не обязатель-

  но один к одному. Один пользовательский процесс может иметь

  много терминалов, связанных с одним почтовым ящиком.









                           - 180 -

                       00152-01 33 03-1


       4.1.5. Автоматическое  регулирование  скорости

              передачи


       Автоматическое регулирование скорости передачи возмож-

  но, когда вводится возврат каретки для  терминала,  который

  не имеет назначенного  канала.  Поддерживаемые  скорости  -

  следующие: 110, 150, 300,  600,  1200,  1800,  2400,  3600,

  4800, 9600 и 19200 бит в секунду. Для этих терминалов  раз-

  решен контроль по четности. Если для  терминала  установлен

  контроль по четности и он работает с семи-битными  данными,

  линия автоматически отключает контроль при регистрации тер-

  минала.



       4.1.6. Нестандартные управляющие символы


       Все 7-битные управляющие символы (от 0  до  1F)  могут

  быть разрешены как нестандартные. Ввод одного из них немед-

  ленно вызовет AST прерывание для  запрашивающего  процесса.

  Диалоговый командный  язык  использует  этот  механизм  для

  определения момента ввода символа УС/T.

       Модификатор функции IO$M_TT_ABORT запрещает  использо-

  вание нестандартных управляющих  символов.  В  этом  случае

  нестандартный управляющий символ вызывает аварийное  завер-

  шение текущей операции  ввода-вывода.  Модификатор  функции

  IO$M_INCLUDE позволяет включать  нестандартные  управляющие

  символы в поток данных.








                           - 181 -

                       00152-01 33 03-1


       4.2. Информация об устройстве


       Процесс  пользователя  может  получить  информацию   о

  характеристиках терминала  с  помощью  программ  системного

  обслуживания $GETDVI, $GETCHN или $GETDEV.

       Рекомендуется, чтобы новые программы использовали  для

  получения информации  об  устройстве  программу  системного

  обслуживания $GETDVI.

       Программы системного обслуживания  $GETCHN  и  $GETDEV

  возвращают информацию о конкретном терминале  в  задаваемый

  пользователем буфер, как показано на рис. 17.

       Первое длинное слово содержит информацию,  независимую

  от устройства. Второе и третье длинные слова содержат  дан-

  ные, зависимые от устройства.

       Независимые от устройства характеристики, возвращаемые

  в первое длинное слово буфера перечислены в табл. 25.


                     Информация о терминале

      31         24 23         16 15          8 7          0
      ------------------------------------------------------
      !              Характеристики  устройства            !
      ------------------------------------------------------
      !  Ширина страницы         !     Тип     !  Класс    !
      ------------------------------------------------------
      !    Длина   !          Характеристики               !
      !  страницы  !            терминала                  !
      ------------------------------------------------------

                            Рис. 17












                           - 182 -

                       00152-01 33 03-1


                                                   Таблица 25

      Независимые от устройства характеристики терминала

  -----------------------------------------------------------

  Характеристика!      Назначение

  -----------------------------------------------------------

  DEV$M_AVL     ! Терминал подключен и свободен

  DEV$M_CCL     ! Управление кареткой

  DEV$M_DET     ! Терминал является отсоединенным

  DEV$M_IDV     ! Терминал готов к вводу

  DEV$M_ODV     ! Терминал готов к выводу

  DEV$M_OPR     ! Терминал доступен как консоль  оператора

  DEV$M_REC     ! Устройство, ориентированное на записи

  DEV$M_RTT     ! Терминал имеет расширение блока управления

                ! устройством удаленного терминала

  DEV$M_SPL     ! Устройство, участвующее в спулинге

  DEV$M_TRM     ! Терминальное устройство

  DEV$M_NET     ! Линия терминала назначена для использования

                ! сетевого программного обеспечения "трал"

                ! (далее по тексту - СПО "трал")


       Характеристики  терминала  определены  в  макрокоманде

  $DEVDEF.

       В первый байт второго слова возвращается характеристи-

  ка класс устройства (DC$_TERM). Во второй байт возвращается

  тип терминала,  например,  DT$_VT100.  Макрокоманда  $DCDEF

  определяет символы для классов и типов терминалов.

       В третий и четвертый байт второго  слова  возвращается

  значение ширины страницы. Ширина страницы может иметь  зна-



                           - 183 -

                       00152-01 33 03-1


  чение в диапазоне от 1 до 511.

       Третье длинное слово содержит характеристики терминала

  (первых три  байта)  и  длину  страницы  (четвертый  байт).

  Характеристики терминала обычно устанавливаются в  процессе

  генерации системы в виде одного  или  комбинации  значений,

  перечисленных в табл. 26. Расширенные характеристики терми-

  нала перечислены в табл. 27. Макрокоманда $TTDEF определяет

  символические имена для характеристик  терминала.  Макроко-

  манда $TT2DEF определяет символические имена для  расширен-

  ных характеристик терминала.  Длина  страницы  может  иметь

  значение в диапазоне от 0 до 255.

       Функции установки режимов  и  установки  характеристик

  (см. п. 4.3.3) и  команда  SET  TERMINAL  используются  для

  изменения характеристик терминалов.

       Для оценки поведения и использования терминала, опера-

  ционная система МОС ВП делит  характеристики  терминала  на

  шесть базовых категорий:

       1) характеристики, влияющие на формат -  эти  характе-

  ристики позволяют пользователю указывать зависимые от  тер-

  минала     требования     форматирования:      TT$M_CRFILL,

  TT$M_EIGHTBIT,   TT$M_LFFILL,   TT$M_MECHTAB,    TT$M_WRAP,

  TT$M_LOWER,   TT$M_MECHFORM,    TT$M_SCOPE,    TT$M_NOECHO,

  TT$M_LOCALECHO;

       2) общие возможности терминала  -  эти  характеристики

  определяют общие возможности терминала, доступные  приклад-

  ным  программам:  TT2$M_ANSICRT,  TT2$M_AVO,   TT2$M_BLOCK,

  TT2$M_DECCRT,   TT2$M_DECCRT2,   TT2$M_DRCS,   TT2$M_REGIS,




                           - 184 -

                       00152-01 33 03-1


  TT2$M_EDIT, TT2$M_PRINTER,  TT2$M_SIXEL.  Их  использование

  позволит выполнять эти программы без знания действительного

  типа терминала. Например, программа может проверить  харак-

  теристику TT2$M_DECCRT вне зависимости от типа терминала;

       3) протокол - эти характеристики управляют протоколом,

  который  использует  терминал:  TT$M_ESCAPE,  TT$M_HALFDUP,

  TT$M_HOSTSYNC, TT2$M_PASTHRU, TT$M_TTSYNC;

       4) системное администрирование -  эти  характеристики,

  обычно  устанавливаемые  при  загрузке  системы,  позволяют

  администратору системы упорядочивать использование термина-

  ла:    TT2$M_ALTYPEAHD,    TT2$M_AUTOBAUD,    TT2$M_DIALUP,

  TT2$M_DISCONNECT,  TT2$M_DMA,   TT2$M_HANGUP,   TT$M_MODEM,

  TT$M_NOTYPEAHEAD,      TT2$M_MODHANGUP,       TT2$M_SECURE,

  TT2$M_SETSPEED, TT2$M_SYSPWD;

       5) смешанные - эти характеристики обеспечивают  интен-

  сивный   программный   контроль   за   работой   терминала:

  TT2$M_BRDCSTMBX, TT$M_MBXDSABL, TT2$M_XON;

       6) выбор режима - эти характеристики позволяют пользо-

  вателю выбрать режимы работы  терминала:  TT2$M_APP_KEYPAD,

  TT2$M_FALLBACK, TT2$M_EDITING, TT2$M_INSERT, TT$M_NOBRDCST.


















                           - 185 -

                       00152-01 33 03-1


                                                   Таблица 26

                   Характеристики терминала

  -----------------------------------------------------------

  Характеристика !          Назначение

  -----------------------------------------------------------

  TT$M_CRFILL    ! Терминал требует заполнения строки после

                 ! ВК (тип заполнения может быть указан  ар-

                 ! гументом P4 функции установки режима)

  TT$M_EIGHTBIT  ! Терминал   использует  8-битовый  набор

                 ! символов кода КОИ-8. Терминалы без этой

                 ! характеристики используют  7-битовый  код

                 ! КОИ-7. В этом случае восьмой бит маскиру-

                 ! ется для принимаемых символов и игнориру-

                 ! ется для выходных символов. Восьмой бит

                 ! имеет смысл только в том случае, если ус-

                 ! тановлена величина TT$M_EIGHTBIT

  TT$M_ESCAPE    ! Терминал игнорирует последовательности AP2

                 ! (подпункт 4.1.1.4). Последовательности AP2

                 ! проверяются на правильность синтаксиса

  TT$M_HALFDUP   ! Терминал находится в полудуплексном режиме

                 ! (подпункт 4.1.2.1). Функции чтения и запи-

                 ! си выполняются последовательно

  TT$M_HOSTSYNC  ! Синхронизация эвм и терминала. УС/Q и УС/S

                 ! используются для управления потоком данных

                 ! и тем самым предотвращают переполнение бу-

                 ! фера ввода с опережением

  TT$M_LFFILL    ! Терминал требует заполнения строки после




                           - 186 -

                       00152-01 33 03-1


                                         Продолжение табл. 26

  -----------------------------------------------------------

  Характеристика !          Назначение

  -----------------------------------------------------------

                 ! ПС (заполнение может быть указано аргумен-

                 ! том P4 функции установки режима)

  TT$M_LOWER     ! Терминал имеет набор символов в нижнем ре-

                 ! гистре. Если терминал не находится в режи-

                 ! ме PASTHRU, или, если не указан модифика-

                 ! тор IO$M_NOFORMAT, все входные и отобража-

                 ! емые символы нижнего регистра (шестнадца-

                 ! теричные от 61 до 7A) преобразуются  в

                 ! верхний регистр, если бит TT$M_LOWER не

                 ! установлен

  TT$M_MBXDSABL  ! Почтовые ящики, связанные с терминалом, не

                 ! должны принимать извещения о незапрошенном

                 ! вводе  или  извещения  о  зависании (п.

                 ! 4.1.3). Этот бит может быть установлен мо-

                 ! дификатором функции IO$M_DSABLMBX для чте-

                 ! ния  и  сброшен  модификатором   функции

                 ! IO$M_ENABLMBX для записи

  TT$M_MECHFORM  ! Терминал имеет механический перевод стра-

                 ! ницы. Драйвер передает переводы страницы

                 ! непосредственно на терминал вместо расши-

                 ! рения их в переводы строки

  TT$M_MECHTAB   ! Терминал имеет механическую табуляцию и

                 ! может расширять табуляцию. Для того, чтобы




                           - 187 -

                       00152-01 33 03-1


                                         Продолжение табл. 26

  -----------------------------------------------------------

  Характеристика !          Назначение

  -----------------------------------------------------------

                 ! осуществить правильную упаковку строки,

                 ! драйвер предполагает, что между табулятор-

                 ! ными остановами имеется 8 пробелов

  TT$M_MODEM     ! Линия терминала связана с модемом. Если

                 ! характеристика TT$M_MODEM установлена,

                 ! драйвер терминала управляет модемом  авто-

                 ! матически. Если характеристика TT$M_MODEM

                 ! не установлена, все сигналы модема игнори-

                 ! руются. Если характеристика TT$M_MODEM ус-

                 ! тановлена, затем сброшена, на линии тер-

                 ! минала об'является зависание, если эта ли-

                 ! ния находится в удаленном режиме (характе-

                 ! ристика TT$M_REMOTE установлена)

  TT$M_NOBRDCST  ! Терминал не будет получать сообщений

  TT$M_NOECHO    ! Входные символы не отображаются на данном

                 ! терминале (подпункт 4.1.1.5)

  TT$M_NOTYPEAHD ! Данные должны быть запрошены операцией

                 ! чтения. Данные теряются, если не был вы-

                 ! дан запрос на чтение, то есть, если они

                 ! являются незапрошенными данными. Запрещает

                 ! возможность вывода на терминал с опереже-

                 ! нием (см. подпункт 4.1.1.5). Если эта ха-

                 ! рактеристика установлена, попытки зарегис-




                           - 188 -

                       00152-01 33 03-1


                                         Продолжение табл. 26

  -----------------------------------------------------------

  Характеристика !          Назначение

  -----------------------------------------------------------

                 ! трироваться обречены на неудачу

  TT$M_READSYNC  ! Синхронизация чтения. Эвм явно запрашивает

                 ! все операции чтения, выдавая УС/Q и завер-

                 ! шает операции, выдавая УС/S

  TT$M_REMOTE    ! Терминал коммутируемый. Терминал возвра-

                 ! щается в локальный режим, когда на линии

                 ! терминала происходит зависание (см. п.

                 ! 4.1.3). Эта характеристика не может быть

                 ! изменена; она является только информацион-

                 ! ной

  TT$M_SCOPE     ! Терминал является экранным дисплеем, на-

                 ! пример, ВТА 2000-17

  TT$M_TTSYNC    ! Синхронизация терминала и ЭВМ. Вывод на

                 ! терминал управляется генерируемыми терми-

                 ! налом  управляющими символами УС/Q и УС/S

  TT$M_WRAP      ! Если курсор уходит за правую границу поля,

                 ! должна быть вставлена новая строка. Если

                 ! характеристика TT$M_WRAP не установлена,

                 ! никакой новой строки не передается. Опера-

                 ! ционная система МОС ВП не поддерживает

                 ! аппаратно-реализованных функций переноса

                 ! на терминале

       Примечание. Префикс может быть TT$M_ или TT$V_.  TT$M_




                           - 189 -

                       00152-01 33 03-1


  - это битовая маска, в которой бит соответствует определен-

  ному полю; TT$V_ - это номер бита.

                                                   Таблица 27

             Расширенные характеристики терминала

  -----------------------------------------------------------

  Характеристика  !             Назначение

  -----------------------------------------------------------

  TT2$M_ALTYPEAHD ! Переменный размер буфера ввода с опереже-

                  ! нием.  Используется тот размер буфера

                  ! ввода с опережением, который указан в

                  ! процедуре SYSGEN (см. подпункт 4.1.1.5).

                  ! следует обратить внимание, что после

                  ! установки характеристики TT2$M_ALTYPEAHD

                  ! не может быть изменена до тех пор, пока

                  ! система не будет перезагружена

  TT2$M_ANSICRT   ! Алфавитно-цифровой дисплей вта 2000 - эта

                  ! характеристика устанавливается командой

                  ! SET TERMINAL.    Характеристика

                  ! TT2$M_ANSICRT - это подмножество харак-

                  ! теристики TT2$M_DECCRT без свойственных

                  ! терминалу    с     характеристикой

                  ! TT2$M_DECCRT последовательностей AP2 (см.

                  ! приложение 2). Терминалы с этой характе-

                  ! ристикой должны обеспечивать воспроизве-

                  ! дение на экране, по крайней мере, 24

                  ! строк по 80 столбцов

  TT2$M_APP_KEYPAD! Сообщает состояние, в которое надо уста-




                           - 190 -

                       00152-01 33 03-1


                                         Продолжение табл. 27

  -----------------------------------------------------------

  Характеристика  !             Назначение

  -----------------------------------------------------------

                  ! новить дополнительную или цифровую клави-

                  ! атуру

  TT2$M_AUTOBAUD  ! Автоматическое определение скорости пере-

                  ! дачи. Скорость устанавливается после

                  ! ввода одного или нескольких возв-

                  ! ратов каретки. Для терминалов устанавли-

                  ! вается  постоянная скорость 9600 бит в

                  ! секунду. Если TT2$M_AUTOBAUD указана,

                  ! постоянная скорость не должна изменяться,

                  ! пока эта характеристика установлена для

                  ! данного терминала

  TT2$M_AVO       ! Экран терминала вмещает 132 символа в

                  ! строке. Терминал имеет возможность управ-

                  ! лять своими полями, делая их мерцающими,

                  ! изменяя яркость или резкость. Данная ха-

                  ! рактеристика устанавливается командой SET

                  ! TERMINAL. В приложении 2 перечислены

                  ! последовательности AP2 для терминалов с

                  ! характеристикой TT2$M_AVO

  TT2$M_BLOCK     ! Возможность блочного режима. Данная ха-

                  ! рактеристика устанавливается командой

                  ! SET TERMINAL. Характеристика TT2$M_BLOCK

                  ! определяет дополнительные последователь-




                           - 191 -

                       00152-01 33 03-1


                                         Продолжение табл. 27

  -----------------------------------------------------------

  Характеристика  !             Назначение

  -----------------------------------------------------------

                  ! ности AP2 (см. приложение 2). Терминалы

                  ! с этой характеристикой обладают способ-

                  ! ностью локального редактирования и пере-

                  ! дачи в блочном режиме. Если терминал ис-

                  ! пользуется для ввода большого количества

                  ! блоков, должна быть указана характерис-

                  ! тика TT2$M_ALTYPEAHD

  TT2$M_BRDCSTMBX ! Передача сообщений через почтовый ящик.

                  ! передаваемые сообщения посылаются в соот-

                  ! ветствующий почтовый ящик, если он су-

                  ! ществует

  TT2$M_DECCRT    ! Алфавитно-цифровой дисплей ВТА 2000-15M.

                  ! данная характеристика устанавливается

                  ! командой SET TERMINAL для всех термина-

                  ! лов, которые совместимы с терминалом ВТА

                  ! 2000-15М. Для терминалов с этой характе-

                  ! ристикой разрешаются дополнительные пос-

                  ! ледовательности AP2

  TT2$M_DECCRT2   ! Алфавитно-цифровой дисплей СМ 7224

  TT2$M_DIALUP    ! (ВТА 2000-17) коммутируемый терминал.

                  ! используется командой LOGINOUT для управ-

                  ! ления блокировкой коммутируемой линии

  TT2$M_DISCONNECT! Позволяет терминалу отсоединиться, когда




                           - 192 -

                       00152-01 33 03-1


                                         Продолжение табл. 27

  -----------------------------------------------------------

  Характеристика  !             Назначение

  -----------------------------------------------------------

                  ! происходит зависание (т.е. при потере

                  ! сигналов  от  модема,  по   команде

                  ! DISCONNECT, по команде CONNECT/CONTINUE

                  ! или при нажатии клавиши <БЛ> (блокировка

                  ! передачи) на терминале, который имеет

                  ! характеристику TT2$M_SECURE)

  TT2$M_DMA       ! Режим прямого доступа к памяти (DMA) для

                  ! асинхронного мультиплексора с прямым дос-

                  ! тупом к памяти. Эта характеристика игно-

                  ! рируется для контроллеров без прямого

                  ! доступа к памяти

  TT2$M_DRCS      ! Терминал поддерживает загружаемые сим-

                  ! вольные наборы. Устанавливается командой

                  ! SET TERMINAL/SOFT_CHARACTERS

  TT2$M_EDIT      ! Редактирование на терминале. Эта характе-

                  ! ристика устанавливается командой SET

                  ! TERMINAL для всех терминалов, которые мо-

                  ! гут выполнять расширенные функции редак-

                  ! тирования. Эти функции включают в себя:

                  ! способность вставлять или стирать строку

                  ! и вставлять или стирать символы в сущест-

                  ! вующей строке. В приложении 2 перечислены

                  ! действительные  последовательности  AP2




                           - 193 -

                       00152-01 33 03-1


                                         Продолжение табл. 27

  -----------------------------------------------------------

  Характеристика  !             Назначение

  -----------------------------------------------------------

                  ! для  терминалов  с  характеристикой

                  ! TT2$M_EDIT

  TT2$M_EDITING   ! Разрешается редактирование вводимых строк

  TT2$M_FALLBACK  ! Вывод преобразуется в 7-битовый код КОИ-7

                  ! на терминалах, которые не поддерживают

                  ! 8-битовый код

  TT2$M_HANGUP    ! Зависание терминала. Линии терминала,

                  ! связанные через модемы, зависают, когда

                  ! происходит удаление процесса, или имеет

                  ! место конец сеанса. Состояние этой  ха-

                  ! рактеристики не может быть изменено, если

                  ! характеристика TT2$M_MODHANGUP не разре-

                  ! шена или если процесс не имеет привилегии

                  ! LOG_IO или PHY_IO

  TT2$M_INSERT    ! Устанавливает режим по умолчанию для

                  ! вставки или замены в начале каждой опера-

                  ! ции чтения

  TT2$M_LOCALECHO ! Локальное эхо. Используется с характерис-

                  ! тикой TT$M_NOECHO. Если обе характеристи-

                  ! ки установлены, отображаются только огра-

                  ! ничители и специальные управляющие симво-

                  ! лы. Использование этого режима ограничи-

                  ! вается операциями чтения командной стро-




                           - 194 -

                       00152-01 33 03-1


                                         Продолжение табл. 27

  -----------------------------------------------------------

  Характеристика  !             Назначение

  -----------------------------------------------------------

                  ! ки. Прикладные программы, которые исполь-

                  ! зуют модификатор функции IR$M_NOECHO не-

                  ! обязательно будут работать, если установ-

                  ! лена характеристика TT2$M_LOCALECHO. Ло-

                  ! кальное эхо не совместимо с редактирова-

                  ! нием строк (TT2$M_EDITING)

  TT2$M_MODHANGUP ! Разрешение модификации. Если данная ха-

                  ! рактеристика указана, характеристика

                  ! TT2$M_HANGUP может быть модифицирована

                  ! без привилегии. В противном случае, тре-

                  ! буется привилегия логического или физи-

                  ! ческого ввода-вывода

  TT2$M_PASTHRU   ! Передача данных без интерпретации; все

                  ! входные и выходные данные имеют 7-битовый

                  ! или 8-битовый двоичный формат (интерпре-

                  ! тация данных не происходит). Завершение

                  ! данных появляется, когда буфер заполнен

                  ! или в данных присутствует ограничитель.

                  ! Если   установлена   характеристика

                  ! TT$M_TTSYN, происходит интерпретация

                  ! УС/S и УС/Q

  TT2$M_PRINTER   ! Экранный терминал с локальным портом АЦПУ

  TT2$M_REGIS     ! Графические средства. Терминал поддержи-




                           - 195 -

                       00152-01 33 03-1


                                         Продолжение табл. 27

  -----------------------------------------------------------

  Характеристика  !             Назначение

  -----------------------------------------------------------

                  ! вает набор инструкций графических средств

  TT2$M_SIXEL     ! Графические средства загружаемого знако-

                  ! генератора. Терминал поддерживает набор

                  ! инструкций графических средств загружае-

                  ! мого знако-генератора

  TT2$M_SECURE    ! Для использования совместно с линиями без

                  ! модемов, без автоматической установки

                  ! скорости передачи данных. Гарантирует,

                  ! что ни один процесс не будет соединен с

                  ! терминалом после нажатия клавиши блоки-

                  ! ровка передачи

  TT2$M_SETSPEED  ! Установка скорости. Для изменения скорос-

                  ! ти терминала требуется привилегия LOG_IO

                  ! или PHY_IO

  TT2$M_SYSPWD    ! Системный пароль. Указывает, что LOGIN

                  ! должен запросить системный пароль, преж-

                  ! де, чем появится запрос имени пользова-

                  ! теля

  TT2$M_XON       ! Управление XON/XOFF.Если функция установ-

                  ! ки режима макрокоманды $QIO выполняется

                  ! на терминале  в состоянии УС/S, и харак-

                  ! теристика TT2$M_XON установлена, вывод

                  ! возобновляется




                           - 196 -

                       00152-01 33 03-1


       Примечание. Префикс  может  быть  TT2$M_  или  TT2$V_.

  TT2$M_ - это битовая маска,  в  которой  бит  соответствует

  определенному полю; TT2$V_ - это номер бита.



       4.3. Коды функций терминала


       Основными функциями  ввода-вывода  терминала  являются

  чтение, запись, установка режима, и считывание режима.  Все

  функции ввода-вывода могут использовать модификаторы  функ-

  ций.



       4.3.1. Чтение



       Когда выдается код функции чтения, буфер,  указываемый

  пользователем, заполняется  символами  из  соответствующего

  терминала.  Операционная  система  МОС  ВП  определяет  три

  основные функции чтения, которые  перечисляются  вместе  со

  своими кодами функций:

       1) IO$_READVBLK - чтение виртуального блока;

       2) IO$_READLBLK - чтение логического блока;

       3) IO$_READPROMPT - чтение с подсказкой.


       Операции чтения заканчиваются, если имеет место  любое

  из следующих условий:

       - буфер пользователя заполнен;

       - принятый символ  содержится  в  маске  ограничителей

         (см. подпункт 4.3.1.2).

       При запросах ввода-вывода коды  функции  чтения  могут




                           - 197 -

                       00152-01 33 03-1


  использовать шесть аргументов (от P1 до P6),  зависящих  от

  типа устройства и функции:

       1) P1 - начальный виртуальный  адрес  буфера,  который

  должен принимать читаемые данные;

       2) P2 - размер буфера, который должен принимать читае-

  мые данные, в байтах.  Параметр  генерации  системы  MAXBUF

  ограничивает максимальный размер буфера;

       3) P3 - чтение с тайм-аутами, счетчик  тайм-аута  (см.

  подпункт 4.3.1.2);

       4) P4 - адрес блока  дескриптора  ограничителя  чтения

  (см. подпункт 4.3.1.2)

       5) P5 - начальный виртуальный адрес буфера  подсказок,

  содержимое которого должно быть выведено на  терминал.  Для

  операций  чтения  с  подсказкой  используется  код  функции

  IO$_READPROMPT. (Данный  аргумент  указывается  в  качестве

  литерального, а не в качестве адреса, как в аргументе P1);

       6) P6 - размер буфера подсказок,  содержимое  которого

  должно быть выведено на терминал.  Для  операций  чтения  с

  подсказкой используется код функции IO$_READPROMPT.  Описа-

  ния аргументов обладают особенностями операции чтения спис-

  ка элементов (см. подпункт 4.3.1.3)

       В операции чтения с подсказкой аргументы P5 и P6  ука-

  зывают адрес и размер буфера строки подсказки,  содержащего

  данные для вывода на терминал до чтения входных  данных.  В

  операции чтения с подсказкой  операция  чтения  и  операция

  записи выполняются на одном и том же  указанном  терминале.

  Формат буфера строки подсказки задается  так  же,  как  для




                           - 198 -

                       00152-01 33 03-1


  любого другого буфера записи, но никакое управление  карет-

  кой не может быть указано неявно. Для функции записи управ-

  ление  кареткой  осуществляется  с  помощью  спецификаторов

  управления кареткой (подпункт 4.3.2.2).

       Во время операции чтения  с  подсказкой  нажатие  УС/O

  останавливает вывод строки подсказки. При нажатии УС/U  или

  УС/X вся строка подсказки снова выводится, и текущая вводи-

  мая информация игнорируется. При нажатии УС/R строка  теку-

  щей подсказки и введенная информация выводятся на терминал.

       В зависимости от типа терминала и информациии,  вводи-

  мой пользователем строка подсказки может быть очень простой

  или очень сложной - от посказки из одной строки до заполне-

  ния экрана, за которым следуют входные данные. Рекомендует-

  ся, чтобы строки подсказок содержали не более одного  веду-

  щего перевода строки.

       В режиме передачи без интерпретации данные,  принимае-

  мые с соответствующего терминала, помещаются в буфер  поль-

  зователя в  виде  двоичной  информации  без  интерпретации.

  (подсказки после передачи не возобновляются).



       4.3.1.1. Коды модификаторов функции для  функций

                чтения макрокоманды $QIO


       С функциями IO$_READVBLK, IO$_READLBLK, IO$_READPROMPT

  может быть указано восемь модификаторов функций. Эти  моди-

  фикаторы функций и модификатор IO$M_EXTEND,  (см.  подпункт

  4.3.1.3) перечислены в табл. 28.





                           - 199 -

                       00152-01 33 03-1


                                                   Таблица 28

         Модификаторы функции чтения макрокоманды $QIO

  -----------------------------------------------------------

  Модификатор    !                     Назначение

  -----------------------------------------------------------

  IO$M_CVTLOW    ! Алфавитные символы нижнего регистра

                 ! (шестнадцатеричные от 61 до 7A) преобра-

                 ! зуются в символы верхнего регистра, когда

                 ! передаются в буфер пользователя или ото-

                 ! бражаются. Модификатор может быть исполь-

                 ! зован только для функций IO$_READLBLK,

                 ! IO$_READVBLK и IO$_READPROMPT

  IO$M_DSABLMBX  ! Почтовый ящик  запрещается для незапраши-

                 ! ваемых данных

  IO$M_ESCAPE    ! Последовательность AP2 распознается как

                 ! ограничитель для операции чтения. Этот

                 ! модификатор перекрывает характеристку

                 ! TT$M_ESCAPE для текущей операции чтения

  IO$M_EXTEND    ! Обеспечивает расширение функций для опера-

                 ! ций чтения (см. подпункт 4.3.1.3). Не сле-

                 ! дует указывать IO$M_EXTEND с другими моди-

                 ! фикаторами функций

  IO$M_NOECHO    ! Символы не отображаются на экране, когда

                 ! они вводятся с клавитуры. Терминал может

                 ! быть также установлен в этот режим  с

                 ! помощью характеристики TT$M_NOECHO в

                 ! команде SET MODE, которая запрещает




                           - 200 -

                       00152-01 33 03-1


                                         Продолжение табл. 28

  -----------------------------------------------------------

  Модификатор    !                     Назначение

  -----------------------------------------------------------

                 ! всякое отображения при операциях чтения

  IO$M_NOFILTR   ! Терминал не интерпретирует символы  УС/U,

                 ! УС/R или ЗБ. Символы передаются в буфер

                 ! пользователя. Модификатор запрещает ре-

                 ! дактирование строк

  IO$M_PURGE     ! Буфер ввода с опережением очищается перед

                 ! тем, как начинается операция чтения

  IO$M_TIMED     ! Аргумент P3 указывает максимальное время

                 ! (в секундах), которое может пройти между

                 ! приемом символов с терминала, т.е.

                 ! величина тайм-аута для данной операции.

                 ! Поскольку синхронизация драйвера работает

                 ! с 1-секундным таймером, то для гарантиро-

                 ! вания 1-секундного ожидания, необходимо

                 ! задать 2-секундный тайм-аут). Таймер за-

                 ! пускается в момент отображения подсказки.

                 ! если чтение не завершается в пределах ука-

                 ! занного   времени,  ошибка  по  тайм-ауту

                 ! (SS$_TIMEOUT) возвращается в блок состоя-

                 ! ния ввода-вывода для операции чтения. Все

                 ! входные символы, принятые перед истечением

                 ! тайм-аута чтения возвращаются в буфер

                 ! пользователя. Чтение с тайм-аутом, при ко-




                           - 201 -

                       00152-01 33 03-1


                                         Продолжение табл. 28

  -----------------------------------------------------------

  Модификатор    !                     Назначение

  -----------------------------------------------------------

                 ! тором величина тайм-аута равна нулю, пере-

                 ! писывает содержимое буфера ввода с опере-

                 ! жением в буфер пользователя до тех пор,

                 ! пока не будет выполнено соответствующее

                 ! условие завершения (буфер заполнен, обна-

                 ! ружен ограничитель или буфер ввода с опе-

                 ! режением пуст). Затем операция чтения

                 ! возвращает количество прочитанных символов

                 ! и, если считан ограничитель, код заверше-

                 ! ния SS$_NORMAL. Если ограничитель не счи-

                 ! тан, то возвращается код SS$_TIMEOUT. В

                 ! любом случае смещение для ограничителя в

                 ! блоке состояния ввода-вывода всегда указы-

                 ! вает количество прочитанных символов. Если

                 ! операция чтения прерывается либо записью



                 ! сообщения, либо синхронной записью, работа

                 ! таймера перезапускается

  IO$M_TRMNOECHO ! Ограничитель не отображается на экране



       4.3.1.2. Ограничители функции чтения


       Аргумент P4 для функции чтения макрокоманды $QIO  либо

  определяет набор ограничителей  для  функции  чтения,  либо



                           - 202 -

                       00152-01 33 03-1


  указывает  ячейку,  содержащую  набор  ограничителей.  Если

  аргумент P4 равен нулю, все символы с кодом в диапазоне  от

  0 до 31 (в шестнадцатеричном коде от 0 до 1F), за  исключе-

  нием ПС, ВТ, ПФ, ГТ и ВШ, являются ограничителями (см. при-

  ложение 2). Это  стандартный  набор  ограничителей  системы

  СУД-32 операционной системы МОС ВП. Если разрешено редакти-

  рование  строк,  операцию  чтения  могут  завершить  только

  управляющие символы вк, УС/Z или последовательность AP2.

       Если аргумент P4 не  равен  нулю,  он  содержит  адрес

  квадрослова, которое либо указывает битовую маску ограничи-

  телей, либо указывает ячейку, содержащую эту маску. Если P4

  - адрес, то адресу должен предшествовать знак #,  например,

  P4=#TMASK. Квадрослово имеет короткую и длинную форму,  как

  показано на рис. 18. В короткой форме имеется  соответствие

  между номером бита и  двоичным  значением  символа;  символ

  является ограничителем, если бит установлен. Например, если

  установлен бит 9, ограничителем является ГТ. Если символ не

  указан, он не является ограничителем. Поскольку управляющие

  символы кода КОИ-8 лежат в диапазоне от 0 до  31,  в  боль-

  шинстве случаев может быть использована короткая форма.

       Длинная  форма  дает  возможность  использовать  более

  обширный набор символов. Допустимой является  любая  маска,

  длиной один байт или более. Например,  размер  маски  в  16

  байтов позволяет использовать в качестве ограничителей  все

  7-битовые символы кода КОИ-8; размер маски в 32 байта  поз-

  воляет использовать в качестве ограничителей все  8-битовые

  символы для 8-битовых терминалов.




                           - 203 -

                       00152-01 33 03-1


       Если маска ограничителя состоит  из  одних  нулей,  то

  ограничители не указаны. Операция чтения заканчивается пос-

  ле того, как указанное количество  байтов,  т.е.  символов,

  будет передано во входной буфер.

       Некоторые управляющие клавиши не действуют в  качестве

  ограничителей, если не указан модификатор IO$M_NOFILTR  или

  терминал имеет характеристику  TT$M_PASSALL  (см.  подпункт

  4.1.1.2).



                  Короткая и длинная форма квадрослова
                         маски ограничителей

             31                                             0
            +-----------------------------------------------+
  Короткая: !                      0                        !
            +-----------------------------------------------+
            !         Битовая маска ограничителей           !
            +-----------------------------------------------+


            31                   16 15                      0
            +-----------------------------------------------+
  Длинная:  !    (Не используется) ! Размер маски в байтах  !
            +-----------------------------------------------+
            !                  Адрес маски                  !
            +-----------------------------------------------+

                            Рис. 18


       4.3.1.3. Чтение со списком элементов


       Операции чтения со списком элементов являются расшире-

  нием функций запроса чтения. Операционная  система  МОС  ВП

  обеспечивает следующую комбинацию кода и модификатора функ-

  ции:


       IO$READVBLK!IO$M_EXTEND -  чтение  виртуального  блока

  списка элементов.



                           - 204 -

                       00152-01 33 03-1


       В запросе на чтение со списком элементов не могут быть

  указаны никакие другие модификаторы функции.

       Комбинация модификатора и кода функции чтения со спис-

  ком элементов использует следующие аргументы:

       1) P1 - начальный виртуальный адрес буфера приема;

       2) р2 - размер буфера приема в байтах;

       3) P3 - режим доступа, с которым список элементов дол-

  жен быть проверен (необязательный аргумент);

       4) P4 - игнорируется;

       5) P5 - адрес  списка  элементов.  Формат  дескриптора

  элемента показан на рис. 19;

       6) P6 длина списка элементов в байтах.


    Дескриптор элемента функции чтения со списком элементов

      31                     16 15                      0
      +-------------------------------------------------+
      !      Код элемента      !      Длина буфера      !
      +-------------------------------------------------+
      !    Адрес буфера или непосредственные данные     !
      !-------------------------------------------------+
      !        Адрес возврата (должен быть нулевым)     !
      +-------------------------------------------------+

                            Рис. 19


       Коды элементов, которые могут быть  указаны  в  первом

  длинном слове дескриптора элемента функции чтения со  спис-

  ком элементов перечислены в табл. 29.













                           - 205 -

                       00152-01 33 03-1


                                                   Таблица 29

          Коды элементов для чтения списка элементов

  -----------------------------------------------------------

     Элемент     !         Бит       !    Назначение

  -----------------------------------------------------------

  TRM$_MODIFIERS !                   ! Модификаторы чтения.

                 !                   ! Длинное слово данных

                 !                   ! содержит 32-битовую

                 !                   ! величину, которая ука-

                 !                   ! зывает модификаторы

                 !                   ! чтения, определенные

                 !                   ! в     макрокоманде

                 !                   ! $TRMDEF. Слово длины

                 !                   ! буфера должно быть

                 !                   ! равно нулю. Модифика-

                 !                   ! торы указываются бита-

                 !                   ! ми

                 ! TRM$M_TM_CVTLOW   ! Алфавитные символы

                 !                   ! нижнего   регистра

                 !                   ! (шестнадцатеричные с

                 !                   ! 61 до 7A) преобразуют-

                 !                   ! ся в символы верхнего

                 !                   ! регистра при передаче

                 !                   ! в пользовательский бу-

                 !                   ! фер или при отображе-

                 !                   ! нии

                 ! TRM$M_TM_DSABLMBX ! Почтовый ящик не дос-




                           - 206 -

                       00152-01 33 03-1


                                         Продолжение табл. 29

  -----------------------------------------------------------

     Элемент     !         Бит       !    Назначение

  -----------------------------------------------------------

                 !                   ! тупен для незапрошен-

                 !                   ! ных данных

                 ! TRM$M_TM_NOECHO   ! Символы не отображают-

                 !                   ! ся при вводе с клавиа-

                 !                   ! туры

                 ! TRM$M_TM_NOFILTR  ! Терминал не интерпре-

                 !                   ! тирует символы ЗБ,

                 !                   ! УС/U, УС/R. Они пере-

                 !                   ! даются в буфер пользо-

                 !                   ! вателя. Явно запрещено

                 !                   ! редактирование строк

                 ! TRM$M_TM_ESCAPE   ! Последовательность AP2

                 !                   ! распознается как огра-

                 !                   ! ничитель чтения

                 ! TRM$M_TM_PURGE    ! Буфер ввода с опереже-

                 !                   ! нием очищается перед

                 !                   ! началом операции чте-

                 !                   ! ния

                 ! TRM$M_TM_TIMED    ! TRM$_TIMEOUT указывает

                 !                   ! максимальное время

                 !                   ! время (в секундах),

                 !                   ! которое может пройти

                 !                   ! между приемом символов




                           - 207 -

                       00152-01 33 03-1


                                         Продолжение табл. 29

  -----------------------------------------------------------

     Элемент     !         Бит       !    Назначение

  -----------------------------------------------------------

                 !                   ! с терминала; т.е. ве-

                 !                   ! личину тайм-аута для

                 !                   ! операции. Считается,

                 !                   ! что TRM$M_TM_TIMED ус-

                 !                   ! тановлен,    если

                 !                   ! TRM$_TIM включен в

                 !                   ! список элементов

                 ! TRM$M_TM_TRMNOECHO! Ограничитель не ото-

                 !                   ! бражается. Не сущест-

                 !                   ! вует никакого формаль-

                 !                   ! ного ограничителя, ес-

                 !                   ! ли  буфер  заполнен

                 !                   ! прежде, чем введен ог-

                 !                   ! раничитель

                 ! TRM$M_TM_NOEDIT   ! Ограничитель запрещает

                 !                   ! расширенные возможнос-

                 !                   ! ти редактирования для

                 !                   ! этой операции чтения

                 ! TRM$M_TM_NORECALL ! Запрещает повторный

                 !                   ! вызов команды (УС/B)

                 !                   ! терминальным драйвером

                 ! TRM$M_TM_R_JUST   ! Поле,   выравненное

                 !                   ! справа (только в режи-




                           - 208 -

                       00152-01 33 03-1


                                         Продолжение табл. 29

  -----------------------------------------------------------

     Элемент     !         Бит       !    Назначение

  -----------------------------------------------------------

                 !                   ! ме TRM$K_EM_RDVERIFY)

                 ! TRM$M_TM_AUTO_TAB ! Поле режима с авто-

                 !                   ! табуляцией (только

                 !                   ! в  режиме

                 !                   ! TRM$K_EM_RDVERIFY)

  TRM$_EDITMODE  !                   ! Режимы расширенного

                 !                   ! редактирования. Длин-

                 !                   ! ное слово данных ука-

                 !                   ! зывает значения режима

                 !                   ! расширенного редакти-

                 !                   ! рования. Слово длины

                 !                   ! буфера должно быть

                 !                   ! равно нулю. Режим рас-

                 !                   ! ширенного редактирова-

                 !                   ! ния зависит от того,

                 !                   ! какой бит установлен

                 ! TRM$K_EM_DEFAULT  ! Обычный режим чтения.

                 !                   ! Это значение устанав-

                 !                   ! ливается по умолчанию,

                 !                   ! если в списке нет

                 !                   ! элемента   нет

                 !                   ! TRM$_EDITMODE

                 ! TRM$K_EM_RDVERIFY ! Чтение с проверкой




                           - 209 -

                       00152-01 33 03-1


                                         Продолжение табл. 29

  -----------------------------------------------------------

     Элемент     !         Бит       !    Назначение

  -----------------------------------------------------------

                 !                   ! символов. (см. под-

                 !                   ! пункт 4.3.1.4)

  TRM$_TIMEOUT   !                   ! Тайм-аут чтения. Длин-

                 !                   ! ное слово непосредст-

                 !                   ! венных данных указыва-

                 !                   ! ет максимальное время

                 !                   ! (в секундах) для опе-

                 !                   ! рации чтения. Элемент

                 !                   ! TRM$_TIMEOUT автомати-

                 !                   ! чески устанавливает

                 !                   ! бит TRM$M_TM_TIMED.

                 !                   ! Так как синхронизация

                 !                   ! драйвера работает с

                 !                   ! 1-секундным таймером,

                 !                   ! для гарантирования

                 !                   ! 1-секундного ожидания

                 !                   ! должен  быть   указан

                 !                   ! 2-секундный тайм-аут

  TRM$_TERM      !                   ! Слово длины буфера оп-

                 !                   ! ределяет формат маски

                 !                   ! ограничителя  не   по

                 !                   ! умолчанию. Если слово

                 !                   ! длины буфера - 0,  то




                           - 210 -     

                       00152-01 33 03-1


                                         Продолжение табл. 29

  -----------------------------------------------------------

     Элемент     !         Бит       !    Назначение

  -----------------------------------------------------------

                 !                   ! длинное слово данных

                 !                   ! используется как маска

                 !                   ! короткой формы. Если

                 !                   ! слово длины буфера не

                 !                   ! 0, по адресу данных

                 !                   ! находится  маска дли-

                 !                   ! ной N байт

  TRM$_PROMPT    !                   ! Указывает строку под-

                 !                   ! сказки. Слово длины

                 !                   ! буфера содержит длину

                 !                   ! подсказки. Слово адре-

                 !                   ! са данных содержит ад-

                 !                   ! рес строки подсказки

  TRM$_INISTRNG  !                   ! Указывает строку пред-

                 !                   ! варительной загрузки в

                 !                   ! буфер чтения (P1).

                 !                   ! Слово длины буфера со-

                 !                   ! держит длину строки.

                 !                   ! Длинное слово данных

                 !                   ! содержит адрес строки.

                 !                   ! Элемент TRM$_INISTRNG

                 !                   ! должен быть указан,

                 !                   ! если      режим




                           - 211 -

                       00152-01 33 03-1


                                         Продолжение табл. 29

  -----------------------------------------------------------

     Элемент     !         Бит       !    Назначение

  -----------------------------------------------------------

                 !                   ! редактирования -

                 !                   ! TRM$K_EM_RDVERIFY, и

                 !                   ! должен быть той же

                 !                   ! длины, которая указа-

                 !                   ! на   в    элементе

                 !                   ! TRM$_PICSTRNG

  TRM$_INIOFFSET !                   ! Указывает символ в на-

                 !                   ! чальной строке, с ко-

                 !                   ! торого начинается эхо-

                 !                   ! отображение. Длинное

                 !                   ! слово данных указывает

                 !                   ! символ

  TRM$_PICSTRNG  !                   ! Строка символов про-

                 !                   ! верки (только в режиме

                 !                   ! TRM$K_ем_RDVERIFY).

                 !                   ! Слово длины буфера со-

                 !                   ! держит длину строки,

                 !                   ! которая должна совпа-

                 !                   ! дать с длиной указан-

                 !                   ! ной  в  элементе

                 !                   ! TRM$_INISTRNG. Слово

                 !                   ! адреса данных содержит

                 !                   ! адрес строки. Элемент




                           - 212 -

                       00152-01 33 03-1


                                         Продолжение табл. 29

  -----------------------------------------------------------

     Элемент     !         Бит       !    Назначение

  -----------------------------------------------------------

                 !                   ! TRM$_PICSTRNG должен

                 !                   ! быть указан, если ре-

                 !                   ! жим редактирования -

                 !                   ! TRM$K_EM_RDVERIFY.

                 !                   ! Формат строки с симво-

                 !                   ! лами проверки - один

                 !                   ! байт на один входной

                 !                   ! символ.  Каждый  байт

                 !                   ! является битовой мас-

                 !                   ! кой. Если не установ-

                 !                   ! лен ни один бит, ис-

                 !                   ! пользуется соответст-

                 !                   ! вующий символ, указан-

                 !                   ! ный    в  элементе

                 !                   ! TRM$_INISTRNG

                 ! TRM$M_CV_UPPER    ! Алфавитный, верхний

                 !                   ! регистр

                 ! TRM$M_CV_LOWER    ! Алфавитный, нижний ре-

                 !                   ! гистр

                 ! TRM$M_CV_NUMERIC  ! Числовой (0-9)

                 ! TRM$M_CV_NUMPUNC  ! Числовая пунктуация

                 !                   ! (+-.)

                 ! TRM$M_CV_PRINTABLE! Печатный символ кода




                           - 213 -

                       00152-01 33 03-1


                                         Продолжение табл. 29

  -----------------------------------------------------------

     Элемент     !         Бит       !    Назначение

  -----------------------------------------------------------

                 !                   ! КОИ-8

                 ! TRM$M_CV_ANY      ! Любой символ

  TRM$_FILLCHR   !                   ! 2-байтовая величина,

                 !                   ! указывающая  символы

                 !                   ! заполнения и очистки

                 !                   ! для     режима

                 !                   ! TRM$K_EM_RDVERIFY.

                 !                   ! первый байт длинного

                 !                   ! слова данных указывает

                 !                   ! символ очистки; второй

                 !                   ! байт указывает символ

                 !                   ! заполнения

  TRM$_ALTECHCHR !                   ! Альтернативная строка

                 !                   ! (только   в   режиме

                 !                   ! TRM$K_EM_RDVERIFY).

                 !                   ! Слово длины буфера со-

                 !                   ! держит длину строки.

                 !                   ! Слово адреса данных

                 !                   ! содержит адрес строки

                 !                   ! альтернативная строка

                 !                   ! выводится на терминал

                 !                   ! после ввода первого

                 !                   ! действительного сим-




                           - 214 -

                       00152-01 33 03-1


                                         Продолжение табл. 29

  -----------------------------------------------------------

     Элемент     !         Бит       !    Назначение

  -----------------------------------------------------------

                 !                   ! вола


       Один и тот же код  элемента  не  может  повторяться  в

  списке элементов.



       4.3.1.4. Чтение с проверкой


       При  использовании  чтения  с  проверкой  терминальный

  драйвер выполняет проверку ввода, основанную на  символьных

  атрибутах. Проверка выполняется посимвольно во время  ввода

  данных. Недействительные символы не отображаются и их  ввод

  приводит  к  завершению  операций  чтения.  Соответствующую

  обработку ошибки должна выполнить прикладная программа.

       Начальная строка описывает начало входного  поля.  Эта

  строка может содержать данные и символы  управления  курсо-

  ром. Символ очистки выводится на экран по каждому появлению

  символа заполнения в буфере начальной строки.

       Строка символов проверки - это строка байтов, где каж-

  дый байт соответствует одному символу вводимого поля.  Каж-

  дый байт определяет маску действительных символов для  этой

  позиции. Если байт  имеет  нулевое  значение,  эта  позиция

  является позицией символа управления курсором, и символ  из

  начальной строки отображается в этой позиции.

       Для полей, выравненных  слева,  сначала  выводится  на




                           - 215 -

                       00152-01 33 03-1


  терминал подсказка, после чего следует  произвольное  число

  символов  начальной  строки.  Символы  управления  курсором

  всегда выводятся вслед за подсказкой, устанавливая курсор в

  крайней левой позиции. При вводе каждого символа он  прове-

  ряется и затем отображается, при этом позиция курсора прод-

  вигается вперед. Встречаемые дополнительные символы  управ-

  ления курсором при их появлении пропускаются. Если проверка

  входного символа завершается ошибкой, чтение завершается по

  недействительному символу как по ограничителю.

       Для полей, выравненных  справа,  выводится  подсказка,

  вслед за ней начальная строка.  (В  общем  случае  величина

  TRM$_INIOFFSET устанавливается равной  длине  TRM$_INISTRNG

  для полей, выравненных справа). Позиция курсора остается на

  одну  позицию  правее  начальной  строки.  Для  нормального

  выполнения операций  поля,  выравненные  справа,  не  могут

  иметь смешанных определений. После  ввода  каждого  символа

  выводятся полностью подсказка и входные поля.  Таким  обра-

  зом, подсказка должна включать  в  себя  последовательность

  AP2, позиционирующую курсор.

       Определение полного поля различно для полей, выравнен-

  ных справа и слева. Для полей, выравненных слева, поле вид-

  но, когда введен последний символ. Для  полей,  выравненных

  справа, полное поле видно, когда символ, отличный от симво-

  ла заполнения, сдвигается в самую левую позицию поля.

       Если  модификатор   TRM$M_TM_AUTO_TAB   установлен   в

  TRM$_MODIFIERS, заполнение поля завершает операцию  чтения.

  В случае автотабуляционного завершения символ  ограничителя




                           - 216 -

                       00152-01 33 03-1


  в блоке состояния ввода-вывода - 'пусто'. В противном  слу-

  чае, завершение произойдет, когда в  полное  поле  вводится

  еще один символ. Прикладные программы могут обнаружить  это

  условие, когда индекс  завершающего  символа  указывает  за

  пределы  поля.  Дополнительный  символ  воспринимается  как

  ограничитель. В поле, выравненном  слева,  индекс  в  блоке

  состояния ввода-вывода для ограничителя имеет нулевую базу;

  в поле, выравненном справа, этот индекс базируется на  еди-

  нице.

       Если функция чтения с проверкой прерывается  операцией

  асинхронной записи, то чтение  с  проверкой  завершается  с

  кодом состояния SS$_OPINCOMPL. Для чтения  с  проверкой  не

  поддерживается строчное редактирование, за исключением сим-

  вола удаление.



       4.3.2. Запись


       Операции записи воспроизводят на экране  соответствую-

  щего терминала содержимое буфера, указываемого  пользовате-

  лем. Операционная система МОС ВП  определяет  три  основные

  функции записи,  которые  перечисляются  вместе  со  своими

  кодами функций:


       1) IO$_WRITEVBLK - запись виртуального блока;

       2) IO$_WRITELBLK - запись логического блока;

       3) IO$_WRITEPBLK - запись физического блока.


       Коды функции записи могут использовать следующие аргу-

  менты, зависящие от типа устройства и функции:



                           - 217 -

                       00152-01 33 03-1


       1) P1 - начальный виртуальный адрес буфера, содержимое

  которого должно быть выведено на терминал;

       2) P2 - количество байт, которые должны быть  выведены

  на терминал;

       3) P3 - игнорируется1;

       4) P4 - спецификатор управления кареткой, за  исключе-

  нием записи физического  блока.  (Управление  кареткой  для

  функции записи описано в подпункте 4.3.2.2).

       Аргументы P3, P5 и P6 для операций вывода на  терминал

  не имеют смысла.

       В операциях записи виртуального блока и  записи  логи-

  ческого блока формат буфера (P1 и P2) задается для  выбран-

  ного терминала и включает информацию  управления  кареткой,

  указываемую аргументом P4.

       Если  не  указана  характеристика  TT$M_MECHFORM,  для

  перевода формата генерируется определенное количество пере-

  водов  строки.  Количество  генерируемых  переводов  строки

  зависит от положения страницы в данный момент и длины стра-

  ницы. Выполняя возврат каретки  после  последнего  перевода

  строки, перевод формата передвигает курсор на левую границу

  поля. Для табуляции  генерируется  определенное  количество

  пробелов, если характеристики выбранного терминала не вклю-

  чают TT$M_MECHTAB (это  не  относится  к  операциям  записи

  физического блока). Позиции табуляции  располагаются  через

  каждые 8 позиций (то есть 8,16,24,32,...).








                           - 218 -

                       00152-01 33 03-1


       4.3.2.1. Коды модификаторов функций для  функции

                записи макрокоманды $QIO


       С  функциями  записи  IO$_WRITELBLK,  IO$_WRITEVBLK  и

  IO$_WRITEPBLK можно указать пять модификаторов функций. Эти

  модификаторы функций перечисляются в табл. 30.

                                                   Таблица 30

         Модификаторы функции записи макрокоманды $QIO

  -----------------------------------------------------------

  Модификатор    !            Назначение

  -----------------------------------------------------------

  IO$M_BREAKTHRU ! Позволяет прерывать чтение независимо

                 ! от текущего состояния

  IO$M_CANCTRLO  ! Выключает УС/O (если она уже действует)

                 ! перед записью. В противном случае, дан-

                 ! ные не могут быть воспроизведены на экране

  IO$M_ENABLMBX  ! Разрешает использование почтового ящика,

                 ! связанного с терминалом, для извещения о

                 ! том, что имеются незапрошенные данные

  IO$M_NOFORMAT  ! Дает возможность пользователям задавать

                 ! функцию записи без интерпретации или фор-

                 ! матирования; фактически линия терминала

                 ! временно переключается в режим PASSALL

  IO$M_REFRESH   ! Если операция чтения прерывается записью

                 ! то на экране воспроизводятся текущие дан-

                 ! ные чтения, когда чтение возобновляется


       Любое прерывание, вызванное выполнением программ  сис-




                           - 219 -

                       00152-01 33 03-1


  темного обслуживания,  передающих  сообщения  ($BRDCST  или

  $BRKTHRU) на терминалы считается прерыванием записи.



       4.3.2.2. Управление кареткой для функций записи


       Аргумент P4 - это длинное слово,  в  котором  задаются

  характеристики управления кареткой. Характеристики управле-

  ния кареткой определяют следующую позицию курсора на терми-

  нале. В операции записи физического блока аргумент P4 игно-

  рируется. Формат длинного слова  аргумента  P4  показан  на

  рис. 20.


            Спецификатор управления кареткой

                     (Аргумент P4)

             3              2             1              0
      +----------------------------------------------------+
  P4: !  Постфикс   !  Префикс     !  Не исполь- ! Фортран !
      !             !              !  зуется     !         !
      +----------------------------------------------------+

                            Рис. 20


       В длинном слове используются только байты 0,  2  и  3.

  Байт 1 игнорируется. Если младший байт (байт  0)  не  равен

  нулю, содержимое длинного слова интерпретируется как специ-

  фикатор управления кареткой в программах на языке  програм-

  мирования фортран. Возможные значения байта 0 (в шестнадца-

  теричном виде) и интерпретация этих значений перечислены  в

  табл. 31.








                             
                           - 220 -

                       00152-01 33 03-1


                                                   Таблица 31

            Управление кареткой для функций записи

                    (Байт 0 не равен нулю)

  -----------------------------------------------------------

  Шестнадца-  ! Символ !

  теричное    ! кода   !        Назначение

  значение    ! КОИ-8  !

  байта 0     !        !

  -----------------------------------------------------------

      20      !(Пробел)! Управление кареткой с одним перево-

              !        ! дом строки. (последовательность: пе-

              !        ! реход к новой строке, т.е. возврат

              !        ! каретки и перевод строки, вывод со-

              !        ! держимого буфера, возврат каретки)

      30      !    0   ! Управление кареткой с двумя перево-

              !        ! дами строки. (Последовательность:

              !        ! переход к новой строке, переход к

              !        ! новой строке, вывод содержимого бу-

              !        ! фера, возврат каретки)

      31      !    1   ! Управление кареткой с пропуском

              !        ! страницы. (Последовательность: пере-

              !        ! вод формата, вывод содержимого буфе-

              !        ! ра, возврат каретки)

      2B      !   +    ! Управление кареткой для печати по

              !        ! уже напечатанному. (Последователь-

              !        ! ность: вывод содержимого буфера,

              !        ! возврат каретки) дает возможность




                           - 221 -

                       00152-01 33 03-1


                                         Продолжение табл. 31

  -----------------------------------------------------------

  Шестнадца-  ! Символ !

  теричное    ! кода   !        Назначение
                 
  значение    ! КОИ-8  !

  байта 0     !        !

  -----------------------------------------------------------

              !        ! печатать дважды на строке для выде-

              !        ! ления напечатанного или для получе-

              !        ! ния особых эффектов

      24      !   $    ! Управление кареткой для работы с

              !        ! подсказками. (Последовательность:

              !        ! переход к новой строке, вывод содер-

              !        ! жимого буфера)

  Все осталь- !        ! ТО же самое, что и символ пробела в

  ные величины!        ! в коде КОИ-8: управление кареткой с

              !        ! одним переводом строки


       Если младший байт (байт 0) равен нулю, то байты 2 и  3

  длинного слова P4 интерпретируются как  спецификаторы  пре-

  фиксного и постфиксного управления кареткой. Префикс  (байт

  2) определяет управление кареткой до  того,  как  выводится

  содержимое буфера. Постфикс (байт 3) определяет  управление

  кареткой после того, как содержимое буфера будет выведено.

       Префиксный и постфиксный байты используют одну и ту же

  схему кодирования. Эта схема кодирования в  шестнадцатерич-

  ном виде показана на рис. 21.





                           - 222 -

                       00152-01 33 03-1


  Управление кареткой для функций записи (байт 0 = 0)

      префиксный байт (байт 2)

      7     6                        0
  +-----------------------------------+  Характеристики уп-
  !   0   !          0                !  равления кареткой не
  +-----------------------------------+  заданы


      7     6                       0
  +-----------------------------------+  Биты с 0 по 6 - это
  !   0   !       1 - 7F              !  количество новых ст-
  +-----------------------------------+  рок, состоящих из
                                         возврата каретки за
                                         которым следует пе-
                                         ревод строки

      Постфиксный байт (байт 3)

     7     6     5     4            0
  +----------------------------------+  Вывод одного управля-
  !  1  !  0  !  0  !     1-1F       !  ющего символа в коде
  +----------------------------------+  КОИ-8, указываемого
                                        конфигурацией битов
                                        с 0 по 4


     7     6     5     4            0
  +----------------------------------+  Вывод одного управля-
  !  1  !  1  !  0  !     1-1F       !  ющего символа в коде
  +----------------------------------+  КОИ-8, указываемого
                                        конфигурацией битов
                                        с 0 по 4, которые
                                        транслируются как
                                        символы кода КОИ-8 со
                                        128 по 159

                            Рис. 21


       Префиксное и постфиксное кодирование,  которое  форми-

  рует функции управления кареткой показано на рис. 22.













                           - 223 -

                       00152-01 33 03-1



          Управление кареткой для функции записи

          (Префиксное и постфиксное кодирование)

       +--------------------------------+ Последовательность:
  Р4:  !  8D   !   1   !   -   !    0   ! ПС - вывод - ВК
       +--------------------------------+

       +--------------------------------+ Последовательность:
  Р4:  !  8D   !   2   !   -   !    0   ! ПС, ПС -вывод - ВК
       +--------------------------------+

       +--------------------------------+ Последовательность:
  Р4:  !  8D   !  8с   !   -   !    0   ! ПФ - вывод - ВК
       +--------------------------------+

       +--------------------------------+ Последовательность:
  Р4:  !  8D   !   0   !   -   !    0   !    вывод - ВК
       +--------------------------------+

       +--------------------------------+ Последовательность:
  Р4:  !   0   !   1   !   -   !    0   !    ПС - вывод
       +--------------------------------+

       +--------------------------------+ Последовательность:
  Р4:  !  8D   !  18   !   -   !    0   ! 24ПС - вывод - ВК
       +--------------------------------+

                            Рис. 22


       В  примере   префиксно-постфиксное   шестнадцатеричное

  кодирование для управления кареткой с одним переводом стро-

  ки (новая строка, вывод содержимого буфера, возврат  карет-

  ки) получается путем помещения величины 1 во  второй  (пре-

  фиксный) байт, а суммы значения бита 7(80) и значения  кода

  возврата каретки (D) - в третий постфиксный байт.


        Пример.

          80 (бит 7 = 1)

          +D (возврат каретки)

          --------------------

          8D (постфикс = возврат)



                           - 224 -

                       00152-01 33 03-1


       4.3.3. Установка режима


       Операции установки режима изменяют функционирование  и

  характеристики соответствующей линии терминала.  Операцион-

  ная система МОС ВП определяет два  типа  функций  установки

  режима:

       1) установка режима;

       2) установка характеристик.

       Функция установки режима определяет  режим  и  текущие

  характеристики соответствующей линии  терминала.  Установка

  режима является функцией логического ввода-вывода и не тре-

  бует никаких привилегий. Предусмотрен только один код функ-

  ции: IO$_SETMODE.

       Установка характеристик определяет постоянные характе-

  ристики соответствующей линии терминала. Установка характе-

  ристик является функцией физического ввода-вывода и требует

  привилегию,   необходимую   для   выполнения    физического

  ввода-вывода.  Предусмотрен  только   один   код   функции:

  IO$_SETCHAR.

       Данные функции используют следующие аргументы, завися-

  щие от устройства и функции, если  не  указываются  никакие

  модификаторы функций:

       1) P1 - адрес буфера характеристик;

       2) P2 - длина буфера характеристик (длина по умолчанию

  равна 8 байтам);

       3) P3 - спецификатор скорости (биты с 0 по 7 - переда-

  ча; с 8 по 15 - прием);





                           - 225 -

                       00152-01 33 03-1


       4) P4 - спецификатор заполнения (биты 0-7 - количество

  заполнений вк; биты 8-15 = количество заполнений ПС);

       5) P5 - флаги контроля по четности.

       Аргумент P1 определяет адрес буфера переменной  длины,

  показанного на рис. 23. За исключением характеристик терми-

  нала, содержимое блока одинаково как для функции  установки

  режима, так и для функции установки характеристик.


      Буфер характеристик для функции установки режима


    31         24 23     16 15         8 7          0
    +------------------------------------------------+
    !    Ширина страницы   !   Тип      !    Класс   !
    +------------------------------------------------+
    !            !                                   !
    !    Длина   ! Основные характеристики терминала !
    !   страницы !                                   !
    +------------------------------------------------+

                  P2=8 (по умолчанию)


    31         24 23     16 15         8 7          0
    +------------------------------------------------+
    !    Ширина страницы   !   Тип      !    Класс   !
    +------------------------------------------------+
    !            !                                   !
    !    Длина   ! Основные характеристики терминала !
    !   страницы !                                   !
    +------------------------------------------------+
    !                                                !
    !    Расширенные  характеристики  терминала      !
    +------------------------------------------------+

                     P2=12

                            Рис. 23


       Часть буфера, описывающая класс  устройства,  содержит

  DC$_TERM, который определяется  макрокомандой  $DCDEF.  Тип

  определяется  макрокомандой  $DCDEF,  например,   DT$_LA36.

  Ширина страницы может иметь значение в диапазоне  от  1  до



                           - 226 -

                       00152-01 33 03-1


  511. Длина страницы может иметь значение в диапазоне  от  0

  до 255. Значения для характеристик терминала  перечисляются

  в табл. 26. Расширенные характеристики  терминала  перечис-

  ляются в табл. 27. Значения характеристик определяются мак-

  рокомандами $TTDEF и $TT2DEF.

       Примечание.  Пользователям  рекомендуется  определить,

  что устройство является терминалом, прежде,  чем  выполнить

  какую-либо функцию установки  режима,  особенно,  если  для

  ввода-вывода  используются  логические   имена   устройства

  SYS$INPUT или SYS$OUTPUT.

       Аргумент P3  определяет  скорость  работы  устройства,

  например, TT$C_BAUD_300. Младшие восемь битов специфицируют

  скорость передачи, а старшие 8 битов специфицируют скорость

  приема. Если скорость приема не указана, то и для приема  и

  для передачи используется скорость, указанная для передачи.

  Если не указаны ни скорость приема,  ни  скорость  передачи

  (P3=0), скорость не изменяется.

       Аргумент P4 содержит счетчики заполнения для  символов

  возврата каретки и перевода строки. Биты с 0 по 7 указывают

  число  символов  заполнения  используемых  после   возврата

  каретки. Биты с 8 по 15 указывают число  символов  заполне-

  ния, используемых после перевода строки. Аргумент P4  можно

  использовать только, если TT$M_CRFILL или TT$M_LFFILL  ука-

  заны в качестве  терминальных  характеристик  для  текущего

  запроса $QIO (см. табл. 26).

       В аргументе P5 может  быть  указано  несколько  флагов

  контроля четности:




                           - 227 -

                       00152-01 33 03-1


       1) TT$M_ALTRPAR - переменный контроль  четности.  Если

  флаг  установлен,  проверяются  состояния   TT$M_PARITY   и

  TT$M_ODD, и, если они указаны, тO изменяется контроль  чет-

  ности. В противном случае, эти биты игнорируются;

       2) TT$M_PARITY - если флаг установлен, то  разрешается

  контроль по четности на линии терминала, если очищен - зап-

  рещен;

       3) TT$M_ODD - если  флаг  установлен,  то  разрешается

  контроль по нечетности;

       4) TT$M_ALTDISPAR - изменить режим выдачи ошибок  чет-

  ности.  Если   флаг   установлен,   проверяется   состояние

  TT$M_DISPARERR;

       5) TT$M_DISPARERR -  отменяет  ошибки  четности.  Если

  данный режим установлен, ошибки ввода с установленным  фла-

  гом ошибки четности игнорируется и сообщение не выдается.

       Примечание. Если контроль четности разрешается,  конт-

  роль связи генерирует бит проверки четности. Если не дейст-

  вует  флаг  TT$M_DISPARERR,  то  ошибки  четности,  которые

  происходят во время операции "чтение", являются  неисправи-

  мыми. Ошибки четности, которые возникают на вводе (то есть,

  при нажатии клавиш), когда не осуществляется операции "чте-

  ние", могут привести к потере символа.

       Для изменения размера кадра в аргументе P5 может  быть

  указано значение TT$M_ALTERAME. Если оно указано, младшие 4

  бита аргумента P5 рассматриваются как размер кадра. Следует

  заметить, что биты размера кадра предназначены  только  для

  данных и исключаются из проверки на четность.




                           - 228 -

                       00152-01 33 03-1


       Прикладные  программы,  которые  изменяют  специальные

  характеристики терминала, должны:

       1) прочитать текущие характеристики с помощью  функции

  IO$_SENSEMODE;

       2) модифицировать их;

       3) использовать функцию установки режима, чтобы  запи-

  сать результаты;

       4) если требуется восстановить  данную  характеристику

  при выходе из программы, восстановление должно быть  выпол-

  нено прикладной программой.

       Сбой,  который  сопровождает  эту  последовательность,

  приводит к очистке любой ранее установленной  характеристи-

  ки.

       Два стоповых бита используются  только  для  скоростей

  передачи или приема данных, меньших или равных  150  бит  в

  секунду; для более высоких скоростей, по умолчанию,  прини-

  мается один стоповый бит.

       Функции установки  режима  и  установки  характеристик

  могут использовать модификаторы функций разрешения AST пре-

  рывания по УС/Y и по  УС/C,  зависания,  установки  модема,

  петлевого режима, разрешения AST прерывания по  нестандарт-

  ному  управляющему  символу  и  передачи   (см.   подпункты

  4.3.3.1...4.3.3.6).



       4.3.3.1. Модификатор функции зависания


       Функция зависания служит для  отсоединения  терминала,

  который находится  на  коммутируемой  линии.  Коммутируемые



                           - 229 -

                       00152-01 33 03-1


  линии описываются в п. 4.1.3 предусматривAются две комбина-

  ции кода функции и модификатора:

       1) IO$_SETMODE!IO$M_HANGUP;

       2) IO$_SETCHAR!IO$M_HANGUP.

       Модификатор функции зависания  не  использует  никаких

  аргументов. В блок состояния ввода-вывода возвращается  код

  SS$_NORMAL.



       4.3.3.2. Модификаторы  функций  разрешения   AST

                прерывания по УС/Y и УС/C


       Функции установки режима могут использовать  модифика-

  торы разрешения AST прерывания по  УС/C  и  разрешения  AST

  прерывания по УС/Y. Данные модификаторы требуют от драйвера

  терминала установки AST прерывания в очередь  для  запраши-

  вающего процесса при вводе  пользователем  УС/C  или  УС/Y.

  Предусматриваются две комбинации кода функции и модификато-

  ров:

       1) IO$_SETMODE!IO$M_CTRLCAST - разрешить AST  прерыва-

  ние по УС/C;                                            

       2) IO$_SETMODE!IO$M_CTRLYAST - разрешить AST  прерыва-

  ние по УС/Y.

       Эти пары модификаторов и кодов функций используют сле-

  дующие аргументы, зависящиE от устройства и функции:

       1) P1 - адрес программы  обслуживания  AST  прерывания

  или 0, если соответствующее AST прерывание запрещено;

       2) P2 - параметр AST прерывания;





                           - 230 -

                       00152-01 33 03-1


       3) P3 - режим доступа для выдачи АST прерывания  (мак-

  симизируется режимом доступа вызывающей программы).

       Если действует соответствующее разрешение, управляющий

  символ  УС/C  или  УС/Y  привлекает  внимание  разрешающего

  процессA (см. табл. 23).

       Разрешения AST прерывания  по  УС/C  и  УС/Y  являются

  одноразовыми разрешениями. После того, как произошло асинх-

  ронное системное прерывание (AST), оно  опять  должно  быть

  явно разрешено, прежде чем AST прерывание  может  произойти

  снова. Этот код функции используется также  для  запрещения

  AST прерывания.

       Пользователь может иметь больше, чем одно  разрешенное

  УС/C или УС/Y. Когда печатается символ, все AST  прерывания

  даются в обратнOм порядке их запроса, то есть  по  принципу

  "последний пришел - первый вышел". Например, печатание УС/C

  приводит к получению всех AST прерываний по УС/C.

       Если нет ни одного  разрешенного  УС/C,  пользователь,

  разрешивший прерывание по УС/Y, будет принимать  прерывания

  по УС/C.

       Разрешения УС/C отменяются программой системного  обс-

  луживания $CАNCEL. Разрешения  УС/Y  отменяются  программой

  системного обслуживания $DASSGN.

       УС/Y обычно используется для того, чтобы привлечь вни-

  мание интерпретатора команд и, таким образом, дать  пользо-

  вателю возможность вводить специальные команды,  такие  как

  DEBUG, STOP, CONTINUE и т.д. Рекомендуется, чтобы  програм-

  мы, которые запускаются из интерпретатора команд, не разре-




                           - 231 -

                       00152-01 33 03-1


  шали УС/Y. Кроме того, так как асинхронные системные преры-

  вания обслуживаются на основании принципа "первый пришел  -

  первый  вышел",  программа  обслуживания   AST   прерывания

  интерпретатора команд, получившая управление первой,  может

  вообще сделать недоступными прерывания. Поэтому, программы,

  которым необходимо использование УС/Y, должны  использовать

  программу LIB$DISABLE_TRL RTL, чтобы запретить  опознавание

  УС/Y диалоговым командным языком.

       Другие воздействия УС/C и УС/Y описываются в подпункте

  4.1.1.2.



       4.3.3.3. МодифиKатор функции установки модема


       Модификатор функции установки  модема  используется  в

  операциях обслуживания модема, чтобы дать возможность  про-

  цессу устанавливать и сбрасывать сигналы  управления  моде-

  мом. Обе функции установки режима могут использовать  моди-

  фикатор функции  установки  модема.  Предусматриваются  две

  комбинации кода функции и модификатора:

       1) IO$_SETMODE!IO$M_SET_MODEM!IO$M_MAINT;

       2) IO$_SETCHAR!IO$M_SET_MODEM!IO$M_MAINT.

       Оба модификатора кодов функций используют один завися-

  щий от устройства и функции аргумент:

       P1 - адрес квадрослова блока, который указывает, какие

  сигналы управления модемом надо  установить  или  сбросить.

  Формат этого блока показан на рис. 24.







                           - 232 -

                       00152-01 33 03-1



      Блок функции установки режима аргумента P1

  31         24  23        16  15        8  7          0
  +-----------------------------------------------------+
  !   Модем     !    Модем    !            !            !
  !  выключен   !   включен   !            !            !
  +-----------------------------------------------------+
  !             !             !            !            !
  !             !             !            !            !
  +-----------------------------------------------------+

                            Рис. 24


       Поля "модем включен" и "модем выключен", в комбинации,

  или раздельно, могут указывать одно или более значений:

       1) TT$M_DS_RTS - запрос на передачу (RTS);

       2) TT$M_DS_DTR - готовность данных терминала (DTR);

       3) TT$MM_DS_SECTX - данные канала переданы в  обратном

  направлении (SEC TXD).

       Макрокоманда $STTDEF определяет для них значения.  Эти

  значения могут быть  указаны  только  в  том  случае,  если

  характеристика  терминала  TT$M_MODEM  не  установлена.   В

  противнOм случае возникает ошибка (SS$_ABORT).



       4.3.3.4. Модификатор петлевой функции


       Модификатор петлевой функции используется в  операциях

  обслуживания устройства, для того  чтобы  установить  линию

  терминала в аппаратный петлевой режим. Данные, передаваемые

  в этом режиме в линию, возвращаются в качестве  принимаемых

  данных. Если контроллер не поддерживает петлевой режим  или

  линия  терминала  имеет  характеристику  TT$M_MODEM,  будет

  возвращено состояние ошибки (SS$ABORT). Обе  функции  уста-




                           - 233 -

                       00152-01 33 03-1


  новки режима могут использовать модификатор петлевой  функ-

  ции. Предусматриваются две комбинации кода функции и  моди-

  фикатора:


       1) IO$_SETMODE!IO$M_LOOPM!IO$M_MAINT;

       2) IO$_SETCHAR!IO$M_LOOPM!IO$M_MAINT.


       Данные, передаваемые в петлевом режиме,  должны  иметь

  размеры меньше или равные размеру буфера ввода  с  опереже-

  нием (см. подпункт 4.2.1.5). Программы, которые  используют

  этот модификатор  функции,  должны  включать  односекундную

  задержку, чтобы дать контроллеру возможность разрешить пет-

  левой режим после того, как запрос отправлен. Рекомендуется

  также, чтобы запросы на запись включали модификатор функции

  IO$M_NOFORMAT для  защиты  от  форматирования  входных  или

  выходных данных драйвером терминала.

       Операционная система  МОС  ВП  предусматривает  другой

  модификатор функции, который возвращает в исходное  положе-

  ние линию терминала, предварительно установленную в  петле-

  вой режим. Предусматриваются две комбинации кода функции  и

  модификатора:


       1) IO$_SETMODE!IO$M_UNLOOPM!IO$M_MAINT;

       2) IO$_SETCHAR!IO$M_UNLOOPM!IO$M_MAINT.


       Программы, которые используют этот  модификатор  функ-

  ции, должны включать  односекундную  задержку,  чтобы  дать

  возможность контроллеру сбросить петлевой режим после того,

  как запрос отправлен.




                           - 234 -

                       00152-01 33 03-1


       4.3.3.5. Модификатор  функции   разрешения   AST

                прерывания по нестандартному символу


       Модификатор функции разрешения AST прерывания по  нес-

  тандартному символу требует, чтобы драйвер терминала поста-

  вил AST прерывание в очередь для  запрашивающего  процесса,

  когда пользователь вводит один из 32-х  управляющих  симво-

  лов. Предусматриваются две комбинации кодов функции и моди-

  фикатора:

       1) IO$SETMODE!IO$M_OUTBAND[!IO$M_INCLUDE] -  разрешить

  AST прерывание по нестандартному символу;

       2) IO$SETCHAR!IO$M_OUTBAND[!IO$M_INCLUDE] -  разрешить

  AST прерывание по нестандартному символу.

       Эти пары модификаторов и кодов функций используют сле-

  дующие аргументы, зависящие от устройства и функции:

       1) P1 - адрес программы  обслуживания  AST  прерывания

  или 0, если все AST прерывания,  введенные  в  этот  канал,

  должны быть отменены;

       2) P2 - Aдрес маски символов с таким же форматом,  как

  у  маски  ограничителей  короткой   формы   (см.   подпункт

  4.3.1.2);

       3) P3 - режим доступа  для  получения  AST  прерывания

  (максимизируется режимом доступа вызывающей программы).

       Функция IO$_SETMODE!IO$M_OUTBAND может иметь следующие

  модификаторы:

       1) IO$M_INCLUDE - включает введенный  символ  в  поток

  данных;





                           - 235 -

                       00152-01 33 03-1


       2) IO$M_TT_ABORT- разрешает прекращение  выполняющихся

  операций чтения и записи. Блок состояния  ввода-вывода  для

  прерванных операций возвращает код SS$_CONTROLC.

       Если AST прерывание по нестандартному символу разреше-

  но, ввод любого управляющего символа,  указанного  в  маске

  аргумента P2 привлекает внимание разрешающего процесса.

       Пользователь может иметь только одно асинхронное  сис-

  темное прерывание по нестандартному символу, разрешенное на

  канал.

       AST прерывания по нестандартному символу являются пов-

  торяющимися AST прерываниями; они  остаются  доступными  до

  тех пор, пока не будут специально запрещены. Разрешения AST

  прерываний по нестандартному символу отменяются  программой

  системного обслуживания $CANCEL.



       4.3.3.6. Модификатор функции передачи сообщения


       Модификатор функции передачи сообщения позволяет поль-

  зователю включать или выключать указанных абонентов. Допус-

  кается одна комбинация кода функции и модификатора:

       IO$_SETMODE!IO$M_BRDCST.

       Эта пара модификатор-код функции использует  следующие

  аргументы, зависящие от устройства и функции:

       1) P1 - адрес, содержащий биты,  определяющие  абонен-

  тов, для которых осуществляется передача;

       2) P2 - длина буфера (по умолчанию 8 байтов).

       Первое длинное слово буфера,  указанного  в  аргументе

  P1, резервируется для использования утилитами системы, нап-



                           - 236 -

                       00152-01 33 03-1


  ример, МАIL и PHONE; второе длинное  слово  предоставляется

  пользователю для указания выбранных битов, которые  опреде-

  ляются макрокомандой  $BRKDEF  (префиксом  служит  BRK$C_).

  Если в буфере аргумента P1 установлен некоторый бит,  конк-

  ретный абонент отключается.



       4.3.4. Считывание режима


       Функция считывания режима читает характеристики терми-

  нала и возвращает их в блок состояния ввода-вывода вызываю-

  щей программы. Предусматриваются два кода функции:

       1) IO$_SENSEMODE;

       2) IO$_SENSECHAR.

       Функция IO$_SENSEMODE возвращает связанные  с  процес-

  сом, то есть, текущие характеристики терминала,  а  функция

  IO$_SENSECHAR возвращает постоянные характеристики термина-

  ла.    IO$_SENSEMODE    является    функцией    логического

  ввода-вывода и не требует никаких привилегий. IO$_SENSECHAR

  является функцией физического ввода-вывода и требует приви-

  легию, необходимую для выполнения физического ввода-вывода.

  Эти коды функции используют  следующие  зависящие  от  уст-

  ройства и функции аргументы:

       1) P1 - адрес буфера характеристик;

       2) P2 - длина буфера  характеристик  (по  умолчанию  8

  байтов).

       Аргумент P1 указывает блок переменной длины,  показан-

  ный на рис. 25.





                           - 237 -

                       00152-01 33 03-1


       Поле  класс  устройства,  содержит  DC$_TERM,  который

  определяется макрокомандой $DCDEF. Тип определяется  макро-

  командой $DCDEF, например, DT$_LA36. Максимальное  значение

  размера буфера (ширина страницы) равно 255. Значения харак-

  теристик терминала перечисляются в  табл.  26.  Расширенные

  характеристики терминала перечисляются в табл. 27. Эти зна-

  чения определяются макрокомандой $TTDEF.


    Буфер характеристик для функции считывания режима

  31           24 23      16 15          8 7            0
  +-----------------------------------------------------+
  !       Размер буфера     !     Тип     !   Класс     !
  !     (ширина  страницы)  !             !             !
  +-----------------------------------------------------+
  !Длина страницы!  Основные характеристики терминала   !
  !              !                                      !
  +-----------------------------------------------------+

                  P2=8 (по умолчанию)


  31            24 23     16 15          8 7           0
  +-----------------------------------------------------+
  !       Размер буфера     !     Тип     !   Класс     !
  !     (Ширина страницы)   !             !             !
  +-----------------------------------------------------+
  ! Длина страницы! Основные характеристики терминала   !
  !               !                                     !
  +-----------------------------------------------------+
  !        Расширенные характеристики терминала         !
  +-----------------------------------------------------+

                       P2=12

                            Рис. 25



       4.3.4.1. Модификатор подсчета символов



       Функции чтение режима  и  чтение  характеристик  могут

  использовать модификатор IO$M_TYPEAHDCNT подсчета символов,




                           - 238 -

                       00152-01 33 03-1


  вводимых с опережением.

       IO$M_TYPEAHDCNT   возвращает   количество    символов,

  находящихся в настоящее время в буфере ввода с опережением,

  и копию первого символа в буфере. В этом случае аргумент P1

  указывает  буфер  характеристик,  возвращаемый  при  помощи

  IO$M_TYPEAHDCNT. На рис. 26 показан формат этого буфера.


          Буфер характеристик функции чтения режима

                  (ввод с опережением)

  31             24 23           16 15                      0
  +---------------------------------------------------------+
  !(Резервируется) ! Первый символ ! Количество символов в  !
  !                !               ! буфере ввода с опере-  !
  !                !               ! жением                 !
  +---------------------------------------------------------+
  !                  (Резервируется)                        !
  +---------------------------------------------------------+

                            Рис. 26



       4.3.4.2. Модификатор функции чтения модема


       Функции чтения режима  и  чтения  характеристик  могут

  использовать модификатор чтения  модема.  Этот  модификатор

  дает возможность доступа к информации, зависимой  от  конт-

  роллера. Предусматриваются две комбинации кодов  функции  и

  модификатора:

       1) IO$_SENSEMODE!IO$M_RD_MODEM;

       2) IO$_SENSECHAR!IO$M_RD_MODEM.

       Оба модификатора функции используют один зависящий  от

  устройства и функции аргумент:

       P1 - адрес блока, длиной в квадрослово.





                           - 239 -

                       00152-01 33 03-1


       Формат этого блока показан на рис. 27.


               Блок модификатора чтения модема

      31         24 23        16 15         8 7            0
      +----------------------------------------------------+
      !            !  Приемный  !            !    Тип      !
      !            !   модем    !            ! контроллера !
  P1: +----------------------------------------------------+
      !            !            !            !             !
      !            !            !            !             !
      +----------------------------------------------------+

                            Рис. 27


       В поле приемного модема возвращается значение  текущих

  входных сигналов модема.  Могут  быть  возвращены  все  или

  некоторые из следующих ниже сигналов:

       1) TT$M_DS_DSR - готовность набора данных (DSR);

       2) TT$M_DS_RINGR - индикатор вызова (RING);

       3) TT$M_DS_CARRIER - индикатор линейного сигнала кана-

  ла данных (CARRIER);

       4) TT$M_DS_CTS - готовность к посылке (CTS);

       5) TT$M_DS_SECREC - данные канала получены в  обратном

  направлении (SEC RXD).

       Макрокоманда $TTDEF определяет символы для поля прием-

  ного модема.

       Поле типа контроллера возвращает тип контроллера  тер-

  минала, используемого линией терминала, активной  в  данный

  момент времени.

       Макрокоманда $DCDEF определяет символы для типа  конт-

  роллера: для КСМ-32 - DT$_DMF32.







                           - 240 -

                       00152-01 33 03-1


       4.3.4.3. Модификатор передачи


       Функция чтения режима может использоваться с модифика-

  тором функции передачи. Данный модификатор возвращает биты,

  которые были установлены  модификатором  функции  установки

  режима IO$M_BRDCST (см. подпункт 4.3.3.6). Допускается одна

  комбинация кода функции и модификатора:

           IO$_SENSEMODE!IO$M_BRDCST.

       Эта пара модификатор-код функции использует два  аргу-

  мента, зависящие от устройства и функции:

           1) P1 - буфер, содержащий биты, которые  указывают

           абонентов, для  которых  осуществляется  передача.

           Если в первом длинном слове установлен бит, данная

           конкретная команда выключается из передачи;

           2) P2 - длина буфера аргумента P1.



       4.4. Блок состояния ввода-вывода



       Форматы  блока  состояния  ввода-вывода  для   функций

  ввода-вывода: чтения, записи, установки режима и считывания

  режима показаны на рис. 28, рис. 29, рис. 30. Коды заверше-

  ния для данных функций перечисляются в приложении 1.















                           - 241 -

                       00152-01 33 03-1



           Содержимое блока состояния ввода-вывода

                    для функции чтения

                             +2                    IOSB
  +------------------------------------------------------+
  !      Смещение   до         !          Код            !
  !        ограничителя        !       завершения        !
  +------------------------------------------------------+
  !            Размер          !       Ограничитель      !
  !         ограничителя       !                         !
  +------------------------------------------------------+
                               +6                       +4

                            Рис. 28


       На рис. 28 смещение до ограничителя -  это  количество

  символов  перед   символом   ограничителя   (см.   подпункт

  4.3.1.2). Символ ограничителя находится в буфере со  смеще-

  нием, указанном в IOSB+2. Когда  буфер  полон,  смещение  в

  IOSB+2 равно запрашиваемому размеру  буфера.  В  это  время

  IOSB+4 равно 0. В случае последовательности AP2,  состоящей

  из нескольких символов,  ограничителем  в  IOSB+4  является

  первый  символ  (AP2)  данной  последовательности.   IOSB+6

  содержит размер строки ограничителя, обычно 1. Однако,  для

  последовательности AP2 IOSB+6  содержит  размер  последова-

  тельности AP2 (см. подпункт 4.1.1.4). Сумма IOSB+2 и IOSB+6

  - равна количеству символов в буфере.
















                           - 242 -

                       00152-01 33 03-1


       Содержимое блока состояние ввода-вывода для

           функции чтения списка элементов

                             +2                    IOSB
  +-----------------------------------------------------+
  !  смещение до ограничителя  !   код   завершения     !
  +-----------------------------------------------------+
  !  Позиция     !  Длина      ! (Резерви-  !  Символ   !
  !  курсора     !             !  руется)   ! ограничи- !
  !  от конца    ! ограничителя!            !  теля     !
  !  строки      !             !            !           !
  +-----------------------------------------------------+
                            +6                        +4

                            Рис. 29

       На рис. 29 слово позиции ограничителя содержит  число,

  смысл которого определяется режимом операции. Для  операций

  чтения  списка  элементов,   в   которых   не   указывается

  TRM$K_EM_RDVERIFY, данное слово содержит количество  симво-

  лов от конца буфера до позиции курсора на момент  получения

  символа ограничителя. Если TRM$K_EM_RDVERIFY указан,  слово

  позиции ограничителя содержит смещение в буфере от непрове-

  ренного символа.

       Для обычных операций чтения IOSB+5 и IOSB+7 возвращают

  0. Для операций чтения списка элементов IOSB+5 возвращает -

  1, а IOSB+7 - смещение курсора от конца строки при  оконча-

  нии чтения.

















                           - 243 -

                       00152-01 33 03-1



                 содержимое блока состояния

              ввода-вывода для функций записи

                             +2                    IOSB
  +------------------------------------------------------+
  !     Счетчик   байтов     !     Код    завершения     !
  +------------------------------------------------------+
  !              0           !             0             !
  +------------------------------------------------------+
                            +6                        +4

                            Рис. 30


       При выполнении функции записи драйвер удаленного  тер-

  минала не возвращает число  выведенных  строк  или  позицию

  курсора. Блок состояния ввода-вывода.

       Скорость приема в блоке состояния ввода-вывода,  изоб-

  раженном на рис. 31, указывается только при отличии от ско-

  рости передачи.


     Содержимое блока состояния ввода-вывода для функций:

        установка режима, установка характеристик,

       Считывание режима и считывание характеристик

               +3            +2                    IOSB
  +------------------------------------------------------+
  !   Скорость    !   Скорость   !       Код             !
  !    приEма     !   передачи   !    завершения         !
  +------------------------------------------------------+
  !      0        !    Флаги     !Количество ! Количество!
  !               !   контроля   !заполнений ! заполнений!
  !               ! по четности  !     ПС    !    ВК     !
  +------------------------------------------------------+

                            Рис. 31











                           - 244 -

                       00152-01 33 03-1


       4.5. Примеры программирования


       В примере 1 приведена программа, в которой использова-

  ны операции ввода-вывода с применением  дуплексных  возмож-

  ностей драйвера. Программа  иллюстрирует  некоторые  важные

  концепции, касающиеся программирования драйвера  терминала:

  назначение канала ввода-вывода, выполнение дуплексных  опе-

  раций ввода-вывода, разрешение асинхронных системных преры-

  ваний (AST) по УС/C и чтения списка элементов.

       Программа предназначается  для  работы  с  терминалом,

  установленным в дуплексный режим.  Программа  инициализации

  устанавливает в очередь к терминалу операцию чтения и  раз-

  решает асинхронные системные прерывания  по  УС/C.  Главный

  цикл затем распечатывает  случайное  сообщение  каждые  три

  секунды. Когда пользователь печатает сообщение на  термина-

  ле, программа обслуживания AST прерывания при чтении  печа-

  тает сообщение подтверждения и ставит в очередь другое чте-

  ние.  Если  пользователь  печатает  УС/C,   соответствующая

  программа обслуживания  AST  прерывания  отменяет  операцию

  ввода-вывода в назначенном канале и выходит в интерпретатор

  команд.

       В примере 2 выполняется чтение с проверкой.  Программа

  иллюстрирует типичное построение списков элементов (левые и

  правые поля), назначение канала, операцию проверки левого и

  правого чтения с проверкой  и  директиву  ввода-вывода  для

  чтения.







                           - 245 -

                       00152-01 33 03-1


       Пример 1.

         .TITLE  EXAMPLE 1



         .IDENT  /04/



          .SBTTL  DECLARATIONS

  ;

  ;определение символьных переменных

  ;

          $IODEF                ;определить коды функций вво-

                                ;да-вывода

          $QIODEF               ;определить коды определений

                                ;для макрокоманды $QIO

          $TRMDEF               ;определить коды чтения спис-

                                ;ка злементов

  ;

  ; макроопределения

  ;

          .SHOW

          .MACRO  ITEM    LEN=0,CODE,VALUE

          .WORD   LEN

          .WORD   TRM$_'CODE'

          .LONG   VALUE

          .LONG   0

          .ENDM   ITEM

          .NOSHOW

  ;




                           - 246 -

                       00152-01 33 03-1


  ; об'явить управляющий блок обработчика выхода

  ;

  EXIT_HANDLER_BLOCK:

          .LONG   0             ;используется системой для

                                ;указателя

          .LONG   EXIT_HANDLER  ;адрес обработчика выхода

          .LONG   1             ;счетчик аргументов для обра-

                                ;ботчика

          .LONG   STATUS        ;назначение кода завершения

  STATUS: .BLKL   1             ;код завершения $EXIT

  ;

  ; распределить память для дескриптора терминала и номера

  ; канала

  ;

  TT_DESC:

          .ASCID  /SYS$INPUT/   ; логическое имя терминала

  TT_CHAN:

          .BLKW   1             ;ячейка для номера канала ТТ

  ;

  ; определение сообщения подтверждения. Задается непосредст-

  ; венно перед буфером ввода для возможности их конкатенации

  ; при выдаче сообщения

  ;

  ACK_MSG:

          .ASCII  <CR><LF>/FOLLOWING INPUT ACKNOWLEDGED: /

  ACK_MSGLEN=.-ACK_MSG            ;вычислить длину сообщения

  ;




                           - 247 -

                       00152-01 33 03-1


  ; распределить память для буфера ввода

  ;

  IN_BUFLEN = 20                  ;установить длину буфера

  IN_BUF:

          .BLKB   IN_BUFLEN       ;распределить буфер для

                                  ;символов

  IN_IOSB:

          .BLKQ   1               ;блок состояния ввода-выво-

                                  ;да

  ;

  ; определить символьную маску для AST прерывания по нестан-

  ; дартному символу

  ;

  CNTRLA_MASK:

          .LONG   0

          .LONG   ^B0010          ;маска УС/а

  ;

  ; определить буфер для старых характеристик терминала

  ;

  OLDCHAR_BUF_LEN = 12

  OLDCHAR_BUF:

          .BLKB   OLDCHAR_BUF_LEN

  ;

  ; определить буфер для новых характеристик терминала

  ;

  NEWCHAR_BUF_LEN = 12

  NEWCHAR_BUF:




                           - 248 -

                       00152-01 33 03-1


          .BLKB   NEWCHAR_BUF_LEN

  ;

  ; определить символы управления  кареткой

  ;

          CR=^XOD                 ; возврат каретки

          LF=^XOA                 ; перевод строки

  ;

  ; определить выходные сообщения

  ;

  ; доступ к выходным сообщениям осуществляется с помощью ин-

  ; дексирования по таблице длинных слов, в которой каждое

  ; сообщение задается адресом  сообщения и длиной сообщения

  ;

  ARRAY:                          ;таблица адресов и длин со-

                                  ;общений

          .LONG   10$             ;адрес первого сообщения

          .LONG   15$             ;длина первого сообщения

          .LONG   20$

          .LONG   25$

          .LONG   30$

          .LONG   35$

          .LONG   40$

          .LONG   45$

  ;

  ; определение сообщений

  ;

  10$:    .ASCII  <CR><LF>/RED ALERT!!!   RED ALERT!!!/




                           - 249 -

                       00152-01 33 03-1


  15$=.-10$

  ;

  20$:    .ASCII  <CR><LF>/ALL SYSTEMS GO/

  25$=.-20$

  ;

  30$:    .ASCII  <CR><LF>/WARNING.....INTRUDER ALARM/

  35$=.-30$

  ;

  40$:    .ASCII  <CR><LF>/***** SYSTEM OVERLOAD *****/

  45$=.-40$

  ;

  ; статический пакет запроса QIO для выдачи сообщения с ис-

  ; пользованием формы QIO$_G

  ;

  WRITE_QIO:

     $QIO    FUNC=IO$_WRITEVBLK!IO$M_BREAKTHRU!IO$M_REFRESH,-

             EFN=1           ; пакет QIO

  ;

  ; память для таймера

  ;

  WAITIME:

          .LONG   -10*1000*1000*3,-1     ; интервал времени

                                         ; 3 секунды

  TIME:

          .BLKQ   1               ; текущее время, используе-

                                  ; мое для

                                  ; получения случайного чис-




                           - 250 -

                       00152-01 33 03-1


                                  ; ла

          .SBTTL  START           ; основной модуль

  ;++

  ;

  ; функциональное описание:

  ;

  ;

  ;    точка старта  программы

  ;

  ;

  ; выполнение функций инициализации.

  ; предполагается, что терминал уже находится

  ; в дуплексном режиме.

  ;

  ;        примечание: при выполнении вызова QIO_S

  ;                    параметры P1 и Р3-Р6 должны

  ;                    передаваться по значению,

  ;                    а Р2 - по ссылке.

  ;

  ; входные параметры:

  ;         нет

  ;

  ; выходные параметры:

  ;         нет

  ;

  ;--

  START:




                           - 251 -

                       00152-01 33 03-1


     .WORD                          ;маска входа

      $ASSIGN_S      DEVNAM=TT_DESC,-;назначение канала для

                                     ;терминала

                     CHAN=TT_CHAN    ;логическое имя и номер

                                     ;канала

      BLBS    R0,10$                 ;если установлен,ошибок

                                     ;нет

      BRW     ERROR                  ;ошибка

  10$:    BSBW    CHANGE_CHARACTERISTICS ;изменить характе-

                                         ;ристики терминала

          BSBW    ENABLE_CTRLCAST        ;разрешить прерыва-

                                         ;ние по УС/C

          BSBW    ENABLE_OUTBANDAST      ;разрешить AST пре-

                                         ;рывание по нестан-

                                         ;дартному символу

                                         ;УС/A

          BSBW    ENABLE_READ            ;поставить чтение в

                                         ;очередь

          MOVZWL  TT_CHAN,WRITE_QIO+8    ;включить канал в

                                         ;пакет статического

                                         ;запроса QIO

  ; цикл выводит сообщения на основе случайного числа

  ; и затем выполняет задержку в 3 секунды

  ;

  LOOP:

          $GETTIM_S      TIMADR=TIME     ;получить случайное

                                         ;время




                           - 252 -

                       00152-01 33 03-1


          BLBS    R0,10$                 ;если установлено-

                                         ;ошибок нет

          BRW     ERROR

  10$:    EXTZV   #6,#2,TIME,R0          ;загрузить случайные

                                         ;биты в переключа-

                                         ;тель

          MOVQ    ARRAY[R0],-            ;загрузить адрес

                  WRITE_QIO+QIO$_P1      ;и длину сообщения в

                                         ;пакет запроса QIO

  ;

  ; выдать запрос QIO на запись, используя пакет, определен-

  ; ный в области данных

  ;

          $QIOW_G WRITE_QIO

          BLBS    R0,5$                  ;если установлено-

                                         ;ошибок нет

          BRW     ERROR

  ;

  ; задержка 3 секунды до выдачи следующего сообщения

  ;

  5$:

          $SETIMR_S  EFN=#2,DAYTIM=WAITIME ;обслуживание тай-

                                         ;мера установить

                                         ;флаг события через

                                         ;3 секунды

          BLBS    R0,20$                 ;если установлено-

                                         ;ошибок нет




                           - 253 -

                       00152-01 33 03-1


          BRW     ERROR

  20$:    $WAITFR_S      EFN=#2          ;ожидать флага собы-

                                         ;тия

          BLBS    R0,LOOP                ;если установлено-

                                         ;ошибок нет

          BRW     ERROR



       .SBTTL  CHANGE_CHARACTERISTICS    ;изменить характе-

                                         ;ристики терминала

  ;++

  ;

  ; функциональное описание:

  ;

  ;       программа изменения характеристик терминала

  ;

  ; входные параметры:

  ;       нет

  ; выходные параметры:

  ;       R0 - состояние вызова макрокоманды $QIO

  ;       R1 по R5 информация разрушается

  ;--

  ;

  CHANGE_CHARACTERISTICS:

          $QIO_S  CHAN=TT_CHAN,-         ;получить текущие

                  FUNC=#IO$_SENSEMODE,-  ;характеристики тер-

                  P1=OLDCHAR_BUF,-       ;минала

                  P2=#OLDCHAR_BUF_LEN




                           - 254 -

                       00152-01 33 03-1


          BLBC    R0,10$                 ;если очищен-ошибка

          $DCLEXH_S EXIT_HANDLER_BLOCK   ;об'явить обработчик

                                         ;выхода для

                                         ;восстановления ха-

                                         ;рактеристик

          BLBS    R0,5$

          BRW     ERROR

  5$:     MOVC3   #OLDCHAR_BUF_LEN,-     ;занести старые ха-

                                         ;рактеристики

                  OLDCHAR_BUF,-          ;в буфер новых ха-

                  NEWCHAR_BUF            ;рактеристик

          BISL2   #TT$M_NOBRDCST,-       ;установить бит от-

                                         ;мены передачи

                  NEWCHAR_BUF+4          ;...

          $QIO_S  CHAN=TT_CHAN,-         ;установить текущие

                  FUNC=#IO$_SETMODE,-    ;характеристики тер-

                                         ;минала

                  P1=NEWCHAR_BUF,-

                  P2=#NEWCHAR_BUF_LEN

          BLBS    R0,20$                 ;если установлено-

                                         ;ошибок нет

  10$:    BRW     ERROR

  20$:    RSB



          .SBTTL  ENABLE_CTRLCAST    ;разрешить AST прерыва-

                                     ;ние по УС/C

  ;**




                           - 255 -

                       00152-01 33 03-1


  ;

  ; функциональное описание:

  ;

  ;       программа для разрешения распознавания УС/C

  ;

  ; входные параметры:

  ;       нет

  ; выходные параметры:

  ;       нет

  ;

  ;--

  ;

  ENABLE_CTRLCAST:

          $QIOW_S CHAN=TT_CHAN,-

                  FUNC=#IO$_SETMODE!IO$M_CTRLCAST,-

                  P1=CTRLCAST,-           ;адрес программы

                                          ;обслуживания AST

                                          ;прерывания

                  P3=#3                   ;режим пользователя

          BLBS    R0,10$                  ;если установлено-

                                          ;ошибки нет

          BRW     ERROR

  10$:    RSB



     .SBTTL  ENABLE_OUTBANDAST     ;разрешить AST прерывание

  ;++                              ;по УС/A

  ;




                           - 256 -

                       00152-01 33 03-1


  ; функциональное описание:

  ;

  ;       программа разрешения распознавания УС/A

  ;

  ; входные параметры:

  ;       нет

  ; выходные параметры:

  ;       нет

  ;

  ;--

  ;



  ENABLE_OUTBANDAST:

          $QIOW_S CHAN=TT_CHAN,-

                  FUNC=#IO$_SETMODE!IO$M_OUTBAND,-

                  P1=CTRLAAST,-           ;адрес программы

                                          ;обслуживания AST

                                          ;прерывания

                  P2=#CNTRLA_MASK,-       ;символьная маска

                  P3=#3                   ;режим пользователя

          BLBS    R0,10$                  ;если установлено-

                                          ;ошибок нет

          BRW     ERROR

  10$:    RSB

          .SBTTL  ENABLE_READ      ;установить чтение на тер-

                                   ;минал в очередь

  ;++





                           - 257 -

                       00152-01 33 03-1


  ;

  ; функциональное описание:

  ;

  ; программа установки в очередь к терминалу операции чтения

  ;

  ; входные параметры:

  ;       нет

  ; выходные параметры:

  ;       нет

  ;

  ;--

  ;

  ; определение списка элементов для чтения

  ITEM_LST:

      ITEM    0,MODIFIERS,-                   ;преобразование

              TRM$M_TM_CVTLOW!TRM$M_TM_NOEDIT ;нижнего регис-

                                              ;тра в верхний

                                              ;и запрет

                                              ;строчного

                                              ;редактирования

      ITEM    6,TERM,MASK_ADDR                ;установка мас-

                                              ;ки ограничите-

                                              ;лей

  ITEM_LEN=.-ITEM_LST

  MASK_ADDR:

      .LONG   1@^XD                   ;маска ограничителей -

                                      ; <CR>




                           - 258 -

                       00152-01 33 03-1


      .WORD   1@4                     ;и "$"

  ENABLE_READ:

      $QIO_S  CHAN=TT_CHAN,-          ;не должен иметь форму

                      -               ;QIOW или операция чте-

                      -               ;ния заблокирует про-

                                      ;цесс

             FUNC=#IO$_READVBLK!IO$M_EXTEND,-

             IOSB=IN_IOSB,-

             ASTADR=READAST,-        ;программу обслуживания

                                     ;AST прерывания

              P1=IN_BUF,-

              P2=#IN_BUFLEN,-

              P5=#ITEM_LST,-          ;адрес для чтения

                                      ;списка элементов

              P6=#ITEM_LEN            ;длина списка элементов

                                      ;для чтения

      BLBS    R0,10$                  ;если установлено - нет

                                      ;ошибки

      BRW     ERROR

  ; находящиеся в очереди запросы не влияют

  ; на операции чтения, поскольку для них была

  ; установлена возможность прерывания

  10$:    RSB



      .SBTTL  READAST       ;программа обслуживания AST пре-

                            ;рывания для завершения чтения

  ;++




                           - 259 -

                       00152-01 33 03-1


  ;

  ; функциональное описание:

  ;

  ;       программа обслуживания AST прерывания выполняет

  ;       завершение чтения

  ;

  ; входные параметры:

  ;       нет

  ;

  ; выходные параметры:

  ;       нет

  ;

  ;--

  ;



  READAST:

     .WORD   ^M<R2,R3,R4,R5>         ;маска входа в процедуру

     BLBS    IN_IOSB,10$             ;проверка блока состоя-

                                     ;ния ввода-вывода

                                     ;на успешное завершение

     MOVZWL  IN_IOSB,R0              ;установить код ошибки

                                     ;в R0

     BRW     ERROR                   ;выход по ошибке

  10$:    MOVZWL  IN_IOSB+2,R0            ;занести символы

                                          ;# в R0

          ADDL2   #ACK_MSGLEN,R0          ;добавить размер

                                          ;фиксированного




                           - 260 -

                       00152-01 33 03-1


                                          ;подтверждающего

                                          ;сообщения

          $QIO_S  CHAN=TT_CHAN,-          ;выдать подтвержда-

          FUNC=#IO#_WRITEVBLK,-           ;ющее сообщение

          P1=ACK_MSG,-

          P2=R0

  ;

  ; обработка сообщений

  ;

  ;       .

  ;       .

  ;       .

  ;       .

  ;       .

  ;       .

          BSWB    ENABLE_READ             ;поставить в оче-

                                          ;редь следующую

                                     ;операцию чтения

          RET                        ;возврат в главный цикл



       .SBTTL  CTRLAAST     ;программа обслуживания AST пре-

                            ;рывания для УС/A

       .SBTTL  CTRLCAST     ;программа обслуживания AST пре-

                            ;рывания для УС/C

       .SBTTL  ERROR        ;программа выхода



  ;++




                           - 261 -

                       00152-01 33 03-1


  ;

  ; функциональное описание:

  ;

  ;       программа обслуживания AST прерывания выполняется

  ;       при обнаружении УС/A или УС/C

  ; входные параметры:

  ;       нет

  ;

  ; выходные параметры:

  ;       нет

  ;

  ;--

  ;

  CTRLCAST:

  CTRLAAST:

          .WORD   ^M<>            ;маска входа процедуры

          MOVL    #1,R0           ;занести код успешного

                                  ;состояния в R0



  ERROR:  $EXIT_S R0              ;выход

          RSB



         .SBTTL  EXIT_HANDLER     ;программа управления выхо-

                                  ;дом



  ;++

  ;




                           - 262 -

                       00152-01 33 03-1


  ; функциональное описание:

  ;

  ;       программа уничтожает все незавершенные  запросы

  ;       ввода-вывода и сбрасывает все характеристики в

  ;       исходное состояние

  ; входные параметры:

  ;       нет

  ;

  ; выходные параметры:

  ;       нет

  ;

  ;--

  ;

  EXIT_HANDLER:

          .WORD                           ;маска входа проце-

                                          ;дуры

          $CANCEL_S       CHAN=TT_CHAN    ;

          $QIO_S  CHAN=TT_CHAN,-          ;сбросить характе-

                  FUNC=$IO$_SETMODE,-     ;ристики терминала

                  P1=OLDCHAR_BUF,-

                  P2=#OLDCHAR_BUF_LEN

          RET



          .END    START

       Пример 2.

          .TITLE  READ_VERIFY     ;пример программы чтения с

                                  ;проверкой




                           - 263 -

                       00152-01 33 03-1


          .IDENT  'V04-0007



          .SBTTL DECLARATIONS

  ;

  ; включаемые файлы:

  ;

          $TRMDEF

  ;

  ; макроопределения:

  ;

   .MACRO ITEM LEN=0,CODE,VALUE

          .WORD   LEN

          .WORD   TRM$_'CODE'

          .LONG   VALUE

          .LONG   0

   .ENDM ITEM



  ;

  ; символы:

  ;

  INBUF_LEN = 20

  ESC = ^X1B



  ;

  ;

  ; построение списка элементов для функции чтения с провер-

  ; кой макрокоманды $QIO




                           - 264 -

                       00152-01 33 03-1


  ;

  ;поле выравненное справа

  ;

  R_ITEM_LIST:    ITEM    CODE    = MODIFIERS, -

                  VALUE   = TRM$M_TM_R_JUST       ;выравнять

                                                  ;справа



          ITEM    CODE    = EDITMODE, -

                  VALUE   = TRM$K_EM_RDVERIFY     ;разрешить

                                                  ;чтение с

                                                  ;проверкой



          ITEM    CODE    = PROMPT, -

                  VALUE   = R_PROMPT_ADDR, -

                  LEN     = R_PROMPT_LEN          ;установить

                                                  ;подсказку



          ITEM    CODE    = INISTRNG, -

                  VALUE   = R_INISTR_ADDR, -      ;установить

                  LEN     = R_INISTR_LEN          ;начальную

                                                  ;строку



          ITEM    CODE    = INIOFFSET, -

                  VALUE   = R_INISTR_LEN



          ITEM    CODE    = PICSTRNG, -

                  VALUE   = R.PICSTR_ADDR, -




                           - 265 -

                       00152-01 33 03-1


                  LEN     = R_PICSTR_LEN          ;установть

                                                  ;строку

                                                  ;символов

                                                  ;проверки



          ITEM    CODE    = FILLCHR, -

                  VALUE   = <^A/* />           ;очистка = *,

                                               ;заполнение =

                                               ;пробел



  R_ITEM_LIST_LEN = .-R_ITEM_LIST



  R_PROMPT_ADDR:

          .ASCII  <ESC>/[12;12H$/

  R_PROMPT_LEN = .-R_PROMPT_ADDR



  R_INISTR_ADDR:

          .ASCII  /   ,   /

  R_INISTR_LEN = .-R_INISTR_ADDR

  MASK = TRM$M_CV_NUMERIC!TRM$M_CV_NUMPUNC



  R_PICSTR_ADDR:

          .BYTE   MASK

          .BYTE   MASK

          .BYTE   MASK

          .BYTE   0               ;символ маркера

          .BYTE   MASK




                           - 266 -

                       00152-01 33 03-1


          .BYTE   MASK

          .BYTE   MASK

  R_PICSTR_LEN = .-R_PICSTR_ADDR



  ;

  ; поле выравненное слева

  ;

  L_ITEM_LIST:

          ITEM    CODE    = MODIFIERS, -

                  VALUE   = TRM$M_TM_CVTLOW!TRM$M_TM_AUTO_TAB

                                                  ; ввести в

                                                  ; верхнем

                                                  ; регистре

                                                  ; и завер-

                                                  ; шить по

                                                  ; заполне-

                                                  ; нии поля



          ITEM    CODE    = EDITMODE, -

                  VALUE   = TRM$K_EM_RDVERIFY     ;разрешить

                                                  ; чтение с

                                                  ; проверкой



          ITEM    CODE    = PROMPT, -

                  VALUE   = L_PROMPT_ADDR, -

                  LEN     = L_PROMPT_LEN          ;установить

                                                  ;подсказку




                           - 267 -

                       00152-01 33 03-1




          ITEM    CODE    = INISTRNG, -

                  VALUE   = L_INISTR_ADDR, -      ;установить

                  LEN     = L_INISTR_LEN          ;начальную

                                                  ;строку



          ITEM    CODE    = INIOFFSET, -

                  VALUE   = 0



          ITEM    CODE    = PICSTRNG, -

                  VALUE   = L_PICSTR_ADDR, -

                  LEN     = L_PICSTR_LEN          ;установить

                                                  ;строку

                                                  ;символов

                                                  ;проверки



          ITEM    CODE    = FILLCHR, -

                  VALUE   = <^A/* />            ;очистка = *,

                                                ;заполнение =

                                                ;пробел

  L_ITEM_LIST_LEN = .-L_ITEM_LIST



  L_PROMPT_ADDR:

          .ASCII  <ESC>/[13;12H ENTER DATE: /

  L_PROMPT_LEN = .-L_PROMPT_ADDR



  L_INISTR_ADDR:




                           - 268 -

                       00152-01 33 03-1


          .ASCII  /  -   -  /

  L_INISTR_LEN = .-L_INISTR_ADDR



  MASK1 = TRM$M_CV_NUMERIC

  MASK2 = TRM$M_CV_UPPER!TRM$M_CV_LOWER



  L_PICSTR_ADDR:

          .BYTE   MASK1

          .BYTE   MASK1

          .BYTE   0               ; символ маркера

          .BYTE   MASK2

          .BYTEMASK2

          .BYTE   MASK2

          .BYTE   0               ; символ маркера

          .BYTE   MASK1

          .BYTE   MASK1

  L_PICSTR_LEN = .-L_PICSTR_ADDR



  IN_IOSB:        .BLKL   2

  TT_CHAN:        .BLKW   1

  INBUF:          .BLKB   INBUF_LEN

  SYSINPUT:       .ASCID  /SYS$INPUT/

          .ENTRY  READ_VERIFY,^M<>

  ;

  ; назнAчить канал на SYS$INPUT

  ;

          $ASSIGN_S -




                           - 269 -

                       00152-01 33 03-1


                  CHA = TT_CHAN -

                  DEVNAM = SYSINRUT        ;SYS$INPUT

          BLBC    R0,ERROR                 ;переход по ошибке



  ;

  ; очистить экран

  ;

          CLRQ    -(SP)

          CALLS   #2,G^SCR$ERASE_PAGE

          BLBC    R0,ERROR



  ;

  ; выполнить чтение с выравниванием справа

  ;

          PUSHL   #R_ITEM_LIST_LEN

          PUSHAB  R_ITEM_LIST

          CALLS   #2,DO_READ

          BLBC    R0,ERROR



  ;

  ; выполнить чтение с выравниванием слева

  ;

          PUSHL   $L_ITEM_LIST_LEN

          PUSHAB  L_ITEM_LIST

          CALLS   #2,DO_READ

          BLBC    R0,ERROR






                           - 270 -

                       00152-01 33 03-1


  ERROR:

          RET

  ;++

  ;

  ; DO_READ - выполнить макрокоманду $QIO

  ;

  ; входные параметры:

  ;

  ;       4(AP) - адрес списка элементов

  ;       8(AP) - длина списка элементов

  ;

  ;--

   .ENTRY DO_READ, ^M<>

          $QIOW_S CHAN = TT_CHAN -

                  FUNC = #<IO$_READVBLK!IO$M_EXTEND>,-

                  IOSB = IN_IOSB, -

                  P1 = INBUF,-

                  P2 = #INBUF_LEN,-

                  P5 = 4(AP),-

                  P6 = 8(AP)

          BLBC    R0,10$                  ; переход по ошибке



          ; .

          ; .  Направить ввод...

          ; .

  10$:    RET






                           - 271 -

                       00152-01 33 03-1


          .END READ_VERIFY




         5. Драйверы накопителей на магнитных дисках



       Все накопители на магнитных дисках обеспечивают файло-

  вые структуры уровня 1 и уровня 2. Доступ к  этим  файловым

  структурам осуществляется через стандартные команды MOUNT и

  INITIALIZE, за которыми следуют вызовы  системы  управления

  данными СУД-32. Файлы в формате рафос могут быть  прочитаны

  или записаны при помощи утилиты EXCHANGE.



       5.1. Характерные  свойства   и   возможности

            драйверов. Средства контроля


       Драйверы накопителей на магнитных дисках  операционной

  системы МОС ВП обеспечивают следующие возможности:

       - подключение к эвм СМ  1700  нескольких  Kонтроллеров

         одного и того же типа;

       - подключение нескольких дисководов к одному  контрол-

         леру (количество зависит от устройств);

       - различные типы дисководов на одном контроллере;

       - совмещаемое  позиционирование  (за  исключением   см

         5218);

       - контроль данных на базе запроса, файла и/или тома;

       - полное восстановление после сбоя питания для  диско-

         водов со смонтированными томами в  состоянии  готов-

         ности;




                           - 272 -

                       00152-01 33 03-1


       - расширенные алгоритмы исправления ошибок;  например,

         коррекция кода ошибки и смещения (за исключением  см

         5218).

       - средства для замены сбойных блоков;

       - регистрацию ошибок устройства в файле, который может

         быть воспроизведен на экране специалистами по обслу-

         живанию и эксплуатации;

       - обеспечение диагностики в состоянии  готовности  для

         диагностики на уровне дисковода;

       - многоблочные, независимые, виртуальные операции вво-

         да - вывода на уровне устройства управления.



       5.1.1. Контроль данных


       Контроль данных производится после успешного  заверше-

  ния операции чтения или записи, чтобы гарантировать их сов-

  падение.

       Драйверы для накопителей на магнитных дисках обеспечи-

  вают проверки данных на трех уровнях:

       1) на уровне  зAпроса  -  пользователь  может  указать

  модификатор функции контроль данных (IO$M_DATACHECK)  после

  операции чтения логического блока, записи логического  бло-

  ка, чтения виртуального блока, записи  виртуального  блока,

  чтения физического блока, или записи физического блока;

       2) на уровне тома - пользователь может указать  харак-

  теристики "проверка данных всех считываний"  или  "проверка

  данных всех записей", когда том монтируется;





                           - 273 -

                       00152-01 33 03-1


       3) на уровне файла - пользователь может указать  атри-

  буты доступа к файлу "проверка данных после чтения" и "про-

  верка данных после записи". Атрибуты доступа к файлу указы-

  ваются при обращении к файлу.

       При контроле данных возможно выполнение корректирующе-

  го смещения головок, а коррекция кода корректируемой ошибки

  (ЕСС) не выполняется. (далее по тексту ECC). Это  означает,

  что, если выполняется операция чтения и  используется  кор-

  рекция есс, проверить данные не удается, даже если данные в

  памяти являются правильными. В этом случае драйвер  возвра-

  щает код состояния, указывающий, что операция была заверше-

  на успешно, но проверка данных не могла быть выполнена.

       Контроль данных после операций чтения является чрезвы-

  чайно редким и пользователи  могут  либо  принимать  данные

  такими, какие они  есть,  рассматривая  коррекцию  ЕСС  как

  ошибку,либо принять данные, но сразу же перенести их в дру-

  гую область тома на диске.

       Операция контроля данных, предназначенная для консоль-

  ного накопителя, не сравнивает данные в памяти с данными на

  магнитной ленте. Вместо этого выполняется операция проверки

  чтения или проверки записи (пп. 5.3.1, 5.3.2).



       5.1.2. Совмещаемое позиционирование


       Операция совмещаемого позиционирования включает  пере-

  мещение головок чтения/записи в заданное место на диске без

  какой-либо передачи данных. Неявная операция позиционирова-

  ния предшествует всем функциям передачи,  включая  проверки



                           - 274 -

                       00152-01 33 03-1


  данных (исключая случай, когда позиционирование запрещается

  модификатором     функции     физического      ввода-вывода

  IO$M_INHSEEK). Операции позиционирования могут  совмещаться

  нA всех дисKоводах, кроме см  5218.  То  есть,  когда  один

  дискOвод выполняет операцию пOзиционирования,  любое  коли-

  чество других дисководов  также  может  выполнять  оперAции

  пOзиционирования.

       Во время операции позиционирования контроллер свободен

  для выполнения передач на других устройствах.  Таким  обра-

  зом, операции позиционирования могут  также  совмещаться  с

  операциями передачи данных. Например, в любой момент време-

  ни на одном контроллере могут осуществляться семь  операций

  позиционирOвания и одна передача данных.

       Такое совмещение является возможным из-за того, что  в

  отличие от операций ввода-вывода, операции позиционирOвания

  не требуют контроллера сразу же. Поэтому  они  инициируются

  перед передачами ввода-вывода и другими функциями,  которым

  контроллер требуется на длительные периоды времени.



       5.1.3. Исправление ошибок


       Исправление ошибок в операционной системе МОС ВП наце-

  лено на выполнение всех возможных  операций  для  успешного

  завершения операции ввода-вывода. Операции исправления оши-

  бок разделяются на четыре категории:

       1) отрабока специальных условий, таких, как сбой  нап-

  ряжения питания и прерывание по тайм-ауту;





                           - 275 -

                       00152-01 33 03-1


       2) повторные попытки выполнения операции  ввода-вывода

  при исправимых ошибках дисковода и/или контроллера;

       3) применение информации,  корректирующей  ошибки  (не

  применяется для накопителей типа см 5218);

       4) попытка усилить записанные сигналы смещением  голо-

  вок чтения.

       Алгоритм исправления ошибок использует комбинацию этих

  четырех типов операций исправления ошибок для  того,  чтобы

  завершить операцию ввода-вывода.

       Восстановление после сбоя питания заключается  в  том,

  что после того как монтируемые дисководы перейдут в состоя-

  ние готовности, операция ввода-вывода, которая  осуществля-

  лась в то время,когда произошел сбой  питания,  выполняется

  повторно.

       Тайм-аут  устройства  рассматривается  как  исправимая

  ошибка.  Операция,  которая  осуществлялась,  когда   истек

  тайм-аут, выполняется повтOрно до восьми  раз,  прежде  чем

  возвращается ошибка по тайм-ауту.

       При исправимых ошибках контроллера/дисковода  операция

  просто выполняется повторно до восьми раз, прежде чем возв-

  ращается неисправимая ошибка.

       Исправление  всех  нормальных  ошибок   (неспециальные

  условия) может быть запрещено путем  указания  модификатора

  функции запрещения повторной попытки (IO$M_INHRETRY).  Дан-

  ный модификатор не влияет на  процедуру  восстановления  по

  сбою питания и тайм-ауту устройств.






                           - 276 -

                       00152-01 33 03-1


       5.1.3.1. Пропуск сектора


       Пропуск сектора - это способ обработки сбойного блока,

  осуществляемый на дисководах типа см 5504. На каждой дорож-

  ке из 32 секторов, один  сектор  резервируется  для  замены

  сбойного блока. Следовательно, с точки зрения пользователя,

  накопитель типа см 5504 имеет только 31 сектор на  дорожке.

  Программа системного обслуживания $GETDVI возвращает именно

  это значение.

       Сбойные блоки могут быть обнаружены при форматировании

  диска. Большинство форматтеров помещает такие блоки в  файл

  сбойных блоков. Вместо этого на накопителе  типа  см  5504,

  первый сбойный блок, встреченный на  дорожке,  обозначается

  как пропускаемый сектор. Это  выполняется  путем  установки

  флага в заголовке сектора на диске и помещения блока в фAйл

  пропускаемых секторов.

       Когда пропускаемый сектор встречается во время переда-

  чи данных, он  пропускается,  и  все  оставшиеся  блоки  на

  дорожке сдвигаются на один физический блок. Например,  если

  блок с номером 10 входит в пропускаемый сектор и запрос  на

  передачу был сделан, начиная с блока 8 на 4 блока, то будут

  переданы блоки 8, 9, 11 и 12. Блок 10 будет "пропущен".

       Так как  пропуск  секторов  осуществляется  на  уровне

  драйвера устройства, это незаметно  для  пользователя.  Для

  пользователя устройство имеет  31,  физически  непрерывный,

  сектор на дорожке. Сектор 32  не  является  непосредственно

  адресуемым, хотя он будет доступен, если пропускаемый  сек-

  тор присутствует на дорожке.



                           - 277 -

                       00152-01 33 03-1


       5.2. Информация об устройствах


       Пользователь может получить информацию о характеристи-

  ках всех накопителей на магнитных дисках,  используя  прог-

  рамму системного обслуживания $GETDVI.

       Программа системного обслуживания  $GETDVI  возвращает

  характеристики  накопителя  на  магнитном  диске   в   поля

  DVI$_DEVCHAR и DVI$_DEVCHAR2.

       Перечень характеристик накопителя на  магнитном  диске

  приводится в табл. 32.

                                                   Таблица 32

         Характеристики накопителя на магнитном диске

  -----------------------------------------------------------

    Характеристика   !      Назначение

  -----------------------------------------------------------

                  2) !

   DEV$M_AVL         ! Устройство подключено и свободно

               1),2) !

   DEV$M_CLU         ! Кластерное устройство

                  2) !

   DEV$M_FOR         ! Том, отличный по формату от тома с

                     ! файловой структурой операционной

                     ! системы МОС ВП

                  2) !

   DEV$M_MNT         ! Смонтированный том

                  2) !

   DEV$M_RCK         ! Выполнение контроля данных для всех




                           - 278 -

                       00152-01 33 03-1


                                         Продолжение табл. 32

  -----------------------------------------------------------

    Характеристика   !      Назначение

  -----------------------------------------------------------

                     ! операций чтения

                  2) !

   DEV$M_WCK         ! Выполнение контроля данных для всех

                     ! операций записи

               1),2) !

   DEV$M_MSCP        ! Устройство доступно для работы по

                     ! протоколу управления массовой памятью

                  2) !

   DEV$M_RCT         ! Накопитель содержит таблицу замены

                     ! и запасных блоков

               1),2) !

   DEV$M_SRV         ! Устройство обслуживается по протоколу

                     ! управления массовой памятью (MSCP)

                  3) !

   DEV$M_FOD         ! Устройство ориентированное на файл

                  3) !

   DEV$M_IDV         ! Устройство готово к вводу

                  3) !

   DEV$M_ODV         ! Устройство готово к выводу

                  3) !

   DEV$M_RND         ! Устройство с произвольным доступом

                  3) !

   DEV$M_SHR         ! Разделяемое устройство




                           - 279 -

                       00152-01 33 03-1


  -----------------------

       1) эти разряды помещаются в поле DVI$_DEVCHAR2.

       2) динамический бит (устанавливается по условию).

       3) статический бит (всегда установлен).

       Динамические и  статические  биты  характеристик  уст-

  ройств определяются макрокомандой $DEVDEF.

       DVI$_DEVBUFSIZ возвращает размер буфера. Размер буфера

  принимает значение по умолчанию при  обмене  информацией  с

  диском (обычно значение по умолчанию равно 512 байтам).

       DVI$_DEVTYPE и DVI$_DEVCLASS возвращают тип накопителя

  на магнитном диске и имя класса, которые определяются  мак-

  рокомандой $DCDEF. Тип устройства определяется типом  нако-

  пителя. Класс устройства для накопителей на магнитном диске

  - DS$_DISK.

       DVI$_CYLINDERS сообщает о количестве цилиндров на томе

  (то есть, на диске), DVI$_TRACKS сообщает количество  доро-

  жек на цилиндре, и DVI$_SECTORS сообщает количество  секто-

  ров на дорожке. Значения параметров возвращаются десятичным

  числом длиной 4 байта.

       DVI$_MAXBLOCK возвращает максимальное количество  бло-

  ков (1 блок=512 байт), которое содержится в томе (т.е.,  на

  диске).  Значения  возвращаются  десятичным  числом  длиной

  четыре байта.



       5.3. Коды функций  накопителя  на  магнитном

            диске






                           - 280 -

                       00152-01 33 03-1


       Драйвер диска в системе МОС ВП может  выполнять  логи-

  ческие, виртуальные  и  физические  операции  ввода-вывода.

  Логические и физические операции ввода-вывода  обеспечивают

  доступ к тому и требуют,  чтобы  выполняемый  процесс  имел

  доступ к тому. Виртуальные  операции  ввода-вывода  требуют

  вмешательства вспомогательного управляющего процесса  (ACP)

  или расширенной обработки запроса QIO. Нормальная процедура

  создает файл и обеспечивает доступ к нему. Затем информация

  записывается в файл, и доступ к файлу  прекращается.  Впос-

  ледствии доступ к файлу открывается, информация читается, и

  доступ к файлу прекращается. Файл удаляется, если  информа-

  ция более не используется.

       Результат    логических    и    физических    операций

  ввода-вывода непредсказуем, если присутствует вспомогатель-

  ный управляющий процесс или расширенная  обработка  запроса

  QIO.

       В одном запросе ввода-вывода можно прочитать  и  запи-

  сать до 65535 байт. Размер  передачи  ограничивается  также

  количеством страниц, которые процесс может выделить в рабо-

  чем наборе и закрепить в физической памяти (следует иметь в

  виду, что драйвер  накопителя  обеспечивает  любые  функции

  управления памятью  подобного  типа).  Размер  передачи  не

  зависит   от   используемых    квот    (счетчика    прямого

  ввода-вывода, счетчика буферизованного ввода-вывода,  огра-

  ничения счетчика  AST  прерывания).  Эти  квоты  лимитируют

  количество выполняемых операций ввода-вывода каждого  типа,

  а не размер фактической операции ввода-вывода. Том, к кото-




                           - 281 -

                       00152-01 33 03-1


  рому выполняется обращение  с  логической  или  виртуальной

  функцией, должен быть предварительно смонтирован. Если  том

  не смонтирован, в блок состояния ввода-вывода будет возвра-

  щен код "устройство  не  монтировано"  или  "несуществующий

  том".

       В табл. 33 приводится список логических, физических  и

  виртуальных функций ввода-вывода для диска и  коды  функций

  этих операций.

                                                   Таблица 33

    Функции ввода-вывода для накопителя на магнитном диске

  -----------------------------------------------------------

    Код функции  и   ! Модификатор  !    Действие

      аргументы      !   функции    !

  -----------------------------------------------------------

                  1) !              !

  IO$_CREATE         ! IO$M_CREATE  ! Создает элемент катало-

  Р1,[P2],[P3],[P4],-! IO$M_ACCESS  ! га или файл

  [Р5]               ! IO$M_DELETE  !

                  1) !              !

  IO$_ACCESS         ! IO$M_CREATE  ! Поиск файла по каталогу

  P1,[P2],[P3],[P4],-! IO$M_ACCESS  ! и доступ к файлу, если

  [Р5]               !              ! он найден

                  1) !              !

  IO$_DEACCESS       !              ! Отмена доступа к файлу

  P1,[P2],[P3],[P4],-!              ! и, если задано, запись

  [Р5]               !              ! конечных атрибутов в

                     !              ! заголовок файла




                           - 282 -

                       00152-01 33 03-1


                                         Продолжение табл. 33

  -----------------------------------------------------------

    Код функции  и   ! Модификатор  !    Действие

      аргументы      !   функции    !

  -----------------------------------------------------------

                  1) !              !

  IO$_MODIFY         !              ! Модификация атрибутов

  P1,[P2],[P3],[P4],-!              ! файла и/или размещения

  [Р5]               !              !

                  1) !              !

  IO$_DELETE         ! IO$M_DELETE  ! Удаление элемента ката-

  P1,[P2],[Р3],[Р4],-!              ! лога и/или  заголовка

  [Р5]               !              ! файла

                  1) !              !

  IO$_ACPCONTROL     ! IO$M_DMOUNT  ! Выполнение различных

  P1,[Р2],[Р3],[Р4],-!              ! функций управления

  [Р5]               !              !

                  1) !              !

  IO$_READVBLK       !IO$M_DATACHECK! Чтение виртуального

  P1,P2,P3           !IO$M_INHRETRY ! блока

                  2) !              !

  IO$_READLBLK       !IO$M_DATACHECK! Чтение логического

  P1,P2,P3           !IO$M_INHRETRY ! блока

                  3) !              !

  IO$_READPBLK       !IO$M_DATACHECK! Чтение физического

  P1,P2,P3           !IO$M_INHRETRY ! блока

                     !IO$M_INHSEEK  !




                           - 283 -

                       00152-01 33 03-1


                                         Продолжение табл. 33

  -----------------------------------------------------------

    Код функции  и   ! Модификатор  !    Действие

      аргументы      !   функции    !

  -----------------------------------------------------------

                  1) !              !

  IO$S_WRITEVBLK     !IO$M_DATACHECK! Запись виртуального

  P1,P2,P3           !IO$M_ERASE    ! блока

                     !IO$M_INHRETRY !

                  2) !              !

  IO$_WRITELBLK      !IO$M_DATACHECK! Запись логического

  р1,р2,р3           !IO$M_ERASE    ! блока

                     !IO$M_INHRETRY !

                  3) !              !

  IO$_WRITEPBLK      !IO$M_DATACHECK! Запись физического

  Р1,Р2,Р3           !IO$M_ERASE    ! блока

                     !IO$M_INHRETRY !

                     !IO$M_INHSEEK  !

                  3) !              !

  IO$_WRITECHECK     !              ! Проверка данных, запи-

  P1,P2,P3           !              ! санных на диск пред-

                     !              ! шествующей макрокоман-

                     !              ! дой QIO

                  2) !              !

  IO$_SENSEMODE      !              ! Считывание зависящих

                     !              ! от устройства харак-

                     !              ! теристик и возвращение




                           - 284 -

                       00152-01 33 03-1


                                         Продолжение табл. 33

  -----------------------------------------------------------

    Код функции  и   ! Модификатор  !    Действие

      аргументы      !   функции    !

  -----------------------------------------------------------

                     !              ! их в блок состояния

                     !              ! ввода-вывода

                  3) !              !

  IO$_SENSECHAR      !              ! Считывание зависящих от

                     !              ! устройства характерис-

                     !              ! тик и возвращение их в

                     !              ! блок состояния ввода-

                     !              ! вывода

                  3) !              !

  IO$_SEARCH P1      !              ! Поиск указанного блока

                     !              ! или сектора (только

                     !              ! для консольного накопи-

                     !              ! теля)

                  3) !              !

  IO$_PАCKACK        !              ! Подтверждение пакета

                  3) !              !

  IO$_AVAILABLE      !              ! Сброс действительности

                     !              ! тома

                  3) !              !

  IO$_UNLOAD         !              ! Разгрузка тома

                  3) !              !

  IO$_SEEK P1        !              ! Поиск указанного ци-




                           - 285 -

                       00152-01 33 03-1


                                         Продолжение табл. 33

  -----------------------------------------------------------

    Код функции  и   ! Модификатор  !    Действие

      аргументы      !   функции    !

  -----------------------------------------------------------

                     !              ! линдра

  ----------------------

       1) виртуальная функция.

       2) логическая функция.

       3) физическая функция.

       Функционально-зависящими аргументами  для  IO$_CREATE,

  IO$_ACCESS, IO$_DEACCESS, IO$_MODIFY, IO$_DELETE являются:

       1) Р1 - адрес дескриптора блока FIB;

       2) Р2 - адрес дескриптора строки имени файла (необяза-

  тельный аргумент). Если аргумент  указан,  имя  вводится  в

  каталог, определяемый блоком FIB;

       3) Р3 - адрес слова, в которое  будет  записана  длина

  полученной строки имени файла (необязательный аргумент);

       4) Р4 - адрес  дескриптора  буфера,  в  который  будет

  записана  полученная  строка  имени  файла  (необязательный

  аргумент);

       5) Р5 - адрес списка дескрипторов атрибутов  (необяза-

  тельный аргумент). Если аргумент определен, указанные атри-

  буты читаются (IO$_ACCESS), или  записываются  (IO$_CREATE,

  IO$_DEACCESS и IO$_MODIFY).

       Функционально-зависящими аргументами для IO$_READLBLK,

  IO$_READVBLK, IO$_WRITELBLK, IO$_WRITEVBLK являются:




                           - 286 -

                       00152-01 33 03-1


       1) Р1 - начальный виртуальный  адрес  буфера,  который

  должен принимать данные в случае операции  чтения,  или,  в

  случае операции записи, виртуальный адрес  буфера,  который

  должен быть записан на диск;

       2) P2 - количество байтов, которое должно быть считано

  с диска, или записано на диск;

       3) Р3 - начальный виртуальный/логический адрес  данных

  на диске, которые должны быть переданы  в  случае  операции

  чтения; или, в случае операции  записи,  адрес  области  на

  диске, которая должна принять данные. В виртуальном  чтении

  или записи адрес выражается в виде номера блока внутри фай-

  ла (номера виртуальных блоков преобразуются в номера  логи-

  ческих блоков через отображающие окна, устанавливаемые про-

  цессом аср системы управления файлами). В логическом чтении

  или записи адрес выражается в виде номера блока относитель-

  но начала диска.

       Функционально-зависимыми   аргументами   для   функций

  IO$_WRITEVBLK, IO$_WRITELBLK  и  IO$_WRITEPBLK,  включающих

  модификатор функции IO$M_ERASE, являются:

       1) P1 - начальный виртуальный адрес буфера, содержаще-

  го 4-байтовый указываемый  пользователем  шаблон  стирания.

  Если адрес Р1 равен 0, в качестве шаблона стирания  исполь-

  зуется нулевое длинное слово. Если адрес Р1 не равен  нулю,

  содержимое  четырех  байтов,  начиная  с  данного   адреса,

  используется в  качестве  шаблона  стирания.  Рекомендуется

  указывать нулевое значение адреса для предотвращения  пере-

  полнения;




                           - 287 -

                       00152-01 33 03-1


       2) P2 - количество байтов шаблона стирания  записывае-

  мых на диск. Указанное число округляется до верхней границы

  блока (512 байтов);

       3) Р3 - начальный виртуальный, логический или физичес-

  кий адрес стираемых данных на диске.

       Функционально-зависимыми        аргументами        для

  IO$_WRITECHECK, IO$_READPBLK и IO$_WRITEPBLK являются:

       1) Р1 - начальный виртуальный  адрес  буфера,  который

  должен принимать данные в случае операции  чтения,  или,  в

  случае операции записи, начальный виртуальный адрес буфера,

  который должен быть записан на диск;

       2) Р2 - количество байтов, которое должно быть считано

  с диска, или записано на диск;

       3) Р3 - начальный физический адрес на диске  для  дан-

  ных, которые должны быть прочитаны в случае  операции  чте-

  ния; или, в случае операции  записи,  начальный  физический

  адрес области на диске, которая  должна  принимать  данные.

  Адрес выражается в виде сектора, дорожки и цилиндра в  фор-

  мате, показанном на рис. 32.


                 Начальный физический адрес

       31                    16  15     8  7         0
      +----------------------------------------------+
  р3: !       Цилиндр          ! Дорожка  !  Сектор  !
      +----------------------------------------------+

                            Рис. 32


       Функционально-зависимым  аргументом   для   IO$_SEARCH

  является:





                           - 288 -

                       00152-01 33 03-1


           Р1 - физический адрес на диске для позиционирова-

                ния по этому адресу. Адрес выражается в виде

                сектора, дорожки и цилиндра в формате, пока-

                занном на рис. 32.

       Функционально-зависимым   аргументом   для    IO$_SEEK

  является:

           Р1 - номер физического цилиндра для позициониро-

                вания головки (головок) на этот цилиндр.

                Адрес выражается в формате, показанном

                на рис. 33.



             Формат физического номера цилиндра

    31                      16 15                     0
    +-------------------------------------------------+
    !      Не используется    !      Цилиндр          !
    +-------------------------------------------------+

                            Рис. 33


       5.3.1. Чтение


       Функция чтения считывает данные с диска в определенный

  буфер, начиная с указанного адреса на диске.

       Операционная система  МОС  ВП  обеспечивает  три  кода

  функции чтения:

       1) IO$_READVBLK - чтение виртуального блока;

       2) IO$_READLBLK - чтение логического блока;

       3) IO$_READPBLK - чтение физического блока.

       Если функция чтения виртуального блока предназначается

  для тома,  который  монтируется  как  "чужой",  то  функция

  преобразуется для чтения логического  блока.  Если  функция



                           - 289 -

                       00152-01 33 03-1


  чтения виртуального блока предназначается для тома, который

  монтируется как том со стандартной файловой структурой,  то

  функция не преобразуется.

       С      этими       кодами       используются       три

  функционально-зависимых аргумента:

       1) Р1 - адрес буфера;

       2) Р2 - размер считываемой записи;

       3) Р3 - место считываемой записи на диске.

       Модификатор функции проверки  данных  (IO$M_DATACHECK)

  может быть использован со всеми функциями чтения. Если дан-

  ный модификатор указывается, то  операция  проверки  данных

  выполняется после того,  как  завершится  операция  чтения.

  Операция проверки данных выполняется также в  случае,  если

  том, который был прочитан, или том, на котором  размещается

  файл (виртуальное чтение), имеет  характеристику  "проверка

  данных всех считываний". Кроме того, проверка данных выпол-

  няется после виртуального считывания, если файл имеет атри-

  бут "проверка данных при чтении".

       Модификатор функции проверки данных  может  возвращать

  пять  кодов  завершения  в  блок  состояния   ввода-вывода:

  SS$_NORMAL,   SS$_CTRLERR,   SS$_DRVERR,    SS$_MEDOFL    и

  SS$_MONEXDRV. Ели ошибок не обнаруживается, дAнные на диске

  или на ленте считаются достоверными.

       Модификатор  функции  запрещения   повторной   попытки

  (IO$M_INHRETRY) может быть использован со  всеми  функциями

  чтения. Если данный модификатор  указывAется,  все  попытки

  исправить ошибку подавляются. IO$M_INHRETRY  имеет  больший




                           - 290 -

                       00152-01 33 03-1


  приоритет по сравнению с IO$M_DATACHECK.  Если  указываются

  оба модификатора и происходит ошибка, то не делается  попы-

  ток исправить ошибку и  не  выполняется  операция  проверки

  данных.



       5.3.2. Запись


       Функция записи записывает данные из указанного  буфера

  на диск, начиная с указанного адреса на диске.

       Операционная система МОС ВП обеспечивает три  функцио-

  нальных кода записи:


        1) IO$_WRITEVBLK - запись виртуального блока;

        2) IO$_WRITELBLK - запись логического блока;

        3) IO$_WRITEPBLK - запись физического блока.


       Если функция записи виртуального блока предназначается

  для тома, который монтируется как "чужой", функция преобра-

  зуется для записи логического блока.  Если  функция  записи

  виртуального блока предназначается для тома, который монти-

  руется, как том  со  стандартной  файловой  структурой,  то

  функция не преобразуется.

       С      этими       кодами       используются       три

  функционально-зависимых аргумента:

       1) Р1 - адрес буфера;

       2) Р2 - размер буфера;

       3) Р3 - определяет место записи на диске.

       Модификатор функции проверки  данных  (IO$M_DATACHECK)

  может быть использован со всеми функциями записи. Если дан-



                           - 291 -

                       00152-01 33 03-1


  ный модификатор указывается, то  операция  проверки  данных

  выполняется после того,  как  завершится  операция  записи.

  Операция проверки данных выполняется также в  случае,  если

  записанный том, или том, на котором размещается файл  (вир-

  туальная запись),  имеет  характеристику  "проверка  данных

  всех записей". Кроме того, проверка данных выполняется пос-

  ле виртуальной записи, если файл  имеет  атрибут  "проверка

  данных после записи".

       Модификатор  функции  запрещения   повторной   попытки

  (IO$M_INHRETRY) может быть использован со  всеми  функциями

  записи. Если данный модификатор  указывается,  все  попытки

  испрAвления ошибки запрещаются. IO$M_INHRETRY  имеет  более

  высокий приоритет по сравнению с IO$M_DATACHECK. Если  ука-

  зываются  оба  модификатора  и  происходит  ошибка,  то  не

  делается никаких попыток исправить ошибку и не  выполняется

  никакая операция проверки данных.

       Модификатор IO$M_ERASE может использоваться  со  всеми

  функциями записи для стирания части диска, указанной  поль-

  зователем.



       5.3.3. Считывание режима


       Функции считывания режима получают зависимые  от  уст-

  ройства характеристики конкретного накопителя на  магнитных

  дисках и возвращают их в вызывающую  программу,  во  второе

  длинное слово блока состояния ввода-вывода  (см.  подраздел

  5.4). Операционная система МОС  ВП  обеспечивает  два  кода

  функции:



                           - 292 -

                       00152-01 33 03-1


       1) IO$_SENSEMODE - считывание характеристик;

       2) IO$_SENSECHAR - считывание характеристик.


       IO$_SENSEMODE является логической функцией  и  требует

  привилегию доступа, необходимую для выполнения  физического

  ввода-вывода. Ни с одной из функций не используются зависи-

  мые от устройства и функции аргументы.



       5.3.4. Поиск


       Функция поиска позиционирует консольный накопитель  на

  магнитной ленте типа  см  5218  на  указанный  блок.  Поиск

  является функцией физического ввода-вывода и требует приви-

  легию  доступа,  необходимую  для  выполнения   физического

  ввода-вывода.  Операционная  система  МОС  ВП  обеспечивает

  единственный код функции:

           IO$_SEARCH.

       Данный    код     функции     использует     следующий

  функционально-зависимый аргумент:

           P1 - указывает место, на которое должна быть по-

                зиционирована магнитная лента. Младший байт

                содержит номер сектора в диапазоне 0-127;

                старший бйт содержит номер дорожки в

                диапазоне 0-3.

       Функция IO$_SEARCH позволяет  сэкономить  время  между

  операциями чтения и записи. Например, для того, чтобы  пол-

  ностью перемотать ленту, требуется около  30  секунд.  Если

  последняя операция чтения или записи была  близко  к  концу




                           - 293 -

                       00152-01 33 03-1


  ленты, а следующая операция будет близко к началу ленты, то

  операция поиска может начаться после того,  как  завершится

  последняя операция, и лента будет перематываться, в то вре-

  мя как процесс занимается чем-то другим.



       5.3.5. Подтверждение пакета


       Функция подтверждения пакета устанавливает бит  дейст-

  вительности для всех накопителей на магнитных дисках. Подт-

  верждение пакета является функцией физического ввода-вывода

  и  требует  привилегию  PHY_IO.  Эта  функция  корректирует

  информацию, зависимую от устройства и возвращаемую програм-

  мой  системного  обслуживания  $GETDVI,  то  есть  значения

  DVI$_MAXBLOCK, DVI$_TRACKS,  DVI$_SECTORS,  DVI$_CYLINDERS,

  DVI$_CLASS,  DVI$_DEVTYPE.  Допускается  единственный   код

  функции:

           IO$_PACKACK.

       Данная     функция     не      использует      никаких

  функционально-зависимых аргументов.

       Функция  IO$_PACKACK  должна  быть  первой   функцией,

  используемой, когда том  помещается  на  дисковод.  Функция

  IO$_PACKACK выдается автоматически, когда выдаются  команды

  INITIALIZE или MOUNT.



       5.3.6. Разгрузка


       Функция разгрузки очищает  бит  действительности  тома

  для всех дисковых устройств и выдает драйверу команду разг-




                           - 294 -

                       00152-01 33 03-1


  рузки (то есть отключает  данный  том).  Функция  разгрузки

  выполняет действие, обратное функции  подтверждения  пакета

  (см. п. 5.3.5). Допускается единственный код функции:

           IO$_UNLOAD.

       Данная функция не поддерживает  аргументов,  зависящих

  от функции.



       5.3.7. Доступность


       Функция доступности очищает бит действительности  тома

  для всех дисковых устройств, то  есть  выполняет  действие,

  обратное функции подтверждения пакета (см. п. 5.3.5). Драй-

  веру не выдается команда разгрузки, поэтому эти устройства,

  готовые к отключению, не отключаются.  Допускается  единст-

  венный код функции:

           IO$_AVAILABLE.

       Данная функция не поддерживает  аргументов,  зависящих

  от функции.



       5.3.8. Установка


       Функция   установки   вызывает   перемещение   головок

  чтения/записи на цилиндр, указанный в аргументе Р1  (раздел

  5.3, п. 5.1.2, и рис.  33).  Допускается  единственный  код

  функции:

           IO$_SEEK.








                           - 295 -

                       00152-01 33 03-1


       5.3.9. Проверка записи


       Функция проверки записи проверяет правильность  записи

  данных на диск. Проверяемые  данные  адресуются  с  помощью

  физических  средств  адресации,  т.е.  сектора,  дорожки  и

  цилиндра (см. рис. 32). Операционная система МОС ВП обеспе-

  чивает единственный код функции:

           IO$_WRITECHECK.

       Прежде,  чем  выдавать  данную  команду,  должна  быть

  использована функция QIO записи, чтобы записать  данные  на

  диск. Функция IO$_WRITECHECK затем читает тот же самый блок

  данных и сравнивает их с данными в указанном буфере. С этим

  кодом используются три функционально-зависимых аргумента:

       1) р1 - адрес буфера;

       2) р2 - размер буфера

       3) р3 - место записи на диске.

       Функция IO$_WRITECHECK аналогична модификатору функции

  IO$M_DATACHECK для функций  записи  макрокоманды  $QIO,  за

  исключением того, что IO$_WRITECHECK не  записывает  данные

  на диск; функция указывается после того, как данные записа-

  ны отдельной макрокомандой $QIO.

       Непривилегированные процессы могут использовать  моди-

  фикатор IO$M_DATACHECK с функцией IO$_WRITEVBLK (не требую-

  щей привилегированного доступа) для определения правильнос-

  ти записи данных.

       Функция проверки записи и модификатор функции проверки

  данных для консольного накопителя на магнитной  ленте  типа

  см 5218 могут возвращать шесть кодов завершения в блок сос-



                           - 296 -

                       00152-01 33 03-1


  тояния ввода-вывода: SS$_NORMAL,  SS$_CTRLERR,  SS$_DRVERR,

  SS$_MEDOFL, SS$_MONEXDRV, SS$_WRTDCK.



       5.4. Блок состояния ввода-выводA


       Блок состояния ввода-вывода (IOSB)  для  всех  функций

  макрокоманды $QIO для накопителя на  магнитных  дисках,  за

  исключением функции считывания режима показан на  рис.  34.

  Блок состояния ввода-вывода для функции  считывания  режима

  показан на рис. 35. Коды завершения для всех функций и уст-

  ройств перечислены в приложении 1.


        Содержимое блока состояния ввода-вывода

    31                    16 15                      0
    +-------------------------------------------------+
    !    Счетчик байтов     !          Код            !
    !     (младшее слово)   !       завершения        !
    +-------------------------------------------------+
    !          0            !   Счетчик байтов        !
    !                       !   (старшее слово)       !
    +-------------------------------------------------+

                            Рис. 34



            Содержимое блока состояния ввода-вывода

                   (считывание режима)

    31                    16 15         8  7          0
    +-------------------------------------------------+
    !          0            !   Код  завершения       !
    +-------------------------------------------------+
    !      Цилиндры         !  Дорожки    !  Сектора  !
    +-------------------------------------------------+

                            Рис. 35


       Счетчик байтов - 32-х битовое целое число, дающее фак-

  тическое количество байтов, передаваемых в буфер  процесса,



                           - 297 -

                       00152-01 33 03-1


  или из буфера процесса.

       Второе длинное слово блока состояния ввода-вывода  для

  функции считывания режима возвращает информацию о количест-

  ве цилиндров, дорожек и секторов для конкретного  устройст-

  ва.



       5.5. Пример программирования


       В данном подразделе рассматривается  пример  программы

  оптимизации времени доступа к  файлу  на  диске.  Программа

  создает файл, используя систему управления данными  СУД-32,

  запоминает информацию, касающуюся файла, и закрывает  файл.

  Затем программа получает доступ к файлу и читает из  файла,

  или записывает в файл, используя программу системного  обс-

  луживания $QIOW.

       Пример.

           .TITLE EXAMPLE



           .IDENT  /01/





  ;

  ; определение необходимых символов

  ;

           $FIBDEF         ;определение смещений блока FIB

           $IODEF          ;определение кодов функций вво-

                           ;да-вывода

           $RMSDEF         ;определение значений кодов сос-



                           - 298 -

                       00152-01 33 03-1


                           ;тояния системы управления данными

                           ;СУД-32

  ;

  ;

  ; определение числа записей, которые должны

  ; быть обработаны

  ;



  NUM_RECS=100                            ;сто записей

  ;

  ;распределение памяти для необходимых

  ;структур данных

  ;

  ; распределение блока доступа к файлу

  ;

  ;блок доступа к файлу требуется системе управления

  ;данными (СУД-32) для открытия и закрытия файла

  ;

  FAB_BLOCK:

      $FAB     ALQ=100,-      ;начальный размер файла должен

                              ;быть равен 100 блокам

               FAC=PUT,-      ;тип доступа к файлу

               FNA=FILE_NAME,-;адрес строки имени  файла

               FNS=FILE_SIZE,-;размер строки имени файла

               FOP=CTG,-      ;файл должен быть непрерывным

               MRS=512,-      ;максимальный размер записи

                              ;равен 512 байтам




                           - 299 -

                       00152-01 33 03-1


               NAM=NAM_BLOCK,-;адрес блока имени файла

               ORG=SEQ,-      ;организация файла должна быть

                              ;последовательной

               RFM=FIX        ;формат записи имеет фиксиро-

                              ;ванную длину



  ;

  ;распределение блока FIB

  ;

  ;блок FIB требуется в качестве аргумента  в вызове програм-

  ;мы системного обслуживания установки очереди ввода-вывода,

  ;для получения доступа к файлу

  ;



  FIB_BLOCK:

          .BLKB    FIB$K_LENGTH



  ;

  ;распределение дескриптора блока FIB

  ;



  FIB_DESCR:

          .LONG    FIB$K_LENGTH          ;длина блока FIB

          .LONG    FIB_BLOCK             ;адрес блока FIB



  ;

  ; распределение блока имени файла




                           - 300 -

                       00152-01 33 03-1


  ;

  ;блок имени файла запрашивается системой управления

  ;данными (СУД-32) для того, чтобы возвратить

  ;информацию, относящуюся к файлу (например, результирующую

  ;строку имени файла после преобразования логического

  ;имени)

  ;



  NAM_BLOCK:                                 ;

          $NAM                               ;



  ;

  ; распределение блока доступа к записям

  ;

  ;блок доступа к записям запрашивается системой

  ;управления данными (СУД-32) для операций записи

  ;в файл

  ;



  RAB_BLOCK:

     $RAB       FAB = FAB_BLOCK,-     ;адрес блока доступа к

                                      ;файлу

                RAC = SEQ,-           ;доступ к записи должен

                                      ;быть последовательным

                RBF = RECORD_BUFFER,- ;адрес буфера записи

                RSZ = 512             ;размер буфера записи






                           - 301 -

                       00152-01 33 03-1


  ;

  ; распределение буфера прямого доступа

  ;



  BLOCK_BUFFER:                  ;

           .BLKB     1024        ;буфер прямого доступа

                                 ;длиной  1024 байта



  ;

  ; распределение области для сохранения номера канала, возв-

  ; ращаемого программой системного обслуживания назначения

  ; канала

  ;

  DEVICE_CHANNEL:                       ;

          .BLKW      1                  ;



  ;

  ; распределение строки имени устройства и дескриптора

  ;



  DEVICE_DESCR:                     ;

          .LONG      20$-10$        ;длина строки имени  уст-

                                    ;ройства

          .LONG      10$            ;адрес строки имени

                                    ;устройства

  10$:    .ASCII     /SYS$DISK/     ;устройство, на котором

                                    ;будет размещаться соз-




                           - 302 -

                       00152-01 33 03-1


                                    ;данный файл

  20$:                              ;справочная метка для вы-

                                    ;числения длины



  ;

  ; распределение строки имени файла и определение символа

  ; длины строки

  ;





  FILE_NAME:                                 ;

          .ASCII  /SYS$DISK:MYDATAFIL.DAT/   ;строка имени

                                             ;файла



  FILE_SIZE=.-FILE_NAM                   ;длина строки

                                         ;имени файла



  ;

  ; распределение памяти для квадрослова блока состояния вво-

  ; да-вывода

  ;



  IO_STATUS:                                 ;

          .BLKQ   1                          ;



  ;

  ; распределение выходного буфера записи




                           - 303 -

                       00152-01 33 03-1


  ;



  RECORD_BUFFER:                             ;

          .BLKB   512                        ;буфер записи

                                             ;имеет длину

                                             ;512 байт



  ;

  ; начало программы

  ;

  ; основная логика программы заключается в том, чтобы соз-

  ; дать файл, называемый MYDATAFIL.DAT, используя систему

  ; управления данными СУД-32 запомнить информацию, касаю-

  ; щуюся файла; записать 100 записей, каждая их которых

  ; содержит свой номер записи в каждом байте; закрыть файл

  ; а затем получить к нему доступ и читать и записывать

  ; файл непосредственно, используя программу системного

  ; обслуживания установки очереди ввода-вывода. Если обна-

  ; руживаются какие-либо ошибки, программа возвращается в

  ; в то место, откуда она была вызвана с состоянием

  ; ошибки в регистре R0

  ;

      .ENTRY   DISK_EXAMPLE,^M<R2,R3,R4,R5,R6>;начальный

                                              ;адрес програм-

                                              ;мы



  ;




                           - 304 -

                       00152-01 33 03-1


  ; во-первых, создайте файл и откройте его, используя систе-

  ; му управления данными СУД-32

  ;



  PART_1:                             ;первая часть примера

           $CREATE FAB = FAB_BLOCK    ;создание и открытие

                                      ;файла

           BLBC    R0,20$             ;если младший бит очи-

                                      ;щен, создание не

                                      ;удалось



  ;

  ; во-вторых, соедините блок доступа к записям с созданным

  ; файлом

  ;



        $CONNECT RAB = RAB_BLOCK        ;присоединить блок

                                        ;доступа к записям

        BLBC    R0,30$                  ;если младший бит

                                        ;очищен, соединение

                                        ;не удалось



  ;

  ; теперь запишите сто записей, каждая из которых содержит

  ; свой номер записи

  ;






                           - 305 -

                       00152-01 33 03-1


        MOVZBL  #NUM_RECS,R6        ;установка подсчета

                                    ;циклов записи



  ;

  ; заполните каждый байт записи, которая должна быть записа-

  ; на, своим номером записи

  ;





  10$:     SUBB3   R6,#NUM_RECS+1, R5     ;вычисление номера

                                          ;записи



      MOVC5  #0,(R6),R5,#512,RECORD_BUFFER ;заполнение буфе-

                                           ;ра записи



  ;

  ; затем, поместите записи  во вновь созданный файл, исполь-

  ; зуя систему управления данными СУД-32

  ;



           $PUT   RAB = RAB_BLOCK     ;вывод записи в файл

           BLBC   R0,30$              ;если младший бит

                                      ;очищен, вывод не

                                      ;удался

           SOBGTR R6,10$              ;записывать еще записи?



  ;




                           - 306 -

                       00152-01 33 03-1


  ; часть примера, относящаяся к созданию файла, уже заверше-

  ; на. Все, что остается сделать, - это запомнить информацию

  ; о файле, возвращаемую системой управления данными СУД-32

  ; и закрыть файл

  ;



      MOVW   NAM_BLOCK+NAM$W_FID,FIB_BLOCK+FIB$W_FID ;сохра-

                                                     ;нение

                                                     ;иденти-

                                                     ;фикато-

                                                     ;ра фай-

                                                     ;ла

  MOVW  NAM_BLOCK+NAM$W_FID+2,FIB_BLOCK+FIB_BLOCK+FIB$W_FID+2

                                           ;сохранение

                                           ;последовательного

                                           ; номера

  МOVW   NAM_BLOCK+NAM$W_FID+4,FIB_BLOCK+FIB$W_FID+4

                                     ;сохранение связанного

                                     ;тома

  $CLOSE FAB = FAB_BLOCK             ;закрытие файла

  BLBS   R0,PART_2                   ;если младший бит уста-

                                     ;новлен, закрытие вы-

                                     ;полнено успешно

  20$:     RET                       ;возвращение кода состо-

                                     ;яния ошибки с помощью

                                     ;системы управления

                                     ;данными СУД-32




                           - 307 -

                       00152-01 33 03-1




  ;

  ; присоединение потока записей или ввод записи не удался

  ;

  ; закрыть файл и возвратить код состояния

  ;



  30$:    PUSHL    R0                ;сохранить код состояния

                                     ;ошибKи

          $CLOSE   FAB = FAB_BLOCK   ;закрыть файл

          POPL     R0                ;найти  код  состояния

                                     ;ошибKи

          RET                        ;возвратить код состоя-

                                     ;ния ошибки с помощью

                                     ;системы управления

                                     ;данными СУД-32



  ;

  ; вторая часть примера иллюстрирует получение доступа к

  ; предварительно созданному файлу путем непосредственного

  ; использования программы системного обслуживания установки

  ; очереди ввода-вывода, произвольное чтение и запись раз-

  ; личных частей файла, а затем прекращение доступа к файлу

  ;



  ; сначала, назначьте канал для соответствующего устройства

  ; и получите доступ к файлу





                           - 308 -

                       00152-01 33 03-1


  ;



  PART_2:                                  ;

     $ASSIGN_S DEVNAM = DEVICE_DESCR,-     ;назначить канал

                                           ;для устройства,

                                           ;где находится

                                           ;файл

           CHAN = DEVICE_CHANNEL           ;

     BLBC    R0, 20$                       ;если младший бит

                                           ;очищен, назначе-

                                           ;ние не удалось

     MOVL    #FIB$M_NOWRITE!FIB$M_WRITE,-  ;установить доступ

                                           ;к чтению/записи

             FIB_BLOCK+FIB$L_ACCTL         ;

     $QIOW_S CHAN = DEVICE_CHANNEL,-       ;доступ к файлу по

                                           ;каналу устройства

          FUNC = #IO$_ACCESS!IO$M_ACCESS,- ;функция ввода-вы-

                                           ;вода  является

                                           ;функцией доступа

                                           ;к файлу

              IOSB = IO_STATUS,-           ;адрес квадрослова

                                           ;блока состояния

                                           ;ввода-вывода

               P1 = FIB_DESCR              ;адрес дескриптора

                                           ;блока FIB

      BLBC     R0,10$                      ;если младший бит

                                           ;очищен, доступ




                           - 309 -

                       00152-01 33 03-1


                                           ;получить не уда-

                                           ;лось

      MOVZWL   IO_STATUS,R0                ;получение  окон-

                                           ;чательного кода

                                           ;состояния опера-

                                           ;ции ввода-вывода





          BLBS     R0,30$                   ;если  младший

                                            ;бит установлен,

                                            ;функция ввода-

                                            ;вывода выполне-

                                            ;на

  10$:    PUSHL    R0                       ;сохранить  код

                                            ;состояния ошибки

     $DASSGN_S CHAN = DEVICE_CHANNEL        ;отменить назна-

                                            ;чение канала для

                                            ;устройства, на

                                            ;котором находит-

                                            ;ся файл

     POPL     R0                            ;отыскать  код

                                            ;состояния ошибки

  20$:    RET                               ;возвратить  код

                                            ;состояния ошибки

                                            ;операции ввода-

                                            ;вывода






                           - 310 -

                       00152-01 33 03-1


  ;

  ; теперь файл готов для произвольного чтения и записи.так

  ; как записи являются записями фиксированной длины и длина

  ; эта равна точно одному блоку, номер записи соответствует

  ; номеру виртуального блока в файле. Таким образом, конк-

  ; ретная запись может быть прочитана или записана просто

  ; путем указания ее номера в файле

  ;

  ; далее в программе читаются 2 записи одновременно и прове-

  ; ряются для того, чтобы увидеть, что они содержат в каждом

  ; байте свои соответственные номера записей. Затем, записи

  ; записываются опять в файл в обратном порядке. Это приво-

  ; дит к тому, что запись 1 имеет старое содержание записи

  ; 2, а запись 2 - старое содержание записи 1, и т.д. После

  ; того, как пример прошел, предполагается, что для проверки

  ; этого факта будет использована программа выдачи дампа

  ; файла

  ;



  30$:       MOVZBL    #1,R6                 ;установка  но-

                                             ;мера начальной

                                             ;записи (блока)



  ;

  ; считывание следующих двух записей в буфер блока

  ;






                           - 311 -

                       00152-01 33 03-1


  40$:  $QIOW_S  CHAR = DEVICE_CHANNEL,-  ;чтение следующих

                                          ;двух записей из

                                          ;канала файла

                 FUNC = #IO$_READVBLK,-   ;функция ввода-вы-

                                          ;вода   является

                                          ;функцией чтения

                                          ;виртуального блока

                IOSB = IO_STATUS,-        ;адрес квадрослова

                                          ;блока состояния

                                          ;ввода-вывода

                 P1 = BLOCK_BUFFER,-      ;адрес буфера вво-

                                          ;да-вывода

                 P2 = #1024,-             ;размер буфера вво-

                                          ;да-вывода

                 P3 = R6                  ;начальный виртуа-

                                          ;льный блок переда-

                                          ;чи

       BSBB      50$                      ;проверка кода сос-

                                          ;тояния операции

                                          ;ввода-вывода

  ;

  ; проверьте каждую запись и убедитEсь в том, что она содер-

  ; жит правильные данные

  ;



       SKPC      R6,#512,BLOCK_BUFFER     ;пропуск  номеров

                                          ;одинаковых  запи-




                           - 312 -

                       00152-01 33 03-1


                                          ;сей в данных



        BNEQ      60$                     ;если номера  не

                                          ;равны, соответст-

                                          ;вие данных не по-

                                          ;лучилось

        ADDL3     $1,R6,R5                ;вычисление номера

                                          ;четной записи



       SKPC      R5,#512,BLOCK_BUFFER+512 ;пропуск номеров

                                          ;одинаковых записей

                                          ;в данных



       BNEQ      60$                      ;если номера  не

                                          ;равны, соответст-

                                          ;вие данных  не

                                          ;получилось



  ;

  ; согласование данных в записях

  ;

  ; запишите записи в файл в обратном порядке

  ;



       $QIOW_S   CHAN = DEVICE_CHANNEL,-  ;запись записей с

                                          ;четной нумерацией

                                          ;в нечетный блок




                           - 313 -

                       00152-01 33 03-1


                 FUNC = #IO$_WRITEVBLK,-  ;функция ввода-вы-

                                          ;вода является

                                          ;функцией записи

                                          ;виртуального блока

                 IOSB = IO_STATUS,-       ;адрес квадрослова

                                          ;блока состояния

                                          ;состояния ввода-

                                          ;вывода

                 P1 = BLOCK_BUFFER+512,-  ;адрес буфера чет-

                                          ;ной записи



                 P2 = #512,-              ;длина буфера чет-

                                          ;ной записи

                 P3 = R6                  ;номер блока для

                                          ;нечетной записи

    BSBB         50$                      ;проверка кода сос-

                                          ;тояния операции

                                          ;ввода-вывода

    ADDL3        #1,R6,R5                 ;вычисление номера

                                          ;четной записи



    $QIOW_S      CHAN =DEVICE_CHANNEL,-   ;запись записи с

                                          ;нечетной нумераци-

                                          ;ей в четный блок

                 FUNC = #IO$_WRITEVBLK,-  ;функция ввода-вы-

                                          ;вода является за-

                                          ;писью виртуального




                           - 314 -

                       00152-01 33 03-1


                                          ;блока

                 IOSB = IO_STATUS,-       ;адрес квадрослова

                                          ;блока состояния

                                          ;ввода-вывода

                 P1 = BLOCK_BUFFER,-      ;адрес буфера не-

                                          ;четной записи

                 P2 = #512,-              ;длина буфера не-

                                          ;четной записи

                 P3 = R5                  ;номер блока четной

                                          ;записи

     BSBB        50$                      ;проверка кода сос-

                                          ;тояния операции

                                          ;ввода-вывода

     ACBB        #NUM_RECS-1,#2,R6,40$    ;еще какие-нибудь

                                          ;записи должны

                                          ;быть прочитаны?



     BRB         70$                      ;



  ;

  ; проверка кода состояния операции ввода-вывода

  ;



  50$:     BLBC        R0,70$             ;если младший бит

                                          ;очищен, программа

                                          ;системного обслу-

                                          ;живания закончи-




                           - 315 -

                       00152-01 33 03-1


                                          ;лась неудачно

     MOVZWL      IO_STATUS,R0             ;получение оконча-

                                          ;тельного кода

                                          ;состояния операции

                                          ;ввода-вывода

     BLBC        R0,70$                   ;если младший бит

                                          ;очищен, функция

                                          ;ввода-вывода за-

                                          ;кончилась неудачно

                                          ;



  ;

  ; несовпадение номера записи в данных

  ;



  60$:     MNEGL       #4,R0              ;установить фиктив-

                                          ;ное значение сос-

                                          ;тояния ошибки





  ;

  ; все записи прочитаны, проверены, и четно/нечетные пары

  ; инвертированы

  ;



  70$:     PUSHL       R0                 ;сохранить оконча-

                                          ;тельное состояние




                           - 316 -

                       00152-01 33 03-1


     $QIOW_S     CHAN = DEVICE_CHANNEL,-  ;запретить доступ к

                                          ;файлу

                 FUNC = #IO$_DEACCESS     ;функция ввода-вы-

                                          ;вода   является

                                          ;функцией запреще-

                                          ;ния доступа  к

                                          ;файлу

     $DASSGN_S   CHAN = DEVICE_CHANNEL    ;отменить назначе-

                                          ;ние канала  для

                                          ;устройства, на ко-

                                          ;тором находится

                                          ;файл

     POPL        R0                       ;отыскать конечное

                                          ;состояние

                                          ;

     RET                                  ;



         .END        DISK_EXAMPLE






















                           - 317 -

                       00152-01 33 03-1


         6. Драйверы накопителей на магнитных лентах



       Драйверы накопителей на магнитных  лентах  обслуживают

  накопители на магнитных лентах, поддерживаемые операционной

  системой МОС ВП.



       6.1. Характерные  свойства   и   возможности

            драйверов. Средства контроля


       В операционной системе МОС ВП драйверы накопителей  на

  магнитных лентах обеспечивают следующие возможности:

       - чтение в обратном направлении;

       - проверка данных в  обратном  направлении  (кроме  СМ

         5309);

       - проверка данных на  уровне  одного  запроса,  одного

         файла, и/или одного тома (кроме см 5309);

       - полное восстановление после сбоя напряжения  питания

         для  лентопротяжных  механизмов  со  смонтированными

         томами в  состоянии  готовности,  включая  повторное

         позиционирование с помощью драйвера;

       - расширенные алгоритмы исправления ошибок;  например,

         коррекция ошибки записи без возврата к нулю с инвер-

         сией;

       - регистрация ошибок устройства в файле, который может

         быть воспроизведен на экране специалистAми по обслу-

         живанию и эксплуатации;

       - диагностическое  обслуживание  для  диагностики   на

         уровне накопителя.



                           - 318 -

                       00152-01 33 03-1


       6.1.1. Контроль данных


       Контроль данных выполняется после успешного завершения

  операции ввода-вывода для того,  чтобы  сравнить  данные  в

  памяти с данными на магнитной ленте. После операции  записи

  или считывания (вперед) лентопротяжный механизм  возвращает

  ленту назад и  затем  выполняет  операцию  проверки  данных

  записи. После чтения в обратном направлении  лентопротяжный

  механизм пропускает ленту вперед и затем выполняет операцию

  проверки данных записи  в  обратном  направлении.  Драйверы

  накOпителей на магнитных лентах, за исключением драйвера см

  5309, обеспечивают проверки данных на трех уровнях:

       1) на уровне  запроса  -  пользователи  могут  указать

  модификатор функции проверки данных (IO$M_DATACHECK)  после

  функции ввода-вывода чтения логического блока, записи логи-

  ческого блока, чтения виртуального блока, записи  виртуаль-

  ного блока, чтения физического блока, или записи физическо-

  го блока;

       2) на уровне тома - пользователи могут указать  харак-

  теристики "проверка данных всех считываний" и/или "проверка

  данных всех записей", когда том монтируется;

       3) на уровне файла - пользователи могут указать  атри-

  буты файла "проверка данных при чтении" или "проверка  дан-

  ных при записи". Атрибуты доступа к файлу  указываются  при

  обращении к файлу.









                           - 319 -

                       00152-01 33 03-1


       6.1.2. Восстановление ошибок


       Восстановление ошибок в операционной  системе  МОС  ВП

  направлено на выполнение всех возможных действий для успеш-

  ного завершения операции ввода-вывода. Операции исправления

  ошибок на магнитной ленте разделяются на две категории:

       1) управление специальными условиями, такими, как сбой

  нAпряжения питания и тайм-ауты прерывания;

       2) повторные попытки при исправимых ошибках накопителя

  и/или контроллера.

       Алгоритм исправления ошибок использует комбинацию этих

  двух типов операций исправления ошибок.

       Исправление ошибки из-за сбоя напряжения питания  сос-

  тоит из повторного позиционирования  катушки  в  положение,

  занимаемое в начале операции  ввода-вывода,  осуществляемой

  во время сбоя напряжения питания, и  повторного  выполнения

  данной операции.  Такое  повторное  позиционирование  может

  требовать или не  требовать  вмешательства  оператора,  для

  того, чтобы перезагрузить накопители, например,  в  зависи-

  мости от того, пропадал ли вакуум в лентопротяжном механиз-

  ме, который имеет вакуумные  колонки.  Когда  такое  вмеша-

  тельство оператора необходимо, на консольный пульт операто-

  ра посылается сообщение о том, что  устройство  не  готово,

  которое требует перезагрузки смонитированных накопителей.

       Тайм-аут устройства рассматривается  как  неисправимая

  ошибка с потерей позиции  на  магнитной  ленте.  Лента,  на

  которой произошло прерывание, должна быть  демонтирована  и

  перемотана, прежде, чем позиция  лентопротяжного  механизма



                           - 320 -

                       00152-01 33 03-1


  может быть установлена.

       Если      имеет      место      исправимая      ошибка

  контроллера/накопителя, драйвер пытается выполнить операцию

  ввода-вывода повторно, до 16  раз,  прежде  чем  возвратить

  неисправимую ошибку.  Драйвер  заново  позиционирует  ленту

  перед каждой попыткой.

       Модификатор  функции  запрещения   повторной   попытки

  (IO$M_INHRETRY) запрещает всякое исправление  ошибки.  Если

  происходит ошибка и запрос включает данный модификатор,  то

  операция немедленно прекращается, и драйвер возвращает сос-

  тояние неисправности. Данный модификатор  не  действует  на

  исправление  ошибки  после  сбоя   напряжения   питания   и

  тайм-аута.

       Драйвер может записывать  до  шестнадцати  расширенных

  зонных интервалов во время исправления ошибки для  операции

  записи. Запись этих интервалов может быть  подавлена  путем

  указания модификатора функции запрещения расширенных зонных

  интервалов (IO$M_INHEXTGAP).



       6.2. Информация об устройствах


       Пользователь может получить информацию обо всех харак-

  теристиках накопителей на магнитных лентах, используя прог-

  раммы системного обслуживания $GETDVI, $GETCHN или $GETDEV.

       Рекомендуется, чтобы новые программы использовали  для

  получения информации  об  устройстве  программу  системного

  обслуживания $GETDVI.





                           - 321 -

                       00152-01 33 03-1


       Программы системного обслуживания  $GETCHN  и  $GETDEV

  возвращают информацию о конкретном накопителе на  магнитной

  ленте в первые три длинных слова буфера, указывAемого поль-

  зователем, как показано на рис. 36.


          Информация о накопителе на магнитной ленте

    31                        16 15          8  7          0
    +------------------------------------------------------+
    !           Характеристики, независимые от             !
    !                   устройства                         !
    +------------------------------------------------------+
    !     Размер буфера         !    Тип      !   Класс    !
    !                           !             !            !
    +------------------------------------------------------+
    !                  Характеристики,                     !
    !             зависящие   от   устройства              !
    +------------------------------------------------------+

                            Рис. 36


       Характеристики,  устройства,  возвращаемые  в   первое

  длинное слово, перечисляются в табл. 34

                                                   Таблица 34

         Характеристики накопителя на магнитной ленте,

                   независимые от устройства

  -----------------------------------------------------------

  Характеристика  !        Назначение

  -----------------------------------------------------------

               1) !

  DEV$M_AVL       ! Устройство подключено и свободно

               1) !

  DEV$M_FOR       ! Том отличный по формату от тома с

                  ! файловой структурой операционной

                  ! системы ("чужой")




                           - 322 -

                       00152-01 33 03-1


                                         Продолжение табл. 34

  -----------------------------------------------------------

  Характеристика  !        Назначение    

  -----------------------------------------------------------

               1) !

  DEV$M_MNT       ! Смонтированный том

               1) !

  DEV$M_RCK       ! Выполнение проверки данных всех считывани

               1) !

  DEV$M_SQD       ! Устройство последовательного доступа

               1) !

  DEV$M_WCK       ! Выполнение проверки данных всех записей

               2) !

  DEV$M_FOD       ! Устройство, ориентированное на файл

               2) !

  DEV$M_IDV       ! Устройство готово к вводу

               2) !

  DEV$M_ODV       ! Устройство готово к выводу

  --------------------

       1) динамический бит (устанавливается по условию).

       2) статический бит (устанавливается всегда).

       Символические опеределения битов определяются макроко-

  мандой $DEVDEF.

       Второе длинное слово содержит информацию  о  классе  и

  типе устройства и размере буфера.

       Макрокоманда $DCDEF  определяет  типы  и  классы  уст-

  ройств, размер буфера,  который  будет  использоваться  для




                           - 323 -

                       00152-01 33 03-1


  передач накопителя на магнитной ленте. Этот размер по умол-

  чанию обычно составляет 2048 байт.

       Третье длинное слово содержит характеристики,  завися-

  щие от устройства. Они перечислены в табл. 35.  Характерис-

  тики, зависящие от  устройства  определяются  макрокомандой

  $MTDEF.

                                                   Таблица 35

   Характеристики, зависящие от устройства, для накопителей

                      на магнитных лентах

  -----------------------------------------------------------
    
       Бит      !            Назначение

  -----------------------------------------------------------

  MT$M_LOST     ! Если устанавливается, то позиция данной

                ! ленты неизвестна

  MT$M_HWL      ! Если устанавливается, то выбранный накопи-

                ! тель является аппаратно заблокированным для

                ! записи

  MT$M_EOT      ! Если устанавливается, то во время последней

                ! операции при перемещении ленты вперед было

                ! встречено условие конца ленты (ЕОТ)

  мт$м_EOF      ! Если  устанавливается, то во время послед-

                ! ней операции при перемещении ленты была

                ! встречена метка ленты

  MT$M_BOT      ! Если устнавливается, то во время последней

                ! операции при перемещении ленты в обратном

                ! направлении была встречена метка начала

                ! ленты (ВОТ)




                           - 324 -

                       00152-01 33 03-1


                                         Продолжение табл. 35

  -----------------------------------------------------------

       Бит      !            Назначение

  -----------------------------------------------------------

  MT$M_PARITY   ! Если устанавливается, то все передачи дан-

                ! ных выполняются с контролем кодов на чет-

                ! ность. Если очищается (нормальный случай),

                ! все передачи данных выполняются с контролем

                ! на нечетность. Только при записи без возв-

                ! рата к нулю с инверсией с плотностью 32

                ! бита на мм может использоваться контроль

                ! кодов на четность

  MT$V_DENSITY  ! Указывает плотность, с которой выполняются

  MT$S_DENSITY  ! все операции передачи данных. Возможны

                ! следующие значения плотности:

                ! 1) MT$K_GCR_6250 - запись с групповым коди-

                !                   рованием, 250 бит на

                !                   мм;

                ! 2) MT$K_PE_1600 -  фазовое кодирование,

                !                   64 бита на мм;

                ! 3) MT$K_NRZI_800 - без возвращения к нулю с

                !                   инверсией, 32 бита на мм

  мт$V_FORMAT   ! указывает формат, в котором выполняются все

  мт$S_FORMAT   ! передачи данных. Возможно следующее значе-

                ! ние формата:

                !   MT$K_NORMAL11 - байты данных записываются

                !                   на ленту последовательно,




                           - 325 -

                       00152-01 33 03-1


                                         Продолжение табл. 35

  -----------------------------------------------------------

       Бит      !            Назначение

  -----------------------------------------------------------

                !                   причем каждый байт зани-

                !                   мает точно один кадр



       6.3. Коды функций  накопителя  на  магнитной

            ленте


       Драйвер операционной системы МОС ВП для накопителя  на

  магнитной ленте может выполнять функции  логического,  вир-

  туального и физического ввода-вывода.

       Функции логического  и  физического  ввода-вывода  для

  накопителей на магнитных лентах дают возможность последова-

  тельного доступа к памяти тома и требуют только, чтобы зап-

  рашивающий процесс имел прямой доступ к устройству. Функции

  виртуального ввода-вывода требуют вмешательства со  стороны

  вспомогательного  управляющего  процесса  (АСР)  и   должны

  выполняться в предписанном порядке. Oбычная процедура  зак-

  лючается в том, чтобы создать файл и получить к  нему  дос-

  туп. Затем информация записывается в файл, и доступ к файлу

  прекращается.  Затем,  при  последующем  доступе  к  файлу,

  информацию можно считывать. Если информация, содержащаяся в

  файле, больше не нужна, в файл может быть  записана  другая

  информация.

       Результаты   операций   логического   и    физического

  ввода-вывода являются непредсказуемыми,  если  присутствует



                           - 326 -

                       00152-01 33 03-1


  вспомогательный управляющий процесс (АСР).

       По  одному  запросу  из  одного   блока   может   быть

  прочитано, или в один блок может быть записано любое  коли-

  чество байтов (минимум 14, максимум 65535). Количество бай-

  тов само по себе не зависит от  используемых  квот  (прямой

  ввод-вывод,   буферизованный   ввод-вывод   и   асинхронные

  системные прерывания (АST)). Чтение или запись любого коли-

  чества байтов вычитает из квоты одну и ту же сумму.

       Для того, чтобы функция действительно была  выполнена,

  том, для которого виртуальная или логическая функция  пред-

  назначается,  должен  быть  смонтирован.  Если  функция  не

  выполняется, то в блок состояния ввода-вывода  возвращается

  либо состояние несмонтированного устройства, либо  недейст-

  вительного тома.

       Функции  логического,  виртуального  или   физического

  ввода-вывода для накопителя на магнитной ленте и коды  этих

  функций перечислены в табл. 36.

                                                   Таблица 36

   Функции ввода-вывода для накопителей на магнитных лентах

  -----------------------------------------------------------

  Код функции     ! Модификатор  !       Описание

  и аргументы     !  функции     !        функции

  -----------------------------------------------------------

               1) !              !

  IO$_CREATE P1,- ! IO$M_CREATE  ! Создание файла

  [р2],[P3],[P4],-! IO$M_ACCESS  !

  [Р5]            !              !




                           - 327 -

                       00152-01 33 03-1


                                         Продолжение табл. 36

  -----------------------------------------------------------

  Код функции     ! Модификатор  !       Описание

  и аргументы     !  функции     !        функции

  -----------------------------------------------------------

               1) !              !

  IO$_ACCESS P1,- ! IO$M_CREATE  ! Поиск указанного файла на

  [Р2],[P3],[P4],-! IO$M_ACCESS  ! ленте и доступ к файлу,

  [Р5]            !              ! если он найден и установ-

                  !              ! лен       модификатор

                  !              ! IO$M_ACCESS. Если файл не

                  !              ! найден и установлен моди-

                  !              ! фикатор IO$M_CREATE, то

                  !              ! создание файла в конце

                  !              ! ленты

               1) !              !

  IO$_DEACCESS    !              ! Отмена доступа к файлу и,

  P1,[P2],[P3],-  !              ! если файл уже записан,

  [Р4],[Р5]       !              ! переписывание конечных за-

                  !              ! писей

               1) !              !

  IO$_MODIFY      !              ! Запись меток пользователя

  P1,[P2],[P3],-  !              !

  [Р4],[Р5]       !              !

               1) !              !

  IO$_READVBLK    !IO$M_DATACHECK! Чтение виртуального блока

  P1,P2           !IO$M_INHRETRY !




                           - 328 -

                       00152-01 33 03-1


                                         Продолжение табл. 36

  -----------------------------------------------------------

  Код функции     ! Модификатор  !       Описание

  и аргументы     !  функции     !        функции

  -----------------------------------------------------------

                  !IO$M_REVERSE  !

               2) !              !

  IO$_READLBLK    !IO$M_DATACHECK! Чтение логического блока

                  !IO$M_INHRETRY !

                  !IO$M_REVERSE  !

               3) !              !

  IO$_READPBLK    !IO$M_DATACHECK! Чтение физического блока

  Р1,Р2           !IO$M_INHRETRY !

                  !IO$M_REVERSE  !

               1) !              !

  IO$_WRITEVBLK   !IO$M_DATACHECK! Запись виртуального блока

  Р1,Р2           !IO$M_INHRETRY !

               2) !              !

  IO$_WRITELBLK   !IO$M_DATACHECK! Запись логического блока

  Р1,Р2           !IO$M_INHRETRY !

               3) !              !

  IO$_WRITEPBLK   !IO$M_DATACHECK! Запись физического блока

  Р1,Р2           !IO$M_INHRETRY !

               2) !              !

  IO$_REWIND      !IO$M_INHRETRY ! Позиционирование ленты на

                  !IO$M_NOWAIT   ! метку  начала  ленты

                  !              ! (BOT)




                           - 329 -

                       00152-01 33 03-1


                                         Продолжение табл. 36

  -----------------------------------------------------------

  Код функции     ! Модификатор  !       Описание

  и аргументы     !  функции     !        функции

  -----------------------------------------------------------

               2) !              !

  IO$_REWINDOFF   !IO$M_INHRETRY ! Перематывает и загружает

                  !IO$M_NOWAIT   ! ленту на выбранном уст-

                  !              ! ройстве

               2) !              !

  IO$M_UNLOAD     !IO$M_INHRETRY ! Перематывает и разгружает

                  !IO$M_NOWAIT   ! ленту на выбранном уст-

                  !              ! ройстве

               2) !              !

  IO$_SKIPFILE P1 !IO$M_INHRETRY ! Пропуск указанного числа

                  !              ! меток ленты в прямом или

                  !              ! обратном направлении

               2) !              !

  IO$_SKIPRECORD  !IO$M_INHRETRY ! Пропуск указанного числа

  р1              !              ! блоков в прямом или обрат-

                  !              ! ном направлении

               2) !              !

  IO$_WRITEOF     !IO$M_INHRETRY ! Запись расширенного интер-

                  !              ! вала, за которым следует

                  !              ! метка ленты

               3) !              !

  IO$_PACKACK     !              ! Инициировать бит допусти-




                           - 330 -

                       00152-01 33 03-1


                                         Продолжение табл. 36

  -----------------------------------------------------------

  Код функции     ! Модификатор  !       Описание

  и аргументы     !  функции     !        функции

  -----------------------------------------------------------

                  !              ! мости тома

               3) !              !

  IO$_AVAILABLE   !              ! Очистить бит допустимости

                  !              ! тома

               2) !              !

  IO$_SENSEMODE   ! IO$M_INHRETRY! Считывание характеристик

                  !              ! накопителя на магнитной

                  !              ! ленте и возврат их в блок

                  !              ! состояния ввода-вывода

               2) !              !

  IO$_SETMODE P1  !              ! Установка характеристик

                  !              ! накопителя на магнитной

                  !              ! ленте для последующих

                  !              ! операций

               3) !              !

  IO$_SETCHAR P1  !              ! Установка характеристик

                  !              ! накопителя на магнитной

                  !              ! ленте для последующих

                  !              ! операций

               1) !              !

  IO$_ACPCONTROL  !IO$M_DMOUNT   ! Выполнение различных

  P1,[P2],[P3],-  !              ! функций управления




                           - 331 -

                       00152-01 33 03-1


                                         Продолжение табл. 36

  -----------------------------------------------------------

  Код функции     ! Модификатор  !       Описание

  и аргументы     !  функции     !        функции

  -----------------------------------------------------------

  [Р4],[Р5]       !              !

  -------------------

       1) виртуальная функция.

       2) логическая функция.

       3) физическая функция.

       Функционально-зависимыми   аргументами   для   функций

  IO$_CREATE, IO$_ACCESS, IO$_DEACCESS и IO$_MODIFY являются:

       1) P1 - адрес дескриптора блока FIB;

       2) P2 - адрес дескриптора имени файла  (необязательный

  аргумент). Если указывается с функцией IO$_ACCESS,  то  имя

  определяет разыскиваемый файл. Если указывается с  функцией

  IO$_CREATE, то имя является именем создаваемого файла;

       3) P3 - адрес слова, в которое  будет  записана  длина

  полученной строки имени файла (аргумент необязательный);

       4) P4 - адрес  дескриптора  буфера,  в  который  будет

  записана полученная строка имени файла  (аргумент  необяза-

  тельный);

       5) P5 - адрес списка дескрипторов атрибутов  (аргумент

  необязательный). Если указывается с функцией IO$_ACCESS, TO

  атрибуты файла возвращаются пользователю. Если  указывается

  с функцией IO$_CREATE, P5 является адресом списка  дескрип-

  торов атрибутов для нового файла. Все  атрибуты  файла  для




                           - 332 -

                       00152-01 33 03-1


  функции IO$_MODIFY игнорируются.

       Функционально-зависимыми   аргументами   для   функций

  IO$_READVBLK,  IO$_READLBLK,  IO$_READPBLK,  IO$_WRITEVBLK,

  IO$_WRITELBLK, IO$_WRITEPBLK являются:

       1) P1 - начальный виртуальный  адрес  буфера,  который

  должен принимать даные в случае  операции  чтения;  или,  в

  случае операции записи, виртуальный адрес  буфера,  который

  должен быть записан на ленту;

       2) P2 - количество байтов, кOторые должны быть  прочи-

  таны с ленты, или записаны из памяти на ленту.

       Функционально-зависимым   аргументом    для    функций

  IO$_SKIPFILE и IO$_SKIPRECORD является:

           P1 - количество меток ленты, которое надо пропус-

                тить в случае операции пропуска файла, или,

                в случае операции пропуска записи, количест-

                во блоков, которое надо пропустить.  Если

                указывается положительное число, лента пере-

                мещается вперед; если указывается отрица-

                тельное число, лента перемещается в обратном

                направлении. (Максимальное количество ленточ-

                ных меток или записей, которое может указать

                аргумент Р1, равно 32767).



       6.3.1. Чтение


       Функция чтения считывает данные в  указанный  буфер  в

  прямом или обратном направлении, начиная с позиции  следую-

  щего блока.



                           - 333 -
                          
                       00152-01 33 03-1


       Операционная система  МОС  ВП  обеспечивает  три  кода

  функции чтения:

       1) IO$_READVBLK - чтение виртуального блока;

       2) IO$_READLBLK - чтение логического блока;

       3) IO$_READPBLK - чтение физического блока.

       Функция чтения виртуального блока  для  тома,  который

  монтируется, как "чужой", преобразуется  в  функцию  чтения

  логического блока. Функция чтения  виртуального  блока  для

  тома, с файловой структурой выполняется обычным образом.

       С    этими    кодами    функций    используются    два

  функционально-зависимых аргумента: P1 и P2 (подраздел 6.3).

       Если код функции чтения включает модификатор  обратной

  функции (IO$M_REVERSE), лентопротяжный механизм читает лен-

  ту в обратном направлении вместо чтения в прямом  направле-

  нии.

       Все функции чтения могут включать модификатор  функции

  проверки данных  (IO$M_DATACHECK).  Прежде,  чем  выполнять

  операцию проверки данных, драйвер завершает функцию чтения.

  (между операциями чтения и проверки  данных  лентопротяжный

  механизм делает шаг вперед или шаг назад).
                                           
       Драйвер выполняет также  операцию  проверки  данных  в

  случае, если том, который был прочитан, или том, на котором

  размещается файл (виртуальное чтение), имеет характеристику

  "проверка данных всех  считываний".  Кроме  того,  проверка

  данных выполняется после  виртуального  чтения,  если  файл

  имеет атрибут "проверка данных после чтения".

       Для функций чтения физического или  виртульного  блока




                           - 334 -

                       00152-01 33 03-1


  драйвер возвращает код завершения SS$_NORMAL, а не  состоя-

  ние "конец ленты", если  при  отсутствии  других  ошибочных

  ситуаций возникает любое из следующих условий:

       - в начале операции чтения (вперед  или  назад)  лента

         позиционируется после позиции конца ленты;

       - в результате операции чтения лента входит в  область

         конца ленты.

       Передаваемое количество  байтов  отражает  фактическое

  количество прочитанных байтов. Если лентопротяжный механизм

  читает метку ленты во время операции логического или  физи-

  ческого чтения в направлении вперед либо  назад,  состояние

  "конец файла" может быть возвращено при любом из  следующих

  условий:

       - в начале операции чтения лента позиционируется после

         позиции конца ленты;

       - в результате операции чтения лента входит в  область

         конца ленты;

       - лентопротяжный механизм  читает  ленточную  метку  в

         результате операции чтения, но  лента  не  входит  в

         область конца ленты.

       Состояние "конец файла" возвращается также  в  случае,

  если лентопротяжный механизм  пытается  выполнить  операцию

  чтения в обратном направлении, когда лента  позиционируется

  на метке начало ленты (BOT). Все условия, которые  вызывают

  состояние "конец файла", приводят к  тому,  что  количество

  переданных байтов равно нулю.

       Если во время операции чтения лентопротяжный  механизм




                           - 335 -

                       00152-01 33 03-1


  пытается прочитать  блок,  который  больше,  чем  указанный

  буфер памяти, то возвращается состояние  переполнения  дан-

  ных. Буфер принимает только первую часть блока. При  чтении

  в обратном направлении  буфер  принимает  только  последнюю

  часть блока. Количество передаваемых байтов равно фактичес-

  кому размеру блока. Чтение в обратном направлении начинает-

  ся в верхней части  буфера.  Таким  образом,  начало  блока

  находится в Р1 плюс Р2, минус длина прочитанных данных.

       Невозможно прочитать блок, который имеет длину  меньше

  14 байтов. Записи, которые содержат менее 14 байтов,  назы-

  ваются  "зашумленными  блоками"  и  полностью  игнорируются

  драйвером.



       6.3.2. Запись


       Функция записи записывает данные из указанного  буфера

  на ленту в прямом направлении, начиная с позиции следующего

  блока.

       Операционная система  МОС  ВП  обеспечивает  три  кода

  функции записи:

       1) IO$_WRITEVBLK - запись виртуального блока;

       2) IO$_WRITELBLK - запись логического блока;

       3) IN$_WRITEPBLK - запись физического блока.

       Если функция записи виртуального блока предназначается

  для тома,  который  монтируется  как  "чужой",  то  функция

  преобразуется в  запись  логического  блока.  Если  функция

  записи виртуального блока предназначается для тома, который

  монтируется как том со стандартной файловой  структурой,  с



                           - 336 -

                       00152-01 33 03-1


  томом обращаются соответствующим образом.

       С    этими    кодами    функций    используются    два

  функционально-зависимых аргумента: Р1 и Р2. (См.  подраздел

  6.3).

       Все функции записи могут содержать модификатор функции

  проверки данных (IO$M_DATACHECK). Если  данный  модификатор

  указывается, то прежде,  чем  выполнять  операцию  проверки

  данных, драйвер завершает функцию записи.(Между  операциями

  записи и проверки данных лентопротяжный механизм делает шаг

  назад).

       Драйвер выполняет операцию  проверки  данных  также  в

  случае, если записанный том, или том, на котором размещает-

  ся файл (виртуальная запись), имеет характеристику "провер-

  ка данных всех записей". Кроме того, проверка данных выпол-

  няется после виртуальной записи, если  файл  имеет  атрибут

  "проверка данных после записи".

       Драйвер выполняет операцию проверки данных,  когда  во

  время операции записи происходит ошибка. Это дает гарантию,

  что данные могут быть снова прочитаны.

       Если лентопротяжный механизм выполняет операцию записи

  физического блока или записи логичесKого  блока,  состояние

  "конец ленты" возвращается в том случае, если  имеет  место

  любое из следующих условий и никакого другого условия ошиб-

  ки не существует:

       - в начале операции записи лента позиционируется после

         позиции конца ленты;

       - в результате операции записи лента входит в  область




                           - 337 -

                       00152-01 33 03-1


         конца ленты.

       Примечание. Переданное количество байтов отражает раз-

  мер записанного блока.

       Невозможно записать блок меньше, чем 14 байтов длиной.

  Попытка сделать это приводит к возврату состояния  сбойного

  параметра для запроса QIO.



       6.3.3. Перемотка


       Функция перемотки позиционирует ленту на метку  начала

  ленты   (BOT).   Если   указывается   модификатор   функции

  IO$M_NOWAIT, то операция  ввода-вывода  зaвершается,  когда

  инициируется  перемотка.  В  противном  случае,  завершение

  ввода-вывода не происходит до тех пор, пока лента не  уста-

  новится на метку начала ленты (BOT). Функция IO$_REWIND  не

  имеет функционально-зависимых аргументов.



       6.3.4. Пропуск файла


       Функция пропуска файла пропускает указанное число лен-

  точных меток либо в прямом, либo  в  обратном  направлении.

  Для того, чтобы  указать  число  ленточных  метOк,  которое

  должно быть пропущено, используется функционально-зависимый

  аргумент (P1), показанный  на  рис.  37.  Если  указывается

  положительное количество файлов, то лента перемещается впе-

  ред; если указывается отрицательное количество  файлов,  то

  лента перемещается в обратном направлении. (В блок  состоя-

  ния ввода-вывода возвращается фактическое количество пропу-




                           - 338 -

                       00152-01 33 03-1


  щенных файлов).


              Аргумент Р1 функции IO$_SKIPFILE

        31                      16 15                     0
        +--------------------------------------------------+
  Р1:   !  Не используется        !     Счетчик файлов     !
        +--------------------------------------------------+

                            Рис. 37


       Во время операции пропуска файлов подсчитываются толь-

  ко ленточные метки (когда лента движется в любом  направле-

  нии) и метка начала ленты (BOT)  (когда  лента  движется  в

  обратном направлении). Метка начала ленты  (BOT)  завершает

  функцию пропуска файлов в обратном направлении. Метка конца

  ленты (ЕОТ) не завершает функцию пропуска файлов ни в  пря-

  мом, ни в обратном направлениях. Oбратите внимание  на  то,

  что отрицательная функция пропуска  файла  оставляет  ленту

  позиционированной точно перед ленточной меткой, то есть,  в

  конце файла, если не встречается метка начала ленты  (ВОТ),

  в то время как положительная функция пропуска файла  остав-

  ляет ленту позиционированной точно после ленточной метки.

       Функция пропуска файла в прямом направлении может быть

  завершена также в том случае, если встречаются две последо-

  вательные ленточные метки. (Подпункт 6.3.5.1).



       6.3.5. Пропуск записи



       Функция пропуска записи пропускает указанное количест-

  во физических блоков на ленте как в прямом, так и в  обрат-

  ном направлении. Аргумент Р1 функции  указывает  количество



                           - 339 -

                       00152-01 33 03-1


  блоков, которое надо пропустить, как показано на  рис.  38.

  Если указывается  положительное  количество  блоков,  лента

  движется вперед; если указывается отрицательное  количество

  блоков, лента движется в обратном направлении. (В блок сос-

  тояния  ввода-вывода  возвращается  фактическое  количество

  пропущенных блоков. Если обнаруживается  ленточный  маркер,

  счетчик равен числу пропущенных блоков плюс 1).


               Аргумент Р1 функции IO$_SKIPRECORD

        31                     16 15                      0
       +---------------------------------------------------+
   Р1: !     Не используется     !      Счетчик блоков     !
       +---------------------------------------------------+

                            Рис. 38


       Функция пропуска  записей  завершается  концом  файла,

  когда лента движется в любом из направлений; меткой  начала

  ленты (ВОТ), когда лента движется в  обратном  направлении,

  меткой конца ленты (еот), когда  лента  движется  в  прямом

  направлении.

       Функция пропуска записи  в  направлении  вперед  может

  быть закончена также в  случае,  если  первоначально  лента

  была позиционирована между двумя ленточными метками.  (Под-

  пункт 6.3.5.1).



       6.3.5.1. Обнаружение логического конца тома


       Операции пропуска файла или пропуска  записи  заканчи-

  ваются, когда существуют два следующих условия:

       1) том монтируется как "чужой";




                           - 340 -

                       00152-01 33 03-1


       2) в направлении вперед встречаются две последователь-

  ные ленточные метки.

       Лента остается позиционированной между двумя ленточны-

  ми метками.  Блок  состояния  ввода-вывода  возвращает  код

  SS$_ENDOFVOLUME и фактическое количество файлов (или  запи-

  сей), пропущенных во время операции до  обнаружения  второй

  ленточной метки. Количество пропусков возвращается в  стар-

  шее  слово  первого  длинного  слова  в   блоке   состояния

  ввода-вывода.

       Последующие запросы на  пропуск  записи  (или  пропуск

  файла) из данной позиции ленты будут тотчас же заканчивать-

  ся, не создавая никакого движения ленты  и,  возвращая  код

  SS$_ENDOFVOLUME с количеством пропусков, равным нулю.

       Для того, чтобы переместить ленту за вторую  ленточную

  метку,  пользователь  должен  использовать  другую  функцию

  ввода-вывода. Например, если функция  IO$_READLBLK  исполь-

  зуется после приема кода  завершения  SS$_ENDOFVOLUME,  она

  будет заканчиваться с кодом SS$_ENDOFFILE и с лентой, пози-

  ционированной точно после второй ленточной метки.

       Из этой новой позиции могут быть выданы другие функции

  пропуска, для того  чтобы  создать  движение  ленты  вперед

  (предполагая, что на ленте существуют  дополнительные  дан-

  ные).

       Если во время действия функции пропуска  файла  встре-

  чаются три последовательные ленточные  метки,  пользователь

  должен применить две функции  IO$_READLBLK:  первую,  чтобы

  получить код завершения SS$_ENDOFFILE, вторую, чтобы  пози-




                           - 341 -

                       00152-01 33 03-1


  ционировать ленту после третьей ленточной метки.



       6.3.6. Запись конца файла


       Функция записи конца файла записывает расширенный зон-

  ный интервал (приблизительно 75 мм для записи без  возврата

  к нулю с инверсией и 27,5 мм для фазо-кодированной записи),

  за которым следует ленточная метка. С функцией  IO$_WRITEOF

  не используется никаких зависящих от устройства  и  функции

  аргументов.

       Состояние "конец ленты" возвращается в блок  состояния

  ввода-вывода в случае,  если  присутствует  любое  из  двух

  условий и никаких условий ошибки нет:

       1) функция записи конца файла выполняется в то  время,

  когда лента установлена в позиции после метки  конец  ленты

  (EOT);

       2) функция записи  конца  файла  приводит  к  тому,что

  позиция ленты входит в область конца ленты.



       6.3.7. Перемотка в автономном режиме


       Функция перемотки в автономном режиме  перематывает  и

  разгружает ленту  на  выбранном  лентопротяжном  механизме.

  Если указывается модификатор функции IO$M_NOWAIT, то опера-

  ция ввода-вывода  заканчивается,  как  только  инициируется

  перемотка.  С  функцией  IO$_REWINDOFF  никакие  аргументы,

  зависящие от устройства и функции, не используются.






                           - 342 -

                       00152-01 33 03-1


       6.3.8. Разгрузка


       Функция разгрузка перематывает и разгружает  ленту  на

  выбранном  устройстве.  Функция   перемотки   функционально

  подобна функции перемотки в автономном режиме. При  исполь-

  зовании модификатора IO$M_NOWAIT операция завершается сразу

  после начала перемотки. С функцией IO$UNLOAD не используют-

  ся аргументы, зависящие от устройства и функции.



       6.3.9. Считывание   режима    накопителя    на

              магнитной ленте


       Функция считывания режима считывает зависящие от  уст-

  ройства характеристики конкретного накопителя на  магнитной

  ленте и возвращает их вызывающей программе во второе  длин-

  ное слово блока  состояния  ввода-вывода  (см.  табл.  35).

  Содержание второго длинного слова  идентично  зависящей  от

  устройства   информации   (см.   рис.   36).   С   функцией

  IO$_SENSEMODE никакие аргументы, зависящие от устройства  и

  функции, не используются.



       6.3.10. Установка режима


       Функции установки  режима  воздействуют  на  работу  и

  характеристики  соответствующего  накопителя  на  магнитной

  ленте. Операционная система  МОС  ВП  определяет  два  типа

  функций установки режима:

       1) установка режима;





                           - 343 -

                       00152-01 33 03-1


       2) установка характеристик.



       6.3.10.1. Установка режима


       Функция  установки  режима  влияет  на  характеристики

  соответствующего накопителя на магнитной  ленте.  Установка

  режима является функцией логического ввода-вывода и требует

  привилегии доступа, необходимой для выполнения  логического

  ввода-вывода.   Возможен    единственный    код    функции:

  IO$_SETMODE.

       Данная функция использует следующий зависящий от  уст-

  ройства и функции аргумент (другие аргументы игнорируются):

           P1 - адрес квадрослова буфера характеристик.

       На рис. 39 изображено квадрослово буфера характеристик

  для функции установки режима.


       Буфер характеристик для функции установки режима

    31                       16   15                     0
   +------------------------------------------------------+
   !      Размер буфера         !   Не используется       !
   -------------------------------------------------------+
   !   Характеристики накопителя на магнитной ленте       !
   +------------------------------------------------------+

                            Рис. 39


       В табл. 37 перечислены  характеристики  накопителя  на

  магнитной ленте  и  их  назначение.  Перечисляемые  символы

  определяются макрокомандой $MTDEF.










                           - 344 -

                       00152-01 33 03-1


                                                   Таблица 37

       Характеристики накопителя на магнитной ленте для

      функций установки режима и установки характеристик

  -----------------------------------------------------------

  Характеристика !             Назначение

  -----------------------------------------------------------

  MT$M_PARITY    ! Если устанавливается, то все передачи дан-

                 ! ных выполняются с проверкой на четность.

                 ! если очищается (нормальный случай), то все

                 ! передачи данных выполняются с проверкой на

                 ! нечетность. Проверка  на  четность  может

                 ! быть выбрана только для записи без возвра-

                 ! та к нулю с инверсией при 32 бита на мм

  MT$V_DENSITY   ! Указывает плотность, с которой выполняются

  MT$S_DENSITY   ! все передачи данных. Плотность ленты может

                 ! быть установлена только тогда, когда лента

                 ! выбранного накопителя позиционирована на

                 ! метку начала ленты (BOT). Возможны следую-

                 ! щие значения плотности:

                 ! 1) MT$K_DEFAULT - плотность, принимаемая

                 !                   по умолчанию;

                 ! 2) МТ$K_GCR_6250 - запись с групповым ко-

                 !                    дированием, 250 бит на

                 !                    мм;

                 ! 3) МТ$K_PE_1600 - фазо-кодированная за-

                 !                    пись, 64 бит на мм;

                 ! 4) MT$K_NRZI_800 - без возврата к нулю с




                           - 345 -

                       00152-01 33 03-1


                                         Продолжение табл. 37

  -----------------------------------------------------------

  Характеристика !             Назначение

  -----------------------------------------------------------

                 !                    инверсией, 32 бита на

                 !                    мм

  MT$V_FORMAT    ! Указывает формат, в котором выполняются

  MT$S_FORMAT    ! Все передачи данных. Возможны следующие

                 ! значения формата:

                 ! 1) MT$K_DEFAULT - формат, принимаемый по

                 !                   умолчанию;

                 ! 2) MT$K_NORMAL11 - обычный формат СМ-4.

                 ! Байты данных  записываются на ленте  пос-

                 ! ледовательно, причем каждый байт занимает

                 ! точно один кадр


       Примечание. Для  изменения  специальных  характеристик

  накопителей на магнитной ленте прикладные программы  должны

  выполнить следующее:

       1) использовать функцию IO$_SENSEMODE для чтения теку-

  щих характеристик;

       2) изменить характеристику;

       3) использовать функцию установки режима для  сохране-

  ния измененных характеристик.

       Нарушение указанной последовательности действий приве-

  дет к сбросу ранее установленных характеристик.







                           - 346 -

                       00152-01 33 03-1


       6.3.10.2. Установка характеристик


       Функция установки характеристик воздействует на харак-

  теристики соответствующего накопителя на  магнитной  ленте.

  Установка  характеристик  является   функцией   физического

  ввода-вывода и требует привилегию доступа, необходимую  для

  выполнения  функций  физического  ввода-вывода.  Существует

  единственный код функции: IO$_SETCHAR.

       Данная функция использует следующий аргумент,  завися-

  щий от устройства  и  функции  (другие  аргументы  являются

  недействительными):

           P1 - адрес квадрослова буфера характеристик.

       На рис. 40 показано квадрослово  буфера  характеристик

  для функции установки характеристик.


          Буфер функции установки  характеристик

   31                        16 15           8 7           0
   +--------------------------------------------------------+
   !    Размер буфера          !      Тип     !    Класс    !
   +--------------------------------------------------------+
   !                 Характеристики ленты                   !
   +--------------------------------------------------------+

                            Рис. 40


       Первое длинное слово содержит информацию  о  классе  и

  типе устройства и размер  буфера.  Классом  устройства  для

  накопителей на магнитных лентах является DC$_TAPE.

       Макрокоманда $DCDEF определяет имена типов устройств и

  классов. Размер буфера, который должен  использоваться  для

  передач на накопителе на магнитной ленте, принимает  значе-

  ние по умолчанию (обычно размер равен 2048 байт).




                           - 347 -

                       00152-01 33 03-1


       6.3.11. Подтверждение пакета


       Функция подтверждения пакета устанавливает бит  допус-

  тимости тома для устройств накопителей на магнитной  ленте.

  Подтверждение   пакета   является   функцией    физического

  ввода-вывода и требует привилегию доступа, необходимую  для

  выполнения функций  физического  ввода-вывода.  Допускается

  единственный код функции: IO$_PACKACK.

       Данная функция не  требует  аргументов,  зависящих  от

  функции. Она должна быть первой  функцией  после  установки

  ленты на накопитель на магнитной ленте.  При  использовании

  команд INITIALIZE или MOUNT  функция  IO$_PACKACK  выдается

  автоматически.



       6.3.12. Доступность


       Функция доступности очищает бит допустимости тома  для

  всех накопителей на магнитной ленте, то  есть  ее  действие

  противоположно действию функции  подтверждения  пакета  (п.

  6.3.11). Функция  разгрузки  не  выдается  для  устройства.

  Допускается единственный код функции: IO$_AVAILABLE.

       Данная функция не  требует  аргументов,  зависящих  от

  функций.



       6.4. Блок состояния ввода-вывода


       Блок состояния ввода-вывода (IOSB) для функций  макро-

  команды $QIO на накопителях на магнитной ленте  показан  на

  рис. 41.



                           - 348 -

                       00152-01 33 03-1


       В приложении 1 перечисляются коды завершения для  этих

  функций. В табл. 35 (подраздел 6.2)  перечислены  зависящие

  от устройства данные, возвращаемые во второе длинное слово.

  Для возврата этих данных может  быть  использована  функция

  IO$_SENSEMODE.


           Содержимое блока состояния ввода-вывода

    31                         16 15                      0
   +-------------------------------------------------------+
   !     Счетчик байтов          !    Код завершения       !
   +-------------------------------------------------------+
   !         Данные, зависящие от устройства               !
   +-------------------------------------------------------+

                            Рис. 41


       Счетчик байтов - это фактическое число  байтов,  пере-

  данных в буфер процесса или из буфера процесса,  или  число

  пропущенных файлов или блоков.

       Если функция IO$_SKIPRECORD  завершается  обнаружением

  ленточного маркера, возвращаемое  значение  счетчика  равно

  числу пропущенных блоков плюс 1.



       6.5. Пример программирования


       В данном подразделе рассматривается  пример  программы

  записи и считывания данных на магнитную  ленту.  В  примере

  операции макрокоманды $QIO выполняются через  вспомогатель-

  ный управляющий процесс  (АСР)  накопителями  на  магнитных

  лентах. Эти операции могли быть  выполнены  непосредственно

  на устройстве, используя драйвер  накопителя  на  магнитной

  ленте. Однако, это потребовало бы дополнительного  програм-




                           - 349 -

                       00152-01 33 03-1


  мирования, например, записывания меток заголовков и  конеч-

  ных меток.

       Пример.

            .TITLE EXAMPLE

            .IDENT /01/



  ;

  ; определить необходимые символы

  ;



            $FIBDEF            ;определить символы блока FIB

            $IODEF             ;определить коды функции

                               ;ввода-вывода



  ;

  ; распределить память для необходимых структур данных

  ;



  ;

  ; распределить дескриптор и строку имени накопителя на

  ; магнитной ленте

  ;

  TAPENAME:                            ;

          .LONG     20$-10$            ;длина строки имени

          .LONG     10$                ;адрес строки имени

  10$:    .ACSII    /TAPE/             ;строка имени

  20$:                                 ;справочная метка




                           - 350 -

                       00152-01 33 03-1




  ;

  ;

  TAPECHAN:                            ;

          .BLKW     1                  ;номер канала для на-

                                       ;копителя на магнитной

                                       ;ленте



  ;

  ; распределить область для квадрослова состояния

  ; ввода-вывода

  ;



  IOSTATUS:                            ;

          .BLKQ     1                  ;квадрослово состояния

                                       ;ввода-вывода



  ;

  ; распределить память для буфера ввода-вывода

  ;



  BUFFER:

          .REPT     256

          .ASCII    /A/                ;инициализация буфера



          .ENDR






                           - 351 -

                       00152-01 33 03-1


  ;теперь мы определяем блок FIB, используемый

  ;вспомогательным управляющим процессом (АСР)

  ;для того,чтобы получить доступ к файлу. Мы даем часть

  ;информации в этот блок, а вспомогательный управляющий про-

  ;цесс будет давать дополнительную информацию

  ;

  FIB_DESCR:                           ;начало блока FIB

           .LONG     ENDFIB-FIB        ;длина блока  FIB

           .LONG     FIB               ;адрес блока FIB

  FIB:     .LONG     FIB$M_WRITE!FIB$M_NOWRITE  ;разрешенный

                                                ;доступ  к

                                                ;чтению-за-

                                                ;писи

           .WORD     0,0,0             ;идентификатор файла

           .WORD     0,0,0             ;идентификатор ката-

                                       ;лога

           .LONG     0                 ;контекст

           .WORD     0                 ;флаги имени

           .WORD     0                 ;управление расшире-

                                       ;нием

  ENDFIB:                              ;справочная метка



  ;

  ; теперь мы определяем строку имени файла и дескриптор

  ;



  NAME_DESCR:                          ;




                           - 352 -

                       00152-01 33 03-1


            .LONG     END_NAME-NAME    ;дескриптор имени

                                       ;файла

            .LONG     NAME             ;адрес строки имени

  NAME:     .ASCII    "MYDATA.DAT:1"   ;строка имени файла

  END_NAME:                            ;справочная метка



  ;

  ; теперь основная программа

  ;



  ; сначала программа назначает канал для накопителя на маг-

  ; нитной ленте. Затем, она выполняет функцию доступа, чтобы

  ; создать и получить доступ  к   файлу,    называемому

  ; "MYDATA.DAT". Далее, программа записывает на ленту 26

  ; блоков данных, содержащих буквы алфавита. Первый блок со-

  ; держит буквы а, следующий - буквы B , и так далее. Прог-

  ; рамма начинается записью блока букв A размером 256 бай-

  ; тов, и каждый последующий блок уменьшается в размере на

  ; два байта, так что к тому времени, когда она записывает

  ; блок, содержаший буквы Z, размер блока равняется только

  ; 206 байтам. Вспомогательный управляющий процесс (АСР) для

  ; накопителей на магнитной ленте не дает возможности про-

  ; читать файл, который был записан, пока  не произойдет

  ; одно из трех событий:

  ; 1)  доступ к файлу отменяется;

  ; 2) файл перематывается;

  ; 3) файл возвращается назад.




                           - 353 -

                       00152-01 33 03-1


  ; в данном примере файл возвращается назад на нуль блоков и

  ; затем читAется в обратном направлении (увеличение размера

  ; блока с каждым блоком и данные проверяются в зависимости

  ; от того, что там должно быть). Если  все  благополучно,

  ; доступ к файлу отменяется и происходит выход из программы

           .ENTRY    MAGTAPE_EXAMPLE,^M<R3,R4,R5,R6,R7,R8>



  ;

  ; сначала назначить канал для накопителя на магнитной ленте

  ;

           $ASSIGN_S TAPENAME,TAPECHAN     ;назначить накопи-

                                           ;тель на магнитной

                                           ;ленте

           CMPW    #SS$_NORMAL,R0          ;успешно?

           BSBW    ERRCHECK                ;проверено



  ;

  ; далее создать и получить доступ к файлу "MYDATA.DAT"

  ;



          $QIOW_S CHAN=TAPECHAN,-        ;канал для накопи-

                                         ;теля на магнитной

                                         ;ленте

                  FUNC=#IO$_CREATE!ID$M_ACCESS!IO$M_CREATE,-

                                         ;функция

                                         ;создaния

                    IOSB=IOSTATUS,-      ;адрес блока состо-




                           - 354 -

                       00152-01 33 03-1


                                         ;яния ввода-вывода

                    P1=FIB_DESCR,-       ;дескриптор блока

                                         ;FIB

                    P2=#NAME_DESCR       ;дескриптор имени

           CMPW     #SS$_NORMAL,R0       ;успешно?

           BSBW     ERRCHECK             ;проверено



  ;

  ; цикл LOOP1 состоит из записи алфавита на ленту

  ;



           MOVL     #26,R5                 ;устанoвить счет-

                                           ;чик цикла

           MOVL     #256,R3                ;установить перво-

                                           ;начальное коли-

                                           ;чество бAйтов в

                                           ;R3

  LOOP1:                                   ;начало цикла

           $QIOW_S  CHAN=TAPECHAN,-        ;выполнить макро-

                                           ;команду $QIO в

                                           ;канале накопителя

                                           ;на магнитной лен-

                                           ;те

                    FUNC=#IO$_WRITEVBLK,-  ;функция является

                                           ;записью виртуаль-

                                           ;ного блока

                     P1=BUFFER,-           ;адрес буфера




                           - 355 -

                       00152-01 33 03-1


                    P2=R3                  ;количество байтов

           CMPW     #SS$_NORMAL,R0         ;успешно?

           BSBW     ERRCHECK               ;прoверено



  ;

  ; теперь мы уменьшаем количество байтов, готовых для следу-

  ; ющей зaписи,устанавливаем счетчик циклa для корректировки

  ; символа и цикл LOOP2 выполняет корректировку.

  ;



           SUBL2    #2,R3                  ;уменьшить коли-

                                           ;чество байтoв

                                           ;для следующей за-

                                           ;писи

           MOVL     R3,R8                  ;скопировать коли-

                                           ;чество байтов в

                                           ;R8

           MOVAL    BUFFER,R7              ;для счетчика цик-

                                           ;ла LOOP2, полу-

                                           ;чить адрес буфера

                                           ;в регистре R7

  LOOP2:   INCB     (R7)+                  ;изменить текущий

                                           ;символ и перейти

                                           ;к следующему сим-

                                           ;волу

           SOBGTR   R8,LOоP2               ;повторять пока не

                                           ;будут изменены




                           - 356 -

                       00152-01 33 03-1


                                           ;все символы теку-

                                           ;щей записи

           SOBGTR   R5,LOOP1               ;повторять цикл

                                           ;LOOP1 пока не

                                           ;будут записаны

                                           ;все 26 блоков



  ;

  ; теперь мы выходим из цикла LOOP1 и должны скорректировать

  ; количество байтов, так чтобы оно правильно отображало

  ; размер последнего блока, записанного на ленте

  ;



           ADDL2    #2,R3                  ;скорректировать

                                           ;количество байтов

  ;

  ; теперь мы хотим прочитать ленту, но сначала должны выпол-

  ; нить управляющую функцию вспомогательного управляющего

  ; процесса, указывающую пропуск нуля блоков.  Этот специ-

  ; альный случай пропуска в обратном направлении и позволяет

  ; теперь разрешение доступа на чтение.



             CLRL    FIB+FIB$L_CNTRLVAL   ;установка на про-

                                           ;пуск 0 блоков

             MOVW    #FIB$C_SPACE,FIB+FIB$WS_CNTRLFUNC

                                           ;установка функции

                                           ;пропуска




                           - 357 -

                       00152-01 33 03-1


             $QIO*_S CHAN=TAPECHAN,-       ;выполнить макро-

                                           ;команду $QIO для

                                           ;канала ленты

                     FUNC=#IO$_ACPCONTROL,- ;выполнить управ-

                                           ;ляющую функцию

                                           ;вспомогательного

                                           ;управляющего про-

                                           ;цесса

                     P1=FIB_DESCR          ;определить блок

                                           ;FIB

             CMPW    #SS$_NORMAL,R0        ;успешно?



             BSBW    ERRCHECK              ;проверено



  ;

  ; чтение файла в обратном направлении

  ;



             MOVL    #26,R5                ;установить счет-

                                           ;чик цикла

             MOVB    #^A/Z/,R6             ;получить первый

                                           ;символ в R6

                                           ;

  LOOP3:

             MOVAL   BUFFER,R7             ;и адрес буфера в

                                           ;R7

             $QIOW_S CHAN=TAPECHAN,-       ;канал для ленты




                           - 358 -

                       00152-01 33 03-1


                     FUNC=#IO$_READVBLK!IO$M_REVERSE,- ;чте-

                                           ;ние в обратном

                                           ;направлении

                     IOSB=IOSTATUS,-       ;определить квад-

                                           ;рослово блока

                                           ;состояния ввода-

                                           ;вывода

                     P1=BUFFER,-           ;адрес буфера

                     P2=R3                 ;размер буфера

             CMPW    #SS$_NORMAL,R0        ;успешно?

             BSBW    ERRCHECK              ;проверено



  ;

  ; проверка прочитанных данных на соответствие записанным

  ;



             MOVL     R3,R4               ;счетчик цикла из

                                          ;R3 в R4

  CHECKDATA:                              ;

             CMPB     (R7)+,R6            ;проверяем каждый

                                          ;символ

             BNEQ     MISMATCH            ;если ошибка, печа-

                                          ;таем сообщение

             SOBGTR   R4,CHECKDATA        ;продолжаем до кон-

                                          ;ца

             DECB     R6                  ;двигаемся по aлфа-

                                          ;виту в обратном




                           - 359 -

                       00152-01 33 03-1


                                          ;направлении

             ADDL2    #2,R3               ;изменяем счетчик

                                          ;байтов на 2 для

                                          ;для следующего

                                          ;блока

             SOBGTR   R5,LOOP3            ;читаем следующий

                                          ;блок

  ;

  ; отменяем доступ к файлу

  ;



             $QIOW_S  CHAN=TAPECHAN,-    ;канал для ленты

                      FUNC=#IO$_DEACCESS,-;функция отмены

                                          ;доступа

                      IOSB=IOSTATUS       ;состояние ввода-

                                          ;вывода



  ;

  ; отменить назначение канала и выйти

  ;



  EXIT:      $DASSGN_S CHAN=TAPECHAN      ;отменить назначе-

                                          ;ние канала

             RET                          ;выйти



  ;

  ; если была обнаружена ошибка, в этом месте обычно размеща-




                           - 360 -

                       00152-01 33 03-1


  ; ется программа выдачи сообщений об ошибках. В данном при-

  ; мере просто выполняем выход

  ;





  MISMATCH:                               ;

                                          ;

             BRB        EXIT              ;выход

  ERRCHECK:                               ;

             BNEQ       EXIT              ;если неуспешно,

                                          ;выход

             RSB                          ;иначе - возврат

          .END       MAGTAPE_EXAMPLE
































                           - 361 -

                       00152-01 33 03-1


          7. Драйверы построчно-печатающих устройств



       Драйверы  построчно-печатающих  устройств  обслуживают

  построчно-печатающие устройства, поддерживаемые  операцион-

  ной системой МОС ВП.



       7.1. Характерные  свойства   и   возможности

            драйвера. Средства контроля


       Драйверы построчно-печатающего устройства обеспечивают

  форматирование выводимых символов и обработку ошибок.  (пп.

  7.1.1, 7.1.2).



       7.1.1. Форматирование выводимых символов


       Данные в операциях записи физического блока не  форма-

  тируются, а выводятся непосредственно. В  операциях  записи

  виртуального и  логического  блоков  символы,  передаваемые

  пользователем, выводятся следующим образом:

       1) знаки забоя отбрасываются;

       2) если не  сброшена  характеристика  LP$M_TAB,  знаки

  табуляции перемещают горизонтальную позицию печати  к  сле-

  дующей позиции по модулю 8;

       3)  перед  печатью  все  алфавитные  символы   нижнего

  регистра преобразуются в символы  верхнего  регистра,  если

  только не устанавливается  характеристика,  указывающая  на

  символы нижнего регистра (подраздел 7.2, п. 7.3.3);

       4) на печатающих устройствах, где знаки перевода стро-




                           - 362 -

                       00152-01 33 03-1


  ки, перевода формата,  вертикальной  табуляции  и  возврата

  каретки  очищают  буфер  печатающего  устройства,  возвраты

  каретки задерживаются и выводятся  только  в  случае,  если

  следующий знак не является знаком перевода формата, перево-

  да строки  или  вертикальной  табуляции.  Возвраты  каретки

  всегда выводятся на устройствах, которые имеют  характерис-

  тику LP$M_CR (см. подраздел 7.2, п. 7.3.3);

       5) горизонтальная позиция печати  получает  приращение

  при выводе всех символов, включая символ  пробела.  Символы

  не учитываются, если горизонтальная  позиция  печати  равна

  или больше  ширины  каретки,  если  только  не  установлена

  характеристика LP$M_WRAP;

       6) на печатающих устройствах без механического перево-

  да формата  (характеристика  функции  перевода  формата  не

  установлена) перевод формата преобразуется  в  многократные

  переводы строки. Количество переводов  строки  основывается

  на подсчете текущих строк и длине страницы;

       7) печатаемые строки подсчитываются и получаемое число

  возвращается в вызывающую программу во второе длинное слово

  блока состояния ввода-вывода.



       7.1.2. Обработка ошибок


       Драйверы построчно-печатающего устройства в операцион-

  ной системе МОС ВП выполняют следующие  операции  обработки

  ошибок:

       - если печатающее устройство находится  в  течение  30

         секунд в автономном режиме, то сообщение о том,  что



                           - 363 -

                       00152-01 33 03-1


         устройство не готово, посылается процессу  оператора

         системы;

       - если печатающее устройство работает без  бумаги  или

         имеет неисправность, то сообщение о  том,  что  уст-

         ройство  не  готово,  посылается  оператору  системы

         через 30 секунд.  Последующие  сообщения  посылаются

         через 1,2,4,8... Минут после первоначального сообще-

         ния;

       - текущая операция выполняется снова  через  каждые  2

         секунды, чтобы проверить, не изменилась ли ситуация;

         например, не перешло ли печатающее устройство в сос-

         тояние готовности;

       - текущая операция ввода-вывода может быть отменена  в

         течение следующего тайм-аута без  ожидания  перехода

         печатающего устройства в состояние готовности;

       - когда печатающее устройство  переходит  в  состояние

         готовности, работа возобновляется автоматически.



       7.2. Информация об устройстве


       Процесс  пользователя  может  получить  информацию   о

  характеристиках печатающего устройства с  помощью  программ

  системного обслуживания $GETDVI, $GETCHN, или $GETDEV.

       Рекомендуется, чтобы новые программы использовали  для

  получения информации  об  устройстве  программу  системного

  обслуживания $GETDVI.

       Программы системного обслуживания  $GETCHN  и  $GETDEV

  возвращают информацию о конкретном печатающем устройстве  в



                           - 364 -

                       00152-01 33 03-1


  первые три длинных слова буфера, определяемого  пользовате-

  лем, как показано на рис. 42.


             Информация о печатающем устройстве


  31              24 23         16 15        8 7           0
  +---------------------------------------------------------+
  !            Характеристики устройства                    !
  +---------------------------------------------------------+
  !      Ширина страницы          !    Тип    !   Класс     !
  +---------------------------------------------------------+
  !  Длина страницы ! Характеристики печатающего устройства !
  +---------------------------------------------------------+

                            Рис. 42


       Первое длинное слово содержит данные,  независящие  от

  устройства. Второе и третье длинные слова содержат  данные,

  зависящие от устройства.

       В  табл.  38  перечислены  независящие  от  устройства

  характеристики, возвращаемые в первое длинное слово.


                                                   Таблица 38

            Характеристики печатающего устройства,

                   независящие от устройства

  -----------------------------------------------------------

  Характеристика !       Назначение

  -----------------------------------------------------------

              1) !

  DEV$M_SPL      ! Устройство, участвующее в спулинге

              1) !

  DEV$M_AVL      ! Печатающее устройство подключено и свобод-

                 ! но




                           - 365 -

                       00152-01 33 03-1


                                         Продолжение табл. 38

  -----------------------------------------------------------

  Характеристика !       Назначение

  -----------------------------------------------------------

              2) !

  DEV$M_REC      ! Устройство, ориентированное на записи

              2) !

  DEV$M_CCL      ! Управление кареткой

              2) !

  DEV$M_ODV      ! Устройство готово к выводу

  --------------------

       1) динамический бит (устанавливается по условию).

       2) статический бит (установлен всегда).

       Значения  характеристик   определяются   макрокомандой

  $DEVDEF.

       Во втором длинном слове указывается, что классом  уст-

  ройства является DC$_LP. Тип печатающего устройства  -  это

  значение,  которое  соответствует  печатающему  устройству:

  LP$_LP27 или LP$_LA11. Ширина страницы  -  это  величина  в

  диапазоне от 0 до 255.

       Третье длинное слово содержит характеристики  печатаю-

  щего устройства и длину страницы. Поле характеристик  печа-

  тающего устройства может содержать любое из значений, пере-

  численных в табл. 39.










                           - 366 -

                       00152-01 33 03-1


                                                   Таблица 39

            Характеристики печатающего устройства,

                    зависимые от устройства

  -----------------------------------------------------------

 Ххарактеристика !             Назначение

  -----------------------------------------------------------

  LP$M_CR        ! Печатающее устройство требует возврата

                 ! каретки (п. 7.1.1)

  LP$M_LOWER     ! Печатающее устройство может печатать сим-

                 ! волы нижнего регистра.

                 ! Если данное значение не устанавливается,

                 ! при выводе все символы нижнего регистра

                 ! преобразуются в символы верхнего регистра.

                 ! (LP$M_LOWER не оказывает никакого воздей-

                 ! ствия на операции записи физического бло-

                 ! ка)

  LP$M_MECHFORM  ! Печатающее устройство имеет механический

                 ! перевод формата. Данная характеристика

                 ! используется в случае, когда  требуется

                 ! переменная длина формата. Драйвер посылает

                 ! перевод формата (десятичное 12). В против-

                 ! ном случае, генерируются многократные пе-

                 ! реводы строки. Длина страницы определяет

                 ! количество переводов строки

  LP$M_PASSALL   ! Все выходные данные имеют двоичный вид

                 ! (никакой интерпретации данных не происхо-

                 ! дит). Окончание данных имеет место, когда




                           - 367 -

                       00152-01 33 03-1


                                         Продолжение табл. 39

  -----------------------------------------------------------

  Характеристика !             Назначение

  -----------------------------------------------------------

                 ! буфер заполнен (по умолчанию размер буфера

                 ! равен 132 байтам). Форматирование символов

                 ! запрещается

  LP$M_PRINTALL  ! Все печатающиеся и непечатающиеся символы

                 ! передаются в печатающее устройство, в то

                 ! время как форматирование символов остается

                 ! разрешенным

  LP$M_TAB       ! Разрешает табуляцию

  LP$M_TRUNCATE  ! Печатающее устройство усекает записи с

                 ! длиной больше ширины каретки

  LP$M_WRAP      ! Печатающее устройство переносит записи,

                 ! которые являются более длинными, чем шири-

                 ! на каретки. Если строка текста длиннее,

                 ! чем ширина страницы, указанная во втором

                 ! длинном слове буфера характеристик, строка

                 ! символов продолжается на  следующей строке

  LP$M_FALLBACK  ! Печатающее устройство переводит символы

                 ! многонационального набора в эквивалентное

                 ! представление в 7-битном коде, если это

                 ! возможно. В противном случае, символ заме-

                 ! няется на символ подчеркивания (_). Харак-

                 ! теристика LP$M_FALLBACK не влияет на опе-

                 ! рации   с   физическими   блоками.   В




                           - 368 -

                       00152-01 33 03-1


                                         Продолжение табл. 39

  -----------------------------------------------------------

  Характеристика !             Назначение

  -----------------------------------------------------------

                 ! приложении 2 дана таблица символов много-

                 ! национального набора


       Максимальная длина страницы равна 255.

       Макрокоманда $LPDEF определяет значения  для  характе-

  ристик печатающего устройства, а макрокоманда $DCDEF  опре-

  деляет класс и типы устройств.



       7.3. Коды   функций    построчно-печатающего

            устройства


       Основными функциями ввода-вывода построчно-печатающего

  устройства являются: запись, считывание режима и  установки

  режима. Ни один из кодов функций не использует модификаторы

  функций.



       7.3.1. Запись


       Функции записи построчно-печатающего устройства  печа-

  тают содержимое буфера пользователя на указанном печатающем

  устройстве.

       Функции записи и их коды  в  макрокоманде  $QIO  имеют

  вид:

       1) IO$_WRITEVBLK - запись виртуального блока;





                           - 369 -

                       00152-01 33 03-1


       2) IO$_WRITELBLK - запись логического блока;

       3) IO$_WRITEPBLK - запись физического  блока.  (данные

  не форматируются, а выводятся непосредственно, как в режиме

  PASSALL).

       Коды функций записи могут использовать следующие зави-

  сящие от устройства и функции аргументы:

       1) P1 - начальный виртуальный  адрес  буфера,  который

  должен быть записан;

       2) P2 - количество байтов, которые должны быть записа-

  ны;

       3) P3 - (игнорируется);

       4) P4 - спецификатор управления кареткой. (за исключе-

  нием операций записи физического блока). Управление  карет-

  кой для функций записи описывается в подпункте 7.3.1.1.

       Аргументы  P3,   P5   и   P6   для   операций   записи

  построчно-печатающего устройства не имеют смысла. В  опера-

  циях записи виртуального блока и записи  логического  блока

  буфер, указываемый аргументами P1 и P2,  форматируется  для

  выбранного  построчно-печатающего  устройства,  и  включает

  информацию об управлении кареткой,  указываемую  аргументом

  P4. Размер буфера по умолчанию равен 132 байтам.

       Если устанавливается,  что  печатающее  устройство  не

  принимает участия в спулинге, то виртуальная запись и логи-

  ческая запись выполняют одну и ту же функцию. Если устанав-

  ливается, что печатающее устройство участвует  в  спулинге,

  функция логической записи  формирует  очередь  ввода-вывода

  для печатающего устройства, а  функция  виртуальной  записи




                           - 370 -

                       00152-01 33 03-1


  формирует очередь ввода-вывода для промежуточного устройст-

  ва, обычно для диска.

       Все символы нижнего регистра преобразуются  в  символы

  верхнего регистра в том случае, если характеристики выбран-

  ного печатающего устройства  не  включают  LP$M_LOWER  (это

  значение характеристики не применяется к  операциям  записи

  физического блока).

       Многократные переводы строк генерируются для  перевода

  формата только в том случае, если печатающее устройство  не

  имеет механического перевода формата, то есть,  характерис-

  тики LP$M_MECHFORM. Количество генерируемых переводов стро-

  ки зависит от положения данной страницы и длины страницы.



       7.3.1.1. Управление кареткой для функций записи


       Аргумент P4 - это длинное слово, в котором используют-

  ся  характеристики  управления   кареткой.   Характеристики

  управления кареткой определяют следующую позицию печати  на

  построчно-печатающем устройстве. В операции записи физичес-

  кого блока аргумент P4 игнорируется.  На  рис.  43  показан

  формат длинного слова аргумента P4.


        Спецификатор управления кареткой (аргумент P4)

              3          2           1           0
         +------------------------------------------+
         !          !          !          !         !
     P4: ! Постфикс ! Префикс  !Не исполь-! Фортран !
         !          !          !зуется    !         !
         +------------------------------------------+

                            Рис. 43





                           - 371 -

                       00152-01 33 03-1


       В длинном слове используются только байты 0,  2  и  3.

  Байт 1 игнорируется. Если младший байт (байт 0) не равен 0,

  содержимое длинного слова интерпретируется как спецификатор

  управления кареткой в программах на языке  программирования

  фортран. В табл. 40 перечислены возможные значения байта  0

  (в шестнадцатеричном виде) и их назначение.

       Если младший байт (байт 0) равен 0, байты 2 и 3  длин-

  ного слова аргумента P4 интерпретируются как  спецификаторы

  префиксного и  постфиксного  управления  кареткой.  Префикс

  (байт 2) определяет  управление  кареткой  перед  тем,  как

  содержимое буфера будет напечатано. Постфикс (байт 3) опре-

  деляет управление кареткой после того, как содержимое буфе-

  ра будет напечатано.

       Префиксный и постфиксный байты, хотя и интерпретируют-

  ся различно, используют одну и ту же схему кодирования. Эта

  схема кодирования в шестнадцатеричном формате  показана  на

  рис. 44.
























                           - 372 -

                       00152-01 33 03-1


                                                   Таблица 40

  Управление кареткой для функции записи (байт 0 не равен 0)

  -----------------------------------------------------------

   Шестнадцате-! Символ   !

    ричное     ! кода     !     Назначение

    значение   ! КОИ-8    !

    байта  0   !          !

  -----------------------------------------------------------

      20       ! Пробел   ! Управление кареткой с одним пере-

               !          ! водом строки (последовательность:

               !          ! новая строка, новая строка, пе-

               !          ! чать содержимого буфера, возврат

               !          ! каретки)

      30       !    0     ! Управление кареткой с двумя пере-

               !          ! водами строки (последователь-

               !          ! ность: новая строка, печать со-

               !          ! держимого буфера, возврат карет-

               !          ! ки)

      31       !    1     ! Управление кареткой с переводом

               !          ! страницы. (Последовательность:

               !          ! перевод страницы, печать содержи-

               !          ! мого буфера, возврат каретки)

      2B       !    +     ! Управление кареткой для печати по

               !          ! уже напечатанному. (Последова-

               !          ! тельность: печать содержимого бу-

               !          ! фера, возврат каретки). Дает воз-

               !          ! можность печатать дважды, для то-




                           - 373 -

                       00152-01 33 03-1


                                         Продолжение табл. 40

  -----------------------------------------------------------

   Шестнадцате-! Символ   !

    ричное     ! кода     !     Назначение

    значение   ! КОИ-8    !

    байта  0   !          !

  -----------------------------------------------------------

               !          ! го чтобы выделить напечатанное

               !          ! или для получения специальных

               !          ! эффектов

      24       !    $     ! Управление кареткой для работы

               !          ! с подсказками. (Последователь-

               !          ! ность: новая строка, печать со-

               !          ! держимого буфера)

  Все осталь-  !          ! Управление кареткой с одним пере-

  ные значения !          ! водом строки. (Последователь-

               !          ! ность: новая строка, печать со-

               !          ! держимого буфера, возврат карет-

               !          ! ки)




















                           - 374 -

                       00152-01 33 03-1


    Управление кареткой для функции записи (байт 0 равен 0)

       Префиксный байт (байт 2)

     7       6                     0
  +---------------------------------+   Характеристики управ-
  !  0   !            0             !   ления кареткой не
  +---------------------------------+   заданы


     7       6                    0
  +--------------------------------+   Биты с 0 по 6-ой -
  !  0   !        1-7F             !   это количество новых
  +--------------------------------+   строк, состоящих из
                                       возврата каретки, со-
                                       провождаемого пере-
                                       водом строки

       Постфиксный байт (байт 3)

     7       6      5   4          0
  +---------------------------------+   Вывод одного управля-
  !  1   !   0  !   0  !   1-1F     !   ющего символа КОИ-8,
  +---------------------------------+   указываемого битами
                                        с 0 по 4-ый

     7       6      5   4          0
  +---------------------------------+   Вывод одного управля-
  !  1   !   1  !   0  !   1-1F     !   ющего символа КОИ-8,
  +---------------------------------+   указываемого битами
                                        с 0 по 4-ый, которые
                                        преобразуются  как
                                        символы кода КОИ-8
                                        со 128-го по 159

                            Рис. 44


       На рис. 45 показано префиксное и постфиксное кодирова-

  ние, которое формирует функции управления кареткой.
















                           - 375 -

                       00152-01 33 03-1



         Управление кареткой для функции записи

         (префиксное и постфиксное кодирование)

      +--------------------------------+ Последовательность:
  P4: !  8D    !   1    !   -   !   0  !
      !        !        !       !      !  ПС - печать - ВК
      +--------------------------------+


      +--------------------------------+ Последовательность:
  P4: !  8D    !   2    !   _   !   0  !
      !        !        !       !      ! ПС, ПС -печать - ВК
      +--------------------------------+


      +--------------------------------+ Последовательность:
  P4: !  8D    !   8C   !   _   !   0  !
      !        !        !       !      !  ПФ - печать - ВК
      +--------------------------------+


      +--------------------------------+ Последовательность:
  P4: !  8D    !   0    !   _   !   0  !
      !        !        !       !      !   Печать - ВК
      +--------------------------------+


      +--------------------------------+ Последовательность:
  P4: !   0    !   8A   !   _   !   0  !
      !        !        !       !      !    ПС - печать
      +--------------------------------+


      +--------------------------------+ Последовательность:
  P4: !  8D    !   18   !   _   !   0  !
      !        !        !       !      ! 24 ПС - печать - ВК
      +--------------------------------+

                            Рис. 45


       В  примере  префиксное/постфиксное   шестнадцатеричное

  кодирование для управления кареткой с одним переводом стро-

  ки (новая строка, печать содержимого буфера, возврат карет-

  ки) получается при помещении значения (1) во  второй  (пре-

  фиксный) байт, а суммы значения бита 7 (80) и кода возврата

  каретки (D) в третий (постфиксный) байт.



                           - 376 -

                       00152-01 33 03-1


       Пример.


       80(бит 7=1)

     +  D (возврат)

     ----------------

       8D (постфикс = возврат)



       7.3.2. Считывание режима


       Функция считывает зависящие от устройства  характерис-

  тики конкретного построчно-печатающего устройства и возвра-

  щает  их  во   второе   длинное   слово   блока   состояния

  ввода-вывода. Функция IO$_SENSEMODE не  использует  никаких

  аргументов, зависящих от функции/устройства.



       7.3.3. Установка режима


       Функции установки  режима  воздействуют  на  работу  и

  характеристики соответствующего построчно-печатающего  уст-

  ройства. Операционная система МОС ВП обеспечивает два  типа

  функций установки:

       1) установка режима;

       2) установка характеристик.

       Установка  режима   требует   привилегии   логического

  ввода-вывода. Установка  характеристик  требует  привилегии

  физического ввода-вывода. Предлагается два кода функции:

       1) IO$_SETMODE - установка режима;

       2) IO$_SETCHAR - установка характеристик.





                           - 377 -

                       00152-01 33 03-1


       Данные функции используют следующий зависящий от  уст-

  ройства и функции аргумент (другие аргументы недействитель-

  ны):

        P1- адрес буфера характеристик.

       Квадрослово буфера для функции IO$_SETMODE показано на

  рис. 46. Такой же буфер для функции IO$_SETCHAR показан  на

  рис. 47.


      Буфер характеристик функции установки режима

  31            24 23         16 15                       0
  +--------------------------------------------------------+
  !    Ширина страницы          !    Не используется       !
  !--------------------------------------------------------+
  ! Длина страницы ! Характеристики печатающего устройства !
  +--------------------------------------------------------+

                            Рис. 46


     Буфер характеристик функции установки характеристик

  31            24 23         16 15         8 7           0
  +--------------------------------------------------------+
  !    Ширина страницы          !     Тип    !    Класс    !
  !--------------------------------------------------------+
  ! Длина страницы ! Характеристики печатающего устройствакла
  !--------------------------------------------------------+
  ! Длина страницы ! Характеристики печатающего устройствава
    пом печатающего
  устройства является значение, которое соответствует печатаю
  устройству: DT$_LP27 или DT$_LA11. Тип может быть изменен ф
  IO$_SETCHAR. Ширина страницы- это значение в диапазоне от 0
       Часть буфера, где находятся характеристики печатающего
  устройства, может содержать любое из значений,  перечислен-
  ных в табл. 39.



       7.4. Блок состояния ввода-вывода


       Блоки состояния ввода-вывода (IOSB) для функций записи
  и установки режима показаны на рис.  48  и  рис.  49.  Коды
  завершения, передаваемые указанными функциями перечислены в
  приложении 1.




                           - 378 -

                       00152-01 33 03-1



            Содержимое IOSB для функции записи

  31                          16 15                       0
  +--------------------------------------------------------+
  !   Количество байтов         !    Код   завершения      !
  !--------------------------------------------------------+
  ! Количество строк, на которое переместилась бумага   1) !
  +--------------------------------------------------------+

  1) 0 - если используется функция записи IO$_WRITEPBLK

                            Рис. 48


         Содержимое IOSB для функции установки режима

  31                          16 15                       0
  +--------------------------------------------------------+
  !               0             !      Код  завершения     !
  +--------------------------------------------------------+
  !                             0                          !
  +--------------------------------------------------------+

                            Рис. 49


       7.5. Пример программирования


       В данном подразделе рассматривается  пример  программы

  ввода-вывода на  построчно-печатающее  устройство,  который

  показывает, как использовать различные  форматы  управления

  кареткой. Данная программа распечатывает содержимое  выход-

  ного буфера (OUT_BUFFER) десять раз, используя десять  раз-

  личных форматов управления кареткой. Форматы  содержатся  в

  поле OUTPUT_FORMAT.

       Пример.







          .TITLE EXAMPLE




                           - 379 -

                       00152-01 33 03-1




          .IDENT  /01/



  ;определить необходимые символы

  ;

          $IODEF                       ;определить коды функ-

                                       ;ции ввода-вывода

  ;распределить память для необходимых структур данных

  ;

  ;выделить буфер вывода и заполнить его требуемым

  ;выходным текстом

  ;

  OUT_BUFFER:

          .ASCII  "PRINTER_EXAMPLE"

  OUT_BUFFER_SIZE=.-OUT_BUFFER         ;определить размер

                                       ;выходной строки



  ;

  ;выделить строку имени устройства и дескриптор

  ;

  DEVICE_DESCR:

          .LONG   20$-10$           ;длина строки имени

          .LONG   10$               ;адрес строки имени

  10$:    .ASCII  /LINE_PRINTER/    ;строка имени устройства

                                    ;вывода

  20$:                              ;метка для вычисления

                                    ;длины




                           - 380 -

                       00152-01 33 03-1


  ;

  ;выделить область для хранения назначенного номера канала

  ;

  DEVICE_CHANNEL:                   ;

          .BLKW   1                 ;номер канала

  ;

  ;установить форматы управления кареткой

  ;

  OUTPUT_FORMAT:

  ;управление кареткой через нулевой байт спецификатора

          .BYTE   0,0,0,0            ;управление кареткой

                                     ;отсутствует

          .BYTE   32,0,0,0           ;пробел=ПС+...текст..+ВК

          .BYTE   48,0,0,0           ;нуль=ПС+ПС+.текст..+ВК

          .BYTE   49,0,0,0           ;один=ПФ+...текст....+ВК

          .BYTE   43,0,0,0           ;плюс=печать с нало-

                                     ;жением....+ ВК

          .BYTE   36,0,0,0           ;$=ПС+текст(подсказка)

  ;

  ;форматы префиксного и постфиксного управления кареткой

  ;

          .BYTE   0,0,1,141           ;ПС+.....текст.....+ВК

          .BYTE   0,0,24,141          ;24ПС+...текст.....+ВК

          .BYTE   0,0,2,141           ;ПС+ПС+..текст.....+ВК

          .BYTE   0,0,140,141         ;ПФ+.....текст.....+ВК



  ;точка старта программы




                           - 381 -

                       00152-01 33 03-1


  ;

  ;программа назначает канал для устройства вывода, устанав-

  ;ливает счетчик циклов для количества выводов на печать,

  ;выполняет десять макрокоманд $QIOW. Затем назначение кана-

  ;ла отменяется.

  ;

        .ENTRY  PRINTER_EXAMPLE,^M<R2,R3>     ;адрес старта

                                              ;программы



  ;

  ;первое назначение канала для устройства вывода

  ;

         $ASSIGN_S DEVNAM=DEVICE_DESCR,-   ;назначить канал

                                           ;для печатающего

                                           ;устройства

                  CHAN=DEVICE_CHANNEL      ;

          BLBC    R0,50$                  ;если младший бит

                                          ;очищен, назначение

                                          ;ошибочно

          MOVL    #11,R3                  ;установить счетчик

                                          ;циклов

          MOVAL   OUTPUT_FORMAT,R2        ;установить адрес

                                          ;формата в R2



  ;

  ;старт цикла печати

  ;




                           - 382 -

                       00152-01 33 03-1


  30$:    $QIOW_S CHAN=DEVICE_CHANNEL,-   ;печать по каналу

                                          ;устройства

                  FUNC=#10$_WRITEVBLK,-   ;функция ввода-вы-

                                          ;вода- "запись вир-

                                          ;туального блока"

                  P1=OUT_BUFFER,-         ;адрес буфера выво-

                                          ;да

                  P2=#OUT_BUFFER_SIZE,-   ;размер буфера для

                                          ;печати

                  P4=(R2)+                ;управление форма-

                                          ;том

          BLBC    R0,40$                  ;если младший бит

                                          ;очищен,  ошибка

                                          ;ввода-вывода

          SOBGTR  R3,30$                  ;переход, если еще

                                          ;не конец

  40$:    $DASSGN_S CHAN=DEVICE_CHANNEL   ; отменить назначе-

                                          ;ние канала

  50$:    RET                             ;возврат

          .END    PRINTER_EXAMPLE


















                           - 383 -

                       00152-01 33 03-1


                  8. Драйвер почтового ящика



       Операционная система МОС ВП  поддерживает  виртуальное

  устройство, называемое почтовым ящиком, которое использует-

  ся для передачи сообщений  между  процессами.  Стандартного

  формата сообщений для почтового ящика не существует,  и  на

  пользователя не накладывается никаких ограничений. Для про-

  цессов почтовые ящики обеспечивают  средства  управления  и

  синхронизации обмена данными. Хотя почтовые ящики  в  боль-

  шинстве своем передают информацию таким же образом,  что  и

  остальные устройства ввода-вывода, они не являются реальны-

  ми устройствами, а  скорее  программно-реализованными  уст-

  ройствами, которые могут выполнять операции чтения и  запи-

  си.



       8.1. Операции почтового ящика


       Работа с почтовыми ящиками может происходить в следую-

  щих режимах:

       1) процесс инициирует чтение  почтового  ящика,  чтобы

  получить данные, посланные другим процессом. Процесс читает

  данные, если сообщение предварительно было передано в  поч-

  товый ящик;

       2) процесс указывает, что он хочет  быть  уведомлен  с

  помощью AST прерывания, когда сообщение послано в  почтовый

  ящик;

       3) процесс инициирует запрос на запись в почтовый ящик

  для передачи данных другому процессу. Посылающий процесс не



                           - 384 -

                       00152-01 33 03-1


  ждет, пока данные будут прочитаны принимающим процессом  до

  завершения операции ввода-вывода;

       4) процесс инициирует запрос на запись в почтовый ящик

  для передачи данных другому  процессу.  Посылающий  процесс

  ждет, пока принимающий процесс считает данные до завершения

  операции ввода-вывода;

       5) принимающий процесс читает сообщения  из  почтового

  ящика, отбрасывает ненужные и реагирует только на  полезные

  сообщения.



       8.1.1. Создание почтовых ящиков


       Процесс использует программу  системного  обслуживания

  $CREMBX для создания почтового ящика и назначения канала  и

  логического имени для него. Система вводит  логическое  имя

  либо в системную (постоянный почтовый ящик), либо в группо-

  вую (временный почтовый ящик)  таблицу  логических  имен  и

  дает ему эквивалентное имя MBAN, где  N  -  это  уникальный

  номер устройства. Программа системного обслуживания $CREMBX

  также устанавливает  характеристики  почтового  ящика.  Эти

  характеристики включают маску защиты, индикатор  постоянст-

  ва, размер максимального сообщения и размер буфера.  Другие

  процессы могут назначать дополнительные каналы для почтово-

  го ящика, используя либо программу системного  обслуживания

  $CREMBX, либо программу  системного  обслуживания  $ASSIGN.

  Почтовый ящик определяется своим логическим именем и тогда,

  когда он создается, и тогда, когда назначаются каналы взаи-

  модействующими процессами.



                           - 385 -

                       00152-01 33 03-1


       Создание почтовых ящиков требует определенных привиле-

  гий. Если нет в наличии достаточной динамической памяти для

  структуры данных почтового ящика, то  процесс  переходит  в

  режим ожидания ресурсов, если  он  разрешен.  При  создании

  почтового ящика определяется конкретный размер буфера сооб-

  щений, которые записаны в почтовый ящик, но еще не считаны.

  Аргумент  BUFQUO  для  программы  системного   обслуживания

  $CREMBX определяет этот размер. Если этот аргумент не  ука-

  зан,  его  значением   по   умолчанию   является   параметр

  DEFMBXBUFQUO, задаваемый при генерации системы.

       Сообщение, записываемое в почтовый ящик  в  отсутствии

  незавершенного запроса чтения, ставится в очередь к  почто-

  вому ящику, и размер сообщения (аргумент макрокоманды $QIO)

  вычитается из имеющегося в наличии буферного  пространства.

  После того, как сообщение прочитано, размер буфера  возвра-

  щается, то есть размер сообщения складывается с имеющимся в

  наличии буферным пространством.

       Если процесс пытается выдать данные в  почтовый  ящик,

  который  уже  заполнен  или  имеет  недостаточное  буферное

  пространство  (что  является  ошибкой),  и  режим  ожидания

  ресурсов разрешен для процесса,  то  процесс  помещается  в

  общий режим ожидания ресурсов пока в почтовом ящике не поя-

  вится достаточное пространство. Если же  ожидание  ресурсов

  не разрешено, то операция ввода-вывода завершается с  кодом

  состояния SS$_MBFULL в блоке состояния ввода-вывода.

       Пример программы (подраздел 8.5) иллюстрирует создание

  почтового ящика и связь между процессами.




                           - 386 -

                       00152-01 33 03-1


       8.1.2. Удаление почтовых ящиков


       Система ведет счет всех каналов, назначенных для  вре-

  менного почтового ящика. Если заканчивается какой-либо про-

  цесс, использующий почтовый ящик, то этот процесс  отменяет

  назначение канала, используя программу системного  обслужи-

  вания "отменить назначение канала ввода-вывода"  ($DASSGN).

  Количество каналов уменьшается на единицу. Система  автома-

  тически удаляет почтовый ящик,  когда  не  остается  больше

  назначенных для него каналов.

       Если отменяется назначение канала почтового ящика,  то

  удаляются все сообщения,  передаваемые  через  этот  канал,

  если в запросе передачи не определялся модификатор  функции

  IO$M_NOW.

       Постоянные почтовые ящики должны  быть  удалены  явно,

  используя программу системного обслуживания "удалить почто-

  вый ящик" ($DELMBX). Это может  случиться  в  любое  время.

  Кроме того, почтовый ящик фактически  удаляется,  когда  не

  остается процессов, имеющих назначенные на него каналы.

       Когда удаляется временный  почтовый  ящик,  его  квота

  буфера сообщений возвращается  в  процесс,  создавший  этот

  ящик.



       8.1.3. Защита почтового ящика


       Почтовые ящики (и временные, и постоянные)  защищаются

  кодом, или маской, аналогично коду, используемому для защи-

  ты томов. Как и для томов, четыре типа пользователей (опре-




                           - 387 -

                       00152-01 33 03-1


  деленных с помощью кода идентификации  пользователя  (UIC))

  могут получить доступ к почтовому ящику: система, владелец,

  группа и все. Для пользователей почтового ящика имеют  зна-

  чение только три типа доступа:

       1) логический ввод-вывод;

       2) чтение;

       3) запись.

       При создании почтового ящика пользователь может специ-

  фицировать  доступ  к  почтовому  ящику   для   логического

  ввода-вывода, чтения и записи  отдельно  для  каждого  типа

  пользователя. Доступ к логическому  вводу-выводу  требуется

  для выполнения некоторой операции почтового ящика.  Модифи-

  катор функции установки защиты обеспечивает  дополнительный

  контроль доступа к почтовому ящику (п. 8.3.5). Так как вре-

  менные почтовые ящики обычно используются для связей  между

  взаимодействующими процессами, имеющими одинаковый  группо-

  вой номер, то они представляют здесь особый интерес.  Логи-

  ческие имена этих почтовых ящиков заносятся в таблицу груп-

  повых логических имен.  Поэтому  временные  почтовые  ящики

  имеют два уровня  защиты.  Во-первых,  свободный  доступ  к

  логическим именам временных почтовых ящиков предоставляется

  только пользователям, которые имеют тот же групповой номер,

  что и создатель почтового ящика; остальные пользователи  не

  имеют свободного доступа. Во-вторых,  создатель  временного

  почтового ящика  обеспечивает  дополнительную  безопасность

  почтовому ящику путем использования маски защиты. Как  пра-

  вило, те пользователи, которые не занесены в ту же  группу,




                           - 388 -

                       00152-01 33 03-1


  что и создатель, полностью исключаются из пользования  поч-

  товым ящиком. Кроме того,  создатель  временного  почтового

  ящика может различать владельцев и других групповых  членов

  при предоставлении доступа для чтения и доступа для  записи

  к временному почтовому ящику.  Например,  владельцам  может

  быть разрешен только доступ для чтения  или  только  доступ

  для записи к почтовому ящику,  а  остальным  членам  группы

  могут быть разрешены оба вида доступа.



       8.2. Информация о почтовом ящике


       Пользователи могут получить информацию о характеристи-

  ках почтового ящика, используя программы системного  обслу-

  живания $GETDVI, $GETCHN или $GETDEV.

       Рекомендуется,  чтобы  новые  программы   использовали

  программу системного  обслуживания  $GETDVI  для  получения

  информации об устройстве.

       $GETCHN и $GETDEV возвращают информацию  о  конкретном

  почтовом ящике в первое из четырех длинных  слов  заданного

  пользователем буфера, формат буфера показан на рис. 50.



















                           - 389 -

                       00152-01 33 03-1


              Информация о почтовом ящике


    31                    16 15        8 7         0
    +-------------------------------------------------+
    !          Характеристики устройства              !
    +-------------------------------------------------+
    !    Размер буфера      !    Тип    !    Класс    !
    +-------------------------------------------------+
    !   Не используется     ! Количество  сообщений   !
    !                       ! в  почтовом  ящике      !
    +-------------------------------------------------+
                            !   Номер  почтового      !
                            !        ящика            !
                            +-------------------------+

                            Рис. 50

       Первое длинное слово в буфере содержит  характеристики

  устройства, приведенные в  табл.  41  макрокоманда  $DEVDEF

  определяет эти значения.

                                                   Таблица 41

                Характеристики почтового ящика

  -----------------------------------------------------------

  Характеристика!          Назначение

  -----------------------------------------------------------

             1) !

   DEV$M_SHR    ! Разделяемое устройство

             1) !

   DEV$M_AVL    ! Устройство доступно

             2) !

   DEV$M_REC    ! Устройство, ориентированное на запись

             2) !

   DEV$M_IDV    ! Устройство готово к вводу

             2) !

   DEV$M_ODV    ! Устройство готово к выводу




                           - 390 -

                       00152-01 33 03-1
                  

                                         Продолжение табл. 41

  -----------------------------------------------------------

  Характеристика!          Назначение

  -----------------------------------------------------------

             2) !

   DEV$M_MBX    ! Устройство является почтовым ящиком

  ------------------

       1) Динамический бит (устанавливается по условию).

       2) Статический бит (устанавливается всегда).

       Второе длинное  слово  буфера  содержит  информацию  о

  классе и типе устройства, и  размер  буфера.  Классом  уст-

  ройства является DC$_MAILBOX, а  типом  устройства  DT$_MBX

  или DT$_SHRMBX, если почтовый ящик - это  почтовый  ящик  с

  разделением памяти. Макрокоманда $DCDEF определяет эти сим-

  волы. Размер буфера- это максимальный  размер  сообщения  в

  байтах.

       Четвертое длинное слово содержит номер устройства  для

  почтового ящика.



       8.3. Коды функций почтового ящика


       Функциями ввода-вывода почтового ящика в  операционной

  системе МОС ВП являются: чтение, запись,  запись  сообщения

  "конец файла" и выдача AST прерывания.

       В сообщениях ввода-вывода почтового  ящика  не  выпол-

  няется  проверка  квоты  счетчика  байтов   буферизованного

  ввода-вывода. Взамен этого счетчик байтов, или квота буфера

  почтового ящика, проверяется на достаточность  пространства



                           - 391 -

                       00152-01 33 03-1


  для посылаемого сообщения. Также контролируется квота буфе-

  ризованного ввода-вывода и квота AST прерывания.



       8.3.1. Чтение


       Для получения сообщений, записанных другими  процесса-

  ми, используется функция чтения макрокоманды $QIO.  Сущест-

  вуют 3 функции чтения для почтового ящика. Их коды  следую-

  щие:

       1) IO$_READVBLK- читать виртуальный блок;

       2) IO$_READLBLK- читать логический блок;

       3) IO$_READPBLK- читать физический блок.

       Эти коды функций используют два  аргумента,  зависящих

  от устройства/функции:

       1) P1- начальный виртуальный адрес буфера,  предназна-

  ченного для приема сообщения;

       2) P2- размер буфера в байтах (ограничен размером мак-

  симального сообщения для почтового ящика).

       Если сообщение длиннее, чем читаемый буфер, то в  блок

  состояния   ввода-вывода   возвращается   код    завершения

  SS$_BUFFEROVF. В этих случаях сообщение усекается так, что-

  бы оно соответствовало буферу.

       По запросу чтения в макрокоманде $QIO может быть опре-

  делен один модификатор функции:

           IO$M_NOW  -  операция   ввода-вывода   завершается

           немедленно без ожидания запроса записи из  другого

           процесса.





                           - 392 -

                       00152-01 33 03-1


       Запрос чтения почтового ящика требует соответствующего

  запроса записи почтового ящика (кроме случая ошибки).  Зап-

  росы могут выдаваться в любой последовательности;  то  есть

  запрос чтения может либо предшествовать, либо следовать  за

  запросом записи.

       Если процесс 1 выдает запрос чтения до того, как  про-

  цесс 2 выдает запрос записи, то существуют две возможности.

  Если процесс 1 не указал модификатор функции  IO$M_NOW,  то

  запрос процесса 1 ставится  в  очередь  на  время  ожидания

  выдачи запроса записи процессом 2. Когда появится этот зап-

  рос, данные передаются от процесса 2 через системные буфера

  к процессу 1, чтобы завершить операцию ввода-вывода.

       Однако, если  процесс  1  указал  модификатор  функции

  IO$M_NOW, то операция чтения  завершается  немедленно.  Это

  значит, что запрос процесса 1 не ставится в очередь на вре-

  мя ожидания сообщения из процесса 2 и данные не  передаются

  из процесса 2 в процесс 1. В этом  случае  код  завершения,

  возвращаемый в процесс 1, будет SS$_ENDOFFILE. Если процесс

  2 посылает сообщение (без модификатора  функции)  до  того,

  как процесс 1 выдает запрос чтения (с модификатором функции

  или без), то процесс 1 находит ожидающее сообщение в почто-

  вом ящике, данные передаются и операция ввода-вывода завер-

  шается немедленно.

       Для того, чтобы выдать запрос чтения, процесс 1  может

  указать любые из кодов функции  чтения  макрокоманды  $QIO;

  все они выполняют одинаковую операцию.






                           - 393 -

                       00152-01 33 03-1


       8.3.2. Запись


       Функция  записи  макрокоманды  $QIO  используются  для

  передачи данных из процесса в почтовый ящик. Существуют три

  функции записи для почтового ящика. Их коды следующие:

       1) IO$_WRITEVBLK - записать виртуальный блок;

       2) IO$_WRITELBLK - записать логический блок;

       3) IO$_WRITEPBLK - записать физический блок.

       Эти коды функций имеют  два  параметра,  зависящих  от

  устройства/функции:

       1) P1 - начальный виртуальный  адрес  буфера,  который

  содержит записываемое сообщение;

       2) P2 - размер буфера в байтах (ограниченный  размером

  максимального сообщения для почтового ящика).

       С запросом на запись может быть указан один  модифика-

  тор функции:

           IO$M_NOW  -  операция   ввода-вывода   завершается

           немедленно без ожидания, пока другой процесс  счи-

           тает сообщение из почтового ящика.

       Запрос на запись в почтовый ящик требует соответствую-

  щего запроса на чтение из  почтового  ящика  (кроме  случая

  ошибки). Запросы могут быть выданы в  любой  последователь-

  ности.

       Если процесс 1 выдает запрос на запись  до  того,  как

  процесс 2 выдает запрос на чтение, то существуют  две  воз-

  можности. Если процесс  1  не  указал  модификатор  функции

  IO$M_NOW, то запрос на запись процесса 1 ставится в очередь

  на время ожидания выдачи запроса чтения процессом 2.  Когда



                           - 394 -

                       00152-01 33 03-1


  появляется  этот  запрос,  то   для   завершения   операции

  ввода-вывода данные передаются из процесса 1 в процесс 2.

       Если процесс 1 указал  модификатор  функции  IO$M_NOW,

  операция записи завершается немедленно. Данные доступны для

  процесса 2 и передаются, когда он выдает запрос на чтение.

       Если процесс 2 выдает запрос на чтение (без  модифика-

  тора функции) до того,  как  процесс  1  выдает  запрос  на

  запись (с модификатором функции или без него), то процесс 1

  находит ожидающий запрос в почтовом ящике. Данные передают-

  ся и операция ввода-вывода завершается немедленно.

       Для того, чтобы выдать запрос  на  запись,  процесс  1

  может указать любые из кодов  функции  записи  макрокоманды

  $QIO - все они выполняют одинаковую операцию.



       8.3.3. Запись сообщения "конец файла"


       Функция записи сообщения  "конец  файла"  макрокоманды

  $QIO используется для того, чтобы ввести специальное  сооб-

  щение в почтовый ящик. Код завершения SS$_ENDOFFILE возвра-

  щается в блок состояния ввода-вывода того процесса, который

  считывает сообщение "конец файла".  Данные  не  передаются.

  Эта функция не имеет аргументов. Операционная  система  мос

  вп обеспечивает единственный код функции:

           IO$_WRITEOF - записать сообщение "конец файла".

       С  функцией  макрокоманды  $QIO  "записать   сообщение

  "конец файла"" может быть указан один модификатор функции:

           IO$M_NOW- операция ввода-вывода завершается немед-

           ленно без ожидания.



                           - 395 -

                       00152-01 33 03-1


       8.3.4. Установка AST прерывания


       Функция установки  AST  прерывания  макрокоманды  $QIO

  используется для того, чтобы известить  запрашивающий  про-

  цесс, когда взаимодействующий процесс заносит незатребован-

  ный запрос на чтение или на  запись  в  указанный  почтовый

  ящик. Запрашивающий процесс не  должен  повторно  проверять

  состояние почтового ящика, так как AST прерывание  происхо-

  дит только тогда, когда запрос на чтение или на запись пос-

  тупает из взаимодействующего процесса. Для выполнения функ-

  ции установки AST прерывания пользователь должен иметь  два

  вида доступа к почтовому ящику: по логическому вводу-выводу

  и по чтению.

       Функции установки AST прерывания имеет следующие коды:

           1) IO$_SETMODE!IO$M_READATTN - AST  прерывание  по

           чтению;

           2) IO$_SETMODE!IO$M_WRTATTN -  AST  прерывание  по

           записи.

       Эти коды функций имеют  три  аргумента,  зависящих  от

  устройства/функции:

       1) P1  -  адрес  программы  обработки  AST  прерывания

  (об'явление запроса невозможно, если адрес равен нулю);

       2) P2 - параметр AST прерывания, передаваемый в список

  аргументов, когда  вызывается  программа  обслуживания  AST

  прерывания;

       3) P3 - режим доступа AST прерывания.

       Эти функции  являются  одноразовыми  разрешениями  AST

  прерывания; они должны  быть  снова  явно  разрешены,  если



                           - 396 -

                       00152-01 33 03-1


  пользователь требует уведомления о следующем  незатребован-

  ном запросе. Одновременно могут быть установлены  оба  типа

  разрешений, и каждого типа - более одного разрешения. Число

  разрешений ограничивается только квотой AST прерываний  для

  процесса.

       Если      процесс      1      использует       функцию

  IO$_SETMODE!IO$M_WRTATTN для  запроса  AST  прерывания,  то

  когда процесс 2 передает сообщение в почтовый ящик, в  про-

  цессе 1 возникает AST прерывание. Процесс  1  реагирует  на

  AST прерывания выдачей запроса на чтение в почтовый ящик. В

  запрос на чтение включается модификатор  функции  IO$M_NOW.

  Затем передаются данные и операция ввода-вывода  завершает-

  ся.

       Если несколько запрашивающих процессов установили  AST

  прерывания по незапрашиваемым сообщениям к одному почтовому

  ящику, все AST прерывания происходят  тогда,  когда  первое

  незапрашиваемое сообщение занесено в почтовый ящик. Однако,

  принимает данные только первый процесс, отвечающий  на  AST

  прерывание запросом на чтение. Поэтому,  следующий  процесс

  может найти почтовый ящик пустым,  когда,  отвечая  на  AST

  прерывание, выдаст запрос на  чтение  из  почтового  ящика.

  Если этот запрос не включает модификатор функции  IO$M_NOW,

  то он будет поставлен в очередь ожидания следующего сообще-

  ния.

       Если      процесс      1      использует       функцию

  IO$_SETMODE!IO$M_READATTN, чтобы указать AST прерывание, то

  когда процесс 2 выдает запрос на чтение  в  почтовый  ящик,




                           - 397 -

                       00152-01 33 03-1


  происходит AST прерывание для процесса 1. Процесс  1  отве-

  чает на AST прерывание передачей сообщения в почтовый ящик.

  Затем, чтобы завершить  операцию  ввода-вывода,  передаются

  данные.

       Если несколько запрашивающих процессов установили  AST

  прерывание для запросов на чтение из почтового  ящика,  все

  AST прерывания возникают, когда  первый  запрос  на  чтение

  помещается в почтовый ящик. Только первый процесс,  который

  ответит запросом на запись, сможет передать данные процессу

  2.



       8.3.5. Установка защиты


       Функция установки защиты макрокоманды  $QIO  позволяет

  пользователю установить защиту почтового ящика (п.  8.1.3).

  Абонент должен быть либо владельцем почтового  ящика,  либо

  иметь привилегию BYPASS. Функция "установить защиту"  имеет

  следующий код:

           IO$_SETMODE!IO$M_SETPROT - установить защиту.

       Этот код функции имеет  один  аргумент,  зависящий  от

  устройства/функции:

           P2- маска защиты тома.

       16-битовая маска защиты с  расшифровкой  каждого  бита

  для всех классов пользователей показана на рис. 51.











                           - 398 -

                       00152-01 33 03-1


                     Маска защиты

    15           11           7             3         0
   +------------+------------+------------+------------+
   !   Все      !   Группа   !  Владелец  !  Система   !
   +------------+------------+------------+------------+
                !            !
   +------------+            +-------------------------+
   !                                                   !
   !                                                   !
   !     11           10            9            8     !
   +------------+--------------+-----------+-----------+
   ! Логический !     Не       !  Запись   !  Чтение   !
   ! ввод-вывод ! используется !           !           !
   +------------+--------------+-----------+-----------+

                            Рис. 51

       Для почтовых ящиков имеют значение только биты,  опре-

  деляющие логический ввод-вывод, чтение и запись.  Очищенный

  бит означает, что доступ разрешен. Если аргумент  P2  равен

  нулю или не указан,  маска  устанавливается  на  разрешение

  чтения, записи и логических операций всем владельцам.

       Если запрос был успешным, то в первое слово блока сос-

  тояния ввода-вывода для функции  установки  защиты  возвра-

  щается код завершения SS$_NORMAL. Если запрос не был успеш-

  ным, возвращается код завершения SS$_NOPRIV.

       Типичное использование функции установки защиты - зап-

  рет доступа по записи. В этом случае  содержимое  почтового

  ящика может быть прочитано без опасения, что операция запи-

  си может совпасть с операцией чтения.



       8.4. Блок состояния ввода-вывода


       Блоки состояния ввода-вывода (IOSB) для функций чтения

  почтового ящика, записи в почтовый ящик и установки  защиты

  показаны на рис. 52, рис. 53 и рис. 54. Коды завершения для



                           - 399 -

                       00152-01 33 03-1


  этих функций перечисляются в приложении 1. В  дополнение  к

  ним в R0 могут быть возвращены  системные  коды  завершения

  SS$_ACCVIO,   SS$_INSFMEM,   SS$_MBFULL,   SS$_MBTOOSML   и

  SS$_NOPRIV.


          Содержимое блока состояния ввода-вывода

                  (функция чтения)

                             +2                          IOSB
   +--------------------------+----------------------------+
   !    Счетчик байтов        !    Код завершения          !
   +--------------------------+----------------------------+
   !     Идентификация процесса передатчика  (PID)         !
   +--------------------------+----------------------------+
                                                          +4
       Идентификация процесса передатчика равна нулю, если
  передатчиком был системный процесс.

                            Рис. 52



            Содержимое блока состояния ввода-вывода

                     (функция записи)

                             +2                         IOSB
   +--------------------------+----------------------------+
   !    Счетчик байтов        !      Код завершения        !
   +--------------------------+----------------------------+
   !       Идентификация процесса приемника  (PID)         !
   +-------------------------------------------------------+
                                                          +4
       Идентификация процесса приемника равна нулю, если
  был указан модификатор функции IO$M_NOW.

                            Рис. 53















                           - 400 -

                       00152-01 33 03-1



         Содержимое блока состояния ввода-вывода

              (функция установки защиты)

                             +2                         IOSB
   +--------------------------+----------------------------+
   !          0               !     Код завершения         !
   +----------------------------+--------------------------+
   !          Значение маски защиты (P2)                   !
   +-------------------------------------------------------+
                                                          +4

                            Рис. 54



       8.5. Пример программирования


       В подразделе рассматривается пример программы, которая

  создает почтовый ящик и помещает почтовую корреспонденцию в

  него; в почтовый ящик не выдано  запроса  чтения  для  этой

  корреспонденции. Во-первых,  программа  иллюстрирует,  что,

  если не используется модификатор функции IO$M_NOW при зане-

  сении почтовой  корреспонденции  на  хранение,  то  функция

  записи будет ждать пока в почтовом ящике выполняется опера-

  ция чтения. В этом случае лишь  после  того,  как  почтовую

  корреспонденцию  выберут  из  почтового  ящика,   указывают

  IO$M_NOW и программа продолжается.

       Далее, читается почтовый ящик. Если в  почтовом  ящике

  не было почтовой корреспонденции, программа должна ждать  в

  этой точке, так как не был указан IO$M_NOW. Если существует

  некоторое сомнение, касающееся доступности данных в  почто-

  вом ящике, и для программы важно не ждать,  то  модификатор

  функции IO$M_NOW должен быть указан.

       Это  дает  возможность  пользователю   координировать,




                           - 401 -

                       00152-01 33 03-1


  какие данные идут в почтовые ящики и какие выходят из  них.

  В этом примере процесс читает свое  собственное  сообщение.

  Обычно, для связи между процессами используются два  почто-

  вых ящика: один для передачи данных из процесса 1 в процесс

  2, другой для передачи данных из процесса 2  в  процесс  1.

  Если программа организована таким образом,  то  процесс  не

  может читать свое собственное сообщение.


       Пример.



          .TITLE EXAMPLE



          .IDENT /01/



  ;

  ;определить необходимые символы

  ;

          $IODEF                          ;определить коды

                                          ;функций ввода-вы-

                                          ;вода



  ;

  ;распределить память для необходимых структур данных

  ;

  ;

  ;разместить строку имени терминального устройства и деск-

  ;риптор

  ;



                           - 402 -

                       00152-01 33 03-1


  DEVICE_DESCR:                           ;

          .LONG   20$-10$                 ;длина строки имени

          .LONG   10$                     ;адрес строки имени

  10$:    .ASCII  /TERMINAL/              ;строка имени вы-

                                          ;ходного устройства

  20$:                                    ;справочная метка

  ;

  ;выделить пространство для хранения номера назначенного ка-

  ;нала

  ;

  DEVICE_CHANNEL:                         ;

          .BLKW   1                       ;номер канала





  ;

  ;выделить строку имени почтового ящика и дескриптор

  ;

  MAILBOX_NAME:

          .LONG  ENDBOX-NAMEBOX           ;длина строки имени

          .LONG  NAMEBOX                  ;адрес строки имени

  NAMEBOX: .ASCII /146_MAIN_ST/           ;строка имени

  ENDBOX:                                 ;справочная метка





  ;

  ;выделить пространство для хранения номера канала

  ;




                           - 403 -

                       00152-01 33 03-1


  MAILBOX_CHANNEL:                        ;

          .BLKW   1                       ;номер канала





  ;

  ;выделить пространство для хранения сообщений

  ;

  IN_BOX_BUFFER:                          ;

          .BLKB   40                      ;выделить 40 байт

                                          ;для принимаемого

                                          ;сообщения

          IN_LENGTH=.-IN_BOX_BUFFER       ;определить длину

                                          ;входного буфера

  OUT_BOX_BUFFER:

          .ASCII /SHEEP ARE VERY DIM/     ;сообщение для пе-

                                          ;редачи

          OUT_LENGTH=.-OUT_BOX_BUFFER     ;определить длину

                                          ;сообщения для

                                          ;передачи





  ;

  ;наконец, выделить пространство для квадрослова состояния

  ;ввода-вывода

  ;

  STATUS:                                 ;

          .QUAD   1                       ;квадрослово состо-




                           - 404 -

                       00152-01 33 03-1


                                          ;яния ввода-вывода





  ;

  ;

  ;              точка старта программы

  ;

  ;

  ;

  ;вначале программа создает почтовый ящик и назначает канал

  ;для терминала.затем сообщение помещается в почтовый ящик,

  ;и сообщение принимается из почтового ящика (то же самое

  ;сообщение). Наконец, программа печатает содержимое почто-

  ;вого ящика на терминал.

  ;

  START:  .WORD   0                       ;маска входа

          $CREMBX_S CHAN=MAILBOX_CHANNEL,- ;канал почтового

                                           ;ящика

                  PROMSK=#^X0000,-        ;нет защиты

                  BUFQUO=#^X0060,-        ;квота буфера

                  LOGNAM=MAILBOX_NAME,-   ;дескриптор логи-

                                          ;ческого имени

                  MAXMSG=#^X0060          ;длина максималь-

                                          ;ного сообщения

          CMPW    #SS$_NORMAL,R0          ;создание почтового

                                          ;ящика успешно?

          BSBW    ERROR_CHECK             ;проверить




                           - 405 -

                       00152-01 33 03-1


          $ASSIGN_S -                     ;назначить канал

                  DEVNAM=DEVICE_DESCR,-   ;дескриптор устрой-

                                          ;ства

                  CHAN=DEVICE_CHANNEL     ;канал

          CMPW    #SS$_NORMAL,R0          ;успешно назначен

                                          ;канал?

          BSBW    ERROR_CHECK             ;проверить





  ;

  ;теперь программа записывает в почтовый ящик, используя за-

  ;прос записи, который включает   модификатор   функции

  ;IO$M_NOW, так что не надо ждать запрос чтения из почтового

  ;ящика для продолжения программы.

  ;

          $QIOW_S FUNC=#IO$_WRITEVBLK!IO$M_NOW,- ;запись

                                                 ;сообщения

                  CHAN=MAILBOX_CHANNEL,-  ;канал почтового

                                          ;ящика

                  P1=OUT_BOX_BUFFER,-     ;буфер записи

                  P2=#OUT_LENGTH          ;длина буфера

          CMPW    #SS$_NORMAL,R0          ;запрос записи

                                          ;успешный?

          BSBW    ERROR_CHECK             ;проверить





  ;




                           - 406 -

                       00152-01 33 03-1


  ;читать почтовый ящик

  ;

          $QIOW_S FUNC=#IO$_READVBLK,-    ;чтение сообщения

                  CHAN=MAILBOX_CHANNEL,-  ;канал почтового

                                          ;ящика

                  IOSB=STATUS,-           ;определить блок

                                          ;состояния

                  P1=IN_BOX_BUFFER,-      ;буфер чтения

                  P2=#IN_LENGTH           ;длина буфера

          CMPW    #SS$_NORMAL,R0          ;запрос чтения

                                          ;успешный?

          BSBW    ERROR_CHECK             ;проверить





  ;

  ;теперь программа определяет размер почтового отправления

  ;(эта информация находится по адресу STATUS+2), и печатает

  ;сообщение из почтового ящика на терминал.

  ;

          MOVZWL  STATUS+2,R2             ;количество бай-

                                          ;тов - в R2

          $QIOW_S FUNC=#IO$_WRITEVBLK,-   ;функция записи

                  CHAN=DEVICE_CHANNEL,-   ;для канала терми-

                                          ;нала

                  P1=IN_BOX_BUFFER,-      ;адрес буфера для

                                          ;записи

                  P2=R2,-                 ;сколько писать




                           - 407 -

                       00152-01 33 03-1


                                          ;(размер записи)

                  P4=#32                  ;управление карет-

                                          ;кой

  ;

  ;наконец, отменяем назначение канала и выходим

  ;

  EXIT:   $DASSGN_S CHAN=DEVICE_CHANNEL   ;отменить назначе-

                                          ;ние канала

          RET                             ;возврат

  ;

  ;обычно в программах выполняются процедуры восстановления

  ;ошибок. Однако, в данной показательной программе процедуры

  ;восстановления не заданы.

  ;

  ERROR_CHECK:                            ;

          BNEQ    EXIT                    ;ошибка программы

                                          ;системного обслу-

                                          ;живания, выход

          RSB                             ;иначе, возврат

          .END    START


















                           - 408 -

                       00152-01 33 03-1


      9. Драйвер многофункционального  контроллера  связи  см

         1700.4304



       В данном разделе описано использование драйвера интер-

  фейса синхронных и асинхронных  линий  многофункционального

  контроллера связи СМ 1700.4304 (далее по тексту - КСМ) опе-

  рационной системы МОС ВП.

       KСМ - это устройство связи  прямого  доступа,  которое

  использует программное обеспечение, обслуживающее  протокол

  управления информационными  каналами  (далее  по  тексту  -

  пуик) сетевой архитектуры СМ ЭВС  (САСМ).  КСМ  работает  в

  дуплексном и полудуплексном режимах, а также в режиме  под-

  чинения на многоточечной линии, совместимой с пуик.

       При многоточечной конфигурации ксм работает  в  режиме

  подчинения и помещается по адресу  подчиненной  станции  на

  линии пуик.

       При конфигурации точка-точка один ксм  подключается  к

  другому одиночному контроллеру. Контроллеры в таком  режиме

  называются станциями точка-точка.

       Асинхронный режим пуик работает в СПО "трал" с помощью

  программного обеспечения пуик через терминальные порты. Это

  приводит в действие все терминальные  устройства,  обслужи-

  ваемые МОС ВП, чтобы обеспечить интерфейс пуик между  двумя

  процессорами СМ 1700 или между СМ 1700 и СМ 1420 с  помощью

  терминальных портов. Асинхронный пуик обслуживает  полудуп-

  лексные линии точка-точка.






                           - 409 -

                       00152-01 33 03-1


       9.1. Характерные  свойства   и   возможности

            драйвера


       Драйвер ксм обеспечивает следующие возможности:

           1) режим многоточечной  работы,  при  котором  ксм

           функционирует как подчиненная станция в  асинхрон-

           ном режиме;

           2) режим работы точка-точка, при котором порт  ксм

           подключается  к  другому  одиночному  контроллеру,

           также  работ  7$   ?BOOT-F-NO   BOOT   ON   VOLUME

           _тщжзежиме битстаффинга высокоуровневого прото-

           кола связи данных (режим битстаффинга - это  режим

           вставки  нулевого  бита   после   пяти   единичных

           битов.);

           5)  поддержку  основного  знаково-ориентированного

           протокола с помощью КСМ;

           6)    непривилегированный    интерфейс    запросов

           ввода-вывода с КСМ для использования устройств как

           канала необработанных данных;

           7) условия прерывания неподчиненных станций, пере-

           даваемые с помощью АST прерываний;

           8) дуплексные и полудуплексные операции  (дуплекс-

           ные операции только для асинхронного пуик);

           9) установку интерфейса общую для  всех  устройств

           связи, обслуживаемых операционной системой МОС ВП;

           10) разделение очередей передачи и приема;

           11) выделение составных буферов  чтения  и  записи

           для данного устройства.



                           - 410 -

                       00152-01 33 03-1


       9.1.1. Знаково-ориентированные   протоколы   и

              режим   битстаффинга   высокоуровневого

              протокола связи данных


       Устройство   синхронной    линии    КСМ    обслуживает

  знаково-ориентированные  протоколы  и  режим   битстаффинга

  высокоуровневого протокола связи данных (далее по тексту  -

  режим битстаффинга HDLC).  Драйвер  КСМ  имеет  возможность

  передавать и принимать сообщение, собранное в кадры, а так-

  же  обеспечивает  некоторое  управление  модемом.  Основное

  управление протоколом для знаково-ориентированных  протоко-

  лов поддерживается на уровне драйвера КСМ.  Однако  драйвер

  КСМ может  обеспечивать  интерфейс  с  протоколом  высокого

  уровня, так что полученные  сообщения  будут  собираться  в

  кадры по правилам этого протокола. Для режима HDLC  пользо-

  ватель обеспечивается методом передачи и приема  сообщений,

  собранных в кадры, только в дуплексном режиме.



       9.1.2. Интерфейс программы формирования кадров

              для знаково-ориентированных протоколов


       Знаково-ориентированные протоколы имеют свои собствен-

  ные правила для формирования кадров  получаемых  сообщений.

  Для того, чтобы обеспечить обслуживание  конкретных  правил

  формирования кадров для каждого протокола, драйвер КСМ  был

  расширен для  обеспечения  обслуживания  вызова  конкретной

  программы  формирования  кадров  при  обработке  получаемых

  сообщений драйверов ксм. Эта программа  определяется  прог-




                           - 411 -

                       00152-01 33 03-1


  раммным Oбеспечением высокого уровня с помощью драйвера КСМ

  и загружается этим же программным обеспечением в нестранич-

  ную область. Адрес программы передается драйверу при запус-

  ке устройства. Целью программы формирования кадров является

  информирование драйвера о том, как кадрировать каждый  байт

  полученного информационного сообщения и информировать драй-

  вер о том, что полученное сообщение завершено  и  готово  к

  пересылке.

       Адрес программы формирования кадров хранится во  внут-

  реннем буфере драйвера КСМ. Внутренний буфер содержит также

  квадрослово, используемое  программой  формирования  кадров

  для хранения информации о состоянии во  время  формирования

  кадров сообщения. Программа формирования кадров  вызывается

  драйвером на ФОРК уровне с помощью инструкции JSB.

       Входные данные программы, формирующей кадры:

       1) R0 - адрес квадрослова состояния;

       2) R1, биты 0-7 - знак, подлежащий  проверке.  Старший

  бит устанавливается, если он является первым знаком  нового

  кадра.

       Выходные данные программы, формирующей кадры:

       R0 - информация O  состоянии  для  драйвера  ксм.  Она

  определяется битами, значения которых указаны в табл. 42.














                           - 412 -

                       00152-01 33 03-1


                                                   Таблица 42

  -----------------------------------------------------------

  Бит                   !            Значение

  -----------------------------------------------------------

  XG$V_BUFFER_CHAR      !Если очищен, буферизируйте знак в

                        !следующей  позиции.  Если уста-

                        !новлен,  используйте  бит

                        !XG$V_BUFFER_IN_PREV_POS

  XG$V_BUFFER_INPREV_POS!Если очищен, игнорируйте знак. Если

                        !установлен, буферизируйте знак пре-

                        !дыдущей позиции. Не меняйте указа-

                        !тель буфера

  XG$V_COMPLETE_READ    !Если очищен, игнорируйте. Если уста-

                        !новлен, верните буфер кадров

                        !пользователю (буферизуйте знак, если

                        !требуется)


       После того, как драйвер ксм завершил полученное инфор-

  мационное сообщение, собранное в кадры, он  восстанавливает

  квадрослово информации о состоянии равным  значению,  пере-

  данному при запуске. Это значит, что  драйвер  восстанавли-

  вает информацию об ошибке вместе с успешной информацией.



       9.1.3. Изменения  в   интерфейсе   передатчика

              драйвера            КСМ             для

              знаково-ориентированного режима


       Для запроса на  запись  с  помощью  макрокоманды  $QIO




                           - 413 -

                       00152-01 33 03-1


  аргумент Р4 будет содержать адрес квадрослова буфера, пред-

  назначенного для изменения поля во внутреннем буфере  драй-

  вера ксм, которое содержит информацию о состоянии для прог-

  раммы формирования кадров. Если аргумент P4 равен нулю,  то

  информация о состоянии не меняется.

       Интерфейс драйвера  ксм  изменяется  также  с  помощью

  возвращаемых ошибок. Бит XM$M_STS_DISC  будет  возвращен  в

  поле IRP$L_IOST2, если драйвер имел тайм-аут во время  ожи-

  дания сигнала "готовность к посылке" (CTS) на  данном  уст-

  ройстве.



       9.1.4. Функция IO$_CLEAN


       Функция IO$_CLEAN может быть выполнена с помощью прог-

  раммы      системного      обслуживания      $QIO.      Для

  знаково-ориентированных протоколов запрос функции IO$_CLEAN

  приводит   к   завершению   всех   невыполненных   запросов

  ввода-вывода, выданных на  данное  устройство.  Для  режима

  битстаффинга HDLC запрос функции IO$_CLEAN приводит к  ава-

  рийному завершению всех операций передачи, выданных на дан-

  ное устройство. В обоих  случаях,  возвращаемым  состоянием

  является SS$_ABORT. Регистры модема не очищаются.



       9.1.5. Квоты


       Операции передачи являются буферизованными  операциями

  ввода-вывода и ограничиваются квотой ввода-вывода.

       Квоты "свободного списка" буферов - это квота  буфери-




                           - 414 -

                       00152-01 33 03-1


  зованного ввода-вывода процесса и квота  количества  байтов

  буферизованного ввода-вывода.



       9.1.6. Сбой напряжения питания


       Если произошел сбой напряжения питания системы,  восс-

  тановление  невозможно.  Драйвер  переходит   в   состояние

  фатальной ошибки и отключается.



       9.2. Информация об устройствах


       Пользователи могут получать информацию о характеристи-

  ках КСМ с помощью программ системного обслуживания $GETDVI,

  $GETCHN или $GETDEV. Рекомендуется, чтобы  новые  программы

  для получения информации об устройствах использовали  прог-

  рамму системного обслуживания $GETDVI.

       Программы $GETсHN и $GETDEV возвращают информацию, как

  это показано на рис. 55, специфическую для ксм в первые три

  длинных слова буфера, указанного пользователем.

                       Информация КСМ

  31           24 23         16 15          8 7             0
  +---------------------------------------------------------+
  !             Характеристики устройства                   !
  +---------------------------------------------------------+
  !    Максимальный размер     !     Тип     !   Класс      !
  !        сообщения           !             !              !
  +----------------------------+-------------+--------------+
  ! Специфическая! Краткое опи-!  Состояние  !Характеристики!
  !    ошибка    ! сание ошибки!             !              !
  +--------------+-------------+-------------+--------------+

                          Рис. 55


       Первое длинное слово в буфере содержит  характеристики




                           - 415 -

                       00152-01 33 03-1


  устройства, приведенные в табл.  43.  Макрокоманда  $DEVDEF

  определяет эти значения.

                                                   Таблица 43

                   Характеристики устройства

  -----------------------------------------------------------

  Бит        !              Описание

  -----------------------------------------------------------

           1)!

  DEV$M_NET  ! Сетевое устройство. Установлен для терминаль-

             ! ного порта, если это сетевое устройство

           2)!

  DEV$M_AVL  ! Доступное устройство. Установлен если блок

             ! управления устройством (UCB) инициализирован

           2)!

  DEV$M_ODV  ! Устройство вывода

           2)!

  DEV$M_IDV  ! Устройство ввода

  ------------------------

       1) динамический бит (устанавливается по условию).

       2) статический бит (устанавливается всегда).

       Второе длинное слово содержит информацию о классе уст-

  ройства, его типе и максимальном размере сообщения. Классом

  устройства является DC$_SCOM.  Тип  устройства  для  КСМ  -

  DT$_DMF32. Макрокоманда $DCDEF определяет имена класса уст-

  ройства и его типа.

       Максимальным размером сообщения является  максимальный

  размер посылаемых или  принимаемых  сообщений  для  данного




                           - 416 -

                       00152-01 33 03-1


  устройства. Сообщения более 512 байтов в линиях  с  модемом

  часто дают ошибки при передаче.

       Третье длинное слово содержит состояние и  характерис-

  тики устройства, краткое описание ошибок, а для КСМ -  спе-

  цифическую ошибку(и).

       Биты характеристик устройства управляют режимом работы

  пуик. Они определяются макрокомандой $XMDEF  и  могут  быть

  установлены  функцией  установки  режима  или  прочитаны  с

  помощью функции считывания режима. В  табл.  44  приводятся

  значения характеристик устройства и их назначение.

                                                   Таблица 44

                      Характеристики ксм

  -----------------------------------------------------------

  Характеристика         !        Назначение

  -----------------------------------------------------------

  XM$M_CHR_MOP           ! Режим поддержки ПУИК с режимом

                         ! прямого управления линией

  XM$M_CHR_LOORB         ! Устанавливает режим зацикливания

                         ! при тестировании

  XM$M_CHR_HDPLX         ! Устанавливает полудуплексный режим

  ХM$M_CHR_TRIB          ! Указывает подчиненную станцию


       Биты  состояния  показывают  состояние  устройства   и

  линии. Эти биты могут устанавливаться и сбрасываться, толь-

  ко если контроллер и подчиненная станция не являются дейст-

  вующими.

       В табл. 45 приведены состояния и их значения.  Состоя-

  ния определяются макрокомандой $XMDEF.



                           - 417 -

                       00152-01 33 03-1


                                                   Таблица 45

               Состояния линии и устройства ксм

  -----------------------------------------------------------

  Состояние              !       Значение

  -----------------------------------------------------------

  XM$M_STS_ACTIVE        ! Протокол пуик действующий

  XM$M_STS_DISC          ! Линия модема перешла из состояния

                         ! "включено" в состояние "выключе-

                         ! но". Этот бит будет возвращен в

                         ! поле IRP$L_IOST2, Eсли драйвер

                         ! будет находиться в тайм-ауте во

                         ! время ожидания сигнала "готовность

                         ! к посылке"(CTS), который должен

                         ! прийти на данное устройство

  XM$M_STS_BUFFAIL       ! Ошибка при распределении буфера

                         ! получения информации


       Биты  краткого  описания  ошибок  устанавливаются  при

  обнаружении ошибок. Они являются только считываемыми  бита-

  ми. Если обнаруженная ошибка является фатальной, КСМ отклю-

  чается. В табл. 46 приведены значения битов краткого описа-

  ния ошибок и их значения.















                           - 418 -

                       00152-01 33 03-1


                                                   Таблица 46

                 Биты краткого описания ошибок

  -----------------------------------------------------------

  Бит             !       Значение

  -----------------------------------------------------------

  XM$M_ERR_MAINT  ! Получено сообщение о режиме прямого

                  ! управления линией пуик

  XM$M_ERR_START  ! получено сообщение старт пуик

  XM$M_ERR_FATAL  ! обнаружена аппаратная или программная

                  ! ошибка на контроллере

  XM$M_ERR_TRIB   ! обнаружена аппаратная или программная

                  ! ошибка на подчиненной станции

  XM$M_ERR_LOST   ! потеря данных при получении сообщения,

                  ! которое было длиннее, чем допустимый мак-

                  ! симальный размер сообщения

  XM$M_ERR_THRESH ! ошибки приема, передачи или ограничения

                  ! выбора


       В табл.47 приведены ошибки, которые могут быть указаны

  в третьем длинном слове. Эти ошибки отображаются указанными

  кодами.

















                           - 419 -

                       00152-01 33 03-1


                                                   Таблица 47

                          Ошибки КСМ

  -----------------------------------------------------------

  Восьмеричное!     Ошибка               !  Уставливаемый

  значение    !                          !  код

  -----------------------------------------------------------

   2          ! Ошибка ограничения приема! XM$M_ERR_THRESH

   4          ! Ошибка ограничения пере- ! XM$M_ERR_THRESH

              ! дачи                     !

   6          ! Ошибка ограничения выбора! XM$M_ERR_THRESH

   10         ! Получен запуск в сос-    ! XM$M_ERR_START

              ! тоянии выполнения        !

   12         ! Получена поддержка в     ! XM$M_ERR_MAINT

              ! состоянии выполнения     !

   14         ! Получена поддержка в     ! (отсутствует)

              ! состоянии останова       !

   16         ! Получен запуск в сос-    ! XM$M_ERR_START

              ! тоянии поддержки         !

   22         ! Блокированная подчинен-  ! XM$M_ERR_RUNNING

              ! ная станция              !

              !                          ! (очищен)

   24         ! Работающая подчиненная   ! XM$M_ERR_RUNNING

              ! станция                  !

              !                          ! (установлен)

   26         ! Сложные помехи на подчи- ! XM$M_ERR_TRIB

              ! ненной станции           !

   30         ! Поток информации на под- ! XM$M_ERR_TRIB




                           - 420 -

                       00152-01 33 03-1


                                         Продолжение табл. 47

  -----------------------------------------------------------

  Восьмеричное!     Ошибка               !  Уставливаемый

  значение    !                          !  код

  -----------------------------------------------------------

              ! чиненной станции         !

   32         ! Звуковой контроль        ! (отсутствует)

   100-276    ! Ошибки внутренней проце- ! XM$M_ERR_TRIB

              ! дуры (програмного обеспе-!

              ! чения)                   !

   300        ! Буфер слишком мал        ! XM$M_ERR_LOST

   302        ! Несуществующая память    ! XM$M_ERR_FATAL

   304        ! модем отключен           ! XM$M_ERR_DISC

              !                          ! и XM$M_ERR_FATAL

   306        ! Переполнение очереди     ! XM$M_ERR_FATAL

   310        ! Индикатор линейного сиг- ! XM$M_ERR_FATAL

              ! нала канала данных       !

              ! (CARRIER) потерян в      !

              ! модеме                   !



       9.3. Коды функций КСМ


       Драйвер КСМ может выполнять логические, виртуальные  и

  физические  операции  ввода-вывода.   Основными   функциями

  являются чтение,  запись,  установка  режима  и  считывание

  режима. В табл. 48 приводится  список  этих  функций  и  их

  коды.





                           - 421 -

                       00152-01 33 03-1


                                                   Таблица 48

                 Функции ввода-вывода для КСМ

  -----------------------------------------------------------

  Код функции  ! Модификатор  !   Функция

  и аргументы  !              !

  -----------------------------------------------------------

             2)!              !

  IO$_READLBLK ! IO$M_NOW     ! Чтение логического  блока

  Р1,Р2        !              !

             1)!              !

  IO$_READVBLK ! IO$M_NOW     ! Чтение виртуального блока

  Р1,Р2        !              ! 

             3)!              !

  IO$_READPBLK ! IO$M_NOW     ! Чтение физического блока

  Р1,P2,[P6]   !              !

             2)!              !

  IO$_WRITELBLK!              ! Запись логического блока

  Р1,Р2        !              !

             1)!              !

  IO$_WRITEVBLK!              ! Запись виртуального блока

  Р1,Р2        !              !

             3)!              !

  IO$_WRITEPBLK!              ! Запись физического блока

  Р1,P2,[P6]   !              !

             2)!              !

  IO$_SETMODE  ! IO$M_CTRL    ! Установка характеристик

  Р1,[P2],P3   ! IO$M_SHUTDOWN! КСМ и состояния контроллера




                           - 422 -

                       00152-01 33 03-1


                                         Продолжение табл. 48

  -----------------------------------------------------------

  Код функции  ! Модификатор  !   Функция

  и аргументы  !              !

  -----------------------------------------------------------

               ! IO$M_STARTUP ! Для последующих операций

               ! IO$M_ATTNASт !

               !IO$M_SET_MODEM!

             3)!              !

  IO$_SETCHAR  !              ! Установка характеристик КСМ

  Р1,[P2],P3,  !              ! и состояния контроллера для

  [Р6]         !              ! последующих операций

             2)!              !

  IO$_SENSEMODE! IO$M_CTRL    ! Чтение характеристик

  Р1,Р2        ! IO$M_SHUTDOWN! Контроллера или подчиненной

               ! IO$M_STARTUP ! станции и возврат их в

               ! IO$M_ATTNAST ! указанный буфер(а)

               !IO$M_SET_MODEM!

             2)!              !

  IO$_CLEAN    ! IO$M_CTRL    ! Завершение не обработанных

               !IO$M_CLR_COUNT! запросов (знаково-ориентиро-

               !              ! ванные протоколы). Удаление

               !              ! необслуженных передач

               !              ! (режим битстаффинга)

  -------------------------

       1) виртуальная функция.

       2) логическая функция.




                           - 423 -

                       00152-01 33 03-1


       3) физическая функция.



       9.3.1. Чтение


       Функции чтения предназначаются  для  непосредственного

  переноса данных в адресную область виртуальной памяти поль-

  зовательского процесса. Операционная система МОС ВП обеспе-

  чивает три кода функций:

       1) IO$_READLBLK - чтение логического блока;

       2) IO$_READVBLK - чтение виртуального блока;

       3) IO$_READPBLK - чтение физического блока.

       Полученное сообщение буферизуется во множество буферов

  в системной динамической памяти, а затем копируется в буфер

  пользователя.

       Аргументами для кода функций являются:

       1) Р1 - начальный виртуальный адрес буфера данных;

       2) Р2 - размер буфера для получения данных в байтах;

       3) Р6 - адрес буфера диагностики; только  для  функций

  физического ввода-вывода (необязательный аргумент). Не обс-

  луживается для операций асинхронного пуик.

       Размер сообщения, указанный с помощью аргумента Р2, не

  может быть  больше,  чем  максимальный  размер  получаемого

  сообщения для  данного  устройства  (подраздел  9.3).  Если

  сообщение больше, чем максимальный получаемый размер, то  в

  блок    состояния     ввода-вывода     возвращается     код

  SS$_DATAOVERUN.

       Функции чтения имеют один модификатор:





                           - 424 -

                       00152-01 33 03-1


           IO$M_NOW - завершает операцию чтения немедленно по

           получении сообщения. (Если сообщение в данное вре-

           мя   недоступно,   возвращается   код   завершения

           SS$ENDOFFILE в блок состояния ввода-вывода).



       9.3.2. Запись


       Функции записи предназначаются  для  непосредственного

  переноса данных  из  адресной  области  виртуальной  памяти

  пользовательского процесса.  Операционная  система  МОС  ВП

  обеспечивает три кода функций:

       1) IO$_WRITELBLK - запись логического блока;

       2) IO$_WRITEVBLK - запись виртуального блока;

       3) IO$_WRITEPBLK - запись физического блока.

       Сообщения ксм копируются в системный буфер перед  тем,

  как они передаются.

       Аргументами являются:

       1) Р1 - начальный виртуальный адрес буфера, содержаще-

  го данные, подлежащие передаче;

       2) Р2 - размер буфера в байтах;

       3) Р6 - адрес буфера диагностики, только  для  функции

  физического ввода-вывода (необязателен).  Не  обслуживается

  для операций асинхронного пуик.

       Размер сообщения, указанный в аргументе Р2,  не  может

  быть больше, чем максимальный размер посылаемого  сообщения

  для данного устройства.

       Функции записи не имеют модификаторов.





                           - 425 -

                       00152-01 33 03-1


       9.3.3. Установка режима


       В операционной системе МОС ВП  определены  семь  типов

  функций установки режимов:

       1) установить режим;

       2) установить характеристики;

       3) установить режим контроллера;

       4) установить режим подчиненной станции;

       5) разрешить AST прерывания;

       6) отключить контроллер;

       7) отключить подчиненную станцию.

       Функции установки режима и установки характеристик при

  использовании  некоторых  модификаторов  функции  выполняют

  операции такие, как, например, запуск подчиненной станции и

  запрос AST  прерывания.  Использованные  без  модификаторов

  функции установка режима и  установка  характеристик  могут

  изменять существующую подчиненную станцию.

       Операционная система  МОС  ВП  обеспечивает  два  кода

  функций:

       1) IO$_SETMODE - устанавливает режим (требует привиле-

  гию логического ввода-вывода);

       2) IO$_SETCHAR - устанавливает характеристики (требует

  привилегию физического ввода-вывода).

       Для того, чтобы  использовать  функции  IO$_SETMODE  и

  IO$_SETCHAR, пользователь должен  выделить  соответствующий

  блок управления устройством  (UCB).  Это  осуществляется  с

  помощью программы системного обслуживания $ASSIGN.





                           - 426 -

                       00152-01 33 03-1


       9.3.3.1. Установка режима контроллера


       Функция  установки  режима  контроллера  устанавливает

  состояние контроллера драйвера КСМ. Для  асинхронного  пуик

  первое появление  функции  IO$_SETMODE  создает  буфер  для

  использования его этим драйвером. (часть буфера, созданного

  функцией IO$_SETMODE!IO$M_CTRL!IO$M_STARTUP выделяется  под

  протокол). Обеспечиваются четыре сочетания кода и модифика-

  тора функции:

       1) IO$_SETMODE!IO$M_CTRL - устанавливает характеристи-

  ки контроллера;

       2) IO$_SETCHAR!IO$M_CTRL - устанавливает характеристи-

  ки контроллера;

       3) IO$_SETMODE!IO$M_CTRL!IO$M_STARTUP -  устанавливает

  характеристики контроллера и запускает контроллер;

       4) IO$_SETCHAR!IO$M_CTRL!IO$M_STARTUP -  устанавливает

  характеристики контроллера и запускает контроллер.

       Если указывается модификатор функции IO$M_STARTUP,  TO

  запускается контроллер и разрешается  работа  модема.  Если

  модификатор  IO$M_STARTUP  не  указывается,  то   указанные

  характеристики просто модифицируются.

       Эти коды имеют  следующие  аргументы,  независимые  от

  устройства:

       1) P1 - виртуальный адрес квадрослова буфера  характе-

  ристик;

       2) Р2  -  адрес  дескриптора  для  буфера  расширенных

  характеристик (необязательный аргумент);





                           - 427 -

                       00152-01 33 03-1


       3) Р3 - количество заранее распределенных блоков полу-

  ченного сообщения.

       Если указываются оба аргумента - P1 и  P2,то  аргумент

  P2 подавляет аргумент P1.

       Формат буфера, указанного  аргументом  Р1  показан  на

  рис. 56.


   Буфер характеристик аргумента Р1 (установка контроллера)

                           +2                              0
  +--------------------------+------------------------------+
  ! Максимальный размер      !      Не используется         !
  !     сообщения            !                              !
  +--------------------------+---------------+--------------+
  !             Не используется              !Характеристики!
  +------------------------------------------+--------------+

                          Рис. 56


       Mаксимальный размер сообщения в первом  длинном  слове

  указывает  максимально  допустимую  длину  передаваемого  и

  получаемого сообщения.

       В табл.  49  приведены  характеристики  драйвера  ксм,

  которые могут устанавливаться во втором длинном слове. Мак-

  рокоманда $XMDEF определяет  эти  значения.  Характеристики

  асинхронного пуик не могут устанавливаться с помощью  этого

  буфера.
















                           - 428 -

                       00152-01 33 03-1


                                                  Таблица 49

                  Характеристики драйвера КСМ

  ----------------------------------------------------------

  Характеристика      !           Значение

  ----------------------------------------------------------

  XM$M_CHR_LOOPB      ! Устанавливает режим зацикливания при

                      ! тестировании

  XM$M_CHR_HDPLX      ! Указывает подчиненную станцию


       Характеристики для асинхронного пуик не  поддерживают-

  ся.

       Буфер, указанный в аргументе P2, состоит из ряда  шес-

  тибайтовых записей. Первое слово содержит идентификатор,  а

  следующее за ним двойное слово содержит одно  из  значений,

  которые могут быть связаны с идентификатором. Формат  этого

  буфера показан на рис. 57.


         Буфер расширенных характеристик аргумента P2

                             -------------------------------
                             !    Идентификатор параметра  !
  ----------------------------------------------------------
  !                Значение длинного слова                 !
  ----------------------------------------------------------
  !                          !    Идентификатор параметра  !
  ----------------------------------------------------------
  !                Значение длинного слова                 !
  ----------------------------------------------------------
                             .                             .
                             .                             .


                          Рис. 57


       В табл. 50 приведены идентификаторы параметров и  зна-

  чения, которые могут быть указаны в  буфере  аргумента  P2.




                           - 429 -

                       00152-01 33 03-1


  Макрокоманда $NMADEF определяет эти значения.

                                                   Таблица 50

              Значения расширенных характеристик

  -----------------------------------------------------------

  Идентификатор     ! Значение       !      Описание

  параметра         ! идентификатора !

  -----------------------------------------------------------

  NMA$C_PCLI_PRO    !                ! Режим протокола

                    !NMA$C_LINPR_POI ! Точка-точка (по

                    !                ! умолчанию)

                    !NMA$C_LINPR_TRI ! Подчиненная станция

                    !NMA$C_LINPR_LAPB! Режим битстаффинга

                    !                ! HDLC

                    !NMA$C_LINPR_BSY ! Режим основного знако-

                    !                ! во-ориентированного

                    !                ! протокола

  NMA$C_PCLI_DUP    !                ! Дуплексный режим

                    !NMA$C_DPX_FUL   ! Дуплексный

                    !                ! (по умолчанию)

                    !NMA$C_DPX_HAL   ! Полудуплексный

  NMA$C_PCLI_CON    !                ! режим контроллера

                    !NMA$C_LINCN_NOR ! Обычный (по умолчанию)

                    !NMA$C_LINCN_LOO ! Режим зацикливания при

                    !                ! тестировании

  NMA$C_PCLI_BFN    !                ! Число приемных буфе-

                    !                ! ров, которые должны

                    !                ! быть предварительно




                           - 430 -

                       00152-01 33 03-1


                                         Продолжение табл. 50

  -----------------------------------------------------------

  Идентификатор     ! Значение       !      Описание

  параметра         ! идентификатора !

  -----------------------------------------------------------

                    !                ! распределены. Это

                    !                ! число должно быть за-

                    !                ! дано здесь или в аргу-

                    !                ! менте Р3

  NMA$C_PCLI_BUS    !                ! Максимальная длина

                    !                ! получаемого или пере-

                    !                ! даваемого сообщения

                    !                ! (по умолчанию = 512

                    !                ! байтам)

  NMA$C_PCLI_NMS    !                ! Количество знаков

                    !                ! синхронизации, пред-

                    !                ! шествующих сообщению



       9.3.3.2. Установка режима подчиненной станции


       Функция   установки   режима    подчиненной    станции

  MOдифицирует  существующую  подчиненную  станцию.   Функция

  установки режима подчиненной станции должна выполняться  до

  того, как будет установлена  связь  с  присоединенным  уст-

  ройством.

       Так как драйвер ксм имеет дело только с  одной  подчи-

  ненной станцией, то функция  установки  режима  подчиненной

  станции запускает и подчиненную станцию  и  протокол.  Блок



                           - 431 -

                       00152-01 33 03-1


  данных, описывающий подчиненную станцию, уже создан.

       Имеются четыре сочетания кодов функций и модификатора:

       1) IO$_SETMODE - модифицирует характеристики подчинен-

  ной станции;

       2) IO$_SETCHAR - модифицирует характеристики подчинен-

  ной станции;

       3) IO$_SETMODE!IO$M_STARTUP  -  запускает  подчиненную

  станцию;

       4) IO$_SETCHAR!IO$M_STARTUP  -  запускает  подчиненную

  станцию.

       Эти коды имеют  следующиE  аргументы,  независимые  от

  устройства:

       1) Р1 - виртуальный адрес квадрослова буфера  характе-

  ристик (необязательный аргумент);

       2) Р2 - адрес дескриптора буфера расширенных  характе-

  ристик (необязательный аргумент).

       Формат буфера аргумента Р1 показан на рис. 58.


               Буфер характеристик аргумента Р1

               (установка починенной станции)

                          +2                            0
  +------------------------------------------------------+
  !                Не используется                       !
  +---------------------------------------+--------------- +4
  !            Не используется            !Характеристики!
  +---------------------------------------+--------------+

                          Рис. 58


       Во втором длинном слове может быть установлена следую-

  щая характеристика:





                           - 432 -

                       00152-01 33 03-1


           XM$V_CHR_MOP - устанавливает подчиненную станцию в

           режим поддержки пуик.

       Буфер аргумента Р2 состоит из ряда 6-байтовых записей.

  Первое длинное слово содержит  идентификатор  параметра,  а

  второе длинное слово, содержит одно  из  значений,  которые

  могут быть  связаны  с  идентификатором  параметра.  Формат

  буфера аргумента Р2 показан на рис. 57.

       В табл. 51 приведены идентификаторы параметра и значе-

  ния, которые могут быть указаны в буфере аргумента Р2.

                                                   Таблица 51

        Значения расширенных характеристик аргумента Р2

  -----------------------------------------------------------

  Идентификатор  !            Назначение

  параметра      !

  -----------------------------------------------------------

  NMA$C_PCCI_TRI ! Адрес подчиненной станции. Так как мак-

                 ! симальный физический адрес, который может

                 ! распознать ксм равен 255, то в действи-

                 ! тельности используется только первый байт.

                 ! Для ксм адрес подчиненной станции по

                 ! умолчанию всегда равен единице. Восприни-

                 ! маемыми значениями являются значения от 1

                 ! до 255


       Если указываются оба аргумента - Р1 и Р2, то  аргумент

  Р2 подавляет аргумент Р1.

       После  получения  запроса  ввода-вывода  для  КСМ  или

  асинхронного пуик  драйвер  изменяет  параметр  подчиненной



                           - 433 -

                       00152-01 33 03-1


  станции и запускает протокол. Состояние подчиненной станции

  и состояние протокола -  одинаковы.  Драйвер  не  проверяет

  наличие адреса подчиненной  станции.  Если  он  отсутствует

  (адрес), то его значение определяется  равным  значению  по

  умолчанию - 1.



       9.3.3.3. Отключение контроллера


       Функция отключения контроллера отменяет действие линии

  модема. После завершения  запроса  отключения  контроллера,

  все подчиненные станции должны быть остановлены. Все буферы

  подчиненных станций возвращены, а контроллер  инициализиро-

  ван заново. Для драйверов ксм и  асинхронного  пуик  данная

  функция отключает станцию, протокол и линию. Контроллер  не

  может быть заново использован до тех пор, пока запрос функ-

  ции  IO$_SETMODE!IO$M_STARTUP  или   IO$_SETCHAR!IO$M_CTRL!

  IO$M_STARTUP не будет выдан.

       Имеются два сочетания кода функций и модификатора:

       1)  IO$_SETMODE!IO$M_CTRL!IO$M_SHUTDOWN  -   отключить

  контроллер;

       2)  IO$_SETCHAR!IO$M_CTRL!IO$M_SHUTDOWN  -   отключить

  контроллер.

       Функция отключения контроллера  не  имеет  аргументов,

  независимых от устройства.











                           - 434 -

                       00152-01 33 03-1


       9.3.3.4. Отключение подчиненной станции


       Функция отключения подчинненой станции  останавливает,

  но не удаляет указанную подчиненную станцию. После заверше-

  ния запроса на отключение подчиненной  станции  она  должна

  быть остановлена, все буферы возвращены, а все  невыполнен-

  ные запросы ввода-вывода и  полученные  сообщения  аварийно

  завершены. Подчиненная станция снова не может быть  исполь-

  зована до тех пор, пока не будет выдан другой запрос  функ-

  ции       IO$_SETMODE!IO$M_STARTUP       или        функции

  IO$_SETCHAR!IO$M_STARTUP. Для асинхронного драйвера пуик  и

  ксм функция  отключения  подчиненой  станции  останавливает

  подчиненную станцию и  протокол.  Связанное  устройство  не

  может быть использовано до тех пор, пока  вы  не  стартуете

  заново подчиненную станцию.

       Обеспечиваются два сочетания кода функции и  модифика-

  тора:

       1) IO$_SETMODE!IO$M_SHUTDOWN -  отключить  подчиненную

  станцию;

       2) IO$_SETCHAR!IO$M_SHUTDOWN -  отключить  подчиненную

  станцию.

       Эти коды не имеют агументов, зависящих от устройства.



       9.3.3.5. Разрешение AST прерывания


       Функция разрешения AST прерывания осуществляет  запрос

  на получение AST  прерывания  процессом,  когда  происходит

  изменение состояния на указанной подчиненной  станции.  AST




                           - 435 -

                       00152-01 33 03-1


  прерывание ставится в очередь, когда драйвер  устанавливает

  или очищает бит краткого описания ошибки или любой из битов

  состояния устройства, или когда сообщение является  доступ-

  ным, а ожидание запроса на чтение отсутствует. Функция раз-

  решения AST прерывания является действующей в любое  время,

  вне зависимости от условий, в которых находятся  биты  сос-

  тояния устройства.

       Обеспечивается два сочетания кода функций и  модифика-

  тора:

       1) IO$_SETMODE!IO$M_ATTNAST - приводит в действие  AST

  прерывания;

       2) IO$_SETCHAR!IO$M_ATTNAST - приводит в действие  AST

  прерывания.

       Эти коды имеют следующие аргументы, зависящие от  уст-

  ройства:

       1) Р1 - адрес программы  обслуживания  AST  прерывания

  или нуль для отмены его действия;

       2) Р2 - игнорируется;

       3) Р3 - метод доступа для получения AST прерывания.

       Функция разрешения AST прерывания является  одноразово

  применяемой функцией. После обработки запроса на AST преры-

  вание, оно должно быть заново явно разрешено с помощью этой

  функции перед новым своим появлением. Данная функция  зави-

  сит от квот AST прерывания.

       Программа обслуживания  AST  прерывания  вызывается  с

  помощью списка аргументов. Первым аргументом является теку-

  щее  значение  второго  длинного  слова   блока   состояния




                           - 436 -

                       00152-01 33 03-1


  ввода-вывода. Метод доступа, указанный аргументом Р3,  мак-

  симизируется режимом доступа инициатора запроса.



       9.3.4. Считывание режима


       Функция считывания  режима  возвращает  характеристики

  контроллера или подчиненной станции в указанные буферы.

       Обеспечиваются два кода функций:

       1)  IO$_SENSEMODE!IO$M_CTRL  -  чтение   характеристик

  контроллера;

       2) IO$_SENSEMODE -  чтение  характеристик  подчиненной

  станции.

       Эти коды имеют следующие аргументы, зависящие от  уст-

  ройства:

       1) Р1 - адрес двойного длинного слова буфера, в  кото-

  ром  хранятся  характеристики  устройства   (необязательный

  аргумент);

       2) Р2 - адрес дескриптора для буфера, в котором сохра-

  няется  буфер  расширенных  характеристик   (необязательный

  аргумент).

       Буфер характеристик для контроллеров показан  на  рис.

  56. Буфер характеристик для подчиненных станций показан  на

  рис. 58. Буфер расширенных характеристик  показан  на  рис.

  57.

       Все характеристики, которые помещаются в  буфер,  ука-

  занный аргументом Р2, возвращаются. Однако,  если  характе-

  ристики не могут быть сохранены в  буфере,  блок  состояния

  ввода-вывода возвращает код завершения SS$_BUFFEROVF.  Вто-



                           - 437 -

                       00152-01 33 03-1


  рое слово блока состояния ввода-вывода возвращает размер  в

  байтах буфера расширенных  характеристик,  возвращенного  с

  помощью аргумента Р2 (подраздел 9.4).



       9.3.5. Поддержка диагностики


       Драйвер КСМ обеспечивает специальные  возможности  для

  поддержки диагностики.

       Если буфер диагностики  (аргумент  Р6)  указывается  в

  запросе физического ввода-вывода,  то  восемь  однобайтовых

  регистров устройств загружаются  в  него  после  завершения

  этого запроса. (КСМ возвращает пять  однословных  регистров

  устройства). Буфер аргумента  Р6  не  возвращает  счетчиков

  ошибок.
           


       9.4. Блок состояния ввода-вывода


       Использование блока состояния ввода-вывода (IOSB)  для

  всех функций драйверов ксм и асинхронного пуик показано  на

  рис. 59. В приложении 1 приводятся коды завершения для этих

  функций.


















                           - 438 -

                       00152-01 33 03-1



         Содержимое блока состояния ввода-вывода

                          +2                             0
  +------------------------------------------------------+
  !   Размер передачи      !     Код завершения          !
  +------------------------------------------------------- +4
  ! Зарезерви-   ! Краткое !            !                !
  !   ровано     !описание !  Состояние ! Характеристики !
  !              ! ошибок  !            !                !
  +------------------------------------------------------+

                          Рис. 59


       Первое  длинное  слово  блока  состояния  ввода-вывода

  возвращает кроме кода завершения размер (в байтах) переноса

  данных или размер (в байтах) буфера расширенных характерис-

  тик, возвращаемого функцией считывания режима. Второе длин-

  ное слово возвращает характеристики устройства  (см.  табл.

  49), биты состояния линии (см.  табл.  45),  биты  краткого

  описания ошибки (см. табл. 46).



       9.5. Пример программирования


       Приведенная в примере программа демонстрирует типичное

  использование макрокоманды $QIO в операциях  драйвера  КСМ,

  таких как запуск контроллера и подчиненной станции, а также

  передача и получение данных.


       Пример.



     $ASSIGN XDAO: DEV

      .TITLE EXAMPLE            ;программа-пример драйвера

                                ;устройства ксм

      .IDENT 'XOO'



                           - 439 -

                       00152-01 33 03-1




      $IODEF                    ;определение функции ввода-

                                ;вывода КСМ

      $NMADEF                   ;определение символов

                                ;сетевого управления

      $XMDEF                    ;определение флагов состояния

                                ;драйвера

   ;

   ;макроопределения

   ;

      .MACRO TYPE   STRING,?1              ;

      STORE  <STRING>                      ;

      MOVL   #S$.TMPX, CMDORAB+RAB$L_RBF   ;

      MOVW   #S$.TMPX, CMDORAB+RAB$L_RSZ   ;

      $PUT   RAB=SMDORAB                   ;

      BLBS   R0,1                          ;

      $EXIT_S                              ;

   1:                                      ;

      .ENDМ TYPE                           ;

   ;

      .MACRO STORE   STRING,PRE

      .SAVE

      .PSЕCT $$$DEV

      $$.TMPX=.

      PRE:

      .ASCII  %STRING%

      $$.TMPXL=.-$$.TMPX




                           - 440 -

                       00152-01 33 03-1


      .RESTORE

      .ENDM   STORE



  CMDOFAB:    $FAB  FAC-PUT,FNM=SYS$OUTPUT:,- ;выходной блок

                                              ;доступа к

                                              ;файлу

                    MRS=132,RAT=CR,RFM=VAR

  CMDORAB:    $RAB  UBF=CMDBUF,USZ=CMDBSZ,- ;выходной блок

                                            ;доступа к

                                            ;записям

                    FAB=CMDOFAB

  CMDBUF::    .BLKB  256                    ;буфер команд

  CMDBSZ=     .-CMDBUF                      ;размер буфера

  FAOBUFDSC:  .LONG  CMDBSZ,CMDBUF          ;дескриптор

                                            ;буфера FAO

  FAOLEN:     .BLKL  1                      ;длина выходного

                                            ;буфера FAO

  P2BUF::     .BLKL  50                     ;буфер Р2

  P2BUFSZ=    .-P2BUF                       ;размер буфера Р2

  P2BUFDSC:   .LONG  P2BUFSZ,P2BUF          ;дескриптор

                                            ;буфера Р2

  P1BUF::     .BLKQ  1                      ;буфер Р1

  P1BUFSZ=    .-P1BUF                       ;размер буфера Р1

  CHNL::      .BLKL  1                      ;номер канала

  IOSB::      .BLKL  1                      ;блок состояния

                                            ;ввода-вывода

  DEVDSC:     .ASCID 'DEV'                  ;устройство для




                           - 441 -

                       00152-01 33 03-1


                                            ;назначения

  QIOREQDSC:  .LSNG   QIOREQSZ,QIOREQ       ;состояние

                                            ;запроса

                                            ;очереди ввода-

                                            ;вывода

  QIOREQ      .ASCII 'QIO COMPLETION STATUS = !XL'

              .ASCII 'IOSB1 = 1XL' IOSB2 = !XL'

  QIOREQSZ=   .-QIOREQ                      ;размер сообщения

                                            ;о состоянии

                                            ;запроса ввода-

                                            ;вывода

  XMTBUFLEN=512                             ;размер буфера

                                            ;передачи

  XMTBUF:     .REPEAT XMTBUFLEN

              .BYTE   "X93                  ;передать данные

              .ENDR

  RCVBUF:     .BLKB   XMTBUFLEN

  ;

  ; это является началом программной секции

  ;

  START:: .WORD     0

          $OPEN     FAB=CMDOFAB             ;открыть вывод

          BLBC      R0,EXIT                 ;

          $CONNECT  RAB=CMDORAB             ;подключить к

                                            ;выводу

          BLBC      R0,EXIT                 ;

          BRB       CONT                    ;продолжение




                           - 442 -

                       00152-01 33 03-1


  EхIT:   $EXIT$_S                          ;выход из

                                            ;программы

  CONT:   TYPE      <DMP11/DMF32 TEST PROGRAM>

          TYPE      < >

          $ASSIGN_S DEVNAM=DEVDSC,CHAN=CHNL ;назначить

                                            ;устройство

          BLBC      R0,EXIT                 ;выход по ошибке

  ;

  ; инициализировать и стартовать контроллер

  ;

         MOVZWL    #XM$M_CHR_LOOPB!XM$M_CHR_DMC,P1BUF;+4

                                            ;установить флаги

                                            ;Р1 зацикливания

                                            ;при тестировании

                                            ;и DMC совмести-
                           
                                            ;мость

         МOVW      #XMTBUFLEN,P1BUF+2       ;установить

                                            ;размер буфера Р1

         CLRL      P2BUFDSC                 ;установить буфер

                                            ;Р2 нулевой длины

         BSBW      INIT                     ;выдать QIO

  ;

  ; организовать или стартовать подчиненную станцию

  ;

         CLRQ      P1BUF                    ;восстановить

                                            ;буфер Р1

         MOVAB     P2BUF,R7                 ;получить адрес




                           - 443 -

                       00152-01 33 03-1


                                            ;буфера Р2

         MOVW      #NMA$C_PCCI_TRI,(R7)+    ;установить код

                                            ;параметра

         MOVZBL    #1,(R7)+                 ;запомнить адрес

                                            ;подчиненной

                                            ;станции

         MOVZBL    #6,P2BUFDSC              ;запомнить длину

                                            ;буфера Р2

         BSBW      ESTAB                    ;выдать QIO



  ;

  ; организовать цикл для тестирования данных

  ;

         MOVZWL    #100,R9                  ;зациклить

                                            ;устройство на

                                            ;100 раз

         BSBW      RECV                     ;осуществить

                                            ;получение

         MOVAB     XMTBUF,R1                ;получить адрес

                                            ;переданных

                                            ;данных

         MOVAB     PCVBUF,R2                ;получить адрес

                                            ;полученных

                                            ;данных

         MOVZWL    #XMTBUFLEN,R3            ;получить кол-

                                            ;личество байтов,

                                            ;подлежащих




                           - 444 -

                       00152-01 33 03-1


                                            ;проверке

  20$:   CMPB      (R1)+,(R2)+              ;контроль данных

         BNEQ      30$                      ;

         SOBGTR    R3,20$                   ;

         SOBGTR    R9,10$                   ;

         BRW       EXIT                     ;выход

  30$    ТYPЕ  <*** зацикливание ошибок сравнения буфера ***>

         BRW       EXIT                     ;выход

  ;

  ; инициализировать контроллер

  ;

  INIT:  TYPE  <*** инициализировать QIO контроллера ***>

         $QIO_S   CHAN=CHNL,FUNC=#IO$_SETCHAR!IO$M_CTRL!IO$M_

                  STARTUP, P1=P1BUF,P2=#P2BUFDSC,IOSB=IOSB,-

                  P3=#5

         BRW      QIO_STATUS

  ;

  ; стартовать подчиненную станцию

  ;

  ESTAB: TYPE  <*** стартовать QIO подчиненной станции ***>

         $QIO_S   CHAN=CHNL,FUNC=#IO$_SETCHAR!IO$M_STARTUP,-

                  P1=P1BUF,P2=#P2BUFDSC,IOSB=IOSB

         BRW      QIO_STATUS

  ;

  ; передть QIO данных

  хMIT   TYPE  <*** передать QIO буфера ***>

         $QIO_S   CHAN=CHNL,FINC=#IO$_WRIEVBLK,P1=XMTBUF,-




                           - 445 -

                       00152-01 33 03-1


                  P2=#XMTBUFLEN,IOSB=IOSB

         BRW      QIO_XMTST

  ;

  ; получить QIO данных

  ;

  RECV:  TYPE  <*** получить QIO буфера ***>

         $QIO_S   CHAN=CHNL,EFN=#2,FUNC=#IO$_READVВLK,-

                  P1=RCVBUF,P2=#XMTBUFLEN,IOSB=IOSB

         ;BRB     QIO_STATUS

       .ENABL   LSВ

  QIO_STATUS:                               ;проверка

                                            ;состояния QIO

       BLBC     IOSB,10$                    ;переход в случае

                                            ;ошибки в QIO

  QIO_XMTST:                                ;проверка

                                            ;состояния XMIT

       BLBC     R0,10$                      ;переход в случае

       RSB                                  ;ошибки в запро-

                                            ;се, иначе воз-

                                            ;врат в вызываю-

                                            ;щую программу

  10$  MOVZWT   IOSB,R1                     ;получить блок

                                            ;состояния ввода-

                                            ;вывода в стек

       PUSHL    R1                          ;поместить блок

                                            ;состояния ввода-

                                            ;вывода




                           - 446 -

                       00152-01 33 03-1


       PUSHL    R0                          ;поместить

                                            ;состояние сис-

                                            ;темной программы

                                            ;в стек

       PUSHAQ   FAOBUFDSC                   ;поместить адрес

                                            ;дескриптора

                                            ;буфера FAO в

                                            ;стек

       PUSHAW   FAOLEN                      ;поместить адрес

                                            ;выходной длины

                                            ;в стек

       PUSHAQ   QIOREQDSC                   ;поместить адрес

                                            ;входной строки

                                            ;в стек

       CALLS    #5,@#SYS$FAO                ;получить сооб-

                                            ;щение об ошибке

       МOVAB    CMDBUF,CMDORAB+RAB$L_RBF    ;получить адрес

                                            ;выходного буфера

       MOVW     FAOLEN,CMDORAB+RAB$W_RSZ    ;получить длину

                                            ;выходного буфера

       $PUT     CMDORAB                     ;напечатать

                                            ;проверку ошибки

       BRW      EXIT                        ;выход

       .DSABL   LSB

       .END     START








                           - 447 -

                       00152-01 33 03-1


                                                 Приложение 1





                 Коды завершения ввода-вывода




       Коды завершения ввода-вывода при работе с ACP приведе-

  ны в табл. 1. Коды завершения  ввода-вывода  при  работе  с

  терминалом   приведены   в   табл.   2.   Коды   завершения

  ввода-вывода при работе с дисковыми устройствами  приведены

  в табл.  3.  Коды  завершения  ввода-вывода  при  работе  с

  построчно-печатающим устройством приведены в табл. 4.  Коды

  завершения ввода-вывода при работе с накопителями  на  маг-

  нитной  ленте  приведены  в  табл.   5.   Коды   завершения

  ввода-вывода при работе с почтовым ящиком приведены в табл.

  6. Коды завершения ввода-вывода при работе с  многофункцио-

  нальным контроллером связи приведены в табл. 7.

                                                    Таблица 1

         Коды завершения ввода-вывода при работе с ACP

  -----------------------------------------------------------

  Код завершения !                Значение

  -----------------------------------------------------------

  SS$_ACCONFLICT ! Запрашиваемый режим доступа противоречит

                 ! существующему режиму доступа к файлу

  SS$_ACPVAFUL   ! Виртуальное адресное пространство дополни-

                 ! тельного управляющего процесса на магнит-

                 ! ной ленте заполнено




                           - 448 -

                       00152-01 33 03-1


                                          Продолжение табл. 1

  -----------------------------------------------------------

  Код завершения !                Значение

  -----------------------------------------------------------

  SS$_BADATTRIB  ! В списке атрибутов команды чтения или за-

                 ! писи задан недействительный код атрибута

                 ! или недействительная длина

  SS$_BADCHCSUM  ! В заголовке файла задана неправильная

                 ! контрольная сумма

  SS$_BADFILEHDR ! Дефектный заголовок файла

  SS$_BADFILENAME! Синтаксическая ошибка в имени файла

  SS$_BADFILEVER ! Задан недействительный номер версии

  SS$_BADIRECTORY! Недействительный файл каталога

  SS$_BADPARAM   ! Дефектный список параметров

  SS$_BADQFILE   ! Дефектный файл квот

  SS$_BLOCKCNTERR! Ошибка счетчиков блоков

  SS$_CREATED    ! Файл создан с использованием функции

                 ! ACCESS и модификатора CREATE

  SS$_DEVICEFULL ! Устройство переполнено

  SS$_DIRFULL    ! Переполнен каталог

  SS$_DIRNOTEMPTY! Каталог содержит файлы и не может быть

                 ! удален

  SS$_DUPDSKQUOTA! Для заданного кода идентификации пользова-

                 ! теля уже существует запись квоты

  SS$_DUPFILENAME! В каталоге уже имеется файл с тем же типом

                 ! и номером версии

  SS$_ENDOFFILE  ! Конец файла




                           - 449 -

                       00152-01 33 03-1


                                          Продолжение табл. 1

  -----------------------------------------------------------

  Код завершения !                Значение

  -----------------------------------------------------------

  SS$_EXBYTLM    ! Превышено максимальное значение счетчика

                 ! байтов

  SS$_EXDISKQUOTA! Превышена дисковая квота

  SS$_FCPREADERR ! Ошибка при чтении элемента каталога

  SS$_FCPREWNDERR! Ошибка при перемотке тома

  SS$_FCPSPACERR ! Ошибка при размещении файла

  SS$_FCPWRITERR ! Ошибка при записи элемента каталога

  SS$_FILELOCKED ! Доступ к файлу заблокирован

  SS$_FILENUMCHK ! Ошибка номера идентификатора файла. Ин-

                 ! дексный файл содержит недействительные

                 ! данные

  SS$_FILEPURGED ! Номер версии созданного файла превышает

                 ! максимально допустимое число

  SS$_FILESEQCHK ! Ошибка последовательности идентификаторов

                 ! файлов

  SS$_FILESTRUCT ! Структура файла, к которому выполняется

                 ! обращение, несовместима с заданным вспо-

                 ! могательным управляющим процессом

  SS$_FILNOTEXP  ! Срок годности файла не истек

  SS$_HEADERFULL ! Область заголовка файла заполнена и не

                 ! может быть расширена

  SS$_IDXFILEFULL! Индексный файл тома заполнен

  SS$_ILLCNTRFUNC! Недействительная управляющая функция




                           - 450 -

                       00152-01 33 03-1


                                          Продолжение табл. 1

  -----------------------------------------------------------

  Код завершения !                Значение

  -----------------------------------------------------------

  SS$_NODISKQUOTA! Отсутствует заданная запись в файле квот

  SS$_NOMOREFILES! Отстутствуют файлы, имена которых согла-

                 ! суются с заданным символом обобщения в

                 ! спецификации файла

  SS$_NOPRIV     ! Отсутствует привилегия

  SS$_NOQFILE    ! Отсутствует файл квот

  SS$_NOSUCHFILE ! Заданный файл отсутствует

  SS$_NOTAPEOP   ! Необходимо вмешательство оператора для

                 ! дальнейшей работы с магнитной лентой

  SS$_NOTLABELMT ! Магнитная лента не имеет метки

  SS$_NOTPRINTED ! Файл не установлен в очередь для печати

  SS$_NOTVOLSET  ! Том не является частью многотомного файла

  SS$_OVRDSKQUOTA! Превышение дисковой квоты

  SS$_QFACTIVE   ! Файл квот уже активен

  SS$_QFNOTACT   ! Файл квот не активен

  SS$_SUPERSEDE  ! Файл, имеющий указанное имя, тип и номер

                 ! версии был указан функцией CREATE

  SS$_TAPEPOSLOST! Позиция магнитной ленты не известна

  SS$_TOOMANYVER ! Число версий равно максимально возможному

                 ! числу версий файла

  SS$_WRITLCK    ! На устройстве установлена защита записи

  SS$_WRONGACP   ! Функция ввода-вывода IO$_MOUNT недействи-

                 ! тельна для файловой структуры данного




                           - 451 -

                       00152-01 33 03-1


                                          Продолжение табл. 1

  -----------------------------------------------------------

  Код завершения !                Значение

  -----------------------------------------------------------

                 ! устройства

                                                    Таблица 2

     Коды завершения ввода-вывода при работе с терминалом

  -----------------------------------------------------------

  Код завершения !            Значение

  -----------------------------------------------------------

  SS$_ABORT      ! Отмена операции ввода-вывода во время вы-

                 ! полнения операции

  SS$_BADESCAPE  ! Задан недействительный ограничитель после-

                 ! довательности AP2

  SS$_BADPARAM   ! Неверный параметр

  SS$_CANCEL     ! Отмена операции ввода-вывода до начала

                 ! выполнения операции

  SS$_CONTROLC   ! Операция чтения или записи не завершена

                 ! вследствии ввода управляющего символа УС/C

  SS$_CONTROLO   ! Операция записи не завершена вследствии

                 ! ввода управляющего символа УС/O

  SS$_CONTROLY   ! Операция чтения или записи не завершена

                 ! вследствии ввода управляющего символа УС/Y

  SS$_DATAOVERUN ! Потеря данных

  SS$_EXQUOTA    ! Превышена квота ввода-вывода

  SS$_INCOMPAT   ! Характеристика не используется в данной

                 ! версии МОС ВП




                           - 452 -

                       00152-01 33 03-1


                                          Продолжение табл. 2

  -----------------------------------------------------------

  Код завершения !            Значение

  -----------------------------------------------------------

  SS$_NORMAL     ! Операция ввода-вывода завершена успешно

  SS$_PARITY     ! Ошибка четности

  SS$_PARTESCAPE ! Последовательность   AP2  обработана

                 ! не полностью вследствии заполнения буфера

                 ! чтения. Оставшаяся часть, если не задана

                 ! характеристика TT$M_NOTYPEAHD, может быть

                 ! считана из буфера ввода с опережением

  SS$_TIMEOUT    ! Время, отведенное для выполнения операции,

                 ! истекло

                                                    Таблица 3

            Коды завершения ввода-вывода при работе

                   с дисковыми устройствами

  -----------------------------------------------------------

  Код завершения !         Значение

  -----------------------------------------------------------

  SS$_ABORT      ! Oтмена операции ввода-вывода во время

                 ! выполнения операции

  SS$_CANCEL     ! Oтмена операции ввода-вывода до начала

                 ! выполнения операции

  SS$_CTRLERR    ! Ошибка контроллера

  SS$_DATACHECK  ! Ошибка при контроле данных

  SS$_DATAOVERUN ! Потеря данных

  SS$_DRVERR     ! Ошибка устройства




                           - 453 -

                       00152-01 33 03-1


                                          Продолжение табл. 3

  -----------------------------------------------------------

  Код завершения !         Значение

  -----------------------------------------------------------

  SS$_FORCEDERR  ! Отмечена невосстановимая ошибка чтения

  SS$_FORMAT     ! Формат, заданный драйвером не соответству-

                 ! ет формату заголовка сектора

  SS$_ILLIOFUNC  ! Недействительный код функции

  SS$_IVADDR     ! Дедействительный адрес данных на диске

  SS$_IVBUFLEN   ! Недействительная длина буфера

  SS$_MEDOFL     ! Дисковод находится в автономном режиме

  SS$_NONEXDRV   ! Недействительный номер дисковода

  SS$_NORMAL     ! Операция ввода-вывода завершена успешно

  SS$_OPINCOMPL  ! При выполнении операции не передано требу-

                 ! емое число байтов

  SS$_PARITY     ! Ошибка четности

  SS$_TIMEOUT    ! Время, выделенное для выполнения операции,

                 ! истекло

  SS$_UNSAFE     ! Аппаратная ошибка устройства

  SS$_VOLINV     ! Недействительный том

  SS$_WASECC     ! Функция чтения данных успешно завершена

                 ! с использованием корректирующих кодов

  SS$_WRITLCK    ! Ошибка при попытке записи на аппаратно-за-

                 ! щищенный том










                           - 454 -

                       00152-01 33 03-1


                                                    Таблица 4

               Коды завершения ввода-вывода при

           работе с построчно-печатающим устройством

  -----------------------------------------------------------

  Код завершения !            Значение

  -----------------------------------------------------------

  SS$_ABORT      ! Отмена операции ввода-вывода во время

                 ! выполнения операции

  SS$_ACCVIO     ! Процесс не может получить доступ к блоку

                 ! состояния ввода-вывода, заданному буферу

                 ! или списку аргументов

  SS$_CANCEL     ! Отмена операции ввода-вывода до начала

                 ! выполнения операции

  SS$_NORMAL     ! Операция ввода-вывода завершена успешно


                                                    Таблица 5

               Коды завершения ввода-вывода при

           работе с накопителями на магнитных лентах

  -----------------------------------------------------------

  Код завершения !            Значение

  -----------------------------------------------------------

  SS$_ABORT      ! Отмена операции ввода-вывода во время

                 ! выполнения операции

  SS$_CANCEL     ! Отмена операции ввода-вывода до начала

                 ! выполнения операции

  SS$_CTRLERR    ! Ошибка контроллера

  SS$_DATACHECK  ! Ошибка при контроле данных




                           - 455 -

                       00152-01 33 03-1


                                          Продолжение табл. 5

  -----------------------------------------------------------

  Код завершения !            Значение

  -----------------------------------------------------------

  SS$_DATAOVERUN ! Потеря данных

  SS$_DEVOFFLINE ! Устройтство выключено

  SS$_DRVERR     ! Ошибка устройства

  SS$_ENDFFILE   ! Конец файла

  SS$_ENDOFTAPE  ! Конец ленты

  SS$_ENDOFVOLUME! Конец тома

  SS$_FORMAT     ! Указан неверный формат данных

  SS$_ILLIOFUNC  ! Недействительный код функции

  SS$_MEDOFL     ! Накопитель находится в автономном режиме

  SS$_NONEXDRV   ! Недействительный номер накопителя

  SS$_NORMAL     ! Операция ввода-вывода завершена успешно

  SS$_OPINCOMPL  ! При выполнении операции не передано

                 ! требуемое число байтов

  SS$_PARITY     ! Ошибка четности

  SS$_TIMEOUT    ! Время, выделенное для выполнения опера-

                 ! ции, истекло

  SS$_UNSAFE     ! Аппаратная ошибка устройства

  SS$_VOLINV     ! Недействительный том

  SS$_WRITLCK    ! Ошибка при попытке записи на аппаратно-

                 ! защищенный том










                           - 456 -

                       00152-01 33 03-1


                                                    Таблица 6

               Коды завершения ввода-вывода при

                   работе с почтовым ящиком

  -----------------------------------------------------------

  Код завершения !            Значение

  -----------------------------------------------------------

  SS$_ABORT      ! Отмена операции ввода-вывода

  SS$_BUFFEROVF  ! Переполнение выходного буфера

  SS$_ENDOFFILE  ! В почтовом ящике нет сообщений, либо счи-

                 ! тано сообщение о конце файла

  SS$_NORMAL     ! Операция ввода-вывода завершена успешно


                                                    Таблица 7

            Коды завершения ввода-вывода при работе

           с многофункциональным контроллером связи

  -----------------------------------------------------------

  Код завершения !         Значение

  -----------------------------------------------------------

  SS$_ABORT      ! Отмена операции ввода-вывода во время

                 ! выполнения операции

  SS$_BADPARAM   ! Дефектный список параметров

  SS$_BUFFEROVF  ! Переполнение выходного буфера

  SS$_CANCEL     ! Отмена операции ввода-вывода до начала

                 ! выполнения операции

  SS$_DEVACTIVE  ! Устройство функционирует

  SS$_DEVICEFULL ! Устройство переполнено

  SS$_DEVINACT   ! Устройство не функционирует




                           - 457 -

                       00152-01 33 03-1


                                          Продолжение табл. 7

  -----------------------------------------------------------

  Код завершения !         Значение

  -----------------------------------------------------------

  SS$_DEVOFFLINE ! Устройство не входит в конфигурацию

                 ! или не доступно

  SS$_ENDOFFILE  ! Конец файла

  SS$_NORMAL     ! Операция ввода-вывода завершена успешно










































                           - 458 -

                       00152-01 33 03-1


                                                 Приложение 2





                   Набор символов кода КОИ-8      




       Управляющие символы кода КОИ-8 приведены  в  табл.  1.

  Графические символы кода КОИ-8 приведены в табл. 2.

                                                    Таблица 1

                   Управляющие символы КОИ-8

  -----------------------------------------------------------

       !     !       !Символ  !

  16-ый!8-ый ! 10-ый ! или    !     Описание

  код  !код  ! код   !аббреви-!

       !     !       !атура   !

  -----------------------------------------------------------

  00   ! 000 !   000 !    ПУС ! Пусто

  01   ! 001 !   001 !    НЗ  ! начало заголовка (УС/A)

  02   ! 002 !   002 !    НТ  ! начало текста (УС/B)

  03   ! 003 !   003 !    КТ  ! конец текста (УС/C)

  04   ! 004 !   004 !    КП  ! конец передачи (УС/O)

  05   ! 005 !   005 !    КТМ ! кто там? (УС/E)

  06   ! 006 !   006 !    ДА  ! подтверждение (УС/F)

  07   ! 007 !   007 !    ЗВ  ! звонок (Ус/G)

  08   ! 010 !   008 !    ВШ  ! возврат на шаг (УС/H)

  09   ! 011 !   009 !    ГТ  ! горизонтальная табуляция

       !     !       !        ! (УС/I)




                           - 459 -

                       00152-01 33 03-1


                                          Продолжение табл. 1

  -----------------------------------------------------------

       !     !       !Символ  !

  16-ый!8-ый ! 10-ый ! или    !     Описание

  код  !код  ! код   !аббреви-!

       !     !       !атура   !

  -----------------------------------------------------------

  0A   ! 012 !   010 !    ПС  ! Перевод строки (УС/J)

  0B   ! 013 !   011 !    ВТ  ! вертикальная табуляция

       !     !       !        ! (УС/K)

  0C   ! 014 !   012 !    ПФ  ! перевод формата (УС/L)

  0D   ! 015 !   013 !    ВК  ! возврат каретки (УС/M)

  0E   ! 016 !   014 !    ВЫХ ! выход (УС/N)

  0F   ! 017 !   015 !    ВХ  ! вход (УС/O)

  10   ! 020 !   016 !    АР1 ! авторегистр 1 (УС/P)

  11   ! 021 !   017 !    СУ1 ! управляющий символ 1(УС/Q)

  12   ! 022 !   018 !    СУ2 ! управляющий символ 2 (УС/R)

  13   ! 023 !   019 !    СУ3 ! управляющий символ 3 (УС/S)

  14   ! 024 !   020 !    СУ4 ! управляющий символ 4 (УС/T)

  15   ! 025 !   021 !    НЕТ ! отрицание (УС/U)

  16   ! 026 !   022 !    СИН ! синхронизация (УС/V)

  17   ! 027 !   023 !    KБ  ! конец блока передачи (УС/W)

  18   ! 030 !   024 !    AH  ! аннулирование (УС/X)

  19   ! 031 !   025 !    KH  ! конец носителя (УС/Y)

  1A   ! 032 !   026 !    ЗM  ! замена (УС/Z)

  1B   ! 033 !   027 !    AP2 ! авторегистр 2

  1C   ! 034 !   028 !    PФ  ! разделитель файлов




                           - 460 -

                       00152-01 33 03-1


                                          Продолжение табл. 1

  -----------------------------------------------------------

       !     !       !Символ  !

  16-ый!8-ый ! 10-ый ! или    !     Описание

  код  !код  ! код   !аббреви-!

       !     !       !атура   !

  -----------------------------------------------------------

  1D   ! 035 !   029 !    РГ  ! разделитель групп

  1E   ! 036 !   030 !    РЗ  ! разделитель записи

  1F   ! 037 !   031 !    РЭ  ! разделитель элементов

                                                   Таблица 2

                   Графические символы КОИ-8

  ----------------------------------------------------------

       !     !       !Символ  !

  16-ый!8-ый ! 10-ый ! или    !     Описание

  код  !код  ! код   !аббреви-!

       !     !       !атура   !

  ----------------------------------------------------------

  20   ! 040 !   032 ! пробел ! пробел

  21   ! 041 !   033 !    !   ! восклицательный знак

  22   ! 042 !   034 !    "   ! кавычки

  23   ! 043 !   035 !    #   ! номер

  24   ! 044 !   036 !    $   ! знак денежной единицы

  25   ! 045 !   037 !    %   ! процент

  26   ! 046 !   038 !    &   ! коммерческое и

  27   ! 047 !   039 !    '   ! апостроф

  28   ! 050 !   040 !    (   ! круглая скобка левая




                           - 461 -

                       00152-01 33 03-1


                                         Продолжение табл. 2
                          
  ----------------------------------------------------------

       !     !       !Символ  !

  16-ый!8-ый ! 10-ый ! или    !     Описание

  код  !код  ! код   !аббреви-!

       !     !       !атура   !

  ----------------------------------------------------------

  29   ! 051 !   041 !    )   ! круглая скобка правая

  2A   ! 052 !   042 !    *   ! звездочка

  2B   ! 053 !   043 !    +   ! плюс

  2C   ! 054 !   044 !    ,   ! запятая

  2D   ! 055 !   045 !    -   ! минус

  2E   ! 056 !   046 !    .   ! точка

  2F   ! 057 !   047 !    /   ! дробная черта

  30   ! 060 !   048 !    0   ! 0

  31   ! 061 !   049 !    1   ! 1

  32   ! 062 !   050 !    2   ! 2

  33   ! 063 !   051 !    3   ! 3

  34   ! 064 !   052 !    4   ! 4

  35   ! 065 !   053 !    5   ! 5

  36   ! 066 !   054 !    6   ! 6

  37   ! 067 !   055 !    7   ! 7

  38   ! 070 !   056 !    8   ! 8

  39   ! 071 !   057 !    9   ! 9

  3A   ! 072 !   058 !    :   ! двоеточие

  3B   ! 073 !   059 !    ;   ! точка с запятой

  3C   ! 074 !   060 !    <   ! меньше




                           - 462 -

                       00152-01 33 03-1


                                         Продолжение табл. 2

  ----------------------------------------------------------

       !     !       !Символ  !

  16-ый!8-ый ! 10-ый ! или    !     Описание

  код  !код  ! код   !аббреви-!

       !     !       !атура   !

  ----------------------------------------------------------

  3D   ! 075 !   061 !    =   ! равно

  3E   ! 076 !   062 !    >   ! больше

  3F   ! 077 !   063 !    ?   ! вопросительный знак

  40   ! 100 !   064 !    @   ! коммерческое ЭТ

  41   ! 101 !   065 !    A   ! с этого знака до Z латинские

  42   ! 102 !   066 !    B   ! прописные буквы

  43   ! 103 !   067 !    C   !

  44   ! 104 !   068 !    D   !

  45   ! 105 !   069 !    E   !

  46   ! 106 !   070 !    F   !

  47   ! 107 !   071 !    G   !

  48   ! 110 !   072 !    H   !

  49   ! 111 !   073 !    I   !

  4A   ! 112 !   074 !    J   !

  4B   ! 113 !   075 !    K   !

  4C   ! 114 !   076 !    L   !

  4D   ! 115 !   077 !    M   !

  4E   ! 116 !   078 !    N   !

  4F   ! 117 !   079 !    O   !

  50   ! 120 !   080 !    P   !




                           - 463 -

                       00152-01 33 03-1


                                         Продолжение табл. 2

  ----------------------------------------------------------

       !     !       !Символ  !

  16-ый!8-ый ! 10-ый ! или    !     Описание

  код  !код  ! код   !аббреви-!

       !     !       !атура   !

  ----------------------------------------------------------

  51   ! 121 !   081 !    Q   !

  52   ! 122 !   082 !    R   !

  53   ! 123 !   083 !    S   !

  54   ! 124 !   084 !    T   !

  55   ! 125 !   085 !    U   !

  56   ! 126 !   086 !    V   !

  57   ! 127 !   087 !    W   !

  58   ! 130 !   088 !    X   !

  59   ! 131 !   089 !    Y   !

  5A   ! 132 !   090 !    Z   !

  5B   ! 133 !   091 !    [   ! квадратная скобка левая

  5C   ! 134 !   092 !    \   ! обратная дробная черта

  5D   ! 135 !   093 !    ]   ! квадратная скобка правая

  5E   ! 136 !   094 !    ^   ! логическое не (стрелка вверх

  5F   ! 137 !   095 !    _   ! подчеркивание

  60   ! 140 !   096 ! слабое ! слабое ударение

       !     !       !ударение!

  61   ! 141 !   097 !    A   ! с этого знака до Z  строчные

  62   ! 142 !   098 !    B   ! латинские буквы

  63   ! 143 !   099 !    C   !




                           - 464 -

                       00152-01 33 03-1


                                         Продолжение табл. 2

  ----------------------------------------------------------

       !     !       !Символ  !

  16-ый!8-ый ! 10-ый ! или    !     Описание

  код  !код  ! код   !аббреви-!

       !     !       !атура   !

  ----------------------------------------------------------

  64   ! 144 !   100 !    D   !

  65   ! 145 !   101 !    E   !

  66   ! 146 !   102 !    F   !

  67   ! 147 !   103 !    G   !

  68   ! 150 !   104 !    H   !

  69   ! 151 !   105 !    I   !

  6A   ! 152 !   106 !    J   !

  6B   ! 153 !   107 !    K   !

  6C   ! 154 !   108 !    L   !

  6D   ! 155 !   109 !    M   !

  6E   ! 156 !   110 !    N   !

  6F   ! 157 !   111 !    O   !

  70   ! 160 !   112 !    P   !

  71   ! 161 !   113 !    Q   !

  72   ! 162 !   114 !    R   !

  73   ! 163 !   115 !    S   !

  74   ! 164 !   116 !    T   !

  75   ! 165 !   117 !    U   !

  76   ! 166 !   118 !    V   !

  77   ! 167 !   119 !    W   !




                           - 465 -

                       00152-01 33 03-1


                                         Продолжение табл. 2

  ----------------------------------------------------------

       !     !       !Символ  !

  16-ый!8-ый ! 10-ый ! или    !     Описание

  код  !код  ! код   !аббреви-!

       !     !       !атура   !

  ----------------------------------------------------------

  78   ! 170 !   120 !    X   !

  79   ! 171 !   121 !    Y   !

  7A   ! 172 !   122 !    Z   !

  7B   ! 173 !   123 !фигурная! фигурная скобка левая

       !     !       ! скобка !

       !     !       ! левая  !

  7C   ! 174 !   124 ! верти- ! вертикальная черта

       !     !       ! кальная!

       !     !       ! черта  !

  7D   ! 175 !   125 !фигурная! фигурная скобка правая

       !     !       ! скобка !

       !     !       ! правая !

  7E   ! 176 !   126 !    '   ! апостроф

  7F   ! 177 !   127 !    ЗБ  ! забой

  8E   ! 216 !   142 !    OП2 ! однократное переключение 2

  8F   ! 217 !   143 !    OП3 ! однократное переключение 3

  B0   ! 260 !   176 !    A   ! с этого знака до Я

  B1   ! 261 !   177 !    B   ! прописные русские буквы

  B2   ! 262 !   178 !    В   !

  B3   ! 263 !   179 !    Г   !




                           - 466 -

                       00152-01 33 03-1


                                         Продолжение табл. 2

  ----------------------------------------------------------

       !     !       !Символ  !

  16-ый!8-ый ! 10-ый ! или    !     Описание
                       
  код  !код  ! код   !аббреви-!

       !     !       !атура   !

  ----------------------------------------------------------

  B4   ! 264 !   180 !    Д   !

  B5   ! 265 !   181 !    Е   !

  B6   ! 266 !   182 !    Ж   !

  B7   ! 267 !   183 !    З   !

  B8   ! 270 !   184 !    И   !

  B9   ! 271 !   185 !    Й   !

  BA   ! 272 !   186 !    К   !

  BB   ! 273 !   187 !    Л   !

  BC   ! 274 !   188 !    М   !

  BD   ! 275 !   189 !    Н   !

  BE   ! 276 !   190 !    О   !

  BF   ! 277 !   191 !    П   !

  CO   ! 300 !   192 !    Р   !

  C1   ! 301 !   193 !    С   !

  C2   ! 302 !   194 !    Т   !

  C3   ! 303 !   195 !    У   !

  C4   ! 304 !   196 !    Ф   !

  C5   ! 305 !   197 !    Х   !

  C6   ! 306 !   198 !    Ц   !

  C7   ! 307 !   199 !    Ч   !




                           - 467 -

                       00152-01 33 03-1


                                         Продолжение табл. 2

  ----------------------------------------------------------

       !     !       !Символ  !

  16-ый!8-ый ! 10-ый ! или    !     Описание

  код  !код  ! код   !аббреви-!

       !     !       !атура   !

  ----------------------------------------------------------

  C8   ! 311 !   200 !    Ш   !

  C9   ! 310 !   201 !    Щ   !

  CA   ! 312 !   202 !    b   !

  CB   ! 313 !   203 !    Ы   !

  CC   ! 314 !   204 !    b   !

  CD   ! 315 !   205 !    Э   !

  CE   ! 316 !   206 !    Ю   !

  CF   ! 317 !   207 !    Я   !

  D0   ! 320 !   208 !    а   ! с этого знака до я

  D1   ! 321 !   209 !    б   ! строчные русские буквы

  D2   ! 322 !   210 !    в   !

  D3   ! 323 !   211 !    г   !

  D4   ! 324 !   212 !    д   !

  D5   ! 325 !   213 !    е   !

  D6   ! 326 !   214 !    ж   !

  D7   ! 327 !   215 !    з   !

  D8   ! 330 !   216 !    и   !

  D9   ! 331 !   217 !    й   !

  DA   ! 332 !   218 !    к   !

  DB   ! 333 !   219 !    л   !




                           - 468 -

                       00152-01 33 03-1


                                         Продолжение табл. 2

  ----------------------------------------------------------

       !     !       !Символ  !

  16-ый!8-ый ! 10-ый ! или    !     Описание

  код  !код  ! код   !аббреви-!

       !     !       !атура   !

  ----------------------------------------------------------

  DC   ! 334 !   220 !    м   !

  DD   ! 335 !   221 !    н   !

  DE   ! 336 !   222 !    о   !

  DF   ! 337 !   223 !    п   !

  E0   ! 340 !   224 !    р   !

  E1   ! 341 !   225 !    с   !

  E2   ! 342 !   226 !    т   !

  E3   ! 343 !   227 !    у   !

  E4   ! 344 !   228 !    ф   !

  E5   ! 345 !   229 !    х   !

  E6   ! 346 !   230 !    ц   !

  E7   ! 347 !   231 !    ч   !

  E8   ! 350 !   232 !    ш   !

  E9   ! 351 !   233 !    щ   !

  EA   ! 352 !   234 !    ь   !

  EB   ! 353 !   235 !    ы   !

  EC   ! 354 !   236 !    ь   !

  ED   ! 355 !   237 !    э   !

  EE   ! 356 !   238 !    ю   !

  EF   ! 357 !   239 !    я   !




                           - 469K -

                       00152-01 33 03-1


   ------------------------------------------------------------
   I                                                          I
   I                  Лист регистрации изменений              I
   I                                                          I
   I----------------------------------------------------------I
   IНомера листов (страниц)IВсего IN     IВходящий IПодп.IДатаI
   I-----------------------IлистовIдоку- IN сопро- I     I    I
   IИ IИз- IЗа- IНо- IАнну-I(стра-Iмента Iводитель-I     I    I
   Iз Iме- Iме- Iвых Iлиро-Iниц)  I      Iного до- I     I    I
   Iм Iнен-Iнен-I    Iван- Iв до- I      Iкум. и   I     I    I
   I. Iных Iных I    Iных  Iкум.  I      Iдата     I     I    I
   I----------------------------------------------------------I
   I  I    I    I    I     I      I      I         I     I    I
   I  I    I    I    I     I      I      I         I     I    I
   I  I    I    I    I     I      I      I         I     I    I
   I  I    I    I    I     I      I      I         I     I    I
   I  I    I    I    I     I      I      I         I     I    I
   I  I    I    I    I     I      I      I         I     I    I
   I  I    I    I    I     I      I      I         I     I    I
   I  I    I    I    I     I      I      I         I     I    I
   I  I    I    I    I     I      I      I         I     I    I
   I  I    I    I    I     I      I      I         I     I    I
   I  I    I    I    I     I      I      I         I     I    I
   I  I    I    I    I     I      I      I         I     I    I
   I  I    I    I    I     I      I      I         I     I    I
   I  I    I    I    I     I      I      I         I     I    I
   I  I    I    I    I     I      I      I         I     I    I
   I  I    I    I    I     I      I      I         I     I    I
   I  I    I    I    I     I      I      I         I     I    I
   I  I    I    I    I     I      I      I         I     I    I
   I  I    I    I    I     I      I      I         I     I    I
   I  I    I    I    I     I      I      I         I     I    I
   I  I    I    I    I     I      I      I         I     I    I
   I  I    I    I    I     I      I      I         I     I    I
   I  I    I    I    I     I      I      I         I     I    I
   I  I    I    I    I     I      I      I         I     I    I
   I  I    I    I    I     I      I      I         I     I    I
   I  I    I    I    I     I      I      I         I     I    I
   I  I    I    I    I     I      I      I         I     I    I
   I  I    I    I    I     I      I      I         I     I    I
   I  I    I    I    I     I      I      I         I     I    I
   I  I    I    I    I     I      I      I         I     I    I
   I  I    I    I    I     I      I      I         I     I    I
   I  I    I    I    I     I      I      I         I     I    I
   I  I    I    I    I     I      I      I         I     I    I
   I  I    I    I    I     I      I      I         I     I    I
   I  I    I    I    I     I      I      I         I     I    I
   I  I    I    I    I     I      I      I         I     I    I
   I  I    I    I    I     I      I      I         I     I    I
   I  I    I    I    I     I      I      I         I     I    I
   I  I    I    I    I     I      I      I         I     I    I
   I  I    I    I    I     I      I      I         I     I    I
   I  I    I    I    I     I      I      I         I     I    I
   I  I    I    I    I     I      I      I         I     I    I
   I  I    I    I    I     I      I      I         I     I    I
   I  I    I    I    I     I      I      I         I     I    I
   I  I    I    I    I     I      I      I         I     I    I
   I  I    I    I    I     I      I      I         I     I    I
   I  I    I    I    I     I      I      I         I     I    I
   I  I    I    I    I     I      I      I         I     I    I
   I  I    I    I    I     I      I      I         I     I    I
  
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!